[WCNCR00154959] misc: Add adjustable OID timeout

[Description]
Add adjustable OID timeout

Create a new API kalIoctlTimeout() to support adjustabel OID timeout.
Valid input for the new field "i4OidTimeout" is below.
              -1  ==> default timeout 2000ms
0 <= value <= MAX ==> specify the timeout in millsecond (0~10 seconds)

The new API kalIoctlTimeout() is created as an extension of kalIoctl()
only. Most commands may still work with kalIoctl().

Changes:
* Add new elements in _GL_IO_REQ_T
* New API kalIoctlTimeout()
* Refine OID-timeout control

Change-Id: If4f2d4bc67c2964da8d47b6edfce5468b784eb04
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
CR-Id: WCNCR00154959
Feature: misc
diff --git a/common/wlan_lib.c b/common/wlan_lib.c
index 163c62a..55c7e44 100644
--- a/common/wlan_lib.c
+++ b/common/wlan_lib.c
@@ -4001,7 +4001,7 @@
 *         FALSE
 */
 /*----------------------------------------------------------------------------*/
-BOOLEAN wlanoidTimeoutCheck(IN P_ADAPTER_T prAdapter, IN PFN_OID_HANDLER_FUNC pfnOidHandler)
+BOOLEAN wlanoidTimeoutCheck(IN P_ADAPTER_T prAdapter, IN PFN_OID_HANDLER_FUNC pfnOidHandler, IN UINT_32 u4Timeout)
 {
 	PFN_OID_HANDLER_FUNC *apfnOidHandlerWOTimeoutCheck;
 	UINT_32 i;
@@ -4021,7 +4021,7 @@
 		u4OidTimeout = WLAN_OID_TIMEOUT_THRESHOLD_IN_RESETTING;
 		DBGLOG(INIT, INFO, "Decrease OID timeout to %ums due to NoACK/CHIP-RESET\n", u4OidTimeout);
 	} else {
-		u4OidTimeout = WLAN_OID_TIMEOUT_THRESHOLD;
+		u4OidTimeout = u4Timeout;
 	}
 
 	/* Set OID timer for timeout check */
diff --git a/include/wlan_lib.h b/include/wlan_lib.h
index 85287ec..b3cd220 100644
--- a/include/wlan_lib.h
+++ b/include/wlan_lib.h
@@ -143,6 +143,7 @@
 
 
 #define WLAN_OID_TIMEOUT_THRESHOLD                  2000	/* OID timeout (in ms) */
+#define WLAN_OID_TIMEOUT_THRESHOLD_MAX             10000	/* OID max timeout (in ms) */
 #define WLAN_OID_TIMEOUT_THRESHOLD_IN_RESETTING      300	/* OID timeout during chip-resetting  (in ms) */
 
 #define WLAN_OID_NO_ACK_THRESHOLD                   3
@@ -1064,7 +1065,7 @@
 
 WLAN_STATUS wlanProcessQueuedMsduInfo(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfoListHead);
 
-BOOLEAN wlanoidTimeoutCheck(IN P_ADAPTER_T prAdapter, IN PFN_OID_HANDLER_FUNC pfnOidHandler);
+BOOLEAN wlanoidTimeoutCheck(IN P_ADAPTER_T prAdapter, IN PFN_OID_HANDLER_FUNC pfnOidHandler, IN UINT_32 u4Timeout);
 
 VOID wlanoidClearTimeoutCheck(IN P_ADAPTER_T prAdapter);
 
