wlan: Abort existing remain on channel.
Firmware can't handle WLAN_HAL_SET_PREF_NETWORK_REQ in between the
scan (WLAN_HAL_INIT_SCAN_REQ and FINISH_SCAN_REQ/RSP).
Hence abort existing remain on channel before enabling the sched/pno
scan.
Change-Id: I25abf7aa3a147a5abea6f7edcd42db8fdcfed7f1
CRs-Fixed: 744157
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 7ede0a1..688d91b 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1489,4 +1489,7 @@
int wlan_hdd_scan_abort(hdd_adapter_t *pAdapter);
VOS_STATUS wlan_hdd_init_channels_for_cc(hdd_context_t *pHddCtx, driver_load_type init );
+
+VOS_STATUS wlan_hdd_cancel_remain_on_channel(hdd_context_t *pHddCtx);
+
#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 b6f7fc2..76403fa 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -13064,6 +13064,14 @@
FL("already PNO is enabled"));
return -EBUSY;
}
+
+ if (VOS_STATUS_SUCCESS != wlan_hdd_cancel_remain_on_channel(pHddCtx))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: abort ROC failed ", __func__);
+ return -EBUSY;
+ }
+
pHddCtx->isPnoEnable = TRUE;
pPnoRequest = (tpSirPNOScanReq) vos_mem_malloc(sizeof (tSirPNOScanReq));
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 753b9cc..6a8127c 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -10436,6 +10436,37 @@
return 0;
}
+VOS_STATUS wlan_hdd_cancel_remain_on_channel(hdd_context_t *pHddCtx)
+{
+ hdd_adapter_t *pAdapter;
+ hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
+ VOS_STATUS vosStatus;
+
+ vosStatus = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
+ while (NULL != pAdapterNode && VOS_STATUS_E_EMPTY != vosStatus)
+ {
+ pAdapter = pAdapterNode->pAdapter;
+ if (NULL != pAdapter)
+ {
+ if (WLAN_HDD_P2P_DEVICE == pAdapter->device_mode ||
+ WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ||
+ WLAN_HDD_P2P_GO == pAdapter->device_mode)
+ {
+ hddLog(LOG1, FL("abort ROC deviceMode: %d"),
+ pAdapter->device_mode);
+ if (VOS_STATUS_SUCCESS !=
+ wlan_hdd_cancel_existing_remain_on_channel(pAdapter))
+ {
+ hddLog(LOGE, FL("failed to abort ROC"));
+ return VOS_STATUS_E_FAILURE;
+ }
+ }
+ }
+ vosStatus = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
+ pAdapterNode = pNext;
+ }
+ return VOS_STATUS_SUCCESS;
+}
//Register the module init/exit functions
module_init(hdd_module_init);
module_exit(hdd_module_exit);