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