wlan: Fix for SAP turning ON on invalid channels for a given CC
Avoid SAP turning ON on invalid channels when a particular country
code is set in hostapd.conf due to race condition between reg
notifier and nv bin based channel initializtion during driver load.
This commit ensures reg_notifier callback is called once the
channels are initialized based on nv bin, thus updating the latest
reg domain set by the notifier callback.
Change-Id: I4e8e9e9a86a58c8bf4c4ee9ebb85ba691694bd1c
CRs-Fixed: 661014
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 786bf6f..00577d5 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -187,6 +187,7 @@
tCsrEseBeaconReq *pEseBcnReq);
#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
+static VOS_STATUS wlan_hdd_init_channels_for_cc(hdd_context_t *pHddCtx);
/*
* Maximum buffer size used for returning the data back to user space
*/
@@ -8476,28 +8477,11 @@
goto err_vosclose;
}
-#ifdef CONFIG_ENABLE_LINUX_REG
- /* registration of wiphy dev with cfg80211 */
- if (0 > wlan_hdd_cfg80211_register(wiphy))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,"%s: wiphy register failed", __func__);
- goto err_vosclose;
- }
-
- status = wlan_hdd_init_channels(pHddCtx);
- if ( !VOS_IS_STATUS_SUCCESS( status ) )
- {
- hddLog(VOS_TRACE_LEVEL_FATAL, "%s: wlan_hdd_init_channels failed",
- __func__);
- goto err_wiphy_unregister;
- }
-#endif
-
status = vos_preStart( pHddCtx->pvosContext );
if ( !VOS_IS_STATUS_SUCCESS( status ) )
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: vos_preStart failed", __func__);
- goto err_wiphy_unregister;
+ goto err_vosclose;
}
if (0 == enable_dfs_chan_scan || 1 == enable_dfs_chan_scan)
@@ -8521,7 +8505,7 @@
if ( VOS_STATUS_SUCCESS != status )
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed hdd_set_sme_config", __func__);
- goto err_wiphy_unregister;
+ goto err_vosclose;
}
//Initialize the WMM module
@@ -8530,7 +8514,7 @@
if (!VOS_IS_STATUS_SUCCESS(status))
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: hdd_wmm_init failed", __func__);
- goto err_wiphy_unregister;
+ goto err_vosclose;
}
/* In the integrated architecture we update the configuration from
@@ -8541,7 +8525,7 @@
if (FALSE == hdd_update_config_dat(pHddCtx))
{
hddLog(VOS_TRACE_LEVEL_FATAL,"%s: config update failed",__func__ );
- goto err_wiphy_unregister;
+ goto err_vosclose;
}
// Get mac addr from platform driver
@@ -8623,7 +8607,7 @@
{
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Failed to set MAC Address. "
"HALStatus is %08d [x%08x]",__func__, halStatus, halStatus );
- goto err_wiphy_unregister;
+ goto err_vosclose;
}
}
@@ -8633,7 +8617,7 @@
if ( !VOS_IS_STATUS_SUCCESS( status ) )
{
hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_start failed",__func__);
- goto err_wiphy_unregister;
+ goto err_vosclose;
}
#ifdef FEATURE_WLAN_CH_AVOID
@@ -8666,6 +8650,31 @@
}
#endif
+#ifdef CONFIG_ENABLE_LINUX_REG
+ status = wlan_hdd_init_channels(pHddCtx);
+ if ( !VOS_IS_STATUS_SUCCESS( status ) )
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: wlan_hdd_init_channels failed",
+ __func__);
+ goto err_vosstop;
+ }
+
+ /* registration of wiphy dev with cfg80211 */
+ if (0 > wlan_hdd_cfg80211_register(wiphy))
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: wiphy register failed", __func__);
+ goto err_vosstop;
+ }
+
+ status = wlan_hdd_init_channels_for_cc(pHddCtx);
+ if ( !VOS_IS_STATUS_SUCCESS( status ) )
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: wlan_hdd_init_channels_for_cc failed",
+ __func__);
+ goto err_unregister_wiphy;
+ }
+#endif
+
if (VOS_STA_SAP_MODE == hdd_get_conparam())
{
pAdapter = hdd_open_adapter( pHddCtx, WLAN_HDD_SOFTAP, "softap.%d",
@@ -8969,19 +8978,11 @@
err_close_adapter:
hdd_close_all_adapters( pHddCtx );
-
-#ifndef CONFIG_ENABLE_LINUX_REG
+err_unregister_wiphy:
wiphy_unregister(wiphy) ;
-#endif
-
err_vosstop:
vos_stop(pVosContext);
-err_wiphy_unregister:
-#ifdef CONFIG_ENABLE_LINUX_REG
- wiphy_unregister(wiphy);
-#endif
-
err_vosclose:
status = vos_sched_close( pVosContext );
if (!VOS_IS_STATUS_SUCCESS(status)) {
@@ -9862,6 +9863,22 @@
}
}
+static VOS_STATUS wlan_hdd_init_channels_for_cc(hdd_context_t *pHddCtx)
+{
+ eHalStatus status;
+
+ status = sme_InitChannelsForCC(pHddCtx->hHal);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ return VOS_STATUS_SUCCESS;
+ }
+ else
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL,"%s: Issue reg hint failed(%d)",
+ __func__, status);
+ return VOS_STATUS_E_FAULT;
+ }
+}
/*
* API to find if there is any STA or P2P-Client is connected
*/