summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Zhang <paulz@codeaurora.org>2017-04-17 14:58:13 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-05-17 22:49:16 -0700
commitf83d680bcd53d778feb8262dc92b938c0621d1c3 (patch)
treea4d3b9aee6b590c19e2c8519919e97708db319e4
parent0329b31dd4850be5870f0633e155674bc4e167ff (diff)
qcacld-2.0: save the cc source to platform driver
There is a design limitation of our solution. Driver sends regulatory_hint_user for both user-space and 11d country to kernel. So when wiphy re-registration happens, kernel tells the source as USER even for 11d. And per driver logic the 11d needs to be disabled if INI gCountryCodePriority is set. To mitigate this issue, storing the country source in the platform driver. CRs-Fixed: 2034305 Change-Id: Ib245d1db47955a8f70ec7444fa2996390ee3a3fc
-rw-r--r--CORE/SERVICES/WMA/regdomain.h5
-rw-r--r--CORE/VOSS/inc/vos_cnss.h25
-rw-r--r--CORE/VOSS/src/vos_nvitem.c13
3 files changed, 39 insertions, 4 deletions
diff --git a/CORE/SERVICES/WMA/regdomain.h b/CORE/SERVICES/WMA/regdomain.h
index 6eff5a08715c..1400886cc67e 100644
--- a/CORE/SERVICES/WMA/regdomain.h
+++ b/CORE/SERVICES/WMA/regdomain.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2014-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -310,7 +310,8 @@ typedef enum
{
COUNTRY_CODE_SET_BY_CORE,
COUNTRY_CODE_SET_BY_DRIVER,
- COUNTRY_CODE_SET_BY_USER
+ COUNTRY_CODE_SET_BY_USER,
+ COUNTRY_CODE_SET_BY_11D
} COUNTRY_CODE_SOURCE;
struct regulatory {
diff --git a/CORE/VOSS/inc/vos_cnss.h b/CORE/VOSS/inc/vos_cnss.h
index 0ef997411687..fa2d7f8d508e 100644
--- a/CORE/VOSS/inc/vos_cnss.h
+++ b/CORE/VOSS/inc/vos_cnss.h
@@ -46,6 +46,12 @@ enum cnss_bus_width_type {
CNSS_BUS_WIDTH_HIGH
};
+enum cnss_cc_src {
+ CNSS_SOURCE_CORE,
+ CNSS_SOURCE_11D,
+ CNSS_SOURCE_USER
+};
+
static inline void vos_wlan_pci_link_down(void){ return; }
static inline int vos_pcie_shadow_control(struct pci_dev *dev, bool enable)
{
@@ -233,6 +239,15 @@ static inline int vos_unregister_oob_irq_handler(void *pm_oob)
static inline void vos_dump_stack (struct task_struct *task)
{
}
+
+static inline void vos_set_cc_source(enum cnss_cc_src cc_source)
+{
+}
+
+static inline enum cnss_cc_src vos_get_cc_source(void)
+{
+ return CNSS_SOURCE_USER;
+}
#else /* END WLAN_OPEN_SOURCE and !CONFIG_CNSS */
static inline void vos_dump_stack (struct task_struct *task)
{
@@ -327,6 +342,16 @@ static inline void vos_get_boottime_ts(struct timespec *ts)
cnss_get_boottime(ts);
}
+static inline void vos_set_cc_source(enum cnss_cc_src cc_source)
+{
+ cnss_set_cc_source(cc_source);
+}
+
+static inline enum cnss_cc_src vos_get_cc_source(void)
+{
+ return cnss_get_cc_source();
+}
+
#ifdef HIF_SDIO
static inline void vos_request_pm_qos_type(int latency_type, u32 qos_val)
{
diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c
index 59b3cabfe1ce..ac88ebd64c60 100644
--- a/CORE/VOSS/src/vos_nvitem.c
+++ b/CORE/VOSS/src/vos_nvitem.c
@@ -52,6 +52,7 @@
#include <net/cfg80211.h>
#include "regdomain.h"
#include "regdomain_common.h"
+#include "vos_cnss.h"
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)) && !defined(WITH_BACKPORTS)
#define IEEE80211_CHAN_NO_80MHZ 1<<7
@@ -1611,6 +1612,11 @@ VOS_STATUS vos_nv_getRegDomainFromCountryCode( v_REGDOMAIN_t *pRegDomain,
}
} else if (COUNTRY_IE == source || COUNTRY_USER == source) {
+ if (COUNTRY_USER == source)
+ vos_set_cc_source(CNSS_SOURCE_USER);
+ else
+ vos_set_cc_source(CNSS_SOURCE_11D);
+
INIT_COMPLETION(pHddCtx->reg_init);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0)) || defined(WITH_BACKPORTS)
regulatory_hint_user(country_code, NL80211_USER_REG_HINT_USER);
@@ -1632,7 +1638,6 @@ VOS_STATUS vos_nv_getRegDomainFromCountryCode( v_REGDOMAIN_t *pRegDomain,
country_code[0], country_code[1]);
*pRegDomain = temp_reg_domain;
}
-
else
{
VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_WARN,
@@ -2317,6 +2322,7 @@ int __wlan_hdd_linux_reg_notifier(struct wiphy *wiphy,
}
if (NL80211_REGDOM_SET_BY_CORE == request->initiator) {
pHddCtx->reg.cc_src = COUNTRY_CODE_SET_BY_CORE;
+ vos_set_cc_source(CNSS_SOURCE_CORE);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) || defined(WITH_BACKPORTS)
if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
#else
@@ -2326,7 +2332,10 @@ int __wlan_hdd_linux_reg_notifier(struct wiphy *wiphy,
} else if (NL80211_REGDOM_SET_BY_DRIVER == request->initiator) {
pHddCtx->reg.cc_src = COUNTRY_CODE_SET_BY_DRIVER;
} else {
- pHddCtx->reg.cc_src = COUNTRY_CODE_SET_BY_USER;
+ if (vos_get_cc_source() == CNSS_SOURCE_11D)
+ pHddCtx->reg.cc_src = COUNTRY_CODE_SET_BY_11D;
+ else
+ pHddCtx->reg.cc_src = COUNTRY_CODE_SET_BY_USER;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)) && !defined(WITH_BACKPORTS)
if ((request->alpha2[0] == '0') &&
(request->alpha2[1] == '0') &&