wlan: Add routines to support CRDA
Add support for CRDA regulatory functionality
Change-Id: I544678c343af5882328642b17af7b2cb4ff32633
CR-Fixed: NA
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 3ad2c46..10eacc3 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -444,6 +444,11 @@
VAR_FLAGS_OPTIONAL,
(void *)CFG_INTF3_MAC_ADDR_DEFAULT ),
+ REG_VARIABLE_STRING( CFG_CRDA_DEFAULT_COUNTRY_CODE, WLAN_PARAM_String,
+ hdd_config_t, crdaDefaultCountryCode,
+ VAR_FLAGS_OPTIONAL,
+ (void *)CFG_CRDA_DEFAULT_COUNTRY_CODE_DEFAULT ),
+
#ifdef WLAN_SOFTAP_FEATURE
REG_VARIABLE( CFG_AP_QOS_UAPSD_MODE_NAME , WLAN_PARAM_Integer,
hdd_config_t, apUapsdEnabled,
@@ -3013,6 +3018,8 @@
pConfig->WmmMode, pConfig->b80211eIsEnabled, pConfig->dot11Mode);
// Config params obtained from the registry
+ if (is_crda_regulatory_entry_valid() == VOS_TRUE)
+ sme_setRegInfo(pHddCtx->hHal, pConfig->crdaDefaultCountryCode);
smeConfig.csrConfig.RTSThreshold = pConfig->RTSThreshold;
smeConfig.csrConfig.FragmentationThreshold = pConfig->FragmentationThreshold;
smeConfig.csrConfig.shortSlotTime = pConfig->ShortSlotTimeEnabled;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index b645567..58abfee 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -166,6 +166,13 @@
static struct ieee80211_channel hdd_channels_5_GHZ[] =
{
+ HDD5GHZCHAN(4920, 240, 0) ,
+ HDD5GHZCHAN(4940, 244, 0) ,
+ HDD5GHZCHAN(4960, 248, 0) ,
+ HDD5GHZCHAN(4980, 252, 0) ,
+ HDD5GHZCHAN(5040, 208, 0) ,
+ HDD5GHZCHAN(5060, 212, 0) ,
+ HDD5GHZCHAN(5080, 216, 0) ,
HDD5GHZCHAN(5180, 36, 0) ,
HDD5GHZCHAN(5200, 40, 0) ,
HDD5GHZCHAN(5220, 44, 0) ,
@@ -458,6 +465,12 @@
wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
| WIPHY_FLAG_OFFCHAN_TX;
#endif
+ /* even with WIPHY_FLAG_CUSTOM_REGULATORY,
+ driver can still register regulatory callback and
+ it will get CRDA setting in wiphy->band[], but
+ driver need to determine what to do with both
+ regulatory settings */
+ wiphy->reg_notifier = wlan_hdd_crda_reg_notifier;
wiphy->max_scan_ssids = MAX_SCAN_SSID;
@@ -533,6 +546,26 @@
return 0;
}
+/* In this function we will try to get default country code from crda.
+ If the gCrdaDefaultCountryCode is configured in ini file,
+ we will try to call user space crda to get the regulatory settings for
+ that country. We will timeout if we can't get it from crda.
+ It's called by hdd_wlan_startup() after wlan_hdd_cfg80211_register.
+*/
+int wlan_hdd_get_crda_regd_entry(struct wiphy *wiphy, hdd_config_t *pCfg)
+{
+ hdd_context_t *pHddCtx = wiphy_priv(wiphy);
+ if (memcmp(pCfg->crdaDefaultCountryCode,
+ CFG_CRDA_DEFAULT_COUNTRY_CODE_DEFAULT , 2) != 0)
+ {
+ init_completion(&pHddCtx->driver_crda_req);
+ regulatory_hint(wiphy, pCfg->crdaDefaultCountryCode);
+ wait_for_completion_interruptible_timeout(&pHddCtx->driver_crda_req,
+ CRDA_WAIT_TIME);
+ }
+ return 0;
+}
+
/* In this function we will do all post VOS start initialization.
In this function we will register for all frame in which supplicant
is interested.