wlan: Handle out of order batch scan commands
HDD to handle out of order batch scan commands from framework
Change-Id: I3fba943a20684c11a31691b8712d763e1cce0fee
CRs-Fixed: 563183
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index c507a2f..98487f5 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -759,6 +759,21 @@
};
typedef struct tHDDBatchScanRspList tHddBatchScanRsp;
+
+/*Batch Scan state*/
+typedef enum
+{
+ /*Batch scan is started this means WLS_BATCHING SET command is issued
+ from framework*/
+ eHDD_BATCH_SCAN_STATE_STARTED,
+
+ /*Batch scan is stopped this means WLS_BATCHING STOP command is issued
+ from framework*/
+ eHDD_BATCH_SCAN_STATE_STOPPED,
+
+ eHDD_BATCH_SCAN_STATE_MAX,
+} eHDD_BATCH_SCAN_STATE;
+
#endif
@@ -931,6 +946,8 @@
volatile v_BOOL_t hdd_wait_for_set_batch_scan_rsp;
/*Previous batch scan ID*/
v_U32_t prev_batch_id;
+ /*Batch scan state*/
+ eHDD_BATCH_SCAN_STATE batchScanState;
#endif
};
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 307fae9..0068dc5 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -3162,25 +3162,29 @@
goto exit;
}
+
if ((WLAN_HDD_INFRA_STATION != pAdapter->device_mode) &&
(WLAN_HDD_P2P_CLIENT != pAdapter->device_mode))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "Received WLS_BATCHING_SET command in invalid mode %d "
+ "Received WLS_BATCHING SET command in invalid mode %d "
"WLS_BATCHING_SET is only allowed in infra STA/P2P client mode",
pAdapter->device_mode);
ret = -EINVAL;
goto exit;
}
+
status = hdd_parse_set_batchscan_command(value, pReq);
if (status)
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "Invalid WLS_BATCHING_SET command");
+ "Invalid WLS_BATCHING SET command");
ret = -EINVAL;
goto exit;
}
+
+
pAdapter->hdd_wait_for_set_batch_scan_rsp = TRUE;
halStatus = sme_SetBatchScanReq(WLAN_HDD_GET_HAL_CTX(pAdapter), pReq,
pAdapter->sessionId, hdd_set_batch_scan_req_callback,
@@ -3218,6 +3222,8 @@
either MSCAN or the max # of scans firmware can cache*/
ret = MIN(pReq->numberOfScansToBatch , pRsp->nScansToBatch);
+ pAdapter->batchScanState = eHDD_BATCH_SCAN_STATE_STARTED;
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: request MSCAN %d response MSCAN %d ret %d",
__func__, pReq->numberOfScansToBatch, pRsp->nScansToBatch, ret);
@@ -3245,18 +3251,17 @@
goto exit;
}
- if ((WLAN_HDD_INFRA_STATION != pAdapter->device_mode) &&
- (WLAN_HDD_P2P_CLIENT != pAdapter->device_mode))
+ if (eHDD_BATCH_SCAN_STATE_STARTED != pAdapter->batchScanState)
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "Received WLS_BATCHING_STOP command in invalid mode %d "
- "WLS_BATCHING_STOP is only allowed in infra STA/P2P client"
- " mode",
- pAdapter->device_mode);
+ "Batch scan is not yet enabled batch scan state %d",
+ pAdapter->batchScanState);
ret = -EINVAL;
goto exit;
}
+ pAdapter->batchScanState = eHDD_BATCH_SCAN_STATE_STOPPED;
+
halStatus = sme_StopBatchScanInd(WLAN_HDD_GET_HAL_CTX(pAdapter), pInd,
pAdapter->sessionId);
if ( eHAL_STATUS_SUCCESS == halStatus )
@@ -3287,14 +3292,12 @@
goto exit;
}
- if ((WLAN_HDD_INFRA_STATION != pAdapter->device_mode) &&
- (WLAN_HDD_P2P_CLIENT != pAdapter->device_mode))
+ if (eHDD_BATCH_SCAN_STATE_STARTED != pAdapter->batchScanState)
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "Received WLS_BATCHING_GET command in invalid mode %d "
- "WLS_BATCHING_GET is only allowed in infra STA/P2P client"
- " mode",
- pAdapter->device_mode);
+ "Batch scan is not yet enabled could not return results"
+ "Batch Scan state %d",
+ pAdapter->batchScanState);
ret = -EINVAL;
goto exit;
}
@@ -4429,6 +4432,7 @@
init_completion(&pAdapter->hdd_get_batch_scan_req_var);
pAdapter->pBatchScanRsp = NULL;
pAdapter->numScanList = 0;
+ pAdapter->batchScanState = eHDD_BATCH_SCAN_STATE_STOPPED;
mutex_init(&pAdapter->hdd_batch_scan_lock);
#endif