HDD: Wait for firmware response to MON_MODE(START/STOP)_REQ
During driver unload, in monitor mode, it issues MON_MODE_STOP event
to firmware via WDA layer. As driver won't wait for firmware response
it goes ahead and posts WDI_STOP_REQ. So there is possibility of
processing WDI_STOP_REQ prior to MON_MODE_STOP_REQ, leading
MON_MODE_STOP_REQ to be added to WDI pending queue and this may lead
to improper driver unload.
Hence to avoid this scenario, wait for firmware response to
MON_MODE(START/STOP)_REQ and then post WDI_STOP_REQ to firmware.
Change-Id: I288d993e674fc9cf5dcceb992dee80f0a388f9db
CRs-Fixed: 903542
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index e80602f..70914ac 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -289,6 +289,11 @@
#define BCN_MISS_RATE_CONTEXT_MAGIC 0x513F5753
#define FW_STATS_CONTEXT_MAGIC 0x5022474E //FW STATS
#define GET_FRAME_LOG_MAGIC 0x464c4f47 //FLOG
+#define MON_MODE_MSG_MAGIC 0x51436B3A //MON_MODE
+
+#define MON_MODE_MSG_TIMEOUT 5000
+#define MON_MODE_START 1
+#define MON_MODE_STOP 0
/*
* Driver miracast parameters 0-Disabled
@@ -1547,8 +1552,9 @@
void wlan_hdd_release_intf_addr(hdd_context_t* pHddCtx, tANI_U8* releaseAddr);
v_U8_t hdd_get_operating_channel( hdd_context_t *pHddCtx, device_mode_t mode );
void wlan_hdd_mon_set_typesubtype( hdd_mon_ctx_t *pMonCtx,int type);
-VOS_STATUS wlan_hdd_mon_poststartmsg( hdd_mon_ctx_t *pMonCtx );
-void wlan_hdd_mon_poststopmsg( void );
+void hdd_monPostMsgCb(tANI_U32 *magic, struct completion *cmpVar);
+VOS_STATUS wlan_hdd_mon_postMsg(tANI_U32 *magic, struct completion *cmpVar,
+ hdd_mon_ctx_t *pMonCtx , void* callback);
void hdd_set_conparam ( v_UINT_t newParam );
tVOS_CON_MODE hdd_get_conparam( void );
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index f4af360..95a7e2b 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -6884,6 +6884,24 @@
}
return status;
}
+
+void hdd_monPostMsgCb(tANI_U32 *magic, struct completion *cmpVar)
+{
+ if (magic == NULL || cmpVar == NULL) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("invalid arguments %p %p"), magic, cmpVar);
+ return;
+ }
+ if (*magic != MON_MODE_MSG_MAGIC) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("maic: %x"), *magic);
+ return;
+ }
+
+ complete(cmpVar);
+ return;
+}
+
void hdd_init_mon_mode (hdd_adapter_t *pAdapter)
{
hdd_mon_ctx_t *pMonCtx = NULL;
@@ -8394,37 +8412,44 @@
pMonCtx->typeSubtypeBitmap |= 0xFFFF00000000;
}
-VOS_STATUS wlan_hdd_mon_poststartmsg( hdd_mon_ctx_t *pMonCtx )
+VOS_STATUS wlan_hdd_mon_postMsg(tANI_U32 *magic, struct completion *cmpVar,
+ hdd_mon_ctx_t *pMonCtx , void* callback)
{
vos_msg_t monMsg;
+ tSirMonModeReq *pMonModeReq;
- monMsg.type = WDA_MON_START_REQ;
- monMsg.reserved = 0;
- monMsg.bodyptr = (v_U8_t*)pMonCtx;
- monMsg.bodyval = 0;
-
- if (VOS_STATUS_SUCCESS != vos_mq_post_message(
- VOS_MODULE_ID_WDA,(vos_msg_t *)&monMsg)) {
- hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
+ if (MON_MODE_START == pMonCtx->state)
+ monMsg.type = WDA_MON_START_REQ;
+ else if (MON_MODE_STOP == pMonCtx->state)
+ monMsg.type = WDA_MON_STOP_REQ;
+ else {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("invalid monitor state %d"), pMonCtx->state);
return VOS_STATUS_E_FAILURE;
}
- return VOS_STATUS_SUCCESS;
-}
+ pMonModeReq = vos_mem_malloc(sizeof(tSirMonModeReq));
+ if (pMonModeReq == NULL) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("fail to allocate memory for monitor mode req"));
+ return VOS_STATUS_E_FAILURE;
+ }
-void wlan_hdd_mon_poststopmsg(void)
-{
- vos_msg_t monMsg;
+ pMonModeReq->magic = magic;
+ pMonModeReq->cmpVar = cmpVar;
+ pMonModeReq->data = pMonCtx;
+ pMonModeReq->callback = callback;
- monMsg.type = WDA_MON_STOP_REQ;
monMsg.reserved = 0;
- monMsg.bodyptr = NULL;
+ monMsg.bodyptr = pMonModeReq;
monMsg.bodyval = 0;
if (VOS_STATUS_SUCCESS != vos_mq_post_message(
VOS_MODULE_ID_WDA,(vos_msg_t *)&monMsg)) {
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
+ vos_mem_free(pMonModeReq);
}
+ return VOS_STATUS_SUCCESS;
}
void wlan_hdd_mon_close(hdd_context_t *pHddCtx)
@@ -8432,7 +8457,10 @@
VOS_STATUS vosStatus;
v_CONTEXT_t pVosContext = pHddCtx->pvosContext;
struct wiphy *wiphy = pHddCtx->wiphy;
-
+ long ret;
+ hdd_mon_ctx_t *pMonCtx = NULL;
+ v_U32_t magic;
+ struct completion cmpVar;
hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_MONITOR);
if(pAdapter == NULL || pVosContext == NULL)
{
@@ -8440,7 +8468,28 @@
return ;
}
- wlan_hdd_mon_poststopmsg();
+ pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+ if (pMonCtx!= NULL && pMonCtx->state == MON_MODE_START) {
+ pMonCtx->state = MON_MODE_STOP;
+ magic = MON_MODE_MSG_MAGIC;
+ init_completion(&cmpVar);
+ if (VOS_STATUS_SUCCESS !=
+ wlan_hdd_mon_postMsg(&magic, &cmpVar,
+ pMonCtx, hdd_monPostMsgCb)) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to post MON MODE REQ"));
+ pMonCtx->state = MON_MODE_START;
+ magic = 0;
+ return;
+ }
+ ret = wait_for_completion_timeout(&cmpVar, MON_MODE_MSG_TIMEOUT);
+ magic = 0;
+ if (ret <= 0 ) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("timeout on monitor mode completion %ld"), ret);
+ }
+ }
+
hdd_UnregisterWext(pAdapter->dev);
vos_mon_stop( pVosContext );
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 4dafa69..13355ed 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -5855,20 +5855,52 @@
}
case WE_SET_MONITOR_STATE:
{
+ v_U32_t magic = 0;
+ struct completion cmpVar;
+ long waitRet = 0;
+ tVOS_CON_MODE mode = hdd_get_conparam();
+
+ if( VOS_MONITOR_MODE != mode)
+ {
+ hddLog(LOGE, "invalid mode %d", mode);
+ ret = -EIO;
+ }
pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
if( pMonCtx == NULL )
{
hddLog(LOGE, "Monitor Context NULL");
- break;
+ ret = -EIO;
+ }
+ if (pMonCtx->state == set_value)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ FL("already in same mode curr_mode:%d req_mode: %d"),
+ pMonCtx->state, set_value);
+ break;
}
pMonCtx->state = set_value;
- if( set_value )
- wlan_hdd_mon_poststartmsg(pMonCtx);
- else
- wlan_hdd_mon_poststopmsg();
-
- break;
+ magic = MON_MODE_MSG_MAGIC;
+ init_completion(&cmpVar);
+ if (VOS_STATUS_SUCCESS !=
+ wlan_hdd_mon_postMsg(&magic, &cmpVar,
+ pMonCtx, hdd_monPostMsgCb)) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to post MON MODE REQ"));
+ pMonCtx->state = (pMonCtx->state==MON_MODE_START)?
+ MON_MODE_STOP : MON_MODE_START;
+ magic = 0;
+ ret = -EIO;
+ break;
+ }
+ waitRet = wait_for_completion_timeout(&cmpVar, MON_MODE_MSG_TIMEOUT);
+ magic = 0;
+ if (waitRet <= 0 ){
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to wait on monitor mode completion %ld"),
+ waitRet);
+ }
+ break;
}
default:
@@ -7299,6 +7331,10 @@
#endif
case WE_CONFIGURE_MONITOR_MODE:
{
+ v_U32_t magic = 0;
+ struct completion cmpVar;
+ long waitRet = 0;
+
pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
if( pMonCtx == NULL )
{
@@ -7325,13 +7361,36 @@
" cannot be converted to 802.3 ",__func__);
pMonCtx->typeSubtypeBitmap = 0xFFFF00000000;
}
- if( pMonCtx->state )
- wlan_hdd_mon_poststartmsg(pMonCtx);
+ if (MON_MODE_START == pMonCtx->state) {
+ magic = MON_MODE_MSG_MAGIC;
+ init_completion(&cmpVar);
+ if (VOS_STATUS_SUCCESS !=
+ wlan_hdd_mon_postMsg(&magic, &cmpVar,
+ pMonCtx, hdd_monPostMsgCb)) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to post MON MODE REQ"));
+ magic = 0;
+ ret = -EIO;
+ break;
+ }
+ waitRet = wait_for_completion_timeout(&cmpVar,
+ MON_MODE_MSG_TIMEOUT);
+ magic = 0;
+ if (waitRet <= 0 ) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to wait on monitor mode completion %ld"),
+ waitRet);
+ }
+ }
}
break;
case WE_SET_MONITOR_MODE_FILTER:
{
+ v_U32_t magic = 0;
+ struct completion cmpVar;
+ long waitRet = 0;
+
pMonCtx = WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
if( pMonCtx == NULL )
{
@@ -7352,8 +7411,27 @@
hddLog(LOG1, "%s: Monitor Filter: %pM A1=%d A2=%d A3=%d ",
__func__, pMonCtx->mmFilters[0].macAddr.bytes,
apps_args[6], apps_args[7], apps_args[8]);
- if( pMonCtx->state )
- wlan_hdd_mon_poststartmsg(pMonCtx);
+ if (MON_MODE_START == pMonCtx->state) {
+ magic = MON_MODE_MSG_MAGIC;
+ init_completion(&cmpVar);
+ if (VOS_STATUS_SUCCESS !=
+ wlan_hdd_mon_postMsg(&magic, &cmpVar,
+ pMonCtx, hdd_monPostMsgCb)) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to post MON MODE REQ"));
+ magic = 0;
+ ret = -EIO;
+ break;
+ }
+ waitRet = wait_for_completion_timeout(&cmpVar,
+ MON_MODE_MSG_TIMEOUT);
+ magic = 0;
+ if (waitRet <= 0 ) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to wait on monitor mode completion %ld"),
+ waitRet);
+ }
+ }
}
break;
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index edf656b..cb9af1a 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -5599,4 +5599,13 @@
tANI_U16 mesgLen;
tSirMacAddr bssid;
}tSirDelAllTdlsPeers, *ptSirDelAllTdlsPeers;
+
+typedef void (*tSirMonModeCb)(tANI_U32 *magic, struct completion *cmpVar);
+typedef struct
+{
+ tANI_U32 *magic;
+ struct completion *cmpVar;
+ void *data;
+ tSirMonModeCb callback;
+}tSirMonModeReq, *ptSirMonModeReq;
#endif /* __SIR_API_H */
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 6331d62..1908581 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -14570,7 +14570,7 @@
}
case WDA_MON_STOP_REQ:
{
- WDA_ProcessMonStopReq(pWDA,NULL);
+ WDA_ProcessMonStopReq(pWDA, (v_PVOID_t)pMsg->bodyptr);
break;
}
case WDA_SEND_FREQ_RANGE_CONTROL_IND:
@@ -19526,9 +19526,11 @@
}
return CONVERT_WDI2VOS_STATUS(status) ;
}
-void WDA_MonStartRspCallback(void *pEventData, void* pUserData)
+
+void WDA_MonModeRspCallback(void *pEventData, void* pUserData)
{
tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ tSirMonModeReq *pData;
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s " ,__func__);
@@ -19539,18 +19541,22 @@
VOS_ASSERT(0) ;
return ;
}
-
+ pData = (tSirMonModeReq *)pWdaParams->wdaMsgParam;
+ if (pData != NULL) {
+ pData->callback(pData->magic, pData->cmpVar);
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ }
vos_mem_free(pWdaParams) ;
return;
}
-
-VOS_STATUS WDA_ProcessMonStartReq( tWDA_CbContext *pWDA, void* wdaRequest)
+VOS_STATUS WDA_ProcessMonStartReq( tWDA_CbContext *pWDA, void *wdaRequest)
{
WDI_Status status = WDI_STATUS_SUCCESS;
tWDA_ReqParams *pWdaParams;
+ tSirMonModeReq *pMonModeData = (tSirMonModeReq *)wdaRequest;
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
FL("%s: "), __func__);
@@ -19566,8 +19572,8 @@
pWdaParams->wdaMsgParam = wdaRequest;
pWdaParams->wdaWdiApiMsgParam = NULL;
- status = WDI_MonStartReq((void *)wdaRequest,
- (WDI_MonStartRspCb)WDA_MonStartRspCallback,
+ status = WDI_MonStartReq(pMonModeData->data,
+ (WDI_MonModeRspCb)WDA_MonModeRspCallback,
(void *)pWdaParams);
if (IS_WDI_STATUS_FAILURE(status))
{
@@ -19579,25 +19585,6 @@
return CONVERT_WDI2VOS_STATUS(status);
}
-void WDA_MonStopRspCallback(void* pUserData)
-{
- tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
-
- VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
- "%s: Mon stop request cb " ,__func__);
- if (NULL == pWdaParams)
- {
- VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
- "%s: pWdaParams received NULL", __func__);
- VOS_ASSERT(0) ;
- return ;
- }
-
- vos_mem_free(pWdaParams) ;
-
- return;
-}
-
VOS_STATUS WDA_ProcessMonStopReq( tWDA_CbContext *pWDA, void* wdaRequest)
{
@@ -19620,7 +19607,7 @@
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
"%s: Processing Mon stop request", __func__);
- status = WDI_MonStopReq((WDI_MonStopRspCb)WDA_MonStopRspCallback,
+ status = WDI_MonStopReq((WDI_MonModeRspCb)WDA_MonModeRspCallback,
(void *)pWdaParams);
if (IS_WDI_STATUS_FAILURE(status))
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 5f20a61..1795ca8 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -8061,8 +8061,7 @@
typedef void (*WDI_FatalEventLogsRspCb)(
WDI_FatalEventLogsRspParamType *wdiRsp, void *pUserData);
-typedef void (*WDI_MonStartRspCb)(void *pEventData,void *pUserData);
-typedef void (*WDI_MonStopRspCb)(void *pUserData);
+typedef void (*WDI_MonModeRspCb)(void *pEventData,void *pUserData);
/*========================================================================
* Function Declarations and Documentation
@@ -11450,13 +11449,13 @@
WDI_Status WDI_MonStartReq
(
WDI_MonStartReqType* pwdiMonStartReqParams,
- WDI_MonStartRspCb wdiMonStartRspCb,
+ WDI_MonModeRspCb wdiMonModeRspCb,
void* pUserData
);
WDI_Status WDI_MonStopReq
(
- WDI_MonStopRspCb wdiMonStopRspCb,
+ WDI_MonModeRspCb wdiMonModeRspCb,
void* pUserData
);
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index a378ee6..d4d4023 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -32176,7 +32176,7 @@
WDI_Status
WDI_MonStartReq(WDI_MonStartReqType* pwdiMonStartReqParams,
- WDI_MonStartRspCb wdiMonStartRspCb,
+ WDI_MonModeRspCb wdiMonModeRspCb,
void* pUserData)
{
WDI_EventInfoType wdiEventData;
@@ -32195,7 +32195,7 @@
wdiEventData.wdiRequest = WDI_MON_START_REQ;
wdiEventData.pEventData = pwdiMonStartReqParams;
wdiEventData.uEventDataSize = sizeof(*pwdiMonStartReqParams);
- wdiEventData.pCBfnc = wdiMonStartRspCb;
+ wdiEventData.pCBfnc = wdiMonModeRspCb;
wdiEventData.pUserData = pUserData;
return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -32209,7 +32209,7 @@
)
{
WDI_MonStartReqType* pwdiMonStartReqParams;
- WDI_MonStartRspCb wdiMonStartCb;
+ WDI_MonModeRspCb wdiMonStartCb;
wpt_uint8* pSendBuffer = NULL;
wpt_uint16 usSendSize = 0;
wpt_uint16 usDataOffset = 0;
@@ -32228,7 +32228,7 @@
}
pwdiMonStartReqParams = (WDI_MonStartReqType*)pEventData->pEventData;
- wdiMonStartCb = (WDI_MonStartRspCb)pEventData->pCBfnc;
+ wdiMonStartCb = (WDI_MonModeRspCb)pEventData->pCBfnc;
/*-----------------------------------------------------------------------
Get message buffer
@@ -32282,7 +32282,7 @@
WDI_EventInfoType* pEventData
)
{
- WDI_MonStartRspCb wdiMonStartRspCb;
+ WDI_MonModeRspCb wdiMonStartRspCb;
WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
"%s: Enter ", __func__);
@@ -32298,7 +32298,7 @@
return WDI_STATUS_E_FAILURE;
}
- wdiMonStartRspCb = (WDI_MonStartRspCb)pWDICtx->pfncRspCB;
+ wdiMonStartRspCb = (WDI_MonModeRspCb)pWDICtx->pfncRspCB;
wdiMonStartRspCb((void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
@@ -32306,7 +32306,7 @@
}
WDI_Status
-WDI_MonStopReq(WDI_MonStopRspCb wdiMonStopRspCb,
+WDI_MonStopReq(WDI_MonModeRspCb wdiMonModeRspCb,
void* pUserData)
{
WDI_EventInfoType wdiEventData;
@@ -32325,7 +32325,7 @@
wdiEventData.wdiRequest = WDI_MON_STOP_REQ;
wdiEventData.pEventData = NULL;
wdiEventData.uEventDataSize = sizeof(NULL);
- wdiEventData.pCBfnc = wdiMonStopRspCb;
+ wdiEventData.pCBfnc = wdiMonModeRspCb;
wdiEventData.pUserData = pUserData;
return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
@@ -32338,7 +32338,7 @@
WDI_EventInfoType* pEventData
)
{
- WDI_MonStopRspCb wdiMonStopCb;
+ WDI_MonModeRspCb wdiMonStopCb;
wpt_uint8* pSendBuffer = NULL;
wpt_uint16 usSendSize = 0;
wpt_uint16 usDataOffset = 0;
@@ -32355,7 +32355,7 @@
return WDI_STATUS_E_FAILURE;
}
- wdiMonStopCb = (WDI_MonStopRspCb)pEventData->pCBfnc;
+ wdiMonStopCb = (WDI_MonModeRspCb)pEventData->pCBfnc;
/*-----------------------------------------------------------------------
Get message buffer
@@ -32394,7 +32394,7 @@
WDI_EventInfoType* pEventData
)
{
- WDI_MonStopRspCb wdiMonStopRspCb;
+ WDI_MonModeRspCb wdiMonStopRspCb;
WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
"%s: Enter ", __func__);
@@ -32409,9 +32409,9 @@
return WDI_STATUS_E_FAILURE;
}
- wdiMonStopRspCb = (WDI_MonStopRspCb)pWDICtx->pfncRspCB;
+ wdiMonStopRspCb = (WDI_MonModeRspCb)pWDICtx->pfncRspCB;
- wdiMonStopRspCb(pWDICtx->pRspCBUserData);
+ wdiMonStopRspCb(pWDICtx->pRspCBUserData, pWDICtx->pRspCBUserData);
return WDI_STATUS_SUCCESS;
}