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