wlan: linux regulatory changes
Properly separate out the regulatory changes when CONFIG_ENABLE_LINUX_REG
is defined and when it is not defined.
Change-Id: Ia01777a8b2e18a52b532e460a9ebcb1ab3196e50
CRs-Fixed: 538940
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index 99d4368..25d7abc 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -172,6 +172,12 @@
#else
int wlan_hdd_linux_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
#endif
+#else
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
+void wlan_hdd_crda_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+#else
+int wlan_hdd_crda_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+#endif
#endif
extern v_VOID_t hdd_connSetConnectionState( hdd_station_ctx_t *pHddStaCtx,
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 0cf6604..3842505 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -138,7 +138,11 @@
#define WAIT_TIME_TDLS_INITIATOR 600
/* Maximum time to get linux regulatory entry settings */
+#ifdef CONFIG_ENABLE_LINUX_REG
#define LINUX_REG_WAIT_TIME 300
+#else
+#define CRDA_WAIT_TIME 300
+#endif
/* Scan Req Timeout */
#define WLAN_WAIT_TIME_SCAN_REQ 100
@@ -1022,7 +1026,11 @@
struct completion mc_sus_event_var;
/* Completion variable for regulatory hint */
+#ifdef CONFIG_ENABLE_LINUX_REG
struct completion linux_reg_req;
+#else
+ struct completion driver_crda_req;
+#endif
v_BOOL_t isWlanSuspended;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 73db6ad..aa64d3d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -639,17 +639,22 @@
wiphy->mgmt_stypes = wlan_hdd_txrx_stypes;
+ wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY;
+
+
/* This will disable updating of NL channels from passive to
* active if a beacon is received on passive channel. */
wiphy->flags |= WIPHY_FLAG_DISABLE_BEACON_HINTS;
+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME
| WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
| WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
| WIPHY_FLAG_OFFCHAN_TX;
#endif
+
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
if (pCfg->isFastTransitionEnabled
#ifdef FEATURE_WLAN_LFR
@@ -682,6 +687,8 @@
regulatory settings */
wiphy->reg_notifier = wlan_hdd_linux_reg_notifier;
+#else
+ wiphy->reg_notifier = wlan_hdd_crda_reg_notifier;
#endif
wiphy->max_scan_ssids = MAX_SCAN_SSID;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 66d5fae..4a57141 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -6725,7 +6725,12 @@
init_completion(&pHddCtx->req_bmps_comp_var);
init_completion(&pHddCtx->scan_info.scan_req_completion_event);
init_completion(&pHddCtx->scan_info.abortscan_event_var);
+
+#ifdef CONFIG_ENABLE_LINUX_REG
init_completion(&pHddCtx->linux_reg_req);
+#else
+ init_completion(&pHddCtx->driver_crda_req);
+#endif
spin_lock_init(&pHddCtx->schedScan_lock);
@@ -6870,11 +6875,20 @@
goto err_wdclose;
}
+#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_clkvote;
+ }
+#endif
+
status = vos_open( &pVosContext, 0);
if ( !VOS_IS_STATUS_SUCCESS( status ))
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: vos_open failed", __func__);
- goto err_clkvote;
+ goto err_wiphy_unregister;
}
pHddCtx->hHal = (tHalHandle)vos_get_context( VOS_MODULE_ID_SME, pVosContext );
@@ -7015,6 +7029,8 @@
__func__);
goto err_vosstop;
}
+
+#ifndef CONFIG_ENABLE_LINUX_REG
wlan_hdd_cfg80211_update_reg_info( wiphy );
/* registration of wiphy dev with cfg80211 */
@@ -7023,6 +7039,7 @@
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: wiphy register failed", __func__);
goto err_vosstop;
}
+#endif
if (VOS_STA_SAP_MODE == hdd_get_conparam())
{
@@ -7267,21 +7284,31 @@
err_close_adapter:
hdd_close_all_adapters( pHddCtx );
+
+#ifndef CONFIG_ENABLE_LINUX_REG
wiphy_unregister(wiphy) ;
+#endif
err_vosstop:
vos_stop(pVosContext);
-err_vosclose:
+err_vosclose:
status = vos_sched_close( pVosContext );
if (!VOS_IS_STATUS_SUCCESS(status)) {
VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
"%s: Failed to close VOSS Scheduler", __func__);
VOS_ASSERT( VOS_IS_STATUS_SUCCESS( status ) );
}
- vos_close(pVosContext );
+ vos_close(pVosContext );
+
+err_wiphy_unregister:
+
+#ifdef CONFIG_ENABLE_LINUX_REG
+ wiphy_unregister(wiphy);
err_clkvote:
+#endif
+
vos_chipVoteOffXOBuffer(NULL, NULL, NULL);
err_wdclose: