powercap: intel_rapl_tpmi: Enable PMU support
[linux-block.git] / drivers / net / wireless / ath / ath11k / mac.c
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  */
6
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>
14
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"
27
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, \
35 }
36
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, \
44 }
45
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, \
53 }
54
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),
70 };
71
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),
101 };
102
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),
163
164         /* new addition in IEEE Std 802.11ax-2021 */
165         CHAN6G(2, 5935, 0),
166 };
167
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 },
183
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 },
192 };
193
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,
205         },
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,
215         },
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,
225         },
226
227 };
228
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
238 };
239
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)
245
246 #define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD                200 /* in msecs */
247
248 /* Overhead due to the processing of channel switch events from FW */
249 #define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD     10 /* in msecs */
250
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,
256 };
257
258 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
259 {
260         enum nl80211_he_ru_alloc ret;
261
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;
284         }
285
286         return ret;
287 }
288
289 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
290 {
291         enum nl80211_he_ru_alloc ret;
292
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;
318         }
319
320         return ret;
321 }
322
323 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
324 {
325         enum nl80211_he_gi ret;
326
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;
340         }
341
342         return ret;
343 }
344
345 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
346 {
347         u8 ret = 0;
348
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;
362         }
363
364         return ret;
365 }
366
367 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
368 {
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;
380         }
381 }
382
383 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
384                                           u16 *rate)
385 {
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;
389
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;
394         }
395
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;
401                 }
402                 i++;
403         }
404
405         return -EINVAL;
406 }
407
408 static int get_num_chains(u32 mask)
409 {
410         int num_chains = 0;
411
412         while (mask) {
413                 if (mask & BIT(0))
414                         num_chains++;
415                 mask >>= 1;
416         }
417
418         return num_chains;
419 }
420
421 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
422                              u32 bitrate)
423 {
424         int i;
425
426         for (i = 0; i < sband->n_bitrates; i++)
427                 if (sband->bitrates[i].bitrate == bitrate)
428                         return i;
429
430         return 0;
431 }
432
433 static u32
434 ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask)
435 {
436         int nss;
437
438         for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
439                 if (ht_mcs_mask[nss])
440                         return nss + 1;
441
442         return 1;
443 }
444
445 static u32
446 ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask)
447 {
448         int nss;
449
450         for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
451                 if (vht_mcs_mask[nss])
452                         return nss + 1;
453
454         return 1;
455 }
456
457 static u32
458 ath11k_mac_max_he_nss(const u16 *he_mcs_mask)
459 {
460         int nss;
461
462         for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
463                 if (he_mcs_mask[nss])
464                         return nss + 1;
465
466         return 1;
467 }
468
469 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
470 {
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
480  */
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
489          */
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;
501         }
502 }
503
504 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
505                                struct cfg80211_chan_def *def)
506 {
507         struct ieee80211_chanctx_conf *conf;
508
509         rcu_read_lock();
510         conf = rcu_dereference(vif->bss_conf.chanctx_conf);
511         if (!conf) {
512                 rcu_read_unlock();
513                 return -ENOENT;
514         }
515
516         *def = conf->def;
517         rcu_read_unlock();
518
519         return 0;
520 }
521
522 static bool ath11k_mac_bitrate_is_cck(int bitrate)
523 {
524         switch (bitrate) {
525         case 10:
526         case 20:
527         case 55:
528         case 110:
529                 return true;
530         }
531
532         return false;
533 }
534
535 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
536                              u8 hw_rate, bool cck)
537 {
538         const struct ieee80211_rate *rate;
539         int i;
540
541         for (i = 0; i < sband->n_bitrates; i++) {
542                 rate = &sband->bitrates[i];
543
544                 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
545                         continue;
546
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;
552         }
553
554         return 0;
555 }
556
557 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
558 {
559         return DIV_ROUND_UP(bitrate, 5) |
560                (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
561 }
562
563 static void ath11k_get_arvif_iter(void *data, u8 *mac,
564                                   struct ieee80211_vif *vif)
565 {
566         struct ath11k_vif_iter *arvif_iter = data;
567         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
568
569         if (arvif->vdev_id == arvif_iter->vdev_id)
570                 arvif_iter->arvif = arvif;
571 }
572
573 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
574 {
575         struct ath11k_vif_iter arvif_iter;
576         u32 flags;
577
578         memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
579         arvif_iter.vdev_id = vdev_id;
580
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;
589         }
590
591         return arvif_iter.arvif;
592 }
593
594 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
595                                                    u32 vdev_id)
596 {
597         int i;
598         struct ath11k_pdev *pdev;
599         struct ath11k_vif *arvif;
600
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;
608                 }
609         }
610
611         return NULL;
612 }
613
614 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
615 {
616         int i;
617         struct ath11k_pdev *pdev;
618
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;
624                 }
625         }
626
627         return NULL;
628 }
629
630 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
631 {
632         int i;
633         struct ath11k_pdev *pdev;
634
635         if (ab->hw_params.single_pdev_only) {
636                 pdev = rcu_dereference(ab->pdevs_active[0]);
637                 return pdev ? pdev->ar : NULL;
638         }
639
640         if (WARN_ON(pdev_id > ab->num_radios))
641                 return NULL;
642
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]);
648
649                 if (pdev && pdev->pdev_id == pdev_id)
650                         return (pdev->ar ? pdev->ar : NULL);
651         }
652
653         return NULL;
654 }
655
656 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
657 {
658         struct ath11k *ar;
659         struct ath11k_pdev *pdev;
660         struct ath11k_vif *arvif;
661         int i;
662
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;
669                 }
670         }
671
672         return NULL;
673 }
674
675 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
676 {
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)));
680 }
681
682 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
683 {
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;
691
692         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
693                 return pdev_id;
694
695         band = def.chan->band;
696
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;
700         }
701
702         return pdev_id;
703 }
704
705 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
706 {
707         struct ath11k_vif *arvif;
708
709         arvif = ath11k_mac_get_vif_up(ar->ab);
710
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;
715 }
716
717 static void ath11k_pdev_caps_update(struct ath11k *ar)
718 {
719         struct ath11k_base *ab = ar->ab;
720
721         ar->max_tx_power = ab->target_caps.hw_max_tx_power;
722
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
727          */
728         ar->min_tx_power = 0;
729
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;
733 }
734
735 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
736 {
737         struct ath11k_pdev *pdev = ar->pdev;
738         struct ath11k_vif *arvif;
739         int ret, txpower = -1;
740         u32 param;
741
742         lockdep_assert_held(&ar->conf_mutex);
743
744         list_for_each_entry(arvif, &ar->arvifs, list) {
745                 if (arvif->txpower <= 0)
746                         continue;
747
748                 if (txpower == -1)
749                         txpower = arvif->txpower;
750                 else
751                         txpower = min(txpower, arvif->txpower);
752         }
753
754         if (txpower == -1)
755                 return 0;
756
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;
760
761         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
762                    txpower / 2);
763
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;
772         }
773
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;
782         }
783
784         return 0;
785
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;
790 }
791
792 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
793 {
794         struct ath11k *ar = arvif->ar;
795         u32 vdev_param, rts_cts = 0;
796         int ret;
797
798         lockdep_assert_held(&ar->conf_mutex);
799
800         vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
801
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
805          */
806         rts_cts = WMI_USE_RTS_CTS;
807
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;
812
813         /* Need not send duplicate param value to firmware */
814         if (arvif->rtscts_prot_mode == rts_cts)
815                 return 0;
816
817         arvif->rtscts_prot_mode = rts_cts;
818
819         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n",
820                    arvif->vdev_id, rts_cts);
821
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);
827
828         return ret;
829 }
830
831 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
832 {
833         struct ath11k *ar = arvif->ar;
834         u32 param;
835         int ret;
836
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;
844         }
845
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;
853         }
854
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;
862         }
863
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;
871         }
872
873         return 0;
874 }
875
876 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
877 {
878         struct ath11k_peer *peer, *tmp;
879         struct ath11k_base *ab = ar->ab;
880
881         lockdep_assert_held(&ar->conf_mutex);
882
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);
890         }
891         spin_unlock_bh(&ab->base_lock);
892         mutex_unlock(&ab->tbl_mtx_lock);
893
894         ar->num_peers = 0;
895         ar->num_stations = 0;
896 }
897
898 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
899 {
900         lockdep_assert_held(&ar->conf_mutex);
901
902         if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
903                 return -ESHUTDOWN;
904
905         if (!wait_for_completion_timeout(&ar->vdev_setup_done,
906                                          ATH11K_VDEV_SETUP_TIMEOUT_HZ))
907                 return -ETIMEDOUT;
908
909         return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
910 }
911
912 static void
913 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
914                                 struct ieee80211_chanctx_conf *conf,
915                                 void *data)
916 {
917         struct cfg80211_chan_def **def = data;
918
919         *def = &conf->def;
920 }
921
922 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
923                                          struct cfg80211_chan_def *chandef)
924 {
925         struct ieee80211_channel *channel;
926         struct wmi_vdev_start_req_arg arg = {};
927         int ret;
928
929         lockdep_assert_held(&ar->conf_mutex);
930
931         channel = chandef->chan;
932
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;
937
938         arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
939         arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
940
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;
945
946         arg.pref_tx_streams = ar->num_tx_chains;
947         arg.pref_rx_streams = ar->num_rx_chains;
948
949         arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
950
951         reinit_completion(&ar->vdev_setup_done);
952         reinit_completion(&ar->vdev_delete_done);
953
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;
959         }
960
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;
966         }
967
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;
973         }
974
975         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n",
976                    vdev_id);
977
978         return 0;
979
980 vdev_stop:
981         reinit_completion(&ar->vdev_setup_done);
982
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;
988         }
989
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;
995         }
996
997         return -EIO;
998 }
999
1000 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
1001 {
1002         int ret;
1003
1004         lockdep_assert_held(&ar->conf_mutex);
1005
1006         reinit_completion(&ar->vdev_setup_done);
1007
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;
1013         }
1014
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;
1020         }
1021
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;
1027         }
1028
1029         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n",
1030                    ar->monitor_vdev_id);
1031
1032         return 0;
1033 }
1034
1035 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1036 {
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;
1042
1043         lockdep_assert_held(&ar->conf_mutex);
1044
1045         if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1046                 return 0;
1047
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;
1051         }
1052
1053         bit = __ffs64(ar->ab->free_vdev_map);
1054
1055         ar->monitor_vdev_id = bit;
1056
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;
1061
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;
1065         }
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;
1069         }
1070
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;
1077         }
1078
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;
1086         }
1087
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;
1093         }
1094
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);
1099
1100         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n",
1101                    ar->monitor_vdev_id);
1102
1103         return 0;
1104
1105 err_vdev_del:
1106         ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1107         ar->monitor_vdev_id = -1;
1108         return ret;
1109 }
1110
1111 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1112 {
1113         int ret;
1114         unsigned long time_left;
1115
1116         lockdep_assert_held(&ar->conf_mutex);
1117
1118         if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1119                 return 0;
1120
1121         reinit_completion(&ar->vdev_delete_done);
1122
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;
1128         }
1129
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);
1137
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);
1143         }
1144
1145         return ret;
1146 }
1147
1148 static int ath11k_mac_monitor_start(struct ath11k *ar)
1149 {
1150         struct cfg80211_chan_def *chandef = NULL;
1151         int ret;
1152
1153         lockdep_assert_held(&ar->conf_mutex);
1154
1155         if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1156                 return 0;
1157
1158         ieee80211_iter_chan_contexts_atomic(ar->hw,
1159                                             ath11k_mac_get_any_chandef_iter,
1160                                             &chandef);
1161         if (!chandef)
1162                 return 0;
1163
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;
1169         }
1170
1171         set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1172
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;
1179         }
1180
1181         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n");
1182
1183         return 0;
1184 }
1185
1186 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1187 {
1188         int ret;
1189
1190         lockdep_assert_held(&ar->conf_mutex);
1191
1192         if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1193                 return 0;
1194
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;
1199         }
1200
1201         clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1202         ar->num_started_vdevs--;
1203
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;
1209         }
1210
1211         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret);
1212
1213         return 0;
1214 }
1215
1216 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1217 {
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;
1226
1227         lockdep_assert_held(&arvif->ar->conf_mutex);
1228
1229         if (arvif->vif->type != NL80211_IFTYPE_STATION)
1230                 return 0;
1231
1232         enable_ps = arvif->ps;
1233
1234         if (!arvif->is_started) {
1235                 /* mac80211 can update vif powersave state while disconnected.
1236                  * Firmware doesn't behave nicely and consumes more power than
1237                  * necessary if PS is disabled on a non-started vdev. Hence
1238                  * force-enable PS for non-running vdevs.
1239                  */
1240                 psmode = WMI_STA_PS_MODE_ENABLED;
1241         } else if (enable_ps) {
1242                 psmode = WMI_STA_PS_MODE_ENABLED;
1243                 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1244
1245                 timeout = conf->dynamic_ps_timeout;
1246                 if (timeout == 0) {
1247                         /* firmware doesn't like 0 */
1248                         timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1249                 }
1250
1251                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1252                                                   timeout);
1253                 if (ret) {
1254                         ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1255                                     arvif->vdev_id, ret);
1256                         return ret;
1257                 }
1258         } else {
1259                 psmode = WMI_STA_PS_MODE_DISABLED;
1260         }
1261
1262         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n",
1263                    arvif->vdev_id, psmode ? "enable" : "disable");
1264
1265         ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1266         if (ret) {
1267                 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1268                             psmode, arvif->vdev_id, ret);
1269                 return ret;
1270         }
1271
1272         return 0;
1273 }
1274
1275 static int ath11k_mac_config_ps(struct ath11k *ar)
1276 {
1277         struct ath11k_vif *arvif;
1278         int ret = 0;
1279
1280         lockdep_assert_held(&ar->conf_mutex);
1281
1282         list_for_each_entry(arvif, &ar->arvifs, list) {
1283                 ret = ath11k_mac_vif_setup_ps(arvif);
1284                 if (ret) {
1285                         ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1286                         break;
1287                 }
1288         }
1289
1290         return ret;
1291 }
1292
1293 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1294 {
1295         struct ath11k *ar = hw->priv;
1296         struct ieee80211_conf *conf = &hw->conf;
1297         int ret = 0;
1298
1299         mutex_lock(&ar->conf_mutex);
1300
1301         if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1302                 if (conf->flags & IEEE80211_CONF_MONITOR) {
1303                         set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1304
1305                         if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1306                                      &ar->monitor_flags))
1307                                 goto out;
1308
1309                         ret = ath11k_mac_monitor_vdev_create(ar);
1310                         if (ret) {
1311                                 ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1312                                             ret);
1313                                 goto out;
1314                         }
1315
1316                         ret = ath11k_mac_monitor_start(ar);
1317                         if (ret) {
1318                                 ath11k_warn(ar->ab, "failed to start monitor: %d",
1319                                             ret);
1320                                 goto err_mon_del;
1321                         }
1322                 } else {
1323                         clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1324
1325                         if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1326                                       &ar->monitor_flags))
1327                                 goto out;
1328
1329                         ret = ath11k_mac_monitor_stop(ar);
1330                         if (ret) {
1331                                 ath11k_warn(ar->ab, "failed to stop monitor: %d",
1332                                             ret);
1333                                 goto out;
1334                         }
1335
1336                         ret = ath11k_mac_monitor_vdev_delete(ar);
1337                         if (ret) {
1338                                 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1339                                             ret);
1340                                 goto out;
1341                         }
1342                 }
1343         }
1344
1345 out:
1346         mutex_unlock(&ar->conf_mutex);
1347         return ret;
1348
1349 err_mon_del:
1350         ath11k_mac_monitor_vdev_delete(ar);
1351         mutex_unlock(&ar->conf_mutex);
1352         return ret;
1353 }
1354
1355 static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif,
1356                                              bool tx_arvif_rsnie_present,
1357                                              const u8 *profile, u8 profile_len)
1358 {
1359         if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) {
1360                 arvif->rsnie_present = true;
1361         } else if (tx_arvif_rsnie_present) {
1362                 int i;
1363                 u8 nie_len;
1364                 const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE,
1365                                                      profile, profile_len);
1366                 if (!nie)
1367                         return;
1368
1369                 nie_len = nie[1];
1370                 nie += 2;
1371                 for (i = 0; i < nie_len; i++) {
1372                         if (nie[i] == WLAN_EID_RSN) {
1373                                 arvif->rsnie_present = false;
1374                                 break;
1375                         }
1376                 }
1377         }
1378 }
1379
1380 static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif,
1381                                             struct ath11k_vif *arvif,
1382                                             struct sk_buff *bcn)
1383 {
1384         struct ieee80211_mgmt *mgmt;
1385         const u8 *ies, *profile, *next_profile;
1386         int ies_len;
1387
1388         ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1389         mgmt = (struct ieee80211_mgmt *)bcn->data;
1390         ies += sizeof(mgmt->u.beacon);
1391         ies_len = skb_tail_pointer(bcn) - ies;
1392
1393         ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len);
1394         arvif->rsnie_present = tx_arvif->rsnie_present;
1395
1396         while (ies) {
1397                 u8 mbssid_len;
1398
1399                 ies_len -= (2 + ies[1]);
1400                 mbssid_len = ies[1] - 1;
1401                 profile = &ies[3];
1402
1403                 while (mbssid_len) {
1404                         u8 profile_len;
1405
1406                         profile_len = profile[1];
1407                         next_profile = profile + (2 + profile_len);
1408                         mbssid_len -= (2 + profile_len);
1409
1410                         profile += 2;
1411                         profile_len -= (2 + profile[1]);
1412                         profile += (2 + profile[1]); /* nontx capabilities */
1413                         profile_len -= (2 + profile[1]);
1414                         profile += (2 + profile[1]); /* SSID */
1415                         if (profile[2] == arvif->vif->bss_conf.bssid_index) {
1416                                 profile_len -= 5;
1417                                 profile = profile + 5;
1418                                 ath11k_mac_setup_nontx_vif_rsnie(arvif,
1419                                                                  tx_arvif->rsnie_present,
1420                                                                  profile,
1421                                                                  profile_len);
1422                                 return true;
1423                         }
1424                         profile = next_profile;
1425                 }
1426                 ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile,
1427                                        ies_len);
1428         }
1429
1430         return false;
1431 }
1432
1433 static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
1434                                       struct sk_buff *bcn)
1435 {
1436         struct ieee80211_mgmt *mgmt;
1437         u8 *ies;
1438
1439         ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1440         mgmt = (struct ieee80211_mgmt *)bcn->data;
1441         ies += sizeof(mgmt->u.beacon);
1442
1443         if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1444                 arvif->rsnie_present = true;
1445         else
1446                 arvif->rsnie_present = false;
1447
1448         if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1449                                     WLAN_OUI_TYPE_MICROSOFT_WPA,
1450                                     ies, (skb_tail_pointer(bcn) - ies)))
1451                 arvif->wpaie_present = true;
1452         else
1453                 arvif->wpaie_present = false;
1454 }
1455
1456 static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif)
1457 {
1458         struct ath11k_vif *tx_arvif;
1459         struct ieee80211_ema_beacons *beacons;
1460         int ret = 0;
1461         bool nontx_vif_params_set = false;
1462         u32 params = 0;
1463         u8 i = 0;
1464
1465         tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1466
1467         beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw,
1468                                                          tx_arvif->vif, 0);
1469         if (!beacons || !beacons->cnt) {
1470                 ath11k_warn(arvif->ar->ab,
1471                             "failed to get ema beacon templates from mac80211\n");
1472                 return -EPERM;
1473         }
1474
1475         if (tx_arvif == arvif)
1476                 ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb);
1477         else
1478                 arvif->wpaie_present = tx_arvif->wpaie_present;
1479
1480         for (i = 0; i < beacons->cnt; i++) {
1481                 if (tx_arvif != arvif && !nontx_vif_params_set)
1482                         nontx_vif_params_set =
1483                                 ath11k_mac_set_nontx_vif_params(tx_arvif, arvif,
1484                                                                 beacons->bcn[i].skb);
1485
1486                 params = beacons->cnt;
1487                 params |= (i << WMI_EMA_TMPL_IDX_SHIFT);
1488                 params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT);
1489                 params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT);
1490
1491                 ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id,
1492                                           &beacons->bcn[i].offs,
1493                                           beacons->bcn[i].skb, params);
1494                 if (ret) {
1495                         ath11k_warn(tx_arvif->ar->ab,
1496                                     "failed to set ema beacon template id %i error %d\n",
1497                                     i, ret);
1498                         break;
1499                 }
1500         }
1501
1502         ieee80211_beacon_free_ema_list(beacons);
1503
1504         if (tx_arvif != arvif && !nontx_vif_params_set)
1505                 return -EINVAL; /* Profile not found in the beacons */
1506
1507         return ret;
1508 }
1509
1510 static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
1511 {
1512         struct ath11k *ar = arvif->ar;
1513         struct ath11k_base *ab = ar->ab;
1514         struct ath11k_vif *tx_arvif = arvif;
1515         struct ieee80211_hw *hw = ar->hw;
1516         struct ieee80211_vif *vif = arvif->vif;
1517         struct ieee80211_mutable_offsets offs = {};
1518         struct sk_buff *bcn;
1519         int ret;
1520
1521         if (vif->mbssid_tx_vif) {
1522                 tx_arvif = ath11k_vif_to_arvif(vif->mbssid_tx_vif);
1523                 if (tx_arvif != arvif) {
1524                         ar = tx_arvif->ar;
1525                         ab = ar->ab;
1526                         hw = ar->hw;
1527                         vif = tx_arvif->vif;
1528                 }
1529         }
1530
1531         bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1532         if (!bcn) {
1533                 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1534                 return -EPERM;
1535         }
1536
1537         if (tx_arvif == arvif)
1538                 ath11k_mac_set_vif_params(tx_arvif, bcn);
1539         else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn))
1540                 return -EINVAL;
1541
1542         ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0);
1543         kfree_skb(bcn);
1544
1545         if (ret)
1546                 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1547                             ret);
1548
1549         return ret;
1550 }
1551
1552 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1553 {
1554         struct ieee80211_vif *vif = arvif->vif;
1555
1556         if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1557                 return 0;
1558
1559         /* Target does not expect beacon templates for the already up
1560          * non-transmitting interfaces, and results in a crash if sent.
1561          */
1562         if (vif->mbssid_tx_vif &&
1563             arvif != ath11k_vif_to_arvif(vif->mbssid_tx_vif) && arvif->is_up)
1564                 return 0;
1565
1566         if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif)
1567                 return ath11k_mac_setup_bcn_tmpl_ema(arvif);
1568
1569         return ath11k_mac_setup_bcn_tmpl_mbssid(arvif);
1570 }
1571
1572 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1573 {
1574         struct ieee80211_vif *vif = arvif->vif;
1575
1576         if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent)
1577                 return;
1578
1579         if (vif->bss_conf.color_change_active &&
1580             ieee80211_beacon_cntdwn_is_complete(vif, 0)) {
1581                 arvif->bcca_zero_sent = true;
1582                 ieee80211_color_change_finish(vif);
1583                 return;
1584         }
1585
1586         arvif->bcca_zero_sent = false;
1587
1588         if (vif->bss_conf.color_change_active)
1589                 ieee80211_beacon_update_cntdwn(vif, 0);
1590         ath11k_mac_setup_bcn_tmpl(arvif);
1591 }
1592
1593 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1594                                      struct ieee80211_bss_conf *info)
1595 {
1596         struct ath11k *ar = arvif->ar;
1597         struct ath11k_vif *tx_arvif = NULL;
1598         int ret = 0;
1599
1600         lockdep_assert_held(&arvif->ar->conf_mutex);
1601
1602         if (!info->enable_beacon) {
1603                 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1604                 if (ret)
1605                         ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1606                                     arvif->vdev_id, ret);
1607
1608                 arvif->is_up = false;
1609                 return;
1610         }
1611
1612         /* Install the beacon template to the FW */
1613         ret = ath11k_mac_setup_bcn_tmpl(arvif);
1614         if (ret) {
1615                 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1616                             ret);
1617                 return;
1618         }
1619
1620         arvif->tx_seq_no = 0x1000;
1621
1622         arvif->aid = 0;
1623
1624         ether_addr_copy(arvif->bssid, info->bssid);
1625
1626         if (arvif->vif->mbssid_tx_vif)
1627                 tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1628
1629         ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1630                                  arvif->bssid,
1631                                  tx_arvif ? tx_arvif->bssid : NULL,
1632                                  info->bssid_index,
1633                                  1 << info->bssid_indicator);
1634         if (ret) {
1635                 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1636                             arvif->vdev_id, ret);
1637                 return;
1638         }
1639
1640         arvif->is_up = true;
1641
1642         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id);
1643 }
1644
1645 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1646                                           struct ieee80211_vif *vif)
1647 {
1648         struct sk_buff *skb = data;
1649         struct ieee80211_mgmt *mgmt = (void *)skb->data;
1650         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1651
1652         if (vif->type != NL80211_IFTYPE_STATION)
1653                 return;
1654
1655         if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1656                 return;
1657
1658         cancel_delayed_work(&arvif->connection_loss_work);
1659 }
1660
1661 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1662 {
1663         ieee80211_iterate_active_interfaces_atomic(ar->hw,
1664                                                    IEEE80211_IFACE_ITER_NORMAL,
1665                                                    ath11k_mac_handle_beacon_iter,
1666                                                    skb);
1667 }
1668
1669 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1670                                                struct ieee80211_vif *vif)
1671 {
1672         u32 *vdev_id = data;
1673         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1674         struct ath11k *ar = arvif->ar;
1675         struct ieee80211_hw *hw = ar->hw;
1676
1677         if (arvif->vdev_id != *vdev_id)
1678                 return;
1679
1680         if (!arvif->is_up)
1681                 return;
1682
1683         ieee80211_beacon_loss(vif);
1684
1685         /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1686          * (done by mac80211) succeeds but beacons do not resume then it
1687          * doesn't make sense to continue operation. Queue connection loss work
1688          * which can be cancelled when beacon is received.
1689          */
1690         ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1691                                      ATH11K_CONNECTION_LOSS_HZ);
1692 }
1693
1694 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1695 {
1696         ieee80211_iterate_active_interfaces_atomic(ar->hw,
1697                                                    IEEE80211_IFACE_ITER_NORMAL,
1698                                                    ath11k_mac_handle_beacon_miss_iter,
1699                                                    &vdev_id);
1700 }
1701
1702 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1703 {
1704         struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1705                                                 connection_loss_work.work);
1706         struct ieee80211_vif *vif = arvif->vif;
1707
1708         if (!arvif->is_up)
1709                 return;
1710
1711         ieee80211_connection_loss(vif);
1712 }
1713
1714 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1715                                       struct ieee80211_vif *vif,
1716                                       struct ieee80211_sta *sta,
1717                                       struct peer_assoc_params *arg)
1718 {
1719         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1720         u32 aid;
1721
1722         lockdep_assert_held(&ar->conf_mutex);
1723
1724         if (vif->type == NL80211_IFTYPE_STATION)
1725                 aid = vif->cfg.aid;
1726         else
1727                 aid = sta->aid;
1728
1729         ether_addr_copy(arg->peer_mac, sta->addr);
1730         arg->vdev_id = arvif->vdev_id;
1731         arg->peer_associd = aid;
1732         arg->auth_flag = true;
1733         /* TODO: STA WAR in ath10k for listen interval required? */
1734         arg->peer_listen_intval = ar->hw->conf.listen_interval;
1735         arg->peer_nss = 1;
1736         arg->peer_caps = vif->bss_conf.assoc_capability;
1737 }
1738
1739 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1740                                        struct ieee80211_vif *vif,
1741                                        struct ieee80211_sta *sta,
1742                                        struct peer_assoc_params *arg)
1743 {
1744         struct ieee80211_bss_conf *info = &vif->bss_conf;
1745         struct cfg80211_chan_def def;
1746         struct cfg80211_bss *bss;
1747         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1748         const u8 *rsnie = NULL;
1749         const u8 *wpaie = NULL;
1750
1751         lockdep_assert_held(&ar->conf_mutex);
1752
1753         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1754                 return;
1755
1756         bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1757                                IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1758
1759         if (arvif->rsnie_present || arvif->wpaie_present) {
1760                 arg->need_ptk_4_way = true;
1761                 if (arvif->wpaie_present)
1762                         arg->need_gtk_2_way = true;
1763         } else if (bss) {
1764                 const struct cfg80211_bss_ies *ies;
1765
1766                 rcu_read_lock();
1767                 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1768
1769                 ies = rcu_dereference(bss->ies);
1770
1771                 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1772                                                 WLAN_OUI_TYPE_MICROSOFT_WPA,
1773                                                 ies->data,
1774                                                 ies->len);
1775                 rcu_read_unlock();
1776                 cfg80211_put_bss(ar->hw->wiphy, bss);
1777         }
1778
1779         /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1780         if (rsnie || wpaie) {
1781                 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1782                            "%s: rsn ie found\n", __func__);
1783                 arg->need_ptk_4_way = true;
1784         }
1785
1786         if (wpaie) {
1787                 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1788                            "%s: wpa ie found\n", __func__);
1789                 arg->need_gtk_2_way = true;
1790         }
1791
1792         if (sta->mfp) {
1793                 /* TODO: Need to check if FW supports PMF? */
1794                 arg->is_pmf_enabled = true;
1795         }
1796
1797         /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1798 }
1799
1800 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1801                                       struct ieee80211_vif *vif,
1802                                       struct ieee80211_sta *sta,
1803                                       struct peer_assoc_params *arg)
1804 {
1805         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1806         struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1807         struct cfg80211_chan_def def;
1808         const struct ieee80211_supported_band *sband;
1809         const struct ieee80211_rate *rates;
1810         enum nl80211_band band;
1811         u32 ratemask;
1812         u8 rate;
1813         int i;
1814
1815         lockdep_assert_held(&ar->conf_mutex);
1816
1817         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1818                 return;
1819
1820         band = def.chan->band;
1821         sband = ar->hw->wiphy->bands[band];
1822         ratemask = sta->deflink.supp_rates[band];
1823         ratemask &= arvif->bitrate_mask.control[band].legacy;
1824         rates = sband->bitrates;
1825
1826         rateset->num_rates = 0;
1827
1828         for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1829                 if (!(ratemask & 1))
1830                         continue;
1831
1832                 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1833                 rateset->rates[rateset->num_rates] = rate;
1834                 rateset->num_rates++;
1835         }
1836 }
1837
1838 static bool
1839 ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1840 {
1841         int nss;
1842
1843         for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1844                 if (ht_mcs_mask[nss])
1845                         return false;
1846
1847         return true;
1848 }
1849
1850 static bool
1851 ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1852 {
1853         int nss;
1854
1855         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1856                 if (vht_mcs_mask[nss])
1857                         return false;
1858
1859         return true;
1860 }
1861
1862 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1863                                    struct ieee80211_vif *vif,
1864                                    struct ieee80211_sta *sta,
1865                                    struct peer_assoc_params *arg)
1866 {
1867         const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1868         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1869         struct cfg80211_chan_def def;
1870         enum nl80211_band band;
1871         const u8 *ht_mcs_mask;
1872         int i, n;
1873         u8 max_nss;
1874         u32 stbc;
1875
1876         lockdep_assert_held(&ar->conf_mutex);
1877
1878         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1879                 return;
1880
1881         if (!ht_cap->ht_supported)
1882                 return;
1883
1884         band = def.chan->band;
1885         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1886
1887         if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1888                 return;
1889
1890         arg->ht_flag = true;
1891
1892         arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1893                                     ht_cap->ampdu_factor)) - 1;
1894
1895         arg->peer_mpdu_density =
1896                 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1897
1898         arg->peer_ht_caps = ht_cap->cap;
1899         arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1900
1901         if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1902                 arg->ldpc_flag = true;
1903
1904         if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1905                 arg->bw_40 = true;
1906                 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1907         }
1908
1909         /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1910          * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1911          * both flags if guard interval is Default GI
1912          */
1913         if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1914                 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1915                                 IEEE80211_HT_CAP_SGI_40);
1916
1917         if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1918                 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1919                     IEEE80211_HT_CAP_SGI_40))
1920                         arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1921         }
1922
1923         if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1924                 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1925                 arg->stbc_flag = true;
1926         }
1927
1928         if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1929                 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1930                 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1931                 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1932                 arg->peer_rate_caps |= stbc;
1933                 arg->stbc_flag = true;
1934         }
1935
1936         if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1937                 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1938         else if (ht_cap->mcs.rx_mask[1])
1939                 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1940
1941         for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1942                 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1943                     (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1944                         max_nss = (i / 8) + 1;
1945                         arg->peer_ht_rates.rates[n++] = i;
1946                 }
1947
1948         /* This is a workaround for HT-enabled STAs which break the spec
1949          * and have no HT capabilities RX mask (no HT RX MCS map).
1950          *
1951          * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1952          * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1953          *
1954          * Firmware asserts if such situation occurs.
1955          */
1956         if (n == 0) {
1957                 arg->peer_ht_rates.num_rates = 8;
1958                 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1959                         arg->peer_ht_rates.rates[i] = i;
1960         } else {
1961                 arg->peer_ht_rates.num_rates = n;
1962                 arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1963         }
1964
1965         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n",
1966                    arg->peer_mac,
1967                    arg->peer_ht_rates.num_rates,
1968                    arg->peer_nss);
1969 }
1970
1971 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1972 {
1973         switch ((mcs_map >> (2 * nss)) & 0x3) {
1974         case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1975         case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1976         case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1977         }
1978         return 0;
1979 }
1980
1981 static u16
1982 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1983                               const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1984 {
1985         int idx_limit;
1986         int nss;
1987         u16 mcs_map;
1988         u16 mcs;
1989
1990         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1991                 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1992                           vht_mcs_limit[nss];
1993
1994                 if (mcs_map)
1995                         idx_limit = fls(mcs_map) - 1;
1996                 else
1997                         idx_limit = -1;
1998
1999                 switch (idx_limit) {
2000                 case 0:
2001                 case 1:
2002                 case 2:
2003                 case 3:
2004                 case 4:
2005                 case 5:
2006                 case 6:
2007                 case 7:
2008                         mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2009                         break;
2010                 case 8:
2011                         mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2012                         break;
2013                 case 9:
2014                         mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2015                         break;
2016                 default:
2017                         WARN_ON(1);
2018                         fallthrough;
2019                 case -1:
2020                         mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2021                         break;
2022                 }
2023
2024                 tx_mcs_set &= ~(0x3 << (nss * 2));
2025                 tx_mcs_set |= mcs << (nss * 2);
2026         }
2027
2028         return tx_mcs_set;
2029 }
2030
2031 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
2032                                 u8 max_nss)
2033 {
2034         u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2035         u8 max_sup_nss = 0;
2036
2037         switch (nss_ratio_info) {
2038         case WMI_NSS_RATIO_1BY2_NSS:
2039                 max_sup_nss = max_nss >> 1;
2040                 break;
2041         case WMI_NSS_RATIO_3BY4_NSS:
2042                 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2043                 break;
2044         case WMI_NSS_RATIO_1_NSS:
2045                 max_sup_nss = max_nss;
2046                 break;
2047         case WMI_NSS_RATIO_2_NSS:
2048                 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2049                 break;
2050         default:
2051                 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
2052                             nss_ratio_info);
2053                 break;
2054         }
2055
2056         return max_sup_nss;
2057 }
2058
2059 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
2060                                     struct ieee80211_vif *vif,
2061                                     struct ieee80211_sta *sta,
2062                                     struct peer_assoc_params *arg)
2063 {
2064         const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2065         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2066         struct cfg80211_chan_def def;
2067         enum nl80211_band band;
2068         u16 *vht_mcs_mask;
2069         u8 ampdu_factor;
2070         u8 max_nss, vht_mcs;
2071         int i, vht_nss, nss_idx;
2072         bool user_rate_valid = true;
2073         u32 rx_nss, tx_nss, nss_160;
2074
2075         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2076                 return;
2077
2078         if (!vht_cap->vht_supported)
2079                 return;
2080
2081         band = def.chan->band;
2082         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2083
2084         if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
2085                 return;
2086
2087         arg->vht_flag = true;
2088
2089         /* TODO: similar flags required? */
2090         arg->vht_capable = true;
2091
2092         if (def.chan->band == NL80211_BAND_2GHZ)
2093                 arg->vht_ng_flag = true;
2094
2095         arg->peer_vht_caps = vht_cap->cap;
2096
2097         ampdu_factor = (vht_cap->cap &
2098                         IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2099                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2100
2101         /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2102          * zero in VHT IE. Using it would result in degraded throughput.
2103          * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2104          * it if VHT max_mpdu is smaller.
2105          */
2106         arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2107                                  (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2108                                         ampdu_factor)) - 1);
2109
2110         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2111                 arg->bw_80 = true;
2112
2113         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2114                 arg->bw_160 = true;
2115
2116         vht_nss =  ath11k_mac_max_vht_nss(vht_mcs_mask);
2117
2118         if (vht_nss > sta->deflink.rx_nss) {
2119                 user_rate_valid = false;
2120                 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2121                         if (vht_mcs_mask[nss_idx]) {
2122                                 user_rate_valid = true;
2123                                 break;
2124                         }
2125                 }
2126         }
2127
2128         if (!user_rate_valid) {
2129                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer %pM\n",
2130                            sta->deflink.rx_nss, sta->addr);
2131                 vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2132         }
2133
2134         /* Calculate peer NSS capability from VHT capabilities if STA
2135          * supports VHT.
2136          */
2137         for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) {
2138                 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2139                           (2 * i) & 3;
2140
2141                 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2142                     vht_mcs_mask[i])
2143                         max_nss = i + 1;
2144         }
2145         arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2146         arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2147         arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2148         arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2149         arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
2150                 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2151
2152         /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
2153          * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
2154          * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2155          */
2156         arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2157         arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2158
2159         if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2160                         IEEE80211_VHT_MCS_NOT_SUPPORTED)
2161                 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2162
2163         /* TODO:  Check */
2164         arg->tx_max_mcs_nss = 0xFF;
2165
2166         if (arg->peer_phymode == MODE_11AC_VHT160 ||
2167             arg->peer_phymode == MODE_11AC_VHT80_80) {
2168                 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2169                 rx_nss = min(arg->peer_nss, tx_nss);
2170                 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2171
2172                 if (!rx_nss) {
2173                         ath11k_warn(ar->ab, "invalid max_nss\n");
2174                         return;
2175                 }
2176
2177                 if (arg->peer_phymode == MODE_11AC_VHT160)
2178                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2179                 else
2180                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2181
2182                 arg->peer_bw_rxnss_override |= nss_160;
2183         }
2184
2185         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2186                    "vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2187                    sta->addr, arg->peer_max_mpdu, arg->peer_flags,
2188                    arg->peer_bw_rxnss_override);
2189 }
2190
2191 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2192 {
2193         switch ((mcs_map >> (2 * nss)) & 0x3) {
2194         case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2195         case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2196         case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2197         }
2198         return 0;
2199 }
2200
2201 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2202                                         const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2203 {
2204         int idx_limit;
2205         int nss;
2206         u16 mcs_map;
2207         u16 mcs;
2208
2209         for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2210                 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2211                         he_mcs_limit[nss];
2212
2213                 if (mcs_map)
2214                         idx_limit = fls(mcs_map) - 1;
2215                 else
2216                         idx_limit = -1;
2217
2218                 switch (idx_limit) {
2219                 case 0 ... 7:
2220                         mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2221                         break;
2222                 case 8:
2223                 case 9:
2224                         mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2225                         break;
2226                 case 10:
2227                 case 11:
2228                         mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2229                         break;
2230                 default:
2231                         WARN_ON(1);
2232                         fallthrough;
2233                 case -1:
2234                         mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2235                         break;
2236                 }
2237
2238                 tx_mcs_set &= ~(0x3 << (nss * 2));
2239                 tx_mcs_set |= mcs << (nss * 2);
2240         }
2241
2242         return tx_mcs_set;
2243 }
2244
2245 static bool
2246 ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask)
2247 {
2248         int nss;
2249
2250         for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2251                 if (he_mcs_mask[nss])
2252                         return false;
2253
2254         return true;
2255 }
2256
2257 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2258                                    struct ieee80211_vif *vif,
2259                                    struct ieee80211_sta *sta,
2260                                    struct peer_assoc_params *arg)
2261 {
2262         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2263         struct cfg80211_chan_def def;
2264         const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2265         enum nl80211_band band;
2266         u16 he_mcs_mask[NL80211_HE_NSS_MAX];
2267         u8 max_nss, he_mcs;
2268         u16 he_tx_mcs = 0, v = 0;
2269         int i, he_nss, nss_idx;
2270         bool user_rate_valid = true;
2271         u32 rx_nss, tx_nss, nss_160;
2272         u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2273         u16 mcs_160_map, mcs_80_map;
2274         bool support_160;
2275
2276         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2277                 return;
2278
2279         if (!he_cap->has_he)
2280                 return;
2281
2282         band = def.chan->band;
2283         memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs,
2284                sizeof(he_mcs_mask));
2285
2286         if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2287                 return;
2288
2289         arg->he_flag = true;
2290         support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2291                   IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2292
2293         /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2294         mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2295         mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2296
2297         /* Initialize rx_mcs_160 to 9 which is an invalid value */
2298         rx_mcs_160 = 9;
2299         if (support_160) {
2300                 for (i = 7; i >= 0; i--) {
2301                         u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2302
2303                         if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2304                                 rx_mcs_160 = i + 1;
2305                                 break;
2306                         }
2307                 }
2308         }
2309
2310         /* Initialize rx_mcs_80 to 9 which is an invalid value */
2311         rx_mcs_80 = 9;
2312         for (i = 7; i >= 0; i--) {
2313                 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2314
2315                 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2316                         rx_mcs_80 = i + 1;
2317                         break;
2318                 }
2319         }
2320
2321         if (support_160)
2322                 max_nss = min(rx_mcs_80, rx_mcs_160);
2323         else
2324                 max_nss = rx_mcs_80;
2325
2326         arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2327
2328         memcpy_and_pad(&arg->peer_he_cap_macinfo,
2329                        sizeof(arg->peer_he_cap_macinfo),
2330                        he_cap->he_cap_elem.mac_cap_info,
2331                        sizeof(he_cap->he_cap_elem.mac_cap_info),
2332                        0);
2333         memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2334                        sizeof(arg->peer_he_cap_phyinfo),
2335                        he_cap->he_cap_elem.phy_cap_info,
2336                        sizeof(he_cap->he_cap_elem.phy_cap_info),
2337                        0);
2338         arg->peer_he_ops = vif->bss_conf.he_oper.params;
2339
2340         /* the top most byte is used to indicate BSS color info */
2341         arg->peer_he_ops &= 0xffffff;
2342
2343         /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2344          * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2345          * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2346          *
2347          * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2348          * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2349          * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2350          * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2351          * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2352          * length.
2353          */
2354         ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2355                                    IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2356
2357         if (ampdu_factor) {
2358                 if (sta->deflink.vht_cap.vht_supported)
2359                         arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2360                                                     ampdu_factor)) - 1;
2361                 else if (sta->deflink.ht_cap.ht_supported)
2362                         arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2363                                                     ampdu_factor)) - 1;
2364         }
2365
2366         if (he_cap->he_cap_elem.phy_cap_info[6] &
2367             IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2368                 int bit = 7;
2369                 int nss, ru;
2370
2371                 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2372                                           IEEE80211_PPE_THRES_NSS_MASK;
2373                 arg->peer_ppet.ru_bit_mask =
2374                         (he_cap->ppe_thres[0] &
2375                          IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2376                         IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2377
2378                 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2379                         for (ru = 0; ru < 4; ru++) {
2380                                 u32 val = 0;
2381                                 int i;
2382
2383                                 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2384                                         continue;
2385                                 for (i = 0; i < 6; i++) {
2386                                         val >>= 1;
2387                                         val |= ((he_cap->ppe_thres[bit / 8] >>
2388                                                  (bit % 8)) & 0x1) << 5;
2389                                         bit++;
2390                                 }
2391                                 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2392                                                                 val << (ru * 6);
2393                         }
2394                 }
2395         }
2396
2397         if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2398                 arg->twt_responder = true;
2399         if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2400                 arg->twt_requester = true;
2401
2402         he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
2403
2404         if (he_nss > sta->deflink.rx_nss) {
2405                 user_rate_valid = false;
2406                 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2407                         if (he_mcs_mask[nss_idx]) {
2408                                 user_rate_valid = true;
2409                                 break;
2410                         }
2411                 }
2412         }
2413
2414         if (!user_rate_valid) {
2415                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %pM\n",
2416                            sta->deflink.rx_nss, sta->addr);
2417                 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2418         }
2419
2420         switch (sta->deflink.bandwidth) {
2421         case IEEE80211_STA_RX_BW_160:
2422                 if (he_cap->he_cap_elem.phy_cap_info[0] &
2423                     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2424                         v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2425                         v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2426                         arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2427
2428                         v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2429                         arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2430
2431                         arg->peer_he_mcs_count++;
2432                         he_tx_mcs = v;
2433                 }
2434                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2435                 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2436
2437                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2438                 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2439                 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2440
2441                 arg->peer_he_mcs_count++;
2442                 if (!he_tx_mcs)
2443                         he_tx_mcs = v;
2444                 fallthrough;
2445
2446         default:
2447                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2448                 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2449
2450                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2451                 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2452                 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2453
2454                 arg->peer_he_mcs_count++;
2455                 if (!he_tx_mcs)
2456                         he_tx_mcs = v;
2457                 break;
2458         }
2459
2460         /* Calculate peer NSS capability from HE capabilities if STA
2461          * supports HE.
2462          */
2463         for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2464                 he_mcs = he_tx_mcs >> (2 * i) & 3;
2465
2466                 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2467                  * unsupported range, with he_mcs_mask set, so check either of them
2468                  * to find nss.
2469                  */
2470                 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2471                     he_mcs_mask[i])
2472                         max_nss = i + 1;
2473         }
2474         arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2475
2476         if (arg->peer_phymode == MODE_11AX_HE160 ||
2477             arg->peer_phymode == MODE_11AX_HE80_80) {
2478                 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2479                 rx_nss = min(arg->peer_nss, tx_nss);
2480                 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2481
2482                 if (!rx_nss) {
2483                         ath11k_warn(ar->ab, "invalid max_nss\n");
2484                         return;
2485                 }
2486
2487                 if (arg->peer_phymode == MODE_11AX_HE160)
2488                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2489                 else
2490                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2491
2492                 arg->peer_bw_rxnss_override |= nss_160;
2493         }
2494
2495         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2496                    "he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2497                    sta->addr, arg->peer_nss,
2498                    arg->peer_he_mcs_count,
2499                    arg->peer_bw_rxnss_override);
2500 }
2501
2502 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2503                                         struct ieee80211_vif *vif,
2504                                         struct ieee80211_sta *sta,
2505                                         struct peer_assoc_params *arg)
2506 {
2507         const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2508         struct cfg80211_chan_def def;
2509         enum nl80211_band band;
2510         u8  ampdu_factor;
2511
2512         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2513                 return;
2514
2515         band = def.chan->band;
2516
2517         if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2518                 return;
2519
2520         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2521                 arg->bw_40 = true;
2522
2523         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2524                 arg->bw_80 = true;
2525
2526         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2527                 arg->bw_160 = true;
2528
2529         arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2530         arg->peer_mpdu_density =
2531                 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2532                                                    arg->peer_he_caps_6ghz));
2533
2534         /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2535          * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2536          * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2537          * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2538          * Band Capabilities element in the 6 GHz band.
2539          *
2540          * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2541          * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2542          */
2543         ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2544                                  he_cap->he_cap_elem.mac_cap_info[3]) +
2545                         FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2546                                   arg->peer_he_caps_6ghz);
2547
2548         arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2549                                      ampdu_factor)) - 1;
2550 }
2551
2552 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2553                                      struct peer_assoc_params *arg)
2554 {
2555         const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2556         int smps;
2557
2558         if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2559                 return;
2560
2561         if (ht_cap->ht_supported) {
2562                 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2563                 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2564         } else {
2565                 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2566                                      IEEE80211_HE_6GHZ_CAP_SM_PS);
2567         }
2568
2569         switch (smps) {
2570         case WLAN_HT_CAP_SM_PS_STATIC:
2571                 arg->static_mimops_flag = true;
2572                 break;
2573         case WLAN_HT_CAP_SM_PS_DYNAMIC:
2574                 arg->dynamic_mimops_flag = true;
2575                 break;
2576         case WLAN_HT_CAP_SM_PS_DISABLED:
2577                 arg->spatial_mux_flag = true;
2578                 break;
2579         default:
2580                 break;
2581         }
2582 }
2583
2584 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2585                                     struct ieee80211_vif *vif,
2586                                     struct ieee80211_sta *sta,
2587                                     struct peer_assoc_params *arg)
2588 {
2589         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2590
2591         switch (arvif->vdev_type) {
2592         case WMI_VDEV_TYPE_AP:
2593                 if (sta->wme) {
2594                         /* TODO: Check WME vs QoS */
2595                         arg->is_wme_set = true;
2596                         arg->qos_flag = true;
2597                 }
2598
2599                 if (sta->wme && sta->uapsd_queues) {
2600                         /* TODO: Check WME vs QoS */
2601                         arg->is_wme_set = true;
2602                         arg->apsd_flag = true;
2603                         arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2604                 }
2605                 break;
2606         case WMI_VDEV_TYPE_STA:
2607                 if (sta->wme) {
2608                         arg->is_wme_set = true;
2609                         arg->qos_flag = true;
2610                 }
2611                 break;
2612         default:
2613                 break;
2614         }
2615
2616         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n",
2617                    sta->addr, arg->qos_flag);
2618 }
2619
2620 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2621                                     struct ath11k_vif *arvif,
2622                                     struct ieee80211_sta *sta)
2623 {
2624         struct ap_ps_params params;
2625         u32 max_sp;
2626         u32 uapsd;
2627         int ret;
2628
2629         lockdep_assert_held(&ar->conf_mutex);
2630
2631         params.vdev_id = arvif->vdev_id;
2632
2633         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n",
2634                    sta->uapsd_queues, sta->max_sp);
2635
2636         uapsd = 0;
2637         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2638                 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2639                          WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2640         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2641                 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2642                          WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2643         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2644                 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2645                          WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2646         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2647                 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2648                          WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2649
2650         max_sp = 0;
2651         if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2652                 max_sp = sta->max_sp;
2653
2654         params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2655         params.value = uapsd;
2656         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2657         if (ret)
2658                 goto err;
2659
2660         params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2661         params.value = max_sp;
2662         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2663         if (ret)
2664                 goto err;
2665
2666         /* TODO revisit during testing */
2667         params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2668         params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2669         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2670         if (ret)
2671                 goto err;
2672
2673         params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2674         params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2675         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2676         if (ret)
2677                 goto err;
2678
2679         return 0;
2680
2681 err:
2682         ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2683                     params.param, arvif->vdev_id, ret);
2684         return ret;
2685 }
2686
2687 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2688 {
2689         return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2690                ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2691 }
2692
2693 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2694                                                     struct ieee80211_sta *sta)
2695 {
2696         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2697                 switch (sta->deflink.vht_cap.cap &
2698                         IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2699                 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2700                         return MODE_11AC_VHT160;
2701                 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2702                         return MODE_11AC_VHT80_80;
2703                 default:
2704                         /* not sure if this is a valid case? */
2705                         return MODE_11AC_VHT160;
2706                 }
2707         }
2708
2709         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2710                 return MODE_11AC_VHT80;
2711
2712         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2713                 return MODE_11AC_VHT40;
2714
2715         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2716                 return MODE_11AC_VHT20;
2717
2718         return MODE_UNKNOWN;
2719 }
2720
2721 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2722                                                    struct ieee80211_sta *sta)
2723 {
2724         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2725                 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2726                      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2727                         return MODE_11AX_HE160;
2728                 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2729                          IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2730                         return MODE_11AX_HE80_80;
2731                 /* not sure if this is a valid case? */
2732                 return MODE_11AX_HE160;
2733         }
2734
2735         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2736                 return MODE_11AX_HE80;
2737
2738         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2739                 return MODE_11AX_HE40;
2740
2741         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2742                 return MODE_11AX_HE20;
2743
2744         return MODE_UNKNOWN;
2745 }
2746
2747 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2748                                         struct ieee80211_vif *vif,
2749                                         struct ieee80211_sta *sta,
2750                                         struct peer_assoc_params *arg)
2751 {
2752         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2753         struct cfg80211_chan_def def;
2754         enum nl80211_band band;
2755         const u8 *ht_mcs_mask;
2756         const u16 *vht_mcs_mask;
2757         const u16 *he_mcs_mask;
2758         enum wmi_phy_mode phymode = MODE_UNKNOWN;
2759
2760         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2761                 return;
2762
2763         band = def.chan->band;
2764         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2765         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2766         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2767
2768         switch (band) {
2769         case NL80211_BAND_2GHZ:
2770                 if (sta->deflink.he_cap.has_he &&
2771                     !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2772                         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2773                                 phymode = MODE_11AX_HE80_2G;
2774                         else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2775                                 phymode = MODE_11AX_HE40_2G;
2776                         else
2777                                 phymode = MODE_11AX_HE20_2G;
2778                 } else if (sta->deflink.vht_cap.vht_supported &&
2779                            !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2780                         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2781                                 phymode = MODE_11AC_VHT40;
2782                         else
2783                                 phymode = MODE_11AC_VHT20;
2784                 } else if (sta->deflink.ht_cap.ht_supported &&
2785                            !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2786                         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2787                                 phymode = MODE_11NG_HT40;
2788                         else
2789                                 phymode = MODE_11NG_HT20;
2790                 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2791                         phymode = MODE_11G;
2792                 } else {
2793                         phymode = MODE_11B;
2794                 }
2795                 break;
2796         case NL80211_BAND_5GHZ:
2797         case NL80211_BAND_6GHZ:
2798                 /* Check HE first */
2799                 if (sta->deflink.he_cap.has_he &&
2800                     !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2801                         phymode = ath11k_mac_get_phymode_he(ar, sta);
2802                 } else if (sta->deflink.vht_cap.vht_supported &&
2803                            !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2804                         phymode = ath11k_mac_get_phymode_vht(ar, sta);
2805                 } else if (sta->deflink.ht_cap.ht_supported &&
2806                            !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2807                         if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2808                                 phymode = MODE_11NA_HT40;
2809                         else
2810                                 phymode = MODE_11NA_HT20;
2811                 } else {
2812                         phymode = MODE_11A;
2813                 }
2814                 break;
2815         default:
2816                 break;
2817         }
2818
2819         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n",
2820                    sta->addr, ath11k_wmi_phymode_str(phymode));
2821
2822         arg->peer_phymode = phymode;
2823         WARN_ON(phymode == MODE_UNKNOWN);
2824 }
2825
2826 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2827                                       struct ieee80211_vif *vif,
2828                                       struct ieee80211_sta *sta,
2829                                       struct peer_assoc_params *arg,
2830                                       bool reassoc)
2831 {
2832         struct ath11k_sta *arsta;
2833
2834         lockdep_assert_held(&ar->conf_mutex);
2835
2836         arsta = ath11k_sta_to_arsta(sta);
2837
2838         memset(arg, 0, sizeof(*arg));
2839
2840         reinit_completion(&ar->peer_assoc_done);
2841
2842         arg->peer_new_assoc = !reassoc;
2843         ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2844         ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2845         ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2846         ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2847         ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2848         ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2849         ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2850         ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2851         ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2852         ath11k_peer_assoc_h_smps(sta, arg);
2853
2854         arsta->peer_nss = arg->peer_nss;
2855
2856         /* TODO: amsdu_disable req? */
2857 }
2858
2859 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2860                                   const u8 *addr,
2861                                   const struct ieee80211_sta_ht_cap *ht_cap,
2862                                   u16 he_6ghz_capa)
2863 {
2864         int smps;
2865
2866         if (!ht_cap->ht_supported && !he_6ghz_capa)
2867                 return 0;
2868
2869         if (ht_cap->ht_supported) {
2870                 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2871                 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2872         } else {
2873                 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2874         }
2875
2876         if (smps >= ARRAY_SIZE(ath11k_smps_map))
2877                 return -EINVAL;
2878
2879         return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2880                                          WMI_PEER_MIMO_PS_STATE,
2881                                          ath11k_smps_map[smps]);
2882 }
2883
2884 static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif)
2885 {
2886         struct ath11k *ar = arvif->ar;
2887         u32 param, value;
2888         int ret;
2889
2890         if (!arvif->vif->bss_conf.he_support)
2891                 return true;
2892
2893         param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2894         value = 0;
2895         if (arvif->vif->bss_conf.he_su_beamformer) {
2896                 value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2897                 if (arvif->vif->bss_conf.he_mu_beamformer &&
2898                     arvif->vdev_type == WMI_VDEV_TYPE_AP)
2899                         value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE);
2900         }
2901
2902         if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
2903                 value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2904                          FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2905
2906                 if (arvif->vif->bss_conf.he_full_ul_mumimo)
2907                         value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE);
2908
2909                 if (arvif->vif->bss_conf.he_su_beamformee)
2910                         value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2911         }
2912
2913         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
2914         if (ret) {
2915                 ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
2916                             arvif->vdev_id, ret);
2917                 return false;
2918         }
2919
2920         param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
2921         value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
2922                 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
2923                            HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
2924         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2925                                             param, value);
2926         if (ret) {
2927                 ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
2928                             arvif->vdev_id, ret);
2929                 return false;
2930         }
2931         return true;
2932 }
2933
2934 static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar,
2935                                               struct ieee80211_vif *vif,
2936                                               struct ieee80211_sta_he_cap *he_cap)
2937 {
2938         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2939         struct ieee80211_he_cap_elem he_cap_elem = {0};
2940         struct ieee80211_sta_he_cap *cap_band = NULL;
2941         struct cfg80211_chan_def def;
2942         u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2943         u32 hemode = 0;
2944         int ret;
2945
2946         if (!vif->bss_conf.he_support)
2947                 return true;
2948
2949         if (vif->type != NL80211_IFTYPE_STATION)
2950                 return false;
2951
2952         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2953                 return false;
2954
2955         if (def.chan->band == NL80211_BAND_2GHZ)
2956                 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
2957         else
2958                 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
2959
2960         memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
2961
2962         if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
2963                 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2964                         hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2965                 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2966                         hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
2967         }
2968
2969         if (vif->type != NL80211_IFTYPE_MESH_POINT) {
2970                 hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2971                           FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2972
2973                 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
2974                         if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
2975                                 hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO,
2976                                                      HE_UL_MUMIMO_ENABLE);
2977
2978                 if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode))
2979                         hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2980
2981                 if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode))
2982                         hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2983         }
2984
2985         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode);
2986         if (ret) {
2987                 ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
2988                             hemode, ret);
2989                 return false;
2990         }
2991
2992         return true;
2993 }
2994
2995 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2996                              struct ieee80211_vif *vif,
2997                              struct ieee80211_bss_conf *bss_conf)
2998 {
2999         struct ath11k *ar = hw->priv;
3000         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3001         struct peer_assoc_params peer_arg;
3002         struct ieee80211_sta *ap_sta;
3003         struct ath11k_peer *peer;
3004         bool is_auth = false;
3005         struct ieee80211_sta_he_cap  he_cap;
3006         int ret;
3007
3008         lockdep_assert_held(&ar->conf_mutex);
3009
3010         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n",
3011                    arvif->vdev_id, arvif->bssid, arvif->aid);
3012
3013         rcu_read_lock();
3014
3015         ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3016         if (!ap_sta) {
3017                 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3018                             bss_conf->bssid, arvif->vdev_id);
3019                 rcu_read_unlock();
3020                 return;
3021         }
3022
3023         /* he_cap here is updated at assoc success for sta mode only */
3024         he_cap  = ap_sta->deflink.he_cap;
3025
3026         ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
3027
3028         rcu_read_unlock();
3029
3030         if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) {
3031                 ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n",
3032                             arvif->vdev_id, bss_conf->bssid);
3033                 return;
3034         }
3035
3036         peer_arg.is_assoc = true;
3037
3038         ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3039         if (ret) {
3040                 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3041                             bss_conf->bssid, arvif->vdev_id, ret);
3042                 return;
3043         }
3044
3045         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3046                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3047                             bss_conf->bssid, arvif->vdev_id);
3048                 return;
3049         }
3050
3051         ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3052                                      &ap_sta->deflink.ht_cap,
3053                                      le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
3054         if (ret) {
3055                 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3056                             arvif->vdev_id, ret);
3057                 return;
3058         }
3059
3060         WARN_ON(arvif->is_up);
3061
3062         arvif->aid = vif->cfg.aid;
3063         ether_addr_copy(arvif->bssid, bss_conf->bssid);
3064
3065         ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid,
3066                                  NULL, 0, 0);
3067         if (ret) {
3068                 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3069                             arvif->vdev_id, ret);
3070                 return;
3071         }
3072
3073         arvif->is_up = true;
3074         arvif->rekey_data.enable_offload = false;
3075
3076         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3077                    "vdev %d up (associated) bssid %pM aid %d\n",
3078                    arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3079
3080         spin_lock_bh(&ar->ab->base_lock);
3081
3082         peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3083         if (peer && peer->is_authorized)
3084                 is_auth = true;
3085
3086         spin_unlock_bh(&ar->ab->base_lock);
3087
3088         if (is_auth) {
3089                 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
3090                                                 arvif->vdev_id,
3091                                                 WMI_PEER_AUTHORIZE,
3092                                                 1);
3093                 if (ret)
3094                         ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3095         }
3096
3097         ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3098                                            &bss_conf->he_obss_pd);
3099         if (ret)
3100                 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3101                             arvif->vdev_id, ret);
3102
3103         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3104                                             WMI_VDEV_PARAM_DTIM_POLICY,
3105                                             WMI_DTIM_POLICY_STICK);
3106         if (ret)
3107                 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
3108                             arvif->vdev_id, ret);
3109
3110         ath11k_mac_11d_scan_stop_all(ar->ab);
3111 }
3112
3113 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
3114                                 struct ieee80211_vif *vif)
3115 {
3116         struct ath11k *ar = hw->priv;
3117         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3118         int ret;
3119
3120         lockdep_assert_held(&ar->conf_mutex);
3121
3122         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n",
3123                    arvif->vdev_id, arvif->bssid);
3124
3125         ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
3126         if (ret)
3127                 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
3128                             arvif->vdev_id, ret);
3129
3130         arvif->is_up = false;
3131
3132         memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3133
3134         cancel_delayed_work_sync(&arvif->connection_loss_work);
3135 }
3136
3137 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
3138 {
3139         u32 preamble;
3140         u16 hw_value;
3141         int rate;
3142         size_t i;
3143
3144         if (ath11k_mac_bitrate_is_cck(bitrate))
3145                 preamble = WMI_RATE_PREAMBLE_CCK;
3146         else
3147                 preamble = WMI_RATE_PREAMBLE_OFDM;
3148
3149         for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
3150                 if (ath11k_legacy_rates[i].bitrate != bitrate)
3151                         continue;
3152
3153                 hw_value = ath11k_legacy_rates[i].hw_value;
3154                 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3155
3156                 return rate;
3157         }
3158
3159         return -EINVAL;
3160 }
3161
3162 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
3163                                          struct ieee80211_vif *vif,
3164                                          struct cfg80211_chan_def *def)
3165 {
3166         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3167         const struct ieee80211_supported_band *sband;
3168         u8 basic_rate_idx;
3169         int hw_rate_code;
3170         u32 vdev_param;
3171         u16 bitrate;
3172         int ret;
3173
3174         lockdep_assert_held(&ar->conf_mutex);
3175
3176         sband = ar->hw->wiphy->bands[def->chan->band];
3177         basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
3178         bitrate = sband->bitrates[basic_rate_idx].bitrate;
3179
3180         hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
3181         if (hw_rate_code < 0) {
3182                 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3183                 return;
3184         }
3185
3186         vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3187         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3188                                             hw_rate_code);
3189         if (ret)
3190                 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3191
3192         /* For WCN6855, firmware will clear this param when vdev starts, hence
3193          * cache it here so that we can reconfigure it once vdev starts.
3194          */
3195         ar->hw_rate_code = hw_rate_code;
3196
3197         vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3198         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3199                                             hw_rate_code);
3200         if (ret)
3201                 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3202 }
3203
3204 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
3205                                      struct ieee80211_bss_conf *info)
3206 {
3207         struct ath11k *ar = arvif->ar;
3208         struct sk_buff *tmpl;
3209         int ret;
3210         u32 interval;
3211         bool unsol_bcast_probe_resp_enabled = false;
3212
3213         if (info->fils_discovery.max_interval) {
3214                 interval = info->fils_discovery.max_interval;
3215
3216                 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
3217                 if (tmpl)
3218                         ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
3219                                                              tmpl);
3220         } else if (info->unsol_bcast_probe_resp_interval) {
3221                 unsol_bcast_probe_resp_enabled = 1;
3222                 interval = info->unsol_bcast_probe_resp_interval;
3223
3224                 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
3225                                                                  arvif->vif);
3226                 if (tmpl)
3227                         ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
3228                                                          tmpl);
3229         } else { /* Disable */
3230                 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
3231         }
3232
3233         if (!tmpl) {
3234                 ath11k_warn(ar->ab,
3235                             "mac vdev %i failed to retrieve %s template\n",
3236                             arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
3237                             "unsolicited broadcast probe response" :
3238                             "FILS discovery"));
3239                 return -EPERM;
3240         }
3241         kfree_skb(tmpl);
3242
3243         if (!ret)
3244                 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
3245                                                 unsol_bcast_probe_resp_enabled);
3246
3247         return ret;
3248 }
3249
3250 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
3251                                      struct ieee80211_he_obss_pd *he_obss_pd)
3252 {
3253         u32 bitmap[2], param_id, param_val, pdev_id;
3254         int ret;
3255         s8 non_srg_th = 0, srg_th = 0;
3256
3257         pdev_id = ar->pdev->pdev_id;
3258
3259         /* Set and enable SRG/non-SRG OBSS PD Threshold */
3260         param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
3261         if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
3262                 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
3263                 if (ret)
3264                         ath11k_warn(ar->ab,
3265                                     "failed to set obss_pd_threshold for pdev: %u\n",
3266                                     pdev_id);
3267                 return ret;
3268         }
3269
3270         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3271                    "obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
3272                    he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
3273                    he_obss_pd->max_offset);
3274
3275         param_val = 0;
3276
3277         if (he_obss_pd->sr_ctrl &
3278             IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
3279                 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
3280         } else {
3281                 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
3282                         non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
3283                                       he_obss_pd->non_srg_max_offset);
3284                 else
3285                         non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
3286
3287                 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
3288         }
3289
3290         if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
3291                 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
3292                 param_val |= ATH11K_OBSS_PD_SRG_EN;
3293         }
3294
3295         if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3296                      ar->ab->wmi_ab.svc_map)) {
3297                 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
3298                 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
3299         } else {
3300                 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
3301                 /* SRG not supported and threshold in dB */
3302                 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
3303                                ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
3304         }
3305
3306         param_val |= (non_srg_th & GENMASK(7, 0));
3307         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3308         if (ret) {
3309                 ath11k_warn(ar->ab,
3310                             "failed to set obss_pd_threshold for pdev: %u\n",
3311                             pdev_id);
3312                 return ret;
3313         }
3314
3315         /* Enable OBSS PD for all access category */
3316         param_id  = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3317         param_val = 0xf;
3318         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3319         if (ret) {
3320                 ath11k_warn(ar->ab,
3321                             "failed to set obss_pd_per_ac for pdev: %u\n",
3322                             pdev_id);
3323                 return ret;
3324         }
3325
3326         /* Set SR Prohibit */
3327         param_id  = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3328         param_val = !!(he_obss_pd->sr_ctrl &
3329                        IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3330         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3331         if (ret) {
3332                 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3333                             pdev_id);
3334                 return ret;
3335         }
3336
3337         if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3338                       ar->ab->wmi_ab.svc_map))
3339                 return 0;
3340
3341         /* Set SRG BSS Color Bitmap */
3342         memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3343         ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3344         if (ret) {
3345                 ath11k_warn(ar->ab,
3346                             "failed to set bss_color_bitmap for pdev: %u\n",
3347                             pdev_id);
3348                 return ret;
3349         }
3350
3351         /* Set SRG Partial BSSID Bitmap */
3352         memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3353         ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3354         if (ret) {
3355                 ath11k_warn(ar->ab,
3356                             "failed to set partial_bssid_bitmap for pdev: %u\n",
3357                             pdev_id);
3358                 return ret;
3359         }
3360
3361         memset(bitmap, 0xff, sizeof(bitmap));
3362
3363         /* Enable all BSS Colors for SRG */
3364         ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3365         if (ret) {
3366                 ath11k_warn(ar->ab,
3367                             "failed to set srg_color_en_bitmap pdev: %u\n",
3368                             pdev_id);
3369                 return ret;
3370         }
3371
3372         /* Enable all partial BSSID mask for SRG */
3373         ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3374         if (ret) {
3375                 ath11k_warn(ar->ab,
3376                             "failed to set srg_bssid_en_bitmap pdev: %u\n",
3377                             pdev_id);
3378                 return ret;
3379         }
3380
3381         /* Enable all BSS Colors for non-SRG */
3382         ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3383         if (ret) {
3384                 ath11k_warn(ar->ab,
3385                             "failed to set non_srg_color_en_bitmap pdev: %u\n",
3386                             pdev_id);
3387                 return ret;
3388         }
3389
3390         /* Enable all partial BSSID mask for non-SRG */
3391         ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3392         if (ret) {
3393                 ath11k_warn(ar->ab,
3394                             "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3395                             pdev_id);
3396                 return ret;
3397         }
3398
3399         return 0;
3400 }
3401
3402 static bool ath11k_mac_supports_station_tpc(struct ath11k *ar,
3403                                             struct ath11k_vif *arvif,
3404                                             const struct cfg80211_chan_def *chandef)
3405 {
3406         return ath11k_wmi_supports_6ghz_cc_ext(ar) &&
3407                 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
3408                 arvif->vdev_type == WMI_VDEV_TYPE_STA &&
3409                 arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
3410                 chandef->chan &&
3411                 chandef->chan->band == NL80211_BAND_6GHZ;
3412 }
3413
3414 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3415                                            struct ieee80211_vif *vif,
3416                                            struct ieee80211_bss_conf *info,
3417                                            u64 changed)
3418 {
3419         struct ath11k *ar = hw->priv;
3420         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3421         struct cfg80211_chan_def def;
3422         u32 param_id, param_value;
3423         enum nl80211_band band;
3424         u32 vdev_param;
3425         int mcast_rate;
3426         u32 preamble;
3427         u16 hw_value;
3428         u16 bitrate;
3429         int ret = 0;
3430         u8 rateidx;
3431         u32 rate, param;
3432         u32 ipv4_cnt;
3433
3434         mutex_lock(&ar->conf_mutex);
3435
3436         if (changed & BSS_CHANGED_BEACON_INT) {
3437                 arvif->beacon_interval = info->beacon_int;
3438
3439                 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3440                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3441                                                     param_id,
3442                                                     arvif->beacon_interval);
3443                 if (ret)
3444                         ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3445                                     arvif->vdev_id);
3446                 else
3447                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3448                                    "Beacon interval: %d set for VDEV: %d\n",
3449                                    arvif->beacon_interval, arvif->vdev_id);
3450         }
3451
3452         if (changed & BSS_CHANGED_BEACON) {
3453                 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3454                 param_value = WMI_BEACON_STAGGERED_MODE;
3455                 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3456                                                 param_value, ar->pdev->pdev_id);
3457                 if (ret)
3458                         ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3459                                     arvif->vdev_id);
3460                 else
3461                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3462                                    "Set staggered beacon mode for VDEV: %d\n",
3463                                    arvif->vdev_id);
3464
3465                 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3466                         ret = ath11k_mac_setup_bcn_tmpl(arvif);
3467                         if (ret)
3468                                 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3469                                             ret);
3470                 }
3471
3472                 if (arvif->bcca_zero_sent)
3473                         arvif->do_not_send_tmpl = true;
3474                 else
3475                         arvif->do_not_send_tmpl = false;
3476
3477                 if (vif->bss_conf.he_support) {
3478                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3479                                                             WMI_VDEV_PARAM_BA_MODE,
3480                                                             WMI_BA_MODE_BUFFER_SIZE_256);
3481                         if (ret)
3482                                 ath11k_warn(ar->ab,
3483                                             "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3484                                             arvif->vdev_id);
3485                         else
3486                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3487                                            "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3488                                            arvif->vdev_id);
3489                 }
3490         }
3491
3492         if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3493                 arvif->dtim_period = info->dtim_period;
3494
3495                 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3496                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3497                                                     param_id,
3498                                                     arvif->dtim_period);
3499
3500                 if (ret)
3501                         ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3502                                     arvif->vdev_id, ret);
3503                 else
3504                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3505                                    "DTIM period: %d set for VDEV: %d\n",
3506                                    arvif->dtim_period, arvif->vdev_id);
3507         }
3508
3509         if (changed & BSS_CHANGED_SSID &&
3510             vif->type == NL80211_IFTYPE_AP) {
3511                 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3512                 if (vif->cfg.ssid_len)
3513                         memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3514                                vif->cfg.ssid_len);
3515                 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3516         }
3517
3518         if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3519                 ether_addr_copy(arvif->bssid, info->bssid);
3520
3521         if (changed & BSS_CHANGED_BEACON_ENABLED) {
3522                 if (info->enable_beacon)
3523                         ath11k_mac_set_he_txbf_conf(arvif);
3524                 ath11k_control_beaconing(arvif, info);
3525
3526                 if (arvif->is_up && vif->bss_conf.he_support &&
3527                     vif->bss_conf.he_oper.params) {
3528                         param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3529                         param_value = vif->bss_conf.he_oper.params;
3530                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3531                                                             param_id, param_value);
3532                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3533                                    "he oper param: %x set for VDEV: %d\n",
3534                                    param_value, arvif->vdev_id);
3535
3536                         if (ret)
3537                                 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3538                                             param_value, arvif->vdev_id, ret);
3539                 }
3540         }
3541
3542         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3543                 u32 cts_prot;
3544
3545                 cts_prot = !!(info->use_cts_prot);
3546                 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3547
3548                 if (arvif->is_started) {
3549                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3550                                                             param_id, cts_prot);
3551                         if (ret)
3552                                 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3553                                             arvif->vdev_id);
3554                         else
3555                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3556                                            cts_prot, arvif->vdev_id);
3557                 } else {
3558                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3559                 }
3560         }
3561
3562         if (changed & BSS_CHANGED_ERP_SLOT) {
3563                 u32 slottime;
3564
3565                 if (info->use_short_slot)
3566                         slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3567
3568                 else
3569                         slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3570
3571                 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3572                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3573                                                     param_id, slottime);
3574                 if (ret)
3575                         ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3576                                     arvif->vdev_id);
3577                 else
3578                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3579                                    "Set slottime: %d for VDEV: %d\n",
3580                                    slottime, arvif->vdev_id);
3581         }
3582
3583         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3584                 u32 preamble;
3585
3586                 if (info->use_short_preamble)
3587                         preamble = WMI_VDEV_PREAMBLE_SHORT;
3588                 else
3589                         preamble = WMI_VDEV_PREAMBLE_LONG;
3590
3591                 param_id = WMI_VDEV_PARAM_PREAMBLE;
3592                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3593                                                     param_id, preamble);
3594                 if (ret)
3595                         ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3596                                     arvif->vdev_id);
3597                 else
3598                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3599                                    "Set preamble: %d for VDEV: %d\n",
3600                                    preamble, arvif->vdev_id);
3601         }
3602
3603         if (changed & BSS_CHANGED_ASSOC) {
3604                 if (vif->cfg.assoc)
3605                         ath11k_bss_assoc(hw, vif, info);
3606                 else
3607                         ath11k_bss_disassoc(hw, vif);
3608         }
3609
3610         if (changed & BSS_CHANGED_TXPOWER) {
3611                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n",
3612                            arvif->vdev_id, info->txpower);
3613                 arvif->txpower = info->txpower;
3614                 ath11k_mac_txpower_recalc(ar);
3615         }
3616
3617         if (changed & BSS_CHANGED_PS &&
3618             ar->ab->hw_params.supports_sta_ps) {
3619                 arvif->ps = vif->cfg.ps;
3620
3621                 ret = ath11k_mac_config_ps(ar);
3622                 if (ret)
3623                         ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3624                                     arvif->vdev_id, ret);
3625         }
3626
3627         if (changed & BSS_CHANGED_MCAST_RATE &&
3628             !ath11k_mac_vif_chan(arvif->vif, &def)) {
3629                 band = def.chan->band;
3630                 mcast_rate = vif->bss_conf.mcast_rate[band];
3631
3632                 if (mcast_rate > 0)
3633                         rateidx = mcast_rate - 1;
3634                 else
3635                         rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3636
3637                 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3638                         rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3639
3640                 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3641                 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3642
3643                 if (ath11k_mac_bitrate_is_cck(bitrate))
3644                         preamble = WMI_RATE_PREAMBLE_CCK;
3645                 else
3646                         preamble = WMI_RATE_PREAMBLE_OFDM;
3647
3648                 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3649
3650                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3651                            "vdev %d mcast_rate %x\n",
3652                            arvif->vdev_id, rate);
3653
3654                 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3655                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3656                                                     vdev_param, rate);
3657                 if (ret)
3658                         ath11k_warn(ar->ab,
3659                                     "failed to set mcast rate on vdev %i: %d\n",
3660                                     arvif->vdev_id,  ret);
3661
3662                 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3663                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3664                                                     vdev_param, rate);
3665                 if (ret)
3666                         ath11k_warn(ar->ab,
3667                                     "failed to set bcast rate on vdev %i: %d\n",
3668                                     arvif->vdev_id,  ret);
3669         }
3670
3671         if (changed & BSS_CHANGED_BASIC_RATES &&
3672             !ath11k_mac_vif_chan(arvif->vif, &def))
3673                 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3674
3675         if (changed & BSS_CHANGED_TWT) {
3676                 struct wmi_twt_enable_params twt_params = {0};
3677
3678                 if (info->twt_requester || info->twt_responder) {
3679                         ath11k_wmi_fill_default_twt_params(&twt_params);
3680                         ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id,
3681                                                        &twt_params);
3682                 } else {
3683                         ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3684                 }
3685         }
3686
3687         if (changed & BSS_CHANGED_HE_OBSS_PD)
3688                 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3689
3690         if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3691                 if (vif->type == NL80211_IFTYPE_AP) {
3692                         ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3693                                 ar, arvif->vdev_id, info->he_bss_color.color,
3694                                 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3695                                 info->he_bss_color.enabled);
3696                         if (ret)
3697                                 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3698                                             arvif->vdev_id,  ret);
3699
3700                         param_id = WMI_VDEV_PARAM_BSS_COLOR;
3701                         if (info->he_bss_color.enabled)
3702                                 param_value = info->he_bss_color.color <<
3703                                                 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3704                         else
3705                                 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3706
3707                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3708                                                             param_id,
3709                                                             param_value);
3710                         if (ret)
3711                                 ath11k_warn(ar->ab,
3712                                             "failed to set bss color param on vdev %i: %d\n",
3713                                             arvif->vdev_id,  ret);
3714
3715                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3716                                    "bss color param 0x%x set on vdev %i\n",
3717                                    param_value, arvif->vdev_id);
3718                 } else if (vif->type == NL80211_IFTYPE_STATION) {
3719                         ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3720                                                                           arvif->vdev_id,
3721                                                                           1);
3722                         if (ret)
3723                                 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3724                                             arvif->vdev_id,  ret);
3725                         ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3726                                 ar, arvif->vdev_id, 0,
3727                                 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3728                         if (ret)
3729                                 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3730                                             arvif->vdev_id,  ret);
3731                 }
3732         }
3733
3734         if (changed & BSS_CHANGED_FTM_RESPONDER &&
3735             arvif->ftm_responder != info->ftm_responder &&
3736             test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) &&
3737             (vif->type == NL80211_IFTYPE_AP ||
3738              vif->type == NL80211_IFTYPE_MESH_POINT)) {
3739                 arvif->ftm_responder = info->ftm_responder;
3740                 param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE;
3741                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
3742                                                     arvif->ftm_responder);
3743                 if (ret)
3744                         ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n",
3745                                     arvif->vdev_id, ret);
3746         }
3747
3748         if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3749             changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3750                 ath11k_mac_fils_discovery(arvif, info);
3751
3752         if (changed & BSS_CHANGED_ARP_FILTER) {
3753                 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3754                 memcpy(arvif->arp_ns_offload.ipv4_addr,
3755                        vif->cfg.arp_addr_list,
3756                        ipv4_cnt * sizeof(u32));
3757                 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3758                 arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3759
3760                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3761                            vif->cfg.arp_addr_cnt,
3762                            vif->addr, arvif->arp_ns_offload.ipv4_addr);
3763         }
3764
3765         mutex_unlock(&ar->conf_mutex);
3766 }
3767
3768 void __ath11k_mac_scan_finish(struct ath11k *ar)
3769 {
3770         lockdep_assert_held(&ar->data_lock);
3771
3772         switch (ar->scan.state) {
3773         case ATH11K_SCAN_IDLE:
3774                 break;
3775         case ATH11K_SCAN_RUNNING:
3776         case ATH11K_SCAN_ABORTING:
3777                 if (ar->scan.is_roc && ar->scan.roc_notify)
3778                         ieee80211_remain_on_channel_expired(ar->hw);
3779                 fallthrough;
3780         case ATH11K_SCAN_STARTING:
3781                 if (!ar->scan.is_roc) {
3782                         struct cfg80211_scan_info info = {
3783                                 .aborted = ((ar->scan.state ==
3784                                             ATH11K_SCAN_ABORTING) ||
3785                                             (ar->scan.state ==
3786                                             ATH11K_SCAN_STARTING)),
3787                         };
3788
3789                         ieee80211_scan_completed(ar->hw, &info);
3790                 }
3791
3792                 ar->scan.state = ATH11K_SCAN_IDLE;
3793                 ar->scan_channel = NULL;
3794                 ar->scan.roc_freq = 0;
3795                 cancel_delayed_work(&ar->scan.timeout);
3796                 complete_all(&ar->scan.completed);
3797                 break;
3798         }
3799 }
3800
3801 void ath11k_mac_scan_finish(struct ath11k *ar)
3802 {
3803         spin_lock_bh(&ar->data_lock);
3804         __ath11k_mac_scan_finish(ar);
3805         spin_unlock_bh(&ar->data_lock);
3806 }
3807
3808 static int ath11k_scan_stop(struct ath11k *ar)
3809 {
3810         struct scan_cancel_param arg = {
3811                 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3812                 .scan_id = ATH11K_SCAN_ID,
3813         };
3814         int ret;
3815
3816         lockdep_assert_held(&ar->conf_mutex);
3817
3818         /* TODO: Fill other STOP Params */
3819         arg.pdev_id = ar->pdev->pdev_id;
3820
3821         ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3822         if (ret) {
3823                 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3824                 goto out;
3825         }
3826
3827         ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3828         if (ret == 0) {
3829                 ath11k_warn(ar->ab,
3830                             "failed to receive scan abort comple: timed out\n");
3831                 ret = -ETIMEDOUT;
3832         } else if (ret > 0) {
3833                 ret = 0;
3834         }
3835
3836 out:
3837         /* Scan state should be updated upon scan completion but in case
3838          * firmware fails to deliver the event (for whatever reason) it is
3839          * desired to clean up scan state anyway. Firmware may have just
3840          * dropped the scan completion event delivery due to transport pipe
3841          * being overflown with data and/or it can recover on its own before
3842          * next scan request is submitted.
3843          */
3844         spin_lock_bh(&ar->data_lock);
3845         if (ar->scan.state != ATH11K_SCAN_IDLE)
3846                 __ath11k_mac_scan_finish(ar);
3847         spin_unlock_bh(&ar->data_lock);
3848
3849         return ret;
3850 }
3851
3852 static void ath11k_scan_abort(struct ath11k *ar)
3853 {
3854         int ret;
3855
3856         lockdep_assert_held(&ar->conf_mutex);
3857
3858         spin_lock_bh(&ar->data_lock);
3859
3860         switch (ar->scan.state) {
3861         case ATH11K_SCAN_IDLE:
3862                 /* This can happen if timeout worker kicked in and called
3863                  * abortion while scan completion was being processed.
3864                  */
3865                 break;
3866         case ATH11K_SCAN_STARTING:
3867         case ATH11K_SCAN_ABORTING:
3868                 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3869                             ar->scan.state);
3870                 break;
3871         case ATH11K_SCAN_RUNNING:
3872                 ar->scan.state = ATH11K_SCAN_ABORTING;
3873                 spin_unlock_bh(&ar->data_lock);
3874
3875                 ret = ath11k_scan_stop(ar);
3876                 if (ret)
3877                         ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3878
3879                 spin_lock_bh(&ar->data_lock);
3880                 break;
3881         }
3882
3883         spin_unlock_bh(&ar->data_lock);
3884 }
3885
3886 static void ath11k_scan_timeout_work(struct work_struct *work)
3887 {
3888         struct ath11k *ar = container_of(work, struct ath11k,
3889                                          scan.timeout.work);
3890
3891         mutex_lock(&ar->conf_mutex);
3892         ath11k_scan_abort(ar);
3893         mutex_unlock(&ar->conf_mutex);
3894 }
3895
3896 static int ath11k_start_scan(struct ath11k *ar,
3897                              struct scan_req_params *arg)
3898 {
3899         int ret;
3900         unsigned long timeout = 1 * HZ;
3901
3902         lockdep_assert_held(&ar->conf_mutex);
3903
3904         if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3905                 ath11k_spectral_reset_buffer(ar);
3906
3907         ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3908         if (ret)
3909                 return ret;
3910
3911         if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3912                 timeout = 5 * HZ;
3913
3914                 if (ar->supports_6ghz)
3915                         timeout += 5 * HZ;
3916         }
3917
3918         ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3919         if (ret == 0) {
3920                 ret = ath11k_scan_stop(ar);
3921                 if (ret)
3922                         ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3923
3924                 return -ETIMEDOUT;
3925         }
3926
3927         /* If we failed to start the scan, return error code at
3928          * this point.  This is probably due to some issue in the
3929          * firmware, but no need to wedge the driver due to that...
3930          */
3931         spin_lock_bh(&ar->data_lock);
3932         if (ar->scan.state == ATH11K_SCAN_IDLE) {
3933                 spin_unlock_bh(&ar->data_lock);
3934                 return -EINVAL;
3935         }
3936         spin_unlock_bh(&ar->data_lock);
3937
3938         return 0;
3939 }
3940
3941 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3942                                  struct ieee80211_vif *vif,
3943                                  struct ieee80211_scan_request *hw_req)
3944 {
3945         struct ath11k *ar = hw->priv;
3946         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3947         struct cfg80211_scan_request *req = &hw_req->req;
3948         struct scan_req_params *arg = NULL;
3949         int ret = 0;
3950         int i;
3951         u32 scan_timeout;
3952
3953         /* Firmwares advertising the support of triggering 11D algorithm
3954          * on the scan results of a regular scan expects driver to send
3955          * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID.
3956          * With this feature, separate 11D scan can be avoided since
3957          * regdomain can be determined with the scan results of the
3958          * regular scan.
3959          */
3960         if (ar->state_11d == ATH11K_11D_PREPARING &&
3961             test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN,
3962                      ar->ab->wmi_ab.svc_map))
3963                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3964
3965         mutex_lock(&ar->conf_mutex);
3966
3967         spin_lock_bh(&ar->data_lock);
3968         switch (ar->scan.state) {
3969         case ATH11K_SCAN_IDLE:
3970                 reinit_completion(&ar->scan.started);
3971                 reinit_completion(&ar->scan.completed);
3972                 ar->scan.state = ATH11K_SCAN_STARTING;
3973                 ar->scan.is_roc = false;
3974                 ar->scan.vdev_id = arvif->vdev_id;
3975                 ret = 0;
3976                 break;
3977         case ATH11K_SCAN_STARTING:
3978         case ATH11K_SCAN_RUNNING:
3979         case ATH11K_SCAN_ABORTING:
3980                 ret = -EBUSY;
3981                 break;
3982         }
3983         spin_unlock_bh(&ar->data_lock);
3984
3985         if (ret)
3986                 goto exit;
3987
3988         arg = kzalloc(sizeof(*arg), GFP_KERNEL);
3989
3990         if (!arg) {
3991                 ret = -ENOMEM;
3992                 goto exit;
3993         }
3994
3995         ath11k_wmi_start_scan_init(ar, arg);
3996         arg->vdev_id = arvif->vdev_id;
3997         arg->scan_id = ATH11K_SCAN_ID;
3998
3999         if (req->ie_len) {
4000                 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
4001                 if (!arg->extraie.ptr) {
4002                         ret = -ENOMEM;
4003                         goto exit;
4004                 }
4005                 arg->extraie.len = req->ie_len;
4006         }
4007
4008         if (req->n_ssids) {
4009                 arg->num_ssids = req->n_ssids;
4010                 for (i = 0; i < arg->num_ssids; i++) {
4011                         arg->ssid[i].length  = req->ssids[i].ssid_len;
4012                         memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid,
4013                                req->ssids[i].ssid_len);
4014                 }
4015         } else {
4016                 arg->scan_f_passive = 1;
4017         }
4018
4019         if (req->n_channels) {
4020                 arg->num_chan = req->n_channels;
4021                 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
4022                                          GFP_KERNEL);
4023
4024                 if (!arg->chan_list) {
4025                         ret = -ENOMEM;
4026                         goto exit;
4027                 }
4028
4029                 for (i = 0; i < arg->num_chan; i++) {
4030                         if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
4031                                      ar->ab->wmi_ab.svc_map)) {
4032                                 arg->chan_list[i] =
4033                                         u32_encode_bits(req->channels[i]->center_freq,
4034                                                         WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
4035
4036                                 /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
4037                                  * flags, then scan all PSC channels in 6 GHz band and
4038                                  * those non-PSC channels where RNR IE is found during
4039                                  * the legacy 2.4/5 GHz scan.
4040                                  * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
4041                                  * then all channels in 6 GHz will be scanned.
4042                                  */
4043                                 if (req->channels[i]->band == NL80211_BAND_6GHZ &&
4044                                     req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
4045                                     !cfg80211_channel_is_psc(req->channels[i]))
4046                                         arg->chan_list[i] |=
4047                                                 WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
4048                         } else {
4049                                 arg->chan_list[i] = req->channels[i]->center_freq;
4050                         }
4051                 }
4052         }
4053
4054         if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
4055                 arg->scan_f_add_spoofed_mac_in_probe = 1;
4056                 ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
4057                 ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
4058         }
4059
4060         /* if duration is set, default dwell times will be overwritten */
4061         if (req->duration) {
4062                 arg->dwell_time_active = req->duration;
4063                 arg->dwell_time_active_2g = req->duration;
4064                 arg->dwell_time_active_6g = req->duration;
4065                 arg->dwell_time_passive = req->duration;
4066                 arg->dwell_time_passive_6g = req->duration;
4067                 arg->burst_duration = req->duration;
4068
4069                 scan_timeout = min_t(u32, arg->max_rest_time *
4070                                 (arg->num_chan - 1) + (req->duration +
4071                                 ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
4072                                 arg->num_chan, arg->max_scan_time);
4073         } else {
4074                 scan_timeout = arg->max_scan_time;
4075         }
4076
4077         /* Add a margin to account for event/command processing */
4078         scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
4079
4080         ret = ath11k_start_scan(ar, arg);
4081         if (ret) {
4082                 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
4083                 spin_lock_bh(&ar->data_lock);
4084                 ar->scan.state = ATH11K_SCAN_IDLE;
4085                 spin_unlock_bh(&ar->data_lock);
4086         }
4087
4088         ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4089                                      msecs_to_jiffies(scan_timeout));
4090
4091 exit:
4092         if (arg) {
4093                 kfree(arg->chan_list);
4094                 kfree(arg->extraie.ptr);
4095                 kfree(arg);
4096         }
4097
4098         mutex_unlock(&ar->conf_mutex);
4099
4100         if (ar->state_11d == ATH11K_11D_PREPARING)
4101                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
4102
4103         return ret;
4104 }
4105
4106 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
4107                                          struct ieee80211_vif *vif)
4108 {
4109         struct ath11k *ar = hw->priv;
4110
4111         mutex_lock(&ar->conf_mutex);
4112         ath11k_scan_abort(ar);
4113         mutex_unlock(&ar->conf_mutex);
4114
4115         cancel_delayed_work_sync(&ar->scan.timeout);
4116 }
4117
4118 static int ath11k_install_key(struct ath11k_vif *arvif,
4119                               struct ieee80211_key_conf *key,
4120                               enum set_key_cmd cmd,
4121                               const u8 *macaddr, u32 flags)
4122 {
4123         int ret;
4124         struct ath11k *ar = arvif->ar;
4125         struct wmi_vdev_install_key_arg arg = {
4126                 .vdev_id = arvif->vdev_id,
4127                 .key_idx = key->keyidx,
4128                 .key_len = key->keylen,
4129                 .key_data = key->key,
4130                 .key_flags = flags,
4131                 .macaddr = macaddr,
4132         };
4133
4134         lockdep_assert_held(&arvif->ar->conf_mutex);
4135
4136         reinit_completion(&ar->install_key_done);
4137
4138         if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4139                 return 0;
4140
4141         if (cmd == DISABLE_KEY) {
4142                 arg.key_cipher = WMI_CIPHER_NONE;
4143                 arg.key_data = NULL;
4144                 goto install;
4145         }
4146
4147         switch (key->cipher) {
4148         case WLAN_CIPHER_SUITE_CCMP:
4149                 arg.key_cipher = WMI_CIPHER_AES_CCM;
4150                 /* TODO: Re-check if flag is valid */
4151                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
4152                 break;
4153         case WLAN_CIPHER_SUITE_TKIP:
4154                 arg.key_cipher = WMI_CIPHER_TKIP;
4155                 arg.key_txmic_len = 8;
4156                 arg.key_rxmic_len = 8;
4157                 break;
4158         case WLAN_CIPHER_SUITE_CCMP_256:
4159                 arg.key_cipher = WMI_CIPHER_AES_CCM;
4160                 break;
4161         case WLAN_CIPHER_SUITE_GCMP:
4162         case WLAN_CIPHER_SUITE_GCMP_256:
4163                 arg.key_cipher = WMI_CIPHER_AES_GCM;
4164                 break;
4165         default:
4166                 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
4167                 return -EOPNOTSUPP;
4168         }
4169
4170         if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
4171                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
4172                               IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
4173
4174 install:
4175         ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
4176
4177         if (ret)
4178                 return ret;
4179
4180         if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
4181                 return -ETIMEDOUT;
4182
4183         return ar->install_key_status ? -EINVAL : 0;
4184 }
4185
4186 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
4187                                   const u8 *addr)
4188 {
4189         struct ath11k *ar = arvif->ar;
4190         struct ath11k_base *ab = ar->ab;
4191         struct ath11k_peer *peer;
4192         int first_errno = 0;
4193         int ret;
4194         int i;
4195         u32 flags = 0;
4196
4197         lockdep_assert_held(&ar->conf_mutex);
4198
4199         spin_lock_bh(&ab->base_lock);
4200         peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
4201         spin_unlock_bh(&ab->base_lock);
4202
4203         if (!peer)
4204                 return -ENOENT;
4205
4206         for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
4207                 if (!peer->keys[i])
4208                         continue;
4209
4210                 /* key flags are not required to delete the key */
4211                 ret = ath11k_install_key(arvif, peer->keys[i],
4212                                          DISABLE_KEY, addr, flags);
4213                 if (ret < 0 && first_errno == 0)
4214                         first_errno = ret;
4215
4216                 if (ret < 0)
4217                         ath11k_warn(ab, "failed to remove peer key %d: %d\n",
4218                                     i, ret);
4219
4220                 spin_lock_bh(&ab->base_lock);
4221                 peer->keys[i] = NULL;
4222                 spin_unlock_bh(&ab->base_lock);
4223         }
4224
4225         return first_errno;
4226 }
4227
4228 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4229                                  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4230                                  struct ieee80211_key_conf *key)
4231 {
4232         struct ath11k *ar = hw->priv;
4233         struct ath11k_base *ab = ar->ab;
4234         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4235         struct ath11k_peer *peer;
4236         struct ath11k_sta *arsta;
4237         const u8 *peer_addr;
4238         int ret = 0;
4239         u32 flags = 0;
4240
4241         /* BIP needs to be done in software */
4242         if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
4243             key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
4244             key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
4245             key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
4246                 return 1;
4247
4248         if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4249                 return 1;
4250
4251         if (key->keyidx > WMI_MAX_KEY_INDEX)
4252                 return -ENOSPC;
4253
4254         mutex_lock(&ar->conf_mutex);
4255
4256         if (sta)
4257                 peer_addr = sta->addr;
4258         else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4259                 peer_addr = vif->bss_conf.bssid;
4260         else
4261                 peer_addr = vif->addr;
4262
4263         key->hw_key_idx = key->keyidx;
4264
4265         /* the peer should not disappear in mid-way (unless FW goes awry) since
4266          * we already hold conf_mutex. we just make sure its there now.
4267          */
4268         spin_lock_bh(&ab->base_lock);
4269         peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4270
4271         /* flush the fragments cache during key (re)install to
4272          * ensure all frags in the new frag list belong to the same key.
4273          */
4274         if (peer && sta && cmd == SET_KEY)
4275                 ath11k_peer_frags_flush(ar, peer);
4276         spin_unlock_bh(&ab->base_lock);
4277
4278         if (!peer) {
4279                 if (cmd == SET_KEY) {
4280                         ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
4281                                     peer_addr);
4282                         ret = -EOPNOTSUPP;
4283                         goto exit;
4284                 } else {
4285                         /* if the peer doesn't exist there is no key to disable
4286                          * anymore
4287                          */
4288                         goto exit;
4289                 }
4290         }
4291
4292         if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4293                 flags |= WMI_KEY_PAIRWISE;
4294         else
4295                 flags |= WMI_KEY_GROUP;
4296
4297         ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
4298         if (ret) {
4299                 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
4300                 goto exit;
4301         }
4302
4303         ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
4304         if (ret) {
4305                 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
4306                 goto exit;
4307         }
4308
4309         spin_lock_bh(&ab->base_lock);
4310         peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4311         if (peer && cmd == SET_KEY) {
4312                 peer->keys[key->keyidx] = key;
4313                 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4314                         peer->ucast_keyidx = key->keyidx;
4315                         peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
4316                 } else {
4317                         peer->mcast_keyidx = key->keyidx;
4318                         peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
4319                 }
4320         } else if (peer && cmd == DISABLE_KEY) {
4321                 peer->keys[key->keyidx] = NULL;
4322                 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4323                         peer->ucast_keyidx = 0;
4324                 else
4325                         peer->mcast_keyidx = 0;
4326         } else if (!peer)
4327                 /* impossible unless FW goes crazy */
4328                 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
4329
4330         if (sta) {
4331                 arsta = ath11k_sta_to_arsta(sta);
4332
4333                 switch (key->cipher) {
4334                 case WLAN_CIPHER_SUITE_TKIP:
4335                 case WLAN_CIPHER_SUITE_CCMP:
4336                 case WLAN_CIPHER_SUITE_CCMP_256:
4337                 case WLAN_CIPHER_SUITE_GCMP:
4338                 case WLAN_CIPHER_SUITE_GCMP_256:
4339                         if (cmd == SET_KEY)
4340                                 arsta->pn_type = HAL_PN_TYPE_WPA;
4341                         else
4342                                 arsta->pn_type = HAL_PN_TYPE_NONE;
4343                         break;
4344                 default:
4345                         arsta->pn_type = HAL_PN_TYPE_NONE;
4346                         break;
4347                 }
4348         }
4349
4350         spin_unlock_bh(&ab->base_lock);
4351
4352 exit:
4353         mutex_unlock(&ar->conf_mutex);
4354         return ret;
4355 }
4356
4357 static int
4358 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
4359                                      enum nl80211_band band,
4360                                      const struct cfg80211_bitrate_mask *mask)
4361 {
4362         int num_rates = 0;
4363         int i;
4364
4365         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
4366                 num_rates += hweight8(mask->control[band].ht_mcs[i]);
4367
4368         return num_rates;
4369 }
4370
4371 static int
4372 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
4373                                       enum nl80211_band band,
4374                                       const struct cfg80211_bitrate_mask *mask)
4375 {
4376         int num_rates = 0;
4377         int i;
4378
4379         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
4380                 num_rates += hweight16(mask->control[band].vht_mcs[i]);
4381
4382         return num_rates;
4383 }
4384
4385 static int
4386 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
4387                                      enum nl80211_band band,
4388                                      const struct cfg80211_bitrate_mask *mask)
4389 {
4390         int num_rates = 0;
4391         int i;
4392
4393         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
4394                 num_rates += hweight16(mask->control[band].he_mcs[i]);
4395
4396         return num_rates;
4397 }
4398
4399 static int
4400 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
4401                                    struct ieee80211_sta *sta,
4402                                    const struct cfg80211_bitrate_mask *mask,
4403                                    enum nl80211_band band)
4404 {
4405         struct ath11k *ar = arvif->ar;
4406         u8 vht_rate, nss;
4407         u32 rate_code;
4408         int ret, i;
4409
4410         lockdep_assert_held(&ar->conf_mutex);
4411
4412         nss = 0;
4413
4414         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
4415                 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4416                         nss = i + 1;
4417                         vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4418                 }
4419         }
4420
4421         if (!nss) {
4422                 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4423                             sta->addr);
4424                 return -EINVAL;
4425         }
4426
4427         /* Avoid updating invalid nss as fixed rate*/
4428         if (nss > sta->deflink.rx_nss)
4429                 return -EINVAL;
4430
4431         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4432                    "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4433                    sta->addr);
4434
4435         rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4436                                         WMI_RATE_PREAMBLE_VHT);
4437         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4438                                         arvif->vdev_id,
4439                                         WMI_PEER_PARAM_FIXED_RATE,
4440                                         rate_code);
4441         if (ret)
4442                 ath11k_warn(ar->ab,
4443                             "failed to update STA %pM Fixed Rate %d: %d\n",
4444                              sta->addr, rate_code, ret);
4445
4446         return ret;
4447 }
4448
4449 static int
4450 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4451                                   struct ieee80211_sta *sta,
4452                                   const struct cfg80211_bitrate_mask *mask,
4453                                   enum nl80211_band band)
4454 {
4455         struct ath11k *ar = arvif->ar;
4456         u8 he_rate, nss;
4457         u32 rate_code;
4458         int ret, i;
4459
4460         lockdep_assert_held(&ar->conf_mutex);
4461
4462         nss = 0;
4463
4464         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4465                 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4466                         nss = i + 1;
4467                         he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4468                 }
4469         }
4470
4471         if (!nss) {
4472                 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4473                             sta->addr);
4474                 return -EINVAL;
4475         }
4476
4477         /* Avoid updating invalid nss as fixed rate */
4478         if (nss > sta->deflink.rx_nss)
4479                 return -EINVAL;
4480
4481         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4482                    "setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4483                    sta->addr);
4484
4485         rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4486                                         WMI_RATE_PREAMBLE_HE);
4487
4488         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4489                                         arvif->vdev_id,
4490                                         WMI_PEER_PARAM_FIXED_RATE,
4491                                         rate_code);
4492         if (ret)
4493                 ath11k_warn(ar->ab,
4494                             "failed to update sta %pM fixed rate %d: %d\n",
4495                             sta->addr, rate_code, ret);
4496
4497         return ret;
4498 }
4499
4500 static int
4501 ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif,
4502                                   struct ieee80211_sta *sta,
4503                                   const struct cfg80211_bitrate_mask *mask,
4504                                   enum nl80211_band band)
4505 {
4506         struct ath11k *ar = arvif->ar;
4507         u8 ht_rate, nss = 0;
4508         u32 rate_code;
4509         int ret, i;
4510
4511         lockdep_assert_held(&ar->conf_mutex);
4512
4513         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
4514                 if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
4515                         nss = i + 1;
4516                         ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4517                 }
4518         }
4519
4520         if (!nss) {
4521                 ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM",
4522                             sta->addr);
4523                 return -EINVAL;
4524         }
4525
4526         /* Avoid updating invalid nss as fixed rate*/
4527         if (nss > sta->deflink.rx_nss)
4528                 return -EINVAL;
4529
4530         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4531                    "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates",
4532                    sta->addr);
4533
4534         rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1,
4535                                         WMI_RATE_PREAMBLE_HT);
4536         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4537                                         arvif->vdev_id,
4538                                         WMI_PEER_PARAM_FIXED_RATE,
4539                                         rate_code);
4540         if (ret)
4541                 ath11k_warn(ar->ab,
4542                             "failed to update STA %pM HT Fixed Rate %d: %d\n",
4543                             sta->addr, rate_code, ret);
4544
4545         return ret;
4546 }
4547
4548 static int ath11k_station_assoc(struct ath11k *ar,
4549                                 struct ieee80211_vif *vif,
4550                                 struct ieee80211_sta *sta,
4551                                 bool reassoc)
4552 {
4553         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4554         struct peer_assoc_params peer_arg;
4555         int ret = 0;
4556         struct cfg80211_chan_def def;
4557         enum nl80211_band band;
4558         struct cfg80211_bitrate_mask *mask;
4559         u8 num_ht_rates, num_vht_rates, num_he_rates;
4560
4561         lockdep_assert_held(&ar->conf_mutex);
4562
4563         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4564                 return -EPERM;
4565
4566         band = def.chan->band;
4567         mask = &arvif->bitrate_mask;
4568
4569         ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4570
4571         peer_arg.is_assoc = true;
4572         ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4573         if (ret) {
4574                 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4575                             sta->addr, arvif->vdev_id, ret);
4576                 return ret;
4577         }
4578
4579         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4580                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4581                             sta->addr, arvif->vdev_id);
4582                 return -ETIMEDOUT;
4583         }
4584
4585         num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4586         num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4587         num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask);
4588
4589         /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4590          * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4591          * fixed param.
4592          * Note that all other rates and NSS will be disabled for this peer.
4593          */
4594         if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4595                 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4596                                                          band);
4597                 if (ret)
4598                         return ret;
4599         } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4600                 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4601                                                         band);
4602                 if (ret)
4603                         return ret;
4604         } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4605                 ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4606                                                         band);
4607                 if (ret)
4608                         return ret;
4609         }
4610
4611         /* Re-assoc is run only to update supported rates for given station. It
4612          * doesn't make much sense to reconfigure the peer completely.
4613          */
4614         if (reassoc)
4615                 return 0;
4616
4617         ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4618                                      &sta->deflink.ht_cap,
4619                                      le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4620         if (ret) {
4621                 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4622                             arvif->vdev_id, ret);
4623                 return ret;
4624         }
4625
4626         if (!sta->wme) {
4627                 arvif->num_legacy_stations++;
4628                 ret = ath11k_recalc_rtscts_prot(arvif);
4629                 if (ret)
4630                         return ret;
4631         }
4632
4633         if (sta->wme && sta->uapsd_queues) {
4634                 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4635                 if (ret) {
4636                         ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4637                                     sta->addr, arvif->vdev_id, ret);
4638                         return ret;
4639                 }
4640         }
4641
4642         return 0;
4643 }
4644
4645 static int ath11k_station_disassoc(struct ath11k *ar,
4646                                    struct ieee80211_vif *vif,
4647                                    struct ieee80211_sta *sta)
4648 {
4649         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4650         int ret = 0;
4651
4652         lockdep_assert_held(&ar->conf_mutex);
4653
4654         if (!sta->wme) {
4655                 arvif->num_legacy_stations--;
4656                 ret = ath11k_recalc_rtscts_prot(arvif);
4657                 if (ret)
4658                         return ret;
4659         }
4660
4661         ret = ath11k_clear_peer_keys(arvif, sta->addr);
4662         if (ret) {
4663                 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4664                             arvif->vdev_id, ret);
4665                 return ret;
4666         }
4667         return 0;
4668 }
4669
4670 static u32 ath11k_mac_max_nss(const u8 *ht_mcs_mask, const u16 *vht_mcs_mask,
4671                               const u16 *he_mcs_mask)
4672 {
4673         return max3(ath11k_mac_max_ht_nss(ht_mcs_mask),
4674                     ath11k_mac_max_vht_nss(vht_mcs_mask),
4675                     ath11k_mac_max_he_nss(he_mcs_mask));
4676 }
4677
4678 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4679 {
4680         struct ath11k *ar;
4681         struct ath11k_vif *arvif;
4682         struct ath11k_sta *arsta;
4683         struct ieee80211_sta *sta;
4684         struct cfg80211_chan_def def;
4685         enum nl80211_band band;
4686         const u8 *ht_mcs_mask;
4687         const u16 *vht_mcs_mask;
4688         const u16 *he_mcs_mask;
4689         u32 changed, bw, nss, smps, bw_prev;
4690         int err, num_ht_rates, num_vht_rates, num_he_rates;
4691         const struct cfg80211_bitrate_mask *mask;
4692         struct peer_assoc_params peer_arg;
4693         enum wmi_phy_mode peer_phymode;
4694
4695         arsta = container_of(wk, struct ath11k_sta, update_wk);
4696         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4697         arvif = arsta->arvif;
4698         ar = arvif->ar;
4699
4700         if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4701                 return;
4702
4703         band = def.chan->band;
4704         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4705         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4706         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4707
4708         spin_lock_bh(&ar->data_lock);
4709
4710         changed = arsta->changed;
4711         arsta->changed = 0;
4712
4713         bw = arsta->bw;
4714         bw_prev = arsta->bw_prev;
4715         nss = arsta->nss;
4716         smps = arsta->smps;
4717
4718         spin_unlock_bh(&ar->data_lock);
4719
4720         mutex_lock(&ar->conf_mutex);
4721
4722         nss = max_t(u32, 1, nss);
4723         nss = min(nss, ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
4724
4725         if (changed & IEEE80211_RC_BW_CHANGED) {
4726                 /* Get the peer phymode */
4727                 ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
4728                 peer_phymode = peer_arg.peer_phymode;
4729
4730                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n",
4731                            sta->addr, bw, peer_phymode);
4732
4733                 if (bw > bw_prev) {
4734                         /* BW is upgraded. In this case we send WMI_PEER_PHYMODE
4735                          * followed by WMI_PEER_CHWIDTH
4736                          */
4737                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n",
4738                                    sta->addr, bw, bw_prev);
4739
4740                         err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4741                                                         WMI_PEER_PHYMODE, peer_phymode);
4742
4743                         if (err) {
4744                                 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4745                                             sta->addr, peer_phymode, err);
4746                                 goto err_rc_bw_changed;
4747                         }
4748
4749                         err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4750                                                         WMI_PEER_CHWIDTH, bw);
4751
4752                         if (err)
4753                                 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4754                                             sta->addr, bw, err);
4755                 } else {
4756                         /* BW is downgraded. In this case we send WMI_PEER_CHWIDTH
4757                          * followed by WMI_PEER_PHYMODE
4758                          */
4759                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n",
4760                                    sta->addr, bw, bw_prev);
4761
4762                         err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4763                                                         WMI_PEER_CHWIDTH, bw);
4764
4765                         if (err) {
4766                                 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4767                                             sta->addr, bw, err);
4768                                 goto err_rc_bw_changed;
4769                         }
4770
4771                         err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4772                                                         WMI_PEER_PHYMODE, peer_phymode);
4773
4774                         if (err)
4775                                 ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4776                                             sta->addr, peer_phymode, err);
4777                 }
4778         }
4779
4780         if (changed & IEEE80211_RC_NSS_CHANGED) {
4781                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n",
4782                            sta->addr, nss);
4783
4784                 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4785                                                 WMI_PEER_NSS, nss);
4786                 if (err)
4787                         ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4788                                     sta->addr, nss, err);
4789         }
4790
4791         if (changed & IEEE80211_RC_SMPS_CHANGED) {
4792                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n",
4793                            sta->addr, smps);
4794
4795                 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4796                                                 WMI_PEER_MIMO_PS_STATE, smps);
4797                 if (err)
4798                         ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4799                                     sta->addr, smps, err);
4800         }
4801
4802         if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4803                 mask = &arvif->bitrate_mask;
4804                 num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band,
4805                                                                     mask);
4806                 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4807                                                                       mask);
4808                 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4809                                                                     mask);
4810
4811                 /* Peer_assoc_prepare will reject vht rates in
4812                  * bitrate_mask if its not available in range format and
4813                  * sets vht tx_rateset as unsupported. So multiple VHT MCS
4814                  * setting(eg. MCS 4,5,6) per peer is not supported here.
4815                  * But, Single rate in VHT mask can be set as per-peer
4816                  * fixed rate. But even if any HT rates are configured in
4817                  * the bitrate mask, device will not switch to those rates
4818                  * when per-peer Fixed rate is set.
4819                  * TODO: Check RATEMASK_CMDID to support auto rates selection
4820                  * across HT/VHT and for multiple VHT MCS support.
4821                  */
4822                 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4823                         ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4824                                                            band);
4825                 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4826                         ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4827                                                           band);
4828                 } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4829                         ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4830                                                           band);
4831                 } else {
4832                         /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4833                          * is provided in the new bitrate mask we set the
4834                          * other rates using peer_assoc command. Also clear
4835                          * the peer fixed rate settings as it has higher proprity
4836                          * than peer assoc
4837                          */
4838                         err = ath11k_wmi_set_peer_param(ar, sta->addr,
4839                                                         arvif->vdev_id,
4840                                                         WMI_PEER_PARAM_FIXED_RATE,
4841                                                         WMI_FIXED_RATE_NONE);
4842                         if (err)
4843                                 ath11k_warn(ar->ab,
4844                                             "failed to disable peer fixed rate for sta %pM: %d\n",
4845                                             sta->addr, err);
4846
4847                         ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4848                                                   &peer_arg, true);
4849
4850                         peer_arg.is_assoc = false;
4851                         err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4852                         if (err)
4853                                 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4854                                             sta->addr, arvif->vdev_id, err);
4855
4856                         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4857                                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4858                                             sta->addr, arvif->vdev_id);
4859                 }
4860         }
4861
4862 err_rc_bw_changed:
4863         mutex_unlock(&ar->conf_mutex);
4864 }
4865
4866 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4867 {
4868         struct ath11k *ar;
4869         struct ath11k_vif *arvif;
4870         struct ath11k_sta *arsta;
4871         struct ieee80211_sta *sta;
4872         int ret = 0;
4873
4874         arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4875         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4876         arvif = arsta->arvif;
4877         ar = arvif->ar;
4878
4879         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4880                    "setting USE_4ADDR for peer %pM\n", sta->addr);
4881
4882         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4883                                         arvif->vdev_id,
4884                                         WMI_PEER_USE_4ADDR, 1);
4885
4886         if (ret)
4887                 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4888                             sta->addr, ret);
4889 }
4890
4891 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4892                                        struct ieee80211_sta *sta)
4893 {
4894         struct ath11k *ar = arvif->ar;
4895
4896         lockdep_assert_held(&ar->conf_mutex);
4897
4898         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4899                 return 0;
4900
4901         if (ar->num_stations >= ar->max_num_stations)
4902                 return -ENOBUFS;
4903
4904         ar->num_stations++;
4905
4906         return 0;
4907 }
4908
4909 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4910                                         struct ieee80211_sta *sta)
4911 {
4912         struct ath11k *ar = arvif->ar;
4913
4914         lockdep_assert_held(&ar->conf_mutex);
4915
4916         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4917                 return;
4918
4919         ar->num_stations--;
4920 }
4921
4922 static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,
4923                                               struct ieee80211_sta *sta)
4924 {
4925         u32 bw = WMI_PEER_CHWIDTH_20MHZ;
4926
4927         switch (sta->deflink.bandwidth) {
4928         case IEEE80211_STA_RX_BW_20:
4929                 bw = WMI_PEER_CHWIDTH_20MHZ;
4930                 break;
4931         case IEEE80211_STA_RX_BW_40:
4932                 bw = WMI_PEER_CHWIDTH_40MHZ;
4933                 break;
4934         case IEEE80211_STA_RX_BW_80:
4935                 bw = WMI_PEER_CHWIDTH_80MHZ;
4936                 break;
4937         case IEEE80211_STA_RX_BW_160:
4938                 bw = WMI_PEER_CHWIDTH_160MHZ;
4939                 break;
4940         default:
4941                 ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n",
4942                             sta->deflink.bandwidth, sta->addr);
4943                 bw = WMI_PEER_CHWIDTH_20MHZ;
4944                 break;
4945         }
4946
4947         return bw;
4948 }
4949
4950 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4951                                        struct ieee80211_vif *vif,
4952                                        struct ieee80211_sta *sta)
4953 {
4954         struct ath11k *ar = hw->priv;
4955         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4956         int ret = 0;
4957         s16 txpwr;
4958
4959         if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4960                 txpwr = 0;
4961         } else {
4962                 txpwr = sta->deflink.txpwr.power;
4963                 if (!txpwr)
4964                         return -EINVAL;
4965         }
4966
4967         if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
4968                 return -EINVAL;
4969
4970         mutex_lock(&ar->conf_mutex);
4971
4972         ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4973                                         WMI_PEER_USE_FIXED_PWR, txpwr);
4974         if (ret) {
4975                 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4976                             ret);
4977                 goto out;
4978         }
4979
4980 out:
4981         mutex_unlock(&ar->conf_mutex);
4982         return ret;
4983 }
4984
4985 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
4986                                         struct ieee80211_vif *vif,
4987                                         struct ieee80211_sta *sta, bool enabled)
4988 {
4989         struct ath11k *ar = hw->priv;
4990         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
4991
4992         if (enabled && !arsta->use_4addr_set) {
4993                 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
4994                 arsta->use_4addr_set = true;
4995         }
4996 }
4997
4998 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4999                                         struct ieee80211_vif *vif,
5000                                         struct ieee80211_sta *sta,
5001                                         u32 changed)
5002 {
5003         struct ath11k *ar = hw->priv;
5004         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5005         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5006         struct ath11k_peer *peer;
5007         u32 bw, smps;
5008
5009         spin_lock_bh(&ar->ab->base_lock);
5010
5011         peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5012         if (!peer) {
5013                 spin_unlock_bh(&ar->ab->base_lock);
5014                 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
5015                             sta->addr, arvif->vdev_id);
5016                 return;
5017         }
5018
5019         spin_unlock_bh(&ar->ab->base_lock);
5020
5021         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5022                    "sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
5023                    sta->addr, changed, sta->deflink.bandwidth,
5024                    sta->deflink.rx_nss,
5025                    sta->deflink.smps_mode);
5026
5027         spin_lock_bh(&ar->data_lock);
5028
5029         if (changed & IEEE80211_RC_BW_CHANGED) {
5030                 bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5031                 arsta->bw_prev = arsta->bw;
5032                 arsta->bw = bw;
5033         }
5034
5035         if (changed & IEEE80211_RC_NSS_CHANGED)
5036                 arsta->nss = sta->deflink.rx_nss;
5037
5038         if (changed & IEEE80211_RC_SMPS_CHANGED) {
5039                 smps = WMI_PEER_SMPS_PS_NONE;
5040
5041                 switch (sta->deflink.smps_mode) {
5042                 case IEEE80211_SMPS_AUTOMATIC:
5043                 case IEEE80211_SMPS_OFF:
5044                         smps = WMI_PEER_SMPS_PS_NONE;
5045                         break;
5046                 case IEEE80211_SMPS_STATIC:
5047                         smps = WMI_PEER_SMPS_STATIC;
5048                         break;
5049                 case IEEE80211_SMPS_DYNAMIC:
5050                         smps = WMI_PEER_SMPS_DYNAMIC;
5051                         break;
5052                 default:
5053                         ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
5054                                     sta->deflink.smps_mode, sta->addr);
5055                         smps = WMI_PEER_SMPS_PS_NONE;
5056                         break;
5057                 }
5058
5059                 arsta->smps = smps;
5060         }
5061
5062         arsta->changed |= changed;
5063
5064         spin_unlock_bh(&ar->data_lock);
5065
5066         ieee80211_queue_work(hw, &arsta->update_wk);
5067 }
5068
5069 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
5070                                 u16 ac, bool enable)
5071 {
5072         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5073         u32 value = 0;
5074         int ret = 0;
5075
5076         if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5077                 return 0;
5078
5079         switch (ac) {
5080         case IEEE80211_AC_VO:
5081                 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5082                         WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
5083                 break;
5084         case IEEE80211_AC_VI:
5085                 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5086                         WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
5087                 break;
5088         case IEEE80211_AC_BE:
5089                 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5090                         WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
5091                 break;
5092         case IEEE80211_AC_BK:
5093                 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5094                         WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
5095                 break;
5096         }
5097
5098         if (enable)
5099                 arvif->u.sta.uapsd |= value;
5100         else
5101                 arvif->u.sta.uapsd &= ~value;
5102
5103         ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5104                                           WMI_STA_PS_PARAM_UAPSD,
5105                                           arvif->u.sta.uapsd);
5106         if (ret) {
5107                 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
5108                 goto exit;
5109         }
5110
5111         if (arvif->u.sta.uapsd)
5112                 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5113         else
5114                 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5115
5116         ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5117                                           WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5118                                           value);
5119         if (ret)
5120                 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
5121
5122 exit:
5123         return ret;
5124 }
5125
5126 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
5127                                  struct ieee80211_vif *vif,
5128                                  unsigned int link_id, u16 ac,
5129                                  const struct ieee80211_tx_queue_params *params)
5130 {
5131         struct ath11k *ar = hw->priv;
5132         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5133         struct wmi_wmm_params_arg *p = NULL;
5134         int ret;
5135
5136         mutex_lock(&ar->conf_mutex);
5137
5138         switch (ac) {
5139         case IEEE80211_AC_VO:
5140                 p = &arvif->wmm_params.ac_vo;
5141                 break;
5142         case IEEE80211_AC_VI:
5143                 p = &arvif->wmm_params.ac_vi;
5144                 break;
5145         case IEEE80211_AC_BE:
5146                 p = &arvif->wmm_params.ac_be;
5147                 break;
5148         case IEEE80211_AC_BK:
5149                 p = &arvif->wmm_params.ac_bk;
5150                 break;
5151         }
5152
5153         if (WARN_ON(!p)) {
5154                 ret = -EINVAL;
5155                 goto exit;
5156         }
5157
5158         p->cwmin = params->cw_min;
5159         p->cwmax = params->cw_max;
5160         p->aifs = params->aifs;
5161         p->txop = params->txop;
5162
5163         ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
5164                                                  &arvif->wmm_params);
5165         if (ret) {
5166                 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
5167                 goto exit;
5168         }
5169
5170         ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5171
5172         if (ret)
5173                 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
5174
5175 exit:
5176         mutex_unlock(&ar->conf_mutex);
5177         return ret;
5178 }
5179
5180 static struct ieee80211_sta_ht_cap
5181 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
5182 {
5183         int i;
5184         struct ieee80211_sta_ht_cap ht_cap = {0};
5185         u32 ar_vht_cap = ar->pdev->cap.vht_cap;
5186
5187         if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
5188                 return ht_cap;
5189
5190         ht_cap.ht_supported = 1;
5191         ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5192         ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
5193         ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5194         ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5195         ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5196
5197         if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
5198                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5199
5200         if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
5201                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5202
5203         if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
5204                 u32 smps;
5205
5206                 smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
5207                 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5208
5209                 ht_cap.cap |= smps;
5210         }
5211
5212         if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
5213                 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5214
5215         if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
5216                 u32 stbc;
5217
5218                 stbc   = ar_ht_cap;
5219                 stbc  &= WMI_HT_CAP_RX_STBC;
5220                 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5221                 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5222                 stbc  &= IEEE80211_HT_CAP_RX_STBC;
5223
5224                 ht_cap.cap |= stbc;
5225         }
5226
5227         if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
5228                 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5229
5230         if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
5231                 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5232
5233         if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5234                 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5235
5236         for (i = 0; i < ar->num_rx_chains; i++) {
5237                 if (rate_cap_rx_chainmask & BIT(i))
5238                         ht_cap.mcs.rx_mask[i] = 0xFF;
5239         }
5240
5241         ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5242
5243         return ht_cap;
5244 }
5245
5246 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
5247 {
5248         u32 value = 0;
5249         struct ath11k *ar = arvif->ar;
5250         int nsts;
5251         int sound_dim;
5252         u32 vht_cap = ar->pdev->cap.vht_cap;
5253         u32 vdev_param = WMI_VDEV_PARAM_TXBF;
5254
5255         if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
5256                 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5257                 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5258                 if (nsts > (ar->num_rx_chains - 1))
5259                         nsts = ar->num_rx_chains - 1;
5260                 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5261         }
5262
5263         if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
5264                 sound_dim = vht_cap &
5265                             IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5266                 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5267                 if (sound_dim > (ar->num_tx_chains - 1))
5268                         sound_dim = ar->num_tx_chains - 1;
5269                 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5270         }
5271
5272         if (!value)
5273                 return 0;
5274
5275         if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
5276                 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5277
5278                 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
5279                     arvif->vdev_type == WMI_VDEV_TYPE_AP)
5280                         value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
5281         }
5282
5283         /* TODO: SUBFEE not validated in HK, disable here until validated? */
5284
5285         if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
5286                 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5287
5288                 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
5289                     arvif->vdev_type == WMI_VDEV_TYPE_STA)
5290                         value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
5291         }
5292
5293         return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5294                                              vdev_param, value);
5295 }
5296
5297 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
5298 {
5299         bool subfer, subfee;
5300         int sound_dim = 0, nsts = 0;
5301
5302         subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
5303         subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5304
5305         if (ar->num_tx_chains < 2) {
5306                 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5307                 subfer = false;
5308         }
5309
5310         if (ar->num_rx_chains < 2) {
5311                 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
5312                 subfee = false;
5313         }
5314
5315         /* If SU Beaformer is not set, then disable MU Beamformer Capability */
5316         if (!subfer)
5317                 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5318
5319         /* If SU Beaformee is not set, then disable MU Beamformee Capability */
5320         if (!subfee)
5321                 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5322
5323         sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5324         sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5325         *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5326
5327         nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5328         nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5329         *vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5330
5331         /* Enable Sounding Dimension Field only if SU BF is enabled */
5332         if (subfer) {
5333                 if (sound_dim > (ar->num_tx_chains - 1))
5334                         sound_dim = ar->num_tx_chains - 1;
5335
5336                 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5337                 sound_dim &=  IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5338                 *vht_cap |= sound_dim;
5339         }
5340
5341         /* Enable Beamformee STS Field only if SU BF is enabled */
5342         if (subfee) {
5343                 if (nsts > (ar->num_rx_chains - 1))
5344                         nsts = ar->num_rx_chains - 1;
5345
5346                 nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5347                 nsts &=  IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5348                 *vht_cap |= nsts;
5349         }
5350 }
5351
5352 static struct ieee80211_sta_vht_cap
5353 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5354                       u32 rate_cap_rx_chainmask)
5355 {
5356         struct ieee80211_sta_vht_cap vht_cap = {0};
5357         u16 txmcs_map, rxmcs_map;
5358         int i;
5359
5360         vht_cap.vht_supported = 1;
5361         vht_cap.cap = ar->pdev->cap.vht_cap;
5362
5363         if (ar->pdev->cap.nss_ratio_enabled)
5364                 vht_cap.vht_mcs.tx_highest |=
5365                         cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5366
5367         ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5368
5369         rxmcs_map = 0;
5370         txmcs_map = 0;
5371         for (i = 0; i < 8; i++) {
5372                 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5373                         txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5374                 else
5375                         txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5376
5377                 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5378                         rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5379                 else
5380                         rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5381         }
5382
5383         if (rate_cap_tx_chainmask <= 1)
5384                 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5385
5386         vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5387         vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5388
5389         return vht_cap;
5390 }
5391
5392 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5393                                         struct ath11k_pdev_cap *cap,
5394                                         u32 *ht_cap_info)
5395 {
5396         struct ieee80211_supported_band *band;
5397         u32 rate_cap_tx_chainmask;
5398         u32 rate_cap_rx_chainmask;
5399         u32 ht_cap;
5400
5401         rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5402         rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5403
5404         if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5405                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5406                 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5407                 if (ht_cap_info)
5408                         *ht_cap_info = ht_cap;
5409                 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5410                                                     rate_cap_rx_chainmask);
5411         }
5412
5413         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5414             (ar->ab->hw_params.single_pdev_only ||
5415              !ar->supports_6ghz)) {
5416                 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5417                 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5418                 if (ht_cap_info)
5419                         *ht_cap_info = ht_cap;
5420                 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5421                                                     rate_cap_rx_chainmask);
5422                 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5423                                                       rate_cap_rx_chainmask);
5424         }
5425 }
5426
5427 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5428 {
5429         /* TODO: Check the request chainmask against the supported
5430          * chainmask table which is advertised in extented_service_ready event
5431          */
5432
5433         return 0;
5434 }
5435
5436 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5437                                   u8 *he_ppet)
5438 {
5439         int nss, ru;
5440         u8 bit = 7;
5441
5442         he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5443         he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5444                        IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5445                       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5446         for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5447                 for (ru = 0; ru < 4; ru++) {
5448                         u8 val;
5449                         int i;
5450
5451                         if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5452                                 continue;
5453                         val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5454                                0x3f;
5455                         val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5456                         for (i = 5; i >= 0; i--) {
5457                                 he_ppet[bit / 8] |=
5458                                         ((val >> i) & 0x1) << ((bit % 8));
5459                                 bit++;
5460                         }
5461                 }
5462         }
5463 }
5464
5465 static void
5466 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5467 {
5468         u8 m;
5469
5470         m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5471             IEEE80211_HE_MAC_CAP0_TWT_REQ;
5472         he_cap_elem->mac_cap_info[0] &= ~m;
5473
5474         m = IEEE80211_HE_MAC_CAP2_TRS |
5475             IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5476             IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5477         he_cap_elem->mac_cap_info[2] &= ~m;
5478
5479         m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5480             IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5481             IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5482         he_cap_elem->mac_cap_info[3] &= ~m;
5483
5484         m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5485             IEEE80211_HE_MAC_CAP4_BQR;
5486         he_cap_elem->mac_cap_info[4] &= ~m;
5487
5488         m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5489             IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5490             IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5491             IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5492         he_cap_elem->mac_cap_info[5] &= ~m;
5493
5494         m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5495             IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5496         he_cap_elem->phy_cap_info[2] &= ~m;
5497
5498         m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5499             IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5500             IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5501         he_cap_elem->phy_cap_info[3] &= ~m;
5502
5503         m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5504         he_cap_elem->phy_cap_info[4] &= ~m;
5505
5506         m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5507         he_cap_elem->phy_cap_info[5] &= ~m;
5508
5509         m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5510             IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5511             IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5512             IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5513         he_cap_elem->phy_cap_info[6] &= ~m;
5514
5515         m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5516             IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5517             IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5518             IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5519         he_cap_elem->phy_cap_info[7] &= ~m;
5520
5521         m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5522             IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5523             IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5524             IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5525         he_cap_elem->phy_cap_info[8] &= ~m;
5526
5527         m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5528             IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5529             IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5530             IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5531             IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5532             IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5533         he_cap_elem->phy_cap_info[9] &= ~m;
5534 }
5535
5536 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5537                                            struct ath11k_band_cap *bcap)
5538 {
5539         u8 val;
5540
5541         bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5542         if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5543                 bcap->he_6ghz_capa |=
5544                         FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5545                                    WLAN_HT_CAP_SM_PS_DYNAMIC);
5546         else
5547                 bcap->he_6ghz_capa |=
5548                         FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5549                                    WLAN_HT_CAP_SM_PS_DISABLED);
5550         val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5551                         pcap->vht_cap);
5552         bcap->he_6ghz_capa |=
5553                 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5554         val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5555         bcap->he_6ghz_capa |=
5556                 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5557         if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5558                 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5559         if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5560                 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5561
5562         return cpu_to_le16(bcap->he_6ghz_capa);
5563 }
5564
5565 static void ath11k_mac_set_hemcsmap(struct ath11k *ar,
5566                                     struct ath11k_pdev_cap *cap,
5567                                     struct ieee80211_sta_he_cap *he_cap,
5568                                     int band)
5569 {
5570         u16 txmcs_map, rxmcs_map;
5571         u32 i;
5572
5573         rxmcs_map = 0;
5574         txmcs_map = 0;
5575         for (i = 0; i < 8; i++) {
5576                 if (i < ar->num_tx_chains &&
5577                     (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5578                         txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5579                 else
5580                         txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5581
5582                 if (i < ar->num_rx_chains &&
5583                     (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5584                         rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5585                 else
5586                         rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5587         }
5588         he_cap->he_mcs_nss_supp.rx_mcs_80 =
5589                 cpu_to_le16(rxmcs_map & 0xffff);
5590         he_cap->he_mcs_nss_supp.tx_mcs_80 =
5591                 cpu_to_le16(txmcs_map & 0xffff);
5592         he_cap->he_mcs_nss_supp.rx_mcs_160 =
5593                 cpu_to_le16(rxmcs_map & 0xffff);
5594         he_cap->he_mcs_nss_supp.tx_mcs_160 =
5595                 cpu_to_le16(txmcs_map & 0xffff);
5596         he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5597                 cpu_to_le16(rxmcs_map & 0xffff);
5598         he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5599                 cpu_to_le16(txmcs_map & 0xffff);
5600 }
5601
5602 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5603                                   struct ath11k_pdev_cap *cap,
5604                                   struct ieee80211_sband_iftype_data *data,
5605                                   int band)
5606 {
5607         int i, idx = 0;
5608
5609         for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5610                 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5611                 struct ath11k_band_cap *band_cap = &cap->band[band];
5612                 struct ieee80211_he_cap_elem *he_cap_elem =
5613                                 &he_cap->he_cap_elem;
5614
5615                 switch (i) {
5616                 case NL80211_IFTYPE_STATION:
5617                 case NL80211_IFTYPE_AP:
5618                 case NL80211_IFTYPE_MESH_POINT:
5619                         break;
5620
5621                 default:
5622                         continue;
5623                 }
5624
5625                 data[idx].types_mask = BIT(i);
5626                 he_cap->has_he = true;
5627                 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5628                        sizeof(he_cap_elem->mac_cap_info));
5629                 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5630                        sizeof(he_cap_elem->phy_cap_info));
5631
5632                 he_cap_elem->mac_cap_info[1] &=
5633                         IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5634
5635                 he_cap_elem->phy_cap_info[5] &=
5636                         ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5637                 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5638
5639                 switch (i) {
5640                 case NL80211_IFTYPE_AP:
5641                         he_cap_elem->phy_cap_info[3] &=
5642                                 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5643                         he_cap_elem->phy_cap_info[9] |=
5644                                 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5645                         break;
5646                 case NL80211_IFTYPE_STATION:
5647                         he_cap_elem->mac_cap_info[0] &=
5648                                 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5649                         he_cap_elem->mac_cap_info[0] |=
5650                                 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5651                         he_cap_elem->phy_cap_info[9] |=
5652                                 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5653                         break;
5654                 case NL80211_IFTYPE_MESH_POINT:
5655                         ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5656                         break;
5657                 }
5658
5659                 ath11k_mac_set_hemcsmap(ar, cap, he_cap, band);
5660
5661                 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5662                 if (he_cap_elem->phy_cap_info[6] &
5663                     IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5664                         ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5665                                               he_cap->ppe_thres);
5666
5667                 if (band == NL80211_BAND_6GHZ) {
5668                         data[idx].he_6ghz_capa.capa =
5669                                 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5670                 }
5671                 idx++;
5672         }
5673
5674         return idx;
5675 }
5676
5677 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5678                                     struct ath11k_pdev_cap *cap)
5679 {
5680         struct ieee80211_supported_band *band;
5681         int count;
5682
5683         if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5684                 count = ath11k_mac_copy_he_cap(ar, cap,
5685                                                ar->mac.iftype[NL80211_BAND_2GHZ],
5686                                                NL80211_BAND_2GHZ);
5687                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5688                 _ieee80211_set_sband_iftype_data(band,
5689                                                  ar->mac.iftype[NL80211_BAND_2GHZ],
5690                                                  count);
5691         }
5692
5693         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5694                 count = ath11k_mac_copy_he_cap(ar, cap,
5695                                                ar->mac.iftype[NL80211_BAND_5GHZ],
5696                                                NL80211_BAND_5GHZ);
5697                 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5698                 _ieee80211_set_sband_iftype_data(band,
5699                                                  ar->mac.iftype[NL80211_BAND_5GHZ],
5700                                                  count);
5701         }
5702
5703         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5704             ar->supports_6ghz) {
5705                 count = ath11k_mac_copy_he_cap(ar, cap,
5706                                                ar->mac.iftype[NL80211_BAND_6GHZ],
5707                                                NL80211_BAND_6GHZ);
5708                 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5709                 _ieee80211_set_sband_iftype_data(band,
5710                                                  ar->mac.iftype[NL80211_BAND_6GHZ],
5711                                                  count);
5712         }
5713 }
5714
5715 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5716 {
5717         int ret;
5718
5719         lockdep_assert_held(&ar->conf_mutex);
5720
5721         if (ath11k_check_chain_mask(ar, tx_ant, true))
5722                 return -EINVAL;
5723
5724         if (ath11k_check_chain_mask(ar, rx_ant, false))
5725                 return -EINVAL;
5726
5727         ar->cfg_tx_chainmask = tx_ant;
5728         ar->cfg_rx_chainmask = rx_ant;
5729
5730         if (ar->state != ATH11K_STATE_ON &&
5731             ar->state != ATH11K_STATE_RESTARTED)
5732                 return 0;
5733
5734         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5735                                         tx_ant, ar->pdev->pdev_id);
5736         if (ret) {
5737                 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5738                             ret, tx_ant);
5739                 return ret;
5740         }
5741
5742         ar->num_tx_chains = get_num_chains(tx_ant);
5743
5744         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5745                                         rx_ant, ar->pdev->pdev_id);
5746         if (ret) {
5747                 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5748                             ret, rx_ant);
5749                 return ret;
5750         }
5751
5752         ar->num_rx_chains = get_num_chains(rx_ant);
5753
5754         /* Reload HT/VHT/HE capability */
5755         ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5756         ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5757
5758         return 0;
5759 }
5760
5761 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5762 {
5763         int num_mgmt;
5764
5765         ieee80211_free_txskb(ar->hw, skb);
5766
5767         num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5768
5769         if (num_mgmt < 0)
5770                 WARN_ON_ONCE(1);
5771
5772         if (!num_mgmt)
5773                 wake_up(&ar->txmgmt_empty_waitq);
5774 }
5775
5776 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5777 {
5778         struct sk_buff *msdu;
5779         struct ieee80211_tx_info *info;
5780
5781         spin_lock_bh(&ar->txmgmt_idr_lock);
5782         msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5783         spin_unlock_bh(&ar->txmgmt_idr_lock);
5784
5785         if (!msdu)
5786                 return;
5787
5788         dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5789                          DMA_TO_DEVICE);
5790
5791         info = IEEE80211_SKB_CB(msdu);
5792         memset(&info->status, 0, sizeof(info->status));
5793
5794         ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5795 }
5796
5797 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5798 {
5799         struct ath11k *ar = ctx;
5800
5801         ath11k_mac_tx_mgmt_free(ar, buf_id);
5802
5803         return 0;
5804 }
5805
5806 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5807 {
5808         struct ieee80211_vif *vif = ctx;
5809         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5810         struct ath11k *ar = skb_cb->ar;
5811
5812         if (skb_cb->vif == vif)
5813                 ath11k_mac_tx_mgmt_free(ar, buf_id);
5814
5815         return 0;
5816 }
5817
5818 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5819                                   struct sk_buff *skb)
5820 {
5821         struct ath11k_base *ab = ar->ab;
5822         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5823         struct ieee80211_tx_info *info;
5824         dma_addr_t paddr;
5825         int buf_id;
5826         int ret;
5827
5828         ATH11K_SKB_CB(skb)->ar = ar;
5829
5830         spin_lock_bh(&ar->txmgmt_idr_lock);
5831         buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5832                            ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5833         spin_unlock_bh(&ar->txmgmt_idr_lock);
5834
5835         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5836                    "tx mgmt frame, buf id %d\n", buf_id);
5837
5838         if (buf_id < 0)
5839                 return -ENOSPC;
5840
5841         info = IEEE80211_SKB_CB(skb);
5842         if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5843                 if ((ieee80211_is_action(hdr->frame_control) ||
5844                      ieee80211_is_deauth(hdr->frame_control) ||
5845                      ieee80211_is_disassoc(hdr->frame_control)) &&
5846                      ieee80211_has_protected(hdr->frame_control)) {
5847                         skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5848                 }
5849         }
5850
5851         paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5852         if (dma_mapping_error(ab->dev, paddr)) {
5853                 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5854                 ret = -EIO;
5855                 goto err_free_idr;
5856         }
5857
5858         ATH11K_SKB_CB(skb)->paddr = paddr;
5859
5860         ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5861         if (ret) {
5862                 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5863                 goto err_unmap_buf;
5864         }
5865
5866         return 0;
5867
5868 err_unmap_buf:
5869         dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5870                          skb->len, DMA_TO_DEVICE);
5871 err_free_idr:
5872         spin_lock_bh(&ar->txmgmt_idr_lock);
5873         idr_remove(&ar->txmgmt_idr, buf_id);
5874         spin_unlock_bh(&ar->txmgmt_idr_lock);
5875
5876         return ret;
5877 }
5878
5879 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5880 {
5881         struct sk_buff *skb;
5882
5883         while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5884                 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5885 }
5886
5887 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5888 {
5889         struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5890         struct ath11k_skb_cb *skb_cb;
5891         struct ath11k_vif *arvif;
5892         struct sk_buff *skb;
5893         int ret;
5894
5895         while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5896                 skb_cb = ATH11K_SKB_CB(skb);
5897                 if (!skb_cb->vif) {
5898                         ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5899                         ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5900                         continue;
5901                 }
5902
5903                 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5904                 mutex_lock(&ar->conf_mutex);
5905                 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5906                         ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5907                         if (ret) {
5908                                 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5909                                             arvif->vdev_id, ret);
5910                                 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5911                         } else {
5912                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5913                                            "tx mgmt frame, vdev_id %d\n",
5914                                            arvif->vdev_id);
5915                         }
5916                 } else {
5917                         ath11k_warn(ar->ab,
5918                                     "dropping mgmt frame for vdev %d, is_started %d\n",
5919                                     arvif->vdev_id,
5920                                     arvif->is_started);
5921                         ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5922                 }
5923                 mutex_unlock(&ar->conf_mutex);
5924         }
5925 }
5926
5927 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
5928                               bool is_prb_rsp)
5929 {
5930         struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5931
5932         if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5933                 return -ESHUTDOWN;
5934
5935         /* Drop probe response packets when the pending management tx
5936          * count has reached a certain threshold, so as to prioritize
5937          * other mgmt packets like auth and assoc to be sent on time
5938          * for establishing successful connections.
5939          */
5940         if (is_prb_rsp &&
5941             atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
5942                 ath11k_warn(ar->ab,
5943                             "dropping probe response as pending queue is almost full\n");
5944                 return -ENOSPC;
5945         }
5946
5947         if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
5948                 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
5949                 return -ENOSPC;
5950         }
5951
5952         skb_queue_tail(q, skb);
5953         atomic_inc(&ar->num_pending_mgmt_tx);
5954         queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
5955
5956         return 0;
5957 }
5958
5959 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
5960                              struct ieee80211_tx_control *control,
5961                              struct sk_buff *skb)
5962 {
5963         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5964         struct ath11k *ar = hw->priv;
5965         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5966         struct ieee80211_vif *vif = info->control.vif;
5967         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5968         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5969         struct ieee80211_key_conf *key = info->control.hw_key;
5970         struct ath11k_sta *arsta = NULL;
5971         u32 info_flags = info->flags;
5972         bool is_prb_rsp;
5973         int ret;
5974
5975         memset(skb_cb, 0, sizeof(*skb_cb));
5976         skb_cb->vif = vif;
5977
5978         if (key) {
5979                 skb_cb->cipher = key->cipher;
5980                 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
5981         }
5982
5983         if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5984                 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
5985         } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5986                 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5987                 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5988                 if (ret) {
5989                         ath11k_warn(ar->ab, "failed to queue management frame %d\n",
5990                                     ret);
5991                         ieee80211_free_txskb(ar->hw, skb);
5992                 }
5993                 return;
5994         }
5995
5996         if (control->sta)
5997                 arsta = ath11k_sta_to_arsta(control->sta);
5998
5999         ret = ath11k_dp_tx(ar, arvif, arsta, skb);
6000         if (unlikely(ret)) {
6001                 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
6002                 ieee80211_free_txskb(ar->hw, skb);
6003         }
6004 }
6005
6006 void ath11k_mac_drain_tx(struct ath11k *ar)
6007 {
6008         /* make sure rcu-protected mac80211 tx path itself is drained */
6009         synchronize_net();
6010
6011         cancel_work_sync(&ar->wmi_mgmt_tx_work);
6012         ath11k_mgmt_over_wmi_tx_purge(ar);
6013 }
6014
6015 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
6016 {
6017         struct htt_rx_ring_tlv_filter tlv_filter = {0};
6018         struct ath11k_base *ab = ar->ab;
6019         int i, ret = 0;
6020         u32 ring_id;
6021
6022         if (enable) {
6023                 tlv_filter = ath11k_mac_mon_status_filter_default;
6024                 if (ath11k_debugfs_rx_filter(ar))
6025                         tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
6026         }
6027
6028         for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
6029                 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
6030                 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
6031                                                        ar->dp.mac_id + i,
6032                                                        HAL_RXDMA_MONITOR_STATUS,
6033                                                        DP_RX_BUFFER_SIZE,
6034                                                        &tlv_filter);
6035         }
6036
6037         if (enable && !ar->ab->hw_params.rxdma1_enable)
6038                 mod_timer(&ar->ab->mon_reap_timer, jiffies +
6039                           msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
6040
6041         return ret;
6042 }
6043
6044 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
6045 {
6046         int recovery_start_count;
6047
6048         if (!ab->is_reset)
6049                 return;
6050
6051         recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
6052         ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
6053
6054         if (recovery_start_count == ab->num_radios) {
6055                 complete(&ab->recovery_start);
6056                 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
6057         }
6058
6059         ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
6060
6061         wait_for_completion_timeout(&ab->reconfigure_complete,
6062                                     ATH11K_RECONFIGURE_TIMEOUT_HZ);
6063 }
6064
6065 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
6066 {
6067         struct ath11k *ar = hw->priv;
6068         struct ath11k_base *ab = ar->ab;
6069         struct ath11k_pdev *pdev = ar->pdev;
6070         int ret;
6071
6072         if (ath11k_ftm_mode) {
6073                 ath11k_warn(ab, "mac operations not supported in factory test mode\n");
6074                 return -EOPNOTSUPP;
6075         }
6076
6077         ath11k_mac_drain_tx(ar);
6078         mutex_lock(&ar->conf_mutex);
6079
6080         switch (ar->state) {
6081         case ATH11K_STATE_OFF:
6082                 ar->state = ATH11K_STATE_ON;
6083                 break;
6084         case ATH11K_STATE_RESTARTING:
6085                 ar->state = ATH11K_STATE_RESTARTED;
6086                 ath11k_mac_wait_reconfigure(ab);
6087                 break;
6088         case ATH11K_STATE_RESTARTED:
6089         case ATH11K_STATE_WEDGED:
6090         case ATH11K_STATE_ON:
6091         case ATH11K_STATE_FTM:
6092                 WARN_ON(1);
6093                 ret = -EINVAL;
6094                 goto err;
6095         }
6096
6097         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
6098                                         1, pdev->pdev_id);
6099
6100         if (ret) {
6101                 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
6102                 goto err;
6103         }
6104
6105         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
6106                                         pdev->pdev_id);
6107         if (ret) {
6108                 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
6109                 goto err;
6110         }
6111
6112         if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
6113                 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
6114                 if (ret) {
6115                         ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
6116                         goto err;
6117                 }
6118         }
6119
6120         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
6121                                         0, pdev->pdev_id);
6122         if (ret) {
6123                 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
6124                            ret);
6125                 goto err;
6126         }
6127
6128         ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
6129         if (ret) {
6130                 ath11k_err(ab, "failed to offload radar detection: %d\n",
6131                            ret);
6132                 goto err;
6133         }
6134
6135         ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
6136                                                   HTT_PPDU_STATS_TAG_DEFAULT);
6137         if (ret) {
6138                 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
6139                 goto err;
6140         }
6141
6142         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
6143                                         1, pdev->pdev_id);
6144
6145         if (ret) {
6146                 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
6147                 goto err;
6148         }
6149
6150         __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
6151
6152         /* TODO: Do we need to enable ANI? */
6153
6154         ath11k_reg_update_chan_list(ar, false);
6155
6156         ar->num_started_vdevs = 0;
6157         ar->num_created_vdevs = 0;
6158         ar->num_peers = 0;
6159         ar->allocated_vdev_map = 0;
6160
6161         /* Configure monitor status ring with default rx_filter to get rx status
6162          * such as rssi, rx_duration.
6163          */
6164         ret = ath11k_mac_config_mon_status_default(ar, true);
6165         if (ret) {
6166                 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
6167                            ret);
6168                 goto err;
6169         }
6170
6171         /* Configure the hash seed for hash based reo dest ring selection */
6172         ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
6173
6174         /* allow device to enter IMPS */
6175         if (ab->hw_params.idle_ps) {
6176                 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
6177                                                 1, pdev->pdev_id);
6178                 if (ret) {
6179                         ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
6180                         goto err;
6181                 }
6182         }
6183
6184         mutex_unlock(&ar->conf_mutex);
6185
6186         rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
6187                            &ab->pdevs[ar->pdev_idx]);
6188
6189         return 0;
6190
6191 err:
6192         ar->state = ATH11K_STATE_OFF;
6193         mutex_unlock(&ar->conf_mutex);
6194
6195         return ret;
6196 }
6197
6198 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
6199 {
6200         struct ath11k *ar = hw->priv;
6201         struct htt_ppdu_stats_info *ppdu_stats, *tmp;
6202         int ret;
6203
6204         ath11k_mac_drain_tx(ar);
6205
6206         mutex_lock(&ar->conf_mutex);
6207         ret = ath11k_mac_config_mon_status_default(ar, false);
6208         if (ret)
6209                 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
6210                            ret);
6211
6212         clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6213         ar->state = ATH11K_STATE_OFF;
6214         mutex_unlock(&ar->conf_mutex);
6215
6216         cancel_delayed_work_sync(&ar->scan.timeout);
6217         cancel_work_sync(&ar->regd_update_work);
6218         cancel_work_sync(&ar->ab->update_11d_work);
6219
6220         if (ar->state_11d == ATH11K_11D_PREPARING) {
6221                 ar->state_11d = ATH11K_11D_IDLE;
6222                 complete(&ar->completed_11d_scan);
6223         }
6224
6225         spin_lock_bh(&ar->data_lock);
6226         list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
6227                 list_del(&ppdu_stats->list);
6228                 kfree(ppdu_stats);
6229         }
6230         spin_unlock_bh(&ar->data_lock);
6231
6232         rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
6233
6234         synchronize_rcu();
6235
6236         atomic_set(&ar->num_pending_mgmt_tx, 0);
6237 }
6238
6239 static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif,
6240                                                u32 *flags, u32 *tx_vdev_id)
6241 {
6242         struct ath11k *ar = arvif->ar;
6243         struct ath11k_vif *tx_arvif;
6244         struct ieee80211_vif *tx_vif;
6245
6246         *tx_vdev_id = 0;
6247         tx_vif = arvif->vif->mbssid_tx_vif;
6248         if (!tx_vif) {
6249                 *flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP;
6250                 return 0;
6251         }
6252
6253         tx_arvif = ath11k_vif_to_arvif(tx_vif);
6254
6255         if (arvif->vif->bss_conf.nontransmitted) {
6256                 if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy)
6257                         return -EINVAL;
6258
6259                 *flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP;
6260                 *tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id;
6261         } else if (tx_arvif == arvif) {
6262                 *flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP;
6263         } else {
6264                 return -EINVAL;
6265         }
6266
6267         if (arvif->vif->bss_conf.ema_ap)
6268                 *flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE;
6269
6270         return 0;
6271 }
6272
6273 static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
6274                                                struct vdev_create_params *params)
6275 {
6276         struct ath11k *ar = arvif->ar;
6277         struct ath11k_pdev *pdev = ar->pdev;
6278         int ret;
6279
6280         params->if_id = arvif->vdev_id;
6281         params->type = arvif->vdev_type;
6282         params->subtype = arvif->vdev_subtype;
6283         params->pdev_id = pdev->pdev_id;
6284         params->mbssid_flags = 0;
6285         params->mbssid_tx_vdev_id = 0;
6286
6287         if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
6288                       ar->ab->wmi_ab.svc_map)) {
6289                 ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
6290                                                           &params->mbssid_flags,
6291                                                           &params->mbssid_tx_vdev_id);
6292                 if (ret)
6293                         return ret;
6294         }
6295
6296         if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
6297                 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
6298                 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
6299         }
6300         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
6301                 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
6302                 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
6303         }
6304         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
6305             ar->supports_6ghz) {
6306                 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
6307                 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
6308         }
6309         return 0;
6310 }
6311
6312 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6313                                              struct ieee80211_vif *vif)
6314 {
6315         struct ath11k *ar = hw->priv;
6316         struct ath11k_base *ab = ar->ab;
6317         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6318         u32 param_id, param_value;
6319         int ret;
6320
6321         param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6322         if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6323             (vif->type != NL80211_IFTYPE_STATION &&
6324              vif->type != NL80211_IFTYPE_AP))
6325                 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6326                                         IEEE80211_OFFLOAD_DECAP_ENABLED);
6327
6328         if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6329                 param_value = ATH11K_HW_TXRX_ETHERNET;
6330         else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6331                 param_value = ATH11K_HW_TXRX_RAW;
6332         else
6333                 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6334
6335         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6336                                             param_id, param_value);
6337         if (ret) {
6338                 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6339                             arvif->vdev_id, ret);
6340                 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6341         }
6342
6343         param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6344         if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6345                 param_value = ATH11K_HW_TXRX_ETHERNET;
6346         else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6347                 param_value = ATH11K_HW_TXRX_RAW;
6348         else
6349                 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6350
6351         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6352                                             param_id, param_value);
6353         if (ret) {
6354                 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6355                             arvif->vdev_id, ret);
6356                 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6357         }
6358 }
6359
6360 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6361 {
6362         struct ath11k *ar;
6363         struct ath11k_pdev *pdev;
6364         struct ath11k_vif *arvif;
6365         int i;
6366
6367         for (i = 0; i < ab->num_radios; i++) {
6368                 pdev = &ab->pdevs[i];
6369                 ar = pdev->ar;
6370                 list_for_each_entry(arvif, &ar->arvifs, list) {
6371                         if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6372                                 return true;
6373                 }
6374         }
6375         return false;
6376 }
6377
6378 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6379 {
6380         struct wmi_11d_scan_start_params param;
6381         int ret;
6382
6383         mutex_lock(&ar->ab->vdev_id_11d_lock);
6384
6385         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n",
6386                    ar->vdev_id_11d_scan);
6387
6388         if (ar->regdom_set_by_user)
6389                 goto fin;
6390
6391         if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6392                 goto fin;
6393
6394         if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6395                 goto fin;
6396
6397         if (ath11k_mac_vif_ap_active_any(ar->ab))
6398                 goto fin;
6399
6400         param.vdev_id = vdev_id;
6401         param.start_interval_msec = 0;
6402         param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6403
6404         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n");
6405
6406         ret = ath11k_wmi_send_11d_scan_start_cmd(ar, &param);
6407         if (ret) {
6408                 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6409                             vdev_id, ret);
6410         } else {
6411                 ar->vdev_id_11d_scan = vdev_id;
6412                 if (ar->state_11d == ATH11K_11D_PREPARING)
6413                         ar->state_11d = ATH11K_11D_RUNNING;
6414         }
6415
6416 fin:
6417         if (ar->state_11d == ATH11K_11D_PREPARING) {
6418                 ar->state_11d = ATH11K_11D_IDLE;
6419                 complete(&ar->completed_11d_scan);
6420         }
6421
6422         mutex_unlock(&ar->ab->vdev_id_11d_lock);
6423 }
6424
6425 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6426 {
6427         int ret;
6428         u32 vdev_id;
6429
6430         if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6431                 return;
6432
6433         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n");
6434
6435         mutex_lock(&ar->ab->vdev_id_11d_lock);
6436
6437         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n",
6438                    ar->vdev_id_11d_scan);
6439
6440         if (ar->state_11d == ATH11K_11D_PREPARING) {
6441                 ar->state_11d = ATH11K_11D_IDLE;
6442                 complete(&ar->completed_11d_scan);
6443         }
6444
6445         if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6446                 vdev_id = ar->vdev_id_11d_scan;
6447
6448                 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6449                 if (ret) {
6450                         ath11k_warn(ar->ab,
6451                                     "failed to stopt 11d scan vdev %d ret: %d\n",
6452                                     vdev_id, ret);
6453                 } else {
6454                         ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6455                         ar->state_11d = ATH11K_11D_IDLE;
6456                         complete(&ar->completed_11d_scan);
6457                 }
6458         }
6459         mutex_unlock(&ar->ab->vdev_id_11d_lock);
6460 }
6461
6462 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6463 {
6464         struct ath11k *ar;
6465         struct ath11k_pdev *pdev;
6466         int i;
6467
6468         ath11k_dbg(ab, ATH11K_DBG_MAC, "stop soc 11d scan\n");
6469
6470         for (i = 0; i < ab->num_radios; i++) {
6471                 pdev = &ab->pdevs[i];
6472                 ar = pdev->ar;
6473
6474                 ath11k_mac_11d_scan_stop(ar);
6475         }
6476 }
6477
6478 static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif)
6479 {
6480         unsigned long time_left;
6481         struct ieee80211_vif *vif = arvif->vif;
6482         int ret = 0;
6483
6484         lockdep_assert_held(&ar->conf_mutex);
6485
6486         reinit_completion(&ar->vdev_delete_done);
6487
6488         ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6489         if (ret) {
6490                 ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n",
6491                             arvif->vdev_id, ret);
6492                 return ret;
6493         }
6494
6495         time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6496                                                 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6497         if (time_left == 0) {
6498                 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
6499                 return -ETIMEDOUT;
6500         }
6501
6502         ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6503         ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6504         ar->num_created_vdevs--;
6505
6506         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6507                    vif->addr, arvif->vdev_id);
6508
6509         return ret;
6510 }
6511
6512 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6513                                        struct ieee80211_vif *vif)
6514 {
6515         struct ath11k *ar = hw->priv;
6516         struct ath11k_base *ab = ar->ab;
6517         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6518         struct vdev_create_params vdev_param = {0};
6519         struct peer_create_params peer_param;
6520         u32 param_id, param_value;
6521         u16 nss;
6522         int i;
6523         int ret, fbret;
6524         int bit;
6525
6526         vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6527
6528         mutex_lock(&ar->conf_mutex);
6529
6530         if (vif->type == NL80211_IFTYPE_AP &&
6531             ar->num_peers > (ar->max_num_peers - 1)) {
6532                 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6533                 ret = -ENOBUFS;
6534                 goto err;
6535         }
6536
6537         if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6538                 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6539                             ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6540                 ret = -EBUSY;
6541                 goto err;
6542         }
6543
6544         memset(arvif, 0, sizeof(*arvif));
6545
6546         arvif->ar = ar;
6547         arvif->vif = vif;
6548
6549         INIT_LIST_HEAD(&arvif->list);
6550         INIT_DELAYED_WORK(&arvif->connection_loss_work,
6551                           ath11k_mac_vif_sta_connection_loss_work);
6552
6553         for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6554                 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6555                 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6556                 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6557                        sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6558                 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6559                        sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6560                 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6561                        sizeof(arvif->bitrate_mask.control[i].he_mcs));
6562         }
6563
6564         bit = __ffs64(ab->free_vdev_map);
6565
6566         arvif->vdev_id = bit;
6567         arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6568
6569         switch (vif->type) {
6570         case NL80211_IFTYPE_UNSPECIFIED:
6571         case NL80211_IFTYPE_STATION:
6572                 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6573                 break;
6574         case NL80211_IFTYPE_MESH_POINT:
6575                 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6576                 fallthrough;
6577         case NL80211_IFTYPE_AP:
6578                 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6579                 break;
6580         case NL80211_IFTYPE_MONITOR:
6581                 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6582                 ar->monitor_vdev_id = bit;
6583                 break;
6584         default:
6585                 WARN_ON(1);
6586                 break;
6587         }
6588
6589         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n",
6590                    arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6591                    ab->free_vdev_map);
6592
6593         vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6594         for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6595                 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6596
6597         ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6598         if (ret) {
6599                 ath11k_warn(ab, "failed to create vdev parameters %d: %d\n",
6600                             arvif->vdev_id, ret);
6601                 goto err;
6602         }
6603
6604         ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6605         if (ret) {
6606                 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6607                             arvif->vdev_id, ret);
6608                 goto err;
6609         }
6610
6611         ar->num_created_vdevs++;
6612         ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6613                    vif->addr, arvif->vdev_id);
6614         ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6615         ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6616
6617         spin_lock_bh(&ar->data_lock);
6618         list_add(&arvif->list, &ar->arvifs);
6619         spin_unlock_bh(&ar->data_lock);
6620
6621         ath11k_mac_op_update_vif_offload(hw, vif);
6622
6623         nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6624         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6625                                             WMI_VDEV_PARAM_NSS, nss);
6626         if (ret) {
6627                 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6628                             arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6629                 goto err_vdev_del;
6630         }
6631
6632         switch (arvif->vdev_type) {
6633         case WMI_VDEV_TYPE_AP:
6634                 peer_param.vdev_id = arvif->vdev_id;
6635                 peer_param.peer_addr = vif->addr;
6636                 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6637                 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6638                 if (ret) {
6639                         ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6640                                     arvif->vdev_id, ret);
6641                         goto err_vdev_del;
6642                 }
6643
6644                 ret = ath11k_mac_set_kickout(arvif);
6645                 if (ret) {
6646                         ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6647                                     arvif->vdev_id, ret);
6648                         goto err_peer_del;
6649                 }
6650
6651                 ath11k_mac_11d_scan_stop_all(ar->ab);
6652                 break;
6653         case WMI_VDEV_TYPE_STA:
6654                 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6655                 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6656                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6657                                                   param_id, param_value);
6658                 if (ret) {
6659                         ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6660                                     arvif->vdev_id, ret);
6661                         goto err_peer_del;
6662                 }
6663
6664                 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6665                 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6666                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6667                                                   param_id, param_value);
6668                 if (ret) {
6669                         ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6670                                     arvif->vdev_id, ret);
6671                         goto err_peer_del;
6672                 }
6673
6674                 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6675                 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6676                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6677                                                   param_id, param_value);
6678                 if (ret) {
6679                         ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6680                                     arvif->vdev_id, ret);
6681                         goto err_peer_del;
6682                 }
6683
6684                 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6685                                                   WMI_STA_PS_MODE_DISABLED);
6686                 if (ret) {
6687                         ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6688                                     arvif->vdev_id, ret);
6689                         goto err_peer_del;
6690                 }
6691
6692                 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6693                         reinit_completion(&ar->completed_11d_scan);
6694                         ar->state_11d = ATH11K_11D_PREPARING;
6695                 }
6696                 break;
6697         case WMI_VDEV_TYPE_MONITOR:
6698                 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6699                 break;
6700         default:
6701                 break;
6702         }
6703
6704         arvif->txpower = vif->bss_conf.txpower;
6705         ret = ath11k_mac_txpower_recalc(ar);
6706         if (ret)
6707                 goto err_peer_del;
6708
6709         param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6710         param_value = ar->hw->wiphy->rts_threshold;
6711         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6712                                             param_id, param_value);
6713         if (ret) {
6714                 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6715                             arvif->vdev_id, ret);
6716         }
6717
6718         ath11k_dp_vdev_tx_attach(ar, arvif);
6719
6720         if (vif->type != NL80211_IFTYPE_MONITOR &&
6721             test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6722                 ret = ath11k_mac_monitor_vdev_create(ar);
6723                 if (ret)
6724                         ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6725                                     ret);
6726         }
6727
6728         if (ath11k_wmi_supports_6ghz_cc_ext(ar)) {
6729                 struct cur_regulatory_info *reg_info;
6730
6731                 reg_info = &ab->reg_info_store[ar->pdev_idx];
6732                 ath11k_dbg(ab, ATH11K_DBG_MAC, "interface added to change reg rules\n");
6733                 ath11k_reg_handle_chan_list(ab, reg_info, IEEE80211_REG_LPI_AP);
6734         }
6735
6736         mutex_unlock(&ar->conf_mutex);
6737
6738         return 0;
6739
6740 err_peer_del:
6741         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6742                 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6743                 if (fbret) {
6744                         ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6745                                     vif->addr, arvif->vdev_id, fbret);
6746                         goto err;
6747                 }
6748         }
6749
6750 err_vdev_del:
6751         ath11k_mac_vdev_delete(ar, arvif);
6752         spin_lock_bh(&ar->data_lock);
6753         list_del(&arvif->list);
6754         spin_unlock_bh(&ar->data_lock);
6755
6756 err:
6757         mutex_unlock(&ar->conf_mutex);
6758
6759         return ret;
6760 }
6761
6762 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6763 {
6764         struct ieee80211_vif *vif = ctx;
6765         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6766
6767         if (skb_cb->vif == vif)
6768                 skb_cb->vif = NULL;
6769
6770         return 0;
6771 }
6772
6773 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6774                                            struct ieee80211_vif *vif)
6775 {
6776         struct ath11k *ar = hw->priv;
6777         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6778         struct ath11k_base *ab = ar->ab;
6779         int ret;
6780         int i;
6781
6782         cancel_delayed_work_sync(&arvif->connection_loss_work);
6783
6784         mutex_lock(&ar->conf_mutex);
6785
6786         ath11k_dbg(ab, ATH11K_DBG_MAC, "remove interface (vdev %d)\n",
6787                    arvif->vdev_id);
6788
6789         ret = ath11k_spectral_vif_stop(arvif);
6790         if (ret)
6791                 ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n",
6792                             arvif->vdev_id, ret);
6793
6794         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6795                 ath11k_mac_11d_scan_stop(ar);
6796
6797         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6798                 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6799                 if (ret)
6800                         ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6801                                     arvif->vdev_id, ret);
6802         }
6803
6804         ret = ath11k_mac_vdev_delete(ar, arvif);
6805         if (ret) {
6806                 ath11k_warn(ab, "failed to delete vdev %d: %d\n",
6807                             arvif->vdev_id, ret);
6808                 goto err_vdev_del;
6809         }
6810
6811         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6812                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6813                 ar->monitor_vdev_id = -1;
6814         } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6815                    !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6816                 ret = ath11k_mac_monitor_vdev_delete(ar);
6817                 if (ret)
6818                         /* continue even if there's an error */
6819                         ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6820                                     ret);
6821         }
6822
6823 err_vdev_del:
6824         spin_lock_bh(&ar->data_lock);
6825         list_del(&arvif->list);
6826         spin_unlock_bh(&ar->data_lock);
6827
6828         ath11k_peer_cleanup(ar, arvif->vdev_id);
6829
6830         idr_for_each(&ar->txmgmt_idr,
6831                      ath11k_mac_vif_txmgmt_idr_remove, vif);
6832
6833         for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6834                 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6835                 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6836                              ath11k_mac_vif_unref, vif);
6837                 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6838         }
6839
6840         /* Recalc txpower for remaining vdev */
6841         ath11k_mac_txpower_recalc(ar);
6842
6843         /* TODO: recal traffic pause state based on the available vdevs */
6844
6845         mutex_unlock(&ar->conf_mutex);
6846 }
6847
6848 /* FIXME: Has to be verified. */
6849 #define SUPPORTED_FILTERS                       \
6850         (FIF_ALLMULTI |                         \
6851         FIF_CONTROL |                           \
6852         FIF_PSPOLL |                            \
6853         FIF_OTHER_BSS |                         \
6854         FIF_BCN_PRBRESP_PROMISC |               \
6855         FIF_PROBE_REQ |                         \
6856         FIF_FCSFAIL)
6857
6858 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6859                                            unsigned int changed_flags,
6860                                            unsigned int *total_flags,
6861                                            u64 multicast)
6862 {
6863         struct ath11k *ar = hw->priv;
6864
6865         mutex_lock(&ar->conf_mutex);
6866
6867         *total_flags &= SUPPORTED_FILTERS;
6868         ar->filter_flags = *total_flags;
6869
6870         mutex_unlock(&ar->conf_mutex);
6871 }
6872
6873 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6874 {
6875         struct ath11k *ar = hw->priv;
6876
6877         mutex_lock(&ar->conf_mutex);
6878
6879         *tx_ant = ar->cfg_tx_chainmask;
6880         *rx_ant = ar->cfg_rx_chainmask;
6881
6882         mutex_unlock(&ar->conf_mutex);
6883
6884         return 0;
6885 }
6886
6887 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6888 {
6889         struct ath11k *ar = hw->priv;
6890         int ret;
6891
6892         mutex_lock(&ar->conf_mutex);
6893         ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
6894         mutex_unlock(&ar->conf_mutex);
6895
6896         return ret;
6897 }
6898
6899 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6900                                       struct ieee80211_vif *vif,
6901                                       struct ieee80211_ampdu_params *params)
6902 {
6903         struct ath11k *ar = hw->priv;
6904         int ret = -EINVAL;
6905
6906         mutex_lock(&ar->conf_mutex);
6907
6908         switch (params->action) {
6909         case IEEE80211_AMPDU_RX_START:
6910                 ret = ath11k_dp_rx_ampdu_start(ar, params);
6911                 break;
6912         case IEEE80211_AMPDU_RX_STOP:
6913                 ret = ath11k_dp_rx_ampdu_stop(ar, params);
6914                 break;
6915         case IEEE80211_AMPDU_TX_START:
6916         case IEEE80211_AMPDU_TX_STOP_CONT:
6917         case IEEE80211_AMPDU_TX_STOP_FLUSH:
6918         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6919         case IEEE80211_AMPDU_TX_OPERATIONAL:
6920                 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6921                  * Tx aggregation requests.
6922                  */
6923                 ret = -EOPNOTSUPP;
6924                 break;
6925         }
6926
6927         mutex_unlock(&ar->conf_mutex);
6928
6929         return ret;
6930 }
6931
6932 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6933                                      struct ieee80211_chanctx_conf *ctx)
6934 {
6935         struct ath11k *ar = hw->priv;
6936         struct ath11k_base *ab = ar->ab;
6937
6938         ath11k_dbg(ab, ATH11K_DBG_MAC,
6939                    "chanctx add freq %u width %d ptr %p\n",
6940                    ctx->def.chan->center_freq, ctx->def.width, ctx);
6941
6942         mutex_lock(&ar->conf_mutex);
6943
6944         spin_lock_bh(&ar->data_lock);
6945         /* TODO: In case of multiple channel context, populate rx_channel from
6946          * Rx PPDU desc information.
6947          */
6948         ar->rx_channel = ctx->def.chan;
6949         spin_unlock_bh(&ar->data_lock);
6950
6951         mutex_unlock(&ar->conf_mutex);
6952
6953         return 0;
6954 }
6955
6956 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6957                                          struct ieee80211_chanctx_conf *ctx)
6958 {
6959         struct ath11k *ar = hw->priv;
6960         struct ath11k_base *ab = ar->ab;
6961
6962         ath11k_dbg(ab, ATH11K_DBG_MAC,
6963                    "chanctx remove freq %u width %d ptr %p\n",
6964                    ctx->def.chan->center_freq, ctx->def.width, ctx);
6965
6966         mutex_lock(&ar->conf_mutex);
6967
6968         spin_lock_bh(&ar->data_lock);
6969         /* TODO: In case of there is one more channel context left, populate
6970          * rx_channel with the channel of that remaining channel context.
6971          */
6972         ar->rx_channel = NULL;
6973         spin_unlock_bh(&ar->data_lock);
6974
6975         mutex_unlock(&ar->conf_mutex);
6976 }
6977
6978 static int
6979 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
6980                               struct ieee80211_chanctx_conf *ctx,
6981                               bool restart)
6982 {
6983         struct ath11k *ar = arvif->ar;
6984         struct ath11k_base *ab = ar->ab;
6985         struct wmi_vdev_start_req_arg arg = {};
6986         const struct cfg80211_chan_def *chandef = &ctx->def;
6987         int ret = 0;
6988         unsigned int dfs_cac_time;
6989
6990         lockdep_assert_held(&ar->conf_mutex);
6991
6992         reinit_completion(&ar->vdev_setup_done);
6993
6994         arg.vdev_id = arvif->vdev_id;
6995         arg.dtim_period = arvif->dtim_period;
6996         arg.bcn_intval = arvif->beacon_interval;
6997
6998         arg.channel.freq = chandef->chan->center_freq;
6999         arg.channel.band_center_freq1 = chandef->center_freq1;
7000         arg.channel.band_center_freq2 = chandef->center_freq2;
7001         arg.channel.mode =
7002                 ath11k_phymodes[chandef->chan->band][chandef->width];
7003
7004         arg.channel.min_power = 0;
7005         arg.channel.max_power = chandef->chan->max_power;
7006         arg.channel.max_reg_power = chandef->chan->max_reg_power;
7007         arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
7008
7009         arg.pref_tx_streams = ar->num_tx_chains;
7010         arg.pref_rx_streams = ar->num_rx_chains;
7011
7012         arg.mbssid_flags = 0;
7013         arg.mbssid_tx_vdev_id = 0;
7014         if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
7015                      ar->ab->wmi_ab.svc_map)) {
7016                 ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
7017                                                           &arg.mbssid_flags,
7018                                                           &arg.mbssid_tx_vdev_id);
7019                 if (ret)
7020                         return ret;
7021         }
7022
7023         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7024                 arg.ssid = arvif->u.ap.ssid;
7025                 arg.ssid_len = arvif->u.ap.ssid_len;
7026                 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
7027
7028                 /* For now allow DFS for AP mode */
7029                 arg.channel.chan_radar =
7030                         !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
7031
7032                 arg.channel.freq2_radar = ctx->radar_enabled;
7033
7034                 arg.channel.passive = arg.channel.chan_radar;
7035
7036                 spin_lock_bh(&ab->base_lock);
7037                 arg.regdomain = ar->ab->dfs_region;
7038                 spin_unlock_bh(&ab->base_lock);
7039         }
7040
7041         arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
7042
7043         ath11k_dbg(ab, ATH11K_DBG_MAC,
7044                    "vdev %d start center_freq %d phymode %s\n",
7045                    arg.vdev_id, arg.channel.freq,
7046                    ath11k_wmi_phymode_str(arg.channel.mode));
7047
7048         ret = ath11k_wmi_vdev_start(ar, &arg, restart);
7049         if (ret) {
7050                 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
7051                             restart ? "restart" : "start", arg.vdev_id);
7052                 return ret;
7053         }
7054
7055         ret = ath11k_mac_vdev_setup_sync(ar);
7056         if (ret) {
7057                 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
7058                             arg.vdev_id, restart ? "restart" : "start", ret);
7059                 return ret;
7060         }
7061
7062         /* TODO: For now we only set TPC power here. However when
7063          * channel changes, say CSA, it should be updated again.
7064          */
7065         if (ath11k_mac_supports_station_tpc(ar, arvif, chandef)) {
7066                 ath11k_mac_fill_reg_tpc_info(ar, arvif->vif, &arvif->chanctx);
7067                 ath11k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
7068                                                    &arvif->reg_tpc_info);
7069         }
7070
7071         if (!restart)
7072                 ar->num_started_vdevs++;
7073
7074         ath11k_dbg(ab, ATH11K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
7075                    arvif->vif->addr, arvif->vdev_id);
7076
7077         /* Enable CAC Flag in the driver by checking the all sub-channel's DFS
7078          * state as NL80211_DFS_USABLE which indicates CAC needs to be
7079          * done before channel usage. This flags is used to drop rx packets.
7080          * during CAC.
7081          */
7082         /* TODO Set the flag for other interface types as required */
7083         if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
7084             cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
7085                 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7086                 dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
7087                                                              chandef);
7088                 ath11k_dbg(ab, ATH11K_DBG_MAC,
7089                            "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
7090                            dfs_cac_time, arg.channel.freq, chandef->center_freq1,
7091                            arg.vdev_id);
7092         }
7093
7094         ret = ath11k_mac_set_txbf_conf(arvif);
7095         if (ret)
7096                 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
7097                             arvif->vdev_id, ret);
7098
7099         return 0;
7100 }
7101
7102 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
7103 {
7104         struct ath11k *ar = arvif->ar;
7105         int ret;
7106
7107         lockdep_assert_held(&ar->conf_mutex);
7108
7109         reinit_completion(&ar->vdev_setup_done);
7110
7111         ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
7112         if (ret) {
7113                 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
7114                             arvif->vdev_id, ret);
7115                 goto err;
7116         }
7117
7118         ret = ath11k_mac_vdev_setup_sync(ar);
7119         if (ret) {
7120                 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
7121                             arvif->vdev_id, ret);
7122                 goto err;
7123         }
7124
7125         WARN_ON(ar->num_started_vdevs == 0);
7126
7127         ar->num_started_vdevs--;
7128         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
7129                    arvif->vif->addr, arvif->vdev_id);
7130
7131         if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
7132                 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7133                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
7134                            arvif->vdev_id);
7135         }
7136
7137         return 0;
7138 err:
7139         return ret;
7140 }
7141
7142 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
7143                                  struct ieee80211_chanctx_conf *ctx)
7144 {
7145         return ath11k_mac_vdev_start_restart(arvif, ctx, false);
7146 }
7147
7148 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
7149                                    struct ieee80211_chanctx_conf *ctx)
7150 {
7151         return ath11k_mac_vdev_start_restart(arvif, ctx, true);
7152 }
7153
7154 struct ath11k_mac_change_chanctx_arg {
7155         struct ieee80211_chanctx_conf *ctx;
7156         struct ieee80211_vif_chanctx_switch *vifs;
7157         int n_vifs;
7158         int next_vif;
7159 };
7160
7161 static void
7162 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7163                                    struct ieee80211_vif *vif)
7164 {
7165         struct ath11k_mac_change_chanctx_arg *arg = data;
7166
7167         if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
7168                 return;
7169
7170         arg->n_vifs++;
7171 }
7172
7173 static void
7174 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7175                                     struct ieee80211_vif *vif)
7176 {
7177         struct ath11k_mac_change_chanctx_arg *arg = data;
7178         struct ieee80211_chanctx_conf *ctx;
7179
7180         ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
7181         if (ctx != arg->ctx)
7182                 return;
7183
7184         if (WARN_ON(arg->next_vif == arg->n_vifs))
7185                 return;
7186
7187         arg->vifs[arg->next_vif].vif = vif;
7188         arg->vifs[arg->next_vif].old_ctx = ctx;
7189         arg->vifs[arg->next_vif].new_ctx = ctx;
7190         arg->next_vif++;
7191 }
7192
7193 static void
7194 ath11k_mac_update_vif_chan(struct ath11k *ar,
7195                            struct ieee80211_vif_chanctx_switch *vifs,
7196                            int n_vifs)
7197 {
7198         struct ath11k_base *ab = ar->ab;
7199         struct ath11k_vif *arvif, *tx_arvif = NULL;
7200         struct ieee80211_vif *mbssid_tx_vif;
7201         int ret;
7202         int i;
7203         bool monitor_vif = false;
7204
7205         lockdep_assert_held(&ar->conf_mutex);
7206
7207         /* Associated channel resources of all relevant vdevs
7208          * should be available for the channel switch now.
7209          */
7210
7211         /* TODO: Update ar->rx_channel */
7212
7213         for (i = 0; i < n_vifs; i++) {
7214                 arvif = ath11k_vif_to_arvif(vifs[i].vif);
7215
7216                 if (WARN_ON(!arvif->is_started))
7217                         continue;
7218
7219                 /* change_chanctx can be called even before vdev_up from
7220                  * ieee80211_start_ap->ieee80211_vif_use_channel->
7221                  * ieee80211_recalc_radar_chanctx.
7222                  *
7223                  * Firmware expect vdev_restart only if vdev is up.
7224                  * If vdev is down then it expect vdev_stop->vdev_start.
7225                  */
7226                 if (arvif->is_up) {
7227                         ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
7228                         if (ret) {
7229                                 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
7230                                             arvif->vdev_id, ret);
7231                                 continue;
7232                         }
7233                 } else {
7234                         ret = ath11k_mac_vdev_stop(arvif);
7235                         if (ret) {
7236                                 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
7237                                             arvif->vdev_id, ret);
7238                                 continue;
7239                         }
7240
7241                         ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
7242                         if (ret)
7243                                 ath11k_warn(ab, "failed to start vdev %d: %d\n",
7244                                             arvif->vdev_id, ret);
7245
7246                         continue;
7247                 }
7248
7249                 ret = ath11k_mac_setup_bcn_tmpl(arvif);
7250                 if (ret)
7251                         ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
7252                                     ret);
7253
7254                 mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
7255                 if (mbssid_tx_vif)
7256                         tx_arvif = ath11k_vif_to_arvif(mbssid_tx_vif);
7257
7258                 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7259                                          arvif->bssid,
7260                                          tx_arvif ? tx_arvif->bssid : NULL,
7261                                          arvif->vif->bss_conf.bssid_index,
7262                                          1 << arvif->vif->bss_conf.bssid_indicator);
7263                 if (ret) {
7264                         ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
7265                                     arvif->vdev_id, ret);
7266                         continue;
7267                 }
7268         }
7269
7270         /* Restart the internal monitor vdev on new channel */
7271         if (!monitor_vif &&
7272             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7273                 ret = ath11k_mac_monitor_stop(ar);
7274                 if (ret) {
7275                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
7276                                     ret);
7277                         return;
7278                 }
7279
7280                 ret = ath11k_mac_monitor_start(ar);
7281                 if (ret) {
7282                         ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
7283                                     ret);
7284                         return;
7285                 }
7286         }
7287 }
7288
7289 static void
7290 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
7291                                   struct ieee80211_chanctx_conf *ctx)
7292 {
7293         struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
7294
7295         lockdep_assert_held(&ar->conf_mutex);
7296
7297         ieee80211_iterate_active_interfaces_atomic(ar->hw,
7298                                                    IEEE80211_IFACE_ITER_NORMAL,
7299                                                    ath11k_mac_change_chanctx_cnt_iter,
7300                                                    &arg);
7301         if (arg.n_vifs == 0)
7302                 return;
7303
7304         arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
7305         if (!arg.vifs)
7306                 return;
7307
7308         ieee80211_iterate_active_interfaces_atomic(ar->hw,
7309                                                    IEEE80211_IFACE_ITER_NORMAL,
7310                                                    ath11k_mac_change_chanctx_fill_iter,
7311                                                    &arg);
7312
7313         ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7314
7315         kfree(arg.vifs);
7316 }
7317
7318 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7319                                          struct ieee80211_chanctx_conf *ctx,
7320                                          u32 changed)
7321 {
7322         struct ath11k *ar = hw->priv;
7323         struct ath11k_base *ab = ar->ab;
7324
7325         mutex_lock(&ar->conf_mutex);
7326
7327         ath11k_dbg(ab, ATH11K_DBG_MAC,
7328                    "chanctx change freq %u width %d ptr %p changed %x\n",
7329                    ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7330
7331         /* This shouldn't really happen because channel switching should use
7332          * switch_vif_chanctx().
7333          */
7334         if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7335                 goto unlock;
7336
7337         if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
7338             changed & IEEE80211_CHANCTX_CHANGE_RADAR)
7339                 ath11k_mac_update_active_vif_chan(ar, ctx);
7340
7341         /* TODO: Recalc radar detection */
7342
7343 unlock:
7344         mutex_unlock(&ar->conf_mutex);
7345 }
7346
7347 static int ath11k_mac_start_vdev_delay(struct ieee80211_hw *hw,
7348                                        struct ieee80211_vif *vif)
7349 {
7350         struct ath11k *ar = hw->priv;
7351         struct ath11k_base *ab = ar->ab;
7352         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7353         int ret;
7354
7355         if (WARN_ON(arvif->is_started))
7356                 return -EBUSY;
7357
7358         ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7359         if (ret) {
7360                 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7361                             arvif->vdev_id, vif->addr,
7362                             arvif->chanctx.def.chan->center_freq, ret);
7363                 return ret;
7364         }
7365
7366         /* Reconfigure hardware rate code since it is cleared by firmware.
7367          */
7368         if (ar->hw_rate_code > 0) {
7369                 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7370
7371                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7372                                                     ar->hw_rate_code);
7373                 if (ret) {
7374                         ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7375                         return ret;
7376                 }
7377         }
7378
7379         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7380                 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr,
7381                                          NULL, 0, 0);
7382                 if (ret) {
7383                         ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7384                         return ret;
7385                 }
7386         }
7387
7388         arvif->is_started = true;
7389
7390         /* TODO: Setup ps and cts/rts protection */
7391         return 0;
7392 }
7393
7394 static int ath11k_mac_stop_vdev_early(struct ieee80211_hw *hw,
7395                                       struct ieee80211_vif *vif)
7396 {
7397         struct ath11k *ar = hw->priv;
7398         struct ath11k_base *ab = ar->ab;
7399         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7400         int ret;
7401
7402         if (WARN_ON(!arvif->is_started))
7403                 return -EBUSY;
7404
7405         ret = ath11k_mac_vdev_stop(arvif);
7406         if (ret) {
7407                 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7408                             arvif->vdev_id, ret);
7409                 return ret;
7410         }
7411
7412         arvif->is_started = false;
7413
7414         /* TODO: Setup ps and cts/rts protection */
7415         return 0;
7416 }
7417
7418 static u8 ath11k_mac_get_tpe_count(u8 txpwr_intrprt, u8 txpwr_cnt)
7419 {
7420         switch (txpwr_intrprt) {
7421         /* Refer "Table 9-276-Meaning of Maximum Transmit Power Count subfield
7422          * if the Maximum Transmit Power Interpretation subfield is 0 or 2" of
7423          * "IEEE Std 802.11ax 2021".
7424          */
7425         case IEEE80211_TPE_LOCAL_EIRP:
7426         case IEEE80211_TPE_REG_CLIENT_EIRP:
7427                 txpwr_cnt = txpwr_cnt <= 3 ? txpwr_cnt : 3;
7428                 txpwr_cnt = txpwr_cnt + 1;
7429                 break;
7430         /* Refer "Table 9-277-Meaning of Maximum Transmit Power Count subfield
7431          * if Maximum Transmit Power Interpretation subfield is 1 or 3" of
7432          * "IEEE Std 802.11ax 2021".
7433          */
7434         case IEEE80211_TPE_LOCAL_EIRP_PSD:
7435         case IEEE80211_TPE_REG_CLIENT_EIRP_PSD:
7436                 txpwr_cnt = txpwr_cnt <= 4 ? txpwr_cnt : 4;
7437                 txpwr_cnt = txpwr_cnt ? (BIT(txpwr_cnt - 1)) : 1;
7438                 break;
7439         }
7440
7441         return txpwr_cnt;
7442 }
7443
7444 static u8 ath11k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
7445 {
7446         if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
7447                 switch (chan_def->width) {
7448                 case NL80211_CHAN_WIDTH_20:
7449                         return 1;
7450                 case NL80211_CHAN_WIDTH_40:
7451                         return 2;
7452                 case NL80211_CHAN_WIDTH_80:
7453                         return 4;
7454                 case NL80211_CHAN_WIDTH_80P80:
7455                 case NL80211_CHAN_WIDTH_160:
7456                         return 8;
7457                 default:
7458                         return 1;
7459                 }
7460         } else {
7461                 switch (chan_def->width) {
7462                 case NL80211_CHAN_WIDTH_20:
7463                         return 1;
7464                 case NL80211_CHAN_WIDTH_40:
7465                         return 2;
7466                 case NL80211_CHAN_WIDTH_80:
7467                         return 3;
7468                 case NL80211_CHAN_WIDTH_80P80:
7469                 case NL80211_CHAN_WIDTH_160:
7470                         return 4;
7471                 default:
7472                         return 1;
7473                 }
7474         }
7475 }
7476
7477 static u16 ath11k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
7478 {
7479         u16 diff_seq;
7480
7481         /* It is to get the lowest channel number's center frequency of the chan.
7482          * For example,
7483          * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
7484          * with center frequency 5955, its diff is 5965 - 5955 = 10.
7485          * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
7486          * with center frequency 5955, its diff is 5985 - 5955 = 30.
7487          * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
7488          * with center frequency 5955, its diff is 6025 - 5955 = 70.
7489          */
7490         switch (chan_def->width) {
7491         case NL80211_CHAN_WIDTH_160:
7492                 diff_seq = 70;
7493                 break;
7494         case NL80211_CHAN_WIDTH_80:
7495         case NL80211_CHAN_WIDTH_80P80:
7496                 diff_seq = 30;
7497                 break;
7498         case NL80211_CHAN_WIDTH_40:
7499                 diff_seq = 10;
7500                 break;
7501         default:
7502                 diff_seq = 0;
7503         }
7504
7505         return chan_def->center_freq1 - diff_seq;
7506 }
7507
7508 static u16 ath11k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
7509                                    u16 start_seq, u8 seq)
7510 {
7511         u16 seg_seq;
7512
7513         /* It is to get the center frequency of the specific bandwidth.
7514          * start_seq means the lowest channel number's center frequency.
7515          * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz&80P80.
7516          * For example,
7517          * lowest channel is 1, its center frequency 5955,
7518          * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
7519          * lowest channel is 1, its center frequency 5955,
7520          * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
7521          * lowest channel is 1, its center frequency 5955,
7522          * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
7523          * lowest channel is 1, its center frequency 5955,
7524          * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
7525          */
7526         if (chan_def->width == NL80211_CHAN_WIDTH_80P80 && seq == 3)
7527                 return chan_def->center_freq2;
7528
7529         seg_seq = 10 * (BIT(seq) - 1);
7530         return seg_seq + start_seq;
7531 }
7532
7533 static void ath11k_mac_get_psd_channel(struct ath11k *ar,
7534                                        u16 step_freq,
7535                                        u16 *start_freq,
7536                                        u16 *center_freq,
7537                                        u8 i,
7538                                        struct ieee80211_channel **temp_chan,
7539                                        s8 *tx_power)
7540 {
7541         /* It is to get the center frequency for each 20 MHz.
7542          * For example, if the chan is 160 MHz and center frequency is 6025,
7543          * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
7544          * channel number 1's center frequency is 5955, it is parameter start_freq.
7545          * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
7546          * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
7547          * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
7548          * the gap is 20 for each channel, parameter step_freq means the gap.
7549          * after get the center frequency of each channel, it is easy to find the
7550          * struct ieee80211_channel of it and get the max_reg_power.
7551          */
7552         *center_freq = *start_freq + i * step_freq;
7553         *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq);
7554         *tx_power = (*temp_chan)->max_reg_power;
7555 }
7556
7557 static void ath11k_mac_get_eirp_power(struct ath11k *ar,
7558                                       u16 *start_freq,
7559                                       u16 *center_freq,
7560                                       u8 i,
7561                                       struct ieee80211_channel **temp_chan,
7562                                       struct cfg80211_chan_def *def,
7563                                       s8 *tx_power)
7564 {
7565         /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
7566          * 160 MHz&80P80 bandwidth, and then plus 10 to the center frequency,
7567          * it is the center frequency of a channel number.
7568          * For example, when configured channel number is 1.
7569          * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
7570          * then it is channel number 5.
7571          * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
7572          * then it is channel number 9.
7573          * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
7574          * then it is channel number 17.
7575          * after get the center frequency of each channel, it is easy to find the
7576          * struct ieee80211_channel of it and get the max_reg_power.
7577          */
7578         *center_freq = ath11k_mac_get_seg_freq(def, *start_freq, i);
7579
7580         /* For the 20 MHz, its center frequency is same with same channel */
7581         if (i != 0)
7582                 *center_freq += 10;
7583
7584         *temp_chan = ieee80211_get_channel(ar->hw->wiphy, *center_freq);
7585         *tx_power = (*temp_chan)->max_reg_power;
7586 }
7587
7588 void ath11k_mac_fill_reg_tpc_info(struct ath11k *ar,
7589                                   struct ieee80211_vif *vif,
7590                                   struct ieee80211_chanctx_conf *ctx)
7591 {
7592         struct ath11k_base *ab = ar->ab;
7593         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7594         struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
7595         struct ath11k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
7596         struct ieee80211_channel *chan, *temp_chan;
7597         u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
7598         bool is_psd_power = false, is_tpe_present = false;
7599         s8 max_tx_power[IEEE80211_MAX_NUM_PWR_LEVEL],
7600                 psd_power, tx_power;
7601         s8 eirp_power = 0;
7602         u16 start_freq, center_freq;
7603
7604         chan = ctx->def.chan;
7605         start_freq = ath11k_mac_get_6ghz_start_frequency(&ctx->def);
7606         pwr_reduction = bss_conf->pwr_reduction;
7607
7608         if (arvif->reg_tpc_info.num_pwr_levels) {
7609                 is_tpe_present = true;
7610                 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
7611         } else {
7612                 num_pwr_levels = ath11k_mac_get_num_pwr_levels(&ctx->def);
7613         }
7614
7615         for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
7616                 /* STA received TPE IE*/
7617                 if (is_tpe_present) {
7618                         /* local power is PSD power*/
7619                         if (chan->flags & IEEE80211_CHAN_PSD) {
7620                                 /* Connecting AP is psd power */
7621                                 if (reg_tpc_info->is_psd_power) {
7622                                         is_psd_power = true;
7623                                         ath11k_mac_get_psd_channel(ar, 20,
7624                                                                    &start_freq,
7625                                                                    &center_freq,
7626                                                                    pwr_lvl_idx,
7627                                                                    &temp_chan,
7628                                                                    &tx_power);
7629                                         psd_power = temp_chan->psd;
7630                                         eirp_power = tx_power;
7631                                         max_tx_power[pwr_lvl_idx] =
7632                                                 min_t(s8,
7633                                                       psd_power,
7634                                                       reg_tpc_info->tpe[pwr_lvl_idx]);
7635                                 /* Connecting AP is not psd power */
7636                                 } else {
7637                                         ath11k_mac_get_eirp_power(ar,
7638                                                                   &start_freq,
7639                                                                   &center_freq,
7640                                                                   pwr_lvl_idx,
7641                                                                   &temp_chan,
7642                                                                   &ctx->def,
7643                                                                   &tx_power);
7644                                         psd_power = temp_chan->psd;
7645                                         /* convert psd power to EIRP power based
7646                                          * on channel width
7647                                          */
7648                                         tx_power =
7649                                                 min_t(s8, tx_power,
7650                                                       psd_power + 13 + pwr_lvl_idx * 3);
7651                                         max_tx_power[pwr_lvl_idx] =
7652                                                 min_t(s8,
7653                                                       tx_power,
7654                                                       reg_tpc_info->tpe[pwr_lvl_idx]);
7655                                 }
7656                         /* local power is not PSD power */
7657                         } else {
7658                                 /* Connecting AP is psd power */
7659                                 if (reg_tpc_info->is_psd_power) {
7660                                         is_psd_power = true;
7661                                         ath11k_mac_get_psd_channel(ar, 20,
7662                                                                    &start_freq,
7663                                                                    &center_freq,
7664                                                                    pwr_lvl_idx,
7665                                                                    &temp_chan,
7666                                                                    &tx_power);
7667                                         eirp_power = tx_power;
7668                                         max_tx_power[pwr_lvl_idx] =
7669                                                 reg_tpc_info->tpe[pwr_lvl_idx];
7670                                 /* Connecting AP is not psd power */
7671                                 } else {
7672                                         ath11k_mac_get_eirp_power(ar,
7673                                                                   &start_freq,
7674                                                                   &center_freq,
7675                                                                   pwr_lvl_idx,
7676                                                                   &temp_chan,
7677                                                                   &ctx->def,
7678                                                                   &tx_power);
7679                                         max_tx_power[pwr_lvl_idx] =
7680                                                 min_t(s8,
7681                                                       tx_power,
7682                                                       reg_tpc_info->tpe[pwr_lvl_idx]);
7683                                 }
7684                         }
7685                 /* STA not received TPE IE */
7686                 } else {
7687                         /* local power is PSD power*/
7688                         if (chan->flags & IEEE80211_CHAN_PSD) {
7689                                 is_psd_power = true;
7690                                 ath11k_mac_get_psd_channel(ar, 20,
7691                                                            &start_freq,
7692                                                            &center_freq,
7693                                                            pwr_lvl_idx,
7694                                                            &temp_chan,
7695                                                            &tx_power);
7696                                 psd_power = temp_chan->psd;
7697                                 eirp_power = tx_power;
7698                                 max_tx_power[pwr_lvl_idx] = psd_power;
7699                         } else {
7700                                 ath11k_mac_get_eirp_power(ar,
7701                                                           &start_freq,
7702                                                           &center_freq,
7703                                                           pwr_lvl_idx,
7704                                                           &temp_chan,
7705                                                           &ctx->def,
7706                                                           &tx_power);
7707                                 max_tx_power[pwr_lvl_idx] = tx_power;
7708                         }
7709                 }
7710
7711                 if (is_psd_power) {
7712                         /* If AP local power constraint is present */
7713                         if (pwr_reduction)
7714                                 eirp_power = eirp_power - pwr_reduction;
7715
7716                         /* If firmware updated max tx power is non zero, then take
7717                          * the min of firmware updated ap tx power
7718                          * and max power derived from above mentioned parameters.
7719                          */
7720                         ath11k_dbg(ab, ATH11K_DBG_MAC,
7721                                    "eirp power : %d firmware report power : %d\n",
7722                                    eirp_power, ar->max_allowed_tx_power);
7723                         /* Firmware reports lower max_allowed_tx_power during vdev
7724                          * start response. In case of 6 GHz, firmware is not aware
7725                          * of EIRP power unless driver sets EIRP power through WMI
7726                          * TPC command. So radio which does not support idle power
7727                          * save can set maximum calculated EIRP power directly to
7728                          * firmware through TPC command without min comparison with
7729                          * vdev start response's max_allowed_tx_power.
7730                          */
7731                         if (ar->max_allowed_tx_power && ab->hw_params.idle_ps)
7732                                 eirp_power = min_t(s8,
7733                                                    eirp_power,
7734                                                    ar->max_allowed_tx_power);
7735                 } else {
7736                         /* If AP local power constraint is present */
7737                         if (pwr_reduction)
7738                                 max_tx_power[pwr_lvl_idx] =
7739                                         max_tx_power[pwr_lvl_idx] - pwr_reduction;
7740                         /* If firmware updated max tx power is non zero, then take
7741                          * the min of firmware updated ap tx power
7742                          * and max power derived from above mentioned parameters.
7743                          */
7744                         if (ar->max_allowed_tx_power && ab->hw_params.idle_ps)
7745                                 max_tx_power[pwr_lvl_idx] =
7746                                         min_t(s8,
7747                                               max_tx_power[pwr_lvl_idx],
7748                                               ar->max_allowed_tx_power);
7749                 }
7750                 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
7751                 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
7752                         max_tx_power[pwr_lvl_idx];
7753         }
7754
7755         reg_tpc_info->num_pwr_levels = num_pwr_levels;
7756         reg_tpc_info->is_psd_power = is_psd_power;
7757         reg_tpc_info->eirp_power = eirp_power;
7758         reg_tpc_info->ap_power_type =
7759                 ath11k_reg_ap_pwr_convert(vif->bss_conf.power_type);
7760 }
7761
7762 static void ath11k_mac_parse_tx_pwr_env(struct ath11k *ar,
7763                                         struct ieee80211_vif *vif,
7764                                         struct ieee80211_chanctx_conf *ctx)
7765 {
7766         struct ath11k_base *ab = ar->ab;
7767         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7768         struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
7769         struct ieee80211_tx_pwr_env *single_tpe;
7770         enum wmi_reg_6ghz_client_type client_type;
7771         struct cur_regulatory_info *reg_info;
7772         int i;
7773         u8 pwr_count, pwr_interpret, pwr_category;
7774         u8 psd_index = 0, non_psd_index = 0, local_tpe_count = 0, reg_tpe_count = 0;
7775         bool use_local_tpe, non_psd_set = false, psd_set = false;
7776
7777         reg_info = &ab->reg_info_store[ar->pdev_idx];
7778         client_type = reg_info->client_type;
7779
7780         for (i = 0; i < bss_conf->tx_pwr_env_num; i++) {
7781                 single_tpe = &bss_conf->tx_pwr_env[i];
7782                 pwr_category = u8_get_bits(single_tpe->tx_power_info,
7783                                            IEEE80211_TX_PWR_ENV_INFO_CATEGORY);
7784                 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7785                                             IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7786
7787                 if (pwr_category == client_type) {
7788                         if (pwr_interpret == IEEE80211_TPE_LOCAL_EIRP ||
7789                             pwr_interpret == IEEE80211_TPE_LOCAL_EIRP_PSD)
7790                                 local_tpe_count++;
7791                         else if (pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP ||
7792                                  pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP_PSD)
7793                                 reg_tpe_count++;
7794                 }
7795         }
7796
7797         if (!reg_tpe_count && !local_tpe_count) {
7798                 ath11k_warn(ab,
7799                             "no transmit power envelope match client power type %d\n",
7800                             client_type);
7801                 return;
7802         } else if (!reg_tpe_count) {
7803                 use_local_tpe = true;
7804         } else {
7805                 use_local_tpe = false;
7806         }
7807
7808         for (i = 0; i < bss_conf->tx_pwr_env_num; i++) {
7809                 single_tpe = &bss_conf->tx_pwr_env[i];
7810                 pwr_category = u8_get_bits(single_tpe->tx_power_info,
7811                                            IEEE80211_TX_PWR_ENV_INFO_CATEGORY);
7812                 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7813                                             IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7814
7815                 if (pwr_category != client_type)
7816                         continue;
7817
7818                 /* get local transmit power envelope */
7819                 if (use_local_tpe) {
7820                         if (pwr_interpret == IEEE80211_TPE_LOCAL_EIRP) {
7821                                 non_psd_index = i;
7822                                 non_psd_set = true;
7823                         } else if (pwr_interpret == IEEE80211_TPE_LOCAL_EIRP_PSD) {
7824                                 psd_index = i;
7825                                 psd_set = true;
7826                         }
7827                 /* get regulatory transmit power envelope */
7828                 } else {
7829                         if (pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP) {
7830                                 non_psd_index = i;
7831                                 non_psd_set = true;
7832                         } else if (pwr_interpret == IEEE80211_TPE_REG_CLIENT_EIRP_PSD) {
7833                                 psd_index = i;
7834                                 psd_set = true;
7835                         }
7836                 }
7837         }
7838
7839         if (non_psd_set && !psd_set) {
7840                 single_tpe = &bss_conf->tx_pwr_env[non_psd_index];
7841                 pwr_count = u8_get_bits(single_tpe->tx_power_info,
7842                                         IEEE80211_TX_PWR_ENV_INFO_COUNT);
7843                 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7844                                             IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7845                 arvif->reg_tpc_info.is_psd_power = false;
7846                 arvif->reg_tpc_info.eirp_power = 0;
7847
7848                 arvif->reg_tpc_info.num_pwr_levels =
7849                         ath11k_mac_get_tpe_count(pwr_interpret, pwr_count);
7850
7851                 for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) {
7852                         ath11k_dbg(ab, ATH11K_DBG_MAC,
7853                                    "non PSD power[%d] : %d\n",
7854                                    i, single_tpe->tx_power[i]);
7855                         arvif->reg_tpc_info.tpe[i] = single_tpe->tx_power[i] / 2;
7856                 }
7857         }
7858
7859         if (psd_set) {
7860                 single_tpe = &bss_conf->tx_pwr_env[psd_index];
7861                 pwr_count = u8_get_bits(single_tpe->tx_power_info,
7862                                         IEEE80211_TX_PWR_ENV_INFO_COUNT);
7863                 pwr_interpret = u8_get_bits(single_tpe->tx_power_info,
7864                                             IEEE80211_TX_PWR_ENV_INFO_INTERPRET);
7865                 arvif->reg_tpc_info.is_psd_power = true;
7866
7867                 if (pwr_count == 0) {
7868                         ath11k_dbg(ab, ATH11K_DBG_MAC,
7869                                    "TPE PSD power : %d\n", single_tpe->tx_power[0]);
7870                         arvif->reg_tpc_info.num_pwr_levels =
7871                                 ath11k_mac_get_num_pwr_levels(&ctx->def);
7872
7873                         for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++)
7874                                 arvif->reg_tpc_info.tpe[i] = single_tpe->tx_power[0] / 2;
7875                 } else {
7876                         arvif->reg_tpc_info.num_pwr_levels =
7877                                 ath11k_mac_get_tpe_count(pwr_interpret, pwr_count);
7878
7879                         for (i = 0; i < arvif->reg_tpc_info.num_pwr_levels; i++) {
7880                                 ath11k_dbg(ab, ATH11K_DBG_MAC,
7881                                            "TPE PSD power[%d] : %d\n",
7882                                            i, single_tpe->tx_power[i]);
7883                                 arvif->reg_tpc_info.tpe[i] = single_tpe->tx_power[i] / 2;
7884                         }
7885                 }
7886         }
7887 }
7888
7889 static int
7890 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7891                                  struct ieee80211_vif *vif,
7892                                  struct ieee80211_bss_conf *link_conf,
7893                                  struct ieee80211_chanctx_conf *ctx)
7894 {
7895         struct ath11k *ar = hw->priv;
7896         struct ath11k_base *ab = ar->ab;
7897         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7898         int ret;
7899         struct cur_regulatory_info *reg_info;
7900         enum ieee80211_ap_reg_power power_type;
7901
7902         mutex_lock(&ar->conf_mutex);
7903
7904         ath11k_dbg(ab, ATH11K_DBG_MAC,
7905                    "chanctx assign ptr %p vdev_id %i\n",
7906                    ctx, arvif->vdev_id);
7907
7908         if (ath11k_wmi_supports_6ghz_cc_ext(ar) &&
7909             ctx->def.chan->band == NL80211_BAND_6GHZ &&
7910             arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7911                 reg_info = &ab->reg_info_store[ar->pdev_idx];
7912                 power_type = vif->bss_conf.power_type;
7913
7914                 ath11k_dbg(ab, ATH11K_DBG_MAC, "chanctx power type %d\n", power_type);
7915
7916                 if (power_type == IEEE80211_REG_UNSET_AP) {
7917                         ret = -EINVAL;
7918                         goto out;
7919                 }
7920
7921                 ath11k_reg_handle_chan_list(ab, reg_info, power_type);
7922                 arvif->chanctx = *ctx;
7923                 ath11k_mac_parse_tx_pwr_env(ar, vif, ctx);
7924         }
7925
7926         /* for QCA6390 bss peer must be created before vdev_start */
7927         if (ab->hw_params.vdev_start_delay &&
7928             arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7929             arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7930             !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7931                 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7932                 ret = 0;
7933                 goto out;
7934         }
7935
7936         if (WARN_ON(arvif->is_started)) {
7937                 ret = -EBUSY;
7938                 goto out;
7939         }
7940
7941         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7942                 ret = ath11k_mac_monitor_start(ar);
7943                 if (ret) {
7944                         ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7945                                     ret);
7946                         goto out;
7947                 }
7948
7949                 arvif->is_started = true;
7950                 goto out;
7951         }
7952
7953         if (!arvif->is_started) {
7954                 ret = ath11k_mac_vdev_start(arvif, ctx);
7955                 if (ret) {
7956                         ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7957                                     arvif->vdev_id, vif->addr,
7958                                     ctx->def.chan->center_freq, ret);
7959                         goto out;
7960                 }
7961
7962                 arvif->is_started = true;
7963         }
7964
7965         if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7966             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7967                 ret = ath11k_mac_monitor_start(ar);
7968                 if (ret) {
7969                         ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7970                                     ret);
7971                         goto out;
7972                 }
7973         }
7974
7975         /* TODO: Setup ps and cts/rts protection */
7976
7977         ret = 0;
7978
7979 out:
7980         mutex_unlock(&ar->conf_mutex);
7981
7982         return ret;
7983 }
7984
7985 static void
7986 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7987                                    struct ieee80211_vif *vif,
7988                                    struct ieee80211_bss_conf *link_conf,
7989                                    struct ieee80211_chanctx_conf *ctx)
7990 {
7991         struct ath11k *ar = hw->priv;
7992         struct ath11k_base *ab = ar->ab;
7993         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7994         struct ath11k_peer *peer;
7995         int ret;
7996
7997         mutex_lock(&ar->conf_mutex);
7998
7999         ath11k_dbg(ab, ATH11K_DBG_MAC,
8000                    "chanctx unassign ptr %p vdev_id %i\n",
8001                    ctx, arvif->vdev_id);
8002
8003         if (ab->hw_params.vdev_start_delay &&
8004             arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8005                 spin_lock_bh(&ab->base_lock);
8006                 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
8007                 spin_unlock_bh(&ab->base_lock);
8008                 if (peer)
8009                         ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
8010         }
8011
8012         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8013                 ret = ath11k_mac_monitor_stop(ar);
8014                 if (ret) {
8015                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
8016                                     ret);
8017                         mutex_unlock(&ar->conf_mutex);
8018                         return;
8019                 }
8020
8021                 arvif->is_started = false;
8022                 mutex_unlock(&ar->conf_mutex);
8023                 return;
8024         }
8025
8026         if (arvif->is_started) {
8027                 ret = ath11k_mac_vdev_stop(arvif);
8028                 if (ret)
8029                         ath11k_warn(ab, "failed to stop vdev %i: %d\n",
8030                                     arvif->vdev_id, ret);
8031
8032                 arvif->is_started = false;
8033         }
8034
8035         if (ab->hw_params.vdev_start_delay &&
8036             arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
8037                 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
8038
8039         if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
8040             ar->num_started_vdevs == 1 &&
8041             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
8042                 ret = ath11k_mac_monitor_stop(ar);
8043                 if (ret)
8044                         /* continue even if there's an error */
8045                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
8046                                     ret);
8047         }
8048
8049         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
8050                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
8051
8052         mutex_unlock(&ar->conf_mutex);
8053 }
8054
8055 static int
8056 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
8057                                  struct ieee80211_vif_chanctx_switch *vifs,
8058                                  int n_vifs,
8059                                  enum ieee80211_chanctx_switch_mode mode)
8060 {
8061         struct ath11k *ar = hw->priv;
8062
8063         mutex_lock(&ar->conf_mutex);
8064
8065         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8066                    "chanctx switch n_vifs %d mode %d\n",
8067                    n_vifs, mode);
8068         ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
8069
8070         mutex_unlock(&ar->conf_mutex);
8071
8072         return 0;
8073 }
8074
8075 static int
8076 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
8077 {
8078         struct ath11k_vif *arvif;
8079         int ret = 0;
8080
8081         mutex_lock(&ar->conf_mutex);
8082         list_for_each_entry(arvif, &ar->arvifs, list) {
8083                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
8084                            param, arvif->vdev_id, value);
8085
8086                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8087                                                     param, value);
8088                 if (ret) {
8089                         ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
8090                                     param, arvif->vdev_id, ret);
8091                         break;
8092                 }
8093         }
8094         mutex_unlock(&ar->conf_mutex);
8095         return ret;
8096 }
8097
8098 /* mac80211 stores device specific RTS/Fragmentation threshold value,
8099  * this is set interface specific to firmware from ath11k driver
8100  */
8101 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
8102 {
8103         struct ath11k *ar = hw->priv;
8104         int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
8105
8106         return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
8107 }
8108
8109 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
8110 {
8111         /* Even though there's a WMI vdev param for fragmentation threshold no
8112          * known firmware actually implements it. Moreover it is not possible to
8113          * rely frame fragmentation to mac80211 because firmware clears the
8114          * "more fragments" bit in frame control making it impossible for remote
8115          * devices to reassemble frames.
8116          *
8117          * Hence implement a dummy callback just to say fragmentation isn't
8118          * supported. This effectively prevents mac80211 from doing frame
8119          * fragmentation in software.
8120          */
8121         return -EOPNOTSUPP;
8122 }
8123
8124 static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
8125 {
8126         long time_left;
8127         int ret = 0;
8128
8129         time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
8130                                        (atomic_read(&ar->dp.num_tx_pending) == 0),
8131                                        ATH11K_FLUSH_TIMEOUT);
8132         if (time_left == 0) {
8133                 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
8134                             atomic_read(&ar->dp.num_tx_pending));
8135                 ret = -ETIMEDOUT;
8136         }
8137
8138         time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
8139                                        (atomic_read(&ar->num_pending_mgmt_tx) == 0),
8140                                        ATH11K_FLUSH_TIMEOUT);
8141         if (time_left == 0) {
8142                 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
8143                             atomic_read(&ar->num_pending_mgmt_tx));
8144                 ret = -ETIMEDOUT;
8145         }
8146
8147         return ret;
8148 }
8149
8150 int ath11k_mac_wait_tx_complete(struct ath11k *ar)
8151 {
8152         ath11k_mac_drain_tx(ar);
8153         return ath11k_mac_flush_tx_complete(ar);
8154 }
8155
8156 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
8157                                 u32 queues, bool drop)
8158 {
8159         struct ath11k *ar = hw->priv;
8160
8161         if (drop)
8162                 return;
8163
8164         ath11k_mac_flush_tx_complete(ar);
8165 }
8166
8167 static bool
8168 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
8169                                   enum nl80211_band band,
8170                                   const struct cfg80211_bitrate_mask *mask)
8171 {
8172         int num_rates = 0;
8173
8174         num_rates = hweight32(mask->control[band].legacy);
8175
8176         if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
8177                 return false;
8178
8179         if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
8180                 return false;
8181
8182         if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
8183                 return false;
8184
8185         return num_rates == 1;
8186 }
8187
8188 static __le16
8189 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
8190 {
8191         if (he_cap->he_cap_elem.phy_cap_info[0] &
8192             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
8193                 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
8194
8195         if (he_cap->he_cap_elem.phy_cap_info[0] &
8196             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8197                 return he_cap->he_mcs_nss_supp.tx_mcs_160;
8198
8199         return he_cap->he_mcs_nss_supp.tx_mcs_80;
8200 }
8201
8202 static bool
8203 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
8204                                        struct ath11k_vif *arvif,
8205                                        enum nl80211_band band,
8206                                        const struct cfg80211_bitrate_mask *mask,
8207                                        int *nss)
8208 {
8209         struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
8210         u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
8211         const struct ieee80211_sta_he_cap *he_cap;
8212         u16 he_mcs_map = 0;
8213         u8 ht_nss_mask = 0;
8214         u8 vht_nss_mask = 0;
8215         u8 he_nss_mask = 0;
8216         int i;
8217
8218         /* No need to consider legacy here. Basic rates are always present
8219          * in bitrate mask
8220          */
8221
8222         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
8223                 if (mask->control[band].ht_mcs[i] == 0)
8224                         continue;
8225                 else if (mask->control[band].ht_mcs[i] ==
8226                          sband->ht_cap.mcs.rx_mask[i])
8227                         ht_nss_mask |= BIT(i);
8228                 else
8229                         return false;
8230         }
8231
8232         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
8233                 if (mask->control[band].vht_mcs[i] == 0)
8234                         continue;
8235                 else if (mask->control[band].vht_mcs[i] ==
8236                          ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
8237                         vht_nss_mask |= BIT(i);
8238                 else
8239                         return false;
8240         }
8241
8242         he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
8243         if (!he_cap)
8244                 return false;
8245
8246         he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
8247
8248         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
8249                 if (mask->control[band].he_mcs[i] == 0)
8250                         continue;
8251
8252                 if (mask->control[band].he_mcs[i] ==
8253                     ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
8254                         he_nss_mask |= BIT(i);
8255                 else
8256                         return false;
8257         }
8258
8259         if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
8260                 return false;
8261
8262         if (ht_nss_mask == 0)
8263                 return false;
8264
8265         if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
8266                 return false;
8267
8268         *nss = fls(ht_nss_mask);
8269
8270         return true;
8271 }
8272
8273 static int
8274 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
8275                                   enum nl80211_band band,
8276                                   const struct cfg80211_bitrate_mask *mask,
8277                                   u32 *rate, u8 *nss)
8278 {
8279         int rate_idx;
8280         u16 bitrate;
8281         u8 preamble;
8282         u8 hw_rate;
8283
8284         if (hweight32(mask->control[band].legacy) != 1)
8285                 return -EINVAL;
8286
8287         rate_idx = ffs(mask->control[band].legacy) - 1;
8288
8289         if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
8290                 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
8291
8292         hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
8293         bitrate = ath11k_legacy_rates[rate_idx].bitrate;
8294
8295         if (ath11k_mac_bitrate_is_cck(bitrate))
8296                 preamble = WMI_RATE_PREAMBLE_CCK;
8297         else
8298                 preamble = WMI_RATE_PREAMBLE_OFDM;
8299
8300         *nss = 1;
8301         *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
8302
8303         return 0;
8304 }
8305
8306 static int
8307 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
8308 {
8309         struct ath11k *ar = arvif->ar;
8310         int ret;
8311
8312         /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
8313         if (he_gi && he_gi != 0xFF)
8314                 he_gi += 1;
8315
8316         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8317                                             WMI_VDEV_PARAM_SGI, he_gi);
8318         if (ret) {
8319                 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
8320                             he_gi, ret);
8321                 return ret;
8322         }
8323         /* start from 1 */
8324         if (he_ltf != 0xFF)
8325                 he_ltf += 1;
8326
8327         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8328                                             WMI_VDEV_PARAM_HE_LTF, he_ltf);
8329         if (ret) {
8330                 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
8331                             he_ltf, ret);
8332                 return ret;
8333         }
8334
8335         return 0;
8336 }
8337
8338 static int
8339 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
8340 {
8341         struct ath11k *ar = arvif->ar;
8342         int ret;
8343         u32 he_ar_gi_ltf;
8344
8345         if (he_gi != 0xFF) {
8346                 switch (he_gi) {
8347                 case NL80211_RATE_INFO_HE_GI_0_8:
8348                         he_gi = WMI_AUTORATE_800NS_GI;
8349                         break;
8350                 case NL80211_RATE_INFO_HE_GI_1_6:
8351                         he_gi = WMI_AUTORATE_1600NS_GI;
8352                         break;
8353                 case NL80211_RATE_INFO_HE_GI_3_2:
8354                         he_gi = WMI_AUTORATE_3200NS_GI;
8355                         break;
8356                 default:
8357                         ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
8358                         return -EINVAL;
8359                 }
8360         }
8361
8362         if (he_ltf != 0xFF) {
8363                 switch (he_ltf) {
8364                 case NL80211_RATE_INFO_HE_1XLTF:
8365                         he_ltf = WMI_HE_AUTORATE_LTF_1X;
8366                         break;
8367                 case NL80211_RATE_INFO_HE_2XLTF:
8368                         he_ltf = WMI_HE_AUTORATE_LTF_2X;
8369                         break;
8370                 case NL80211_RATE_INFO_HE_4XLTF:
8371                         he_ltf = WMI_HE_AUTORATE_LTF_4X;
8372                         break;
8373                 default:
8374                         ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
8375                         return -EINVAL;
8376                 }
8377         }
8378
8379         he_ar_gi_ltf = he_gi | he_ltf;
8380         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8381                                             WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8382                                             he_ar_gi_ltf);
8383         if (ret) {
8384                 ath11k_warn(ar->ab,
8385                             "failed to set he autorate gi %u ltf %u: %d\n",
8386                             he_gi, he_ltf, ret);
8387                 return ret;
8388         }
8389
8390         return 0;
8391 }
8392
8393 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
8394                                       u32 rate, u8 nss, u8 sgi, u8 ldpc,
8395                                       u8 he_gi, u8 he_ltf, bool he_fixed_rate)
8396 {
8397         struct ath11k *ar = arvif->ar;
8398         u32 vdev_param;
8399         int ret;
8400
8401         lockdep_assert_held(&ar->conf_mutex);
8402
8403         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8404                    "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",
8405                    arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
8406                    he_ltf, he_fixed_rate);
8407
8408         if (!arvif->vif->bss_conf.he_support) {
8409                 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
8410                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8411                                                     vdev_param, rate);
8412                 if (ret) {
8413                         ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
8414                                     rate, ret);
8415                         return ret;
8416                 }
8417         }
8418
8419         vdev_param = WMI_VDEV_PARAM_NSS;
8420         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8421                                             vdev_param, nss);
8422         if (ret) {
8423                 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
8424                             nss, ret);
8425                 return ret;
8426         }
8427
8428         vdev_param = WMI_VDEV_PARAM_LDPC;
8429         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8430                                             vdev_param, ldpc);
8431         if (ret) {
8432                 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
8433                             ldpc, ret);
8434                 return ret;
8435         }
8436
8437         if (arvif->vif->bss_conf.he_support) {
8438                 if (he_fixed_rate) {
8439                         ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
8440                                                                he_ltf);
8441                         if (ret) {
8442                                 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
8443                                             ret);
8444                                 return ret;
8445                         }
8446                 } else {
8447                         ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
8448                                                               he_ltf);
8449                         if (ret) {
8450                                 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
8451                                             ret);
8452                                 return ret;
8453                         }
8454                 }
8455         } else {
8456                 vdev_param = WMI_VDEV_PARAM_SGI;
8457                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8458                                                     vdev_param, sgi);
8459                 if (ret) {
8460                         ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
8461                                     sgi, ret);
8462                         return ret;
8463                 }
8464         }
8465
8466         return 0;
8467 }
8468
8469 static bool
8470 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
8471                                  enum nl80211_band band,
8472                                  const struct cfg80211_bitrate_mask *mask)
8473 {
8474         int i;
8475         u16 vht_mcs;
8476
8477         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8478                 vht_mcs = mask->control[band].vht_mcs[i];
8479
8480                 switch (vht_mcs) {
8481                 case 0:
8482                 case BIT(8) - 1:
8483                 case BIT(9) - 1:
8484                 case BIT(10) - 1:
8485                         break;
8486                 default:
8487                         return false;
8488                 }
8489         }
8490
8491         return true;
8492 }
8493
8494 static bool
8495 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
8496                                 enum nl80211_band band,
8497                                 const struct cfg80211_bitrate_mask *mask)
8498 {
8499         int i;
8500         u16 he_mcs;
8501
8502         for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
8503                 he_mcs = mask->control[band].he_mcs[i];
8504
8505                 switch (he_mcs) {
8506                 case 0:
8507                 case BIT(8) - 1:
8508                 case BIT(10) - 1:
8509                 case BIT(12) - 1:
8510                         break;
8511                 default:
8512                         return false;
8513                 }
8514         }
8515
8516         return true;
8517 }
8518
8519 static void ath11k_mac_set_bitrate_mask_iter(void *data,
8520                                              struct ieee80211_sta *sta)
8521 {
8522         struct ath11k_vif *arvif = data;
8523         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8524         struct ath11k *ar = arvif->ar;
8525
8526         spin_lock_bh(&ar->data_lock);
8527         arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8528         spin_unlock_bh(&ar->data_lock);
8529
8530         ieee80211_queue_work(ar->hw, &arsta->update_wk);
8531 }
8532
8533 static void ath11k_mac_disable_peer_fixed_rate(void *data,
8534                                                struct ieee80211_sta *sta)
8535 {
8536         struct ath11k_vif *arvif = data;
8537         struct ath11k *ar = arvif->ar;
8538         int ret;
8539
8540         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
8541                                         arvif->vdev_id,
8542                                         WMI_PEER_PARAM_FIXED_RATE,
8543                                         WMI_FIXED_RATE_NONE);
8544         if (ret)
8545                 ath11k_warn(ar->ab,
8546                             "failed to disable peer fixed rate for STA %pM ret %d\n",
8547                             sta->addr, ret);
8548 }
8549
8550 static bool
8551 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
8552                                                const struct cfg80211_bitrate_mask *mask)
8553 {
8554         bool he_fixed_rate = false, vht_fixed_rate = false;
8555         struct ath11k_peer *peer;
8556         const u16 *vht_mcs_mask, *he_mcs_mask;
8557         struct ieee80211_link_sta *deflink;
8558         u8 vht_nss, he_nss;
8559         bool ret = true;
8560
8561         vht_mcs_mask = mask->control[band].vht_mcs;
8562         he_mcs_mask = mask->control[band].he_mcs;
8563
8564         if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
8565                 vht_fixed_rate = true;
8566
8567         if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
8568                 he_fixed_rate = true;
8569
8570         if (!vht_fixed_rate && !he_fixed_rate)
8571                 return true;
8572
8573         vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
8574         he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
8575
8576         rcu_read_lock();
8577         spin_lock_bh(&ar->ab->base_lock);
8578         list_for_each_entry(peer, &ar->ab->peers, list) {
8579                 if (peer->sta) {
8580                         deflink = &peer->sta->deflink;
8581
8582                         if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
8583                                                deflink->rx_nss < vht_nss)) {
8584                                 ret = false;
8585                                 goto out;
8586                         }
8587
8588                         if (he_fixed_rate && (!deflink->he_cap.has_he ||
8589                                               deflink->rx_nss < he_nss)) {
8590                                 ret = false;
8591                                 goto out;
8592                         }
8593                 }
8594         }
8595
8596 out:
8597         spin_unlock_bh(&ar->ab->base_lock);
8598         rcu_read_unlock();
8599         return ret;
8600 }
8601
8602 static int
8603 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8604                                struct ieee80211_vif *vif,
8605                                const struct cfg80211_bitrate_mask *mask)
8606 {
8607         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8608         struct cfg80211_chan_def def;
8609         struct ath11k_pdev_cap *cap;
8610         struct ath11k *ar = arvif->ar;
8611         enum nl80211_band band;
8612         const u8 *ht_mcs_mask;
8613         const u16 *vht_mcs_mask;
8614         const u16 *he_mcs_mask;
8615         u8 he_ltf = 0;
8616         u8 he_gi = 0;
8617         u32 rate;
8618         u8 nss;
8619         u8 sgi;
8620         u8 ldpc;
8621         int single_nss;
8622         int ret;
8623         int num_rates;
8624         bool he_fixed_rate = false;
8625
8626         if (ath11k_mac_vif_chan(vif, &def))
8627                 return -EPERM;
8628
8629         band = def.chan->band;
8630         cap = &ar->pdev->cap;
8631         ht_mcs_mask = mask->control[band].ht_mcs;
8632         vht_mcs_mask = mask->control[band].vht_mcs;
8633         he_mcs_mask = mask->control[band].he_mcs;
8634         ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
8635
8636         sgi = mask->control[band].gi;
8637         if (sgi == NL80211_TXRATE_FORCE_LGI)
8638                 return -EINVAL;
8639
8640         he_gi = mask->control[band].he_gi;
8641         he_ltf = mask->control[band].he_ltf;
8642
8643         /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
8644          * requires passing at least one of used basic rates along with them.
8645          * Fixed rate setting across different preambles(legacy, HT, VHT) is
8646          * not supported by the FW. Hence use of FIXED_RATE vdev param is not
8647          * suitable for setting single HT/VHT rates.
8648          * But, there could be a single basic rate passed from userspace which
8649          * can be done through the FIXED_RATE param.
8650          */
8651         if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
8652                 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
8653                                                         &nss);
8654                 if (ret) {
8655                         ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
8656                                     arvif->vdev_id, ret);
8657                         return ret;
8658                 }
8659                 ieee80211_iterate_stations_atomic(ar->hw,
8660                                                   ath11k_mac_disable_peer_fixed_rate,
8661                                                   arvif);
8662         } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
8663                                                           &single_nss)) {
8664                 rate = WMI_FIXED_RATE_NONE;
8665                 nss = single_nss;
8666                 mutex_lock(&ar->conf_mutex);
8667                 arvif->bitrate_mask = *mask;
8668                 ieee80211_iterate_stations_atomic(ar->hw,
8669                                                   ath11k_mac_set_bitrate_mask_iter,
8670                                                   arvif);
8671                 mutex_unlock(&ar->conf_mutex);
8672         } else {
8673                 rate = WMI_FIXED_RATE_NONE;
8674
8675                 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
8676                         ath11k_warn(ar->ab,
8677                                     "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
8678                 nss = min_t(u32, ar->num_tx_chains,
8679                             ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
8680
8681                 /* If multiple rates across different preambles are given
8682                  * we can reconfigure this info with all peers using PEER_ASSOC
8683                  * command with the below exception cases.
8684                  * - Single VHT Rate : peer_assoc command accommodates only MCS
8685                  * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
8686                  * mandates passing basic rates along with HT/VHT rates, FW
8687                  * doesn't allow switching from VHT to Legacy. Hence instead of
8688                  * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
8689                  * we could set this VHT rate as peer fixed rate param, which
8690                  * will override FIXED rate and FW rate control algorithm.
8691                  * If single VHT rate is passed along with HT rates, we select
8692                  * the VHT rate as fixed rate for vht peers.
8693                  * - Multiple VHT Rates : When Multiple VHT rates are given,this
8694                  * can be set using RATEMASK CMD which uses FW rate-ctl alg.
8695                  * TODO: Setting multiple VHT MCS and replacing peer_assoc with
8696                  * RATEMASK_CMDID can cover all use cases of setting rates
8697                  * across multiple preambles and rates within same type.
8698                  * But requires more validation of the command at this point.
8699                  */
8700
8701                 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
8702                                                                   mask);
8703
8704                 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
8705                     num_rates > 1) {
8706                         /* TODO: Handle multiple VHT MCS values setting using
8707                          * RATEMASK CMD
8708                          */
8709                         ath11k_warn(ar->ab,
8710                                     "setting %d mcs values in bitrate mask not supported\n",
8711                                 num_rates);
8712                         return -EINVAL;
8713                 }
8714
8715                 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
8716                                                                  mask);
8717                 if (num_rates == 1)
8718                         he_fixed_rate = true;
8719
8720                 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
8721                     num_rates > 1) {
8722                         ath11k_warn(ar->ab,
8723                                     "Setting more than one HE MCS Value in bitrate mask not supported\n");
8724                         return -EINVAL;
8725                 }
8726
8727                 mutex_lock(&ar->conf_mutex);
8728                 ieee80211_iterate_stations_atomic(ar->hw,
8729                                                   ath11k_mac_disable_peer_fixed_rate,
8730                                                   arvif);
8731
8732                 arvif->bitrate_mask = *mask;
8733                 ieee80211_iterate_stations_atomic(ar->hw,
8734                                                   ath11k_mac_set_bitrate_mask_iter,
8735                                                   arvif);
8736
8737                 mutex_unlock(&ar->conf_mutex);
8738         }
8739
8740         mutex_lock(&ar->conf_mutex);
8741
8742         ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
8743                                          he_ltf, he_fixed_rate);
8744         if (ret) {
8745                 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
8746                             arvif->vdev_id, ret);
8747         }
8748
8749         mutex_unlock(&ar->conf_mutex);
8750
8751         return ret;
8752 }
8753
8754 static void
8755 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
8756                                 enum ieee80211_reconfig_type reconfig_type)
8757 {
8758         struct ath11k *ar = hw->priv;
8759         struct ath11k_base *ab = ar->ab;
8760         int recovery_count;
8761         struct ath11k_vif *arvif;
8762
8763         if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8764                 return;
8765
8766         mutex_lock(&ar->conf_mutex);
8767
8768         if (ar->state == ATH11K_STATE_RESTARTED) {
8769                 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
8770                             ar->pdev->pdev_id);
8771                 ar->state = ATH11K_STATE_ON;
8772                 ieee80211_wake_queues(ar->hw);
8773
8774                 if (ar->ab->hw_params.current_cc_support &&
8775                     ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
8776                         struct wmi_set_current_country_params set_current_param = {};
8777
8778                         memcpy(&set_current_param.alpha2, ar->alpha2, 2);
8779                         ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
8780                 }
8781
8782                 if (ab->is_reset) {
8783                         recovery_count = atomic_inc_return(&ab->recovery_count);
8784                         ath11k_dbg(ab, ATH11K_DBG_BOOT,
8785                                    "recovery count %d\n", recovery_count);
8786                         /* When there are multiple radios in an SOC,
8787                          * the recovery has to be done for each radio
8788                          */
8789                         if (recovery_count == ab->num_radios) {
8790                                 atomic_dec(&ab->reset_count);
8791                                 complete(&ab->reset_complete);
8792                                 ab->is_reset = false;
8793                                 atomic_set(&ab->fail_cont_count, 0);
8794                                 ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
8795                         }
8796                 }
8797                 if (ar->ab->hw_params.support_fw_mac_sequence) {
8798                         list_for_each_entry(arvif, &ar->arvifs, list) {
8799                                 if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
8800                                         ieee80211_hw_restart_disconnect(arvif->vif);
8801                         }
8802                 }
8803         }
8804
8805         mutex_unlock(&ar->conf_mutex);
8806 }
8807
8808 static void
8809 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
8810                                   struct ieee80211_channel *channel)
8811 {
8812         int ret;
8813         enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8814
8815         lockdep_assert_held(&ar->conf_mutex);
8816
8817         if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
8818             ar->rx_channel != channel)
8819                 return;
8820
8821         if (ar->scan.state != ATH11K_SCAN_IDLE) {
8822                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8823                            "ignoring bss chan info req while scanning..\n");
8824                 return;
8825         }
8826
8827         reinit_completion(&ar->bss_survey_done);
8828
8829         ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
8830         if (ret) {
8831                 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
8832                 return;
8833         }
8834
8835         ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8836         if (ret == 0)
8837                 ath11k_warn(ar->ab, "bss channel survey timed out\n");
8838 }
8839
8840 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8841                                     struct survey_info *survey)
8842 {
8843         struct ath11k *ar = hw->priv;
8844         struct ieee80211_supported_band *sband;
8845         struct survey_info *ar_survey;
8846         int ret = 0;
8847
8848         if (idx >= ATH11K_NUM_CHANS)
8849                 return -ENOENT;
8850
8851         ar_survey = &ar->survey[idx];
8852
8853         mutex_lock(&ar->conf_mutex);
8854
8855         sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8856         if (sband && idx >= sband->n_channels) {
8857                 idx -= sband->n_channels;
8858                 sband = NULL;
8859         }
8860
8861         if (!sband)
8862                 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8863         if (sband && idx >= sband->n_channels) {
8864                 idx -= sband->n_channels;
8865                 sband = NULL;
8866         }
8867
8868         if (!sband)
8869                 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8870         if (!sband || idx >= sband->n_channels) {
8871                 ret = -ENOENT;
8872                 goto exit;
8873         }
8874
8875         ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8876
8877         spin_lock_bh(&ar->data_lock);
8878         memcpy(survey, ar_survey, sizeof(*survey));
8879         spin_unlock_bh(&ar->data_lock);
8880
8881         survey->channel = &sband->channels[idx];
8882
8883         if (ar->rx_channel == survey->channel)
8884                 survey->filled |= SURVEY_INFO_IN_USE;
8885
8886 exit:
8887         mutex_unlock(&ar->conf_mutex);
8888         return ret;
8889 }
8890
8891 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8892                                       struct ath11k_sta *arsta,
8893                                       char *pre,
8894                                       bool clear)
8895 {
8896         struct ath11k *ar = arsta->arvif->ar;
8897         int i;
8898         s8 rssi;
8899
8900         for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8901                 sinfo->chains &= ~BIT(i);
8902                 rssi = arsta->chain_signal[i];
8903                 if (clear)
8904                         arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8905
8906                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8907                            "sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8908
8909                 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8910                     rssi != ATH11K_INVALID_RSSI_FULL &&
8911                     rssi != ATH11K_INVALID_RSSI_EMPTY &&
8912                     rssi != 0) {
8913                         sinfo->chain_signal[i] = rssi;
8914                         sinfo->chains |= BIT(i);
8915                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8916                 }
8917         }
8918 }
8919
8920 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8921                                          struct ieee80211_vif *vif,
8922                                          struct ieee80211_sta *sta,
8923                                          struct station_info *sinfo)
8924 {
8925         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8926         struct ath11k *ar = arsta->arvif->ar;
8927         s8 signal;
8928         bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8929                                ar->ab->wmi_ab.svc_map);
8930
8931         sinfo->rx_duration = arsta->rx_duration;
8932         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8933
8934         sinfo->tx_duration = arsta->tx_duration;
8935         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8936
8937         if (arsta->txrate.legacy || arsta->txrate.nss) {
8938                 if (arsta->txrate.legacy) {
8939                         sinfo->txrate.legacy = arsta->txrate.legacy;
8940                 } else {
8941                         sinfo->txrate.mcs = arsta->txrate.mcs;
8942                         sinfo->txrate.nss = arsta->txrate.nss;
8943                         sinfo->txrate.bw = arsta->txrate.bw;
8944                         sinfo->txrate.he_gi = arsta->txrate.he_gi;
8945                         sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8946                         sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8947                 }
8948                 sinfo->txrate.flags = arsta->txrate.flags;
8949                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8950         }
8951
8952         ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8953
8954         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8955             arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8956             ar->ab->hw_params.supports_rssi_stats &&
8957             !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8958                                          WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8959                 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8960         }
8961
8962         signal = arsta->rssi_comb;
8963         if (!signal &&
8964             arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8965             ar->ab->hw_params.supports_rssi_stats &&
8966             !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8967                                         WMI_REQUEST_VDEV_STAT)))
8968                 signal = arsta->rssi_beacon;
8969
8970         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8971                    "sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8972                    db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8973
8974         if (signal) {
8975                 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8976                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8977         }
8978
8979         sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
8980                 ATH11K_DEFAULT_NOISE_FLOOR;
8981         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8982 }
8983
8984 #if IS_ENABLED(CONFIG_IPV6)
8985 static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
8986                                        struct ath11k_arp_ns_offload *offload)
8987 {
8988         int i;
8989
8990         for (i = 0; i < offload->ipv6_count; i++) {
8991                 offload->self_ipv6_addr[i][0] = 0xff;
8992                 offload->self_ipv6_addr[i][1] = 0x02;
8993                 offload->self_ipv6_addr[i][11] = 0x01;
8994                 offload->self_ipv6_addr[i][12] = 0xff;
8995                 offload->self_ipv6_addr[i][13] =
8996                                         offload->ipv6_addr[i][13];
8997                 offload->self_ipv6_addr[i][14] =
8998                                         offload->ipv6_addr[i][14];
8999                 offload->self_ipv6_addr[i][15] =
9000                                         offload->ipv6_addr[i][15];
9001                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
9002                            offload->self_ipv6_addr[i]);
9003         }
9004 }
9005
9006 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
9007                                        struct ieee80211_vif *vif,
9008                                        struct inet6_dev *idev)
9009 {
9010         struct ath11k *ar = hw->priv;
9011         struct ath11k_arp_ns_offload *offload;
9012         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9013         struct inet6_ifaddr *ifa6;
9014         struct ifacaddr6 *ifaca6;
9015         struct list_head *p;
9016         u32 count, scope;
9017
9018         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n");
9019
9020         offload = &arvif->arp_ns_offload;
9021         count = 0;
9022
9023         read_lock_bh(&idev->lock);
9024
9025         memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
9026         memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
9027         memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
9028
9029         /* get unicast address */
9030         list_for_each(p, &idev->addr_list) {
9031                 if (count >= ATH11K_IPV6_MAX_COUNT)
9032                         goto generate;
9033
9034                 ifa6 = list_entry(p, struct inet6_ifaddr, if_list);
9035                 if (ifa6->flags & IFA_F_DADFAILED)
9036                         continue;
9037                 scope = ipv6_addr_src_scope(&ifa6->addr);
9038                 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
9039                     scope == IPV6_ADDR_SCOPE_GLOBAL) {
9040                         memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
9041                                sizeof(ifa6->addr.s6_addr));
9042                         offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
9043                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n",
9044                                    count, offload->ipv6_addr[count],
9045                                    scope);
9046                         count++;
9047                 } else {
9048                         ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
9049                 }
9050         }
9051
9052         /* get anycast address */
9053         for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) {
9054                 if (count >= ATH11K_IPV6_MAX_COUNT)
9055                         goto generate;
9056
9057                 scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
9058                 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
9059                     scope == IPV6_ADDR_SCOPE_GLOBAL) {
9060                         memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
9061                                sizeof(ifaca6->aca_addr));
9062                         offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
9063                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n",
9064                                    count, offload->ipv6_addr[count],
9065                                    scope);
9066                         count++;
9067                 } else {
9068                         ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
9069                 }
9070         }
9071
9072 generate:
9073         offload->ipv6_count = count;
9074         read_unlock_bh(&idev->lock);
9075
9076         /* generate ns multicast address */
9077         ath11k_generate_ns_mc_addr(ar, offload);
9078 }
9079 #endif
9080
9081 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
9082                                          struct ieee80211_vif *vif,
9083                                          struct cfg80211_gtk_rekey_data *data)
9084 {
9085         struct ath11k *ar = hw->priv;
9086         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9087         struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
9088
9089         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n",
9090                    arvif->vdev_id);
9091
9092         mutex_lock(&ar->conf_mutex);
9093
9094         memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
9095         memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
9096
9097         /* The supplicant works on big-endian, the firmware expects it on
9098          * little endian.
9099          */
9100         rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
9101
9102         arvif->rekey_data.enable_offload = true;
9103
9104         ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
9105                         rekey_data->kck, NL80211_KCK_LEN);
9106         ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
9107                         rekey_data->kck, NL80211_KEK_LEN);
9108         ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
9109                         &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
9110
9111         mutex_unlock(&ar->conf_mutex);
9112 }
9113
9114 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
9115                                             const struct cfg80211_sar_specs *sar)
9116 {
9117         struct ath11k *ar = hw->priv;
9118         const struct cfg80211_sar_sub_specs *sspec;
9119         int ret, index;
9120         u8 *sar_tbl;
9121         u32 i;
9122
9123         if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
9124             sar->num_sub_specs == 0)
9125                 return -EINVAL;
9126
9127         mutex_lock(&ar->conf_mutex);
9128
9129         if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
9130             !ar->ab->hw_params.bios_sar_capa) {
9131                 ret = -EOPNOTSUPP;
9132                 goto exit;
9133         }
9134
9135         ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
9136         if (ret) {
9137                 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
9138                 goto exit;
9139         }
9140
9141         sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
9142         if (!sar_tbl) {
9143                 ret = -ENOMEM;
9144                 goto exit;
9145         }
9146
9147         sspec = sar->sub_specs;
9148         for (i = 0; i < sar->num_sub_specs; i++) {
9149                 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
9150                         ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
9151                                     sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
9152                         continue;
9153                 }
9154
9155                 /* chain0 and chain1 share same power setting */
9156                 sar_tbl[sspec->freq_range_index] = sspec->power;
9157                 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
9158                 sar_tbl[index] = sspec->power;
9159                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
9160                            sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
9161                 sspec++;
9162         }
9163
9164         ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
9165         if (ret)
9166                 ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
9167
9168         kfree(sar_tbl);
9169 exit:
9170         mutex_unlock(&ar->conf_mutex);
9171
9172         return ret;
9173 }
9174
9175 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
9176                                                   struct ieee80211_vif *vif)
9177 {
9178         struct ath11k *ar = hw->priv;
9179
9180         mutex_lock(&ar->conf_mutex);
9181
9182         spin_lock_bh(&ar->data_lock);
9183         ar->scan.roc_notify = false;
9184         spin_unlock_bh(&ar->data_lock);
9185
9186         ath11k_scan_abort(ar);
9187
9188         mutex_unlock(&ar->conf_mutex);
9189
9190         cancel_delayed_work_sync(&ar->scan.timeout);
9191
9192         return 0;
9193 }
9194
9195 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
9196                                            struct ieee80211_vif *vif,
9197                                            struct ieee80211_channel *chan,
9198                                            int duration,
9199                                            enum ieee80211_roc_type type)
9200 {
9201         struct ath11k *ar = hw->priv;
9202         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9203         struct scan_req_params *arg;
9204         int ret;
9205         u32 scan_time_msec;
9206
9207         mutex_lock(&ar->conf_mutex);
9208
9209         spin_lock_bh(&ar->data_lock);
9210         switch (ar->scan.state) {
9211         case ATH11K_SCAN_IDLE:
9212                 reinit_completion(&ar->scan.started);
9213                 reinit_completion(&ar->scan.completed);
9214                 reinit_completion(&ar->scan.on_channel);
9215                 ar->scan.state = ATH11K_SCAN_STARTING;
9216                 ar->scan.is_roc = true;
9217                 ar->scan.vdev_id = arvif->vdev_id;
9218                 ar->scan.roc_freq = chan->center_freq;
9219                 ar->scan.roc_notify = true;
9220                 ret = 0;
9221                 break;
9222         case ATH11K_SCAN_STARTING:
9223         case ATH11K_SCAN_RUNNING:
9224         case ATH11K_SCAN_ABORTING:
9225                 ret = -EBUSY;
9226                 break;
9227         }
9228         spin_unlock_bh(&ar->data_lock);
9229
9230         if (ret)
9231                 goto exit;
9232
9233         scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
9234
9235         arg = kzalloc(sizeof(*arg), GFP_KERNEL);
9236         if (!arg) {
9237                 ret = -ENOMEM;
9238                 goto exit;
9239         }
9240         ath11k_wmi_start_scan_init(ar, arg);
9241         arg->num_chan = 1;
9242         arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
9243                                  GFP_KERNEL);
9244         if (!arg->chan_list) {
9245                 ret = -ENOMEM;
9246                 goto free_arg;
9247         }
9248
9249         arg->vdev_id = arvif->vdev_id;
9250         arg->scan_id = ATH11K_SCAN_ID;
9251         arg->chan_list[0] = chan->center_freq;
9252         arg->dwell_time_active = scan_time_msec;
9253         arg->dwell_time_passive = scan_time_msec;
9254         arg->max_scan_time = scan_time_msec;
9255         arg->scan_f_passive = 1;
9256         arg->scan_f_filter_prb_req = 1;
9257         arg->burst_duration = duration;
9258
9259         ret = ath11k_start_scan(ar, arg);
9260         if (ret) {
9261                 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
9262
9263                 spin_lock_bh(&ar->data_lock);
9264                 ar->scan.state = ATH11K_SCAN_IDLE;
9265                 spin_unlock_bh(&ar->data_lock);
9266                 goto free_chan_list;
9267         }
9268
9269         ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
9270         if (ret == 0) {
9271                 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
9272                 ret = ath11k_scan_stop(ar);
9273                 if (ret)
9274                         ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
9275                 ret = -ETIMEDOUT;
9276                 goto free_chan_list;
9277         }
9278
9279         ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
9280                                      msecs_to_jiffies(duration));
9281
9282         ret = 0;
9283
9284 free_chan_list:
9285         kfree(arg->chan_list);
9286 free_arg:
9287         kfree(arg);
9288 exit:
9289         mutex_unlock(&ar->conf_mutex);
9290         return ret;
9291 }
9292
9293 static int ath11k_fw_stats_request(struct ath11k *ar,
9294                                    struct stats_request_params *req_param)
9295 {
9296         struct ath11k_base *ab = ar->ab;
9297         unsigned long time_left;
9298         int ret;
9299
9300         lockdep_assert_held(&ar->conf_mutex);
9301
9302         spin_lock_bh(&ar->data_lock);
9303         ar->fw_stats_done = false;
9304         ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
9305         spin_unlock_bh(&ar->data_lock);
9306
9307         reinit_completion(&ar->fw_stats_complete);
9308
9309         ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
9310         if (ret) {
9311                 ath11k_warn(ab, "could not request fw stats (%d)\n",
9312                             ret);
9313                 return ret;
9314         }
9315
9316         time_left = wait_for_completion_timeout(&ar->fw_stats_complete,
9317                                                 1 * HZ);
9318
9319         if (!time_left)
9320                 return -ETIMEDOUT;
9321
9322         return 0;
9323 }
9324
9325 static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
9326                                      struct ieee80211_vif *vif,
9327                                      int *dbm)
9328 {
9329         struct ath11k *ar = hw->priv;
9330         struct ath11k_base *ab = ar->ab;
9331         struct stats_request_params req_param = {0};
9332         struct ath11k_fw_stats_pdev *pdev;
9333         int ret;
9334
9335         /* Final Tx power is minimum of Target Power, CTL power, Regulatory
9336          * Power, PSD EIRP Power. We just know the Regulatory power from the
9337          * regulatory rules obtained. FW knows all these power and sets the min
9338          * of these. Hence, we request the FW pdev stats in which FW reports
9339          * the minimum of all vdev's channel Tx power.
9340          */
9341         mutex_lock(&ar->conf_mutex);
9342
9343         if (ar->state != ATH11K_STATE_ON)
9344                 goto err_fallback;
9345
9346         /* Firmware doesn't provide Tx power during CAC hence no need to fetch
9347          * the stats.
9348          */
9349         if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
9350                 mutex_unlock(&ar->conf_mutex);
9351                 return -EAGAIN;
9352         }
9353
9354         req_param.pdev_id = ar->pdev->pdev_id;
9355         req_param.stats_id = WMI_REQUEST_PDEV_STAT;
9356
9357         ret = ath11k_fw_stats_request(ar, &req_param);
9358         if (ret) {
9359                 ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
9360                 goto err_fallback;
9361         }
9362
9363         spin_lock_bh(&ar->data_lock);
9364         pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
9365                                         struct ath11k_fw_stats_pdev, list);
9366         if (!pdev) {
9367                 spin_unlock_bh(&ar->data_lock);
9368                 goto err_fallback;
9369         }
9370
9371         /* tx power is set as 2 units per dBm in FW. */
9372         *dbm = pdev->chan_tx_power / 2;
9373
9374         spin_unlock_bh(&ar->data_lock);
9375         mutex_unlock(&ar->conf_mutex);
9376
9377         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
9378                    pdev->chan_tx_power, *dbm);
9379         return 0;
9380
9381 err_fallback:
9382         mutex_unlock(&ar->conf_mutex);
9383         /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
9384         *dbm = vif->bss_conf.txpower;
9385         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
9386                    *dbm);
9387         return 0;
9388 }
9389
9390 static int ath11k_mac_station_add(struct ath11k *ar,
9391                                   struct ieee80211_vif *vif,
9392                                   struct ieee80211_sta *sta)
9393 {
9394         struct ath11k_base *ab = ar->ab;
9395         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9396         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9397         struct peer_create_params peer_param;
9398         int ret;
9399
9400         lockdep_assert_held(&ar->conf_mutex);
9401
9402         ret = ath11k_mac_inc_num_stations(arvif, sta);
9403         if (ret) {
9404                 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
9405                             ar->max_num_stations);
9406                 goto exit;
9407         }
9408
9409         arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
9410         if (!arsta->rx_stats) {
9411                 ret = -ENOMEM;
9412                 goto dec_num_station;
9413         }
9414
9415         peer_param.vdev_id = arvif->vdev_id;
9416         peer_param.peer_addr = sta->addr;
9417         peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9418
9419         ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
9420         if (ret) {
9421                 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
9422                             sta->addr, arvif->vdev_id);
9423                 goto free_rx_stats;
9424         }
9425
9426         ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
9427                    sta->addr, arvif->vdev_id);
9428
9429         if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
9430                 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
9431                 if (!arsta->tx_stats) {
9432                         ret = -ENOMEM;
9433                         goto free_peer;
9434                 }
9435         }
9436
9437         if (ieee80211_vif_is_mesh(vif)) {
9438                 ath11k_dbg(ab, ATH11K_DBG_MAC,
9439                            "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
9440                 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
9441                                                 arvif->vdev_id,
9442                                                 WMI_PEER_USE_4ADDR, 1);
9443                 if (ret) {
9444                         ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
9445                                     sta->addr, ret);
9446                         goto free_tx_stats;
9447                 }
9448         }
9449
9450         ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
9451         if (ret) {
9452                 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
9453                             sta->addr, arvif->vdev_id, ret);
9454                 goto free_tx_stats;
9455         }
9456
9457         if (ab->hw_params.vdev_start_delay &&
9458             !arvif->is_started &&
9459             arvif->vdev_type != WMI_VDEV_TYPE_AP) {
9460                 ret = ath11k_mac_start_vdev_delay(ar->hw, vif);
9461                 if (ret) {
9462                         ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
9463                         goto free_tx_stats;
9464                 }
9465         }
9466
9467         ewma_avg_rssi_init(&arsta->avg_rssi);
9468         return 0;
9469
9470 free_tx_stats:
9471         kfree(arsta->tx_stats);
9472         arsta->tx_stats = NULL;
9473 free_peer:
9474         ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
9475 free_rx_stats:
9476         kfree(arsta->rx_stats);
9477         arsta->rx_stats = NULL;
9478 dec_num_station:
9479         ath11k_mac_dec_num_stations(arvif, sta);
9480 exit:
9481         return ret;
9482 }
9483
9484 static int ath11k_mac_station_remove(struct ath11k *ar,
9485                                      struct ieee80211_vif *vif,
9486                                      struct ieee80211_sta *sta)
9487 {
9488         struct ath11k_base *ab = ar->ab;
9489         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9490         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9491         int ret;
9492
9493         if (ab->hw_params.vdev_start_delay &&
9494             arvif->is_started &&
9495             arvif->vdev_type != WMI_VDEV_TYPE_AP) {
9496                 ret = ath11k_mac_stop_vdev_early(ar->hw, vif);
9497                 if (ret) {
9498                         ath11k_warn(ab, "failed to do early vdev stop: %d\n", ret);
9499                         return ret;
9500                 }
9501         }
9502
9503         ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
9504
9505         ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
9506         if (ret)
9507                 ath11k_warn(ab, "Failed to delete peer: %pM for VDEV: %d\n",
9508                             sta->addr, arvif->vdev_id);
9509         else
9510                 ath11k_dbg(ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
9511                            sta->addr, arvif->vdev_id);
9512
9513         ath11k_mac_dec_num_stations(arvif, sta);
9514
9515         kfree(arsta->tx_stats);
9516         arsta->tx_stats = NULL;
9517
9518         kfree(arsta->rx_stats);
9519         arsta->rx_stats = NULL;
9520
9521         return ret;
9522 }
9523
9524 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
9525                                    struct ieee80211_vif *vif,
9526                                    struct ieee80211_sta *sta,
9527                                    enum ieee80211_sta_state old_state,
9528                                    enum ieee80211_sta_state new_state)
9529 {
9530         struct ath11k *ar = hw->priv;
9531         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
9532         struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
9533         struct ath11k_peer *peer;
9534         int ret = 0;
9535
9536         /* cancel must be done outside the mutex to avoid deadlock */
9537         if ((old_state == IEEE80211_STA_NONE &&
9538              new_state == IEEE80211_STA_NOTEXIST)) {
9539                 cancel_work_sync(&arsta->update_wk);
9540                 cancel_work_sync(&arsta->set_4addr_wk);
9541         }
9542
9543         mutex_lock(&ar->conf_mutex);
9544
9545         if (old_state == IEEE80211_STA_NOTEXIST &&
9546             new_state == IEEE80211_STA_NONE) {
9547                 memset(arsta, 0, sizeof(*arsta));
9548                 arsta->arvif = arvif;
9549                 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
9550                 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
9551                 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
9552
9553                 ret = ath11k_mac_station_add(ar, vif, sta);
9554                 if (ret)
9555                         ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
9556                                     sta->addr, arvif->vdev_id);
9557         } else if ((old_state == IEEE80211_STA_NONE &&
9558                     new_state == IEEE80211_STA_NOTEXIST)) {
9559                 ret = ath11k_mac_station_remove(ar, vif, sta);
9560                 if (ret)
9561                         ath11k_warn(ar->ab, "Failed to remove station: %pM for VDEV: %d\n",
9562                                     sta->addr, arvif->vdev_id);
9563
9564                 mutex_lock(&ar->ab->tbl_mtx_lock);
9565                 spin_lock_bh(&ar->ab->base_lock);
9566                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9567                 if (peer && peer->sta == sta) {
9568                         ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
9569                                     vif->addr, arvif->vdev_id);
9570                         ath11k_peer_rhash_delete(ar->ab, peer);
9571                         peer->sta = NULL;
9572                         list_del(&peer->list);
9573                         kfree(peer);
9574                         ar->num_peers--;
9575                 }
9576                 spin_unlock_bh(&ar->ab->base_lock);
9577                 mutex_unlock(&ar->ab->tbl_mtx_lock);
9578         } else if (old_state == IEEE80211_STA_AUTH &&
9579                    new_state == IEEE80211_STA_ASSOC &&
9580                    (vif->type == NL80211_IFTYPE_AP ||
9581                     vif->type == NL80211_IFTYPE_MESH_POINT ||
9582                     vif->type == NL80211_IFTYPE_ADHOC)) {
9583                 ret = ath11k_station_assoc(ar, vif, sta, false);
9584                 if (ret)
9585                         ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
9586                                     sta->addr);
9587
9588                 spin_lock_bh(&ar->data_lock);
9589                 /* Set arsta bw and prev bw */
9590                 arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
9591                 arsta->bw_prev = arsta->bw;
9592                 spin_unlock_bh(&ar->data_lock);
9593         } else if (old_state == IEEE80211_STA_ASSOC &&
9594                    new_state == IEEE80211_STA_AUTHORIZED) {
9595                 spin_lock_bh(&ar->ab->base_lock);
9596
9597                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9598                 if (peer)
9599                         peer->is_authorized = true;
9600
9601                 spin_unlock_bh(&ar->ab->base_lock);
9602
9603                 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
9604                         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
9605                                                         arvif->vdev_id,
9606                                                         WMI_PEER_AUTHORIZE,
9607                                                         1);
9608                         if (ret)
9609                                 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
9610                                             sta->addr, arvif->vdev_id, ret);
9611                 }
9612         } else if (old_state == IEEE80211_STA_AUTHORIZED &&
9613                    new_state == IEEE80211_STA_ASSOC) {
9614                 spin_lock_bh(&ar->ab->base_lock);
9615
9616                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
9617                 if (peer)
9618                         peer->is_authorized = false;
9619
9620                 spin_unlock_bh(&ar->ab->base_lock);
9621         } else if (old_state == IEEE80211_STA_ASSOC &&
9622                    new_state == IEEE80211_STA_AUTH &&
9623                    (vif->type == NL80211_IFTYPE_AP ||
9624                     vif->type == NL80211_IFTYPE_MESH_POINT ||
9625                     vif->type == NL80211_IFTYPE_ADHOC)) {
9626                 ret = ath11k_station_disassoc(ar, vif, sta);
9627                 if (ret)
9628                         ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
9629                                     sta->addr);
9630         }
9631
9632         mutex_unlock(&ar->conf_mutex);
9633         return ret;
9634 }
9635
9636 static const struct ieee80211_ops ath11k_ops = {
9637         .tx                             = ath11k_mac_op_tx,
9638         .wake_tx_queue                  = ieee80211_handle_wake_tx_queue,
9639         .start                          = ath11k_mac_op_start,
9640         .stop                           = ath11k_mac_op_stop,
9641         .reconfig_complete              = ath11k_mac_op_reconfig_complete,
9642         .add_interface                  = ath11k_mac_op_add_interface,
9643         .remove_interface               = ath11k_mac_op_remove_interface,
9644         .update_vif_offload             = ath11k_mac_op_update_vif_offload,
9645         .config                         = ath11k_mac_op_config,
9646         .bss_info_changed               = ath11k_mac_op_bss_info_changed,
9647         .configure_filter               = ath11k_mac_op_configure_filter,
9648         .hw_scan                        = ath11k_mac_op_hw_scan,
9649         .cancel_hw_scan                 = ath11k_mac_op_cancel_hw_scan,
9650         .set_key                        = ath11k_mac_op_set_key,
9651         .set_rekey_data                 = ath11k_mac_op_set_rekey_data,
9652         .sta_state                      = ath11k_mac_op_sta_state,
9653         .sta_set_4addr                  = ath11k_mac_op_sta_set_4addr,
9654         .sta_set_txpwr                  = ath11k_mac_op_sta_set_txpwr,
9655         .sta_rc_update                  = ath11k_mac_op_sta_rc_update,
9656         .conf_tx                        = ath11k_mac_op_conf_tx,
9657         .set_antenna                    = ath11k_mac_op_set_antenna,
9658         .get_antenna                    = ath11k_mac_op_get_antenna,
9659         .ampdu_action                   = ath11k_mac_op_ampdu_action,
9660         .add_chanctx                    = ath11k_mac_op_add_chanctx,
9661         .remove_chanctx                 = ath11k_mac_op_remove_chanctx,
9662         .change_chanctx                 = ath11k_mac_op_change_chanctx,
9663         .assign_vif_chanctx             = ath11k_mac_op_assign_vif_chanctx,
9664         .unassign_vif_chanctx           = ath11k_mac_op_unassign_vif_chanctx,
9665         .switch_vif_chanctx             = ath11k_mac_op_switch_vif_chanctx,
9666         .set_rts_threshold              = ath11k_mac_op_set_rts_threshold,
9667         .set_frag_threshold             = ath11k_mac_op_set_frag_threshold,
9668         .set_bitrate_mask               = ath11k_mac_op_set_bitrate_mask,
9669         .get_survey                     = ath11k_mac_op_get_survey,
9670         .flush                          = ath11k_mac_op_flush,
9671         .sta_statistics                 = ath11k_mac_op_sta_statistics,
9672         CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
9673
9674 #ifdef CONFIG_PM
9675         .suspend                        = ath11k_wow_op_suspend,
9676         .resume                         = ath11k_wow_op_resume,
9677         .set_wakeup                     = ath11k_wow_op_set_wakeup,
9678 #endif
9679
9680 #ifdef CONFIG_ATH11K_DEBUGFS
9681         .vif_add_debugfs                = ath11k_debugfs_op_vif_add,
9682         .sta_add_debugfs                = ath11k_debugfs_sta_op_add,
9683 #endif
9684
9685 #if IS_ENABLED(CONFIG_IPV6)
9686         .ipv6_addr_change = ath11k_mac_op_ipv6_changed,
9687 #endif
9688         .get_txpower                    = ath11k_mac_op_get_txpower,
9689
9690         .set_sar_specs                  = ath11k_mac_op_set_bios_sar_specs,
9691         .remain_on_channel              = ath11k_mac_op_remain_on_channel,
9692         .cancel_remain_on_channel       = ath11k_mac_op_cancel_remain_on_channel,
9693 };
9694
9695 static void ath11k_mac_update_ch_list(struct ath11k *ar,
9696                                       struct ieee80211_supported_band *band,
9697                                       u32 freq_low, u32 freq_high)
9698 {
9699         int i;
9700
9701         if (!(freq_low && freq_high))
9702                 return;
9703
9704         for (i = 0; i < band->n_channels; i++) {
9705                 if (band->channels[i].center_freq < freq_low ||
9706                     band->channels[i].center_freq > freq_high)
9707                         band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
9708         }
9709 }
9710
9711 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
9712 {
9713         struct ath11k_pdev *pdev = ar->pdev;
9714         struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
9715
9716         if (band == WMI_HOST_WLAN_2G_CAP)
9717                 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
9718
9719         if (band == WMI_HOST_WLAN_5G_CAP)
9720                 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
9721
9722         ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
9723
9724         return 0;
9725 }
9726
9727 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
9728                                            u32 supported_bands)
9729 {
9730         struct ieee80211_supported_band *band;
9731         struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
9732         void *channels;
9733         u32 phy_id;
9734
9735         BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
9736                       ARRAY_SIZE(ath11k_5ghz_channels) +
9737                       ARRAY_SIZE(ath11k_6ghz_channels)) !=
9738                      ATH11K_NUM_CHANS);
9739
9740         reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
9741         temp_reg_cap = reg_cap;
9742
9743         if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
9744                 channels = kmemdup(ath11k_2ghz_channels,
9745                                    sizeof(ath11k_2ghz_channels),
9746                                    GFP_KERNEL);
9747                 if (!channels)
9748                         return -ENOMEM;
9749
9750                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9751                 band->band = NL80211_BAND_2GHZ;
9752                 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
9753                 band->channels = channels;
9754                 band->n_bitrates = ath11k_g_rates_size;
9755                 band->bitrates = ath11k_g_rates;
9756                 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9757
9758                 if (ar->ab->hw_params.single_pdev_only) {
9759                         phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
9760                         temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9761                 }
9762                 ath11k_mac_update_ch_list(ar, band,
9763                                           temp_reg_cap->low_2ghz_chan,
9764                                           temp_reg_cap->high_2ghz_chan);
9765         }
9766
9767         if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
9768                 if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) {
9769                         channels = kmemdup(ath11k_6ghz_channels,
9770                                            sizeof(ath11k_6ghz_channels), GFP_KERNEL);
9771                         if (!channels) {
9772                                 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9773                                 return -ENOMEM;
9774                         }
9775
9776                         ar->supports_6ghz = true;
9777                         band = &ar->mac.sbands[NL80211_BAND_6GHZ];
9778                         band->band = NL80211_BAND_6GHZ;
9779                         band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
9780                         band->channels = channels;
9781                         band->n_bitrates = ath11k_a_rates_size;
9782                         band->bitrates = ath11k_a_rates;
9783                         ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
9784
9785                         if (ar->ab->hw_params.single_pdev_only) {
9786                                 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9787                                 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9788                         }
9789
9790                         ath11k_mac_update_ch_list(ar, band,
9791                                                   temp_reg_cap->low_5ghz_chan,
9792                                                   temp_reg_cap->high_5ghz_chan);
9793                 }
9794
9795                 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
9796                         channels = kmemdup(ath11k_5ghz_channels,
9797                                            sizeof(ath11k_5ghz_channels),
9798                                            GFP_KERNEL);
9799                         if (!channels) {
9800                                 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9801                                 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9802                                 return -ENOMEM;
9803                         }
9804
9805                         band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9806                         band->band = NL80211_BAND_5GHZ;
9807                         band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
9808                         band->channels = channels;
9809                         band->n_bitrates = ath11k_a_rates_size;
9810                         band->bitrates = ath11k_a_rates;
9811                         ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9812
9813                         if (ar->ab->hw_params.single_pdev_only) {
9814                                 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9815                                 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9816                         }
9817
9818                         ath11k_mac_update_ch_list(ar, band,
9819                                                   temp_reg_cap->low_5ghz_chan,
9820                                                   temp_reg_cap->high_5ghz_chan);
9821                 }
9822         }
9823
9824         return 0;
9825 }
9826
9827 static void ath11k_mac_setup_mac_address_list(struct ath11k *ar)
9828 {
9829         struct mac_address *addresses;
9830         u16 n_addresses;
9831         int i;
9832
9833         if (!ar->ab->hw_params.support_dual_stations)
9834                 return;
9835
9836         n_addresses = ar->ab->hw_params.num_vdevs;
9837         addresses = kcalloc(n_addresses, sizeof(*addresses), GFP_KERNEL);
9838         if (!addresses)
9839                 return;
9840
9841         memcpy(addresses[0].addr, ar->mac_addr, ETH_ALEN);
9842         for (i = 1; i < n_addresses; i++) {
9843                 memcpy(addresses[i].addr, ar->mac_addr, ETH_ALEN);
9844                 /* set Local Administered Address bit */
9845                 addresses[i].addr[0] |= 0x2;
9846
9847                 addresses[i].addr[0] += (i - 1) << 4;
9848         }
9849
9850         ar->hw->wiphy->addresses = addresses;
9851         ar->hw->wiphy->n_addresses = n_addresses;
9852 }
9853
9854 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
9855 {
9856         struct ath11k_base *ab = ar->ab;
9857         struct ieee80211_iface_combination *combinations;
9858         struct ieee80211_iface_limit *limits;
9859         int n_limits;
9860
9861         combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
9862         if (!combinations)
9863                 return -ENOMEM;
9864
9865         n_limits = 2;
9866
9867         limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
9868         if (!limits) {
9869                 kfree(combinations);
9870                 return -ENOMEM;
9871         }
9872
9873         if (ab->hw_params.support_dual_stations) {
9874                 limits[0].max = 2;
9875                 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9876
9877                 limits[1].max = 1;
9878                 limits[1].types |= BIT(NL80211_IFTYPE_AP);
9879                 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9880                     ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9881                         limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9882
9883                 combinations[0].limits = limits;
9884                 combinations[0].n_limits = 2;
9885                 combinations[0].max_interfaces = ab->hw_params.num_vdevs;
9886                 combinations[0].num_different_channels = 2;
9887                 combinations[0].beacon_int_infra_match = true;
9888                 combinations[0].beacon_int_min_gcd = 100;
9889         } else {
9890                 limits[0].max = 1;
9891                 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9892
9893                 limits[1].max = 16;
9894                 limits[1].types |= BIT(NL80211_IFTYPE_AP);
9895
9896                 if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9897                     ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9898                         limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9899
9900                 combinations[0].limits = limits;
9901                 combinations[0].n_limits = 2;
9902                 combinations[0].max_interfaces = 16;
9903                 combinations[0].num_different_channels = 1;
9904                 combinations[0].beacon_int_infra_match = true;
9905                 combinations[0].beacon_int_min_gcd = 100;
9906                 combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9907                                                         BIT(NL80211_CHAN_WIDTH_20) |
9908                                                         BIT(NL80211_CHAN_WIDTH_40) |
9909                                                         BIT(NL80211_CHAN_WIDTH_80) |
9910                                                         BIT(NL80211_CHAN_WIDTH_80P80) |
9911                                                         BIT(NL80211_CHAN_WIDTH_160);
9912         }
9913
9914         ar->hw->wiphy->iface_combinations = combinations;
9915         ar->hw->wiphy->n_iface_combinations = 1;
9916
9917         return 0;
9918 }
9919
9920 static const u8 ath11k_if_types_ext_capa[] = {
9921         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9922         [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9923         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9924 };
9925
9926 static const u8 ath11k_if_types_ext_capa_sta[] = {
9927         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9928         [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9929         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9930         [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
9931 };
9932
9933 static const u8 ath11k_if_types_ext_capa_ap[] = {
9934         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9935         [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9936         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9937         [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
9938         [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
9939 };
9940
9941 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
9942         {
9943                 .extended_capabilities = ath11k_if_types_ext_capa,
9944                 .extended_capabilities_mask = ath11k_if_types_ext_capa,
9945                 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
9946         }, {
9947                 .iftype = NL80211_IFTYPE_STATION,
9948                 .extended_capabilities = ath11k_if_types_ext_capa_sta,
9949                 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
9950                 .extended_capabilities_len =
9951                                 sizeof(ath11k_if_types_ext_capa_sta),
9952         }, {
9953                 .iftype = NL80211_IFTYPE_AP,
9954                 .extended_capabilities = ath11k_if_types_ext_capa_ap,
9955                 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
9956                 .extended_capabilities_len =
9957                                 sizeof(ath11k_if_types_ext_capa_ap),
9958         },
9959 };
9960
9961 static void __ath11k_mac_unregister(struct ath11k *ar)
9962 {
9963         cancel_work_sync(&ar->regd_update_work);
9964
9965         ieee80211_unregister_hw(ar->hw);
9966
9967         idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
9968         idr_destroy(&ar->txmgmt_idr);
9969
9970         kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9971         kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9972         kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9973
9974         kfree(ar->hw->wiphy->iface_combinations[0].limits);
9975         kfree(ar->hw->wiphy->iface_combinations);
9976
9977         kfree(ar->hw->wiphy->addresses);
9978
9979         SET_IEEE80211_DEV(ar->hw, NULL);
9980 }
9981
9982 void ath11k_mac_unregister(struct ath11k_base *ab)
9983 {
9984         struct ath11k *ar;
9985         struct ath11k_pdev *pdev;
9986         int i;
9987
9988         for (i = 0; i < ab->num_radios; i++) {
9989                 pdev = &ab->pdevs[i];
9990                 ar = pdev->ar;
9991                 if (!ar)
9992                         continue;
9993
9994                 __ath11k_mac_unregister(ar);
9995         }
9996
9997         ath11k_peer_rhash_tbl_destroy(ab);
9998 }
9999
10000 static int __ath11k_mac_register(struct ath11k *ar)
10001 {
10002         struct ath11k_base *ab = ar->ab;
10003         struct ath11k_pdev_cap *cap = &ar->pdev->cap;
10004         static const u32 cipher_suites[] = {
10005                 WLAN_CIPHER_SUITE_TKIP,
10006                 WLAN_CIPHER_SUITE_CCMP,
10007                 WLAN_CIPHER_SUITE_AES_CMAC,
10008                 WLAN_CIPHER_SUITE_BIP_CMAC_256,
10009                 WLAN_CIPHER_SUITE_BIP_GMAC_128,
10010                 WLAN_CIPHER_SUITE_BIP_GMAC_256,
10011                 WLAN_CIPHER_SUITE_GCMP,
10012                 WLAN_CIPHER_SUITE_GCMP_256,
10013                 WLAN_CIPHER_SUITE_CCMP_256,
10014         };
10015         int ret;
10016         u32 ht_cap = 0;
10017
10018         ath11k_pdev_caps_update(ar);
10019
10020         SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
10021         ath11k_mac_setup_mac_address_list(ar);
10022
10023         SET_IEEE80211_DEV(ar->hw, ab->dev);
10024
10025         ret = ath11k_mac_setup_channels_rates(ar,
10026                                               cap->supported_bands);
10027         if (ret)
10028                 goto err;
10029
10030         ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
10031         ath11k_mac_setup_he_cap(ar, cap);
10032
10033         ret = ath11k_mac_setup_iface_combinations(ar);
10034         if (ret) {
10035                 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
10036                 goto err_free_channels;
10037         }
10038
10039         ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
10040         ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
10041
10042         ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
10043
10044         if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
10045                 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
10046
10047         if (ab->hw_params.supports_multi_bssid) {
10048                 ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
10049                 ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
10050         }
10051
10052         ieee80211_hw_set(ar->hw, SIGNAL_DBM);
10053         ieee80211_hw_set(ar->hw, SUPPORTS_PS);
10054         ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
10055         ieee80211_hw_set(ar->hw, MFP_CAPABLE);
10056         ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
10057         ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
10058         ieee80211_hw_set(ar->hw, AP_LINK_PS);
10059         ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
10060         ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
10061         ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
10062         ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
10063         ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
10064         ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
10065         ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
10066         ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
10067
10068         if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
10069                 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
10070                 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
10071         }
10072
10073         if (cap->nss_ratio_enabled)
10074                 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
10075
10076         if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
10077                 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
10078                 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
10079                 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
10080                 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
10081                 ieee80211_hw_set(ar->hw, USES_RSS);
10082         }
10083
10084         ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
10085         ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
10086
10087         /* TODO: Check if HT capability advertised from firmware is different
10088          * for each band for a dual band capable radio. It will be tricky to
10089          * handle it when the ht capability different for each band.
10090          */
10091         if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
10092             (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
10093                 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
10094
10095         ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
10096         ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
10097
10098         ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
10099
10100         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
10101         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
10102         ar->hw->wiphy->max_remain_on_channel_duration = 5000;
10103
10104         ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
10105         ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
10106                                    NL80211_FEATURE_AP_SCAN;
10107
10108         ar->max_num_stations = TARGET_NUM_STATIONS(ab);
10109         ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
10110
10111         ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
10112
10113         if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
10114                 ar->hw->wiphy->features |=
10115                         NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
10116         }
10117
10118         if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
10119                 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
10120                 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
10121                 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
10122                 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
10123                 ar->hw->wiphy->max_sched_scan_plan_interval =
10124                         WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
10125                 ar->hw->wiphy->max_sched_scan_plan_iterations =
10126                         WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
10127                 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
10128         }
10129
10130         ret = ath11k_wow_init(ar);
10131         if (ret) {
10132                 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
10133                 goto err_free_if_combs;
10134         }
10135
10136         if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI,
10137                      ar->ab->wmi_ab.svc_map))
10138                 wiphy_ext_feature_set(ar->hw->wiphy,
10139                                       NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
10140
10141         ar->hw->queues = ATH11K_HW_MAX_QUEUES;
10142         ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
10143         ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
10144         ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
10145
10146         ar->hw->vif_data_size = sizeof(struct ath11k_vif);
10147         ar->hw->sta_data_size = sizeof(struct ath11k_sta);
10148
10149         wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
10150         wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
10151         if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
10152                      ar->ab->wmi_ab.svc_map)) {
10153                 wiphy_ext_feature_set(ar->hw->wiphy,
10154                                       NL80211_EXT_FEATURE_BSS_COLOR);
10155                 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
10156         }
10157
10158         ar->hw->wiphy->cipher_suites = cipher_suites;
10159         ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
10160
10161         ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
10162         ar->hw->wiphy->num_iftype_ext_capab =
10163                 ARRAY_SIZE(ath11k_iftypes_ext_capa);
10164
10165         if (ar->supports_6ghz) {
10166                 wiphy_ext_feature_set(ar->hw->wiphy,
10167                                       NL80211_EXT_FEATURE_FILS_DISCOVERY);
10168                 wiphy_ext_feature_set(ar->hw->wiphy,
10169                                       NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
10170         }
10171
10172         wiphy_ext_feature_set(ar->hw->wiphy,
10173                               NL80211_EXT_FEATURE_SET_SCAN_DWELL);
10174
10175         if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map))
10176                 wiphy_ext_feature_set(ar->hw->wiphy,
10177                                       NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
10178
10179         ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab);
10180         ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
10181
10182         ath11k_reg_init(ar);
10183
10184         if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
10185                 ar->hw->netdev_features = NETIF_F_HW_CSUM;
10186                 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
10187                 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
10188         }
10189
10190         if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
10191             ab->hw_params.bios_sar_capa)
10192                 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
10193
10194         ret = ieee80211_register_hw(ar->hw);
10195         if (ret) {
10196                 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
10197                 goto err_free_if_combs;
10198         }
10199
10200         if (!ab->hw_params.supports_monitor)
10201                 /* There's a race between calling ieee80211_register_hw()
10202                  * and here where the monitor mode is enabled for a little
10203                  * while. But that time is so short and in practise it make
10204                  * a difference in real life.
10205                  */
10206                 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
10207
10208         /* Apply the regd received during initialization */
10209         ret = ath11k_regd_update(ar);
10210         if (ret) {
10211                 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
10212                 goto err_unregister_hw;
10213         }
10214
10215         if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
10216                 struct wmi_set_current_country_params set_current_param = {};
10217
10218                 memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
10219                 memcpy(&ar->alpha2, ab->new_alpha2, 2);
10220                 ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
10221                 if (ret)
10222                         ath11k_warn(ar->ab,
10223                                     "failed set cc code for mac register: %d\n", ret);
10224         }
10225
10226         ret = ath11k_debugfs_register(ar);
10227         if (ret) {
10228                 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
10229                 goto err_unregister_hw;
10230         }
10231
10232         return 0;
10233
10234 err_unregister_hw:
10235         ieee80211_unregister_hw(ar->hw);
10236
10237 err_free_if_combs:
10238         kfree(ar->hw->wiphy->iface_combinations[0].limits);
10239         kfree(ar->hw->wiphy->iface_combinations);
10240
10241 err_free_channels:
10242         kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
10243         kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
10244         kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
10245
10246 err:
10247         SET_IEEE80211_DEV(ar->hw, NULL);
10248         return ret;
10249 }
10250
10251 int ath11k_mac_register(struct ath11k_base *ab)
10252 {
10253         struct ath11k *ar;
10254         struct ath11k_pdev *pdev;
10255         int i;
10256         int ret;
10257         u8 mac_addr[ETH_ALEN] = {0};
10258
10259         if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
10260                 return 0;
10261
10262         /* Initialize channel counters frequency value in hertz */
10263         ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
10264         ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
10265
10266         ret = ath11k_peer_rhash_tbl_init(ab);
10267         if (ret)
10268                 return ret;
10269
10270         device_get_mac_address(ab->dev, mac_addr);
10271
10272         for (i = 0; i < ab->num_radios; i++) {
10273                 pdev = &ab->pdevs[i];
10274                 ar = pdev->ar;
10275                 if (ab->pdevs_macaddr_valid) {
10276                         ether_addr_copy(ar->mac_addr, pdev->mac_addr);
10277                 } else {
10278                         if (is_zero_ether_addr(mac_addr))
10279                                 ether_addr_copy(ar->mac_addr, ab->mac_addr);
10280                         else
10281                                 ether_addr_copy(ar->mac_addr, mac_addr);
10282                         ar->mac_addr[4] += i;
10283                 }
10284
10285                 idr_init(&ar->txmgmt_idr);
10286                 spin_lock_init(&ar->txmgmt_idr_lock);
10287
10288                 ret = __ath11k_mac_register(ar);
10289                 if (ret)
10290                         goto err_cleanup;
10291
10292                 init_waitqueue_head(&ar->txmgmt_empty_waitq);
10293         }
10294
10295         return 0;
10296
10297 err_cleanup:
10298         for (i = i - 1; i >= 0; i--) {
10299                 pdev = &ab->pdevs[i];
10300                 ar = pdev->ar;
10301                 __ath11k_mac_unregister(ar);
10302         }
10303
10304         ath11k_peer_rhash_tbl_destroy(ab);
10305
10306         return ret;
10307 }
10308
10309 int ath11k_mac_allocate(struct ath11k_base *ab)
10310 {
10311         struct ieee80211_hw *hw;
10312         struct ath11k *ar;
10313         struct ath11k_pdev *pdev;
10314         int ret;
10315         int i;
10316
10317         if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
10318                 return 0;
10319
10320         for (i = 0; i < ab->num_radios; i++) {
10321                 pdev = &ab->pdevs[i];
10322                 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
10323                 if (!hw) {
10324                         ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
10325                         ret = -ENOMEM;
10326                         goto err_free_mac;
10327                 }
10328
10329                 ar = hw->priv;
10330                 ar->hw = hw;
10331                 ar->ab = ab;
10332                 ar->pdev = pdev;
10333                 ar->pdev_idx = i;
10334                 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
10335
10336                 ar->wmi = &ab->wmi_ab.wmi[i];
10337                 /* FIXME wmi[0] is already initialized during attach,
10338                  * Should we do this again?
10339                  */
10340                 ath11k_wmi_pdev_attach(ab, i);
10341
10342                 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
10343                 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
10344                 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
10345                 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
10346
10347                 pdev->ar = ar;
10348                 spin_lock_init(&ar->data_lock);
10349                 INIT_LIST_HEAD(&ar->arvifs);
10350                 INIT_LIST_HEAD(&ar->ppdu_stats_info);
10351                 mutex_init(&ar->conf_mutex);
10352                 init_completion(&ar->vdev_setup_done);
10353                 init_completion(&ar->vdev_delete_done);
10354                 init_completion(&ar->peer_assoc_done);
10355                 init_completion(&ar->peer_delete_done);
10356                 init_completion(&ar->install_key_done);
10357                 init_completion(&ar->bss_survey_done);
10358                 init_completion(&ar->scan.started);
10359                 init_completion(&ar->scan.completed);
10360                 init_completion(&ar->scan.on_channel);
10361                 init_completion(&ar->thermal.wmi_sync);
10362
10363                 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
10364                 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
10365
10366                 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
10367                 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
10368
10369                 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
10370
10371                 ar->monitor_vdev_id = -1;
10372                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
10373                 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
10374                 init_completion(&ar->completed_11d_scan);
10375
10376                 ath11k_fw_stats_init(ar);
10377         }
10378
10379         return 0;
10380
10381 err_free_mac:
10382         ath11k_mac_destroy(ab);
10383
10384         return ret;
10385 }
10386
10387 void ath11k_mac_destroy(struct ath11k_base *ab)
10388 {
10389         struct ath11k *ar;
10390         struct ath11k_pdev *pdev;
10391         int i;
10392
10393         for (i = 0; i < ab->num_radios; i++) {
10394                 pdev = &ab->pdevs[i];
10395                 ar = pdev->ar;
10396                 if (!ar)
10397                         continue;
10398
10399                 ath11k_fw_stats_free(&ar->fw_stats);
10400                 ieee80211_free_hw(ar->hw);
10401                 pdev->ar = NULL;
10402         }
10403 }
10404
10405 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
10406                                  enum wmi_sta_keepalive_method method,
10407                                  u32 interval)
10408 {
10409         struct ath11k *ar = arvif->ar;
10410         struct wmi_sta_keepalive_arg arg = {};
10411         int ret;
10412
10413         lockdep_assert_held(&ar->conf_mutex);
10414
10415         if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
10416                 return 0;
10417
10418         if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
10419                 return 0;
10420
10421         arg.vdev_id = arvif->vdev_id;
10422         arg.enabled = 1;
10423         arg.method = method;
10424         arg.interval = interval;
10425
10426         ret = ath11k_wmi_sta_keepalive(ar, &arg);
10427         if (ret) {
10428                 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
10429                             arvif->vdev_id, ret);
10430                 return ret;
10431         }
10432
10433         return 0;
10434 }