wlan: avoid TX thread wait for haldumpcmd completion
In case of tx timeout we try to recover stall condition by
reloading FW. Haldumpcmd is sent to do this which is executed by
TX thread and response is expected to be processed by MCthread.
A race condition is observed when MC thread is unable to send
probe request on each channel due to TX thread stuck which is
due to hdd_tx_timeout invoking haldumpcmd. TX wait for 10sec
until rsp for haldumpcmd is received.
Avoiding TX thread to wait for haldumpcmd RSP as not needed.
Change-Id: I1067c5213ac3424c6b3bab36c68cd953b4eb66bc
CRs-Fixed: 778948
diff --git a/CORE/DXE/src/wlan_qct_dxe.c b/CORE/DXE/src/wlan_qct_dxe.c
index 8813e6a..63c169f 100644
--- a/CORE/DXE/src/wlan_qct_dxe.c
+++ b/CORE/DXE/src/wlan_qct_dxe.c
@@ -570,7 +570,7 @@
}
}
- wpalFwDumpReq(17, 0, 0, 0, 0);
+ wpalFwDumpReq(17, 0, 0, 0, 0, 0);
}
/*==========================================================================
@ Function Name
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index dd481f3..37f289f 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -5968,7 +5968,7 @@
TRACE_CODE_SME_RX_HDD_DBG_READMEM, NO_SESSION, 0));
if(eDRIVER_TYPE_MFG == pMac->gDriverType)
{
- if (VOS_STATUS_SUCCESS == WDA_HALDumpCmdReq(pMac, cmd, arg1, arg2, arg3, arg4, (tANI_U8*)pBuf))
+ if (VOS_STATUS_SUCCESS == WDA_HALDumpCmdReq(pMac, cmd, arg1, arg2, arg3, arg4, (tANI_U8*)pBuf, 0))
{
return VOS_STATUS_SUCCESS;
}
@@ -5988,7 +5988,7 @@
/* Are we not in IMPS mode? Or are we in connected? Then we're safe*/
if(!csrIsConnStateDisconnected(pMac, sessionId) || (ePMC_LOW_POWER != PowerState))
{
- if (VOS_STATUS_SUCCESS == WDA_HALDumpCmdReq(pMac, cmd, arg1, arg2, arg3, arg4, (tANI_U8 *)pBuf))
+ if (VOS_STATUS_SUCCESS == WDA_HALDumpCmdReq(pMac, cmd, arg1, arg2, arg3, arg4, (tANI_U8 *)pBuf, 0))
{
status = VOS_STATUS_SUCCESS;
}
diff --git a/CORE/SYS/legacy/src/utils/src/logDump.c b/CORE/SYS/legacy/src/utils/src/logDump.c
index 9569884..51e088e 100644
--- a/CORE/SYS/legacy/src/utils/src/logDump.c
+++ b/CORE/SYS/legacy/src/utils/src/logDump.c
@@ -414,7 +414,7 @@
}
if(cmd <= HAL_LOG_DUMP_CMD_END)
{
- WDA_HALDumpCmdReq(pMac, cmd, arg1, arg2, arg3, arg4, p);
+ WDA_HALDumpCmdReq(pMac, cmd, arg1, arg2, arg3, arg4, p, 0);
}
else
{
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index bf5b07a..9219a12 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -9341,7 +9341,7 @@
break;
case WLANTL_TX_FW_DEBUG:
- vos_fwDumpReq(274, 0, 0, 0, 0);
+ vos_fwDumpReq(274, 0, 0, 0, 0, 1); //Async event
break;
default:
diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h
index 1eaa40f..c896257 100644
--- a/CORE/VOSS/inc/vos_api.h
+++ b/CORE/VOSS/inc/vos_api.h
@@ -316,16 +316,17 @@
This function is called to issue dump commands to Firmware
@param
- cmd - Command No. to execute
- arg1 - argument 1 to cmd
- arg2 - argument 2 to cmd
- arg3 - argument 3 to cmd
- arg4 - argument 4 to cmd
+ cmd - Command No. to execute
+ arg1 - argument 1 to cmd
+ arg2 - argument 2 to cmd
+ arg3 - argument 3 to cmd
+ arg4 - argument 4 to cmd
+ async - asynchronous event. Don't wait for completion.
@return
NONE
*/
v_VOID_t vos_fwDumpReq(tANI_U32 cmd, tANI_U32 arg1, tANI_U32 arg2,
- tANI_U32 arg3, tANI_U32 arg4);
+ tANI_U32 arg3, tANI_U32 arg4, tANI_U8 async);
v_U64_t vos_get_monotonic_boottime(void);
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index b27f4fe..e0f91e2 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -2189,18 +2189,19 @@
This function is called to issue dump commands to Firmware
@param
- cmd - Command No. to execute
- arg1 - argument 1 to cmd
- arg2 - argument 2 to cmd
- arg3 - argument 3 to cmd
- arg4 - argument 4 to cmd
+ cmd - Command No. to execute
+ arg1 - argument 1 to cmd
+ arg2 - argument 2 to cmd
+ arg3 - argument 3 to cmd
+ arg4 - argument 4 to cmd
+ async - asynchronous event. Don't wait for completion.
@return
NONE
*/
v_VOID_t vos_fwDumpReq(tANI_U32 cmd, tANI_U32 arg1, tANI_U32 arg2,
- tANI_U32 arg3, tANI_U32 arg4)
+ tANI_U32 arg3, tANI_U32 arg4, tANI_U8 async)
{
- WDA_HALDumpCmdReq(NULL, cmd, arg1, arg2, arg3, arg4, NULL);
+ WDA_HALDumpCmdReq(NULL, cmd, arg1, arg2, arg3, arg4, NULL, 0);
}
v_U64_t vos_get_monotonic_boottime(void)
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 59d65ab..c1d3955 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -512,6 +512,15 @@
v_PVOID_t wdaWdiApiMsgParam; /* WDI API paramter tracking */
} tWDA_ReqParams;
+typedef struct
+{
+ v_PVOID_t pWdaContext; /* pointer to WDA context*/
+ v_PVOID_t wdaMsgParam; /* PE parameter tracking */
+ v_PVOID_t wdaWdiApiMsgParam; /* WDI API paramter tracking */
+ v_BOOL_t wdaHALDumpAsync; /* Async Request */
+
+} tWDA_HalDumpReqParams;
+
/*
* FUNCTION: WDA_open
* open WDA context
@@ -1908,11 +1917,12 @@
IN
pMac MAC global pointer
- cmd Hal dump command
- arg1 Dump command argument 1
- arg2 Dump command argument 2
- arg3 Dump command argument 3
- arg4 Dump command argument 4
+ cmd Hal dump command
+ arg1 Dump command argument 1
+ arg2 Dump command argument 2
+ arg3 Dump command argument 3
+ arg4 Dump command argument 4
+ async Asynchronous event. Doesn't wait for rsp.
OUT
pBuffer Dump command Response buffer
@@ -1926,7 +1936,7 @@
============================================================================*/
VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac,tANI_U32 cmd,
tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
- tANI_U32 arg4, tANI_U8 *pBuffer);
+ tANI_U32 arg4, tANI_U8 *pBuffer, wpt_boolean async);
/*==========================================================================
FUNCTION WDA_featureCapsExchange
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index a46bf19..48b0648 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -11773,7 +11773,7 @@
{
tANI_U8 *buffer = NULL;
tWDA_CbContext *pWDA = NULL;
- tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tWDA_HalDumpReqParams *pWdaParams = (tWDA_HalDumpReqParams *)pUserData;
if(NULL == pWdaParams)
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11789,11 +11789,13 @@
/*Copy the Resp data to UMAC supplied buffer*/
vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
}
+
+ if (!pWdaParams->wdaHALDumpAsync)
+ {/* Indicate VOSS about the start complete */
+ vos_WDAComplete_cback(pWDA->pVosContext);
+ }
vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
vos_mem_free(pWdaParams);
-
- /* Indicate VOSS about the start complete */
- vos_WDAComplete_cback(pWDA->pVosContext);
return ;
}
@@ -11803,12 +11805,13 @@
*/
VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
- tANI_U32 arg4, tANI_U8 *pBuffer)
+ tANI_U32 arg4, tANI_U8 *pBuffer, wpt_boolean async)
{
WDI_Status status = WDI_STATUS_SUCCESS;
WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
- tWDA_ReqParams *pWdaParams ;
+ tWDA_HalDumpReqParams *pWdaParams ;
+
pVosContextType pVosContext = NULL;
VOS_STATUS vStatus;
pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
@@ -11829,7 +11832,13 @@
return VOS_STATUS_E_RESOURCES;
}
- pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
+ if (NULL == pVosContext->pWDAContext)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: WDA Context Null", __func__);
+ return VOS_STATUS_E_RESOURCES;
+ }
+ pWdaParams = (tWDA_HalDumpReqParams *)vos_mem_malloc(sizeof(tWDA_HalDumpReqParams)) ;
if(NULL == pWdaParams)
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11855,6 +11864,7 @@
wdiHalDumpCmdInfo->argument4 = arg4;
wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
pWdaParams->pWdaContext = pVosContext->pWDAContext;
+ pWdaParams->wdaHALDumpAsync = async;
/* Response message will be passed through the buffer */
pWdaParams->wdaMsgParam = (void *)pBuffer;
@@ -11862,21 +11872,27 @@
/* store Params pass it to WDI */
pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
/* Send command to WDI */
- status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
- vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), WDA_DUMPCMD_WAIT_TIMEOUT );
- if ( vStatus != VOS_STATUS_SUCCESS )
+ status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback,
+ pWdaParams);
+ /* For Sync event only wait for rsp until completion of wdaCompleteEvent*/
+ if (!async)
{
- if ( vStatus == VOS_STATUS_E_TIMEOUT )
+ vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent),
+ WDA_DUMPCMD_WAIT_TIMEOUT );
+ if ( vStatus != VOS_STATUS_SUCCESS )
{
- VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
- "%s: Timeout occurred before WDA_HALDUMP complete",__func__);
+ if ( vStatus == VOS_STATUS_E_TIMEOUT )
+ {
+ VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: Timeout occurred before WDA_HALDUMP complete",__func__);
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: WDA_HALDUMP reporting other error",__func__);
+ }
+ VOS_ASSERT(0);
}
- else
- {
- VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
- "%s: WDA_HALDUMP reporting other error",__func__);
- }
- VOS_ASSERT(0);
}
return status;
}
diff --git a/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h b/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h
index d2210fb..f39ca8c 100644
--- a/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h
+++ b/CORE/WDI/WPAL/inc/wlan_qct_pal_api.h
@@ -342,16 +342,17 @@
wpalFwDumpReq - Trigger the dump commands to Firmware
Param:
- cmd - Command No. to execute
- arg1 - argument 1 to cmd
- arg2 - argument 2 to cmd
- arg3 - argument 3 to cmd
- arg4 - argument 4 to cmd
+ cmd - Command No. to execute
+ arg1 - argument 1 to cmd
+ arg2 - argument 2 to cmd
+ arg3 - argument 3 to cmd
+ arg4 - argument 4 to cmd
+ async -asynchronous event. Don't wait for completion.
Return:
NONE
---------------------------------------------------------------------------*/
void wpalFwDumpReq(wpt_uint32 cmd, wpt_uint32 arg1, wpt_uint32 arg2,
- wpt_uint32 arg3, wpt_uint32 arg4);
+ wpt_uint32 arg3, wpt_uint32 arg4, wpt_boolean async);
/*---------------------------------------------------------------------------
wpalDevicePanic - Trigger Device Panic
diff --git a/CORE/WDI/WPAL/src/wlan_qct_pal_api.c b/CORE/WDI/WPAL/src/wlan_qct_pal_api.c
index f0e1bb5..e1dfa1b 100644
--- a/CORE/WDI/WPAL/src/wlan_qct_pal_api.c
+++ b/CORE/WDI/WPAL/src/wlan_qct_pal_api.c
@@ -436,18 +436,19 @@
wpalFwDumpReq - Trigger the dump commands to Firmware
Param:
- cmd - Command No. to execute
- arg1 - argument 1 to cmd
- arg2 - argument 2 to cmd
- arg3 - argument 3 to cmd
- arg4 - argument 4 to cmd
+ cmd - Command No. to execute
+ arg1 - argument 1 to cmd
+ arg2 - argument 2 to cmd
+ arg3 - argument 3 to cmd
+ arg4 - argument 4 to cmd
+ async -asynchronous event. Don't wait for completion.
Return:
NONE
---------------------------------------------------------------------------*/
void wpalFwDumpReq(wpt_uint32 cmd, wpt_uint32 arg1, wpt_uint32 arg2,
- wpt_uint32 arg3, wpt_uint32 arg4)
+ wpt_uint32 arg3, wpt_uint32 arg4, wpt_boolean async)
{
- vos_fwDumpReq(cmd, arg1, arg2, arg3, arg4);
+ vos_fwDumpReq(cmd, arg1, arg2, arg3, arg4, async);
return;
}