aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Puzyniak <marek.puzyniak@tieto.com>2014-03-21 11:46:57 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2014-03-24 04:25:46 -0400
commit821af6ae26bcd024d73a1aa7f47e45c0a3814dc1 (patch)
tree2459b8a8a96426d639a1316ae214fb8be0890e42
parent8c65699274a695df941407ccb91c633819039193 (diff)
ath10k: update regulatory domain settings for 10.x firmware
Regulatory domain settings for firmware 10.x has more options than main firmware, so handle regulatory domain setup separately for both supported firmwares. Fill in additional dfs domain parameter according to current regulatory. This patch does not solve any known bug. Not handled parameter for firmware 10.x was found during code review. Signed-off-by: Marek Puzyniak <marek.puzyniak@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c28
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c45
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.h28
3 files changed, 97 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 9e24ae972ec9..5d3751d75419 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1726,10 +1726,28 @@ static int ath10k_update_channel_list(struct ath10k *ar)
1726 return ret; 1726 return ret;
1727} 1727}
1728 1728
1729static enum wmi_dfs_region
1730ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
1731{
1732 switch (dfs_region) {
1733 case NL80211_DFS_UNSET:
1734 return WMI_UNINIT_DFS_DOMAIN;
1735 case NL80211_DFS_FCC:
1736 return WMI_FCC_DFS_DOMAIN;
1737 case NL80211_DFS_ETSI:
1738 return WMI_ETSI_DFS_DOMAIN;
1739 case NL80211_DFS_JP:
1740 return WMI_MKK4_DFS_DOMAIN;
1741 }
1742 return WMI_UNINIT_DFS_DOMAIN;
1743}
1744
1729static void ath10k_regd_update(struct ath10k *ar) 1745static void ath10k_regd_update(struct ath10k *ar)
1730{ 1746{
1731 struct reg_dmn_pair_mapping *regpair; 1747 struct reg_dmn_pair_mapping *regpair;
1732 int ret; 1748 int ret;
1749 enum wmi_dfs_region wmi_dfs_reg;
1750 enum nl80211_dfs_regions nl_dfs_reg;
1733 1751
1734 lockdep_assert_held(&ar->conf_mutex); 1752 lockdep_assert_held(&ar->conf_mutex);
1735 1753
@@ -1739,6 +1757,13 @@ static void ath10k_regd_update(struct ath10k *ar)
1739 1757
1740 regpair = ar->ath_common.regulatory.regpair; 1758 regpair = ar->ath_common.regulatory.regpair;
1741 1759
1760 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
1761 nl_dfs_reg = ar->dfs_detector->region;
1762 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
1763 } else {
1764 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
1765 }
1766
1742 /* Target allows setting up per-band regdomain but ath_common provides 1767 /* Target allows setting up per-band regdomain but ath_common provides
1743 * a combined one only */ 1768 * a combined one only */
1744 ret = ath10k_wmi_pdev_set_regdomain(ar, 1769 ret = ath10k_wmi_pdev_set_regdomain(ar,
@@ -1746,7 +1771,8 @@ static void ath10k_regd_update(struct ath10k *ar)
1746 regpair->reg_domain, /* 2ghz */ 1771 regpair->reg_domain, /* 2ghz */
1747 regpair->reg_domain, /* 5ghz */ 1772 regpair->reg_domain, /* 5ghz */
1748 regpair->reg_2ghz_ctl, 1773 regpair->reg_2ghz_ctl,
1749 regpair->reg_5ghz_ctl); 1774 regpair->reg_5ghz_ctl,
1775 wmi_dfs_reg);
1750 if (ret) 1776 if (ret)
1751 ath10k_warn("could not set pdev regdomain (%d)\n", ret); 1777 ath10k_warn("could not set pdev regdomain (%d)\n", ret);
1752} 1778}
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index d61bdf6db458..d4b48ef0ec2e 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -2393,8 +2393,9 @@ int ath10k_wmi_connect_htc_service(struct ath10k *ar)
2393 return 0; 2393 return 0;
2394} 2394}
2395 2395
2396int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, 2396static int ath10k_wmi_main_pdev_set_regdomain(struct ath10k *ar, u16 rd,
2397 u16 rd5g, u16 ctl2g, u16 ctl5g) 2397 u16 rd2g, u16 rd5g, u16 ctl2g,
2398 u16 ctl5g)
2398{ 2399{
2399 struct wmi_pdev_set_regdomain_cmd *cmd; 2400 struct wmi_pdev_set_regdomain_cmd *cmd;
2400 struct sk_buff *skb; 2401 struct sk_buff *skb;
@@ -2418,6 +2419,46 @@ int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g,
2418 ar->wmi.cmd->pdev_set_regdomain_cmdid); 2419 ar->wmi.cmd->pdev_set_regdomain_cmdid);
2419} 2420}
2420 2421
2422static int ath10k_wmi_10x_pdev_set_regdomain(struct ath10k *ar, u16 rd,
2423 u16 rd2g, u16 rd5g,
2424 u16 ctl2g, u16 ctl5g,
2425 enum wmi_dfs_region dfs_reg)
2426{
2427 struct wmi_pdev_set_regdomain_cmd_10x *cmd;
2428 struct sk_buff *skb;
2429
2430 skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
2431 if (!skb)
2432 return -ENOMEM;
2433
2434 cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data;
2435 cmd->reg_domain = __cpu_to_le32(rd);
2436 cmd->reg_domain_2G = __cpu_to_le32(rd2g);
2437 cmd->reg_domain_5G = __cpu_to_le32(rd5g);
2438 cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g);
2439 cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g);
2440 cmd->dfs_domain = __cpu_to_le32(dfs_reg);
2441
2442 ath10k_dbg(ATH10K_DBG_WMI,
2443 "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n",
2444 rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg);
2445
2446 return ath10k_wmi_cmd_send(ar, skb,
2447 ar->wmi.cmd->pdev_set_regdomain_cmdid);
2448}
2449
2450int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g,
2451 u16 rd5g, u16 ctl2g, u16 ctl5g,
2452 enum wmi_dfs_region dfs_reg)
2453{
2454 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
2455 return ath10k_wmi_10x_pdev_set_regdomain(ar, rd, rd2g, rd5g,
2456 ctl2g, ctl5g, dfs_reg);
2457 else
2458 return ath10k_wmi_main_pdev_set_regdomain(ar, rd, rd2g, rd5g,
2459 ctl2g, ctl5g);
2460}
2461
2421int ath10k_wmi_pdev_set_channel(struct ath10k *ar, 2462int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
2422 const struct wmi_channel_arg *arg) 2463 const struct wmi_channel_arg *arg)
2423{ 2464{
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index e78a7adb66a4..e5c12e639865 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -2185,6 +2185,31 @@ struct wmi_pdev_set_regdomain_cmd {
2185 __le32 conformance_test_limit_5G; 2185 __le32 conformance_test_limit_5G;
2186} __packed; 2186} __packed;
2187 2187
2188enum wmi_dfs_region {
2189 /* Uninitialized dfs domain */
2190 WMI_UNINIT_DFS_DOMAIN = 0,
2191
2192 /* FCC3 dfs domain */
2193 WMI_FCC_DFS_DOMAIN = 1,
2194
2195 /* ETSI dfs domain */
2196 WMI_ETSI_DFS_DOMAIN = 2,
2197
2198 /*Japan dfs domain */
2199 WMI_MKK4_DFS_DOMAIN = 3,
2200};
2201
2202struct wmi_pdev_set_regdomain_cmd_10x {
2203 __le32 reg_domain;
2204 __le32 reg_domain_2G;
2205 __le32 reg_domain_5G;
2206 __le32 conformance_test_limit_2G;
2207 __le32 conformance_test_limit_5G;
2208
2209 /* dfs domain from wmi_dfs_region */
2210 __le32 dfs_domain;
2211} __packed;
2212
2188/* Command to set/unset chip in quiet mode */ 2213/* Command to set/unset chip in quiet mode */
2189struct wmi_pdev_set_quiet_cmd { 2214struct wmi_pdev_set_quiet_cmd {
2190 /* period in TUs */ 2215 /* period in TUs */
@@ -4215,7 +4240,8 @@ int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
4215int ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt); 4240int ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt);
4216int ath10k_wmi_pdev_resume_target(struct ath10k *ar); 4241int ath10k_wmi_pdev_resume_target(struct ath10k *ar);
4217int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, 4242int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g,
4218 u16 rd5g, u16 ctl2g, u16 ctl5g); 4243 u16 rd5g, u16 ctl2g, u16 ctl5g,
4244 enum wmi_dfs_region dfs_reg);
4219int ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value); 4245int ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value);
4220int ath10k_wmi_cmd_init(struct ath10k *ar); 4246int ath10k_wmi_cmd_init(struct ath10k *ar);
4221int ath10k_wmi_start_scan(struct ath10k *ar, const struct wmi_start_scan_arg *); 4247int ath10k_wmi_start_scan(struct ath10k *ar, const struct wmi_start_scan_arg *);