1 // SPDX-License-Identifier: ISC
2 /*
3 * Copyright (c) 2005-2011 Atheros Communications Inc.
4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
5 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
6 */
7
8 #include "mac.h"
9
10 #include <net/cfg80211.h>
11 #include <net/mac80211.h>
12 #include <linux/etherdevice.h>
13 #include <linux/acpi.h>
14 #include <linux/of.h>
15 #include <linux/bitfield.h>
16
17 #include "hif.h"
18 #include "core.h"
19 #include "debug.h"
20 #include "wmi.h"
21 #include "htt.h"
22 #include "txrx.h"
23 #include "testmode.h"
24 #include "wmi-tlv.h"
25 #include "wmi-ops.h"
26 #include "wow.h"
27
28 /*********/
29 /* Rates */
30 /*********/
31
32 static struct ieee80211_rate ath10k_rates[] = {
33 { .bitrate = 10,
34 .hw_value = ATH10K_HW_RATE_CCK_LP_1M },
35 { .bitrate = 20,
36 .hw_value = ATH10K_HW_RATE_CCK_LP_2M,
37 .hw_value_short = ATH10K_HW_RATE_CCK_SP_2M,
38 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
39 { .bitrate = 55,
40 .hw_value = ATH10K_HW_RATE_CCK_LP_5_5M,
41 .hw_value_short = ATH10K_HW_RATE_CCK_SP_5_5M,
42 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
43 { .bitrate = 110,
44 .hw_value = ATH10K_HW_RATE_CCK_LP_11M,
45 .hw_value_short = ATH10K_HW_RATE_CCK_SP_11M,
46 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
47
48 { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
49 { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
50 { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
51 { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
52 { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
53 { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
54 { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
55 { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
56 };
57
58 static struct ieee80211_rate ath10k_rates_rev2[] = {
59 { .bitrate = 10,
60 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_1M },
61 { .bitrate = 20,
62 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_2M,
63 .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_2M,
64 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
65 { .bitrate = 55,
66 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_5_5M,
67 .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_5_5M,
68 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
69 { .bitrate = 110,
70 .hw_value = ATH10K_HW_RATE_REV2_CCK_LP_11M,
71 .hw_value_short = ATH10K_HW_RATE_REV2_CCK_SP_11M,
72 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
73
74 { .bitrate = 60, .hw_value = ATH10K_HW_RATE_OFDM_6M },
75 { .bitrate = 90, .hw_value = ATH10K_HW_RATE_OFDM_9M },
76 { .bitrate = 120, .hw_value = ATH10K_HW_RATE_OFDM_12M },
77 { .bitrate = 180, .hw_value = ATH10K_HW_RATE_OFDM_18M },
78 { .bitrate = 240, .hw_value = ATH10K_HW_RATE_OFDM_24M },
79 { .bitrate = 360, .hw_value = ATH10K_HW_RATE_OFDM_36M },
80 { .bitrate = 480, .hw_value = ATH10K_HW_RATE_OFDM_48M },
81 { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
82 };
83
84 static const struct cfg80211_sar_freq_ranges ath10k_sar_freq_ranges[] = {
85 {.start_freq = 2402, .end_freq = 2494 },
86 {.start_freq = 5170, .end_freq = 5875 },
87 };
88
89 static const struct cfg80211_sar_capa ath10k_sar_capa = {
90 .type = NL80211_SAR_TYPE_POWER,
91 .num_freq_ranges = (ARRAY_SIZE(ath10k_sar_freq_ranges)),
92 .freq_ranges = &ath10k_sar_freq_ranges[0],
93 };
94
95 #define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
96
97 #define ath10k_a_rates (ath10k_rates + ATH10K_MAC_FIRST_OFDM_RATE_IDX)
98 #define ath10k_a_rates_size (ARRAY_SIZE(ath10k_rates) - \
99 ATH10K_MAC_FIRST_OFDM_RATE_IDX)
100 #define ath10k_g_rates (ath10k_rates + 0)
101 #define ath10k_g_rates_size (ARRAY_SIZE(ath10k_rates))
102
103 #define ath10k_g_rates_rev2 (ath10k_rates_rev2 + 0)
104 #define ath10k_g_rates_rev2_size (ARRAY_SIZE(ath10k_rates_rev2))
105
106 #define ath10k_wmi_legacy_rates ath10k_rates
107
ath10k_mac_bitrate_is_cck(int bitrate)108 static bool ath10k_mac_bitrate_is_cck(int bitrate)
109 {
110 switch (bitrate) {
111 case 10:
112 case 20:
113 case 55:
114 case 110:
115 return true;
116 }
117
118 return false;
119 }
120
ath10k_mac_bitrate_to_rate(int bitrate)121 static u8 ath10k_mac_bitrate_to_rate(int bitrate)
122 {
123 return DIV_ROUND_UP(bitrate, 5) |
124 (ath10k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
125 }
126
ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band * sband,u8 hw_rate,bool cck)127 u8 ath10k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
128 u8 hw_rate, bool cck)
129 {
130 const struct ieee80211_rate *rate;
131 int i;
132
133 for (i = 0; i < sband->n_bitrates; i++) {
134 rate = &sband->bitrates[i];
135
136 if (ath10k_mac_bitrate_is_cck(rate->bitrate) != cck)
137 continue;
138
139 if (rate->hw_value == hw_rate)
140 return i;
141 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
142 rate->hw_value_short == hw_rate)
143 return i;
144 }
145
146 return 0;
147 }
148
ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band * sband,u32 bitrate)149 u8 ath10k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
150 u32 bitrate)
151 {
152 int i;
153
154 for (i = 0; i < sband->n_bitrates; i++)
155 if (sband->bitrates[i].bitrate == bitrate)
156 return i;
157
158 return 0;
159 }
160
ath10k_mac_get_rate_hw_value(int bitrate)161 static int ath10k_mac_get_rate_hw_value(int bitrate)
162 {
163 int i;
164 u8 hw_value_prefix = 0;
165
166 if (ath10k_mac_bitrate_is_cck(bitrate))
167 hw_value_prefix = WMI_RATE_PREAMBLE_CCK << 6;
168
169 for (i = 0; i < ARRAY_SIZE(ath10k_rates); i++) {
170 if (ath10k_rates[i].bitrate == bitrate)
171 return hw_value_prefix | ath10k_rates[i].hw_value;
172 }
173
174 return -EINVAL;
175 }
176
ath10k_mac_get_max_vht_mcs_map(u16 mcs_map,int nss)177 static int ath10k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
178 {
179 switch ((mcs_map >> (2 * nss)) & 0x3) {
180 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
181 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
182 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
183 }
184 return 0;
185 }
186
187 static u32
ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])188 ath10k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
189 {
190 int nss;
191
192 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
193 if (ht_mcs_mask[nss])
194 return nss + 1;
195
196 return 1;
197 }
198
199 static u32
ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])200 ath10k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
201 {
202 int nss;
203
204 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
205 if (vht_mcs_mask[nss])
206 return nss + 1;
207
208 return 1;
209 }
210
ath10k_mac_ext_resource_config(struct ath10k * ar,u32 val)211 int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val)
212 {
213 enum wmi_host_platform_type platform_type;
214 int ret;
215
216 if (test_bit(WMI_SERVICE_TX_MODE_DYNAMIC, ar->wmi.svc_map))
217 platform_type = WMI_HOST_PLATFORM_LOW_PERF;
218 else
219 platform_type = WMI_HOST_PLATFORM_HIGH_PERF;
220
221 ret = ath10k_wmi_ext_resource_config(ar, platform_type, val);
222
223 if (ret && ret != -EOPNOTSUPP) {
224 ath10k_warn(ar, "failed to configure ext resource: %d\n", ret);
225 return ret;
226 }
227
228 return 0;
229 }
230
231 /**********/
232 /* Crypto */
233 /**********/
234
ath10k_send_key(struct ath10k_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)235 static int ath10k_send_key(struct ath10k_vif *arvif,
236 struct ieee80211_key_conf *key,
237 enum set_key_cmd cmd,
238 const u8 *macaddr, u32 flags)
239 {
240 struct ath10k *ar = arvif->ar;
241 struct wmi_vdev_install_key_arg arg = {
242 .vdev_id = arvif->vdev_id,
243 .key_idx = key->keyidx,
244 .key_len = key->keylen,
245 .key_data = key->key,
246 .key_flags = flags,
247 .macaddr = macaddr,
248 };
249
250 lockdep_assert_held(&arvif->ar->conf_mutex);
251
252 switch (key->cipher) {
253 case WLAN_CIPHER_SUITE_CCMP:
254 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
255 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
256 break;
257 case WLAN_CIPHER_SUITE_TKIP:
258 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP];
259 arg.key_txmic_len = 8;
260 arg.key_rxmic_len = 8;
261 break;
262 case WLAN_CIPHER_SUITE_WEP40:
263 case WLAN_CIPHER_SUITE_WEP104:
264 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP];
265 break;
266 case WLAN_CIPHER_SUITE_CCMP_256:
267 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
268 break;
269 case WLAN_CIPHER_SUITE_GCMP:
270 case WLAN_CIPHER_SUITE_GCMP_256:
271 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM];
272 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
273 break;
274 case WLAN_CIPHER_SUITE_BIP_GMAC_128:
275 case WLAN_CIPHER_SUITE_BIP_GMAC_256:
276 case WLAN_CIPHER_SUITE_BIP_CMAC_256:
277 case WLAN_CIPHER_SUITE_AES_CMAC:
278 WARN_ON(1);
279 return -EINVAL;
280 default:
281 ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
282 return -EOPNOTSUPP;
283 }
284
285 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
286 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
287
288 if (cmd == DISABLE_KEY) {
289 arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE];
290 arg.key_data = NULL;
291 }
292
293 return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
294 }
295
ath10k_install_key(struct ath10k_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)296 static int ath10k_install_key(struct ath10k_vif *arvif,
297 struct ieee80211_key_conf *key,
298 enum set_key_cmd cmd,
299 const u8 *macaddr, u32 flags)
300 {
301 struct ath10k *ar = arvif->ar;
302 int ret;
303 unsigned long time_left;
304
305 lockdep_assert_held(&ar->conf_mutex);
306
307 reinit_completion(&ar->install_key_done);
308
309 if (arvif->nohwcrypt)
310 return 1;
311
312 ret = ath10k_send_key(arvif, key, cmd, macaddr, flags);
313 if (ret)
314 return ret;
315
316 time_left = wait_for_completion_timeout(&ar->install_key_done, 3 * HZ);
317 if (time_left == 0)
318 return -ETIMEDOUT;
319
320 return 0;
321 }
322
ath10k_install_peer_wep_keys(struct ath10k_vif * arvif,const u8 * addr)323 static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
324 const u8 *addr)
325 {
326 struct ath10k *ar = arvif->ar;
327 struct ath10k_peer *peer;
328 int ret;
329 int i;
330 u32 flags;
331
332 lockdep_assert_held(&ar->conf_mutex);
333
334 if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
335 arvif->vif->type != NL80211_IFTYPE_ADHOC &&
336 arvif->vif->type != NL80211_IFTYPE_MESH_POINT))
337 return -EINVAL;
338
339 spin_lock_bh(&ar->data_lock);
340 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
341 spin_unlock_bh(&ar->data_lock);
342
343 if (!peer)
344 return -ENOENT;
345
346 for (i = 0; i < ARRAY_SIZE(arvif->wep_keys); i++) {
347 if (arvif->wep_keys[i] == NULL)
348 continue;
349
350 switch (arvif->vif->type) {
351 case NL80211_IFTYPE_AP:
352 flags = WMI_KEY_PAIRWISE;
353
354 if (arvif->def_wep_key_idx == i)
355 flags |= WMI_KEY_TX_USAGE;
356
357 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
358 SET_KEY, addr, flags);
359 if (ret < 0)
360 return ret;
361 break;
362 case NL80211_IFTYPE_ADHOC:
363 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
364 SET_KEY, addr,
365 WMI_KEY_PAIRWISE);
366 if (ret < 0)
367 return ret;
368
369 ret = ath10k_install_key(arvif, arvif->wep_keys[i],
370 SET_KEY, addr, WMI_KEY_GROUP);
371 if (ret < 0)
372 return ret;
373 break;
374 default:
375 WARN_ON(1);
376 return -EINVAL;
377 }
378
379 spin_lock_bh(&ar->data_lock);
380 peer->keys[i] = arvif->wep_keys[i];
381 spin_unlock_bh(&ar->data_lock);
382 }
383
384 /* In some cases (notably with static WEP IBSS with multiple keys)
385 * multicast Tx becomes broken. Both pairwise and groupwise keys are
386 * installed already. Using WMI_KEY_TX_USAGE in different combinations
387 * didn't seem help. Using def_keyid vdev parameter seems to be
388 * effective so use that.
389 *
390 * FIXME: Revisit. Perhaps this can be done in a less hacky way.
391 */
392 if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
393 return 0;
394
395 if (arvif->def_wep_key_idx == -1)
396 return 0;
397
398 ret = ath10k_wmi_vdev_set_param(arvif->ar,
399 arvif->vdev_id,
400 arvif->ar->wmi.vdev_param->def_keyid,
401 arvif->def_wep_key_idx);
402 if (ret) {
403 ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
404 arvif->vdev_id, ret);
405 return ret;
406 }
407
408 return 0;
409 }
410
ath10k_clear_peer_keys(struct ath10k_vif * arvif,const u8 * addr)411 static int ath10k_clear_peer_keys(struct ath10k_vif *arvif,
412 const u8 *addr)
413 {
414 struct ath10k *ar = arvif->ar;
415 struct ath10k_peer *peer;
416 int first_errno = 0;
417 int ret;
418 int i;
419 u32 flags = 0;
420
421 lockdep_assert_held(&ar->conf_mutex);
422
423 spin_lock_bh(&ar->data_lock);
424 peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
425 spin_unlock_bh(&ar->data_lock);
426
427 if (!peer)
428 return -ENOENT;
429
430 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
431 if (peer->keys[i] == NULL)
432 continue;
433
434 /* key flags are not required to delete the key */
435 ret = ath10k_install_key(arvif, peer->keys[i],
436 DISABLE_KEY, addr, flags);
437 if (ret < 0 && first_errno == 0)
438 first_errno = ret;
439
440 if (ret < 0)
441 ath10k_warn(ar, "failed to remove peer wep key %d: %d\n",
442 i, ret);
443
444 spin_lock_bh(&ar->data_lock);
445 peer->keys[i] = NULL;
446 spin_unlock_bh(&ar->data_lock);
447 }
448
449 return first_errno;
450 }
451
ath10k_mac_is_peer_wep_key_set(struct ath10k * ar,const u8 * addr,u8 keyidx)452 bool ath10k_mac_is_peer_wep_key_set(struct ath10k *ar, const u8 *addr,
453 u8 keyidx)
454 {
455 struct ath10k_peer *peer;
456 int i;
457
458 lockdep_assert_held(&ar->data_lock);
459
460 /* We don't know which vdev this peer belongs to,
461 * since WMI doesn't give us that information.
462 *
463 * FIXME: multi-bss needs to be handled.
464 */
465 peer = ath10k_peer_find(ar, 0, addr);
466 if (!peer)
467 return false;
468
469 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
470 if (peer->keys[i] && peer->keys[i]->keyidx == keyidx)
471 return true;
472 }
473
474 return false;
475 }
476
ath10k_clear_vdev_key(struct ath10k_vif * arvif,struct ieee80211_key_conf * key)477 static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
478 struct ieee80211_key_conf *key)
479 {
480 struct ath10k *ar = arvif->ar;
481 struct ath10k_peer *peer;
482 u8 addr[ETH_ALEN];
483 int first_errno = 0;
484 int ret;
485 int i;
486 u32 flags = 0;
487
488 lockdep_assert_held(&ar->conf_mutex);
489
490 for (;;) {
491 /* since ath10k_install_key we can't hold data_lock all the
492 * time, so we try to remove the keys incrementally
493 */
494 spin_lock_bh(&ar->data_lock);
495 i = 0;
496 list_for_each_entry(peer, &ar->peers, list) {
497 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
498 if (peer->keys[i] == key) {
499 ether_addr_copy(addr, peer->addr);
500 peer->keys[i] = NULL;
501 break;
502 }
503 }
504
505 if (i < ARRAY_SIZE(peer->keys))
506 break;
507 }
508 spin_unlock_bh(&ar->data_lock);
509
510 if (i == ARRAY_SIZE(peer->keys))
511 break;
512 /* key flags are not required to delete the key */
513 ret = ath10k_install_key(arvif, key, DISABLE_KEY, addr, flags);
514 if (ret < 0 && first_errno == 0)
515 first_errno = ret;
516
517 if (ret)
518 ath10k_warn(ar, "failed to remove key for %pM: %d\n",
519 addr, ret);
520 }
521
522 return first_errno;
523 }
524
ath10k_mac_vif_update_wep_key(struct ath10k_vif * arvif,struct ieee80211_key_conf * key)525 static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
526 struct ieee80211_key_conf *key)
527 {
528 struct ath10k *ar = arvif->ar;
529 struct ath10k_peer *peer;
530 int ret;
531
532 lockdep_assert_held(&ar->conf_mutex);
533
534 list_for_each_entry(peer, &ar->peers, list) {
535 if (ether_addr_equal(peer->addr, arvif->vif->addr))
536 continue;
537
538 if (ether_addr_equal(peer->addr, arvif->bssid))
539 continue;
540
541 if (peer->keys[key->keyidx] == key)
542 continue;
543
544 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
545 arvif->vdev_id, key->keyidx);
546
547 ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
548 if (ret) {
549 ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
550 arvif->vdev_id, peer->addr, ret);
551 return ret;
552 }
553 }
554
555 return 0;
556 }
557
558 /*********************/
559 /* General utilities */
560 /*********************/
561
562 static inline enum wmi_phy_mode
chan_to_phymode(const struct cfg80211_chan_def * chandef)563 chan_to_phymode(const struct cfg80211_chan_def *chandef)
564 {
565 enum wmi_phy_mode phymode = MODE_UNKNOWN;
566
567 switch (chandef->chan->band) {
568 case NL80211_BAND_2GHZ:
569 switch (chandef->width) {
570 case NL80211_CHAN_WIDTH_20_NOHT:
571 if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
572 phymode = MODE_11B;
573 else
574 phymode = MODE_11G;
575 break;
576 case NL80211_CHAN_WIDTH_20:
577 phymode = MODE_11NG_HT20;
578 break;
579 case NL80211_CHAN_WIDTH_40:
580 phymode = MODE_11NG_HT40;
581 break;
582 default:
583 phymode = MODE_UNKNOWN;
584 break;
585 }
586 break;
587 case NL80211_BAND_5GHZ:
588 switch (chandef->width) {
589 case NL80211_CHAN_WIDTH_20_NOHT:
590 phymode = MODE_11A;
591 break;
592 case NL80211_CHAN_WIDTH_20:
593 phymode = MODE_11NA_HT20;
594 break;
595 case NL80211_CHAN_WIDTH_40:
596 phymode = MODE_11NA_HT40;
597 break;
598 case NL80211_CHAN_WIDTH_80:
599 phymode = MODE_11AC_VHT80;
600 break;
601 case NL80211_CHAN_WIDTH_160:
602 phymode = MODE_11AC_VHT160;
603 break;
604 case NL80211_CHAN_WIDTH_80P80:
605 phymode = MODE_11AC_VHT80_80;
606 break;
607 default:
608 phymode = MODE_UNKNOWN;
609 break;
610 }
611 break;
612 default:
613 break;
614 }
615
616 WARN_ON(phymode == MODE_UNKNOWN);
617 return phymode;
618 }
619
ath10k_parse_mpdudensity(u8 mpdudensity)620 static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
621 {
622 /*
623 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
624 * 0 for no restriction
625 * 1 for 1/4 us
626 * 2 for 1/2 us
627 * 3 for 1 us
628 * 4 for 2 us
629 * 5 for 4 us
630 * 6 for 8 us
631 * 7 for 16 us
632 */
633 switch (mpdudensity) {
634 case 0:
635 return 0;
636 case 1:
637 case 2:
638 case 3:
639 /* Our lower layer calculations limit our precision to
640 * 1 microsecond
641 */
642 return 1;
643 case 4:
644 return 2;
645 case 5:
646 return 4;
647 case 6:
648 return 8;
649 case 7:
650 return 16;
651 default:
652 return 0;
653 }
654 }
655
ath10k_mac_vif_chan(struct ieee80211_vif * vif,struct cfg80211_chan_def * def)656 int ath10k_mac_vif_chan(struct ieee80211_vif *vif,
657 struct cfg80211_chan_def *def)
658 {
659 struct ieee80211_chanctx_conf *conf;
660
661 rcu_read_lock();
662 conf = rcu_dereference(vif->chanctx_conf);
663 if (!conf) {
664 rcu_read_unlock();
665 return -ENOENT;
666 }
667
668 *def = conf->def;
669 rcu_read_unlock();
670
671 return 0;
672 }
673
ath10k_mac_num_chanctxs_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)674 static void ath10k_mac_num_chanctxs_iter(struct ieee80211_hw *hw,
675 struct ieee80211_chanctx_conf *conf,
676 void *data)
677 {
678 int *num = data;
679
680 (*num)++;
681 }
682
ath10k_mac_num_chanctxs(struct ath10k * ar)683 static int ath10k_mac_num_chanctxs(struct ath10k *ar)
684 {
685 int num = 0;
686
687 ieee80211_iter_chan_contexts_atomic(ar->hw,
688 ath10k_mac_num_chanctxs_iter,
689 &num);
690
691 return num;
692 }
693
694 static void
ath10k_mac_get_any_chandef_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)695 ath10k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
696 struct ieee80211_chanctx_conf *conf,
697 void *data)
698 {
699 struct cfg80211_chan_def **def = data;
700
701 *def = &conf->def;
702 }
703
ath10k_wait_for_peer_delete_done(struct ath10k * ar,u32 vdev_id,const u8 * addr)704 static void ath10k_wait_for_peer_delete_done(struct ath10k *ar, u32 vdev_id,
705 const u8 *addr)
706 {
707 unsigned long time_left;
708 int ret;
709
710 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
711 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
712 if (ret) {
713 ath10k_warn(ar, "failed wait for peer deleted");
714 return;
715 }
716
717 time_left = wait_for_completion_timeout(&ar->peer_delete_done,
718 5 * HZ);
719 if (!time_left)
720 ath10k_warn(ar, "Timeout in receiving peer delete response\n");
721 }
722 }
723
ath10k_peer_create(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u32 vdev_id,const u8 * addr,enum wmi_peer_type peer_type)724 static int ath10k_peer_create(struct ath10k *ar,
725 struct ieee80211_vif *vif,
726 struct ieee80211_sta *sta,
727 u32 vdev_id,
728 const u8 *addr,
729 enum wmi_peer_type peer_type)
730 {
731 struct ath10k_vif *arvif;
732 struct ath10k_peer *peer;
733 int num_peers = 0;
734 int ret;
735
736 lockdep_assert_held(&ar->conf_mutex);
737
738 num_peers = ar->num_peers;
739
740 /* Each vdev consumes a peer entry as well */
741 list_for_each_entry(arvif, &ar->arvifs, list)
742 num_peers++;
743
744 if (num_peers >= ar->max_num_peers)
745 return -ENOBUFS;
746
747 ret = ath10k_wmi_peer_create(ar, vdev_id, addr, peer_type);
748 if (ret) {
749 ath10k_warn(ar, "failed to create wmi peer %pM on vdev %i: %i\n",
750 addr, vdev_id, ret);
751 return ret;
752 }
753
754 ret = ath10k_wait_for_peer_created(ar, vdev_id, addr);
755 if (ret) {
756 ath10k_warn(ar, "failed to wait for created wmi peer %pM on vdev %i: %i\n",
757 addr, vdev_id, ret);
758 return ret;
759 }
760
761 spin_lock_bh(&ar->data_lock);
762
763 peer = ath10k_peer_find(ar, vdev_id, addr);
764 if (!peer) {
765 spin_unlock_bh(&ar->data_lock);
766 ath10k_warn(ar, "failed to find peer %pM on vdev %i after creation\n",
767 addr, vdev_id);
768 ath10k_wait_for_peer_delete_done(ar, vdev_id, addr);
769 return -ENOENT;
770 }
771
772 peer->vif = vif;
773 peer->sta = sta;
774
775 spin_unlock_bh(&ar->data_lock);
776
777 ar->num_peers++;
778
779 return 0;
780 }
781
ath10k_mac_set_kickout(struct ath10k_vif * arvif)782 static int ath10k_mac_set_kickout(struct ath10k_vif *arvif)
783 {
784 struct ath10k *ar = arvif->ar;
785 u32 param;
786 int ret;
787
788 param = ar->wmi.pdev_param->sta_kickout_th;
789 ret = ath10k_wmi_pdev_set_param(ar, param,
790 ATH10K_KICKOUT_THRESHOLD);
791 if (ret) {
792 ath10k_warn(ar, "failed to set kickout threshold on vdev %i: %d\n",
793 arvif->vdev_id, ret);
794 return ret;
795 }
796
797 param = ar->wmi.vdev_param->ap_keepalive_min_idle_inactive_time_secs;
798 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
799 ATH10K_KEEPALIVE_MIN_IDLE);
800 if (ret) {
801 ath10k_warn(ar, "failed to set keepalive minimum idle time on vdev %i: %d\n",
802 arvif->vdev_id, ret);
803 return ret;
804 }
805
806 param = ar->wmi.vdev_param->ap_keepalive_max_idle_inactive_time_secs;
807 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
808 ATH10K_KEEPALIVE_MAX_IDLE);
809 if (ret) {
810 ath10k_warn(ar, "failed to set keepalive maximum idle time on vdev %i: %d\n",
811 arvif->vdev_id, ret);
812 return ret;
813 }
814
815 param = ar->wmi.vdev_param->ap_keepalive_max_unresponsive_time_secs;
816 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param,
817 ATH10K_KEEPALIVE_MAX_UNRESPONSIVE);
818 if (ret) {
819 ath10k_warn(ar, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
820 arvif->vdev_id, ret);
821 return ret;
822 }
823
824 return 0;
825 }
826
ath10k_mac_set_rts(struct ath10k_vif * arvif,u32 value)827 static int ath10k_mac_set_rts(struct ath10k_vif *arvif, u32 value)
828 {
829 struct ath10k *ar = arvif->ar;
830 u32 vdev_param;
831
832 vdev_param = ar->wmi.vdev_param->rts_threshold;
833 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, value);
834 }
835
ath10k_peer_delete(struct ath10k * ar,u32 vdev_id,const u8 * addr)836 static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
837 {
838 int ret;
839
840 lockdep_assert_held(&ar->conf_mutex);
841
842 ret = ath10k_wmi_peer_delete(ar, vdev_id, addr);
843 if (ret)
844 return ret;
845
846 ret = ath10k_wait_for_peer_deleted(ar, vdev_id, addr);
847 if (ret)
848 return ret;
849
850 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
851 unsigned long time_left;
852
853 time_left = wait_for_completion_timeout
854 (&ar->peer_delete_done, 5 * HZ);
855
856 if (!time_left) {
857 ath10k_warn(ar, "Timeout in receiving peer delete response\n");
858 return -ETIMEDOUT;
859 }
860 }
861
862 ar->num_peers--;
863
864 return 0;
865 }
866
ath10k_peer_cleanup(struct ath10k * ar,u32 vdev_id)867 static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
868 {
869 struct ath10k_peer *peer, *tmp;
870 int peer_id;
871 int i;
872
873 lockdep_assert_held(&ar->conf_mutex);
874
875 spin_lock_bh(&ar->data_lock);
876 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
877 if (peer->vdev_id != vdev_id)
878 continue;
879
880 ath10k_warn(ar, "removing stale peer %pM from vdev_id %d\n",
881 peer->addr, vdev_id);
882
883 for_each_set_bit(peer_id, peer->peer_ids,
884 ATH10K_MAX_NUM_PEER_IDS) {
885 ar->peer_map[peer_id] = NULL;
886 }
887
888 /* Double check that peer is properly un-referenced from
889 * the peer_map
890 */
891 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
892 if (ar->peer_map[i] == peer) {
893 ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %pK idx %d)\n",
894 peer->addr, peer, i);
895 ar->peer_map[i] = NULL;
896 }
897 }
898
899 list_del(&peer->list);
900 kfree(peer);
901 ar->num_peers--;
902 }
903 spin_unlock_bh(&ar->data_lock);
904 }
905
ath10k_peer_cleanup_all(struct ath10k * ar)906 static void ath10k_peer_cleanup_all(struct ath10k *ar)
907 {
908 struct ath10k_peer *peer, *tmp;
909 int i;
910
911 lockdep_assert_held(&ar->conf_mutex);
912
913 spin_lock_bh(&ar->data_lock);
914 list_for_each_entry_safe(peer, tmp, &ar->peers, list) {
915 list_del(&peer->list);
916 kfree(peer);
917 }
918
919 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++)
920 ar->peer_map[i] = NULL;
921
922 spin_unlock_bh(&ar->data_lock);
923
924 ar->num_peers = 0;
925 ar->num_stations = 0;
926 }
927
ath10k_mac_tdls_peer_update(struct ath10k * ar,u32 vdev_id,struct ieee80211_sta * sta,enum wmi_tdls_peer_state state)928 static int ath10k_mac_tdls_peer_update(struct ath10k *ar, u32 vdev_id,
929 struct ieee80211_sta *sta,
930 enum wmi_tdls_peer_state state)
931 {
932 int ret;
933 struct wmi_tdls_peer_update_cmd_arg arg = {};
934 struct wmi_tdls_peer_capab_arg cap = {};
935 struct wmi_channel_arg chan_arg = {};
936
937 lockdep_assert_held(&ar->conf_mutex);
938
939 arg.vdev_id = vdev_id;
940 arg.peer_state = state;
941 ether_addr_copy(arg.addr, sta->addr);
942
943 cap.peer_max_sp = sta->max_sp;
944 cap.peer_uapsd_queues = sta->uapsd_queues;
945
946 if (state == WMI_TDLS_PEER_STATE_CONNECTED &&
947 !sta->tdls_initiator)
948 cap.is_peer_responder = 1;
949
950 ret = ath10k_wmi_tdls_peer_update(ar, &arg, &cap, &chan_arg);
951 if (ret) {
952 ath10k_warn(ar, "failed to update tdls peer %pM on vdev %i: %i\n",
953 arg.addr, vdev_id, ret);
954 return ret;
955 }
956
957 return 0;
958 }
959
960 /************************/
961 /* Interface management */
962 /************************/
963
ath10k_mac_vif_beacon_free(struct ath10k_vif * arvif)964 void ath10k_mac_vif_beacon_free(struct ath10k_vif *arvif)
965 {
966 struct ath10k *ar = arvif->ar;
967
968 lockdep_assert_held(&ar->data_lock);
969
970 if (!arvif->beacon)
971 return;
972
973 if (!arvif->beacon_buf)
974 dma_unmap_single(ar->dev, ATH10K_SKB_CB(arvif->beacon)->paddr,
975 arvif->beacon->len, DMA_TO_DEVICE);
976
977 if (WARN_ON(arvif->beacon_state != ATH10K_BEACON_SCHEDULED &&
978 arvif->beacon_state != ATH10K_BEACON_SENT))
979 return;
980
981 dev_kfree_skb_any(arvif->beacon);
982
983 arvif->beacon = NULL;
984 arvif->beacon_state = ATH10K_BEACON_SCHEDULED;
985 }
986
ath10k_mac_vif_beacon_cleanup(struct ath10k_vif * arvif)987 static void ath10k_mac_vif_beacon_cleanup(struct ath10k_vif *arvif)
988 {
989 struct ath10k *ar = arvif->ar;
990
991 lockdep_assert_held(&ar->data_lock);
992
993 ath10k_mac_vif_beacon_free(arvif);
994
995 if (arvif->beacon_buf) {
996 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
997 arvif->beacon_buf, arvif->beacon_paddr);
998 arvif->beacon_buf = NULL;
999 }
1000 }
1001
ath10k_vdev_setup_sync(struct ath10k * ar)1002 static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
1003 {
1004 unsigned long time_left;
1005
1006 lockdep_assert_held(&ar->conf_mutex);
1007
1008 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
1009 return -ESHUTDOWN;
1010
1011 time_left = wait_for_completion_timeout(&ar->vdev_setup_done,
1012 ATH10K_VDEV_SETUP_TIMEOUT_HZ);
1013 if (time_left == 0)
1014 return -ETIMEDOUT;
1015
1016 return ar->last_wmi_vdev_start_status;
1017 }
1018
ath10k_monitor_vdev_start(struct ath10k * ar,int vdev_id)1019 static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
1020 {
1021 struct cfg80211_chan_def *chandef = NULL;
1022 struct ieee80211_channel *channel = NULL;
1023 struct wmi_vdev_start_request_arg arg = {};
1024 int ret = 0;
1025
1026 lockdep_assert_held(&ar->conf_mutex);
1027
1028 ieee80211_iter_chan_contexts_atomic(ar->hw,
1029 ath10k_mac_get_any_chandef_iter,
1030 &chandef);
1031 if (WARN_ON_ONCE(!chandef))
1032 return -ENOENT;
1033
1034 channel = chandef->chan;
1035
1036 arg.vdev_id = vdev_id;
1037 arg.channel.freq = channel->center_freq;
1038 arg.channel.band_center_freq1 = chandef->center_freq1;
1039 arg.channel.band_center_freq2 = chandef->center_freq2;
1040
1041 /* TODO setup this dynamically, what in case we
1042 * don't have any vifs?
1043 */
1044 arg.channel.mode = chan_to_phymode(chandef);
1045 arg.channel.chan_radar =
1046 !!(channel->flags & IEEE80211_CHAN_RADAR);
1047
1048 arg.channel.min_power = 0;
1049 arg.channel.max_power = channel->max_power * 2;
1050 arg.channel.max_reg_power = channel->max_reg_power * 2;
1051 arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
1052
1053 reinit_completion(&ar->vdev_setup_done);
1054 reinit_completion(&ar->vdev_delete_done);
1055
1056 ret = ath10k_wmi_vdev_start(ar, &arg);
1057 if (ret) {
1058 ath10k_warn(ar, "failed to request monitor vdev %i start: %d\n",
1059 vdev_id, ret);
1060 return ret;
1061 }
1062
1063 ret = ath10k_vdev_setup_sync(ar);
1064 if (ret) {
1065 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
1066 vdev_id, ret);
1067 return ret;
1068 }
1069
1070 ret = ath10k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
1071 if (ret) {
1072 ath10k_warn(ar, "failed to put up monitor vdev %i: %d\n",
1073 vdev_id, ret);
1074 goto vdev_stop;
1075 }
1076
1077 ar->monitor_vdev_id = vdev_id;
1078
1079 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i started\n",
1080 ar->monitor_vdev_id);
1081 return 0;
1082
1083 vdev_stop:
1084 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1085 if (ret)
1086 ath10k_warn(ar, "failed to stop monitor vdev %i after start failure: %d\n",
1087 ar->monitor_vdev_id, ret);
1088
1089 return ret;
1090 }
1091
ath10k_monitor_vdev_stop(struct ath10k * ar)1092 static int ath10k_monitor_vdev_stop(struct ath10k *ar)
1093 {
1094 int ret = 0;
1095
1096 lockdep_assert_held(&ar->conf_mutex);
1097
1098 ret = ath10k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1099 if (ret)
1100 ath10k_warn(ar, "failed to put down monitor vdev %i: %d\n",
1101 ar->monitor_vdev_id, ret);
1102
1103 reinit_completion(&ar->vdev_setup_done);
1104 reinit_completion(&ar->vdev_delete_done);
1105
1106 ret = ath10k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1107 if (ret)
1108 ath10k_warn(ar, "failed to request monitor vdev %i stop: %d\n",
1109 ar->monitor_vdev_id, ret);
1110
1111 ret = ath10k_vdev_setup_sync(ar);
1112 if (ret)
1113 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
1114 ar->monitor_vdev_id, ret);
1115
1116 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
1117 ar->monitor_vdev_id);
1118 return ret;
1119 }
1120
ath10k_monitor_vdev_create(struct ath10k * ar)1121 static int ath10k_monitor_vdev_create(struct ath10k *ar)
1122 {
1123 int bit, ret = 0;
1124
1125 lockdep_assert_held(&ar->conf_mutex);
1126
1127 if (ar->free_vdev_map == 0) {
1128 ath10k_warn(ar, "failed to find free vdev id for monitor vdev\n");
1129 return -ENOMEM;
1130 }
1131
1132 bit = __ffs64(ar->free_vdev_map);
1133
1134 ar->monitor_vdev_id = bit;
1135
1136 ret = ath10k_wmi_vdev_create(ar, ar->monitor_vdev_id,
1137 WMI_VDEV_TYPE_MONITOR,
1138 0, ar->mac_addr);
1139 if (ret) {
1140 ath10k_warn(ar, "failed to request monitor vdev %i creation: %d\n",
1141 ar->monitor_vdev_id, ret);
1142 return ret;
1143 }
1144
1145 ar->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1146 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d created\n",
1147 ar->monitor_vdev_id);
1148
1149 return 0;
1150 }
1151
ath10k_monitor_vdev_delete(struct ath10k * ar)1152 static int ath10k_monitor_vdev_delete(struct ath10k *ar)
1153 {
1154 int ret = 0;
1155
1156 lockdep_assert_held(&ar->conf_mutex);
1157
1158 ret = ath10k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1159 if (ret) {
1160 ath10k_warn(ar, "failed to request wmi monitor vdev %i removal: %d\n",
1161 ar->monitor_vdev_id, ret);
1162 return ret;
1163 }
1164
1165 ar->free_vdev_map |= 1LL << ar->monitor_vdev_id;
1166
1167 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %d deleted\n",
1168 ar->monitor_vdev_id);
1169 return ret;
1170 }
1171
ath10k_monitor_start(struct ath10k * ar)1172 static int ath10k_monitor_start(struct ath10k *ar)
1173 {
1174 int ret;
1175
1176 lockdep_assert_held(&ar->conf_mutex);
1177
1178 ret = ath10k_monitor_vdev_create(ar);
1179 if (ret) {
1180 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
1181 return ret;
1182 }
1183
1184 ret = ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
1185 if (ret) {
1186 ath10k_warn(ar, "failed to start monitor vdev: %d\n", ret);
1187 ath10k_monitor_vdev_delete(ar);
1188 return ret;
1189 }
1190
1191 ar->monitor_started = true;
1192 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor started\n");
1193
1194 return 0;
1195 }
1196
ath10k_monitor_stop(struct ath10k * ar)1197 static int ath10k_monitor_stop(struct ath10k *ar)
1198 {
1199 int ret;
1200
1201 lockdep_assert_held(&ar->conf_mutex);
1202
1203 ret = ath10k_monitor_vdev_stop(ar);
1204 if (ret) {
1205 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
1206 return ret;
1207 }
1208
1209 ret = ath10k_monitor_vdev_delete(ar);
1210 if (ret) {
1211 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
1212 return ret;
1213 }
1214
1215 ar->monitor_started = false;
1216 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
1217
1218 return 0;
1219 }
1220
ath10k_mac_monitor_vdev_is_needed(struct ath10k * ar)1221 static bool ath10k_mac_monitor_vdev_is_needed(struct ath10k *ar)
1222 {
1223 int num_ctx;
1224
1225 /* At least one chanctx is required to derive a channel to start
1226 * monitor vdev on.
1227 */
1228 num_ctx = ath10k_mac_num_chanctxs(ar);
1229 if (num_ctx == 0)
1230 return false;
1231
1232 /* If there's already an existing special monitor interface then don't
1233 * bother creating another monitor vdev.
1234 */
1235 if (ar->monitor_arvif)
1236 return false;
1237
1238 return ar->monitor ||
1239 (!test_bit(ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST,
1240 ar->running_fw->fw_file.fw_features) &&
1241 (ar->filter_flags & FIF_OTHER_BSS)) ||
1242 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1243 }
1244
ath10k_mac_monitor_vdev_is_allowed(struct ath10k * ar)1245 static bool ath10k_mac_monitor_vdev_is_allowed(struct ath10k *ar)
1246 {
1247 int num_ctx;
1248
1249 num_ctx = ath10k_mac_num_chanctxs(ar);
1250
1251 /* FIXME: Current interface combinations and cfg80211/mac80211 code
1252 * shouldn't allow this but make sure to prevent handling the following
1253 * case anyway since multi-channel DFS hasn't been tested at all.
1254 */
1255 if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags) && num_ctx > 1)
1256 return false;
1257
1258 return true;
1259 }
1260
ath10k_monitor_recalc(struct ath10k * ar)1261 static int ath10k_monitor_recalc(struct ath10k *ar)
1262 {
1263 bool needed;
1264 bool allowed;
1265 int ret;
1266
1267 lockdep_assert_held(&ar->conf_mutex);
1268
1269 needed = ath10k_mac_monitor_vdev_is_needed(ar);
1270 allowed = ath10k_mac_monitor_vdev_is_allowed(ar);
1271
1272 ath10k_dbg(ar, ATH10K_DBG_MAC,
1273 "mac monitor recalc started? %d needed? %d allowed? %d\n",
1274 ar->monitor_started, needed, allowed);
1275
1276 if (WARN_ON(needed && !allowed)) {
1277 if (ar->monitor_started) {
1278 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopping disallowed monitor\n");
1279
1280 ret = ath10k_monitor_stop(ar);
1281 if (ret)
1282 ath10k_warn(ar, "failed to stop disallowed monitor: %d\n",
1283 ret);
1284 /* not serious */
1285 }
1286
1287 return -EPERM;
1288 }
1289
1290 if (needed == ar->monitor_started)
1291 return 0;
1292
1293 if (needed)
1294 return ath10k_monitor_start(ar);
1295 else
1296 return ath10k_monitor_stop(ar);
1297 }
1298
ath10k_mac_can_set_cts_prot(struct ath10k_vif * arvif)1299 static bool ath10k_mac_can_set_cts_prot(struct ath10k_vif *arvif)
1300 {
1301 struct ath10k *ar = arvif->ar;
1302
1303 lockdep_assert_held(&ar->conf_mutex);
1304
1305 if (!arvif->is_started) {
1306 ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n");
1307 return false;
1308 }
1309
1310 return true;
1311 }
1312
ath10k_mac_set_cts_prot(struct ath10k_vif * arvif)1313 static int ath10k_mac_set_cts_prot(struct ath10k_vif *arvif)
1314 {
1315 struct ath10k *ar = arvif->ar;
1316 u32 vdev_param;
1317
1318 lockdep_assert_held(&ar->conf_mutex);
1319
1320 vdev_param = ar->wmi.vdev_param->protection_mode;
1321
1322 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n",
1323 arvif->vdev_id, arvif->use_cts_prot);
1324
1325 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1326 arvif->use_cts_prot ? 1 : 0);
1327 }
1328
ath10k_recalc_rtscts_prot(struct ath10k_vif * arvif)1329 static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
1330 {
1331 struct ath10k *ar = arvif->ar;
1332 u32 vdev_param, rts_cts = 0;
1333
1334 lockdep_assert_held(&ar->conf_mutex);
1335
1336 vdev_param = ar->wmi.vdev_param->enable_rtscts;
1337
1338 rts_cts |= SM(WMI_RTSCTS_ENABLED, WMI_RTSCTS_SET);
1339
1340 if (arvif->num_legacy_stations > 0)
1341 rts_cts |= SM(WMI_RTSCTS_ACROSS_SW_RETRIES,
1342 WMI_RTSCTS_PROFILE);
1343 else
1344 rts_cts |= SM(WMI_RTSCTS_FOR_SECOND_RATESERIES,
1345 WMI_RTSCTS_PROFILE);
1346
1347 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1348 arvif->vdev_id, rts_cts);
1349
1350 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
1351 rts_cts);
1352 }
1353
ath10k_start_cac(struct ath10k * ar)1354 static int ath10k_start_cac(struct ath10k *ar)
1355 {
1356 int ret;
1357
1358 lockdep_assert_held(&ar->conf_mutex);
1359
1360 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1361
1362 ret = ath10k_monitor_recalc(ar);
1363 if (ret) {
1364 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
1365 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1366 return ret;
1367 }
1368
1369 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac start monitor vdev %d\n",
1370 ar->monitor_vdev_id);
1371
1372 return 0;
1373 }
1374
ath10k_stop_cac(struct ath10k * ar)1375 static int ath10k_stop_cac(struct ath10k *ar)
1376 {
1377 lockdep_assert_held(&ar->conf_mutex);
1378
1379 /* CAC is not running - do nothing */
1380 if (!test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags))
1381 return 0;
1382
1383 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
1384 ath10k_monitor_stop(ar);
1385
1386 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac cac finished\n");
1387
1388 return 0;
1389 }
1390
ath10k_mac_has_radar_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)1391 static void ath10k_mac_has_radar_iter(struct ieee80211_hw *hw,
1392 struct ieee80211_chanctx_conf *conf,
1393 void *data)
1394 {
1395 bool *ret = data;
1396
1397 if (!*ret && conf->radar_enabled)
1398 *ret = true;
1399 }
1400
ath10k_mac_has_radar_enabled(struct ath10k * ar)1401 static bool ath10k_mac_has_radar_enabled(struct ath10k *ar)
1402 {
1403 bool has_radar = false;
1404
1405 ieee80211_iter_chan_contexts_atomic(ar->hw,
1406 ath10k_mac_has_radar_iter,
1407 &has_radar);
1408
1409 return has_radar;
1410 }
1411
ath10k_recalc_radar_detection(struct ath10k * ar)1412 static void ath10k_recalc_radar_detection(struct ath10k *ar)
1413 {
1414 int ret;
1415
1416 lockdep_assert_held(&ar->conf_mutex);
1417
1418 ath10k_stop_cac(ar);
1419
1420 if (!ath10k_mac_has_radar_enabled(ar))
1421 return;
1422
1423 if (ar->num_started_vdevs > 0)
1424 return;
1425
1426 ret = ath10k_start_cac(ar);
1427 if (ret) {
1428 /*
1429 * Not possible to start CAC on current channel so starting
1430 * radiation is not allowed, make this channel DFS_UNAVAILABLE
1431 * by indicating that radar was detected.
1432 */
1433 ath10k_warn(ar, "failed to start CAC: %d\n", ret);
1434 ieee80211_radar_detected(ar->hw);
1435 }
1436 }
1437
ath10k_vdev_stop(struct ath10k_vif * arvif)1438 static int ath10k_vdev_stop(struct ath10k_vif *arvif)
1439 {
1440 struct ath10k *ar = arvif->ar;
1441 int ret;
1442
1443 lockdep_assert_held(&ar->conf_mutex);
1444
1445 reinit_completion(&ar->vdev_setup_done);
1446 reinit_completion(&ar->vdev_delete_done);
1447
1448 ret = ath10k_wmi_vdev_stop(ar, arvif->vdev_id);
1449 if (ret) {
1450 ath10k_warn(ar, "failed to stop WMI vdev %i: %d\n",
1451 arvif->vdev_id, ret);
1452 return ret;
1453 }
1454
1455 ret = ath10k_vdev_setup_sync(ar);
1456 if (ret) {
1457 ath10k_warn(ar, "failed to synchronize setup for vdev %i: %d\n",
1458 arvif->vdev_id, ret);
1459 return ret;
1460 }
1461
1462 WARN_ON(ar->num_started_vdevs == 0);
1463
1464 if (ar->num_started_vdevs != 0) {
1465 ar->num_started_vdevs--;
1466 ath10k_recalc_radar_detection(ar);
1467 }
1468
1469 return ret;
1470 }
1471
ath10k_vdev_start_restart(struct ath10k_vif * arvif,const struct cfg80211_chan_def * chandef,bool restart)1472 static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
1473 const struct cfg80211_chan_def *chandef,
1474 bool restart)
1475 {
1476 struct ath10k *ar = arvif->ar;
1477 struct wmi_vdev_start_request_arg arg = {};
1478 int ret = 0;
1479
1480 lockdep_assert_held(&ar->conf_mutex);
1481
1482 reinit_completion(&ar->vdev_setup_done);
1483 reinit_completion(&ar->vdev_delete_done);
1484
1485 arg.vdev_id = arvif->vdev_id;
1486 arg.dtim_period = arvif->dtim_period;
1487 arg.bcn_intval = arvif->beacon_interval;
1488
1489 arg.channel.freq = chandef->chan->center_freq;
1490 arg.channel.band_center_freq1 = chandef->center_freq1;
1491 arg.channel.band_center_freq2 = chandef->center_freq2;
1492 arg.channel.mode = chan_to_phymode(chandef);
1493
1494 arg.channel.min_power = 0;
1495 arg.channel.max_power = chandef->chan->max_power * 2;
1496 arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
1497 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
1498
1499 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
1500 arg.ssid = arvif->u.ap.ssid;
1501 arg.ssid_len = arvif->u.ap.ssid_len;
1502 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
1503
1504 /* For now allow DFS for AP mode */
1505 arg.channel.chan_radar =
1506 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
1507 } else if (arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
1508 arg.ssid = arvif->vif->bss_conf.ssid;
1509 arg.ssid_len = arvif->vif->bss_conf.ssid_len;
1510 }
1511
1512 ath10k_dbg(ar, ATH10K_DBG_MAC,
1513 "mac vdev %d start center_freq %d phymode %s\n",
1514 arg.vdev_id, arg.channel.freq,
1515 ath10k_wmi_phymode_str(arg.channel.mode));
1516
1517 if (restart)
1518 ret = ath10k_wmi_vdev_restart(ar, &arg);
1519 else
1520 ret = ath10k_wmi_vdev_start(ar, &arg);
1521
1522 if (ret) {
1523 ath10k_warn(ar, "failed to start WMI vdev %i: %d\n",
1524 arg.vdev_id, ret);
1525 return ret;
1526 }
1527
1528 ret = ath10k_vdev_setup_sync(ar);
1529 if (ret) {
1530 ath10k_warn(ar,
1531 "failed to synchronize setup for vdev %i restart %d: %d\n",
1532 arg.vdev_id, restart, ret);
1533 return ret;
1534 }
1535
1536 ar->num_started_vdevs++;
1537 ath10k_recalc_radar_detection(ar);
1538
1539 return ret;
1540 }
1541
ath10k_vdev_start(struct ath10k_vif * arvif,const struct cfg80211_chan_def * def)1542 static int ath10k_vdev_start(struct ath10k_vif *arvif,
1543 const struct cfg80211_chan_def *def)
1544 {
1545 return ath10k_vdev_start_restart(arvif, def, false);
1546 }
1547
ath10k_vdev_restart(struct ath10k_vif * arvif,const struct cfg80211_chan_def * def)1548 static int ath10k_vdev_restart(struct ath10k_vif *arvif,
1549 const struct cfg80211_chan_def *def)
1550 {
1551 return ath10k_vdev_start_restart(arvif, def, true);
1552 }
1553
ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif * arvif,struct sk_buff * bcn)1554 static int ath10k_mac_setup_bcn_p2p_ie(struct ath10k_vif *arvif,
1555 struct sk_buff *bcn)
1556 {
1557 struct ath10k *ar = arvif->ar;
1558 struct ieee80211_mgmt *mgmt;
1559 const u8 *p2p_ie;
1560 int ret;
1561
1562 if (arvif->vif->type != NL80211_IFTYPE_AP || !arvif->vif->p2p)
1563 return 0;
1564
1565 mgmt = (void *)bcn->data;
1566 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1567 mgmt->u.beacon.variable,
1568 bcn->len - (mgmt->u.beacon.variable -
1569 bcn->data));
1570 if (!p2p_ie)
1571 return -ENOENT;
1572
1573 ret = ath10k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1574 if (ret) {
1575 ath10k_warn(ar, "failed to submit p2p go bcn ie for vdev %i: %d\n",
1576 arvif->vdev_id, ret);
1577 return ret;
1578 }
1579
1580 return 0;
1581 }
1582
ath10k_mac_remove_vendor_ie(struct sk_buff * skb,unsigned int oui,u8 oui_type,size_t ie_offset)1583 static int ath10k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1584 u8 oui_type, size_t ie_offset)
1585 {
1586 size_t len;
1587 const u8 *next;
1588 const u8 *end;
1589 u8 *ie;
1590
1591 if (WARN_ON(skb->len < ie_offset))
1592 return -EINVAL;
1593
1594 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1595 skb->data + ie_offset,
1596 skb->len - ie_offset);
1597 if (!ie)
1598 return -ENOENT;
1599
1600 len = ie[1] + 2;
1601 end = skb->data + skb->len;
1602 next = ie + len;
1603
1604 if (WARN_ON(next > end))
1605 return -EINVAL;
1606
1607 memmove(ie, next, end - next);
1608 skb_trim(skb, skb->len - len);
1609
1610 return 0;
1611 }
1612
ath10k_mac_setup_bcn_tmpl(struct ath10k_vif * arvif)1613 static int ath10k_mac_setup_bcn_tmpl(struct ath10k_vif *arvif)
1614 {
1615 struct ath10k *ar = arvif->ar;
1616 struct ieee80211_hw *hw = ar->hw;
1617 struct ieee80211_vif *vif = arvif->vif;
1618 struct ieee80211_mutable_offsets offs = {};
1619 struct sk_buff *bcn;
1620 int ret;
1621
1622 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1623 return 0;
1624
1625 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
1626 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
1627 return 0;
1628
1629 bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1630 if (!bcn) {
1631 ath10k_warn(ar, "failed to get beacon template from mac80211\n");
1632 return -EPERM;
1633 }
1634
1635 ret = ath10k_mac_setup_bcn_p2p_ie(arvif, bcn);
1636 if (ret) {
1637 ath10k_warn(ar, "failed to setup p2p go bcn ie: %d\n", ret);
1638 kfree_skb(bcn);
1639 return ret;
1640 }
1641
1642 /* P2P IE is inserted by firmware automatically (as configured above)
1643 * so remove it from the base beacon template to avoid duplicate P2P
1644 * IEs in beacon frames.
1645 */
1646 ath10k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1647 offsetof(struct ieee80211_mgmt,
1648 u.beacon.variable));
1649
1650 ret = ath10k_wmi_bcn_tmpl(ar, arvif->vdev_id, offs.tim_offset, bcn, 0,
1651 0, NULL, 0);
1652 kfree_skb(bcn);
1653
1654 if (ret) {
1655 ath10k_warn(ar, "failed to submit beacon template command: %d\n",
1656 ret);
1657 return ret;
1658 }
1659
1660 return 0;
1661 }
1662
ath10k_mac_setup_prb_tmpl(struct ath10k_vif * arvif)1663 static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif)
1664 {
1665 struct ath10k *ar = arvif->ar;
1666 struct ieee80211_hw *hw = ar->hw;
1667 struct ieee80211_vif *vif = arvif->vif;
1668 struct sk_buff *prb;
1669 int ret;
1670
1671 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1672 return 0;
1673
1674 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1675 return 0;
1676
1677 /* For mesh, probe response and beacon share the same template */
1678 if (ieee80211_vif_is_mesh(vif))
1679 return 0;
1680
1681 prb = ieee80211_proberesp_get(hw, vif);
1682 if (!prb) {
1683 ath10k_warn(ar, "failed to get probe resp template from mac80211\n");
1684 return -EPERM;
1685 }
1686
1687 ret = ath10k_wmi_prb_tmpl(ar, arvif->vdev_id, prb);
1688 kfree_skb(prb);
1689
1690 if (ret) {
1691 ath10k_warn(ar, "failed to submit probe resp template command: %d\n",
1692 ret);
1693 return ret;
1694 }
1695
1696 return 0;
1697 }
1698
ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif * arvif)1699 static int ath10k_mac_vif_fix_hidden_ssid(struct ath10k_vif *arvif)
1700 {
1701 struct ath10k *ar = arvif->ar;
1702 struct cfg80211_chan_def def;
1703 int ret;
1704
1705 /* When originally vdev is started during assign_vif_chanctx() some
1706 * information is missing, notably SSID. Firmware revisions with beacon
1707 * offloading require the SSID to be provided during vdev (re)start to
1708 * handle hidden SSID properly.
1709 *
1710 * Vdev restart must be done after vdev has been both started and
1711 * upped. Otherwise some firmware revisions (at least 10.2) fail to
1712 * deliver vdev restart response event causing timeouts during vdev
1713 * syncing in ath10k.
1714 *
1715 * Note: The vdev down/up and template reinstallation could be skipped
1716 * since only wmi-tlv firmware are known to have beacon offload and
1717 * wmi-tlv doesn't seem to misbehave like 10.2 wrt vdev restart
1718 * response delivery. It's probably more robust to keep it as is.
1719 */
1720 if (!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map))
1721 return 0;
1722
1723 if (WARN_ON(!arvif->is_started))
1724 return -EINVAL;
1725
1726 if (WARN_ON(!arvif->is_up))
1727 return -EINVAL;
1728
1729 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
1730 return -EINVAL;
1731
1732 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1733 if (ret) {
1734 ath10k_warn(ar, "failed to bring down ap vdev %i: %d\n",
1735 arvif->vdev_id, ret);
1736 return ret;
1737 }
1738
1739 /* Vdev down reset beacon & presp templates. Reinstall them. Otherwise
1740 * firmware will crash upon vdev up.
1741 */
1742
1743 ret = ath10k_mac_setup_bcn_tmpl(arvif);
1744 if (ret) {
1745 ath10k_warn(ar, "failed to update beacon template: %d\n", ret);
1746 return ret;
1747 }
1748
1749 ret = ath10k_mac_setup_prb_tmpl(arvif);
1750 if (ret) {
1751 ath10k_warn(ar, "failed to update presp template: %d\n", ret);
1752 return ret;
1753 }
1754
1755 ret = ath10k_vdev_restart(arvif, &def);
1756 if (ret) {
1757 ath10k_warn(ar, "failed to restart ap vdev %i: %d\n",
1758 arvif->vdev_id, ret);
1759 return ret;
1760 }
1761
1762 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1763 arvif->bssid);
1764 if (ret) {
1765 ath10k_warn(ar, "failed to bring up ap vdev %i: %d\n",
1766 arvif->vdev_id, ret);
1767 return ret;
1768 }
1769
1770 return 0;
1771 }
1772
ath10k_control_beaconing(struct ath10k_vif * arvif,struct ieee80211_bss_conf * info)1773 static void ath10k_control_beaconing(struct ath10k_vif *arvif,
1774 struct ieee80211_bss_conf *info)
1775 {
1776 struct ath10k *ar = arvif->ar;
1777 int ret = 0;
1778
1779 lockdep_assert_held(&arvif->ar->conf_mutex);
1780
1781 if (!info->enable_beacon) {
1782 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
1783 if (ret)
1784 ath10k_warn(ar, "failed to down vdev_id %i: %d\n",
1785 arvif->vdev_id, ret);
1786
1787 arvif->is_up = false;
1788
1789 spin_lock_bh(&arvif->ar->data_lock);
1790 ath10k_mac_vif_beacon_free(arvif);
1791 spin_unlock_bh(&arvif->ar->data_lock);
1792
1793 return;
1794 }
1795
1796 arvif->tx_seq_no = 0x1000;
1797
1798 arvif->aid = 0;
1799 ether_addr_copy(arvif->bssid, info->bssid);
1800
1801 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1802 arvif->bssid);
1803 if (ret) {
1804 ath10k_warn(ar, "failed to bring up vdev %d: %i\n",
1805 arvif->vdev_id, ret);
1806 return;
1807 }
1808
1809 arvif->is_up = true;
1810
1811 ret = ath10k_mac_vif_fix_hidden_ssid(arvif);
1812 if (ret) {
1813 ath10k_warn(ar, "failed to fix hidden ssid for vdev %i, expect trouble: %d\n",
1814 arvif->vdev_id, ret);
1815 return;
1816 }
1817
1818 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1819 }
1820
ath10k_control_ibss(struct ath10k_vif * arvif,struct ieee80211_bss_conf * info,const u8 self_peer[ETH_ALEN])1821 static void ath10k_control_ibss(struct ath10k_vif *arvif,
1822 struct ieee80211_bss_conf *info,
1823 const u8 self_peer[ETH_ALEN])
1824 {
1825 struct ath10k *ar = arvif->ar;
1826 u32 vdev_param;
1827 int ret = 0;
1828
1829 lockdep_assert_held(&arvif->ar->conf_mutex);
1830
1831 if (!info->ibss_joined) {
1832 if (is_zero_ether_addr(arvif->bssid))
1833 return;
1834
1835 eth_zero_addr(arvif->bssid);
1836
1837 return;
1838 }
1839
1840 vdev_param = arvif->ar->wmi.vdev_param->atim_window;
1841 ret = ath10k_wmi_vdev_set_param(arvif->ar, arvif->vdev_id, vdev_param,
1842 ATH10K_DEFAULT_ATIM);
1843 if (ret)
1844 ath10k_warn(ar, "failed to set IBSS ATIM for vdev %d: %d\n",
1845 arvif->vdev_id, ret);
1846 }
1847
ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif * arvif)1848 static int ath10k_mac_vif_recalc_ps_wake_threshold(struct ath10k_vif *arvif)
1849 {
1850 struct ath10k *ar = arvif->ar;
1851 u32 param;
1852 u32 value;
1853 int ret;
1854
1855 lockdep_assert_held(&arvif->ar->conf_mutex);
1856
1857 if (arvif->u.sta.uapsd)
1858 value = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER;
1859 else
1860 value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
1861
1862 param = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
1863 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param, value);
1864 if (ret) {
1865 ath10k_warn(ar, "failed to submit ps wake threshold %u on vdev %i: %d\n",
1866 value, arvif->vdev_id, ret);
1867 return ret;
1868 }
1869
1870 return 0;
1871 }
1872
ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif * arvif)1873 static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1874 {
1875 struct ath10k *ar = arvif->ar;
1876 u32 param;
1877 u32 value;
1878 int ret;
1879
1880 lockdep_assert_held(&arvif->ar->conf_mutex);
1881
1882 if (arvif->u.sta.uapsd)
1883 value = WMI_STA_PS_PSPOLL_COUNT_UAPSD;
1884 else
1885 value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
1886
1887 param = WMI_STA_PS_PARAM_PSPOLL_COUNT;
1888 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
1889 param, value);
1890 if (ret) {
1891 ath10k_warn(ar, "failed to submit ps poll count %u on vdev %i: %d\n",
1892 value, arvif->vdev_id, ret);
1893 return ret;
1894 }
1895
1896 return 0;
1897 }
1898
ath10k_mac_num_vifs_started(struct ath10k * ar)1899 static int ath10k_mac_num_vifs_started(struct ath10k *ar)
1900 {
1901 struct ath10k_vif *arvif;
1902 int num = 0;
1903
1904 lockdep_assert_held(&ar->conf_mutex);
1905
1906 list_for_each_entry(arvif, &ar->arvifs, list)
1907 if (arvif->is_started)
1908 num++;
1909
1910 return num;
1911 }
1912
ath10k_mac_vif_setup_ps(struct ath10k_vif * arvif)1913 static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1914 {
1915 struct ath10k *ar = arvif->ar;
1916 struct ieee80211_vif *vif = arvif->vif;
1917 struct ieee80211_conf *conf = &ar->hw->conf;
1918 enum wmi_sta_powersave_param param;
1919 enum wmi_sta_ps_mode psmode;
1920 int ret;
1921 int ps_timeout;
1922 bool enable_ps;
1923
1924 lockdep_assert_held(&arvif->ar->conf_mutex);
1925
1926 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1927 return 0;
1928
1929 enable_ps = arvif->ps;
1930
1931 if (enable_ps && ath10k_mac_num_vifs_started(ar) > 1 &&
1932 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1933 ar->running_fw->fw_file.fw_features)) {
1934 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1935 arvif->vdev_id);
1936 enable_ps = false;
1937 }
1938
1939 if (!arvif->is_started) {
1940 /* mac80211 can update vif powersave state while disconnected.
1941 * Firmware doesn't behave nicely and consumes more power than
1942 * necessary if PS is disabled on a non-started vdev. Hence
1943 * force-enable PS for non-running vdevs.
1944 */
1945 psmode = WMI_STA_PS_MODE_ENABLED;
1946 } else if (enable_ps) {
1947 psmode = WMI_STA_PS_MODE_ENABLED;
1948 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1949
1950 ps_timeout = conf->dynamic_ps_timeout;
1951 if (ps_timeout == 0) {
1952 /* Firmware doesn't like 0 */
1953 ps_timeout = ieee80211_tu_to_usec(
1954 vif->bss_conf.beacon_int) / 1000;
1955 }
1956
1957 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1958 ps_timeout);
1959 if (ret) {
1960 ath10k_warn(ar, "failed to set inactivity time for vdev %d: %i\n",
1961 arvif->vdev_id, ret);
1962 return ret;
1963 }
1964 } else {
1965 psmode = WMI_STA_PS_MODE_DISABLED;
1966 }
1967
1968 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d psmode %s\n",
1969 arvif->vdev_id, psmode ? "enable" : "disable");
1970
1971 ret = ath10k_wmi_set_psmode(ar, arvif->vdev_id, psmode);
1972 if (ret) {
1973 ath10k_warn(ar, "failed to set PS Mode %d for vdev %d: %d\n",
1974 psmode, arvif->vdev_id, ret);
1975 return ret;
1976 }
1977
1978 return 0;
1979 }
1980
ath10k_mac_vif_disable_keepalive(struct ath10k_vif * arvif)1981 static int ath10k_mac_vif_disable_keepalive(struct ath10k_vif *arvif)
1982 {
1983 struct ath10k *ar = arvif->ar;
1984 struct wmi_sta_keepalive_arg arg = {};
1985 int ret;
1986
1987 lockdep_assert_held(&arvif->ar->conf_mutex);
1988
1989 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
1990 return 0;
1991
1992 if (!test_bit(WMI_SERVICE_STA_KEEP_ALIVE, ar->wmi.svc_map))
1993 return 0;
1994
1995 /* Some firmware revisions have a bug and ignore the `enabled` field.
1996 * Instead use the interval to disable the keepalive.
1997 */
1998 arg.vdev_id = arvif->vdev_id;
1999 arg.enabled = 1;
2000 arg.method = WMI_STA_KEEPALIVE_METHOD_NULL_FRAME;
2001 arg.interval = WMI_STA_KEEPALIVE_INTERVAL_DISABLE;
2002
2003 ret = ath10k_wmi_sta_keepalive(ar, &arg);
2004 if (ret) {
2005 ath10k_warn(ar, "failed to submit keepalive on vdev %i: %d\n",
2006 arvif->vdev_id, ret);
2007 return ret;
2008 }
2009
2010 return 0;
2011 }
2012
ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif * arvif)2013 static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
2014 {
2015 struct ath10k *ar = arvif->ar;
2016 struct ieee80211_vif *vif = arvif->vif;
2017 int ret;
2018
2019 lockdep_assert_held(&arvif->ar->conf_mutex);
2020
2021 if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
2022 return;
2023
2024 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
2025 return;
2026
2027 if (!vif->csa_active)
2028 return;
2029
2030 if (!arvif->is_up)
2031 return;
2032
2033 if (!ieee80211_beacon_cntdwn_is_complete(vif)) {
2034 ieee80211_beacon_update_cntdwn(vif);
2035
2036 ret = ath10k_mac_setup_bcn_tmpl(arvif);
2037 if (ret)
2038 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
2039 ret);
2040
2041 ret = ath10k_mac_setup_prb_tmpl(arvif);
2042 if (ret)
2043 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
2044 ret);
2045 } else {
2046 ieee80211_csa_finish(vif);
2047 }
2048 }
2049
ath10k_mac_vif_ap_csa_work(struct work_struct * work)2050 static void ath10k_mac_vif_ap_csa_work(struct work_struct *work)
2051 {
2052 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2053 ap_csa_work);
2054 struct ath10k *ar = arvif->ar;
2055
2056 mutex_lock(&ar->conf_mutex);
2057 ath10k_mac_vif_ap_csa_count_down(arvif);
2058 mutex_unlock(&ar->conf_mutex);
2059 }
2060
ath10k_mac_handle_beacon_iter(void * data,u8 * mac,struct ieee80211_vif * vif)2061 static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
2062 struct ieee80211_vif *vif)
2063 {
2064 struct sk_buff *skb = data;
2065 struct ieee80211_mgmt *mgmt = (void *)skb->data;
2066 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2067
2068 if (vif->type != NL80211_IFTYPE_STATION)
2069 return;
2070
2071 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
2072 return;
2073
2074 cancel_delayed_work(&arvif->connection_loss_work);
2075 }
2076
ath10k_mac_handle_beacon(struct ath10k * ar,struct sk_buff * skb)2077 void ath10k_mac_handle_beacon(struct ath10k *ar, struct sk_buff *skb)
2078 {
2079 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2080 ATH10K_ITER_NORMAL_FLAGS,
2081 ath10k_mac_handle_beacon_iter,
2082 skb);
2083 }
2084
ath10k_mac_handle_beacon_miss_iter(void * data,u8 * mac,struct ieee80211_vif * vif)2085 static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
2086 struct ieee80211_vif *vif)
2087 {
2088 u32 *vdev_id = data;
2089 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2090 struct ath10k *ar = arvif->ar;
2091 struct ieee80211_hw *hw = ar->hw;
2092
2093 if (arvif->vdev_id != *vdev_id)
2094 return;
2095
2096 if (!arvif->is_up)
2097 return;
2098
2099 ieee80211_beacon_loss(vif);
2100
2101 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
2102 * (done by mac80211) succeeds but beacons do not resume then it
2103 * doesn't make sense to continue operation. Queue connection loss work
2104 * which can be cancelled when beacon is received.
2105 */
2106 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
2107 ATH10K_CONNECTION_LOSS_HZ);
2108 }
2109
ath10k_mac_handle_beacon_miss(struct ath10k * ar,u32 vdev_id)2110 void ath10k_mac_handle_beacon_miss(struct ath10k *ar, u32 vdev_id)
2111 {
2112 ieee80211_iterate_active_interfaces_atomic(ar->hw,
2113 ATH10K_ITER_NORMAL_FLAGS,
2114 ath10k_mac_handle_beacon_miss_iter,
2115 &vdev_id);
2116 }
2117
ath10k_mac_vif_sta_connection_loss_work(struct work_struct * work)2118 static void ath10k_mac_vif_sta_connection_loss_work(struct work_struct *work)
2119 {
2120 struct ath10k_vif *arvif = container_of(work, struct ath10k_vif,
2121 connection_loss_work.work);
2122 struct ieee80211_vif *vif = arvif->vif;
2123
2124 if (!arvif->is_up)
2125 return;
2126
2127 ieee80211_connection_loss(vif);
2128 }
2129
2130 /**********************/
2131 /* Station management */
2132 /**********************/
2133
ath10k_peer_assoc_h_listen_intval(struct ath10k * ar,struct ieee80211_vif * vif)2134 static u32 ath10k_peer_assoc_h_listen_intval(struct ath10k *ar,
2135 struct ieee80211_vif *vif)
2136 {
2137 /* Some firmware revisions have unstable STA powersave when listen
2138 * interval is set too high (e.g. 5). The symptoms are firmware doesn't
2139 * generate NullFunc frames properly even if buffered frames have been
2140 * indicated in Beacon TIM. Firmware would seldom wake up to pull
2141 * buffered frames. Often pinging the device from AP would simply fail.
2142 *
2143 * As a workaround set it to 1.
2144 */
2145 if (vif->type == NL80211_IFTYPE_STATION)
2146 return 1;
2147
2148 return ar->hw->conf.listen_interval;
2149 }
2150
ath10k_peer_assoc_h_basic(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2151 static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
2152 struct ieee80211_vif *vif,
2153 struct ieee80211_sta *sta,
2154 struct wmi_peer_assoc_complete_arg *arg)
2155 {
2156 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2157 u32 aid;
2158
2159 lockdep_assert_held(&ar->conf_mutex);
2160
2161 if (vif->type == NL80211_IFTYPE_STATION)
2162 aid = vif->bss_conf.aid;
2163 else
2164 aid = sta->aid;
2165
2166 ether_addr_copy(arg->addr, sta->addr);
2167 arg->vdev_id = arvif->vdev_id;
2168 arg->peer_aid = aid;
2169 arg->peer_flags |= arvif->ar->wmi.peer_flags->auth;
2170 arg->peer_listen_intval = ath10k_peer_assoc_h_listen_intval(ar, vif);
2171 arg->peer_num_spatial_streams = 1;
2172 arg->peer_caps = vif->bss_conf.assoc_capability;
2173 }
2174
ath10k_peer_assoc_h_crypto(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2175 static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
2176 struct ieee80211_vif *vif,
2177 struct ieee80211_sta *sta,
2178 struct wmi_peer_assoc_complete_arg *arg)
2179 {
2180 struct ieee80211_bss_conf *info = &vif->bss_conf;
2181 struct cfg80211_chan_def def;
2182 struct cfg80211_bss *bss;
2183 const u8 *rsnie = NULL;
2184 const u8 *wpaie = NULL;
2185
2186 lockdep_assert_held(&ar->conf_mutex);
2187
2188 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2189 return;
2190
2191 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid,
2192 info->ssid_len ? info->ssid : NULL, info->ssid_len,
2193 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
2194 if (bss) {
2195 const struct cfg80211_bss_ies *ies;
2196
2197 rcu_read_lock();
2198 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
2199
2200 ies = rcu_dereference(bss->ies);
2201
2202 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
2203 WLAN_OUI_TYPE_MICROSOFT_WPA,
2204 ies->data,
2205 ies->len);
2206 rcu_read_unlock();
2207 cfg80211_put_bss(ar->hw->wiphy, bss);
2208 }
2209
2210 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
2211 if (rsnie || wpaie) {
2212 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: rsn ie found\n", __func__);
2213 arg->peer_flags |= ar->wmi.peer_flags->need_ptk_4_way;
2214 }
2215
2216 if (wpaie) {
2217 ath10k_dbg(ar, ATH10K_DBG_WMI, "%s: wpa ie found\n", __func__);
2218 arg->peer_flags |= ar->wmi.peer_flags->need_gtk_2_way;
2219 }
2220
2221 if (sta->mfp &&
2222 test_bit(ATH10K_FW_FEATURE_MFP_SUPPORT,
2223 ar->running_fw->fw_file.fw_features)) {
2224 arg->peer_flags |= ar->wmi.peer_flags->pmf;
2225 }
2226 }
2227
ath10k_peer_assoc_h_rates(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2228 static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
2229 struct ieee80211_vif *vif,
2230 struct ieee80211_sta *sta,
2231 struct wmi_peer_assoc_complete_arg *arg)
2232 {
2233 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2234 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
2235 struct cfg80211_chan_def def;
2236 const struct ieee80211_supported_band *sband;
2237 const struct ieee80211_rate *rates;
2238 enum nl80211_band band;
2239 u32 ratemask;
2240 u8 rate;
2241 int i;
2242
2243 lockdep_assert_held(&ar->conf_mutex);
2244
2245 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2246 return;
2247
2248 band = def.chan->band;
2249 sband = ar->hw->wiphy->bands[band];
2250 ratemask = sta->supp_rates[band];
2251 ratemask &= arvif->bitrate_mask.control[band].legacy;
2252 rates = sband->bitrates;
2253
2254 rateset->num_rates = 0;
2255
2256 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2257 if (!(ratemask & 1))
2258 continue;
2259
2260 rate = ath10k_mac_bitrate_to_rate(rates->bitrate);
2261 rateset->rates[rateset->num_rates] = rate;
2262 rateset->num_rates++;
2263 }
2264 }
2265
2266 static bool
ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])2267 ath10k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
2268 {
2269 int nss;
2270
2271 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2272 if (ht_mcs_mask[nss])
2273 return false;
2274
2275 return true;
2276 }
2277
2278 static bool
ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])2279 ath10k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
2280 {
2281 int nss;
2282
2283 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2284 if (vht_mcs_mask[nss])
2285 return false;
2286
2287 return true;
2288 }
2289
ath10k_peer_assoc_h_ht(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2290 static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
2291 struct ieee80211_vif *vif,
2292 struct ieee80211_sta *sta,
2293 struct wmi_peer_assoc_complete_arg *arg)
2294 {
2295 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2296 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2297 struct cfg80211_chan_def def;
2298 enum nl80211_band band;
2299 const u8 *ht_mcs_mask;
2300 const u16 *vht_mcs_mask;
2301 int i, n;
2302 u8 max_nss;
2303 u32 stbc;
2304
2305 lockdep_assert_held(&ar->conf_mutex);
2306
2307 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2308 return;
2309
2310 if (!ht_cap->ht_supported)
2311 return;
2312
2313 band = def.chan->band;
2314 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2315 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2316
2317 if (ath10k_peer_assoc_h_ht_masked(ht_mcs_mask) &&
2318 ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2319 return;
2320
2321 arg->peer_flags |= ar->wmi.peer_flags->ht;
2322 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2323 ht_cap->ampdu_factor)) - 1;
2324
2325 arg->peer_mpdu_density =
2326 ath10k_parse_mpdudensity(ht_cap->ampdu_density);
2327
2328 arg->peer_ht_caps = ht_cap->cap;
2329 arg->peer_rate_caps |= WMI_RC_HT_FLAG;
2330
2331 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2332 arg->peer_flags |= ar->wmi.peer_flags->ldbc;
2333
2334 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2335 arg->peer_flags |= ar->wmi.peer_flags->bw40;
2336 arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
2337 }
2338
2339 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
2340 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20)
2341 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2342
2343 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40)
2344 arg->peer_rate_caps |= WMI_RC_SGI_FLAG;
2345 }
2346
2347 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2348 arg->peer_rate_caps |= WMI_RC_TX_STBC_FLAG;
2349 arg->peer_flags |= ar->wmi.peer_flags->stbc;
2350 }
2351
2352 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2353 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2354 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2355 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
2356 arg->peer_rate_caps |= stbc;
2357 arg->peer_flags |= ar->wmi.peer_flags->stbc;
2358 }
2359
2360 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2361 arg->peer_rate_caps |= WMI_RC_TS_FLAG;
2362 else if (ht_cap->mcs.rx_mask[1])
2363 arg->peer_rate_caps |= WMI_RC_DS_FLAG;
2364
2365 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2366 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2367 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2368 max_nss = (i / 8) + 1;
2369 arg->peer_ht_rates.rates[n++] = i;
2370 }
2371
2372 /*
2373 * This is a workaround for HT-enabled STAs which break the spec
2374 * and have no HT capabilities RX mask (no HT RX MCS map).
2375 *
2376 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2377 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2378 *
2379 * Firmware asserts if such situation occurs.
2380 */
2381 if (n == 0) {
2382 arg->peer_ht_rates.num_rates = 8;
2383 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2384 arg->peer_ht_rates.rates[i] = i;
2385 } else {
2386 arg->peer_ht_rates.num_rates = n;
2387 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2388 }
2389
2390 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2391 arg->addr,
2392 arg->peer_ht_rates.num_rates,
2393 arg->peer_num_spatial_streams);
2394 }
2395
ath10k_peer_assoc_qos_ap(struct ath10k * ar,struct ath10k_vif * arvif,struct ieee80211_sta * sta)2396 static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
2397 struct ath10k_vif *arvif,
2398 struct ieee80211_sta *sta)
2399 {
2400 u32 uapsd = 0;
2401 u32 max_sp = 0;
2402 int ret = 0;
2403
2404 lockdep_assert_held(&ar->conf_mutex);
2405
2406 if (sta->wme && sta->uapsd_queues) {
2407 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2408 sta->uapsd_queues, sta->max_sp);
2409
2410 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2411 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2412 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2413 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2414 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2415 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2416 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2417 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2418 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2419 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2420 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2421 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2422
2423 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2424 max_sp = sta->max_sp;
2425
2426 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2427 sta->addr,
2428 WMI_AP_PS_PEER_PARAM_UAPSD,
2429 uapsd);
2430 if (ret) {
2431 ath10k_warn(ar, "failed to set ap ps peer param uapsd for vdev %i: %d\n",
2432 arvif->vdev_id, ret);
2433 return ret;
2434 }
2435
2436 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id,
2437 sta->addr,
2438 WMI_AP_PS_PEER_PARAM_MAX_SP,
2439 max_sp);
2440 if (ret) {
2441 ath10k_warn(ar, "failed to set ap ps peer param max sp for vdev %i: %d\n",
2442 arvif->vdev_id, ret);
2443 return ret;
2444 }
2445
2446 /* TODO setup this based on STA listen interval and
2447 * beacon interval. Currently we don't know
2448 * sta->listen_interval - mac80211 patch required.
2449 * Currently use 10 seconds
2450 */
2451 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
2452 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
2453 10);
2454 if (ret) {
2455 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
2456 arvif->vdev_id, ret);
2457 return ret;
2458 }
2459 }
2460
2461 return 0;
2462 }
2463
2464 static u16
ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])2465 ath10k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2466 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2467 {
2468 int idx_limit;
2469 int nss;
2470 u16 mcs_map;
2471 u16 mcs;
2472
2473 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2474 mcs_map = ath10k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2475 vht_mcs_limit[nss];
2476
2477 if (mcs_map)
2478 idx_limit = fls(mcs_map) - 1;
2479 else
2480 idx_limit = -1;
2481
2482 switch (idx_limit) {
2483 case 0:
2484 case 1:
2485 case 2:
2486 case 3:
2487 case 4:
2488 case 5:
2489 case 6:
2490 default:
2491 /* see ath10k_mac_can_set_bitrate_mask() */
2492 WARN_ON(1);
2493 fallthrough;
2494 case -1:
2495 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2496 break;
2497 case 7:
2498 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2499 break;
2500 case 8:
2501 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2502 break;
2503 case 9:
2504 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2505 break;
2506 }
2507
2508 tx_mcs_set &= ~(0x3 << (nss * 2));
2509 tx_mcs_set |= mcs << (nss * 2);
2510 }
2511
2512 return tx_mcs_set;
2513 }
2514
get_160mhz_nss_from_maxrate(int rate)2515 static u32 get_160mhz_nss_from_maxrate(int rate)
2516 {
2517 u32 nss;
2518
2519 switch (rate) {
2520 case 780:
2521 nss = 1;
2522 break;
2523 case 1560:
2524 nss = 2;
2525 break;
2526 case 2106:
2527 nss = 3; /* not support MCS9 from spec*/
2528 break;
2529 case 3120:
2530 nss = 4;
2531 break;
2532 default:
2533 nss = 1;
2534 }
2535
2536 return nss;
2537 }
2538
ath10k_peer_assoc_h_vht(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2539 static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
2540 struct ieee80211_vif *vif,
2541 struct ieee80211_sta *sta,
2542 struct wmi_peer_assoc_complete_arg *arg)
2543 {
2544 const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
2545 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2546 struct ath10k_hw_params *hw = &ar->hw_params;
2547 struct cfg80211_chan_def def;
2548 enum nl80211_band band;
2549 const u16 *vht_mcs_mask;
2550 u8 ampdu_factor;
2551 u8 max_nss, vht_mcs;
2552 int i;
2553
2554 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2555 return;
2556
2557 if (!vht_cap->vht_supported)
2558 return;
2559
2560 band = def.chan->band;
2561 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2562
2563 if (ath10k_peer_assoc_h_vht_masked(vht_mcs_mask))
2564 return;
2565
2566 arg->peer_flags |= ar->wmi.peer_flags->vht;
2567
2568 if (def.chan->band == NL80211_BAND_2GHZ)
2569 arg->peer_flags |= ar->wmi.peer_flags->vht_2g;
2570
2571 arg->peer_vht_caps = vht_cap->cap;
2572
2573 ampdu_factor = (vht_cap->cap &
2574 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2575 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2576
2577 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2578 * zero in VHT IE. Using it would result in degraded throughput.
2579 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2580 * it if VHT max_mpdu is smaller.
2581 */
2582 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2583 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2584 ampdu_factor)) - 1);
2585
2586 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2587 arg->peer_flags |= ar->wmi.peer_flags->bw80;
2588
2589 if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
2590 arg->peer_flags |= ar->wmi.peer_flags->bw160;
2591
2592 /* Calculate peer NSS capability from VHT capabilities if STA
2593 * supports VHT.
2594 */
2595 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2596 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2597 (2 * i) & 3;
2598
2599 if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
2600 vht_mcs_mask[i])
2601 max_nss = i + 1;
2602 }
2603 arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
2604 arg->peer_vht_rates.rx_max_rate =
2605 __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2606 arg->peer_vht_rates.rx_mcs_set =
2607 __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2608 arg->peer_vht_rates.tx_max_rate =
2609 __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2610 arg->peer_vht_rates.tx_mcs_set = ath10k_peer_assoc_h_vht_limit(
2611 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2612
2613 /* Configure bandwidth-NSS mapping to FW
2614 * for the chip's tx chains setting on 160Mhz bw
2615 */
2616 if (arg->peer_phymode == MODE_11AC_VHT160 ||
2617 arg->peer_phymode == MODE_11AC_VHT80_80) {
2618 u32 rx_nss;
2619 u32 max_rate;
2620
2621 max_rate = arg->peer_vht_rates.rx_max_rate;
2622 rx_nss = get_160mhz_nss_from_maxrate(max_rate);
2623
2624 if (rx_nss == 0)
2625 rx_nss = arg->peer_num_spatial_streams;
2626 else
2627 rx_nss = min(arg->peer_num_spatial_streams, rx_nss);
2628
2629 max_rate = hw->vht160_mcs_tx_highest;
2630 rx_nss = min(rx_nss, get_160mhz_nss_from_maxrate(max_rate));
2631
2632 arg->peer_bw_rxnss_override =
2633 FIELD_PREP(WMI_PEER_NSS_MAP_ENABLE, 1) |
2634 FIELD_PREP(WMI_PEER_NSS_160MHZ_MASK, (rx_nss - 1));
2635
2636 if (arg->peer_phymode == MODE_11AC_VHT80_80) {
2637 arg->peer_bw_rxnss_override |=
2638 FIELD_PREP(WMI_PEER_NSS_80_80MHZ_MASK, (rx_nss - 1));
2639 }
2640 }
2641 ath10k_dbg(ar, ATH10K_DBG_MAC,
2642 "mac vht peer %pM max_mpdu %d flags 0x%x peer_rx_nss_override 0x%x\n",
2643 sta->addr, arg->peer_max_mpdu,
2644 arg->peer_flags, arg->peer_bw_rxnss_override);
2645 }
2646
ath10k_peer_assoc_h_qos(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2647 static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
2648 struct ieee80211_vif *vif,
2649 struct ieee80211_sta *sta,
2650 struct wmi_peer_assoc_complete_arg *arg)
2651 {
2652 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2653
2654 switch (arvif->vdev_type) {
2655 case WMI_VDEV_TYPE_AP:
2656 if (sta->wme)
2657 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2658
2659 if (sta->wme && sta->uapsd_queues) {
2660 arg->peer_flags |= arvif->ar->wmi.peer_flags->apsd;
2661 arg->peer_rate_caps |= WMI_RC_UAPSD_FLAG;
2662 }
2663 break;
2664 case WMI_VDEV_TYPE_STA:
2665 if (sta->wme)
2666 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2667 break;
2668 case WMI_VDEV_TYPE_IBSS:
2669 if (sta->wme)
2670 arg->peer_flags |= arvif->ar->wmi.peer_flags->qos;
2671 break;
2672 default:
2673 break;
2674 }
2675
2676 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM qos %d\n",
2677 sta->addr, !!(arg->peer_flags &
2678 arvif->ar->wmi.peer_flags->qos));
2679 }
2680
ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta * sta)2681 static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2682 {
2683 return sta->supp_rates[NL80211_BAND_2GHZ] >>
2684 ATH10K_MAC_FIRST_OFDM_RATE_IDX;
2685 }
2686
ath10k_mac_get_phymode_vht(struct ath10k * ar,struct ieee80211_sta * sta)2687 static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
2688 struct ieee80211_sta *sta)
2689 {
2690 if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2691 switch (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2692 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2693 return MODE_11AC_VHT160;
2694 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2695 return MODE_11AC_VHT80_80;
2696 default:
2697 /* not sure if this is a valid case? */
2698 return MODE_11AC_VHT160;
2699 }
2700 }
2701
2702 if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2703 return MODE_11AC_VHT80;
2704
2705 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2706 return MODE_11AC_VHT40;
2707
2708 if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2709 return MODE_11AC_VHT20;
2710
2711 return MODE_UNKNOWN;
2712 }
2713
ath10k_peer_assoc_h_phymode(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2714 static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
2715 struct ieee80211_vif *vif,
2716 struct ieee80211_sta *sta,
2717 struct wmi_peer_assoc_complete_arg *arg)
2718 {
2719 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2720 struct cfg80211_chan_def def;
2721 enum nl80211_band band;
2722 const u8 *ht_mcs_mask;
2723 const u16 *vht_mcs_mask;
2724 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2725
2726 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
2727 return;
2728
2729 band = def.chan->band;
2730 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2731 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2732
2733 switch (band) {
2734 case NL80211_BAND_2GHZ:
2735 if (sta->vht_cap.vht_supported &&
2736 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2737 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2738 phymode = MODE_11AC_VHT40;
2739 else
2740 phymode = MODE_11AC_VHT20;
2741 } else if (sta->ht_cap.ht_supported &&
2742 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2743 if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2744 phymode = MODE_11NG_HT40;
2745 else
2746 phymode = MODE_11NG_HT20;
2747 } else if (ath10k_mac_sta_has_ofdm_only(sta)) {
2748 phymode = MODE_11G;
2749 } else {
2750 phymode = MODE_11B;
2751 }
2752
2753 break;
2754 case NL80211_BAND_5GHZ:
2755 /*
2756 * Check VHT first.
2757 */
2758 if (sta->vht_cap.vht_supported &&
2759 !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2760 phymode = ath10k_mac_get_phymode_vht(ar, sta);
2761 } else if (sta->ht_cap.ht_supported &&
2762 !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2763 if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2764 phymode = MODE_11NA_HT40;
2765 else
2766 phymode = MODE_11NA_HT20;
2767 } else {
2768 phymode = MODE_11A;
2769 }
2770
2771 break;
2772 default:
2773 break;
2774 }
2775
2776 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac peer %pM phymode %s\n",
2777 sta->addr, ath10k_wmi_phymode_str(phymode));
2778
2779 arg->peer_phymode = phymode;
2780 WARN_ON(phymode == MODE_UNKNOWN);
2781 }
2782
ath10k_peer_assoc_prepare(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct wmi_peer_assoc_complete_arg * arg)2783 static int ath10k_peer_assoc_prepare(struct ath10k *ar,
2784 struct ieee80211_vif *vif,
2785 struct ieee80211_sta *sta,
2786 struct wmi_peer_assoc_complete_arg *arg)
2787 {
2788 lockdep_assert_held(&ar->conf_mutex);
2789
2790 memset(arg, 0, sizeof(*arg));
2791
2792 ath10k_peer_assoc_h_basic(ar, vif, sta, arg);
2793 ath10k_peer_assoc_h_crypto(ar, vif, sta, arg);
2794 ath10k_peer_assoc_h_rates(ar, vif, sta, arg);
2795 ath10k_peer_assoc_h_ht(ar, vif, sta, arg);
2796 ath10k_peer_assoc_h_phymode(ar, vif, sta, arg);
2797 ath10k_peer_assoc_h_vht(ar, vif, sta, arg);
2798 ath10k_peer_assoc_h_qos(ar, vif, sta, arg);
2799
2800 return 0;
2801 }
2802
2803 static const u32 ath10k_smps_map[] = {
2804 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
2805 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
2806 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
2807 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
2808 };
2809
ath10k_setup_peer_smps(struct ath10k * ar,struct ath10k_vif * arvif,const u8 * addr,const struct ieee80211_sta_ht_cap * ht_cap)2810 static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
2811 const u8 *addr,
2812 const struct ieee80211_sta_ht_cap *ht_cap)
2813 {
2814 int smps;
2815
2816 if (!ht_cap->ht_supported)
2817 return 0;
2818
2819 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2820 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2821
2822 if (smps >= ARRAY_SIZE(ath10k_smps_map))
2823 return -EINVAL;
2824
2825 return ath10k_wmi_peer_set_param(ar, arvif->vdev_id, addr,
2826 ar->wmi.peer_param->smps_state,
2827 ath10k_smps_map[smps]);
2828 }
2829
ath10k_mac_vif_recalc_txbf(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta_vht_cap vht_cap)2830 static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
2831 struct ieee80211_vif *vif,
2832 struct ieee80211_sta_vht_cap vht_cap)
2833 {
2834 struct ath10k_vif *arvif = (void *)vif->drv_priv;
2835 int ret;
2836 u32 param;
2837 u32 value;
2838
2839 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_AFTER_ASSOC)
2840 return 0;
2841
2842 if (!(ar->vht_cap_info &
2843 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2844 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
2845 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2846 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
2847 return 0;
2848
2849 param = ar->wmi.vdev_param->txbf;
2850 value = 0;
2851
2852 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
2853 return 0;
2854
2855 /* The following logic is correct. If a remote STA advertises support
2856 * for being a beamformer then we should enable us being a beamformee.
2857 */
2858
2859 if (ar->vht_cap_info &
2860 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
2861 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
2862 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
2863 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2864
2865 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
2866 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
2867 }
2868
2869 if (ar->vht_cap_info &
2870 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
2871 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
2872 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
2873 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2874
2875 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
2876 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
2877 }
2878
2879 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
2880 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
2881
2882 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
2883 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
2884
2885 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
2886 if (ret) {
2887 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
2888 value, ret);
2889 return ret;
2890 }
2891
2892 return 0;
2893 }
2894
ath10k_mac_is_connected(struct ath10k * ar)2895 static bool ath10k_mac_is_connected(struct ath10k *ar)
2896 {
2897 struct ath10k_vif *arvif;
2898
2899 list_for_each_entry(arvif, &ar->arvifs, list) {
2900 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
2901 return true;
2902 }
2903
2904 return false;
2905 }
2906
ath10k_mac_txpower_setup(struct ath10k * ar,int txpower)2907 static int ath10k_mac_txpower_setup(struct ath10k *ar, int txpower)
2908 {
2909 int ret;
2910 u32 param;
2911 int tx_power_2g, tx_power_5g;
2912 bool connected;
2913
2914 lockdep_assert_held(&ar->conf_mutex);
2915
2916 /* ath10k internally uses unit of 0.5 dBm so multiply by 2 */
2917 tx_power_2g = txpower * 2;
2918 tx_power_5g = txpower * 2;
2919
2920 connected = ath10k_mac_is_connected(ar);
2921
2922 if (connected && ar->tx_power_2g_limit)
2923 if (tx_power_2g > ar->tx_power_2g_limit)
2924 tx_power_2g = ar->tx_power_2g_limit;
2925
2926 if (connected && ar->tx_power_5g_limit)
2927 if (tx_power_5g > ar->tx_power_5g_limit)
2928 tx_power_5g = ar->tx_power_5g_limit;
2929
2930 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac txpower 2g: %d, 5g: %d\n",
2931 tx_power_2g, tx_power_5g);
2932
2933 param = ar->wmi.pdev_param->txpower_limit2g;
2934 ret = ath10k_wmi_pdev_set_param(ar, param, tx_power_2g);
2935 if (ret) {
2936 ath10k_warn(ar, "failed to set 2g txpower %d: %d\n",
2937 tx_power_2g, ret);
2938 return ret;
2939 }
2940
2941 param = ar->wmi.pdev_param->txpower_limit5g;
2942 ret = ath10k_wmi_pdev_set_param(ar, param, tx_power_5g);
2943 if (ret) {
2944 ath10k_warn(ar, "failed to set 5g txpower %d: %d\n",
2945 tx_power_5g, ret);
2946 return ret;
2947 }
2948
2949 return 0;
2950 }
2951
ath10k_mac_txpower_recalc(struct ath10k * ar)2952 static int ath10k_mac_txpower_recalc(struct ath10k *ar)
2953 {
2954 struct ath10k_vif *arvif;
2955 int ret, txpower = -1;
2956
2957 lockdep_assert_held(&ar->conf_mutex);
2958
2959 list_for_each_entry(arvif, &ar->arvifs, list) {
2960 /* txpower not initialized yet? */
2961 if (arvif->txpower == INT_MIN)
2962 continue;
2963
2964 if (txpower == -1)
2965 txpower = arvif->txpower;
2966 else
2967 txpower = min(txpower, arvif->txpower);
2968 }
2969
2970 if (txpower == -1)
2971 return 0;
2972
2973 ret = ath10k_mac_txpower_setup(ar, txpower);
2974 if (ret) {
2975 ath10k_warn(ar, "failed to setup tx power %d: %d\n",
2976 txpower, ret);
2977 return ret;
2978 }
2979
2980 return 0;
2981 }
2982
ath10k_mac_set_sar_power(struct ath10k * ar)2983 static int ath10k_mac_set_sar_power(struct ath10k *ar)
2984 {
2985 if (!ar->hw_params.dynamic_sar_support)
2986 return -EOPNOTSUPP;
2987
2988 if (!ath10k_mac_is_connected(ar))
2989 return 0;
2990
2991 /* if connected, then arvif->txpower must be valid */
2992 return ath10k_mac_txpower_recalc(ar);
2993 }
2994
ath10k_mac_set_sar_specs(struct ieee80211_hw * hw,const struct cfg80211_sar_specs * sar)2995 static int ath10k_mac_set_sar_specs(struct ieee80211_hw *hw,
2996 const struct cfg80211_sar_specs *sar)
2997 {
2998 const struct cfg80211_sar_sub_specs *sub_specs;
2999 struct ath10k *ar = hw->priv;
3000 u32 i;
3001 int ret;
3002
3003 mutex_lock(&ar->conf_mutex);
3004
3005 if (!ar->hw_params.dynamic_sar_support) {
3006 ret = -EOPNOTSUPP;
3007 goto err;
3008 }
3009
3010 if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
3011 sar->num_sub_specs == 0) {
3012 ret = -EINVAL;
3013 goto err;
3014 }
3015
3016 sub_specs = sar->sub_specs;
3017
3018 /* 0dbm is not a practical value for ath10k, so use 0
3019 * as no SAR limitation on it.
3020 */
3021 ar->tx_power_2g_limit = 0;
3022 ar->tx_power_5g_limit = 0;
3023
3024 /* note the power is in 0.25dbm unit, while ath10k uses
3025 * 0.5dbm unit.
3026 */
3027 for (i = 0; i < sar->num_sub_specs; i++) {
3028 if (sub_specs->freq_range_index == 0)
3029 ar->tx_power_2g_limit = sub_specs->power / 2;
3030 else if (sub_specs->freq_range_index == 1)
3031 ar->tx_power_5g_limit = sub_specs->power / 2;
3032
3033 sub_specs++;
3034 }
3035
3036 ret = ath10k_mac_set_sar_power(ar);
3037 if (ret) {
3038 ath10k_warn(ar, "failed to set sar power: %d", ret);
3039 goto err;
3040 }
3041
3042 err:
3043 mutex_unlock(&ar->conf_mutex);
3044 return ret;
3045 }
3046
3047 /* can be called only in mac80211 callbacks due to `key_count` usage */
ath10k_bss_assoc(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * bss_conf)3048 static void ath10k_bss_assoc(struct ieee80211_hw *hw,
3049 struct ieee80211_vif *vif,
3050 struct ieee80211_bss_conf *bss_conf)
3051 {
3052 struct ath10k *ar = hw->priv;
3053 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3054 struct ieee80211_sta_ht_cap ht_cap;
3055 struct ieee80211_sta_vht_cap vht_cap;
3056 struct wmi_peer_assoc_complete_arg peer_arg;
3057 struct ieee80211_sta *ap_sta;
3058 int ret;
3059
3060 lockdep_assert_held(&ar->conf_mutex);
3061
3062 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
3063 arvif->vdev_id, arvif->bssid, arvif->aid);
3064
3065 rcu_read_lock();
3066
3067 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3068 if (!ap_sta) {
3069 ath10k_warn(ar, "failed to find station entry for bss %pM vdev %i\n",
3070 bss_conf->bssid, arvif->vdev_id);
3071 rcu_read_unlock();
3072 return;
3073 }
3074
3075 /* ap_sta must be accessed only within rcu section which must be left
3076 * before calling ath10k_setup_peer_smps() which might sleep.
3077 */
3078 ht_cap = ap_sta->ht_cap;
3079 vht_cap = ap_sta->vht_cap;
3080
3081 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
3082 if (ret) {
3083 ath10k_warn(ar, "failed to prepare peer assoc for %pM vdev %i: %d\n",
3084 bss_conf->bssid, arvif->vdev_id, ret);
3085 rcu_read_unlock();
3086 return;
3087 }
3088
3089 rcu_read_unlock();
3090
3091 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
3092 if (ret) {
3093 ath10k_warn(ar, "failed to run peer assoc for %pM vdev %i: %d\n",
3094 bss_conf->bssid, arvif->vdev_id, ret);
3095 return;
3096 }
3097
3098 ret = ath10k_setup_peer_smps(ar, arvif, bss_conf->bssid, &ht_cap);
3099 if (ret) {
3100 ath10k_warn(ar, "failed to setup peer SMPS for vdev %i: %d\n",
3101 arvif->vdev_id, ret);
3102 return;
3103 }
3104
3105 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
3106 if (ret) {
3107 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
3108 arvif->vdev_id, bss_conf->bssid, ret);
3109 return;
3110 }
3111
3112 ath10k_dbg(ar, ATH10K_DBG_MAC,
3113 "mac vdev %d up (associated) bssid %pM aid %d\n",
3114 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
3115
3116 WARN_ON(arvif->is_up);
3117
3118 arvif->aid = bss_conf->aid;
3119 ether_addr_copy(arvif->bssid, bss_conf->bssid);
3120
3121 ret = ath10k_wmi_pdev_set_param(ar,
3122 ar->wmi.pdev_param->peer_stats_info_enable, 1);
3123 if (ret)
3124 ath10k_warn(ar, "failed to enable peer stats info: %d\n", ret);
3125
3126 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
3127 if (ret) {
3128 ath10k_warn(ar, "failed to set vdev %d up: %d\n",
3129 arvif->vdev_id, ret);
3130 return;
3131 }
3132
3133 arvif->is_up = true;
3134
3135 ath10k_mac_set_sar_power(ar);
3136
3137 /* Workaround: Some firmware revisions (tested with qca6174
3138 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
3139 * poked with peer param command.
3140 */
3141 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
3142 ar->wmi.peer_param->dummy_var, 1);
3143 if (ret) {
3144 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
3145 arvif->bssid, arvif->vdev_id, ret);
3146 return;
3147 }
3148 }
3149
ath10k_bss_disassoc(struct ieee80211_hw * hw,struct ieee80211_vif * vif)3150 static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
3151 struct ieee80211_vif *vif)
3152 {
3153 struct ath10k *ar = hw->priv;
3154 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3155 struct ieee80211_sta_vht_cap vht_cap = {};
3156 int ret;
3157
3158 lockdep_assert_held(&ar->conf_mutex);
3159
3160 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3161 arvif->vdev_id, arvif->bssid);
3162
3163 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
3164 if (ret)
3165 ath10k_warn(ar, "failed to down vdev %i: %d\n",
3166 arvif->vdev_id, ret);
3167
3168 arvif->def_wep_key_idx = -1;
3169
3170 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
3171 if (ret) {
3172 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
3173 arvif->vdev_id, ret);
3174 return;
3175 }
3176
3177 arvif->is_up = false;
3178
3179 ath10k_mac_txpower_recalc(ar);
3180
3181 cancel_delayed_work_sync(&arvif->connection_loss_work);
3182 }
3183
ath10k_new_peer_tid_config(struct ath10k * ar,struct ieee80211_sta * sta,struct ath10k_vif * arvif)3184 static int ath10k_new_peer_tid_config(struct ath10k *ar,
3185 struct ieee80211_sta *sta,
3186 struct ath10k_vif *arvif)
3187 {
3188 struct wmi_per_peer_per_tid_cfg_arg arg = {};
3189 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
3190 bool config_apply;
3191 int ret, i;
3192
3193 for (i = 0; i < ATH10K_TID_MAX; i++) {
3194 config_apply = false;
3195 if (arvif->retry_long[i] || arvif->ampdu[i] ||
3196 arvif->rate_ctrl[i] || arvif->rtscts[i]) {
3197 config_apply = true;
3198 arg.tid = i;
3199 arg.vdev_id = arvif->vdev_id;
3200 arg.retry_count = arvif->retry_long[i];
3201 arg.aggr_control = arvif->ampdu[i];
3202 arg.rate_ctrl = arvif->rate_ctrl[i];
3203 arg.rcode_flags = arvif->rate_code[i];
3204
3205 if (arvif->rtscts[i])
3206 arg.ext_tid_cfg_bitmap =
3207 WMI_EXT_TID_RTS_CTS_CONFIG;
3208 else
3209 arg.ext_tid_cfg_bitmap = 0;
3210
3211 arg.rtscts_ctrl = arvif->rtscts[i];
3212 }
3213
3214 if (arvif->noack[i]) {
3215 arg.ack_policy = arvif->noack[i];
3216 arg.rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE;
3217 arg.aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
3218 config_apply = true;
3219 }
3220
3221 /* Assign default value(-1) to newly connected station.
3222 * This is to identify station specific tid configuration not
3223 * configured for the station.
3224 */
3225 arsta->retry_long[i] = -1;
3226 arsta->noack[i] = -1;
3227 arsta->ampdu[i] = -1;
3228
3229 if (!config_apply)
3230 continue;
3231
3232 ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
3233
3234 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
3235 if (ret) {
3236 ath10k_warn(ar, "failed to set per tid retry/aggr config for sta %pM: %d\n",
3237 sta->addr, ret);
3238 return ret;
3239 }
3240
3241 memset(&arg, 0, sizeof(arg));
3242 }
3243
3244 return 0;
3245 }
3246
ath10k_station_assoc(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,bool reassoc)3247 static int ath10k_station_assoc(struct ath10k *ar,
3248 struct ieee80211_vif *vif,
3249 struct ieee80211_sta *sta,
3250 bool reassoc)
3251 {
3252 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3253 struct wmi_peer_assoc_complete_arg peer_arg;
3254 int ret = 0;
3255
3256 lockdep_assert_held(&ar->conf_mutex);
3257
3258 ret = ath10k_peer_assoc_prepare(ar, vif, sta, &peer_arg);
3259 if (ret) {
3260 ath10k_warn(ar, "failed to prepare WMI peer assoc for %pM vdev %i: %i\n",
3261 sta->addr, arvif->vdev_id, ret);
3262 return ret;
3263 }
3264
3265 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
3266 if (ret) {
3267 ath10k_warn(ar, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3268 sta->addr, arvif->vdev_id, ret);
3269 return ret;
3270 }
3271
3272 /* Re-assoc is run only to update supported rates for given station. It
3273 * doesn't make much sense to reconfigure the peer completely.
3274 */
3275 if (!reassoc) {
3276 ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
3277 &sta->ht_cap);
3278 if (ret) {
3279 ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
3280 arvif->vdev_id, ret);
3281 return ret;
3282 }
3283
3284 ret = ath10k_peer_assoc_qos_ap(ar, arvif, sta);
3285 if (ret) {
3286 ath10k_warn(ar, "failed to set qos params for STA %pM for vdev %i: %d\n",
3287 sta->addr, arvif->vdev_id, ret);
3288 return ret;
3289 }
3290
3291 if (!sta->wme) {
3292 arvif->num_legacy_stations++;
3293 ret = ath10k_recalc_rtscts_prot(arvif);
3294 if (ret) {
3295 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3296 arvif->vdev_id, ret);
3297 return ret;
3298 }
3299 }
3300
3301 /* Plumb cached keys only for static WEP */
3302 if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) {
3303 ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
3304 if (ret) {
3305 ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
3306 arvif->vdev_id, ret);
3307 return ret;
3308 }
3309 }
3310 }
3311
3312 if (!test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map))
3313 return ret;
3314
3315 return ath10k_new_peer_tid_config(ar, sta, arvif);
3316 }
3317
ath10k_station_disassoc(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta)3318 static int ath10k_station_disassoc(struct ath10k *ar,
3319 struct ieee80211_vif *vif,
3320 struct ieee80211_sta *sta)
3321 {
3322 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3323 int ret = 0;
3324
3325 lockdep_assert_held(&ar->conf_mutex);
3326
3327 if (!sta->wme) {
3328 arvif->num_legacy_stations--;
3329 ret = ath10k_recalc_rtscts_prot(arvif);
3330 if (ret) {
3331 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
3332 arvif->vdev_id, ret);
3333 return ret;
3334 }
3335 }
3336
3337 ret = ath10k_clear_peer_keys(arvif, sta->addr);
3338 if (ret) {
3339 ath10k_warn(ar, "failed to clear all peer wep keys for vdev %i: %d\n",
3340 arvif->vdev_id, ret);
3341 return ret;
3342 }
3343
3344 return ret;
3345 }
3346
3347 /**************/
3348 /* Regulatory */
3349 /**************/
3350
ath10k_update_channel_list(struct ath10k * ar)3351 static int ath10k_update_channel_list(struct ath10k *ar)
3352 {
3353 struct ieee80211_hw *hw = ar->hw;
3354 struct ieee80211_supported_band **bands;
3355 enum nl80211_band band;
3356 struct ieee80211_channel *channel;
3357 struct wmi_scan_chan_list_arg arg = {0};
3358 struct wmi_channel_arg *ch;
3359 bool passive;
3360 int len;
3361 int ret;
3362 int i;
3363
3364 lockdep_assert_held(&ar->conf_mutex);
3365
3366 bands = hw->wiphy->bands;
3367 for (band = 0; band < NUM_NL80211_BANDS; band++) {
3368 if (!bands[band])
3369 continue;
3370
3371 for (i = 0; i < bands[band]->n_channels; i++) {
3372 if (bands[band]->channels[i].flags &
3373 IEEE80211_CHAN_DISABLED)
3374 continue;
3375
3376 arg.n_channels++;
3377 }
3378 }
3379
3380 len = sizeof(struct wmi_channel_arg) * arg.n_channels;
3381 arg.channels = kzalloc(len, GFP_KERNEL);
3382 if (!arg.channels)
3383 return -ENOMEM;
3384
3385 ch = arg.channels;
3386 for (band = 0; band < NUM_NL80211_BANDS; band++) {
3387 if (!bands[band])
3388 continue;
3389
3390 for (i = 0; i < bands[band]->n_channels; i++) {
3391 channel = &bands[band]->channels[i];
3392
3393 if (channel->flags & IEEE80211_CHAN_DISABLED)
3394 continue;
3395
3396 ch->allow_ht = true;
3397
3398 /* FIXME: when should we really allow VHT? */
3399 ch->allow_vht = true;
3400
3401 ch->allow_ibss =
3402 !(channel->flags & IEEE80211_CHAN_NO_IR);
3403
3404 ch->ht40plus =
3405 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
3406
3407 ch->chan_radar =
3408 !!(channel->flags & IEEE80211_CHAN_RADAR);
3409
3410 passive = channel->flags & IEEE80211_CHAN_NO_IR;
3411 ch->passive = passive;
3412
3413 /* the firmware is ignoring the "radar" flag of the
3414 * channel and is scanning actively using Probe Requests
3415 * on "Radar detection"/DFS channels which are not
3416 * marked as "available"
3417 */
3418 ch->passive |= ch->chan_radar;
3419
3420 ch->freq = channel->center_freq;
3421 ch->band_center_freq1 = channel->center_freq;
3422 ch->min_power = 0;
3423 ch->max_power = channel->max_power * 2;
3424 ch->max_reg_power = channel->max_reg_power * 2;
3425 ch->max_antenna_gain = channel->max_antenna_gain * 2;
3426 ch->reg_class_id = 0; /* FIXME */
3427
3428 /* FIXME: why use only legacy modes, why not any
3429 * HT/VHT modes? Would that even make any
3430 * difference?
3431 */
3432 if (channel->band == NL80211_BAND_2GHZ)
3433 ch->mode = MODE_11G;
3434 else
3435 ch->mode = MODE_11A;
3436
3437 if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
3438 continue;
3439
3440 ath10k_dbg(ar, ATH10K_DBG_WMI,
3441 "mac channel [%zd/%d] freq %d maxpower %d regpower %d antenna %d mode %d\n",
3442 ch - arg.channels, arg.n_channels,
3443 ch->freq, ch->max_power, ch->max_reg_power,
3444 ch->max_antenna_gain, ch->mode);
3445
3446 ch++;
3447 }
3448 }
3449
3450 ret = ath10k_wmi_scan_chan_list(ar, &arg);
3451 kfree(arg.channels);
3452
3453 return ret;
3454 }
3455
3456 static enum wmi_dfs_region
ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)3457 ath10k_mac_get_dfs_region(enum nl80211_dfs_regions dfs_region)
3458 {
3459 switch (dfs_region) {
3460 case NL80211_DFS_UNSET:
3461 return WMI_UNINIT_DFS_DOMAIN;
3462 case NL80211_DFS_FCC:
3463 return WMI_FCC_DFS_DOMAIN;
3464 case NL80211_DFS_ETSI:
3465 return WMI_ETSI_DFS_DOMAIN;
3466 case NL80211_DFS_JP:
3467 return WMI_MKK4_DFS_DOMAIN;
3468 }
3469 return WMI_UNINIT_DFS_DOMAIN;
3470 }
3471
ath10k_regd_update(struct ath10k * ar)3472 static void ath10k_regd_update(struct ath10k *ar)
3473 {
3474 struct reg_dmn_pair_mapping *regpair;
3475 int ret;
3476 enum wmi_dfs_region wmi_dfs_reg;
3477 enum nl80211_dfs_regions nl_dfs_reg;
3478
3479 lockdep_assert_held(&ar->conf_mutex);
3480
3481 ret = ath10k_update_channel_list(ar);
3482 if (ret)
3483 ath10k_warn(ar, "failed to update channel list: %d\n", ret);
3484
3485 regpair = ar->ath_common.regulatory.regpair;
3486
3487 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3488 nl_dfs_reg = ar->dfs_detector->region;
3489 wmi_dfs_reg = ath10k_mac_get_dfs_region(nl_dfs_reg);
3490 } else {
3491 wmi_dfs_reg = WMI_UNINIT_DFS_DOMAIN;
3492 }
3493
3494 /* Target allows setting up per-band regdomain but ath_common provides
3495 * a combined one only
3496 */
3497 ret = ath10k_wmi_pdev_set_regdomain(ar,
3498 regpair->reg_domain,
3499 regpair->reg_domain, /* 2ghz */
3500 regpair->reg_domain, /* 5ghz */
3501 regpair->reg_2ghz_ctl,
3502 regpair->reg_5ghz_ctl,
3503 wmi_dfs_reg);
3504 if (ret)
3505 ath10k_warn(ar, "failed to set pdev regdomain: %d\n", ret);
3506 }
3507
ath10k_mac_update_channel_list(struct ath10k * ar,struct ieee80211_supported_band * band)3508 static void ath10k_mac_update_channel_list(struct ath10k *ar,
3509 struct ieee80211_supported_band *band)
3510 {
3511 int i;
3512
3513 if (ar->low_5ghz_chan && ar->high_5ghz_chan) {
3514 for (i = 0; i < band->n_channels; i++) {
3515 if (band->channels[i].center_freq < ar->low_5ghz_chan ||
3516 band->channels[i].center_freq > ar->high_5ghz_chan)
3517 band->channels[i].flags |=
3518 IEEE80211_CHAN_DISABLED;
3519 }
3520 }
3521 }
3522
ath10k_reg_notifier(struct wiphy * wiphy,struct regulatory_request * request)3523 static void ath10k_reg_notifier(struct wiphy *wiphy,
3524 struct regulatory_request *request)
3525 {
3526 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
3527 struct ath10k *ar = hw->priv;
3528 bool result;
3529
3530 ath_reg_notifier_apply(wiphy, request, &ar->ath_common.regulatory);
3531
3532 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector) {
3533 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs region 0x%x\n",
3534 request->dfs_region);
3535 result = ar->dfs_detector->set_dfs_domain(ar->dfs_detector,
3536 request->dfs_region);
3537 if (!result)
3538 ath10k_warn(ar, "DFS region 0x%X not supported, will trigger radar for every pulse\n",
3539 request->dfs_region);
3540 }
3541
3542 mutex_lock(&ar->conf_mutex);
3543 if (ar->state == ATH10K_STATE_ON)
3544 ath10k_regd_update(ar);
3545 mutex_unlock(&ar->conf_mutex);
3546
3547 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
3548 ath10k_mac_update_channel_list(ar,
3549 ar->hw->wiphy->bands[NL80211_BAND_5GHZ]);
3550 }
3551
ath10k_stop_radar_confirmation(struct ath10k * ar)3552 static void ath10k_stop_radar_confirmation(struct ath10k *ar)
3553 {
3554 spin_lock_bh(&ar->data_lock);
3555 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_STOPPED;
3556 spin_unlock_bh(&ar->data_lock);
3557
3558 cancel_work_sync(&ar->radar_confirmation_work);
3559 }
3560
3561 /***************/
3562 /* TX handlers */
3563 /***************/
3564
3565 enum ath10k_mac_tx_path {
3566 ATH10K_MAC_TX_HTT,
3567 ATH10K_MAC_TX_HTT_MGMT,
3568 ATH10K_MAC_TX_WMI_MGMT,
3569 ATH10K_MAC_TX_UNKNOWN,
3570 };
3571
ath10k_mac_tx_lock(struct ath10k * ar,int reason)3572 void ath10k_mac_tx_lock(struct ath10k *ar, int reason)
3573 {
3574 lockdep_assert_held(&ar->htt.tx_lock);
3575
3576 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3577 ar->tx_paused |= BIT(reason);
3578 ieee80211_stop_queues(ar->hw);
3579 }
3580
ath10k_mac_tx_unlock_iter(void * data,u8 * mac,struct ieee80211_vif * vif)3581 static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
3582 struct ieee80211_vif *vif)
3583 {
3584 struct ath10k *ar = data;
3585 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3586
3587 if (arvif->tx_paused)
3588 return;
3589
3590 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3591 }
3592
ath10k_mac_tx_unlock(struct ath10k * ar,int reason)3593 void ath10k_mac_tx_unlock(struct ath10k *ar, int reason)
3594 {
3595 lockdep_assert_held(&ar->htt.tx_lock);
3596
3597 WARN_ON(reason >= ATH10K_TX_PAUSE_MAX);
3598 ar->tx_paused &= ~BIT(reason);
3599
3600 if (ar->tx_paused)
3601 return;
3602
3603 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3604 ATH10K_ITER_RESUME_FLAGS,
3605 ath10k_mac_tx_unlock_iter,
3606 ar);
3607
3608 ieee80211_wake_queue(ar->hw, ar->hw->offchannel_tx_hw_queue);
3609 }
3610
ath10k_mac_vif_tx_lock(struct ath10k_vif * arvif,int reason)3611 void ath10k_mac_vif_tx_lock(struct ath10k_vif *arvif, int reason)
3612 {
3613 struct ath10k *ar = arvif->ar;
3614
3615 lockdep_assert_held(&ar->htt.tx_lock);
3616
3617 WARN_ON(reason >= BITS_PER_LONG);
3618 arvif->tx_paused |= BIT(reason);
3619 ieee80211_stop_queue(ar->hw, arvif->vdev_id);
3620 }
3621
ath10k_mac_vif_tx_unlock(struct ath10k_vif * arvif,int reason)3622 void ath10k_mac_vif_tx_unlock(struct ath10k_vif *arvif, int reason)
3623 {
3624 struct ath10k *ar = arvif->ar;
3625
3626 lockdep_assert_held(&ar->htt.tx_lock);
3627
3628 WARN_ON(reason >= BITS_PER_LONG);
3629 arvif->tx_paused &= ~BIT(reason);
3630
3631 if (ar->tx_paused)
3632 return;
3633
3634 if (arvif->tx_paused)
3635 return;
3636
3637 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
3638 }
3639
ath10k_mac_vif_handle_tx_pause(struct ath10k_vif * arvif,enum wmi_tlv_tx_pause_id pause_id,enum wmi_tlv_tx_pause_action action)3640 static void ath10k_mac_vif_handle_tx_pause(struct ath10k_vif *arvif,
3641 enum wmi_tlv_tx_pause_id pause_id,
3642 enum wmi_tlv_tx_pause_action action)
3643 {
3644 struct ath10k *ar = arvif->ar;
3645
3646 lockdep_assert_held(&ar->htt.tx_lock);
3647
3648 switch (action) {
3649 case WMI_TLV_TX_PAUSE_ACTION_STOP:
3650 ath10k_mac_vif_tx_lock(arvif, pause_id);
3651 break;
3652 case WMI_TLV_TX_PAUSE_ACTION_WAKE:
3653 ath10k_mac_vif_tx_unlock(arvif, pause_id);
3654 break;
3655 default:
3656 ath10k_dbg(ar, ATH10K_DBG_BOOT,
3657 "received unknown tx pause action %d on vdev %i, ignoring\n",
3658 action, arvif->vdev_id);
3659 break;
3660 }
3661 }
3662
3663 struct ath10k_mac_tx_pause {
3664 u32 vdev_id;
3665 enum wmi_tlv_tx_pause_id pause_id;
3666 enum wmi_tlv_tx_pause_action action;
3667 };
3668
ath10k_mac_handle_tx_pause_iter(void * data,u8 * mac,struct ieee80211_vif * vif)3669 static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
3670 struct ieee80211_vif *vif)
3671 {
3672 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3673 struct ath10k_mac_tx_pause *arg = data;
3674
3675 if (arvif->vdev_id != arg->vdev_id)
3676 return;
3677
3678 ath10k_mac_vif_handle_tx_pause(arvif, arg->pause_id, arg->action);
3679 }
3680
ath10k_mac_handle_tx_pause_vdev(struct ath10k * ar,u32 vdev_id,enum wmi_tlv_tx_pause_id pause_id,enum wmi_tlv_tx_pause_action action)3681 void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
3682 enum wmi_tlv_tx_pause_id pause_id,
3683 enum wmi_tlv_tx_pause_action action)
3684 {
3685 struct ath10k_mac_tx_pause arg = {
3686 .vdev_id = vdev_id,
3687 .pause_id = pause_id,
3688 .action = action,
3689 };
3690
3691 spin_lock_bh(&ar->htt.tx_lock);
3692 ieee80211_iterate_active_interfaces_atomic(ar->hw,
3693 ATH10K_ITER_RESUME_FLAGS,
3694 ath10k_mac_handle_tx_pause_iter,
3695 &arg);
3696 spin_unlock_bh(&ar->htt.tx_lock);
3697 }
3698
3699 static enum ath10k_hw_txrx_mode
ath10k_mac_tx_h_get_txmode(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct sk_buff * skb)3700 ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
3701 struct ieee80211_vif *vif,
3702 struct ieee80211_sta *sta,
3703 struct sk_buff *skb)
3704 {
3705 const struct ieee80211_hdr *hdr = (void *)skb->data;
3706 const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
3707 __le16 fc = hdr->frame_control;
3708
3709 if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
3710 return ATH10K_HW_TXRX_RAW;
3711
3712 if (ieee80211_is_mgmt(fc))
3713 return ATH10K_HW_TXRX_MGMT;
3714
3715 /* Workaround:
3716 *
3717 * NullFunc frames are mostly used to ping if a client or AP are still
3718 * reachable and responsive. This implies tx status reports must be
3719 * accurate - otherwise either mac80211 or userspace (e.g. hostapd) can
3720 * come to a conclusion that the other end disappeared and tear down
3721 * BSS connection or it can never disconnect from BSS/client (which is
3722 * the case).
3723 *
3724 * Firmware with HTT older than 3.0 delivers incorrect tx status for
3725 * NullFunc frames to driver. However there's a HTT Mgmt Tx command
3726 * which seems to deliver correct tx reports for NullFunc frames. The
3727 * downside of using it is it ignores client powersave state so it can
3728 * end up disconnecting sleeping clients in AP mode. It should fix STA
3729 * mode though because AP don't sleep.
3730 */
3731 if (ar->htt.target_version_major < 3 &&
3732 (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) &&
3733 !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3734 ar->running_fw->fw_file.fw_features))
3735 return ATH10K_HW_TXRX_MGMT;
3736
3737 /* Workaround:
3738 *
3739 * Some wmi-tlv firmwares for qca6174 have broken Tx key selection for
3740 * NativeWifi txmode - it selects AP key instead of peer key. It seems
3741 * to work with Ethernet txmode so use it.
3742 *
3743 * FIXME: Check if raw mode works with TDLS.
3744 */
3745 if (ieee80211_is_data_present(fc) && sta && sta->tdls)
3746 return ATH10K_HW_TXRX_ETHERNET;
3747
3748 if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) ||
3749 skb_cb->flags & ATH10K_SKB_F_RAW_TX)
3750 return ATH10K_HW_TXRX_RAW;
3751
3752 return ATH10K_HW_TXRX_NATIVE_WIFI;
3753 }
3754
ath10k_tx_h_use_hwcrypto(struct ieee80211_vif * vif,struct sk_buff * skb)3755 static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
3756 struct sk_buff *skb)
3757 {
3758 const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3759 const struct ieee80211_hdr *hdr = (void *)skb->data;
3760 const u32 mask = IEEE80211_TX_INTFL_DONT_ENCRYPT |
3761 IEEE80211_TX_CTL_INJECTED;
3762
3763 if (!ieee80211_has_protected(hdr->frame_control))
3764 return false;
3765
3766 if ((info->flags & mask) == mask)
3767 return false;
3768
3769 if (vif)
3770 return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt;
3771
3772 return true;
3773 }
3774
3775 /* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
3776 * Control in the header.
3777 */
ath10k_tx_h_nwifi(struct ieee80211_hw * hw,struct sk_buff * skb)3778 static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
3779 {
3780 struct ieee80211_hdr *hdr = (void *)skb->data;
3781 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3782 u8 *qos_ctl;
3783
3784 if (!ieee80211_is_data_qos(hdr->frame_control))
3785 return;
3786
3787 qos_ctl = ieee80211_get_qos_ctl(hdr);
3788 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
3789 skb->data, (void *)qos_ctl - (void *)skb->data);
3790 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
3791
3792 /* Some firmware revisions don't handle sending QoS NullFunc well.
3793 * These frames are mainly used for CQM purposes so it doesn't really
3794 * matter whether QoS NullFunc or NullFunc are sent.
3795 */
3796 hdr = (void *)skb->data;
3797 if (ieee80211_is_qos_nullfunc(hdr->frame_control))
3798 cb->flags &= ~ATH10K_SKB_F_QOS;
3799
3800 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
3801 }
3802
ath10k_tx_h_8023(struct sk_buff * skb)3803 static void ath10k_tx_h_8023(struct sk_buff *skb)
3804 {
3805 struct ieee80211_hdr *hdr;
3806 struct rfc1042_hdr *rfc1042;
3807 struct ethhdr *eth;
3808 size_t hdrlen;
3809 u8 da[ETH_ALEN];
3810 u8 sa[ETH_ALEN];
3811 __be16 type;
3812
3813 hdr = (void *)skb->data;
3814 hdrlen = ieee80211_hdrlen(hdr->frame_control);
3815 rfc1042 = (void *)skb->data + hdrlen;
3816
3817 ether_addr_copy(da, ieee80211_get_DA(hdr));
3818 ether_addr_copy(sa, ieee80211_get_SA(hdr));
3819 type = rfc1042->snap_type;
3820
3821 skb_pull(skb, hdrlen + sizeof(*rfc1042));
3822 skb_push(skb, sizeof(*eth));
3823
3824 eth = (void *)skb->data;
3825 ether_addr_copy(eth->h_dest, da);
3826 ether_addr_copy(eth->h_source, sa);
3827 eth->h_proto = type;
3828 }
3829
ath10k_tx_h_add_p2p_noa_ie(struct ath10k * ar,struct ieee80211_vif * vif,struct sk_buff * skb)3830 static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
3831 struct ieee80211_vif *vif,
3832 struct sk_buff *skb)
3833 {
3834 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
3835 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3836
3837 /* This is case only for P2P_GO */
3838 if (vif->type != NL80211_IFTYPE_AP || !vif->p2p)
3839 return;
3840
3841 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
3842 spin_lock_bh(&ar->data_lock);
3843 if (arvif->u.ap.noa_data)
3844 if (!pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
3845 GFP_ATOMIC))
3846 skb_put_data(skb, arvif->u.ap.noa_data,
3847 arvif->u.ap.noa_len);
3848 spin_unlock_bh(&ar->data_lock);
3849 }
3850 }
3851
ath10k_mac_tx_h_fill_cb(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_txq * txq,struct ieee80211_sta * sta,struct sk_buff * skb,u16 airtime)3852 static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
3853 struct ieee80211_vif *vif,
3854 struct ieee80211_txq *txq,
3855 struct ieee80211_sta *sta,
3856 struct sk_buff *skb, u16 airtime)
3857 {
3858 struct ieee80211_hdr *hdr = (void *)skb->data;
3859 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
3860 const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
3861 bool is_data = ieee80211_is_data(hdr->frame_control) ||
3862 ieee80211_is_data_qos(hdr->frame_control);
3863 struct ath10k_vif *arvif = (void *)vif->drv_priv;
3864 struct ath10k_sta *arsta;
3865 u8 tid, *qos_ctl;
3866 bool noack = false;
3867
3868 cb->flags = 0;
3869 if (!ath10k_tx_h_use_hwcrypto(vif, skb))
3870 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3871
3872 if (ieee80211_is_mgmt(hdr->frame_control))
3873 cb->flags |= ATH10K_SKB_F_MGMT;
3874
3875 if (ieee80211_is_data_qos(hdr->frame_control)) {
3876 cb->flags |= ATH10K_SKB_F_QOS;
3877 qos_ctl = ieee80211_get_qos_ctl(hdr);
3878 tid = (*qos_ctl) & IEEE80211_QOS_CTL_TID_MASK;
3879
3880 if (arvif->noack[tid] == WMI_PEER_TID_CONFIG_NOACK)
3881 noack = true;
3882
3883 if (sta) {
3884 arsta = (struct ath10k_sta *)sta->drv_priv;
3885
3886 if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_NOACK)
3887 noack = true;
3888
3889 if (arsta->noack[tid] == WMI_PEER_TID_CONFIG_ACK)
3890 noack = false;
3891 }
3892
3893 if (noack)
3894 cb->flags |= ATH10K_SKB_F_NOACK_TID;
3895 }
3896
3897 /* Data frames encrypted in software will be posted to firmware
3898 * with tx encap mode set to RAW. Ex: Multicast traffic generated
3899 * for a specific VLAN group will always be encrypted in software.
3900 */
3901 if (is_data && ieee80211_has_protected(hdr->frame_control) &&
3902 !info->control.hw_key) {
3903 cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
3904 cb->flags |= ATH10K_SKB_F_RAW_TX;
3905 }
3906
3907 cb->vif = vif;
3908 cb->txq = txq;
3909 cb->airtime_est = airtime;
3910 if (sta) {
3911 arsta = (struct ath10k_sta *)sta->drv_priv;
3912 spin_lock_bh(&ar->data_lock);
3913 cb->ucast_cipher = arsta->ucast_cipher;
3914 spin_unlock_bh(&ar->data_lock);
3915 }
3916 }
3917
ath10k_mac_tx_frm_has_freq(struct ath10k * ar)3918 bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
3919 {
3920 /* FIXME: Not really sure since when the behaviour changed. At some
3921 * point new firmware stopped requiring creation of peer entries for
3922 * offchannel tx (and actually creating them causes issues with wmi-htc
3923 * tx credit replenishment and reliability). Assuming it's at least 3.4
3924 * because that's when the `freq` was introduced to TX_FRM HTT command.
3925 */
3926 return (ar->htt.target_version_major >= 3 &&
3927 ar->htt.target_version_minor >= 4 &&
3928 ar->running_fw->fw_file.htt_op_version == ATH10K_FW_HTT_OP_VERSION_TLV);
3929 }
3930
ath10k_mac_tx_wmi_mgmt(struct ath10k * ar,struct sk_buff * skb)3931 static int ath10k_mac_tx_wmi_mgmt(struct ath10k *ar, struct sk_buff *skb)
3932 {
3933 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
3934
3935 if (skb_queue_len_lockless(q) >= ATH10K_MAX_NUM_MGMT_PENDING) {
3936 ath10k_warn(ar, "wmi mgmt tx queue is full\n");
3937 return -ENOSPC;
3938 }
3939
3940 skb_queue_tail(q, skb);
3941 ieee80211_queue_work(ar->hw, &ar->wmi_mgmt_tx_work);
3942
3943 return 0;
3944 }
3945
3946 static enum ath10k_mac_tx_path
ath10k_mac_tx_h_get_txpath(struct ath10k * ar,struct sk_buff * skb,enum ath10k_hw_txrx_mode txmode)3947 ath10k_mac_tx_h_get_txpath(struct ath10k *ar,
3948 struct sk_buff *skb,
3949 enum ath10k_hw_txrx_mode txmode)
3950 {
3951 switch (txmode) {
3952 case ATH10K_HW_TXRX_RAW:
3953 case ATH10K_HW_TXRX_NATIVE_WIFI:
3954 case ATH10K_HW_TXRX_ETHERNET:
3955 return ATH10K_MAC_TX_HTT;
3956 case ATH10K_HW_TXRX_MGMT:
3957 if (test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX,
3958 ar->running_fw->fw_file.fw_features) ||
3959 test_bit(WMI_SERVICE_MGMT_TX_WMI,
3960 ar->wmi.svc_map))
3961 return ATH10K_MAC_TX_WMI_MGMT;
3962 else if (ar->htt.target_version_major >= 3)
3963 return ATH10K_MAC_TX_HTT;
3964 else
3965 return ATH10K_MAC_TX_HTT_MGMT;
3966 }
3967
3968 return ATH10K_MAC_TX_UNKNOWN;
3969 }
3970
ath10k_mac_tx_submit(struct ath10k * ar,enum ath10k_hw_txrx_mode txmode,enum ath10k_mac_tx_path txpath,struct sk_buff * skb)3971 static int ath10k_mac_tx_submit(struct ath10k *ar,
3972 enum ath10k_hw_txrx_mode txmode,
3973 enum ath10k_mac_tx_path txpath,
3974 struct sk_buff *skb)
3975 {
3976 struct ath10k_htt *htt = &ar->htt;
3977 int ret = -EINVAL;
3978
3979 switch (txpath) {
3980 case ATH10K_MAC_TX_HTT:
3981 ret = ath10k_htt_tx(htt, txmode, skb);
3982 break;
3983 case ATH10K_MAC_TX_HTT_MGMT:
3984 ret = ath10k_htt_mgmt_tx(htt, skb);
3985 break;
3986 case ATH10K_MAC_TX_WMI_MGMT:
3987 ret = ath10k_mac_tx_wmi_mgmt(ar, skb);
3988 break;
3989 case ATH10K_MAC_TX_UNKNOWN:
3990 WARN_ON_ONCE(1);
3991 ret = -EINVAL;
3992 break;
3993 }
3994
3995 if (ret) {
3996 ath10k_warn(ar, "failed to transmit packet, dropping: %d\n",
3997 ret);
3998 ieee80211_free_txskb(ar->hw, skb);
3999 }
4000
4001 return ret;
4002 }
4003
4004 /* This function consumes the sk_buff regardless of return value as far as
4005 * caller is concerned so no freeing is necessary afterwards.
4006 */
ath10k_mac_tx(struct ath10k * ar,struct ieee80211_vif * vif,enum ath10k_hw_txrx_mode txmode,enum ath10k_mac_tx_path txpath,struct sk_buff * skb,bool noque_offchan)4007 static int ath10k_mac_tx(struct ath10k *ar,
4008 struct ieee80211_vif *vif,
4009 enum ath10k_hw_txrx_mode txmode,
4010 enum ath10k_mac_tx_path txpath,
4011 struct sk_buff *skb, bool noque_offchan)
4012 {
4013 struct ieee80211_hw *hw = ar->hw;
4014 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4015 const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
4016 int ret;
4017
4018 /* We should disable CCK RATE due to P2P */
4019 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
4020 ath10k_dbg(ar, ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
4021
4022 switch (txmode) {
4023 case ATH10K_HW_TXRX_MGMT:
4024 case ATH10K_HW_TXRX_NATIVE_WIFI:
4025 ath10k_tx_h_nwifi(hw, skb);
4026 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
4027 ath10k_tx_h_seq_no(vif, skb);
4028 break;
4029 case ATH10K_HW_TXRX_ETHERNET:
4030 ath10k_tx_h_8023(skb);
4031 break;
4032 case ATH10K_HW_TXRX_RAW:
4033 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) &&
4034 !(skb_cb->flags & ATH10K_SKB_F_RAW_TX)) {
4035 WARN_ON_ONCE(1);
4036 ieee80211_free_txskb(hw, skb);
4037 return -ENOTSUPP;
4038 }
4039 }
4040
4041 if (!noque_offchan && info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
4042 if (!ath10k_mac_tx_frm_has_freq(ar)) {
4043 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac queued offchannel skb %pK len %d\n",
4044 skb, skb->len);
4045
4046 skb_queue_tail(&ar->offchan_tx_queue, skb);
4047 ieee80211_queue_work(hw, &ar->offchan_tx_work);
4048 return 0;
4049 }
4050 }
4051
4052 ret = ath10k_mac_tx_submit(ar, txmode, txpath, skb);
4053 if (ret) {
4054 ath10k_warn(ar, "failed to submit frame: %d\n", ret);
4055 return ret;
4056 }
4057
4058 return 0;
4059 }
4060
ath10k_offchan_tx_purge(struct ath10k * ar)4061 void ath10k_offchan_tx_purge(struct ath10k *ar)
4062 {
4063 struct sk_buff *skb;
4064
4065 for (;;) {
4066 skb = skb_dequeue(&ar->offchan_tx_queue);
4067 if (!skb)
4068 break;
4069
4070 ieee80211_free_txskb(ar->hw, skb);
4071 }
4072 }
4073
ath10k_offchan_tx_work(struct work_struct * work)4074 void ath10k_offchan_tx_work(struct work_struct *work)
4075 {
4076 struct ath10k *ar = container_of(work, struct ath10k, offchan_tx_work);
4077 struct ath10k_peer *peer;
4078 struct ath10k_vif *arvif;
4079 enum ath10k_hw_txrx_mode txmode;
4080 enum ath10k_mac_tx_path txpath;
4081 struct ieee80211_hdr *hdr;
4082 struct ieee80211_vif *vif;
4083 struct ieee80211_sta *sta;
4084 struct sk_buff *skb;
4085 const u8 *peer_addr;
4086 int vdev_id;
4087 int ret;
4088 unsigned long time_left;
4089 bool tmp_peer_created = false;
4090
4091 /* FW requirement: We must create a peer before FW will send out
4092 * an offchannel frame. Otherwise the frame will be stuck and
4093 * never transmitted. We delete the peer upon tx completion.
4094 * It is unlikely that a peer for offchannel tx will already be
4095 * present. However it may be in some rare cases so account for that.
4096 * Otherwise we might remove a legitimate peer and break stuff.
4097 */
4098
4099 for (;;) {
4100 skb = skb_dequeue(&ar->offchan_tx_queue);
4101 if (!skb)
4102 break;
4103
4104 mutex_lock(&ar->conf_mutex);
4105
4106 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK len %d\n",
4107 skb, skb->len);
4108
4109 hdr = (struct ieee80211_hdr *)skb->data;
4110 peer_addr = ieee80211_get_DA(hdr);
4111
4112 spin_lock_bh(&ar->data_lock);
4113 vdev_id = ar->scan.vdev_id;
4114 peer = ath10k_peer_find(ar, vdev_id, peer_addr);
4115 spin_unlock_bh(&ar->data_lock);
4116
4117 if (peer)
4118 ath10k_warn(ar, "peer %pM on vdev %d already present\n",
4119 peer_addr, vdev_id);
4120
4121 if (!peer) {
4122 ret = ath10k_peer_create(ar, NULL, NULL, vdev_id,
4123 peer_addr,
4124 WMI_PEER_TYPE_DEFAULT);
4125 if (ret)
4126 ath10k_warn(ar, "failed to create peer %pM on vdev %d: %d\n",
4127 peer_addr, vdev_id, ret);
4128 tmp_peer_created = (ret == 0);
4129 }
4130
4131 spin_lock_bh(&ar->data_lock);
4132 reinit_completion(&ar->offchan_tx_completed);
4133 ar->offchan_tx_skb = skb;
4134 spin_unlock_bh(&ar->data_lock);
4135
4136 /* It's safe to access vif and sta - conf_mutex guarantees that
4137 * sta_state() and remove_interface() are locked exclusively
4138 * out wrt to this offchannel worker.
4139 */
4140 arvif = ath10k_get_arvif(ar, vdev_id);
4141 if (arvif) {
4142 vif = arvif->vif;
4143 sta = ieee80211_find_sta(vif, peer_addr);
4144 } else {
4145 vif = NULL;
4146 sta = NULL;
4147 }
4148
4149 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4150 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4151
4152 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, true);
4153 if (ret) {
4154 ath10k_warn(ar, "failed to transmit offchannel frame: %d\n",
4155 ret);
4156 /* not serious */
4157 }
4158
4159 time_left =
4160 wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ);
4161 if (time_left == 0)
4162 ath10k_warn(ar, "timed out waiting for offchannel skb %pK, len: %d\n",
4163 skb, skb->len);
4164
4165 if (!peer && tmp_peer_created) {
4166 ret = ath10k_peer_delete(ar, vdev_id, peer_addr);
4167 if (ret)
4168 ath10k_warn(ar, "failed to delete peer %pM on vdev %d: %d\n",
4169 peer_addr, vdev_id, ret);
4170 }
4171
4172 mutex_unlock(&ar->conf_mutex);
4173 }
4174 }
4175
ath10k_mgmt_over_wmi_tx_purge(struct ath10k * ar)4176 void ath10k_mgmt_over_wmi_tx_purge(struct ath10k *ar)
4177 {
4178 struct sk_buff *skb;
4179
4180 for (;;) {
4181 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
4182 if (!skb)
4183 break;
4184
4185 ieee80211_free_txskb(ar->hw, skb);
4186 }
4187 }
4188
ath10k_mgmt_over_wmi_tx_work(struct work_struct * work)4189 void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
4190 {
4191 struct ath10k *ar = container_of(work, struct ath10k, wmi_mgmt_tx_work);
4192 struct sk_buff *skb;
4193 dma_addr_t paddr;
4194 int ret;
4195
4196 for (;;) {
4197 skb = skb_dequeue(&ar->wmi_mgmt_tx_queue);
4198 if (!skb)
4199 break;
4200
4201 if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF,
4202 ar->running_fw->fw_file.fw_features)) {
4203 paddr = dma_map_single(ar->dev, skb->data,
4204 skb->len, DMA_TO_DEVICE);
4205 if (dma_mapping_error(ar->dev, paddr)) {
4206 ieee80211_free_txskb(ar->hw, skb);
4207 continue;
4208 }
4209 ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr);
4210 if (ret) {
4211 ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n",
4212 ret);
4213 /* remove this msdu from idr tracking */
4214 ath10k_wmi_cleanup_mgmt_tx_send(ar, skb);
4215
4216 dma_unmap_single(ar->dev, paddr, skb->len,
4217 DMA_TO_DEVICE);
4218 ieee80211_free_txskb(ar->hw, skb);
4219 }
4220 } else {
4221 ret = ath10k_wmi_mgmt_tx(ar, skb);
4222 if (ret) {
4223 ath10k_warn(ar, "failed to transmit management frame via WMI: %d\n",
4224 ret);
4225 ieee80211_free_txskb(ar->hw, skb);
4226 }
4227 }
4228 }
4229 }
4230
ath10k_mac_txq_init(struct ieee80211_txq * txq)4231 static void ath10k_mac_txq_init(struct ieee80211_txq *txq)
4232 {
4233 struct ath10k_txq *artxq;
4234
4235 if (!txq)
4236 return;
4237
4238 artxq = (void *)txq->drv_priv;
4239 INIT_LIST_HEAD(&artxq->list);
4240 }
4241
ath10k_mac_txq_unref(struct ath10k * ar,struct ieee80211_txq * txq)4242 static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
4243 {
4244 struct ath10k_skb_cb *cb;
4245 struct sk_buff *msdu;
4246 int msdu_id;
4247
4248 if (!txq)
4249 return;
4250
4251 spin_lock_bh(&ar->htt.tx_lock);
4252 idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) {
4253 cb = ATH10K_SKB_CB(msdu);
4254 if (cb->txq == txq)
4255 cb->txq = NULL;
4256 }
4257 spin_unlock_bh(&ar->htt.tx_lock);
4258 }
4259
ath10k_mac_txq_lookup(struct ath10k * ar,u16 peer_id,u8 tid)4260 struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar,
4261 u16 peer_id,
4262 u8 tid)
4263 {
4264 struct ath10k_peer *peer;
4265
4266 lockdep_assert_held(&ar->data_lock);
4267
4268 peer = ar->peer_map[peer_id];
4269 if (!peer)
4270 return NULL;
4271
4272 if (peer->removed)
4273 return NULL;
4274
4275 if (peer->sta)
4276 return peer->sta->txq[tid];
4277 else if (peer->vif)
4278 return peer->vif->txq;
4279 else
4280 return NULL;
4281 }
4282
ath10k_mac_tx_can_push(struct ieee80211_hw * hw,struct ieee80211_txq * txq)4283 static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
4284 struct ieee80211_txq *txq)
4285 {
4286 struct ath10k *ar = hw->priv;
4287 struct ath10k_txq *artxq = (void *)txq->drv_priv;
4288
4289 /* No need to get locks */
4290 if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH)
4291 return true;
4292
4293 if (ar->htt.num_pending_tx < ar->htt.tx_q_state.num_push_allowed)
4294 return true;
4295
4296 if (artxq->num_fw_queued < artxq->num_push_allowed)
4297 return true;
4298
4299 return false;
4300 }
4301
4302 /* Return estimated airtime in microsecond, which is calculated using last
4303 * reported TX rate. This is just a rough estimation because host driver has no
4304 * knowledge of the actual transmit rate, retries or aggregation. If actual
4305 * airtime can be reported by firmware, then delta between estimated and actual
4306 * airtime can be adjusted from deficit.
4307 */
4308 #define IEEE80211_ATF_OVERHEAD 100 /* IFS + some slot time */
4309 #define IEEE80211_ATF_OVERHEAD_IFS 16 /* IFS only */
ath10k_mac_update_airtime(struct ath10k * ar,struct ieee80211_txq * txq,struct sk_buff * skb)4310 static u16 ath10k_mac_update_airtime(struct ath10k *ar,
4311 struct ieee80211_txq *txq,
4312 struct sk_buff *skb)
4313 {
4314 struct ath10k_sta *arsta;
4315 u32 pktlen;
4316 u16 airtime = 0;
4317
4318 if (!txq || !txq->sta)
4319 return airtime;
4320
4321 if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
4322 return airtime;
4323
4324 spin_lock_bh(&ar->data_lock);
4325 arsta = (struct ath10k_sta *)txq->sta->drv_priv;
4326
4327 pktlen = skb->len + 38; /* Assume MAC header 30, SNAP 8 for most case */
4328 if (arsta->last_tx_bitrate) {
4329 /* airtime in us, last_tx_bitrate in 100kbps */
4330 airtime = (pktlen * 8 * (1000 / 100))
4331 / arsta->last_tx_bitrate;
4332 /* overhead for media access time and IFS */
4333 airtime += IEEE80211_ATF_OVERHEAD_IFS;
4334 } else {
4335 /* This is mostly for throttle excessive BC/MC frames, and the
4336 * airtime/rate doesn't need be exact. Airtime of BC/MC frames
4337 * in 2G get some discount, which helps prevent very low rate
4338 * frames from being blocked for too long.
4339 */
4340 airtime = (pktlen * 8 * (1000 / 100)) / 60; /* 6M */
4341 airtime += IEEE80211_ATF_OVERHEAD;
4342 }
4343 spin_unlock_bh(&ar->data_lock);
4344
4345 return airtime;
4346 }
4347
ath10k_mac_tx_push_txq(struct ieee80211_hw * hw,struct ieee80211_txq * txq)4348 int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
4349 struct ieee80211_txq *txq)
4350 {
4351 struct ath10k *ar = hw->priv;
4352 struct ath10k_htt *htt = &ar->htt;
4353 struct ath10k_txq *artxq = (void *)txq->drv_priv;
4354 struct ieee80211_vif *vif = txq->vif;
4355 struct ieee80211_sta *sta = txq->sta;
4356 enum ath10k_hw_txrx_mode txmode;
4357 enum ath10k_mac_tx_path txpath;
4358 struct sk_buff *skb;
4359 struct ieee80211_hdr *hdr;
4360 size_t skb_len;
4361 bool is_mgmt, is_presp;
4362 int ret;
4363 u16 airtime;
4364
4365 spin_lock_bh(&ar->htt.tx_lock);
4366 ret = ath10k_htt_tx_inc_pending(htt);
4367 spin_unlock_bh(&ar->htt.tx_lock);
4368
4369 if (ret)
4370 return ret;
4371
4372 skb = ieee80211_tx_dequeue_ni(hw, txq);
4373 if (!skb) {
4374 spin_lock_bh(&ar->htt.tx_lock);
4375 ath10k_htt_tx_dec_pending(htt);
4376 spin_unlock_bh(&ar->htt.tx_lock);
4377
4378 return -ENOENT;
4379 }
4380
4381 airtime = ath10k_mac_update_airtime(ar, txq, skb);
4382 ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
4383
4384 skb_len = skb->len;
4385 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4386 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4387 is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4388
4389 if (is_mgmt) {
4390 hdr = (struct ieee80211_hdr *)skb->data;
4391 is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4392
4393 spin_lock_bh(&ar->htt.tx_lock);
4394 ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4395
4396 if (ret) {
4397 ath10k_htt_tx_dec_pending(htt);
4398 spin_unlock_bh(&ar->htt.tx_lock);
4399 return ret;
4400 }
4401 spin_unlock_bh(&ar->htt.tx_lock);
4402 }
4403
4404 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false);
4405 if (unlikely(ret)) {
4406 ath10k_warn(ar, "failed to push frame: %d\n", ret);
4407
4408 spin_lock_bh(&ar->htt.tx_lock);
4409 ath10k_htt_tx_dec_pending(htt);
4410 if (is_mgmt)
4411 ath10k_htt_tx_mgmt_dec_pending(htt);
4412 spin_unlock_bh(&ar->htt.tx_lock);
4413
4414 return ret;
4415 }
4416
4417 spin_lock_bh(&ar->htt.tx_lock);
4418 artxq->num_fw_queued++;
4419 spin_unlock_bh(&ar->htt.tx_lock);
4420
4421 return skb_len;
4422 }
4423
ath10k_mac_schedule_txq(struct ieee80211_hw * hw,u32 ac)4424 static int ath10k_mac_schedule_txq(struct ieee80211_hw *hw, u32 ac)
4425 {
4426 struct ieee80211_txq *txq;
4427 int ret = 0;
4428
4429 ieee80211_txq_schedule_start(hw, ac);
4430 while ((txq = ieee80211_next_txq(hw, ac))) {
4431 while (ath10k_mac_tx_can_push(hw, txq)) {
4432 ret = ath10k_mac_tx_push_txq(hw, txq);
4433 if (ret < 0)
4434 break;
4435 }
4436 ieee80211_return_txq(hw, txq, false);
4437 ath10k_htt_tx_txq_update(hw, txq);
4438 if (ret == -EBUSY)
4439 break;
4440 }
4441 ieee80211_txq_schedule_end(hw, ac);
4442
4443 return ret;
4444 }
4445
ath10k_mac_tx_push_pending(struct ath10k * ar)4446 void ath10k_mac_tx_push_pending(struct ath10k *ar)
4447 {
4448 struct ieee80211_hw *hw = ar->hw;
4449 u32 ac;
4450
4451 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
4452 return;
4453
4454 if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
4455 return;
4456
4457 rcu_read_lock();
4458 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
4459 if (ath10k_mac_schedule_txq(hw, ac) == -EBUSY)
4460 break;
4461 }
4462 rcu_read_unlock();
4463 }
4464 EXPORT_SYMBOL(ath10k_mac_tx_push_pending);
4465
4466 /************/
4467 /* Scanning */
4468 /************/
4469
__ath10k_scan_finish(struct ath10k * ar)4470 void __ath10k_scan_finish(struct ath10k *ar)
4471 {
4472 lockdep_assert_held(&ar->data_lock);
4473
4474 switch (ar->scan.state) {
4475 case ATH10K_SCAN_IDLE:
4476 break;
4477 case ATH10K_SCAN_RUNNING:
4478 case ATH10K_SCAN_ABORTING:
4479 if (!ar->scan.is_roc) {
4480 struct cfg80211_scan_info info = {
4481 .aborted = (ar->scan.state ==
4482 ATH10K_SCAN_ABORTING),
4483 };
4484
4485 ieee80211_scan_completed(ar->hw, &info);
4486 } else if (ar->scan.roc_notify) {
4487 ieee80211_remain_on_channel_expired(ar->hw);
4488 }
4489 fallthrough;
4490 case ATH10K_SCAN_STARTING:
4491 ar->scan.state = ATH10K_SCAN_IDLE;
4492 ar->scan_channel = NULL;
4493 ar->scan.roc_freq = 0;
4494 ath10k_offchan_tx_purge(ar);
4495 cancel_delayed_work(&ar->scan.timeout);
4496 complete(&ar->scan.completed);
4497 break;
4498 }
4499 }
4500
ath10k_scan_finish(struct ath10k * ar)4501 void ath10k_scan_finish(struct ath10k *ar)
4502 {
4503 spin_lock_bh(&ar->data_lock);
4504 __ath10k_scan_finish(ar);
4505 spin_unlock_bh(&ar->data_lock);
4506 }
4507
ath10k_scan_stop(struct ath10k * ar)4508 static int ath10k_scan_stop(struct ath10k *ar)
4509 {
4510 struct wmi_stop_scan_arg arg = {
4511 .req_id = 1, /* FIXME */
4512 .req_type = WMI_SCAN_STOP_ONE,
4513 .u.scan_id = ATH10K_SCAN_ID,
4514 };
4515 int ret;
4516
4517 lockdep_assert_held(&ar->conf_mutex);
4518
4519 ret = ath10k_wmi_stop_scan(ar, &arg);
4520 if (ret) {
4521 ath10k_warn(ar, "failed to stop wmi scan: %d\n", ret);
4522 goto out;
4523 }
4524
4525 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4526 if (ret == 0) {
4527 ath10k_warn(ar, "failed to receive scan abortion completion: timed out\n");
4528 ret = -ETIMEDOUT;
4529 } else if (ret > 0) {
4530 ret = 0;
4531 }
4532
4533 out:
4534 /* Scan state should be updated upon scan completion but in case
4535 * firmware fails to deliver the event (for whatever reason) it is
4536 * desired to clean up scan state anyway. Firmware may have just
4537 * dropped the scan completion event delivery due to transport pipe
4538 * being overflown with data and/or it can recover on its own before
4539 * next scan request is submitted.
4540 */
4541 spin_lock_bh(&ar->data_lock);
4542 if (ar->scan.state != ATH10K_SCAN_IDLE)
4543 __ath10k_scan_finish(ar);
4544 spin_unlock_bh(&ar->data_lock);
4545
4546 return ret;
4547 }
4548
ath10k_scan_abort(struct ath10k * ar)4549 static void ath10k_scan_abort(struct ath10k *ar)
4550 {
4551 int ret;
4552
4553 lockdep_assert_held(&ar->conf_mutex);
4554
4555 spin_lock_bh(&ar->data_lock);
4556
4557 switch (ar->scan.state) {
4558 case ATH10K_SCAN_IDLE:
4559 /* This can happen if timeout worker kicked in and called
4560 * abortion while scan completion was being processed.
4561 */
4562 break;
4563 case ATH10K_SCAN_STARTING:
4564 case ATH10K_SCAN_ABORTING:
4565 ath10k_warn(ar, "refusing scan abortion due to invalid scan state: %s (%d)\n",
4566 ath10k_scan_state_str(ar->scan.state),
4567 ar->scan.state);
4568 break;
4569 case ATH10K_SCAN_RUNNING:
4570 ar->scan.state = ATH10K_SCAN_ABORTING;
4571 spin_unlock_bh(&ar->data_lock);
4572
4573 ret = ath10k_scan_stop(ar);
4574 if (ret)
4575 ath10k_warn(ar, "failed to abort scan: %d\n", ret);
4576
4577 spin_lock_bh(&ar->data_lock);
4578 break;
4579 }
4580
4581 spin_unlock_bh(&ar->data_lock);
4582 }
4583
ath10k_scan_timeout_work(struct work_struct * work)4584 void ath10k_scan_timeout_work(struct work_struct *work)
4585 {
4586 struct ath10k *ar = container_of(work, struct ath10k,
4587 scan.timeout.work);
4588
4589 mutex_lock(&ar->conf_mutex);
4590 ath10k_scan_abort(ar);
4591 mutex_unlock(&ar->conf_mutex);
4592 }
4593
ath10k_start_scan(struct ath10k * ar,const struct wmi_start_scan_arg * arg)4594 static int ath10k_start_scan(struct ath10k *ar,
4595 const struct wmi_start_scan_arg *arg)
4596 {
4597 int ret;
4598
4599 lockdep_assert_held(&ar->conf_mutex);
4600
4601 ret = ath10k_wmi_start_scan(ar, arg);
4602 if (ret)
4603 return ret;
4604
4605 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4606 if (ret == 0) {
4607 ret = ath10k_scan_stop(ar);
4608 if (ret)
4609 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
4610
4611 return -ETIMEDOUT;
4612 }
4613
4614 /* If we failed to start the scan, return error code at
4615 * this point. This is probably due to some issue in the
4616 * firmware, but no need to wedge the driver due to that...
4617 */
4618 spin_lock_bh(&ar->data_lock);
4619 if (ar->scan.state == ATH10K_SCAN_IDLE) {
4620 spin_unlock_bh(&ar->data_lock);
4621 return -EINVAL;
4622 }
4623 spin_unlock_bh(&ar->data_lock);
4624
4625 return 0;
4626 }
4627
4628 /**********************/
4629 /* mac80211 callbacks */
4630 /**********************/
4631
ath10k_mac_op_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)4632 static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
4633 struct ieee80211_tx_control *control,
4634 struct sk_buff *skb)
4635 {
4636 struct ath10k *ar = hw->priv;
4637 struct ath10k_htt *htt = &ar->htt;
4638 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
4639 struct ieee80211_vif *vif = info->control.vif;
4640 struct ieee80211_sta *sta = control->sta;
4641 struct ieee80211_txq *txq = NULL;
4642 struct ieee80211_hdr *hdr = (void *)skb->data;
4643 enum ath10k_hw_txrx_mode txmode;
4644 enum ath10k_mac_tx_path txpath;
4645 bool is_htt;
4646 bool is_mgmt;
4647 bool is_presp;
4648 int ret;
4649 u16 airtime;
4650
4651 airtime = ath10k_mac_update_airtime(ar, txq, skb);
4652 ath10k_mac_tx_h_fill_cb(ar, vif, txq, sta, skb, airtime);
4653
4654 txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
4655 txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
4656 is_htt = (txpath == ATH10K_MAC_TX_HTT ||
4657 txpath == ATH10K_MAC_TX_HTT_MGMT);
4658 is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
4659
4660 if (is_htt) {
4661 spin_lock_bh(&ar->htt.tx_lock);
4662 is_presp = ieee80211_is_probe_resp(hdr->frame_control);
4663
4664 ret = ath10k_htt_tx_inc_pending(htt);
4665 if (ret) {
4666 ath10k_warn(ar, "failed to increase tx pending count: %d, dropping\n",
4667 ret);
4668 spin_unlock_bh(&ar->htt.tx_lock);
4669 ieee80211_free_txskb(ar->hw, skb);
4670 return;
4671 }
4672
4673 ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
4674 if (ret) {
4675 ath10k_dbg(ar, ATH10K_DBG_MAC, "failed to increase tx mgmt pending count: %d, dropping\n",
4676 ret);
4677 ath10k_htt_tx_dec_pending(htt);
4678 spin_unlock_bh(&ar->htt.tx_lock);
4679 ieee80211_free_txskb(ar->hw, skb);
4680 return;
4681 }
4682 spin_unlock_bh(&ar->htt.tx_lock);
4683 }
4684
4685 ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false);
4686 if (ret) {
4687 ath10k_warn(ar, "failed to transmit frame: %d\n", ret);
4688 if (is_htt) {
4689 spin_lock_bh(&ar->htt.tx_lock);
4690 ath10k_htt_tx_dec_pending(htt);
4691 if (is_mgmt)
4692 ath10k_htt_tx_mgmt_dec_pending(htt);
4693 spin_unlock_bh(&ar->htt.tx_lock);
4694 }
4695 return;
4696 }
4697 }
4698
ath10k_mac_op_wake_tx_queue(struct ieee80211_hw * hw,struct ieee80211_txq * txq)4699 static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw *hw,
4700 struct ieee80211_txq *txq)
4701 {
4702 struct ath10k *ar = hw->priv;
4703 int ret;
4704 u8 ac;
4705
4706 ath10k_htt_tx_txq_update(hw, txq);
4707 if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
4708 return;
4709
4710 ac = txq->ac;
4711 ieee80211_txq_schedule_start(hw, ac);
4712 txq = ieee80211_next_txq(hw, ac);
4713 if (!txq)
4714 goto out;
4715
4716 while (ath10k_mac_tx_can_push(hw, txq)) {
4717 ret = ath10k_mac_tx_push_txq(hw, txq);
4718 if (ret < 0)
4719 break;
4720 }
4721 ieee80211_return_txq(hw, txq, false);
4722 ath10k_htt_tx_txq_update(hw, txq);
4723 out:
4724 ieee80211_txq_schedule_end(hw, ac);
4725 }
4726
4727 /* Must not be called with conf_mutex held as workers can use that also. */
ath10k_drain_tx(struct ath10k * ar)4728 void ath10k_drain_tx(struct ath10k *ar)
4729 {
4730 lockdep_assert_not_held(&ar->conf_mutex);
4731
4732 /* make sure rcu-protected mac80211 tx path itself is drained */
4733 synchronize_net();
4734
4735 ath10k_offchan_tx_purge(ar);
4736 ath10k_mgmt_over_wmi_tx_purge(ar);
4737
4738 cancel_work_sync(&ar->offchan_tx_work);
4739 cancel_work_sync(&ar->wmi_mgmt_tx_work);
4740 }
4741
ath10k_halt(struct ath10k * ar)4742 void ath10k_halt(struct ath10k *ar)
4743 {
4744 struct ath10k_vif *arvif;
4745
4746 lockdep_assert_held(&ar->conf_mutex);
4747
4748 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
4749 ar->filter_flags = 0;
4750 ar->monitor = false;
4751 ar->monitor_arvif = NULL;
4752
4753 if (ar->monitor_started)
4754 ath10k_monitor_stop(ar);
4755
4756 ar->monitor_started = false;
4757 ar->tx_paused = 0;
4758
4759 ath10k_scan_finish(ar);
4760 ath10k_peer_cleanup_all(ar);
4761 ath10k_stop_radar_confirmation(ar);
4762 ath10k_core_stop(ar);
4763 ath10k_hif_power_down(ar);
4764
4765 spin_lock_bh(&ar->data_lock);
4766 list_for_each_entry(arvif, &ar->arvifs, list)
4767 ath10k_mac_vif_beacon_cleanup(arvif);
4768 spin_unlock_bh(&ar->data_lock);
4769 }
4770
ath10k_get_antenna(struct ieee80211_hw * hw,u32 * tx_ant,u32 * rx_ant)4771 static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
4772 {
4773 struct ath10k *ar = hw->priv;
4774
4775 mutex_lock(&ar->conf_mutex);
4776
4777 *tx_ant = ar->cfg_tx_chainmask;
4778 *rx_ant = ar->cfg_rx_chainmask;
4779
4780 mutex_unlock(&ar->conf_mutex);
4781
4782 return 0;
4783 }
4784
ath10k_check_chain_mask(struct ath10k * ar,u32 cm,const char * dbg)4785 static bool ath10k_check_chain_mask(struct ath10k *ar, u32 cm, const char *dbg)
4786 {
4787 /* It is not clear that allowing gaps in chainmask
4788 * is helpful. Probably it will not do what user
4789 * is hoping for, so warn in that case.
4790 */
4791 if (cm == 15 || cm == 7 || cm == 3 || cm == 1 || cm == 0)
4792 return true;
4793
4794 ath10k_warn(ar, "mac %s antenna chainmask is invalid: 0x%x. Suggested values: 15, 7, 3, 1 or 0.\n",
4795 dbg, cm);
4796 return false;
4797 }
4798
ath10k_mac_get_vht_cap_bf_sts(struct ath10k * ar)4799 static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
4800 {
4801 int nsts = ar->vht_cap_info;
4802
4803 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4804 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4805
4806 /* If firmware does not deliver to host number of space-time
4807 * streams supported, assume it support up to 4 BF STS and return
4808 * the value for VHT CAP: nsts-1)
4809 */
4810 if (nsts == 0)
4811 return 3;
4812
4813 return nsts;
4814 }
4815
ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k * ar)4816 static int ath10k_mac_get_vht_cap_bf_sound_dim(struct ath10k *ar)
4817 {
4818 int sound_dim = ar->vht_cap_info;
4819
4820 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4821 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4822
4823 /* If the sounding dimension is not advertised by the firmware,
4824 * let's use a default value of 1
4825 */
4826 if (sound_dim == 0)
4827 return 1;
4828
4829 return sound_dim;
4830 }
4831
ath10k_create_vht_cap(struct ath10k * ar)4832 static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
4833 {
4834 struct ieee80211_sta_vht_cap vht_cap = {0};
4835 struct ath10k_hw_params *hw = &ar->hw_params;
4836 u16 mcs_map;
4837 u32 val;
4838 int i;
4839
4840 vht_cap.vht_supported = 1;
4841 vht_cap.cap = ar->vht_cap_info;
4842
4843 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
4844 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
4845 val = ath10k_mac_get_vht_cap_bf_sts(ar);
4846 val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4847 val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4848
4849 vht_cap.cap |= val;
4850 }
4851
4852 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
4853 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
4854 val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
4855 val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4856 val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4857
4858 vht_cap.cap |= val;
4859 }
4860
4861 mcs_map = 0;
4862 for (i = 0; i < 8; i++) {
4863 if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
4864 mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4865 else
4866 mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4867 }
4868
4869 if (ar->cfg_tx_chainmask <= 1)
4870 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4871
4872 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
4873 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
4874
4875 /* If we are supporting 160Mhz or 80+80, then the NIC may be able to do
4876 * a restricted NSS for 160 or 80+80 vs what it can do for 80Mhz. Give
4877 * user-space a clue if that is the case.
4878 */
4879 if ((vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) &&
4880 (hw->vht160_mcs_rx_highest != 0 ||
4881 hw->vht160_mcs_tx_highest != 0)) {
4882 vht_cap.vht_mcs.rx_highest = cpu_to_le16(hw->vht160_mcs_rx_highest);
4883 vht_cap.vht_mcs.tx_highest = cpu_to_le16(hw->vht160_mcs_tx_highest);
4884 }
4885
4886 return vht_cap;
4887 }
4888
ath10k_get_ht_cap(struct ath10k * ar)4889 static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4890 {
4891 int i;
4892 struct ieee80211_sta_ht_cap ht_cap = {0};
4893
4894 if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
4895 return ht_cap;
4896
4897 ht_cap.ht_supported = 1;
4898 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4899 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
4900 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4901 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4902 ht_cap.cap |=
4903 WLAN_HT_CAP_SM_PS_DISABLED << IEEE80211_HT_CAP_SM_PS_SHIFT;
4904
4905 if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
4906 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4907
4908 if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
4909 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4910
4911 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
4912 u32 smps;
4913
4914 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
4915 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4916
4917 ht_cap.cap |= smps;
4918 }
4919
4920 if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC && (ar->cfg_tx_chainmask > 1))
4921 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4922
4923 if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
4924 u32 stbc;
4925
4926 stbc = ar->ht_cap_info;
4927 stbc &= WMI_HT_CAP_RX_STBC;
4928 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4929 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4930 stbc &= IEEE80211_HT_CAP_RX_STBC;
4931
4932 ht_cap.cap |= stbc;
4933 }
4934
4935 if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info &
4936 WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC)))
4937 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4938
4939 if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
4940 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4941
4942 /* max AMSDU is implicitly taken from vht_cap_info */
4943 if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4944 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4945
4946 for (i = 0; i < ar->num_rf_chains; i++) {
4947 if (ar->cfg_rx_chainmask & BIT(i))
4948 ht_cap.mcs.rx_mask[i] = 0xFF;
4949 }
4950
4951 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4952
4953 return ht_cap;
4954 }
4955
ath10k_mac_setup_ht_vht_cap(struct ath10k * ar)4956 static void ath10k_mac_setup_ht_vht_cap(struct ath10k *ar)
4957 {
4958 struct ieee80211_supported_band *band;
4959 struct ieee80211_sta_vht_cap vht_cap;
4960 struct ieee80211_sta_ht_cap ht_cap;
4961
4962 ht_cap = ath10k_get_ht_cap(ar);
4963 vht_cap = ath10k_create_vht_cap(ar);
4964
4965 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
4966 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4967 band->ht_cap = ht_cap;
4968 }
4969 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
4970 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4971 band->ht_cap = ht_cap;
4972 band->vht_cap = vht_cap;
4973 }
4974 }
4975
__ath10k_set_antenna(struct ath10k * ar,u32 tx_ant,u32 rx_ant)4976 static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
4977 {
4978 int ret;
4979 bool is_valid_tx_chain_mask, is_valid_rx_chain_mask;
4980
4981 lockdep_assert_held(&ar->conf_mutex);
4982
4983 is_valid_tx_chain_mask = ath10k_check_chain_mask(ar, tx_ant, "tx");
4984 is_valid_rx_chain_mask = ath10k_check_chain_mask(ar, rx_ant, "rx");
4985
4986 if (!is_valid_tx_chain_mask || !is_valid_rx_chain_mask)
4987 return -EINVAL;
4988
4989 ar->cfg_tx_chainmask = tx_ant;
4990 ar->cfg_rx_chainmask = rx_ant;
4991
4992 if ((ar->state != ATH10K_STATE_ON) &&
4993 (ar->state != ATH10K_STATE_RESTARTED))
4994 return 0;
4995
4996 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask,
4997 tx_ant);
4998 if (ret) {
4999 ath10k_warn(ar, "failed to set tx-chainmask: %d, req 0x%x\n",
5000 ret, tx_ant);
5001 return ret;
5002 }
5003
5004 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask,
5005 rx_ant);
5006 if (ret) {
5007 ath10k_warn(ar, "failed to set rx-chainmask: %d, req 0x%x\n",
5008 ret, rx_ant);
5009 return ret;
5010 }
5011
5012 /* Reload HT/VHT capability */
5013 ath10k_mac_setup_ht_vht_cap(ar);
5014
5015 return 0;
5016 }
5017
ath10k_set_antenna(struct ieee80211_hw * hw,u32 tx_ant,u32 rx_ant)5018 static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
5019 {
5020 struct ath10k *ar = hw->priv;
5021 int ret;
5022
5023 mutex_lock(&ar->conf_mutex);
5024 ret = __ath10k_set_antenna(ar, tx_ant, rx_ant);
5025 mutex_unlock(&ar->conf_mutex);
5026 return ret;
5027 }
5028
__ath10k_fetch_bb_timing_dt(struct ath10k * ar,struct wmi_bb_timing_cfg_arg * bb_timing)5029 static int __ath10k_fetch_bb_timing_dt(struct ath10k *ar,
5030 struct wmi_bb_timing_cfg_arg *bb_timing)
5031 {
5032 struct device_node *node;
5033 const char *fem_name;
5034 int ret;
5035
5036 node = ar->dev->of_node;
5037 if (!node)
5038 return -ENOENT;
5039
5040 ret = of_property_read_string_index(node, "ext-fem-name", 0, &fem_name);
5041 if (ret)
5042 return -ENOENT;
5043
5044 /*
5045 * If external Front End module used in hardware, then default base band timing
5046 * parameter cannot be used since they were fine tuned for reference hardware,
5047 * so choosing different value suitable for that external FEM.
5048 */
5049 if (!strcmp("microsemi-lx5586", fem_name)) {
5050 bb_timing->bb_tx_timing = 0x00;
5051 bb_timing->bb_xpa_timing = 0x0101;
5052 } else {
5053 return -ENOENT;
5054 }
5055
5056 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot bb_tx_timing 0x%x bb_xpa_timing 0x%x\n",
5057 bb_timing->bb_tx_timing, bb_timing->bb_xpa_timing);
5058 return 0;
5059 }
5060
ath10k_mac_rfkill_config(struct ath10k * ar)5061 static int ath10k_mac_rfkill_config(struct ath10k *ar)
5062 {
5063 u32 param;
5064 int ret;
5065
5066 if (ar->hw_values->rfkill_pin == 0) {
5067 ath10k_warn(ar, "ath10k does not support hardware rfkill with this device\n");
5068 return -EOPNOTSUPP;
5069 }
5070
5071 ath10k_dbg(ar, ATH10K_DBG_MAC,
5072 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5073 ar->hw_values->rfkill_pin, ar->hw_values->rfkill_cfg,
5074 ar->hw_values->rfkill_on_level);
5075
5076 param = FIELD_PREP(WMI_TLV_RFKILL_CFG_RADIO_LEVEL,
5077 ar->hw_values->rfkill_on_level) |
5078 FIELD_PREP(WMI_TLV_RFKILL_CFG_GPIO_PIN_NUM,
5079 ar->hw_values->rfkill_pin) |
5080 FIELD_PREP(WMI_TLV_RFKILL_CFG_PIN_AS_GPIO,
5081 ar->hw_values->rfkill_cfg);
5082
5083 ret = ath10k_wmi_pdev_set_param(ar,
5084 ar->wmi.pdev_param->rfkill_config,
5085 param);
5086 if (ret) {
5087 ath10k_warn(ar,
5088 "failed to set rfkill config 0x%x: %d\n",
5089 param, ret);
5090 return ret;
5091 }
5092 return 0;
5093 }
5094
ath10k_mac_rfkill_enable_radio(struct ath10k * ar,bool enable)5095 int ath10k_mac_rfkill_enable_radio(struct ath10k *ar, bool enable)
5096 {
5097 enum wmi_tlv_rfkill_enable_radio param;
5098 int ret;
5099
5100 if (enable)
5101 param = WMI_TLV_RFKILL_ENABLE_RADIO_ON;
5102 else
5103 param = WMI_TLV_RFKILL_ENABLE_RADIO_OFF;
5104
5105 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac rfkill enable %d", param);
5106
5107 ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rfkill_enable,
5108 param);
5109 if (ret) {
5110 ath10k_warn(ar, "failed to set rfkill enable param %d: %d\n",
5111 param, ret);
5112 return ret;
5113 }
5114
5115 return 0;
5116 }
5117
ath10k_start(struct ieee80211_hw * hw)5118 static int ath10k_start(struct ieee80211_hw *hw)
5119 {
5120 struct ath10k *ar = hw->priv;
5121 u32 param;
5122 int ret = 0;
5123 struct wmi_bb_timing_cfg_arg bb_timing = {0};
5124
5125 /*
5126 * This makes sense only when restarting hw. It is harmless to call
5127 * unconditionally. This is necessary to make sure no HTT/WMI tx
5128 * commands will be submitted while restarting.
5129 */
5130 ath10k_drain_tx(ar);
5131
5132 mutex_lock(&ar->conf_mutex);
5133
5134 switch (ar->state) {
5135 case ATH10K_STATE_OFF:
5136 ar->state = ATH10K_STATE_ON;
5137 break;
5138 case ATH10K_STATE_RESTARTING:
5139 ar->state = ATH10K_STATE_RESTARTED;
5140 break;
5141 case ATH10K_STATE_ON:
5142 case ATH10K_STATE_RESTARTED:
5143 case ATH10K_STATE_WEDGED:
5144 WARN_ON(1);
5145 ret = -EINVAL;
5146 goto err;
5147 case ATH10K_STATE_UTF:
5148 ret = -EBUSY;
5149 goto err;
5150 }
5151
5152 spin_lock_bh(&ar->data_lock);
5153
5154 if (ar->hw_rfkill_on) {
5155 ar->hw_rfkill_on = false;
5156 spin_unlock_bh(&ar->data_lock);
5157 goto err;
5158 }
5159
5160 spin_unlock_bh(&ar->data_lock);
5161
5162 ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
5163 if (ret) {
5164 ath10k_err(ar, "Could not init hif: %d\n", ret);
5165 goto err_off;
5166 }
5167
5168 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL,
5169 &ar->normal_mode_fw);
5170 if (ret) {
5171 ath10k_err(ar, "Could not init core: %d\n", ret);
5172 goto err_power_down;
5173 }
5174
5175 if (ar->sys_cap_info & WMI_TLV_SYS_CAP_INFO_RFKILL) {
5176 ret = ath10k_mac_rfkill_config(ar);
5177 if (ret && ret != -EOPNOTSUPP) {
5178 ath10k_warn(ar, "failed to configure rfkill: %d", ret);
5179 goto err_core_stop;
5180 }
5181 }
5182
5183 param = ar->wmi.pdev_param->pmf_qos;
5184 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5185 if (ret) {
5186 ath10k_warn(ar, "failed to enable PMF QOS: %d\n", ret);
5187 goto err_core_stop;
5188 }
5189
5190 param = ar->wmi.pdev_param->dynamic_bw;
5191 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5192 if (ret) {
5193 ath10k_warn(ar, "failed to enable dynamic BW: %d\n", ret);
5194 goto err_core_stop;
5195 }
5196
5197 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
5198 ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5199 if (ret) {
5200 ath10k_err(ar, "failed to set prob req oui: %i\n", ret);
5201 goto err_core_stop;
5202 }
5203 }
5204
5205 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
5206 ret = ath10k_wmi_adaptive_qcs(ar, true);
5207 if (ret) {
5208 ath10k_warn(ar, "failed to enable adaptive qcs: %d\n",
5209 ret);
5210 goto err_core_stop;
5211 }
5212 }
5213
5214 if (test_bit(WMI_SERVICE_BURST, ar->wmi.svc_map)) {
5215 param = ar->wmi.pdev_param->burst_enable;
5216 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5217 if (ret) {
5218 ath10k_warn(ar, "failed to disable burst: %d\n", ret);
5219 goto err_core_stop;
5220 }
5221 }
5222
5223 param = ar->wmi.pdev_param->idle_ps_config;
5224 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5225 if (ret && ret != -EOPNOTSUPP) {
5226 ath10k_warn(ar, "failed to enable idle_ps_config: %d\n", ret);
5227 goto err_core_stop;
5228 }
5229
5230 __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5231
5232 /*
5233 * By default FW set ARP frames ac to voice (6). In that case ARP
5234 * exchange is not working properly for UAPSD enabled AP. ARP requests
5235 * which arrives with access category 0 are processed by network stack
5236 * and send back with access category 0, but FW changes access category
5237 * to 6. Set ARP frames access category to best effort (0) solves
5238 * this problem.
5239 */
5240
5241 param = ar->wmi.pdev_param->arp_ac_override;
5242 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5243 if (ret) {
5244 ath10k_warn(ar, "failed to set arp ac override parameter: %d\n",
5245 ret);
5246 goto err_core_stop;
5247 }
5248
5249 if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA,
5250 ar->running_fw->fw_file.fw_features)) {
5251 ret = ath10k_wmi_pdev_enable_adaptive_cca(ar, 1,
5252 WMI_CCA_DETECT_LEVEL_AUTO,
5253 WMI_CCA_DETECT_MARGIN_AUTO);
5254 if (ret) {
5255 ath10k_warn(ar, "failed to enable adaptive cca: %d\n",
5256 ret);
5257 goto err_core_stop;
5258 }
5259 }
5260
5261 param = ar->wmi.pdev_param->ani_enable;
5262 ret = ath10k_wmi_pdev_set_param(ar, param, 1);
5263 if (ret) {
5264 ath10k_warn(ar, "failed to enable ani by default: %d\n",
5265 ret);
5266 goto err_core_stop;
5267 }
5268
5269 ar->ani_enabled = true;
5270
5271 if (ath10k_peer_stats_enabled(ar)) {
5272 param = ar->wmi.pdev_param->peer_stats_update_period;
5273 ret = ath10k_wmi_pdev_set_param(ar, param,
5274 PEER_DEFAULT_STATS_UPDATE_PERIOD);
5275 if (ret) {
5276 ath10k_warn(ar,
5277 "failed to set peer stats period : %d\n",
5278 ret);
5279 goto err_core_stop;
5280 }
5281 }
5282
5283 param = ar->wmi.pdev_param->enable_btcoex;
5284 if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) &&
5285 test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
5286 ar->running_fw->fw_file.fw_features) &&
5287 ar->coex_support) {
5288 ret = ath10k_wmi_pdev_set_param(ar, param, 0);
5289 if (ret) {
5290 ath10k_warn(ar,
5291 "failed to set btcoex param: %d\n", ret);
5292 goto err_core_stop;
5293 }
5294 clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
5295 }
5296
5297 if (test_bit(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, ar->wmi.svc_map)) {
5298 ret = __ath10k_fetch_bb_timing_dt(ar, &bb_timing);
5299 if (!ret) {
5300 ret = ath10k_wmi_pdev_bb_timing(ar, &bb_timing);
5301 if (ret) {
5302 ath10k_warn(ar,
5303 "failed to set bb timings: %d\n",
5304 ret);
5305 goto err_core_stop;
5306 }
5307 }
5308 }
5309
5310 ar->num_started_vdevs = 0;
5311 ath10k_regd_update(ar);
5312
5313 ath10k_spectral_start(ar);
5314 ath10k_thermal_set_throttling(ar);
5315
5316 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
5317
5318 mutex_unlock(&ar->conf_mutex);
5319 return 0;
5320
5321 err_core_stop:
5322 ath10k_core_stop(ar);
5323
5324 err_power_down:
5325 ath10k_hif_power_down(ar);
5326
5327 err_off:
5328 ar->state = ATH10K_STATE_OFF;
5329
5330 err:
5331 mutex_unlock(&ar->conf_mutex);
5332 return ret;
5333 }
5334
ath10k_stop(struct ieee80211_hw * hw)5335 static void ath10k_stop(struct ieee80211_hw *hw)
5336 {
5337 struct ath10k *ar = hw->priv;
5338
5339 ath10k_drain_tx(ar);
5340
5341 mutex_lock(&ar->conf_mutex);
5342 if (ar->state != ATH10K_STATE_OFF) {
5343 if (!ar->hw_rfkill_on)
5344 ath10k_halt(ar);
5345 ar->state = ATH10K_STATE_OFF;
5346 }
5347 mutex_unlock(&ar->conf_mutex);
5348
5349 cancel_work_sync(&ar->set_coverage_class_work);
5350 cancel_delayed_work_sync(&ar->scan.timeout);
5351 cancel_work_sync(&ar->restart_work);
5352 }
5353
ath10k_config_ps(struct ath10k * ar)5354 static int ath10k_config_ps(struct ath10k *ar)
5355 {
5356 struct ath10k_vif *arvif;
5357 int ret = 0;
5358
5359 lockdep_assert_held(&ar->conf_mutex);
5360
5361 list_for_each_entry(arvif, &ar->arvifs, list) {
5362 ret = ath10k_mac_vif_setup_ps(arvif);
5363 if (ret) {
5364 ath10k_warn(ar, "failed to setup powersave: %d\n", ret);
5365 break;
5366 }
5367 }
5368
5369 return ret;
5370 }
5371
ath10k_config(struct ieee80211_hw * hw,u32 changed)5372 static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
5373 {
5374 struct ath10k *ar = hw->priv;
5375 struct ieee80211_conf *conf = &hw->conf;
5376 int ret = 0;
5377
5378 mutex_lock(&ar->conf_mutex);
5379
5380 if (changed & IEEE80211_CONF_CHANGE_PS)
5381 ath10k_config_ps(ar);
5382
5383 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
5384 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
5385 ret = ath10k_monitor_recalc(ar);
5386 if (ret)
5387 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5388 }
5389
5390 mutex_unlock(&ar->conf_mutex);
5391 return ret;
5392 }
5393
get_nss_from_chainmask(u16 chain_mask)5394 static u32 get_nss_from_chainmask(u16 chain_mask)
5395 {
5396 if ((chain_mask & 0xf) == 0xf)
5397 return 4;
5398 else if ((chain_mask & 0x7) == 0x7)
5399 return 3;
5400 else if ((chain_mask & 0x3) == 0x3)
5401 return 2;
5402 return 1;
5403 }
5404
ath10k_mac_set_txbf_conf(struct ath10k_vif * arvif)5405 static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
5406 {
5407 u32 value = 0;
5408 struct ath10k *ar = arvif->ar;
5409 int nsts;
5410 int sound_dim;
5411
5412 if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
5413 return 0;
5414
5415 nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
5416 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
5417 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
5418 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5419
5420 sound_dim = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
5421 if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
5422 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
5423 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5424
5425 if (!value)
5426 return 0;
5427
5428 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
5429 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5430
5431 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
5432 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFER |
5433 WMI_VDEV_PARAM_TXBF_SU_TX_BFER);
5434
5435 if (ar->vht_cap_info & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
5436 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5437
5438 if (ar->vht_cap_info & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
5439 value |= (WMI_VDEV_PARAM_TXBF_MU_TX_BFEE |
5440 WMI_VDEV_PARAM_TXBF_SU_TX_BFEE);
5441
5442 return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
5443 ar->wmi.vdev_param->txbf, value);
5444 }
5445
5446 /*
5447 * TODO:
5448 * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
5449 * because we will send mgmt frames without CCK. This requirement
5450 * for P2P_FIND/GO_NEG should be handled by checking CCK flag
5451 * in the TX packet.
5452 */
ath10k_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5453 static int ath10k_add_interface(struct ieee80211_hw *hw,
5454 struct ieee80211_vif *vif)
5455 {
5456 struct ath10k *ar = hw->priv;
5457 struct ath10k_vif *arvif = (void *)vif->drv_priv;
5458 struct ath10k_peer *peer;
5459 enum wmi_sta_powersave_param param;
5460 int ret = 0;
5461 u32 value;
5462 int bit;
5463 int i;
5464 u32 vdev_param;
5465
5466 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5467
5468 mutex_lock(&ar->conf_mutex);
5469
5470 memset(arvif, 0, sizeof(*arvif));
5471 ath10k_mac_txq_init(vif->txq);
5472
5473 arvif->ar = ar;
5474 arvif->vif = vif;
5475
5476 INIT_LIST_HEAD(&arvif->list);
5477 INIT_WORK(&arvif->ap_csa_work, ath10k_mac_vif_ap_csa_work);
5478 INIT_DELAYED_WORK(&arvif->connection_loss_work,
5479 ath10k_mac_vif_sta_connection_loss_work);
5480
5481 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5482 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5483 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5484 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5485 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5486 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5487 }
5488
5489 if (ar->num_peers >= ar->max_num_peers) {
5490 ath10k_warn(ar, "refusing vdev creation due to insufficient peer entry resources in firmware\n");
5491 ret = -ENOBUFS;
5492 goto err;
5493 }
5494
5495 if (ar->free_vdev_map == 0) {
5496 ath10k_warn(ar, "Free vdev map is empty, no more interfaces allowed.\n");
5497 ret = -EBUSY;
5498 goto err;
5499 }
5500 bit = __ffs64(ar->free_vdev_map);
5501
5502 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac create vdev %i map %llx\n",
5503 bit, ar->free_vdev_map);
5504
5505 arvif->vdev_id = bit;
5506 arvif->vdev_subtype =
5507 ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
5508
5509 switch (vif->type) {
5510 case NL80211_IFTYPE_P2P_DEVICE:
5511 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5512 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5513 (ar, WMI_VDEV_SUBTYPE_P2P_DEVICE);
5514 break;
5515 case NL80211_IFTYPE_UNSPECIFIED:
5516 case NL80211_IFTYPE_STATION:
5517 arvif->vdev_type = WMI_VDEV_TYPE_STA;
5518 if (vif->p2p)
5519 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5520 (ar, WMI_VDEV_SUBTYPE_P2P_CLIENT);
5521 break;
5522 case NL80211_IFTYPE_ADHOC:
5523 arvif->vdev_type = WMI_VDEV_TYPE_IBSS;
5524 break;
5525 case NL80211_IFTYPE_MESH_POINT:
5526 if (test_bit(WMI_SERVICE_MESH_11S, ar->wmi.svc_map)) {
5527 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5528 (ar, WMI_VDEV_SUBTYPE_MESH_11S);
5529 } else if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5530 ret = -EINVAL;
5531 ath10k_warn(ar, "must load driver with rawmode=1 to add mesh interfaces\n");
5532 goto err;
5533 }
5534 arvif->vdev_type = WMI_VDEV_TYPE_AP;
5535 break;
5536 case NL80211_IFTYPE_AP:
5537 arvif->vdev_type = WMI_VDEV_TYPE_AP;
5538
5539 if (vif->p2p)
5540 arvif->vdev_subtype = ath10k_wmi_get_vdev_subtype
5541 (ar, WMI_VDEV_SUBTYPE_P2P_GO);
5542 break;
5543 case NL80211_IFTYPE_MONITOR:
5544 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5545 break;
5546 default:
5547 WARN_ON(1);
5548 break;
5549 }
5550
5551 /* Using vdev_id as queue number will make it very easy to do per-vif
5552 * tx queue locking. This shouldn't wrap due to interface combinations
5553 * but do a modulo for correctness sake and prevent using offchannel tx
5554 * queues for regular vif tx.
5555 */
5556 vif->cab_queue = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5557 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5558 vif->hw_queue[i] = arvif->vdev_id % (IEEE80211_MAX_QUEUES - 1);
5559
5560 /* Some firmware revisions don't wait for beacon tx completion before
5561 * sending another SWBA event. This could lead to hardware using old
5562 * (freed) beacon data in some cases, e.g. tx credit starvation
5563 * combined with missed TBTT. This is very rare.
5564 *
5565 * On non-IOMMU-enabled hosts this could be a possible security issue
5566 * because hw could beacon some random data on the air. On
5567 * IOMMU-enabled hosts DMAR faults would occur in most cases and target
5568 * device would crash.
5569 *
5570 * Since there are no beacon tx completions (implicit nor explicit)
5571 * propagated to host the only workaround for this is to allocate a
5572 * DMA-coherent buffer for a lifetime of a vif and use it for all
5573 * beacon tx commands. Worst case for this approach is some beacons may
5574 * become corrupted, e.g. have garbled IEs or out-of-date TIM bitmap.
5575 */
5576 if (vif->type == NL80211_IFTYPE_ADHOC ||
5577 vif->type == NL80211_IFTYPE_MESH_POINT ||
5578 vif->type == NL80211_IFTYPE_AP) {
5579 arvif->beacon_buf = dma_alloc_coherent(ar->dev,
5580 IEEE80211_MAX_FRAME_LEN,
5581 &arvif->beacon_paddr,
5582 GFP_ATOMIC);
5583 if (!arvif->beacon_buf) {
5584 ret = -ENOMEM;
5585 ath10k_warn(ar, "failed to allocate beacon buffer: %d\n",
5586 ret);
5587 goto err;
5588 }
5589 }
5590 if (test_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags))
5591 arvif->nohwcrypt = true;
5592
5593 if (arvif->nohwcrypt &&
5594 !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
5595 ret = -EINVAL;
5596 ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
5597 goto err;
5598 }
5599
5600 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev create %d (add interface) type %d subtype %d bcnmode %s\n",
5601 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5602 arvif->beacon_buf ? "single-buf" : "per-skb");
5603
5604 ret = ath10k_wmi_vdev_create(ar, arvif->vdev_id, arvif->vdev_type,
5605 arvif->vdev_subtype, vif->addr);
5606 if (ret) {
5607 ath10k_warn(ar, "failed to create WMI vdev %i: %d\n",
5608 arvif->vdev_id, ret);
5609 goto err;
5610 }
5611
5612 if (test_bit(WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
5613 ar->wmi.svc_map)) {
5614 vdev_param = ar->wmi.vdev_param->disable_4addr_src_lrn;
5615 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5616 WMI_VDEV_DISABLE_4_ADDR_SRC_LRN);
5617 if (ret && ret != -EOPNOTSUPP) {
5618 ath10k_warn(ar, "failed to disable 4addr src lrn vdev %i: %d\n",
5619 arvif->vdev_id, ret);
5620 }
5621 }
5622
5623 ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
5624 spin_lock_bh(&ar->data_lock);
5625 list_add(&arvif->list, &ar->arvifs);
5626 spin_unlock_bh(&ar->data_lock);
5627
5628 /* It makes no sense to have firmware do keepalives. mac80211 already
5629 * takes care of this with idle connection polling.
5630 */
5631 ret = ath10k_mac_vif_disable_keepalive(arvif);
5632 if (ret) {
5633 ath10k_warn(ar, "failed to disable keepalive on vdev %i: %d\n",
5634 arvif->vdev_id, ret);
5635 goto err_vdev_delete;
5636 }
5637
5638 arvif->def_wep_key_idx = -1;
5639
5640 vdev_param = ar->wmi.vdev_param->tx_encap_type;
5641 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5642 ATH10K_HW_TXRX_NATIVE_WIFI);
5643 /* 10.X firmware does not support this VDEV parameter. Do not warn */
5644 if (ret && ret != -EOPNOTSUPP) {
5645 ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
5646 arvif->vdev_id, ret);
5647 goto err_vdev_delete;
5648 }
5649
5650 /* Configuring number of spatial stream for monitor interface is causing
5651 * target assert in qca9888 and qca6174.
5652 */
5653 if (ar->cfg_tx_chainmask && (vif->type != NL80211_IFTYPE_MONITOR)) {
5654 u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
5655
5656 vdev_param = ar->wmi.vdev_param->nss;
5657 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5658 nss);
5659 if (ret) {
5660 ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
5661 arvif->vdev_id, ar->cfg_tx_chainmask, nss,
5662 ret);
5663 goto err_vdev_delete;
5664 }
5665 }
5666
5667 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5668 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5669 ret = ath10k_peer_create(ar, vif, NULL, arvif->vdev_id,
5670 vif->addr, WMI_PEER_TYPE_DEFAULT);
5671 if (ret) {
5672 ath10k_warn(ar, "failed to create vdev %i peer for AP/IBSS: %d\n",
5673 arvif->vdev_id, ret);
5674 goto err_vdev_delete;
5675 }
5676
5677 spin_lock_bh(&ar->data_lock);
5678
5679 peer = ath10k_peer_find(ar, arvif->vdev_id, vif->addr);
5680 if (!peer) {
5681 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
5682 vif->addr, arvif->vdev_id);
5683 spin_unlock_bh(&ar->data_lock);
5684 ret = -ENOENT;
5685 goto err_peer_delete;
5686 }
5687
5688 arvif->peer_id = find_first_bit(peer->peer_ids,
5689 ATH10K_MAX_NUM_PEER_IDS);
5690
5691 spin_unlock_bh(&ar->data_lock);
5692 } else {
5693 arvif->peer_id = HTT_INVALID_PEERID;
5694 }
5695
5696 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5697 ret = ath10k_mac_set_kickout(arvif);
5698 if (ret) {
5699 ath10k_warn(ar, "failed to set vdev %i kickout parameters: %d\n",
5700 arvif->vdev_id, ret);
5701 goto err_peer_delete;
5702 }
5703 }
5704
5705 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
5706 param = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5707 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5708 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5709 param, value);
5710 if (ret) {
5711 ath10k_warn(ar, "failed to set vdev %i RX wake policy: %d\n",
5712 arvif->vdev_id, ret);
5713 goto err_peer_delete;
5714 }
5715
5716 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
5717 if (ret) {
5718 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
5719 arvif->vdev_id, ret);
5720 goto err_peer_delete;
5721 }
5722
5723 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
5724 if (ret) {
5725 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
5726 arvif->vdev_id, ret);
5727 goto err_peer_delete;
5728 }
5729 }
5730
5731 ret = ath10k_mac_set_txbf_conf(arvif);
5732 if (ret) {
5733 ath10k_warn(ar, "failed to set txbf for vdev %d: %d\n",
5734 arvif->vdev_id, ret);
5735 goto err_peer_delete;
5736 }
5737
5738 ret = ath10k_mac_set_rts(arvif, ar->hw->wiphy->rts_threshold);
5739 if (ret) {
5740 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
5741 arvif->vdev_id, ret);
5742 goto err_peer_delete;
5743 }
5744
5745 arvif->txpower = vif->bss_conf.txpower;
5746 ret = ath10k_mac_txpower_recalc(ar);
5747 if (ret) {
5748 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5749 goto err_peer_delete;
5750 }
5751
5752 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
5753 vdev_param = ar->wmi.vdev_param->rtt_responder_role;
5754 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5755 arvif->ftm_responder);
5756
5757 /* It is harmless to not set FTM role. Do not warn */
5758 if (ret && ret != -EOPNOTSUPP)
5759 ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n",
5760 arvif->vdev_id, ret);
5761 }
5762
5763 if (vif->type == NL80211_IFTYPE_MONITOR) {
5764 ar->monitor_arvif = arvif;
5765 ret = ath10k_monitor_recalc(ar);
5766 if (ret) {
5767 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5768 goto err_peer_delete;
5769 }
5770 }
5771
5772 spin_lock_bh(&ar->htt.tx_lock);
5773 if (!ar->tx_paused)
5774 ieee80211_wake_queue(ar->hw, arvif->vdev_id);
5775 spin_unlock_bh(&ar->htt.tx_lock);
5776
5777 mutex_unlock(&ar->conf_mutex);
5778 return 0;
5779
5780 err_peer_delete:
5781 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5782 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5783 ath10k_wmi_peer_delete(ar, arvif->vdev_id, vif->addr);
5784 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5785 vif->addr);
5786 }
5787
5788 err_vdev_delete:
5789 ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5790 ar->free_vdev_map |= 1LL << arvif->vdev_id;
5791 spin_lock_bh(&ar->data_lock);
5792 list_del(&arvif->list);
5793 spin_unlock_bh(&ar->data_lock);
5794
5795 err:
5796 if (arvif->beacon_buf) {
5797 dma_free_coherent(ar->dev, IEEE80211_MAX_FRAME_LEN,
5798 arvif->beacon_buf, arvif->beacon_paddr);
5799 arvif->beacon_buf = NULL;
5800 }
5801
5802 mutex_unlock(&ar->conf_mutex);
5803
5804 return ret;
5805 }
5806
ath10k_mac_vif_tx_unlock_all(struct ath10k_vif * arvif)5807 static void ath10k_mac_vif_tx_unlock_all(struct ath10k_vif *arvif)
5808 {
5809 int i;
5810
5811 for (i = 0; i < BITS_PER_LONG; i++)
5812 ath10k_mac_vif_tx_unlock(arvif, i);
5813 }
5814
ath10k_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5815 static void ath10k_remove_interface(struct ieee80211_hw *hw,
5816 struct ieee80211_vif *vif)
5817 {
5818 struct ath10k *ar = hw->priv;
5819 struct ath10k_vif *arvif = (void *)vif->drv_priv;
5820 struct ath10k_peer *peer;
5821 unsigned long time_left;
5822 int ret;
5823 int i;
5824
5825 cancel_work_sync(&arvif->ap_csa_work);
5826 cancel_delayed_work_sync(&arvif->connection_loss_work);
5827
5828 mutex_lock(&ar->conf_mutex);
5829
5830 ret = ath10k_spectral_vif_stop(arvif);
5831 if (ret)
5832 ath10k_warn(ar, "failed to stop spectral for vdev %i: %d\n",
5833 arvif->vdev_id, ret);
5834
5835 ar->free_vdev_map |= 1LL << arvif->vdev_id;
5836 spin_lock_bh(&ar->data_lock);
5837 list_del(&arvif->list);
5838 spin_unlock_bh(&ar->data_lock);
5839
5840 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5841 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5842 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
5843 vif->addr);
5844 if (ret)
5845 ath10k_warn(ar, "failed to submit AP/IBSS self-peer removal on vdev %i: %d\n",
5846 arvif->vdev_id, ret);
5847
5848 ath10k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5849 vif->addr);
5850 kfree(arvif->u.ap.noa_data);
5851 }
5852
5853 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %i delete (remove interface)\n",
5854 arvif->vdev_id);
5855
5856 ret = ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
5857 if (ret)
5858 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
5859 arvif->vdev_id, ret);
5860
5861 if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) {
5862 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
5863 ATH10K_VDEV_DELETE_TIMEOUT_HZ);
5864 if (time_left == 0) {
5865 ath10k_warn(ar, "Timeout in receiving vdev delete response\n");
5866 goto out;
5867 }
5868 }
5869
5870 /* Some firmware revisions don't notify host about self-peer removal
5871 * until after associated vdev is deleted.
5872 */
5873 if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
5874 arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
5875 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
5876 vif->addr);
5877 if (ret)
5878 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
5879 arvif->vdev_id, ret);
5880
5881 spin_lock_bh(&ar->data_lock);
5882 ar->num_peers--;
5883 spin_unlock_bh(&ar->data_lock);
5884 }
5885
5886 spin_lock_bh(&ar->data_lock);
5887 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
5888 peer = ar->peer_map[i];
5889 if (!peer)
5890 continue;
5891
5892 if (peer->vif == vif) {
5893 ath10k_warn(ar, "found vif peer %pM entry on vdev %i after it was supposedly removed\n",
5894 vif->addr, arvif->vdev_id);
5895 peer->vif = NULL;
5896 }
5897 }
5898
5899 /* Clean this up late, less opportunity for firmware to access
5900 * DMA memory we have deleted.
5901 */
5902 ath10k_mac_vif_beacon_cleanup(arvif);
5903 spin_unlock_bh(&ar->data_lock);
5904
5905 ath10k_peer_cleanup(ar, arvif->vdev_id);
5906 ath10k_mac_txq_unref(ar, vif->txq);
5907
5908 if (vif->type == NL80211_IFTYPE_MONITOR) {
5909 ar->monitor_arvif = NULL;
5910 ret = ath10k_monitor_recalc(ar);
5911 if (ret)
5912 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5913 }
5914
5915 ret = ath10k_mac_txpower_recalc(ar);
5916 if (ret)
5917 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
5918
5919 spin_lock_bh(&ar->htt.tx_lock);
5920 ath10k_mac_vif_tx_unlock_all(arvif);
5921 spin_unlock_bh(&ar->htt.tx_lock);
5922
5923 ath10k_mac_txq_unref(ar, vif->txq);
5924
5925 out:
5926 mutex_unlock(&ar->conf_mutex);
5927 }
5928
5929 /*
5930 * FIXME: Has to be verified.
5931 */
5932 #define SUPPORTED_FILTERS \
5933 (FIF_ALLMULTI | \
5934 FIF_CONTROL | \
5935 FIF_PSPOLL | \
5936 FIF_OTHER_BSS | \
5937 FIF_BCN_PRBRESP_PROMISC | \
5938 FIF_PROBE_REQ | \
5939 FIF_FCSFAIL)
5940
ath10k_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)5941 static void ath10k_configure_filter(struct ieee80211_hw *hw,
5942 unsigned int changed_flags,
5943 unsigned int *total_flags,
5944 u64 multicast)
5945 {
5946 struct ath10k *ar = hw->priv;
5947 int ret;
5948
5949 mutex_lock(&ar->conf_mutex);
5950
5951 changed_flags &= SUPPORTED_FILTERS;
5952 *total_flags &= SUPPORTED_FILTERS;
5953 ar->filter_flags = *total_flags;
5954
5955 ret = ath10k_monitor_recalc(ar);
5956 if (ret)
5957 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
5958
5959 mutex_unlock(&ar->conf_mutex);
5960 }
5961
ath10k_recalculate_mgmt_rate(struct ath10k * ar,struct ieee80211_vif * vif,struct cfg80211_chan_def * def)5962 static void ath10k_recalculate_mgmt_rate(struct ath10k *ar,
5963 struct ieee80211_vif *vif,
5964 struct cfg80211_chan_def *def)
5965 {
5966 struct ath10k_vif *arvif = (void *)vif->drv_priv;
5967 const struct ieee80211_supported_band *sband;
5968 u8 basic_rate_idx;
5969 int hw_rate_code;
5970 u32 vdev_param;
5971 u16 bitrate;
5972 int ret;
5973
5974 lockdep_assert_held(&ar->conf_mutex);
5975
5976 sband = ar->hw->wiphy->bands[def->chan->band];
5977 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
5978 bitrate = sband->bitrates[basic_rate_idx].bitrate;
5979
5980 hw_rate_code = ath10k_mac_get_rate_hw_value(bitrate);
5981 if (hw_rate_code < 0) {
5982 ath10k_warn(ar, "bitrate not supported %d\n", bitrate);
5983 return;
5984 }
5985
5986 vdev_param = ar->wmi.vdev_param->mgmt_rate;
5987 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
5988 hw_rate_code);
5989 if (ret)
5990 ath10k_warn(ar, "failed to set mgmt tx rate %d\n", ret);
5991 }
5992
ath10k_bss_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u32 changed)5993 static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
5994 struct ieee80211_vif *vif,
5995 struct ieee80211_bss_conf *info,
5996 u32 changed)
5997 {
5998 struct ath10k *ar = hw->priv;
5999 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6000 struct cfg80211_chan_def def;
6001 u32 vdev_param, pdev_param, slottime, preamble;
6002 u16 bitrate, hw_value;
6003 u8 rate, rateidx;
6004 int ret = 0, mcast_rate;
6005 enum nl80211_band band;
6006
6007 mutex_lock(&ar->conf_mutex);
6008
6009 if (changed & BSS_CHANGED_IBSS)
6010 ath10k_control_ibss(arvif, info, vif->addr);
6011
6012 if (changed & BSS_CHANGED_BEACON_INT) {
6013 arvif->beacon_interval = info->beacon_int;
6014 vdev_param = ar->wmi.vdev_param->beacon_interval;
6015 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6016 arvif->beacon_interval);
6017 ath10k_dbg(ar, ATH10K_DBG_MAC,
6018 "mac vdev %d beacon_interval %d\n",
6019 arvif->vdev_id, arvif->beacon_interval);
6020
6021 if (ret)
6022 ath10k_warn(ar, "failed to set beacon interval for vdev %d: %i\n",
6023 arvif->vdev_id, ret);
6024 }
6025
6026 if (changed & BSS_CHANGED_BEACON) {
6027 ath10k_dbg(ar, ATH10K_DBG_MAC,
6028 "vdev %d set beacon tx mode to staggered\n",
6029 arvif->vdev_id);
6030
6031 pdev_param = ar->wmi.pdev_param->beacon_tx_mode;
6032 ret = ath10k_wmi_pdev_set_param(ar, pdev_param,
6033 WMI_BEACON_STAGGERED_MODE);
6034 if (ret)
6035 ath10k_warn(ar, "failed to set beacon mode for vdev %d: %i\n",
6036 arvif->vdev_id, ret);
6037
6038 ret = ath10k_mac_setup_bcn_tmpl(arvif);
6039 if (ret)
6040 ath10k_warn(ar, "failed to update beacon template: %d\n",
6041 ret);
6042
6043 if (ieee80211_vif_is_mesh(vif)) {
6044 /* mesh doesn't use SSID but firmware needs it */
6045 strncpy(arvif->u.ap.ssid, "mesh",
6046 sizeof(arvif->u.ap.ssid));
6047 arvif->u.ap.ssid_len = 4;
6048 }
6049 }
6050
6051 if (changed & BSS_CHANGED_AP_PROBE_RESP) {
6052 ret = ath10k_mac_setup_prb_tmpl(arvif);
6053 if (ret)
6054 ath10k_warn(ar, "failed to setup probe resp template on vdev %i: %d\n",
6055 arvif->vdev_id, ret);
6056 }
6057
6058 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
6059 arvif->dtim_period = info->dtim_period;
6060
6061 ath10k_dbg(ar, ATH10K_DBG_MAC,
6062 "mac vdev %d dtim_period %d\n",
6063 arvif->vdev_id, arvif->dtim_period);
6064
6065 vdev_param = ar->wmi.vdev_param->dtim_period;
6066 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6067 arvif->dtim_period);
6068 if (ret)
6069 ath10k_warn(ar, "failed to set dtim period for vdev %d: %i\n",
6070 arvif->vdev_id, ret);
6071 }
6072
6073 if (changed & BSS_CHANGED_SSID &&
6074 vif->type == NL80211_IFTYPE_AP) {
6075 arvif->u.ap.ssid_len = info->ssid_len;
6076 if (info->ssid_len)
6077 memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
6078 arvif->u.ap.hidden_ssid = info->hidden_ssid;
6079 }
6080
6081 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
6082 ether_addr_copy(arvif->bssid, info->bssid);
6083
6084 if (changed & BSS_CHANGED_FTM_RESPONDER &&
6085 arvif->ftm_responder != info->ftm_responder &&
6086 test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
6087 arvif->ftm_responder = info->ftm_responder;
6088
6089 vdev_param = ar->wmi.vdev_param->rtt_responder_role;
6090 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6091 arvif->ftm_responder);
6092
6093 ath10k_dbg(ar, ATH10K_DBG_MAC,
6094 "mac vdev %d ftm_responder %d:ret %d\n",
6095 arvif->vdev_id, arvif->ftm_responder, ret);
6096 }
6097
6098 if (changed & BSS_CHANGED_BEACON_ENABLED)
6099 ath10k_control_beaconing(arvif, info);
6100
6101 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
6102 arvif->use_cts_prot = info->use_cts_prot;
6103
6104 ret = ath10k_recalc_rtscts_prot(arvif);
6105 if (ret)
6106 ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n",
6107 arvif->vdev_id, ret);
6108
6109 if (ath10k_mac_can_set_cts_prot(arvif)) {
6110 ret = ath10k_mac_set_cts_prot(arvif);
6111 if (ret)
6112 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
6113 arvif->vdev_id, ret);
6114 }
6115 }
6116
6117 if (changed & BSS_CHANGED_ERP_SLOT) {
6118 if (info->use_short_slot)
6119 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
6120
6121 else
6122 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
6123
6124 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d slot_time %d\n",
6125 arvif->vdev_id, slottime);
6126
6127 vdev_param = ar->wmi.vdev_param->slot_time;
6128 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6129 slottime);
6130 if (ret)
6131 ath10k_warn(ar, "failed to set erp slot for vdev %d: %i\n",
6132 arvif->vdev_id, ret);
6133 }
6134
6135 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
6136 if (info->use_short_preamble)
6137 preamble = WMI_VDEV_PREAMBLE_SHORT;
6138 else
6139 preamble = WMI_VDEV_PREAMBLE_LONG;
6140
6141 ath10k_dbg(ar, ATH10K_DBG_MAC,
6142 "mac vdev %d preamble %dn",
6143 arvif->vdev_id, preamble);
6144
6145 vdev_param = ar->wmi.vdev_param->preamble;
6146 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6147 preamble);
6148 if (ret)
6149 ath10k_warn(ar, "failed to set preamble for vdev %d: %i\n",
6150 arvif->vdev_id, ret);
6151 }
6152
6153 if (changed & BSS_CHANGED_ASSOC) {
6154 if (info->assoc) {
6155 /* Workaround: Make sure monitor vdev is not running
6156 * when associating to prevent some firmware revisions
6157 * (e.g. 10.1 and 10.2) from crashing.
6158 */
6159 if (ar->monitor_started)
6160 ath10k_monitor_stop(ar);
6161 ath10k_bss_assoc(hw, vif, info);
6162 ath10k_monitor_recalc(ar);
6163 } else {
6164 ath10k_bss_disassoc(hw, vif);
6165 }
6166 }
6167
6168 if (changed & BSS_CHANGED_TXPOWER) {
6169 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev_id %i txpower %d\n",
6170 arvif->vdev_id, info->txpower);
6171
6172 arvif->txpower = info->txpower;
6173 ret = ath10k_mac_txpower_recalc(ar);
6174 if (ret)
6175 ath10k_warn(ar, "failed to recalc tx power: %d\n", ret);
6176 }
6177
6178 if (changed & BSS_CHANGED_PS) {
6179 arvif->ps = vif->bss_conf.ps;
6180
6181 ret = ath10k_config_ps(ar);
6182 if (ret)
6183 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
6184 arvif->vdev_id, ret);
6185 }
6186
6187 if (changed & BSS_CHANGED_MCAST_RATE &&
6188 !ath10k_mac_vif_chan(arvif->vif, &def)) {
6189 band = def.chan->band;
6190 mcast_rate = vif->bss_conf.mcast_rate[band];
6191 if (mcast_rate > 0)
6192 rateidx = mcast_rate - 1;
6193 else
6194 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
6195
6196 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
6197 rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
6198
6199 bitrate = ath10k_wmi_legacy_rates[rateidx].bitrate;
6200 hw_value = ath10k_wmi_legacy_rates[rateidx].hw_value;
6201 if (ath10k_mac_bitrate_is_cck(bitrate))
6202 preamble = WMI_RATE_PREAMBLE_CCK;
6203 else
6204 preamble = WMI_RATE_PREAMBLE_OFDM;
6205
6206 rate = ATH10K_HW_RATECODE(hw_value, 0, preamble);
6207
6208 ath10k_dbg(ar, ATH10K_DBG_MAC,
6209 "mac vdev %d mcast_rate %x\n",
6210 arvif->vdev_id, rate);
6211
6212 vdev_param = ar->wmi.vdev_param->mcast_data_rate;
6213 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6214 vdev_param, rate);
6215 if (ret)
6216 ath10k_warn(ar,
6217 "failed to set mcast rate on vdev %i: %d\n",
6218 arvif->vdev_id, ret);
6219
6220 vdev_param = ar->wmi.vdev_param->bcast_data_rate;
6221 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
6222 vdev_param, rate);
6223 if (ret)
6224 ath10k_warn(ar,
6225 "failed to set bcast rate on vdev %i: %d\n",
6226 arvif->vdev_id, ret);
6227 }
6228
6229 if (changed & BSS_CHANGED_BASIC_RATES &&
6230 !ath10k_mac_vif_chan(arvif->vif, &def))
6231 ath10k_recalculate_mgmt_rate(ar, vif, &def);
6232
6233 mutex_unlock(&ar->conf_mutex);
6234 }
6235
ath10k_mac_op_set_coverage_class(struct ieee80211_hw * hw,s16 value)6236 static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw *hw, s16 value)
6237 {
6238 struct ath10k *ar = hw->priv;
6239
6240 /* This function should never be called if setting the coverage class
6241 * is not supported on this hardware.
6242 */
6243 if (!ar->hw_params.hw_ops->set_coverage_class) {
6244 WARN_ON_ONCE(1);
6245 return;
6246 }
6247 ar->hw_params.hw_ops->set_coverage_class(ar, value);
6248 }
6249
6250 struct ath10k_mac_tdls_iter_data {
6251 u32 num_tdls_stations;
6252 struct ieee80211_vif *curr_vif;
6253 };
6254
ath10k_mac_tdls_vif_stations_count_iter(void * data,struct ieee80211_sta * sta)6255 static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
6256 struct ieee80211_sta *sta)
6257 {
6258 struct ath10k_mac_tdls_iter_data *iter_data = data;
6259 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
6260 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
6261
6262 if (sta->tdls && sta_vif == iter_data->curr_vif)
6263 iter_data->num_tdls_stations++;
6264 }
6265
ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw * hw,struct ieee80211_vif * vif)6266 static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
6267 struct ieee80211_vif *vif)
6268 {
6269 struct ath10k_mac_tdls_iter_data data = {};
6270
6271 data.curr_vif = vif;
6272
6273 ieee80211_iterate_stations_atomic(hw,
6274 ath10k_mac_tdls_vif_stations_count_iter,
6275 &data);
6276 return data.num_tdls_stations;
6277 }
6278
ath10k_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req)6279 static int ath10k_hw_scan(struct ieee80211_hw *hw,
6280 struct ieee80211_vif *vif,
6281 struct ieee80211_scan_request *hw_req)
6282 {
6283 struct ath10k *ar = hw->priv;
6284 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6285 struct cfg80211_scan_request *req = &hw_req->req;
6286 struct wmi_start_scan_arg arg;
6287 int ret = 0;
6288 int i;
6289 u32 scan_timeout;
6290
6291 mutex_lock(&ar->conf_mutex);
6292
6293 if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
6294 ret = -EBUSY;
6295 goto exit;
6296 }
6297
6298 spin_lock_bh(&ar->data_lock);
6299 switch (ar->scan.state) {
6300 case ATH10K_SCAN_IDLE:
6301 reinit_completion(&ar->scan.started);
6302 reinit_completion(&ar->scan.completed);
6303 ar->scan.state = ATH10K_SCAN_STARTING;
6304 ar->scan.is_roc = false;
6305 ar->scan.vdev_id = arvif->vdev_id;
6306 ret = 0;
6307 break;
6308 case ATH10K_SCAN_STARTING:
6309 case ATH10K_SCAN_RUNNING:
6310 case ATH10K_SCAN_ABORTING:
6311 ret = -EBUSY;
6312 break;
6313 }
6314 spin_unlock_bh(&ar->data_lock);
6315
6316 if (ret)
6317 goto exit;
6318
6319 memset(&arg, 0, sizeof(arg));
6320 ath10k_wmi_start_scan_init(ar, &arg);
6321 arg.vdev_id = arvif->vdev_id;
6322 arg.scan_id = ATH10K_SCAN_ID;
6323
6324 if (req->ie_len) {
6325 arg.ie_len = req->ie_len;
6326 memcpy(arg.ie, req->ie, arg.ie_len);
6327 }
6328
6329 if (req->n_ssids) {
6330 arg.n_ssids = req->n_ssids;
6331 for (i = 0; i < arg.n_ssids; i++) {
6332 arg.ssids[i].len = req->ssids[i].ssid_len;
6333 arg.ssids[i].ssid = req->ssids[i].ssid;
6334 }
6335 } else {
6336 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
6337 }
6338
6339 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
6340 arg.scan_ctrl_flags |= WMI_SCAN_ADD_SPOOFED_MAC_IN_PROBE_REQ;
6341 ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
6342 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
6343 }
6344
6345 if (req->n_channels) {
6346 arg.n_channels = req->n_channels;
6347 for (i = 0; i < arg.n_channels; i++)
6348 arg.channels[i] = req->channels[i]->center_freq;
6349 }
6350
6351 /* if duration is set, default dwell times will be overwritten */
6352 if (req->duration) {
6353 arg.dwell_time_active = req->duration;
6354 arg.dwell_time_passive = req->duration;
6355 arg.burst_duration_ms = req->duration;
6356
6357 scan_timeout = min_t(u32, arg.max_rest_time *
6358 (arg.n_channels - 1) + (req->duration +
6359 ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
6360 arg.n_channels, arg.max_scan_time + 200);
6361
6362 } else {
6363 /* Add a 200ms margin to account for event/command processing */
6364 scan_timeout = arg.max_scan_time + 200;
6365 }
6366
6367 ret = ath10k_start_scan(ar, &arg);
6368 if (ret) {
6369 ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
6370 spin_lock_bh(&ar->data_lock);
6371 ar->scan.state = ATH10K_SCAN_IDLE;
6372 spin_unlock_bh(&ar->data_lock);
6373 }
6374
6375 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
6376 msecs_to_jiffies(scan_timeout));
6377
6378 exit:
6379 mutex_unlock(&ar->conf_mutex);
6380 return ret;
6381 }
6382
ath10k_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)6383 static void ath10k_cancel_hw_scan(struct ieee80211_hw *hw,
6384 struct ieee80211_vif *vif)
6385 {
6386 struct ath10k *ar = hw->priv;
6387
6388 mutex_lock(&ar->conf_mutex);
6389 ath10k_scan_abort(ar);
6390 mutex_unlock(&ar->conf_mutex);
6391
6392 cancel_delayed_work_sync(&ar->scan.timeout);
6393 }
6394
ath10k_set_key_h_def_keyidx(struct ath10k * ar,struct ath10k_vif * arvif,enum set_key_cmd cmd,struct ieee80211_key_conf * key)6395 static void ath10k_set_key_h_def_keyidx(struct ath10k *ar,
6396 struct ath10k_vif *arvif,
6397 enum set_key_cmd cmd,
6398 struct ieee80211_key_conf *key)
6399 {
6400 u32 vdev_param = arvif->ar->wmi.vdev_param->def_keyid;
6401 int ret;
6402
6403 /* 10.1 firmware branch requires default key index to be set to group
6404 * key index after installing it. Otherwise FW/HW Txes corrupted
6405 * frames with multi-vif APs. This is not required for main firmware
6406 * branch (e.g. 636).
6407 *
6408 * This is also needed for 636 fw for IBSS-RSN to work more reliably.
6409 *
6410 * FIXME: It remains unknown if this is required for multi-vif STA
6411 * interfaces on 10.1.
6412 */
6413
6414 if (arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6415 arvif->vdev_type != WMI_VDEV_TYPE_IBSS)
6416 return;
6417
6418 if (key->cipher == WLAN_CIPHER_SUITE_WEP40)
6419 return;
6420
6421 if (key->cipher == WLAN_CIPHER_SUITE_WEP104)
6422 return;
6423
6424 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6425 return;
6426
6427 if (cmd != SET_KEY)
6428 return;
6429
6430 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
6431 key->keyidx);
6432 if (ret)
6433 ath10k_warn(ar, "failed to set vdev %i group key as default key: %d\n",
6434 arvif->vdev_id, ret);
6435 }
6436
ath10k_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)6437 static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
6438 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
6439 struct ieee80211_key_conf *key)
6440 {
6441 struct ath10k *ar = hw->priv;
6442 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6443 struct ath10k_sta *arsta;
6444 struct ath10k_peer *peer;
6445 const u8 *peer_addr;
6446 bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
6447 key->cipher == WLAN_CIPHER_SUITE_WEP104;
6448 int ret = 0;
6449 int ret2;
6450 u32 flags = 0;
6451 u32 flags2;
6452
6453 /* this one needs to be done in software */
6454 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
6455 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
6456 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
6457 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
6458 return 1;
6459
6460 if (arvif->nohwcrypt)
6461 return 1;
6462
6463 if (key->keyidx > WMI_MAX_KEY_INDEX)
6464 return -ENOSPC;
6465
6466 mutex_lock(&ar->conf_mutex);
6467
6468 if (sta) {
6469 arsta = (struct ath10k_sta *)sta->drv_priv;
6470 peer_addr = sta->addr;
6471 spin_lock_bh(&ar->data_lock);
6472 arsta->ucast_cipher = key->cipher;
6473 spin_unlock_bh(&ar->data_lock);
6474 } else if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
6475 peer_addr = vif->bss_conf.bssid;
6476 } else {
6477 peer_addr = vif->addr;
6478 }
6479
6480 key->hw_key_idx = key->keyidx;
6481
6482 if (is_wep) {
6483 if (cmd == SET_KEY)
6484 arvif->wep_keys[key->keyidx] = key;
6485 else
6486 arvif->wep_keys[key->keyidx] = NULL;
6487 }
6488
6489 /* the peer should not disappear in mid-way (unless FW goes awry) since
6490 * we already hold conf_mutex. we just make sure its there now.
6491 */
6492 spin_lock_bh(&ar->data_lock);
6493 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6494 spin_unlock_bh(&ar->data_lock);
6495
6496 if (!peer) {
6497 if (cmd == SET_KEY) {
6498 ath10k_warn(ar, "failed to install key for non-existent peer %pM\n",
6499 peer_addr);
6500 ret = -EOPNOTSUPP;
6501 goto exit;
6502 } else {
6503 /* if the peer doesn't exist there is no key to disable anymore */
6504 goto exit;
6505 }
6506 }
6507
6508 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
6509 flags |= WMI_KEY_PAIRWISE;
6510 else
6511 flags |= WMI_KEY_GROUP;
6512
6513 if (is_wep) {
6514 if (cmd == DISABLE_KEY)
6515 ath10k_clear_vdev_key(arvif, key);
6516
6517 /* When WEP keys are uploaded it's possible that there are
6518 * stations associated already (e.g. when merging) without any
6519 * keys. Static WEP needs an explicit per-peer key upload.
6520 */
6521 if (vif->type == NL80211_IFTYPE_ADHOC &&
6522 cmd == SET_KEY)
6523 ath10k_mac_vif_update_wep_key(arvif, key);
6524
6525 /* 802.1x never sets the def_wep_key_idx so each set_key()
6526 * call changes default tx key.
6527 *
6528 * Static WEP sets def_wep_key_idx via .set_default_unicast_key
6529 * after first set_key().
6530 */
6531 if (cmd == SET_KEY && arvif->def_wep_key_idx == -1)
6532 flags |= WMI_KEY_TX_USAGE;
6533 }
6534
6535 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags);
6536 if (ret) {
6537 WARN_ON(ret > 0);
6538 ath10k_warn(ar, "failed to install key for vdev %i peer %pM: %d\n",
6539 arvif->vdev_id, peer_addr, ret);
6540 goto exit;
6541 }
6542
6543 /* mac80211 sets static WEP keys as groupwise while firmware requires
6544 * them to be installed twice as both pairwise and groupwise.
6545 */
6546 if (is_wep && !sta && vif->type == NL80211_IFTYPE_STATION) {
6547 flags2 = flags;
6548 flags2 &= ~WMI_KEY_GROUP;
6549 flags2 |= WMI_KEY_PAIRWISE;
6550
6551 ret = ath10k_install_key(arvif, key, cmd, peer_addr, flags2);
6552 if (ret) {
6553 WARN_ON(ret > 0);
6554 ath10k_warn(ar, "failed to install (ucast) key for vdev %i peer %pM: %d\n",
6555 arvif->vdev_id, peer_addr, ret);
6556 ret2 = ath10k_install_key(arvif, key, DISABLE_KEY,
6557 peer_addr, flags);
6558 if (ret2) {
6559 WARN_ON(ret2 > 0);
6560 ath10k_warn(ar, "failed to disable (mcast) key for vdev %i peer %pM: %d\n",
6561 arvif->vdev_id, peer_addr, ret2);
6562 }
6563 goto exit;
6564 }
6565 }
6566
6567 ath10k_set_key_h_def_keyidx(ar, arvif, cmd, key);
6568
6569 spin_lock_bh(&ar->data_lock);
6570 peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
6571 if (peer && cmd == SET_KEY)
6572 peer->keys[key->keyidx] = key;
6573 else if (peer && cmd == DISABLE_KEY)
6574 peer->keys[key->keyidx] = NULL;
6575 else if (peer == NULL)
6576 /* impossible unless FW goes crazy */
6577 ath10k_warn(ar, "Peer %pM disappeared!\n", peer_addr);
6578 spin_unlock_bh(&ar->data_lock);
6579
6580 if (sta && sta->tdls)
6581 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6582 ar->wmi.peer_param->authorize, 1);
6583 else if (sta && cmd == SET_KEY && (key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
6584 ath10k_wmi_peer_set_param(ar, arvif->vdev_id, peer_addr,
6585 ar->wmi.peer_param->authorize, 1);
6586
6587 exit:
6588 mutex_unlock(&ar->conf_mutex);
6589 return ret;
6590 }
6591
ath10k_set_default_unicast_key(struct ieee80211_hw * hw,struct ieee80211_vif * vif,int keyidx)6592 static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
6593 struct ieee80211_vif *vif,
6594 int keyidx)
6595 {
6596 struct ath10k *ar = hw->priv;
6597 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6598 int ret;
6599
6600 mutex_lock(&arvif->ar->conf_mutex);
6601
6602 if (arvif->ar->state != ATH10K_STATE_ON)
6603 goto unlock;
6604
6605 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
6606 arvif->vdev_id, keyidx);
6607
6608 ret = ath10k_wmi_vdev_set_param(arvif->ar,
6609 arvif->vdev_id,
6610 arvif->ar->wmi.vdev_param->def_keyid,
6611 keyidx);
6612
6613 if (ret) {
6614 ath10k_warn(ar, "failed to update wep key index for vdev %d: %d\n",
6615 arvif->vdev_id,
6616 ret);
6617 goto unlock;
6618 }
6619
6620 arvif->def_wep_key_idx = keyidx;
6621
6622 unlock:
6623 mutex_unlock(&arvif->ar->conf_mutex);
6624 }
6625
ath10k_sta_rc_update_wk(struct work_struct * wk)6626 static void ath10k_sta_rc_update_wk(struct work_struct *wk)
6627 {
6628 struct ath10k *ar;
6629 struct ath10k_vif *arvif;
6630 struct ath10k_sta *arsta;
6631 struct ieee80211_sta *sta;
6632 struct cfg80211_chan_def def;
6633 enum nl80211_band band;
6634 const u8 *ht_mcs_mask;
6635 const u16 *vht_mcs_mask;
6636 u32 changed, bw, nss, smps;
6637 int err;
6638
6639 arsta = container_of(wk, struct ath10k_sta, update_wk);
6640 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
6641 arvif = arsta->arvif;
6642 ar = arvif->ar;
6643
6644 if (WARN_ON(ath10k_mac_vif_chan(arvif->vif, &def)))
6645 return;
6646
6647 band = def.chan->band;
6648 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
6649 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
6650
6651 spin_lock_bh(&ar->data_lock);
6652
6653 changed = arsta->changed;
6654 arsta->changed = 0;
6655
6656 bw = arsta->bw;
6657 nss = arsta->nss;
6658 smps = arsta->smps;
6659
6660 spin_unlock_bh(&ar->data_lock);
6661
6662 mutex_lock(&ar->conf_mutex);
6663
6664 nss = max_t(u32, 1, nss);
6665 nss = min(nss, max(ath10k_mac_max_ht_nss(ht_mcs_mask),
6666 ath10k_mac_max_vht_nss(vht_mcs_mask)));
6667
6668 if (changed & IEEE80211_RC_BW_CHANGED) {
6669 enum wmi_phy_mode mode;
6670
6671 mode = chan_to_phymode(&def);
6672 ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM peer bw %d phymode %d\n",
6673 sta->addr, bw, mode);
6674
6675 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6676 ar->wmi.peer_param->phymode, mode);
6677 if (err) {
6678 ath10k_warn(ar, "failed to update STA %pM peer phymode %d: %d\n",
6679 sta->addr, mode, err);
6680 goto exit;
6681 }
6682
6683 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6684 ar->wmi.peer_param->chan_width, bw);
6685 if (err)
6686 ath10k_warn(ar, "failed to update STA %pM peer bw %d: %d\n",
6687 sta->addr, bw, err);
6688 }
6689
6690 if (changed & IEEE80211_RC_NSS_CHANGED) {
6691 ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM nss %d\n",
6692 sta->addr, nss);
6693
6694 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6695 ar->wmi.peer_param->nss, nss);
6696 if (err)
6697 ath10k_warn(ar, "failed to update STA %pM nss %d: %d\n",
6698 sta->addr, nss, err);
6699 }
6700
6701 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6702 ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM smps %d\n",
6703 sta->addr, smps);
6704
6705 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6706 ar->wmi.peer_param->smps_state, smps);
6707 if (err)
6708 ath10k_warn(ar, "failed to update STA %pM smps %d: %d\n",
6709 sta->addr, smps, err);
6710 }
6711
6712 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6713 ath10k_dbg(ar, ATH10K_DBG_STA, "mac update sta %pM supp rates\n",
6714 sta->addr);
6715
6716 err = ath10k_station_assoc(ar, arvif->vif, sta, true);
6717 if (err)
6718 ath10k_warn(ar, "failed to reassociate station: %pM\n",
6719 sta->addr);
6720 }
6721
6722 exit:
6723 mutex_unlock(&ar->conf_mutex);
6724 }
6725
ath10k_mac_inc_num_stations(struct ath10k_vif * arvif,struct ieee80211_sta * sta)6726 static int ath10k_mac_inc_num_stations(struct ath10k_vif *arvif,
6727 struct ieee80211_sta *sta)
6728 {
6729 struct ath10k *ar = arvif->ar;
6730
6731 lockdep_assert_held(&ar->conf_mutex);
6732
6733 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6734 return 0;
6735
6736 if (ar->num_stations >= ar->max_num_stations)
6737 return -ENOBUFS;
6738
6739 ar->num_stations++;
6740
6741 return 0;
6742 }
6743
ath10k_mac_dec_num_stations(struct ath10k_vif * arvif,struct ieee80211_sta * sta)6744 static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
6745 struct ieee80211_sta *sta)
6746 {
6747 struct ath10k *ar = arvif->ar;
6748
6749 lockdep_assert_held(&ar->conf_mutex);
6750
6751 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6752 return;
6753
6754 ar->num_stations--;
6755 }
6756
ath10k_sta_set_txpwr(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)6757 static int ath10k_sta_set_txpwr(struct ieee80211_hw *hw,
6758 struct ieee80211_vif *vif,
6759 struct ieee80211_sta *sta)
6760 {
6761 struct ath10k *ar = hw->priv;
6762 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6763 int ret = 0;
6764 s16 txpwr;
6765
6766 if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
6767 txpwr = 0;
6768 } else {
6769 txpwr = sta->txpwr.power;
6770 if (!txpwr)
6771 return -EINVAL;
6772 }
6773
6774 if (txpwr > ATH10K_TX_POWER_MAX_VAL || txpwr < ATH10K_TX_POWER_MIN_VAL)
6775 return -EINVAL;
6776
6777 mutex_lock(&ar->conf_mutex);
6778
6779 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
6780 ar->wmi.peer_param->use_fixed_power, txpwr);
6781 if (ret) {
6782 ath10k_warn(ar, "failed to set tx power for station ret: %d\n",
6783 ret);
6784 goto out;
6785 }
6786
6787 out:
6788 mutex_unlock(&ar->conf_mutex);
6789 return ret;
6790 }
6791
6792 struct ath10k_mac_iter_tid_conf_data {
6793 struct ieee80211_vif *curr_vif;
6794 struct ath10k *ar;
6795 bool reset_config;
6796 };
6797
6798 static bool
ath10k_mac_bitrate_mask_has_single_rate(struct ath10k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,int * vht_num_rates)6799 ath10k_mac_bitrate_mask_has_single_rate(struct ath10k *ar,
6800 enum nl80211_band band,
6801 const struct cfg80211_bitrate_mask *mask,
6802 int *vht_num_rates)
6803 {
6804 int num_rates = 0;
6805 int i, tmp;
6806
6807 num_rates += hweight32(mask->control[band].legacy);
6808
6809 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6810 num_rates += hweight8(mask->control[band].ht_mcs[i]);
6811
6812 *vht_num_rates = 0;
6813 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6814 tmp = hweight16(mask->control[band].vht_mcs[i]);
6815 num_rates += tmp;
6816 *vht_num_rates += tmp;
6817 }
6818
6819 return num_rates == 1;
6820 }
6821
6822 static int
ath10k_mac_bitrate_mask_get_single_rate(struct ath10k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,u8 * rate,u8 * nss,bool vht_only)6823 ath10k_mac_bitrate_mask_get_single_rate(struct ath10k *ar,
6824 enum nl80211_band band,
6825 const struct cfg80211_bitrate_mask *mask,
6826 u8 *rate, u8 *nss, bool vht_only)
6827 {
6828 int rate_idx;
6829 int i;
6830 u16 bitrate;
6831 u8 preamble;
6832 u8 hw_rate;
6833
6834 if (vht_only)
6835 goto next;
6836
6837 if (hweight32(mask->control[band].legacy) == 1) {
6838 rate_idx = ffs(mask->control[band].legacy) - 1;
6839
6840 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY)
6841 rate_idx += ATH10K_MAC_FIRST_OFDM_RATE_IDX;
6842
6843 hw_rate = ath10k_wmi_legacy_rates[rate_idx].hw_value;
6844 bitrate = ath10k_wmi_legacy_rates[rate_idx].bitrate;
6845
6846 if (ath10k_mac_bitrate_is_cck(bitrate))
6847 preamble = WMI_RATE_PREAMBLE_CCK;
6848 else
6849 preamble = WMI_RATE_PREAMBLE_OFDM;
6850
6851 *nss = 1;
6852 *rate = preamble << 6 |
6853 (*nss - 1) << 4 |
6854 hw_rate << 0;
6855
6856 return 0;
6857 }
6858
6859 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6860 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
6861 *nss = i + 1;
6862 *rate = WMI_RATE_PREAMBLE_HT << 6 |
6863 (*nss - 1) << 4 |
6864 (ffs(mask->control[band].ht_mcs[i]) - 1);
6865
6866 return 0;
6867 }
6868 }
6869
6870 next:
6871 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
6872 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
6873 *nss = i + 1;
6874 *rate = WMI_RATE_PREAMBLE_VHT << 6 |
6875 (*nss - 1) << 4 |
6876 (ffs(mask->control[band].vht_mcs[i]) - 1);
6877
6878 return 0;
6879 }
6880 }
6881
6882 return -EINVAL;
6883 }
6884
ath10k_mac_validate_rate_mask(struct ath10k * ar,struct ieee80211_sta * sta,u32 rate_ctrl_flag,u8 nss)6885 static int ath10k_mac_validate_rate_mask(struct ath10k *ar,
6886 struct ieee80211_sta *sta,
6887 u32 rate_ctrl_flag, u8 nss)
6888 {
6889 if (nss > sta->rx_nss) {
6890 ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n",
6891 nss, sta->rx_nss);
6892 return -EINVAL;
6893 }
6894
6895 if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_VHT) {
6896 if (!sta->vht_cap.vht_supported) {
6897 ath10k_warn(ar, "Invalid VHT rate for sta %pM\n",
6898 sta->addr);
6899 return -EINVAL;
6900 }
6901 } else if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_HT) {
6902 if (!sta->ht_cap.ht_supported || sta->vht_cap.vht_supported) {
6903 ath10k_warn(ar, "Invalid HT rate for sta %pM\n",
6904 sta->addr);
6905 return -EINVAL;
6906 }
6907 } else {
6908 if (sta->ht_cap.ht_supported || sta->vht_cap.vht_supported)
6909 return -EINVAL;
6910 }
6911
6912 return 0;
6913 }
6914
6915 static int
ath10k_mac_tid_bitrate_config(struct ath10k * ar,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u32 * rate_ctrl_flag,u8 * rate_ctrl,enum nl80211_tx_rate_setting txrate_type,const struct cfg80211_bitrate_mask * mask)6916 ath10k_mac_tid_bitrate_config(struct ath10k *ar,
6917 struct ieee80211_vif *vif,
6918 struct ieee80211_sta *sta,
6919 u32 *rate_ctrl_flag, u8 *rate_ctrl,
6920 enum nl80211_tx_rate_setting txrate_type,
6921 const struct cfg80211_bitrate_mask *mask)
6922 {
6923 struct cfg80211_chan_def def;
6924 enum nl80211_band band;
6925 u8 nss, rate;
6926 int vht_num_rates, ret;
6927
6928 if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
6929 return -EINVAL;
6930
6931 if (txrate_type == NL80211_TX_RATE_AUTOMATIC) {
6932 *rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_AUTO;
6933 *rate_ctrl_flag = 0;
6934 return 0;
6935 }
6936
6937 band = def.chan->band;
6938
6939 if (!ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask,
6940 &vht_num_rates)) {
6941 return -EINVAL;
6942 }
6943
6944 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
6945 &rate, &nss, false);
6946 if (ret) {
6947 ath10k_warn(ar, "failed to get single rate: %d\n",
6948 ret);
6949 return ret;
6950 }
6951
6952 *rate_ctrl_flag = rate;
6953
6954 if (sta && ath10k_mac_validate_rate_mask(ar, sta, *rate_ctrl_flag, nss))
6955 return -EINVAL;
6956
6957 if (txrate_type == NL80211_TX_RATE_FIXED)
6958 *rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_FIXED_RATE;
6959 else if (txrate_type == NL80211_TX_RATE_LIMITED &&
6960 (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
6961 ar->wmi.svc_map)))
6962 *rate_ctrl = WMI_PEER_TID_CONFIG_RATE_UPPER_CAP;
6963 else
6964 return -EOPNOTSUPP;
6965
6966 return 0;
6967 }
6968
ath10k_mac_set_tid_config(struct ath10k * ar,struct ieee80211_sta * sta,struct ieee80211_vif * vif,u32 changed,struct wmi_per_peer_per_tid_cfg_arg * arg)6969 static int ath10k_mac_set_tid_config(struct ath10k *ar, struct ieee80211_sta *sta,
6970 struct ieee80211_vif *vif, u32 changed,
6971 struct wmi_per_peer_per_tid_cfg_arg *arg)
6972 {
6973 struct ath10k_vif *arvif = (void *)vif->drv_priv;
6974 struct ath10k_sta *arsta;
6975 int ret;
6976
6977 if (sta) {
6978 if (!sta->wme)
6979 return -ENOTSUPP;
6980
6981 arsta = (struct ath10k_sta *)sta->drv_priv;
6982
6983 if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
6984 if ((arsta->retry_long[arg->tid] > 0 ||
6985 arsta->rate_code[arg->tid] > 0 ||
6986 arsta->ampdu[arg->tid] ==
6987 WMI_TID_CONFIG_AGGR_CONTROL_ENABLE) &&
6988 arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) {
6989 changed &= ~BIT(NL80211_TID_CONFIG_ATTR_NOACK);
6990 arg->ack_policy = 0;
6991 arg->aggr_control = 0;
6992 arg->rate_ctrl = 0;
6993 arg->rcode_flags = 0;
6994 }
6995 }
6996
6997 if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
6998 if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK ||
6999 arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
7000 arg->aggr_control = 0;
7001 changed &= ~BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
7002 }
7003 }
7004
7005 if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7006 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7007 if (arsta->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK ||
7008 arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
7009 arg->rate_ctrl = 0;
7010 arg->rcode_flags = 0;
7011 }
7012 }
7013
7014 ether_addr_copy(arg->peer_macaddr.addr, sta->addr);
7015
7016 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, arg);
7017 if (ret)
7018 return ret;
7019
7020 /* Store the configured parameters in success case */
7021 if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7022 arsta->noack[arg->tid] = arg->ack_policy;
7023 arg->ack_policy = 0;
7024 arg->aggr_control = 0;
7025 arg->rate_ctrl = 0;
7026 arg->rcode_flags = 0;
7027 }
7028
7029 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7030 arsta->retry_long[arg->tid] = arg->retry_count;
7031 arg->retry_count = 0;
7032 }
7033
7034 if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7035 arsta->ampdu[arg->tid] = arg->aggr_control;
7036 arg->aggr_control = 0;
7037 }
7038
7039 if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7040 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7041 arsta->rate_ctrl[arg->tid] = arg->rate_ctrl;
7042 arg->rate_ctrl = 0;
7043 arg->rcode_flags = 0;
7044 }
7045
7046 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7047 arsta->rtscts[arg->tid] = arg->rtscts_ctrl;
7048 arg->ext_tid_cfg_bitmap = 0;
7049 }
7050 } else {
7051 if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7052 if ((arvif->retry_long[arg->tid] ||
7053 arvif->rate_code[arg->tid] ||
7054 arvif->ampdu[arg->tid] ==
7055 WMI_TID_CONFIG_AGGR_CONTROL_ENABLE) &&
7056 arg->ack_policy == WMI_PEER_TID_CONFIG_NOACK) {
7057 changed &= ~BIT(NL80211_TID_CONFIG_ATTR_NOACK);
7058 } else {
7059 arvif->noack[arg->tid] = arg->ack_policy;
7060 arvif->ampdu[arg->tid] = arg->aggr_control;
7061 arvif->rate_ctrl[arg->tid] = arg->rate_ctrl;
7062 }
7063 }
7064
7065 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7066 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK)
7067 changed &= ~BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG);
7068 else
7069 arvif->retry_long[arg->tid] = arg->retry_count;
7070 }
7071
7072 if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7073 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK)
7074 changed &= ~BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL);
7075 else
7076 arvif->ampdu[arg->tid] = arg->aggr_control;
7077 }
7078
7079 if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7080 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7081 if (arvif->noack[arg->tid] == WMI_PEER_TID_CONFIG_NOACK) {
7082 changed &= ~(BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7083 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE));
7084 } else {
7085 arvif->rate_ctrl[arg->tid] = arg->rate_ctrl;
7086 arvif->rate_code[arg->tid] = arg->rcode_flags;
7087 }
7088 }
7089
7090 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7091 arvif->rtscts[arg->tid] = arg->rtscts_ctrl;
7092 arg->ext_tid_cfg_bitmap = 0;
7093 }
7094
7095 if (changed)
7096 arvif->tid_conf_changed[arg->tid] |= changed;
7097 }
7098
7099 return 0;
7100 }
7101
7102 static int
ath10k_mac_parse_tid_config(struct ath10k * ar,struct ieee80211_sta * sta,struct ieee80211_vif * vif,struct cfg80211_tid_cfg * tid_conf,struct wmi_per_peer_per_tid_cfg_arg * arg)7103 ath10k_mac_parse_tid_config(struct ath10k *ar,
7104 struct ieee80211_sta *sta,
7105 struct ieee80211_vif *vif,
7106 struct cfg80211_tid_cfg *tid_conf,
7107 struct wmi_per_peer_per_tid_cfg_arg *arg)
7108 {
7109 u32 changed = tid_conf->mask;
7110 int ret = 0, i = 0;
7111
7112 if (!changed)
7113 return -EINVAL;
7114
7115 while (i < ATH10K_TID_MAX) {
7116 if (!(tid_conf->tids & BIT(i))) {
7117 i++;
7118 continue;
7119 }
7120
7121 arg->tid = i;
7122
7123 if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7124 if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE) {
7125 arg->ack_policy = WMI_PEER_TID_CONFIG_NOACK;
7126 arg->rate_ctrl =
7127 WMI_TID_CONFIG_RATE_CONTROL_DEFAULT_LOWEST_RATE;
7128 arg->aggr_control =
7129 WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
7130 } else {
7131 arg->ack_policy =
7132 WMI_PEER_TID_CONFIG_ACK;
7133 arg->rate_ctrl =
7134 WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7135 arg->aggr_control =
7136 WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7137 }
7138 }
7139
7140 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG))
7141 arg->retry_count = tid_conf->retry_long;
7142
7143 if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7144 if (tid_conf->noack == NL80211_TID_CONFIG_ENABLE)
7145 arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7146 else
7147 arg->aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_DISABLE;
7148 }
7149
7150 if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7151 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7152 ret = ath10k_mac_tid_bitrate_config(ar, vif, sta,
7153 &arg->rcode_flags,
7154 &arg->rate_ctrl,
7155 tid_conf->txrate_type,
7156 &tid_conf->txrate_mask);
7157 if (ret) {
7158 ath10k_warn(ar, "failed to configure bitrate mask %d\n",
7159 ret);
7160 arg->rcode_flags = 0;
7161 arg->rate_ctrl = 0;
7162 }
7163 }
7164
7165 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7166 if (tid_conf->rtscts)
7167 arg->rtscts_ctrl = tid_conf->rtscts;
7168
7169 arg->ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG;
7170 }
7171
7172 ret = ath10k_mac_set_tid_config(ar, sta, vif, changed, arg);
7173 if (ret)
7174 return ret;
7175 i++;
7176 }
7177
7178 return ret;
7179 }
7180
ath10k_mac_reset_tid_config(struct ath10k * ar,struct ieee80211_sta * sta,struct ath10k_vif * arvif,u8 tids)7181 static int ath10k_mac_reset_tid_config(struct ath10k *ar,
7182 struct ieee80211_sta *sta,
7183 struct ath10k_vif *arvif,
7184 u8 tids)
7185 {
7186 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7187 struct wmi_per_peer_per_tid_cfg_arg arg;
7188 int ret = 0, i = 0;
7189
7190 arg.vdev_id = arvif->vdev_id;
7191 while (i < ATH10K_TID_MAX) {
7192 if (!(tids & BIT(i))) {
7193 i++;
7194 continue;
7195 }
7196
7197 arg.tid = i;
7198 arg.ack_policy = WMI_PEER_TID_CONFIG_ACK;
7199 arg.retry_count = ATH10K_MAX_RETRY_COUNT;
7200 arg.rate_ctrl = WMI_TID_CONFIG_RATE_CONTROL_AUTO;
7201 arg.aggr_control = WMI_TID_CONFIG_AGGR_CONTROL_ENABLE;
7202 arg.rtscts_ctrl = WMI_TID_CONFIG_RTSCTS_CONTROL_ENABLE;
7203 arg.ext_tid_cfg_bitmap = WMI_EXT_TID_RTS_CTS_CONFIG;
7204
7205 ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
7206
7207 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
7208 if (ret)
7209 return ret;
7210
7211 if (!arvif->tids_rst) {
7212 arsta->retry_long[i] = -1;
7213 arsta->noack[i] = -1;
7214 arsta->ampdu[i] = -1;
7215 arsta->rate_code[i] = -1;
7216 arsta->rate_ctrl[i] = 0;
7217 arsta->rtscts[i] = -1;
7218 } else {
7219 arvif->retry_long[i] = 0;
7220 arvif->noack[i] = 0;
7221 arvif->ampdu[i] = 0;
7222 arvif->rate_code[i] = 0;
7223 arvif->rate_ctrl[i] = 0;
7224 arvif->rtscts[i] = 0;
7225 }
7226
7227 i++;
7228 }
7229
7230 return ret;
7231 }
7232
ath10k_sta_tid_cfg_wk(struct work_struct * wk)7233 static void ath10k_sta_tid_cfg_wk(struct work_struct *wk)
7234 {
7235 struct wmi_per_peer_per_tid_cfg_arg arg = {};
7236 struct ieee80211_sta *sta;
7237 struct ath10k_sta *arsta;
7238 struct ath10k_vif *arvif;
7239 struct ath10k *ar;
7240 bool config_apply;
7241 int ret, i;
7242 u32 changed;
7243 u8 nss;
7244
7245 arsta = container_of(wk, struct ath10k_sta, tid_config_wk);
7246 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
7247 arvif = arsta->arvif;
7248 ar = arvif->ar;
7249
7250 mutex_lock(&ar->conf_mutex);
7251
7252 if (arvif->tids_rst) {
7253 ret = ath10k_mac_reset_tid_config(ar, sta, arvif,
7254 arvif->tids_rst);
7255 goto exit;
7256 }
7257
7258 ether_addr_copy(arg.peer_macaddr.addr, sta->addr);
7259
7260 for (i = 0; i < ATH10K_TID_MAX; i++) {
7261 config_apply = false;
7262 changed = arvif->tid_conf_changed[i];
7263
7264 if (changed & BIT(NL80211_TID_CONFIG_ATTR_NOACK)) {
7265 if (arsta->noack[i] != -1) {
7266 arg.ack_policy = 0;
7267 } else {
7268 config_apply = true;
7269 arg.ack_policy = arvif->noack[i];
7270 arg.aggr_control = arvif->ampdu[i];
7271 arg.rate_ctrl = arvif->rate_ctrl[i];
7272 }
7273 }
7274
7275 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG)) {
7276 if (arsta->retry_long[i] != -1 ||
7277 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7278 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7279 arg.retry_count = 0;
7280 } else {
7281 arg.retry_count = arvif->retry_long[i];
7282 config_apply = true;
7283 }
7284 }
7285
7286 if (changed & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
7287 if (arsta->ampdu[i] != -1 ||
7288 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7289 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7290 arg.aggr_control = 0;
7291 } else {
7292 arg.aggr_control = arvif->ampdu[i];
7293 config_apply = true;
7294 }
7295 }
7296
7297 if (changed & (BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
7298 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE))) {
7299 nss = ATH10K_HW_NSS(arvif->rate_code[i]);
7300 ret = ath10k_mac_validate_rate_mask(ar, sta,
7301 arvif->rate_code[i],
7302 nss);
7303 if (ret &&
7304 arvif->rate_ctrl[i] > WMI_TID_CONFIG_RATE_CONTROL_AUTO) {
7305 arg.rate_ctrl = 0;
7306 arg.rcode_flags = 0;
7307 }
7308
7309 if (arsta->rate_ctrl[i] >
7310 WMI_TID_CONFIG_RATE_CONTROL_AUTO ||
7311 arsta->noack[i] == WMI_PEER_TID_CONFIG_NOACK ||
7312 arvif->noack[i] == WMI_PEER_TID_CONFIG_NOACK) {
7313 arg.rate_ctrl = 0;
7314 arg.rcode_flags = 0;
7315 } else {
7316 arg.rate_ctrl = arvif->rate_ctrl[i];
7317 arg.rcode_flags = arvif->rate_code[i];
7318 config_apply = true;
7319 }
7320 }
7321
7322 if (changed & BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL)) {
7323 if (arsta->rtscts[i]) {
7324 arg.rtscts_ctrl = 0;
7325 arg.ext_tid_cfg_bitmap = 0;
7326 } else {
7327 arg.rtscts_ctrl = arvif->rtscts[i] - 1;
7328 arg.ext_tid_cfg_bitmap =
7329 WMI_EXT_TID_RTS_CTS_CONFIG;
7330 config_apply = true;
7331 }
7332 }
7333
7334 arg.tid = i;
7335
7336 if (config_apply) {
7337 ret = ath10k_wmi_set_per_peer_per_tid_cfg(ar, &arg);
7338 if (ret)
7339 ath10k_warn(ar, "failed to set per tid config for sta %pM: %d\n",
7340 sta->addr, ret);
7341 }
7342
7343 arg.ack_policy = 0;
7344 arg.retry_count = 0;
7345 arg.aggr_control = 0;
7346 arg.rate_ctrl = 0;
7347 arg.rcode_flags = 0;
7348 }
7349
7350 exit:
7351 mutex_unlock(&ar->conf_mutex);
7352 }
7353
ath10k_mac_vif_stations_tid_conf(void * data,struct ieee80211_sta * sta)7354 static void ath10k_mac_vif_stations_tid_conf(void *data,
7355 struct ieee80211_sta *sta)
7356 {
7357 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7358 struct ath10k_mac_iter_tid_conf_data *iter_data = data;
7359 struct ieee80211_vif *sta_vif = arsta->arvif->vif;
7360
7361 if (sta_vif != iter_data->curr_vif || !sta->wme)
7362 return;
7363
7364 ieee80211_queue_work(iter_data->ar->hw, &arsta->tid_config_wk);
7365 }
7366
ath10k_sta_state(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)7367 static int ath10k_sta_state(struct ieee80211_hw *hw,
7368 struct ieee80211_vif *vif,
7369 struct ieee80211_sta *sta,
7370 enum ieee80211_sta_state old_state,
7371 enum ieee80211_sta_state new_state)
7372 {
7373 struct ath10k *ar = hw->priv;
7374 struct ath10k_vif *arvif = (void *)vif->drv_priv;
7375 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
7376 struct ath10k_peer *peer;
7377 int ret = 0;
7378 int i;
7379
7380 if (old_state == IEEE80211_STA_NOTEXIST &&
7381 new_state == IEEE80211_STA_NONE) {
7382 memset(arsta, 0, sizeof(*arsta));
7383 arsta->arvif = arvif;
7384 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
7385 INIT_WORK(&arsta->update_wk, ath10k_sta_rc_update_wk);
7386 INIT_WORK(&arsta->tid_config_wk, ath10k_sta_tid_cfg_wk);
7387
7388 for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
7389 ath10k_mac_txq_init(sta->txq[i]);
7390 }
7391
7392 /* cancel must be done outside the mutex to avoid deadlock */
7393 if ((old_state == IEEE80211_STA_NONE &&
7394 new_state == IEEE80211_STA_NOTEXIST)) {
7395 cancel_work_sync(&arsta->update_wk);
7396 cancel_work_sync(&arsta->tid_config_wk);
7397 }
7398
7399 mutex_lock(&ar->conf_mutex);
7400
7401 if (old_state == IEEE80211_STA_NOTEXIST &&
7402 new_state == IEEE80211_STA_NONE) {
7403 /*
7404 * New station addition.
7405 */
7406 enum wmi_peer_type peer_type = WMI_PEER_TYPE_DEFAULT;
7407 u32 num_tdls_stations;
7408
7409 ath10k_dbg(ar, ATH10K_DBG_STA,
7410 "mac vdev %d peer create %pM (new sta) sta %d / %d peer %d / %d\n",
7411 arvif->vdev_id, sta->addr,
7412 ar->num_stations + 1, ar->max_num_stations,
7413 ar->num_peers + 1, ar->max_num_peers);
7414
7415 num_tdls_stations = ath10k_mac_tdls_vif_stations_count(hw, vif);
7416
7417 if (sta->tdls) {
7418 if (num_tdls_stations >= ar->max_num_tdls_vdevs) {
7419 ath10k_warn(ar, "vdev %i exceeded maximum number of tdls vdevs %i\n",
7420 arvif->vdev_id,
7421 ar->max_num_tdls_vdevs);
7422 ret = -ELNRNG;
7423 goto exit;
7424 }
7425 peer_type = WMI_PEER_TYPE_TDLS;
7426 }
7427
7428 ret = ath10k_mac_inc_num_stations(arvif, sta);
7429 if (ret) {
7430 ath10k_warn(ar, "refusing to associate station: too many connected already (%d)\n",
7431 ar->max_num_stations);
7432 goto exit;
7433 }
7434
7435 if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
7436 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats),
7437 GFP_KERNEL);
7438 if (!arsta->tx_stats) {
7439 ath10k_mac_dec_num_stations(arvif, sta);
7440 ret = -ENOMEM;
7441 goto exit;
7442 }
7443 }
7444
7445 ret = ath10k_peer_create(ar, vif, sta, arvif->vdev_id,
7446 sta->addr, peer_type);
7447 if (ret) {
7448 ath10k_warn(ar, "failed to add peer %pM for vdev %d when adding a new sta: %i\n",
7449 sta->addr, arvif->vdev_id, ret);
7450 ath10k_mac_dec_num_stations(arvif, sta);
7451 kfree(arsta->tx_stats);
7452 goto exit;
7453 }
7454
7455 spin_lock_bh(&ar->data_lock);
7456
7457 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
7458 if (!peer) {
7459 ath10k_warn(ar, "failed to lookup peer %pM on vdev %i\n",
7460 vif->addr, arvif->vdev_id);
7461 spin_unlock_bh(&ar->data_lock);
7462 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7463 ath10k_mac_dec_num_stations(arvif, sta);
7464 kfree(arsta->tx_stats);
7465 ret = -ENOENT;
7466 goto exit;
7467 }
7468
7469 arsta->peer_id = find_first_bit(peer->peer_ids,
7470 ATH10K_MAX_NUM_PEER_IDS);
7471
7472 spin_unlock_bh(&ar->data_lock);
7473
7474 if (!sta->tdls)
7475 goto exit;
7476
7477 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7478 WMI_TDLS_ENABLE_ACTIVE);
7479 if (ret) {
7480 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
7481 arvif->vdev_id, ret);
7482 ath10k_peer_delete(ar, arvif->vdev_id,
7483 sta->addr);
7484 ath10k_mac_dec_num_stations(arvif, sta);
7485 kfree(arsta->tx_stats);
7486 goto exit;
7487 }
7488
7489 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
7490 WMI_TDLS_PEER_STATE_PEERING);
7491 if (ret) {
7492 ath10k_warn(ar,
7493 "failed to update tdls peer %pM for vdev %d when adding a new sta: %i\n",
7494 sta->addr, arvif->vdev_id, ret);
7495 ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7496 ath10k_mac_dec_num_stations(arvif, sta);
7497 kfree(arsta->tx_stats);
7498
7499 if (num_tdls_stations != 0)
7500 goto exit;
7501 ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7502 WMI_TDLS_DISABLE);
7503 }
7504 } else if ((old_state == IEEE80211_STA_NONE &&
7505 new_state == IEEE80211_STA_NOTEXIST)) {
7506 /*
7507 * Existing station deletion.
7508 */
7509 ath10k_dbg(ar, ATH10K_DBG_STA,
7510 "mac vdev %d peer delete %pM sta %pK (sta gone)\n",
7511 arvif->vdev_id, sta->addr, sta);
7512
7513 if (sta->tdls) {
7514 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
7515 sta,
7516 WMI_TDLS_PEER_STATE_TEARDOWN);
7517 if (ret)
7518 ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n",
7519 sta->addr,
7520 WMI_TDLS_PEER_STATE_TEARDOWN, ret);
7521 }
7522
7523 ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
7524 if (ret)
7525 ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
7526 sta->addr, arvif->vdev_id, ret);
7527
7528 ath10k_mac_dec_num_stations(arvif, sta);
7529
7530 spin_lock_bh(&ar->data_lock);
7531 for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) {
7532 peer = ar->peer_map[i];
7533 if (!peer)
7534 continue;
7535
7536 if (peer->sta == sta) {
7537 ath10k_warn(ar, "found sta peer %pM (ptr %pK id %d) entry on vdev %i after it was supposedly removed\n",
7538 sta->addr, peer, i, arvif->vdev_id);
7539 peer->sta = NULL;
7540
7541 /* Clean up the peer object as well since we
7542 * must have failed to do this above.
7543 */
7544 list_del(&peer->list);
7545 ar->peer_map[i] = NULL;
7546 kfree(peer);
7547 ar->num_peers--;
7548 }
7549 }
7550 spin_unlock_bh(&ar->data_lock);
7551
7552 if (ath10k_debug_is_extd_tx_stats_enabled(ar)) {
7553 kfree(arsta->tx_stats);
7554 arsta->tx_stats = NULL;
7555 }
7556
7557 for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
7558 ath10k_mac_txq_unref(ar, sta->txq[i]);
7559
7560 if (!sta->tdls)
7561 goto exit;
7562
7563 if (ath10k_mac_tdls_vif_stations_count(hw, vif))
7564 goto exit;
7565
7566 /* This was the last tdls peer in current vif */
7567 ret = ath10k_wmi_update_fw_tdls_state(ar, arvif->vdev_id,
7568 WMI_TDLS_DISABLE);
7569 if (ret) {
7570 ath10k_warn(ar, "failed to update fw tdls state on vdev %i: %i\n",
7571 arvif->vdev_id, ret);
7572 }
7573 } else if (old_state == IEEE80211_STA_AUTH &&
7574 new_state == IEEE80211_STA_ASSOC &&
7575 (vif->type == NL80211_IFTYPE_AP ||
7576 vif->type == NL80211_IFTYPE_MESH_POINT ||
7577 vif->type == NL80211_IFTYPE_ADHOC)) {
7578 /*
7579 * New association.
7580 */
7581 ath10k_dbg(ar, ATH10K_DBG_STA, "mac sta %pM associated\n",
7582 sta->addr);
7583
7584 ret = ath10k_station_assoc(ar, vif, sta, false);
7585 if (ret)
7586 ath10k_warn(ar, "failed to associate station %pM for vdev %i: %i\n",
7587 sta->addr, arvif->vdev_id, ret);
7588 } else if (old_state == IEEE80211_STA_ASSOC &&
7589 new_state == IEEE80211_STA_AUTHORIZED &&
7590 sta->tdls) {
7591 /*
7592 * Tdls station authorized.
7593 */
7594 ath10k_dbg(ar, ATH10K_DBG_STA, "mac tdls sta %pM authorized\n",
7595 sta->addr);
7596
7597 ret = ath10k_station_assoc(ar, vif, sta, false);
7598 if (ret) {
7599 ath10k_warn(ar, "failed to associate tdls station %pM for vdev %i: %i\n",
7600 sta->addr, arvif->vdev_id, ret);
7601 goto exit;
7602 }
7603
7604 ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
7605 WMI_TDLS_PEER_STATE_CONNECTED);
7606 if (ret)
7607 ath10k_warn(ar, "failed to update tdls peer %pM for vdev %i: %i\n",
7608 sta->addr, arvif->vdev_id, ret);
7609 } else if (old_state == IEEE80211_STA_ASSOC &&
7610 new_state == IEEE80211_STA_AUTH &&
7611 (vif->type == NL80211_IFTYPE_AP ||
7612 vif->type == NL80211_IFTYPE_MESH_POINT ||
7613 vif->type == NL80211_IFTYPE_ADHOC)) {
7614 /*
7615 * Disassociation.
7616 */
7617 ath10k_dbg(ar, ATH10K_DBG_STA, "mac sta %pM disassociated\n",
7618 sta->addr);
7619
7620 ret = ath10k_station_disassoc(ar, vif, sta);
7621 if (ret)
7622 ath10k_warn(ar, "failed to disassociate station: %pM vdev %i: %i\n",
7623 sta->addr, arvif->vdev_id, ret);
7624 }
7625 exit:
7626 mutex_unlock(&ar->conf_mutex);
7627 return ret;
7628 }
7629
ath10k_conf_tx_uapsd(struct ath10k * ar,struct ieee80211_vif * vif,u16 ac,bool enable)7630 static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
7631 u16 ac, bool enable)
7632 {
7633 struct ath10k_vif *arvif = (void *)vif->drv_priv;
7634 struct wmi_sta_uapsd_auto_trig_arg arg = {};
7635 u32 prio = 0, acc = 0;
7636 u32 value = 0;
7637 int ret = 0;
7638
7639 lockdep_assert_held(&ar->conf_mutex);
7640
7641 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
7642 return 0;
7643
7644 switch (ac) {
7645 case IEEE80211_AC_VO:
7646 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7647 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7648 prio = 7;
7649 acc = 3;
7650 break;
7651 case IEEE80211_AC_VI:
7652 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7653 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7654 prio = 5;
7655 acc = 2;
7656 break;
7657 case IEEE80211_AC_BE:
7658 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7659 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7660 prio = 2;
7661 acc = 1;
7662 break;
7663 case IEEE80211_AC_BK:
7664 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7665 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7666 prio = 0;
7667 acc = 0;
7668 break;
7669 }
7670
7671 if (enable)
7672 arvif->u.sta.uapsd |= value;
7673 else
7674 arvif->u.sta.uapsd &= ~value;
7675
7676 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7677 WMI_STA_PS_PARAM_UAPSD,
7678 arvif->u.sta.uapsd);
7679 if (ret) {
7680 ath10k_warn(ar, "failed to set uapsd params: %d\n", ret);
7681 goto exit;
7682 }
7683
7684 if (arvif->u.sta.uapsd)
7685 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7686 else
7687 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7688
7689 ret = ath10k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7690 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7691 value);
7692 if (ret)
7693 ath10k_warn(ar, "failed to set rx wake param: %d\n", ret);
7694
7695 ret = ath10k_mac_vif_recalc_ps_wake_threshold(arvif);
7696 if (ret) {
7697 ath10k_warn(ar, "failed to recalc ps wake threshold on vdev %i: %d\n",
7698 arvif->vdev_id, ret);
7699 return ret;
7700 }
7701
7702 ret = ath10k_mac_vif_recalc_ps_poll_count(arvif);
7703 if (ret) {
7704 ath10k_warn(ar, "failed to recalc ps poll count on vdev %i: %d\n",
7705 arvif->vdev_id, ret);
7706 return ret;
7707 }
7708
7709 if (test_bit(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG, ar->wmi.svc_map) ||
7710 test_bit(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG, ar->wmi.svc_map)) {
7711 /* Only userspace can make an educated decision when to send
7712 * trigger frame. The following effectively disables u-UAPSD
7713 * autotrigger in firmware (which is enabled by default
7714 * provided the autotrigger service is available).
7715 */
7716
7717 arg.wmm_ac = acc;
7718 arg.user_priority = prio;
7719 arg.service_interval = 0;
7720 arg.suspend_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
7721 arg.delay_interval = WMI_STA_UAPSD_MAX_INTERVAL_MSEC;
7722
7723 ret = ath10k_wmi_vdev_sta_uapsd(ar, arvif->vdev_id,
7724 arvif->bssid, &arg, 1);
7725 if (ret) {
7726 ath10k_warn(ar, "failed to set uapsd auto trigger %d\n",
7727 ret);
7728 return ret;
7729 }
7730 }
7731
7732 exit:
7733 return ret;
7734 }
7735
ath10k_conf_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 ac,const struct ieee80211_tx_queue_params * params)7736 static int ath10k_conf_tx(struct ieee80211_hw *hw,
7737 struct ieee80211_vif *vif, u16 ac,
7738 const struct ieee80211_tx_queue_params *params)
7739 {
7740 struct ath10k *ar = hw->priv;
7741 struct ath10k_vif *arvif = (void *)vif->drv_priv;
7742 struct wmi_wmm_params_arg *p = NULL;
7743 int ret;
7744
7745 mutex_lock(&ar->conf_mutex);
7746
7747 switch (ac) {
7748 case IEEE80211_AC_VO:
7749 p = &arvif->wmm_params.ac_vo;
7750 break;
7751 case IEEE80211_AC_VI:
7752 p = &arvif->wmm_params.ac_vi;
7753 break;
7754 case IEEE80211_AC_BE:
7755 p = &arvif->wmm_params.ac_be;
7756 break;
7757 case IEEE80211_AC_BK:
7758 p = &arvif->wmm_params.ac_bk;
7759 break;
7760 }
7761
7762 if (WARN_ON(!p)) {
7763 ret = -EINVAL;
7764 goto exit;
7765 }
7766
7767 p->cwmin = params->cw_min;
7768 p->cwmax = params->cw_max;
7769 p->aifs = params->aifs;
7770
7771 /*
7772 * The channel time duration programmed in the HW is in absolute
7773 * microseconds, while mac80211 gives the txop in units of
7774 * 32 microseconds.
7775 */
7776 p->txop = params->txop * 32;
7777
7778 if (ar->wmi.ops->gen_vdev_wmm_conf) {
7779 ret = ath10k_wmi_vdev_wmm_conf(ar, arvif->vdev_id,
7780 &arvif->wmm_params);
7781 if (ret) {
7782 ath10k_warn(ar, "failed to set vdev wmm params on vdev %i: %d\n",
7783 arvif->vdev_id, ret);
7784 goto exit;
7785 }
7786 } else {
7787 /* This won't work well with multi-interface cases but it's
7788 * better than nothing.
7789 */
7790 ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
7791 if (ret) {
7792 ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
7793 goto exit;
7794 }
7795 }
7796
7797 ret = ath10k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
7798 if (ret)
7799 ath10k_warn(ar, "failed to set sta uapsd: %d\n", ret);
7800
7801 exit:
7802 mutex_unlock(&ar->conf_mutex);
7803 return ret;
7804 }
7805
ath10k_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel * chan,int duration,enum ieee80211_roc_type type)7806 static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
7807 struct ieee80211_vif *vif,
7808 struct ieee80211_channel *chan,
7809 int duration,
7810 enum ieee80211_roc_type type)
7811 {
7812 struct ath10k *ar = hw->priv;
7813 struct ath10k_vif *arvif = (void *)vif->drv_priv;
7814 struct wmi_start_scan_arg arg;
7815 int ret = 0;
7816 u32 scan_time_msec;
7817
7818 mutex_lock(&ar->conf_mutex);
7819
7820 if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
7821 ret = -EBUSY;
7822 goto exit;
7823 }
7824
7825 spin_lock_bh(&ar->data_lock);
7826 switch (ar->scan.state) {
7827 case ATH10K_SCAN_IDLE:
7828 reinit_completion(&ar->scan.started);
7829 reinit_completion(&ar->scan.completed);
7830 reinit_completion(&ar->scan.on_channel);
7831 ar->scan.state = ATH10K_SCAN_STARTING;
7832 ar->scan.is_roc = true;
7833 ar->scan.vdev_id = arvif->vdev_id;
7834 ar->scan.roc_freq = chan->center_freq;
7835 ar->scan.roc_notify = true;
7836 ret = 0;
7837 break;
7838 case ATH10K_SCAN_STARTING:
7839 case ATH10K_SCAN_RUNNING:
7840 case ATH10K_SCAN_ABORTING:
7841 ret = -EBUSY;
7842 break;
7843 }
7844 spin_unlock_bh(&ar->data_lock);
7845
7846 if (ret)
7847 goto exit;
7848
7849 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
7850
7851 memset(&arg, 0, sizeof(arg));
7852 ath10k_wmi_start_scan_init(ar, &arg);
7853 arg.vdev_id = arvif->vdev_id;
7854 arg.scan_id = ATH10K_SCAN_ID;
7855 arg.n_channels = 1;
7856 arg.channels[0] = chan->center_freq;
7857 arg.dwell_time_active = scan_time_msec;
7858 arg.dwell_time_passive = scan_time_msec;
7859 arg.max_scan_time = scan_time_msec;
7860 arg.scan_ctrl_flags |= WMI_SCAN_FLAG_PASSIVE;
7861 arg.scan_ctrl_flags |= WMI_SCAN_FILTER_PROBE_REQ;
7862 arg.burst_duration_ms = duration;
7863
7864 ret = ath10k_start_scan(ar, &arg);
7865 if (ret) {
7866 ath10k_warn(ar, "failed to start roc scan: %d\n", ret);
7867 spin_lock_bh(&ar->data_lock);
7868 ar->scan.state = ATH10K_SCAN_IDLE;
7869 spin_unlock_bh(&ar->data_lock);
7870 goto exit;
7871 }
7872
7873 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
7874 if (ret == 0) {
7875 ath10k_warn(ar, "failed to switch to channel for roc scan\n");
7876
7877 ret = ath10k_scan_stop(ar);
7878 if (ret)
7879 ath10k_warn(ar, "failed to stop scan: %d\n", ret);
7880
7881 ret = -ETIMEDOUT;
7882 goto exit;
7883 }
7884
7885 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
7886 msecs_to_jiffies(duration));
7887
7888 ret = 0;
7889 exit:
7890 mutex_unlock(&ar->conf_mutex);
7891 return ret;
7892 }
7893
ath10k_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)7894 static int ath10k_cancel_remain_on_channel(struct ieee80211_hw *hw,
7895 struct ieee80211_vif *vif)
7896 {
7897 struct ath10k *ar = hw->priv;
7898
7899 mutex_lock(&ar->conf_mutex);
7900
7901 spin_lock_bh(&ar->data_lock);
7902 ar->scan.roc_notify = false;
7903 spin_unlock_bh(&ar->data_lock);
7904
7905 ath10k_scan_abort(ar);
7906
7907 mutex_unlock(&ar->conf_mutex);
7908
7909 cancel_delayed_work_sync(&ar->scan.timeout);
7910
7911 return 0;
7912 }
7913
7914 /*
7915 * Both RTS and Fragmentation threshold are interface-specific
7916 * in ath10k, but device-specific in mac80211.
7917 */
7918
ath10k_set_rts_threshold(struct ieee80211_hw * hw,u32 value)7919 static int ath10k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7920 {
7921 struct ath10k *ar = hw->priv;
7922 struct ath10k_vif *arvif;
7923 int ret = 0;
7924
7925 mutex_lock(&ar->conf_mutex);
7926 list_for_each_entry(arvif, &ar->arvifs, list) {
7927 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d rts threshold %d\n",
7928 arvif->vdev_id, value);
7929
7930 ret = ath10k_mac_set_rts(arvif, value);
7931 if (ret) {
7932 ath10k_warn(ar, "failed to set rts threshold for vdev %d: %d\n",
7933 arvif->vdev_id, ret);
7934 break;
7935 }
7936 }
7937 mutex_unlock(&ar->conf_mutex);
7938
7939 return ret;
7940 }
7941
ath10k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,u32 value)7942 static int ath10k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7943 {
7944 /* Even though there's a WMI enum for fragmentation threshold no known
7945 * firmware actually implements it. Moreover it is not possible to rely
7946 * frame fragmentation to mac80211 because firmware clears the "more
7947 * fragments" bit in frame control making it impossible for remote
7948 * devices to reassemble frames.
7949 *
7950 * Hence implement a dummy callback just to say fragmentation isn't
7951 * supported. This effectively prevents mac80211 from doing frame
7952 * fragmentation in software.
7953 */
7954 return -EOPNOTSUPP;
7955 }
7956
ath10k_mac_wait_tx_complete(struct ath10k * ar)7957 void ath10k_mac_wait_tx_complete(struct ath10k *ar)
7958 {
7959 bool skip;
7960 long time_left;
7961
7962 /* mac80211 doesn't care if we really xmit queued frames or not
7963 * we'll collect those frames either way if we stop/delete vdevs
7964 */
7965
7966 if (ar->state == ATH10K_STATE_WEDGED)
7967 return;
7968
7969 time_left = wait_event_timeout(ar->htt.empty_tx_wq, ({
7970 bool empty;
7971
7972 spin_lock_bh(&ar->htt.tx_lock);
7973 empty = (ar->htt.num_pending_tx == 0);
7974 spin_unlock_bh(&ar->htt.tx_lock);
7975
7976 skip = (ar->state == ATH10K_STATE_WEDGED) ||
7977 test_bit(ATH10K_FLAG_CRASH_FLUSH,
7978 &ar->dev_flags);
7979
7980 (empty || skip);
7981 }), ATH10K_FLUSH_TIMEOUT_HZ);
7982
7983 if (time_left == 0 || skip)
7984 ath10k_warn(ar, "failed to flush transmit queue (skip %i ar-state %i): %ld\n",
7985 skip, ar->state, time_left);
7986 }
7987
ath10k_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)7988 static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7989 u32 queues, bool drop)
7990 {
7991 struct ath10k *ar = hw->priv;
7992 struct ath10k_vif *arvif;
7993 u32 bitmap;
7994
7995 if (drop) {
7996 if (vif && vif->type == NL80211_IFTYPE_STATION) {
7997 bitmap = ~(1 << WMI_MGMT_TID);
7998 list_for_each_entry(arvif, &ar->arvifs, list) {
7999 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
8000 ath10k_wmi_peer_flush(ar, arvif->vdev_id,
8001 arvif->bssid, bitmap);
8002 }
8003 ath10k_htt_flush_tx(&ar->htt);
8004 }
8005 return;
8006 }
8007
8008 mutex_lock(&ar->conf_mutex);
8009 ath10k_mac_wait_tx_complete(ar);
8010 mutex_unlock(&ar->conf_mutex);
8011 }
8012
8013 /* TODO: Implement this function properly
8014 * For now it is needed to reply to Probe Requests in IBSS mode.
8015 * Propably we need this information from FW.
8016 */
ath10k_tx_last_beacon(struct ieee80211_hw * hw)8017 static int ath10k_tx_last_beacon(struct ieee80211_hw *hw)
8018 {
8019 return 1;
8020 }
8021
ath10k_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)8022 static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
8023 enum ieee80211_reconfig_type reconfig_type)
8024 {
8025 struct ath10k *ar = hw->priv;
8026
8027 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8028 return;
8029
8030 mutex_lock(&ar->conf_mutex);
8031
8032 /* If device failed to restart it will be in a different state, e.g.
8033 * ATH10K_STATE_WEDGED
8034 */
8035 if (ar->state == ATH10K_STATE_RESTARTED) {
8036 ath10k_info(ar, "device successfully recovered\n");
8037 ar->state = ATH10K_STATE_ON;
8038 ieee80211_wake_queues(ar->hw);
8039 clear_bit(ATH10K_FLAG_RESTARTING, &ar->dev_flags);
8040 }
8041
8042 mutex_unlock(&ar->conf_mutex);
8043 }
8044
8045 static void
ath10k_mac_update_bss_chan_survey(struct ath10k * ar,struct ieee80211_channel * channel)8046 ath10k_mac_update_bss_chan_survey(struct ath10k *ar,
8047 struct ieee80211_channel *channel)
8048 {
8049 int ret;
8050 enum wmi_bss_survey_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8051
8052 lockdep_assert_held(&ar->conf_mutex);
8053
8054 if (!test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map) ||
8055 (ar->rx_channel != channel))
8056 return;
8057
8058 if (ar->scan.state != ATH10K_SCAN_IDLE) {
8059 ath10k_dbg(ar, ATH10K_DBG_MAC, "ignoring bss chan info request while scanning..\n");
8060 return;
8061 }
8062
8063 reinit_completion(&ar->bss_survey_done);
8064
8065 ret = ath10k_wmi_pdev_bss_chan_info_request(ar, type);
8066 if (ret) {
8067 ath10k_warn(ar, "failed to send pdev bss chan info request\n");
8068 return;
8069 }
8070
8071 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8072 if (!ret) {
8073 ath10k_warn(ar, "bss channel survey timed out\n");
8074 return;
8075 }
8076 }
8077
ath10k_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)8078 static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
8079 struct survey_info *survey)
8080 {
8081 struct ath10k *ar = hw->priv;
8082 struct ieee80211_supported_band *sband;
8083 struct survey_info *ar_survey = &ar->survey[idx];
8084 int ret = 0;
8085
8086 mutex_lock(&ar->conf_mutex);
8087
8088 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8089 if (sband && idx >= sband->n_channels) {
8090 idx -= sband->n_channels;
8091 sband = NULL;
8092 }
8093
8094 if (!sband)
8095 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8096
8097 if (!sband || idx >= sband->n_channels) {
8098 ret = -ENOENT;
8099 goto exit;
8100 }
8101
8102 ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8103
8104 spin_lock_bh(&ar->data_lock);
8105 memcpy(survey, ar_survey, sizeof(*survey));
8106 spin_unlock_bh(&ar->data_lock);
8107
8108 survey->channel = &sband->channels[idx];
8109
8110 if (ar->rx_channel == survey->channel)
8111 survey->filled |= SURVEY_INFO_IN_USE;
8112
8113 exit:
8114 mutex_unlock(&ar->conf_mutex);
8115 return ret;
8116 }
8117
8118 static bool
ath10k_mac_bitrate_mask_get_single_nss(struct ath10k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,int * nss)8119 ath10k_mac_bitrate_mask_get_single_nss(struct ath10k *ar,
8120 enum nl80211_band band,
8121 const struct cfg80211_bitrate_mask *mask,
8122 int *nss)
8123 {
8124 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
8125 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8126 u8 ht_nss_mask = 0;
8127 u8 vht_nss_mask = 0;
8128 int i;
8129
8130 if (mask->control[band].legacy)
8131 return false;
8132
8133 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
8134 if (mask->control[band].ht_mcs[i] == 0)
8135 continue;
8136 else if (mask->control[band].ht_mcs[i] ==
8137 sband->ht_cap.mcs.rx_mask[i])
8138 ht_nss_mask |= BIT(i);
8139 else
8140 return false;
8141 }
8142
8143 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
8144 if (mask->control[band].vht_mcs[i] == 0)
8145 continue;
8146 else if (mask->control[band].vht_mcs[i] ==
8147 ath10k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
8148 vht_nss_mask |= BIT(i);
8149 else
8150 return false;
8151 }
8152
8153 if (ht_nss_mask != vht_nss_mask)
8154 return false;
8155
8156 if (ht_nss_mask == 0)
8157 return false;
8158
8159 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
8160 return false;
8161
8162 *nss = fls(ht_nss_mask);
8163
8164 return true;
8165 }
8166
ath10k_mac_set_fixed_rate_params(struct ath10k_vif * arvif,u8 rate,u8 nss,u8 sgi,u8 ldpc)8167 static int ath10k_mac_set_fixed_rate_params(struct ath10k_vif *arvif,
8168 u8 rate, u8 nss, u8 sgi, u8 ldpc)
8169 {
8170 struct ath10k *ar = arvif->ar;
8171 u32 vdev_param;
8172 int ret;
8173
8174 lockdep_assert_held(&ar->conf_mutex);
8175
8176 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
8177 arvif->vdev_id, rate, nss, sgi);
8178
8179 vdev_param = ar->wmi.vdev_param->fixed_rate;
8180 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, rate);
8181 if (ret) {
8182 ath10k_warn(ar, "failed to set fixed rate param 0x%02x: %d\n",
8183 rate, ret);
8184 return ret;
8185 }
8186
8187 vdev_param = ar->wmi.vdev_param->nss;
8188 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, nss);
8189 if (ret) {
8190 ath10k_warn(ar, "failed to set nss param %d: %d\n", nss, ret);
8191 return ret;
8192 }
8193
8194 vdev_param = ar->wmi.vdev_param->sgi;
8195 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, sgi);
8196 if (ret) {
8197 ath10k_warn(ar, "failed to set sgi param %d: %d\n", sgi, ret);
8198 return ret;
8199 }
8200
8201 vdev_param = ar->wmi.vdev_param->ldpc;
8202 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ldpc);
8203 if (ret) {
8204 ath10k_warn(ar, "failed to set ldpc param %d: %d\n", ldpc, ret);
8205 return ret;
8206 }
8207
8208 return 0;
8209 }
8210
8211 static bool
ath10k_mac_can_set_bitrate_mask(struct ath10k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,bool allow_pfr)8212 ath10k_mac_can_set_bitrate_mask(struct ath10k *ar,
8213 enum nl80211_band band,
8214 const struct cfg80211_bitrate_mask *mask,
8215 bool allow_pfr)
8216 {
8217 int i;
8218 u16 vht_mcs;
8219
8220 /* Due to firmware limitation in WMI_PEER_ASSOC_CMDID it is impossible
8221 * to express all VHT MCS rate masks. Effectively only the following
8222 * ranges can be used: none, 0-7, 0-8 and 0-9.
8223 */
8224 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8225 vht_mcs = mask->control[band].vht_mcs[i];
8226
8227 switch (vht_mcs) {
8228 case 0:
8229 case BIT(8) - 1:
8230 case BIT(9) - 1:
8231 case BIT(10) - 1:
8232 break;
8233 default:
8234 if (!allow_pfr)
8235 ath10k_warn(ar, "refusing bitrate mask with missing 0-7 VHT MCS rates\n");
8236 return false;
8237 }
8238 }
8239
8240 return true;
8241 }
8242
ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k * ar,struct ath10k_vif * arvif,struct ieee80211_sta * sta)8243 static bool ath10k_mac_set_vht_bitrate_mask_fixup(struct ath10k *ar,
8244 struct ath10k_vif *arvif,
8245 struct ieee80211_sta *sta)
8246 {
8247 int err;
8248 u8 rate = arvif->vht_pfr;
8249
8250 /* skip non vht and multiple rate peers */
8251 if (!sta->vht_cap.vht_supported || arvif->vht_num_rates != 1)
8252 return false;
8253
8254 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
8255 WMI_PEER_PARAM_FIXED_RATE, rate);
8256 if (err)
8257 ath10k_warn(ar, "failed to enable STA %pM peer fixed rate: %d\n",
8258 sta->addr, err);
8259
8260 return true;
8261 }
8262
ath10k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)8263 static void ath10k_mac_set_bitrate_mask_iter(void *data,
8264 struct ieee80211_sta *sta)
8265 {
8266 struct ath10k_vif *arvif = data;
8267 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8268 struct ath10k *ar = arvif->ar;
8269
8270 if (arsta->arvif != arvif)
8271 return;
8272
8273 if (ath10k_mac_set_vht_bitrate_mask_fixup(ar, arvif, sta))
8274 return;
8275
8276 spin_lock_bh(&ar->data_lock);
8277 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8278 spin_unlock_bh(&ar->data_lock);
8279
8280 ieee80211_queue_work(ar->hw, &arsta->update_wk);
8281 }
8282
ath10k_mac_clr_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)8283 static void ath10k_mac_clr_bitrate_mask_iter(void *data,
8284 struct ieee80211_sta *sta)
8285 {
8286 struct ath10k_vif *arvif = data;
8287 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8288 struct ath10k *ar = arvif->ar;
8289 int err;
8290
8291 /* clear vht peers only */
8292 if (arsta->arvif != arvif || !sta->vht_cap.vht_supported)
8293 return;
8294
8295 err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
8296 WMI_PEER_PARAM_FIXED_RATE,
8297 WMI_FIXED_RATE_NONE);
8298 if (err)
8299 ath10k_warn(ar, "failed to clear STA %pM peer fixed rate: %d\n",
8300 sta->addr, err);
8301 }
8302
ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)8303 static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8304 struct ieee80211_vif *vif,
8305 const struct cfg80211_bitrate_mask *mask)
8306 {
8307 struct ath10k_vif *arvif = (void *)vif->drv_priv;
8308 struct cfg80211_chan_def def;
8309 struct ath10k *ar = arvif->ar;
8310 enum nl80211_band band;
8311 const u8 *ht_mcs_mask;
8312 const u16 *vht_mcs_mask;
8313 u8 rate;
8314 u8 nss;
8315 u8 sgi;
8316 u8 ldpc;
8317 int single_nss;
8318 int ret;
8319 int vht_num_rates, allow_pfr;
8320 u8 vht_pfr;
8321 bool update_bitrate_mask = true;
8322
8323 if (ath10k_mac_vif_chan(vif, &def))
8324 return -EPERM;
8325
8326 band = def.chan->band;
8327 ht_mcs_mask = mask->control[band].ht_mcs;
8328 vht_mcs_mask = mask->control[band].vht_mcs;
8329 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
8330
8331 sgi = mask->control[band].gi;
8332 if (sgi == NL80211_TXRATE_FORCE_LGI)
8333 return -EINVAL;
8334
8335 allow_pfr = test_bit(ATH10K_FW_FEATURE_PEER_FIXED_RATE,
8336 ar->normal_mode_fw.fw_file.fw_features);
8337 if (allow_pfr) {
8338 mutex_lock(&ar->conf_mutex);
8339 ieee80211_iterate_stations_atomic(ar->hw,
8340 ath10k_mac_clr_bitrate_mask_iter,
8341 arvif);
8342 mutex_unlock(&ar->conf_mutex);
8343 }
8344
8345 if (ath10k_mac_bitrate_mask_has_single_rate(ar, band, mask,
8346 &vht_num_rates)) {
8347 ret = ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
8348 &rate, &nss,
8349 false);
8350 if (ret) {
8351 ath10k_warn(ar, "failed to get single rate for vdev %i: %d\n",
8352 arvif->vdev_id, ret);
8353 return ret;
8354 }
8355 } else if (ath10k_mac_bitrate_mask_get_single_nss(ar, band, mask,
8356 &single_nss)) {
8357 rate = WMI_FIXED_RATE_NONE;
8358 nss = single_nss;
8359 } else {
8360 rate = WMI_FIXED_RATE_NONE;
8361 nss = min(ar->num_rf_chains,
8362 max(ath10k_mac_max_ht_nss(ht_mcs_mask),
8363 ath10k_mac_max_vht_nss(vht_mcs_mask)));
8364
8365 if (!ath10k_mac_can_set_bitrate_mask(ar, band, mask,
8366 allow_pfr)) {
8367 u8 vht_nss;
8368
8369 if (!allow_pfr || vht_num_rates != 1)
8370 return -EINVAL;
8371
8372 /* Reach here, firmware supports peer fixed rate and has
8373 * single vht rate, and don't update vif birate_mask, as
8374 * the rate only for specific peer.
8375 */
8376 ath10k_mac_bitrate_mask_get_single_rate(ar, band, mask,
8377 &vht_pfr,
8378 &vht_nss,
8379 true);
8380 update_bitrate_mask = false;
8381 } else {
8382 vht_pfr = 0;
8383 }
8384
8385 mutex_lock(&ar->conf_mutex);
8386
8387 if (update_bitrate_mask)
8388 arvif->bitrate_mask = *mask;
8389 arvif->vht_num_rates = vht_num_rates;
8390 arvif->vht_pfr = vht_pfr;
8391 ieee80211_iterate_stations_atomic(ar->hw,
8392 ath10k_mac_set_bitrate_mask_iter,
8393 arvif);
8394
8395 mutex_unlock(&ar->conf_mutex);
8396 }
8397
8398 mutex_lock(&ar->conf_mutex);
8399
8400 ret = ath10k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
8401 if (ret) {
8402 ath10k_warn(ar, "failed to set fixed rate params on vdev %i: %d\n",
8403 arvif->vdev_id, ret);
8404 goto exit;
8405 }
8406
8407 exit:
8408 mutex_unlock(&ar->conf_mutex);
8409
8410 return ret;
8411 }
8412
ath10k_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u32 changed)8413 static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
8414 struct ieee80211_vif *vif,
8415 struct ieee80211_sta *sta,
8416 u32 changed)
8417 {
8418 struct ath10k *ar = hw->priv;
8419 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
8420 struct ath10k_vif *arvif = (void *)vif->drv_priv;
8421 struct ath10k_peer *peer;
8422 u32 bw, smps;
8423
8424 spin_lock_bh(&ar->data_lock);
8425
8426 peer = ath10k_peer_find(ar, arvif->vdev_id, sta->addr);
8427 if (!peer) {
8428 spin_unlock_bh(&ar->data_lock);
8429 ath10k_warn(ar, "mac sta rc update failed to find peer %pM on vdev %i\n",
8430 sta->addr, arvif->vdev_id);
8431 return;
8432 }
8433
8434 ath10k_dbg(ar, ATH10K_DBG_STA,
8435 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
8436 sta->addr, changed, sta->bandwidth, sta->rx_nss,
8437 sta->smps_mode);
8438
8439 if (changed & IEEE80211_RC_BW_CHANGED) {
8440 bw = WMI_PEER_CHWIDTH_20MHZ;
8441
8442 switch (sta->bandwidth) {
8443 case IEEE80211_STA_RX_BW_20:
8444 bw = WMI_PEER_CHWIDTH_20MHZ;
8445 break;
8446 case IEEE80211_STA_RX_BW_40:
8447 bw = WMI_PEER_CHWIDTH_40MHZ;
8448 break;
8449 case IEEE80211_STA_RX_BW_80:
8450 bw = WMI_PEER_CHWIDTH_80MHZ;
8451 break;
8452 case IEEE80211_STA_RX_BW_160:
8453 bw = WMI_PEER_CHWIDTH_160MHZ;
8454 break;
8455 default:
8456 ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
8457 sta->bandwidth, sta->addr);
8458 bw = WMI_PEER_CHWIDTH_20MHZ;
8459 break;
8460 }
8461
8462 arsta->bw = bw;
8463 }
8464
8465 if (changed & IEEE80211_RC_NSS_CHANGED)
8466 arsta->nss = sta->rx_nss;
8467
8468 if (changed & IEEE80211_RC_SMPS_CHANGED) {
8469 smps = WMI_PEER_SMPS_PS_NONE;
8470
8471 switch (sta->smps_mode) {
8472 case IEEE80211_SMPS_AUTOMATIC:
8473 case IEEE80211_SMPS_OFF:
8474 smps = WMI_PEER_SMPS_PS_NONE;
8475 break;
8476 case IEEE80211_SMPS_STATIC:
8477 smps = WMI_PEER_SMPS_STATIC;
8478 break;
8479 case IEEE80211_SMPS_DYNAMIC:
8480 smps = WMI_PEER_SMPS_DYNAMIC;
8481 break;
8482 case IEEE80211_SMPS_NUM_MODES:
8483 ath10k_warn(ar, "Invalid smps %d in sta rc update for %pM\n",
8484 sta->smps_mode, sta->addr);
8485 smps = WMI_PEER_SMPS_PS_NONE;
8486 break;
8487 }
8488
8489 arsta->smps = smps;
8490 }
8491
8492 arsta->changed |= changed;
8493
8494 spin_unlock_bh(&ar->data_lock);
8495
8496 ieee80211_queue_work(hw, &arsta->update_wk);
8497 }
8498
ath10k_offset_tsf(struct ieee80211_hw * hw,struct ieee80211_vif * vif,s64 tsf_offset)8499 static void ath10k_offset_tsf(struct ieee80211_hw *hw,
8500 struct ieee80211_vif *vif, s64 tsf_offset)
8501 {
8502 struct ath10k *ar = hw->priv;
8503 struct ath10k_vif *arvif = (void *)vif->drv_priv;
8504 u32 offset, vdev_param;
8505 int ret;
8506
8507 if (tsf_offset < 0) {
8508 vdev_param = ar->wmi.vdev_param->dec_tsf;
8509 offset = -tsf_offset;
8510 } else {
8511 vdev_param = ar->wmi.vdev_param->inc_tsf;
8512 offset = tsf_offset;
8513 }
8514
8515 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
8516 vdev_param, offset);
8517
8518 if (ret && ret != -EOPNOTSUPP)
8519 ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n",
8520 offset, vdev_param, ret);
8521 }
8522
ath10k_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)8523 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
8524 struct ieee80211_vif *vif,
8525 struct ieee80211_ampdu_params *params)
8526 {
8527 struct ath10k *ar = hw->priv;
8528 struct ath10k_vif *arvif = (void *)vif->drv_priv;
8529 struct ieee80211_sta *sta = params->sta;
8530 enum ieee80211_ampdu_mlme_action action = params->action;
8531 u16 tid = params->tid;
8532
8533 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %u action %d\n",
8534 arvif->vdev_id, sta->addr, tid, action);
8535
8536 switch (action) {
8537 case IEEE80211_AMPDU_RX_START:
8538 case IEEE80211_AMPDU_RX_STOP:
8539 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
8540 * creation/removal. Do we need to verify this?
8541 */
8542 return 0;
8543 case IEEE80211_AMPDU_TX_START:
8544 case IEEE80211_AMPDU_TX_STOP_CONT:
8545 case IEEE80211_AMPDU_TX_STOP_FLUSH:
8546 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
8547 case IEEE80211_AMPDU_TX_OPERATIONAL:
8548 /* Firmware offloads Tx aggregation entirely so deny mac80211
8549 * Tx aggregation requests.
8550 */
8551 return -EOPNOTSUPP;
8552 }
8553
8554 return -EINVAL;
8555 }
8556
8557 static void
ath10k_mac_update_rx_channel(struct ath10k * ar,struct ieee80211_chanctx_conf * ctx,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)8558 ath10k_mac_update_rx_channel(struct ath10k *ar,
8559 struct ieee80211_chanctx_conf *ctx,
8560 struct ieee80211_vif_chanctx_switch *vifs,
8561 int n_vifs)
8562 {
8563 struct cfg80211_chan_def *def = NULL;
8564
8565 /* Both locks are required because ar->rx_channel is modified. This
8566 * allows readers to hold either lock.
8567 */
8568 lockdep_assert_held(&ar->conf_mutex);
8569 lockdep_assert_held(&ar->data_lock);
8570
8571 WARN_ON(ctx && vifs);
8572 WARN_ON(vifs && !n_vifs);
8573
8574 /* FIXME: Sort of an optimization and a workaround. Peers and vifs are
8575 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
8576 * ppdu on Rx may reduce performance on low-end systems. It should be
8577 * possible to make tables/hashmaps to speed the lookup up (be vary of
8578 * cpu data cache lines though regarding sizes) but to keep the initial
8579 * implementation simple and less intrusive fallback to the slow lookup
8580 * only for multi-channel cases. Single-channel cases will remain to
8581 * use the old channel derival and thus performance should not be
8582 * affected much.
8583 */
8584 rcu_read_lock();
8585 if (!ctx && ath10k_mac_num_chanctxs(ar) == 1) {
8586 ieee80211_iter_chan_contexts_atomic(ar->hw,
8587 ath10k_mac_get_any_chandef_iter,
8588 &def);
8589
8590 if (vifs)
8591 def = &vifs[0].new_ctx->def;
8592
8593 ar->rx_channel = def->chan;
8594 } else if ((ctx && ath10k_mac_num_chanctxs(ar) == 0) ||
8595 (ctx && (ar->state == ATH10K_STATE_RESTARTED))) {
8596 /* During driver restart due to firmware assert, since mac80211
8597 * already has valid channel context for given radio, channel
8598 * context iteration return num_chanctx > 0. So fix rx_channel
8599 * when restart is in progress.
8600 */
8601 ar->rx_channel = ctx->def.chan;
8602 } else {
8603 ar->rx_channel = NULL;
8604 }
8605 rcu_read_unlock();
8606 }
8607
8608 static void
ath10k_mac_update_vif_chan(struct ath10k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)8609 ath10k_mac_update_vif_chan(struct ath10k *ar,
8610 struct ieee80211_vif_chanctx_switch *vifs,
8611 int n_vifs)
8612 {
8613 struct ath10k_vif *arvif;
8614 int ret;
8615 int i;
8616
8617 lockdep_assert_held(&ar->conf_mutex);
8618
8619 /* First stop monitor interface. Some FW versions crash if there's a
8620 * lone monitor interface.
8621 */
8622 if (ar->monitor_started)
8623 ath10k_monitor_stop(ar);
8624
8625 for (i = 0; i < n_vifs; i++) {
8626 arvif = (void *)vifs[i].vif->drv_priv;
8627
8628 ath10k_dbg(ar, ATH10K_DBG_MAC,
8629 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
8630 arvif->vdev_id,
8631 vifs[i].old_ctx->def.chan->center_freq,
8632 vifs[i].new_ctx->def.chan->center_freq,
8633 vifs[i].old_ctx->def.width,
8634 vifs[i].new_ctx->def.width);
8635
8636 if (WARN_ON(!arvif->is_started))
8637 continue;
8638
8639 if (WARN_ON(!arvif->is_up))
8640 continue;
8641
8642 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
8643 if (ret) {
8644 ath10k_warn(ar, "failed to down vdev %d: %d\n",
8645 arvif->vdev_id, ret);
8646 continue;
8647 }
8648 }
8649
8650 /* All relevant vdevs are downed and associated channel resources
8651 * should be available for the channel switch now.
8652 */
8653
8654 spin_lock_bh(&ar->data_lock);
8655 ath10k_mac_update_rx_channel(ar, NULL, vifs, n_vifs);
8656 spin_unlock_bh(&ar->data_lock);
8657
8658 for (i = 0; i < n_vifs; i++) {
8659 arvif = (void *)vifs[i].vif->drv_priv;
8660
8661 if (WARN_ON(!arvif->is_started))
8662 continue;
8663
8664 if (WARN_ON(!arvif->is_up))
8665 continue;
8666
8667 ret = ath10k_mac_setup_bcn_tmpl(arvif);
8668 if (ret)
8669 ath10k_warn(ar, "failed to update bcn tmpl during csa: %d\n",
8670 ret);
8671
8672 ret = ath10k_mac_setup_prb_tmpl(arvif);
8673 if (ret)
8674 ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
8675 ret);
8676
8677 ret = ath10k_vdev_restart(arvif, &vifs[i].new_ctx->def);
8678 if (ret) {
8679 ath10k_warn(ar, "failed to restart vdev %d: %d\n",
8680 arvif->vdev_id, ret);
8681 continue;
8682 }
8683
8684 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
8685 arvif->bssid);
8686 if (ret) {
8687 ath10k_warn(ar, "failed to bring vdev up %d: %d\n",
8688 arvif->vdev_id, ret);
8689 continue;
8690 }
8691 }
8692
8693 ath10k_monitor_recalc(ar);
8694 }
8695
8696 static int
ath10k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)8697 ath10k_mac_op_add_chanctx(struct ieee80211_hw *hw,
8698 struct ieee80211_chanctx_conf *ctx)
8699 {
8700 struct ath10k *ar = hw->priv;
8701
8702 ath10k_dbg(ar, ATH10K_DBG_MAC,
8703 "mac chanctx add freq %u width %d ptr %pK\n",
8704 ctx->def.chan->center_freq, ctx->def.width, ctx);
8705
8706 mutex_lock(&ar->conf_mutex);
8707
8708 spin_lock_bh(&ar->data_lock);
8709 ath10k_mac_update_rx_channel(ar, ctx, NULL, 0);
8710 spin_unlock_bh(&ar->data_lock);
8711
8712 ath10k_recalc_radar_detection(ar);
8713 ath10k_monitor_recalc(ar);
8714
8715 mutex_unlock(&ar->conf_mutex);
8716
8717 return 0;
8718 }
8719
8720 static void
ath10k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)8721 ath10k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
8722 struct ieee80211_chanctx_conf *ctx)
8723 {
8724 struct ath10k *ar = hw->priv;
8725
8726 ath10k_dbg(ar, ATH10K_DBG_MAC,
8727 "mac chanctx remove freq %u width %d ptr %pK\n",
8728 ctx->def.chan->center_freq, ctx->def.width, ctx);
8729
8730 mutex_lock(&ar->conf_mutex);
8731
8732 spin_lock_bh(&ar->data_lock);
8733 ath10k_mac_update_rx_channel(ar, NULL, NULL, 0);
8734 spin_unlock_bh(&ar->data_lock);
8735
8736 ath10k_recalc_radar_detection(ar);
8737 ath10k_monitor_recalc(ar);
8738
8739 mutex_unlock(&ar->conf_mutex);
8740 }
8741
8742 struct ath10k_mac_change_chanctx_arg {
8743 struct ieee80211_chanctx_conf *ctx;
8744 struct ieee80211_vif_chanctx_switch *vifs;
8745 int n_vifs;
8746 int next_vif;
8747 };
8748
8749 static void
ath10k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)8750 ath10k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
8751 struct ieee80211_vif *vif)
8752 {
8753 struct ath10k_mac_change_chanctx_arg *arg = data;
8754
8755 if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
8756 return;
8757
8758 arg->n_vifs++;
8759 }
8760
8761 static void
ath10k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)8762 ath10k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
8763 struct ieee80211_vif *vif)
8764 {
8765 struct ath10k_mac_change_chanctx_arg *arg = data;
8766 struct ieee80211_chanctx_conf *ctx;
8767
8768 ctx = rcu_access_pointer(vif->chanctx_conf);
8769 if (ctx != arg->ctx)
8770 return;
8771
8772 if (WARN_ON(arg->next_vif == arg->n_vifs))
8773 return;
8774
8775 arg->vifs[arg->next_vif].vif = vif;
8776 arg->vifs[arg->next_vif].old_ctx = ctx;
8777 arg->vifs[arg->next_vif].new_ctx = ctx;
8778 arg->next_vif++;
8779 }
8780
8781 static void
ath10k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)8782 ath10k_mac_op_change_chanctx(struct ieee80211_hw *hw,
8783 struct ieee80211_chanctx_conf *ctx,
8784 u32 changed)
8785 {
8786 struct ath10k *ar = hw->priv;
8787 struct ath10k_mac_change_chanctx_arg arg = { .ctx = ctx };
8788
8789 mutex_lock(&ar->conf_mutex);
8790
8791 ath10k_dbg(ar, ATH10K_DBG_MAC,
8792 "mac chanctx change freq %u width %d ptr %pK changed %x\n",
8793 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
8794
8795 /* This shouldn't really happen because channel switching should use
8796 * switch_vif_chanctx().
8797 */
8798 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
8799 goto unlock;
8800
8801 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH) {
8802 ieee80211_iterate_active_interfaces_atomic(
8803 hw,
8804 ATH10K_ITER_NORMAL_FLAGS,
8805 ath10k_mac_change_chanctx_cnt_iter,
8806 &arg);
8807 if (arg.n_vifs == 0)
8808 goto radar;
8809
8810 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]),
8811 GFP_KERNEL);
8812 if (!arg.vifs)
8813 goto radar;
8814
8815 ieee80211_iterate_active_interfaces_atomic(
8816 hw,
8817 ATH10K_ITER_NORMAL_FLAGS,
8818 ath10k_mac_change_chanctx_fill_iter,
8819 &arg);
8820 ath10k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
8821 kfree(arg.vifs);
8822 }
8823
8824 radar:
8825 ath10k_recalc_radar_detection(ar);
8826
8827 /* FIXME: How to configure Rx chains properly? */
8828
8829 /* No other actions are actually necessary. Firmware maintains channel
8830 * definitions per vdev internally and there's no host-side channel
8831 * context abstraction to configure, e.g. channel width.
8832 */
8833
8834 unlock:
8835 mutex_unlock(&ar->conf_mutex);
8836 }
8837
8838 static int
ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_chanctx_conf * ctx)8839 ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
8840 struct ieee80211_vif *vif,
8841 struct ieee80211_chanctx_conf *ctx)
8842 {
8843 struct ath10k *ar = hw->priv;
8844 struct ath10k_vif *arvif = (void *)vif->drv_priv;
8845 int ret;
8846
8847 mutex_lock(&ar->conf_mutex);
8848
8849 ath10k_dbg(ar, ATH10K_DBG_MAC,
8850 "mac chanctx assign ptr %pK vdev_id %i\n",
8851 ctx, arvif->vdev_id);
8852
8853 if (WARN_ON(arvif->is_started)) {
8854 mutex_unlock(&ar->conf_mutex);
8855 return -EBUSY;
8856 }
8857
8858 ret = ath10k_vdev_start(arvif, &ctx->def);
8859 if (ret) {
8860 ath10k_warn(ar, "failed to start vdev %i addr %pM on freq %d: %d\n",
8861 arvif->vdev_id, vif->addr,
8862 ctx->def.chan->center_freq, ret);
8863 goto err;
8864 }
8865
8866 arvif->is_started = true;
8867
8868 ret = ath10k_mac_vif_setup_ps(arvif);
8869 if (ret) {
8870 ath10k_warn(ar, "failed to update vdev %i ps: %d\n",
8871 arvif->vdev_id, ret);
8872 goto err_stop;
8873 }
8874
8875 if (vif->type == NL80211_IFTYPE_MONITOR) {
8876 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, 0, vif->addr);
8877 if (ret) {
8878 ath10k_warn(ar, "failed to up monitor vdev %i: %d\n",
8879 arvif->vdev_id, ret);
8880 goto err_stop;
8881 }
8882
8883 arvif->is_up = true;
8884 }
8885
8886 if (ath10k_mac_can_set_cts_prot(arvif)) {
8887 ret = ath10k_mac_set_cts_prot(arvif);
8888 if (ret)
8889 ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n",
8890 arvif->vdev_id, ret);
8891 }
8892
8893 if (ath10k_peer_stats_enabled(ar) &&
8894 ar->hw_params.tx_stats_over_pktlog) {
8895 ar->pktlog_filter |= ATH10K_PKTLOG_PEER_STATS;
8896 ret = ath10k_wmi_pdev_pktlog_enable(ar,
8897 ar->pktlog_filter);
8898 if (ret) {
8899 ath10k_warn(ar, "failed to enable pktlog %d\n", ret);
8900 goto err_stop;
8901 }
8902 }
8903
8904 mutex_unlock(&ar->conf_mutex);
8905 return 0;
8906
8907 err_stop:
8908 ath10k_vdev_stop(arvif);
8909 arvif->is_started = false;
8910 ath10k_mac_vif_setup_ps(arvif);
8911
8912 err:
8913 mutex_unlock(&ar->conf_mutex);
8914 return ret;
8915 }
8916
8917 static void
ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_chanctx_conf * ctx)8918 ath10k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
8919 struct ieee80211_vif *vif,
8920 struct ieee80211_chanctx_conf *ctx)
8921 {
8922 struct ath10k *ar = hw->priv;
8923 struct ath10k_vif *arvif = (void *)vif->drv_priv;
8924 int ret;
8925
8926 mutex_lock(&ar->conf_mutex);
8927
8928 ath10k_dbg(ar, ATH10K_DBG_MAC,
8929 "mac chanctx unassign ptr %pK vdev_id %i\n",
8930 ctx, arvif->vdev_id);
8931
8932 WARN_ON(!arvif->is_started);
8933
8934 if (vif->type == NL80211_IFTYPE_MONITOR) {
8935 WARN_ON(!arvif->is_up);
8936
8937 ret = ath10k_wmi_vdev_down(ar, arvif->vdev_id);
8938 if (ret)
8939 ath10k_warn(ar, "failed to down monitor vdev %i: %d\n",
8940 arvif->vdev_id, ret);
8941
8942 arvif->is_up = false;
8943 }
8944
8945 ret = ath10k_vdev_stop(arvif);
8946 if (ret)
8947 ath10k_warn(ar, "failed to stop vdev %i: %d\n",
8948 arvif->vdev_id, ret);
8949
8950 arvif->is_started = false;
8951
8952 mutex_unlock(&ar->conf_mutex);
8953 }
8954
8955 static int
ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode)8956 ath10k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
8957 struct ieee80211_vif_chanctx_switch *vifs,
8958 int n_vifs,
8959 enum ieee80211_chanctx_switch_mode mode)
8960 {
8961 struct ath10k *ar = hw->priv;
8962
8963 mutex_lock(&ar->conf_mutex);
8964
8965 ath10k_dbg(ar, ATH10K_DBG_MAC,
8966 "mac chanctx switch n_vifs %d mode %d\n",
8967 n_vifs, mode);
8968 ath10k_mac_update_vif_chan(ar, vifs, n_vifs);
8969
8970 mutex_unlock(&ar->conf_mutex);
8971 return 0;
8972 }
8973
ath10k_mac_op_sta_pre_rcu_remove(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)8974 static void ath10k_mac_op_sta_pre_rcu_remove(struct ieee80211_hw *hw,
8975 struct ieee80211_vif *vif,
8976 struct ieee80211_sta *sta)
8977 {
8978 struct ath10k *ar;
8979 struct ath10k_peer *peer;
8980
8981 ar = hw->priv;
8982
8983 list_for_each_entry(peer, &ar->peers, list)
8984 if (peer->sta == sta)
8985 peer->removed = true;
8986 }
8987
8988 /* HT MCS parameters with Nss = 1 */
8989 static const struct ath10k_index_ht_data_rate_type supported_ht_mcs_rate_nss1[] = {
8990 /* MCS L20 L40 S20 S40 */
8991 {0, { 65, 135, 72, 150} },
8992 {1, { 130, 270, 144, 300} },
8993 {2, { 195, 405, 217, 450} },
8994 {3, { 260, 540, 289, 600} },
8995 {4, { 390, 810, 433, 900} },
8996 {5, { 520, 1080, 578, 1200} },
8997 {6, { 585, 1215, 650, 1350} },
8998 {7, { 650, 1350, 722, 1500} }
8999 };
9000
9001 /* HT MCS parameters with Nss = 2 */
9002 static const struct ath10k_index_ht_data_rate_type supported_ht_mcs_rate_nss2[] = {
9003 /* MCS L20 L40 S20 S40 */
9004 {0, {130, 270, 144, 300} },
9005 {1, {260, 540, 289, 600} },
9006 {2, {390, 810, 433, 900} },
9007 {3, {520, 1080, 578, 1200} },
9008 {4, {780, 1620, 867, 1800} },
9009 {5, {1040, 2160, 1156, 2400} },
9010 {6, {1170, 2430, 1300, 2700} },
9011 {7, {1300, 2700, 1444, 3000} }
9012 };
9013
9014 /* MCS parameters with Nss = 1 */
9015 static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss1[] = {
9016 /* MCS L80 S80 L40 S40 L20 S20 */
9017 {0, {293, 325}, {135, 150}, {65, 72} },
9018 {1, {585, 650}, {270, 300}, {130, 144} },
9019 {2, {878, 975}, {405, 450}, {195, 217} },
9020 {3, {1170, 1300}, {540, 600}, {260, 289} },
9021 {4, {1755, 1950}, {810, 900}, {390, 433} },
9022 {5, {2340, 2600}, {1080, 1200}, {520, 578} },
9023 {6, {2633, 2925}, {1215, 1350}, {585, 650} },
9024 {7, {2925, 3250}, {1350, 1500}, {650, 722} },
9025 {8, {3510, 3900}, {1620, 1800}, {780, 867} },
9026 {9, {3900, 4333}, {1800, 2000}, {780, 867} }
9027 };
9028
9029 /*MCS parameters with Nss = 2 */
9030 static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss2[] = {
9031 /* MCS L80 S80 L40 S40 L20 S20 */
9032 {0, {585, 650}, {270, 300}, {130, 144} },
9033 {1, {1170, 1300}, {540, 600}, {260, 289} },
9034 {2, {1755, 1950}, {810, 900}, {390, 433} },
9035 {3, {2340, 2600}, {1080, 1200}, {520, 578} },
9036 {4, {3510, 3900}, {1620, 1800}, {780, 867} },
9037 {5, {4680, 5200}, {2160, 2400}, {1040, 1156} },
9038 {6, {5265, 5850}, {2430, 2700}, {1170, 1300} },
9039 {7, {5850, 6500}, {2700, 3000}, {1300, 1444} },
9040 {8, {7020, 7800}, {3240, 3600}, {1560, 1733} },
9041 {9, {7800, 8667}, {3600, 4000}, {1560, 1733} }
9042 };
9043
ath10k_mac_get_rate_flags_ht(struct ath10k * ar,u32 rate,u8 nss,u8 mcs,u8 * flags,u8 * bw)9044 static void ath10k_mac_get_rate_flags_ht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
9045 u8 *flags, u8 *bw)
9046 {
9047 struct ath10k_index_ht_data_rate_type *mcs_rate;
9048 u8 index;
9049 size_t len_nss1 = ARRAY_SIZE(supported_ht_mcs_rate_nss1);
9050 size_t len_nss2 = ARRAY_SIZE(supported_ht_mcs_rate_nss2);
9051
9052 if (mcs >= (len_nss1 + len_nss2)) {
9053 ath10k_warn(ar, "not supported mcs %d in current rate table", mcs);
9054 return;
9055 }
9056
9057 mcs_rate = (struct ath10k_index_ht_data_rate_type *)
9058 ((nss == 1) ? &supported_ht_mcs_rate_nss1 :
9059 &supported_ht_mcs_rate_nss2);
9060
9061 if (mcs >= len_nss1)
9062 index = mcs - len_nss1;
9063 else
9064 index = mcs;
9065
9066 if (rate == mcs_rate[index].supported_rate[0]) {
9067 *bw = RATE_INFO_BW_20;
9068 } else if (rate == mcs_rate[index].supported_rate[1]) {
9069 *bw |= RATE_INFO_BW_40;
9070 } else if (rate == mcs_rate[index].supported_rate[2]) {
9071 *bw |= RATE_INFO_BW_20;
9072 *flags |= RATE_INFO_FLAGS_SHORT_GI;
9073 } else if (rate == mcs_rate[index].supported_rate[3]) {
9074 *bw |= RATE_INFO_BW_40;
9075 *flags |= RATE_INFO_FLAGS_SHORT_GI;
9076 } else {
9077 ath10k_warn(ar, "invalid ht params rate %d 100kbps nss %d mcs %d",
9078 rate, nss, mcs);
9079 }
9080 }
9081
ath10k_mac_get_rate_flags_vht(struct ath10k * ar,u32 rate,u8 nss,u8 mcs,u8 * flags,u8 * bw)9082 static void ath10k_mac_get_rate_flags_vht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
9083 u8 *flags, u8 *bw)
9084 {
9085 struct ath10k_index_vht_data_rate_type *mcs_rate;
9086
9087 mcs_rate = (struct ath10k_index_vht_data_rate_type *)
9088 ((nss == 1) ? &supported_vht_mcs_rate_nss1 :
9089 &supported_vht_mcs_rate_nss2);
9090
9091 if (rate == mcs_rate[mcs].supported_VHT80_rate[0]) {
9092 *bw = RATE_INFO_BW_80;
9093 } else if (rate == mcs_rate[mcs].supported_VHT80_rate[1]) {
9094 *bw = RATE_INFO_BW_80;
9095 *flags |= RATE_INFO_FLAGS_SHORT_GI;
9096 } else if (rate == mcs_rate[mcs].supported_VHT40_rate[0]) {
9097 *bw = RATE_INFO_BW_40;
9098 } else if (rate == mcs_rate[mcs].supported_VHT40_rate[1]) {
9099 *bw = RATE_INFO_BW_40;
9100 *flags |= RATE_INFO_FLAGS_SHORT_GI;
9101 } else if (rate == mcs_rate[mcs].supported_VHT20_rate[0]) {
9102 *bw = RATE_INFO_BW_20;
9103 } else if (rate == mcs_rate[mcs].supported_VHT20_rate[1]) {
9104 *bw = RATE_INFO_BW_20;
9105 *flags |= RATE_INFO_FLAGS_SHORT_GI;
9106 } else {
9107 ath10k_warn(ar, "invalid vht params rate %d 100kbps nss %d mcs %d",
9108 rate, nss, mcs);
9109 }
9110 }
9111
ath10k_mac_get_rate_flags(struct ath10k * ar,u32 rate,enum ath10k_phy_mode mode,u8 nss,u8 mcs,u8 * flags,u8 * bw)9112 static void ath10k_mac_get_rate_flags(struct ath10k *ar, u32 rate,
9113 enum ath10k_phy_mode mode, u8 nss, u8 mcs,
9114 u8 *flags, u8 *bw)
9115 {
9116 if (mode == ATH10K_PHY_MODE_HT) {
9117 *flags = RATE_INFO_FLAGS_MCS;
9118 ath10k_mac_get_rate_flags_ht(ar, rate, nss, mcs, flags, bw);
9119 } else if (mode == ATH10K_PHY_MODE_VHT) {
9120 *flags = RATE_INFO_FLAGS_VHT_MCS;
9121 ath10k_mac_get_rate_flags_vht(ar, rate, nss, mcs, flags, bw);
9122 }
9123 }
9124
ath10k_mac_parse_bitrate(struct ath10k * ar,u32 rate_code,u32 bitrate_kbps,struct rate_info * rate)9125 static void ath10k_mac_parse_bitrate(struct ath10k *ar, u32 rate_code,
9126 u32 bitrate_kbps, struct rate_info *rate)
9127 {
9128 enum ath10k_phy_mode mode = ATH10K_PHY_MODE_LEGACY;
9129 enum wmi_rate_preamble preamble = WMI_TLV_GET_HW_RC_PREAM_V1(rate_code);
9130 u8 nss = WMI_TLV_GET_HW_RC_NSS_V1(rate_code) + 1;
9131 u8 mcs = WMI_TLV_GET_HW_RC_RATE_V1(rate_code);
9132 u8 flags = 0, bw = 0;
9133
9134 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac parse rate code 0x%x bitrate %d kbps\n",
9135 rate_code, bitrate_kbps);
9136
9137 if (preamble == WMI_RATE_PREAMBLE_HT)
9138 mode = ATH10K_PHY_MODE_HT;
9139 else if (preamble == WMI_RATE_PREAMBLE_VHT)
9140 mode = ATH10K_PHY_MODE_VHT;
9141
9142 ath10k_mac_get_rate_flags(ar, bitrate_kbps / 100, mode, nss, mcs, &flags, &bw);
9143
9144 ath10k_dbg(ar, ATH10K_DBG_MAC,
9145 "mac parse bitrate preamble %d mode %d nss %d mcs %d flags %x bw %d\n",
9146 preamble, mode, nss, mcs, flags, bw);
9147
9148 rate->flags = flags;
9149 rate->bw = bw;
9150 rate->legacy = bitrate_kbps / 100;
9151 rate->nss = nss;
9152 rate->mcs = mcs;
9153 }
9154
ath10k_mac_sta_get_peer_stats_info(struct ath10k * ar,struct ieee80211_sta * sta,struct station_info * sinfo)9155 static void ath10k_mac_sta_get_peer_stats_info(struct ath10k *ar,
9156 struct ieee80211_sta *sta,
9157 struct station_info *sinfo)
9158 {
9159 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
9160 struct ath10k_peer *peer;
9161 unsigned long time_left;
9162 int ret;
9163
9164 if (!(ar->hw_params.supports_peer_stats_info &&
9165 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA))
9166 return;
9167
9168 spin_lock_bh(&ar->data_lock);
9169 peer = ath10k_peer_find(ar, arsta->arvif->vdev_id, sta->addr);
9170 spin_unlock_bh(&ar->data_lock);
9171 if (!peer)
9172 return;
9173
9174 reinit_completion(&ar->peer_stats_info_complete);
9175
9176 ret = ath10k_wmi_request_peer_stats_info(ar,
9177 arsta->arvif->vdev_id,
9178 WMI_REQUEST_ONE_PEER_STATS_INFO,
9179 arsta->arvif->bssid,
9180 0);
9181 if (ret && ret != -EOPNOTSUPP) {
9182 ath10k_warn(ar, "could not request peer stats info: %d\n", ret);
9183 return;
9184 }
9185
9186 time_left = wait_for_completion_timeout(&ar->peer_stats_info_complete, 3 * HZ);
9187 if (time_left == 0) {
9188 ath10k_warn(ar, "timed out waiting peer stats info\n");
9189 return;
9190 }
9191
9192 if (arsta->rx_rate_code != 0 && arsta->rx_bitrate_kbps != 0) {
9193 ath10k_mac_parse_bitrate(ar, arsta->rx_rate_code,
9194 arsta->rx_bitrate_kbps,
9195 &sinfo->rxrate);
9196
9197 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
9198 arsta->rx_rate_code = 0;
9199 arsta->rx_bitrate_kbps = 0;
9200 }
9201
9202 if (arsta->tx_rate_code != 0 && arsta->tx_bitrate_kbps != 0) {
9203 ath10k_mac_parse_bitrate(ar, arsta->tx_rate_code,
9204 arsta->tx_bitrate_kbps,
9205 &sinfo->txrate);
9206
9207 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
9208 arsta->tx_rate_code = 0;
9209 arsta->tx_bitrate_kbps = 0;
9210 }
9211 }
9212
ath10k_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)9213 static void ath10k_sta_statistics(struct ieee80211_hw *hw,
9214 struct ieee80211_vif *vif,
9215 struct ieee80211_sta *sta,
9216 struct station_info *sinfo)
9217 {
9218 struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
9219 struct ath10k *ar = arsta->arvif->ar;
9220
9221 if (!ath10k_peer_stats_enabled(ar))
9222 return;
9223
9224 mutex_lock(&ar->conf_mutex);
9225 ath10k_debug_fw_stats_request(ar);
9226 mutex_unlock(&ar->conf_mutex);
9227
9228 sinfo->rx_duration = arsta->rx_duration;
9229 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
9230
9231 if (arsta->txrate.legacy || arsta->txrate.nss) {
9232 if (arsta->txrate.legacy) {
9233 sinfo->txrate.legacy = arsta->txrate.legacy;
9234 } else {
9235 sinfo->txrate.mcs = arsta->txrate.mcs;
9236 sinfo->txrate.nss = arsta->txrate.nss;
9237 sinfo->txrate.bw = arsta->txrate.bw;
9238 }
9239 sinfo->txrate.flags = arsta->txrate.flags;
9240 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
9241 }
9242
9243 if (ar->htt.disable_tx_comp) {
9244 sinfo->tx_failed = arsta->tx_failed;
9245 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
9246 }
9247
9248 sinfo->tx_retries = arsta->tx_retries;
9249 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
9250
9251 ath10k_mac_sta_get_peer_stats_info(ar, sta, sinfo);
9252 }
9253
ath10k_mac_op_set_tid_config(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct cfg80211_tid_config * tid_config)9254 static int ath10k_mac_op_set_tid_config(struct ieee80211_hw *hw,
9255 struct ieee80211_vif *vif,
9256 struct ieee80211_sta *sta,
9257 struct cfg80211_tid_config *tid_config)
9258 {
9259 struct ath10k *ar = hw->priv;
9260 struct ath10k_vif *arvif = (void *)vif->drv_priv;
9261 struct ath10k_mac_iter_tid_conf_data data = {};
9262 struct wmi_per_peer_per_tid_cfg_arg arg = {};
9263 int ret, i;
9264
9265 mutex_lock(&ar->conf_mutex);
9266 arg.vdev_id = arvif->vdev_id;
9267
9268 arvif->tids_rst = 0;
9269 memset(arvif->tid_conf_changed, 0, sizeof(arvif->tid_conf_changed));
9270
9271 for (i = 0; i < tid_config->n_tid_conf; i++) {
9272 ret = ath10k_mac_parse_tid_config(ar, sta, vif,
9273 &tid_config->tid_conf[i],
9274 &arg);
9275 if (ret)
9276 goto exit;
9277 }
9278
9279 ret = 0;
9280
9281 if (sta)
9282 goto exit;
9283
9284 arvif->tids_rst = 0;
9285 data.curr_vif = vif;
9286 data.ar = ar;
9287
9288 ieee80211_iterate_stations_atomic(hw, ath10k_mac_vif_stations_tid_conf,
9289 &data);
9290
9291 exit:
9292 mutex_unlock(&ar->conf_mutex);
9293 return ret;
9294 }
9295
ath10k_mac_op_reset_tid_config(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u8 tids)9296 static int ath10k_mac_op_reset_tid_config(struct ieee80211_hw *hw,
9297 struct ieee80211_vif *vif,
9298 struct ieee80211_sta *sta,
9299 u8 tids)
9300 {
9301 struct ath10k_vif *arvif = (void *)vif->drv_priv;
9302 struct ath10k_mac_iter_tid_conf_data data = {};
9303 struct ath10k *ar = hw->priv;
9304 int ret = 0;
9305
9306 mutex_lock(&ar->conf_mutex);
9307
9308 if (sta) {
9309 arvif->tids_rst = 0;
9310 ret = ath10k_mac_reset_tid_config(ar, sta, arvif, tids);
9311 goto exit;
9312 }
9313
9314 arvif->tids_rst = tids;
9315 data.curr_vif = vif;
9316 data.ar = ar;
9317 ieee80211_iterate_stations_atomic(hw, ath10k_mac_vif_stations_tid_conf,
9318 &data);
9319
9320 exit:
9321 mutex_unlock(&ar->conf_mutex);
9322 return ret;
9323 }
9324
9325 static const struct ieee80211_ops ath10k_ops = {
9326 .tx = ath10k_mac_op_tx,
9327 .wake_tx_queue = ath10k_mac_op_wake_tx_queue,
9328 .start = ath10k_start,
9329 .stop = ath10k_stop,
9330 .config = ath10k_config,
9331 .add_interface = ath10k_add_interface,
9332 .remove_interface = ath10k_remove_interface,
9333 .configure_filter = ath10k_configure_filter,
9334 .bss_info_changed = ath10k_bss_info_changed,
9335 .set_coverage_class = ath10k_mac_op_set_coverage_class,
9336 .hw_scan = ath10k_hw_scan,
9337 .cancel_hw_scan = ath10k_cancel_hw_scan,
9338 .set_key = ath10k_set_key,
9339 .set_default_unicast_key = ath10k_set_default_unicast_key,
9340 .sta_state = ath10k_sta_state,
9341 .sta_set_txpwr = ath10k_sta_set_txpwr,
9342 .conf_tx = ath10k_conf_tx,
9343 .remain_on_channel = ath10k_remain_on_channel,
9344 .cancel_remain_on_channel = ath10k_cancel_remain_on_channel,
9345 .set_rts_threshold = ath10k_set_rts_threshold,
9346 .set_frag_threshold = ath10k_mac_op_set_frag_threshold,
9347 .flush = ath10k_flush,
9348 .tx_last_beacon = ath10k_tx_last_beacon,
9349 .set_antenna = ath10k_set_antenna,
9350 .get_antenna = ath10k_get_antenna,
9351 .reconfig_complete = ath10k_reconfig_complete,
9352 .get_survey = ath10k_get_survey,
9353 .set_bitrate_mask = ath10k_mac_op_set_bitrate_mask,
9354 .sta_rc_update = ath10k_sta_rc_update,
9355 .offset_tsf = ath10k_offset_tsf,
9356 .ampdu_action = ath10k_ampdu_action,
9357 .get_et_sset_count = ath10k_debug_get_et_sset_count,
9358 .get_et_stats = ath10k_debug_get_et_stats,
9359 .get_et_strings = ath10k_debug_get_et_strings,
9360 .add_chanctx = ath10k_mac_op_add_chanctx,
9361 .remove_chanctx = ath10k_mac_op_remove_chanctx,
9362 .change_chanctx = ath10k_mac_op_change_chanctx,
9363 .assign_vif_chanctx = ath10k_mac_op_assign_vif_chanctx,
9364 .unassign_vif_chanctx = ath10k_mac_op_unassign_vif_chanctx,
9365 .switch_vif_chanctx = ath10k_mac_op_switch_vif_chanctx,
9366 .sta_pre_rcu_remove = ath10k_mac_op_sta_pre_rcu_remove,
9367 .sta_statistics = ath10k_sta_statistics,
9368 .set_tid_config = ath10k_mac_op_set_tid_config,
9369 .reset_tid_config = ath10k_mac_op_reset_tid_config,
9370
9371 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
9372
9373 #ifdef CONFIG_PM
9374 .suspend = ath10k_wow_op_suspend,
9375 .resume = ath10k_wow_op_resume,
9376 .set_wakeup = ath10k_wow_op_set_wakeup,
9377 #endif
9378 #ifdef CONFIG_MAC80211_DEBUGFS
9379 .sta_add_debugfs = ath10k_sta_add_debugfs,
9380 #endif
9381 .set_sar_specs = ath10k_mac_set_sar_specs,
9382 };
9383
9384 #define CHAN2G(_channel, _freq, _flags) { \
9385 .band = NL80211_BAND_2GHZ, \
9386 .hw_value = (_channel), \
9387 .center_freq = (_freq), \
9388 .flags = (_flags), \
9389 .max_antenna_gain = 0, \
9390 .max_power = 30, \
9391 }
9392
9393 #define CHAN5G(_channel, _freq, _flags) { \
9394 .band = NL80211_BAND_5GHZ, \
9395 .hw_value = (_channel), \
9396 .center_freq = (_freq), \
9397 .flags = (_flags), \
9398 .max_antenna_gain = 0, \
9399 .max_power = 30, \
9400 }
9401
9402 static const struct ieee80211_channel ath10k_2ghz_channels[] = {
9403 CHAN2G(1, 2412, 0),
9404 CHAN2G(2, 2417, 0),
9405 CHAN2G(3, 2422, 0),
9406 CHAN2G(4, 2427, 0),
9407 CHAN2G(5, 2432, 0),
9408 CHAN2G(6, 2437, 0),
9409 CHAN2G(7, 2442, 0),
9410 CHAN2G(8, 2447, 0),
9411 CHAN2G(9, 2452, 0),
9412 CHAN2G(10, 2457, 0),
9413 CHAN2G(11, 2462, 0),
9414 CHAN2G(12, 2467, 0),
9415 CHAN2G(13, 2472, 0),
9416 CHAN2G(14, 2484, 0),
9417 };
9418
9419 static const struct ieee80211_channel ath10k_5ghz_channels[] = {
9420 CHAN5G(36, 5180, 0),
9421 CHAN5G(40, 5200, 0),
9422 CHAN5G(44, 5220, 0),
9423 CHAN5G(48, 5240, 0),
9424 CHAN5G(52, 5260, 0),
9425 CHAN5G(56, 5280, 0),
9426 CHAN5G(60, 5300, 0),
9427 CHAN5G(64, 5320, 0),
9428 CHAN5G(100, 5500, 0),
9429 CHAN5G(104, 5520, 0),
9430 CHAN5G(108, 5540, 0),
9431 CHAN5G(112, 5560, 0),
9432 CHAN5G(116, 5580, 0),
9433 CHAN5G(120, 5600, 0),
9434 CHAN5G(124, 5620, 0),
9435 CHAN5G(128, 5640, 0),
9436 CHAN5G(132, 5660, 0),
9437 CHAN5G(136, 5680, 0),
9438 CHAN5G(140, 5700, 0),
9439 CHAN5G(144, 5720, 0),
9440 CHAN5G(149, 5745, 0),
9441 CHAN5G(153, 5765, 0),
9442 CHAN5G(157, 5785, 0),
9443 CHAN5G(161, 5805, 0),
9444 CHAN5G(165, 5825, 0),
9445 CHAN5G(169, 5845, 0),
9446 CHAN5G(173, 5865, 0),
9447 /* If you add more, you may need to change ATH10K_MAX_5G_CHAN */
9448 /* And you will definitely need to change ATH10K_NUM_CHANS in core.h */
9449 };
9450
ath10k_mac_create(size_t priv_size)9451 struct ath10k *ath10k_mac_create(size_t priv_size)
9452 {
9453 struct ieee80211_hw *hw;
9454 struct ieee80211_ops *ops;
9455 struct ath10k *ar;
9456
9457 ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL);
9458 if (!ops)
9459 return NULL;
9460
9461 hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops);
9462 if (!hw) {
9463 kfree(ops);
9464 return NULL;
9465 }
9466
9467 ar = hw->priv;
9468 ar->hw = hw;
9469 ar->ops = ops;
9470
9471 return ar;
9472 }
9473
ath10k_mac_destroy(struct ath10k * ar)9474 void ath10k_mac_destroy(struct ath10k *ar)
9475 {
9476 struct ieee80211_ops *ops = ar->ops;
9477
9478 ieee80211_free_hw(ar->hw);
9479 kfree(ops);
9480 }
9481
9482 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
9483 {
9484 .max = 8,
9485 .types = BIT(NL80211_IFTYPE_STATION)
9486 | BIT(NL80211_IFTYPE_P2P_CLIENT)
9487 },
9488 {
9489 .max = 3,
9490 .types = BIT(NL80211_IFTYPE_P2P_GO)
9491 },
9492 {
9493 .max = 1,
9494 .types = BIT(NL80211_IFTYPE_P2P_DEVICE)
9495 },
9496 {
9497 .max = 7,
9498 .types = BIT(NL80211_IFTYPE_AP)
9499 #ifdef CONFIG_MAC80211_MESH
9500 | BIT(NL80211_IFTYPE_MESH_POINT)
9501 #endif
9502 },
9503 };
9504
9505 static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
9506 {
9507 .max = 8,
9508 .types = BIT(NL80211_IFTYPE_AP)
9509 #ifdef CONFIG_MAC80211_MESH
9510 | BIT(NL80211_IFTYPE_MESH_POINT)
9511 #endif
9512 },
9513 {
9514 .max = 1,
9515 .types = BIT(NL80211_IFTYPE_STATION)
9516 },
9517 };
9518
9519 static const struct ieee80211_iface_combination ath10k_if_comb[] = {
9520 {
9521 .limits = ath10k_if_limits,
9522 .n_limits = ARRAY_SIZE(ath10k_if_limits),
9523 .max_interfaces = 8,
9524 .num_different_channels = 1,
9525 .beacon_int_infra_match = true,
9526 },
9527 };
9528
9529 static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
9530 {
9531 .limits = ath10k_10x_if_limits,
9532 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
9533 .max_interfaces = 8,
9534 .num_different_channels = 1,
9535 .beacon_int_infra_match = true,
9536 .beacon_int_min_gcd = 1,
9537 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
9538 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9539 BIT(NL80211_CHAN_WIDTH_20) |
9540 BIT(NL80211_CHAN_WIDTH_40) |
9541 BIT(NL80211_CHAN_WIDTH_80),
9542 #endif
9543 },
9544 };
9545
9546 static const struct ieee80211_iface_limit ath10k_tlv_if_limit[] = {
9547 {
9548 .max = 2,
9549 .types = BIT(NL80211_IFTYPE_STATION),
9550 },
9551 {
9552 .max = 2,
9553 .types = BIT(NL80211_IFTYPE_AP) |
9554 #ifdef CONFIG_MAC80211_MESH
9555 BIT(NL80211_IFTYPE_MESH_POINT) |
9556 #endif
9557 BIT(NL80211_IFTYPE_P2P_CLIENT) |
9558 BIT(NL80211_IFTYPE_P2P_GO),
9559 },
9560 {
9561 .max = 1,
9562 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
9563 },
9564 };
9565
9566 static const struct ieee80211_iface_limit ath10k_tlv_qcs_if_limit[] = {
9567 {
9568 .max = 2,
9569 .types = BIT(NL80211_IFTYPE_STATION),
9570 },
9571 {
9572 .max = 2,
9573 .types = BIT(NL80211_IFTYPE_P2P_CLIENT),
9574 },
9575 {
9576 .max = 1,
9577 .types = BIT(NL80211_IFTYPE_AP) |
9578 #ifdef CONFIG_MAC80211_MESH
9579 BIT(NL80211_IFTYPE_MESH_POINT) |
9580 #endif
9581 BIT(NL80211_IFTYPE_P2P_GO),
9582 },
9583 {
9584 .max = 1,
9585 .types = BIT(NL80211_IFTYPE_P2P_DEVICE),
9586 },
9587 };
9588
9589 static const struct ieee80211_iface_limit ath10k_tlv_if_limit_ibss[] = {
9590 {
9591 .max = 1,
9592 .types = BIT(NL80211_IFTYPE_STATION),
9593 },
9594 {
9595 .max = 1,
9596 .types = BIT(NL80211_IFTYPE_ADHOC),
9597 },
9598 };
9599
9600 /* FIXME: This is not thouroughly tested. These combinations may over- or
9601 * underestimate hw/fw capabilities.
9602 */
9603 static struct ieee80211_iface_combination ath10k_tlv_if_comb[] = {
9604 {
9605 .limits = ath10k_tlv_if_limit,
9606 .num_different_channels = 1,
9607 .max_interfaces = 4,
9608 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
9609 },
9610 {
9611 .limits = ath10k_tlv_if_limit_ibss,
9612 .num_different_channels = 1,
9613 .max_interfaces = 2,
9614 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
9615 },
9616 };
9617
9618 static struct ieee80211_iface_combination ath10k_tlv_qcs_if_comb[] = {
9619 {
9620 .limits = ath10k_tlv_if_limit,
9621 .num_different_channels = 1,
9622 .max_interfaces = 4,
9623 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit),
9624 },
9625 {
9626 .limits = ath10k_tlv_qcs_if_limit,
9627 .num_different_channels = 2,
9628 .max_interfaces = 4,
9629 .n_limits = ARRAY_SIZE(ath10k_tlv_qcs_if_limit),
9630 },
9631 {
9632 .limits = ath10k_tlv_if_limit_ibss,
9633 .num_different_channels = 1,
9634 .max_interfaces = 2,
9635 .n_limits = ARRAY_SIZE(ath10k_tlv_if_limit_ibss),
9636 },
9637 };
9638
9639 static const struct ieee80211_iface_limit ath10k_10_4_if_limits[] = {
9640 {
9641 .max = 1,
9642 .types = BIT(NL80211_IFTYPE_STATION),
9643 },
9644 {
9645 .max = 16,
9646 .types = BIT(NL80211_IFTYPE_AP)
9647 #ifdef CONFIG_MAC80211_MESH
9648 | BIT(NL80211_IFTYPE_MESH_POINT)
9649 #endif
9650 },
9651 };
9652
9653 static const struct ieee80211_iface_combination ath10k_10_4_if_comb[] = {
9654 {
9655 .limits = ath10k_10_4_if_limits,
9656 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
9657 .max_interfaces = 16,
9658 .num_different_channels = 1,
9659 .beacon_int_infra_match = true,
9660 .beacon_int_min_gcd = 1,
9661 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
9662 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9663 BIT(NL80211_CHAN_WIDTH_20) |
9664 BIT(NL80211_CHAN_WIDTH_40) |
9665 BIT(NL80211_CHAN_WIDTH_80) |
9666 BIT(NL80211_CHAN_WIDTH_80P80) |
9667 BIT(NL80211_CHAN_WIDTH_160),
9668 #endif
9669 },
9670 };
9671
9672 static const struct
9673 ieee80211_iface_combination ath10k_10_4_bcn_int_if_comb[] = {
9674 {
9675 .limits = ath10k_10_4_if_limits,
9676 .n_limits = ARRAY_SIZE(ath10k_10_4_if_limits),
9677 .max_interfaces = 16,
9678 .num_different_channels = 1,
9679 .beacon_int_infra_match = true,
9680 .beacon_int_min_gcd = 100,
9681 #ifdef CONFIG_ATH10K_DFS_CERTIFIED
9682 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9683 BIT(NL80211_CHAN_WIDTH_20) |
9684 BIT(NL80211_CHAN_WIDTH_40) |
9685 BIT(NL80211_CHAN_WIDTH_80) |
9686 BIT(NL80211_CHAN_WIDTH_80P80) |
9687 BIT(NL80211_CHAN_WIDTH_160),
9688 #endif
9689 },
9690 };
9691
ath10k_get_arvif_iter(void * data,u8 * mac,struct ieee80211_vif * vif)9692 static void ath10k_get_arvif_iter(void *data, u8 *mac,
9693 struct ieee80211_vif *vif)
9694 {
9695 struct ath10k_vif_iter *arvif_iter = data;
9696 struct ath10k_vif *arvif = (void *)vif->drv_priv;
9697
9698 if (arvif->vdev_id == arvif_iter->vdev_id)
9699 arvif_iter->arvif = arvif;
9700 }
9701
ath10k_get_arvif(struct ath10k * ar,u32 vdev_id)9702 struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
9703 {
9704 struct ath10k_vif_iter arvif_iter;
9705
9706 memset(&arvif_iter, 0, sizeof(struct ath10k_vif_iter));
9707 arvif_iter.vdev_id = vdev_id;
9708
9709 ieee80211_iterate_active_interfaces_atomic(ar->hw,
9710 ATH10K_ITER_RESUME_FLAGS,
9711 ath10k_get_arvif_iter,
9712 &arvif_iter);
9713 if (!arvif_iter.arvif) {
9714 ath10k_warn(ar, "No VIF found for vdev %d\n", vdev_id);
9715 return NULL;
9716 }
9717
9718 return arvif_iter.arvif;
9719 }
9720
9721 #define WRD_METHOD "WRDD"
9722 #define WRDD_WIFI (0x07)
9723
ath10k_mac_wrdd_get_mcc(struct ath10k * ar,union acpi_object * wrdd)9724 static u32 ath10k_mac_wrdd_get_mcc(struct ath10k *ar, union acpi_object *wrdd)
9725 {
9726 union acpi_object *mcc_pkg;
9727 union acpi_object *domain_type;
9728 union acpi_object *mcc_value;
9729 u32 i;
9730
9731 if (wrdd->type != ACPI_TYPE_PACKAGE ||
9732 wrdd->package.count < 2 ||
9733 wrdd->package.elements[0].type != ACPI_TYPE_INTEGER ||
9734 wrdd->package.elements[0].integer.value != 0) {
9735 ath10k_warn(ar, "ignoring malformed/unsupported wrdd structure\n");
9736 return 0;
9737 }
9738
9739 for (i = 1; i < wrdd->package.count; ++i) {
9740 mcc_pkg = &wrdd->package.elements[i];
9741
9742 if (mcc_pkg->type != ACPI_TYPE_PACKAGE)
9743 continue;
9744 if (mcc_pkg->package.count < 2)
9745 continue;
9746 if (mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
9747 mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
9748 continue;
9749
9750 domain_type = &mcc_pkg->package.elements[0];
9751 if (domain_type->integer.value != WRDD_WIFI)
9752 continue;
9753
9754 mcc_value = &mcc_pkg->package.elements[1];
9755 return mcc_value->integer.value;
9756 }
9757 return 0;
9758 }
9759
ath10k_mac_get_wrdd_regulatory(struct ath10k * ar,u16 * rd)9760 static int ath10k_mac_get_wrdd_regulatory(struct ath10k *ar, u16 *rd)
9761 {
9762 acpi_handle root_handle;
9763 acpi_handle handle;
9764 struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
9765 acpi_status status;
9766 u32 alpha2_code;
9767 char alpha2[3];
9768
9769 root_handle = ACPI_HANDLE(ar->dev);
9770 if (!root_handle)
9771 return -EOPNOTSUPP;
9772
9773 status = acpi_get_handle(root_handle, (acpi_string)WRD_METHOD, &handle);
9774 if (ACPI_FAILURE(status)) {
9775 ath10k_dbg(ar, ATH10K_DBG_BOOT,
9776 "failed to get wrd method %d\n", status);
9777 return -EIO;
9778 }
9779
9780 status = acpi_evaluate_object(handle, NULL, NULL, &wrdd);
9781 if (ACPI_FAILURE(status)) {
9782 ath10k_dbg(ar, ATH10K_DBG_BOOT,
9783 "failed to call wrdc %d\n", status);
9784 return -EIO;
9785 }
9786
9787 alpha2_code = ath10k_mac_wrdd_get_mcc(ar, wrdd.pointer);
9788 kfree(wrdd.pointer);
9789 if (!alpha2_code)
9790 return -EIO;
9791
9792 alpha2[0] = (alpha2_code >> 8) & 0xff;
9793 alpha2[1] = (alpha2_code >> 0) & 0xff;
9794 alpha2[2] = '\0';
9795
9796 ath10k_dbg(ar, ATH10K_DBG_BOOT,
9797 "regulatory hint from WRDD (alpha2-code): %s\n", alpha2);
9798
9799 *rd = ath_regd_find_country_by_name(alpha2);
9800 if (*rd == 0xffff)
9801 return -EIO;
9802
9803 *rd |= COUNTRY_ERD_FLAG;
9804 return 0;
9805 }
9806
ath10k_mac_init_rd(struct ath10k * ar)9807 static int ath10k_mac_init_rd(struct ath10k *ar)
9808 {
9809 int ret;
9810 u16 rd;
9811
9812 ret = ath10k_mac_get_wrdd_regulatory(ar, &rd);
9813 if (ret) {
9814 ath10k_dbg(ar, ATH10K_DBG_BOOT,
9815 "fallback to eeprom programmed regulatory settings\n");
9816 rd = ar->hw_eeprom_rd;
9817 }
9818
9819 ar->ath_common.regulatory.current_rd = rd;
9820 return 0;
9821 }
9822
ath10k_mac_register(struct ath10k * ar)9823 int ath10k_mac_register(struct ath10k *ar)
9824 {
9825 static const u32 cipher_suites[] = {
9826 WLAN_CIPHER_SUITE_WEP40,
9827 WLAN_CIPHER_SUITE_WEP104,
9828 WLAN_CIPHER_SUITE_TKIP,
9829 WLAN_CIPHER_SUITE_CCMP,
9830
9831 /* Do not add hardware supported ciphers before this line.
9832 * Allow software encryption for all chips. Don't forget to
9833 * update n_cipher_suites below.
9834 */
9835 WLAN_CIPHER_SUITE_AES_CMAC,
9836 WLAN_CIPHER_SUITE_BIP_CMAC_256,
9837 WLAN_CIPHER_SUITE_BIP_GMAC_128,
9838 WLAN_CIPHER_SUITE_BIP_GMAC_256,
9839
9840 /* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256
9841 * and CCMP-256 in hardware.
9842 */
9843 WLAN_CIPHER_SUITE_GCMP,
9844 WLAN_CIPHER_SUITE_GCMP_256,
9845 WLAN_CIPHER_SUITE_CCMP_256,
9846 };
9847 struct ieee80211_supported_band *band;
9848 void *channels;
9849 int ret;
9850
9851 if (!is_valid_ether_addr(ar->mac_addr)) {
9852 ath10k_warn(ar, "invalid MAC address; choosing random\n");
9853 eth_random_addr(ar->mac_addr);
9854 }
9855 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
9856
9857 SET_IEEE80211_DEV(ar->hw, ar->dev);
9858
9859 BUILD_BUG_ON((ARRAY_SIZE(ath10k_2ghz_channels) +
9860 ARRAY_SIZE(ath10k_5ghz_channels)) !=
9861 ATH10K_NUM_CHANS);
9862
9863 if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
9864 channels = kmemdup(ath10k_2ghz_channels,
9865 sizeof(ath10k_2ghz_channels),
9866 GFP_KERNEL);
9867 if (!channels) {
9868 ret = -ENOMEM;
9869 goto err_free;
9870 }
9871
9872 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9873 band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
9874 band->channels = channels;
9875
9876 if (ar->hw_params.cck_rate_map_rev2) {
9877 band->n_bitrates = ath10k_g_rates_rev2_size;
9878 band->bitrates = ath10k_g_rates_rev2;
9879 } else {
9880 band->n_bitrates = ath10k_g_rates_size;
9881 band->bitrates = ath10k_g_rates;
9882 }
9883
9884 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9885 }
9886
9887 if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) {
9888 channels = kmemdup(ath10k_5ghz_channels,
9889 sizeof(ath10k_5ghz_channels),
9890 GFP_KERNEL);
9891 if (!channels) {
9892 ret = -ENOMEM;
9893 goto err_free;
9894 }
9895
9896 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9897 band->n_channels = ARRAY_SIZE(ath10k_5ghz_channels);
9898 band->channels = channels;
9899 band->n_bitrates = ath10k_a_rates_size;
9900 band->bitrates = ath10k_a_rates;
9901 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9902 }
9903
9904 wiphy_read_of_freq_limits(ar->hw->wiphy);
9905 ath10k_mac_setup_ht_vht_cap(ar);
9906
9907 ar->hw->wiphy->interface_modes =
9908 BIT(NL80211_IFTYPE_STATION) |
9909 BIT(NL80211_IFTYPE_AP) |
9910 BIT(NL80211_IFTYPE_MESH_POINT);
9911
9912 ar->hw->wiphy->available_antennas_rx = ar->cfg_rx_chainmask;
9913 ar->hw->wiphy->available_antennas_tx = ar->cfg_tx_chainmask;
9914
9915 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->normal_mode_fw.fw_file.fw_features))
9916 ar->hw->wiphy->interface_modes |=
9917 BIT(NL80211_IFTYPE_P2P_DEVICE) |
9918 BIT(NL80211_IFTYPE_P2P_CLIENT) |
9919 BIT(NL80211_IFTYPE_P2P_GO);
9920
9921 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
9922
9923 if (!test_bit(ATH10K_FW_FEATURE_NO_PS,
9924 ar->running_fw->fw_file.fw_features)) {
9925 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
9926 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
9927 }
9928
9929 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
9930 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
9931 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
9932 ieee80211_hw_set(ar->hw, AP_LINK_PS);
9933 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
9934 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
9935 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
9936 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
9937 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
9938 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
9939 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
9940 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
9941 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
9942
9943 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
9944 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
9945
9946 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
9947 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
9948
9949 if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
9950 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
9951
9952 if (ar->ht_cap_info & WMI_HT_CAP_ENABLED) {
9953 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
9954 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
9955 }
9956
9957 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
9958 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
9959
9960 if (test_bit(WMI_SERVICE_NLO, ar->wmi.svc_map)) {
9961 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
9962 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
9963 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
9964 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
9965 ar->hw->wiphy->max_sched_scan_plan_interval =
9966 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
9967 ar->hw->wiphy->max_sched_scan_plan_iterations =
9968 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
9969 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
9970 }
9971
9972 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
9973 ar->hw->sta_data_size = sizeof(struct ath10k_sta);
9974 ar->hw->txq_data_size = sizeof(struct ath10k_txq);
9975
9976 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
9977
9978 if (test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)) {
9979 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
9980
9981 /* Firmware delivers WPS/P2P Probe Requests frames to driver so
9982 * that userspace (e.g. wpa_supplicant/hostapd) can generate
9983 * correct Probe Responses. This is more of a hack advert..
9984 */
9985 ar->hw->wiphy->probe_resp_offload |=
9986 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
9987 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
9988 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
9989 }
9990
9991 if (test_bit(WMI_SERVICE_TDLS, ar->wmi.svc_map) ||
9992 test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map)) {
9993 ar->hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
9994 if (test_bit(WMI_SERVICE_TDLS_WIDER_BANDWIDTH, ar->wmi.svc_map))
9995 ieee80211_hw_set(ar->hw, TDLS_WIDER_BW);
9996 }
9997
9998 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
9999 ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
10000
10001 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
10002 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
10003 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
10004
10005 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
10006 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
10007 NL80211_FEATURE_AP_SCAN;
10008
10009 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
10010
10011 ret = ath10k_wow_init(ar);
10012 if (ret) {
10013 ath10k_warn(ar, "failed to init wow: %d\n", ret);
10014 goto err_free;
10015 }
10016
10017 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
10018 wiphy_ext_feature_set(ar->hw->wiphy,
10019 NL80211_EXT_FEATURE_SET_SCAN_DWELL);
10020 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_AQL);
10021
10022 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map) ||
10023 test_bit(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, ar->wmi.svc_map))
10024 wiphy_ext_feature_set(ar->hw->wiphy,
10025 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
10026
10027 if (ath10k_peer_stats_enabled(ar) ||
10028 test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
10029 wiphy_ext_feature_set(ar->hw->wiphy,
10030 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
10031
10032 if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map))
10033 wiphy_ext_feature_set(ar->hw->wiphy,
10034 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
10035
10036 if (test_bit(WMI_SERVICE_TX_PWR_PER_PEER, ar->wmi.svc_map))
10037 wiphy_ext_feature_set(ar->hw->wiphy,
10038 NL80211_EXT_FEATURE_STA_TX_PWR);
10039
10040 if (test_bit(WMI_SERVICE_PEER_TID_CONFIGS_SUPPORT, ar->wmi.svc_map)) {
10041 ar->hw->wiphy->tid_config_support.vif |=
10042 BIT(NL80211_TID_CONFIG_ATTR_NOACK) |
10043 BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT) |
10044 BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG) |
10045 BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL) |
10046 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE) |
10047 BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE);
10048
10049 if (test_bit(WMI_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
10050 ar->wmi.svc_map)) {
10051 ar->hw->wiphy->tid_config_support.vif |=
10052 BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL);
10053 }
10054
10055 ar->hw->wiphy->tid_config_support.peer =
10056 ar->hw->wiphy->tid_config_support.vif;
10057 ar->hw->wiphy->max_data_retry_count = ATH10K_MAX_RETRY_COUNT;
10058 } else {
10059 ar->ops->set_tid_config = NULL;
10060 }
10061 /*
10062 * on LL hardware queues are managed entirely by the FW
10063 * so we only advertise to mac we can do the queues thing
10064 */
10065 ar->hw->queues = IEEE80211_MAX_QUEUES;
10066
10067 /* vdev_ids are used as hw queue numbers. Make sure offchan tx queue is
10068 * something that vdev_ids can't reach so that we don't stop the queue
10069 * accidentally.
10070 */
10071 ar->hw->offchannel_tx_hw_queue = IEEE80211_MAX_QUEUES - 1;
10072
10073 switch (ar->running_fw->fw_file.wmi_op_version) {
10074 case ATH10K_FW_WMI_OP_VERSION_MAIN:
10075 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
10076 ar->hw->wiphy->n_iface_combinations =
10077 ARRAY_SIZE(ath10k_if_comb);
10078 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
10079 break;
10080 case ATH10K_FW_WMI_OP_VERSION_TLV:
10081 if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) {
10082 ar->hw->wiphy->iface_combinations =
10083 ath10k_tlv_qcs_if_comb;
10084 ar->hw->wiphy->n_iface_combinations =
10085 ARRAY_SIZE(ath10k_tlv_qcs_if_comb);
10086 } else {
10087 ar->hw->wiphy->iface_combinations = ath10k_tlv_if_comb;
10088 ar->hw->wiphy->n_iface_combinations =
10089 ARRAY_SIZE(ath10k_tlv_if_comb);
10090 }
10091 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
10092 break;
10093 case ATH10K_FW_WMI_OP_VERSION_10_1:
10094 case ATH10K_FW_WMI_OP_VERSION_10_2:
10095 case ATH10K_FW_WMI_OP_VERSION_10_2_4:
10096 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
10097 ar->hw->wiphy->n_iface_combinations =
10098 ARRAY_SIZE(ath10k_10x_if_comb);
10099 break;
10100 case ATH10K_FW_WMI_OP_VERSION_10_4:
10101 ar->hw->wiphy->iface_combinations = ath10k_10_4_if_comb;
10102 ar->hw->wiphy->n_iface_combinations =
10103 ARRAY_SIZE(ath10k_10_4_if_comb);
10104 if (test_bit(WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT,
10105 ar->wmi.svc_map)) {
10106 ar->hw->wiphy->iface_combinations =
10107 ath10k_10_4_bcn_int_if_comb;
10108 ar->hw->wiphy->n_iface_combinations =
10109 ARRAY_SIZE(ath10k_10_4_bcn_int_if_comb);
10110 }
10111 break;
10112 case ATH10K_FW_WMI_OP_VERSION_UNSET:
10113 case ATH10K_FW_WMI_OP_VERSION_MAX:
10114 WARN_ON(1);
10115 ret = -EINVAL;
10116 goto err_free;
10117 }
10118
10119 if (ar->hw_params.dynamic_sar_support)
10120 ar->hw->wiphy->sar_capa = &ath10k_sar_capa;
10121
10122 if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
10123 ar->hw->netdev_features = NETIF_F_HW_CSUM;
10124
10125 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
10126 /* Init ath dfs pattern detector */
10127 ar->ath_common.debug_mask = ATH_DBG_DFS;
10128 ar->dfs_detector = dfs_pattern_detector_init(&ar->ath_common,
10129 NL80211_DFS_UNSET);
10130
10131 if (!ar->dfs_detector)
10132 ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
10133 }
10134
10135 ret = ath10k_mac_init_rd(ar);
10136 if (ret) {
10137 ath10k_err(ar, "failed to derive regdom: %d\n", ret);
10138 goto err_dfs_detector_exit;
10139 }
10140
10141 /* Disable set_coverage_class for chipsets that do not support it. */
10142 if (!ar->hw_params.hw_ops->set_coverage_class)
10143 ar->ops->set_coverage_class = NULL;
10144
10145 ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
10146 ath10k_reg_notifier);
10147 if (ret) {
10148 ath10k_err(ar, "failed to initialise regulatory: %i\n", ret);
10149 goto err_dfs_detector_exit;
10150 }
10151
10152 if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) {
10153 ar->hw->wiphy->features |=
10154 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
10155 }
10156
10157 ar->hw->wiphy->cipher_suites = cipher_suites;
10158
10159 /* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
10160 * and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
10161 * from chip specific hw_param table.
10162 */
10163 if (!ar->hw_params.n_cipher_suites ||
10164 ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) {
10165 ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n",
10166 ar->hw_params.n_cipher_suites);
10167 ar->hw_params.n_cipher_suites = 8;
10168 }
10169 ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites;
10170
10171 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
10172
10173 ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
10174
10175 ret = ieee80211_register_hw(ar->hw);
10176 if (ret) {
10177 ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
10178 goto err_dfs_detector_exit;
10179 }
10180
10181 if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) {
10182 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN);
10183 ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN);
10184 }
10185
10186 if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
10187 ret = regulatory_hint(ar->hw->wiphy,
10188 ar->ath_common.regulatory.alpha2);
10189 if (ret)
10190 goto err_unregister;
10191 }
10192
10193 return 0;
10194
10195 err_unregister:
10196 ieee80211_unregister_hw(ar->hw);
10197
10198 err_dfs_detector_exit:
10199 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
10200 ar->dfs_detector->exit(ar->dfs_detector);
10201
10202 err_free:
10203 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10204 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10205
10206 SET_IEEE80211_DEV(ar->hw, NULL);
10207 return ret;
10208 }
10209
ath10k_mac_unregister(struct ath10k * ar)10210 void ath10k_mac_unregister(struct ath10k *ar)
10211 {
10212 ieee80211_unregister_hw(ar->hw);
10213
10214 if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED) && ar->dfs_detector)
10215 ar->dfs_detector->exit(ar->dfs_detector);
10216
10217 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10218 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10219
10220 SET_IEEE80211_DEV(ar->hw, NULL);
10221 }
10222