[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