mac80211: add pending ath9k/ath10k patches
[openwrt/staging/mkresin.git] / package / kernel / mac80211 / patches / 303-ath10k-enable-adaptive-CCA.patch
1 From: Maharaja <c_mkenna@qti.qualcomm.com>
2 Date: Wed, 21 Oct 2015 11:49:18 +0300
3 Subject: [PATCH] ath10k: enable adaptive CCA
4
5 European Union has made it mandatory that all devices working in 2.4 GHz
6 has to adhere to the ETSI specification (ETSI EN 300 328 V1.9.1)
7 beginnig this year. The standard basically speaks about interferences
8 in 2.4Ghz band.
9 For example, when 802.11 device detects interference, TX must be stopped
10 as long as interference is present.
11
12 Adaptive CCA is a feature, when enabled the device learns from the
13 environment and configures CCA levels adaptively. This will improve
14 detecting interferences and the device can stop trasmissions till the
15 interference is present eventually leading to good performances in
16 varying interference conditions.
17
18 The patch includes code for enabling adaptive CCA for 10.2.4 firmware on
19 QCA988X.
20
21 Signed-off-by: Maharaja <c_mkenna@qti.qualcomm.com>
22 Signed-off-by: Manikanta Pubbisetty <c_mpubbi@qti.qualcomm.com>
23 Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
24 ---
25
26 --- a/drivers/net/wireless/ath/ath10k/core.c
27 +++ b/drivers/net/wireless/ath/ath10k/core.c
28 @@ -151,6 +151,7 @@ static const char *const ath10k_core_fw_
29 [ATH10K_FW_FEATURE_NO_NWIFI_DECAP_4ADDR_PADDING] = "no-4addr-pad",
30 [ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT] = "skip-clock-init",
31 [ATH10K_FW_FEATURE_RAW_MODE_SUPPORT] = "raw-mode",
32 + [ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA] = "adaptive-cca",
33 };
34
35 static unsigned int ath10k_core_get_fw_feature_str(char *buf,
36 --- a/drivers/net/wireless/ath/ath10k/core.h
37 +++ b/drivers/net/wireless/ath/ath10k/core.h
38 @@ -497,6 +497,9 @@ enum ath10k_fw_features {
39 */
40 ATH10K_FW_FEATURE_RAW_MODE_SUPPORT = 10,
41
42 + /* Firmware Supports Adaptive CCA*/
43 + ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA = 11,
44 +
45 /* keep last */
46 ATH10K_FW_FEATURE_COUNT,
47 };
48 --- a/drivers/net/wireless/ath/ath10k/mac.c
49 +++ b/drivers/net/wireless/ath/ath10k/mac.c
50 @@ -3905,6 +3905,18 @@ static int ath10k_start(struct ieee80211
51 goto err_core_stop;
52 }
53
54 + if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
55 + ar->fw_features)) {
56 + ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
57 + WMI_CCA_DETECT_LEVEL_AUTO,
58 + WMI_CCA_DETECT_MARGIN_AUTO);
59 + if (ret) {
60 + ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
61 + ret);
62 + goto err_core_stop;
63 + }
64 + }
65 +
66 ret = ath10k_wmi_pdev_set_param(ar,
67 ar->wmi.pdev_param->ani_enable, 1);
68 if (ret) {
69 --- a/drivers/net/wireless/ath/ath10k/wmi-ops.h
70 +++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h
71 @@ -182,6 +182,10 @@ struct wmi_ops {
72 void (*fw_stats_fill)(struct ath10k *ar,
73 struct ath10k_fw_stats *fw_stats,
74 char *buf);
75 + struct sk_buff *(*gen_pdev_enable_adaptive_cca)(struct ath10k *ar,
76 + u8 enable,
77 + u32 detect_level,
78 + u32 detect_margin);
79 };
80
81 int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
82 @@ -1302,4 +1306,25 @@ ath10k_wmi_fw_stats_fill(struct ath10k *
83 ar->wmi.ops->fw_stats_fill(ar, fw_stats, buf);
84 return 0;
85 }
86 +
87 +static inline int
88 +ath10k_wmi_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
89 + u32 detect_level, u32 detect_margin)
90 +{
91 + struct sk_buff *skb;
92 +
93 + if (!ar->wmi.ops->gen_pdev_enable_adaptive_cca)
94 + return -EOPNOTSUPP;
95 +
96 + skb = ar->wmi.ops->gen_pdev_enable_adaptive_cca(ar, enable,
97 + detect_level,
98 + detect_margin);
99 +
100 + if (IS_ERR(skb))
101 + return PTR_ERR(skb);
102 +
103 + return ath10k_wmi_cmd_send(ar, skb,
104 + ar->wmi.cmd->pdev_enable_adaptive_cca_cmdid);
105 +}
106 +
107 #endif
108 --- a/drivers/net/wireless/ath/ath10k/wmi.c
109 +++ b/drivers/net/wireless/ath/ath10k/wmi.c
110 @@ -148,6 +148,7 @@ static struct wmi_cmd_map wmi_cmd_map =
111 .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
112 .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
113 .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
114 + .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
115 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
116 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
117 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
118 @@ -313,6 +314,7 @@ static struct wmi_cmd_map wmi_10x_cmd_ma
119 .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
120 .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
121 .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
122 + .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
123 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
124 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
125 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
126 @@ -477,6 +479,7 @@ static struct wmi_cmd_map wmi_10_2_4_cmd
127 .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
128 .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
129 .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID,
130 + .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS,
131 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
132 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
133 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
134 @@ -1407,6 +1410,7 @@ static struct wmi_cmd_map wmi_10_2_cmd_m
135 .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID,
136 .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID,
137 .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED,
138 + .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED,
139 .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED,
140 .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED,
141 .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED,
142 @@ -6996,6 +7000,28 @@ unlock:
143 buf[len] = 0;
144 }
145
146 +static struct sk_buff *
147 +ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
148 + u32 detect_level, u32 detect_margin)
149 +{
150 + struct wmi_pdev_set_adaptive_cca_params *cmd;
151 + struct sk_buff *skb;
152 +
153 + skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
154 + if (!skb)
155 + return ERR_PTR(-ENOMEM);
156 +
157 + cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data;
158 + cmd->enable = __cpu_to_le32(enable);
159 + cmd->cca_detect_level = __cpu_to_le32(detect_level);
160 + cmd->cca_detect_margin = __cpu_to_le32(detect_margin);
161 +
162 + ath10k_dbg(ar, ATH10K_DBG_WMI,
163 + "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n",
164 + enable, detect_level, detect_margin);
165 + return skb;
166 +}
167 +
168 static const struct wmi_ops wmi_ops = {
169 .rx = ath10k_wmi_op_rx,
170 .map_svc = wmi_main_svc_map,
171 @@ -7059,6 +7085,7 @@ static const struct wmi_ops wmi_ops = {
172 /* .gen_prb_tmpl not implemented */
173 /* .gen_p2p_go_bcn_ie not implemented */
174 /* .gen_adaptive_qcs not implemented */
175 + /* .gen_pdev_enable_adaptive_cca not implemented */
176 };
177
178 static const struct wmi_ops wmi_10_1_ops = {
179 @@ -7125,6 +7152,7 @@ static const struct wmi_ops wmi_10_1_ops
180 /* .gen_prb_tmpl not implemented */
181 /* .gen_p2p_go_bcn_ie not implemented */
182 /* .gen_adaptive_qcs not implemented */
183 + /* .gen_pdev_enable_adaptive_cca not implemented */
184 };
185
186 static const struct wmi_ops wmi_10_2_ops = {
187 @@ -7188,6 +7216,7 @@ static const struct wmi_ops wmi_10_2_ops
188 .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp,
189 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
190 .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
191 + /* .gen_pdev_enable_adaptive_cca not implemented */
192 };
193
194 static const struct wmi_ops wmi_10_2_4_ops = {
195 @@ -7251,6 +7280,8 @@ static const struct wmi_ops wmi_10_2_4_o
196 .gen_delba_send = ath10k_wmi_op_gen_delba_send,
197 .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
198 .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
199 + .gen_pdev_enable_adaptive_cca =
200 + ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
201 /* .gen_bcn_tmpl not implemented */
202 /* .gen_prb_tmpl not implemented */
203 /* .gen_p2p_go_bcn_ie not implemented */
204 --- a/drivers/net/wireless/ath/ath10k/wmi.h
205 +++ b/drivers/net/wireless/ath/ath10k/wmi.h
206 @@ -772,6 +772,7 @@ struct wmi_cmd_map {
207 u32 mu_cal_start_cmdid;
208 u32 set_cca_params_cmdid;
209 u32 pdev_bss_chan_info_request_cmdid;
210 + u32 pdev_enable_adaptive_cca_cmdid;
211 };
212
213 /*
214 @@ -1381,6 +1382,9 @@ enum wmi_10_2_cmd_id {
215 WMI_10_2_VDEV_ATF_REQUEST_CMDID,
216 WMI_10_2_PEER_ATF_REQUEST_CMDID,
217 WMI_10_2_PDEV_GET_TEMPERATURE_CMDID,
218 + WMI_10_2_MU_CAL_START_CMDID,
219 + WMI_10_2_SET_LTEU_CONFIG_CMDID,
220 + WMI_10_2_SET_CCA_PARAMS,
221 WMI_10_2_PDEV_UTF_CMDID = WMI_10_2_END_CMDID - 1,
222 };
223
224 @@ -6094,6 +6098,15 @@ enum wmi_txbf_conf {
225 WMI_TXBF_CONF_AFTER_ASSOC,
226 };
227
228 +#define WMI_CCA_DETECT_LEVEL_AUTO 0
229 +#define WMI_CCA_DETECT_MARGIN_AUTO 0
230 +
231 +struct wmi_pdev_set_adaptive_cca_params {
232 + __le32 enable;
233 + __le32 cca_detect_level;
234 + __le32 cca_detect_margin;
235 +} __packed;
236 +
237 struct ath10k;
238 struct ath10k_vif;
239 struct ath10k_fw_stats_pdev;