wlan:Pass correct session for scan abort
Currently Driver passes pAdapter->sessionId for abort Scan.
For concurrency case it may happen that scan is not running
for the pAdapter's->sessionId where as it might be running
on another adapter's session. As a part of fix made sure
that correct sessionId is passed for abort scan.
Change-Id: I51cd614858b082d9bd39b9ada40b7e5a5a32df5c
CRs-Fixed: 743630
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 961466d..7ede0a1 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -799,6 +799,7 @@
vos_event_t scan_finished_event;
hdd_scan_pending_option_e scan_pending_option;
+ tANI_U8 sessionId;
}hdd_scaninfo_t;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index eab37de..87be760 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -9834,6 +9834,7 @@
}
pScanInfo->mScanPending = TRUE;
+ pScanInfo->sessionId = pAdapter->sessionId;
pAdapter->request = request;
pScanInfo->scanId = scanId;
@@ -11192,7 +11193,7 @@
{
hddLog(VOS_TRACE_LEVEL_INFO, "Disconnect is in progress, "
"Aborting Scan");
- hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
+ hdd_abort_mac_scan(pHddCtx, pScanInfo->sessionId,
eCSR_SCAN_ABORT_DEFAULT);
}
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 770e5dd..ee13203 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -888,7 +888,7 @@
// Lets do abort scan to ensure smooth authentication for client
if ((pScanInfo != NULL) && pScanInfo->mScanPending)
{
- hdd_abort_mac_scan(pHddCtx, pHostapdAdapter->sessionId,
+ hdd_abort_mac_scan(pHddCtx, pScanInfo->sessionId,
eCSR_SCAN_ABORT_DEFAULT);
}
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index a74d096..a06e497 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -6806,12 +6806,13 @@
{
eHalStatus halStatus = eHAL_STATUS_SUCCESS;
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
+ hdd_scaninfo_t *pScanInfo = NULL;
union iwreq_data wrqu;
v_U8_t retry = 0;
long ret;
ENTER();
-
+ pScanInfo = &pHddCtx->scan_info;
switch(pAdapter->device_mode)
{
case WLAN_HDD_INFRA_STATION:
@@ -6865,9 +6866,9 @@
FL("wait on disconnect_comp_var failed %ld"), ret);
}
}
- else
+ else if(pScanInfo != NULL && pHddCtx->scan_info.mScanPending)
{
- hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
+ hdd_abort_mac_scan(pHddCtx, pScanInfo->sessionId,
eCSR_SCAN_ABORT_DEFAULT);
}
if (pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
@@ -7861,33 +7862,34 @@
wlan_hdd_cfg80211_deregister_frames(pAdapter);
hdd_UnregisterWext(pAdapter->dev);
}
- // Cancel any outstanding scan requests. We are about to close all
- // of our adapters, but an adapter structure is what SME passes back
- // to our callback function. Hence if there are any outstanding scan
- // requests then there is a race condition between when the adapter
- // is closed and when the callback is invoked.We try to resolve that
- // race condition here by canceling any outstanding scans before we
- // close the adapters.
- // Note that the scans may be cancelled in an asynchronous manner,
- // so ideally there needs to be some kind of synchronization. Rather
- // than introduce a new synchronization here, we will utilize the
- // fact that we are about to Request Full Power, and since that is
- // synchronized, the expectation is that by the time Request Full
- // Power has completed all scans will be cancelled.
- if (pHddCtx->scan_info.mScanPending)
- {
- hddLog(VOS_TRACE_LEVEL_INFO,
- FL("abort scan mode: %d sessionId: %d"),
- pAdapter->device_mode,
- pAdapter->sessionId);
- hdd_abort_mac_scan(pHddCtx,
- pAdapter->sessionId,
- eCSR_SCAN_ABORT_DEFAULT);
- }
+
}
vosStatus = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
pAdapterNode = pNext;
}
+ // Cancel any outstanding scan requests. We are about to close all
+ // of our adapters, but an adapter structure is what SME passes back
+ // to our callback function. Hence if there are any outstanding scan
+ // requests then there is a race condition between when the adapter
+ // is closed and when the callback is invoked.We try to resolve that
+ // race condition here by canceling any outstanding scans before we
+ // close the adapters.
+ // Note that the scans may be cancelled in an asynchronous manner,
+ // so ideally there needs to be some kind of synchronization. Rather
+ // than introduce a new synchronization here, we will utilize the
+ // fact that we are about to Request Full Power, and since that is
+ // synchronized, the expectation is that by the time Request Full
+ // Power has completed all scans will be cancelled.
+ if (pHddCtx->scan_info.mScanPending)
+ {
+ hddLog(VOS_TRACE_LEVEL_INFO,
+ FL("abort scan mode: %d sessionId: %d"),
+ pAdapter->device_mode,
+ pAdapter->sessionId);
+ hdd_abort_mac_scan(pHddCtx,
+ pHddCtx->scan_info.sessionId,
+ eCSR_SCAN_ABORT_DEFAULT);
+ }
}
else
{
@@ -10412,7 +10414,7 @@
if (pScanInfo->mScanPending)
{
INIT_COMPLETION(pScanInfo->abortscan_event_var);
- hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
+ hdd_abort_mac_scan(pHddCtx, pScanInfo->sessionId,
eCSR_SCAN_ABORT_DEFAULT);
status = wait_for_completion_interruptible_timeout(
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 9c1e9a6..93fe403 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -2256,7 +2256,7 @@
hddLog(LOGE,"Action frame received when Scanning is in"
" progress. Abort Scan.");
hdd_abort_mac_scan(pAdapter->pHddCtx,
- pAdapter->sessionId,
+ pScanInfo->sessionId,
eCSR_SCAN_ABORT_DEFAULT);
}
}
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index b93982d..6789484 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -7834,6 +7834,7 @@
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ hdd_scaninfo_t *pScanInfo = NULL;
eCsrBand band;
eCsrBand currBand = eCSR_BAND_MAX;
eCsrBand connectedBand;
@@ -7949,9 +7950,12 @@
vos_update_nv_table_from_wiphy_band((void *)pHddCtx,
(void *)pHddCtx->wiphy, (eCsrBand)band);
}
-
- hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
- eCSR_SCAN_ABORT_DUE_TO_BAND_CHANGE);
+ pScanInfo = &pHddCtx->scan_info;
+ if ((pScanInfo != NULL) && pHddCtx->scan_info.mScanPending)
+ {
+ hdd_abort_mac_scan(pHddCtx, pScanInfo->sessionId,
+ eCSR_SCAN_ABORT_DUE_TO_BAND_CHANGE);
+ }
sme_FilterScanResults(hHal, pAdapter->sessionId);
if (band != eCSR_BAND_ALL &&