wlan: Use request manager while processing monitor mode start/stop request
We are transitioning to the new request manager framework. Implement
this infrastructure while processing monitor mode start and stop
requests.
Change-Id: Ifad372b2f6a7f1c7d2e1e41b721f0c19460fcc86
CRs-Fixed: 2224245
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index ef05de5..0cb344b 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1997,9 +1997,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);
-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_mon_post_msg_cb(void *context);
+VOS_STATUS wlan_hdd_mon_postMsg(void *cookie, 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 d9ef048..98a2c90 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -9629,23 +9629,21 @@
return status;
}
-void hdd_monPostMsgCb(tANI_U32 *magic, struct completion *cmpVar)
+void hdd_mon_post_msg_cb(void *context)
{
- if (magic == NULL || cmpVar == NULL) {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- FL("invalid arguments %pK %pK"), magic, cmpVar);
- return;
- }
- if (*magic != MON_MODE_MSG_MAGIC) {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- FL("maic: %x"), *magic);
- return;
- }
+ struct hdd_request *request;
- complete(cmpVar);
- return;
+ request = hdd_request_get(context);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Obsolete request"));
+ return;
+ }
+
+ hdd_request_complete(request);
+ hdd_request_put(request);
}
+
void hdd_init_mon_mode (hdd_adapter_t *pAdapter)
{
hdd_mon_ctx_t *pMonCtx = NULL;
@@ -10106,12 +10104,16 @@
int wlan_hdd_stop_mon(hdd_context_t *hdd_ctx, bool wait)
{
- hdd_mon_ctx_t *mon_ctx;
- long ret;
- v_U32_t magic;
- struct completion cmp_var;
- void (*func_ptr)(tANI_U32 *magic, struct completion *cmpVar) = NULL;
hdd_adapter_t *adapter;
+ hdd_mon_ctx_t *mon_ctx;
+ void (*func_ptr)(void *context) = NULL;
+ int ret = 0;
+ void *cookie = NULL;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = MON_MODE_MSG_TIMEOUT,
+ };
adapter = hdd_get_adapter(hdd_ctx, WLAN_HDD_MONITOR);
if (!adapter) {
@@ -10128,28 +10130,37 @@
mon_ctx->state = MON_MODE_STOP;
if (wait) {
- func_ptr = hdd_monPostMsgCb;
- magic = MON_MODE_MSG_MAGIC;
- init_completion(&cmp_var);
+ func_ptr = hdd_mon_post_msg_cb;
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Request allocation failure"));
+ return -ENOMEM;
+ }
+ cookie = hdd_request_cookie(request);
}
- if (VOS_STATUS_SUCCESS != wlan_hdd_mon_postMsg(&magic, &cmp_var,
+ /*
+ * If func_ptr is NULL, on receiving WDI_MON_START_RSP or
+ * WDI_MON_STOP_RSP hdd_mon_post_msg_cb() won't be invoked
+ * and so uninitialized cookie won't be accessed.
+ */
+ if (VOS_STATUS_SUCCESS != wlan_hdd_mon_postMsg(cookie,
mon_ctx,
- hdd_monPostMsgCb)) {
+ func_ptr)) {
hddLog(LOGE, FL("failed to stop MON MODE"));
- mon_ctx->state = MON_MODE_START;
- magic = 0;
- return -EINVAL;
+ ret = -EINVAL;
}
if (!wait)
goto bmps_roaming;
- ret = wait_for_completion_timeout(&cmp_var, MON_MODE_MSG_TIMEOUT);
- magic = 0;
- if (ret <= 0 ) {
+ if (!ret)
+ ret = hdd_request_wait_for_response(request);
+ hdd_request_put(request);
+ if (ret) {
hddLog(LOGE,
- FL("timeout on stop monitor mode completion %ld"), ret);
+ FL("timeout on stop monitor mode completion %d"), ret);
return -EINVAL;
}
@@ -11913,8 +11924,8 @@
pMonCtx->typeSubtypeBitmap |= 0xFFFF00000000;
}
-VOS_STATUS wlan_hdd_mon_postMsg(tANI_U32 *magic, struct completion *cmpVar,
- hdd_mon_ctx_t *pMonCtx , void* callback)
+VOS_STATUS wlan_hdd_mon_postMsg(void *context, hdd_mon_ctx_t *pMonCtx,
+ void* callback)
{
vos_msg_t monMsg;
tSirMonModeReq *pMonModeReq;
@@ -11936,8 +11947,7 @@
return VOS_STATUS_E_FAILURE;
}
- pMonModeReq->magic = magic;
- pMonModeReq->cmpVar = cmpVar;
+ pMonModeReq->context = context;
pMonModeReq->data = pMonCtx;
pMonModeReq->callback = callback;
@@ -11957,10 +11967,14 @@
{
VOS_STATUS vosStatus;
v_CONTEXT_t pVosContext = pHddCtx->pvosContext;
- long ret;
hdd_mon_ctx_t *pMonCtx = NULL;
- v_U32_t magic;
- struct completion cmpVar;
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = MON_MODE_MSG_TIMEOUT,
+ };
hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_MONITOR);
if(pAdapter == NULL || pVosContext == NULL)
@@ -11972,23 +11986,29 @@
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);
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ return;
+ }
+ cookie = hdd_request_cookie(request);
+
if (VOS_STATUS_SUCCESS !=
- wlan_hdd_mon_postMsg(&magic, &cmpVar,
- pMonCtx, hdd_monPostMsgCb)) {
+ wlan_hdd_mon_postMsg(cookie, pMonCtx,
+ hdd_mon_post_msg_cb)) {
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;
+ goto req_put;
}
- ret = wait_for_completion_timeout(&cmpVar, MON_MODE_MSG_TIMEOUT);
- magic = 0;
- if (ret <= 0 ) {
+
+ ret = hdd_request_wait_for_response(request);
+ if (ret)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- FL("timeout on monitor mode completion %ld"), ret);
- }
+ FL("timeout on monitor mode completion %d"), ret);
+
+req_put:
+ hdd_request_put(request);
}
hdd_UnregisterWext(pAdapter->dev);
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 7ed85bc..e94e9f5 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -5436,9 +5436,12 @@
case WE_SET_MONITOR_STATE:
{
- v_U32_t magic = 0;
- struct completion cmp_var;
- long waitRet = 0;
+ void *cookie;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = MON_MODE_MSG_TIMEOUT,
+ };
mon_ctx = WLAN_HDD_GET_MONITOR_CTX_PTR(adapter);
if(!mon_ctx) {
@@ -5459,30 +5462,33 @@
break;
mon_ctx->state = set_value;
- magic = MON_MODE_MSG_MAGIC;
- init_completion(&cmp_var);
- if (wlan_hdd_mon_postMsg(&magic, &cmp_var, mon_ctx,
- hdd_monPostMsgCb) != VOS_STATUS_SUCCESS) {
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ ret = -ENOMEM;
+ break;
+ }
+ cookie = hdd_request_cookie(request);
+ if (wlan_hdd_mon_postMsg(cookie, mon_ctx,
+ hdd_mon_post_msg_cb)
+ != VOS_STATUS_SUCCESS) {
hddLog(LOGE, FL("failed to post MON MODE REQ"));
mon_ctx->state =
(mon_ctx->state==MON_MODE_START) ?
MON_MODE_STOP : MON_MODE_START;
- magic = 0;
ret = -EIO;
- break;
+ } else {
+ ret = hdd_request_wait_for_response(request);
+ if (ret){
+ hddLog(LOGE, FL("failed to wait on monitor mode completion %d"),
+ ret);
+ } else if (mon_ctx->state == MON_MODE_STOP) {
+ hddLog(LOG1, FL("Enable BMPS"));
+ hdd_enable_bmps_imps(hdd_ctx);
+ hdd_restore_roaming(hdd_ctx);
+ }
}
-
- waitRet = wait_for_completion_timeout(&cmp_var,
- MON_MODE_MSG_TIMEOUT);
- magic = 0;
- if (waitRet <= 0 ){
- hddLog(LOGE, FL("failed to wait on monitor mode completion %ld"),
- waitRet);
- } else if (mon_ctx->state == MON_MODE_STOP) {
- hddLog(LOG1, FL("Enable BMPS"));
- hdd_enable_bmps_imps(hdd_ctx);
- hdd_restore_roaming(hdd_ctx);
- }
+ hdd_request_put(request);
}
break;
@@ -6096,10 +6102,14 @@
}
case WE_SET_MONITOR_STATE:
{
- v_U32_t magic = 0;
- struct completion cmpVar;
- long waitRet = 0;
tVOS_CON_MODE mode = hdd_get_conparam();
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = MON_MODE_MSG_TIMEOUT,
+ };
if( VOS_MONITOR_MODE != mode)
{
@@ -6123,26 +6133,31 @@
break;
}
pMonCtx->state = set_value;
- magic = MON_MODE_MSG_MAGIC;
- init_completion(&cmpVar);
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ ret = -ENOMEM;
+ break;
+ }
+ cookie = hdd_request_cookie(request);
+
if (VOS_STATUS_SUCCESS !=
- wlan_hdd_mon_postMsg(&magic, &cmpVar,
- pMonCtx, hdd_monPostMsgCb)) {
+ wlan_hdd_mon_postMsg(cookie, pMonCtx,
+ hdd_mon_post_msg_cb)) {
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;
+ } else {
+ ret = hdd_request_wait_for_response(request);
+ if (ret) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to wait on monitor mode completion %d"),
+ ret);
+ }
}
- 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);
- }
+ hdd_request_put(request);
break;
}
case WE_SET_PKT_STATS_ENABLE_DISABLE:
@@ -7900,10 +7915,14 @@
#endif
case WE_CONFIGURE_MONITOR_MODE:
{
- v_U32_t magic = 0;
- struct completion cmpVar;
- long waitRet = 0;
tVOS_CON_MODE mode = hdd_get_conparam();
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = MON_MODE_MSG_TIMEOUT,
+ };
if (VOS_MONITOR_MODE != mode) {
hddLog(LOGE, FL("invalid mode %d"), mode);
@@ -7937,34 +7956,41 @@
pMonCtx->typeSubtypeBitmap = 0xFFFF00000000;
}
if (MON_MODE_START == pMonCtx->state) {
- magic = MON_MODE_MSG_MAGIC;
- init_completion(&cmpVar);
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ return -ENOMEM;
+ }
+ cookie = hdd_request_cookie(request);
+
if (VOS_STATUS_SUCCESS !=
- wlan_hdd_mon_postMsg(&magic, &cmpVar,
- pMonCtx, hdd_monPostMsgCb)) {
+ wlan_hdd_mon_postMsg(cookie, pMonCtx,
+ hdd_mon_post_msg_cb)) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
FL("failed to post MON MODE REQ"));
- magic = 0;
- return -EIO;
- }
- 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);
- }
- }
+ ret = -EIO;
+ } else {
+ ret = hdd_request_wait_for_response(request);
+ if (ret)
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to wait on monitor mode completion %d"),
+ ret);
+ }
+ hdd_request_put(request);
+ }
}
break;
case WE_SET_MONITOR_MODE_FILTER:
{
- v_U32_t magic = 0;
- struct completion cmpVar;
- long waitRet = 0;
tVOS_CON_MODE mode = hdd_get_conparam();
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ static const struct hdd_request_params params = {
+ .priv_size = 0,
+ .timeout_ms = MON_MODE_MSG_TIMEOUT,
+ };
if (VOS_MONITOR_MODE != mode) {
hddLog(LOGE, FL("invalid mode %d"), mode);
@@ -7992,24 +8018,23 @@
__func__, pMonCtx->mmFilters[0].macAddr.bytes,
apps_args[6], apps_args[7], apps_args[8]);
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;
- return -EIO;
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ return -ENOMEM;
}
- 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);
+ cookie = hdd_request_cookie(request);
+
+ if (VOS_STATUS_SUCCESS ==
+ wlan_hdd_mon_postMsg(cookie, pMonCtx,
+ hdd_mon_post_msg_cb)) {
+ ret = hdd_request_wait_for_response(request);
+ if (ret)
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("failed to wait on monitor mode completion %d"),
+ ret);
}
+ hdd_request_put(request);
}
}
break;
@@ -8022,7 +8047,7 @@
break;
}
EXIT();
- return 0;
+ return ret;
}
static int iw_hdd_set_var_ints_getnone(struct net_device *dev,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 4b054bf..2e8a8ef 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6106,12 +6106,11 @@
tSirMacAddr bssid;
}tSirDelAllTdlsPeers, *ptSirDelAllTdlsPeers;
-typedef void (*tSirMonModeCb)(tANI_U32 *magic, struct completion *cmpVar);
+typedef void (*tSirMonModeCb)(void *context);
typedef struct
{
- tANI_U32 *magic;
- struct completion *cmpVar;
void *data;
+ void *context;
tSirMonModeCb callback;
}tSirMonModeReq, *ptSirMonModeReq;
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 0a9384b..a3dfa7b 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -22990,8 +22990,8 @@
return ;
}
pData = (tSirMonModeReq *)pWdaParams->wdaMsgParam;
- if (pData != NULL) {
- pData->callback(pData->magic, pData->cmpVar);
+ if (pData != NULL && pData->callback != NULL) {
+ pData->callback(pData->context);
vos_mem_free(pWdaParams->wdaMsgParam);
}
vos_mem_free(pWdaParams) ;