wlan: Abort on-going scan upon receiving PNO enable command
Abort on-going scan upon receiving PNO enable command as the
current firmware design for PNO doesnot consider PNO enable
while on-going host scan.
Change-Id: I92ee90d256f6a8a7e1990a43bdb06a095a413028
CRs-Fixed: 669478
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 5ad437e..de5644c 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1446,4 +1446,6 @@
boolean hdd_is_5g_supported(hdd_context_t * pHddCtx);
+int wlan_hdd_scan_abort(hdd_adapter_t *pAdapter);
+
#endif // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 74c2f46..dc167d3 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -2479,6 +2479,7 @@
hdd_scaninfo_t *pScanInfo = NULL;
hdd_adapter_t *staAdapter = NULL;
VOS_STATUS status;
+ long ret;
ENTER();
@@ -2520,32 +2521,22 @@
__func__, hdd_device_modetoString(pAdapter->device_mode),
pAdapter->device_mode);
- if ((pScanInfo != NULL) && pScanInfo->mScanPending && staAdapter)
+ ret = wlan_hdd_scan_abort(pAdapter);
+
+ if (ret <= 0)
{
- long ret;
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("Timeout occurred while waiting for abortscan %ld"), ret);
- INIT_COMPLETION(pScanInfo->abortscan_event_var);
- hdd_abort_mac_scan(staAdapter->pHddCtx, pAdapter->sessionId,
- eCSR_SCAN_ABORT_DEFAULT);
- ret = wait_for_completion_interruptible_timeout(
- &pScanInfo->abortscan_event_var,
- msecs_to_jiffies(WLAN_WAIT_TIME_ABORTSCAN));
- if (ret <= 0)
+ if (pHddCtx->isLogpInProgress)
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- FL("Timeout occurred while waiting for abortscan %ld"),
- ret);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: LOGP in Progress. Ignore!!!", __func__);
- if (pHddCtx->isLogpInProgress)
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: LOGP in Progress. Ignore!!!", __func__);
-
- VOS_ASSERT(pScanInfo->mScanPending);
- return -EAGAIN;
- }
VOS_ASSERT(pScanInfo->mScanPending);
+ return -EAGAIN;
}
+ VOS_ASSERT(pScanInfo->mScanPending);
}
hdd_hostapd_stop(dev);
@@ -8579,6 +8570,14 @@
return -EINVAL;
}
+ ret = wlan_hdd_scan_abort(pAdapter);
+ if (ret <= 0)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: aborting the existing scan is unsuccessfull", __func__);
+ return -EBUSY;
+ }
+
if (eHAL_STATUS_SUCCESS != wlan_hdd_is_pno_allowed(pAdapter))
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index c3b7834..2f8a1b9 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -267,6 +267,7 @@
#ifdef WLAN_BTAMP_FEATURE
VOS_STATUS status;
#endif
+ long result;
//Make sure that this callback corresponds to our device.
if ((strncmp(dev->name, "wlan", 4)) &&
@@ -316,26 +317,17 @@
break;
case NETDEV_GOING_DOWN:
- if( pHddCtx->scan_info.mScanPending != FALSE )
- {
- long result;
- INIT_COMPLETION(pHddCtx->scan_info.abortscan_event_var);
- hdd_abort_mac_scan(pAdapter->pHddCtx, pAdapter->sessionId,
- eCSR_SCAN_ABORT_DEFAULT);
- result = wait_for_completion_interruptible_timeout(
- &pHddCtx->scan_info.abortscan_event_var,
- msecs_to_jiffies(WLAN_WAIT_TIME_ABORTSCAN));
- if (result <= 0)
- {
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: Timeout occurred while waiting for abortscan %ld",
- __func__, result);
- }
+ result = wlan_hdd_scan_abort(pAdapter);
+ if (result <= 0)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Timeout occurred while waiting for abortscan %ld",
+ __func__, result);
}
else
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
- "%s: Scan is not Pending from user" , __func__);
+ "%s: Scan Abort Successful" , __func__);
}
#ifdef WLAN_BTAMP_FEATURE
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"%s: disabling AMP", __func__);
@@ -9890,6 +9882,33 @@
return sme_isSta_p2p_clientConnected(pHddCtx->hHal);
}
+int wlan_hdd_scan_abort(hdd_adapter_t *pAdapter)
+{
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ hdd_scaninfo_t *pScanInfo = NULL;
+ int status;
+
+ pScanInfo = &pHddCtx->scan_info;
+ if (pScanInfo->mScanPending)
+ {
+ INIT_COMPLETION(pScanInfo->abortscan_event_var);
+ hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
+ eCSR_SCAN_ABORT_DEFAULT);
+
+ status = wait_for_completion_interruptible_timeout(
+ &pScanInfo->abortscan_event_var,
+ msecs_to_jiffies(5000));
+ if ((!status) || (status == -ERESTARTSYS))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Timeout occurred while waiting for abort scan",
+ __func__);
+ return -ETIMEDOUT;
+ }
+ }
+ return status;
+}
+
//Register the module init/exit functions
module_init(hdd_module_init);
module_exit(hdd_module_exit);