diff --git a/os/linux/gl_kal.c b/os/linux/gl_kal.c
index 3f7b7b8..9885b71 100644
--- a/os/linux/gl_kal.c
+++ b/os/linux/gl_kal.c
@@ -2049,6 +2049,41 @@
 	 IN PVOID pvInfoBuf,
 	 IN UINT_32 u4InfoBufLen, IN BOOL fgRead, IN BOOL fgWaitResp, IN BOOL fgCmd, OUT PUINT_32 pu4QryInfoLen)
 {
+	return kalIoctlTimeout(prGlueInfo,
+							 pfnOidHandler,
+							 pvInfoBuf,
+							 u4InfoBufLen, fgRead, fgWaitResp, fgCmd, -1,
+							 pu4QryInfoLen);
+}
+
+
+
+/*----------------------------------------------------------------------------*/
+/*!
+* @brief This function is used to transfer linux ioctl to OID, and  we
+* need to specify the behavior of the OID by ourself
+*
+* @param prGlueInfo         Pointer to the glue structure
+* @param pvInfoBuf          Data buffer
+* @param u4InfoBufLen       Data buffer length
+* @param fgRead             Is this a read OID
+* @param fgWaitResp         does this OID need to wait for values
+* @param fgCmd              does this OID compose command packet
+* @param i4OidTimeout       timeout for this OID
+* @param pu4QryInfoLen      The data length of the return values
+*
+* @retval TRUE      Success to extract information
+* @retval FALSE     Fail to extract correct information
+*/
+/*----------------------------------------------------------------------------*/
+
+WLAN_STATUS
+kalIoctlTimeout(IN P_GLUE_INFO_T prGlueInfo,
+	 IN PFN_OID_HANDLER_FUNC pfnOidHandler,
+	 IN PVOID pvInfoBuf,
+	 IN UINT_32 u4InfoBufLen, IN BOOL fgRead, IN BOOL fgWaitResp, IN BOOL fgCmd, IN INT_32 i4OidTimeout,
+	 OUT PUINT_32 pu4QryInfoLen)
+{
 	P_GL_IO_REQ_T prIoReq = NULL;
 	WLAN_STATUS ret = WLAN_STATUS_SUCCESS;
 
@@ -2099,6 +2134,12 @@
 	prIoReq->fgWaitResp = fgWaitResp;
 	prIoReq->rStatus = WLAN_STATUS_FAILURE;
 
+	if (i4OidTimeout >= 0 && i4OidTimeout <= WLAN_OID_TIMEOUT_THRESHOLD_MAX)
+		prIoReq->u4Timeout = (UINT_32)i4OidTimeout;
+	else
+		prIoReq->u4Timeout = WLAN_OID_TIMEOUT_THRESHOLD;
+
+
 	/* <5> Reset the status of pending OID */
 	prGlueInfo->rPendStatus = WLAN_STATUS_FAILURE;
 	/* prGlueInfo->u4TimeoutFlag = 0; */
@@ -2941,7 +2982,9 @@
 					else
 						DBGLOG(INIT, WARN, "SKIP multiple OID complete!\n");
 				} else {
-					wlanoidTimeoutCheck(prGlueInfo->prAdapter, prIoReq->pfnOidHandler);
+					wlanoidTimeoutCheck(prGlueInfo->prAdapter,
+										prIoReq->pfnOidHandler,
+										prIoReq->u4Timeout);
 				}
 			}
 
diff --git a/os/linux/include/gl_kal.h b/os/linux/include/gl_kal.h
index 7ad06af..0b6a575 100644
--- a/os/linux/include/gl_kal.h
+++ b/os/linux/include/gl_kal.h
@@ -886,6 +886,13 @@
 	 IN PVOID pvInfoBuf,
 	 IN UINT_32 u4InfoBufLen, IN BOOL fgRead, IN BOOL fgWaitResp, IN BOOL fgCmd, OUT PUINT_32 pu4QryInfoLen);
 
+WLAN_STATUS
+kalIoctlTimeout(IN P_GLUE_INFO_T prGlueInfo,
+	 IN PFN_OID_HANDLER_FUNC pfnOidHandler,
+	 IN PVOID pvInfoBuf,
+	 IN UINT_32 u4InfoBufLen, IN BOOL fgRead, IN BOOL fgWaitResp, IN BOOL fgCmd, IN INT_32 i4OidTimeout,
+	 OUT PUINT_32 pu4QryInfoLen);
+
 VOID kalHandleAssocInfo(IN P_GLUE_INFO_T prGlueInfo, IN P_EVENT_ASSOC_INFO prAssocInfo);
 
 #if CFG_ENABLE_FW_DOWNLOAD
diff --git a/os/linux/include/gl_os.h b/os/linux/include/gl_os.h
index d6c38a3..ec7621b 100644
--- a/os/linux/include/gl_os.h
+++ b/os/linux/include/gl_os.h
@@ -356,6 +356,7 @@
 	PUINT_32 pu4QryInfoLen;
 	WLAN_STATUS rStatus;
 	UINT_32 u4Flag;
+	UINT_32 u4Timeout;
 } GL_IO_REQ_T, *P_GL_IO_REQ_T;
 
 #if CFG_ENABLE_BT_OVER_WIFI