drm/rockchip: Don't change hdmi reference clock rate
[drm/drm-misc.git] / drivers / net / wireless / ath / ath11k / mac.c
blobe6acbff067496a22abb6b6d4808515d3c5d6da4e
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5 */
7 #include <net/mac80211.h>
8 #include <net/cfg80211.h>
9 #include <linux/etherdevice.h>
10 #include <linux/bitfield.h>
11 #include <linux/inetdevice.h>
12 #include <net/if_inet6.h>
13 #include <net/ipv6.h>
15 #include "mac.h"
16 #include "core.h"
17 #include "debug.h"
18 #include "wmi.h"
19 #include "hw.h"
20 #include "dp_tx.h"
21 #include "dp_rx.h"
22 #include "testmode.h"
23 #include "peer.h"
24 #include "debugfs_sta.h"
25 #include "hif.h"
26 #include "wow.h"
28 #define CHAN2G(_channel, _freq, _flags) { \
29 .band = NL80211_BAND_2GHZ, \
30 .hw_value = (_channel), \
31 .center_freq = (_freq), \
32 .flags = (_flags), \
33 .max_antenna_gain = 0, \
34 .max_power = 30, \
37 #define CHAN5G(_channel, _freq, _flags) { \
38 .band = NL80211_BAND_5GHZ, \
39 .hw_value = (_channel), \
40 .center_freq = (_freq), \
41 .flags = (_flags), \
42 .max_antenna_gain = 0, \
43 .max_power = 30, \
46 #define CHAN6G(_channel, _freq, _flags) { \
47 .band = NL80211_BAND_6GHZ, \
48 .hw_value = (_channel), \
49 .center_freq = (_freq), \
50 .flags = (_flags), \
51 .max_antenna_gain = 0, \
52 .max_power = 30, \
55 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
56 CHAN2G(1, 2412, 0),
57 CHAN2G(2, 2417, 0),
58 CHAN2G(3, 2422, 0),
59 CHAN2G(4, 2427, 0),
60 CHAN2G(5, 2432, 0),
61 CHAN2G(6, 2437, 0),
62 CHAN2G(7, 2442, 0),
63 CHAN2G(8, 2447, 0),
64 CHAN2G(9, 2452, 0),
65 CHAN2G(10, 2457, 0),
66 CHAN2G(11, 2462, 0),
67 CHAN2G(12, 2467, 0),
68 CHAN2G(13, 2472, 0),
69 CHAN2G(14, 2484, 0),
72 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
73 CHAN5G(36, 5180, 0),
74 CHAN5G(40, 5200, 0),
75 CHAN5G(44, 5220, 0),
76 CHAN5G(48, 5240, 0),
77 CHAN5G(52, 5260, 0),
78 CHAN5G(56, 5280, 0),
79 CHAN5G(60, 5300, 0),
80 CHAN5G(64, 5320, 0),
81 CHAN5G(100, 5500, 0),
82 CHAN5G(104, 5520, 0),
83 CHAN5G(108, 5540, 0),
84 CHAN5G(112, 5560, 0),
85 CHAN5G(116, 5580, 0),
86 CHAN5G(120, 5600, 0),
87 CHAN5G(124, 5620, 0),
88 CHAN5G(128, 5640, 0),
89 CHAN5G(132, 5660, 0),
90 CHAN5G(136, 5680, 0),
91 CHAN5G(140, 5700, 0),
92 CHAN5G(144, 5720, 0),
93 CHAN5G(149, 5745, 0),
94 CHAN5G(153, 5765, 0),
95 CHAN5G(157, 5785, 0),
96 CHAN5G(161, 5805, 0),
97 CHAN5G(165, 5825, 0),
98 CHAN5G(169, 5845, 0),
99 CHAN5G(173, 5865, 0),
100 CHAN5G(177, 5885, 0),
103 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
104 CHAN6G(1, 5955, 0),
105 CHAN6G(5, 5975, 0),
106 CHAN6G(9, 5995, 0),
107 CHAN6G(13, 6015, 0),
108 CHAN6G(17, 6035, 0),
109 CHAN6G(21, 6055, 0),
110 CHAN6G(25, 6075, 0),
111 CHAN6G(29, 6095, 0),
112 CHAN6G(33, 6115, 0),
113 CHAN6G(37, 6135, 0),
114 CHAN6G(41, 6155, 0),
115 CHAN6G(45, 6175, 0),
116 CHAN6G(49, 6195, 0),
117 CHAN6G(53, 6215, 0),
118 CHAN6G(57, 6235, 0),
119 CHAN6G(61, 6255, 0),
120 CHAN6G(65, 6275, 0),
121 CHAN6G(69, 6295, 0),
122 CHAN6G(73, 6315, 0),
123 CHAN6G(77, 6335, 0),
124 CHAN6G(81, 6355, 0),
125 CHAN6G(85, 6375, 0),
126 CHAN6G(89, 6395, 0),
127 CHAN6G(93, 6415, 0),
128 CHAN6G(97, 6435, 0),
129 CHAN6G(101, 6455, 0),
130 CHAN6G(105, 6475, 0),
131 CHAN6G(109, 6495, 0),
132 CHAN6G(113, 6515, 0),
133 CHAN6G(117, 6535, 0),
134 CHAN6G(121, 6555, 0),
135 CHAN6G(125, 6575, 0),
136 CHAN6G(129, 6595, 0),
137 CHAN6G(133, 6615, 0),
138 CHAN6G(137, 6635, 0),
139 CHAN6G(141, 6655, 0),
140 CHAN6G(145, 6675, 0),
141 CHAN6G(149, 6695, 0),
142 CHAN6G(153, 6715, 0),
143 CHAN6G(157, 6735, 0),
144 CHAN6G(161, 6755, 0),
145 CHAN6G(165, 6775, 0),
146 CHAN6G(169, 6795, 0),
147 CHAN6G(173, 6815, 0),
148 CHAN6G(177, 6835, 0),
149 CHAN6G(181, 6855, 0),
150 CHAN6G(185, 6875, 0),
151 CHAN6G(189, 6895, 0),
152 CHAN6G(193, 6915, 0),
153 CHAN6G(197, 6935, 0),
154 CHAN6G(201, 6955, 0),
155 CHAN6G(205, 6975, 0),
156 CHAN6G(209, 6995, 0),
157 CHAN6G(213, 7015, 0),
158 CHAN6G(217, 7035, 0),
159 CHAN6G(221, 7055, 0),
160 CHAN6G(225, 7075, 0),
161 CHAN6G(229, 7095, 0),
162 CHAN6G(233, 7115, 0),
164 /* new addition in IEEE Std 802.11ax-2021 */
165 CHAN6G(2, 5935, 0),
168 static struct ieee80211_rate ath11k_legacy_rates[] = {
169 { .bitrate = 10,
170 .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
171 { .bitrate = 20,
172 .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
173 .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
174 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
175 { .bitrate = 55,
176 .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
177 .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
178 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
179 { .bitrate = 110,
180 .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
181 .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
182 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
184 { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
185 { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
186 { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
187 { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
188 { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
189 { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
190 { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
191 { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
194 static const int
195 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
196 [NL80211_BAND_2GHZ] = {
197 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
198 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
199 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
200 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
201 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
202 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
203 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
204 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
206 [NL80211_BAND_5GHZ] = {
207 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
208 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
209 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
210 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
211 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
212 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
213 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
214 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
216 [NL80211_BAND_6GHZ] = {
217 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
218 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
219 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
220 [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
221 [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
222 [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
223 [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
224 [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
229 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
230 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
232 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
233 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
234 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
235 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
236 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
237 HTT_RX_FP_CTRL_FILTER_FLASG3
240 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
241 #define ath11k_g_rates ath11k_legacy_rates
242 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
243 #define ath11k_a_rates (ath11k_legacy_rates + 4)
244 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
246 #define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */
248 /* Overhead due to the processing of channel switch events from FW */
249 #define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */
251 static const u32 ath11k_smps_map[] = {
252 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
253 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
254 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
255 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
258 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
260 enum nl80211_he_ru_alloc ret;
262 switch (ru_phy) {
263 case RU_26:
264 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
265 break;
266 case RU_52:
267 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
268 break;
269 case RU_106:
270 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
271 break;
272 case RU_242:
273 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
274 break;
275 case RU_484:
276 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
277 break;
278 case RU_996:
279 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
280 break;
281 default:
282 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
283 break;
286 return ret;
289 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
291 enum nl80211_he_ru_alloc ret;
293 switch (ru_tones) {
294 case 26:
295 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
296 break;
297 case 52:
298 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
299 break;
300 case 106:
301 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
302 break;
303 case 242:
304 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
305 break;
306 case 484:
307 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
308 break;
309 case 996:
310 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
311 break;
312 case (996 * 2):
313 ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
314 break;
315 default:
316 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
317 break;
320 return ret;
323 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
325 enum nl80211_he_gi ret;
327 switch (sgi) {
328 case RX_MSDU_START_SGI_0_8_US:
329 ret = NL80211_RATE_INFO_HE_GI_0_8;
330 break;
331 case RX_MSDU_START_SGI_1_6_US:
332 ret = NL80211_RATE_INFO_HE_GI_1_6;
333 break;
334 case RX_MSDU_START_SGI_3_2_US:
335 ret = NL80211_RATE_INFO_HE_GI_3_2;
336 break;
337 default:
338 ret = NL80211_RATE_INFO_HE_GI_0_8;
339 break;
342 return ret;
345 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
347 u8 ret = 0;
349 switch (bw) {
350 case ATH11K_BW_20:
351 ret = RATE_INFO_BW_20;
352 break;
353 case ATH11K_BW_40:
354 ret = RATE_INFO_BW_40;
355 break;
356 case ATH11K_BW_80:
357 ret = RATE_INFO_BW_80;
358 break;
359 case ATH11K_BW_160:
360 ret = RATE_INFO_BW_160;
361 break;
364 return ret;
367 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
369 switch (bw) {
370 case RATE_INFO_BW_20:
371 return ATH11K_BW_20;
372 case RATE_INFO_BW_40:
373 return ATH11K_BW_40;
374 case RATE_INFO_BW_80:
375 return ATH11K_BW_80;
376 case RATE_INFO_BW_160:
377 return ATH11K_BW_160;
378 default:
379 return ATH11K_BW_20;
383 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
384 u16 *rate)
386 /* As default, it is OFDM rates */
387 int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
388 int max_rates_idx = ath11k_g_rates_size;
390 if (preamble == WMI_RATE_PREAMBLE_CCK) {
391 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
392 i = 0;
393 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
396 while (i < max_rates_idx) {
397 if (hw_rc == ath11k_legacy_rates[i].hw_value) {
398 *rateidx = i;
399 *rate = ath11k_legacy_rates[i].bitrate;
400 return 0;
402 i++;
405 return -EINVAL;
408 static int get_num_chains(u32 mask)
410 int num_chains = 0;
412 while (mask) {
413 if (mask & BIT(0))
414 num_chains++;
415 mask >>= 1;
418 return num_chains;
421 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
422 u32 bitrate)
424 int i;
426 for (i = 0; i < sband->n_bitrates; i++)
427 if (sband->bitrates[i].bitrate == bitrate)
428 return i;
430 return 0;
433 static u32
434 ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask)
436 int nss;
438 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
439 if (ht_mcs_mask[nss])
440 return nss + 1;
442 return 1;
445 static u32
446 ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask)
448 int nss;
450 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
451 if (vht_mcs_mask[nss])
452 return nss + 1;
454 return 1;
457 static u32
458 ath11k_mac_max_he_nss(const u16 *he_mcs_mask)
460 int nss;
462 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
463 if (he_mcs_mask[nss])
464 return nss + 1;
466 return 1;
469 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
471 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
472 * 0 for no restriction
473 * 1 for 1/4 us
474 * 2 for 1/2 us
475 * 3 for 1 us
476 * 4 for 2 us
477 * 5 for 4 us
478 * 6 for 8 us
479 * 7 for 16 us
481 switch (mpdudensity) {
482 case 0:
483 return 0;
484 case 1:
485 case 2:
486 case 3:
487 /* Our lower layer calculations limit our precision to
488 * 1 microsecond
490 return 1;
491 case 4:
492 return 2;
493 case 5:
494 return 4;
495 case 6:
496 return 8;
497 case 7:
498 return 16;
499 default:
500 return 0;
504 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
505 struct cfg80211_chan_def *def)
507 struct ieee80211_chanctx_conf *conf;
509 rcu_read_lock();
510 conf = rcu_dereference(vif->bss_conf.chanctx_conf);
511 if (!conf) {
512 rcu_read_unlock();
513 return -ENOENT;
516 *def = conf->def;
517 rcu_read_unlock();
519 return 0;
522 static bool ath11k_mac_bitrate_is_cck(int bitrate)
524 switch (bitrate) {
525 case 10:
526 case 20:
527 case 55:
528 case 110:
529 return true;
532 return false;
535 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
536 u8 hw_rate, bool cck)
538 const struct ieee80211_rate *rate;
539 int i;
541 for (i = 0; i < sband->n_bitrates; i++) {
542 rate = &sband->bitrates[i];
544 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
545 continue;
547 if (rate->hw_value == hw_rate)
548 return i;
549 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
550 rate->hw_value_short == hw_rate)
551 return i;
554 return 0;
557 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
559 return DIV_ROUND_UP(bitrate, 5) |
560 (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
563 static void ath11k_get_arvif_iter(void *data, u8 *mac,
564 struct ieee80211_vif *vif)
566 struct ath11k_vif_iter *arvif_iter = data;
567 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
569 if (arvif->vdev_id == arvif_iter->vdev_id)
570 arvif_iter->arvif = arvif;
573 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
575 struct ath11k_vif_iter arvif_iter;
576 u32 flags;
578 memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
579 arvif_iter.vdev_id = vdev_id;
581 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
582 ieee80211_iterate_active_interfaces_atomic(ar->hw,
583 flags,
584 ath11k_get_arvif_iter,
585 &arvif_iter);
586 if (!arvif_iter.arvif) {
587 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
588 return NULL;
591 return arvif_iter.arvif;
594 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
595 u32 vdev_id)
597 int i;
598 struct ath11k_pdev *pdev;
599 struct ath11k_vif *arvif;
601 for (i = 0; i < ab->num_radios; i++) {
602 pdev = rcu_dereference(ab->pdevs_active[i]);
603 if (pdev && pdev->ar &&
604 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
605 arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
606 if (arvif)
607 return arvif;
611 return NULL;
614 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
616 int i;
617 struct ath11k_pdev *pdev;
619 for (i = 0; i < ab->num_radios; i++) {
620 pdev = rcu_dereference(ab->pdevs_active[i]);
621 if (pdev && pdev->ar) {
622 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
623 return pdev->ar;
627 return NULL;
630 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
632 int i;
633 struct ath11k_pdev *pdev;
635 if (ab->hw_params.single_pdev_only) {
636 pdev = rcu_dereference(ab->pdevs_active[0]);
637 return pdev ? pdev->ar : NULL;
640 if (WARN_ON(pdev_id > ab->num_radios))
641 return NULL;
643 for (i = 0; i < ab->num_radios; i++) {
644 if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM)
645 pdev = &ab->pdevs[i];
646 else
647 pdev = rcu_dereference(ab->pdevs_active[i]);
649 if (pdev && pdev->pdev_id == pdev_id)
650 return (pdev->ar ? pdev->ar : NULL);
653 return NULL;
656 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
658 struct ath11k *ar;
659 struct ath11k_pdev *pdev;
660 struct ath11k_vif *arvif;
661 int i;
663 for (i = 0; i < ab->num_radios; i++) {
664 pdev = &ab->pdevs[i];
665 ar = pdev->ar;
666 list_for_each_entry(arvif, &ar->arvifs, list) {
667 if (arvif->is_up)
668 return arvif;
672 return NULL;
675 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
677 return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
678 (((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
679 (band2 & WMI_HOST_WLAN_5G_CAP)));
682 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
684 struct ath11k *ar = arvif->ar;
685 struct ath11k_base *ab = ar->ab;
686 struct ieee80211_vif *vif = arvif->vif;
687 struct cfg80211_chan_def def;
688 enum nl80211_band band;
689 u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
690 int i;
692 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
693 return pdev_id;
695 band = def.chan->band;
697 for (i = 0; i < ab->target_pdev_count; i++) {
698 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
699 return ab->target_pdev_ids[i].pdev_id;
702 return pdev_id;
705 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
707 struct ath11k_vif *arvif;
709 arvif = ath11k_mac_get_vif_up(ar->ab);
711 if (arvif)
712 return ath11k_mac_get_target_pdev_id_from_vif(arvif);
713 else
714 return ar->ab->target_pdev_ids[0].pdev_id;
717 static void ath11k_pdev_caps_update(struct ath11k *ar)
719 struct ath11k_base *ab = ar->ab;
721 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
723 /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
724 * But since the received value in svcrdy is same as hw_max_tx_power,
725 * we can set ar->min_tx_power to 0 currently until
726 * this is fixed in firmware
728 ar->min_tx_power = 0;
730 ar->txpower_limit_2g = ar->max_tx_power;
731 ar->txpower_limit_5g = ar->max_tx_power;
732 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
735 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
737 struct ath11k_pdev *pdev = ar->pdev;
738 struct ath11k_vif *arvif;
739 int ret, txpower = -1;
740 u32 param;
742 lockdep_assert_held(&ar->conf_mutex);
744 list_for_each_entry(arvif, &ar->arvifs, list) {
745 if (arvif->txpower <= 0)
746 continue;
748 if (txpower == -1)
749 txpower = arvif->txpower;
750 else
751 txpower = min(txpower, arvif->txpower);
754 if (txpower == -1)
755 return 0;
757 /* txpwr is set as 2 units per dBm in FW*/
758 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
759 ar->max_tx_power) * 2;
761 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
762 txpower / 2);
764 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
765 ar->txpower_limit_2g != txpower) {
766 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
767 ret = ath11k_wmi_pdev_set_param(ar, param,
768 txpower, ar->pdev->pdev_id);
769 if (ret)
770 goto fail;
771 ar->txpower_limit_2g = txpower;
774 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
775 ar->txpower_limit_5g != txpower) {
776 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
777 ret = ath11k_wmi_pdev_set_param(ar, param,
778 txpower, ar->pdev->pdev_id);
779 if (ret)
780 goto fail;
781 ar->txpower_limit_5g = txpower;
784 return 0;
786 fail:
787 ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
788 txpower / 2, param, ret);
789 return ret;
792 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
794 struct ath11k *ar = arvif->ar;
795 u32 vdev_param, rts_cts = 0;
796 int ret;
798 lockdep_assert_held(&ar->conf_mutex);
800 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
802 /* Enable RTS/CTS protection for sw retries (when legacy stations
803 * are in BSS) or by default only for second rate series.
804 * TODO: Check if we need to enable CTS 2 Self in any case
806 rts_cts = WMI_USE_RTS_CTS;
808 if (arvif->num_legacy_stations > 0)
809 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
810 else
811 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
813 /* Need not send duplicate param value to firmware */
814 if (arvif->rtscts_prot_mode == rts_cts)
815 return 0;
817 arvif->rtscts_prot_mode = rts_cts;
819 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n",
820 arvif->vdev_id, rts_cts);
822 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
823 vdev_param, rts_cts);
824 if (ret)
825 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
826 arvif->vdev_id, ret);
828 return ret;
831 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
833 struct ath11k *ar = arvif->ar;
834 u32 param;
835 int ret;
837 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
838 ATH11K_KICKOUT_THRESHOLD,
839 ar->pdev->pdev_id);
840 if (ret) {
841 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
842 arvif->vdev_id, ret);
843 return ret;
846 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
847 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
848 ATH11K_KEEPALIVE_MIN_IDLE);
849 if (ret) {
850 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
851 arvif->vdev_id, ret);
852 return ret;
855 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
856 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
857 ATH11K_KEEPALIVE_MAX_IDLE);
858 if (ret) {
859 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
860 arvif->vdev_id, ret);
861 return ret;
864 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
865 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
866 ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
867 if (ret) {
868 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
869 arvif->vdev_id, ret);
870 return ret;
873 return 0;
876 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
878 struct ath11k_peer *peer, *tmp;
879 struct ath11k_base *ab = ar->ab;
881 lockdep_assert_held(&ar->conf_mutex);
883 mutex_lock(&ab->tbl_mtx_lock);
884 spin_lock_bh(&ab->base_lock);
885 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
886 ath11k_peer_rx_tid_cleanup(ar, peer);
887 ath11k_peer_rhash_delete(ab, peer);
888 list_del(&peer->list);
889 kfree(peer);
891 spin_unlock_bh(&ab->base_lock);
892 mutex_unlock(&ab->tbl_mtx_lock);
894 ar->num_peers = 0;
895 ar->num_stations = 0;
898 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
900 lockdep_assert_held(&ar->conf_mutex);
902 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
903 return -ESHUTDOWN;
905 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
906 ATH11K_VDEV_SETUP_TIMEOUT_HZ))
907 return -ETIMEDOUT;
909 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
912 static void
913 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
914 struct ieee80211_chanctx_conf *conf,
915 void *data)
917 struct cfg80211_chan_def **def = data;
919 *def = &conf->def;
922 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
923 struct cfg80211_chan_def *chandef)
925 struct ieee80211_channel *channel;
926 struct wmi_vdev_start_req_arg arg = {};
927 int ret;
929 lockdep_assert_held(&ar->conf_mutex);
931 channel = chandef->chan;
933 arg.vdev_id = vdev_id;
934 arg.channel.freq = channel->center_freq;
935 arg.channel.band_center_freq1 = chandef->center_freq1;
936 arg.channel.band_center_freq2 = chandef->center_freq2;
938 arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
939 arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
941 arg.channel.min_power = 0;
942 arg.channel.max_power = channel->max_power;
943 arg.channel.max_reg_power = channel->max_reg_power;
944 arg.channel.max_antenna_gain = channel->max_antenna_gain;
946 arg.pref_tx_streams = ar->num_tx_chains;
947 arg.pref_rx_streams = ar->num_rx_chains;
949 arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
951 reinit_completion(&ar->vdev_setup_done);
952 reinit_completion(&ar->vdev_delete_done);
954 ret = ath11k_wmi_vdev_start(ar, &arg, false);
955 if (ret) {
956 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
957 vdev_id, ret);
958 return ret;
961 ret = ath11k_mac_vdev_setup_sync(ar);
962 if (ret) {
963 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
964 vdev_id, ret);
965 return ret;
968 ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0);
969 if (ret) {
970 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
971 vdev_id, ret);
972 goto vdev_stop;
975 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n",
976 vdev_id);
978 return 0;
980 vdev_stop:
981 reinit_completion(&ar->vdev_setup_done);
983 ret = ath11k_wmi_vdev_stop(ar, vdev_id);
984 if (ret) {
985 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
986 vdev_id, ret);
987 return ret;
990 ret = ath11k_mac_vdev_setup_sync(ar);
991 if (ret) {
992 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
993 vdev_id, ret);
994 return ret;
997 return -EIO;
1000 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
1002 int ret;
1004 lockdep_assert_held(&ar->conf_mutex);
1006 reinit_completion(&ar->vdev_setup_done);
1008 ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1009 if (ret) {
1010 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1011 ar->monitor_vdev_id, ret);
1012 return ret;
1015 ret = ath11k_mac_vdev_setup_sync(ar);
1016 if (ret) {
1017 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1018 ar->monitor_vdev_id, ret);
1019 return ret;
1022 ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1023 if (ret) {
1024 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1025 ar->monitor_vdev_id, ret);
1026 return ret;
1029 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n",
1030 ar->monitor_vdev_id);
1032 return 0;
1035 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1037 struct ath11k_pdev *pdev = ar->pdev;
1038 struct vdev_create_params param = {};
1039 int bit, ret;
1040 u8 tmp_addr[6] = {0};
1041 u16 nss;
1043 lockdep_assert_held(&ar->conf_mutex);
1045 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1046 return 0;
1048 if (ar->ab->free_vdev_map == 0) {
1049 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1050 return -ENOMEM;
1053 bit = __ffs64(ar->ab->free_vdev_map);
1055 ar->monitor_vdev_id = bit;
1057 param.if_id = ar->monitor_vdev_id;
1058 param.type = WMI_VDEV_TYPE_MONITOR;
1059 param.subtype = WMI_VDEV_SUBTYPE_NONE;
1060 param.pdev_id = pdev->pdev_id;
1062 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1063 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1064 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1066 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1067 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1068 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1071 ret = ath11k_wmi_vdev_create(ar, tmp_addr, &param);
1072 if (ret) {
1073 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1074 ar->monitor_vdev_id, ret);
1075 ar->monitor_vdev_id = -1;
1076 return ret;
1079 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1080 ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1081 WMI_VDEV_PARAM_NSS, nss);
1082 if (ret) {
1083 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1084 ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1085 goto err_vdev_del;
1088 ret = ath11k_mac_txpower_recalc(ar);
1089 if (ret) {
1090 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1091 ar->monitor_vdev_id, ret);
1092 goto err_vdev_del;
1095 ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1096 ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1097 ar->num_created_vdevs++;
1098 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1100 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n",
1101 ar->monitor_vdev_id);
1103 return 0;
1105 err_vdev_del:
1106 ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1107 ar->monitor_vdev_id = -1;
1108 return ret;
1111 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1113 int ret;
1114 unsigned long time_left;
1116 lockdep_assert_held(&ar->conf_mutex);
1118 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1119 return 0;
1121 reinit_completion(&ar->vdev_delete_done);
1123 ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1124 if (ret) {
1125 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1126 ar->monitor_vdev_id, ret);
1127 return ret;
1130 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1131 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1132 if (time_left == 0) {
1133 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1134 } else {
1135 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d deleted\n",
1136 ar->monitor_vdev_id);
1138 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1139 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1140 ar->num_created_vdevs--;
1141 ar->monitor_vdev_id = -1;
1142 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1145 return ret;
1148 static int ath11k_mac_monitor_start(struct ath11k *ar)
1150 struct cfg80211_chan_def *chandef = NULL;
1151 int ret;
1153 lockdep_assert_held(&ar->conf_mutex);
1155 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1156 return 0;
1158 ieee80211_iter_chan_contexts_atomic(ar->hw,
1159 ath11k_mac_get_any_chandef_iter,
1160 &chandef);
1161 if (!chandef)
1162 return 0;
1164 ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1165 if (ret) {
1166 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1167 ath11k_mac_monitor_vdev_delete(ar);
1168 return ret;
1171 set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1173 ar->num_started_vdevs++;
1174 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1175 if (ret) {
1176 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1177 ret);
1178 return ret;
1181 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n");
1183 return 0;
1186 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1188 int ret;
1190 lockdep_assert_held(&ar->conf_mutex);
1192 if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1193 return 0;
1195 ret = ath11k_mac_monitor_vdev_stop(ar);
1196 if (ret) {
1197 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1198 return ret;
1201 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1202 ar->num_started_vdevs--;
1204 ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1205 if (ret) {
1206 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1207 ret);
1208 return ret;
1211 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret);
1213 return 0;
1216 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1218 struct ath11k *ar = arvif->ar;
1219 struct ieee80211_vif *vif = arvif->vif;
1220 struct ieee80211_conf *conf = &ar->hw->conf;
1221 enum wmi_sta_powersave_param param;
1222 enum wmi_sta_ps_mode psmode;
1223 int ret;
1224 int timeout;
1225 bool enable_ps;
1227 lockdep_assert_held(&arvif->ar->conf_mutex);
1229 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1230 return 0;
1232 enable_ps = arvif->ps;
1234 if (enable_ps) {
1235 psmode = WMI_STA_PS_MODE_ENABLED;
1236 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1238 timeout = conf->dynamic_ps_timeout;
1239 if (timeout == 0) {
1240 /* firmware doesn't like 0 */
1241 timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1244 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1245 timeout);
1246 if (ret) {
1247 ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1248 arvif->vdev_id, ret);
1249 return ret;
1251 } else {
1252 psmode = WMI_STA_PS_MODE_DISABLED;
1255 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n",
1256 arvif->vdev_id, psmode ? "enable" : "disable");
1258 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1259 if (ret) {
1260 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1261 psmode, arvif->vdev_id, ret);
1262 return ret;
1265 return 0;
1268 static int ath11k_mac_config_ps(struct ath11k *ar)
1270 struct ath11k_vif *arvif;
1271 int ret = 0;
1273 lockdep_assert_held(&ar->conf_mutex);
1275 list_for_each_entry(arvif, &ar->arvifs, list) {
1276 ret = ath11k_mac_vif_setup_ps(arvif);
1277 if (ret) {
1278 ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1279 break;
1283 return ret;
1286 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1288 struct ath11k *ar = hw->priv;
1289 struct ieee80211_conf *conf = &hw->conf;
1290 int ret = 0;
1292 mutex_lock(&ar->conf_mutex);
1294 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1295 if (conf->flags & IEEE80211_CONF_MONITOR) {
1296 set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1298 if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1299 &ar->monitor_flags))
1300 goto out;
1302 ret = ath11k_mac_monitor_vdev_create(ar);
1303 if (ret) {
1304 ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1305 ret);
1306 goto out;
1309 ret = ath11k_mac_monitor_start(ar);
1310 if (ret) {
1311 ath11k_warn(ar->ab, "failed to start monitor: %d",
1312 ret);
1313 goto err_mon_del;
1315 } else {
1316 clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1318 if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1319 &ar->monitor_flags))
1320 goto out;
1322 ret = ath11k_mac_monitor_stop(ar);
1323 if (ret) {
1324 ath11k_warn(ar->ab, "failed to stop monitor: %d",
1325 ret);
1326 goto out;
1329 ret = ath11k_mac_monitor_vdev_delete(ar);
1330 if (ret) {
1331 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1332 ret);
1333 goto out;
1338 out:
1339 mutex_unlock(&ar->conf_mutex);
1340 return ret;
1342 err_mon_del:
1343 ath11k_mac_monitor_vdev_delete(ar);
1344 mutex_unlock(&ar->conf_mutex);
1345 return ret;
1348 static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif,
1349 bool tx_arvif_rsnie_present,
1350 const u8 *profile, u8 profile_len)
1352 if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) {
1353 arvif->rsnie_present = true;
1354 } else if (tx_arvif_rsnie_present) {
1355 int i;
1356 u8 nie_len;
1357 const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE,
1358 profile, profile_len);
1359 if (!nie)
1360 return;
1362 nie_len = nie[1];
1363 nie += 2;
1364 for (i = 0; i < nie_len; i++) {
1365 if (nie[i] == WLAN_EID_RSN) {
1366 arvif->rsnie_present = false;
1367 break;
1373 static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif,
1374 struct ath11k_vif *arvif,
1375 struct sk_buff *bcn)
1377 struct ieee80211_mgmt *mgmt;
1378 const u8 *ies, *profile, *next_profile;
1379 int ies_len;
1381 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1382 mgmt = (struct ieee80211_mgmt *)bcn->data;
1383 ies += sizeof(mgmt->u.beacon);
1384 ies_len = skb_tail_pointer(bcn) - ies;
1386 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len);
1387 arvif->rsnie_present = tx_arvif->rsnie_present;
1389 while (ies) {
1390 u8 mbssid_len;
1392 ies_len -= (2 + ies[1]);
1393 mbssid_len = ies[1] - 1;
1394 profile = &ies[3];
1396 while (mbssid_len) {
1397 u8 profile_len;
1399 profile_len = profile[1];
1400 next_profile = profile + (2 + profile_len);
1401 mbssid_len -= (2 + profile_len);
1403 profile += 2;
1404 profile_len -= (2 + profile[1]);
1405 profile += (2 + profile[1]); /* nontx capabilities */
1406 profile_len -= (2 + profile[1]);
1407 profile += (2 + profile[1]); /* SSID */
1408 if (profile[2] == arvif->vif->bss_conf.bssid_index) {
1409 profile_len -= 5;
1410 profile = profile + 5;
1411 ath11k_mac_setup_nontx_vif_rsnie(arvif,
1412 tx_arvif->rsnie_present,
1413 profile,
1414 profile_len);
1415 return true;
1417 profile = next_profile;
1419 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile,
1420 ies_len);
1423 return false;
1426 static int ath11k_mac_setup_bcn_p2p_ie(struct ath11k_vif *arvif,
1427 struct sk_buff *bcn)
1429 struct ath11k *ar = arvif->ar;
1430 struct ieee80211_mgmt *mgmt;
1431 const u8 *p2p_ie;
1432 int ret;
1434 mgmt = (void *)bcn->data;
1435 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1436 mgmt->u.beacon.variable,
1437 bcn->len - (mgmt->u.beacon.variable -
1438 bcn->data));
1439 if (!p2p_ie)
1440 return -ENOENT;
1442 ret = ath11k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1443 if (ret) {
1444 ath11k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n",
1445 arvif->vdev_id, ret);
1446 return ret;
1449 return ret;
1452 static int ath11k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1453 u8 oui_type, size_t ie_offset)
1455 size_t len;
1456 const u8 *next, *end;
1457 u8 *ie;
1459 if (WARN_ON(skb->len < ie_offset))
1460 return -EINVAL;
1462 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1463 skb->data + ie_offset,
1464 skb->len - ie_offset);
1465 if (!ie)
1466 return -ENOENT;
1468 len = ie[1] + 2;
1469 end = skb->data + skb->len;
1470 next = ie + len;
1472 if (WARN_ON(next > end))
1473 return -EINVAL;
1475 memmove(ie, next, end - next);
1476 skb_trim(skb, skb->len - len);
1478 return 0;
1481 static int ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
1482 struct sk_buff *bcn)
1484 struct ath11k_base *ab = arvif->ar->ab;
1485 struct ieee80211_mgmt *mgmt;
1486 int ret = 0;
1487 u8 *ies;
1489 ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1490 mgmt = (struct ieee80211_mgmt *)bcn->data;
1491 ies += sizeof(mgmt->u.beacon);
1493 if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1494 arvif->rsnie_present = true;
1495 else
1496 arvif->rsnie_present = false;
1498 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1499 WLAN_OUI_TYPE_MICROSOFT_WPA,
1500 ies, (skb_tail_pointer(bcn) - ies)))
1501 arvif->wpaie_present = true;
1502 else
1503 arvif->wpaie_present = false;
1505 if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
1506 return ret;
1508 ret = ath11k_mac_setup_bcn_p2p_ie(arvif, bcn);
1509 if (ret) {
1510 ath11k_warn(ab, "failed to setup P2P GO bcn ie: %d\n",
1511 ret);
1512 return ret;
1515 /* P2P IE is inserted by firmware automatically (as
1516 * configured above) so remove it from the base beacon
1517 * template to avoid duplicate P2P IEs in beacon frames.
1519 ret = ath11k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA,
1520 WLAN_OUI_TYPE_WFA_P2P,
1521 offsetof(struct ieee80211_mgmt,
1522 u.beacon.variable));
1523 if (ret) {
1524 ath11k_warn(ab, "failed to remove P2P vendor ie: %d\n",
1525 ret);
1526 return ret;
1529 return ret;
1532 static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif)
1534 struct ath11k_vif *tx_arvif;
1535 struct ieee80211_ema_beacons *beacons;
1536 int ret = 0;
1537 bool nontx_vif_params_set = false;
1538 u32 params = 0;
1539 u8 i = 0;
1541 tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1543 beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw,
1544 tx_arvif->vif, 0);
1545 if (!beacons || !beacons->cnt) {
1546 ath11k_warn(arvif->ar->ab,
1547 "failed to get ema beacon templates from mac80211\n");
1548 return -EPERM;
1551 if (tx_arvif == arvif) {
1552 if (ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb))
1553 return -EINVAL;
1554 } else {
1555 arvif->wpaie_present = tx_arvif->wpaie_present;
1558 for (i = 0; i < beacons->cnt; i++) {
1559 if (tx_arvif != arvif && !nontx_vif_params_set)
1560 nontx_vif_params_set =
1561 ath11k_mac_set_nontx_vif_params(tx_arvif, arvif,
1562 beacons->bcn[i].skb);
1564 params = beacons->cnt;
1565 params |= (i << WMI_EMA_TMPL_IDX_SHIFT);
1566 params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT);
1567 params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT);
1569 ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id,
1570 &beacons->bcn[i].offs,
1571 beacons->bcn[i].skb, params);
1572 if (ret) {
1573 ath11k_warn(tx_arvif->ar->ab,
1574 "failed to set ema beacon template id %i error %d\n",
1575 i, ret);
1576 break;
1580 ieee80211_beacon_free_ema_list(beacons);
1582 if (tx_arvif != arvif && !nontx_vif_params_set)
1583 return -EINVAL; /* Profile not found in the beacons */
1585 return ret;
1588 static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
1590 struct ath11k *ar = arvif->ar;
1591 struct ath11k_base *ab = ar->ab;
1592 struct ath11k_vif *tx_arvif = arvif;
1593 struct ieee80211_hw *hw = ar->hw;
1594 struct ieee80211_vif *vif = arvif->vif;
1595 struct ieee80211_mutable_offsets offs = {};
1596 struct sk_buff *bcn;
1597 int ret;
1599 if (vif->mbssid_tx_vif) {
1600 tx_arvif = ath11k_vif_to_arvif(vif->mbssid_tx_vif);
1601 if (tx_arvif != arvif) {
1602 ar = tx_arvif->ar;
1603 ab = ar->ab;
1604 hw = ar->hw;
1605 vif = tx_arvif->vif;
1609 bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1610 if (!bcn) {
1611 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1612 return -EPERM;
1615 if (tx_arvif == arvif) {
1616 if (ath11k_mac_set_vif_params(tx_arvif, bcn))
1617 return -EINVAL;
1618 } else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) {
1619 return -EINVAL;
1622 ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0);
1623 kfree_skb(bcn);
1625 if (ret)
1626 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1627 ret);
1629 return ret;
1632 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1634 struct ieee80211_vif *vif = arvif->vif;
1636 if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1637 return 0;
1639 /* Target does not expect beacon templates for the already up
1640 * non-transmitting interfaces, and results in a crash if sent.
1642 if (vif->mbssid_tx_vif &&
1643 arvif != ath11k_vif_to_arvif(vif->mbssid_tx_vif) && arvif->is_up)
1644 return 0;
1646 if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif)
1647 return ath11k_mac_setup_bcn_tmpl_ema(arvif);
1649 return ath11k_mac_setup_bcn_tmpl_mbssid(arvif);
1652 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1654 struct ieee80211_vif *vif = arvif->vif;
1656 if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent)
1657 return;
1659 if (vif->bss_conf.color_change_active &&
1660 ieee80211_beacon_cntdwn_is_complete(vif, 0)) {
1661 arvif->bcca_zero_sent = true;
1662 ieee80211_color_change_finish(vif, 0);
1663 return;
1666 arvif->bcca_zero_sent = false;
1668 if (vif->bss_conf.color_change_active)
1669 ieee80211_beacon_update_cntdwn(vif, 0);
1670 ath11k_mac_setup_bcn_tmpl(arvif);
1673 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1674 struct ieee80211_bss_conf *info)
1676 struct ath11k *ar = arvif->ar;
1677 struct ath11k_vif *tx_arvif = NULL;
1678 int ret = 0;
1680 lockdep_assert_held(&arvif->ar->conf_mutex);
1682 if (!info->enable_beacon) {
1683 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1684 if (ret)
1685 ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1686 arvif->vdev_id, ret);
1688 arvif->is_up = false;
1689 return;
1692 /* Install the beacon template to the FW */
1693 ret = ath11k_mac_setup_bcn_tmpl(arvif);
1694 if (ret) {
1695 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1696 ret);
1697 return;
1700 arvif->tx_seq_no = 0x1000;
1702 arvif->aid = 0;
1704 ether_addr_copy(arvif->bssid, info->bssid);
1706 if (arvif->vif->mbssid_tx_vif)
1707 tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1709 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1710 arvif->bssid,
1711 tx_arvif ? tx_arvif->bssid : NULL,
1712 info->bssid_index,
1713 1 << info->bssid_indicator);
1714 if (ret) {
1715 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1716 arvif->vdev_id, ret);
1717 return;
1720 arvif->is_up = true;
1722 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id);
1725 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1726 struct ieee80211_vif *vif)
1728 struct sk_buff *skb = data;
1729 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1730 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1732 if (vif->type != NL80211_IFTYPE_STATION)
1733 return;
1735 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1736 return;
1738 cancel_delayed_work(&arvif->connection_loss_work);
1741 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1743 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1744 IEEE80211_IFACE_ITER_NORMAL,
1745 ath11k_mac_handle_beacon_iter,
1746 skb);
1749 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1750 struct ieee80211_vif *vif)
1752 u32 *vdev_id = data;
1753 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1754 struct ath11k *ar = arvif->ar;
1755 struct ieee80211_hw *hw = ar->hw;
1757 if (arvif->vdev_id != *vdev_id)
1758 return;
1760 if (!arvif->is_up)
1761 return;
1763 ieee80211_beacon_loss(vif);
1765 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1766 * (done by mac80211) succeeds but beacons do not resume then it
1767 * doesn't make sense to continue operation. Queue connection loss work
1768 * which can be cancelled when beacon is received.
1770 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1771 ATH11K_CONNECTION_LOSS_HZ);
1774 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1776 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1777 IEEE80211_IFACE_ITER_NORMAL,
1778 ath11k_mac_handle_beacon_miss_iter,
1779 &vdev_id);
1782 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1784 struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1785 connection_loss_work.work);
1786 struct ieee80211_vif *vif = arvif->vif;
1788 if (!arvif->is_up)
1789 return;
1791 ieee80211_connection_loss(vif);
1794 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1795 struct ieee80211_vif *vif,
1796 struct ieee80211_sta *sta,
1797 struct peer_assoc_params *arg)
1799 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1800 u32 aid;
1802 lockdep_assert_held(&ar->conf_mutex);
1804 if (vif->type == NL80211_IFTYPE_STATION)
1805 aid = vif->cfg.aid;
1806 else
1807 aid = sta->aid;
1809 ether_addr_copy(arg->peer_mac, sta->addr);
1810 arg->vdev_id = arvif->vdev_id;
1811 arg->peer_associd = aid;
1812 arg->auth_flag = true;
1813 /* TODO: STA WAR in ath10k for listen interval required? */
1814 arg->peer_listen_intval = ar->hw->conf.listen_interval;
1815 arg->peer_nss = 1;
1816 arg->peer_caps = vif->bss_conf.assoc_capability;
1819 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1820 struct ieee80211_vif *vif,
1821 struct ieee80211_sta *sta,
1822 struct peer_assoc_params *arg)
1824 struct ieee80211_bss_conf *info = &vif->bss_conf;
1825 struct cfg80211_chan_def def;
1826 struct cfg80211_bss *bss;
1827 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1828 const u8 *rsnie = NULL;
1829 const u8 *wpaie = NULL;
1831 lockdep_assert_held(&ar->conf_mutex);
1833 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1834 return;
1836 bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1837 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1839 if (arvif->rsnie_present || arvif->wpaie_present) {
1840 arg->need_ptk_4_way = true;
1841 if (arvif->wpaie_present)
1842 arg->need_gtk_2_way = true;
1843 } else if (bss) {
1844 const struct cfg80211_bss_ies *ies;
1846 rcu_read_lock();
1847 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1849 ies = rcu_dereference(bss->ies);
1851 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1852 WLAN_OUI_TYPE_MICROSOFT_WPA,
1853 ies->data,
1854 ies->len);
1855 rcu_read_unlock();
1856 cfg80211_put_bss(ar->hw->wiphy, bss);
1859 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1860 if (rsnie || wpaie) {
1861 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1862 "%s: rsn ie found\n", __func__);
1863 arg->need_ptk_4_way = true;
1866 if (wpaie) {
1867 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1868 "%s: wpa ie found\n", __func__);
1869 arg->need_gtk_2_way = true;
1872 if (sta->mfp) {
1873 /* TODO: Need to check if FW supports PMF? */
1874 arg->is_pmf_enabled = true;
1877 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1880 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1881 struct ieee80211_vif *vif,
1882 struct ieee80211_sta *sta,
1883 struct peer_assoc_params *arg)
1885 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1886 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1887 struct cfg80211_chan_def def;
1888 const struct ieee80211_supported_band *sband;
1889 const struct ieee80211_rate *rates;
1890 enum nl80211_band band;
1891 u32 ratemask;
1892 u8 rate;
1893 int i;
1895 lockdep_assert_held(&ar->conf_mutex);
1897 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1898 return;
1900 band = def.chan->band;
1901 sband = ar->hw->wiphy->bands[band];
1902 ratemask = sta->deflink.supp_rates[band];
1903 ratemask &= arvif->bitrate_mask.control[band].legacy;
1904 rates = sband->bitrates;
1906 rateset->num_rates = 0;
1908 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1909 if (!(ratemask & 1))
1910 continue;
1912 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1913 rateset->rates[rateset->num_rates] = rate;
1914 rateset->num_rates++;
1918 static bool
1919 ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1921 int nss;
1923 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1924 if (ht_mcs_mask[nss])
1925 return false;
1927 return true;
1930 static bool
1931 ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1933 int nss;
1935 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1936 if (vht_mcs_mask[nss])
1937 return false;
1939 return true;
1942 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1943 struct ieee80211_vif *vif,
1944 struct ieee80211_sta *sta,
1945 struct peer_assoc_params *arg)
1947 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1948 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1949 struct cfg80211_chan_def def;
1950 enum nl80211_band band;
1951 const u8 *ht_mcs_mask;
1952 int i, n;
1953 u8 max_nss;
1954 u32 stbc;
1956 lockdep_assert_held(&ar->conf_mutex);
1958 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1959 return;
1961 if (!ht_cap->ht_supported)
1962 return;
1964 band = def.chan->band;
1965 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1967 if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1968 return;
1970 arg->ht_flag = true;
1972 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1973 ht_cap->ampdu_factor)) - 1;
1975 arg->peer_mpdu_density =
1976 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1978 arg->peer_ht_caps = ht_cap->cap;
1979 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1981 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1982 arg->ldpc_flag = true;
1984 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1985 arg->bw_40 = true;
1986 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1989 /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1990 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1991 * both flags if guard interval is Default GI
1993 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1994 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1995 IEEE80211_HT_CAP_SGI_40);
1997 if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1998 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1999 IEEE80211_HT_CAP_SGI_40))
2000 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
2003 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2004 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
2005 arg->stbc_flag = true;
2008 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2009 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2010 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2011 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
2012 arg->peer_rate_caps |= stbc;
2013 arg->stbc_flag = true;
2016 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2017 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
2018 else if (ht_cap->mcs.rx_mask[1])
2019 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
2021 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2022 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2023 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2024 max_nss = (i / 8) + 1;
2025 arg->peer_ht_rates.rates[n++] = i;
2028 /* This is a workaround for HT-enabled STAs which break the spec
2029 * and have no HT capabilities RX mask (no HT RX MCS map).
2031 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2032 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2034 * Firmware asserts if such situation occurs.
2036 if (n == 0) {
2037 arg->peer_ht_rates.num_rates = 8;
2038 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2039 arg->peer_ht_rates.rates[i] = i;
2040 } else {
2041 arg->peer_ht_rates.num_rates = n;
2042 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2045 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n",
2046 arg->peer_mac,
2047 arg->peer_ht_rates.num_rates,
2048 arg->peer_nss);
2051 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
2053 switch ((mcs_map >> (2 * nss)) & 0x3) {
2054 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
2055 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
2056 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
2058 return 0;
2061 static u16
2062 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2063 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2065 int idx_limit;
2066 int nss;
2067 u16 mcs_map;
2068 u16 mcs;
2070 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2071 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2072 vht_mcs_limit[nss];
2074 if (mcs_map)
2075 idx_limit = fls(mcs_map) - 1;
2076 else
2077 idx_limit = -1;
2079 switch (idx_limit) {
2080 case 0:
2081 case 1:
2082 case 2:
2083 case 3:
2084 case 4:
2085 case 5:
2086 case 6:
2087 case 7:
2088 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2089 break;
2090 case 8:
2091 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2092 break;
2093 case 9:
2094 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2095 break;
2096 default:
2097 WARN_ON(1);
2098 fallthrough;
2099 case -1:
2100 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2101 break;
2104 tx_mcs_set &= ~(0x3 << (nss * 2));
2105 tx_mcs_set |= mcs << (nss * 2);
2108 return tx_mcs_set;
2111 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
2112 u8 max_nss)
2114 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2115 u8 max_sup_nss = 0;
2117 switch (nss_ratio_info) {
2118 case WMI_NSS_RATIO_1BY2_NSS:
2119 max_sup_nss = max_nss >> 1;
2120 break;
2121 case WMI_NSS_RATIO_3BY4_NSS:
2122 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2123 break;
2124 case WMI_NSS_RATIO_1_NSS:
2125 max_sup_nss = max_nss;
2126 break;
2127 case WMI_NSS_RATIO_2_NSS:
2128 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2129 break;
2130 default:
2131 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
2132 nss_ratio_info);
2133 break;
2136 return max_sup_nss;
2139 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
2140 struct ieee80211_vif *vif,
2141 struct ieee80211_sta *sta,
2142 struct peer_assoc_params *arg)
2144 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2145 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2146 struct cfg80211_chan_def def;
2147 enum nl80211_band band;
2148 u16 *vht_mcs_mask;
2149 u8 ampdu_factor;
2150 u8 max_nss, vht_mcs;
2151 int i, vht_nss, nss_idx;
2152 bool user_rate_valid = true;
2153 u32 rx_nss, tx_nss, nss_160;
2155 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2156 return;
2158 if (!vht_cap->vht_supported)
2159 return;
2161 band = def.chan->band;
2162 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2164 if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
2165 return;
2167 arg->vht_flag = true;
2169 /* TODO: similar flags required? */
2170 arg->vht_capable = true;
2172 if (def.chan->band == NL80211_BAND_2GHZ)
2173 arg->vht_ng_flag = true;
2175 arg->peer_vht_caps = vht_cap->cap;
2177 ampdu_factor = (vht_cap->cap &
2178 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2179 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2181 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2182 * zero in VHT IE. Using it would result in degraded throughput.
2183 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2184 * it if VHT max_mpdu is smaller.
2186 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2187 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2188 ampdu_factor)) - 1);
2190 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2191 arg->bw_80 = true;
2193 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2194 arg->bw_160 = true;
2196 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
2198 if (vht_nss > sta->deflink.rx_nss) {
2199 user_rate_valid = false;
2200 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2201 if (vht_mcs_mask[nss_idx]) {
2202 user_rate_valid = true;
2203 break;
2208 if (!user_rate_valid) {
2209 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer %pM\n",
2210 sta->deflink.rx_nss, sta->addr);
2211 vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2214 /* Calculate peer NSS capability from VHT capabilities if STA
2215 * supports VHT.
2217 for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) {
2218 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2219 (2 * i) & 3;
2221 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2222 vht_mcs_mask[i])
2223 max_nss = i + 1;
2225 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2226 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2227 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2228 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2229 arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
2230 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2232 /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
2233 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
2234 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2236 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2237 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2239 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2240 IEEE80211_VHT_MCS_NOT_SUPPORTED)
2241 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2243 /* TODO: Check */
2244 arg->tx_max_mcs_nss = 0xFF;
2246 if (arg->peer_phymode == MODE_11AC_VHT160 ||
2247 arg->peer_phymode == MODE_11AC_VHT80_80) {
2248 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2249 rx_nss = min(arg->peer_nss, tx_nss);
2250 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2252 if (!rx_nss) {
2253 ath11k_warn(ar->ab, "invalid max_nss\n");
2254 return;
2257 if (arg->peer_phymode == MODE_11AC_VHT160)
2258 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2259 else
2260 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2262 arg->peer_bw_rxnss_override |= nss_160;
2265 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2266 "vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2267 sta->addr, arg->peer_max_mpdu, arg->peer_flags,
2268 arg->peer_bw_rxnss_override);
2271 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2273 switch ((mcs_map >> (2 * nss)) & 0x3) {
2274 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2275 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2276 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2278 return 0;
2281 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2282 const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2284 int idx_limit;
2285 int nss;
2286 u16 mcs_map;
2287 u16 mcs;
2289 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2290 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2291 he_mcs_limit[nss];
2293 if (mcs_map)
2294 idx_limit = fls(mcs_map) - 1;
2295 else
2296 idx_limit = -1;
2298 switch (idx_limit) {
2299 case 0 ... 7:
2300 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2301 break;
2302 case 8:
2303 case 9:
2304 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2305 break;
2306 case 10:
2307 case 11:
2308 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2309 break;
2310 default:
2311 WARN_ON(1);
2312 fallthrough;
2313 case -1:
2314 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2315 break;
2318 tx_mcs_set &= ~(0x3 << (nss * 2));
2319 tx_mcs_set |= mcs << (nss * 2);
2322 return tx_mcs_set;
2325 static bool
2326 ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask)
2328 int nss;
2330 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2331 if (he_mcs_mask[nss])
2332 return false;
2334 return true;
2337 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2338 struct ieee80211_vif *vif,
2339 struct ieee80211_sta *sta,
2340 struct peer_assoc_params *arg)
2342 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2343 struct cfg80211_chan_def def;
2344 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2345 enum nl80211_band band;
2346 u16 he_mcs_mask[NL80211_HE_NSS_MAX];
2347 u8 max_nss, he_mcs;
2348 u16 he_tx_mcs = 0, v = 0;
2349 int i, he_nss, nss_idx;
2350 bool user_rate_valid = true;
2351 u32 rx_nss, tx_nss, nss_160;
2352 u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2353 u16 mcs_160_map, mcs_80_map;
2354 bool support_160;
2356 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2357 return;
2359 if (!he_cap->has_he)
2360 return;
2362 band = def.chan->band;
2363 memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs,
2364 sizeof(he_mcs_mask));
2366 if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2367 return;
2369 arg->he_flag = true;
2370 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2371 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2373 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2374 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2375 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2377 /* Initialize rx_mcs_160 to 9 which is an invalid value */
2378 rx_mcs_160 = 9;
2379 if (support_160) {
2380 for (i = 7; i >= 0; i--) {
2381 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2383 if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2384 rx_mcs_160 = i + 1;
2385 break;
2390 /* Initialize rx_mcs_80 to 9 which is an invalid value */
2391 rx_mcs_80 = 9;
2392 for (i = 7; i >= 0; i--) {
2393 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2395 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2396 rx_mcs_80 = i + 1;
2397 break;
2401 if (support_160)
2402 max_nss = min(rx_mcs_80, rx_mcs_160);
2403 else
2404 max_nss = rx_mcs_80;
2406 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2408 memcpy_and_pad(&arg->peer_he_cap_macinfo,
2409 sizeof(arg->peer_he_cap_macinfo),
2410 he_cap->he_cap_elem.mac_cap_info,
2411 sizeof(he_cap->he_cap_elem.mac_cap_info),
2413 memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2414 sizeof(arg->peer_he_cap_phyinfo),
2415 he_cap->he_cap_elem.phy_cap_info,
2416 sizeof(he_cap->he_cap_elem.phy_cap_info),
2418 arg->peer_he_ops = vif->bss_conf.he_oper.params;
2420 /* the top most byte is used to indicate BSS color info */
2421 arg->peer_he_ops &= 0xffffff;
2423 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2424 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2425 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2427 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2428 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2429 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2430 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2431 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2432 * length.
2434 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2435 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2437 if (ampdu_factor) {
2438 if (sta->deflink.vht_cap.vht_supported)
2439 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2440 ampdu_factor)) - 1;
2441 else if (sta->deflink.ht_cap.ht_supported)
2442 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2443 ampdu_factor)) - 1;
2446 if (he_cap->he_cap_elem.phy_cap_info[6] &
2447 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2448 int bit = 7;
2449 int nss, ru;
2451 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2452 IEEE80211_PPE_THRES_NSS_MASK;
2453 arg->peer_ppet.ru_bit_mask =
2454 (he_cap->ppe_thres[0] &
2455 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2456 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2458 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2459 for (ru = 0; ru < 4; ru++) {
2460 u32 val = 0;
2461 int i;
2463 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2464 continue;
2465 for (i = 0; i < 6; i++) {
2466 val >>= 1;
2467 val |= ((he_cap->ppe_thres[bit / 8] >>
2468 (bit % 8)) & 0x1) << 5;
2469 bit++;
2471 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2472 val << (ru * 6);
2477 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2478 arg->twt_responder = true;
2479 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2480 arg->twt_requester = true;
2482 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
2484 if (he_nss > sta->deflink.rx_nss) {
2485 user_rate_valid = false;
2486 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2487 if (he_mcs_mask[nss_idx]) {
2488 user_rate_valid = true;
2489 break;
2494 if (!user_rate_valid) {
2495 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %pM\n",
2496 sta->deflink.rx_nss, sta->addr);
2497 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2500 switch (sta->deflink.bandwidth) {
2501 case IEEE80211_STA_RX_BW_160:
2502 if (he_cap->he_cap_elem.phy_cap_info[0] &
2503 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2504 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2505 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2506 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2508 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2509 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2511 arg->peer_he_mcs_count++;
2512 he_tx_mcs = v;
2514 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2515 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2517 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2518 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2519 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2521 arg->peer_he_mcs_count++;
2522 if (!he_tx_mcs)
2523 he_tx_mcs = v;
2524 fallthrough;
2526 default:
2527 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2528 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2530 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2531 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2532 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2534 arg->peer_he_mcs_count++;
2535 if (!he_tx_mcs)
2536 he_tx_mcs = v;
2537 break;
2540 /* Calculate peer NSS capability from HE capabilities if STA
2541 * supports HE.
2543 for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2544 he_mcs = he_tx_mcs >> (2 * i) & 3;
2546 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2547 * unsupported range, with he_mcs_mask set, so check either of them
2548 * to find nss.
2550 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2551 he_mcs_mask[i])
2552 max_nss = i + 1;
2554 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2556 if (arg->peer_phymode == MODE_11AX_HE160 ||
2557 arg->peer_phymode == MODE_11AX_HE80_80) {
2558 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2559 rx_nss = min(arg->peer_nss, tx_nss);
2560 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2562 if (!rx_nss) {
2563 ath11k_warn(ar->ab, "invalid max_nss\n");
2564 return;
2567 if (arg->peer_phymode == MODE_11AX_HE160)
2568 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2569 else
2570 nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2572 arg->peer_bw_rxnss_override |= nss_160;
2575 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2576 "he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2577 sta->addr, arg->peer_nss,
2578 arg->peer_he_mcs_count,
2579 arg->peer_bw_rxnss_override);
2582 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2583 struct ieee80211_vif *vif,
2584 struct ieee80211_sta *sta,
2585 struct peer_assoc_params *arg)
2587 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2588 struct cfg80211_chan_def def;
2589 enum nl80211_band band;
2590 u8 ampdu_factor;
2592 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2593 return;
2595 band = def.chan->band;
2597 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2598 return;
2600 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2601 arg->bw_40 = true;
2603 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2604 arg->bw_80 = true;
2606 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2607 arg->bw_160 = true;
2609 arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2610 arg->peer_mpdu_density =
2611 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2612 arg->peer_he_caps_6ghz));
2614 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2615 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2616 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2617 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2618 * Band Capabilities element in the 6 GHz band.
2620 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2621 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2623 ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2624 he_cap->he_cap_elem.mac_cap_info[3]) +
2625 FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2626 arg->peer_he_caps_6ghz);
2628 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2629 ampdu_factor)) - 1;
2632 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2633 struct peer_assoc_params *arg)
2635 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2636 int smps;
2638 if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2639 return;
2641 if (ht_cap->ht_supported) {
2642 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2643 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2644 } else {
2645 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2646 IEEE80211_HE_6GHZ_CAP_SM_PS);
2649 switch (smps) {
2650 case WLAN_HT_CAP_SM_PS_STATIC:
2651 arg->static_mimops_flag = true;
2652 break;
2653 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2654 arg->dynamic_mimops_flag = true;
2655 break;
2656 case WLAN_HT_CAP_SM_PS_DISABLED:
2657 arg->spatial_mux_flag = true;
2658 break;
2659 default:
2660 break;
2664 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2665 struct ieee80211_vif *vif,
2666 struct ieee80211_sta *sta,
2667 struct peer_assoc_params *arg)
2669 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2671 switch (arvif->vdev_type) {
2672 case WMI_VDEV_TYPE_AP:
2673 if (sta->wme) {
2674 /* TODO: Check WME vs QoS */
2675 arg->is_wme_set = true;
2676 arg->qos_flag = true;
2679 if (sta->wme && sta->uapsd_queues) {
2680 /* TODO: Check WME vs QoS */
2681 arg->is_wme_set = true;
2682 arg->apsd_flag = true;
2683 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2685 break;
2686 case WMI_VDEV_TYPE_STA:
2687 if (sta->wme) {
2688 arg->is_wme_set = true;
2689 arg->qos_flag = true;
2691 break;
2692 default:
2693 break;
2696 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n",
2697 sta->addr, arg->qos_flag);
2700 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2701 struct ath11k_vif *arvif,
2702 struct ieee80211_sta *sta)
2704 struct ap_ps_params params;
2705 u32 max_sp;
2706 u32 uapsd;
2707 int ret;
2709 lockdep_assert_held(&ar->conf_mutex);
2711 params.vdev_id = arvif->vdev_id;
2713 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n",
2714 sta->uapsd_queues, sta->max_sp);
2716 uapsd = 0;
2717 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2718 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2719 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2720 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2721 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2722 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2723 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2724 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2725 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2726 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2727 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2728 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2730 max_sp = 0;
2731 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2732 max_sp = sta->max_sp;
2734 params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2735 params.value = uapsd;
2736 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2737 if (ret)
2738 goto err;
2740 params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2741 params.value = max_sp;
2742 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2743 if (ret)
2744 goto err;
2746 /* TODO revisit during testing */
2747 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2748 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2749 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2750 if (ret)
2751 goto err;
2753 params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2754 params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2755 ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2756 if (ret)
2757 goto err;
2759 return 0;
2761 err:
2762 ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2763 params.param, arvif->vdev_id, ret);
2764 return ret;
2767 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2769 return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2770 ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2773 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2774 struct ieee80211_sta *sta)
2776 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2777 switch (sta->deflink.vht_cap.cap &
2778 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2779 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2780 return MODE_11AC_VHT160;
2781 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2782 return MODE_11AC_VHT80_80;
2783 default:
2784 /* not sure if this is a valid case? */
2785 return MODE_11AC_VHT160;
2789 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2790 return MODE_11AC_VHT80;
2792 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2793 return MODE_11AC_VHT40;
2795 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2796 return MODE_11AC_VHT20;
2798 return MODE_UNKNOWN;
2801 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2802 struct ieee80211_sta *sta)
2804 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2805 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2806 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2807 return MODE_11AX_HE160;
2808 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2809 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2810 return MODE_11AX_HE80_80;
2811 /* not sure if this is a valid case? */
2812 return MODE_11AX_HE160;
2815 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2816 return MODE_11AX_HE80;
2818 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2819 return MODE_11AX_HE40;
2821 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2822 return MODE_11AX_HE20;
2824 return MODE_UNKNOWN;
2827 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2828 struct ieee80211_vif *vif,
2829 struct ieee80211_sta *sta,
2830 struct peer_assoc_params *arg)
2832 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2833 struct cfg80211_chan_def def;
2834 enum nl80211_band band;
2835 const u8 *ht_mcs_mask;
2836 const u16 *vht_mcs_mask;
2837 const u16 *he_mcs_mask;
2838 enum wmi_phy_mode phymode = MODE_UNKNOWN;
2840 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2841 return;
2843 band = def.chan->band;
2844 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2845 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2846 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2848 switch (band) {
2849 case NL80211_BAND_2GHZ:
2850 if (sta->deflink.he_cap.has_he &&
2851 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2852 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2853 phymode = MODE_11AX_HE80_2G;
2854 else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2855 phymode = MODE_11AX_HE40_2G;
2856 else
2857 phymode = MODE_11AX_HE20_2G;
2858 } else if (sta->deflink.vht_cap.vht_supported &&
2859 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2860 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2861 phymode = MODE_11AC_VHT40;
2862 else
2863 phymode = MODE_11AC_VHT20;
2864 } else if (sta->deflink.ht_cap.ht_supported &&
2865 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2866 if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2867 phymode = MODE_11NG_HT40;
2868 else
2869 phymode = MODE_11NG_HT20;
2870 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2871 phymode = MODE_11G;
2872 } else {
2873 phymode = MODE_11B;
2875 break;
2876 case NL80211_BAND_5GHZ:
2877 case NL80211_BAND_6GHZ:
2878 /* Check HE first */
2879 if (sta->deflink.he_cap.has_he &&
2880 !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2881 phymode = ath11k_mac_get_phymode_he(ar, sta);
2882 } else if (sta->deflink.vht_cap.vht_supported &&
2883 !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2884 phymode = ath11k_mac_get_phymode_vht(ar, sta);
2885 } else if (sta->deflink.ht_cap.ht_supported &&
2886 !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2887 if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2888 phymode = MODE_11NA_HT40;
2889 else
2890 phymode = MODE_11NA_HT20;
2891 } else {
2892 phymode = MODE_11A;
2894 break;
2895 default:
2896 break;
2899 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n",
2900 sta->addr, ath11k_wmi_phymode_str(phymode));
2902 arg->peer_phymode = phymode;
2903 WARN_ON(phymode == MODE_UNKNOWN);
2906 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2907 struct ieee80211_vif *vif,
2908 struct ieee80211_sta *sta,
2909 struct peer_assoc_params *arg,
2910 bool reassoc)
2912 struct ath11k_sta *arsta;
2914 lockdep_assert_held(&ar->conf_mutex);
2916 arsta = ath11k_sta_to_arsta(sta);
2918 memset(arg, 0, sizeof(*arg));
2920 reinit_completion(&ar->peer_assoc_done);
2922 arg->peer_new_assoc = !reassoc;
2923 ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2924 ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2925 ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2926 ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2927 ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2928 ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2929 ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2930 ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2931 ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2932 ath11k_peer_assoc_h_smps(sta, arg);
2934 arsta->peer_nss = arg->peer_nss;
2936 /* TODO: amsdu_disable req? */
2939 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2940 const u8 *addr,
2941 const struct ieee80211_sta_ht_cap *ht_cap,
2942 u16 he_6ghz_capa)
2944 int smps;
2946 if (!ht_cap->ht_supported && !he_6ghz_capa)
2947 return 0;
2949 if (ht_cap->ht_supported) {
2950 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2951 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2952 } else {
2953 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2956 if (smps >= ARRAY_SIZE(ath11k_smps_map))
2957 return -EINVAL;
2959 return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2960 WMI_PEER_MIMO_PS_STATE,
2961 ath11k_smps_map[smps]);
2964 static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif)
2966 struct ath11k *ar = arvif->ar;
2967 u32 param, value;
2968 int ret;
2970 if (!arvif->vif->bss_conf.he_support)
2971 return true;
2973 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2974 value = 0;
2975 if (arvif->vif->bss_conf.he_su_beamformer) {
2976 value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2977 if (arvif->vif->bss_conf.he_mu_beamformer &&
2978 arvif->vdev_type == WMI_VDEV_TYPE_AP)
2979 value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE);
2982 if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
2983 value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2984 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2986 if (arvif->vif->bss_conf.he_full_ul_mumimo)
2987 value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE);
2989 if (arvif->vif->bss_conf.he_su_beamformee)
2990 value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2993 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
2994 if (ret) {
2995 ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
2996 arvif->vdev_id, ret);
2997 return false;
3000 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
3001 value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
3002 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
3003 HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
3004 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3005 param, value);
3006 if (ret) {
3007 ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
3008 arvif->vdev_id, ret);
3009 return false;
3011 return true;
3014 static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar,
3015 struct ieee80211_vif *vif,
3016 struct ieee80211_sta_he_cap *he_cap)
3018 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3019 struct ieee80211_he_cap_elem he_cap_elem = {0};
3020 struct ieee80211_sta_he_cap *cap_band = NULL;
3021 struct cfg80211_chan_def def;
3022 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
3023 u32 hemode = 0;
3024 int ret;
3026 if (!vif->bss_conf.he_support)
3027 return true;
3029 if (vif->type != NL80211_IFTYPE_STATION)
3030 return false;
3032 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
3033 return false;
3035 if (def.chan->band == NL80211_BAND_2GHZ)
3036 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
3037 else
3038 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
3040 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
3042 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
3043 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3044 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
3045 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3046 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
3049 if (vif->type != NL80211_IFTYPE_MESH_POINT) {
3050 hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
3051 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
3053 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
3054 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
3055 hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO,
3056 HE_UL_MUMIMO_ENABLE);
3058 if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode))
3059 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
3061 if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode))
3062 hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
3065 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode);
3066 if (ret) {
3067 ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
3068 hemode, ret);
3069 return false;
3072 return true;
3075 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
3076 struct ieee80211_vif *vif,
3077 struct ieee80211_bss_conf *bss_conf)
3079 struct ath11k *ar = hw->priv;
3080 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3081 struct peer_assoc_params peer_arg;
3082 struct ieee80211_sta *ap_sta;
3083 struct ath11k_peer *peer;
3084 bool is_auth = false;
3085 struct ieee80211_sta_he_cap he_cap;
3086 int ret;
3088 lockdep_assert_held(&ar->conf_mutex);
3090 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n",
3091 arvif->vdev_id, arvif->bssid, arvif->aid);
3093 rcu_read_lock();
3095 ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3096 if (!ap_sta) {
3097 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3098 bss_conf->bssid, arvif->vdev_id);
3099 rcu_read_unlock();
3100 return;
3103 /* he_cap here is updated at assoc success for sta mode only */
3104 he_cap = ap_sta->deflink.he_cap;
3106 ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
3108 rcu_read_unlock();
3110 if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) {
3111 ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n",
3112 arvif->vdev_id, bss_conf->bssid);
3113 return;
3116 peer_arg.is_assoc = true;
3118 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3119 if (ret) {
3120 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3121 bss_conf->bssid, arvif->vdev_id, ret);
3122 return;
3125 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3126 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3127 bss_conf->bssid, arvif->vdev_id);
3128 return;
3131 ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3132 &ap_sta->deflink.ht_cap,
3133 le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
3134 if (ret) {
3135 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3136 arvif->vdev_id, ret);
3137 return;
3140 WARN_ON(arvif->is_up);
3142 arvif->aid = vif->cfg.aid;
3143 ether_addr_copy(arvif->bssid, bss_conf->bssid);
3145 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid,
3146 NULL, 0, 0);
3147 if (ret) {
3148 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3149 arvif->vdev_id, ret);
3150 return;
3153 arvif->is_up = true;
3154 arvif->rekey_data.enable_offload = false;
3156 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3157 "vdev %d up (associated) bssid %pM aid %d\n",
3158 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3160 spin_lock_bh(&ar->ab->base_lock);
3162 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3163 if (peer && peer->is_authorized)
3164 is_auth = true;
3166 spin_unlock_bh(&ar->ab->base_lock);
3168 if (is_auth) {
3169 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
3170 arvif->vdev_id,
3171 WMI_PEER_AUTHORIZE,
3173 if (ret)
3174 ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3177 ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3178 &bss_conf->he_obss_pd);
3179 if (ret)
3180 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3181 arvif->vdev_id, ret);
3183 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3184 WMI_VDEV_PARAM_DTIM_POLICY,
3185 WMI_DTIM_POLICY_STICK);
3186 if (ret)
3187 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
3188 arvif->vdev_id, ret);
3190 ath11k_mac_11d_scan_stop_all(ar->ab);
3193 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
3194 struct ieee80211_vif *vif)
3196 struct ath11k *ar = hw->priv;
3197 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3198 int ret;
3200 lockdep_assert_held(&ar->conf_mutex);
3202 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n",
3203 arvif->vdev_id, arvif->bssid);
3205 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
3206 if (ret)
3207 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
3208 arvif->vdev_id, ret);
3210 arvif->is_up = false;
3212 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3214 cancel_delayed_work_sync(&arvif->connection_loss_work);
3217 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
3219 u32 preamble;
3220 u16 hw_value;
3221 int rate;
3222 size_t i;
3224 if (ath11k_mac_bitrate_is_cck(bitrate))
3225 preamble = WMI_RATE_PREAMBLE_CCK;
3226 else
3227 preamble = WMI_RATE_PREAMBLE_OFDM;
3229 for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
3230 if (ath11k_legacy_rates[i].bitrate != bitrate)
3231 continue;
3233 hw_value = ath11k_legacy_rates[i].hw_value;
3234 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3236 return rate;
3239 return -EINVAL;
3242 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
3243 struct ieee80211_vif *vif,
3244 struct cfg80211_chan_def *def)
3246 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3247 const struct ieee80211_supported_band *sband;
3248 u8 basic_rate_idx;
3249 int hw_rate_code;
3250 u32 vdev_param;
3251 u16 bitrate;
3252 int ret;
3254 lockdep_assert_held(&ar->conf_mutex);
3256 sband = ar->hw->wiphy->bands[def->chan->band];
3257 basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
3258 bitrate = sband->bitrates[basic_rate_idx].bitrate;
3260 hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
3261 if (hw_rate_code < 0) {
3262 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3263 return;
3266 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3267 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3268 hw_rate_code);
3269 if (ret)
3270 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3272 /* For WCN6855, firmware will clear this param when vdev starts, hence
3273 * cache it here so that we can reconfigure it once vdev starts.
3275 ar->hw_rate_code = hw_rate_code;
3277 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3278 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3279 hw_rate_code);
3280 if (ret)
3281 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3284 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
3285 struct ieee80211_bss_conf *info)
3287 struct ath11k *ar = arvif->ar;
3288 struct sk_buff *tmpl;
3289 int ret;
3290 u32 interval;
3291 bool unsol_bcast_probe_resp_enabled = false;
3293 if (info->fils_discovery.max_interval) {
3294 interval = info->fils_discovery.max_interval;
3296 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
3297 if (tmpl)
3298 ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
3299 tmpl);
3300 } else if (info->unsol_bcast_probe_resp_interval) {
3301 unsol_bcast_probe_resp_enabled = 1;
3302 interval = info->unsol_bcast_probe_resp_interval;
3304 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
3305 arvif->vif);
3306 if (tmpl)
3307 ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
3308 tmpl);
3309 } else { /* Disable */
3310 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
3313 if (!tmpl) {
3314 ath11k_warn(ar->ab,
3315 "mac vdev %i failed to retrieve %s template\n",
3316 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
3317 "unsolicited broadcast probe response" :
3318 "FILS discovery"));
3319 return -EPERM;
3321 kfree_skb(tmpl);
3323 if (!ret)
3324 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
3325 unsol_bcast_probe_resp_enabled);
3327 return ret;
3330 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
3331 struct ieee80211_he_obss_pd *he_obss_pd)
3333 u32 bitmap[2], param_id, param_val, pdev_id;
3334 int ret;
3335 s8 non_srg_th = 0, srg_th = 0;
3337 pdev_id = ar->pdev->pdev_id;
3339 /* Set and enable SRG/non-SRG OBSS PD Threshold */
3340 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
3341 if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
3342 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
3343 if (ret)
3344 ath11k_warn(ar->ab,
3345 "failed to set obss_pd_threshold for pdev: %u\n",
3346 pdev_id);
3347 return ret;
3350 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3351 "obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
3352 he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
3353 he_obss_pd->max_offset);
3355 param_val = 0;
3357 if (he_obss_pd->sr_ctrl &
3358 IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
3359 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
3360 } else {
3361 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
3362 non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
3363 he_obss_pd->non_srg_max_offset);
3364 else
3365 non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
3367 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
3370 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
3371 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
3372 param_val |= ATH11K_OBSS_PD_SRG_EN;
3375 if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3376 ar->ab->wmi_ab.svc_map)) {
3377 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
3378 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
3379 } else {
3380 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
3381 /* SRG not supported and threshold in dB */
3382 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
3383 ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
3386 param_val |= (non_srg_th & GENMASK(7, 0));
3387 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3388 if (ret) {
3389 ath11k_warn(ar->ab,
3390 "failed to set obss_pd_threshold for pdev: %u\n",
3391 pdev_id);
3392 return ret;
3395 /* Enable OBSS PD for all access category */
3396 param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3397 param_val = 0xf;
3398 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3399 if (ret) {
3400 ath11k_warn(ar->ab,
3401 "failed to set obss_pd_per_ac for pdev: %u\n",
3402 pdev_id);
3403 return ret;
3406 /* Set SR Prohibit */
3407 param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3408 param_val = !!(he_obss_pd->sr_ctrl &
3409 IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3410 ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3411 if (ret) {
3412 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3413 pdev_id);
3414 return ret;
3417 if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3418 ar->ab->wmi_ab.svc_map))
3419 return 0;
3421 /* Set SRG BSS Color Bitmap */
3422 memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3423 ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3424 if (ret) {
3425 ath11k_warn(ar->ab,
3426 "failed to set bss_color_bitmap for pdev: %u\n",
3427 pdev_id);
3428 return ret;
3431 /* Set SRG Partial BSSID Bitmap */
3432 memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3433 ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3434 if (ret) {
3435 ath11k_warn(ar->ab,
3436 "failed to set partial_bssid_bitmap for pdev: %u\n",
3437 pdev_id);
3438 return ret;
3441 memset(bitmap, 0xff, sizeof(bitmap));
3443 /* Enable all BSS Colors for SRG */
3444 ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3445 if (ret) {
3446 ath11k_warn(ar->ab,
3447 "failed to set srg_color_en_bitmap pdev: %u\n",
3448 pdev_id);
3449 return ret;
3452 /* Enable all partial BSSID mask for SRG */
3453 ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3454 if (ret) {
3455 ath11k_warn(ar->ab,
3456 "failed to set srg_bssid_en_bitmap pdev: %u\n",
3457 pdev_id);
3458 return ret;
3461 /* Enable all BSS Colors for non-SRG */
3462 ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3463 if (ret) {
3464 ath11k_warn(ar->ab,
3465 "failed to set non_srg_color_en_bitmap pdev: %u\n",
3466 pdev_id);
3467 return ret;
3470 /* Enable all partial BSSID mask for non-SRG */
3471 ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3472 if (ret) {
3473 ath11k_warn(ar->ab,
3474 "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3475 pdev_id);
3476 return ret;
3479 return 0;
3482 static bool ath11k_mac_supports_station_tpc(struct ath11k *ar,
3483 struct ath11k_vif *arvif,
3484 const struct cfg80211_chan_def *chandef)
3486 return ath11k_wmi_supports_6ghz_cc_ext(ar) &&
3487 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
3488 arvif->vdev_type == WMI_VDEV_TYPE_STA &&
3489 arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
3490 chandef->chan &&
3491 chandef->chan->band == NL80211_BAND_6GHZ;
3494 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3495 struct ieee80211_vif *vif,
3496 struct ieee80211_bss_conf *info,
3497 u64 changed)
3499 struct ath11k *ar = hw->priv;
3500 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3501 struct cfg80211_chan_def def;
3502 u32 param_id, param_value;
3503 enum nl80211_band band;
3504 u32 vdev_param;
3505 int mcast_rate;
3506 u32 preamble;
3507 u16 hw_value;
3508 u16 bitrate;
3509 int ret = 0;
3510 u8 rateidx;
3511 u32 rate, param;
3512 u32 ipv4_cnt;
3514 mutex_lock(&ar->conf_mutex);
3516 if (changed & BSS_CHANGED_BEACON_INT) {
3517 arvif->beacon_interval = info->beacon_int;
3519 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3520 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3521 param_id,
3522 arvif->beacon_interval);
3523 if (ret)
3524 ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3525 arvif->vdev_id);
3526 else
3527 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3528 "Beacon interval: %d set for VDEV: %d\n",
3529 arvif->beacon_interval, arvif->vdev_id);
3532 if (changed & BSS_CHANGED_BEACON) {
3533 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3534 param_value = WMI_BEACON_STAGGERED_MODE;
3535 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3536 param_value, ar->pdev->pdev_id);
3537 if (ret)
3538 ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3539 arvif->vdev_id);
3540 else
3541 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3542 "Set staggered beacon mode for VDEV: %d\n",
3543 arvif->vdev_id);
3545 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3546 ret = ath11k_mac_setup_bcn_tmpl(arvif);
3547 if (ret)
3548 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3549 ret);
3552 if (arvif->bcca_zero_sent)
3553 arvif->do_not_send_tmpl = true;
3554 else
3555 arvif->do_not_send_tmpl = false;
3557 if (vif->bss_conf.he_support) {
3558 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3559 WMI_VDEV_PARAM_BA_MODE,
3560 WMI_BA_MODE_BUFFER_SIZE_256);
3561 if (ret)
3562 ath11k_warn(ar->ab,
3563 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3564 arvif->vdev_id);
3565 else
3566 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3567 "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3568 arvif->vdev_id);
3572 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3573 arvif->dtim_period = info->dtim_period;
3575 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3576 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3577 param_id,
3578 arvif->dtim_period);
3580 if (ret)
3581 ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3582 arvif->vdev_id, ret);
3583 else
3584 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3585 "DTIM period: %d set for VDEV: %d\n",
3586 arvif->dtim_period, arvif->vdev_id);
3589 if (changed & BSS_CHANGED_SSID &&
3590 vif->type == NL80211_IFTYPE_AP) {
3591 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3592 if (vif->cfg.ssid_len)
3593 memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3594 vif->cfg.ssid_len);
3595 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3598 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3599 ether_addr_copy(arvif->bssid, info->bssid);
3601 if (changed & BSS_CHANGED_BEACON_ENABLED) {
3602 if (info->enable_beacon)
3603 ath11k_mac_set_he_txbf_conf(arvif);
3604 ath11k_control_beaconing(arvif, info);
3606 if (arvif->is_up && vif->bss_conf.he_support &&
3607 vif->bss_conf.he_oper.params) {
3608 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3609 param_value = vif->bss_conf.he_oper.params;
3610 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3611 param_id, param_value);
3612 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3613 "he oper param: %x set for VDEV: %d\n",
3614 param_value, arvif->vdev_id);
3616 if (ret)
3617 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3618 param_value, arvif->vdev_id, ret);
3622 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3623 u32 cts_prot;
3625 cts_prot = !!(info->use_cts_prot);
3626 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3628 if (arvif->is_started) {
3629 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3630 param_id, cts_prot);
3631 if (ret)
3632 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3633 arvif->vdev_id);
3634 else
3635 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3636 cts_prot, arvif->vdev_id);
3637 } else {
3638 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3642 if (changed & BSS_CHANGED_ERP_SLOT) {
3643 u32 slottime;
3645 if (info->use_short_slot)
3646 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3648 else
3649 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3651 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3652 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3653 param_id, slottime);
3654 if (ret)
3655 ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3656 arvif->vdev_id);
3657 else
3658 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3659 "Set slottime: %d for VDEV: %d\n",
3660 slottime, arvif->vdev_id);
3663 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3664 u32 preamble;
3666 if (info->use_short_preamble)
3667 preamble = WMI_VDEV_PREAMBLE_SHORT;
3668 else
3669 preamble = WMI_VDEV_PREAMBLE_LONG;
3671 param_id = WMI_VDEV_PARAM_PREAMBLE;
3672 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3673 param_id, preamble);
3674 if (ret)
3675 ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3676 arvif->vdev_id);
3677 else
3678 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3679 "Set preamble: %d for VDEV: %d\n",
3680 preamble, arvif->vdev_id);
3683 if (changed & BSS_CHANGED_ASSOC) {
3684 if (vif->cfg.assoc)
3685 ath11k_bss_assoc(hw, vif, info);
3686 else
3687 ath11k_bss_disassoc(hw, vif);
3690 if (changed & BSS_CHANGED_TXPOWER) {
3691 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n",
3692 arvif->vdev_id, info->txpower);
3693 arvif->txpower = info->txpower;
3694 ath11k_mac_txpower_recalc(ar);
3697 if (changed & BSS_CHANGED_PS &&
3698 ar->ab->hw_params.supports_sta_ps) {
3699 arvif->ps = vif->cfg.ps;
3701 ret = ath11k_mac_config_ps(ar);
3702 if (ret)
3703 ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3704 arvif->vdev_id, ret);
3707 if (changed & BSS_CHANGED_MCAST_RATE &&
3708 !ath11k_mac_vif_chan(arvif->vif, &def)) {
3709 band = def.chan->band;
3710 mcast_rate = vif->bss_conf.mcast_rate[band];
3712 if (mcast_rate > 0)
3713 rateidx = mcast_rate - 1;
3714 else
3715 rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3717 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3718 rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3720 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3721 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3723 if (ath11k_mac_bitrate_is_cck(bitrate))
3724 preamble = WMI_RATE_PREAMBLE_CCK;
3725 else
3726 preamble = WMI_RATE_PREAMBLE_OFDM;
3728 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3730 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3731 "vdev %d mcast_rate %x\n",
3732 arvif->vdev_id, rate);
3734 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3735 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3736 vdev_param, rate);
3737 if (ret)
3738 ath11k_warn(ar->ab,
3739 "failed to set mcast rate on vdev %i: %d\n",
3740 arvif->vdev_id, ret);
3742 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3743 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3744 vdev_param, rate);
3745 if (ret)
3746 ath11k_warn(ar->ab,
3747 "failed to set bcast rate on vdev %i: %d\n",
3748 arvif->vdev_id, ret);
3751 if (changed & BSS_CHANGED_BASIC_RATES &&
3752 !ath11k_mac_vif_chan(arvif->vif, &def))
3753 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3755 if (changed & BSS_CHANGED_TWT) {
3756 struct wmi_twt_enable_params twt_params = {0};
3758 if (info->twt_requester || info->twt_responder) {
3759 ath11k_wmi_fill_default_twt_params(&twt_params);
3760 ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id,
3761 &twt_params);
3762 } else {
3763 ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3767 if (changed & BSS_CHANGED_HE_OBSS_PD)
3768 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3770 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3771 if (vif->type == NL80211_IFTYPE_AP) {
3772 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3773 ar, arvif->vdev_id, info->he_bss_color.color,
3774 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3775 info->he_bss_color.enabled);
3776 if (ret)
3777 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3778 arvif->vdev_id, ret);
3780 param_id = WMI_VDEV_PARAM_BSS_COLOR;
3781 if (info->he_bss_color.enabled)
3782 param_value = info->he_bss_color.color <<
3783 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3784 else
3785 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3787 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3788 param_id,
3789 param_value);
3790 if (ret)
3791 ath11k_warn(ar->ab,
3792 "failed to set bss color param on vdev %i: %d\n",
3793 arvif->vdev_id, ret);
3795 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3796 "bss color param 0x%x set on vdev %i\n",
3797 param_value, arvif->vdev_id);
3798 } else if (vif->type == NL80211_IFTYPE_STATION) {
3799 ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3800 arvif->vdev_id,
3802 if (ret)
3803 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3804 arvif->vdev_id, ret);
3805 ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3806 ar, arvif->vdev_id, 0,
3807 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3808 if (ret)
3809 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3810 arvif->vdev_id, ret);
3814 if (changed & BSS_CHANGED_FTM_RESPONDER &&
3815 arvif->ftm_responder != info->ftm_responder &&
3816 test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) &&
3817 (vif->type == NL80211_IFTYPE_AP ||
3818 vif->type == NL80211_IFTYPE_MESH_POINT)) {
3819 arvif->ftm_responder = info->ftm_responder;
3820 param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE;
3821 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
3822 arvif->ftm_responder);
3823 if (ret)
3824 ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n",
3825 arvif->vdev_id, ret);
3828 if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3829 changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3830 ath11k_mac_fils_discovery(arvif, info);
3832 if (changed & BSS_CHANGED_ARP_FILTER) {
3833 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3834 memcpy(arvif->arp_ns_offload.ipv4_addr,
3835 vif->cfg.arp_addr_list,
3836 ipv4_cnt * sizeof(u32));
3837 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3838 arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3840 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3841 vif->cfg.arp_addr_cnt,
3842 vif->addr, arvif->arp_ns_offload.ipv4_addr);
3845 mutex_unlock(&ar->conf_mutex);
3848 void __ath11k_mac_scan_finish(struct ath11k *ar)
3850 lockdep_assert_held(&ar->data_lock);
3852 switch (ar->scan.state) {
3853 case ATH11K_SCAN_IDLE:
3854 break;
3855 case ATH11K_SCAN_RUNNING:
3856 case ATH11K_SCAN_ABORTING:
3857 if (ar->scan.is_roc && ar->scan.roc_notify)
3858 ieee80211_remain_on_channel_expired(ar->hw);
3859 fallthrough;
3860 case ATH11K_SCAN_STARTING:
3861 if (!ar->scan.is_roc) {
3862 struct cfg80211_scan_info info = {
3863 .aborted = ((ar->scan.state ==
3864 ATH11K_SCAN_ABORTING) ||
3865 (ar->scan.state ==
3866 ATH11K_SCAN_STARTING)),
3869 ieee80211_scan_completed(ar->hw, &info);
3872 ar->scan.state = ATH11K_SCAN_IDLE;
3873 ar->scan_channel = NULL;
3874 ar->scan.roc_freq = 0;
3875 cancel_delayed_work(&ar->scan.timeout);
3876 complete_all(&ar->scan.completed);
3877 break;
3881 void ath11k_mac_scan_finish(struct ath11k *ar)
3883 spin_lock_bh(&ar->data_lock);
3884 __ath11k_mac_scan_finish(ar);
3885 spin_unlock_bh(&ar->data_lock);
3888 static int ath11k_scan_stop(struct ath11k *ar)
3890 struct scan_cancel_param arg = {
3891 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3892 .scan_id = ATH11K_SCAN_ID,
3894 int ret;
3896 lockdep_assert_held(&ar->conf_mutex);
3898 /* TODO: Fill other STOP Params */
3899 arg.pdev_id = ar->pdev->pdev_id;
3901 ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3902 if (ret) {
3903 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3904 goto out;
3907 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3908 if (ret == 0) {
3909 ath11k_warn(ar->ab,
3910 "failed to receive scan abort comple: timed out\n");
3911 ret = -ETIMEDOUT;
3912 } else if (ret > 0) {
3913 ret = 0;
3916 out:
3917 /* Scan state should be updated upon scan completion but in case
3918 * firmware fails to deliver the event (for whatever reason) it is
3919 * desired to clean up scan state anyway. Firmware may have just
3920 * dropped the scan completion event delivery due to transport pipe
3921 * being overflown with data and/or it can recover on its own before
3922 * next scan request is submitted.
3924 spin_lock_bh(&ar->data_lock);
3925 if (ar->scan.state != ATH11K_SCAN_IDLE)
3926 __ath11k_mac_scan_finish(ar);
3927 spin_unlock_bh(&ar->data_lock);
3929 return ret;
3932 static void ath11k_scan_abort(struct ath11k *ar)
3934 int ret;
3936 lockdep_assert_held(&ar->conf_mutex);
3938 spin_lock_bh(&ar->data_lock);
3940 switch (ar->scan.state) {
3941 case ATH11K_SCAN_IDLE:
3942 /* This can happen if timeout worker kicked in and called
3943 * abortion while scan completion was being processed.
3945 break;
3946 case ATH11K_SCAN_STARTING:
3947 case ATH11K_SCAN_ABORTING:
3948 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3949 ar->scan.state);
3950 break;
3951 case ATH11K_SCAN_RUNNING:
3952 ar->scan.state = ATH11K_SCAN_ABORTING;
3953 spin_unlock_bh(&ar->data_lock);
3955 ret = ath11k_scan_stop(ar);
3956 if (ret)
3957 ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3959 spin_lock_bh(&ar->data_lock);
3960 break;
3963 spin_unlock_bh(&ar->data_lock);
3966 static void ath11k_scan_timeout_work(struct work_struct *work)
3968 struct ath11k *ar = container_of(work, struct ath11k,
3969 scan.timeout.work);
3971 mutex_lock(&ar->conf_mutex);
3972 ath11k_scan_abort(ar);
3973 mutex_unlock(&ar->conf_mutex);
3976 static int ath11k_start_scan(struct ath11k *ar,
3977 struct scan_req_params *arg)
3979 int ret;
3980 unsigned long timeout = 1 * HZ;
3982 lockdep_assert_held(&ar->conf_mutex);
3984 if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3985 ath11k_spectral_reset_buffer(ar);
3987 ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3988 if (ret)
3989 return ret;
3991 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3992 timeout = 5 * HZ;
3994 if (ar->supports_6ghz)
3995 timeout += 5 * HZ;
3998 ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3999 if (ret == 0) {
4000 ret = ath11k_scan_stop(ar);
4001 if (ret)
4002 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
4004 return -ETIMEDOUT;
4007 /* If we failed to start the scan, return error code at
4008 * this point. This is probably due to some issue in the
4009 * firmware, but no need to wedge the driver due to that...
4011 spin_lock_bh(&ar->data_lock);
4012 if (ar->scan.state == ATH11K_SCAN_IDLE) {
4013 spin_unlock_bh(&ar->data_lock);
4014 return -EINVAL;
4016 spin_unlock_bh(&ar->data_lock);
4018 return 0;
4021 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
4022 struct ieee80211_vif *vif,
4023 struct ieee80211_scan_request *hw_req)
4025 struct ath11k *ar = hw->priv;
4026 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4027 struct cfg80211_scan_request *req = &hw_req->req;
4028 struct scan_req_params *arg = NULL;
4029 int ret = 0;
4030 int i;
4031 u32 scan_timeout;
4033 /* Firmwares advertising the support of triggering 11D algorithm
4034 * on the scan results of a regular scan expects driver to send
4035 * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID.
4036 * With this feature, separate 11D scan can be avoided since
4037 * regdomain can be determined with the scan results of the
4038 * regular scan.
4040 if (ar->state_11d == ATH11K_11D_PREPARING &&
4041 test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN,
4042 ar->ab->wmi_ab.svc_map))
4043 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
4045 mutex_lock(&ar->conf_mutex);
4047 spin_lock_bh(&ar->data_lock);
4048 switch (ar->scan.state) {
4049 case ATH11K_SCAN_IDLE:
4050 reinit_completion(&ar->scan.started);
4051 reinit_completion(&ar->scan.completed);
4052 ar->scan.state = ATH11K_SCAN_STARTING;
4053 ar->scan.is_roc = false;
4054 ar->scan.vdev_id = arvif->vdev_id;
4055 ret = 0;
4056 break;
4057 case ATH11K_SCAN_STARTING:
4058 case ATH11K_SCAN_RUNNING:
4059 case ATH11K_SCAN_ABORTING:
4060 ret = -EBUSY;
4061 break;
4063 spin_unlock_bh(&ar->data_lock);
4065 if (ret)
4066 goto exit;
4068 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
4070 if (!arg) {
4071 ret = -ENOMEM;
4072 goto exit;
4075 ath11k_wmi_start_scan_init(ar, arg);
4076 arg->vdev_id = arvif->vdev_id;
4077 arg->scan_id = ATH11K_SCAN_ID;
4079 if (ar->ab->hw_params.single_pdev_only)
4080 arg->scan_f_filter_prb_req = 1;
4082 if (req->ie_len) {
4083 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
4084 if (!arg->extraie.ptr) {
4085 ret = -ENOMEM;
4086 goto exit;
4088 arg->extraie.len = req->ie_len;
4091 if (req->n_ssids) {
4092 arg->num_ssids = req->n_ssids;
4093 for (i = 0; i < arg->num_ssids; i++) {
4094 arg->ssid[i].length = req->ssids[i].ssid_len;
4095 memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid,
4096 req->ssids[i].ssid_len);
4098 } else {
4099 arg->scan_f_passive = 1;
4102 if (req->n_channels) {
4103 arg->num_chan = req->n_channels;
4104 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
4105 GFP_KERNEL);
4107 if (!arg->chan_list) {
4108 ret = -ENOMEM;
4109 goto exit;
4112 for (i = 0; i < arg->num_chan; i++) {
4113 if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
4114 ar->ab->wmi_ab.svc_map)) {
4115 arg->chan_list[i] =
4116 u32_encode_bits(req->channels[i]->center_freq,
4117 WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
4119 /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
4120 * flags, then scan all PSC channels in 6 GHz band and
4121 * those non-PSC channels where RNR IE is found during
4122 * the legacy 2.4/5 GHz scan.
4123 * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
4124 * then all channels in 6 GHz will be scanned.
4126 if (req->channels[i]->band == NL80211_BAND_6GHZ &&
4127 req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
4128 !cfg80211_channel_is_psc(req->channels[i]))
4129 arg->chan_list[i] |=
4130 WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
4131 } else {
4132 arg->chan_list[i] = req->channels[i]->center_freq;
4137 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
4138 arg->scan_f_add_spoofed_mac_in_probe = 1;
4139 ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
4140 ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
4143 /* if duration is set, default dwell times will be overwritten */
4144 if (req->duration) {
4145 arg->dwell_time_active = req->duration;
4146 arg->dwell_time_active_2g = req->duration;
4147 arg->dwell_time_active_6g = req->duration;
4148 arg->dwell_time_passive = req->duration;
4149 arg->dwell_time_passive_6g = req->duration;
4150 arg->burst_duration = req->duration;
4152 scan_timeout = min_t(u32, arg->max_rest_time *
4153 (arg->num_chan - 1) + (req->duration +
4154 ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
4155 arg->num_chan, arg->max_scan_time);
4156 } else {
4157 scan_timeout = arg->max_scan_time;
4160 /* Add a margin to account for event/command processing */
4161 scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
4163 ret = ath11k_start_scan(ar, arg);
4164 if (ret) {
4165 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
4166 spin_lock_bh(&ar->data_lock);
4167 ar->scan.state = ATH11K_SCAN_IDLE;
4168 spin_unlock_bh(&ar->data_lock);
4171 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4172 msecs_to_jiffies(scan_timeout));
4174 exit:
4175 if (arg) {
4176 kfree(arg->chan_list);
4177 kfree(arg->extraie.ptr);
4178 kfree(arg);
4181 mutex_unlock(&ar->conf_mutex);
4183 if (ar->state_11d == ATH11K_11D_PREPARING)
4184 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
4186 return ret;
4189 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
4190 struct ieee80211_vif *vif)
4192 struct ath11k *ar = hw->priv;
4194 mutex_lock(&ar->conf_mutex);
4195 ath11k_scan_abort(ar);
4196 mutex_unlock(&ar->conf_mutex);
4198 cancel_delayed_work_sync(&ar->scan.timeout);
4201 static int ath11k_install_key(struct ath11k_vif *arvif,
4202 struct ieee80211_key_conf *key,
4203 enum set_key_cmd cmd,
4204 const u8 *macaddr, u32 flags)
4206 int ret;
4207 struct ath11k *ar = arvif->ar;
4208 struct wmi_vdev_install_key_arg arg = {
4209 .vdev_id = arvif->vdev_id,
4210 .key_idx = key->keyidx,
4211 .key_len = key->keylen,
4212 .key_data = key->key,
4213 .key_flags = flags,
4214 .macaddr = macaddr,
4217 lockdep_assert_held(&arvif->ar->conf_mutex);
4219 reinit_completion(&ar->install_key_done);
4221 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4222 return 0;
4224 if (cmd == DISABLE_KEY) {
4225 arg.key_cipher = WMI_CIPHER_NONE;
4226 arg.key_data = NULL;
4227 goto install;
4230 switch (key->cipher) {
4231 case WLAN_CIPHER_SUITE_CCMP:
4232 case WLAN_CIPHER_SUITE_CCMP_256:
4233 arg.key_cipher = WMI_CIPHER_AES_CCM;
4234 /* TODO: Re-check if flag is valid */
4235 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
4236 break;
4237 case WLAN_CIPHER_SUITE_TKIP:
4238 arg.key_cipher = WMI_CIPHER_TKIP;
4239 arg.key_txmic_len = 8;
4240 arg.key_rxmic_len = 8;
4241 break;
4242 case WLAN_CIPHER_SUITE_GCMP:
4243 case WLAN_CIPHER_SUITE_GCMP_256:
4244 arg.key_cipher = WMI_CIPHER_AES_GCM;
4245 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
4246 break;
4247 default:
4248 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
4249 return -EOPNOTSUPP;
4252 if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
4253 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
4254 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
4256 install:
4257 ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
4259 if (ret)
4260 return ret;
4262 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
4263 return -ETIMEDOUT;
4265 return ar->install_key_status ? -EINVAL : 0;
4268 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
4269 const u8 *addr)
4271 struct ath11k *ar = arvif->ar;
4272 struct ath11k_base *ab = ar->ab;
4273 struct ath11k_peer *peer;
4274 int first_errno = 0;
4275 int ret;
4276 int i;
4277 u32 flags = 0;
4279 lockdep_assert_held(&ar->conf_mutex);
4281 spin_lock_bh(&ab->base_lock);
4282 peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
4283 spin_unlock_bh(&ab->base_lock);
4285 if (!peer)
4286 return -ENOENT;
4288 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
4289 if (!peer->keys[i])
4290 continue;
4292 /* key flags are not required to delete the key */
4293 ret = ath11k_install_key(arvif, peer->keys[i],
4294 DISABLE_KEY, addr, flags);
4295 if (ret < 0 && first_errno == 0)
4296 first_errno = ret;
4298 if (ret < 0)
4299 ath11k_warn(ab, "failed to remove peer key %d: %d\n",
4300 i, ret);
4302 spin_lock_bh(&ab->base_lock);
4303 peer->keys[i] = NULL;
4304 spin_unlock_bh(&ab->base_lock);
4307 return first_errno;
4310 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4311 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4312 struct ieee80211_key_conf *key)
4314 struct ath11k *ar = hw->priv;
4315 struct ath11k_base *ab = ar->ab;
4316 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4317 struct ath11k_peer *peer;
4318 struct ath11k_sta *arsta;
4319 const u8 *peer_addr;
4320 int ret = 0;
4321 u32 flags = 0;
4323 /* BIP needs to be done in software */
4324 if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
4325 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
4326 key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
4327 key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
4328 return 1;
4330 if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4331 return 1;
4333 if (key->keyidx > WMI_MAX_KEY_INDEX)
4334 return -ENOSPC;
4336 mutex_lock(&ar->conf_mutex);
4338 if (sta)
4339 peer_addr = sta->addr;
4340 else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4341 peer_addr = vif->bss_conf.bssid;
4342 else
4343 peer_addr = vif->addr;
4345 key->hw_key_idx = key->keyidx;
4347 /* the peer should not disappear in mid-way (unless FW goes awry) since
4348 * we already hold conf_mutex. we just make sure its there now.
4350 spin_lock_bh(&ab->base_lock);
4351 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4353 /* flush the fragments cache during key (re)install to
4354 * ensure all frags in the new frag list belong to the same key.
4356 if (peer && sta && cmd == SET_KEY)
4357 ath11k_peer_frags_flush(ar, peer);
4358 spin_unlock_bh(&ab->base_lock);
4360 if (!peer) {
4361 if (cmd == SET_KEY) {
4362 ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
4363 peer_addr);
4364 ret = -EOPNOTSUPP;
4365 goto exit;
4366 } else {
4367 /* if the peer doesn't exist there is no key to disable
4368 * anymore
4370 goto exit;
4374 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4375 flags |= WMI_KEY_PAIRWISE;
4376 else
4377 flags |= WMI_KEY_GROUP;
4379 ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
4380 if (ret) {
4381 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
4382 goto exit;
4385 ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
4386 if (ret) {
4387 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
4388 goto exit;
4391 spin_lock_bh(&ab->base_lock);
4392 peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4393 if (peer && cmd == SET_KEY) {
4394 peer->keys[key->keyidx] = key;
4395 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4396 peer->ucast_keyidx = key->keyidx;
4397 peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
4398 } else {
4399 peer->mcast_keyidx = key->keyidx;
4400 peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
4402 } else if (peer && cmd == DISABLE_KEY) {
4403 peer->keys[key->keyidx] = NULL;
4404 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4405 peer->ucast_keyidx = 0;
4406 else
4407 peer->mcast_keyidx = 0;
4408 } else if (!peer)
4409 /* impossible unless FW goes crazy */
4410 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
4412 if (sta) {
4413 arsta = ath11k_sta_to_arsta(sta);
4415 switch (key->cipher) {
4416 case WLAN_CIPHER_SUITE_TKIP:
4417 case WLAN_CIPHER_SUITE_CCMP:
4418 case WLAN_CIPHER_SUITE_CCMP_256:
4419 case WLAN_CIPHER_SUITE_GCMP:
4420 case WLAN_CIPHER_SUITE_GCMP_256:
4421 if (cmd == SET_KEY)
4422 arsta->pn_type = HAL_PN_TYPE_WPA;
4423 else
4424 arsta->pn_type = HAL_PN_TYPE_NONE;
4425 break;
4426 default:
4427 arsta->pn_type = HAL_PN_TYPE_NONE;
4428 break;
4432 spin_unlock_bh(&ab->base_lock);
4434 exit:
4435 mutex_unlock(&ar->conf_mutex);
4436 return ret;
4439 static int
4440 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
4441 enum nl80211_band band,
4442 const struct cfg80211_bitrate_mask *mask)
4444 int num_rates = 0;
4445 int i;
4447 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
4448 num_rates += hweight8(mask->control[band].ht_mcs[i]);
4450 return num_rates;
4453 static int
4454 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
4455 enum nl80211_band band,
4456 const struct cfg80211_bitrate_mask *mask)
4458 int num_rates = 0;
4459 int i;
4461 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
4462 num_rates += hweight16(mask->control[band].vht_mcs[i]);
4464 return num_rates;
4467 static int
4468 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
4469 enum nl80211_band band,
4470 const struct cfg80211_bitrate_mask *mask)
4472 int num_rates = 0;
4473 int i;
4475 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
4476 num_rates += hweight16(mask->control[band].he_mcs[i]);
4478 return num_rates;
4481 static int
4482 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
4483 struct ieee80211_sta *sta,
4484 const struct cfg80211_bitrate_mask *mask,
4485 enum nl80211_band band)
4487 struct ath11k *ar = arvif->ar;
4488 u8 vht_rate, nss;
4489 u32 rate_code;
4490 int ret, i;
4492 lockdep_assert_held(&ar->conf_mutex);
4494 nss = 0;
4496 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
4497 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4498 nss = i + 1;
4499 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4503 if (!nss) {
4504 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4505 sta->addr);
4506 return -EINVAL;
4509 /* Avoid updating invalid nss as fixed rate*/
4510 if (nss > sta->deflink.rx_nss)
4511 return -EINVAL;
4513 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4514 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4515 sta->addr);
4517 rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4518 WMI_RATE_PREAMBLE_VHT);
4519 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4520 arvif->vdev_id,
4521 WMI_PEER_PARAM_FIXED_RATE,
4522 rate_code);
4523 if (ret)
4524 ath11k_warn(ar->ab,
4525 "failed to update STA %pM Fixed Rate %d: %d\n",
4526 sta->addr, rate_code, ret);
4528 return ret;
4531 static int
4532 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4533 struct ieee80211_sta *sta,
4534 const struct cfg80211_bitrate_mask *mask,
4535 enum nl80211_band band)
4537 struct ath11k *ar = arvif->ar;
4538 u8 he_rate, nss;
4539 u32 rate_code;
4540 int ret, i;
4542 lockdep_assert_held(&ar->conf_mutex);
4544 nss = 0;
4546 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4547 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4548 nss = i + 1;
4549 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4553 if (!nss) {
4554 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4555 sta->addr);
4556 return -EINVAL;
4559 /* Avoid updating invalid nss as fixed rate */
4560 if (nss > sta->deflink.rx_nss)
4561 return -EINVAL;
4563 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4564 "setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4565 sta->addr);
4567 rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4568 WMI_RATE_PREAMBLE_HE);
4570 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4571 arvif->vdev_id,
4572 WMI_PEER_PARAM_FIXED_RATE,
4573 rate_code);
4574 if (ret)
4575 ath11k_warn(ar->ab,
4576 "failed to update sta %pM fixed rate %d: %d\n",
4577 sta->addr, rate_code, ret);
4579 return ret;
4582 static int
4583 ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif,
4584 struct ieee80211_sta *sta,
4585 const struct cfg80211_bitrate_mask *mask,
4586 enum nl80211_band band)
4588 struct ath11k *ar = arvif->ar;
4589 u8 ht_rate, nss = 0;
4590 u32 rate_code;
4591 int ret, i;
4593 lockdep_assert_held(&ar->conf_mutex);
4595 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
4596 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
4597 nss = i + 1;
4598 ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4602 if (!nss) {
4603 ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM",
4604 sta->addr);
4605 return -EINVAL;
4608 /* Avoid updating invalid nss as fixed rate*/
4609 if (nss > sta->deflink.rx_nss)
4610 return -EINVAL;
4612 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4613 "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates",
4614 sta->addr);
4616 rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1,
4617 WMI_RATE_PREAMBLE_HT);
4618 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4619 arvif->vdev_id,
4620 WMI_PEER_PARAM_FIXED_RATE,
4621 rate_code);
4622 if (ret)
4623 ath11k_warn(ar->ab,
4624 "failed to update STA %pM HT Fixed Rate %d: %d\n",
4625 sta->addr, rate_code, ret);
4627 return ret;
4630 static int ath11k_station_assoc(struct ath11k *ar,
4631 struct ieee80211_vif *vif,
4632 struct ieee80211_sta *sta,
4633 bool reassoc)
4635 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4636 struct peer_assoc_params peer_arg;
4637 int ret = 0;
4638 struct cfg80211_chan_def def;
4639 enum nl80211_band band;
4640 struct cfg80211_bitrate_mask *mask;
4641 u8 num_ht_rates, num_vht_rates, num_he_rates;
4643 lockdep_assert_held(&ar->conf_mutex);
4645 if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4646 return -EPERM;
4648 band = def.chan->band;
4649 mask = &arvif->bitrate_mask;
4651 ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4653 peer_arg.is_assoc = true;
4654 ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4655 if (ret) {
4656 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4657 sta->addr, arvif->vdev_id, ret);
4658 return ret;
4661 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4662 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4663 sta->addr, arvif->vdev_id);
4664 return -ETIMEDOUT;
4667 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4668 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4669 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask);
4671 /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4672 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4673 * fixed param.
4674 * Note that all other rates and NSS will be disabled for this peer.
4676 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4677 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4678 band);
4679 if (ret)
4680 return ret;
4681 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4682 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4683 band);
4684 if (ret)
4685 return ret;
4686 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4687 ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4688 band);
4689 if (ret)
4690 return ret;
4693 /* Re-assoc is run only to update supported rates for given station. It
4694 * doesn't make much sense to reconfigure the peer completely.
4696 if (reassoc)
4697 return 0;
4699 ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4700 &sta->deflink.ht_cap,
4701 le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4702 if (ret) {
4703 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4704 arvif->vdev_id, ret);
4705 return ret;
4708 if (!sta->wme) {
4709 arvif->num_legacy_stations++;
4710 ret = ath11k_recalc_rtscts_prot(arvif);
4711 if (ret)
4712 return ret;
4715 if (sta->wme && sta->uapsd_queues) {
4716 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4717 if (ret) {
4718 ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4719 sta->addr, arvif->vdev_id, ret);
4720 return ret;
4724 return 0;
4727 static int ath11k_station_disassoc(struct ath11k *ar,
4728 struct ieee80211_vif *vif,
4729 struct ieee80211_sta *sta)
4731 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4732 int ret = 0;
4734 lockdep_assert_held(&ar->conf_mutex);
4736 if (!sta->wme) {
4737 arvif->num_legacy_stations--;
4738 ret = ath11k_recalc_rtscts_prot(arvif);
4739 if (ret)
4740 return ret;
4743 ret = ath11k_clear_peer_keys(arvif, sta->addr);
4744 if (ret) {
4745 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4746 arvif->vdev_id, ret);
4747 return ret;
4749 return 0;
4752 static u32 ath11k_mac_max_nss(const u8 *ht_mcs_mask, const u16 *vht_mcs_mask,
4753 const u16 *he_mcs_mask)
4755 return max3(ath11k_mac_max_ht_nss(ht_mcs_mask),
4756 ath11k_mac_max_vht_nss(vht_mcs_mask),
4757 ath11k_mac_max_he_nss(he_mcs_mask));
4760 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4762 struct ath11k *ar;
4763 struct ath11k_vif *arvif;
4764 struct ath11k_sta *arsta;
4765 struct ieee80211_sta *sta;
4766 struct cfg80211_chan_def def;
4767 enum nl80211_band band;
4768 const u8 *ht_mcs_mask;
4769 const u16 *vht_mcs_mask;
4770 const u16 *he_mcs_mask;
4771 u32 changed, bw, nss, smps, bw_prev;
4772 int err, num_ht_rates, num_vht_rates, num_he_rates;
4773 const struct cfg80211_bitrate_mask *mask;
4774 struct peer_assoc_params peer_arg;
4775 enum wmi_phy_mode peer_phymode;
4777 arsta = container_of(wk, struct ath11k_sta, update_wk);
4778 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4779 arvif = arsta->arvif;
4780 ar = arvif->ar;
4782 if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4783 return;
4785 band = def.chan->band;
4786 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4787 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4788 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4790 spin_lock_bh(&ar->data_lock);
4792 changed = arsta->changed;
4793 arsta->changed = 0;
4795 bw = arsta->bw;
4796 bw_prev = arsta->bw_prev;
4797 nss = arsta->nss;
4798 smps = arsta->smps;
4800 spin_unlock_bh(&ar->data_lock);
4802 mutex_lock(&ar->conf_mutex);
4804 nss = max_t(u32, 1, nss);
4805 nss = min(nss, ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
4807 if (changed & IEEE80211_RC_BW_CHANGED) {
4808 /* Get the peer phymode */
4809 ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
4810 peer_phymode = peer_arg.peer_phymode;
4812 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n",
4813 sta->addr, bw, peer_phymode);
4815 if (bw > bw_prev) {
4816 /* BW is upgraded. In this case we send WMI_PEER_PHYMODE
4817 * followed by WMI_PEER_CHWIDTH
4819 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n",
4820 sta->addr, bw, bw_prev);
4822 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4823 WMI_PEER_PHYMODE, peer_phymode);
4825 if (err) {
4826 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4827 sta->addr, peer_phymode, err);
4828 goto err_rc_bw_changed;
4831 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4832 WMI_PEER_CHWIDTH, bw);
4834 if (err)
4835 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4836 sta->addr, bw, err);
4837 } else {
4838 /* BW is downgraded. In this case we send WMI_PEER_CHWIDTH
4839 * followed by WMI_PEER_PHYMODE
4841 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n",
4842 sta->addr, bw, bw_prev);
4844 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4845 WMI_PEER_CHWIDTH, bw);
4847 if (err) {
4848 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4849 sta->addr, bw, err);
4850 goto err_rc_bw_changed;
4853 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4854 WMI_PEER_PHYMODE, peer_phymode);
4856 if (err)
4857 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4858 sta->addr, peer_phymode, err);
4862 if (changed & IEEE80211_RC_NSS_CHANGED) {
4863 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n",
4864 sta->addr, nss);
4866 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4867 WMI_PEER_NSS, nss);
4868 if (err)
4869 ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4870 sta->addr, nss, err);
4873 if (changed & IEEE80211_RC_SMPS_CHANGED) {
4874 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n",
4875 sta->addr, smps);
4877 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4878 WMI_PEER_MIMO_PS_STATE, smps);
4879 if (err)
4880 ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4881 sta->addr, smps, err);
4884 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4885 mask = &arvif->bitrate_mask;
4886 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band,
4887 mask);
4888 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4889 mask);
4890 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4891 mask);
4893 /* Peer_assoc_prepare will reject vht rates in
4894 * bitrate_mask if its not available in range format and
4895 * sets vht tx_rateset as unsupported. So multiple VHT MCS
4896 * setting(eg. MCS 4,5,6) per peer is not supported here.
4897 * But, Single rate in VHT mask can be set as per-peer
4898 * fixed rate. But even if any HT rates are configured in
4899 * the bitrate mask, device will not switch to those rates
4900 * when per-peer Fixed rate is set.
4901 * TODO: Check RATEMASK_CMDID to support auto rates selection
4902 * across HT/VHT and for multiple VHT MCS support.
4904 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4905 ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4906 band);
4907 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4908 ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4909 band);
4910 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4911 ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4912 band);
4913 } else {
4914 /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4915 * is provided in the new bitrate mask we set the
4916 * other rates using peer_assoc command. Also clear
4917 * the peer fixed rate settings as it has higher proprity
4918 * than peer assoc
4920 err = ath11k_wmi_set_peer_param(ar, sta->addr,
4921 arvif->vdev_id,
4922 WMI_PEER_PARAM_FIXED_RATE,
4923 WMI_FIXED_RATE_NONE);
4924 if (err)
4925 ath11k_warn(ar->ab,
4926 "failed to disable peer fixed rate for sta %pM: %d\n",
4927 sta->addr, err);
4929 ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4930 &peer_arg, true);
4932 peer_arg.is_assoc = false;
4933 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4934 if (err)
4935 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4936 sta->addr, arvif->vdev_id, err);
4938 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4939 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4940 sta->addr, arvif->vdev_id);
4944 err_rc_bw_changed:
4945 mutex_unlock(&ar->conf_mutex);
4948 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4950 struct ath11k *ar;
4951 struct ath11k_vif *arvif;
4952 struct ath11k_sta *arsta;
4953 struct ieee80211_sta *sta;
4954 int ret = 0;
4956 arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4957 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4958 arvif = arsta->arvif;
4959 ar = arvif->ar;
4961 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4962 "setting USE_4ADDR for peer %pM\n", sta->addr);
4964 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4965 arvif->vdev_id,
4966 WMI_PEER_USE_4ADDR, 1);
4968 if (ret)
4969 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4970 sta->addr, ret);
4973 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4974 struct ieee80211_sta *sta)
4976 struct ath11k *ar = arvif->ar;
4978 lockdep_assert_held(&ar->conf_mutex);
4980 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4981 return 0;
4983 if (ar->num_stations >= ar->max_num_stations)
4984 return -ENOBUFS;
4986 ar->num_stations++;
4988 return 0;
4991 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4992 struct ieee80211_sta *sta)
4994 struct ath11k *ar = arvif->ar;
4996 lockdep_assert_held(&ar->conf_mutex);
4998 if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4999 return;
5001 ar->num_stations--;
5004 static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,
5005 struct ieee80211_sta *sta)
5007 u32 bw = WMI_PEER_CHWIDTH_20MHZ;
5009 switch (sta->deflink.bandwidth) {
5010 case IEEE80211_STA_RX_BW_20:
5011 bw = WMI_PEER_CHWIDTH_20MHZ;
5012 break;
5013 case IEEE80211_STA_RX_BW_40:
5014 bw = WMI_PEER_CHWIDTH_40MHZ;
5015 break;
5016 case IEEE80211_STA_RX_BW_80:
5017 bw = WMI_PEER_CHWIDTH_80MHZ;
5018 break;
5019 case IEEE80211_STA_RX_BW_160:
5020 bw = WMI_PEER_CHWIDTH_160MHZ;
5021 break;
5022 default:
5023 ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n",
5024 sta->deflink.bandwidth, sta->addr);
5025 bw = WMI_PEER_CHWIDTH_20MHZ;
5026 break;
5029 return bw;
5032 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
5033 struct ieee80211_vif *vif,
5034 struct ieee80211_sta *sta)
5036 struct ath11k *ar = hw->priv;
5037 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5038 int ret = 0;
5039 s16 txpwr;
5041 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
5042 txpwr = 0;
5043 } else {
5044 txpwr = sta->deflink.txpwr.power;
5045 if (!txpwr)
5046 return -EINVAL;
5049 if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
5050 return -EINVAL;
5052 mutex_lock(&ar->conf_mutex);
5054 ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
5055 WMI_PEER_USE_FIXED_PWR, txpwr);
5056 if (ret) {
5057 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
5058 ret);
5059 goto out;
5062 out:
5063 mutex_unlock(&ar->conf_mutex);
5064 return ret;
5067 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
5068 struct ieee80211_vif *vif,
5069 struct ieee80211_sta *sta, bool enabled)
5071 struct ath11k *ar = hw->priv;
5072 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5074 if (enabled && !arsta->use_4addr_set) {
5075 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
5076 arsta->use_4addr_set = true;
5080 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
5081 struct ieee80211_vif *vif,
5082 struct ieee80211_link_sta *link_sta,
5083 u32 changed)
5085 struct ieee80211_sta *sta = link_sta->sta;
5086 struct ath11k *ar = hw->priv;
5087 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5088 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5089 struct ath11k_peer *peer;
5090 u32 bw, smps;
5092 spin_lock_bh(&ar->ab->base_lock);
5094 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5095 if (!peer) {
5096 spin_unlock_bh(&ar->ab->base_lock);
5097 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
5098 sta->addr, arvif->vdev_id);
5099 return;
5102 spin_unlock_bh(&ar->ab->base_lock);
5104 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5105 "sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
5106 sta->addr, changed, sta->deflink.bandwidth,
5107 sta->deflink.rx_nss,
5108 sta->deflink.smps_mode);
5110 spin_lock_bh(&ar->data_lock);
5112 if (changed & IEEE80211_RC_BW_CHANGED) {
5113 bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5114 arsta->bw_prev = arsta->bw;
5115 arsta->bw = bw;
5118 if (changed & IEEE80211_RC_NSS_CHANGED)
5119 arsta->nss = sta->deflink.rx_nss;
5121 if (changed & IEEE80211_RC_SMPS_CHANGED) {
5122 smps = WMI_PEER_SMPS_PS_NONE;
5124 switch (sta->deflink.smps_mode) {
5125 case IEEE80211_SMPS_AUTOMATIC:
5126 case IEEE80211_SMPS_OFF:
5127 smps = WMI_PEER_SMPS_PS_NONE;
5128 break;
5129 case IEEE80211_SMPS_STATIC:
5130 smps = WMI_PEER_SMPS_STATIC;
5131 break;
5132 case IEEE80211_SMPS_DYNAMIC:
5133 smps = WMI_PEER_SMPS_DYNAMIC;
5134 break;
5135 default:
5136 ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
5137 sta->deflink.smps_mode, sta->addr);
5138 smps = WMI_PEER_SMPS_PS_NONE;
5139 break;
5142 arsta->smps = smps;
5145 arsta->changed |= changed;
5147 spin_unlock_bh(&ar->data_lock);
5149 ieee80211_queue_work(hw, &arsta->update_wk);
5152 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
5153 u16 ac, bool enable)
5155 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5156 u32 value = 0;
5157 int ret = 0;
5159 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5160 return 0;
5162 switch (ac) {
5163 case IEEE80211_AC_VO:
5164 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5165 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
5166 break;
5167 case IEEE80211_AC_VI:
5168 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5169 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
5170 break;
5171 case IEEE80211_AC_BE:
5172 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5173 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
5174 break;
5175 case IEEE80211_AC_BK:
5176 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5177 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
5178 break;
5181 if (enable)
5182 arvif->u.sta.uapsd |= value;
5183 else
5184 arvif->u.sta.uapsd &= ~value;
5186 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5187 WMI_STA_PS_PARAM_UAPSD,
5188 arvif->u.sta.uapsd);
5189 if (ret) {
5190 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
5191 goto exit;
5194 if (arvif->u.sta.uapsd)
5195 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5196 else
5197 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5199 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5200 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5201 value);
5202 if (ret)
5203 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
5205 exit:
5206 return ret;
5209 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
5210 struct ieee80211_vif *vif,
5211 unsigned int link_id, u16 ac,
5212 const struct ieee80211_tx_queue_params *params)
5214 struct ath11k *ar = hw->priv;
5215 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5216 struct wmi_wmm_params_arg *p = NULL;
5217 int ret;
5219 mutex_lock(&ar->conf_mutex);
5221 switch (ac) {
5222 case IEEE80211_AC_VO:
5223 p = &arvif->wmm_params.ac_vo;
5224 break;
5225 case IEEE80211_AC_VI:
5226 p = &arvif->wmm_params.ac_vi;
5227 break;
5228 case IEEE80211_AC_BE:
5229 p = &arvif->wmm_params.ac_be;
5230 break;
5231 case IEEE80211_AC_BK:
5232 p = &arvif->wmm_params.ac_bk;
5233 break;
5236 if (WARN_ON(!p)) {
5237 ret = -EINVAL;
5238 goto exit;
5241 p->cwmin = params->cw_min;
5242 p->cwmax = params->cw_max;
5243 p->aifs = params->aifs;
5244 p->txop = params->txop;
5246 ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
5247 &arvif->wmm_params);
5248 if (ret) {
5249 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
5250 goto exit;
5253 ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5255 if (ret)
5256 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
5258 exit:
5259 mutex_unlock(&ar->conf_mutex);
5260 return ret;
5263 static struct ieee80211_sta_ht_cap
5264 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
5266 int i;
5267 struct ieee80211_sta_ht_cap ht_cap = {0};
5268 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
5270 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
5271 return ht_cap;
5273 ht_cap.ht_supported = 1;
5274 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5275 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
5276 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5277 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5278 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5280 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
5281 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5283 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
5284 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5286 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
5287 u32 smps;
5289 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
5290 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5292 ht_cap.cap |= smps;
5295 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
5296 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5298 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
5299 u32 stbc;
5301 stbc = ar_ht_cap;
5302 stbc &= WMI_HT_CAP_RX_STBC;
5303 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5304 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5305 stbc &= IEEE80211_HT_CAP_RX_STBC;
5307 ht_cap.cap |= stbc;
5310 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
5311 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5313 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
5314 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5316 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5317 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5319 for (i = 0; i < ar->num_rx_chains; i++) {
5320 if (rate_cap_rx_chainmask & BIT(i))
5321 ht_cap.mcs.rx_mask[i] = 0xFF;
5324 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5326 return ht_cap;
5329 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
5331 u32 value = 0;
5332 struct ath11k *ar = arvif->ar;
5333 int nsts;
5334 int sound_dim;
5335 u32 vht_cap = ar->pdev->cap.vht_cap;
5336 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
5338 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
5339 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5340 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5341 if (nsts > (ar->num_rx_chains - 1))
5342 nsts = ar->num_rx_chains - 1;
5343 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5346 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
5347 sound_dim = vht_cap &
5348 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5349 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5350 if (sound_dim > (ar->num_tx_chains - 1))
5351 sound_dim = ar->num_tx_chains - 1;
5352 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5355 if (!value)
5356 return 0;
5358 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
5359 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5361 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
5362 arvif->vdev_type == WMI_VDEV_TYPE_AP)
5363 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
5366 /* TODO: SUBFEE not validated in HK, disable here until validated? */
5368 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
5369 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5371 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
5372 arvif->vdev_type == WMI_VDEV_TYPE_STA)
5373 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
5376 return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5377 vdev_param, value);
5380 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
5382 bool subfer, subfee;
5383 int sound_dim = 0, nsts = 0;
5385 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
5386 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5388 if (ar->num_tx_chains < 2) {
5389 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5390 subfer = false;
5393 if (ar->num_rx_chains < 2) {
5394 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
5395 subfee = false;
5398 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
5399 if (!subfer)
5400 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5402 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
5403 if (!subfee)
5404 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5406 sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5407 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5408 *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5410 nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5411 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5412 *vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5414 /* Enable Sounding Dimension Field only if SU BF is enabled */
5415 if (subfer) {
5416 if (sound_dim > (ar->num_tx_chains - 1))
5417 sound_dim = ar->num_tx_chains - 1;
5419 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5420 sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5421 *vht_cap |= sound_dim;
5424 /* Enable Beamformee STS Field only if SU BF is enabled */
5425 if (subfee) {
5426 if (nsts > (ar->num_rx_chains - 1))
5427 nsts = ar->num_rx_chains - 1;
5429 nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5430 nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5431 *vht_cap |= nsts;
5435 static struct ieee80211_sta_vht_cap
5436 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5437 u32 rate_cap_rx_chainmask)
5439 struct ieee80211_sta_vht_cap vht_cap = {0};
5440 u16 txmcs_map, rxmcs_map;
5441 int i;
5443 vht_cap.vht_supported = 1;
5444 vht_cap.cap = ar->pdev->cap.vht_cap;
5446 if (ar->pdev->cap.nss_ratio_enabled)
5447 vht_cap.vht_mcs.tx_highest |=
5448 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5450 ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5452 rxmcs_map = 0;
5453 txmcs_map = 0;
5454 for (i = 0; i < 8; i++) {
5455 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5456 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5457 else
5458 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5460 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5461 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5462 else
5463 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5466 if (rate_cap_tx_chainmask <= 1)
5467 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5469 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5470 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5472 return vht_cap;
5475 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5476 struct ath11k_pdev_cap *cap,
5477 u32 *ht_cap_info)
5479 struct ieee80211_supported_band *band;
5480 u32 rate_cap_tx_chainmask;
5481 u32 rate_cap_rx_chainmask;
5482 u32 ht_cap;
5484 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5485 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5487 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5488 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5489 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5490 if (ht_cap_info)
5491 *ht_cap_info = ht_cap;
5492 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5493 rate_cap_rx_chainmask);
5496 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5497 (ar->ab->hw_params.single_pdev_only ||
5498 !ar->supports_6ghz)) {
5499 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5500 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5501 if (ht_cap_info)
5502 *ht_cap_info = ht_cap;
5503 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5504 rate_cap_rx_chainmask);
5505 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5506 rate_cap_rx_chainmask);
5510 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5512 /* TODO: Check the request chainmask against the supported
5513 * chainmask table which is advertised in extented_service_ready event
5516 return 0;
5519 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5520 u8 *he_ppet)
5522 int nss, ru;
5523 u8 bit = 7;
5525 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5526 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5527 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5528 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5529 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5530 for (ru = 0; ru < 4; ru++) {
5531 u8 val;
5532 int i;
5534 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5535 continue;
5536 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5537 0x3f;
5538 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5539 for (i = 5; i >= 0; i--) {
5540 he_ppet[bit / 8] |=
5541 ((val >> i) & 0x1) << ((bit % 8));
5542 bit++;
5548 static void
5549 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5551 u8 m;
5553 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5554 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5555 he_cap_elem->mac_cap_info[0] &= ~m;
5557 m = IEEE80211_HE_MAC_CAP2_TRS |
5558 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5559 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5560 he_cap_elem->mac_cap_info[2] &= ~m;
5562 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5563 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5564 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5565 he_cap_elem->mac_cap_info[3] &= ~m;
5567 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5568 IEEE80211_HE_MAC_CAP4_BQR;
5569 he_cap_elem->mac_cap_info[4] &= ~m;
5571 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5572 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5573 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5574 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5575 he_cap_elem->mac_cap_info[5] &= ~m;
5577 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5578 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5579 he_cap_elem->phy_cap_info[2] &= ~m;
5581 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5582 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5583 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5584 he_cap_elem->phy_cap_info[3] &= ~m;
5586 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5587 he_cap_elem->phy_cap_info[4] &= ~m;
5589 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5590 he_cap_elem->phy_cap_info[5] &= ~m;
5592 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5593 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5594 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5595 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5596 he_cap_elem->phy_cap_info[6] &= ~m;
5598 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5599 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5600 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5601 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5602 he_cap_elem->phy_cap_info[7] &= ~m;
5604 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5605 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5606 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5607 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5608 he_cap_elem->phy_cap_info[8] &= ~m;
5610 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5611 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5612 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5613 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5614 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5615 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5616 he_cap_elem->phy_cap_info[9] &= ~m;
5619 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5620 struct ath11k_band_cap *bcap)
5622 u8 val;
5624 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5625 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5626 bcap->he_6ghz_capa |=
5627 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5628 WLAN_HT_CAP_SM_PS_DYNAMIC);
5629 else
5630 bcap->he_6ghz_capa |=
5631 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5632 WLAN_HT_CAP_SM_PS_DISABLED);
5633 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5634 pcap->vht_cap);
5635 bcap->he_6ghz_capa |=
5636 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5637 val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5638 bcap->he_6ghz_capa |=
5639 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5640 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5641 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5642 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5643 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5645 return cpu_to_le16(bcap->he_6ghz_capa);
5648 static void ath11k_mac_set_hemcsmap(struct ath11k *ar,
5649 struct ath11k_pdev_cap *cap,
5650 struct ieee80211_sta_he_cap *he_cap,
5651 int band)
5653 u16 txmcs_map, rxmcs_map;
5654 u32 i;
5656 rxmcs_map = 0;
5657 txmcs_map = 0;
5658 for (i = 0; i < 8; i++) {
5659 if (i < ar->num_tx_chains &&
5660 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5661 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5662 else
5663 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5665 if (i < ar->num_rx_chains &&
5666 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5667 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5668 else
5669 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5671 he_cap->he_mcs_nss_supp.rx_mcs_80 =
5672 cpu_to_le16(rxmcs_map & 0xffff);
5673 he_cap->he_mcs_nss_supp.tx_mcs_80 =
5674 cpu_to_le16(txmcs_map & 0xffff);
5675 he_cap->he_mcs_nss_supp.rx_mcs_160 =
5676 cpu_to_le16(rxmcs_map & 0xffff);
5677 he_cap->he_mcs_nss_supp.tx_mcs_160 =
5678 cpu_to_le16(txmcs_map & 0xffff);
5679 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5680 cpu_to_le16(rxmcs_map & 0xffff);
5681 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5682 cpu_to_le16(txmcs_map & 0xffff);
5685 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5686 struct ath11k_pdev_cap *cap,
5687 struct ieee80211_sband_iftype_data *data,
5688 int band)
5690 int i, idx = 0;
5692 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5693 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5694 struct ath11k_band_cap *band_cap = &cap->band[band];
5695 struct ieee80211_he_cap_elem *he_cap_elem =
5696 &he_cap->he_cap_elem;
5698 switch (i) {
5699 case NL80211_IFTYPE_STATION:
5700 case NL80211_IFTYPE_AP:
5701 case NL80211_IFTYPE_MESH_POINT:
5702 break;
5704 default:
5705 continue;
5708 data[idx].types_mask = BIT(i);
5709 he_cap->has_he = true;
5710 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5711 sizeof(he_cap_elem->mac_cap_info));
5712 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5713 sizeof(he_cap_elem->phy_cap_info));
5715 he_cap_elem->mac_cap_info[1] &=
5716 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5718 he_cap_elem->phy_cap_info[5] &=
5719 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5720 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5722 switch (i) {
5723 case NL80211_IFTYPE_AP:
5724 he_cap_elem->phy_cap_info[3] &=
5725 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5726 he_cap_elem->phy_cap_info[9] |=
5727 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5728 break;
5729 case NL80211_IFTYPE_STATION:
5730 he_cap_elem->mac_cap_info[0] &=
5731 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5732 he_cap_elem->mac_cap_info[0] |=
5733 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5734 he_cap_elem->phy_cap_info[9] |=
5735 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5736 break;
5737 case NL80211_IFTYPE_MESH_POINT:
5738 ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5739 break;
5742 ath11k_mac_set_hemcsmap(ar, cap, he_cap, band);
5744 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5745 if (he_cap_elem->phy_cap_info[6] &
5746 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5747 ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5748 he_cap->ppe_thres);
5750 if (band == NL80211_BAND_6GHZ) {
5751 data[idx].he_6ghz_capa.capa =
5752 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5754 idx++;
5757 return idx;
5760 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5761 struct ath11k_pdev_cap *cap)
5763 struct ieee80211_supported_band *band;
5764 int count;
5766 if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5767 count = ath11k_mac_copy_he_cap(ar, cap,
5768 ar->mac.iftype[NL80211_BAND_2GHZ],
5769 NL80211_BAND_2GHZ);
5770 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5771 _ieee80211_set_sband_iftype_data(band,
5772 ar->mac.iftype[NL80211_BAND_2GHZ],
5773 count);
5776 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5777 count = ath11k_mac_copy_he_cap(ar, cap,
5778 ar->mac.iftype[NL80211_BAND_5GHZ],
5779 NL80211_BAND_5GHZ);
5780 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5781 _ieee80211_set_sband_iftype_data(band,
5782 ar->mac.iftype[NL80211_BAND_5GHZ],
5783 count);
5786 if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5787 ar->supports_6ghz) {
5788 count = ath11k_mac_copy_he_cap(ar, cap,
5789 ar->mac.iftype[NL80211_BAND_6GHZ],
5790 NL80211_BAND_6GHZ);
5791 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5792 _ieee80211_set_sband_iftype_data(band,
5793 ar->mac.iftype[NL80211_BAND_6GHZ],
5794 count);
5798 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5800 int ret;
5802 lockdep_assert_held(&ar->conf_mutex);
5804 if (ath11k_check_chain_mask(ar, tx_ant, true))
5805 return -EINVAL;
5807 if (ath11k_check_chain_mask(ar, rx_ant, false))
5808 return -EINVAL;
5810 ar->cfg_tx_chainmask = tx_ant;
5811 ar->cfg_rx_chainmask = rx_ant;
5813 if (ar->state != ATH11K_STATE_ON &&
5814 ar->state != ATH11K_STATE_RESTARTED)
5815 return 0;
5817 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5818 tx_ant, ar->pdev->pdev_id);
5819 if (ret) {
5820 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5821 ret, tx_ant);
5822 return ret;
5825 ar->num_tx_chains = get_num_chains(tx_ant);
5827 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5828 rx_ant, ar->pdev->pdev_id);
5829 if (ret) {
5830 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5831 ret, rx_ant);
5832 return ret;
5835 ar->num_rx_chains = get_num_chains(rx_ant);
5837 /* Reload HT/VHT/HE capability */
5838 ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5839 ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5841 return 0;
5844 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5846 int num_mgmt;
5848 ieee80211_free_txskb(ar->hw, skb);
5850 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5852 if (num_mgmt < 0)
5853 WARN_ON_ONCE(1);
5855 if (!num_mgmt)
5856 wake_up(&ar->txmgmt_empty_waitq);
5859 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5861 struct sk_buff *msdu;
5862 struct ieee80211_tx_info *info;
5864 spin_lock_bh(&ar->txmgmt_idr_lock);
5865 msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5866 spin_unlock_bh(&ar->txmgmt_idr_lock);
5868 if (!msdu)
5869 return;
5871 dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5872 DMA_TO_DEVICE);
5874 info = IEEE80211_SKB_CB(msdu);
5875 memset(&info->status, 0, sizeof(info->status));
5877 ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5880 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5882 struct ath11k *ar = ctx;
5884 ath11k_mac_tx_mgmt_free(ar, buf_id);
5886 return 0;
5889 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5891 struct ieee80211_vif *vif = ctx;
5892 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5893 struct ath11k *ar = skb_cb->ar;
5895 if (skb_cb->vif == vif)
5896 ath11k_mac_tx_mgmt_free(ar, buf_id);
5898 return 0;
5901 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5902 struct sk_buff *skb)
5904 struct ath11k_base *ab = ar->ab;
5905 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5906 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5907 struct ieee80211_tx_info *info;
5908 enum hal_encrypt_type enctype;
5909 unsigned int mic_len;
5910 dma_addr_t paddr;
5911 int buf_id;
5912 int ret;
5914 ATH11K_SKB_CB(skb)->ar = ar;
5916 spin_lock_bh(&ar->txmgmt_idr_lock);
5917 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5918 ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5919 spin_unlock_bh(&ar->txmgmt_idr_lock);
5921 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5922 "tx mgmt frame, buf id %d\n", buf_id);
5924 if (buf_id < 0)
5925 return -ENOSPC;
5927 info = IEEE80211_SKB_CB(skb);
5928 if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5929 if ((ieee80211_is_action(hdr->frame_control) ||
5930 ieee80211_is_deauth(hdr->frame_control) ||
5931 ieee80211_is_disassoc(hdr->frame_control)) &&
5932 ieee80211_has_protected(hdr->frame_control)) {
5933 if (!(skb_cb->flags & ATH11K_SKB_CIPHER_SET))
5934 ath11k_warn(ab, "WMI management tx frame without ATH11K_SKB_CIPHER_SET");
5936 enctype = ath11k_dp_tx_get_encrypt_type(skb_cb->cipher);
5937 mic_len = ath11k_dp_rx_crypto_mic_len(ar, enctype);
5938 skb_put(skb, mic_len);
5942 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5943 if (dma_mapping_error(ab->dev, paddr)) {
5944 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5945 ret = -EIO;
5946 goto err_free_idr;
5949 ATH11K_SKB_CB(skb)->paddr = paddr;
5951 ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5952 if (ret) {
5953 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5954 goto err_unmap_buf;
5957 return 0;
5959 err_unmap_buf:
5960 dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5961 skb->len, DMA_TO_DEVICE);
5962 err_free_idr:
5963 spin_lock_bh(&ar->txmgmt_idr_lock);
5964 idr_remove(&ar->txmgmt_idr, buf_id);
5965 spin_unlock_bh(&ar->txmgmt_idr_lock);
5967 return ret;
5970 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5972 struct sk_buff *skb;
5974 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5975 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5978 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5980 struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5981 struct ath11k_skb_cb *skb_cb;
5982 struct ath11k_vif *arvif;
5983 struct sk_buff *skb;
5984 int ret;
5986 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5987 skb_cb = ATH11K_SKB_CB(skb);
5988 if (!skb_cb->vif) {
5989 ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5990 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5991 continue;
5994 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5995 mutex_lock(&ar->conf_mutex);
5996 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5997 ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5998 if (ret) {
5999 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
6000 arvif->vdev_id, ret);
6001 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6002 } else {
6003 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
6004 "tx mgmt frame, vdev_id %d\n",
6005 arvif->vdev_id);
6007 } else {
6008 ath11k_warn(ar->ab,
6009 "dropping mgmt frame for vdev %d, is_started %d\n",
6010 arvif->vdev_id,
6011 arvif->is_started);
6012 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6014 mutex_unlock(&ar->conf_mutex);
6018 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
6019 bool is_prb_rsp)
6021 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
6023 if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
6024 return -ESHUTDOWN;
6026 /* Drop probe response packets when the pending management tx
6027 * count has reached a certain threshold, so as to prioritize
6028 * other mgmt packets like auth and assoc to be sent on time
6029 * for establishing successful connections.
6031 if (is_prb_rsp &&
6032 atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
6033 ath11k_warn(ar->ab,
6034 "dropping probe response as pending queue is almost full\n");
6035 return -ENOSPC;
6038 if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
6039 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
6040 return -ENOSPC;
6043 skb_queue_tail(q, skb);
6044 atomic_inc(&ar->num_pending_mgmt_tx);
6045 queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
6047 return 0;
6050 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
6051 struct ieee80211_tx_control *control,
6052 struct sk_buff *skb)
6054 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6055 struct ath11k *ar = hw->priv;
6056 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
6057 struct ieee80211_vif *vif = info->control.vif;
6058 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6059 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
6060 struct ieee80211_key_conf *key = info->control.hw_key;
6061 struct ath11k_sta *arsta = NULL;
6062 u32 info_flags = info->flags;
6063 bool is_prb_rsp;
6064 int ret;
6066 memset(skb_cb, 0, sizeof(*skb_cb));
6067 skb_cb->vif = vif;
6069 if (key) {
6070 skb_cb->cipher = key->cipher;
6071 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
6074 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
6075 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
6076 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
6077 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
6078 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
6079 if (ret) {
6080 ath11k_warn(ar->ab, "failed to queue management frame %d\n",
6081 ret);
6082 ieee80211_free_txskb(ar->hw, skb);
6084 return;
6087 if (control->sta)
6088 arsta = ath11k_sta_to_arsta(control->sta);
6090 ret = ath11k_dp_tx(ar, arvif, arsta, skb);
6091 if (unlikely(ret)) {
6092 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
6093 ieee80211_free_txskb(ar->hw, skb);
6097 void ath11k_mac_drain_tx(struct ath11k *ar)
6099 /* make sure rcu-protected mac80211 tx path itself is drained */
6100 synchronize_net();
6102 cancel_work_sync(&ar->wmi_mgmt_tx_work);
6103 ath11k_mgmt_over_wmi_tx_purge(ar);
6106 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
6108 struct htt_rx_ring_tlv_filter tlv_filter = {0};
6109 struct ath11k_base *ab = ar->ab;
6110 int i, ret = 0;
6111 u32 ring_id;
6113 if (enable) {
6114 tlv_filter = ath11k_mac_mon_status_filter_default;
6115 if (ath11k_debugfs_rx_filter(ar))
6116 tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
6119 for (i = 0; i < ab->hw_params.num_rxdma_per_pdev; i++) {
6120 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
6121 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
6122 ar->dp.mac_id + i,
6123 HAL_RXDMA_MONITOR_STATUS,
6124 DP_RX_BUFFER_SIZE,
6125 &tlv_filter);
6128 if (enable && !ar->ab->hw_params.rxdma1_enable)
6129 mod_timer(&ar->ab->mon_reap_timer, jiffies +
6130 msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
6132 return ret;
6135 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
6137 int recovery_start_count;
6139 if (!ab->is_reset)
6140 return;
6142 recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
6143 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
6145 if (recovery_start_count == ab->num_radios) {
6146 complete(&ab->recovery_start);
6147 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
6150 ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
6152 wait_for_completion_timeout(&ab->reconfigure_complete,
6153 ATH11K_RECONFIGURE_TIMEOUT_HZ);
6156 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
6158 struct ath11k *ar = hw->priv;
6159 struct ath11k_base *ab = ar->ab;
6160 struct ath11k_pdev *pdev = ar->pdev;
6161 int ret;
6163 if (ath11k_ftm_mode) {
6164 ath11k_warn(ab, "mac operations not supported in factory test mode\n");
6165 return -EOPNOTSUPP;
6168 ath11k_mac_drain_tx(ar);
6169 mutex_lock(&ar->conf_mutex);
6171 switch (ar->state) {
6172 case ATH11K_STATE_OFF:
6173 ar->state = ATH11K_STATE_ON;
6174 break;
6175 case ATH11K_STATE_RESTARTING:
6176 ar->state = ATH11K_STATE_RESTARTED;
6177 ath11k_mac_wait_reconfigure(ab);
6178 break;
6179 case ATH11K_STATE_RESTARTED:
6180 case ATH11K_STATE_WEDGED:
6181 case ATH11K_STATE_ON:
6182 case ATH11K_STATE_FTM:
6183 WARN_ON(1);
6184 ret = -EINVAL;
6185 goto err;
6188 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
6189 1, pdev->pdev_id);
6191 if (ret) {
6192 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
6193 goto err;
6196 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
6197 pdev->pdev_id);
6198 if (ret) {
6199 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
6200 goto err;
6203 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
6204 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
6205 if (ret) {
6206 ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
6207 goto err;
6211 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
6212 0, pdev->pdev_id);
6213 if (ret) {
6214 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
6215 ret);
6216 goto err;
6219 ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
6220 if (ret) {
6221 ath11k_err(ab, "failed to offload radar detection: %d\n",
6222 ret);
6223 goto err;
6226 ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
6227 HTT_PPDU_STATS_TAG_DEFAULT);
6228 if (ret) {
6229 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
6230 goto err;
6233 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
6234 1, pdev->pdev_id);
6236 if (ret) {
6237 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
6238 goto err;
6241 __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
6243 /* TODO: Do we need to enable ANI? */
6245 ath11k_reg_update_chan_list(ar, false);
6247 ar->num_started_vdevs = 0;
6248 ar->num_created_vdevs = 0;
6249 ar->num_peers = 0;
6250 ar->allocated_vdev_map = 0;
6252 /* Configure monitor status ring with default rx_filter to get rx status
6253 * such as rssi, rx_duration.
6255 ret = ath11k_mac_config_mon_status_default(ar, true);
6256 if (ret) {
6257 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
6258 ret);
6259 goto err;
6262 /* Configure the hash seed for hash based reo dest ring selection */
6263 ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
6265 /* allow device to enter IMPS */
6266 if (ab->hw_params.idle_ps) {
6267 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
6268 1, pdev->pdev_id);
6269 if (ret) {
6270 ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
6271 goto err;
6275 mutex_unlock(&ar->conf_mutex);
6277 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
6278 &ab->pdevs[ar->pdev_idx]);
6280 return 0;
6282 err:
6283 ar->state = ATH11K_STATE_OFF;
6284 mutex_unlock(&ar->conf_mutex);
6286 return ret;
6289 static void ath11k_mac_op_stop(struct ieee80211_hw *hw, bool suspend)
6291 struct ath11k *ar = hw->priv;
6292 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
6293 int ret;
6295 ath11k_mac_drain_tx(ar);
6297 mutex_lock(&ar->conf_mutex);
6298 ret = ath11k_mac_config_mon_status_default(ar, false);
6299 if (ret)
6300 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
6301 ret);
6303 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6304 ar->state = ATH11K_STATE_OFF;
6305 mutex_unlock(&ar->conf_mutex);
6307 cancel_delayed_work_sync(&ar->scan.timeout);
6308 cancel_work_sync(&ar->regd_update_work);
6309 cancel_work_sync(&ar->ab->update_11d_work);
6311 if (ar->state_11d == ATH11K_11D_PREPARING) {
6312 ar->state_11d = ATH11K_11D_IDLE;
6313 complete(&ar->completed_11d_scan);
6316 spin_lock_bh(&ar->data_lock);
6317 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
6318 list_del(&ppdu_stats->list);
6319 kfree(ppdu_stats);
6321 spin_unlock_bh(&ar->data_lock);
6323 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
6325 synchronize_rcu();
6327 atomic_set(&ar->num_pending_mgmt_tx, 0);
6330 static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif,
6331 u32 *flags, u32 *tx_vdev_id)
6333 struct ath11k *ar = arvif->ar;
6334 struct ath11k_vif *tx_arvif;
6335 struct ieee80211_vif *tx_vif;
6337 *tx_vdev_id = 0;
6338 tx_vif = arvif->vif->mbssid_tx_vif;
6339 if (!tx_vif) {
6340 *flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP;
6341 return 0;
6344 tx_arvif = ath11k_vif_to_arvif(tx_vif);
6346 if (arvif->vif->bss_conf.nontransmitted) {
6347 if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy)
6348 return -EINVAL;
6350 *flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP;
6351 *tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id;
6352 } else if (tx_arvif == arvif) {
6353 *flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP;
6354 } else {
6355 return -EINVAL;
6358 if (arvif->vif->bss_conf.ema_ap)
6359 *flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE;
6361 return 0;
6364 static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
6365 struct vdev_create_params *params)
6367 struct ath11k *ar = arvif->ar;
6368 struct ath11k_pdev *pdev = ar->pdev;
6369 int ret;
6371 params->if_id = arvif->vdev_id;
6372 params->type = arvif->vdev_type;
6373 params->subtype = arvif->vdev_subtype;
6374 params->pdev_id = pdev->pdev_id;
6375 params->mbssid_flags = 0;
6376 params->mbssid_tx_vdev_id = 0;
6378 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
6379 ar->ab->wmi_ab.svc_map)) {
6380 ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
6381 &params->mbssid_flags,
6382 &params->mbssid_tx_vdev_id);
6383 if (ret)
6384 return ret;
6387 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
6388 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
6389 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
6391 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
6392 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
6393 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
6395 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
6396 ar->supports_6ghz) {
6397 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
6398 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
6400 return 0;
6403 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6404 struct ieee80211_vif *vif)
6406 struct ath11k *ar = hw->priv;
6407 struct ath11k_base *ab = ar->ab;
6408 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6409 u32 param_id, param_value;
6410 int ret;
6412 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6413 if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6414 (vif->type != NL80211_IFTYPE_STATION &&
6415 vif->type != NL80211_IFTYPE_AP))
6416 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6417 IEEE80211_OFFLOAD_DECAP_ENABLED);
6419 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6420 param_value = ATH11K_HW_TXRX_ETHERNET;
6421 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6422 param_value = ATH11K_HW_TXRX_RAW;
6423 else
6424 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6426 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6427 param_id, param_value);
6428 if (ret) {
6429 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6430 arvif->vdev_id, ret);
6431 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6434 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6435 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6436 param_value = ATH11K_HW_TXRX_ETHERNET;
6437 else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6438 param_value = ATH11K_HW_TXRX_RAW;
6439 else
6440 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6442 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6443 param_id, param_value);
6444 if (ret) {
6445 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6446 arvif->vdev_id, ret);
6447 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6451 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6453 struct ath11k *ar;
6454 struct ath11k_pdev *pdev;
6455 struct ath11k_vif *arvif;
6456 int i;
6458 for (i = 0; i < ab->num_radios; i++) {
6459 pdev = &ab->pdevs[i];
6460 ar = pdev->ar;
6461 list_for_each_entry(arvif, &ar->arvifs, list) {
6462 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6463 return true;
6466 return false;
6469 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6471 struct wmi_11d_scan_start_params param;
6472 int ret;
6474 mutex_lock(&ar->ab->vdev_id_11d_lock);
6476 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n",
6477 ar->vdev_id_11d_scan);
6479 if (ar->regdom_set_by_user)
6480 goto fin;
6482 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6483 goto fin;
6485 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6486 goto fin;
6488 if (ath11k_mac_vif_ap_active_any(ar->ab))
6489 goto fin;
6491 param.vdev_id = vdev_id;
6492 param.start_interval_msec = 0;
6493 param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6495 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n");
6497 ret = ath11k_wmi_send_11d_scan_start_cmd(ar, &param);
6498 if (ret) {
6499 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6500 vdev_id, ret);
6501 } else {
6502 ar->vdev_id_11d_scan = vdev_id;
6503 if (ar->state_11d == ATH11K_11D_PREPARING)
6504 ar->state_11d = ATH11K_11D_RUNNING;
6507 fin:
6508 if (ar->state_11d == ATH11K_11D_PREPARING) {
6509 ar->state_11d = ATH11K_11D_IDLE;
6510 complete(&ar->completed_11d_scan);
6513 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6516 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6518 int ret;
6519 u32 vdev_id;
6521 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6522 return;
6524 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n");
6526 mutex_lock(&ar->ab->vdev_id_11d_lock);
6528 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n",
6529 ar->vdev_id_11d_scan);
6531 if (ar->state_11d == ATH11K_11D_PREPARING) {
6532 ar->state_11d = ATH11K_11D_IDLE;
6533 complete(&ar->completed_11d_scan);
6536 if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6537 vdev_id = ar->vdev_id_11d_scan;
6539 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6540 if (ret) {
6541 ath11k_warn(ar->ab,
6542 "failed to stopt 11d scan vdev %d ret: %d\n",
6543 vdev_id, ret);
6544 } else {
6545 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6546 ar->state_11d = ATH11K_11D_IDLE;
6547 complete(&ar->completed_11d_scan);
6550 mutex_unlock(&ar->ab->vdev_id_11d_lock);
6553 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6555 struct ath11k *ar;
6556 struct ath11k_pdev *pdev;
6557 int i;
6559 ath11k_dbg(ab, ATH11K_DBG_MAC, "stop soc 11d scan\n");
6561 for (i = 0; i < ab->num_radios; i++) {
6562 pdev = &ab->pdevs[i];
6563 ar = pdev->ar;
6565 ath11k_mac_11d_scan_stop(ar);
6569 static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif)
6571 unsigned long time_left;
6572 struct ieee80211_vif *vif = arvif->vif;
6573 int ret = 0;
6575 lockdep_assert_held(&ar->conf_mutex);
6577 reinit_completion(&ar->vdev_delete_done);
6579 ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6580 if (ret) {
6581 ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n",
6582 arvif->vdev_id, ret);
6583 return ret;
6586 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6587 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6588 if (time_left == 0) {
6589 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
6590 return -ETIMEDOUT;
6593 ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6594 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6595 ar->num_created_vdevs--;
6597 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6598 vif->addr, arvif->vdev_id);
6600 return ret;
6603 static void ath11k_mac_bcn_tx_work(struct work_struct *work)
6605 struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
6606 bcn_tx_work);
6608 mutex_lock(&arvif->ar->conf_mutex);
6609 ath11k_mac_bcn_tx_event(arvif);
6610 mutex_unlock(&arvif->ar->conf_mutex);
6613 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6614 struct ieee80211_vif *vif)
6616 struct ath11k *ar = hw->priv;
6617 struct ath11k_base *ab = ar->ab;
6618 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6619 struct vdev_create_params vdev_param = {0};
6620 struct peer_create_params peer_param;
6621 u32 param_id, param_value;
6622 u16 nss;
6623 int i;
6624 int ret, fbret;
6625 int bit;
6627 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6629 mutex_lock(&ar->conf_mutex);
6631 if (vif->type == NL80211_IFTYPE_AP &&
6632 ar->num_peers > (ar->max_num_peers - 1)) {
6633 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6634 ret = -ENOBUFS;
6635 goto err;
6638 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6639 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6640 ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6641 ret = -EBUSY;
6642 goto err;
6645 memset(arvif, 0, sizeof(*arvif));
6647 arvif->ar = ar;
6648 arvif->vif = vif;
6650 INIT_LIST_HEAD(&arvif->list);
6651 INIT_WORK(&arvif->bcn_tx_work, ath11k_mac_bcn_tx_work);
6652 INIT_DELAYED_WORK(&arvif->connection_loss_work,
6653 ath11k_mac_vif_sta_connection_loss_work);
6655 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6656 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6657 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6658 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6659 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6660 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6661 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6662 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6663 sizeof(arvif->bitrate_mask.control[i].he_mcs));
6666 bit = __ffs64(ab->free_vdev_map);
6668 arvif->vdev_id = bit;
6669 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6671 switch (vif->type) {
6672 case NL80211_IFTYPE_UNSPECIFIED:
6673 case NL80211_IFTYPE_STATION:
6674 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6675 if (vif->p2p)
6676 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
6677 break;
6678 case NL80211_IFTYPE_MESH_POINT:
6679 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6680 fallthrough;
6681 case NL80211_IFTYPE_AP:
6682 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6683 if (vif->p2p)
6684 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
6685 break;
6686 case NL80211_IFTYPE_MONITOR:
6687 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6688 ar->monitor_vdev_id = bit;
6689 break;
6690 case NL80211_IFTYPE_P2P_DEVICE:
6691 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6692 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
6693 break;
6695 default:
6696 WARN_ON(1);
6697 break;
6700 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n",
6701 arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6702 ab->free_vdev_map);
6704 vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6705 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6706 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6708 ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6709 if (ret) {
6710 ath11k_warn(ab, "failed to create vdev parameters %d: %d\n",
6711 arvif->vdev_id, ret);
6712 goto err;
6715 ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6716 if (ret) {
6717 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6718 arvif->vdev_id, ret);
6719 goto err;
6722 ar->num_created_vdevs++;
6723 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6724 vif->addr, arvif->vdev_id);
6725 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6726 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6728 spin_lock_bh(&ar->data_lock);
6729 list_add(&arvif->list, &ar->arvifs);
6730 spin_unlock_bh(&ar->data_lock);
6732 ath11k_mac_op_update_vif_offload(hw, vif);
6734 nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6735 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6736 WMI_VDEV_PARAM_NSS, nss);
6737 if (ret) {
6738 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6739 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6740 goto err_vdev_del;
6743 switch (arvif->vdev_type) {
6744 case WMI_VDEV_TYPE_AP:
6745 peer_param.vdev_id = arvif->vdev_id;
6746 peer_param.peer_addr = vif->addr;
6747 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6748 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6749 if (ret) {
6750 ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6751 arvif->vdev_id, ret);
6752 goto err_vdev_del;
6755 ret = ath11k_mac_set_kickout(arvif);
6756 if (ret) {
6757 ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6758 arvif->vdev_id, ret);
6759 goto err_peer_del;
6762 ath11k_mac_11d_scan_stop_all(ar->ab);
6763 break;
6764 case WMI_VDEV_TYPE_STA:
6765 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6766 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6767 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6768 param_id, param_value);
6769 if (ret) {
6770 ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6771 arvif->vdev_id, ret);
6772 goto err_peer_del;
6775 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6776 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6777 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6778 param_id, param_value);
6779 if (ret) {
6780 ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6781 arvif->vdev_id, ret);
6782 goto err_peer_del;
6785 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6786 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6787 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6788 param_id, param_value);
6789 if (ret) {
6790 ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6791 arvif->vdev_id, ret);
6792 goto err_peer_del;
6795 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6796 WMI_STA_PS_MODE_DISABLED);
6797 if (ret) {
6798 ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6799 arvif->vdev_id, ret);
6800 goto err_peer_del;
6803 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6804 reinit_completion(&ar->completed_11d_scan);
6805 ar->state_11d = ATH11K_11D_PREPARING;
6807 break;
6808 case WMI_VDEV_TYPE_MONITOR:
6809 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6810 break;
6811 default:
6812 break;
6815 arvif->txpower = vif->bss_conf.txpower;
6816 ret = ath11k_mac_txpower_recalc(ar);
6817 if (ret)
6818 goto err_peer_del;
6820 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6821 param_value = ar->hw->wiphy->rts_threshold;
6822 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6823 param_id, param_value);
6824 if (ret) {
6825 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6826 arvif->vdev_id, ret);
6829 ath11k_dp_vdev_tx_attach(ar, arvif);
6831 if (vif->type != NL80211_IFTYPE_MONITOR &&
6832 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6833 ret = ath11k_mac_monitor_vdev_create(ar);
6834 if (ret)
6835 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6836 ret);
6839 if (ath11k_wmi_supports_6ghz_cc_ext(ar)) {
6840 struct cur_regulatory_info *reg_info;
6842 reg_info = &ab->reg_info_store[ar->pdev_idx];
6843 ath11k_dbg(ab, ATH11K_DBG_MAC, "interface added to change reg rules\n");
6844 ath11k_reg_handle_chan_list(ab, reg_info, IEEE80211_REG_LPI_AP);
6847 mutex_unlock(&ar->conf_mutex);
6849 return 0;
6851 err_peer_del:
6852 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6853 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6854 if (fbret) {
6855 ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6856 vif->addr, arvif->vdev_id, fbret);
6857 goto err;
6861 err_vdev_del:
6862 ath11k_mac_vdev_delete(ar, arvif);
6863 spin_lock_bh(&ar->data_lock);
6864 list_del(&arvif->list);
6865 spin_unlock_bh(&ar->data_lock);
6867 err:
6868 mutex_unlock(&ar->conf_mutex);
6870 return ret;
6873 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6875 struct ieee80211_vif *vif = ctx;
6876 struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6878 if (skb_cb->vif == vif)
6879 skb_cb->vif = NULL;
6881 return 0;
6884 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6885 struct ieee80211_vif *vif)
6887 struct ath11k *ar = hw->priv;
6888 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6889 struct ath11k_base *ab = ar->ab;
6890 int ret;
6891 int i;
6893 cancel_delayed_work_sync(&arvif->connection_loss_work);
6894 cancel_work_sync(&arvif->bcn_tx_work);
6896 mutex_lock(&ar->conf_mutex);
6898 ath11k_dbg(ab, ATH11K_DBG_MAC, "remove interface (vdev %d)\n",
6899 arvif->vdev_id);
6901 ret = ath11k_spectral_vif_stop(arvif);
6902 if (ret)
6903 ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n",
6904 arvif->vdev_id, ret);
6906 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6907 ath11k_mac_11d_scan_stop(ar);
6909 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6910 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6911 if (ret)
6912 ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6913 arvif->vdev_id, ret);
6916 ret = ath11k_mac_vdev_delete(ar, arvif);
6917 if (ret) {
6918 ath11k_warn(ab, "failed to delete vdev %d: %d\n",
6919 arvif->vdev_id, ret);
6920 goto err_vdev_del;
6923 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6924 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6925 ar->monitor_vdev_id = -1;
6926 } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6927 !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6928 ret = ath11k_mac_monitor_vdev_delete(ar);
6929 if (ret)
6930 /* continue even if there's an error */
6931 ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6932 ret);
6935 err_vdev_del:
6936 spin_lock_bh(&ar->data_lock);
6937 list_del(&arvif->list);
6938 spin_unlock_bh(&ar->data_lock);
6940 ath11k_peer_cleanup(ar, arvif->vdev_id);
6942 idr_for_each(&ar->txmgmt_idr,
6943 ath11k_mac_vif_txmgmt_idr_remove, vif);
6945 for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6946 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6947 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6948 ath11k_mac_vif_unref, vif);
6949 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6952 /* Recalc txpower for remaining vdev */
6953 ath11k_mac_txpower_recalc(ar);
6955 /* TODO: recal traffic pause state based on the available vdevs */
6957 mutex_unlock(&ar->conf_mutex);
6960 /* FIXME: Has to be verified. */
6961 #define SUPPORTED_FILTERS \
6962 (FIF_ALLMULTI | \
6963 FIF_CONTROL | \
6964 FIF_PSPOLL | \
6965 FIF_OTHER_BSS | \
6966 FIF_BCN_PRBRESP_PROMISC | \
6967 FIF_PROBE_REQ | \
6968 FIF_FCSFAIL)
6970 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6971 unsigned int changed_flags,
6972 unsigned int *total_flags,
6973 u64 multicast)
6975 struct ath11k *ar = hw->priv;
6977 mutex_lock(&ar->conf_mutex);
6979 *total_flags &= SUPPORTED_FILTERS;
6980 ar->filter_flags = *total_flags;
6982 mutex_unlock(&ar->conf_mutex);
6985 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6987 struct ath11k *ar = hw->priv;
6989 mutex_lock(&ar->conf_mutex);
6991 *tx_ant = ar->cfg_tx_chainmask;
6992 *rx_ant = ar->cfg_rx_chainmask;
6994 mutex_unlock(&ar->conf_mutex);
6996 return 0;
6999 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
7001 struct ath11k *ar = hw->priv;
7002 int ret;
7004 mutex_lock(&ar->conf_mutex);
7005 ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
7006 mutex_unlock(&ar->conf_mutex);
7008 return ret;
7011 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
7012 struct ieee80211_vif *vif,
7013 struct ieee80211_ampdu_params *params)
7015 struct ath11k *ar = hw->priv;
7016 int ret = -EINVAL;
7018 mutex_lock(&ar->conf_mutex);
7020 switch (params->action) {
7021 case IEEE80211_AMPDU_RX_START:
7022 ret = ath11k_dp_rx_ampdu_start(ar, params);
7023 break;
7024 case IEEE80211_AMPDU_RX_STOP:
7025 ret = ath11k_dp_rx_ampdu_stop(ar, params);
7026 break;
7027 case IEEE80211_AMPDU_TX_START:
7028 case IEEE80211_AMPDU_TX_STOP_CONT:
7029 case IEEE80211_AMPDU_TX_STOP_FLUSH:
7030 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
7031 case IEEE80211_AMPDU_TX_OPERATIONAL:
7032 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
7033 * Tx aggregation requests.
7035 ret = -EOPNOTSUPP;
7036 break;
7039 mutex_unlock(&ar->conf_mutex);
7041 return ret;
7044 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
7045 struct ieee80211_chanctx_conf *ctx)
7047 struct ath11k *ar = hw->priv;
7048 struct ath11k_base *ab = ar->ab;
7050 ath11k_dbg(ab, ATH11K_DBG_MAC,
7051 "chanctx add freq %u width %d ptr %p\n",
7052 ctx->def.chan->center_freq, ctx->def.width, ctx);
7054 mutex_lock(&ar->conf_mutex);
7056 spin_lock_bh(&ar->data_lock);
7057 /* TODO: In case of multiple channel context, populate rx_channel from
7058 * Rx PPDU desc information.
7060 ar->rx_channel = ctx->def.chan;
7061 spin_unlock_bh(&ar->data_lock);
7063 mutex_unlock(&ar->conf_mutex);
7065 return 0;
7068 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
7069 struct ieee80211_chanctx_conf *ctx)
7071 struct ath11k *ar = hw->priv;
7072 struct ath11k_base *ab = ar->ab;
7074 ath11k_dbg(ab, ATH11K_DBG_MAC,
7075 "chanctx remove freq %u width %d ptr %p\n",
7076 ctx->def.chan->center_freq, ctx->def.width, ctx);
7078 mutex_lock(&ar->conf_mutex);
7080 spin_lock_bh(&ar->data_lock);
7081 /* TODO: In case of there is one more channel context left, populate
7082 * rx_channel with the channel of that remaining channel context.
7084 ar->rx_channel = NULL;
7085 spin_unlock_bh(&ar->data_lock);
7087 mutex_unlock(&ar->conf_mutex);
7090 static int
7091 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
7092 struct ieee80211_chanctx_conf *ctx,
7093 bool restart)
7095 struct ath11k *ar = arvif->ar;
7096 struct ath11k_base *ab = ar->ab;
7097 struct wmi_vdev_start_req_arg arg = {};
7098 const struct cfg80211_chan_def *chandef = &ctx->def;
7099 int ret = 0;
7100 unsigned int dfs_cac_time;
7102 lockdep_assert_held(&ar->conf_mutex);
7104 reinit_completion(&ar->vdev_setup_done);
7106 arg.vdev_id = arvif->vdev_id;
7107 arg.dtim_period = arvif->dtim_period;
7108 arg.bcn_intval = arvif->beacon_interval;
7110 arg.channel.freq = chandef->chan->center_freq;
7111 arg.channel.band_center_freq1 = chandef->center_freq1;
7112 arg.channel.band_center_freq2 = chandef->center_freq2;
7113 arg.channel.mode =
7114 ath11k_phymodes[chandef->chan->band][chandef->width];
7116 arg.channel.min_power = 0;
7117 arg.channel.max_power = chandef->chan->max_power;
7118 arg.channel.max_reg_power = chandef->chan->max_reg_power;
7119 arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
7121 arg.pref_tx_streams = ar->num_tx_chains;
7122 arg.pref_rx_streams = ar->num_rx_chains;
7124 arg.mbssid_flags = 0;
7125 arg.mbssid_tx_vdev_id = 0;
7126 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
7127 ar->ab->wmi_ab.svc_map)) {
7128 ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
7129 &arg.mbssid_flags,
7130 &arg.mbssid_tx_vdev_id);
7131 if (ret)
7132 return ret;
7135 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7136 arg.ssid = arvif->u.ap.ssid;
7137 arg.ssid_len = arvif->u.ap.ssid_len;
7138 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
7140 /* For now allow DFS for AP mode */
7141 arg.channel.chan_radar =
7142 !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
7144 arg.channel.freq2_radar = ctx->radar_enabled;
7146 arg.channel.passive = arg.channel.chan_radar;
7148 spin_lock_bh(&ab->base_lock);
7149 arg.regdomain = ar->ab->dfs_region;
7150 spin_unlock_bh(&ab->base_lock);
7153 arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
7155 ath11k_dbg(ab, ATH11K_DBG_MAC,
7156 "vdev %d start center_freq %d phymode %s\n",
7157 arg.vdev_id, arg.channel.freq,
7158 ath11k_wmi_phymode_str(arg.channel.mode));
7160 ret = ath11k_wmi_vdev_start(ar, &arg, restart);
7161 if (ret) {
7162 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
7163 restart ? "restart" : "start", arg.vdev_id);
7164 return ret;
7167 ret = ath11k_mac_vdev_setup_sync(ar);
7168 if (ret) {
7169 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
7170 arg.vdev_id, restart ? "restart" : "start", ret);
7171 return ret;
7174 /* TODO: For now we only set TPC power here. However when
7175 * channel changes, say CSA, it should be updated again.
7177 if (ath11k_mac_supports_station_tpc(ar, arvif, chandef)) {
7178 ath11k_mac_fill_reg_tpc_info(ar, arvif->vif, &arvif->chanctx);
7179 ath11k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
7180 &arvif->reg_tpc_info);
7183 if (!restart)
7184 ar->num_started_vdevs++;
7186 ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
7187 arvif->vif->addr, arvif->vdev_id);
7189 /* Enable CAC Flag in the driver by checking the all sub-channel's DFS
7190 * state as NL80211_DFS_USABLE which indicates CAC needs to be
7191 * done before channel usage. This flags is used to drop rx packets.
7192 * during CAC.
7194 /* TODO Set the flag for other interface types as required */
7195 if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
7196 cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
7197 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7198 dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
7199 chandef);
7200 ath11k_dbg(ab, ATH11K_DBG_MAC,
7201 "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
7202 dfs_cac_time, arg.channel.freq, chandef->center_freq1,
7203 arg.vdev_id);
7206 ret = ath11k_mac_set_txbf_conf(arvif);
7207 if (ret)
7208 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
7209 arvif->vdev_id, ret);
7211 return 0;
7214 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
7216 struct ath11k *ar = arvif->ar;
7217 int ret;
7219 lockdep_assert_held(&ar->conf_mutex);
7221 reinit_completion(&ar->vdev_setup_done);
7223 ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
7224 if (ret) {
7225 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
7226 arvif->vdev_id, ret);
7227 goto err;
7230 ret = ath11k_mac_vdev_setup_sync(ar);
7231 if (ret) {
7232 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
7233 arvif->vdev_id, ret);
7234 goto err;
7237 WARN_ON(ar->num_started_vdevs == 0);
7239 ar->num_started_vdevs--;
7240 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
7241 arvif->vif->addr, arvif->vdev_id);
7243 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
7244 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7245 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
7246 arvif->vdev_id);
7249 return 0;
7250 err:
7251 return ret;
7254 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
7255 struct ieee80211_chanctx_conf *ctx)
7257 return ath11k_mac_vdev_start_restart(arvif, ctx, false);
7260 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
7261 struct ieee80211_chanctx_conf *ctx)
7263 return ath11k_mac_vdev_start_restart(arvif, ctx, true);
7266 struct ath11k_mac_change_chanctx_arg {
7267 struct ieee80211_chanctx_conf *ctx;
7268 struct ieee80211_vif_chanctx_switch *vifs;
7269 int n_vifs;
7270 int next_vif;
7273 static void
7274 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7275 struct ieee80211_vif *vif)
7277 struct ath11k_mac_change_chanctx_arg *arg = data;
7279 if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
7280 return;
7282 arg->n_vifs++;
7285 static void
7286 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7287 struct ieee80211_vif *vif)
7289 struct ath11k_mac_change_chanctx_arg *arg = data;
7290 struct ieee80211_chanctx_conf *ctx;
7292 ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
7293 if (ctx != arg->ctx)
7294 return;
7296 if (WARN_ON(arg->next_vif == arg->n_vifs))
7297 return;
7299 arg->vifs[arg->next_vif].vif = vif;
7300 arg->vifs[arg->next_vif].old_ctx = ctx;
7301 arg->vifs[arg->next_vif].new_ctx = ctx;
7302 arg->next_vif++;
7305 static void
7306 ath11k_mac_update_vif_chan(struct ath11k *ar,
7307 struct ieee80211_vif_chanctx_switch *vifs,
7308 int n_vifs)
7310 struct ath11k_base *ab = ar->ab;
7311 struct ath11k_vif *arvif, *tx_arvif = NULL;
7312 struct ieee80211_vif *mbssid_tx_vif;
7313 int ret;
7314 int i;
7315 bool monitor_vif = false;
7317 lockdep_assert_held(&ar->conf_mutex);
7319 /* Associated channel resources of all relevant vdevs
7320 * should be available for the channel switch now.
7323 /* TODO: Update ar->rx_channel */
7325 for (i = 0; i < n_vifs; i++) {
7326 arvif = ath11k_vif_to_arvif(vifs[i].vif);
7328 if (WARN_ON(!arvif->is_started))
7329 continue;
7331 /* change_chanctx can be called even before vdev_up from
7332 * ieee80211_start_ap->ieee80211_vif_use_channel->
7333 * ieee80211_recalc_radar_chanctx.
7335 * Firmware expect vdev_restart only if vdev is up.
7336 * If vdev is down then it expect vdev_stop->vdev_start.
7338 if (arvif->is_up) {
7339 ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
7340 if (ret) {
7341 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
7342 arvif->vdev_id, ret);
7343 continue;
7345 } else {
7346 ret = ath11k_mac_vdev_stop(arvif);
7347 if (ret) {
7348 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
7349 arvif->vdev_id, ret);
7350 continue;
7353 ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
7354 if (ret)
7355 ath11k_warn(ab, "failed to start vdev %d: %d\n",
7356 arvif->vdev_id, ret);
7358 continue;
7361 ret = ath11k_mac_setup_bcn_tmpl(arvif);
7362 if (ret)
7363 ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
7364 ret);
7366 mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
7367 if (mbssid_tx_vif)
7368 tx_arvif = ath11k_vif_to_arvif(mbssid_tx_vif);
7370 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7371 arvif->bssid,
7372 tx_arvif ? tx_arvif->bssid : NULL,
7373 arvif->vif->bss_conf.bssid_index,
7374 1 << arvif->vif->bss_conf.bssid_indicator);
7375 if (ret) {
7376 ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
7377 arvif->vdev_id, ret);
7378 continue;
7382 /* Restart the internal monitor vdev on new channel */
7383 if (!monitor_vif &&
7384 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7385 ret = ath11k_mac_monitor_stop(ar);
7386 if (ret) {
7387 ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
7388 ret);
7389 return;
7392 ret = ath11k_mac_monitor_start(ar);
7393 if (ret) {
7394 ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
7395 ret);
7396 return;
7401 static void
7402 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
7403 struct ieee80211_chanctx_conf *ctx)
7405 struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
7407 lockdep_assert_held(&ar->conf_mutex);
7409 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7410 IEEE80211_IFACE_ITER_NORMAL,
7411 ath11k_mac_change_chanctx_cnt_iter,
7412 &arg);
7413 if (arg.n_vifs == 0)
7414 return;
7416 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
7417 if (!arg.vifs)
7418 return;
7420 ieee80211_iterate_active_interfaces_atomic(ar->hw,
7421 IEEE80211_IFACE_ITER_NORMAL,
7422 ath11k_mac_change_chanctx_fill_iter,
7423 &arg);
7425 ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7427 kfree(arg.vifs);
7430 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7431 struct ieee80211_chanctx_conf *ctx,
7432 u32 changed)
7434 struct ath11k *ar = hw->priv;
7435 struct ath11k_base *ab = ar->ab;
7437 mutex_lock(&ar->conf_mutex);
7439 ath11k_dbg(ab, ATH11K_DBG_MAC,
7440 "chanctx change freq %u width %d ptr %p changed %x\n",
7441 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7443 /* This shouldn't really happen because channel switching should use
7444 * switch_vif_chanctx().
7446 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7447 goto unlock;
7449 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
7450 changed & IEEE80211_CHANCTX_CHANGE_RADAR)
7451 ath11k_mac_update_active_vif_chan(ar, ctx);
7453 /* TODO: Recalc radar detection */
7455 unlock:
7456 mutex_unlock(&ar->conf_mutex);
7459 static int ath11k_mac_start_vdev_delay(struct ieee80211_hw *hw,
7460 struct ieee80211_vif *vif)
7462 struct ath11k *ar = hw->priv;
7463 struct ath11k_base *ab = ar->ab;
7464 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7465 int ret;
7467 if (WARN_ON(arvif->is_started))
7468 return -EBUSY;
7470 ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7471 if (ret) {
7472 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7473 arvif->vdev_id, vif->addr,
7474 arvif->chanctx.def.chan->center_freq, ret);
7475 return ret;
7478 /* Reconfigure hardware rate code since it is cleared by firmware.
7480 if (ar->hw_rate_code > 0) {
7481 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7483 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7484 ar->hw_rate_code);
7485 if (ret) {
7486 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7487 return ret;
7491 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7492 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr,
7493 NULL, 0, 0);
7494 if (ret) {
7495 ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7496 return ret;
7500 arvif->is_started = true;
7502 /* TODO: Setup ps and cts/rts protection */
7503 return 0;
7506 static int ath11k_mac_stop_vdev_early(struct ieee80211_hw *hw,
7507 struct ieee80211_vif *vif)
7509 struct ath11k *ar = hw->priv;
7510 struct ath11k_base *ab = ar->ab;
7511 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7512 int ret;
7514 if (WARN_ON(!arvif->is_started))
7515 return -EBUSY;
7517 ret = ath11k_mac_vdev_stop(arvif);
7518 if (ret) {
7519 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7520 arvif->vdev_id, ret);
7521 return ret;
7524 arvif->is_started = false;
7526 /* TODO: Setup ps and cts/rts protection */
7527 return 0;
7530 static u8 ath11k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
7532 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
7533 switch (chan_def->width) {
7534 case NL80211_CHAN_WIDTH_20:
7535 return 1;
7536 case NL80211_CHAN_WIDTH_40:
7537 return 2;
7538 case NL80211_CHAN_WIDTH_80:
7539 return 4;
7540 case NL80211_CHAN_WIDTH_80P80:
7541 case NL80211_CHAN_WIDTH_160:
7542 return 8;
7543 default:
7544 return 1;
7546 } else {
7547 switch (chan_def->width) {
7548 case NL80211_CHAN_WIDTH_20:
7549 return 1;
7550 case NL80211_CHAN_WIDTH_40:
7551 return 2;
7552 case NL80211_CHAN_WIDTH_80:
7553 return 3;
7554 case NL80211_CHAN_WIDTH_80P80:
7555 case NL80211_CHAN_WIDTH_160:
7556 return 4;
7557 default:
7558 return 1;
7563 static u16 ath11k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
7565 u16 diff_seq;
7567 /* It is to get the lowest channel number's center frequency of the chan.
7568 * For example,
7569 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
7570 * with center frequency 5955, its diff is 5965 - 5955 = 10.
7571 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
7572 * with center frequency 5955, its diff is 5985 - 5955 = 30.
7573 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
7574 * with center frequency 5955, its diff is 6025 - 5955 = 70.
7576 switch (chan_def->width) {
7577 case NL80211_CHAN_WIDTH_160:
7578 diff_seq = 70;
7579 break;
7580 case NL80211_CHAN_WIDTH_80:
7581 case NL80211_CHAN_WIDTH_80P80:
7582 diff_seq = 30;
7583 break;
7584 case NL80211_CHAN_WIDTH_40:
7585 diff_seq = 10;
7586 break;
7587 default:
7588 diff_seq = 0;
7591 return chan_def->center_freq1 - diff_seq;
7594 static u16 ath11k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
7595 u16 start_seq, u8 seq)
7597 u16 seg_seq;
7599 /* It is to get the center frequency of the specific bandwidth.
7600 * start_seq means the lowest channel number's center frequency.
7601 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz&80P80.
7602 * For example,
7603 * lowest channel is 1, its center frequency 5955,
7604 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
7605 * lowest channel is 1, its center frequency 5955,
7606 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
7607 * lowest channel is 1, its center frequency 5955,
7608 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
7609 * lowest channel is 1, its center frequency 5955,
7610 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
7612 if (chan_def->width == NL80211_CHAN_WIDTH_80P80 && seq == 3)
7613 return chan_def->center_freq2;
7615 seg_seq = 10 * (BIT(seq) - 1);
7616 return seg_seq + start_seq;
7619 static void ath11k_mac_get_psd_channel(struct ath11k *ar,
7620 u16 step_freq,
7621 u16 *start_freq,
7622 u16 *center_freq,
7623 u8 i,
7624 struct ieee80211_channel **temp_chan,
7625 s8 *tx_power)
7627 /* It is to get the center frequency for each 20 MHz.
7628 * For example, if the chan is 160 MHz and center frequency is 6025,
7629 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
7630 * channel number 1's center frequency is 5955, it is parameter start_freq.
7631 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
7632 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
7633 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
7634 * the gap is 20 for each channel, parameter step_freq means the gap.
7635 * after get the center frequency of each channel, it is easy to find the
7636 * struct ieee80211_channel of it and get the max_reg_power.
7638 *center_freq = *start_freq + i * step_freq;
7639 *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq);
7640 *tx_power = (*temp_chan)->max_reg_power;
7643 static void ath11k_mac_get_eirp_power(struct ath11k *ar,
7644 u16 *start_freq,
7645 u16 *center_freq,
7646 u8 i,
7647 struct ieee80211_channel **temp_chan,
7648 struct cfg80211_chan_def *def,
7649 s8 *tx_power)
7651 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
7652 * 160 MHz&80P80 bandwidth, and then plus 10 to the center frequency,
7653 * it is the center frequency of a channel number.
7654 * For example, when configured channel number is 1.
7655 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
7656 * then it is channel number 5.
7657 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
7658 * then it is channel number 9.
7659 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
7660 * then it is channel number 17.
7661 * after get the center frequency of each channel, it is easy to find the
7662 * struct ieee80211_channel of it and get the max_reg_power.
7664 *center_freq = ath11k_mac_get_seg_freq(def, *start_freq, i);
7666 /* For the 20 MHz, its center frequency is same with same channel */
7667 if (i != 0)
7668 *center_freq += 10;
7670 *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq);
7671 *tx_power = (*temp_chan)->max_reg_power;
7674 void ath11k_mac_fill_reg_tpc_info(struct ath11k *ar,
7675 struct ieee80211_vif *vif,
7676 struct ieee80211_chanctx_conf *ctx)
7678 struct ath11k_base *ab = ar->ab;
7679 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7680 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
7681 struct ath11k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
7682 struct ieee80211_channel *chan, *temp_chan;
7683 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
7684 bool is_psd_power = false, is_tpe_present = false;
7685 s8 max_tx_power[ATH11K_NUM_PWR_LEVELS],
7686 psd_power, tx_power;
7687 s8 eirp_power = 0;
7688 u16 start_freq, center_freq;
7690 chan = ctx->def.chan;
7691 start_freq = ath11k_mac_get_6ghz_start_frequency(&ctx->def);
7692 pwr_reduction = bss_conf->pwr_reduction;
7694 if (arvif->reg_tpc_info.num_pwr_levels) {
7695 is_tpe_present = true;
7696 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
7697 } else {
7698 num_pwr_levels =
7699 ath11k_mac_get_num_pwr_levels(&bss_conf->chanreq.oper);
7702 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
7703 /* STA received TPE IE*/
7704 if (is_tpe_present) {
7705 /* local power is PSD power*/
7706 if (chan->flags & IEEE80211_CHAN_PSD) {
7707 /* Connecting AP is psd power */
7708 if (reg_tpc_info->is_psd_power) {
7709 is_psd_power = true;
7710 ath11k_mac_get_psd_channel(ar, 20,
7711 &start_freq,
7712 &center_freq,
7713 pwr_lvl_idx,
7714 &temp_chan,
7715 &tx_power);
7716 psd_power = temp_chan->psd;
7717 eirp_power = tx_power;
7718 max_tx_power[pwr_lvl_idx] =
7719 min_t(s8,
7720 psd_power,
7721 reg_tpc_info->tpe[pwr_lvl_idx]);
7722 /* Connecting AP is not psd power */
7723 } else {
7724 ath11k_mac_get_eirp_power(ar,
7725 &start_freq,
7726 &center_freq,
7727 pwr_lvl_idx,
7728 &temp_chan,
7729 &ctx->def,
7730 &tx_power);
7731 psd_power = temp_chan->psd;
7732 /* convert psd power to EIRP power based
7733 * on channel width
7735 tx_power =
7736 min_t(s8, tx_power,
7737 psd_power + 13 + pwr_lvl_idx * 3);
7738 max_tx_power[pwr_lvl_idx] =
7739 min_t(s8,
7740 tx_power,
7741 reg_tpc_info->tpe[pwr_lvl_idx]);
7743 /* local power is not PSD power */
7744 } else {
7745 /* Connecting AP is psd power */
7746 if (reg_tpc_info->is_psd_power) {
7747 is_psd_power = true;
7748 ath11k_mac_get_psd_channel(ar, 20,
7749 &start_freq,
7750 &center_freq,
7751 pwr_lvl_idx,
7752 &temp_chan,
7753 &tx_power);
7754 eirp_power = tx_power;
7755 max_tx_power[pwr_lvl_idx] =
7756 reg_tpc_info->tpe[pwr_lvl_idx];
7757 /* Connecting AP is not psd power */
7758 } else {
7759 ath11k_mac_get_eirp_power(ar,
7760 &start_freq,
7761 &center_freq,
7762 pwr_lvl_idx,
7763 &temp_chan,
7764 &ctx->def,
7765 &tx_power);
7766 max_tx_power[pwr_lvl_idx] =
7767 min_t(s8,
7768 tx_power,
7769 reg_tpc_info->tpe[pwr_lvl_idx]);
7772 /* STA not received TPE IE */
7773 } else {
7774 /* local power is PSD power*/
7775 if (chan->flags & IEEE80211_CHAN_PSD) {
7776 is_psd_power = true;
7777 ath11k_mac_get_psd_channel(ar, 20,
7778 &start_freq,
7779 &center_freq,
7780 pwr_lvl_idx,
7781 &temp_chan,
7782 &tx_power);
7783 psd_power = temp_chan->psd;
7784 eirp_power = tx_power;
7785 max_tx_power[pwr_lvl_idx] = psd_power;
7786 } else {
7787 ath11k_mac_get_eirp_power(ar,
7788 &start_freq,
7789 &center_freq,
7790 pwr_lvl_idx,
7791 &temp_chan,
7792 &ctx->def,
7793 &tx_power);
7794 max_tx_power[pwr_lvl_idx] = tx_power;
7798 if (is_psd_power) {
7799 /* If AP local power constraint is present */
7800 if (pwr_reduction)
7801 eirp_power = eirp_power - pwr_reduction;
7803 /* If firmware updated max tx power is non zero, then take
7804 * the min of firmware updated ap tx power
7805 * and max power derived from above mentioned parameters.
7807 ath11k_dbg(ab, ATH11K_DBG_MAC,
7808 "eirp power : %d firmware report power : %d\n",
7809 eirp_power, ar->max_allowed_tx_power);
7810 /* Firmware reports lower max_allowed_tx_power during vdev
7811 * start response. In case of 6 GHz, firmware is not aware
7812 * of EIRP power unless driver sets EIRP power through WMI
7813 * TPC command. So radio which does not support idle power
7814 * save can set maximum calculated EIRP power directly to
7815 * firmware through TPC command without min comparison with
7816 * vdev start response's max_allowed_tx_power.
7818 if (ar->max_allowed_tx_power && ab->hw_params.idle_ps)
7819 eirp_power = min_t(s8,
7820 eirp_power,
7821 ar->max_allowed_tx_power);
7822 } else {
7823 /* If AP local power constraint is present */
7824 if (pwr_reduction)
7825 max_tx_power[pwr_lvl_idx] =
7826 max_tx_power[pwr_lvl_idx] - pwr_reduction;
7827 /* If firmware updated max tx power is non zero, then take
7828 * the min of firmware updated ap tx power
7829 * and max power derived from above mentioned parameters.
7831 if (ar->max_allowed_tx_power && ab->hw_params.idle_ps)
7832 max_tx_power[pwr_lvl_idx] =
7833 min_t(s8,
7834 max_tx_power[pwr_lvl_idx],
7835 ar->max_allowed_tx_power);
7837 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
7838 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
7839 max_tx_power[pwr_lvl_idx];
7842 reg_tpc_info->num_pwr_levels = num_pwr_levels;
7843 reg_tpc_info->is_psd_power = is_psd_power;
7844 reg_tpc_info->eirp_power = eirp_power;
7845 reg_tpc_info->ap_power_type =
7846 ath11k_reg_ap_pwr_convert(vif->bss_conf.power_type);
7849 static void ath11k_mac_parse_tx_pwr_env(struct ath11k *ar,
7850 struct ieee80211_vif *vif,
7851 struct ieee80211_chanctx_conf *ctx)
7853 struct ath11k_base *ab = ar->ab;
7854 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7855 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
7856 struct ieee80211_parsed_tpe_eirp *non_psd = NULL;
7857 struct ieee80211_parsed_tpe_psd *psd = NULL;
7858 enum wmi_reg_6ghz_client_type client_type;
7859 struct cur_regulatory_info *reg_info;
7860 u8 local_tpe_count, reg_tpe_count;
7861 bool use_local_tpe;
7862 int i;
7864 reg_info = &ab->reg_info_store[ar->pdev_idx];
7865 client_type = reg_info->client_type;
7867 local_tpe_count =
7868 bss_conf->tpe.max_local[client_type].valid +
7869 bss_conf->tpe.psd_local[client_type].valid;
7870 reg_tpe_count =
7871 bss_conf->tpe.max_reg_client[client_type].valid +
7872 bss_conf->tpe.psd_reg_client[client_type].valid;
7874 if (!reg_tpe_count && !local_tpe_count) {
7875 ath11k_warn(ab,
7876 "no transmit power envelope match client power type %d\n",
7877 client_type);
7878 return;
7879 } else if (!reg_tpe_count) {
7880 use_local_tpe = true;
7881 } else {
7882 use_local_tpe = false;
7885 if (use_local_tpe) {
7886 psd = &bss_conf->tpe.psd_local[client_type];
7887 if (!psd->valid)
7888 psd = NULL;
7889 non_psd = &bss_conf->tpe.max_local[client_type];
7890 if (!non_psd->valid)
7891 non_psd = NULL;
7892 } else {
7893 psd = &bss_conf->tpe.psd_reg_client[client_type];
7894 if (!psd->valid)
7895 psd = NULL;
7896 non_psd = &bss_conf->tpe.max_reg_client[client_type];
7897 if (!non_psd->valid)
7898 non_psd = NULL;
7901 if (non_psd && !psd) {
7902 arvif->reg_tpc_info.is_psd_power = false;
7903 arvif->reg_tpc_info.eirp_power = 0;
7905 arvif->reg_tpc_info.num_pwr_levels = non_psd->count;
7907 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) {
7908 ath11k_dbg(ab, ATH11K_DBG_MAC,
7909 "non PSD power[%d] : %d\n",
7910 i, non_psd->power[i]);
7911 arvif->reg_tpc_info.tpe[i] = non_psd->power[i] / 2;
7915 if (psd) {
7916 arvif->reg_tpc_info.is_psd_power = true;
7917 arvif->reg_tpc_info.num_pwr_levels = psd->count;
7919 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) {
7920 ath11k_dbg(ab, ATH11K_DBG_MAC,
7921 "TPE PSD power[%d] : %d\n",
7922 i, psd->power[i]);
7923 arvif->reg_tpc_info.tpe[i] = psd->power[i] / 2;
7928 static int
7929 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7930 struct ieee80211_vif *vif,
7931 struct ieee80211_bss_conf *link_conf,
7932 struct ieee80211_chanctx_conf *ctx)
7934 struct ath11k *ar = hw->priv;
7935 struct ath11k_base *ab = ar->ab;
7936 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7937 int ret;
7939 mutex_lock(&ar->conf_mutex);
7941 ath11k_dbg(ab, ATH11K_DBG_MAC,
7942 "chanctx assign ptr %p vdev_id %i\n",
7943 ctx, arvif->vdev_id);
7945 if (ath11k_wmi_supports_6ghz_cc_ext(ar) &&
7946 ctx->def.chan->band == NL80211_BAND_6GHZ &&
7947 arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7948 arvif->chanctx = *ctx;
7949 ath11k_mac_parse_tx_pwr_env(ar, vif, ctx);
7952 /* for QCA6390 bss peer must be created before vdev_start */
7953 if (ab->hw_params.vdev_start_delay &&
7954 arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7955 arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7956 !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7957 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7958 ret = 0;
7959 goto out;
7962 if (WARN_ON(arvif->is_started)) {
7963 ret = -EBUSY;
7964 goto out;
7967 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7968 ret = ath11k_mac_monitor_start(ar);
7969 if (ret) {
7970 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7971 ret);
7972 goto out;
7975 arvif->is_started = true;
7976 goto out;
7979 if (!arvif->is_started) {
7980 ret = ath11k_mac_vdev_start(arvif, ctx);
7981 if (ret) {
7982 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7983 arvif->vdev_id, vif->addr,
7984 ctx->def.chan->center_freq, ret);
7985 goto out;
7988 arvif->is_started = true;
7991 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7992 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7993 ret = ath11k_mac_monitor_start(ar);
7994 if (ret) {
7995 ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7996 ret);
7997 goto out;
8001 /* TODO: Setup ps and cts/rts protection */
8003 ret = 0;
8005 out:
8006 mutex_unlock(&ar->conf_mutex);
8008 return ret;
8011 static void
8012 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
8013 struct ieee80211_vif *vif,
8014 struct ieee80211_bss_conf *link_conf,
8015 struct ieee80211_chanctx_conf *ctx)
8017 struct ath11k *ar = hw->priv;
8018 struct ath11k_base *ab = ar->ab;
8019 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8020 struct ath11k_peer *peer;
8021 int ret;
8023 mutex_lock(&ar->conf_mutex);
8025 ath11k_dbg(ab, ATH11K_DBG_MAC,
8026 "chanctx unassign ptr %p vdev_id %i\n",
8027 ctx, arvif->vdev_id);
8029 if (ab->hw_params.vdev_start_delay &&
8030 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8031 spin_lock_bh(&ab->base_lock);
8032 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
8033 spin_unlock_bh(&ab->base_lock);
8034 if (peer)
8035 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
8038 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8039 ret = ath11k_mac_monitor_stop(ar);
8040 if (ret) {
8041 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
8042 ret);
8043 mutex_unlock(&ar->conf_mutex);
8044 return;
8047 arvif->is_started = false;
8048 mutex_unlock(&ar->conf_mutex);
8049 return;
8052 if (arvif->is_started) {
8053 ret = ath11k_mac_vdev_stop(arvif);
8054 if (ret)
8055 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
8056 arvif->vdev_id, ret);
8058 arvif->is_started = false;
8061 if (ab->hw_params.vdev_start_delay &&
8062 arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
8063 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
8065 if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
8066 ar->num_started_vdevs == 1 &&
8067 test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
8068 ret = ath11k_mac_monitor_stop(ar);
8069 if (ret)
8070 /* continue even if there's an error */
8071 ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
8072 ret);
8075 if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
8076 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
8078 mutex_unlock(&ar->conf_mutex);
8081 static int
8082 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
8083 struct ieee80211_vif_chanctx_switch *vifs,
8084 int n_vifs,
8085 enum ieee80211_chanctx_switch_mode mode)
8087 struct ath11k *ar = hw->priv;
8089 mutex_lock(&ar->conf_mutex);
8091 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8092 "chanctx switch n_vifs %d mode %d\n",
8093 n_vifs, mode);
8094 ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
8096 mutex_unlock(&ar->conf_mutex);
8098 return 0;
8101 static int
8102 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
8104 struct ath11k_vif *arvif;
8105 int ret = 0;
8107 mutex_lock(&ar->conf_mutex);
8108 list_for_each_entry(arvif, &ar->arvifs, list) {
8109 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
8110 param, arvif->vdev_id, value);
8112 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8113 param, value);
8114 if (ret) {
8115 ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
8116 param, arvif->vdev_id, ret);
8117 break;
8120 mutex_unlock(&ar->conf_mutex);
8121 return ret;
8124 /* mac80211 stores device specific RTS/Fragmentation threshold value,
8125 * this is set interface specific to firmware from ath11k driver
8127 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
8129 struct ath11k *ar = hw->priv;
8130 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
8132 return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
8135 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
8137 /* Even though there's a WMI vdev param for fragmentation threshold no
8138 * known firmware actually implements it. Moreover it is not possible to
8139 * rely frame fragmentation to mac80211 because firmware clears the
8140 * "more fragments" bit in frame control making it impossible for remote
8141 * devices to reassemble frames.
8143 * Hence implement a dummy callback just to say fragmentation isn't
8144 * supported. This effectively prevents mac80211 from doing frame
8145 * fragmentation in software.
8147 return -EOPNOTSUPP;
8150 static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
8152 long time_left;
8153 int ret = 0;
8155 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
8156 (atomic_read(&ar->dp.num_tx_pending) == 0),
8157 ATH11K_FLUSH_TIMEOUT);
8158 if (time_left == 0) {
8159 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
8160 atomic_read(&ar->dp.num_tx_pending));
8161 ret = -ETIMEDOUT;
8164 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
8165 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
8166 ATH11K_FLUSH_TIMEOUT);
8167 if (time_left == 0) {
8168 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
8169 atomic_read(&ar->num_pending_mgmt_tx));
8170 ret = -ETIMEDOUT;
8173 return ret;
8176 int ath11k_mac_wait_tx_complete(struct ath11k *ar)
8178 ath11k_mac_drain_tx(ar);
8179 return ath11k_mac_flush_tx_complete(ar);
8182 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
8183 u32 queues, bool drop)
8185 struct ath11k *ar = hw->priv;
8187 if (drop)
8188 return;
8190 ath11k_mac_flush_tx_complete(ar);
8193 static bool
8194 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
8195 enum nl80211_band band,
8196 const struct cfg80211_bitrate_mask *mask)
8198 int num_rates = 0;
8200 num_rates = hweight32(mask->control[band].legacy);
8202 if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
8203 return false;
8205 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
8206 return false;
8208 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
8209 return false;
8211 return num_rates == 1;
8214 static __le16
8215 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
8217 if (he_cap->he_cap_elem.phy_cap_info[0] &
8218 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
8219 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
8221 if (he_cap->he_cap_elem.phy_cap_info[0] &
8222 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8223 return he_cap->he_mcs_nss_supp.tx_mcs_160;
8225 return he_cap->he_mcs_nss_supp.tx_mcs_80;
8228 static bool
8229 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
8230 struct ath11k_vif *arvif,
8231 enum nl80211_band band,
8232 const struct cfg80211_bitrate_mask *mask,
8233 int *nss)
8235 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
8236 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8237 const struct ieee80211_sta_he_cap *he_cap;
8238 u16 he_mcs_map = 0;
8239 u8 ht_nss_mask = 0;
8240 u8 vht_nss_mask = 0;
8241 u8 he_nss_mask = 0;
8242 int i;
8244 /* No need to consider legacy here. Basic rates are always present
8245 * in bitrate mask
8248 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
8249 if (mask->control[band].ht_mcs[i] == 0)
8250 continue;
8251 else if (mask->control[band].ht_mcs[i] ==
8252 sband->ht_cap.mcs.rx_mask[i])
8253 ht_nss_mask |= BIT(i);
8254 else
8255 return false;
8258 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
8259 if (mask->control[band].vht_mcs[i] == 0)
8260 continue;
8261 else if (mask->control[band].vht_mcs[i] ==
8262 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
8263 vht_nss_mask |= BIT(i);
8264 else
8265 return false;
8268 he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
8269 if (!he_cap)
8270 return false;
8272 he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
8274 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
8275 if (mask->control[band].he_mcs[i] == 0)
8276 continue;
8278 if (mask->control[band].he_mcs[i] ==
8279 ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
8280 he_nss_mask |= BIT(i);
8281 else
8282 return false;
8285 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
8286 return false;
8288 if (ht_nss_mask == 0)
8289 return false;
8291 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
8292 return false;
8294 *nss = fls(ht_nss_mask);
8296 return true;
8299 static int
8300 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
8301 enum nl80211_band band,
8302 const struct cfg80211_bitrate_mask *mask,
8303 u32 *rate, u8 *nss)
8305 int rate_idx;
8306 u16 bitrate;
8307 u8 preamble;
8308 u8 hw_rate;
8310 if (hweight32(mask->control[band].legacy) != 1)
8311 return -EINVAL;
8313 rate_idx = ffs(mask->control[band].legacy) - 1;
8315 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
8316 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
8318 hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
8319 bitrate = ath11k_legacy_rates[rate_idx].bitrate;
8321 if (ath11k_mac_bitrate_is_cck(bitrate))
8322 preamble = WMI_RATE_PREAMBLE_CCK;
8323 else
8324 preamble = WMI_RATE_PREAMBLE_OFDM;
8326 *nss = 1;
8327 *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
8329 return 0;
8332 static int
8333 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
8335 struct ath11k *ar = arvif->ar;
8336 int ret;
8338 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
8339 if (he_gi && he_gi != 0xFF)
8340 he_gi += 1;
8342 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8343 WMI_VDEV_PARAM_SGI, he_gi);
8344 if (ret) {
8345 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
8346 he_gi, ret);
8347 return ret;
8349 /* start from 1 */
8350 if (he_ltf != 0xFF)
8351 he_ltf += 1;
8353 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8354 WMI_VDEV_PARAM_HE_LTF, he_ltf);
8355 if (ret) {
8356 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
8357 he_ltf, ret);
8358 return ret;
8361 return 0;
8364 static int
8365 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
8367 struct ath11k *ar = arvif->ar;
8368 int ret;
8369 u32 he_ar_gi_ltf;
8371 if (he_gi != 0xFF) {
8372 switch (he_gi) {
8373 case NL80211_RATE_INFO_HE_GI_0_8:
8374 he_gi = WMI_AUTORATE_800NS_GI;
8375 break;
8376 case NL80211_RATE_INFO_HE_GI_1_6:
8377 he_gi = WMI_AUTORATE_1600NS_GI;
8378 break;
8379 case NL80211_RATE_INFO_HE_GI_3_2:
8380 he_gi = WMI_AUTORATE_3200NS_GI;
8381 break;
8382 default:
8383 ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
8384 return -EINVAL;
8388 if (he_ltf != 0xFF) {
8389 switch (he_ltf) {
8390 case NL80211_RATE_INFO_HE_1XLTF:
8391 he_ltf = WMI_HE_AUTORATE_LTF_1X;
8392 break;
8393 case NL80211_RATE_INFO_HE_2XLTF:
8394 he_ltf = WMI_HE_AUTORATE_LTF_2X;
8395 break;
8396 case NL80211_RATE_INFO_HE_4XLTF:
8397 he_ltf = WMI_HE_AUTORATE_LTF_4X;
8398 break;
8399 default:
8400 ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
8401 return -EINVAL;
8405 he_ar_gi_ltf = he_gi | he_ltf;
8406 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8407 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8408 he_ar_gi_ltf);
8409 if (ret) {
8410 ath11k_warn(ar->ab,
8411 "failed to set he autorate gi %u ltf %u: %d\n",
8412 he_gi, he_ltf, ret);
8413 return ret;
8416 return 0;
8419 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
8420 u32 rate, u8 nss, u8 sgi, u8 ldpc,
8421 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
8423 struct ath11k *ar = arvif->ar;
8424 u32 vdev_param;
8425 int ret;
8427 lockdep_assert_held(&ar->conf_mutex);
8429 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8430 "set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n",
8431 arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
8432 he_ltf, he_fixed_rate);
8434 if (!arvif->vif->bss_conf.he_support) {
8435 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
8436 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8437 vdev_param, rate);
8438 if (ret) {
8439 ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
8440 rate, ret);
8441 return ret;
8445 vdev_param = WMI_VDEV_PARAM_NSS;
8446 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8447 vdev_param, nss);
8448 if (ret) {
8449 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
8450 nss, ret);
8451 return ret;
8454 vdev_param = WMI_VDEV_PARAM_LDPC;
8455 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8456 vdev_param, ldpc);
8457 if (ret) {
8458 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
8459 ldpc, ret);
8460 return ret;
8463 if (arvif->vif->bss_conf.he_support) {
8464 if (he_fixed_rate) {
8465 ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
8466 he_ltf);
8467 if (ret) {
8468 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
8469 ret);
8470 return ret;
8472 } else {
8473 ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
8474 he_ltf);
8475 if (ret) {
8476 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
8477 ret);
8478 return ret;
8481 } else {
8482 vdev_param = WMI_VDEV_PARAM_SGI;
8483 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8484 vdev_param, sgi);
8485 if (ret) {
8486 ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
8487 sgi, ret);
8488 return ret;
8492 return 0;
8495 static bool
8496 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
8497 enum nl80211_band band,
8498 const struct cfg80211_bitrate_mask *mask)
8500 int i;
8501 u16 vht_mcs;
8503 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8504 vht_mcs = mask->control[band].vht_mcs[i];
8506 switch (vht_mcs) {
8507 case 0:
8508 case BIT(8) - 1:
8509 case BIT(9) - 1:
8510 case BIT(10) - 1:
8511 break;
8512 default:
8513 return false;
8517 return true;
8520 static bool
8521 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
8522 enum nl80211_band band,
8523 const struct cfg80211_bitrate_mask *mask)
8525 int i;
8526 u16 he_mcs;
8528 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
8529 he_mcs = mask->control[band].he_mcs[i];
8531 switch (he_mcs) {
8532 case 0:
8533 case BIT(8) - 1:
8534 case BIT(10) - 1:
8535 case BIT(12) - 1:
8536 break;
8537 default:
8538 return false;
8542 return true;
8545 static void ath11k_mac_set_bitrate_mask_iter(void *data,
8546 struct ieee80211_sta *sta)
8548 struct ath11k_vif *arvif = data;
8549 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8550 struct ath11k *ar = arvif->ar;
8552 spin_lock_bh(&ar->data_lock);
8553 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8554 spin_unlock_bh(&ar->data_lock);
8556 ieee80211_queue_work(ar->hw, &arsta->update_wk);
8559 static void ath11k_mac_disable_peer_fixed_rate(void *data,
8560 struct ieee80211_sta *sta)
8562 struct ath11k_vif *arvif = data;
8563 struct ath11k *ar = arvif->ar;
8564 int ret;
8566 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
8567 arvif->vdev_id,
8568 WMI_PEER_PARAM_FIXED_RATE,
8569 WMI_FIXED_RATE_NONE);
8570 if (ret)
8571 ath11k_warn(ar->ab,
8572 "failed to disable peer fixed rate for STA %pM ret %d\n",
8573 sta->addr, ret);
8576 static bool
8577 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
8578 const struct cfg80211_bitrate_mask *mask)
8580 bool he_fixed_rate = false, vht_fixed_rate = false;
8581 struct ath11k_peer *peer;
8582 const u16 *vht_mcs_mask, *he_mcs_mask;
8583 struct ieee80211_link_sta *deflink;
8584 u8 vht_nss, he_nss;
8585 bool ret = true;
8587 vht_mcs_mask = mask->control[band].vht_mcs;
8588 he_mcs_mask = mask->control[band].he_mcs;
8590 if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
8591 vht_fixed_rate = true;
8593 if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
8594 he_fixed_rate = true;
8596 if (!vht_fixed_rate && !he_fixed_rate)
8597 return true;
8599 vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
8600 he_nss = ath11k_mac_max_he_nss(he_mcs_mask);
8602 rcu_read_lock();
8603 spin_lock_bh(&ar->ab->base_lock);
8604 list_for_each_entry(peer, &ar->ab->peers, list) {
8605 if (peer->sta) {
8606 deflink = &peer->sta->deflink;
8608 if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
8609 deflink->rx_nss < vht_nss)) {
8610 ret = false;
8611 goto out;
8614 if (he_fixed_rate && (!deflink->he_cap.has_he ||
8615 deflink->rx_nss < he_nss)) {
8616 ret = false;
8617 goto out;
8622 out:
8623 spin_unlock_bh(&ar->ab->base_lock);
8624 rcu_read_unlock();
8625 return ret;
8628 static int
8629 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8630 struct ieee80211_vif *vif,
8631 const struct cfg80211_bitrate_mask *mask)
8633 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8634 struct cfg80211_chan_def def;
8635 struct ath11k_pdev_cap *cap;
8636 struct ath11k *ar = arvif->ar;
8637 enum nl80211_band band;
8638 const u8 *ht_mcs_mask;
8639 const u16 *vht_mcs_mask;
8640 const u16 *he_mcs_mask;
8641 u8 he_ltf = 0;
8642 u8 he_gi = 0;
8643 u32 rate;
8644 u8 nss;
8645 u8 sgi;
8646 u8 ldpc;
8647 int single_nss;
8648 int ret;
8649 int num_rates;
8650 bool he_fixed_rate = false;
8652 if (ath11k_mac_vif_chan(vif, &def))
8653 return -EPERM;
8655 band = def.chan->band;
8656 cap = &ar->pdev->cap;
8657 ht_mcs_mask = mask->control[band].ht_mcs;
8658 vht_mcs_mask = mask->control[band].vht_mcs;
8659 he_mcs_mask = mask->control[band].he_mcs;
8660 ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
8662 sgi = mask->control[band].gi;
8663 if (sgi == NL80211_TXRATE_FORCE_LGI)
8664 return -EINVAL;
8666 he_gi = mask->control[band].he_gi;
8667 he_ltf = mask->control[band].he_ltf;
8669 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
8670 * requires passing at least one of used basic rates along with them.
8671 * Fixed rate setting across different preambles(legacy, HT, VHT) is
8672 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
8673 * suitable for setting single HT/VHT rates.
8674 * But, there could be a single basic rate passed from userspace which
8675 * can be done through the FIXED_RATE param.
8677 if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
8678 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
8679 &nss);
8680 if (ret) {
8681 ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
8682 arvif->vdev_id, ret);
8683 return ret;
8685 ieee80211_iterate_stations_atomic(ar->hw,
8686 ath11k_mac_disable_peer_fixed_rate,
8687 arvif);
8688 } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
8689 &single_nss)) {
8690 rate = WMI_FIXED_RATE_NONE;
8691 nss = single_nss;
8692 mutex_lock(&ar->conf_mutex);
8693 arvif->bitrate_mask = *mask;
8694 ieee80211_iterate_stations_atomic(ar->hw,
8695 ath11k_mac_set_bitrate_mask_iter,
8696 arvif);
8697 mutex_unlock(&ar->conf_mutex);
8698 } else {
8699 rate = WMI_FIXED_RATE_NONE;
8701 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
8702 ath11k_warn(ar->ab,
8703 "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
8704 nss = min_t(u32, ar->num_tx_chains,
8705 ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
8707 /* If multiple rates across different preambles are given
8708 * we can reconfigure this info with all peers using PEER_ASSOC
8709 * command with the below exception cases.
8710 * - Single VHT Rate : peer_assoc command accommodates only MCS
8711 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
8712 * mandates passing basic rates along with HT/VHT rates, FW
8713 * doesn't allow switching from VHT to Legacy. Hence instead of
8714 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
8715 * we could set this VHT rate as peer fixed rate param, which
8716 * will override FIXED rate and FW rate control algorithm.
8717 * If single VHT rate is passed along with HT rates, we select
8718 * the VHT rate as fixed rate for vht peers.
8719 * - Multiple VHT Rates : When Multiple VHT rates are given,this
8720 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
8721 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
8722 * RATEMASK_CMDID can cover all use cases of setting rates
8723 * across multiple preambles and rates within same type.
8724 * But requires more validation of the command at this point.
8727 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
8728 mask);
8730 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
8731 num_rates > 1) {
8732 /* TODO: Handle multiple VHT MCS values setting using
8733 * RATEMASK CMD
8735 ath11k_warn(ar->ab,
8736 "setting %d mcs values in bitrate mask not supported\n",
8737 num_rates);
8738 return -EINVAL;
8741 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
8742 mask);
8743 if (num_rates == 1)
8744 he_fixed_rate = true;
8746 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
8747 num_rates > 1) {
8748 ath11k_warn(ar->ab,
8749 "Setting more than one HE MCS Value in bitrate mask not supported\n");
8750 return -EINVAL;
8753 mutex_lock(&ar->conf_mutex);
8754 ieee80211_iterate_stations_atomic(ar->hw,
8755 ath11k_mac_disable_peer_fixed_rate,
8756 arvif);
8758 arvif->bitrate_mask = *mask;
8759 ieee80211_iterate_stations_atomic(ar->hw,
8760 ath11k_mac_set_bitrate_mask_iter,
8761 arvif);
8763 mutex_unlock(&ar->conf_mutex);
8766 mutex_lock(&ar->conf_mutex);
8768 ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
8769 he_ltf, he_fixed_rate);
8770 if (ret) {
8771 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
8772 arvif->vdev_id, ret);
8775 mutex_unlock(&ar->conf_mutex);
8777 return ret;
8780 static void
8781 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
8782 enum ieee80211_reconfig_type reconfig_type)
8784 struct ath11k *ar = hw->priv;
8785 struct ath11k_base *ab = ar->ab;
8786 int recovery_count;
8787 struct ath11k_vif *arvif;
8789 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8790 return;
8792 mutex_lock(&ar->conf_mutex);
8794 if (ar->state == ATH11K_STATE_RESTARTED) {
8795 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
8796 ar->pdev->pdev_id);
8797 ar->state = ATH11K_STATE_ON;
8798 ieee80211_wake_queues(ar->hw);
8800 if (ar->ab->hw_params.current_cc_support &&
8801 ar->alpha2[0] != 0 && ar->alpha2[1] != 0)
8802 ath11k_reg_set_cc(ar);
8804 if (ab->is_reset) {
8805 recovery_count = atomic_inc_return(&ab->recovery_count);
8806 ath11k_dbg(ab, ATH11K_DBG_BOOT,
8807 "recovery count %d\n", recovery_count);
8808 /* When there are multiple radios in an SOC,
8809 * the recovery has to be done for each radio
8811 if (recovery_count == ab->num_radios) {
8812 atomic_dec(&ab->reset_count);
8813 complete(&ab->reset_complete);
8814 ab->is_reset = false;
8815 atomic_set(&ab->fail_cont_count, 0);
8816 ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
8819 if (ar->ab->hw_params.support_fw_mac_sequence) {
8820 list_for_each_entry(arvif, &ar->arvifs, list) {
8821 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
8822 ieee80211_hw_restart_disconnect(arvif->vif);
8827 mutex_unlock(&ar->conf_mutex);
8830 static void
8831 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
8832 struct ieee80211_channel *channel)
8834 int ret;
8835 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8837 lockdep_assert_held(&ar->conf_mutex);
8839 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
8840 ar->rx_channel != channel)
8841 return;
8843 if (ar->scan.state != ATH11K_SCAN_IDLE) {
8844 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8845 "ignoring bss chan info req while scanning..\n");
8846 return;
8849 reinit_completion(&ar->bss_survey_done);
8851 ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
8852 if (ret) {
8853 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
8854 return;
8857 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8858 if (ret == 0)
8859 ath11k_warn(ar->ab, "bss channel survey timed out\n");
8862 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8863 struct survey_info *survey)
8865 struct ath11k *ar = hw->priv;
8866 struct ieee80211_supported_band *sband;
8867 struct survey_info *ar_survey;
8868 int ret = 0;
8870 if (idx >= ATH11K_NUM_CHANS)
8871 return -ENOENT;
8873 ar_survey = &ar->survey[idx];
8875 mutex_lock(&ar->conf_mutex);
8877 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8878 if (sband && idx >= sband->n_channels) {
8879 idx -= sband->n_channels;
8880 sband = NULL;
8883 if (!sband)
8884 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8885 if (sband && idx >= sband->n_channels) {
8886 idx -= sband->n_channels;
8887 sband = NULL;
8890 if (!sband)
8891 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8892 if (!sband || idx >= sband->n_channels) {
8893 ret = -ENOENT;
8894 goto exit;
8897 ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8899 spin_lock_bh(&ar->data_lock);
8900 memcpy(survey, ar_survey, sizeof(*survey));
8901 spin_unlock_bh(&ar->data_lock);
8903 survey->channel = &sband->channels[idx];
8905 if (ar->rx_channel == survey->channel)
8906 survey->filled |= SURVEY_INFO_IN_USE;
8908 exit:
8909 mutex_unlock(&ar->conf_mutex);
8910 return ret;
8913 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8914 struct ath11k_sta *arsta,
8915 char *pre,
8916 bool clear)
8918 struct ath11k *ar = arsta->arvif->ar;
8919 int i;
8920 s8 rssi;
8922 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8923 sinfo->chains &= ~BIT(i);
8924 rssi = arsta->chain_signal[i];
8925 if (clear)
8926 arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8928 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8929 "sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8931 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8932 rssi != ATH11K_INVALID_RSSI_FULL &&
8933 rssi != ATH11K_INVALID_RSSI_EMPTY &&
8934 rssi != 0) {
8935 sinfo->chain_signal[i] = rssi;
8936 sinfo->chains |= BIT(i);
8937 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8942 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8943 struct ieee80211_vif *vif,
8944 struct ieee80211_sta *sta,
8945 struct station_info *sinfo)
8947 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8948 struct ath11k *ar = arsta->arvif->ar;
8949 s8 signal;
8950 bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8951 ar->ab->wmi_ab.svc_map);
8953 sinfo->rx_duration = arsta->rx_duration;
8954 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8956 sinfo->tx_duration = arsta->tx_duration;
8957 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8959 if (arsta->txrate.legacy || arsta->txrate.nss) {
8960 if (arsta->txrate.legacy) {
8961 sinfo->txrate.legacy = arsta->txrate.legacy;
8962 } else {
8963 sinfo->txrate.mcs = arsta->txrate.mcs;
8964 sinfo->txrate.nss = arsta->txrate.nss;
8965 sinfo->txrate.bw = arsta->txrate.bw;
8966 sinfo->txrate.he_gi = arsta->txrate.he_gi;
8967 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8968 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8970 sinfo->txrate.flags = arsta->txrate.flags;
8971 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8974 ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8976 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8977 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8978 ar->ab->hw_params.supports_rssi_stats &&
8979 !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8980 WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8981 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8984 signal = arsta->rssi_comb;
8985 if (!signal &&
8986 arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8987 ar->ab->hw_params.supports_rssi_stats &&
8988 !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8989 WMI_REQUEST_VDEV_STAT)))
8990 signal = arsta->rssi_beacon;
8992 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8993 "sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8994 db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8996 if (signal) {
8997 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8998 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
9001 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
9003 if (!db2dbm)
9004 sinfo->signal_avg += ATH11K_DEFAULT_NOISE_FLOOR;
9006 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
9009 #if IS_ENABLED(CONFIG_IPV6)
9010 static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
9011 struct ath11k_arp_ns_offload *offload)
9013 int i;
9015 for (i = 0; i < offload->ipv6_count; i++) {
9016 offload->self_ipv6_addr[i][0] = 0xff;
9017 offload->self_ipv6_addr[i][1] = 0x02;
9018 offload->self_ipv6_addr[i][11] = 0x01;
9019 offload->self_ipv6_addr[i][12] = 0xff;
9020 offload->self_ipv6_addr[i][13] =
9021 offload->ipv6_addr[i][13];
9022 offload->self_ipv6_addr[i][14] =
9023 offload->ipv6_addr[i][14];
9024 offload->self_ipv6_addr[i][15] =
9025 offload->ipv6_addr[i][15];
9026 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
9027 offload->self_ipv6_addr[i]);
9031 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
9032 struct ieee80211_vif *vif,
9033 struct inet6_dev *idev)
9035 struct ath11k *ar = hw->priv;
9036 struct ath11k_arp_ns_offload *offload;
9037 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9038 struct inet6_ifaddr *ifa6;
9039 struct ifacaddr6 *ifaca6;
9040 u32 count, scope;
9042 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n");
9044 offload = &arvif->arp_ns_offload;
9045 count = 0;
9047 /* The _ipv6_changed() is called with RCU lock already held in
9048 * atomic_notifier_call_chain(), so we don't need to call
9049 * rcu_read_lock() again here. But note that with CONFIG_PREEMPT_RT
9050 * enabled, read_lock_bh() also calls rcu_read_lock(). This is OK
9051 * because RCU read critical section is allowed to get nested.
9053 read_lock_bh(&idev->lock);
9055 memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
9056 memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
9057 memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
9059 /* get unicast address */
9060 list_for_each_entry(ifa6, &idev->addr_list, if_list) {
9061 if (count >= ATH11K_IPV6_MAX_COUNT)
9062 goto generate;
9064 if (ifa6->flags & IFA_F_DADFAILED)
9065 continue;
9066 scope = ipv6_addr_src_scope(&ifa6->addr);
9067 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
9068 scope == IPV6_ADDR_SCOPE_GLOBAL) {
9069 memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
9070 sizeof(ifa6->addr.s6_addr));
9071 offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
9072 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n",
9073 count, offload->ipv6_addr[count],
9074 scope);
9075 count++;
9076 } else {
9077 ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
9081 /* get anycast address */
9082 for (ifaca6 = rcu_dereference(idev->ac_list); ifaca6;
9083 ifaca6 = rcu_dereference(ifaca6->aca_next)) {
9084 if (count >= ATH11K_IPV6_MAX_COUNT)
9085 goto generate;
9087 scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
9088 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
9089 scope == IPV6_ADDR_SCOPE_GLOBAL) {
9090 memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
9091 sizeof(ifaca6->aca_addr));
9092 offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
9093 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n",
9094 count, offload->ipv6_addr[count],
9095 scope);
9096 count++;
9097 } else {
9098 ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
9102 generate:
9103 offload->ipv6_count = count;
9104 read_unlock_bh(&idev->lock);
9106 /* generate ns multicast address */
9107 ath11k_generate_ns_mc_addr(ar, offload);
9109 #endif
9111 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
9112 struct ieee80211_vif *vif,
9113 struct cfg80211_gtk_rekey_data *data)
9115 struct ath11k *ar = hw->priv;
9116 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9117 struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
9119 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n",
9120 arvif->vdev_id);
9122 mutex_lock(&ar->conf_mutex);
9124 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
9125 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
9127 /* The supplicant works on big-endian, the firmware expects it on
9128 * little endian.
9130 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
9132 arvif->rekey_data.enable_offload = true;
9134 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
9135 rekey_data->kck, NL80211_KCK_LEN);
9136 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
9137 rekey_data->kck, NL80211_KEK_LEN);
9138 ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
9139 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
9141 mutex_unlock(&ar->conf_mutex);
9144 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
9145 const struct cfg80211_sar_specs *sar)
9147 struct ath11k *ar = hw->priv;
9148 const struct cfg80211_sar_sub_specs *sspec;
9149 int ret, index;
9150 u8 *sar_tbl;
9151 u32 i;
9153 if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
9154 sar->num_sub_specs == 0)
9155 return -EINVAL;
9157 mutex_lock(&ar->conf_mutex);
9159 if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
9160 !ar->ab->hw_params.bios_sar_capa) {
9161 ret = -EOPNOTSUPP;
9162 goto exit;
9165 ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
9166 if (ret) {
9167 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
9168 goto exit;
9171 sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
9172 if (!sar_tbl) {
9173 ret = -ENOMEM;
9174 goto exit;
9177 sspec = sar->sub_specs;
9178 for (i = 0; i < sar->num_sub_specs; i++) {
9179 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
9180 ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
9181 sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
9182 continue;
9185 /* chain0 and chain1 share same power setting */
9186 sar_tbl[sspec->freq_range_index] = sspec->power;
9187 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
9188 sar_tbl[index] = sspec->power;
9189 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
9190 sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
9191 sspec++;
9194 ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
9195 if (ret)
9196 ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
9198 kfree(sar_tbl);
9199 exit:
9200 mutex_unlock(&ar->conf_mutex);
9202 return ret;
9205 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
9206 struct ieee80211_vif *vif)
9208 struct ath11k *ar = hw->priv;
9210 mutex_lock(&ar->conf_mutex);
9212 spin_lock_bh(&ar->data_lock);
9213 ar->scan.roc_notify = false;
9214 spin_unlock_bh(&ar->data_lock);
9216 ath11k_scan_abort(ar);
9218 mutex_unlock(&ar->conf_mutex);
9220 cancel_delayed_work_sync(&ar->scan.timeout);
9222 return 0;
9225 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
9226 struct ieee80211_vif *vif,
9227 struct ieee80211_channel *chan,
9228 int duration,
9229 enum ieee80211_roc_type type)
9231 struct ath11k *ar = hw->priv;
9232 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9233 struct scan_req_params *arg;
9234 int ret;
9235 u32 scan_time_msec;
9237 mutex_lock(&ar->conf_mutex);
9239 spin_lock_bh(&ar->data_lock);
9240 switch (ar->scan.state) {
9241 case ATH11K_SCAN_IDLE:
9242 reinit_completion(&ar->scan.started);
9243 reinit_completion(&ar->scan.completed);
9244 reinit_completion(&ar->scan.on_channel);
9245 ar->scan.state = ATH11K_SCAN_STARTING;
9246 ar->scan.is_roc = true;
9247 ar->scan.vdev_id = arvif->vdev_id;
9248 ar->scan.roc_freq = chan->center_freq;
9249 ar->scan.roc_notify = true;
9250 ret = 0;
9251 break;
9252 case ATH11K_SCAN_STARTING:
9253 case ATH11K_SCAN_RUNNING:
9254 case ATH11K_SCAN_ABORTING:
9255 ret = -EBUSY;
9256 break;
9258 spin_unlock_bh(&ar->data_lock);
9260 if (ret)
9261 goto exit;
9263 scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
9265 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
9266 if (!arg) {
9267 ret = -ENOMEM;
9268 goto exit;
9270 ath11k_wmi_start_scan_init(ar, arg);
9271 arg->num_chan = 1;
9272 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
9273 GFP_KERNEL);
9274 if (!arg->chan_list) {
9275 ret = -ENOMEM;
9276 goto free_arg;
9279 arg->vdev_id = arvif->vdev_id;
9280 arg->scan_id = ATH11K_SCAN_ID;
9281 arg->chan_list[0] = chan->center_freq;
9282 arg->dwell_time_active = scan_time_msec;
9283 arg->dwell_time_passive = scan_time_msec;
9284 arg->max_scan_time = scan_time_msec;
9285 arg->scan_f_passive = 1;
9286 arg->burst_duration = duration;
9288 if (!ar->ab->hw_params.single_pdev_only)
9289 arg->scan_f_filter_prb_req = 1;
9291 ret = ath11k_start_scan(ar, arg);
9292 if (ret) {
9293 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
9295 spin_lock_bh(&ar->data_lock);
9296 ar->scan.state = ATH11K_SCAN_IDLE;
9297 spin_unlock_bh(&ar->data_lock);
9298 goto free_chan_list;
9301 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
9302 if (ret == 0) {
9303 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
9304 ret = ath11k_scan_stop(ar);
9305 if (ret)
9306 ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
9307 ret = -ETIMEDOUT;
9308 goto free_chan_list;
9311 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
9312 msecs_to_jiffies(duration));
9314 ret = 0;
9316 free_chan_list:
9317 kfree(arg->chan_list);
9318 free_arg:
9319 kfree(arg);
9320 exit:
9321 mutex_unlock(&ar->conf_mutex);
9322 return ret;
9325 static int ath11k_fw_stats_request(struct ath11k *ar,
9326 struct stats_request_params *req_param)
9328 struct ath11k_base *ab = ar->ab;
9329 unsigned long time_left;
9330 int ret;
9332 lockdep_assert_held(&ar->conf_mutex);
9334 spin_lock_bh(&ar->data_lock);
9335 ar->fw_stats_done = false;
9336 ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
9337 spin_unlock_bh(&ar->data_lock);
9339 reinit_completion(&ar->fw_stats_complete);
9341 ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
9342 if (ret) {
9343 ath11k_warn(ab, "could not request fw stats (%d)\n",
9344 ret);
9345 return ret;
9348 time_left = wait_for_completion_timeout(&ar->fw_stats_complete,
9349 1 * HZ);
9351 if (!time_left)
9352 return -ETIMEDOUT;
9354 return 0;
9357 static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
9358 struct ieee80211_vif *vif,
9359 int *dbm)
9361 struct ath11k *ar = hw->priv;
9362 struct ath11k_base *ab = ar->ab;
9363 struct stats_request_params req_param = {0};
9364 struct ath11k_fw_stats_pdev *pdev;
9365 int ret;
9367 /* Final Tx power is minimum of Target Power, CTL power, Regulatory
9368 * Power, PSD EIRP Power. We just know the Regulatory power from the
9369 * regulatory rules obtained. FW knows all these power and sets the min
9370 * of these. Hence, we request the FW pdev stats in which FW reports
9371 * the minimum of all vdev's channel Tx power.
9373 mutex_lock(&ar->conf_mutex);
9375 if (ar->state != ATH11K_STATE_ON)
9376 goto err_fallback;
9378 /* Firmware doesn't provide Tx power during CAC hence no need to fetch
9379 * the stats.
9381 if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
9382 mutex_unlock(&ar->conf_mutex);
9383 return -EAGAIN;
9386 req_param.pdev_id = ar->pdev->pdev_id;
9387 req_param.stats_id = WMI_REQUEST_PDEV_STAT;
9389 ret = ath11k_fw_stats_request(ar, &req_param);
9390 if (ret) {
9391 ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
9392 goto err_fallback;
9395 spin_lock_bh(&ar->data_lock);
9396 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
9397 struct ath11k_fw_stats_pdev, list);
9398 if (!pdev) {
9399 spin_unlock_bh(&ar->data_lock);
9400 goto err_fallback;
9403 /* tx power is set as 2 units per dBm in FW. */
9404 *dbm = pdev->chan_tx_power / 2;
9406 spin_unlock_bh(&ar->data_lock);
9407 mutex_unlock(&ar->conf_mutex);
9409 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
9410 pdev->chan_tx_power, *dbm);
9411 return 0;
9413 err_fallback:
9414 mutex_unlock(&ar->conf_mutex);
9415 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
9416 *dbm = vif->bss_conf.txpower;
9417 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
9418 *dbm);
9419 return 0;
9422 static int ath11k_mac_station_add(struct ath11k *ar,
9423 struct ieee80211_vif *vif,
9424 struct ieee80211_sta *sta)
9426 struct ath11k_base *ab = ar->ab;
9427 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9428 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9429 struct peer_create_params peer_param;
9430 int ret;
9432 lockdep_assert_held(&ar->conf_mutex);
9434 ret = ath11k_mac_inc_num_stations(arvif, sta);
9435 if (ret) {
9436 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
9437 ar->max_num_stations);
9438 goto exit;
9441 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
9442 if (!arsta->rx_stats) {
9443 ret = -ENOMEM;
9444 goto dec_num_station;
9447 peer_param.vdev_id = arvif->vdev_id;
9448 peer_param.peer_addr = sta->addr;
9449 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9451 ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
9452 if (ret) {
9453 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
9454 sta->addr, arvif->vdev_id);
9455 goto free_rx_stats;
9458 ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
9459 sta->addr, arvif->vdev_id);
9461 if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
9462 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
9463 if (!arsta->tx_stats) {
9464 ret = -ENOMEM;
9465 goto free_peer;
9469 if (ieee80211_vif_is_mesh(vif)) {
9470 ath11k_dbg(ab, ATH11K_DBG_MAC,
9471 "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
9472 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
9473 arvif->vdev_id,
9474 WMI_PEER_USE_4ADDR, 1);
9475 if (ret) {
9476 ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
9477 sta->addr, ret);
9478 goto free_tx_stats;
9482 ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
9483 if (ret) {
9484 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
9485 sta->addr, arvif->vdev_id, ret);
9486 goto free_tx_stats;
9489 if (ab->hw_params.vdev_start_delay &&
9490 !arvif->is_started &&
9491 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
9492 ret = ath11k_mac_start_vdev_delay(ar->hw, vif);
9493 if (ret) {
9494 ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
9495 goto free_tx_stats;
9499 ewma_avg_rssi_init(&arsta->avg_rssi);
9500 return 0;
9502 free_tx_stats:
9503 kfree(arsta->tx_stats);
9504 arsta->tx_stats = NULL;
9505 free_peer:
9506 ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
9507 free_rx_stats:
9508 kfree(arsta->rx_stats);
9509 arsta->rx_stats = NULL;
9510 dec_num_station:
9511 ath11k_mac_dec_num_stations(arvif, sta);
9512 exit:
9513 return ret;
9516 static int ath11k_mac_station_remove(struct ath11k *ar,
9517 struct ieee80211_vif *vif,
9518 struct ieee80211_sta *sta)
9520 struct ath11k_base *ab = ar->ab;
9521 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9522 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9523 int ret;
9525 if (ab->hw_params.vdev_start_delay &&
9526 arvif->is_started &&
9527 arvif->vdev_type != WMI_VDEV_TYPE_AP) {
9528 ret = ath11k_mac_stop_vdev_early(ar->hw, vif);
9529 if (ret) {
9530 ath11k_warn(ab, "failed to do early vdev stop: %d\n", ret);
9531 return ret;
9535 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
9537 ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
9538 if (ret)
9539 ath11k_warn(ab, "Failed to delete peer: %pM for VDEV: %d\n",
9540 sta->addr, arvif->vdev_id);
9541 else
9542 ath11k_dbg(ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
9543 sta->addr, arvif->vdev_id);
9545 ath11k_mac_dec_num_stations(arvif, sta);
9547 kfree(arsta->tx_stats);
9548 arsta->tx_stats = NULL;
9550 kfree(arsta->rx_stats);
9551 arsta->rx_stats = NULL;
9553 return ret;
9556 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
9557 struct ieee80211_vif *vif,
9558 struct ieee80211_sta *sta,
9559 enum ieee80211_sta_state old_state,
9560 enum ieee80211_sta_state new_state)
9562 struct ath11k *ar = hw->priv;
9563 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9564 struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9565 enum ieee80211_ap_reg_power power_type;
9566 struct cur_regulatory_info *reg_info;
9567 struct ath11k_peer *peer;
9568 int ret = 0;
9570 /* cancel must be done outside the mutex to avoid deadlock */
9571 if ((old_state == IEEE80211_STA_NONE &&
9572 new_state == IEEE80211_STA_NOTEXIST)) {
9573 cancel_work_sync(&arsta->update_wk);
9574 cancel_work_sync(&arsta->set_4addr_wk);
9577 mutex_lock(&ar->conf_mutex);
9579 if (old_state == IEEE80211_STA_NOTEXIST &&
9580 new_state == IEEE80211_STA_NONE) {
9581 memset(arsta, 0, sizeof(*arsta));
9582 arsta->arvif = arvif;
9583 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
9584 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
9585 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
9587 ret = ath11k_mac_station_add(ar, vif, sta);
9588 if (ret)
9589 ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
9590 sta->addr, arvif->vdev_id);
9591 } else if ((old_state == IEEE80211_STA_NONE &&
9592 new_state == IEEE80211_STA_NOTEXIST)) {
9593 ret = ath11k_mac_station_remove(ar, vif, sta);
9594 if (ret)
9595 ath11k_warn(ar->ab, "Failed to remove station: %pM for VDEV: %d\n",
9596 sta->addr, arvif->vdev_id);
9598 mutex_lock(&ar->ab->tbl_mtx_lock);
9599 spin_lock_bh(&ar->ab->base_lock);
9600 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9601 if (peer && peer->sta == sta) {
9602 ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
9603 vif->addr, arvif->vdev_id);
9604 ath11k_peer_rhash_delete(ar->ab, peer);
9605 peer->sta = NULL;
9606 list_del(&peer->list);
9607 kfree(peer);
9608 ar->num_peers--;
9610 spin_unlock_bh(&ar->ab->base_lock);
9611 mutex_unlock(&ar->ab->tbl_mtx_lock);
9612 } else if (old_state == IEEE80211_STA_AUTH &&
9613 new_state == IEEE80211_STA_ASSOC &&
9614 (vif->type == NL80211_IFTYPE_AP ||
9615 vif->type == NL80211_IFTYPE_MESH_POINT ||
9616 vif->type == NL80211_IFTYPE_ADHOC)) {
9617 ret = ath11k_station_assoc(ar, vif, sta, false);
9618 if (ret)
9619 ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
9620 sta->addr);
9622 spin_lock_bh(&ar->data_lock);
9623 /* Set arsta bw and prev bw */
9624 arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
9625 arsta->bw_prev = arsta->bw;
9626 spin_unlock_bh(&ar->data_lock);
9627 } else if (old_state == IEEE80211_STA_ASSOC &&
9628 new_state == IEEE80211_STA_AUTHORIZED) {
9629 spin_lock_bh(&ar->ab->base_lock);
9631 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9632 if (peer)
9633 peer->is_authorized = true;
9635 spin_unlock_bh(&ar->ab->base_lock);
9637 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
9638 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
9639 arvif->vdev_id,
9640 WMI_PEER_AUTHORIZE,
9642 if (ret)
9643 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
9644 sta->addr, arvif->vdev_id, ret);
9647 if (!ret &&
9648 ath11k_wmi_supports_6ghz_cc_ext(ar) &&
9649 arvif->vdev_type == WMI_VDEV_TYPE_STA &&
9650 arvif->chanctx.def.chan &&
9651 arvif->chanctx.def.chan->band == NL80211_BAND_6GHZ) {
9652 reg_info = &ar->ab->reg_info_store[ar->pdev_idx];
9653 power_type = vif->bss_conf.power_type;
9655 if (power_type == IEEE80211_REG_UNSET_AP) {
9656 ath11k_warn(ar->ab, "invalid power type %d\n",
9657 power_type);
9658 ret = -EINVAL;
9659 } else {
9660 ret = ath11k_reg_handle_chan_list(ar->ab,
9661 reg_info,
9662 power_type);
9663 if (ret)
9664 ath11k_warn(ar->ab,
9665 "failed to handle chan list with power type %d\n",
9666 power_type);
9669 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
9670 new_state == IEEE80211_STA_ASSOC) {
9671 spin_lock_bh(&ar->ab->base_lock);
9673 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9674 if (peer)
9675 peer->is_authorized = false;
9677 spin_unlock_bh(&ar->ab->base_lock);
9678 } else if (old_state == IEEE80211_STA_ASSOC &&
9679 new_state == IEEE80211_STA_AUTH &&
9680 (vif->type == NL80211_IFTYPE_AP ||
9681 vif->type == NL80211_IFTYPE_MESH_POINT ||
9682 vif->type == NL80211_IFTYPE_ADHOC)) {
9683 ret = ath11k_station_disassoc(ar, vif, sta);
9684 if (ret)
9685 ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
9686 sta->addr);
9689 mutex_unlock(&ar->conf_mutex);
9690 return ret;
9693 static const struct ieee80211_ops ath11k_ops = {
9694 .tx = ath11k_mac_op_tx,
9695 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
9696 .start = ath11k_mac_op_start,
9697 .stop = ath11k_mac_op_stop,
9698 .reconfig_complete = ath11k_mac_op_reconfig_complete,
9699 .add_interface = ath11k_mac_op_add_interface,
9700 .remove_interface = ath11k_mac_op_remove_interface,
9701 .update_vif_offload = ath11k_mac_op_update_vif_offload,
9702 .config = ath11k_mac_op_config,
9703 .bss_info_changed = ath11k_mac_op_bss_info_changed,
9704 .configure_filter = ath11k_mac_op_configure_filter,
9705 .hw_scan = ath11k_mac_op_hw_scan,
9706 .cancel_hw_scan = ath11k_mac_op_cancel_hw_scan,
9707 .set_key = ath11k_mac_op_set_key,
9708 .set_rekey_data = ath11k_mac_op_set_rekey_data,
9709 .sta_state = ath11k_mac_op_sta_state,
9710 .sta_set_4addr = ath11k_mac_op_sta_set_4addr,
9711 .sta_set_txpwr = ath11k_mac_op_sta_set_txpwr,
9712 .link_sta_rc_update = ath11k_mac_op_sta_rc_update,
9713 .conf_tx = ath11k_mac_op_conf_tx,
9714 .set_antenna = ath11k_mac_op_set_antenna,
9715 .get_antenna = ath11k_mac_op_get_antenna,
9716 .ampdu_action = ath11k_mac_op_ampdu_action,
9717 .add_chanctx = ath11k_mac_op_add_chanctx,
9718 .remove_chanctx = ath11k_mac_op_remove_chanctx,
9719 .change_chanctx = ath11k_mac_op_change_chanctx,
9720 .assign_vif_chanctx = ath11k_mac_op_assign_vif_chanctx,
9721 .unassign_vif_chanctx = ath11k_mac_op_unassign_vif_chanctx,
9722 .switch_vif_chanctx = ath11k_mac_op_switch_vif_chanctx,
9723 .set_rts_threshold = ath11k_mac_op_set_rts_threshold,
9724 .set_frag_threshold = ath11k_mac_op_set_frag_threshold,
9725 .set_bitrate_mask = ath11k_mac_op_set_bitrate_mask,
9726 .get_survey = ath11k_mac_op_get_survey,
9727 .flush = ath11k_mac_op_flush,
9728 .sta_statistics = ath11k_mac_op_sta_statistics,
9729 CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
9731 #ifdef CONFIG_PM
9732 .suspend = ath11k_wow_op_suspend,
9733 .resume = ath11k_wow_op_resume,
9734 .set_wakeup = ath11k_wow_op_set_wakeup,
9735 #endif
9737 #ifdef CONFIG_ATH11K_DEBUGFS
9738 .vif_add_debugfs = ath11k_debugfs_op_vif_add,
9739 .sta_add_debugfs = ath11k_debugfs_sta_op_add,
9740 #endif
9742 #if IS_ENABLED(CONFIG_IPV6)
9743 .ipv6_addr_change = ath11k_mac_op_ipv6_changed,
9744 #endif
9745 .get_txpower = ath11k_mac_op_get_txpower,
9747 .set_sar_specs = ath11k_mac_op_set_bios_sar_specs,
9748 .remain_on_channel = ath11k_mac_op_remain_on_channel,
9749 .cancel_remain_on_channel = ath11k_mac_op_cancel_remain_on_channel,
9752 static void ath11k_mac_update_ch_list(struct ath11k *ar,
9753 struct ieee80211_supported_band *band,
9754 u32 freq_low, u32 freq_high)
9756 int i;
9758 if (!(freq_low && freq_high))
9759 return;
9761 for (i = 0; i < band->n_channels; i++) {
9762 if (band->channels[i].center_freq < freq_low ||
9763 band->channels[i].center_freq > freq_high)
9764 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
9768 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
9770 struct ath11k_pdev *pdev = ar->pdev;
9771 struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
9773 if (band == WMI_HOST_WLAN_2G_CAP)
9774 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
9776 if (band == WMI_HOST_WLAN_5G_CAP)
9777 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
9779 ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
9781 return 0;
9784 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
9785 u32 supported_bands)
9787 struct ieee80211_supported_band *band;
9788 struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
9789 void *channels;
9790 u32 phy_id;
9792 BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
9793 ARRAY_SIZE(ath11k_5ghz_channels) +
9794 ARRAY_SIZE(ath11k_6ghz_channels)) !=
9795 ATH11K_NUM_CHANS);
9797 reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
9798 temp_reg_cap = reg_cap;
9800 if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
9801 channels = kmemdup(ath11k_2ghz_channels,
9802 sizeof(ath11k_2ghz_channels),
9803 GFP_KERNEL);
9804 if (!channels)
9805 return -ENOMEM;
9807 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9808 band->band = NL80211_BAND_2GHZ;
9809 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
9810 band->channels = channels;
9811 band->n_bitrates = ath11k_g_rates_size;
9812 band->bitrates = ath11k_g_rates;
9813 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9815 if (ar->ab->hw_params.single_pdev_only) {
9816 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
9817 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9819 ath11k_mac_update_ch_list(ar, band,
9820 temp_reg_cap->low_2ghz_chan,
9821 temp_reg_cap->high_2ghz_chan);
9824 if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
9825 if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) {
9826 channels = kmemdup(ath11k_6ghz_channels,
9827 sizeof(ath11k_6ghz_channels), GFP_KERNEL);
9828 if (!channels) {
9829 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9830 return -ENOMEM;
9833 ar->supports_6ghz = true;
9834 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
9835 band->band = NL80211_BAND_6GHZ;
9836 band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
9837 band->channels = channels;
9838 band->n_bitrates = ath11k_a_rates_size;
9839 band->bitrates = ath11k_a_rates;
9840 ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
9842 if (ar->ab->hw_params.single_pdev_only) {
9843 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9844 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9847 ath11k_mac_update_ch_list(ar, band,
9848 temp_reg_cap->low_5ghz_chan,
9849 temp_reg_cap->high_5ghz_chan);
9852 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
9853 channels = kmemdup(ath11k_5ghz_channels,
9854 sizeof(ath11k_5ghz_channels),
9855 GFP_KERNEL);
9856 if (!channels) {
9857 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9858 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9859 return -ENOMEM;
9862 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9863 band->band = NL80211_BAND_5GHZ;
9864 band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
9865 band->channels = channels;
9866 band->n_bitrates = ath11k_a_rates_size;
9867 band->bitrates = ath11k_a_rates;
9868 ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9870 if (ar->ab->hw_params.single_pdev_only) {
9871 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9872 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9875 ath11k_mac_update_ch_list(ar, band,
9876 temp_reg_cap->low_5ghz_chan,
9877 temp_reg_cap->high_5ghz_chan);
9881 return 0;
9884 static void ath11k_mac_setup_mac_address_list(struct ath11k *ar)
9886 struct mac_address *addresses;
9887 u16 n_addresses;
9888 int i;
9890 if (!ar->ab->hw_params.support_dual_stations)
9891 return;
9893 n_addresses = ar->ab->hw_params.num_vdevs;
9894 addresses = kcalloc(n_addresses, sizeof(*addresses), GFP_KERNEL);
9895 if (!addresses)
9896 return;
9898 memcpy(addresses[0].addr, ar->mac_addr, ETH_ALEN);
9899 for (i = 1; i < n_addresses; i++) {
9900 memcpy(addresses[i].addr, ar->mac_addr, ETH_ALEN);
9901 /* set Local Administered Address bit */
9902 addresses[i].addr[0] |= 0x2;
9904 addresses[i].addr[0] += (i - 1) << 4;
9907 ar->hw->wiphy->addresses = addresses;
9908 ar->hw->wiphy->n_addresses = n_addresses;
9911 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
9913 struct ath11k_base *ab = ar->ab;
9914 struct ieee80211_iface_combination *combinations;
9915 struct ieee80211_iface_limit *limits;
9916 int n_limits;
9917 bool p2p;
9919 p2p = ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
9921 combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
9922 if (!combinations)
9923 return -ENOMEM;
9925 if (p2p)
9926 n_limits = 3;
9927 else
9928 n_limits = 2;
9930 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
9931 if (!limits) {
9932 kfree(combinations);
9933 return -ENOMEM;
9936 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9937 limits[1].types |= BIT(NL80211_IFTYPE_AP);
9938 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9939 ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9940 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9942 combinations[0].limits = limits;
9943 combinations[0].n_limits = n_limits;
9944 combinations[0].beacon_int_infra_match = true;
9945 combinations[0].beacon_int_min_gcd = 100;
9947 if (ab->hw_params.support_dual_stations) {
9948 limits[0].max = 2;
9949 limits[1].max = 1;
9951 combinations[0].max_interfaces = ab->hw_params.num_vdevs;
9952 combinations[0].num_different_channels = 2;
9953 } else {
9954 limits[0].max = 1;
9955 limits[1].max = 16;
9957 combinations[0].max_interfaces = 16;
9958 combinations[0].num_different_channels = 1;
9959 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9960 BIT(NL80211_CHAN_WIDTH_20) |
9961 BIT(NL80211_CHAN_WIDTH_40) |
9962 BIT(NL80211_CHAN_WIDTH_80) |
9963 BIT(NL80211_CHAN_WIDTH_80P80) |
9964 BIT(NL80211_CHAN_WIDTH_160);
9967 if (p2p) {
9968 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
9969 BIT(NL80211_IFTYPE_P2P_GO);
9970 limits[2].max = 1;
9971 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
9974 ar->hw->wiphy->iface_combinations = combinations;
9975 ar->hw->wiphy->n_iface_combinations = 1;
9977 return 0;
9980 static const u8 ath11k_if_types_ext_capa[] = {
9981 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9982 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9983 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9986 static const u8 ath11k_if_types_ext_capa_sta[] = {
9987 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9988 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9989 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9990 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
9993 static const u8 ath11k_if_types_ext_capa_ap[] = {
9994 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9995 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9996 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9997 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
9998 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
10001 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
10003 .extended_capabilities = ath11k_if_types_ext_capa,
10004 .extended_capabilities_mask = ath11k_if_types_ext_capa,
10005 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
10006 }, {
10007 .iftype = NL80211_IFTYPE_STATION,
10008 .extended_capabilities = ath11k_if_types_ext_capa_sta,
10009 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
10010 .extended_capabilities_len =
10011 sizeof(ath11k_if_types_ext_capa_sta),
10012 }, {
10013 .iftype = NL80211_IFTYPE_AP,
10014 .extended_capabilities = ath11k_if_types_ext_capa_ap,
10015 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
10016 .extended_capabilities_len =
10017 sizeof(ath11k_if_types_ext_capa_ap),
10021 static void __ath11k_mac_unregister(struct ath11k *ar)
10023 cancel_work_sync(&ar->regd_update_work);
10025 ieee80211_unregister_hw(ar->hw);
10027 idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
10028 idr_destroy(&ar->txmgmt_idr);
10030 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10031 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10032 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
10034 kfree(ar->hw->wiphy->iface_combinations[0].limits);
10035 kfree(ar->hw->wiphy->iface_combinations);
10037 kfree(ar->hw->wiphy->addresses);
10039 SET_IEEE80211_DEV(ar->hw, NULL);
10042 void ath11k_mac_unregister(struct ath11k_base *ab)
10044 struct ath11k *ar;
10045 struct ath11k_pdev *pdev;
10046 int i;
10048 for (i = 0; i < ab->num_radios; i++) {
10049 pdev = &ab->pdevs[i];
10050 ar = pdev->ar;
10051 if (!ar)
10052 continue;
10054 __ath11k_mac_unregister(ar);
10057 ath11k_peer_rhash_tbl_destroy(ab);
10060 static int __ath11k_mac_register(struct ath11k *ar)
10062 struct ath11k_base *ab = ar->ab;
10063 struct ath11k_pdev_cap *cap = &ar->pdev->cap;
10064 static const u32 cipher_suites[] = {
10065 WLAN_CIPHER_SUITE_TKIP,
10066 WLAN_CIPHER_SUITE_CCMP,
10067 WLAN_CIPHER_SUITE_AES_CMAC,
10068 WLAN_CIPHER_SUITE_BIP_CMAC_256,
10069 WLAN_CIPHER_SUITE_BIP_GMAC_128,
10070 WLAN_CIPHER_SUITE_BIP_GMAC_256,
10071 WLAN_CIPHER_SUITE_GCMP,
10072 WLAN_CIPHER_SUITE_GCMP_256,
10073 WLAN_CIPHER_SUITE_CCMP_256,
10075 int ret;
10076 u32 ht_cap = 0;
10078 ath11k_pdev_caps_update(ar);
10080 SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
10081 ath11k_mac_setup_mac_address_list(ar);
10083 SET_IEEE80211_DEV(ar->hw, ab->dev);
10085 ret = ath11k_mac_setup_channels_rates(ar,
10086 cap->supported_bands);
10087 if (ret)
10088 goto err;
10090 wiphy_read_of_freq_limits(ar->hw->wiphy);
10091 ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
10092 ath11k_mac_setup_he_cap(ar, cap);
10094 ret = ath11k_mac_setup_iface_combinations(ar);
10095 if (ret) {
10096 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
10097 goto err_free_channels;
10100 ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
10101 ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
10103 ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
10105 if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
10106 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
10108 if (ab->hw_params.supports_multi_bssid) {
10109 ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
10110 ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
10113 ieee80211_hw_set(ar->hw, SIGNAL_DBM);
10114 ieee80211_hw_set(ar->hw, SUPPORTS_PS);
10115 ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
10116 ieee80211_hw_set(ar->hw, MFP_CAPABLE);
10117 ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
10118 ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
10119 ieee80211_hw_set(ar->hw, AP_LINK_PS);
10120 ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
10121 ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
10122 ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
10123 ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
10124 ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
10125 ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
10126 ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
10127 ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
10129 if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
10130 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
10131 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
10134 if (cap->nss_ratio_enabled)
10135 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
10137 if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
10138 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
10139 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
10140 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
10141 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
10142 ieee80211_hw_set(ar->hw, USES_RSS);
10145 ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
10146 ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
10148 /* TODO: Check if HT capability advertised from firmware is different
10149 * for each band for a dual band capable radio. It will be tricky to
10150 * handle it when the ht capability different for each band.
10152 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
10153 (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
10154 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
10156 ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
10157 ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
10159 ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
10161 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
10162 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
10163 ar->hw->wiphy->max_remain_on_channel_duration = 5000;
10165 ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
10166 ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
10167 NL80211_FEATURE_AP_SCAN;
10169 ar->max_num_stations = TARGET_NUM_STATIONS(ab);
10170 ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
10172 ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
10174 if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
10175 ar->hw->wiphy->features |=
10176 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
10179 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
10180 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
10181 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
10182 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
10183 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
10184 ar->hw->wiphy->max_sched_scan_plan_interval =
10185 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
10186 ar->hw->wiphy->max_sched_scan_plan_iterations =
10187 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
10188 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
10191 ret = ath11k_wow_init(ar);
10192 if (ret) {
10193 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
10194 goto err_free_if_combs;
10197 if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI,
10198 ar->ab->wmi_ab.svc_map))
10199 wiphy_ext_feature_set(ar->hw->wiphy,
10200 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
10202 ar->hw->queues = ATH11K_HW_MAX_QUEUES;
10203 ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
10204 ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
10205 ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
10207 ar->hw->vif_data_size = sizeof(struct ath11k_vif);
10208 ar->hw->sta_data_size = sizeof(struct ath11k_sta);
10210 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
10211 wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
10212 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
10213 ar->ab->wmi_ab.svc_map)) {
10214 wiphy_ext_feature_set(ar->hw->wiphy,
10215 NL80211_EXT_FEATURE_BSS_COLOR);
10216 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
10219 ar->hw->wiphy->cipher_suites = cipher_suites;
10220 ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
10222 ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
10223 ar->hw->wiphy->num_iftype_ext_capab =
10224 ARRAY_SIZE(ath11k_iftypes_ext_capa);
10226 if (ar->supports_6ghz) {
10227 wiphy_ext_feature_set(ar->hw->wiphy,
10228 NL80211_EXT_FEATURE_FILS_DISCOVERY);
10229 wiphy_ext_feature_set(ar->hw->wiphy,
10230 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
10233 wiphy_ext_feature_set(ar->hw->wiphy,
10234 NL80211_EXT_FEATURE_SET_SCAN_DWELL);
10236 if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map))
10237 wiphy_ext_feature_set(ar->hw->wiphy,
10238 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
10240 ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab);
10241 ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
10243 ath11k_reg_init(ar);
10245 if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
10246 ar->hw->netdev_features = NETIF_F_HW_CSUM;
10247 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
10248 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
10251 if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
10252 ab->hw_params.bios_sar_capa)
10253 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
10255 ret = ieee80211_register_hw(ar->hw);
10256 if (ret) {
10257 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
10258 goto err_free_if_combs;
10261 if (!ab->hw_params.supports_monitor)
10262 /* There's a race between calling ieee80211_register_hw()
10263 * and here where the monitor mode is enabled for a little
10264 * while. But that time is so short and in practise it make
10265 * a difference in real life.
10267 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
10269 /* Apply the regd received during initialization */
10270 ret = ath11k_regd_update(ar);
10271 if (ret) {
10272 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
10273 goto err_unregister_hw;
10276 if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
10277 memcpy(&ar->alpha2, ab->new_alpha2, 2);
10278 ret = ath11k_reg_set_cc(ar);
10279 if (ret)
10280 ath11k_warn(ar->ab,
10281 "failed set cc code for mac register: %d\n", ret);
10284 ret = ath11k_debugfs_register(ar);
10285 if (ret) {
10286 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
10287 goto err_unregister_hw;
10290 return 0;
10292 err_unregister_hw:
10293 ieee80211_unregister_hw(ar->hw);
10295 err_free_if_combs:
10296 kfree(ar->hw->wiphy->iface_combinations[0].limits);
10297 kfree(ar->hw->wiphy->iface_combinations);
10299 err_free_channels:
10300 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10301 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10302 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
10304 err:
10305 SET_IEEE80211_DEV(ar->hw, NULL);
10306 return ret;
10309 int ath11k_mac_register(struct ath11k_base *ab)
10311 struct ath11k *ar;
10312 struct ath11k_pdev *pdev;
10313 int i;
10314 int ret;
10315 u8 mac_addr[ETH_ALEN] = {0};
10317 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
10318 return 0;
10320 /* Initialize channel counters frequency value in hertz */
10321 ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
10322 ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
10324 ret = ath11k_peer_rhash_tbl_init(ab);
10325 if (ret)
10326 return ret;
10328 device_get_mac_address(ab->dev, mac_addr);
10330 for (i = 0; i < ab->num_radios; i++) {
10331 pdev = &ab->pdevs[i];
10332 ar = pdev->ar;
10333 if (ab->pdevs_macaddr_valid) {
10334 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
10335 } else {
10336 if (is_zero_ether_addr(mac_addr))
10337 ether_addr_copy(ar->mac_addr, ab->mac_addr);
10338 else
10339 ether_addr_copy(ar->mac_addr, mac_addr);
10340 ar->mac_addr[4] += i;
10343 idr_init(&ar->txmgmt_idr);
10344 spin_lock_init(&ar->txmgmt_idr_lock);
10346 ret = __ath11k_mac_register(ar);
10347 if (ret)
10348 goto err_cleanup;
10350 init_waitqueue_head(&ar->txmgmt_empty_waitq);
10353 return 0;
10355 err_cleanup:
10356 for (i = i - 1; i >= 0; i--) {
10357 pdev = &ab->pdevs[i];
10358 ar = pdev->ar;
10359 __ath11k_mac_unregister(ar);
10362 ath11k_peer_rhash_tbl_destroy(ab);
10364 return ret;
10367 int ath11k_mac_allocate(struct ath11k_base *ab)
10369 struct ieee80211_hw *hw;
10370 struct ath11k *ar;
10371 struct ath11k_pdev *pdev;
10372 int ret;
10373 int i;
10375 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
10376 return 0;
10378 for (i = 0; i < ab->num_radios; i++) {
10379 pdev = &ab->pdevs[i];
10380 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
10381 if (!hw) {
10382 ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
10383 ret = -ENOMEM;
10384 goto err_free_mac;
10387 ar = hw->priv;
10388 ar->hw = hw;
10389 ar->ab = ab;
10390 ar->pdev = pdev;
10391 ar->pdev_idx = i;
10392 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
10394 ar->wmi = &ab->wmi_ab.wmi[i];
10395 /* FIXME wmi[0] is already initialized during attach,
10396 * Should we do this again?
10398 ath11k_wmi_pdev_attach(ab, i);
10400 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
10401 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
10402 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
10403 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
10405 pdev->ar = ar;
10406 spin_lock_init(&ar->data_lock);
10407 INIT_LIST_HEAD(&ar->arvifs);
10408 INIT_LIST_HEAD(&ar->ppdu_stats_info);
10409 mutex_init(&ar->conf_mutex);
10410 init_completion(&ar->vdev_setup_done);
10411 init_completion(&ar->vdev_delete_done);
10412 init_completion(&ar->peer_assoc_done);
10413 init_completion(&ar->peer_delete_done);
10414 init_completion(&ar->install_key_done);
10415 init_completion(&ar->bss_survey_done);
10416 init_completion(&ar->scan.started);
10417 init_completion(&ar->scan.completed);
10418 init_completion(&ar->scan.on_channel);
10419 init_completion(&ar->thermal.wmi_sync);
10421 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
10422 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
10424 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
10425 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
10427 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
10429 ar->monitor_vdev_id = -1;
10430 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
10431 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
10432 init_completion(&ar->completed_11d_scan);
10434 ath11k_fw_stats_init(ar);
10437 return 0;
10439 err_free_mac:
10440 ath11k_mac_destroy(ab);
10442 return ret;
10445 void ath11k_mac_destroy(struct ath11k_base *ab)
10447 struct ath11k *ar;
10448 struct ath11k_pdev *pdev;
10449 int i;
10451 for (i = 0; i < ab->num_radios; i++) {
10452 pdev = &ab->pdevs[i];
10453 ar = pdev->ar;
10454 if (!ar)
10455 continue;
10457 ath11k_fw_stats_free(&ar->fw_stats);
10458 ieee80211_free_hw(ar->hw);
10459 pdev->ar = NULL;
10463 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
10464 enum wmi_sta_keepalive_method method,
10465 u32 interval)
10467 struct ath11k *ar = arvif->ar;
10468 struct wmi_sta_keepalive_arg arg = {};
10469 int ret;
10471 lockdep_assert_held(&ar->conf_mutex);
10473 if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
10474 return 0;
10476 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
10477 return 0;
10479 arg.vdev_id = arvif->vdev_id;
10480 arg.enabled = 1;
10481 arg.method = method;
10482 arg.interval = interval;
10484 ret = ath11k_wmi_sta_keepalive(ar, &arg);
10485 if (ret) {
10486 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
10487 arvif->vdev_id, ret);
10488 return ret;
10491 return 0;