Merge tag 'thermal-5.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[sfrench/cifs-2.6.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 Qualcomm Innovation Center, Inc. All rights reserved.
5  */
6
7 #include <net/mac80211.h>
8 #include <linux/etherdevice.h>
9 #include "mac.h"
10 #include "core.h"
11 #include "debug.h"
12 #include "wmi.h"
13 #include "hw.h"
14 #include "dp_tx.h"
15 #include "dp_rx.h"
16 #include "testmode.h"
17 #include "peer.h"
18 #include "debugfs_sta.h"
19
20 #define CHAN2G(_channel, _freq, _flags) { \
21         .band                   = NL80211_BAND_2GHZ, \
22         .hw_value               = (_channel), \
23         .center_freq            = (_freq), \
24         .flags                  = (_flags), \
25         .max_antenna_gain       = 0, \
26         .max_power              = 30, \
27 }
28
29 #define CHAN5G(_channel, _freq, _flags) { \
30         .band                   = NL80211_BAND_5GHZ, \
31         .hw_value               = (_channel), \
32         .center_freq            = (_freq), \
33         .flags                  = (_flags), \
34         .max_antenna_gain       = 0, \
35         .max_power              = 30, \
36 }
37
38 #define CHAN6G(_channel, _freq, _flags) { \
39         .band                   = NL80211_BAND_6GHZ, \
40         .hw_value               = (_channel), \
41         .center_freq            = (_freq), \
42         .flags                  = (_flags), \
43         .max_antenna_gain       = 0, \
44         .max_power              = 30, \
45 }
46
47 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
48         CHAN2G(1, 2412, 0),
49         CHAN2G(2, 2417, 0),
50         CHAN2G(3, 2422, 0),
51         CHAN2G(4, 2427, 0),
52         CHAN2G(5, 2432, 0),
53         CHAN2G(6, 2437, 0),
54         CHAN2G(7, 2442, 0),
55         CHAN2G(8, 2447, 0),
56         CHAN2G(9, 2452, 0),
57         CHAN2G(10, 2457, 0),
58         CHAN2G(11, 2462, 0),
59         CHAN2G(12, 2467, 0),
60         CHAN2G(13, 2472, 0),
61         CHAN2G(14, 2484, 0),
62 };
63
64 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
65         CHAN5G(36, 5180, 0),
66         CHAN5G(40, 5200, 0),
67         CHAN5G(44, 5220, 0),
68         CHAN5G(48, 5240, 0),
69         CHAN5G(52, 5260, 0),
70         CHAN5G(56, 5280, 0),
71         CHAN5G(60, 5300, 0),
72         CHAN5G(64, 5320, 0),
73         CHAN5G(100, 5500, 0),
74         CHAN5G(104, 5520, 0),
75         CHAN5G(108, 5540, 0),
76         CHAN5G(112, 5560, 0),
77         CHAN5G(116, 5580, 0),
78         CHAN5G(120, 5600, 0),
79         CHAN5G(124, 5620, 0),
80         CHAN5G(128, 5640, 0),
81         CHAN5G(132, 5660, 0),
82         CHAN5G(136, 5680, 0),
83         CHAN5G(140, 5700, 0),
84         CHAN5G(144, 5720, 0),
85         CHAN5G(149, 5745, 0),
86         CHAN5G(153, 5765, 0),
87         CHAN5G(157, 5785, 0),
88         CHAN5G(161, 5805, 0),
89         CHAN5G(165, 5825, 0),
90         CHAN5G(169, 5845, 0),
91         CHAN5G(173, 5865, 0),
92 };
93
94 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
95         CHAN6G(1, 5955, 0),
96         CHAN6G(5, 5975, 0),
97         CHAN6G(9, 5995, 0),
98         CHAN6G(13, 6015, 0),
99         CHAN6G(17, 6035, 0),
100         CHAN6G(21, 6055, 0),
101         CHAN6G(25, 6075, 0),
102         CHAN6G(29, 6095, 0),
103         CHAN6G(33, 6115, 0),
104         CHAN6G(37, 6135, 0),
105         CHAN6G(41, 6155, 0),
106         CHAN6G(45, 6175, 0),
107         CHAN6G(49, 6195, 0),
108         CHAN6G(53, 6215, 0),
109         CHAN6G(57, 6235, 0),
110         CHAN6G(61, 6255, 0),
111         CHAN6G(65, 6275, 0),
112         CHAN6G(69, 6295, 0),
113         CHAN6G(73, 6315, 0),
114         CHAN6G(77, 6335, 0),
115         CHAN6G(81, 6355, 0),
116         CHAN6G(85, 6375, 0),
117         CHAN6G(89, 6395, 0),
118         CHAN6G(93, 6415, 0),
119         CHAN6G(97, 6435, 0),
120         CHAN6G(101, 6455, 0),
121         CHAN6G(105, 6475, 0),
122         CHAN6G(109, 6495, 0),
123         CHAN6G(113, 6515, 0),
124         CHAN6G(117, 6535, 0),
125         CHAN6G(121, 6555, 0),
126         CHAN6G(125, 6575, 0),
127         CHAN6G(129, 6595, 0),
128         CHAN6G(133, 6615, 0),
129         CHAN6G(137, 6635, 0),
130         CHAN6G(141, 6655, 0),
131         CHAN6G(145, 6675, 0),
132         CHAN6G(149, 6695, 0),
133         CHAN6G(153, 6715, 0),
134         CHAN6G(157, 6735, 0),
135         CHAN6G(161, 6755, 0),
136         CHAN6G(165, 6775, 0),
137         CHAN6G(169, 6795, 0),
138         CHAN6G(173, 6815, 0),
139         CHAN6G(177, 6835, 0),
140         CHAN6G(181, 6855, 0),
141         CHAN6G(185, 6875, 0),
142         CHAN6G(189, 6895, 0),
143         CHAN6G(193, 6915, 0),
144         CHAN6G(197, 6935, 0),
145         CHAN6G(201, 6955, 0),
146         CHAN6G(205, 6975, 0),
147         CHAN6G(209, 6995, 0),
148         CHAN6G(213, 7015, 0),
149         CHAN6G(217, 7035, 0),
150         CHAN6G(221, 7055, 0),
151         CHAN6G(225, 7075, 0),
152         CHAN6G(229, 7095, 0),
153         CHAN6G(233, 7115, 0),
154
155         /* new addition in IEEE Std 802.11ax-2021 */
156         CHAN6G(2, 5935, 0),
157 };
158
159 static struct ieee80211_rate ath11k_legacy_rates[] = {
160         { .bitrate = 10,
161           .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
162         { .bitrate = 20,
163           .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
164           .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
165           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
166         { .bitrate = 55,
167           .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
168           .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
169           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
170         { .bitrate = 110,
171           .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
172           .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
173           .flags = IEEE80211_RATE_SHORT_PREAMBLE },
174
175         { .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
176         { .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
177         { .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
178         { .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
179         { .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
180         { .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
181         { .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
182         { .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
183 };
184
185 static const int
186 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
187         [NL80211_BAND_2GHZ] = {
188                         [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
189                         [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
190                         [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
191                         [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
192                         [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
193                         [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
194                         [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
195                         [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
196         },
197         [NL80211_BAND_5GHZ] = {
198                         [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
199                         [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
200                         [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
201                         [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
202                         [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
203                         [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
204                         [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
205                         [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
206         },
207         [NL80211_BAND_6GHZ] = {
208                         [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
209                         [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
210                         [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
211                         [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
212                         [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
213                         [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
214                         [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
215                         [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
216         },
217
218 };
219
220 const struct htt_rx_ring_tlv_filter ath11k_mac_mon_status_filter_default = {
221         .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
222                      HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
223                      HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
224         .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
225         .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
226         .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
227         .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
228                              HTT_RX_FP_CTRL_FILTER_FLASG3
229 };
230
231 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
232 #define ath11k_g_rates ath11k_legacy_rates
233 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
234 #define ath11k_a_rates (ath11k_legacy_rates + 4)
235 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
236
237 #define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
238
239 static const u32 ath11k_smps_map[] = {
240         [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
241         [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
242         [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
243         [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
244 };
245
246 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
247                                    struct ieee80211_vif *vif);
248
249 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
250 {
251         enum nl80211_he_ru_alloc ret;
252
253         switch (ru_phy) {
254         case RU_26:
255                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
256                 break;
257         case RU_52:
258                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
259                 break;
260         case RU_106:
261                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
262                 break;
263         case RU_242:
264                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
265                 break;
266         case RU_484:
267                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
268                 break;
269         case RU_996:
270                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
271                 break;
272         default:
273                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
274                 break;
275         }
276
277         return ret;
278 }
279
280 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
281 {
282         enum nl80211_he_ru_alloc ret;
283
284         switch (ru_tones) {
285         case 26:
286                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
287                 break;
288         case 52:
289                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
290                 break;
291         case 106:
292                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
293                 break;
294         case 242:
295                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
296                 break;
297         case 484:
298                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
299                 break;
300         case 996:
301                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
302                 break;
303         case (996 * 2):
304                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
305                 break;
306         default:
307                 ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
308                 break;
309         }
310
311         return ret;
312 }
313
314 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
315 {
316         enum nl80211_he_gi ret;
317
318         switch (sgi) {
319         case RX_MSDU_START_SGI_0_8_US:
320                 ret = NL80211_RATE_INFO_HE_GI_0_8;
321                 break;
322         case RX_MSDU_START_SGI_1_6_US:
323                 ret = NL80211_RATE_INFO_HE_GI_1_6;
324                 break;
325         case RX_MSDU_START_SGI_3_2_US:
326                 ret = NL80211_RATE_INFO_HE_GI_3_2;
327                 break;
328         default:
329                 ret = NL80211_RATE_INFO_HE_GI_0_8;
330                 break;
331         }
332
333         return ret;
334 }
335
336 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
337 {
338         u8 ret = 0;
339
340         switch (bw) {
341         case ATH11K_BW_20:
342                 ret = RATE_INFO_BW_20;
343                 break;
344         case ATH11K_BW_40:
345                 ret = RATE_INFO_BW_40;
346                 break;
347         case ATH11K_BW_80:
348                 ret = RATE_INFO_BW_80;
349                 break;
350         case ATH11K_BW_160:
351                 ret = RATE_INFO_BW_160;
352                 break;
353         }
354
355         return ret;
356 }
357
358 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
359 {
360         switch (bw) {
361         case RATE_INFO_BW_20:
362                 return ATH11K_BW_20;
363         case RATE_INFO_BW_40:
364                 return ATH11K_BW_40;
365         case RATE_INFO_BW_80:
366                 return ATH11K_BW_80;
367         case RATE_INFO_BW_160:
368                 return ATH11K_BW_160;
369         default:
370                 return ATH11K_BW_20;
371         }
372 }
373
374 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
375                                           u16 *rate)
376 {
377         /* As default, it is OFDM rates */
378         int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
379         int max_rates_idx = ath11k_g_rates_size;
380
381         if (preamble == WMI_RATE_PREAMBLE_CCK) {
382                 hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
383                 i = 0;
384                 max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
385         }
386
387         while (i < max_rates_idx) {
388                 if (hw_rc == ath11k_legacy_rates[i].hw_value) {
389                         *rateidx = i;
390                         *rate = ath11k_legacy_rates[i].bitrate;
391                         return 0;
392                 }
393                 i++;
394         }
395
396         return -EINVAL;
397 }
398
399 static int get_num_chains(u32 mask)
400 {
401         int num_chains = 0;
402
403         while (mask) {
404                 if (mask & BIT(0))
405                         num_chains++;
406                 mask >>= 1;
407         }
408
409         return num_chains;
410 }
411
412 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
413                              u32 bitrate)
414 {
415         int i;
416
417         for (i = 0; i < sband->n_bitrates; i++)
418                 if (sband->bitrates[i].bitrate == bitrate)
419                         return i;
420
421         return 0;
422 }
423
424 static u32
425 ath11k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
426 {
427         int nss;
428
429         for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
430                 if (ht_mcs_mask[nss])
431                         return nss + 1;
432
433         return 1;
434 }
435
436 static u32
437 ath11k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX])
438 {
439         int nss;
440
441         for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
442                 if (vht_mcs_mask[nss])
443                         return nss + 1;
444
445         return 1;
446 }
447
448 static u32
449 ath11k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
450 {
451         int nss;
452
453         for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
454                 if (he_mcs_mask[nss])
455                         return nss + 1;
456
457         return 1;
458 }
459
460 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
461 {
462 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
463  *   0 for no restriction
464  *   1 for 1/4 us
465  *   2 for 1/2 us
466  *   3 for 1 us
467  *   4 for 2 us
468  *   5 for 4 us
469  *   6 for 8 us
470  *   7 for 16 us
471  */
472         switch (mpdudensity) {
473         case 0:
474                 return 0;
475         case 1:
476         case 2:
477         case 3:
478         /* Our lower layer calculations limit our precision to
479          * 1 microsecond
480          */
481                 return 1;
482         case 4:
483                 return 2;
484         case 5:
485                 return 4;
486         case 6:
487                 return 8;
488         case 7:
489                 return 16;
490         default:
491                 return 0;
492         }
493 }
494
495 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
496                                struct cfg80211_chan_def *def)
497 {
498         struct ieee80211_chanctx_conf *conf;
499
500         rcu_read_lock();
501         conf = rcu_dereference(vif->chanctx_conf);
502         if (!conf) {
503                 rcu_read_unlock();
504                 return -ENOENT;
505         }
506
507         *def = conf->def;
508         rcu_read_unlock();
509
510         return 0;
511 }
512
513 static bool ath11k_mac_bitrate_is_cck(int bitrate)
514 {
515         switch (bitrate) {
516         case 10:
517         case 20:
518         case 55:
519         case 110:
520                 return true;
521         }
522
523         return false;
524 }
525
526 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
527                              u8 hw_rate, bool cck)
528 {
529         const struct ieee80211_rate *rate;
530         int i;
531
532         for (i = 0; i < sband->n_bitrates; i++) {
533                 rate = &sband->bitrates[i];
534
535                 if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
536                         continue;
537
538                 if (rate->hw_value == hw_rate)
539                         return i;
540                 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
541                          rate->hw_value_short == hw_rate)
542                         return i;
543         }
544
545         return 0;
546 }
547
548 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
549 {
550         return DIV_ROUND_UP(bitrate, 5) |
551                (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
552 }
553
554 static void ath11k_get_arvif_iter(void *data, u8 *mac,
555                                   struct ieee80211_vif *vif)
556 {
557         struct ath11k_vif_iter *arvif_iter = data;
558         struct ath11k_vif *arvif = (void *)vif->drv_priv;
559
560         if (arvif->vdev_id == arvif_iter->vdev_id)
561                 arvif_iter->arvif = arvif;
562 }
563
564 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
565 {
566         struct ath11k_vif_iter arvif_iter;
567         u32 flags;
568
569         memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
570         arvif_iter.vdev_id = vdev_id;
571
572         flags = IEEE80211_IFACE_ITER_RESUME_ALL;
573         ieee80211_iterate_active_interfaces_atomic(ar->hw,
574                                                    flags,
575                                                    ath11k_get_arvif_iter,
576                                                    &arvif_iter);
577         if (!arvif_iter.arvif) {
578                 ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
579                 return NULL;
580         }
581
582         return arvif_iter.arvif;
583 }
584
585 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
586                                                    u32 vdev_id)
587 {
588         int i;
589         struct ath11k_pdev *pdev;
590         struct ath11k_vif *arvif;
591
592         for (i = 0; i < ab->num_radios; i++) {
593                 pdev = rcu_dereference(ab->pdevs_active[i]);
594                 if (pdev && pdev->ar &&
595                     (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
596                         arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
597                         if (arvif)
598                                 return arvif;
599                 }
600         }
601
602         return NULL;
603 }
604
605 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
606 {
607         int i;
608         struct ath11k_pdev *pdev;
609
610         for (i = 0; i < ab->num_radios; i++) {
611                 pdev = rcu_dereference(ab->pdevs_active[i]);
612                 if (pdev && pdev->ar) {
613                         if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
614                                 return pdev->ar;
615                 }
616         }
617
618         return NULL;
619 }
620
621 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
622 {
623         int i;
624         struct ath11k_pdev *pdev;
625
626         if (ab->hw_params.single_pdev_only) {
627                 pdev = rcu_dereference(ab->pdevs_active[0]);
628                 return pdev ? pdev->ar : NULL;
629         }
630
631         if (WARN_ON(pdev_id > ab->num_radios))
632                 return NULL;
633
634         for (i = 0; i < ab->num_radios; i++) {
635                 pdev = rcu_dereference(ab->pdevs_active[i]);
636
637                 if (pdev && pdev->pdev_id == pdev_id)
638                         return (pdev->ar ? pdev->ar : NULL);
639         }
640
641         return NULL;
642 }
643
644 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
645 {
646         struct ath11k *ar;
647         struct ath11k_pdev *pdev;
648         struct ath11k_vif *arvif;
649         int i;
650
651         for (i = 0; i < ab->num_radios; i++) {
652                 pdev = &ab->pdevs[i];
653                 ar = pdev->ar;
654                 list_for_each_entry(arvif, &ar->arvifs, list) {
655                         if (arvif->is_up)
656                                 return arvif;
657                 }
658         }
659
660         return NULL;
661 }
662
663 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
664 {
665         return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
666                 (((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
667                    (band2 & WMI_HOST_WLAN_5G_CAP)));
668 }
669
670 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
671 {
672         struct ath11k *ar = arvif->ar;
673         struct ath11k_base *ab = ar->ab;
674         struct ieee80211_vif *vif = arvif->vif;
675         struct cfg80211_chan_def def;
676         enum nl80211_band band;
677         u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
678         int i;
679
680         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
681                 return pdev_id;
682
683         band = def.chan->band;
684
685         for (i = 0; i < ab->target_pdev_count; i++) {
686                 if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
687                         return ab->target_pdev_ids[i].pdev_id;
688         }
689
690         return pdev_id;
691 }
692
693 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
694 {
695         struct ath11k_vif *arvif;
696
697         arvif = ath11k_mac_get_vif_up(ar->ab);
698
699         if (arvif)
700                 return ath11k_mac_get_target_pdev_id_from_vif(arvif);
701         else
702                 return ar->ab->target_pdev_ids[0].pdev_id;
703 }
704
705 static void ath11k_pdev_caps_update(struct ath11k *ar)
706 {
707         struct ath11k_base *ab = ar->ab;
708
709         ar->max_tx_power = ab->target_caps.hw_max_tx_power;
710
711         /* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
712          * But since the received value in svcrdy is same as hw_max_tx_power,
713          * we can set ar->min_tx_power to 0 currently until
714          * this is fixed in firmware
715          */
716         ar->min_tx_power = 0;
717
718         ar->txpower_limit_2g = ar->max_tx_power;
719         ar->txpower_limit_5g = ar->max_tx_power;
720         ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
721 }
722
723 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
724 {
725         struct ath11k_pdev *pdev = ar->pdev;
726         struct ath11k_vif *arvif;
727         int ret, txpower = -1;
728         u32 param;
729
730         lockdep_assert_held(&ar->conf_mutex);
731
732         list_for_each_entry(arvif, &ar->arvifs, list) {
733                 if (arvif->txpower <= 0)
734                         continue;
735
736                 if (txpower == -1)
737                         txpower = arvif->txpower;
738                 else
739                         txpower = min(txpower, arvif->txpower);
740         }
741
742         if (txpower == -1)
743                 return 0;
744
745         /* txpwr is set as 2 units per dBm in FW*/
746         txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
747                         ar->max_tx_power) * 2;
748
749         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
750                    txpower / 2);
751
752         if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
753             ar->txpower_limit_2g != txpower) {
754                 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
755                 ret = ath11k_wmi_pdev_set_param(ar, param,
756                                                 txpower, ar->pdev->pdev_id);
757                 if (ret)
758                         goto fail;
759                 ar->txpower_limit_2g = txpower;
760         }
761
762         if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
763             ar->txpower_limit_5g != txpower) {
764                 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
765                 ret = ath11k_wmi_pdev_set_param(ar, param,
766                                                 txpower, ar->pdev->pdev_id);
767                 if (ret)
768                         goto fail;
769                 ar->txpower_limit_5g = txpower;
770         }
771
772         return 0;
773
774 fail:
775         ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
776                     txpower / 2, param, ret);
777         return ret;
778 }
779
780 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
781 {
782         struct ath11k *ar = arvif->ar;
783         u32 vdev_param, rts_cts = 0;
784         int ret;
785
786         lockdep_assert_held(&ar->conf_mutex);
787
788         vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
789
790         /* Enable RTS/CTS protection for sw retries (when legacy stations
791          * are in BSS) or by default only for second rate series.
792          * TODO: Check if we need to enable CTS 2 Self in any case
793          */
794         rts_cts = WMI_USE_RTS_CTS;
795
796         if (arvif->num_legacy_stations > 0)
797                 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
798         else
799                 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
800
801         /* Need not send duplicate param value to firmware */
802         if (arvif->rtscts_prot_mode == rts_cts)
803                 return 0;
804
805         arvif->rtscts_prot_mode = rts_cts;
806
807         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
808                    arvif->vdev_id, rts_cts);
809
810         ret =  ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
811                                              vdev_param, rts_cts);
812         if (ret)
813                 ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
814                             arvif->vdev_id, ret);
815
816         return ret;
817 }
818
819 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
820 {
821         struct ath11k *ar = arvif->ar;
822         u32 param;
823         int ret;
824
825         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
826                                         ATH11K_KICKOUT_THRESHOLD,
827                                         ar->pdev->pdev_id);
828         if (ret) {
829                 ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
830                             arvif->vdev_id, ret);
831                 return ret;
832         }
833
834         param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
835         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
836                                             ATH11K_KEEPALIVE_MIN_IDLE);
837         if (ret) {
838                 ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
839                             arvif->vdev_id, ret);
840                 return ret;
841         }
842
843         param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
844         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
845                                             ATH11K_KEEPALIVE_MAX_IDLE);
846         if (ret) {
847                 ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
848                             arvif->vdev_id, ret);
849                 return ret;
850         }
851
852         param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
853         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
854                                             ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
855         if (ret) {
856                 ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
857                             arvif->vdev_id, ret);
858                 return ret;
859         }
860
861         return 0;
862 }
863
864 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
865 {
866         struct ath11k_peer *peer, *tmp;
867         struct ath11k_base *ab = ar->ab;
868
869         lockdep_assert_held(&ar->conf_mutex);
870
871         spin_lock_bh(&ab->base_lock);
872         list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
873                 ath11k_peer_rx_tid_cleanup(ar, peer);
874                 list_del(&peer->list);
875                 kfree(peer);
876         }
877         spin_unlock_bh(&ab->base_lock);
878
879         ar->num_peers = 0;
880         ar->num_stations = 0;
881 }
882
883 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
884 {
885         lockdep_assert_held(&ar->conf_mutex);
886
887         if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
888                 return -ESHUTDOWN;
889
890         if (!wait_for_completion_timeout(&ar->vdev_setup_done,
891                                          ATH11K_VDEV_SETUP_TIMEOUT_HZ))
892                 return -ETIMEDOUT;
893
894         return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
895 }
896
897 static void
898 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
899                                 struct ieee80211_chanctx_conf *conf,
900                                 void *data)
901 {
902         struct cfg80211_chan_def **def = data;
903
904         *def = &conf->def;
905 }
906
907 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
908                                          struct cfg80211_chan_def *chandef)
909 {
910         struct ieee80211_channel *channel;
911         struct wmi_vdev_start_req_arg arg = {};
912         int ret;
913
914         lockdep_assert_held(&ar->conf_mutex);
915
916         channel = chandef->chan;
917
918         arg.vdev_id = vdev_id;
919         arg.channel.freq = channel->center_freq;
920         arg.channel.band_center_freq1 = chandef->center_freq1;
921         arg.channel.band_center_freq2 = chandef->center_freq2;
922
923         arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
924         arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
925
926         arg.channel.min_power = 0;
927         arg.channel.max_power = channel->max_power;
928         arg.channel.max_reg_power = channel->max_reg_power;
929         arg.channel.max_antenna_gain = channel->max_antenna_gain;
930
931         arg.pref_tx_streams = ar->num_tx_chains;
932         arg.pref_rx_streams = ar->num_rx_chains;
933
934         arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
935
936         reinit_completion(&ar->vdev_setup_done);
937         reinit_completion(&ar->vdev_delete_done);
938
939         ret = ath11k_wmi_vdev_start(ar, &arg, false);
940         if (ret) {
941                 ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
942                             vdev_id, ret);
943                 return ret;
944         }
945
946         ret = ath11k_mac_vdev_setup_sync(ar);
947         if (ret) {
948                 ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
949                             vdev_id, ret);
950                 return ret;
951         }
952
953         ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
954         if (ret) {
955                 ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
956                             vdev_id, ret);
957                 goto vdev_stop;
958         }
959
960         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i started\n",
961                    vdev_id);
962
963         return 0;
964
965 vdev_stop:
966         reinit_completion(&ar->vdev_setup_done);
967
968         ret = ath11k_wmi_vdev_stop(ar, vdev_id);
969         if (ret) {
970                 ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
971                             vdev_id, ret);
972                 return ret;
973         }
974
975         ret = ath11k_mac_vdev_setup_sync(ar);
976         if (ret) {
977                 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
978                             vdev_id, ret);
979                 return ret;
980         }
981
982         return -EIO;
983 }
984
985 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
986 {
987         int ret;
988
989         lockdep_assert_held(&ar->conf_mutex);
990
991         reinit_completion(&ar->vdev_setup_done);
992
993         ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
994         if (ret) {
995                 ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
996                             ar->monitor_vdev_id, ret);
997                 return ret;
998         }
999
1000         ret = ath11k_mac_vdev_setup_sync(ar);
1001         if (ret) {
1002                 ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1003                             ar->monitor_vdev_id, ret);
1004                 return ret;
1005         }
1006
1007         ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1008         if (ret) {
1009                 ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1010                             ar->monitor_vdev_id, ret);
1011                 return ret;
1012         }
1013
1014         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %i stopped\n",
1015                    ar->monitor_vdev_id);
1016
1017         return 0;
1018 }
1019
1020 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1021 {
1022         struct ath11k_pdev *pdev = ar->pdev;
1023         struct vdev_create_params param = {};
1024         int bit, ret;
1025         u8 tmp_addr[6] = {0};
1026         u16 nss;
1027
1028         lockdep_assert_held(&ar->conf_mutex);
1029
1030         if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1031                 return 0;
1032
1033         if (ar->ab->free_vdev_map == 0) {
1034                 ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1035                 return -ENOMEM;
1036         }
1037
1038         bit = __ffs64(ar->ab->free_vdev_map);
1039
1040         ar->monitor_vdev_id = bit;
1041
1042         param.if_id = ar->monitor_vdev_id;
1043         param.type = WMI_VDEV_TYPE_MONITOR;
1044         param.subtype = WMI_VDEV_SUBTYPE_NONE;
1045         param.pdev_id = pdev->pdev_id;
1046
1047         if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1048                 param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1049                 param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1050         }
1051         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1052                 param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1053                 param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1054         }
1055
1056         ret = ath11k_wmi_vdev_create(ar, tmp_addr, &param);
1057         if (ret) {
1058                 ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1059                             ar->monitor_vdev_id, ret);
1060                 ar->monitor_vdev_id = -1;
1061                 return ret;
1062         }
1063
1064         nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1065         ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1066                                             WMI_VDEV_PARAM_NSS, nss);
1067         if (ret) {
1068                 ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1069                             ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1070                 goto err_vdev_del;
1071         }
1072
1073         ret = ath11k_mac_txpower_recalc(ar);
1074         if (ret) {
1075                 ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1076                             ar->monitor_vdev_id, ret);
1077                 goto err_vdev_del;
1078         }
1079
1080         ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1081         ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1082         ar->num_created_vdevs++;
1083         set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1084
1085         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %d created\n",
1086                    ar->monitor_vdev_id);
1087
1088         return 0;
1089
1090 err_vdev_del:
1091         ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1092         ar->monitor_vdev_id = -1;
1093         return ret;
1094 }
1095
1096 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1097 {
1098         int ret;
1099         unsigned long time_left;
1100
1101         lockdep_assert_held(&ar->conf_mutex);
1102
1103         if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1104                 return 0;
1105
1106         reinit_completion(&ar->vdev_delete_done);
1107
1108         ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1109         if (ret) {
1110                 ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1111                             ar->monitor_vdev_id, ret);
1112                 return ret;
1113         }
1114
1115         time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1116                                                 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1117         if (time_left == 0) {
1118                 ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1119         } else {
1120                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor vdev %d deleted\n",
1121                            ar->monitor_vdev_id);
1122
1123                 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1124                 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1125                 ar->num_created_vdevs--;
1126                 ar->monitor_vdev_id = -1;
1127                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1128         }
1129
1130         return ret;
1131 }
1132
1133 static int ath11k_mac_monitor_start(struct ath11k *ar)
1134 {
1135         struct cfg80211_chan_def *chandef = NULL;
1136         int ret;
1137
1138         lockdep_assert_held(&ar->conf_mutex);
1139
1140         if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1141                 return 0;
1142
1143         ieee80211_iter_chan_contexts_atomic(ar->hw,
1144                                             ath11k_mac_get_any_chandef_iter,
1145                                             &chandef);
1146         if (!chandef)
1147                 return 0;
1148
1149         ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1150         if (ret) {
1151                 ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1152                 ath11k_mac_monitor_vdev_delete(ar);
1153                 return ret;
1154         }
1155
1156         set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1157
1158         ar->num_started_vdevs++;
1159         ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1160         if (ret) {
1161                 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1162                             ret);
1163                 return ret;
1164         }
1165
1166         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor started\n");
1167
1168         return 0;
1169 }
1170
1171 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1172 {
1173         int ret;
1174
1175         lockdep_assert_held(&ar->conf_mutex);
1176
1177         if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1178                 return 0;
1179
1180         ret = ath11k_mac_monitor_vdev_stop(ar);
1181         if (ret) {
1182                 ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1183                 return ret;
1184         }
1185
1186         clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1187         ar->num_started_vdevs--;
1188
1189         ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1190         if (ret) {
1191                 ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1192                             ret);
1193                 return ret;
1194         }
1195
1196         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1197
1198         return 0;
1199 }
1200
1201 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1202 {
1203         struct ath11k *ar = arvif->ar;
1204         struct ieee80211_vif *vif = arvif->vif;
1205         struct ieee80211_conf *conf = &ar->hw->conf;
1206         enum wmi_sta_powersave_param param;
1207         enum wmi_sta_ps_mode psmode;
1208         int ret;
1209         int timeout;
1210         bool enable_ps;
1211
1212         lockdep_assert_held(&arvif->ar->conf_mutex);
1213
1214         if (arvif->vif->type != NL80211_IFTYPE_STATION)
1215                 return 0;
1216
1217         enable_ps = arvif->ps;
1218
1219         if (!arvif->is_started) {
1220                 /* mac80211 can update vif powersave state while disconnected.
1221                  * Firmware doesn't behave nicely and consumes more power than
1222                  * necessary if PS is disabled on a non-started vdev. Hence
1223                  * force-enable PS for non-running vdevs.
1224                  */
1225                 psmode = WMI_STA_PS_MODE_ENABLED;
1226         } else if (enable_ps) {
1227                 psmode = WMI_STA_PS_MODE_ENABLED;
1228                 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1229
1230                 timeout = conf->dynamic_ps_timeout;
1231                 if (timeout == 0) {
1232                         /* firmware doesn't like 0 */
1233                         timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1234                 }
1235
1236                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1237                                                   timeout);
1238                 if (ret) {
1239                         ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1240                                     arvif->vdev_id, ret);
1241                         return ret;
1242                 }
1243         } else {
1244                 psmode = WMI_STA_PS_MODE_DISABLED;
1245         }
1246
1247         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d psmode %s\n",
1248                    arvif->vdev_id, psmode ? "enable" : "disable");
1249
1250         ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1251         if (ret) {
1252                 ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1253                             psmode, arvif->vdev_id, ret);
1254                 return ret;
1255         }
1256
1257         return 0;
1258 }
1259
1260 static int ath11k_mac_config_ps(struct ath11k *ar)
1261 {
1262         struct ath11k_vif *arvif;
1263         int ret = 0;
1264
1265         lockdep_assert_held(&ar->conf_mutex);
1266
1267         list_for_each_entry(arvif, &ar->arvifs, list) {
1268                 ret = ath11k_mac_vif_setup_ps(arvif);
1269                 if (ret) {
1270                         ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1271                         break;
1272                 }
1273         }
1274
1275         return ret;
1276 }
1277
1278 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1279 {
1280         struct ath11k *ar = hw->priv;
1281         struct ieee80211_conf *conf = &hw->conf;
1282         int ret = 0;
1283
1284         mutex_lock(&ar->conf_mutex);
1285
1286         if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1287                 if (conf->flags & IEEE80211_CONF_MONITOR) {
1288                         set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1289
1290                         if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1291                                      &ar->monitor_flags))
1292                                 goto out;
1293
1294                         ret = ath11k_mac_monitor_vdev_create(ar);
1295                         if (ret) {
1296                                 ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1297                                             ret);
1298                                 goto out;
1299                         }
1300
1301                         ret = ath11k_mac_monitor_start(ar);
1302                         if (ret) {
1303                                 ath11k_warn(ar->ab, "failed to start monitor: %d",
1304                                             ret);
1305                                 goto err_mon_del;
1306                         }
1307                 } else {
1308                         clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1309
1310                         if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1311                                       &ar->monitor_flags))
1312                                 goto out;
1313
1314                         ret = ath11k_mac_monitor_stop(ar);
1315                         if (ret) {
1316                                 ath11k_warn(ar->ab, "failed to stop monitor: %d",
1317                                             ret);
1318                                 goto out;
1319                         }
1320
1321                         ret = ath11k_mac_monitor_vdev_delete(ar);
1322                         if (ret) {
1323                                 ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1324                                             ret);
1325                                 goto out;
1326                         }
1327                 }
1328         }
1329
1330 out:
1331         mutex_unlock(&ar->conf_mutex);
1332         return ret;
1333
1334 err_mon_del:
1335         ath11k_mac_monitor_vdev_delete(ar);
1336         mutex_unlock(&ar->conf_mutex);
1337         return ret;
1338 }
1339
1340 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1341 {
1342         struct ath11k *ar = arvif->ar;
1343         struct ath11k_base *ab = ar->ab;
1344         struct ieee80211_hw *hw = ar->hw;
1345         struct ieee80211_vif *vif = arvif->vif;
1346         struct ieee80211_mutable_offsets offs = {};
1347         struct sk_buff *bcn;
1348         struct ieee80211_mgmt *mgmt;
1349         u8 *ies;
1350         int ret;
1351
1352         if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1353                 return 0;
1354
1355         bcn = ieee80211_beacon_get_template(hw, vif, &offs);
1356         if (!bcn) {
1357                 ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1358                 return -EPERM;
1359         }
1360
1361         ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1362         ies += sizeof(mgmt->u.beacon);
1363
1364         if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1365                 arvif->rsnie_present = true;
1366         else
1367                 arvif->rsnie_present = false;
1368
1369         if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1370                                     WLAN_OUI_TYPE_MICROSOFT_WPA,
1371                                     ies, (skb_tail_pointer(bcn) - ies)))
1372                 arvif->wpaie_present = true;
1373         else
1374                 arvif->wpaie_present = false;
1375
1376         ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1377
1378         kfree_skb(bcn);
1379
1380         if (ret)
1381                 ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1382                             ret);
1383
1384         return ret;
1385 }
1386
1387 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1388 {
1389         struct ieee80211_vif *vif = arvif->vif;
1390
1391         if (!vif->color_change_active && !arvif->bcca_zero_sent)
1392                 return;
1393
1394         if (vif->color_change_active && ieee80211_beacon_cntdwn_is_complete(vif)) {
1395                 arvif->bcca_zero_sent = true;
1396                 ieee80211_color_change_finish(vif);
1397                 return;
1398         }
1399
1400         arvif->bcca_zero_sent = false;
1401
1402         if (vif->color_change_active)
1403                 ieee80211_beacon_update_cntdwn(vif);
1404         ath11k_mac_setup_bcn_tmpl(arvif);
1405 }
1406
1407 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1408                                      struct ieee80211_bss_conf *info)
1409 {
1410         struct ath11k *ar = arvif->ar;
1411         int ret = 0;
1412
1413         lockdep_assert_held(&arvif->ar->conf_mutex);
1414
1415         if (!info->enable_beacon) {
1416                 ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1417                 if (ret)
1418                         ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1419                                     arvif->vdev_id, ret);
1420
1421                 arvif->is_up = false;
1422                 return;
1423         }
1424
1425         /* Install the beacon template to the FW */
1426         ret = ath11k_mac_setup_bcn_tmpl(arvif);
1427         if (ret) {
1428                 ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1429                             ret);
1430                 return;
1431         }
1432
1433         arvif->tx_seq_no = 0x1000;
1434
1435         arvif->aid = 0;
1436
1437         ether_addr_copy(arvif->bssid, info->bssid);
1438
1439         ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1440                                  arvif->bssid);
1441         if (ret) {
1442                 ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1443                             arvif->vdev_id, ret);
1444                 return;
1445         }
1446
1447         arvif->is_up = true;
1448
1449         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1450 }
1451
1452 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1453                                           struct ieee80211_vif *vif)
1454 {
1455         struct sk_buff *skb = data;
1456         struct ieee80211_mgmt *mgmt = (void *)skb->data;
1457         struct ath11k_vif *arvif = (void *)vif->drv_priv;
1458
1459         if (vif->type != NL80211_IFTYPE_STATION)
1460                 return;
1461
1462         if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1463                 return;
1464
1465         cancel_delayed_work(&arvif->connection_loss_work);
1466 }
1467
1468 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1469 {
1470         ieee80211_iterate_active_interfaces_atomic(ar->hw,
1471                                                    IEEE80211_IFACE_ITER_NORMAL,
1472                                                    ath11k_mac_handle_beacon_iter,
1473                                                    skb);
1474 }
1475
1476 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1477                                                struct ieee80211_vif *vif)
1478 {
1479         u32 *vdev_id = data;
1480         struct ath11k_vif *arvif = (void *)vif->drv_priv;
1481         struct ath11k *ar = arvif->ar;
1482         struct ieee80211_hw *hw = ar->hw;
1483
1484         if (arvif->vdev_id != *vdev_id)
1485                 return;
1486
1487         if (!arvif->is_up)
1488                 return;
1489
1490         ieee80211_beacon_loss(vif);
1491
1492         /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1493          * (done by mac80211) succeeds but beacons do not resume then it
1494          * doesn't make sense to continue operation. Queue connection loss work
1495          * which can be cancelled when beacon is received.
1496          */
1497         ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1498                                      ATH11K_CONNECTION_LOSS_HZ);
1499 }
1500
1501 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1502 {
1503         ieee80211_iterate_active_interfaces_atomic(ar->hw,
1504                                                    IEEE80211_IFACE_ITER_NORMAL,
1505                                                    ath11k_mac_handle_beacon_miss_iter,
1506                                                    &vdev_id);
1507 }
1508
1509 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1510 {
1511         struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1512                                                 connection_loss_work.work);
1513         struct ieee80211_vif *vif = arvif->vif;
1514
1515         if (!arvif->is_up)
1516                 return;
1517
1518         ieee80211_connection_loss(vif);
1519 }
1520
1521 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1522                                       struct ieee80211_vif *vif,
1523                                       struct ieee80211_sta *sta,
1524                                       struct peer_assoc_params *arg)
1525 {
1526         struct ath11k_vif *arvif = (void *)vif->drv_priv;
1527         u32 aid;
1528
1529         lockdep_assert_held(&ar->conf_mutex);
1530
1531         if (vif->type == NL80211_IFTYPE_STATION)
1532                 aid = vif->bss_conf.aid;
1533         else
1534                 aid = sta->aid;
1535
1536         ether_addr_copy(arg->peer_mac, sta->addr);
1537         arg->vdev_id = arvif->vdev_id;
1538         arg->peer_associd = aid;
1539         arg->auth_flag = true;
1540         /* TODO: STA WAR in ath10k for listen interval required? */
1541         arg->peer_listen_intval = ar->hw->conf.listen_interval;
1542         arg->peer_nss = 1;
1543         arg->peer_caps = vif->bss_conf.assoc_capability;
1544 }
1545
1546 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1547                                        struct ieee80211_vif *vif,
1548                                        struct ieee80211_sta *sta,
1549                                        struct peer_assoc_params *arg)
1550 {
1551         struct ieee80211_bss_conf *info = &vif->bss_conf;
1552         struct cfg80211_chan_def def;
1553         struct cfg80211_bss *bss;
1554         struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv;
1555         const u8 *rsnie = NULL;
1556         const u8 *wpaie = NULL;
1557
1558         lockdep_assert_held(&ar->conf_mutex);
1559
1560         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1561                 return;
1562
1563         bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1564                                IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1565
1566         if (arvif->rsnie_present || arvif->wpaie_present) {
1567                 arg->need_ptk_4_way = true;
1568                 if (arvif->wpaie_present)
1569                         arg->need_gtk_2_way = true;
1570         } else if (bss) {
1571                 const struct cfg80211_bss_ies *ies;
1572
1573                 rcu_read_lock();
1574                 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1575
1576                 ies = rcu_dereference(bss->ies);
1577
1578                 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1579                                                 WLAN_OUI_TYPE_MICROSOFT_WPA,
1580                                                 ies->data,
1581                                                 ies->len);
1582                 rcu_read_unlock();
1583                 cfg80211_put_bss(ar->hw->wiphy, bss);
1584         }
1585
1586         /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1587         if (rsnie || wpaie) {
1588                 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1589                            "%s: rsn ie found\n", __func__);
1590                 arg->need_ptk_4_way = true;
1591         }
1592
1593         if (wpaie) {
1594                 ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1595                            "%s: wpa ie found\n", __func__);
1596                 arg->need_gtk_2_way = true;
1597         }
1598
1599         if (sta->mfp) {
1600                 /* TODO: Need to check if FW supports PMF? */
1601                 arg->is_pmf_enabled = true;
1602         }
1603
1604         /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1605 }
1606
1607 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1608                                       struct ieee80211_vif *vif,
1609                                       struct ieee80211_sta *sta,
1610                                       struct peer_assoc_params *arg)
1611 {
1612         struct ath11k_vif *arvif = (void *)vif->drv_priv;
1613         struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1614         struct cfg80211_chan_def def;
1615         const struct ieee80211_supported_band *sband;
1616         const struct ieee80211_rate *rates;
1617         enum nl80211_band band;
1618         u32 ratemask;
1619         u8 rate;
1620         int i;
1621
1622         lockdep_assert_held(&ar->conf_mutex);
1623
1624         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1625                 return;
1626
1627         band = def.chan->band;
1628         sband = ar->hw->wiphy->bands[band];
1629         ratemask = sta->supp_rates[band];
1630         ratemask &= arvif->bitrate_mask.control[band].legacy;
1631         rates = sband->bitrates;
1632
1633         rateset->num_rates = 0;
1634
1635         for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1636                 if (!(ratemask & 1))
1637                         continue;
1638
1639                 rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1640                 rateset->rates[rateset->num_rates] = rate;
1641                 rateset->num_rates++;
1642         }
1643 }
1644
1645 static bool
1646 ath11k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
1647 {
1648         int nss;
1649
1650         for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1651                 if (ht_mcs_mask[nss])
1652                         return false;
1653
1654         return true;
1655 }
1656
1657 static bool
1658 ath11k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[])
1659 {
1660         int nss;
1661
1662         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1663                 if (vht_mcs_mask[nss])
1664                         return false;
1665
1666         return true;
1667 }
1668
1669 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1670                                    struct ieee80211_vif *vif,
1671                                    struct ieee80211_sta *sta,
1672                                    struct peer_assoc_params *arg)
1673 {
1674         const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1675         struct ath11k_vif *arvif = (void *)vif->drv_priv;
1676         struct cfg80211_chan_def def;
1677         enum nl80211_band band;
1678         const u8 *ht_mcs_mask;
1679         int i, n;
1680         u8 max_nss;
1681         u32 stbc;
1682
1683         lockdep_assert_held(&ar->conf_mutex);
1684
1685         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1686                 return;
1687
1688         if (!ht_cap->ht_supported)
1689                 return;
1690
1691         band = def.chan->band;
1692         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1693
1694         if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1695                 return;
1696
1697         arg->ht_flag = true;
1698
1699         arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1700                                     ht_cap->ampdu_factor)) - 1;
1701
1702         arg->peer_mpdu_density =
1703                 ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1704
1705         arg->peer_ht_caps = ht_cap->cap;
1706         arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1707
1708         if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1709                 arg->ldpc_flag = true;
1710
1711         if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
1712                 arg->bw_40 = true;
1713                 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1714         }
1715
1716         /* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1717          * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1718          * both flags if guard interval is Default GI
1719          */
1720         if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1721                 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1722                                 IEEE80211_HT_CAP_SGI_40);
1723
1724         if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1725                 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1726                     IEEE80211_HT_CAP_SGI_40))
1727                         arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1728         }
1729
1730         if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1731                 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1732                 arg->stbc_flag = true;
1733         }
1734
1735         if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1736                 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1737                 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1738                 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1739                 arg->peer_rate_caps |= stbc;
1740                 arg->stbc_flag = true;
1741         }
1742
1743         if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1744                 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1745         else if (ht_cap->mcs.rx_mask[1])
1746                 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1747
1748         for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1749                 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1750                     (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1751                         max_nss = (i / 8) + 1;
1752                         arg->peer_ht_rates.rates[n++] = i;
1753                 }
1754
1755         /* This is a workaround for HT-enabled STAs which break the spec
1756          * and have no HT capabilities RX mask (no HT RX MCS map).
1757          *
1758          * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1759          * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1760          *
1761          * Firmware asserts if such situation occurs.
1762          */
1763         if (n == 0) {
1764                 arg->peer_ht_rates.num_rates = 8;
1765                 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1766                         arg->peer_ht_rates.rates[i] = i;
1767         } else {
1768                 arg->peer_ht_rates.num_rates = n;
1769                 arg->peer_nss = min(sta->rx_nss, max_nss);
1770         }
1771
1772         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1773                    arg->peer_mac,
1774                    arg->peer_ht_rates.num_rates,
1775                    arg->peer_nss);
1776 }
1777
1778 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1779 {
1780         switch ((mcs_map >> (2 * nss)) & 0x3) {
1781         case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1782         case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1783         case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1784         }
1785         return 0;
1786 }
1787
1788 static u16
1789 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1790                               const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1791 {
1792         int idx_limit;
1793         int nss;
1794         u16 mcs_map;
1795         u16 mcs;
1796
1797         for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1798                 mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1799                           vht_mcs_limit[nss];
1800
1801                 if (mcs_map)
1802                         idx_limit = fls(mcs_map) - 1;
1803                 else
1804                         idx_limit = -1;
1805
1806                 switch (idx_limit) {
1807                 case 0:
1808                 case 1:
1809                 case 2:
1810                 case 3:
1811                 case 4:
1812                 case 5:
1813                 case 6:
1814                 case 7:
1815                         mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1816                         break;
1817                 case 8:
1818                         mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1819                         break;
1820                 case 9:
1821                         mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1822                         break;
1823                 default:
1824                         WARN_ON(1);
1825                         fallthrough;
1826                 case -1:
1827                         mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1828                         break;
1829                 }
1830
1831                 tx_mcs_set &= ~(0x3 << (nss * 2));
1832                 tx_mcs_set |= mcs << (nss * 2);
1833         }
1834
1835         return tx_mcs_set;
1836 }
1837
1838 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
1839                                 u8 max_nss)
1840 {
1841         u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
1842         u8 max_sup_nss = 0;
1843
1844         switch (nss_ratio_info) {
1845         case WMI_NSS_RATIO_1BY2_NSS:
1846                 max_sup_nss = max_nss >> 1;
1847                 break;
1848         case WMI_NSS_RATIO_3BY4_NSS:
1849                 ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
1850                 break;
1851         case WMI_NSS_RATIO_1_NSS:
1852                 max_sup_nss = max_nss;
1853                 break;
1854         case WMI_NSS_RATIO_2_NSS:
1855                 ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
1856                 break;
1857         default:
1858                 ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
1859                             nss_ratio_info);
1860                 break;
1861         }
1862
1863         return max_sup_nss;
1864 }
1865
1866 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
1867                                     struct ieee80211_vif *vif,
1868                                     struct ieee80211_sta *sta,
1869                                     struct peer_assoc_params *arg)
1870 {
1871         const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
1872         struct ath11k_vif *arvif = (void *)vif->drv_priv;
1873         struct cfg80211_chan_def def;
1874         enum nl80211_band band;
1875         u16 *vht_mcs_mask;
1876         u8 ampdu_factor;
1877         u8 max_nss, vht_mcs;
1878         int i, vht_nss, nss_idx;
1879         bool user_rate_valid = true;
1880         u32 rx_nss, tx_nss, nss_160;
1881
1882         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1883                 return;
1884
1885         if (!vht_cap->vht_supported)
1886                 return;
1887
1888         band = def.chan->band;
1889         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1890
1891         if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
1892                 return;
1893
1894         arg->vht_flag = true;
1895
1896         /* TODO: similar flags required? */
1897         arg->vht_capable = true;
1898
1899         if (def.chan->band == NL80211_BAND_2GHZ)
1900                 arg->vht_ng_flag = true;
1901
1902         arg->peer_vht_caps = vht_cap->cap;
1903
1904         ampdu_factor = (vht_cap->cap &
1905                         IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1906                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1907
1908         /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1909          * zero in VHT IE. Using it would result in degraded throughput.
1910          * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1911          * it if VHT max_mpdu is smaller.
1912          */
1913         arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1914                                  (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1915                                         ampdu_factor)) - 1);
1916
1917         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
1918                 arg->bw_80 = true;
1919
1920         if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1921                 arg->bw_160 = true;
1922
1923         vht_nss =  ath11k_mac_max_vht_nss(vht_mcs_mask);
1924
1925         if (vht_nss > sta->rx_nss) {
1926                 user_rate_valid = false;
1927                 for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
1928                         if (vht_mcs_mask[nss_idx]) {
1929                                 user_rate_valid = true;
1930                                 break;
1931                         }
1932                 }
1933         }
1934
1935         if (!user_rate_valid) {
1936                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting vht range mcs value to peer supported nss %d for peer %pM\n",
1937                            sta->rx_nss, sta->addr);
1938                 vht_mcs_mask[sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
1939         }
1940
1941         /* Calculate peer NSS capability from VHT capabilities if STA
1942          * supports VHT.
1943          */
1944         for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1945                 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1946                           (2 * i) & 3;
1947
1948                 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1949                     vht_mcs_mask[i])
1950                         max_nss = i + 1;
1951         }
1952         arg->peer_nss = min(sta->rx_nss, max_nss);
1953         arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1954         arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1955         arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1956         arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
1957                 __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
1958
1959         /* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
1960          * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
1961          * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1962          */
1963         arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1964         arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1965
1966         if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1967                         IEEE80211_VHT_MCS_NOT_SUPPORTED)
1968                 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1969
1970         /* TODO:  Check */
1971         arg->tx_max_mcs_nss = 0xFF;
1972
1973         if (arg->peer_phymode == MODE_11AC_VHT160 ||
1974             arg->peer_phymode == MODE_11AC_VHT80_80) {
1975                 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
1976                 rx_nss = min(arg->peer_nss, tx_nss);
1977                 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
1978
1979                 if (!rx_nss) {
1980                         ath11k_warn(ar->ab, "invalid max_nss\n");
1981                         return;
1982                 }
1983
1984                 if (arg->peer_phymode == MODE_11AC_VHT160)
1985                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
1986                 else
1987                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
1988
1989                 arg->peer_bw_rxnss_override |= nss_160;
1990         }
1991
1992         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
1993                    "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
1994                    sta->addr, arg->peer_max_mpdu, arg->peer_flags,
1995                    arg->peer_bw_rxnss_override);
1996 }
1997
1998 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
1999 {
2000         switch ((mcs_map >> (2 * nss)) & 0x3) {
2001         case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2002         case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2003         case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2004         }
2005         return 0;
2006 }
2007
2008 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2009                                         const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2010 {
2011         int idx_limit;
2012         int nss;
2013         u16 mcs_map;
2014         u16 mcs;
2015
2016         for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2017                 mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2018                         he_mcs_limit[nss];
2019
2020                 if (mcs_map)
2021                         idx_limit = fls(mcs_map) - 1;
2022                 else
2023                         idx_limit = -1;
2024
2025                 switch (idx_limit) {
2026                 case 0 ... 7:
2027                         mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2028                         break;
2029                 case 8:
2030                 case 9:
2031                         mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2032                         break;
2033                 case 10:
2034                 case 11:
2035                         mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2036                         break;
2037                 default:
2038                         WARN_ON(1);
2039                         fallthrough;
2040                 case -1:
2041                         mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2042                         break;
2043                 }
2044
2045                 tx_mcs_set &= ~(0x3 << (nss * 2));
2046                 tx_mcs_set |= mcs << (nss * 2);
2047         }
2048
2049         return tx_mcs_set;
2050 }
2051
2052 static bool
2053 ath11k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2054 {
2055         int nss;
2056
2057         for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2058                 if (he_mcs_mask[nss])
2059                         return false;
2060
2061         return true;
2062 }
2063
2064 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2065                                    struct ieee80211_vif *vif,
2066                                    struct ieee80211_sta *sta,
2067                                    struct peer_assoc_params *arg)
2068 {
2069         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2070         struct cfg80211_chan_def def;
2071         const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
2072         enum nl80211_band band;
2073         u16 *he_mcs_mask;
2074         u8 max_nss, he_mcs;
2075         u16 he_tx_mcs = 0, v = 0;
2076         int i, he_nss, nss_idx;
2077         bool user_rate_valid = true;
2078         u32 rx_nss, tx_nss, nss_160;
2079         u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2080         u16 mcs_160_map, mcs_80_map;
2081         bool support_160;
2082
2083         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2084                 return;
2085
2086         if (!he_cap->has_he)
2087                 return;
2088
2089         band = def.chan->band;
2090         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2091
2092         if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2093                 return;
2094
2095         arg->he_flag = true;
2096         support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2097                   IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2098
2099         /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2100         mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2101         mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2102
2103         if (support_160) {
2104                 for (i = 7; i >= 0; i--) {
2105                         u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2106
2107                         if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2108                                 rx_mcs_160 = i + 1;
2109                                 break;
2110                         }
2111                 }
2112         }
2113
2114         for (i = 7; i >= 0; i--) {
2115                 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2116
2117                 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2118                         rx_mcs_80 = i + 1;
2119                         break;
2120                 }
2121         }
2122
2123         if (support_160)
2124                 max_nss = min(rx_mcs_80, rx_mcs_160);
2125         else
2126                 max_nss = rx_mcs_80;
2127
2128         arg->peer_nss = min(sta->rx_nss, max_nss);
2129
2130         memcpy_and_pad(&arg->peer_he_cap_macinfo,
2131                        sizeof(arg->peer_he_cap_macinfo),
2132                        he_cap->he_cap_elem.mac_cap_info,
2133                        sizeof(he_cap->he_cap_elem.mac_cap_info),
2134                        0);
2135         memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2136                        sizeof(arg->peer_he_cap_phyinfo),
2137                        he_cap->he_cap_elem.phy_cap_info,
2138                        sizeof(he_cap->he_cap_elem.phy_cap_info),
2139                        0);
2140         arg->peer_he_ops = vif->bss_conf.he_oper.params;
2141
2142         /* the top most byte is used to indicate BSS color info */
2143         arg->peer_he_ops &= 0xffffff;
2144
2145         /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2146          * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2147          * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2148          *
2149          * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2150          * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2151          * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2152          * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2153          * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2154          * length.
2155          */
2156         ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2157                                    IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2158
2159         if (ampdu_factor) {
2160                 if (sta->vht_cap.vht_supported)
2161                         arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2162                                                     ampdu_factor)) - 1;
2163                 else if (sta->ht_cap.ht_supported)
2164                         arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2165                                                     ampdu_factor)) - 1;
2166         }
2167
2168         if (he_cap->he_cap_elem.phy_cap_info[6] &
2169             IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2170                 int bit = 7;
2171                 int nss, ru;
2172
2173                 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2174                                           IEEE80211_PPE_THRES_NSS_MASK;
2175                 arg->peer_ppet.ru_bit_mask =
2176                         (he_cap->ppe_thres[0] &
2177                          IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2178                         IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2179
2180                 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2181                         for (ru = 0; ru < 4; ru++) {
2182                                 u32 val = 0;
2183                                 int i;
2184
2185                                 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2186                                         continue;
2187                                 for (i = 0; i < 6; i++) {
2188                                         val >>= 1;
2189                                         val |= ((he_cap->ppe_thres[bit / 8] >>
2190                                                  (bit % 8)) & 0x1) << 5;
2191                                         bit++;
2192                                 }
2193                                 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2194                                                                 val << (ru * 6);
2195                         }
2196                 }
2197         }
2198
2199         if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2200                 arg->twt_responder = true;
2201         if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2202                 arg->twt_requester = true;
2203
2204         he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
2205
2206         if (he_nss > sta->rx_nss) {
2207                 user_rate_valid = false;
2208                 for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2209                         if (he_mcs_mask[nss_idx]) {
2210                                 user_rate_valid = true;
2211                                 break;
2212                         }
2213                 }
2214         }
2215
2216         if (!user_rate_valid) {
2217                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n",
2218                            sta->rx_nss, sta->addr);
2219                 he_mcs_mask[sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2220         }
2221
2222         switch (sta->bandwidth) {
2223         case IEEE80211_STA_RX_BW_160:
2224                 if (he_cap->he_cap_elem.phy_cap_info[0] &
2225                     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2226                         v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2227                         v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2228                         arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2229
2230                         v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2231                         arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2232
2233                         arg->peer_he_mcs_count++;
2234                         he_tx_mcs = v;
2235                 }
2236                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2237                 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2238
2239                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2240                 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2241                 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2242
2243                 arg->peer_he_mcs_count++;
2244                 if (!he_tx_mcs)
2245                         he_tx_mcs = v;
2246                 fallthrough;
2247
2248         default:
2249                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2250                 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2251
2252                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2253                 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2254                 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2255
2256                 arg->peer_he_mcs_count++;
2257                 if (!he_tx_mcs)
2258                         he_tx_mcs = v;
2259                 break;
2260         }
2261
2262         /* Calculate peer NSS capability from HE capabilities if STA
2263          * supports HE.
2264          */
2265         for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2266                 he_mcs = he_tx_mcs >> (2 * i) & 3;
2267
2268                 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2269                  * unsupported range, with he_mcs_mask set, so check either of them
2270                  * to find nss.
2271                  */
2272                 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2273                     he_mcs_mask[i])
2274                         max_nss = i + 1;
2275         }
2276         arg->peer_nss = min(sta->rx_nss, max_nss);
2277
2278         if (arg->peer_phymode == MODE_11AX_HE160 ||
2279             arg->peer_phymode == MODE_11AX_HE80_80) {
2280                 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2281                 rx_nss = min(arg->peer_nss, tx_nss);
2282                 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2283
2284                 if (!rx_nss) {
2285                         ath11k_warn(ar->ab, "invalid max_nss\n");
2286                         return;
2287                 }
2288
2289                 if (arg->peer_phymode == MODE_11AX_HE160)
2290                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2291                 else
2292                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2293
2294                 arg->peer_bw_rxnss_override |= nss_160;
2295         }
2296
2297         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2298                    "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2299                    sta->addr, arg->peer_nss,
2300                    arg->peer_he_mcs_count,
2301                    arg->peer_bw_rxnss_override);
2302 }
2303
2304 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2305                                         struct ieee80211_vif *vif,
2306                                         struct ieee80211_sta *sta,
2307                                         struct peer_assoc_params *arg)
2308 {
2309         const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
2310         struct cfg80211_chan_def def;
2311         enum nl80211_band band;
2312         u8  ampdu_factor;
2313
2314         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2315                 return;
2316
2317         band = def.chan->band;
2318
2319         if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->he_6ghz_capa.capa)
2320                 return;
2321
2322         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2323                 arg->bw_40 = true;
2324
2325         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2326                 arg->bw_80 = true;
2327
2328         if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
2329                 arg->bw_160 = true;
2330
2331         arg->peer_he_caps_6ghz = le16_to_cpu(sta->he_6ghz_capa.capa);
2332         arg->peer_mpdu_density =
2333                 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2334                                                    arg->peer_he_caps_6ghz));
2335
2336         /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2337          * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2338          * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2339          * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2340          * Band Capabilities element in the 6 GHz band.
2341          *
2342          * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2343          * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2344          */
2345         ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2346                                  he_cap->he_cap_elem.mac_cap_info[3]) +
2347                         FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2348                                   arg->peer_he_caps_6ghz);
2349
2350         arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2351                                      ampdu_factor)) - 1;
2352 }
2353
2354 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2355                                      struct peer_assoc_params *arg)
2356 {
2357         const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
2358         int smps;
2359
2360         if (!ht_cap->ht_supported && !sta->he_6ghz_capa.capa)
2361                 return;
2362
2363         if (ht_cap->ht_supported) {
2364                 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2365                 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2366         } else {
2367                 smps = le16_get_bits(sta->he_6ghz_capa.capa,
2368                                      IEEE80211_HE_6GHZ_CAP_SM_PS);
2369         }
2370
2371         switch (smps) {
2372         case WLAN_HT_CAP_SM_PS_STATIC:
2373                 arg->static_mimops_flag = true;
2374                 break;
2375         case WLAN_HT_CAP_SM_PS_DYNAMIC:
2376                 arg->dynamic_mimops_flag = true;
2377                 break;
2378         case WLAN_HT_CAP_SM_PS_DISABLED:
2379                 arg->spatial_mux_flag = true;
2380                 break;
2381         default:
2382                 break;
2383         }
2384 }
2385
2386 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2387                                     struct ieee80211_vif *vif,
2388                                     struct ieee80211_sta *sta,
2389                                     struct peer_assoc_params *arg)
2390 {
2391         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2392
2393         switch (arvif->vdev_type) {
2394         case WMI_VDEV_TYPE_AP:
2395                 if (sta->wme) {
2396                         /* TODO: Check WME vs QoS */
2397                         arg->is_wme_set = true;
2398                         arg->qos_flag = true;
2399                 }
2400
2401                 if (sta->wme && sta->uapsd_queues) {
2402                         /* TODO: Check WME vs QoS */
2403                         arg->is_wme_set = true;
2404                         arg->apsd_flag = true;
2405                         arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2406                 }
2407                 break;
2408         case WMI_VDEV_TYPE_STA:
2409                 if (sta->wme) {
2410                         arg->is_wme_set = true;
2411                         arg->qos_flag = true;
2412                 }
2413                 break;
2414         default:
2415                 break;
2416         }
2417
2418         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n",
2419                    sta->addr, arg->qos_flag);
2420 }
2421
2422 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2423                                     struct ath11k_vif *arvif,
2424                                     struct ieee80211_sta *sta)
2425 {
2426         struct ap_ps_params params;
2427         u32 max_sp;
2428         u32 uapsd;
2429         int ret;
2430
2431         lockdep_assert_held(&ar->conf_mutex);
2432
2433         params.vdev_id = arvif->vdev_id;
2434
2435         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2436                    sta->uapsd_queues, sta->max_sp);
2437
2438         uapsd = 0;
2439         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2440                 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2441                          WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2442         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2443                 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2444                          WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2445         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2446                 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2447                          WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2448         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2449                 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2450                          WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2451
2452         max_sp = 0;
2453         if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2454                 max_sp = sta->max_sp;
2455
2456         params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2457         params.value = uapsd;
2458         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2459         if (ret)
2460                 goto err;
2461
2462         params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2463         params.value = max_sp;
2464         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2465         if (ret)
2466                 goto err;
2467
2468         /* TODO revisit during testing */
2469         params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2470         params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2471         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2472         if (ret)
2473                 goto err;
2474
2475         params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2476         params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2477         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2478         if (ret)
2479                 goto err;
2480
2481         return 0;
2482
2483 err:
2484         ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2485                     params.param, arvif->vdev_id, ret);
2486         return ret;
2487 }
2488
2489 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2490 {
2491         return sta->supp_rates[NL80211_BAND_2GHZ] >>
2492                ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2493 }
2494
2495 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2496                                                     struct ieee80211_sta *sta)
2497 {
2498         if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2499                 switch (sta->vht_cap.cap &
2500                         IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2501                 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2502                         return MODE_11AC_VHT160;
2503                 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2504                         return MODE_11AC_VHT80_80;
2505                 default:
2506                         /* not sure if this is a valid case? */
2507                         return MODE_11AC_VHT160;
2508                 }
2509         }
2510
2511         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2512                 return MODE_11AC_VHT80;
2513
2514         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2515                 return MODE_11AC_VHT40;
2516
2517         if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2518                 return MODE_11AC_VHT20;
2519
2520         return MODE_UNKNOWN;
2521 }
2522
2523 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2524                                                    struct ieee80211_sta *sta)
2525 {
2526         if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2527                 if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
2528                      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2529                         return MODE_11AX_HE160;
2530                 else if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
2531                      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2532                         return MODE_11AX_HE80_80;
2533                 /* not sure if this is a valid case? */
2534                 return MODE_11AX_HE160;
2535         }
2536
2537         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2538                 return MODE_11AX_HE80;
2539
2540         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2541                 return MODE_11AX_HE40;
2542
2543         if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
2544                 return MODE_11AX_HE20;
2545
2546         return MODE_UNKNOWN;
2547 }
2548
2549 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2550                                         struct ieee80211_vif *vif,
2551                                         struct ieee80211_sta *sta,
2552                                         struct peer_assoc_params *arg)
2553 {
2554         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2555         struct cfg80211_chan_def def;
2556         enum nl80211_band band;
2557         const u8 *ht_mcs_mask;
2558         const u16 *vht_mcs_mask;
2559         const u16 *he_mcs_mask;
2560         enum wmi_phy_mode phymode = MODE_UNKNOWN;
2561
2562         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2563                 return;
2564
2565         band = def.chan->band;
2566         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2567         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2568         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2569
2570         switch (band) {
2571         case NL80211_BAND_2GHZ:
2572                 if (sta->he_cap.has_he &&
2573                     !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2574                         if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
2575                                 phymode = MODE_11AX_HE80_2G;
2576                         else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2577                                 phymode = MODE_11AX_HE40_2G;
2578                         else
2579                                 phymode = MODE_11AX_HE20_2G;
2580                 } else if (sta->vht_cap.vht_supported &&
2581                     !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2582                         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2583                                 phymode = MODE_11AC_VHT40;
2584                         else
2585                                 phymode = MODE_11AC_VHT20;
2586                 } else if (sta->ht_cap.ht_supported &&
2587                            !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2588                         if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
2589                                 phymode = MODE_11NG_HT40;
2590                         else
2591                                 phymode = MODE_11NG_HT20;
2592                 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2593                         phymode = MODE_11G;
2594                 } else {
2595                         phymode = MODE_11B;
2596                 }
2597                 break;
2598         case NL80211_BAND_5GHZ:
2599         case NL80211_BAND_6GHZ:
2600                 /* Check HE first */
2601                 if (sta->he_cap.has_he &&
2602                     !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2603                         phymode = ath11k_mac_get_phymode_he(ar, sta);
2604                 } else if (sta->vht_cap.vht_supported &&
2605                     !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2606                         phymode = ath11k_mac_get_phymode_vht(ar, sta);
2607                 } else if (sta->ht_cap.ht_supported &&
2608                            !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2609                         if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
2610                                 phymode = MODE_11NA_HT40;
2611                         else
2612                                 phymode = MODE_11NA_HT20;
2613                 } else {
2614                         phymode = MODE_11A;
2615                 }
2616                 break;
2617         default:
2618                 break;
2619         }
2620
2621         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n",
2622                    sta->addr, ath11k_wmi_phymode_str(phymode));
2623
2624         arg->peer_phymode = phymode;
2625         WARN_ON(phymode == MODE_UNKNOWN);
2626 }
2627
2628 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2629                                       struct ieee80211_vif *vif,
2630                                       struct ieee80211_sta *sta,
2631                                       struct peer_assoc_params *arg,
2632                                       bool reassoc)
2633 {
2634         struct ath11k_sta *arsta;
2635
2636         lockdep_assert_held(&ar->conf_mutex);
2637
2638         arsta = (struct ath11k_sta *)sta->drv_priv;
2639
2640         memset(arg, 0, sizeof(*arg));
2641
2642         reinit_completion(&ar->peer_assoc_done);
2643
2644         arg->peer_new_assoc = !reassoc;
2645         ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2646         ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2647         ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2648         ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2649         ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2650         ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2651         ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2652         ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2653         ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2654         ath11k_peer_assoc_h_smps(sta, arg);
2655
2656         arsta->peer_nss = arg->peer_nss;
2657
2658         /* TODO: amsdu_disable req? */
2659 }
2660
2661 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2662                                   const u8 *addr,
2663                                   const struct ieee80211_sta_ht_cap *ht_cap,
2664                                   u16 he_6ghz_capa)
2665 {
2666         int smps;
2667
2668         if (!ht_cap->ht_supported && !he_6ghz_capa)
2669                 return 0;
2670
2671         if (ht_cap->ht_supported) {
2672                 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2673                 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2674         } else {
2675                 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2676         }
2677
2678         if (smps >= ARRAY_SIZE(ath11k_smps_map))
2679                 return -EINVAL;
2680
2681         return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2682                                          WMI_PEER_MIMO_PS_STATE,
2683                                          ath11k_smps_map[smps]);
2684 }
2685
2686 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2687                              struct ieee80211_vif *vif,
2688                              struct ieee80211_bss_conf *bss_conf)
2689 {
2690         struct ath11k *ar = hw->priv;
2691         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2692         struct peer_assoc_params peer_arg;
2693         struct ieee80211_sta *ap_sta;
2694         struct ath11k_peer *peer;
2695         bool is_auth = false;
2696         int ret;
2697
2698         lockdep_assert_held(&ar->conf_mutex);
2699
2700         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2701                    arvif->vdev_id, arvif->bssid, arvif->aid);
2702
2703         rcu_read_lock();
2704
2705         ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2706         if (!ap_sta) {
2707                 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2708                             bss_conf->bssid, arvif->vdev_id);
2709                 rcu_read_unlock();
2710                 return;
2711         }
2712
2713         ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2714
2715         rcu_read_unlock();
2716
2717         peer_arg.is_assoc = true;
2718         ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2719         if (ret) {
2720                 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2721                             bss_conf->bssid, arvif->vdev_id, ret);
2722                 return;
2723         }
2724
2725         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2726                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2727                             bss_conf->bssid, arvif->vdev_id);
2728                 return;
2729         }
2730
2731         ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2732                                      &ap_sta->ht_cap,
2733                                      le16_to_cpu(ap_sta->he_6ghz_capa.capa));
2734         if (ret) {
2735                 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2736                             arvif->vdev_id, ret);
2737                 return;
2738         }
2739
2740         WARN_ON(arvif->is_up);
2741
2742         arvif->aid = bss_conf->aid;
2743         ether_addr_copy(arvif->bssid, bss_conf->bssid);
2744
2745         ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2746         if (ret) {
2747                 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2748                             arvif->vdev_id, ret);
2749                 return;
2750         }
2751
2752         arvif->is_up = true;
2753
2754         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2755                    "mac vdev %d up (associated) bssid %pM aid %d\n",
2756                    arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
2757
2758         spin_lock_bh(&ar->ab->base_lock);
2759
2760         peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2761         if (peer && peer->is_authorized)
2762                 is_auth = true;
2763
2764         spin_unlock_bh(&ar->ab->base_lock);
2765
2766         if (is_auth) {
2767                 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
2768                                                 arvif->vdev_id,
2769                                                 WMI_PEER_AUTHORIZE,
2770                                                 1);
2771                 if (ret)
2772                         ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2773         }
2774
2775         ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2776                                            &bss_conf->he_obss_pd);
2777         if (ret)
2778                 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2779                             arvif->vdev_id, ret);
2780
2781         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2782                                             WMI_VDEV_PARAM_DTIM_POLICY,
2783                                             WMI_DTIM_POLICY_STICK);
2784         if (ret)
2785                 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
2786                             arvif->vdev_id, ret);
2787
2788         ath11k_mac_11d_scan_stop_all(ar->ab);
2789 }
2790
2791 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
2792                                 struct ieee80211_vif *vif)
2793 {
2794         struct ath11k *ar = hw->priv;
2795         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2796         int ret;
2797
2798         lockdep_assert_held(&ar->conf_mutex);
2799
2800         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2801                    arvif->vdev_id, arvif->bssid);
2802
2803         ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
2804         if (ret)
2805                 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
2806                             arvif->vdev_id, ret);
2807
2808         arvif->is_up = false;
2809
2810         cancel_delayed_work_sync(&arvif->connection_loss_work);
2811 }
2812
2813 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
2814 {
2815         u32 preamble;
2816         u16 hw_value;
2817         int rate;
2818         size_t i;
2819
2820         if (ath11k_mac_bitrate_is_cck(bitrate))
2821                 preamble = WMI_RATE_PREAMBLE_CCK;
2822         else
2823                 preamble = WMI_RATE_PREAMBLE_OFDM;
2824
2825         for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
2826                 if (ath11k_legacy_rates[i].bitrate != bitrate)
2827                         continue;
2828
2829                 hw_value = ath11k_legacy_rates[i].hw_value;
2830                 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
2831
2832                 return rate;
2833         }
2834
2835         return -EINVAL;
2836 }
2837
2838 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
2839                                          struct ieee80211_vif *vif,
2840                                          struct cfg80211_chan_def *def)
2841 {
2842         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2843         const struct ieee80211_supported_band *sband;
2844         u8 basic_rate_idx;
2845         int hw_rate_code;
2846         u32 vdev_param;
2847         u16 bitrate;
2848         int ret;
2849
2850         lockdep_assert_held(&ar->conf_mutex);
2851
2852         sband = ar->hw->wiphy->bands[def->chan->band];
2853         basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2854         bitrate = sband->bitrates[basic_rate_idx].bitrate;
2855
2856         hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
2857         if (hw_rate_code < 0) {
2858                 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2859                 return;
2860         }
2861
2862         vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2863         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2864                                             hw_rate_code);
2865         if (ret)
2866                 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2867
2868         /* For WCN6855, firmware will clear this param when vdev starts, hence
2869          * cache it here so that we can reconfigure it once vdev starts.
2870          */
2871         ar->hw_rate_code = hw_rate_code;
2872
2873         vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2874         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2875                                             hw_rate_code);
2876         if (ret)
2877                 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2878 }
2879
2880 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
2881                                      struct ieee80211_bss_conf *info)
2882 {
2883         struct ath11k *ar = arvif->ar;
2884         struct sk_buff *tmpl;
2885         int ret;
2886         u32 interval;
2887         bool unsol_bcast_probe_resp_enabled = false;
2888
2889         if (info->fils_discovery.max_interval) {
2890                 interval = info->fils_discovery.max_interval;
2891
2892                 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
2893                 if (tmpl)
2894                         ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2895                                                              tmpl);
2896         } else if (info->unsol_bcast_probe_resp_interval) {
2897                 unsol_bcast_probe_resp_enabled = 1;
2898                 interval = info->unsol_bcast_probe_resp_interval;
2899
2900                 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
2901                                                                  arvif->vif);
2902                 if (tmpl)
2903                         ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2904                                                          tmpl);
2905         } else { /* Disable */
2906                 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2907         }
2908
2909         if (!tmpl) {
2910                 ath11k_warn(ar->ab,
2911                             "mac vdev %i failed to retrieve %s template\n",
2912                             arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2913                             "unsolicited broadcast probe response" :
2914                             "FILS discovery"));
2915                 return -EPERM;
2916         }
2917         kfree_skb(tmpl);
2918
2919         if (!ret)
2920                 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2921                                                 unsol_bcast_probe_resp_enabled);
2922
2923         return ret;
2924 }
2925
2926 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
2927                                      struct ieee80211_he_obss_pd *he_obss_pd)
2928 {
2929         u32 bitmap[2], param_id, param_val, pdev_id;
2930         int ret;
2931         s8 non_srg_th = 0, srg_th = 0;
2932
2933         pdev_id = ar->pdev->pdev_id;
2934
2935         /* Set and enable SRG/non-SRG OBSS PD Threshold */
2936         param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
2937         if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
2938                 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
2939                 if (ret)
2940                         ath11k_warn(ar->ab,
2941                                     "failed to set obss_pd_threshold for pdev: %u\n",
2942                                     pdev_id);
2943                 return ret;
2944         }
2945
2946         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2947                    "mac obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
2948                    he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
2949                    he_obss_pd->max_offset);
2950
2951         param_val = 0;
2952
2953         if (he_obss_pd->sr_ctrl &
2954             IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
2955                 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
2956         } else {
2957                 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
2958                         non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
2959                                       he_obss_pd->non_srg_max_offset);
2960                 else
2961                         non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
2962
2963                 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
2964         }
2965
2966         if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
2967                 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
2968                 param_val |= ATH11K_OBSS_PD_SRG_EN;
2969         }
2970
2971         if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
2972                      ar->ab->wmi_ab.svc_map)) {
2973                 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
2974                 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
2975         } else {
2976                 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
2977                 /* SRG not supported and threshold in dB */
2978                 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
2979                                ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
2980         }
2981
2982         param_val |= (non_srg_th & GENMASK(7, 0));
2983         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
2984         if (ret) {
2985                 ath11k_warn(ar->ab,
2986                             "failed to set obss_pd_threshold for pdev: %u\n",
2987                             pdev_id);
2988                 return ret;
2989         }
2990
2991         /* Enable OBSS PD for all access category */
2992         param_id  = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
2993         param_val = 0xf;
2994         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
2995         if (ret) {
2996                 ath11k_warn(ar->ab,
2997                             "failed to set obss_pd_per_ac for pdev: %u\n",
2998                             pdev_id);
2999                 return ret;
3000         }
3001
3002         /* Set SR Prohibit */
3003         param_id  = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3004         param_val = !!(he_obss_pd->sr_ctrl &
3005                        IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3006         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3007         if (ret) {
3008                 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3009                             pdev_id);
3010                 return ret;
3011         }
3012
3013         if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3014                       ar->ab->wmi_ab.svc_map))
3015                 return 0;
3016
3017         /* Set SRG BSS Color Bitmap */
3018         memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3019         ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3020         if (ret) {
3021                 ath11k_warn(ar->ab,
3022                             "failed to set bss_color_bitmap for pdev: %u\n",
3023                             pdev_id);
3024                 return ret;
3025         }
3026
3027         /* Set SRG Partial BSSID Bitmap */
3028         memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3029         ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3030         if (ret) {
3031                 ath11k_warn(ar->ab,
3032                             "failed to set partial_bssid_bitmap for pdev: %u\n",
3033                             pdev_id);
3034                 return ret;
3035         }
3036
3037         memset(bitmap, 0xff, sizeof(bitmap));
3038
3039         /* Enable all BSS Colors for SRG */
3040         ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3041         if (ret) {
3042                 ath11k_warn(ar->ab,
3043                             "failed to set srg_color_en_bitmap pdev: %u\n",
3044                             pdev_id);
3045                 return ret;
3046         }
3047
3048         /* Enable all patial BSSID mask for SRG */
3049         ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3050         if (ret) {
3051                 ath11k_warn(ar->ab,
3052                             "failed to set srg_bssid_en_bitmap pdev: %u\n",
3053                             pdev_id);
3054                 return ret;
3055         }
3056
3057         /* Enable all BSS Colors for non-SRG */
3058         ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3059         if (ret) {
3060                 ath11k_warn(ar->ab,
3061                             "failed to set non_srg_color_en_bitmap pdev: %u\n",
3062                             pdev_id);
3063                 return ret;
3064         }
3065
3066         /* Enable all patial BSSID mask for non-SRG */
3067         ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3068         if (ret) {
3069                 ath11k_warn(ar->ab,
3070                             "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3071                             pdev_id);
3072                 return ret;
3073         }
3074
3075         return 0;
3076 }
3077
3078 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3079                                            struct ieee80211_vif *vif,
3080                                            struct ieee80211_bss_conf *info,
3081                                            u32 changed)
3082 {
3083         struct ath11k *ar = hw->priv;
3084         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3085         struct cfg80211_chan_def def;
3086         u32 param_id, param_value;
3087         enum nl80211_band band;
3088         u32 vdev_param;
3089         int mcast_rate;
3090         u32 preamble;
3091         u16 hw_value;
3092         u16 bitrate;
3093         int ret = 0;
3094         u8 rateidx;
3095         u32 rate;
3096
3097         mutex_lock(&ar->conf_mutex);
3098
3099         if (changed & BSS_CHANGED_BEACON_INT) {
3100                 arvif->beacon_interval = info->beacon_int;
3101
3102                 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3103                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3104                                                     param_id,
3105                                                     arvif->beacon_interval);
3106                 if (ret)
3107                         ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3108                                     arvif->vdev_id);
3109                 else
3110                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3111                                    "Beacon interval: %d set for VDEV: %d\n",
3112                                    arvif->beacon_interval, arvif->vdev_id);
3113         }
3114
3115         if (changed & BSS_CHANGED_BEACON) {
3116                 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3117                 param_value = WMI_BEACON_STAGGERED_MODE;
3118                 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3119                                                 param_value, ar->pdev->pdev_id);
3120                 if (ret)
3121                         ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3122                                     arvif->vdev_id);
3123                 else
3124                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3125                                    "Set staggered beacon mode for VDEV: %d\n",
3126                                    arvif->vdev_id);
3127
3128                 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3129                         ret = ath11k_mac_setup_bcn_tmpl(arvif);
3130                         if (ret)
3131                                 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3132                                             ret);
3133                 }
3134
3135                 if (arvif->bcca_zero_sent)
3136                         arvif->do_not_send_tmpl = true;
3137                 else
3138                         arvif->do_not_send_tmpl = false;
3139
3140                 if (vif->bss_conf.he_support) {
3141                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3142                                                             WMI_VDEV_PARAM_BA_MODE,
3143                                                             WMI_BA_MODE_BUFFER_SIZE_256);
3144                         if (ret)
3145                                 ath11k_warn(ar->ab,
3146                                             "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3147                                             arvif->vdev_id);
3148                         else
3149                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3150                                            "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3151                                            arvif->vdev_id);
3152                 }
3153         }
3154
3155         if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3156                 arvif->dtim_period = info->dtim_period;
3157
3158                 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3159                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3160                                                     param_id,
3161                                                     arvif->dtim_period);
3162
3163                 if (ret)
3164                         ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3165                                     arvif->vdev_id, ret);
3166                 else
3167                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3168                                    "DTIM period: %d set for VDEV: %d\n",
3169                                    arvif->dtim_period, arvif->vdev_id);
3170         }
3171
3172         if (changed & BSS_CHANGED_SSID &&
3173             vif->type == NL80211_IFTYPE_AP) {
3174                 arvif->u.ap.ssid_len = info->ssid_len;
3175                 if (info->ssid_len)
3176                         memcpy(arvif->u.ap.ssid, info->ssid, info->ssid_len);
3177                 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3178         }
3179
3180         if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3181                 ether_addr_copy(arvif->bssid, info->bssid);
3182
3183         if (changed & BSS_CHANGED_BEACON_ENABLED) {
3184                 ath11k_control_beaconing(arvif, info);
3185
3186                 if (arvif->is_up && vif->bss_conf.he_support &&
3187                     vif->bss_conf.he_oper.params) {
3188                         param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3189                         param_value = vif->bss_conf.he_oper.params;
3190                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3191                                                             param_id, param_value);
3192                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3193                                    "he oper param: %x set for VDEV: %d\n",
3194                                    param_value, arvif->vdev_id);
3195
3196                         if (ret)
3197                                 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3198                                             param_value, arvif->vdev_id, ret);
3199                 }
3200         }
3201
3202         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3203                 u32 cts_prot;
3204
3205                 cts_prot = !!(info->use_cts_prot);
3206                 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3207
3208                 if (arvif->is_started) {
3209                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3210                                                             param_id, cts_prot);
3211                         if (ret)
3212                                 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3213                                             arvif->vdev_id);
3214                         else
3215                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3216                                            cts_prot, arvif->vdev_id);
3217                 } else {
3218                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3219                 }
3220         }
3221
3222         if (changed & BSS_CHANGED_ERP_SLOT) {
3223                 u32 slottime;
3224
3225                 if (info->use_short_slot)
3226                         slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3227
3228                 else
3229                         slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3230
3231                 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3232                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3233                                                     param_id, slottime);
3234                 if (ret)
3235                         ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3236                                     arvif->vdev_id);
3237                 else
3238                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3239                                    "Set slottime: %d for VDEV: %d\n",
3240                                    slottime, arvif->vdev_id);
3241         }
3242
3243         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3244                 u32 preamble;
3245
3246                 if (info->use_short_preamble)
3247                         preamble = WMI_VDEV_PREAMBLE_SHORT;
3248                 else
3249                         preamble = WMI_VDEV_PREAMBLE_LONG;
3250
3251                 param_id = WMI_VDEV_PARAM_PREAMBLE;
3252                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3253                                                     param_id, preamble);
3254                 if (ret)
3255                         ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3256                                     arvif->vdev_id);
3257                 else
3258                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3259                                    "Set preamble: %d for VDEV: %d\n",
3260                                    preamble, arvif->vdev_id);
3261         }
3262
3263         if (changed & BSS_CHANGED_ASSOC) {
3264                 if (info->assoc)
3265                         ath11k_bss_assoc(hw, vif, info);
3266                 else
3267                         ath11k_bss_disassoc(hw, vif);
3268         }
3269
3270         if (changed & BSS_CHANGED_TXPOWER) {
3271                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3272                            arvif->vdev_id, info->txpower);
3273
3274                 arvif->txpower = info->txpower;
3275                 ath11k_mac_txpower_recalc(ar);
3276         }
3277
3278         if (changed & BSS_CHANGED_PS &&
3279             ar->ab->hw_params.supports_sta_ps) {
3280                 arvif->ps = vif->bss_conf.ps;
3281
3282                 ret = ath11k_mac_config_ps(ar);
3283                 if (ret)
3284                         ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3285                                     arvif->vdev_id, ret);
3286         }
3287
3288         if (changed & BSS_CHANGED_MCAST_RATE &&
3289             !ath11k_mac_vif_chan(arvif->vif, &def)) {
3290                 band = def.chan->band;
3291                 mcast_rate = vif->bss_conf.mcast_rate[band];
3292
3293                 if (mcast_rate > 0)
3294                         rateidx = mcast_rate - 1;
3295                 else
3296                         rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3297
3298                 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3299                         rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3300
3301                 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3302                 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3303
3304                 if (ath11k_mac_bitrate_is_cck(bitrate))
3305                         preamble = WMI_RATE_PREAMBLE_CCK;
3306                 else
3307                         preamble = WMI_RATE_PREAMBLE_OFDM;
3308
3309                 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3310
3311                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3312                            "mac vdev %d mcast_rate %x\n",
3313                            arvif->vdev_id, rate);
3314
3315                 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3316                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3317                                                     vdev_param, rate);
3318                 if (ret)
3319                         ath11k_warn(ar->ab,
3320                                     "failed to set mcast rate on vdev %i: %d\n",
3321                                     arvif->vdev_id,  ret);
3322
3323                 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3324                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3325                                                     vdev_param, rate);
3326                 if (ret)
3327                         ath11k_warn(ar->ab,
3328                                     "failed to set bcast rate on vdev %i: %d\n",
3329                                     arvif->vdev_id,  ret);
3330         }
3331
3332         if (changed & BSS_CHANGED_BASIC_RATES &&
3333             !ath11k_mac_vif_chan(arvif->vif, &def))
3334                 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3335
3336         if (changed & BSS_CHANGED_TWT) {
3337                 if (info->twt_requester || info->twt_responder)
3338                         ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
3339                 else
3340                         ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3341         }
3342
3343         if (changed & BSS_CHANGED_HE_OBSS_PD)
3344                 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3345
3346         if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3347                 if (vif->type == NL80211_IFTYPE_AP) {
3348                         ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3349                                 ar, arvif->vdev_id, info->he_bss_color.color,
3350                                 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3351                                 info->he_bss_color.enabled);
3352                         if (ret)
3353                                 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3354                                             arvif->vdev_id,  ret);
3355
3356                         param_id = WMI_VDEV_PARAM_BSS_COLOR;
3357                         if (info->he_bss_color.enabled)
3358                                 param_value = info->he_bss_color.color <<
3359                                                 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3360                         else
3361                                 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3362
3363                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3364                                                             param_id,
3365                                                             param_value);
3366                         if (ret)
3367                                 ath11k_warn(ar->ab,
3368                                             "failed to set bss color param on vdev %i: %d\n",
3369                                             arvif->vdev_id,  ret);
3370
3371                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3372                                    "bss color param 0x%x set on vdev %i\n",
3373                                    param_value, arvif->vdev_id);
3374                 } else if (vif->type == NL80211_IFTYPE_STATION) {
3375                         ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3376                                                                           arvif->vdev_id,
3377                                                                           1);
3378                         if (ret)
3379                                 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3380                                             arvif->vdev_id,  ret);
3381                         ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3382                                 ar, arvif->vdev_id, 0,
3383                                 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3384                         if (ret)
3385                                 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3386                                             arvif->vdev_id,  ret);
3387                 }
3388         }
3389
3390         if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3391             changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3392                 ath11k_mac_fils_discovery(arvif, info);
3393
3394         mutex_unlock(&ar->conf_mutex);
3395 }
3396
3397 void __ath11k_mac_scan_finish(struct ath11k *ar)
3398 {
3399         lockdep_assert_held(&ar->data_lock);
3400
3401         switch (ar->scan.state) {
3402         case ATH11K_SCAN_IDLE:
3403                 break;
3404         case ATH11K_SCAN_RUNNING:
3405         case ATH11K_SCAN_ABORTING:
3406                 if (ar->scan.is_roc && ar->scan.roc_notify)
3407                         ieee80211_remain_on_channel_expired(ar->hw);
3408                 fallthrough;
3409         case ATH11K_SCAN_STARTING:
3410                 if (!ar->scan.is_roc) {
3411                         struct cfg80211_scan_info info = {
3412                                 .aborted = ((ar->scan.state ==
3413                                             ATH11K_SCAN_ABORTING) ||
3414                                             (ar->scan.state ==
3415                                             ATH11K_SCAN_STARTING)),
3416                         };
3417
3418                         ieee80211_scan_completed(ar->hw, &info);
3419                 }
3420
3421                 ar->scan.state = ATH11K_SCAN_IDLE;
3422                 ar->scan_channel = NULL;
3423                 ar->scan.roc_freq = 0;
3424                 cancel_delayed_work(&ar->scan.timeout);
3425                 complete(&ar->scan.completed);
3426                 break;
3427         }
3428 }
3429
3430 void ath11k_mac_scan_finish(struct ath11k *ar)
3431 {
3432         spin_lock_bh(&ar->data_lock);
3433         __ath11k_mac_scan_finish(ar);
3434         spin_unlock_bh(&ar->data_lock);
3435 }
3436
3437 static int ath11k_scan_stop(struct ath11k *ar)
3438 {
3439         struct scan_cancel_param arg = {
3440                 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3441                 .scan_id = ATH11K_SCAN_ID,
3442         };
3443         int ret;
3444
3445         lockdep_assert_held(&ar->conf_mutex);
3446
3447         /* TODO: Fill other STOP Params */
3448         arg.pdev_id = ar->pdev->pdev_id;
3449
3450         ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3451         if (ret) {
3452                 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3453                 goto out;
3454         }
3455
3456         ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3457         if (ret == 0) {
3458                 ath11k_warn(ar->ab,
3459                             "failed to receive scan abort comple: timed out\n");
3460                 ret = -ETIMEDOUT;
3461         } else if (ret > 0) {
3462                 ret = 0;
3463         }
3464
3465 out:
3466         /* Scan state should be updated upon scan completion but in case
3467          * firmware fails to deliver the event (for whatever reason) it is
3468          * desired to clean up scan state anyway. Firmware may have just
3469          * dropped the scan completion event delivery due to transport pipe
3470          * being overflown with data and/or it can recover on its own before
3471          * next scan request is submitted.
3472          */
3473         spin_lock_bh(&ar->data_lock);
3474         if (ar->scan.state != ATH11K_SCAN_IDLE)
3475                 __ath11k_mac_scan_finish(ar);
3476         spin_unlock_bh(&ar->data_lock);
3477
3478         return ret;
3479 }
3480
3481 static void ath11k_scan_abort(struct ath11k *ar)
3482 {
3483         int ret;
3484
3485         lockdep_assert_held(&ar->conf_mutex);
3486
3487         spin_lock_bh(&ar->data_lock);
3488
3489         switch (ar->scan.state) {
3490         case ATH11K_SCAN_IDLE:
3491                 /* This can happen if timeout worker kicked in and called
3492                  * abortion while scan completion was being processed.
3493                  */
3494                 break;
3495         case ATH11K_SCAN_STARTING:
3496         case ATH11K_SCAN_ABORTING:
3497                 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3498                             ar->scan.state);
3499                 break;
3500         case ATH11K_SCAN_RUNNING:
3501                 ar->scan.state = ATH11K_SCAN_ABORTING;
3502                 spin_unlock_bh(&ar->data_lock);
3503
3504                 ret = ath11k_scan_stop(ar);
3505                 if (ret)
3506                         ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3507
3508                 spin_lock_bh(&ar->data_lock);
3509                 break;
3510         }
3511
3512         spin_unlock_bh(&ar->data_lock);
3513 }
3514
3515 static void ath11k_scan_timeout_work(struct work_struct *work)
3516 {
3517         struct ath11k *ar = container_of(work, struct ath11k,
3518                                          scan.timeout.work);
3519
3520         mutex_lock(&ar->conf_mutex);
3521         ath11k_scan_abort(ar);
3522         mutex_unlock(&ar->conf_mutex);
3523 }
3524
3525 static int ath11k_start_scan(struct ath11k *ar,
3526                              struct scan_req_params *arg)
3527 {
3528         int ret;
3529         unsigned long timeout = 1 * HZ;
3530
3531         lockdep_assert_held(&ar->conf_mutex);
3532
3533         if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3534                 ath11k_spectral_reset_buffer(ar);
3535
3536         ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3537         if (ret)
3538                 return ret;
3539
3540         if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3541                 timeout = 5 * HZ;
3542
3543                 if (ar->supports_6ghz)
3544                         timeout += 5 * HZ;
3545         }
3546
3547         ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3548         if (ret == 0) {
3549                 ret = ath11k_scan_stop(ar);
3550                 if (ret)
3551                         ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3552
3553                 return -ETIMEDOUT;
3554         }
3555
3556         /* If we failed to start the scan, return error code at
3557          * this point.  This is probably due to some issue in the
3558          * firmware, but no need to wedge the driver due to that...
3559          */
3560         spin_lock_bh(&ar->data_lock);
3561         if (ar->scan.state == ATH11K_SCAN_IDLE) {
3562                 spin_unlock_bh(&ar->data_lock);
3563                 return -EINVAL;
3564         }
3565         spin_unlock_bh(&ar->data_lock);
3566
3567         return 0;
3568 }
3569
3570 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3571                                  struct ieee80211_vif *vif,
3572                                  struct ieee80211_scan_request *hw_req)
3573 {
3574         struct ath11k *ar = hw->priv;
3575         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3576         struct cfg80211_scan_request *req = &hw_req->req;
3577         struct scan_req_params arg;
3578         int ret = 0;
3579         int i;
3580
3581         mutex_lock(&ar->conf_mutex);
3582
3583         spin_lock_bh(&ar->data_lock);
3584         switch (ar->scan.state) {
3585         case ATH11K_SCAN_IDLE:
3586                 reinit_completion(&ar->scan.started);
3587                 reinit_completion(&ar->scan.completed);
3588                 ar->scan.state = ATH11K_SCAN_STARTING;
3589                 ar->scan.is_roc = false;
3590                 ar->scan.vdev_id = arvif->vdev_id;
3591                 ret = 0;
3592                 break;
3593         case ATH11K_SCAN_STARTING:
3594         case ATH11K_SCAN_RUNNING:
3595         case ATH11K_SCAN_ABORTING:
3596                 ret = -EBUSY;
3597                 break;
3598         }
3599         spin_unlock_bh(&ar->data_lock);
3600
3601         if (ret)
3602                 goto exit;
3603
3604         memset(&arg, 0, sizeof(arg));
3605         ath11k_wmi_start_scan_init(ar, &arg);
3606         arg.vdev_id = arvif->vdev_id;
3607         arg.scan_id = ATH11K_SCAN_ID;
3608
3609         if (req->ie_len) {
3610                 arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3611                 if (!arg.extraie.ptr) {
3612                         ret = -ENOMEM;
3613                         goto exit;
3614                 }
3615                 arg.extraie.len = req->ie_len;
3616         }
3617
3618         if (req->n_ssids) {
3619                 arg.num_ssids = req->n_ssids;
3620                 for (i = 0; i < arg.num_ssids; i++) {
3621                         arg.ssid[i].length  = req->ssids[i].ssid_len;
3622                         memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid,
3623                                req->ssids[i].ssid_len);
3624                 }
3625         } else {
3626                 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
3627         }
3628
3629         if (req->n_channels) {
3630                 arg.num_chan = req->n_channels;
3631                 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3632                                         GFP_KERNEL);
3633
3634                 if (!arg.chan_list) {
3635                         ret = -ENOMEM;
3636                         goto exit;
3637                 }
3638
3639                 for (i = 0; i < arg.num_chan; i++)
3640                         arg.chan_list[i] = req->channels[i]->center_freq;
3641         }
3642
3643         if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3644                 arg.scan_f_add_spoofed_mac_in_probe = 1;
3645                 ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
3646                 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
3647         }
3648
3649         ret = ath11k_start_scan(ar, &arg);
3650         if (ret) {
3651                 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3652                 spin_lock_bh(&ar->data_lock);
3653                 ar->scan.state = ATH11K_SCAN_IDLE;
3654                 spin_unlock_bh(&ar->data_lock);
3655         }
3656
3657         /* Add a 200ms margin to account for event/command processing */
3658         ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3659                                      msecs_to_jiffies(arg.max_scan_time +
3660                                                       ATH11K_MAC_SCAN_TIMEOUT_MSECS));
3661
3662 exit:
3663         kfree(arg.chan_list);
3664
3665         if (req->ie_len)
3666                 kfree(arg.extraie.ptr);
3667
3668         mutex_unlock(&ar->conf_mutex);
3669
3670         if (ar->state_11d == ATH11K_11D_PREPARING)
3671                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3672
3673         return ret;
3674 }
3675
3676 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3677                                          struct ieee80211_vif *vif)
3678 {
3679         struct ath11k *ar = hw->priv;
3680
3681         mutex_lock(&ar->conf_mutex);
3682         ath11k_scan_abort(ar);
3683         mutex_unlock(&ar->conf_mutex);
3684
3685         cancel_delayed_work_sync(&ar->scan.timeout);
3686 }
3687
3688 static int ath11k_install_key(struct ath11k_vif *arvif,
3689                               struct ieee80211_key_conf *key,
3690                               enum set_key_cmd cmd,
3691                               const u8 *macaddr, u32 flags)
3692 {
3693         int ret;
3694         struct ath11k *ar = arvif->ar;
3695         struct wmi_vdev_install_key_arg arg = {
3696                 .vdev_id = arvif->vdev_id,
3697                 .key_idx = key->keyidx,
3698                 .key_len = key->keylen,
3699                 .key_data = key->key,
3700                 .key_flags = flags,
3701                 .macaddr = macaddr,
3702         };
3703
3704         lockdep_assert_held(&arvif->ar->conf_mutex);
3705
3706         reinit_completion(&ar->install_key_done);
3707
3708         if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3709                 return 0;
3710
3711         if (cmd == DISABLE_KEY) {
3712                 arg.key_cipher = WMI_CIPHER_NONE;
3713                 arg.key_data = NULL;
3714                 goto install;
3715         }
3716
3717         switch (key->cipher) {
3718         case WLAN_CIPHER_SUITE_CCMP:
3719                 arg.key_cipher = WMI_CIPHER_AES_CCM;
3720                 /* TODO: Re-check if flag is valid */
3721                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3722                 break;
3723         case WLAN_CIPHER_SUITE_TKIP:
3724                 arg.key_cipher = WMI_CIPHER_TKIP;
3725                 arg.key_txmic_len = 8;
3726                 arg.key_rxmic_len = 8;
3727                 break;
3728         case WLAN_CIPHER_SUITE_CCMP_256:
3729                 arg.key_cipher = WMI_CIPHER_AES_CCM;
3730                 break;
3731         case WLAN_CIPHER_SUITE_GCMP:
3732         case WLAN_CIPHER_SUITE_GCMP_256:
3733                 arg.key_cipher = WMI_CIPHER_AES_GCM;
3734                 break;
3735         default:
3736                 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3737                 return -EOPNOTSUPP;
3738         }
3739
3740         if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3741                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3742                               IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3743
3744 install:
3745         ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
3746
3747         if (ret)
3748                 return ret;
3749
3750         if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3751                 return -ETIMEDOUT;
3752
3753         return ar->install_key_status ? -EINVAL : 0;
3754 }
3755
3756 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
3757                                   const u8 *addr)
3758 {
3759         struct ath11k *ar = arvif->ar;
3760         struct ath11k_base *ab = ar->ab;
3761         struct ath11k_peer *peer;
3762         int first_errno = 0;
3763         int ret;
3764         int i;
3765         u32 flags = 0;
3766
3767         lockdep_assert_held(&ar->conf_mutex);
3768
3769         spin_lock_bh(&ab->base_lock);
3770         peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
3771         spin_unlock_bh(&ab->base_lock);
3772
3773         if (!peer)
3774                 return -ENOENT;
3775
3776         for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3777                 if (!peer->keys[i])
3778                         continue;
3779
3780                 /* key flags are not required to delete the key */
3781                 ret = ath11k_install_key(arvif, peer->keys[i],
3782                                          DISABLE_KEY, addr, flags);
3783                 if (ret < 0 && first_errno == 0)
3784                         first_errno = ret;
3785
3786                 if (ret < 0)
3787                         ath11k_warn(ab, "failed to remove peer key %d: %d\n",
3788                                     i, ret);
3789
3790                 spin_lock_bh(&ab->base_lock);
3791                 peer->keys[i] = NULL;
3792                 spin_unlock_bh(&ab->base_lock);
3793         }
3794
3795         return first_errno;
3796 }
3797
3798 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3799                                  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3800                                  struct ieee80211_key_conf *key)
3801 {
3802         struct ath11k *ar = hw->priv;
3803         struct ath11k_base *ab = ar->ab;
3804         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3805         struct ath11k_peer *peer;
3806         struct ath11k_sta *arsta;
3807         const u8 *peer_addr;
3808         int ret = 0;
3809         u32 flags = 0;
3810
3811         /* BIP needs to be done in software */
3812         if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3813             key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3814             key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3815             key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3816                 return 1;
3817
3818         if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3819                 return 1;
3820
3821         if (key->keyidx > WMI_MAX_KEY_INDEX)
3822                 return -ENOSPC;
3823
3824         mutex_lock(&ar->conf_mutex);
3825
3826         if (sta)
3827                 peer_addr = sta->addr;
3828         else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3829                 peer_addr = vif->bss_conf.bssid;
3830         else
3831                 peer_addr = vif->addr;
3832
3833         key->hw_key_idx = key->keyidx;
3834
3835         /* the peer should not disappear in mid-way (unless FW goes awry) since
3836          * we already hold conf_mutex. we just make sure its there now.
3837          */
3838         spin_lock_bh(&ab->base_lock);
3839         peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3840
3841         /* flush the fragments cache during key (re)install to
3842          * ensure all frags in the new frag list belong to the same key.
3843          */
3844         if (peer && sta && cmd == SET_KEY)
3845                 ath11k_peer_frags_flush(ar, peer);
3846         spin_unlock_bh(&ab->base_lock);
3847
3848         if (!peer) {
3849                 if (cmd == SET_KEY) {
3850                         ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
3851                                     peer_addr);
3852                         ret = -EOPNOTSUPP;
3853                         goto exit;
3854                 } else {
3855                         /* if the peer doesn't exist there is no key to disable
3856                          * anymore
3857                          */
3858                         goto exit;
3859                 }
3860         }
3861
3862         if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3863                 flags |= WMI_KEY_PAIRWISE;
3864         else
3865                 flags |= WMI_KEY_GROUP;
3866
3867         ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
3868         if (ret) {
3869                 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
3870                 goto exit;
3871         }
3872
3873         ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
3874         if (ret) {
3875                 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3876                 goto exit;
3877         }
3878
3879         spin_lock_bh(&ab->base_lock);
3880         peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3881         if (peer && cmd == SET_KEY) {
3882                 peer->keys[key->keyidx] = key;
3883                 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3884                         peer->ucast_keyidx = key->keyidx;
3885                         peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
3886                 } else {
3887                         peer->mcast_keyidx = key->keyidx;
3888                         peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
3889                 }
3890         } else if (peer && cmd == DISABLE_KEY) {
3891                 peer->keys[key->keyidx] = NULL;
3892                 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3893                         peer->ucast_keyidx = 0;
3894                 else
3895                         peer->mcast_keyidx = 0;
3896         } else if (!peer)
3897                 /* impossible unless FW goes crazy */
3898                 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3899
3900         if (sta) {
3901                 arsta = (struct ath11k_sta *)sta->drv_priv;
3902
3903                 switch (key->cipher) {
3904                 case WLAN_CIPHER_SUITE_TKIP:
3905                 case WLAN_CIPHER_SUITE_CCMP:
3906                 case WLAN_CIPHER_SUITE_CCMP_256:
3907                 case WLAN_CIPHER_SUITE_GCMP:
3908                 case WLAN_CIPHER_SUITE_GCMP_256:
3909                         if (cmd == SET_KEY)
3910                                 arsta->pn_type = HAL_PN_TYPE_WPA;
3911                         else
3912                                 arsta->pn_type = HAL_PN_TYPE_NONE;
3913                         break;
3914                 default:
3915                         arsta->pn_type = HAL_PN_TYPE_NONE;
3916                         break;
3917                 }
3918         }
3919
3920         spin_unlock_bh(&ab->base_lock);
3921
3922 exit:
3923         mutex_unlock(&ar->conf_mutex);
3924         return ret;
3925 }
3926
3927 static int
3928 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
3929                                       enum nl80211_band band,
3930                                       const struct cfg80211_bitrate_mask *mask)
3931 {
3932         int num_rates = 0;
3933         int i;
3934
3935         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3936                 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3937
3938         return num_rates;
3939 }
3940
3941 static int
3942 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
3943                                      enum nl80211_band band,
3944                                      const struct cfg80211_bitrate_mask *mask)
3945 {
3946         int num_rates = 0;
3947         int i;
3948
3949         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
3950                 num_rates += hweight16(mask->control[band].he_mcs[i]);
3951
3952         return num_rates;
3953 }
3954
3955 static int
3956 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
3957                                    struct ieee80211_sta *sta,
3958                                    const struct cfg80211_bitrate_mask *mask,
3959                                    enum nl80211_band band)
3960 {
3961         struct ath11k *ar = arvif->ar;
3962         u8 vht_rate, nss;
3963         u32 rate_code;
3964         int ret, i;
3965
3966         lockdep_assert_held(&ar->conf_mutex);
3967
3968         nss = 0;
3969
3970         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3971                 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3972                         nss = i + 1;
3973                         vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3974                 }
3975         }
3976
3977         if (!nss) {
3978                 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3979                             sta->addr);
3980                 return -EINVAL;
3981         }
3982
3983         /* Avoid updating invalid nss as fixed rate*/
3984         if (nss > sta->rx_nss)
3985                 return -EINVAL;
3986
3987         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3988                    "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
3989                    sta->addr);
3990
3991         rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
3992                                         WMI_RATE_PREAMBLE_VHT);
3993         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
3994                                         arvif->vdev_id,
3995                                         WMI_PEER_PARAM_FIXED_RATE,
3996                                         rate_code);
3997         if (ret)
3998                 ath11k_warn(ar->ab,
3999                             "failed to update STA %pM Fixed Rate %d: %d\n",
4000                              sta->addr, rate_code, ret);
4001
4002         return ret;
4003 }
4004
4005 static int
4006 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4007                                   struct ieee80211_sta *sta,
4008                                   const struct cfg80211_bitrate_mask *mask,
4009                                   enum nl80211_band band)
4010 {
4011         struct ath11k *ar = arvif->ar;
4012         u8 he_rate, nss;
4013         u32 rate_code;
4014         int ret, i;
4015
4016         lockdep_assert_held(&ar->conf_mutex);
4017
4018         nss = 0;
4019
4020         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4021                 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4022                         nss = i + 1;
4023                         he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4024                 }
4025         }
4026
4027         if (!nss) {
4028                 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4029                             sta->addr);
4030                 return -EINVAL;
4031         }
4032
4033         /* Avoid updating invalid nss as fixed rate */
4034         if (nss > sta->rx_nss)
4035                 return -EINVAL;
4036
4037         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4038                    "mac setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4039                    sta->addr);
4040
4041         rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4042                                         WMI_RATE_PREAMBLE_HE);
4043
4044         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4045                                         arvif->vdev_id,
4046                                         WMI_PEER_PARAM_FIXED_RATE,
4047                                         rate_code);
4048         if (ret)
4049                 ath11k_warn(ar->ab,
4050                             "failed to update sta %pM fixed rate %d: %d\n",
4051                             sta->addr, rate_code, ret);
4052
4053         return ret;
4054 }
4055
4056 static int ath11k_station_assoc(struct ath11k *ar,
4057                                 struct ieee80211_vif *vif,
4058                                 struct ieee80211_sta *sta,
4059                                 bool reassoc)
4060 {
4061         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4062         struct peer_assoc_params peer_arg;
4063         int ret = 0;
4064         struct cfg80211_chan_def def;
4065         enum nl80211_band band;
4066         struct cfg80211_bitrate_mask *mask;
4067         u8 num_vht_rates, num_he_rates;
4068
4069         lockdep_assert_held(&ar->conf_mutex);
4070
4071         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4072                 return -EPERM;
4073
4074         band = def.chan->band;
4075         mask = &arvif->bitrate_mask;
4076
4077         ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4078
4079         peer_arg.is_assoc = true;
4080         ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4081         if (ret) {
4082                 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4083                             sta->addr, arvif->vdev_id, ret);
4084                 return ret;
4085         }
4086
4087         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4088                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4089                             sta->addr, arvif->vdev_id);
4090                 return -ETIMEDOUT;
4091         }
4092
4093         num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4094         num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4095
4096         /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4097          * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4098          * fixed param.
4099          * Note that all other rates and NSS will be disabled for this peer.
4100          */
4101         if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
4102                 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4103                                                          band);
4104                 if (ret)
4105                         return ret;
4106         } else if (sta->he_cap.has_he && num_he_rates == 1) {
4107                 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4108                                                         band);
4109                 if (ret)
4110                         return ret;
4111         }
4112
4113         /* Re-assoc is run only to update supported rates for given station. It
4114          * doesn't make much sense to reconfigure the peer completely.
4115          */
4116         if (reassoc)
4117                 return 0;
4118
4119         ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4120                                      &sta->ht_cap, le16_to_cpu(sta->he_6ghz_capa.capa));
4121         if (ret) {
4122                 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4123                             arvif->vdev_id, ret);
4124                 return ret;
4125         }
4126
4127         if (!sta->wme) {
4128                 arvif->num_legacy_stations++;
4129                 ret = ath11k_recalc_rtscts_prot(arvif);
4130                 if (ret)
4131                         return ret;
4132         }
4133
4134         if (sta->wme && sta->uapsd_queues) {
4135                 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4136                 if (ret) {
4137                         ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4138                                     sta->addr, arvif->vdev_id, ret);
4139                         return ret;
4140                 }
4141         }
4142
4143         return 0;
4144 }
4145
4146 static int ath11k_station_disassoc(struct ath11k *ar,
4147                                    struct ieee80211_vif *vif,
4148                                    struct ieee80211_sta *sta)
4149 {
4150         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4151         int ret = 0;
4152
4153         lockdep_assert_held(&ar->conf_mutex);
4154
4155         if (!sta->wme) {
4156                 arvif->num_legacy_stations--;
4157                 ret = ath11k_recalc_rtscts_prot(arvif);
4158                 if (ret)
4159                         return ret;
4160         }
4161
4162         ret = ath11k_clear_peer_keys(arvif, sta->addr);
4163         if (ret) {
4164                 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4165                             arvif->vdev_id, ret);
4166                 return ret;
4167         }
4168         return 0;
4169 }
4170
4171 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4172 {
4173         struct ath11k *ar;
4174         struct ath11k_vif *arvif;
4175         struct ath11k_sta *arsta;
4176         struct ieee80211_sta *sta;
4177         struct cfg80211_chan_def def;
4178         enum nl80211_band band;
4179         const u8 *ht_mcs_mask;
4180         const u16 *vht_mcs_mask;
4181         const u16 *he_mcs_mask;
4182         u32 changed, bw, nss, smps;
4183         int err, num_vht_rates, num_he_rates;
4184         const struct cfg80211_bitrate_mask *mask;
4185         struct peer_assoc_params peer_arg;
4186
4187         arsta = container_of(wk, struct ath11k_sta, update_wk);
4188         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4189         arvif = arsta->arvif;
4190         ar = arvif->ar;
4191
4192         if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4193                 return;
4194
4195         band = def.chan->band;
4196         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4197         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4198         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4199
4200         spin_lock_bh(&ar->data_lock);
4201
4202         changed = arsta->changed;
4203         arsta->changed = 0;
4204
4205         bw = arsta->bw;
4206         nss = arsta->nss;
4207         smps = arsta->smps;
4208
4209         spin_unlock_bh(&ar->data_lock);
4210
4211         mutex_lock(&ar->conf_mutex);
4212
4213         nss = max_t(u32, 1, nss);
4214         nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
4215                                ath11k_mac_max_vht_nss(vht_mcs_mask)),
4216                            ath11k_mac_max_he_nss(he_mcs_mask)));
4217
4218         if (changed & IEEE80211_RC_BW_CHANGED) {
4219                 /* Send peer assoc command before set peer bandwidth param to
4220                  * avoid the mismatch between the peer phymode and the peer
4221                  * bandwidth.
4222                  */
4223                 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, &peer_arg, true);
4224
4225                 peer_arg.is_assoc = false;
4226                 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4227                 if (err) {
4228                         ath11k_warn(ar->ab, "failed to send peer assoc for STA %pM vdev %i: %d\n",
4229                                     sta->addr, arvif->vdev_id, err);
4230                 } else if (wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4231                         err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4232                                                         WMI_PEER_CHWIDTH, bw);
4233                         if (err)
4234                                 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4235                                             sta->addr, bw, err);
4236                 } else {
4237                         ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4238                                     sta->addr, arvif->vdev_id);
4239                 }
4240         }
4241
4242         if (changed & IEEE80211_RC_NSS_CHANGED) {
4243                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n",
4244                            sta->addr, nss);
4245
4246                 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4247                                                 WMI_PEER_NSS, nss);
4248                 if (err)
4249                         ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4250                                     sta->addr, nss, err);
4251         }
4252
4253         if (changed & IEEE80211_RC_SMPS_CHANGED) {
4254                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n",
4255                            sta->addr, smps);
4256
4257                 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4258                                                 WMI_PEER_MIMO_PS_STATE, smps);
4259                 if (err)
4260                         ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4261                                     sta->addr, smps, err);
4262         }
4263
4264         if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4265                 mask = &arvif->bitrate_mask;
4266                 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4267                                                                       mask);
4268                 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4269                                                                     mask);
4270
4271                 /* Peer_assoc_prepare will reject vht rates in
4272                  * bitrate_mask if its not available in range format and
4273                  * sets vht tx_rateset as unsupported. So multiple VHT MCS
4274                  * setting(eg. MCS 4,5,6) per peer is not supported here.
4275                  * But, Single rate in VHT mask can be set as per-peer
4276                  * fixed rate. But even if any HT rates are configured in
4277                  * the bitrate mask, device will not switch to those rates
4278                  * when per-peer Fixed rate is set.
4279                  * TODO: Check RATEMASK_CMDID to support auto rates selection
4280                  * across HT/VHT and for multiple VHT MCS support.
4281                  */
4282                 if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
4283                         ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4284                                                            band);
4285                 } else if (sta->he_cap.has_he && num_he_rates == 1) {
4286                         ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4287                                                           band);
4288                 } else {
4289                         /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4290                          * is provided in the new bitrate mask we set the
4291                          * other rates using peer_assoc command. Also clear
4292                          * the peer fixed rate settings as it has higher proprity
4293                          * than peer assoc
4294                          */
4295                         err = ath11k_wmi_set_peer_param(ar, sta->addr,
4296                                                         arvif->vdev_id,
4297                                                         WMI_PEER_PARAM_FIXED_RATE,
4298                                                         WMI_FIXED_RATE_NONE);
4299                         if (err)
4300                                 ath11k_warn(ar->ab,
4301                                             "failed to disable peer fixed rate for sta %pM: %d\n",
4302                                             sta->addr, err);
4303
4304                         ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4305                                                   &peer_arg, true);
4306
4307                         peer_arg.is_assoc = false;
4308                         err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4309                         if (err)
4310                                 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4311                                             sta->addr, arvif->vdev_id, err);
4312
4313                         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4314                                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4315                                             sta->addr, arvif->vdev_id);
4316                 }
4317         }
4318
4319         mutex_unlock(&ar->conf_mutex);
4320 }
4321
4322 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4323 {
4324         struct ath11k *ar;
4325         struct ath11k_vif *arvif;
4326         struct ath11k_sta *arsta;
4327         struct ieee80211_sta *sta;
4328         int ret = 0;
4329
4330         arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4331         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4332         arvif = arsta->arvif;
4333         ar = arvif->ar;
4334
4335         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4336                    "setting USE_4ADDR for peer %pM\n", sta->addr);
4337
4338         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4339                                         arvif->vdev_id,
4340                                         WMI_PEER_USE_4ADDR, 1);
4341
4342         if (ret)
4343                 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4344                             sta->addr, ret);
4345 }
4346
4347 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4348                                        struct ieee80211_sta *sta)
4349 {
4350         struct ath11k *ar = arvif->ar;
4351
4352         lockdep_assert_held(&ar->conf_mutex);
4353
4354         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4355                 return 0;
4356
4357         if (ar->num_stations >= ar->max_num_stations)
4358                 return -ENOBUFS;
4359
4360         ar->num_stations++;
4361
4362         return 0;
4363 }
4364
4365 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4366                                         struct ieee80211_sta *sta)
4367 {
4368         struct ath11k *ar = arvif->ar;
4369
4370         lockdep_assert_held(&ar->conf_mutex);
4371
4372         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4373                 return;
4374
4375         ar->num_stations--;
4376 }
4377
4378 static int ath11k_mac_station_add(struct ath11k *ar,
4379                                   struct ieee80211_vif *vif,
4380                                   struct ieee80211_sta *sta)
4381 {
4382         struct ath11k_base *ab = ar->ab;
4383         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4384         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4385         struct peer_create_params peer_param;
4386         int ret;
4387
4388         lockdep_assert_held(&ar->conf_mutex);
4389
4390         ret = ath11k_mac_inc_num_stations(arvif, sta);
4391         if (ret) {
4392                 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
4393                             ar->max_num_stations);
4394                 goto exit;
4395         }
4396
4397         arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
4398         if (!arsta->rx_stats) {
4399                 ret = -ENOMEM;
4400                 goto dec_num_station;
4401         }
4402
4403         peer_param.vdev_id = arvif->vdev_id;
4404         peer_param.peer_addr = sta->addr;
4405         peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4406
4407         ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
4408         if (ret) {
4409                 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
4410                             sta->addr, arvif->vdev_id);
4411                 goto free_rx_stats;
4412         }
4413
4414         ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
4415                    sta->addr, arvif->vdev_id);
4416
4417         if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
4418                 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
4419                 if (!arsta->tx_stats) {
4420                         ret = -ENOMEM;
4421                         goto free_peer;
4422                 }
4423         }
4424
4425         if (ieee80211_vif_is_mesh(vif)) {
4426                 ath11k_dbg(ab, ATH11K_DBG_MAC,
4427                            "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
4428                 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4429                                                 arvif->vdev_id,
4430                                                 WMI_PEER_USE_4ADDR, 1);
4431                 if (ret) {
4432                         ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
4433                                     sta->addr, ret);
4434                         goto free_tx_stats;
4435                 }
4436         }
4437
4438         ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
4439         if (ret) {
4440                 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
4441                             sta->addr, arvif->vdev_id, ret);
4442                 goto free_tx_stats;
4443         }
4444
4445         if (ab->hw_params.vdev_start_delay &&
4446             !arvif->is_started &&
4447             arvif->vdev_type != WMI_VDEV_TYPE_AP) {
4448                 ret = ath11k_start_vdev_delay(ar->hw, vif);
4449                 if (ret) {
4450                         ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
4451                         goto free_tx_stats;
4452                 }
4453         }
4454
4455         return 0;
4456
4457 free_tx_stats:
4458         kfree(arsta->tx_stats);
4459         arsta->tx_stats = NULL;
4460 free_peer:
4461         ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4462 free_rx_stats:
4463         kfree(arsta->rx_stats);
4464         arsta->rx_stats = NULL;
4465 dec_num_station:
4466         ath11k_mac_dec_num_stations(arvif, sta);
4467 exit:
4468         return ret;
4469 }
4470
4471 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
4472                                    struct ieee80211_vif *vif,
4473                                    struct ieee80211_sta *sta,
4474                                    enum ieee80211_sta_state old_state,
4475                                    enum ieee80211_sta_state new_state)
4476 {
4477         struct ath11k *ar = hw->priv;
4478         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4479         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4480         struct ath11k_peer *peer;
4481         int ret = 0;
4482
4483         /* cancel must be done outside the mutex to avoid deadlock */
4484         if ((old_state == IEEE80211_STA_NONE &&
4485              new_state == IEEE80211_STA_NOTEXIST)) {
4486                 cancel_work_sync(&arsta->update_wk);
4487                 cancel_work_sync(&arsta->set_4addr_wk);
4488         }
4489
4490         mutex_lock(&ar->conf_mutex);
4491
4492         if (old_state == IEEE80211_STA_NOTEXIST &&
4493             new_state == IEEE80211_STA_NONE) {
4494                 memset(arsta, 0, sizeof(*arsta));
4495                 arsta->arvif = arvif;
4496                 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
4497                 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
4498
4499                 ret = ath11k_mac_station_add(ar, vif, sta);
4500                 if (ret)
4501                         ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
4502                                     sta->addr, arvif->vdev_id);
4503         } else if ((old_state == IEEE80211_STA_NONE &&
4504                     new_state == IEEE80211_STA_NOTEXIST)) {
4505                 bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay &&
4506                         vif->type == NL80211_IFTYPE_STATION;
4507
4508                 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4509
4510                 if (!skip_peer_delete) {
4511                         ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4512                         if (ret)
4513                                 ath11k_warn(ar->ab,
4514                                             "Failed to delete peer: %pM for VDEV: %d\n",
4515                                             sta->addr, arvif->vdev_id);
4516                         else
4517                                 ath11k_dbg(ar->ab,
4518                                            ATH11K_DBG_MAC,
4519                                            "Removed peer: %pM for VDEV: %d\n",
4520                                            sta->addr, arvif->vdev_id);
4521                 }
4522
4523                 ath11k_mac_dec_num_stations(arvif, sta);
4524                 spin_lock_bh(&ar->ab->base_lock);
4525                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4526                 if (skip_peer_delete && peer) {
4527                         peer->sta = NULL;
4528                 } else if (peer && peer->sta == sta) {
4529                         ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4530                                     vif->addr, arvif->vdev_id);
4531                         peer->sta = NULL;
4532                         list_del(&peer->list);
4533                         kfree(peer);
4534                         ar->num_peers--;
4535                 }
4536                 spin_unlock_bh(&ar->ab->base_lock);
4537
4538                 kfree(arsta->tx_stats);
4539                 arsta->tx_stats = NULL;
4540
4541                 kfree(arsta->rx_stats);
4542                 arsta->rx_stats = NULL;
4543         } else if (old_state == IEEE80211_STA_AUTH &&
4544                    new_state == IEEE80211_STA_ASSOC &&
4545                    (vif->type == NL80211_IFTYPE_AP ||
4546                     vif->type == NL80211_IFTYPE_MESH_POINT ||
4547                     vif->type == NL80211_IFTYPE_ADHOC)) {
4548                 ret = ath11k_station_assoc(ar, vif, sta, false);
4549                 if (ret)
4550                         ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
4551                                     sta->addr);
4552         } else if (old_state == IEEE80211_STA_ASSOC &&
4553                    new_state == IEEE80211_STA_AUTHORIZED) {
4554                 spin_lock_bh(&ar->ab->base_lock);
4555
4556                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4557                 if (peer)
4558                         peer->is_authorized = true;
4559
4560                 spin_unlock_bh(&ar->ab->base_lock);
4561
4562                 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4563                         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4564                                                         arvif->vdev_id,
4565                                                         WMI_PEER_AUTHORIZE,
4566                                                         1);
4567                         if (ret)
4568                                 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4569                                             sta->addr, arvif->vdev_id, ret);
4570                 }
4571         } else if (old_state == IEEE80211_STA_AUTHORIZED &&
4572                    new_state == IEEE80211_STA_ASSOC) {
4573                 spin_lock_bh(&ar->ab->base_lock);
4574
4575                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4576                 if (peer)
4577                         peer->is_authorized = false;
4578
4579                 spin_unlock_bh(&ar->ab->base_lock);
4580         } else if (old_state == IEEE80211_STA_ASSOC &&
4581                    new_state == IEEE80211_STA_AUTH &&
4582                    (vif->type == NL80211_IFTYPE_AP ||
4583                     vif->type == NL80211_IFTYPE_MESH_POINT ||
4584                     vif->type == NL80211_IFTYPE_ADHOC)) {
4585                 ret = ath11k_station_disassoc(ar, vif, sta);
4586                 if (ret)
4587                         ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4588                                     sta->addr);
4589         }
4590
4591         mutex_unlock(&ar->conf_mutex);
4592         return ret;
4593 }
4594
4595 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4596                                        struct ieee80211_vif *vif,
4597                                        struct ieee80211_sta *sta)
4598 {
4599         struct ath11k *ar = hw->priv;
4600         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4601         int ret = 0;
4602         s16 txpwr;
4603
4604         if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4605                 txpwr = 0;
4606         } else {
4607                 txpwr = sta->txpwr.power;
4608                 if (!txpwr)
4609                         return -EINVAL;
4610         }
4611
4612         if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
4613                 return -EINVAL;
4614
4615         mutex_lock(&ar->conf_mutex);
4616
4617         ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4618                                         WMI_PEER_USE_FIXED_PWR, txpwr);
4619         if (ret) {
4620                 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4621                             ret);
4622                 goto out;
4623         }
4624
4625 out:
4626         mutex_unlock(&ar->conf_mutex);
4627         return ret;
4628 }
4629
4630 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
4631                                         struct ieee80211_vif *vif,
4632                                         struct ieee80211_sta *sta, bool enabled)
4633 {
4634         struct ath11k *ar = hw->priv;
4635         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4636
4637         if (enabled && !arsta->use_4addr_set) {
4638                 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
4639                 arsta->use_4addr_set = true;
4640         }
4641 }
4642
4643 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4644                                         struct ieee80211_vif *vif,
4645                                         struct ieee80211_sta *sta,
4646                                         u32 changed)
4647 {
4648         struct ath11k *ar = hw->priv;
4649         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4650         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4651         struct ath11k_peer *peer;
4652         u32 bw, smps;
4653
4654         spin_lock_bh(&ar->ab->base_lock);
4655
4656         peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4657         if (!peer) {
4658                 spin_unlock_bh(&ar->ab->base_lock);
4659                 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4660                             sta->addr, arvif->vdev_id);
4661                 return;
4662         }
4663
4664         spin_unlock_bh(&ar->ab->base_lock);
4665
4666         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4667                    "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4668                    sta->addr, changed, sta->bandwidth, sta->rx_nss,
4669                    sta->smps_mode);
4670
4671         spin_lock_bh(&ar->data_lock);
4672
4673         if (changed & IEEE80211_RC_BW_CHANGED) {
4674                 bw = WMI_PEER_CHWIDTH_20MHZ;
4675
4676                 switch (sta->bandwidth) {
4677                 case IEEE80211_STA_RX_BW_20:
4678                         bw = WMI_PEER_CHWIDTH_20MHZ;
4679                         break;
4680                 case IEEE80211_STA_RX_BW_40:
4681                         bw = WMI_PEER_CHWIDTH_40MHZ;
4682                         break;
4683                 case IEEE80211_STA_RX_BW_80:
4684                         bw = WMI_PEER_CHWIDTH_80MHZ;
4685                         break;
4686                 case IEEE80211_STA_RX_BW_160:
4687                         bw = WMI_PEER_CHWIDTH_160MHZ;
4688                         break;
4689                 default:
4690                         ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
4691                                     sta->bandwidth, sta->addr);
4692                         bw = WMI_PEER_CHWIDTH_20MHZ;
4693                         break;
4694                 }
4695
4696                 arsta->bw = bw;
4697         }
4698
4699         if (changed & IEEE80211_RC_NSS_CHANGED)
4700                 arsta->nss = sta->rx_nss;
4701
4702         if (changed & IEEE80211_RC_SMPS_CHANGED) {
4703                 smps = WMI_PEER_SMPS_PS_NONE;
4704
4705                 switch (sta->smps_mode) {
4706                 case IEEE80211_SMPS_AUTOMATIC:
4707                 case IEEE80211_SMPS_OFF:
4708                         smps = WMI_PEER_SMPS_PS_NONE;
4709                         break;
4710                 case IEEE80211_SMPS_STATIC:
4711                         smps = WMI_PEER_SMPS_STATIC;
4712                         break;
4713                 case IEEE80211_SMPS_DYNAMIC:
4714                         smps = WMI_PEER_SMPS_DYNAMIC;
4715                         break;
4716                 default:
4717                         ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4718                                     sta->smps_mode, sta->addr);
4719                         smps = WMI_PEER_SMPS_PS_NONE;
4720                         break;
4721                 }
4722
4723                 arsta->smps = smps;
4724         }
4725
4726         arsta->changed |= changed;
4727
4728         spin_unlock_bh(&ar->data_lock);
4729
4730         ieee80211_queue_work(hw, &arsta->update_wk);
4731 }
4732
4733 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
4734                                 u16 ac, bool enable)
4735 {
4736         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4737         u32 value = 0;
4738         int ret = 0;
4739
4740         if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4741                 return 0;
4742
4743         switch (ac) {
4744         case IEEE80211_AC_VO:
4745                 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4746                         WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4747                 break;
4748         case IEEE80211_AC_VI:
4749                 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4750                         WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4751                 break;
4752         case IEEE80211_AC_BE:
4753                 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4754                         WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4755                 break;
4756         case IEEE80211_AC_BK:
4757                 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4758                         WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4759                 break;
4760         }
4761
4762         if (enable)
4763                 arvif->u.sta.uapsd |= value;
4764         else
4765                 arvif->u.sta.uapsd &= ~value;
4766
4767         ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4768                                           WMI_STA_PS_PARAM_UAPSD,
4769                                           arvif->u.sta.uapsd);
4770         if (ret) {
4771                 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4772                 goto exit;
4773         }
4774
4775         if (arvif->u.sta.uapsd)
4776                 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4777         else
4778                 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4779
4780         ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4781                                           WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4782                                           value);
4783         if (ret)
4784                 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4785
4786 exit:
4787         return ret;
4788 }
4789
4790 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
4791                                  struct ieee80211_vif *vif, u16 ac,
4792                                  const struct ieee80211_tx_queue_params *params)
4793 {
4794         struct ath11k *ar = hw->priv;
4795         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4796         struct wmi_wmm_params_arg *p = NULL;
4797         int ret;
4798
4799         mutex_lock(&ar->conf_mutex);
4800
4801         switch (ac) {
4802         case IEEE80211_AC_VO:
4803                 p = &arvif->wmm_params.ac_vo;
4804                 break;
4805         case IEEE80211_AC_VI:
4806                 p = &arvif->wmm_params.ac_vi;
4807                 break;
4808         case IEEE80211_AC_BE:
4809                 p = &arvif->wmm_params.ac_be;
4810                 break;
4811         case IEEE80211_AC_BK:
4812                 p = &arvif->wmm_params.ac_bk;
4813                 break;
4814         }
4815
4816         if (WARN_ON(!p)) {
4817                 ret = -EINVAL;
4818                 goto exit;
4819         }
4820
4821         p->cwmin = params->cw_min;
4822         p->cwmax = params->cw_max;
4823         p->aifs = params->aifs;
4824         p->txop = params->txop;
4825
4826         ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
4827                                                  &arvif->wmm_params);
4828         if (ret) {
4829                 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
4830                 goto exit;
4831         }
4832
4833         ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4834
4835         if (ret)
4836                 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
4837
4838 exit:
4839         mutex_unlock(&ar->conf_mutex);
4840         return ret;
4841 }
4842
4843 static struct ieee80211_sta_ht_cap
4844 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4845 {
4846         int i;
4847         struct ieee80211_sta_ht_cap ht_cap = {0};
4848         u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4849
4850         if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4851                 return ht_cap;
4852
4853         ht_cap.ht_supported = 1;
4854         ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4855         ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4856         ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4857         ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4858         ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4859
4860         if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4861                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4862
4863         if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4864                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4865
4866         if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4867                 u32 smps;
4868
4869                 smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
4870                 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4871
4872                 ht_cap.cap |= smps;
4873         }
4874
4875         if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4876                 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4877
4878         if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4879                 u32 stbc;
4880
4881                 stbc   = ar_ht_cap;
4882                 stbc  &= WMI_HT_CAP_RX_STBC;
4883                 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4884                 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4885                 stbc  &= IEEE80211_HT_CAP_RX_STBC;
4886
4887                 ht_cap.cap |= stbc;
4888         }
4889
4890         if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4891                 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4892
4893         if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4894                 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4895
4896         if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4897                 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4898
4899         for (i = 0; i < ar->num_rx_chains; i++) {
4900                 if (rate_cap_rx_chainmask & BIT(i))
4901                         ht_cap.mcs.rx_mask[i] = 0xFF;
4902         }
4903
4904         ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4905
4906         return ht_cap;
4907 }
4908
4909 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
4910 {
4911         u32 value = 0;
4912         struct ath11k *ar = arvif->ar;
4913         int nsts;
4914         int sound_dim;
4915         u32 vht_cap = ar->pdev->cap.vht_cap;
4916         u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4917
4918         if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4919                 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4920                 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4921                 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4922         }
4923
4924         if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4925                 sound_dim = vht_cap &
4926                             IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4927                 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4928                 if (sound_dim > (ar->num_tx_chains - 1))
4929                         sound_dim = ar->num_tx_chains - 1;
4930                 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4931         }
4932
4933         if (!value)
4934                 return 0;
4935
4936         if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4937                 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4938
4939                 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4940                     arvif->vdev_type == WMI_VDEV_TYPE_AP)
4941                         value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4942         }
4943
4944         /* TODO: SUBFEE not validated in HK, disable here until validated? */
4945
4946         if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4947                 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4948
4949                 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4950                     arvif->vdev_type == WMI_VDEV_TYPE_STA)
4951                         value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4952         }
4953
4954         return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4955                                              vdev_param, value);
4956 }
4957
4958 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
4959 {
4960         bool subfer, subfee;
4961         int sound_dim = 0;
4962
4963         subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4964         subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
4965
4966         if (ar->num_tx_chains < 2) {
4967                 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
4968                 subfer = false;
4969         }
4970
4971         /* If SU Beaformer is not set, then disable MU Beamformer Capability */
4972         if (!subfer)
4973                 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
4974
4975         /* If SU Beaformee is not set, then disable MU Beamformee Capability */
4976         if (!subfee)
4977                 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
4978
4979         sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4980         sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4981         *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4982
4983         /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
4984
4985         /* Enable Sounding Dimension Field only if SU BF is enabled */
4986         if (subfer) {
4987                 if (sound_dim > (ar->num_tx_chains - 1))
4988                         sound_dim = ar->num_tx_chains - 1;
4989
4990                 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4991                 sound_dim &=  IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4992                 *vht_cap |= sound_dim;
4993         }
4994
4995         /* Use the STS advertised by FW unless SU Beamformee is not supported*/
4996         if (!subfee)
4997                 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
4998 }
4999
5000 static struct ieee80211_sta_vht_cap
5001 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5002                       u32 rate_cap_rx_chainmask)
5003 {
5004         struct ieee80211_sta_vht_cap vht_cap = {0};
5005         u16 txmcs_map, rxmcs_map;
5006         int i;
5007
5008         vht_cap.vht_supported = 1;
5009         vht_cap.cap = ar->pdev->cap.vht_cap;
5010
5011         if (ar->pdev->cap.nss_ratio_enabled)
5012                 vht_cap.vht_mcs.tx_highest |=
5013                         cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5014
5015         ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5016
5017         rxmcs_map = 0;
5018         txmcs_map = 0;
5019         for (i = 0; i < 8; i++) {
5020                 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5021                         txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5022                 else
5023                         txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5024
5025                 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5026                         rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5027                 else
5028                         rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5029         }
5030
5031         if (rate_cap_tx_chainmask <= 1)
5032                 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5033
5034         vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5035         vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5036
5037         return vht_cap;
5038 }
5039
5040 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5041                                         struct ath11k_pdev_cap *cap,
5042                                         u32 *ht_cap_info)
5043 {
5044         struct ieee80211_supported_band *band;
5045         u32 rate_cap_tx_chainmask;
5046         u32 rate_cap_rx_chainmask;
5047         u32 ht_cap;
5048
5049         rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5050         rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5051
5052         if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5053                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5054                 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5055                 if (ht_cap_info)
5056                         *ht_cap_info = ht_cap;
5057                 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5058                                                     rate_cap_rx_chainmask);
5059         }
5060
5061         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5062             (ar->ab->hw_params.single_pdev_only ||
5063              !ar->supports_6ghz)) {
5064                 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5065                 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5066                 if (ht_cap_info)
5067                         *ht_cap_info = ht_cap;
5068                 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5069                                                     rate_cap_rx_chainmask);
5070                 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5071                                                       rate_cap_rx_chainmask);
5072         }
5073 }
5074
5075 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5076 {
5077         /* TODO: Check the request chainmask against the supported
5078          * chainmask table which is advertised in extented_service_ready event
5079          */
5080
5081         return 0;
5082 }
5083
5084 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5085                                   u8 *he_ppet)
5086 {
5087         int nss, ru;
5088         u8 bit = 7;
5089
5090         he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5091         he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5092                        IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5093                       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5094         for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5095                 for (ru = 0; ru < 4; ru++) {
5096                         u8 val;
5097                         int i;
5098
5099                         if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5100                                 continue;
5101                         val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5102                                0x3f;
5103                         val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5104                         for (i = 5; i >= 0; i--) {
5105                                 he_ppet[bit / 8] |=
5106                                         ((val >> i) & 0x1) << ((bit % 8));
5107                                 bit++;
5108                         }
5109                 }
5110         }
5111 }
5112
5113 static void
5114 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5115 {
5116         u8 m;
5117
5118         m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5119             IEEE80211_HE_MAC_CAP0_TWT_REQ;
5120         he_cap_elem->mac_cap_info[0] &= ~m;
5121
5122         m = IEEE80211_HE_MAC_CAP2_TRS |
5123             IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5124             IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5125         he_cap_elem->mac_cap_info[2] &= ~m;
5126
5127         m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5128             IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5129             IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5130         he_cap_elem->mac_cap_info[3] &= ~m;
5131
5132         m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5133             IEEE80211_HE_MAC_CAP4_BQR;
5134         he_cap_elem->mac_cap_info[4] &= ~m;
5135
5136         m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5137             IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5138             IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5139             IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5140         he_cap_elem->mac_cap_info[5] &= ~m;
5141
5142         m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5143             IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5144         he_cap_elem->phy_cap_info[2] &= ~m;
5145
5146         m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5147             IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5148             IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5149         he_cap_elem->phy_cap_info[3] &= ~m;
5150
5151         m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5152         he_cap_elem->phy_cap_info[4] &= ~m;
5153
5154         m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5155         he_cap_elem->phy_cap_info[5] &= ~m;
5156
5157         m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5158             IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5159             IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5160             IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5161         he_cap_elem->phy_cap_info[6] &= ~m;
5162
5163         m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5164             IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5165             IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5166             IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5167         he_cap_elem->phy_cap_info[7] &= ~m;
5168
5169         m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5170             IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5171             IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5172             IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5173         he_cap_elem->phy_cap_info[8] &= ~m;
5174
5175         m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5176             IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5177             IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5178             IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5179             IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5180             IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5181         he_cap_elem->phy_cap_info[9] &= ~m;
5182 }
5183
5184 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5185                                            struct ath11k_band_cap *bcap)
5186 {
5187         u8 val;
5188
5189         bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5190         if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5191                 bcap->he_6ghz_capa |=
5192                         FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5193                                    WLAN_HT_CAP_SM_PS_DYNAMIC);
5194         else
5195                 bcap->he_6ghz_capa |=
5196                         FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5197                                    WLAN_HT_CAP_SM_PS_DISABLED);
5198         val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5199                         pcap->vht_cap);
5200         bcap->he_6ghz_capa |=
5201                 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5202         val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5203         bcap->he_6ghz_capa |=
5204                 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5205         if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5206                 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5207         if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5208                 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5209
5210         return cpu_to_le16(bcap->he_6ghz_capa);
5211 }
5212
5213 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5214                                   struct ath11k_pdev_cap *cap,
5215                                   struct ieee80211_sband_iftype_data *data,
5216                                   int band)
5217 {
5218         int i, idx = 0;
5219
5220         for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5221                 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5222                 struct ath11k_band_cap *band_cap = &cap->band[band];
5223                 struct ieee80211_he_cap_elem *he_cap_elem =
5224                                 &he_cap->he_cap_elem;
5225
5226                 switch (i) {
5227                 case NL80211_IFTYPE_STATION:
5228                 case NL80211_IFTYPE_AP:
5229                 case NL80211_IFTYPE_MESH_POINT:
5230                         break;
5231
5232                 default:
5233                         continue;
5234                 }
5235
5236                 data[idx].types_mask = BIT(i);
5237                 he_cap->has_he = true;
5238                 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5239                        sizeof(he_cap_elem->mac_cap_info));
5240                 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5241                        sizeof(he_cap_elem->phy_cap_info));
5242
5243                 he_cap_elem->mac_cap_info[1] &=
5244                         IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5245
5246                 he_cap_elem->phy_cap_info[5] &=
5247                         ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5248                 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5249
5250                 switch (i) {
5251                 case NL80211_IFTYPE_AP:
5252                         he_cap_elem->phy_cap_info[3] &=
5253                                 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5254                         he_cap_elem->phy_cap_info[9] |=
5255                                 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5256                         break;
5257                 case NL80211_IFTYPE_STATION:
5258                         he_cap_elem->mac_cap_info[0] &=
5259                                 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5260                         he_cap_elem->mac_cap_info[0] |=
5261                                 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5262                         he_cap_elem->phy_cap_info[9] |=
5263                                 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5264                         break;
5265                 case NL80211_IFTYPE_MESH_POINT:
5266                         ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5267                         break;
5268                 }
5269
5270                 he_cap->he_mcs_nss_supp.rx_mcs_80 =
5271                         cpu_to_le16(band_cap->he_mcs & 0xffff);
5272                 he_cap->he_mcs_nss_supp.tx_mcs_80 =
5273                         cpu_to_le16(band_cap->he_mcs & 0xffff);
5274                 he_cap->he_mcs_nss_supp.rx_mcs_160 =
5275                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5276                 he_cap->he_mcs_nss_supp.tx_mcs_160 =
5277                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5278                 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5279                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5280                 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5281                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5282
5283                 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5284                 if (he_cap_elem->phy_cap_info[6] &
5285                     IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5286                         ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5287                                               he_cap->ppe_thres);
5288
5289                 if (band == NL80211_BAND_6GHZ) {
5290                         data[idx].he_6ghz_capa.capa =
5291                                 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5292                 }
5293                 idx++;
5294         }
5295
5296         return idx;
5297 }
5298
5299 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5300                                     struct ath11k_pdev_cap *cap)
5301 {
5302         struct ieee80211_supported_band *band;
5303         int count;
5304
5305         if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5306                 count = ath11k_mac_copy_he_cap(ar, cap,
5307                                                ar->mac.iftype[NL80211_BAND_2GHZ],
5308                                                NL80211_BAND_2GHZ);
5309                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5310                 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
5311                 band->n_iftype_data = count;
5312         }
5313
5314         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5315                 count = ath11k_mac_copy_he_cap(ar, cap,
5316                                                ar->mac.iftype[NL80211_BAND_5GHZ],
5317                                                NL80211_BAND_5GHZ);
5318                 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5319                 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
5320                 band->n_iftype_data = count;
5321         }
5322
5323         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5324             ar->supports_6ghz) {
5325                 count = ath11k_mac_copy_he_cap(ar, cap,
5326                                                ar->mac.iftype[NL80211_BAND_6GHZ],
5327                                                NL80211_BAND_6GHZ);
5328                 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5329                 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
5330                 band->n_iftype_data = count;
5331         }
5332 }
5333
5334 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5335 {
5336         int ret;
5337
5338         lockdep_assert_held(&ar->conf_mutex);
5339
5340         if (ath11k_check_chain_mask(ar, tx_ant, true))
5341                 return -EINVAL;
5342
5343         if (ath11k_check_chain_mask(ar, rx_ant, false))
5344                 return -EINVAL;
5345
5346         ar->cfg_tx_chainmask = tx_ant;
5347         ar->cfg_rx_chainmask = rx_ant;
5348
5349         if (ar->state != ATH11K_STATE_ON &&
5350             ar->state != ATH11K_STATE_RESTARTED)
5351                 return 0;
5352
5353         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5354                                         tx_ant, ar->pdev->pdev_id);
5355         if (ret) {
5356                 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5357                             ret, tx_ant);
5358                 return ret;
5359         }
5360
5361         ar->num_tx_chains = get_num_chains(tx_ant);
5362
5363         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5364                                         rx_ant, ar->pdev->pdev_id);
5365         if (ret) {
5366                 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5367                             ret, rx_ant);
5368                 return ret;
5369         }
5370
5371         ar->num_rx_chains = get_num_chains(rx_ant);
5372
5373         /* Reload HT/VHT/HE capability */
5374         ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5375         ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5376
5377         return 0;
5378 }
5379
5380 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5381 {
5382         int num_mgmt;
5383
5384         ieee80211_free_txskb(ar->hw, skb);
5385
5386         num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5387
5388         if (num_mgmt < 0)
5389                 WARN_ON_ONCE(1);
5390
5391         if (!num_mgmt)
5392                 wake_up(&ar->txmgmt_empty_waitq);
5393 }
5394
5395 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5396 {
5397         struct sk_buff *msdu;
5398         struct ieee80211_tx_info *info;
5399
5400         spin_lock_bh(&ar->txmgmt_idr_lock);
5401         msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5402         spin_unlock_bh(&ar->txmgmt_idr_lock);
5403
5404         if (!msdu)
5405                 return;
5406
5407         dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5408                          DMA_TO_DEVICE);
5409
5410         info = IEEE80211_SKB_CB(msdu);
5411         memset(&info->status, 0, sizeof(info->status));
5412
5413         ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5414 }
5415
5416 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5417 {
5418         struct ath11k *ar = ctx;
5419
5420         ath11k_mac_tx_mgmt_free(ar, buf_id);
5421
5422         return 0;
5423 }
5424
5425 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5426 {
5427         struct ieee80211_vif *vif = ctx;
5428         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5429         struct ath11k *ar = skb_cb->ar;
5430
5431         if (skb_cb->vif == vif)
5432                 ath11k_mac_tx_mgmt_free(ar, buf_id);
5433
5434         return 0;
5435 }
5436
5437 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5438                                   struct sk_buff *skb)
5439 {
5440         struct ath11k_base *ab = ar->ab;
5441         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5442         struct ieee80211_tx_info *info;
5443         dma_addr_t paddr;
5444         int buf_id;
5445         int ret;
5446
5447         ATH11K_SKB_CB(skb)->ar = ar;
5448
5449         spin_lock_bh(&ar->txmgmt_idr_lock);
5450         buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5451                            ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5452         spin_unlock_bh(&ar->txmgmt_idr_lock);
5453
5454         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5455                    "mac tx mgmt frame, buf id %d\n", buf_id);
5456
5457         if (buf_id < 0)
5458                 return -ENOSPC;
5459
5460         info = IEEE80211_SKB_CB(skb);
5461         if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5462                 if ((ieee80211_is_action(hdr->frame_control) ||
5463                      ieee80211_is_deauth(hdr->frame_control) ||
5464                      ieee80211_is_disassoc(hdr->frame_control)) &&
5465                      ieee80211_has_protected(hdr->frame_control)) {
5466                         skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5467                 }
5468         }
5469
5470         paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5471         if (dma_mapping_error(ab->dev, paddr)) {
5472                 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5473                 ret = -EIO;
5474                 goto err_free_idr;
5475         }
5476
5477         ATH11K_SKB_CB(skb)->paddr = paddr;
5478
5479         ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5480         if (ret) {
5481                 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5482                 goto err_unmap_buf;
5483         }
5484
5485         return 0;
5486
5487 err_unmap_buf:
5488         dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5489                          skb->len, DMA_TO_DEVICE);
5490 err_free_idr:
5491         spin_lock_bh(&ar->txmgmt_idr_lock);
5492         idr_remove(&ar->txmgmt_idr, buf_id);
5493         spin_unlock_bh(&ar->txmgmt_idr_lock);
5494
5495         return ret;
5496 }
5497
5498 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5499 {
5500         struct sk_buff *skb;
5501
5502         while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5503                 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5504 }
5505
5506 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5507 {
5508         struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5509         struct ath11k_skb_cb *skb_cb;
5510         struct ath11k_vif *arvif;
5511         struct sk_buff *skb;
5512         int ret;
5513
5514         while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5515                 skb_cb = ATH11K_SKB_CB(skb);
5516                 if (!skb_cb->vif) {
5517                         ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5518                         ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5519                         continue;
5520                 }
5521
5522                 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5523                 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) &&
5524                     arvif->is_started) {
5525                         ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5526                         if (ret) {
5527                                 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5528                                             arvif->vdev_id, ret);
5529                                 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5530                         } else {
5531                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5532                                            "mac tx mgmt frame, vdev_id %d\n",
5533                                            arvif->vdev_id);
5534                         }
5535                 } else {
5536                         ath11k_warn(ar->ab,
5537                                     "dropping mgmt frame for vdev %d, is_started %d\n",
5538                                     arvif->vdev_id,
5539                                     arvif->is_started);
5540                         ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5541                 }
5542         }
5543 }
5544
5545 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
5546                               bool is_prb_rsp)
5547 {
5548         struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5549
5550         if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5551                 return -ESHUTDOWN;
5552
5553         /* Drop probe response packets when the pending management tx
5554          * count has reached a certain threshold, so as to prioritize
5555          * other mgmt packets like auth and assoc to be sent on time
5556          * for establishing successful connections.
5557          */
5558         if (is_prb_rsp &&
5559             atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
5560                 ath11k_warn(ar->ab,
5561                             "dropping probe response as pending queue is almost full\n");
5562                 return -ENOSPC;
5563         }
5564
5565         if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
5566                 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
5567                 return -ENOSPC;
5568         }
5569
5570         skb_queue_tail(q, skb);
5571         atomic_inc(&ar->num_pending_mgmt_tx);
5572         queue_work(ar->ab->workqueue, &ar->wmi_mgmt_tx_work);
5573
5574         return 0;
5575 }
5576
5577 int ath11k_mac_rfkill_config(struct ath11k *ar)
5578 {
5579         struct ath11k_base *ab = ar->ab;
5580         u32 param;
5581         int ret;
5582
5583         if (ab->hw_params.rfkill_pin == 0)
5584                 return -EOPNOTSUPP;
5585
5586         ath11k_dbg(ab, ATH11K_DBG_MAC,
5587                    "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5588                    ab->hw_params.rfkill_pin, ab->hw_params.rfkill_cfg,
5589                    ab->hw_params.rfkill_on_level);
5590
5591         param = FIELD_PREP(WMI_RFKILL_CFG_RADIO_LEVEL,
5592                            ab->hw_params.rfkill_on_level) |
5593                 FIELD_PREP(WMI_RFKILL_CFG_GPIO_PIN_NUM,
5594                            ab->hw_params.rfkill_pin) |
5595                 FIELD_PREP(WMI_RFKILL_CFG_PIN_AS_GPIO,
5596                            ab->hw_params.rfkill_cfg);
5597
5598         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
5599                                         param, ar->pdev->pdev_id);
5600         if (ret) {
5601                 ath11k_warn(ab,
5602                             "failed to set rfkill config 0x%x: %d\n",
5603                             param, ret);
5604                 return ret;
5605         }
5606
5607         return 0;
5608 }
5609
5610 int ath11k_mac_rfkill_enable_radio(struct ath11k *ar, bool enable)
5611 {
5612         enum wmi_rfkill_enable_radio param;
5613         int ret;
5614
5615         if (enable)
5616                 param = WMI_RFKILL_ENABLE_RADIO_ON;
5617         else
5618                 param = WMI_RFKILL_ENABLE_RADIO_OFF;
5619
5620         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac %d rfkill enable %d",
5621                    ar->pdev_idx, param);
5622
5623         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
5624                                         param, ar->pdev->pdev_id);
5625         if (ret) {
5626                 ath11k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
5627                             param, ret);
5628                 return ret;
5629         }
5630
5631         return 0;
5632 }
5633
5634 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
5635                              struct ieee80211_tx_control *control,
5636                              struct sk_buff *skb)
5637 {
5638         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5639         struct ath11k *ar = hw->priv;
5640         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5641         struct ieee80211_vif *vif = info->control.vif;
5642         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5643         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5644         struct ieee80211_key_conf *key = info->control.hw_key;
5645         struct ath11k_sta *arsta = NULL;
5646         u32 info_flags = info->flags;
5647         bool is_prb_rsp;
5648         int ret;
5649
5650         memset(skb_cb, 0, sizeof(*skb_cb));
5651         skb_cb->vif = vif;
5652
5653         if (key) {
5654                 skb_cb->cipher = key->cipher;
5655                 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
5656         }
5657
5658         if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5659                 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
5660         } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5661                 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5662                 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5663                 if (ret) {
5664                         ath11k_warn(ar->ab, "failed to queue management frame %d\n",
5665                                     ret);
5666                         ieee80211_free_txskb(ar->hw, skb);
5667                 }
5668                 return;
5669         }
5670
5671         if (control->sta)
5672                 arsta = (struct ath11k_sta *)control->sta->drv_priv;
5673
5674         ret = ath11k_dp_tx(ar, arvif, arsta, skb);
5675         if (unlikely(ret)) {
5676                 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5677                 ieee80211_free_txskb(ar->hw, skb);
5678         }
5679 }
5680
5681 void ath11k_mac_drain_tx(struct ath11k *ar)
5682 {
5683         /* make sure rcu-protected mac80211 tx path itself is drained */
5684         synchronize_net();
5685
5686         cancel_work_sync(&ar->wmi_mgmt_tx_work);
5687         ath11k_mgmt_over_wmi_tx_purge(ar);
5688 }
5689
5690 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
5691 {
5692         struct htt_rx_ring_tlv_filter tlv_filter = {0};
5693         struct ath11k_base *ab = ar->ab;
5694         int i, ret = 0;
5695         u32 ring_id;
5696
5697         if (enable) {
5698                 tlv_filter = ath11k_mac_mon_status_filter_default;
5699                 if (ath11k_debugfs_rx_filter(ar))
5700                         tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
5701         }
5702
5703         for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
5704                 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
5705                 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
5706                                                        ar->dp.mac_id + i,
5707                                                        HAL_RXDMA_MONITOR_STATUS,
5708                                                        DP_RX_BUFFER_SIZE,
5709                                                        &tlv_filter);
5710         }
5711
5712         if (enable && !ar->ab->hw_params.rxdma1_enable)
5713                 mod_timer(&ar->ab->mon_reap_timer, jiffies +
5714                           msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
5715
5716         return ret;
5717 }
5718
5719 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
5720 {
5721         struct ath11k *ar = hw->priv;
5722         struct ath11k_base *ab = ar->ab;
5723         struct ath11k_pdev *pdev = ar->pdev;
5724         int ret;
5725
5726         ath11k_mac_drain_tx(ar);
5727         mutex_lock(&ar->conf_mutex);
5728
5729         switch (ar->state) {
5730         case ATH11K_STATE_OFF:
5731                 ar->state = ATH11K_STATE_ON;
5732                 break;
5733         case ATH11K_STATE_RESTARTING:
5734                 ar->state = ATH11K_STATE_RESTARTED;
5735                 break;
5736         case ATH11K_STATE_RESTARTED:
5737         case ATH11K_STATE_WEDGED:
5738         case ATH11K_STATE_ON:
5739                 WARN_ON(1);
5740                 ret = -EINVAL;
5741                 goto err;
5742         }
5743
5744         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5745                                         1, pdev->pdev_id);
5746
5747         if (ret) {
5748                 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
5749                 goto err;
5750         }
5751
5752         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5753                                         pdev->pdev_id);
5754         if (ret) {
5755                 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
5756                 goto err;
5757         }
5758
5759         if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
5760                 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5761                 if (ret) {
5762                         ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
5763                         goto err;
5764                 }
5765         }
5766
5767         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5768                                         0, pdev->pdev_id);
5769         if (ret) {
5770                 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
5771                            ret);
5772                 goto err;
5773         }
5774
5775         ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5776         if (ret) {
5777                 ath11k_err(ab, "failed to offload radar detection: %d\n",
5778                            ret);
5779                 goto err;
5780         }
5781
5782         ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5783                                                   HTT_PPDU_STATS_TAG_DEFAULT);
5784         if (ret) {
5785                 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
5786                 goto err;
5787         }
5788
5789         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5790                                         1, pdev->pdev_id);
5791
5792         if (ret) {
5793                 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5794                 goto err;
5795         }
5796
5797         __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5798
5799         /* TODO: Do we need to enable ANI? */
5800
5801         ath11k_reg_update_chan_list(ar, false);
5802
5803         ar->num_started_vdevs = 0;
5804         ar->num_created_vdevs = 0;
5805         ar->num_peers = 0;
5806         ar->allocated_vdev_map = 0;
5807
5808         /* Configure monitor status ring with default rx_filter to get rx status
5809          * such as rssi, rx_duration.
5810          */
5811         ret = ath11k_mac_config_mon_status_default(ar, true);
5812         if (ret) {
5813                 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5814                            ret);
5815                 goto err;
5816         }
5817
5818         /* Configure the hash seed for hash based reo dest ring selection */
5819         ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5820
5821         /* allow device to enter IMPS */
5822         if (ab->hw_params.idle_ps) {
5823                 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5824                                                 1, pdev->pdev_id);
5825                 if (ret) {
5826                         ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
5827                         goto err;
5828                 }
5829         }
5830
5831         mutex_unlock(&ar->conf_mutex);
5832
5833         rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5834                            &ab->pdevs[ar->pdev_idx]);
5835
5836         return 0;
5837
5838 err:
5839         ar->state = ATH11K_STATE_OFF;
5840         mutex_unlock(&ar->conf_mutex);
5841
5842         return ret;
5843 }
5844
5845 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
5846 {
5847         struct ath11k *ar = hw->priv;
5848         struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5849         int ret;
5850
5851         ath11k_mac_drain_tx(ar);
5852
5853         mutex_lock(&ar->conf_mutex);
5854         ret = ath11k_mac_config_mon_status_default(ar, false);
5855         if (ret)
5856                 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5857                            ret);
5858
5859         clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
5860         ar->state = ATH11K_STATE_OFF;
5861         mutex_unlock(&ar->conf_mutex);
5862
5863         cancel_delayed_work_sync(&ar->scan.timeout);
5864         cancel_work_sync(&ar->regd_update_work);
5865         cancel_work_sync(&ar->ab->update_11d_work);
5866         cancel_work_sync(&ar->ab->rfkill_work);
5867
5868         if (ar->state_11d == ATH11K_11D_PREPARING) {
5869                 ar->state_11d = ATH11K_11D_IDLE;
5870                 complete(&ar->completed_11d_scan);
5871         }
5872
5873         spin_lock_bh(&ar->data_lock);
5874         list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5875                 list_del(&ppdu_stats->list);
5876                 kfree(ppdu_stats);
5877         }
5878         spin_unlock_bh(&ar->data_lock);
5879
5880         rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5881
5882         synchronize_rcu();
5883
5884         atomic_set(&ar->num_pending_mgmt_tx, 0);
5885 }
5886
5887 static void
5888 ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
5889                                     struct vdev_create_params *params)
5890 {
5891         struct ath11k *ar = arvif->ar;
5892         struct ath11k_pdev *pdev = ar->pdev;
5893
5894         params->if_id = arvif->vdev_id;
5895         params->type = arvif->vdev_type;
5896         params->subtype = arvif->vdev_subtype;
5897         params->pdev_id = pdev->pdev_id;
5898
5899         if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5900                 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5901                 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5902         }
5903         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5904                 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5905                 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5906         }
5907         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5908             ar->supports_6ghz) {
5909                 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5910                 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5911         }
5912 }
5913
5914 static u32
5915 ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype)
5916 {
5917         struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
5918         struct ath11k_band_cap *cap_band = NULL;
5919         u32 *hecap_phy_ptr = NULL;
5920         u32 hemode = 0;
5921
5922         if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5923                 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5924         else
5925                 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5926
5927         hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5928
5929         hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) |
5930                  FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) |
5931                  FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr));
5932
5933         /* TODO WDS and other modes */
5934         if (viftype == NL80211_IFTYPE_AP) {
5935                 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER,
5936                           HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) |
5937                           FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
5938                           FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
5939         } else {
5940                 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
5941         }
5942
5943         return hemode;
5944 }
5945
5946 static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar,
5947                                           struct ath11k_vif *arvif)
5948 {
5949         u32 param_id, param_value;
5950         struct ath11k_base *ab = ar->ab;
5951         int ret = 0;
5952
5953         param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5954         param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5955         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5956                                             param_id, param_value);
5957         if (ret) {
5958                 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5959                             arvif->vdev_id, ret, param_value);
5960                 return ret;
5961         }
5962         param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5963         param_value =
5964                 FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
5965                 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
5966                            HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
5967         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5968                                             param_id, param_value);
5969         if (ret) {
5970                 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5971                             arvif->vdev_id, ret);
5972                 return ret;
5973         }
5974         return ret;
5975 }
5976
5977 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
5978                                              struct ieee80211_vif *vif)
5979 {
5980         struct ath11k *ar = hw->priv;
5981         struct ath11k_base *ab = ar->ab;
5982         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5983         u32 param_id, param_value;
5984         int ret;
5985
5986         param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
5987         if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
5988             (vif->type != NL80211_IFTYPE_STATION &&
5989              vif->type != NL80211_IFTYPE_AP))
5990                 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
5991                                         IEEE80211_OFFLOAD_DECAP_ENABLED);
5992
5993         if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
5994                 param_value = ATH11K_HW_TXRX_ETHERNET;
5995         else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
5996                 param_value = ATH11K_HW_TXRX_RAW;
5997         else
5998                 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
5999
6000         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6001                                             param_id, param_value);
6002         if (ret) {
6003                 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6004                             arvif->vdev_id, ret);
6005                 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6006         }
6007
6008         param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6009         if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6010                 param_value = ATH11K_HW_TXRX_ETHERNET;
6011         else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6012                 param_value = ATH11K_HW_TXRX_RAW;
6013         else
6014                 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6015
6016         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6017                                             param_id, param_value);
6018         if (ret) {
6019                 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6020                             arvif->vdev_id, ret);
6021                 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6022         }
6023 }
6024
6025 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6026 {
6027         struct ath11k *ar;
6028         struct ath11k_pdev *pdev;
6029         struct ath11k_vif *arvif;
6030         int i;
6031
6032         for (i = 0; i < ab->num_radios; i++) {
6033                 pdev = &ab->pdevs[i];
6034                 ar = pdev->ar;
6035                 list_for_each_entry(arvif, &ar->arvifs, list) {
6036                         if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6037                                 return true;
6038                 }
6039         }
6040         return false;
6041 }
6042
6043 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6044 {
6045         struct wmi_11d_scan_start_params param;
6046         int ret;
6047
6048         mutex_lock(&ar->ab->vdev_id_11d_lock);
6049
6050         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev id for 11d scan %d\n",
6051                    ar->vdev_id_11d_scan);
6052
6053         if (ar->regdom_set_by_user)
6054                 goto fin;
6055
6056         if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6057                 goto fin;
6058
6059         if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6060                 goto fin;
6061
6062         if (ath11k_mac_vif_ap_active_any(ar->ab))
6063                 goto fin;
6064
6065         param.vdev_id = vdev_id;
6066         param.start_interval_msec = 0;
6067         param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6068
6069         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac start 11d scan\n");
6070
6071         ret = ath11k_wmi_send_11d_scan_start_cmd(ar, &param);
6072         if (ret) {
6073                 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6074                             vdev_id, ret);
6075         } else {
6076                 ar->vdev_id_11d_scan = vdev_id;
6077                 if (ar->state_11d == ATH11K_11D_PREPARING)
6078                         ar->state_11d = ATH11K_11D_RUNNING;
6079         }
6080
6081 fin:
6082         if (ar->state_11d == ATH11K_11D_PREPARING) {
6083                 ar->state_11d = ATH11K_11D_IDLE;
6084                 complete(&ar->completed_11d_scan);
6085         }
6086
6087         mutex_unlock(&ar->ab->vdev_id_11d_lock);
6088 }
6089
6090 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6091 {
6092         int ret;
6093         u32 vdev_id;
6094
6095         if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6096                 return;
6097
6098         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d scan\n");
6099
6100         mutex_lock(&ar->ab->vdev_id_11d_lock);
6101
6102         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d vdev id %d\n",
6103                    ar->vdev_id_11d_scan);
6104
6105         if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6106                 vdev_id = ar->vdev_id_11d_scan;
6107
6108                 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6109                 if (ret) {
6110                         ath11k_warn(ar->ab,
6111                                     "failed to stopt 11d scan vdev %d ret: %d\n",
6112                                     vdev_id, ret);
6113                 } else {
6114                         ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6115                         ar->state_11d = ATH11K_11D_IDLE;
6116                         complete(&ar->completed_11d_scan);
6117                 }
6118         }
6119         mutex_unlock(&ar->ab->vdev_id_11d_lock);
6120 }
6121
6122 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6123 {
6124         struct ath11k *ar;
6125         struct ath11k_pdev *pdev;
6126         int i;
6127
6128         ath11k_dbg(ab, ATH11K_DBG_MAC, "mac stop soc 11d scan\n");
6129
6130         for (i = 0; i < ab->num_radios; i++) {
6131                 pdev = &ab->pdevs[i];
6132                 ar = pdev->ar;
6133
6134                 ath11k_mac_11d_scan_stop(ar);
6135         }
6136 }
6137
6138 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6139                                        struct ieee80211_vif *vif)
6140 {
6141         struct ath11k *ar = hw->priv;
6142         struct ath11k_base *ab = ar->ab;
6143         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6144         struct vdev_create_params vdev_param = {0};
6145         struct peer_create_params peer_param;
6146         u32 param_id, param_value;
6147         u16 nss;
6148         int i;
6149         int ret, fbret;
6150         int bit;
6151
6152         vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6153
6154         mutex_lock(&ar->conf_mutex);
6155
6156         if (vif->type == NL80211_IFTYPE_AP &&
6157             ar->num_peers > (ar->max_num_peers - 1)) {
6158                 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6159                 ret = -ENOBUFS;
6160                 goto err;
6161         }
6162
6163         if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6164                 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6165                             ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6166                 ret = -EBUSY;
6167                 goto err;
6168         }
6169
6170         memset(arvif, 0, sizeof(*arvif));
6171
6172         arvif->ar = ar;
6173         arvif->vif = vif;
6174
6175         INIT_LIST_HEAD(&arvif->list);
6176         INIT_DELAYED_WORK(&arvif->connection_loss_work,
6177                           ath11k_mac_vif_sta_connection_loss_work);
6178
6179         for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6180                 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6181                 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6182                 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6183                        sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6184                 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6185                        sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6186                 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6187                        sizeof(arvif->bitrate_mask.control[i].he_mcs));
6188         }
6189
6190         bit = __ffs64(ab->free_vdev_map);
6191
6192         arvif->vdev_id = bit;
6193         arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6194
6195         switch (vif->type) {
6196         case NL80211_IFTYPE_UNSPECIFIED:
6197         case NL80211_IFTYPE_STATION:
6198                 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6199                 break;
6200         case NL80211_IFTYPE_MESH_POINT:
6201                 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6202                 fallthrough;
6203         case NL80211_IFTYPE_AP:
6204                 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6205                 break;
6206         case NL80211_IFTYPE_MONITOR:
6207                 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6208                 ar->monitor_vdev_id = bit;
6209                 break;
6210         default:
6211                 WARN_ON(1);
6212                 break;
6213         }
6214
6215         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
6216                    arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6217                    ab->free_vdev_map);
6218
6219         vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6220         for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6221                 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6222
6223         ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6224
6225         ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6226         if (ret) {
6227                 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6228                             arvif->vdev_id, ret);
6229                 goto err;
6230         }
6231
6232         ar->num_created_vdevs++;
6233         ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6234                    vif->addr, arvif->vdev_id);
6235         ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6236         ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6237
6238         spin_lock_bh(&ar->data_lock);
6239         list_add(&arvif->list, &ar->arvifs);
6240         spin_unlock_bh(&ar->data_lock);
6241
6242         ath11k_mac_op_update_vif_offload(hw, vif);
6243
6244         nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6245         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6246                                             WMI_VDEV_PARAM_NSS, nss);
6247         if (ret) {
6248                 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6249                             arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6250                 goto err_vdev_del;
6251         }
6252
6253         switch (arvif->vdev_type) {
6254         case WMI_VDEV_TYPE_AP:
6255                 peer_param.vdev_id = arvif->vdev_id;
6256                 peer_param.peer_addr = vif->addr;
6257                 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6258                 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6259                 if (ret) {
6260                         ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6261                                     arvif->vdev_id, ret);
6262                         goto err_vdev_del;
6263                 }
6264
6265                 ret = ath11k_mac_set_kickout(arvif);
6266                 if (ret) {
6267                         ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6268                                     arvif->vdev_id, ret);
6269                         goto err_peer_del;
6270                 }
6271
6272                 ath11k_mac_11d_scan_stop_all(ar->ab);
6273                 break;
6274         case WMI_VDEV_TYPE_STA:
6275                 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6276                 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6277                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6278                                                   param_id, param_value);
6279                 if (ret) {
6280                         ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6281                                     arvif->vdev_id, ret);
6282                         goto err_peer_del;
6283                 }
6284
6285                 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6286                 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6287                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6288                                                   param_id, param_value);
6289                 if (ret) {
6290                         ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6291                                     arvif->vdev_id, ret);
6292                         goto err_peer_del;
6293                 }
6294
6295                 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6296                 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6297                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6298                                                   param_id, param_value);
6299                 if (ret) {
6300                         ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6301                                     arvif->vdev_id, ret);
6302                         goto err_peer_del;
6303                 }
6304
6305                 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6306                                                   WMI_STA_PS_MODE_DISABLED);
6307                 if (ret) {
6308                         ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6309                                     arvif->vdev_id, ret);
6310                         goto err_peer_del;
6311                 }
6312
6313                 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6314                         reinit_completion(&ar->completed_11d_scan);
6315                         ar->state_11d = ATH11K_11D_PREPARING;
6316                 }
6317                 break;
6318         case WMI_VDEV_TYPE_MONITOR:
6319                 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6320                 break;
6321         default:
6322                 break;
6323         }
6324
6325         arvif->txpower = vif->bss_conf.txpower;
6326         ret = ath11k_mac_txpower_recalc(ar);
6327         if (ret)
6328                 goto err_peer_del;
6329
6330         param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6331         param_value = ar->hw->wiphy->rts_threshold;
6332         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6333                                             param_id, param_value);
6334         if (ret) {
6335                 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6336                             arvif->vdev_id, ret);
6337         }
6338
6339         ath11k_dp_vdev_tx_attach(ar, arvif);
6340
6341         if (vif->type != NL80211_IFTYPE_MONITOR &&
6342             test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6343                 ret = ath11k_mac_monitor_vdev_create(ar);
6344                 if (ret) {
6345                         ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6346                                     ret);
6347                         goto err_peer_del;
6348                 }
6349         }
6350
6351         ret = ath11k_debugfs_add_interface(arvif);
6352         if (ret)
6353                 goto err_peer_del;
6354
6355         mutex_unlock(&ar->conf_mutex);
6356
6357         return 0;
6358
6359 err_peer_del:
6360         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6361                 reinit_completion(&ar->peer_delete_done);
6362
6363                 fbret = ath11k_wmi_send_peer_delete_cmd(ar, vif->addr,
6364                                                         arvif->vdev_id);
6365                 if (fbret) {
6366                         ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
6367                                     arvif->vdev_id, vif->addr);
6368                         goto err;
6369                 }
6370
6371                 fbret = ath11k_wait_for_peer_delete_done(ar, arvif->vdev_id,
6372                                                          vif->addr);
6373                 if (fbret)
6374                         goto err;
6375
6376                 ar->num_peers--;
6377         }
6378
6379 err_vdev_del:
6380         ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6381         ar->num_created_vdevs--;
6382         ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6383         ab->free_vdev_map |= 1LL << arvif->vdev_id;
6384         spin_lock_bh(&ar->data_lock);
6385         list_del(&arvif->list);
6386         spin_unlock_bh(&ar->data_lock);
6387
6388 err:
6389         ath11k_debugfs_remove_interface(arvif);
6390         mutex_unlock(&ar->conf_mutex);
6391
6392         return ret;
6393 }
6394
6395 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6396 {
6397         struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
6398         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6399
6400         if (skb_cb->vif == vif)
6401                 skb_cb->vif = NULL;
6402
6403         return 0;
6404 }
6405
6406 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6407                                            struct ieee80211_vif *vif)
6408 {
6409         struct ath11k *ar = hw->priv;
6410         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6411         struct ath11k_base *ab = ar->ab;
6412         unsigned long time_left;
6413         int ret;
6414         int i;
6415
6416         cancel_delayed_work_sync(&arvif->connection_loss_work);
6417
6418         mutex_lock(&ar->conf_mutex);
6419
6420         ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n",
6421                    arvif->vdev_id);
6422
6423         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6424                 ath11k_mac_11d_scan_stop(ar);
6425
6426         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6427                 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6428                 if (ret)
6429                         ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6430                                     arvif->vdev_id, ret);
6431         }
6432
6433         reinit_completion(&ar->vdev_delete_done);
6434
6435         ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6436         if (ret) {
6437                 ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6438                             arvif->vdev_id, ret);
6439                 goto err_vdev_del;
6440         }
6441
6442         time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6443                                                 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6444         if (time_left == 0) {
6445                 ath11k_warn(ab, "Timeout in receiving vdev delete response\n");
6446                 goto err_vdev_del;
6447         }
6448
6449         ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6450         ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6451         ar->num_created_vdevs--;
6452
6453         ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6454                    vif->addr, arvif->vdev_id);
6455
6456         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6457                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6458                 ar->monitor_vdev_id = -1;
6459         } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6460                    !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6461                 ret = ath11k_mac_monitor_vdev_delete(ar);
6462                 if (ret)
6463                         /* continue even if there's an error */
6464                         ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6465                                     ret);
6466         }
6467
6468 err_vdev_del:
6469         spin_lock_bh(&ar->data_lock);
6470         list_del(&arvif->list);
6471         spin_unlock_bh(&ar->data_lock);
6472
6473         ath11k_peer_cleanup(ar, arvif->vdev_id);
6474
6475         idr_for_each(&ar->txmgmt_idr,
6476                      ath11k_mac_vif_txmgmt_idr_remove, vif);
6477
6478         for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6479                 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6480                 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6481                              ath11k_mac_vif_unref, vif);
6482                 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6483         }
6484
6485         /* Recalc txpower for remaining vdev */
6486         ath11k_mac_txpower_recalc(ar);
6487
6488         ath11k_debugfs_remove_interface(arvif);
6489
6490         /* TODO: recal traffic pause state based on the available vdevs */
6491
6492         mutex_unlock(&ar->conf_mutex);
6493 }
6494
6495 /* FIXME: Has to be verified. */
6496 #define SUPPORTED_FILTERS                       \
6497         (FIF_ALLMULTI |                         \
6498         FIF_CONTROL |                           \
6499         FIF_PSPOLL |                            \
6500         FIF_OTHER_BSS |                         \
6501         FIF_BCN_PRBRESP_PROMISC |               \
6502         FIF_PROBE_REQ |                         \
6503         FIF_FCSFAIL)
6504
6505 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6506                                            unsigned int changed_flags,
6507                                            unsigned int *total_flags,
6508                                            u64 multicast)
6509 {
6510         struct ath11k *ar = hw->priv;
6511
6512         mutex_lock(&ar->conf_mutex);
6513
6514         *total_flags &= SUPPORTED_FILTERS;
6515         ar->filter_flags = *total_flags;
6516
6517         mutex_unlock(&ar->conf_mutex);
6518 }
6519
6520 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6521 {
6522         struct ath11k *ar = hw->priv;
6523
6524         mutex_lock(&ar->conf_mutex);
6525
6526         *tx_ant = ar->cfg_tx_chainmask;
6527         *rx_ant = ar->cfg_rx_chainmask;
6528
6529         mutex_unlock(&ar->conf_mutex);
6530
6531         return 0;
6532 }
6533
6534 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6535 {
6536         struct ath11k *ar = hw->priv;
6537         int ret;
6538
6539         mutex_lock(&ar->conf_mutex);
6540         ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
6541         mutex_unlock(&ar->conf_mutex);
6542
6543         return ret;
6544 }
6545
6546 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6547                                       struct ieee80211_vif *vif,
6548                                       struct ieee80211_ampdu_params *params)
6549 {
6550         struct ath11k *ar = hw->priv;
6551         int ret = -EINVAL;
6552
6553         mutex_lock(&ar->conf_mutex);
6554
6555         switch (params->action) {
6556         case IEEE80211_AMPDU_RX_START:
6557                 ret = ath11k_dp_rx_ampdu_start(ar, params);
6558                 break;
6559         case IEEE80211_AMPDU_RX_STOP:
6560                 ret = ath11k_dp_rx_ampdu_stop(ar, params);
6561                 break;
6562         case IEEE80211_AMPDU_TX_START:
6563         case IEEE80211_AMPDU_TX_STOP_CONT:
6564         case IEEE80211_AMPDU_TX_STOP_FLUSH:
6565         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6566         case IEEE80211_AMPDU_TX_OPERATIONAL:
6567                 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6568                  * Tx aggregation requests.
6569                  */
6570                 ret = -EOPNOTSUPP;
6571                 break;
6572         }
6573
6574         mutex_unlock(&ar->conf_mutex);
6575
6576         return ret;
6577 }
6578
6579 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6580                                      struct ieee80211_chanctx_conf *ctx)
6581 {
6582         struct ath11k *ar = hw->priv;
6583         struct ath11k_base *ab = ar->ab;
6584
6585         ath11k_dbg(ab, ATH11K_DBG_MAC,
6586                    "mac chanctx add freq %u width %d ptr %pK\n",
6587                    ctx->def.chan->center_freq, ctx->def.width, ctx);
6588
6589         mutex_lock(&ar->conf_mutex);
6590
6591         spin_lock_bh(&ar->data_lock);
6592         /* TODO: In case of multiple channel context, populate rx_channel from
6593          * Rx PPDU desc information.
6594          */
6595         ar->rx_channel = ctx->def.chan;
6596         spin_unlock_bh(&ar->data_lock);
6597
6598         mutex_unlock(&ar->conf_mutex);
6599
6600         return 0;
6601 }
6602
6603 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6604                                          struct ieee80211_chanctx_conf *ctx)
6605 {
6606         struct ath11k *ar = hw->priv;
6607         struct ath11k_base *ab = ar->ab;
6608
6609         ath11k_dbg(ab, ATH11K_DBG_MAC,
6610                    "mac chanctx remove freq %u width %d ptr %pK\n",
6611                    ctx->def.chan->center_freq, ctx->def.width, ctx);
6612
6613         mutex_lock(&ar->conf_mutex);
6614
6615         spin_lock_bh(&ar->data_lock);
6616         /* TODO: In case of there is one more channel context left, populate
6617          * rx_channel with the channel of that remaining channel context.
6618          */
6619         ar->rx_channel = NULL;
6620         spin_unlock_bh(&ar->data_lock);
6621
6622         mutex_unlock(&ar->conf_mutex);
6623 }
6624
6625 static int
6626 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
6627                               struct ieee80211_chanctx_conf *ctx,
6628                               bool restart)
6629 {
6630         struct ath11k *ar = arvif->ar;
6631         struct ath11k_base *ab = ar->ab;
6632         struct wmi_vdev_start_req_arg arg = {};
6633         const struct cfg80211_chan_def *chandef = &ctx->def;
6634         int he_support = arvif->vif->bss_conf.he_support;
6635         int ret = 0;
6636
6637         lockdep_assert_held(&ar->conf_mutex);
6638
6639         reinit_completion(&ar->vdev_setup_done);
6640
6641         arg.vdev_id = arvif->vdev_id;
6642         arg.dtim_period = arvif->dtim_period;
6643         arg.bcn_intval = arvif->beacon_interval;
6644
6645         arg.channel.freq = chandef->chan->center_freq;
6646         arg.channel.band_center_freq1 = chandef->center_freq1;
6647         arg.channel.band_center_freq2 = chandef->center_freq2;
6648         arg.channel.mode =
6649                 ath11k_phymodes[chandef->chan->band][chandef->width];
6650
6651         arg.channel.min_power = 0;
6652         arg.channel.max_power = chandef->chan->max_power;
6653         arg.channel.max_reg_power = chandef->chan->max_reg_power;
6654         arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
6655
6656         arg.pref_tx_streams = ar->num_tx_chains;
6657         arg.pref_rx_streams = ar->num_rx_chains;
6658
6659         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6660                 arg.ssid = arvif->u.ap.ssid;
6661                 arg.ssid_len = arvif->u.ap.ssid_len;
6662                 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6663
6664                 /* For now allow DFS for AP mode */
6665                 arg.channel.chan_radar =
6666                         !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6667
6668                 arg.channel.freq2_radar = ctx->radar_enabled;
6669
6670                 arg.channel.passive = arg.channel.chan_radar;
6671
6672                 spin_lock_bh(&ab->base_lock);
6673                 arg.regdomain = ar->ab->dfs_region;
6674                 spin_unlock_bh(&ab->base_lock);
6675
6676                 if (he_support) {
6677                         ret = ath11k_set_he_mu_sounding_mode(ar, arvif);
6678                         if (ret) {
6679                                 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n",
6680                                             arg.vdev_id);
6681                                 return ret;
6682                         }
6683                 }
6684         }
6685
6686         arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6687
6688         ath11k_dbg(ab, ATH11K_DBG_MAC,
6689                    "mac vdev %d start center_freq %d phymode %s\n",
6690                    arg.vdev_id, arg.channel.freq,
6691                    ath11k_wmi_phymode_str(arg.channel.mode));
6692
6693         ret = ath11k_wmi_vdev_start(ar, &arg, restart);
6694         if (ret) {
6695                 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6696                             restart ? "restart" : "start", arg.vdev_id);
6697                 return ret;
6698         }
6699
6700         ret = ath11k_mac_vdev_setup_sync(ar);
6701         if (ret) {
6702                 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6703                             arg.vdev_id, restart ? "restart" : "start", ret);
6704                 return ret;
6705         }
6706
6707         if (!restart)
6708                 ar->num_started_vdevs++;
6709
6710         ath11k_dbg(ab, ATH11K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
6711                    arvif->vif->addr, arvif->vdev_id);
6712
6713         /* Enable CAC Flag in the driver by checking the channel DFS cac time,
6714          * i.e dfs_cac_ms value which will be valid only for radar channels
6715          * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6716          * done before channel usage. This flags is used to drop rx packets.
6717          * during CAC.
6718          */
6719         /* TODO Set the flag for other interface types as required */
6720         if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6721             chandef->chan->dfs_cac_ms &&
6722             chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6723                 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6724                 ath11k_dbg(ab, ATH11K_DBG_MAC,
6725                            "CAC Started in chan_freq %d for vdev %d\n",
6726                            arg.channel.freq, arg.vdev_id);
6727         }
6728
6729         ret = ath11k_mac_set_txbf_conf(arvif);
6730         if (ret)
6731                 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6732                             arvif->vdev_id, ret);
6733
6734         return 0;
6735 }
6736
6737 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
6738 {
6739         struct ath11k *ar = arvif->ar;
6740         int ret;
6741
6742         lockdep_assert_held(&ar->conf_mutex);
6743
6744         reinit_completion(&ar->vdev_setup_done);
6745
6746         ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
6747         if (ret) {
6748                 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
6749                             arvif->vdev_id, ret);
6750                 goto err;
6751         }
6752
6753         ret = ath11k_mac_vdev_setup_sync(ar);
6754         if (ret) {
6755                 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
6756                             arvif->vdev_id, ret);
6757                 goto err;
6758         }
6759
6760         WARN_ON(ar->num_started_vdevs == 0);
6761
6762         ar->num_started_vdevs--;
6763         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
6764                    arvif->vif->addr, arvif->vdev_id);
6765
6766         if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
6767                 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6768                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
6769                            arvif->vdev_id);
6770         }
6771
6772         return 0;
6773 err:
6774         return ret;
6775 }
6776
6777 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
6778                                  struct ieee80211_chanctx_conf *ctx)
6779 {
6780         return ath11k_mac_vdev_start_restart(arvif, ctx, false);
6781 }
6782
6783 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
6784                                    struct ieee80211_chanctx_conf *ctx)
6785 {
6786         return ath11k_mac_vdev_start_restart(arvif, ctx, true);
6787 }
6788
6789 struct ath11k_mac_change_chanctx_arg {
6790         struct ieee80211_chanctx_conf *ctx;
6791         struct ieee80211_vif_chanctx_switch *vifs;
6792         int n_vifs;
6793         int next_vif;
6794 };
6795
6796 static void
6797 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6798                                    struct ieee80211_vif *vif)
6799 {
6800         struct ath11k_mac_change_chanctx_arg *arg = data;
6801
6802         if (rcu_access_pointer(vif->chanctx_conf) != arg->ctx)
6803                 return;
6804
6805         arg->n_vifs++;
6806 }
6807
6808 static void
6809 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6810                                     struct ieee80211_vif *vif)
6811 {
6812         struct ath11k_mac_change_chanctx_arg *arg = data;
6813         struct ieee80211_chanctx_conf *ctx;
6814
6815         ctx = rcu_access_pointer(vif->chanctx_conf);
6816         if (ctx != arg->ctx)
6817                 return;
6818
6819         if (WARN_ON(arg->next_vif == arg->n_vifs))
6820                 return;
6821
6822         arg->vifs[arg->next_vif].vif = vif;
6823         arg->vifs[arg->next_vif].old_ctx = ctx;
6824         arg->vifs[arg->next_vif].new_ctx = ctx;
6825         arg->next_vif++;
6826 }
6827
6828 static void
6829 ath11k_mac_update_vif_chan(struct ath11k *ar,
6830                            struct ieee80211_vif_chanctx_switch *vifs,
6831                            int n_vifs)
6832 {
6833         struct ath11k_base *ab = ar->ab;
6834         struct ath11k_vif *arvif;
6835         int ret;
6836         int i;
6837         bool monitor_vif = false;
6838
6839         lockdep_assert_held(&ar->conf_mutex);
6840
6841         /* Associated channel resources of all relevant vdevs
6842          * should be available for the channel switch now.
6843          */
6844
6845         /* TODO: Update ar->rx_channel */
6846
6847         for (i = 0; i < n_vifs; i++) {
6848                 arvif = (void *)vifs[i].vif->drv_priv;
6849
6850                 if (WARN_ON(!arvif->is_started))
6851                         continue;
6852
6853                 /* change_chanctx can be called even before vdev_up from
6854                  * ieee80211_start_ap->ieee80211_vif_use_channel->
6855                  * ieee80211_recalc_radar_chanctx.
6856                  *
6857                  * Firmware expect vdev_restart only if vdev is up.
6858                  * If vdev is down then it expect vdev_stop->vdev_start.
6859                  */
6860                 if (arvif->is_up) {
6861                         ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6862                         if (ret) {
6863                                 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
6864                                             arvif->vdev_id, ret);
6865                                 continue;
6866                         }
6867                 } else {
6868                         ret = ath11k_mac_vdev_stop(arvif);
6869                         if (ret) {
6870                                 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
6871                                             arvif->vdev_id, ret);
6872                                 continue;
6873                         }
6874
6875                         ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
6876                         if (ret)
6877                                 ath11k_warn(ab, "failed to start vdev %d: %d\n",
6878                                             arvif->vdev_id, ret);
6879
6880                         continue;
6881                 }
6882
6883                 ret = ath11k_mac_setup_bcn_tmpl(arvif);
6884                 if (ret)
6885                         ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6886                                     ret);
6887
6888                 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6889                                          arvif->bssid);
6890                 if (ret) {
6891                         ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
6892                                     arvif->vdev_id, ret);
6893                         continue;
6894                 }
6895         }
6896
6897         /* Restart the internal monitor vdev on new channel */
6898         if (!monitor_vif &&
6899             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
6900                 ret = ath11k_mac_monitor_stop(ar);
6901                 if (ret) {
6902                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
6903                                     ret);
6904                         return;
6905                 }
6906
6907                 ret = ath11k_mac_monitor_start(ar);
6908                 if (ret) {
6909                         ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
6910                                     ret);
6911                         return;
6912                 }
6913         }
6914 }
6915
6916 static void
6917 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
6918                                   struct ieee80211_chanctx_conf *ctx)
6919 {
6920         struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
6921
6922         lockdep_assert_held(&ar->conf_mutex);
6923
6924         ieee80211_iterate_active_interfaces_atomic(ar->hw,
6925                                                    IEEE80211_IFACE_ITER_NORMAL,
6926                                                    ath11k_mac_change_chanctx_cnt_iter,
6927                                                    &arg);
6928         if (arg.n_vifs == 0)
6929                 return;
6930
6931         arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6932         if (!arg.vifs)
6933                 return;
6934
6935         ieee80211_iterate_active_interfaces_atomic(ar->hw,
6936                                                    IEEE80211_IFACE_ITER_NORMAL,
6937                                                    ath11k_mac_change_chanctx_fill_iter,
6938                                                    &arg);
6939
6940         ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6941
6942         kfree(arg.vifs);
6943 }
6944
6945 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6946                                          struct ieee80211_chanctx_conf *ctx,
6947                                          u32 changed)
6948 {
6949         struct ath11k *ar = hw->priv;
6950         struct ath11k_base *ab = ar->ab;
6951
6952         mutex_lock(&ar->conf_mutex);
6953
6954         ath11k_dbg(ab, ATH11K_DBG_MAC,
6955                    "mac chanctx change freq %u width %d ptr %pK changed %x\n",
6956                    ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6957
6958         /* This shouldn't really happen because channel switching should use
6959          * switch_vif_chanctx().
6960          */
6961         if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6962                 goto unlock;
6963
6964         if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
6965             changed & IEEE80211_CHANCTX_CHANGE_RADAR)
6966                 ath11k_mac_update_active_vif_chan(ar, ctx);
6967
6968         /* TODO: Recalc radar detection */
6969
6970 unlock:
6971         mutex_unlock(&ar->conf_mutex);
6972 }
6973
6974 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
6975                                    struct ieee80211_vif *vif)
6976 {
6977         struct ath11k *ar = hw->priv;
6978         struct ath11k_base *ab = ar->ab;
6979         struct ath11k_vif *arvif = (void *)vif->drv_priv;
6980         int ret;
6981
6982         if (WARN_ON(arvif->is_started))
6983                 return -EBUSY;
6984
6985         ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
6986         if (ret) {
6987                 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6988                             arvif->vdev_id, vif->addr,
6989                             arvif->chanctx.def.chan->center_freq, ret);
6990                 return ret;
6991         }
6992
6993         /* Reconfigure hardware rate code since it is cleared by firmware.
6994          */
6995         if (ar->hw_rate_code > 0) {
6996                 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
6997
6998                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
6999                                                     ar->hw_rate_code);
7000                 if (ret) {
7001                         ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7002                         return ret;
7003                 }
7004         }
7005
7006         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7007                 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr);
7008                 if (ret) {
7009                         ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7010                         return ret;
7011                 }
7012         }
7013
7014         arvif->is_started = true;
7015
7016         /* TODO: Setup ps and cts/rts protection */
7017         return 0;
7018 }
7019
7020 static int
7021 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7022                                  struct ieee80211_vif *vif,
7023                                  struct ieee80211_chanctx_conf *ctx)
7024 {
7025         struct ath11k *ar = hw->priv;
7026         struct ath11k_base *ab = ar->ab;
7027         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7028         int ret;
7029         struct peer_create_params param;
7030
7031         mutex_lock(&ar->conf_mutex);
7032
7033         ath11k_dbg(ab, ATH11K_DBG_MAC,
7034                    "mac chanctx assign ptr %pK vdev_id %i\n",
7035                    ctx, arvif->vdev_id);
7036
7037         /* for QCA6390 bss peer must be created before vdev_start */
7038         if (ab->hw_params.vdev_start_delay &&
7039             arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7040             arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7041             !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7042                 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7043                 ret = 0;
7044                 goto out;
7045         }
7046
7047         if (WARN_ON(arvif->is_started)) {
7048                 ret = -EBUSY;
7049                 goto out;
7050         }
7051
7052         if (ab->hw_params.vdev_start_delay &&
7053             arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7054             arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
7055                 param.vdev_id = arvif->vdev_id;
7056                 param.peer_type = WMI_PEER_TYPE_DEFAULT;
7057                 param.peer_addr = ar->mac_addr;
7058
7059                 ret = ath11k_peer_create(ar, arvif, NULL, &param);
7060                 if (ret) {
7061                         ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
7062                                     ret);
7063                         goto out;
7064                 }
7065         }
7066
7067         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7068                 ret = ath11k_mac_monitor_start(ar);
7069                 if (ret) {
7070                         ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7071                                     ret);
7072                         goto out;
7073                 }
7074
7075                 arvif->is_started = true;
7076                 goto out;
7077         }
7078
7079         ret = ath11k_mac_vdev_start(arvif, ctx);
7080         if (ret) {
7081                 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7082                             arvif->vdev_id, vif->addr,
7083                             ctx->def.chan->center_freq, ret);
7084                 goto out;
7085         }
7086
7087         arvif->is_started = true;
7088
7089         if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7090             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7091                 ret = ath11k_mac_monitor_start(ar);
7092                 if (ret) {
7093                         ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7094                                     ret);
7095                         goto out;
7096                 }
7097         }
7098
7099         /* TODO: Setup ps and cts/rts protection */
7100
7101         ret = 0;
7102
7103 out:
7104         mutex_unlock(&ar->conf_mutex);
7105
7106         return ret;
7107 }
7108
7109 static void
7110 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7111                                    struct ieee80211_vif *vif,
7112                                    struct ieee80211_chanctx_conf *ctx)
7113 {
7114         struct ath11k *ar = hw->priv;
7115         struct ath11k_base *ab = ar->ab;
7116         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7117         int ret;
7118
7119         mutex_lock(&ar->conf_mutex);
7120
7121         ath11k_dbg(ab, ATH11K_DBG_MAC,
7122                    "mac chanctx unassign ptr %pK vdev_id %i\n",
7123                    ctx, arvif->vdev_id);
7124
7125         WARN_ON(!arvif->is_started);
7126
7127         if (ab->hw_params.vdev_start_delay &&
7128             arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
7129             ath11k_peer_find_by_addr(ab, ar->mac_addr))
7130                 ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
7131
7132         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7133                 ret = ath11k_mac_monitor_stop(ar);
7134                 if (ret) {
7135                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7136                                     ret);
7137                         mutex_unlock(&ar->conf_mutex);
7138                         return;
7139                 }
7140
7141                 arvif->is_started = false;
7142                 mutex_unlock(&ar->conf_mutex);
7143                 return;
7144         }
7145
7146         ret = ath11k_mac_vdev_stop(arvif);
7147         if (ret)
7148                 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7149                             arvif->vdev_id, ret);
7150
7151         arvif->is_started = false;
7152
7153         if (ab->hw_params.vdev_start_delay &&
7154             arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7155                 ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
7156                 if (ret)
7157                         ath11k_warn(ar->ab,
7158                                     "failed to delete peer %pM for vdev %d: %d\n",
7159                                     arvif->bssid, arvif->vdev_id, ret);
7160                 else
7161                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7162                                    "mac removed peer %pM  vdev %d after vdev stop\n",
7163                                    arvif->bssid, arvif->vdev_id);
7164         }
7165
7166         if (ab->hw_params.vdev_start_delay &&
7167             arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
7168                 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
7169
7170         if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7171             ar->num_started_vdevs == 1 &&
7172             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7173                 ret = ath11k_mac_monitor_stop(ar);
7174                 if (ret)
7175                         /* continue even if there's an error */
7176                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7177                                     ret);
7178         }
7179
7180         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7181                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
7182
7183         mutex_unlock(&ar->conf_mutex);
7184 }
7185
7186 static int
7187 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7188                                  struct ieee80211_vif_chanctx_switch *vifs,
7189                                  int n_vifs,
7190                                  enum ieee80211_chanctx_switch_mode mode)
7191 {
7192         struct ath11k *ar = hw->priv;
7193
7194         mutex_lock(&ar->conf_mutex);
7195
7196         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7197                    "mac chanctx switch n_vifs %d mode %d\n",
7198                    n_vifs, mode);
7199         ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
7200
7201         mutex_unlock(&ar->conf_mutex);
7202
7203         return 0;
7204 }
7205
7206 static int
7207 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
7208 {
7209         struct ath11k_vif *arvif;
7210         int ret = 0;
7211
7212         mutex_lock(&ar->conf_mutex);
7213         list_for_each_entry(arvif, &ar->arvifs, list) {
7214                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
7215                            param, arvif->vdev_id, value);
7216
7217                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7218                                                     param, value);
7219                 if (ret) {
7220                         ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
7221                                     param, arvif->vdev_id, ret);
7222                         break;
7223                 }
7224         }
7225         mutex_unlock(&ar->conf_mutex);
7226         return ret;
7227 }
7228
7229 /* mac80211 stores device specific RTS/Fragmentation threshold value,
7230  * this is set interface specific to firmware from ath11k driver
7231  */
7232 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7233 {
7234         struct ath11k *ar = hw->priv;
7235         int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
7236
7237         return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
7238 }
7239
7240 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7241 {
7242         /* Even though there's a WMI vdev param for fragmentation threshold no
7243          * known firmware actually implements it. Moreover it is not possible to
7244          * rely frame fragmentation to mac80211 because firmware clears the
7245          * "more fragments" bit in frame control making it impossible for remote
7246          * devices to reassemble frames.
7247          *
7248          * Hence implement a dummy callback just to say fragmentation isn't
7249          * supported. This effectively prevents mac80211 from doing frame
7250          * fragmentation in software.
7251          */
7252         return -EOPNOTSUPP;
7253 }
7254
7255 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7256                                 u32 queues, bool drop)
7257 {
7258         struct ath11k *ar = hw->priv;
7259         long time_left;
7260
7261         if (drop)
7262                 return;
7263
7264         time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
7265                                        (atomic_read(&ar->dp.num_tx_pending) == 0),
7266                                        ATH11K_FLUSH_TIMEOUT);
7267         if (time_left == 0)
7268                 ath11k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
7269
7270         time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
7271                                        (atomic_read(&ar->num_pending_mgmt_tx) == 0),
7272                                        ATH11K_FLUSH_TIMEOUT);
7273         if (time_left == 0)
7274                 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue %ld\n",
7275                             time_left);
7276
7277         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7278                    "mac mgmt tx flush mgmt pending %d\n",
7279                    atomic_read(&ar->num_pending_mgmt_tx));
7280 }
7281
7282 static int
7283 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
7284                                      enum nl80211_band band,
7285                                      const struct cfg80211_bitrate_mask *mask)
7286 {
7287         int num_rates = 0;
7288         int i;
7289
7290         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
7291                 num_rates += hweight16(mask->control[band].ht_mcs[i]);
7292
7293         return num_rates;
7294 }
7295
7296 static bool
7297 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
7298                                   enum nl80211_band band,
7299                                   const struct cfg80211_bitrate_mask *mask)
7300 {
7301         int num_rates = 0;
7302
7303         num_rates = hweight32(mask->control[band].legacy);
7304
7305         if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
7306                 return false;
7307
7308         if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
7309                 return false;
7310
7311         if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
7312                 return false;
7313
7314         return num_rates == 1;
7315 }
7316
7317 static __le16
7318 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
7319 {
7320         if (he_cap->he_cap_elem.phy_cap_info[0] &
7321             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
7322                 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
7323
7324         if (he_cap->he_cap_elem.phy_cap_info[0] &
7325             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
7326                 return he_cap->he_mcs_nss_supp.tx_mcs_160;
7327
7328         return he_cap->he_mcs_nss_supp.tx_mcs_80;
7329 }
7330
7331 static bool
7332 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
7333                                        enum nl80211_band band,
7334                                        const struct cfg80211_bitrate_mask *mask,
7335                                        int *nss)
7336 {
7337         struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7338         u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7339         u16 he_mcs_map = 0;
7340         u8 ht_nss_mask = 0;
7341         u8 vht_nss_mask = 0;
7342         u8 he_nss_mask = 0;
7343         int i;
7344
7345         /* No need to consider legacy here. Basic rates are always present
7346          * in bitrate mask
7347          */
7348
7349         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7350                 if (mask->control[band].ht_mcs[i] == 0)
7351                         continue;
7352                 else if (mask->control[band].ht_mcs[i] ==
7353                          sband->ht_cap.mcs.rx_mask[i])
7354                         ht_nss_mask |= BIT(i);
7355                 else
7356                         return false;
7357         }
7358
7359         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7360                 if (mask->control[band].vht_mcs[i] == 0)
7361                         continue;
7362                 else if (mask->control[band].vht_mcs[i] ==
7363                          ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7364                         vht_nss_mask |= BIT(i);
7365                 else
7366                         return false;
7367         }
7368
7369         he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
7370
7371         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
7372                 if (mask->control[band].he_mcs[i] == 0)
7373                         continue;
7374
7375                 if (mask->control[band].he_mcs[i] ==
7376                     ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
7377                         he_nss_mask |= BIT(i);
7378                 else
7379                         return false;
7380         }
7381
7382         if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
7383                 return false;
7384
7385         if (ht_nss_mask == 0)
7386                 return false;
7387
7388         if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7389                 return false;
7390
7391         *nss = fls(ht_nss_mask);
7392
7393         return true;
7394 }
7395
7396 static int
7397 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
7398                                   enum nl80211_band band,
7399                                   const struct cfg80211_bitrate_mask *mask,
7400                                   u32 *rate, u8 *nss)
7401 {
7402         int rate_idx;
7403         u16 bitrate;
7404         u8 preamble;
7405         u8 hw_rate;
7406
7407         if (hweight32(mask->control[band].legacy) != 1)
7408                 return -EINVAL;
7409
7410         rate_idx = ffs(mask->control[band].legacy) - 1;
7411
7412         if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7413                 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
7414
7415         hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
7416         bitrate = ath11k_legacy_rates[rate_idx].bitrate;
7417
7418         if (ath11k_mac_bitrate_is_cck(bitrate))
7419                 preamble = WMI_RATE_PREAMBLE_CCK;
7420         else
7421                 preamble = WMI_RATE_PREAMBLE_OFDM;
7422
7423         *nss = 1;
7424         *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
7425
7426         return 0;
7427 }
7428
7429 static int
7430 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
7431 {
7432         struct ath11k *ar = arvif->ar;
7433         int ret;
7434
7435         /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
7436         if (he_gi && he_gi != 0xFF)
7437                 he_gi += 1;
7438
7439         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7440                                             WMI_VDEV_PARAM_SGI, he_gi);
7441         if (ret) {
7442                 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
7443                             he_gi, ret);
7444                 return ret;
7445         }
7446         /* start from 1 */
7447         if (he_ltf != 0xFF)
7448                 he_ltf += 1;
7449
7450         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7451                                             WMI_VDEV_PARAM_HE_LTF, he_ltf);
7452         if (ret) {
7453                 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
7454                             he_ltf, ret);
7455                 return ret;
7456         }
7457
7458         return 0;
7459 }
7460
7461 static int
7462 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
7463 {
7464         struct ath11k *ar = arvif->ar;
7465         int ret;
7466         u32 he_ar_gi_ltf;
7467
7468         if (he_gi != 0xFF) {
7469                 switch (he_gi) {
7470                 case NL80211_RATE_INFO_HE_GI_0_8:
7471                         he_gi = WMI_AUTORATE_800NS_GI;
7472                         break;
7473                 case NL80211_RATE_INFO_HE_GI_1_6:
7474                         he_gi = WMI_AUTORATE_1600NS_GI;
7475                         break;
7476                 case NL80211_RATE_INFO_HE_GI_3_2:
7477                         he_gi = WMI_AUTORATE_3200NS_GI;
7478                         break;
7479                 default:
7480                         ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
7481                         return -EINVAL;
7482                 }
7483         }
7484
7485         if (he_ltf != 0xFF) {
7486                 switch (he_ltf) {
7487                 case NL80211_RATE_INFO_HE_1XLTF:
7488                         he_ltf = WMI_HE_AUTORATE_LTF_1X;
7489                         break;
7490                 case NL80211_RATE_INFO_HE_2XLTF:
7491                         he_ltf = WMI_HE_AUTORATE_LTF_2X;
7492                         break;
7493                 case NL80211_RATE_INFO_HE_4XLTF:
7494                         he_ltf = WMI_HE_AUTORATE_LTF_4X;
7495                         break;
7496                 default:
7497                         ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
7498                         return -EINVAL;
7499                 }
7500         }
7501
7502         he_ar_gi_ltf = he_gi | he_ltf;
7503         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7504                                             WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
7505                                             he_ar_gi_ltf);
7506         if (ret) {
7507                 ath11k_warn(ar->ab,
7508                             "failed to set he autorate gi %u ltf %u: %d\n",
7509                             he_gi, he_ltf, ret);
7510                 return ret;
7511         }
7512
7513         return 0;
7514 }
7515
7516 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
7517                                       u32 rate, u8 nss, u8 sgi, u8 ldpc,
7518                                       u8 he_gi, u8 he_ltf, bool he_fixed_rate)
7519 {
7520         struct ath11k *ar = arvif->ar;
7521         u32 vdev_param;
7522         int ret;
7523
7524         lockdep_assert_held(&ar->conf_mutex);
7525
7526         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7527                    "mac 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",
7528                    arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
7529                    he_ltf, he_fixed_rate);
7530
7531         if (!arvif->vif->bss_conf.he_support) {
7532                 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
7533                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7534                                                     vdev_param, rate);
7535                 if (ret) {
7536                         ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
7537                                     rate, ret);
7538                         return ret;
7539                 }
7540         }
7541
7542         vdev_param = WMI_VDEV_PARAM_NSS;
7543         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7544                                             vdev_param, nss);
7545         if (ret) {
7546                 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
7547                             nss, ret);
7548                 return ret;
7549         }
7550
7551         vdev_param = WMI_VDEV_PARAM_LDPC;
7552         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7553                                             vdev_param, ldpc);
7554         if (ret) {
7555                 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
7556                             ldpc, ret);
7557                 return ret;
7558         }
7559
7560         if (arvif->vif->bss_conf.he_support) {
7561                 if (he_fixed_rate) {
7562                         ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
7563                                                                he_ltf);
7564                         if (ret) {
7565                                 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
7566                                             ret);
7567                                 return ret;
7568                         }
7569                 } else {
7570                         ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
7571                                                               he_ltf);
7572                         if (ret) {
7573                                 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
7574                                             ret);
7575                                 return ret;
7576                         }
7577                 }
7578         } else {
7579                 vdev_param = WMI_VDEV_PARAM_SGI;
7580                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7581                                                     vdev_param, sgi);
7582                 if (ret) {
7583                         ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
7584                                     sgi, ret);
7585                         return ret;
7586                 }
7587         }
7588
7589         return 0;
7590 }
7591
7592 static bool
7593 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
7594                                  enum nl80211_band band,
7595                                  const struct cfg80211_bitrate_mask *mask)
7596 {
7597         int i;
7598         u16 vht_mcs;
7599
7600         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7601                 vht_mcs = mask->control[band].vht_mcs[i];
7602
7603                 switch (vht_mcs) {
7604                 case 0:
7605                 case BIT(8) - 1:
7606                 case BIT(9) - 1:
7607                 case BIT(10) - 1:
7608                         break;
7609                 default:
7610                         return false;
7611                 }
7612         }
7613
7614         return true;
7615 }
7616
7617 static bool
7618 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
7619                                 enum nl80211_band band,
7620                                 const struct cfg80211_bitrate_mask *mask)
7621 {
7622         int i;
7623         u16 he_mcs;
7624
7625         for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
7626                 he_mcs = mask->control[band].he_mcs[i];
7627
7628                 switch (he_mcs) {
7629                 case 0:
7630                 case BIT(8) - 1:
7631                 case BIT(10) - 1:
7632                 case BIT(12) - 1:
7633                         break;
7634                 default:
7635                         return false;
7636                 }
7637         }
7638
7639         return true;
7640 }
7641
7642 static void ath11k_mac_set_bitrate_mask_iter(void *data,
7643                                              struct ieee80211_sta *sta)
7644 {
7645         struct ath11k_vif *arvif = data;
7646         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
7647         struct ath11k *ar = arvif->ar;
7648
7649         spin_lock_bh(&ar->data_lock);
7650         arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7651         spin_unlock_bh(&ar->data_lock);
7652
7653         ieee80211_queue_work(ar->hw, &arsta->update_wk);
7654 }
7655
7656 static void ath11k_mac_disable_peer_fixed_rate(void *data,
7657                                                struct ieee80211_sta *sta)
7658 {
7659         struct ath11k_vif *arvif = data;
7660         struct ath11k *ar = arvif->ar;
7661         int ret;
7662
7663         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
7664                                         arvif->vdev_id,
7665                                         WMI_PEER_PARAM_FIXED_RATE,
7666                                         WMI_FIXED_RATE_NONE);
7667         if (ret)
7668                 ath11k_warn(ar->ab,
7669                             "failed to disable peer fixed rate for STA %pM ret %d\n",
7670                             sta->addr, ret);
7671 }
7672
7673 static bool
7674 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
7675                                                const struct cfg80211_bitrate_mask *mask)
7676 {
7677         bool he_fixed_rate = false, vht_fixed_rate = false;
7678         struct ath11k_peer *peer, *tmp;
7679         const u16 *vht_mcs_mask, *he_mcs_mask;
7680         u8 vht_nss, he_nss;
7681         bool ret = true;
7682
7683         vht_mcs_mask = mask->control[band].vht_mcs;
7684         he_mcs_mask = mask->control[band].he_mcs;
7685
7686         if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
7687                 vht_fixed_rate = true;
7688
7689         if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
7690                 he_fixed_rate = true;
7691
7692         if (!vht_fixed_rate && !he_fixed_rate)
7693                 return true;
7694
7695         vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
7696         he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
7697
7698         rcu_read_lock();
7699         spin_lock_bh(&ar->ab->base_lock);
7700         list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
7701                 if (peer->sta) {
7702                         if (vht_fixed_rate && (!peer->sta->vht_cap.vht_supported ||
7703                                                peer->sta->rx_nss < vht_nss)) {
7704                                 ret = false;
7705                                 goto out;
7706                         }
7707                         if (he_fixed_rate && (!peer->sta->he_cap.has_he ||
7708                                               peer->sta->rx_nss < he_nss)) {
7709                                 ret = false;
7710                                 goto out;
7711                         }
7712                 }
7713         }
7714
7715 out:
7716         spin_unlock_bh(&ar->ab->base_lock);
7717         rcu_read_unlock();
7718         return ret;
7719 }
7720
7721 static int
7722 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7723                                struct ieee80211_vif *vif,
7724                                const struct cfg80211_bitrate_mask *mask)
7725 {
7726         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7727         struct cfg80211_chan_def def;
7728         struct ath11k *ar = arvif->ar;
7729         enum nl80211_band band;
7730         const u8 *ht_mcs_mask;
7731         const u16 *vht_mcs_mask;
7732         const u16 *he_mcs_mask;
7733         u8 he_ltf = 0;
7734         u8 he_gi = 0;
7735         u32 rate;
7736         u8 nss;
7737         u8 sgi;
7738         u8 ldpc;
7739         int single_nss;
7740         int ret;
7741         int num_rates;
7742         bool he_fixed_rate = false;
7743
7744         if (ath11k_mac_vif_chan(vif, &def))
7745                 return -EPERM;
7746
7747         band = def.chan->band;
7748         ht_mcs_mask = mask->control[band].ht_mcs;
7749         vht_mcs_mask = mask->control[band].vht_mcs;
7750         he_mcs_mask = mask->control[band].he_mcs;
7751         ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
7752
7753         sgi = mask->control[band].gi;
7754         if (sgi == NL80211_TXRATE_FORCE_LGI)
7755                 return -EINVAL;
7756
7757         he_gi = mask->control[band].he_gi;
7758         he_ltf = mask->control[band].he_ltf;
7759
7760         /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
7761          * requires passing atleast one of used basic rates along with them.
7762          * Fixed rate setting across different preambles(legacy, HT, VHT) is
7763          * not supported by the FW. Hence use of FIXED_RATE vdev param is not
7764          * suitable for setting single HT/VHT rates.
7765          * But, there could be a single basic rate passed from userspace which
7766          * can be done through the FIXED_RATE param.
7767          */
7768         if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
7769                 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
7770                                                         &nss);
7771                 if (ret) {
7772                         ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
7773                                     arvif->vdev_id, ret);
7774                         return ret;
7775                 }
7776                 ieee80211_iterate_stations_atomic(ar->hw,
7777                                                   ath11k_mac_disable_peer_fixed_rate,
7778                                                   arvif);
7779         } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7780                                                           &single_nss)) {
7781                 rate = WMI_FIXED_RATE_NONE;
7782                 nss = single_nss;
7783                 mutex_lock(&ar->conf_mutex);
7784                 arvif->bitrate_mask = *mask;
7785                 ieee80211_iterate_stations_atomic(ar->hw,
7786                                                   ath11k_mac_set_bitrate_mask_iter,
7787                                                   arvif);
7788                 mutex_unlock(&ar->conf_mutex);
7789         } else {
7790                 rate = WMI_FIXED_RATE_NONE;
7791
7792                 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
7793                         ath11k_warn(ar->ab,
7794                                     "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
7795                 nss = min_t(u32, ar->num_tx_chains,
7796                             max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
7797                                     ath11k_mac_max_vht_nss(vht_mcs_mask)),
7798                                 ath11k_mac_max_he_nss(he_mcs_mask)));
7799
7800                 /* If multiple rates across different preambles are given
7801                  * we can reconfigure this info with all peers using PEER_ASSOC
7802                  * command with the below exception cases.
7803                  * - Single VHT Rate : peer_assoc command accommodates only MCS
7804                  * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
7805                  * mandates passing basic rates along with HT/VHT rates, FW
7806                  * doesn't allow switching from VHT to Legacy. Hence instead of
7807                  * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
7808                  * we could set this VHT rate as peer fixed rate param, which
7809                  * will override FIXED rate and FW rate control algorithm.
7810                  * If single VHT rate is passed along with HT rates, we select
7811                  * the VHT rate as fixed rate for vht peers.
7812                  * - Multiple VHT Rates : When Multiple VHT rates are given,this
7813                  * can be set using RATEMASK CMD which uses FW rate-ctl alg.
7814                  * TODO: Setting multiple VHT MCS and replacing peer_assoc with
7815                  * RATEMASK_CMDID can cover all use cases of setting rates
7816                  * across multiple preambles and rates within same type.
7817                  * But requires more validation of the command at this point.
7818                  */
7819
7820                 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
7821                                                                   mask);
7822
7823                 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
7824                     num_rates > 1) {
7825                         /* TODO: Handle multiple VHT MCS values setting using
7826                          * RATEMASK CMD
7827                          */
7828                         ath11k_warn(ar->ab,
7829                                     "setting %d mcs values in bitrate mask not supported\n",
7830                                 num_rates);
7831                         return -EINVAL;
7832                 }
7833
7834                 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
7835                                                                  mask);
7836                 if (num_rates == 1)
7837                         he_fixed_rate = true;
7838
7839                 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
7840                     num_rates > 1) {
7841                         ath11k_warn(ar->ab,
7842                                     "Setting more than one HE MCS Value in bitrate mask not supported\n");
7843                         return -EINVAL;
7844                 }
7845
7846                 mutex_lock(&ar->conf_mutex);
7847                 ieee80211_iterate_stations_atomic(ar->hw,
7848                                                   ath11k_mac_disable_peer_fixed_rate,
7849                                                   arvif);
7850
7851                 arvif->bitrate_mask = *mask;
7852                 ieee80211_iterate_stations_atomic(ar->hw,
7853                                                   ath11k_mac_set_bitrate_mask_iter,
7854                                                   arvif);
7855
7856                 mutex_unlock(&ar->conf_mutex);
7857         }
7858
7859         mutex_lock(&ar->conf_mutex);
7860
7861         ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
7862                                          he_ltf, he_fixed_rate);
7863         if (ret) {
7864                 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
7865                             arvif->vdev_id, ret);
7866         }
7867
7868         mutex_unlock(&ar->conf_mutex);
7869
7870         return ret;
7871 }
7872
7873 static void
7874 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
7875                                 enum ieee80211_reconfig_type reconfig_type)
7876 {
7877         struct ath11k *ar = hw->priv;
7878
7879         if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7880                 return;
7881
7882         mutex_lock(&ar->conf_mutex);
7883
7884         if (ar->state == ATH11K_STATE_RESTARTED) {
7885                 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
7886                             ar->pdev->pdev_id);
7887                 ar->state = ATH11K_STATE_ON;
7888                 ieee80211_wake_queues(ar->hw);
7889         }
7890
7891         mutex_unlock(&ar->conf_mutex);
7892 }
7893
7894 static void
7895 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
7896                                   struct ieee80211_channel *channel)
7897 {
7898         int ret;
7899         enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
7900
7901         lockdep_assert_held(&ar->conf_mutex);
7902
7903         if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
7904             ar->rx_channel != channel)
7905                 return;
7906
7907         if (ar->scan.state != ATH11K_SCAN_IDLE) {
7908                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7909                            "ignoring bss chan info req while scanning..\n");
7910                 return;
7911         }
7912
7913         reinit_completion(&ar->bss_survey_done);
7914
7915         ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
7916         if (ret) {
7917                 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
7918                 return;
7919         }
7920
7921         ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
7922         if (ret == 0)
7923                 ath11k_warn(ar->ab, "bss channel survey timed out\n");
7924 }
7925
7926 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
7927                                     struct survey_info *survey)
7928 {
7929         struct ath11k *ar = hw->priv;
7930         struct ieee80211_supported_band *sband;
7931         struct survey_info *ar_survey;
7932         int ret = 0;
7933
7934         if (idx >= ATH11K_NUM_CHANS)
7935                 return -ENOENT;
7936
7937         ar_survey = &ar->survey[idx];
7938
7939         mutex_lock(&ar->conf_mutex);
7940
7941         sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
7942         if (sband && idx >= sband->n_channels) {
7943                 idx -= sband->n_channels;
7944                 sband = NULL;
7945         }
7946
7947         if (!sband)
7948                 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
7949         if (sband && idx >= sband->n_channels) {
7950                 idx -= sband->n_channels;
7951                 sband = NULL;
7952         }
7953
7954         if (!sband)
7955                 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
7956         if (!sband || idx >= sband->n_channels) {
7957                 ret = -ENOENT;
7958                 goto exit;
7959         }
7960
7961         ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
7962
7963         spin_lock_bh(&ar->data_lock);
7964         memcpy(survey, ar_survey, sizeof(*survey));
7965         spin_unlock_bh(&ar->data_lock);
7966
7967         survey->channel = &sband->channels[idx];
7968
7969         if (ar->rx_channel == survey->channel)
7970                 survey->filled |= SURVEY_INFO_IN_USE;
7971
7972 exit:
7973         mutex_unlock(&ar->conf_mutex);
7974         return ret;
7975 }
7976
7977 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
7978                                       struct ath11k_sta *arsta,
7979                                       char *pre,
7980                                       bool clear)
7981 {
7982         struct ath11k *ar = arsta->arvif->ar;
7983         int i;
7984         s8 rssi;
7985
7986         for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
7987                 sinfo->chains &= ~BIT(i);
7988                 rssi = arsta->chain_signal[i];
7989                 if (clear)
7990                         arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
7991
7992                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7993                            "mac sta statistics %s rssi[%d] %d\n", pre, i, rssi);
7994
7995                 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
7996                     rssi != ATH11K_INVALID_RSSI_FULL &&
7997                     rssi != ATH11K_INVALID_RSSI_EMPTY &&
7998                     rssi != 0) {
7999                         sinfo->chain_signal[i] = rssi;
8000                         sinfo->chains |= BIT(i);
8001                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8002                 }
8003         }
8004 }
8005
8006 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8007                                          struct ieee80211_vif *vif,
8008                                          struct ieee80211_sta *sta,
8009                                          struct station_info *sinfo)
8010 {
8011         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
8012         struct ath11k *ar = arsta->arvif->ar;
8013         s8 signal;
8014         bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8015                                ar->ab->wmi_ab.svc_map);
8016
8017         sinfo->rx_duration = arsta->rx_duration;
8018         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8019
8020         sinfo->tx_duration = arsta->tx_duration;
8021         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8022
8023         if (arsta->txrate.legacy || arsta->txrate.nss) {
8024                 if (arsta->txrate.legacy) {
8025                         sinfo->txrate.legacy = arsta->txrate.legacy;
8026                 } else {
8027                         sinfo->txrate.mcs = arsta->txrate.mcs;
8028                         sinfo->txrate.nss = arsta->txrate.nss;
8029                         sinfo->txrate.bw = arsta->txrate.bw;
8030                         sinfo->txrate.he_gi = arsta->txrate.he_gi;
8031                         sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8032                         sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8033                 }
8034                 sinfo->txrate.flags = arsta->txrate.flags;
8035                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8036         }
8037
8038         ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8039
8040         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8041             arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8042             ar->ab->hw_params.supports_rssi_stats &&
8043             !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8044                                          WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8045                 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8046         }
8047
8048         signal = arsta->rssi_comb;
8049         if (!signal &&
8050             arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8051             ar->ab->hw_params.supports_rssi_stats &&
8052             !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8053                                         WMI_REQUEST_VDEV_STAT)))
8054                 signal = arsta->rssi_beacon;
8055
8056         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8057                    "mac sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8058                    db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8059
8060         if (signal) {
8061                 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8062                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8063         }
8064 }
8065
8066 static const struct ieee80211_ops ath11k_ops = {
8067         .tx                             = ath11k_mac_op_tx,
8068         .start                          = ath11k_mac_op_start,
8069         .stop                           = ath11k_mac_op_stop,
8070         .reconfig_complete              = ath11k_mac_op_reconfig_complete,
8071         .add_interface                  = ath11k_mac_op_add_interface,
8072         .remove_interface               = ath11k_mac_op_remove_interface,
8073         .update_vif_offload             = ath11k_mac_op_update_vif_offload,
8074         .config                         = ath11k_mac_op_config,
8075         .bss_info_changed               = ath11k_mac_op_bss_info_changed,
8076         .configure_filter               = ath11k_mac_op_configure_filter,
8077         .hw_scan                        = ath11k_mac_op_hw_scan,
8078         .cancel_hw_scan                 = ath11k_mac_op_cancel_hw_scan,
8079         .set_key                        = ath11k_mac_op_set_key,
8080         .sta_state                      = ath11k_mac_op_sta_state,
8081         .sta_set_4addr                  = ath11k_mac_op_sta_set_4addr,
8082         .sta_set_txpwr                  = ath11k_mac_op_sta_set_txpwr,
8083         .sta_rc_update                  = ath11k_mac_op_sta_rc_update,
8084         .conf_tx                        = ath11k_mac_op_conf_tx,
8085         .set_antenna                    = ath11k_mac_op_set_antenna,
8086         .get_antenna                    = ath11k_mac_op_get_antenna,
8087         .ampdu_action                   = ath11k_mac_op_ampdu_action,
8088         .add_chanctx                    = ath11k_mac_op_add_chanctx,
8089         .remove_chanctx                 = ath11k_mac_op_remove_chanctx,
8090         .change_chanctx                 = ath11k_mac_op_change_chanctx,
8091         .assign_vif_chanctx             = ath11k_mac_op_assign_vif_chanctx,
8092         .unassign_vif_chanctx           = ath11k_mac_op_unassign_vif_chanctx,
8093         .switch_vif_chanctx             = ath11k_mac_op_switch_vif_chanctx,
8094         .set_rts_threshold              = ath11k_mac_op_set_rts_threshold,
8095         .set_frag_threshold             = ath11k_mac_op_set_frag_threshold,
8096         .set_bitrate_mask               = ath11k_mac_op_set_bitrate_mask,
8097         .get_survey                     = ath11k_mac_op_get_survey,
8098         .flush                          = ath11k_mac_op_flush,
8099         .sta_statistics                 = ath11k_mac_op_sta_statistics,
8100         CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
8101 #ifdef CONFIG_ATH11K_DEBUGFS
8102         .sta_add_debugfs                = ath11k_debugfs_sta_op_add,
8103 #endif
8104 };
8105
8106 static void ath11k_mac_update_ch_list(struct ath11k *ar,
8107                                       struct ieee80211_supported_band *band,
8108                                       u32 freq_low, u32 freq_high)
8109 {
8110         int i;
8111
8112         if (!(freq_low && freq_high))
8113                 return;
8114
8115         for (i = 0; i < band->n_channels; i++) {
8116                 if (band->channels[i].center_freq < freq_low ||
8117                     band->channels[i].center_freq > freq_high)
8118                         band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
8119         }
8120 }
8121
8122 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
8123 {
8124         struct ath11k_pdev *pdev = ar->pdev;
8125         struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
8126
8127         if (band == WMI_HOST_WLAN_2G_CAP)
8128                 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
8129
8130         if (band == WMI_HOST_WLAN_5G_CAP)
8131                 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
8132
8133         ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
8134
8135         return 0;
8136 }
8137
8138 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
8139                                            u32 supported_bands)
8140 {
8141         struct ieee80211_supported_band *band;
8142         struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
8143         void *channels;
8144         u32 phy_id;
8145
8146         BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
8147                       ARRAY_SIZE(ath11k_5ghz_channels) +
8148                       ARRAY_SIZE(ath11k_6ghz_channels)) !=
8149                      ATH11K_NUM_CHANS);
8150
8151         reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
8152         temp_reg_cap = reg_cap;
8153
8154         if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
8155                 channels = kmemdup(ath11k_2ghz_channels,
8156                                    sizeof(ath11k_2ghz_channels),
8157                                    GFP_KERNEL);
8158                 if (!channels)
8159                         return -ENOMEM;
8160
8161                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
8162                 band->band = NL80211_BAND_2GHZ;
8163                 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
8164                 band->channels = channels;
8165                 band->n_bitrates = ath11k_g_rates_size;
8166                 band->bitrates = ath11k_g_rates;
8167                 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
8168
8169                 if (ar->ab->hw_params.single_pdev_only) {
8170                         phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
8171                         temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8172                 }
8173                 ath11k_mac_update_ch_list(ar, band,
8174                                           temp_reg_cap->low_2ghz_chan,
8175                                           temp_reg_cap->high_2ghz_chan);
8176         }
8177
8178         if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
8179                 if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) {
8180                         channels = kmemdup(ath11k_6ghz_channels,
8181                                            sizeof(ath11k_6ghz_channels), GFP_KERNEL);
8182                         if (!channels) {
8183                                 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8184                                 return -ENOMEM;
8185                         }
8186
8187                         ar->supports_6ghz = true;
8188                         band = &ar->mac.sbands[NL80211_BAND_6GHZ];
8189                         band->band = NL80211_BAND_6GHZ;
8190                         band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
8191                         band->channels = channels;
8192                         band->n_bitrates = ath11k_a_rates_size;
8193                         band->bitrates = ath11k_a_rates;
8194                         ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
8195
8196                         if (ar->ab->hw_params.single_pdev_only) {
8197                                 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8198                                 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8199                         }
8200
8201                         ath11k_mac_update_ch_list(ar, band,
8202                                                   temp_reg_cap->low_5ghz_chan,
8203                                                   temp_reg_cap->high_5ghz_chan);
8204                 }
8205
8206                 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
8207                         channels = kmemdup(ath11k_5ghz_channels,
8208                                            sizeof(ath11k_5ghz_channels),
8209                                            GFP_KERNEL);
8210                         if (!channels) {
8211                                 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8212                                 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8213                                 return -ENOMEM;
8214                         }
8215
8216                         band = &ar->mac.sbands[NL80211_BAND_5GHZ];
8217                         band->band = NL80211_BAND_5GHZ;
8218                         band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
8219                         band->channels = channels;
8220                         band->n_bitrates = ath11k_a_rates_size;
8221                         band->bitrates = ath11k_a_rates;
8222                         ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
8223
8224                         if (ar->ab->hw_params.single_pdev_only) {
8225                                 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8226                                 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8227                         }
8228
8229                         ath11k_mac_update_ch_list(ar, band,
8230                                                   temp_reg_cap->low_5ghz_chan,
8231                                                   temp_reg_cap->high_5ghz_chan);
8232                 }
8233         }
8234
8235         return 0;
8236 }
8237
8238 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
8239 {
8240         struct ath11k_base *ab = ar->ab;
8241         struct ieee80211_iface_combination *combinations;
8242         struct ieee80211_iface_limit *limits;
8243         int n_limits;
8244
8245         combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
8246         if (!combinations)
8247                 return -ENOMEM;
8248
8249         n_limits = 2;
8250
8251         limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
8252         if (!limits) {
8253                 kfree(combinations);
8254                 return -ENOMEM;
8255         }
8256
8257         limits[0].max = 1;
8258         limits[0].types |= BIT(NL80211_IFTYPE_STATION);
8259
8260         limits[1].max = 16;
8261         limits[1].types |= BIT(NL80211_IFTYPE_AP);
8262
8263         if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
8264             ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
8265                 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
8266
8267         combinations[0].limits = limits;
8268         combinations[0].n_limits = n_limits;
8269         combinations[0].max_interfaces = 16;
8270         combinations[0].num_different_channels = 1;
8271         combinations[0].beacon_int_infra_match = true;
8272         combinations[0].beacon_int_min_gcd = 100;
8273         combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8274                                                 BIT(NL80211_CHAN_WIDTH_20) |
8275                                                 BIT(NL80211_CHAN_WIDTH_40) |
8276                                                 BIT(NL80211_CHAN_WIDTH_80) |
8277                                                 BIT(NL80211_CHAN_WIDTH_80P80) |
8278                                                 BIT(NL80211_CHAN_WIDTH_160);
8279
8280         ar->hw->wiphy->iface_combinations = combinations;
8281         ar->hw->wiphy->n_iface_combinations = 1;
8282
8283         return 0;
8284 }
8285
8286 static const u8 ath11k_if_types_ext_capa[] = {
8287         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8288         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8289 };
8290
8291 static const u8 ath11k_if_types_ext_capa_sta[] = {
8292         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8293         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8294         [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
8295 };
8296
8297 static const u8 ath11k_if_types_ext_capa_ap[] = {
8298         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8299         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8300         [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
8301 };
8302
8303 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
8304         {
8305                 .extended_capabilities = ath11k_if_types_ext_capa,
8306                 .extended_capabilities_mask = ath11k_if_types_ext_capa,
8307                 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
8308         }, {
8309                 .iftype = NL80211_IFTYPE_STATION,
8310                 .extended_capabilities = ath11k_if_types_ext_capa_sta,
8311                 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
8312                 .extended_capabilities_len =
8313                                 sizeof(ath11k_if_types_ext_capa_sta),
8314         }, {
8315                 .iftype = NL80211_IFTYPE_AP,
8316                 .extended_capabilities = ath11k_if_types_ext_capa_ap,
8317                 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
8318                 .extended_capabilities_len =
8319                                 sizeof(ath11k_if_types_ext_capa_ap),
8320         },
8321 };
8322
8323 static void __ath11k_mac_unregister(struct ath11k *ar)
8324 {
8325         cancel_work_sync(&ar->regd_update_work);
8326
8327         ieee80211_unregister_hw(ar->hw);
8328
8329         idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
8330         idr_destroy(&ar->txmgmt_idr);
8331
8332         kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8333         kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8334         kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8335
8336         kfree(ar->hw->wiphy->iface_combinations[0].limits);
8337         kfree(ar->hw->wiphy->iface_combinations);
8338
8339         SET_IEEE80211_DEV(ar->hw, NULL);
8340 }
8341
8342 void ath11k_mac_unregister(struct ath11k_base *ab)
8343 {
8344         struct ath11k *ar;
8345         struct ath11k_pdev *pdev;
8346         int i;
8347
8348         for (i = 0; i < ab->num_radios; i++) {
8349                 pdev = &ab->pdevs[i];
8350                 ar = pdev->ar;
8351                 if (!ar)
8352                         continue;
8353
8354                 __ath11k_mac_unregister(ar);
8355         }
8356 }
8357
8358 static int __ath11k_mac_register(struct ath11k *ar)
8359 {
8360         struct ath11k_base *ab = ar->ab;
8361         struct ath11k_pdev_cap *cap = &ar->pdev->cap;
8362         static const u32 cipher_suites[] = {
8363                 WLAN_CIPHER_SUITE_TKIP,
8364                 WLAN_CIPHER_SUITE_CCMP,
8365                 WLAN_CIPHER_SUITE_AES_CMAC,
8366                 WLAN_CIPHER_SUITE_BIP_CMAC_256,
8367                 WLAN_CIPHER_SUITE_BIP_GMAC_128,
8368                 WLAN_CIPHER_SUITE_BIP_GMAC_256,
8369                 WLAN_CIPHER_SUITE_GCMP,
8370                 WLAN_CIPHER_SUITE_GCMP_256,
8371                 WLAN_CIPHER_SUITE_CCMP_256,
8372         };
8373         int ret;
8374         u32 ht_cap = 0;
8375
8376         ath11k_pdev_caps_update(ar);
8377
8378         SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
8379
8380         SET_IEEE80211_DEV(ar->hw, ab->dev);
8381
8382         ret = ath11k_mac_setup_channels_rates(ar,
8383                                               cap->supported_bands);
8384         if (ret)
8385                 goto err;
8386
8387         ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
8388         ath11k_mac_setup_he_cap(ar, cap);
8389
8390         ret = ath11k_mac_setup_iface_combinations(ar);
8391         if (ret) {
8392                 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
8393                 goto err_free_channels;
8394         }
8395
8396         ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
8397         ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
8398
8399         ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
8400
8401         if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
8402                 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
8403
8404         ieee80211_hw_set(ar->hw, SIGNAL_DBM);
8405         ieee80211_hw_set(ar->hw, SUPPORTS_PS);
8406         ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
8407         ieee80211_hw_set(ar->hw, MFP_CAPABLE);
8408         ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
8409         ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
8410         ieee80211_hw_set(ar->hw, AP_LINK_PS);
8411         ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
8412         ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
8413         ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
8414         ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
8415         ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
8416         ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
8417         ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
8418         ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
8419
8420         if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
8421                 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
8422                 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
8423         }
8424
8425         if (cap->nss_ratio_enabled)
8426                 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
8427
8428         if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
8429                 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
8430                 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
8431                 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
8432                 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
8433                 ieee80211_hw_set(ar->hw, USES_RSS);
8434         }
8435
8436         ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8437         ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8438
8439         /* TODO: Check if HT capability advertised from firmware is different
8440          * for each band for a dual band capable radio. It will be tricky to
8441          * handle it when the ht capability different for each band.
8442          */
8443         if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
8444             (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
8445                 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8446
8447         ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8448         ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8449
8450         ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
8451
8452         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8453         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8454         ar->hw->wiphy->max_remain_on_channel_duration = 5000;
8455
8456         ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8457         ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8458                                    NL80211_FEATURE_AP_SCAN;
8459
8460         ar->max_num_stations = TARGET_NUM_STATIONS(ab);
8461         ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
8462
8463         ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
8464
8465         if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
8466                 ar->hw->wiphy->features |=
8467                         NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
8468         }
8469
8470         ar->hw->queues = ATH11K_HW_MAX_QUEUES;
8471         ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
8472         ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
8473         ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
8474
8475         ar->hw->vif_data_size = sizeof(struct ath11k_vif);
8476         ar->hw->sta_data_size = sizeof(struct ath11k_sta);
8477
8478         wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8479         wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
8480         if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD, ar->ab->wmi_ab.svc_map))
8481                 wiphy_ext_feature_set(ar->hw->wiphy,
8482                                       NL80211_EXT_FEATURE_BSS_COLOR);
8483
8484         ar->hw->wiphy->cipher_suites = cipher_suites;
8485         ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
8486
8487         ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
8488         ar->hw->wiphy->num_iftype_ext_capab =
8489                 ARRAY_SIZE(ath11k_iftypes_ext_capa);
8490
8491         if (ar->supports_6ghz) {
8492                 wiphy_ext_feature_set(ar->hw->wiphy,
8493                                       NL80211_EXT_FEATURE_FILS_DISCOVERY);
8494                 wiphy_ext_feature_set(ar->hw->wiphy,
8495                                       NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
8496         }
8497
8498         ath11k_reg_init(ar);
8499
8500         if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
8501                 ar->hw->netdev_features = NETIF_F_HW_CSUM;
8502                 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
8503                 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
8504         }
8505
8506         ret = ieee80211_register_hw(ar->hw);
8507         if (ret) {
8508                 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
8509                 goto err_free_if_combs;
8510         }
8511
8512         if (!ab->hw_params.supports_monitor)
8513                 /* There's a race between calling ieee80211_register_hw()
8514                  * and here where the monitor mode is enabled for a little
8515                  * while. But that time is so short and in practise it make
8516                  * a difference in real life.
8517                  */
8518                 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
8519
8520         /* Apply the regd received during initialization */
8521         ret = ath11k_regd_update(ar);
8522         if (ret) {
8523                 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
8524                 goto err_unregister_hw;
8525         }
8526
8527         ret = ath11k_debugfs_register(ar);
8528         if (ret) {
8529                 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
8530                 goto err_unregister_hw;
8531         }
8532
8533         return 0;
8534
8535 err_unregister_hw:
8536         ieee80211_unregister_hw(ar->hw);
8537
8538 err_free_if_combs:
8539         kfree(ar->hw->wiphy->iface_combinations[0].limits);
8540         kfree(ar->hw->wiphy->iface_combinations);
8541
8542 err_free_channels:
8543         kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8544         kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8545         kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8546
8547 err:
8548         SET_IEEE80211_DEV(ar->hw, NULL);
8549         return ret;
8550 }
8551
8552 int ath11k_mac_register(struct ath11k_base *ab)
8553 {
8554         struct ath11k *ar;
8555         struct ath11k_pdev *pdev;
8556         int i;
8557         int ret;
8558
8559         if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
8560                 return 0;
8561
8562         /* Initialize channel counters frequency value in hertz */
8563         ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
8564         ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
8565
8566         for (i = 0; i < ab->num_radios; i++) {
8567                 pdev = &ab->pdevs[i];
8568                 ar = pdev->ar;
8569                 if (ab->pdevs_macaddr_valid) {
8570                         ether_addr_copy(ar->mac_addr, pdev->mac_addr);
8571                 } else {
8572                         ether_addr_copy(ar->mac_addr, ab->mac_addr);
8573                         ar->mac_addr[4] += i;
8574                 }
8575
8576                 idr_init(&ar->txmgmt_idr);
8577                 spin_lock_init(&ar->txmgmt_idr_lock);
8578
8579                 ret = __ath11k_mac_register(ar);
8580                 if (ret)
8581                         goto err_cleanup;
8582
8583                 init_waitqueue_head(&ar->txmgmt_empty_waitq);
8584         }
8585
8586         return 0;
8587
8588 err_cleanup:
8589         for (i = i - 1; i >= 0; i--) {
8590                 pdev = &ab->pdevs[i];
8591                 ar = pdev->ar;
8592                 __ath11k_mac_unregister(ar);
8593         }
8594
8595         return ret;
8596 }
8597
8598 int ath11k_mac_allocate(struct ath11k_base *ab)
8599 {
8600         struct ieee80211_hw *hw;
8601         struct ath11k *ar;
8602         struct ath11k_pdev *pdev;
8603         int ret;
8604         int i;
8605
8606         if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
8607                 return 0;
8608
8609         for (i = 0; i < ab->num_radios; i++) {
8610                 pdev = &ab->pdevs[i];
8611                 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
8612                 if (!hw) {
8613                         ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
8614                         ret = -ENOMEM;
8615                         goto err_free_mac;
8616                 }
8617
8618                 ar = hw->priv;
8619                 ar->hw = hw;
8620                 ar->ab = ab;
8621                 ar->pdev = pdev;
8622                 ar->pdev_idx = i;
8623                 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
8624
8625                 ar->wmi = &ab->wmi_ab.wmi[i];
8626                 /* FIXME wmi[0] is already initialized during attach,
8627                  * Should we do this again?
8628                  */
8629                 ath11k_wmi_pdev_attach(ab, i);
8630
8631                 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
8632                 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
8633                 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
8634                 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
8635
8636                 pdev->ar = ar;
8637                 spin_lock_init(&ar->data_lock);
8638                 INIT_LIST_HEAD(&ar->arvifs);
8639                 INIT_LIST_HEAD(&ar->ppdu_stats_info);
8640                 mutex_init(&ar->conf_mutex);
8641                 init_completion(&ar->vdev_setup_done);
8642                 init_completion(&ar->vdev_delete_done);
8643                 init_completion(&ar->peer_assoc_done);
8644                 init_completion(&ar->peer_delete_done);
8645                 init_completion(&ar->install_key_done);
8646                 init_completion(&ar->bss_survey_done);
8647                 init_completion(&ar->scan.started);
8648                 init_completion(&ar->scan.completed);
8649                 init_completion(&ar->thermal.wmi_sync);
8650
8651                 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
8652                 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
8653
8654                 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
8655                 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
8656
8657                 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
8658
8659                 ar->monitor_vdev_id = -1;
8660                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
8661                 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
8662                 init_completion(&ar->completed_11d_scan);
8663         }
8664
8665         return 0;
8666
8667 err_free_mac:
8668         ath11k_mac_destroy(ab);
8669
8670         return ret;
8671 }
8672
8673 void ath11k_mac_destroy(struct ath11k_base *ab)
8674 {
8675         struct ath11k *ar;
8676         struct ath11k_pdev *pdev;
8677         int i;
8678
8679         for (i = 0; i < ab->num_radios; i++) {
8680                 pdev = &ab->pdevs[i];
8681                 ar = pdev->ar;
8682                 if (!ar)
8683                         continue;
8684
8685                 ieee80211_free_hw(ar->hw);
8686                 pdev->ar = NULL;
8687         }
8688 }