summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Zhang <paulz@codeaurora.org>2017-09-22 23:20:41 +0800
committersnandini <snandini@codeaurora.org>2017-09-26 21:37:39 -0700
commitbe203451db22ebe0aacc6a9c1855d99e6205eac7 (patch)
tree59210e79cc49ec1ae40f6264ad920a4540d04147
parent59d54e4d8cbe97214deba44497d8b2a443fe788f (diff)
downloadqcacld-be203451db22ebe0aacc6a9c1855d99e6205eac7.tar.gz
qcacld-3.0: save the cc source to platform driver
qcacld-2.0 to qcacld-3.0 propagation 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. Change-Id: I912a071991432305e69a3e572df4e02cedefee93 CRs-Fixed: 2114969
-rw-r--r--core/cds/src/cds_reg_service.c17
-rw-r--r--core/hdd/src/wlan_hdd_regulatory.c9
-rw-r--r--core/pld/inc/pld_common.h14
-rw-r--r--core/pld/src/pld_common.c72
4 files changed, 110 insertions, 2 deletions
diff --git a/core/cds/src/cds_reg_service.c b/core/cds/src/cds_reg_service.c
index 655174e773..41357770a3 100644
--- a/core/cds/src/cds_reg_service.c
+++ b/core/cds/src/cds_reg_service.c
@@ -32,6 +32,7 @@
============================================================================*/
#include <net/cfg80211.h>
+#include "pld_common.h"
#include "qdf_types.h"
#include "qdf_trace.h"
#include "cds_api.h"
@@ -628,6 +629,12 @@ QDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
const uint8_t *country_alpha2,
enum country_src source)
{
+ hdd_context_t *hdd_ctx;
+
+ hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+ if (wlan_hdd_validate_context(hdd_ctx))
+ return false;
+
if (NULL == reg_domain_ptr) {
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
"Invalid reg domain pointer");
@@ -651,9 +658,17 @@ QDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
return QDF_STATUS_SUCCESS;
}
- if (SOURCE_11D == source || SOURCE_USERSPACE == source)
+ if (SOURCE_11D == source || SOURCE_USERSPACE == source) {
+ if (SOURCE_USERSPACE == source)
+ pld_set_cc_source(hdd_ctx->parent_dev,
+ PLD_SOURCE_USER);
+ else
+ pld_set_cc_source(hdd_ctx->parent_dev,
+ PLD_SOURCE_11D);
+
regulatory_hint_user(country_alpha2,
NL80211_USER_REG_HINT_USER);
+ }
return QDF_STATUS_SUCCESS;
}
diff --git a/core/hdd/src/wlan_hdd_regulatory.c b/core/hdd/src/wlan_hdd_regulatory.c
index bfd8be5d6c..f61f52b38b 100644
--- a/core/hdd/src/wlan_hdd_regulatory.c
+++ b/core/hdd/src/wlan_hdd_regulatory.c
@@ -690,6 +690,8 @@ void hdd_reg_notifier(struct wiphy *wiphy,
if (NL80211_REGDOM_SET_BY_CORE == request->initiator) {
hdd_ctx->reg.cc_src = SOURCE_CORE;
+ pld_set_cc_source(hdd_ctx->parent_dev,
+ PLD_SOURCE_CORE);
sme_set_cc_src(hdd_ctx->hHal, SOURCE_CORE);
if (is_wiphy_custom_regulatory(wiphy))
reset = true;
@@ -698,7 +700,12 @@ void hdd_reg_notifier(struct wiphy *wiphy,
sme_set_cc_src(hdd_ctx->hHal, SOURCE_DRIVER);
} else {
sme_set_cc_src(hdd_ctx->hHal, SOURCE_USERSPACE);
- hdd_ctx->reg.cc_src = SOURCE_USERSPACE;
+
+ if (pld_get_cc_source(hdd_ctx->parent_dev)
+ == PLD_SOURCE_11D)
+ hdd_ctx->reg.cc_src = SOURCE_11D;
+ else
+ hdd_ctx->reg.cc_src = SOURCE_USERSPACE;
hdd_restore_custom_reg_settings(wiphy,
request->alpha2,
&reset);
diff --git a/core/pld/inc/pld_common.h b/core/pld/inc/pld_common.h
index c013d81c99..e682835ba0 100644
--- a/core/pld/inc/pld_common.h
+++ b/core/pld/inc/pld_common.h
@@ -117,6 +117,18 @@ enum pld_platform_cap_flag {
};
/**
+ * enum pld_cc_src - platform country code source
+ * @PLD_SOURCE_CORE: coutry code from core
+ * @PLD_SOURCE_11D: counry code from 11d
+ * @PLD_SOURCE_USER: country code from user
+ */
+enum pld_cc_src {
+ PLD_SOURCE_CORE,
+ PLD_SOURCE_11D,
+ PLD_SOURCE_USER
+};
+
+/**
* struct pld_platform_cap - platform capabilities
* @cap_flag: capabilities flag
*
@@ -533,6 +545,8 @@ unsigned int pld_socinfo_get_serial_number(struct device *dev);
int pld_is_qmi_disable(struct device *dev);
int pld_force_assert_target(struct device *dev);
bool pld_is_fw_dump_skipped(struct device *dev);
+void pld_set_cc_source(struct device *dev, enum pld_cc_src cc_source);
+enum pld_cc_src pld_get_cc_source(struct device *dev);
#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) && defined(FEATURE_SKB_PRE_ALLOC)
diff --git a/core/pld/src/pld_common.c b/core/pld/src/pld_common.c
index 768555c58b..ff6ece3eff 100644
--- a/core/pld/src/pld_common.c
+++ b/core/pld/src/pld_common.c
@@ -1467,3 +1467,75 @@ bool pld_is_fw_dump_skipped(struct device *dev)
}
return ret;
}
+
+#ifdef CONFIG_CNSS_UTILS
+/**
+ * pld_set_cc_source() - Set the country code source
+ * @dev: device
+ * @cc_source: country code
+ *
+ * return: void
+ */
+void pld_set_cc_source(struct device *dev,
+ enum pld_cc_src cc_source)
+{
+ enum cnss_utils_cc_src cc;
+
+ switch (cc_source) {
+ case PLD_SOURCE_CORE:
+ cc = CNSS_UTILS_SOURCE_CORE;
+ break;
+ case PLD_SOURCE_11D:
+ cc = CNSS_UTILS_SOURCE_11D;
+ break;
+ case PLD_SOURCE_USER:
+ cc = CNSS_UTILS_SOURCE_USER;
+ break;
+ default:
+ cc = CNSS_UTILS_SOURCE_CORE;
+ break;
+ }
+
+ cnss_utils_set_cc_source(dev, cc);
+}
+/**
+ * pld_get_cc_source() - Get the country code source
+ * @dev: device
+ *
+ * return: cc_source
+ */
+enum pld_cc_src pld_get_cc_source(struct device *dev)
+{
+ enum cnss_utils_cc_src cc;
+ enum pld_cc_src cc_source;
+
+ cc = cnss_utils_get_cc_source(dev);
+ switch (cc) {
+ case CNSS_UTILS_SOURCE_CORE:
+ cc_source = PLD_SOURCE_CORE;
+ break;
+ case CNSS_UTILS_SOURCE_11D:
+ cc_source = PLD_SOURCE_11D;
+ break;
+ case CNSS_UTILS_SOURCE_USER:
+ cc_source = PLD_SOURCE_USER;
+ break;
+ default:
+ cc_source = PLD_SOURCE_CORE;
+ break;
+ }
+
+ return cc_source;
+}
+#else
+void pld_set_cc_source(struct device *dev,
+ enum pld_cc_src cc_source)
+{
+ return;
+}
+
+enum pld_cc_src pld_get_cc_source(struct device *dev)
+{
+ return PLD_SOURCE_CORE;
+}
+#endif