Merge branches 'acpi-scan', 'acpi-resource', 'acpi-apei', 'acpi-extlog' and 'acpi...
[sfrench/cifs-2.6.git] / drivers / net / wireless / ath / ath11k / mac.c
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-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[NL80211_HE_NSS_MAX];
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         memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs,
2102                sizeof(he_mcs_mask));
2103
2104         if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2105                 return;
2106
2107         arg->he_flag = true;
2108         support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2109                   IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2110
2111         /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2112         mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2113         mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2114
2115         if (support_160) {
2116                 for (i = 7; i >= 0; i--) {
2117                         u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2118
2119                         if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2120                                 rx_mcs_160 = i + 1;
2121                                 break;
2122                         }
2123                 }
2124         }
2125
2126         for (i = 7; i >= 0; i--) {
2127                 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2128
2129                 if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2130                         rx_mcs_80 = i + 1;
2131                         break;
2132                 }
2133         }
2134
2135         if (support_160)
2136                 max_nss = min(rx_mcs_80, rx_mcs_160);
2137         else
2138                 max_nss = rx_mcs_80;
2139
2140         arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2141
2142         memcpy_and_pad(&arg->peer_he_cap_macinfo,
2143                        sizeof(arg->peer_he_cap_macinfo),
2144                        he_cap->he_cap_elem.mac_cap_info,
2145                        sizeof(he_cap->he_cap_elem.mac_cap_info),
2146                        0);
2147         memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2148                        sizeof(arg->peer_he_cap_phyinfo),
2149                        he_cap->he_cap_elem.phy_cap_info,
2150                        sizeof(he_cap->he_cap_elem.phy_cap_info),
2151                        0);
2152         arg->peer_he_ops = vif->bss_conf.he_oper.params;
2153
2154         /* the top most byte is used to indicate BSS color info */
2155         arg->peer_he_ops &= 0xffffff;
2156
2157         /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2158          * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2159          * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2160          *
2161          * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2162          * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2163          * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2164          * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2165          * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2166          * length.
2167          */
2168         ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2169                                    IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2170
2171         if (ampdu_factor) {
2172                 if (sta->deflink.vht_cap.vht_supported)
2173                         arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2174                                                     ampdu_factor)) - 1;
2175                 else if (sta->deflink.ht_cap.ht_supported)
2176                         arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2177                                                     ampdu_factor)) - 1;
2178         }
2179
2180         if (he_cap->he_cap_elem.phy_cap_info[6] &
2181             IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2182                 int bit = 7;
2183                 int nss, ru;
2184
2185                 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2186                                           IEEE80211_PPE_THRES_NSS_MASK;
2187                 arg->peer_ppet.ru_bit_mask =
2188                         (he_cap->ppe_thres[0] &
2189                          IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2190                         IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2191
2192                 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2193                         for (ru = 0; ru < 4; ru++) {
2194                                 u32 val = 0;
2195                                 int i;
2196
2197                                 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2198                                         continue;
2199                                 for (i = 0; i < 6; i++) {
2200                                         val >>= 1;
2201                                         val |= ((he_cap->ppe_thres[bit / 8] >>
2202                                                  (bit % 8)) & 0x1) << 5;
2203                                         bit++;
2204                                 }
2205                                 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2206                                                                 val << (ru * 6);
2207                         }
2208                 }
2209         }
2210
2211         if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2212                 arg->twt_responder = true;
2213         if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2214                 arg->twt_requester = true;
2215
2216         he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
2217
2218         if (he_nss > sta->deflink.rx_nss) {
2219                 user_rate_valid = false;
2220                 for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2221                         if (he_mcs_mask[nss_idx]) {
2222                                 user_rate_valid = true;
2223                                 break;
2224                         }
2225                 }
2226         }
2227
2228         if (!user_rate_valid) {
2229                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n",
2230                            sta->deflink.rx_nss, sta->addr);
2231                 he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2232         }
2233
2234         switch (sta->deflink.bandwidth) {
2235         case IEEE80211_STA_RX_BW_160:
2236                 if (he_cap->he_cap_elem.phy_cap_info[0] &
2237                     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2238                         v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2239                         v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2240                         arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2241
2242                         v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2243                         arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2244
2245                         arg->peer_he_mcs_count++;
2246                         he_tx_mcs = v;
2247                 }
2248                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2249                 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2250
2251                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2252                 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2253                 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2254
2255                 arg->peer_he_mcs_count++;
2256                 if (!he_tx_mcs)
2257                         he_tx_mcs = v;
2258                 fallthrough;
2259
2260         default:
2261                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2262                 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2263
2264                 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2265                 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2266                 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2267
2268                 arg->peer_he_mcs_count++;
2269                 if (!he_tx_mcs)
2270                         he_tx_mcs = v;
2271                 break;
2272         }
2273
2274         /* Calculate peer NSS capability from HE capabilities if STA
2275          * supports HE.
2276          */
2277         for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2278                 he_mcs = he_tx_mcs >> (2 * i) & 3;
2279
2280                 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2281                  * unsupported range, with he_mcs_mask set, so check either of them
2282                  * to find nss.
2283                  */
2284                 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2285                     he_mcs_mask[i])
2286                         max_nss = i + 1;
2287         }
2288         arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2289
2290         if (arg->peer_phymode == MODE_11AX_HE160 ||
2291             arg->peer_phymode == MODE_11AX_HE80_80) {
2292                 tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2293                 rx_nss = min(arg->peer_nss, tx_nss);
2294                 arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2295
2296                 if (!rx_nss) {
2297                         ath11k_warn(ar->ab, "invalid max_nss\n");
2298                         return;
2299                 }
2300
2301                 if (arg->peer_phymode == MODE_11AX_HE160)
2302                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2303                 else
2304                         nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2305
2306                 arg->peer_bw_rxnss_override |= nss_160;
2307         }
2308
2309         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2310                    "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2311                    sta->addr, arg->peer_nss,
2312                    arg->peer_he_mcs_count,
2313                    arg->peer_bw_rxnss_override);
2314 }
2315
2316 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2317                                         struct ieee80211_vif *vif,
2318                                         struct ieee80211_sta *sta,
2319                                         struct peer_assoc_params *arg)
2320 {
2321         const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2322         struct cfg80211_chan_def def;
2323         enum nl80211_band band;
2324         u8  ampdu_factor;
2325
2326         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2327                 return;
2328
2329         band = def.chan->band;
2330
2331         if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2332                 return;
2333
2334         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2335                 arg->bw_40 = true;
2336
2337         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2338                 arg->bw_80 = true;
2339
2340         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2341                 arg->bw_160 = true;
2342
2343         arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2344         arg->peer_mpdu_density =
2345                 ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2346                                                    arg->peer_he_caps_6ghz));
2347
2348         /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2349          * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2350          * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2351          * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2352          * Band Capabilities element in the 6 GHz band.
2353          *
2354          * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2355          * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2356          */
2357         ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2358                                  he_cap->he_cap_elem.mac_cap_info[3]) +
2359                         FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2360                                   arg->peer_he_caps_6ghz);
2361
2362         arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2363                                      ampdu_factor)) - 1;
2364 }
2365
2366 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2367                                      struct peer_assoc_params *arg)
2368 {
2369         const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2370         int smps;
2371
2372         if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2373                 return;
2374
2375         if (ht_cap->ht_supported) {
2376                 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2377                 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2378         } else {
2379                 smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2380                                      IEEE80211_HE_6GHZ_CAP_SM_PS);
2381         }
2382
2383         switch (smps) {
2384         case WLAN_HT_CAP_SM_PS_STATIC:
2385                 arg->static_mimops_flag = true;
2386                 break;
2387         case WLAN_HT_CAP_SM_PS_DYNAMIC:
2388                 arg->dynamic_mimops_flag = true;
2389                 break;
2390         case WLAN_HT_CAP_SM_PS_DISABLED:
2391                 arg->spatial_mux_flag = true;
2392                 break;
2393         default:
2394                 break;
2395         }
2396 }
2397
2398 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2399                                     struct ieee80211_vif *vif,
2400                                     struct ieee80211_sta *sta,
2401                                     struct peer_assoc_params *arg)
2402 {
2403         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2404
2405         switch (arvif->vdev_type) {
2406         case WMI_VDEV_TYPE_AP:
2407                 if (sta->wme) {
2408                         /* TODO: Check WME vs QoS */
2409                         arg->is_wme_set = true;
2410                         arg->qos_flag = true;
2411                 }
2412
2413                 if (sta->wme && sta->uapsd_queues) {
2414                         /* TODO: Check WME vs QoS */
2415                         arg->is_wme_set = true;
2416                         arg->apsd_flag = true;
2417                         arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2418                 }
2419                 break;
2420         case WMI_VDEV_TYPE_STA:
2421                 if (sta->wme) {
2422                         arg->is_wme_set = true;
2423                         arg->qos_flag = true;
2424                 }
2425                 break;
2426         default:
2427                 break;
2428         }
2429
2430         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM qos %d\n",
2431                    sta->addr, arg->qos_flag);
2432 }
2433
2434 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2435                                     struct ath11k_vif *arvif,
2436                                     struct ieee80211_sta *sta)
2437 {
2438         struct ap_ps_params params;
2439         u32 max_sp;
2440         u32 uapsd;
2441         int ret;
2442
2443         lockdep_assert_held(&ar->conf_mutex);
2444
2445         params.vdev_id = arvif->vdev_id;
2446
2447         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2448                    sta->uapsd_queues, sta->max_sp);
2449
2450         uapsd = 0;
2451         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2452                 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2453                          WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2454         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2455                 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2456                          WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2457         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2458                 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2459                          WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2460         if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2461                 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2462                          WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2463
2464         max_sp = 0;
2465         if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2466                 max_sp = sta->max_sp;
2467
2468         params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2469         params.value = uapsd;
2470         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2471         if (ret)
2472                 goto err;
2473
2474         params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2475         params.value = max_sp;
2476         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2477         if (ret)
2478                 goto err;
2479
2480         /* TODO revisit during testing */
2481         params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2482         params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2483         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2484         if (ret)
2485                 goto err;
2486
2487         params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2488         params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2489         ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2490         if (ret)
2491                 goto err;
2492
2493         return 0;
2494
2495 err:
2496         ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2497                     params.param, arvif->vdev_id, ret);
2498         return ret;
2499 }
2500
2501 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2502 {
2503         return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2504                ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2505 }
2506
2507 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2508                                                     struct ieee80211_sta *sta)
2509 {
2510         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2511                 switch (sta->deflink.vht_cap.cap &
2512                         IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2513                 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2514                         return MODE_11AC_VHT160;
2515                 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2516                         return MODE_11AC_VHT80_80;
2517                 default:
2518                         /* not sure if this is a valid case? */
2519                         return MODE_11AC_VHT160;
2520                 }
2521         }
2522
2523         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2524                 return MODE_11AC_VHT80;
2525
2526         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2527                 return MODE_11AC_VHT40;
2528
2529         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2530                 return MODE_11AC_VHT20;
2531
2532         return MODE_UNKNOWN;
2533 }
2534
2535 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2536                                                    struct ieee80211_sta *sta)
2537 {
2538         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2539                 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2540                      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2541                         return MODE_11AX_HE160;
2542                 else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2543                          IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2544                         return MODE_11AX_HE80_80;
2545                 /* not sure if this is a valid case? */
2546                 return MODE_11AX_HE160;
2547         }
2548
2549         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2550                 return MODE_11AX_HE80;
2551
2552         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2553                 return MODE_11AX_HE40;
2554
2555         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2556                 return MODE_11AX_HE20;
2557
2558         return MODE_UNKNOWN;
2559 }
2560
2561 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2562                                         struct ieee80211_vif *vif,
2563                                         struct ieee80211_sta *sta,
2564                                         struct peer_assoc_params *arg)
2565 {
2566         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2567         struct cfg80211_chan_def def;
2568         enum nl80211_band band;
2569         const u8 *ht_mcs_mask;
2570         const u16 *vht_mcs_mask;
2571         const u16 *he_mcs_mask;
2572         enum wmi_phy_mode phymode = MODE_UNKNOWN;
2573
2574         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2575                 return;
2576
2577         band = def.chan->band;
2578         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2579         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2580         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2581
2582         switch (band) {
2583         case NL80211_BAND_2GHZ:
2584                 if (sta->deflink.he_cap.has_he &&
2585                     !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2586                         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2587                                 phymode = MODE_11AX_HE80_2G;
2588                         else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2589                                 phymode = MODE_11AX_HE40_2G;
2590                         else
2591                                 phymode = MODE_11AX_HE20_2G;
2592                 } else if (sta->deflink.vht_cap.vht_supported &&
2593                            !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2594                         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2595                                 phymode = MODE_11AC_VHT40;
2596                         else
2597                                 phymode = MODE_11AC_VHT20;
2598                 } else if (sta->deflink.ht_cap.ht_supported &&
2599                            !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2600                         if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2601                                 phymode = MODE_11NG_HT40;
2602                         else
2603                                 phymode = MODE_11NG_HT20;
2604                 } else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2605                         phymode = MODE_11G;
2606                 } else {
2607                         phymode = MODE_11B;
2608                 }
2609                 break;
2610         case NL80211_BAND_5GHZ:
2611         case NL80211_BAND_6GHZ:
2612                 /* Check HE first */
2613                 if (sta->deflink.he_cap.has_he &&
2614                     !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2615                         phymode = ath11k_mac_get_phymode_he(ar, sta);
2616                 } else if (sta->deflink.vht_cap.vht_supported &&
2617                            !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2618                         phymode = ath11k_mac_get_phymode_vht(ar, sta);
2619                 } else if (sta->deflink.ht_cap.ht_supported &&
2620                            !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2621                         if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2622                                 phymode = MODE_11NA_HT40;
2623                         else
2624                                 phymode = MODE_11NA_HT20;
2625                 } else {
2626                         phymode = MODE_11A;
2627                 }
2628                 break;
2629         default:
2630                 break;
2631         }
2632
2633         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac peer %pM phymode %s\n",
2634                    sta->addr, ath11k_wmi_phymode_str(phymode));
2635
2636         arg->peer_phymode = phymode;
2637         WARN_ON(phymode == MODE_UNKNOWN);
2638 }
2639
2640 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2641                                       struct ieee80211_vif *vif,
2642                                       struct ieee80211_sta *sta,
2643                                       struct peer_assoc_params *arg,
2644                                       bool reassoc)
2645 {
2646         struct ath11k_sta *arsta;
2647
2648         lockdep_assert_held(&ar->conf_mutex);
2649
2650         arsta = (struct ath11k_sta *)sta->drv_priv;
2651
2652         memset(arg, 0, sizeof(*arg));
2653
2654         reinit_completion(&ar->peer_assoc_done);
2655
2656         arg->peer_new_assoc = !reassoc;
2657         ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2658         ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2659         ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2660         ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2661         ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2662         ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2663         ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2664         ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2665         ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2666         ath11k_peer_assoc_h_smps(sta, arg);
2667
2668         arsta->peer_nss = arg->peer_nss;
2669
2670         /* TODO: amsdu_disable req? */
2671 }
2672
2673 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2674                                   const u8 *addr,
2675                                   const struct ieee80211_sta_ht_cap *ht_cap,
2676                                   u16 he_6ghz_capa)
2677 {
2678         int smps;
2679
2680         if (!ht_cap->ht_supported && !he_6ghz_capa)
2681                 return 0;
2682
2683         if (ht_cap->ht_supported) {
2684                 smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2685                 smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2686         } else {
2687                 smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2688         }
2689
2690         if (smps >= ARRAY_SIZE(ath11k_smps_map))
2691                 return -EINVAL;
2692
2693         return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2694                                          WMI_PEER_MIMO_PS_STATE,
2695                                          ath11k_smps_map[smps]);
2696 }
2697
2698 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2699                              struct ieee80211_vif *vif,
2700                              struct ieee80211_bss_conf *bss_conf)
2701 {
2702         struct ath11k *ar = hw->priv;
2703         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2704         struct peer_assoc_params peer_arg;
2705         struct ieee80211_sta *ap_sta;
2706         struct ath11k_peer *peer;
2707         bool is_auth = false;
2708         int ret;
2709
2710         lockdep_assert_held(&ar->conf_mutex);
2711
2712         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2713                    arvif->vdev_id, arvif->bssid, arvif->aid);
2714
2715         rcu_read_lock();
2716
2717         ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2718         if (!ap_sta) {
2719                 ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2720                             bss_conf->bssid, arvif->vdev_id);
2721                 rcu_read_unlock();
2722                 return;
2723         }
2724
2725         ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2726
2727         rcu_read_unlock();
2728
2729         peer_arg.is_assoc = true;
2730         ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2731         if (ret) {
2732                 ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2733                             bss_conf->bssid, arvif->vdev_id, ret);
2734                 return;
2735         }
2736
2737         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2738                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2739                             bss_conf->bssid, arvif->vdev_id);
2740                 return;
2741         }
2742
2743         ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2744                                      &ap_sta->deflink.ht_cap,
2745                                      le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
2746         if (ret) {
2747                 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2748                             arvif->vdev_id, ret);
2749                 return;
2750         }
2751
2752         WARN_ON(arvif->is_up);
2753
2754         arvif->aid = vif->cfg.aid;
2755         ether_addr_copy(arvif->bssid, bss_conf->bssid);
2756
2757         ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2758         if (ret) {
2759                 ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2760                             arvif->vdev_id, ret);
2761                 return;
2762         }
2763
2764         arvif->is_up = true;
2765         arvif->rekey_data.enable_offload = false;
2766
2767         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2768                    "mac vdev %d up (associated) bssid %pM aid %d\n",
2769                    arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
2770
2771         spin_lock_bh(&ar->ab->base_lock);
2772
2773         peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2774         if (peer && peer->is_authorized)
2775                 is_auth = true;
2776
2777         spin_unlock_bh(&ar->ab->base_lock);
2778
2779         if (is_auth) {
2780                 ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
2781                                                 arvif->vdev_id,
2782                                                 WMI_PEER_AUTHORIZE,
2783                                                 1);
2784                 if (ret)
2785                         ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2786         }
2787
2788         ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2789                                            &bss_conf->he_obss_pd);
2790         if (ret)
2791                 ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2792                             arvif->vdev_id, ret);
2793
2794         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2795                                             WMI_VDEV_PARAM_DTIM_POLICY,
2796                                             WMI_DTIM_POLICY_STICK);
2797         if (ret)
2798                 ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
2799                             arvif->vdev_id, ret);
2800
2801         ath11k_mac_11d_scan_stop_all(ar->ab);
2802 }
2803
2804 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
2805                                 struct ieee80211_vif *vif)
2806 {
2807         struct ath11k *ar = hw->priv;
2808         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2809         int ret;
2810
2811         lockdep_assert_held(&ar->conf_mutex);
2812
2813         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2814                    arvif->vdev_id, arvif->bssid);
2815
2816         ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
2817         if (ret)
2818                 ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
2819                             arvif->vdev_id, ret);
2820
2821         arvif->is_up = false;
2822
2823         memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
2824
2825         cancel_delayed_work_sync(&arvif->connection_loss_work);
2826 }
2827
2828 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
2829 {
2830         u32 preamble;
2831         u16 hw_value;
2832         int rate;
2833         size_t i;
2834
2835         if (ath11k_mac_bitrate_is_cck(bitrate))
2836                 preamble = WMI_RATE_PREAMBLE_CCK;
2837         else
2838                 preamble = WMI_RATE_PREAMBLE_OFDM;
2839
2840         for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
2841                 if (ath11k_legacy_rates[i].bitrate != bitrate)
2842                         continue;
2843
2844                 hw_value = ath11k_legacy_rates[i].hw_value;
2845                 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
2846
2847                 return rate;
2848         }
2849
2850         return -EINVAL;
2851 }
2852
2853 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
2854                                          struct ieee80211_vif *vif,
2855                                          struct cfg80211_chan_def *def)
2856 {
2857         struct ath11k_vif *arvif = (void *)vif->drv_priv;
2858         const struct ieee80211_supported_band *sband;
2859         u8 basic_rate_idx;
2860         int hw_rate_code;
2861         u32 vdev_param;
2862         u16 bitrate;
2863         int ret;
2864
2865         lockdep_assert_held(&ar->conf_mutex);
2866
2867         sband = ar->hw->wiphy->bands[def->chan->band];
2868         basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2869         bitrate = sband->bitrates[basic_rate_idx].bitrate;
2870
2871         hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
2872         if (hw_rate_code < 0) {
2873                 ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2874                 return;
2875         }
2876
2877         vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2878         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2879                                             hw_rate_code);
2880         if (ret)
2881                 ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2882
2883         /* For WCN6855, firmware will clear this param when vdev starts, hence
2884          * cache it here so that we can reconfigure it once vdev starts.
2885          */
2886         ar->hw_rate_code = hw_rate_code;
2887
2888         vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2889         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2890                                             hw_rate_code);
2891         if (ret)
2892                 ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2893 }
2894
2895 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
2896                                      struct ieee80211_bss_conf *info)
2897 {
2898         struct ath11k *ar = arvif->ar;
2899         struct sk_buff *tmpl;
2900         int ret;
2901         u32 interval;
2902         bool unsol_bcast_probe_resp_enabled = false;
2903
2904         if (info->fils_discovery.max_interval) {
2905                 interval = info->fils_discovery.max_interval;
2906
2907                 tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
2908                 if (tmpl)
2909                         ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2910                                                              tmpl);
2911         } else if (info->unsol_bcast_probe_resp_interval) {
2912                 unsol_bcast_probe_resp_enabled = 1;
2913                 interval = info->unsol_bcast_probe_resp_interval;
2914
2915                 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
2916                                                                  arvif->vif);
2917                 if (tmpl)
2918                         ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2919                                                          tmpl);
2920         } else { /* Disable */
2921                 return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2922         }
2923
2924         if (!tmpl) {
2925                 ath11k_warn(ar->ab,
2926                             "mac vdev %i failed to retrieve %s template\n",
2927                             arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2928                             "unsolicited broadcast probe response" :
2929                             "FILS discovery"));
2930                 return -EPERM;
2931         }
2932         kfree_skb(tmpl);
2933
2934         if (!ret)
2935                 ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2936                                                 unsol_bcast_probe_resp_enabled);
2937
2938         return ret;
2939 }
2940
2941 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
2942                                      struct ieee80211_he_obss_pd *he_obss_pd)
2943 {
2944         u32 bitmap[2], param_id, param_val, pdev_id;
2945         int ret;
2946         s8 non_srg_th = 0, srg_th = 0;
2947
2948         pdev_id = ar->pdev->pdev_id;
2949
2950         /* Set and enable SRG/non-SRG OBSS PD Threshold */
2951         param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
2952         if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
2953                 ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
2954                 if (ret)
2955                         ath11k_warn(ar->ab,
2956                                     "failed to set obss_pd_threshold for pdev: %u\n",
2957                                     pdev_id);
2958                 return ret;
2959         }
2960
2961         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2962                    "mac obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
2963                    he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
2964                    he_obss_pd->max_offset);
2965
2966         param_val = 0;
2967
2968         if (he_obss_pd->sr_ctrl &
2969             IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
2970                 non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
2971         } else {
2972                 if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
2973                         non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
2974                                       he_obss_pd->non_srg_max_offset);
2975                 else
2976                         non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
2977
2978                 param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
2979         }
2980
2981         if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
2982                 srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
2983                 param_val |= ATH11K_OBSS_PD_SRG_EN;
2984         }
2985
2986         if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
2987                      ar->ab->wmi_ab.svc_map)) {
2988                 param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
2989                 param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
2990         } else {
2991                 non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
2992                 /* SRG not supported and threshold in dB */
2993                 param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
2994                                ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
2995         }
2996
2997         param_val |= (non_srg_th & GENMASK(7, 0));
2998         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
2999         if (ret) {
3000                 ath11k_warn(ar->ab,
3001                             "failed to set obss_pd_threshold for pdev: %u\n",
3002                             pdev_id);
3003                 return ret;
3004         }
3005
3006         /* Enable OBSS PD for all access category */
3007         param_id  = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3008         param_val = 0xf;
3009         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3010         if (ret) {
3011                 ath11k_warn(ar->ab,
3012                             "failed to set obss_pd_per_ac for pdev: %u\n",
3013                             pdev_id);
3014                 return ret;
3015         }
3016
3017         /* Set SR Prohibit */
3018         param_id  = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3019         param_val = !!(he_obss_pd->sr_ctrl &
3020                        IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3021         ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3022         if (ret) {
3023                 ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3024                             pdev_id);
3025                 return ret;
3026         }
3027
3028         if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3029                       ar->ab->wmi_ab.svc_map))
3030                 return 0;
3031
3032         /* Set SRG BSS Color Bitmap */
3033         memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3034         ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3035         if (ret) {
3036                 ath11k_warn(ar->ab,
3037                             "failed to set bss_color_bitmap for pdev: %u\n",
3038                             pdev_id);
3039                 return ret;
3040         }
3041
3042         /* Set SRG Partial BSSID Bitmap */
3043         memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3044         ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3045         if (ret) {
3046                 ath11k_warn(ar->ab,
3047                             "failed to set partial_bssid_bitmap for pdev: %u\n",
3048                             pdev_id);
3049                 return ret;
3050         }
3051
3052         memset(bitmap, 0xff, sizeof(bitmap));
3053
3054         /* Enable all BSS Colors for SRG */
3055         ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3056         if (ret) {
3057                 ath11k_warn(ar->ab,
3058                             "failed to set srg_color_en_bitmap pdev: %u\n",
3059                             pdev_id);
3060                 return ret;
3061         }
3062
3063         /* Enable all partial BSSID mask for SRG */
3064         ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3065         if (ret) {
3066                 ath11k_warn(ar->ab,
3067                             "failed to set srg_bssid_en_bitmap pdev: %u\n",
3068                             pdev_id);
3069                 return ret;
3070         }
3071
3072         /* Enable all BSS Colors for non-SRG */
3073         ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3074         if (ret) {
3075                 ath11k_warn(ar->ab,
3076                             "failed to set non_srg_color_en_bitmap pdev: %u\n",
3077                             pdev_id);
3078                 return ret;
3079         }
3080
3081         /* Enable all partial BSSID mask for non-SRG */
3082         ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3083         if (ret) {
3084                 ath11k_warn(ar->ab,
3085                             "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3086                             pdev_id);
3087                 return ret;
3088         }
3089
3090         return 0;
3091 }
3092
3093 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3094                                            struct ieee80211_vif *vif,
3095                                            struct ieee80211_bss_conf *info,
3096                                            u64 changed)
3097 {
3098         struct ath11k *ar = hw->priv;
3099         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3100         struct cfg80211_chan_def def;
3101         u32 param_id, param_value;
3102         enum nl80211_band band;
3103         u32 vdev_param;
3104         int mcast_rate;
3105         u32 preamble;
3106         u16 hw_value;
3107         u16 bitrate;
3108         int ret = 0;
3109         u8 rateidx;
3110         u32 rate;
3111         u32 ipv4_cnt;
3112
3113         mutex_lock(&ar->conf_mutex);
3114
3115         if (changed & BSS_CHANGED_BEACON_INT) {
3116                 arvif->beacon_interval = info->beacon_int;
3117
3118                 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3119                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3120                                                     param_id,
3121                                                     arvif->beacon_interval);
3122                 if (ret)
3123                         ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3124                                     arvif->vdev_id);
3125                 else
3126                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3127                                    "Beacon interval: %d set for VDEV: %d\n",
3128                                    arvif->beacon_interval, arvif->vdev_id);
3129         }
3130
3131         if (changed & BSS_CHANGED_BEACON) {
3132                 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3133                 param_value = WMI_BEACON_STAGGERED_MODE;
3134                 ret = ath11k_wmi_pdev_set_param(ar, param_id,
3135                                                 param_value, ar->pdev->pdev_id);
3136                 if (ret)
3137                         ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3138                                     arvif->vdev_id);
3139                 else
3140                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3141                                    "Set staggered beacon mode for VDEV: %d\n",
3142                                    arvif->vdev_id);
3143
3144                 if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3145                         ret = ath11k_mac_setup_bcn_tmpl(arvif);
3146                         if (ret)
3147                                 ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3148                                             ret);
3149                 }
3150
3151                 if (arvif->bcca_zero_sent)
3152                         arvif->do_not_send_tmpl = true;
3153                 else
3154                         arvif->do_not_send_tmpl = false;
3155
3156                 if (vif->bss_conf.he_support) {
3157                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3158                                                             WMI_VDEV_PARAM_BA_MODE,
3159                                                             WMI_BA_MODE_BUFFER_SIZE_256);
3160                         if (ret)
3161                                 ath11k_warn(ar->ab,
3162                                             "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3163                                             arvif->vdev_id);
3164                         else
3165                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3166                                            "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3167                                            arvif->vdev_id);
3168                 }
3169         }
3170
3171         if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3172                 arvif->dtim_period = info->dtim_period;
3173
3174                 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3175                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3176                                                     param_id,
3177                                                     arvif->dtim_period);
3178
3179                 if (ret)
3180                         ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3181                                     arvif->vdev_id, ret);
3182                 else
3183                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3184                                    "DTIM period: %d set for VDEV: %d\n",
3185                                    arvif->dtim_period, arvif->vdev_id);
3186         }
3187
3188         if (changed & BSS_CHANGED_SSID &&
3189             vif->type == NL80211_IFTYPE_AP) {
3190                 arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3191                 if (vif->cfg.ssid_len)
3192                         memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3193                                vif->cfg.ssid_len);
3194                 arvif->u.ap.hidden_ssid = info->hidden_ssid;
3195         }
3196
3197         if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3198                 ether_addr_copy(arvif->bssid, info->bssid);
3199
3200         if (changed & BSS_CHANGED_BEACON_ENABLED) {
3201                 ath11k_control_beaconing(arvif, info);
3202
3203                 if (arvif->is_up && vif->bss_conf.he_support &&
3204                     vif->bss_conf.he_oper.params) {
3205                         param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3206                         param_value = vif->bss_conf.he_oper.params;
3207                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3208                                                             param_id, param_value);
3209                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3210                                    "he oper param: %x set for VDEV: %d\n",
3211                                    param_value, arvif->vdev_id);
3212
3213                         if (ret)
3214                                 ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3215                                             param_value, arvif->vdev_id, ret);
3216                 }
3217         }
3218
3219         if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3220                 u32 cts_prot;
3221
3222                 cts_prot = !!(info->use_cts_prot);
3223                 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3224
3225                 if (arvif->is_started) {
3226                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3227                                                             param_id, cts_prot);
3228                         if (ret)
3229                                 ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3230                                             arvif->vdev_id);
3231                         else
3232                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3233                                            cts_prot, arvif->vdev_id);
3234                 } else {
3235                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3236                 }
3237         }
3238
3239         if (changed & BSS_CHANGED_ERP_SLOT) {
3240                 u32 slottime;
3241
3242                 if (info->use_short_slot)
3243                         slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3244
3245                 else
3246                         slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3247
3248                 param_id = WMI_VDEV_PARAM_SLOT_TIME;
3249                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3250                                                     param_id, slottime);
3251                 if (ret)
3252                         ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3253                                     arvif->vdev_id);
3254                 else
3255                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3256                                    "Set slottime: %d for VDEV: %d\n",
3257                                    slottime, arvif->vdev_id);
3258         }
3259
3260         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3261                 u32 preamble;
3262
3263                 if (info->use_short_preamble)
3264                         preamble = WMI_VDEV_PREAMBLE_SHORT;
3265                 else
3266                         preamble = WMI_VDEV_PREAMBLE_LONG;
3267
3268                 param_id = WMI_VDEV_PARAM_PREAMBLE;
3269                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3270                                                     param_id, preamble);
3271                 if (ret)
3272                         ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3273                                     arvif->vdev_id);
3274                 else
3275                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3276                                    "Set preamble: %d for VDEV: %d\n",
3277                                    preamble, arvif->vdev_id);
3278         }
3279
3280         if (changed & BSS_CHANGED_ASSOC) {
3281                 if (vif->cfg.assoc)
3282                         ath11k_bss_assoc(hw, vif, info);
3283                 else
3284                         ath11k_bss_disassoc(hw, vif);
3285         }
3286
3287         if (changed & BSS_CHANGED_TXPOWER) {
3288                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
3289                            arvif->vdev_id, info->txpower);
3290
3291                 arvif->txpower = info->txpower;
3292                 ath11k_mac_txpower_recalc(ar);
3293         }
3294
3295         if (changed & BSS_CHANGED_PS &&
3296             ar->ab->hw_params.supports_sta_ps) {
3297                 arvif->ps = vif->cfg.ps;
3298
3299                 ret = ath11k_mac_config_ps(ar);
3300                 if (ret)
3301                         ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3302                                     arvif->vdev_id, ret);
3303         }
3304
3305         if (changed & BSS_CHANGED_MCAST_RATE &&
3306             !ath11k_mac_vif_chan(arvif->vif, &def)) {
3307                 band = def.chan->band;
3308                 mcast_rate = vif->bss_conf.mcast_rate[band];
3309
3310                 if (mcast_rate > 0)
3311                         rateidx = mcast_rate - 1;
3312                 else
3313                         rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3314
3315                 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3316                         rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3317
3318                 bitrate = ath11k_legacy_rates[rateidx].bitrate;
3319                 hw_value = ath11k_legacy_rates[rateidx].hw_value;
3320
3321                 if (ath11k_mac_bitrate_is_cck(bitrate))
3322                         preamble = WMI_RATE_PREAMBLE_CCK;
3323                 else
3324                         preamble = WMI_RATE_PREAMBLE_OFDM;
3325
3326                 rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3327
3328                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3329                            "mac vdev %d mcast_rate %x\n",
3330                            arvif->vdev_id, rate);
3331
3332                 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3333                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3334                                                     vdev_param, rate);
3335                 if (ret)
3336                         ath11k_warn(ar->ab,
3337                                     "failed to set mcast rate on vdev %i: %d\n",
3338                                     arvif->vdev_id,  ret);
3339
3340                 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3341                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3342                                                     vdev_param, rate);
3343                 if (ret)
3344                         ath11k_warn(ar->ab,
3345                                     "failed to set bcast rate on vdev %i: %d\n",
3346                                     arvif->vdev_id,  ret);
3347         }
3348
3349         if (changed & BSS_CHANGED_BASIC_RATES &&
3350             !ath11k_mac_vif_chan(arvif->vif, &def))
3351                 ath11k_recalculate_mgmt_rate(ar, vif, &def);
3352
3353         if (changed & BSS_CHANGED_TWT) {
3354                 struct wmi_twt_enable_params twt_params = {0};
3355
3356                 if (info->twt_requester || info->twt_responder) {
3357                         ath11k_wmi_fill_default_twt_params(&twt_params);
3358                         ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id,
3359                                                        &twt_params);
3360                 } else {
3361                         ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3362                 }
3363         }
3364
3365         if (changed & BSS_CHANGED_HE_OBSS_PD)
3366                 ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3367
3368         if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3369                 if (vif->type == NL80211_IFTYPE_AP) {
3370                         ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3371                                 ar, arvif->vdev_id, info->he_bss_color.color,
3372                                 ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3373                                 info->he_bss_color.enabled);
3374                         if (ret)
3375                                 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3376                                             arvif->vdev_id,  ret);
3377
3378                         param_id = WMI_VDEV_PARAM_BSS_COLOR;
3379                         if (info->he_bss_color.enabled)
3380                                 param_value = info->he_bss_color.color <<
3381                                                 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3382                         else
3383                                 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3384
3385                         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3386                                                             param_id,
3387                                                             param_value);
3388                         if (ret)
3389                                 ath11k_warn(ar->ab,
3390                                             "failed to set bss color param on vdev %i: %d\n",
3391                                             arvif->vdev_id,  ret);
3392
3393                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3394                                    "bss color param 0x%x set on vdev %i\n",
3395                                    param_value, arvif->vdev_id);
3396                 } else if (vif->type == NL80211_IFTYPE_STATION) {
3397                         ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3398                                                                           arvif->vdev_id,
3399                                                                           1);
3400                         if (ret)
3401                                 ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3402                                             arvif->vdev_id,  ret);
3403                         ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3404                                 ar, arvif->vdev_id, 0,
3405                                 ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3406                         if (ret)
3407                                 ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3408                                             arvif->vdev_id,  ret);
3409                 }
3410         }
3411
3412         if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3413             changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3414                 ath11k_mac_fils_discovery(arvif, info);
3415
3416         if (changed & BSS_CHANGED_ARP_FILTER) {
3417                 ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3418                 memcpy(arvif->arp_ns_offload.ipv4_addr,
3419                        vif->cfg.arp_addr_list,
3420                        ipv4_cnt * sizeof(u32));
3421                 memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3422                 arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3423
3424                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3425                            vif->cfg.arp_addr_cnt,
3426                            vif->addr, arvif->arp_ns_offload.ipv4_addr);
3427         }
3428
3429         mutex_unlock(&ar->conf_mutex);
3430 }
3431
3432 void __ath11k_mac_scan_finish(struct ath11k *ar)
3433 {
3434         lockdep_assert_held(&ar->data_lock);
3435
3436         switch (ar->scan.state) {
3437         case ATH11K_SCAN_IDLE:
3438                 break;
3439         case ATH11K_SCAN_RUNNING:
3440         case ATH11K_SCAN_ABORTING:
3441                 if (ar->scan.is_roc && ar->scan.roc_notify)
3442                         ieee80211_remain_on_channel_expired(ar->hw);
3443                 fallthrough;
3444         case ATH11K_SCAN_STARTING:
3445                 if (!ar->scan.is_roc) {
3446                         struct cfg80211_scan_info info = {
3447                                 .aborted = ((ar->scan.state ==
3448                                             ATH11K_SCAN_ABORTING) ||
3449                                             (ar->scan.state ==
3450                                             ATH11K_SCAN_STARTING)),
3451                         };
3452
3453                         ieee80211_scan_completed(ar->hw, &info);
3454                 }
3455
3456                 ar->scan.state = ATH11K_SCAN_IDLE;
3457                 ar->scan_channel = NULL;
3458                 ar->scan.roc_freq = 0;
3459                 cancel_delayed_work(&ar->scan.timeout);
3460                 complete_all(&ar->scan.completed);
3461                 break;
3462         }
3463 }
3464
3465 void ath11k_mac_scan_finish(struct ath11k *ar)
3466 {
3467         spin_lock_bh(&ar->data_lock);
3468         __ath11k_mac_scan_finish(ar);
3469         spin_unlock_bh(&ar->data_lock);
3470 }
3471
3472 static int ath11k_scan_stop(struct ath11k *ar)
3473 {
3474         struct scan_cancel_param arg = {
3475                 .req_type = WLAN_SCAN_CANCEL_SINGLE,
3476                 .scan_id = ATH11K_SCAN_ID,
3477         };
3478         int ret;
3479
3480         lockdep_assert_held(&ar->conf_mutex);
3481
3482         /* TODO: Fill other STOP Params */
3483         arg.pdev_id = ar->pdev->pdev_id;
3484
3485         ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3486         if (ret) {
3487                 ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3488                 goto out;
3489         }
3490
3491         ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3492         if (ret == 0) {
3493                 ath11k_warn(ar->ab,
3494                             "failed to receive scan abort comple: timed out\n");
3495                 ret = -ETIMEDOUT;
3496         } else if (ret > 0) {
3497                 ret = 0;
3498         }
3499
3500 out:
3501         /* Scan state should be updated upon scan completion but in case
3502          * firmware fails to deliver the event (for whatever reason) it is
3503          * desired to clean up scan state anyway. Firmware may have just
3504          * dropped the scan completion event delivery due to transport pipe
3505          * being overflown with data and/or it can recover on its own before
3506          * next scan request is submitted.
3507          */
3508         spin_lock_bh(&ar->data_lock);
3509         if (ar->scan.state != ATH11K_SCAN_IDLE)
3510                 __ath11k_mac_scan_finish(ar);
3511         spin_unlock_bh(&ar->data_lock);
3512
3513         return ret;
3514 }
3515
3516 static void ath11k_scan_abort(struct ath11k *ar)
3517 {
3518         int ret;
3519
3520         lockdep_assert_held(&ar->conf_mutex);
3521
3522         spin_lock_bh(&ar->data_lock);
3523
3524         switch (ar->scan.state) {
3525         case ATH11K_SCAN_IDLE:
3526                 /* This can happen if timeout worker kicked in and called
3527                  * abortion while scan completion was being processed.
3528                  */
3529                 break;
3530         case ATH11K_SCAN_STARTING:
3531         case ATH11K_SCAN_ABORTING:
3532                 ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3533                             ar->scan.state);
3534                 break;
3535         case ATH11K_SCAN_RUNNING:
3536                 ar->scan.state = ATH11K_SCAN_ABORTING;
3537                 spin_unlock_bh(&ar->data_lock);
3538
3539                 ret = ath11k_scan_stop(ar);
3540                 if (ret)
3541                         ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3542
3543                 spin_lock_bh(&ar->data_lock);
3544                 break;
3545         }
3546
3547         spin_unlock_bh(&ar->data_lock);
3548 }
3549
3550 static void ath11k_scan_timeout_work(struct work_struct *work)
3551 {
3552         struct ath11k *ar = container_of(work, struct ath11k,
3553                                          scan.timeout.work);
3554
3555         mutex_lock(&ar->conf_mutex);
3556         ath11k_scan_abort(ar);
3557         mutex_unlock(&ar->conf_mutex);
3558 }
3559
3560 static int ath11k_start_scan(struct ath11k *ar,
3561                              struct scan_req_params *arg)
3562 {
3563         int ret;
3564         unsigned long timeout = 1 * HZ;
3565
3566         lockdep_assert_held(&ar->conf_mutex);
3567
3568         if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3569                 ath11k_spectral_reset_buffer(ar);
3570
3571         ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3572         if (ret)
3573                 return ret;
3574
3575         if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3576                 timeout = 5 * HZ;
3577
3578                 if (ar->supports_6ghz)
3579                         timeout += 5 * HZ;
3580         }
3581
3582         ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3583         if (ret == 0) {
3584                 ret = ath11k_scan_stop(ar);
3585                 if (ret)
3586                         ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3587
3588                 return -ETIMEDOUT;
3589         }
3590
3591         /* If we failed to start the scan, return error code at
3592          * this point.  This is probably due to some issue in the
3593          * firmware, but no need to wedge the driver due to that...
3594          */
3595         spin_lock_bh(&ar->data_lock);
3596         if (ar->scan.state == ATH11K_SCAN_IDLE) {
3597                 spin_unlock_bh(&ar->data_lock);
3598                 return -EINVAL;
3599         }
3600         spin_unlock_bh(&ar->data_lock);
3601
3602         return 0;
3603 }
3604
3605 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3606                                  struct ieee80211_vif *vif,
3607                                  struct ieee80211_scan_request *hw_req)
3608 {
3609         struct ath11k *ar = hw->priv;
3610         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3611         struct cfg80211_scan_request *req = &hw_req->req;
3612         struct scan_req_params arg;
3613         int ret = 0;
3614         int i;
3615
3616         mutex_lock(&ar->conf_mutex);
3617
3618         spin_lock_bh(&ar->data_lock);
3619         switch (ar->scan.state) {
3620         case ATH11K_SCAN_IDLE:
3621                 reinit_completion(&ar->scan.started);
3622                 reinit_completion(&ar->scan.completed);
3623                 ar->scan.state = ATH11K_SCAN_STARTING;
3624                 ar->scan.is_roc = false;
3625                 ar->scan.vdev_id = arvif->vdev_id;
3626                 ret = 0;
3627                 break;
3628         case ATH11K_SCAN_STARTING:
3629         case ATH11K_SCAN_RUNNING:
3630         case ATH11K_SCAN_ABORTING:
3631                 ret = -EBUSY;
3632                 break;
3633         }
3634         spin_unlock_bh(&ar->data_lock);
3635
3636         if (ret)
3637                 goto exit;
3638
3639         memset(&arg, 0, sizeof(arg));
3640         ath11k_wmi_start_scan_init(ar, &arg);
3641         arg.vdev_id = arvif->vdev_id;
3642         arg.scan_id = ATH11K_SCAN_ID;
3643
3644         if (req->ie_len) {
3645                 arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3646                 if (!arg.extraie.ptr) {
3647                         ret = -ENOMEM;
3648                         goto exit;
3649                 }
3650                 arg.extraie.len = req->ie_len;
3651         }
3652
3653         if (req->n_ssids) {
3654                 arg.num_ssids = req->n_ssids;
3655                 for (i = 0; i < arg.num_ssids; i++) {
3656                         arg.ssid[i].length  = req->ssids[i].ssid_len;
3657                         memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid,
3658                                req->ssids[i].ssid_len);
3659                 }
3660         } else {
3661                 arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
3662         }
3663
3664         if (req->n_channels) {
3665                 arg.num_chan = req->n_channels;
3666                 arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3667                                         GFP_KERNEL);
3668
3669                 if (!arg.chan_list) {
3670                         ret = -ENOMEM;
3671                         goto exit;
3672                 }
3673
3674                 for (i = 0; i < arg.num_chan; i++)
3675                         arg.chan_list[i] = req->channels[i]->center_freq;
3676         }
3677
3678         if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
3679                 arg.scan_f_add_spoofed_mac_in_probe = 1;
3680                 ether_addr_copy(arg.mac_addr.addr, req->mac_addr);
3681                 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
3682         }
3683
3684         ret = ath11k_start_scan(ar, &arg);
3685         if (ret) {
3686                 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3687                 spin_lock_bh(&ar->data_lock);
3688                 ar->scan.state = ATH11K_SCAN_IDLE;
3689                 spin_unlock_bh(&ar->data_lock);
3690         }
3691
3692         /* Add a 200ms margin to account for event/command processing */
3693         ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
3694                                      msecs_to_jiffies(arg.max_scan_time +
3695                                                       ATH11K_MAC_SCAN_TIMEOUT_MSECS));
3696
3697 exit:
3698         kfree(arg.chan_list);
3699
3700         if (req->ie_len)
3701                 kfree(arg.extraie.ptr);
3702
3703         mutex_unlock(&ar->conf_mutex);
3704
3705         if (ar->state_11d == ATH11K_11D_PREPARING)
3706                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3707
3708         return ret;
3709 }
3710
3711 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3712                                          struct ieee80211_vif *vif)
3713 {
3714         struct ath11k *ar = hw->priv;
3715
3716         mutex_lock(&ar->conf_mutex);
3717         ath11k_scan_abort(ar);
3718         mutex_unlock(&ar->conf_mutex);
3719
3720         cancel_delayed_work_sync(&ar->scan.timeout);
3721 }
3722
3723 static int ath11k_install_key(struct ath11k_vif *arvif,
3724                               struct ieee80211_key_conf *key,
3725                               enum set_key_cmd cmd,
3726                               const u8 *macaddr, u32 flags)
3727 {
3728         int ret;
3729         struct ath11k *ar = arvif->ar;
3730         struct wmi_vdev_install_key_arg arg = {
3731                 .vdev_id = arvif->vdev_id,
3732                 .key_idx = key->keyidx,
3733                 .key_len = key->keylen,
3734                 .key_data = key->key,
3735                 .key_flags = flags,
3736                 .macaddr = macaddr,
3737         };
3738
3739         lockdep_assert_held(&arvif->ar->conf_mutex);
3740
3741         reinit_completion(&ar->install_key_done);
3742
3743         if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3744                 return 0;
3745
3746         if (cmd == DISABLE_KEY) {
3747                 arg.key_cipher = WMI_CIPHER_NONE;
3748                 arg.key_data = NULL;
3749                 goto install;
3750         }
3751
3752         switch (key->cipher) {
3753         case WLAN_CIPHER_SUITE_CCMP:
3754                 arg.key_cipher = WMI_CIPHER_AES_CCM;
3755                 /* TODO: Re-check if flag is valid */
3756                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3757                 break;
3758         case WLAN_CIPHER_SUITE_TKIP:
3759                 arg.key_cipher = WMI_CIPHER_TKIP;
3760                 arg.key_txmic_len = 8;
3761                 arg.key_rxmic_len = 8;
3762                 break;
3763         case WLAN_CIPHER_SUITE_CCMP_256:
3764                 arg.key_cipher = WMI_CIPHER_AES_CCM;
3765                 break;
3766         case WLAN_CIPHER_SUITE_GCMP:
3767         case WLAN_CIPHER_SUITE_GCMP_256:
3768                 arg.key_cipher = WMI_CIPHER_AES_GCM;
3769                 break;
3770         default:
3771                 ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3772                 return -EOPNOTSUPP;
3773         }
3774
3775         if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3776                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3777                               IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3778
3779 install:
3780         ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
3781
3782         if (ret)
3783                 return ret;
3784
3785         if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3786                 return -ETIMEDOUT;
3787
3788         return ar->install_key_status ? -EINVAL : 0;
3789 }
3790
3791 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
3792                                   const u8 *addr)
3793 {
3794         struct ath11k *ar = arvif->ar;
3795         struct ath11k_base *ab = ar->ab;
3796         struct ath11k_peer *peer;
3797         int first_errno = 0;
3798         int ret;
3799         int i;
3800         u32 flags = 0;
3801
3802         lockdep_assert_held(&ar->conf_mutex);
3803
3804         spin_lock_bh(&ab->base_lock);
3805         peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
3806         spin_unlock_bh(&ab->base_lock);
3807
3808         if (!peer)
3809                 return -ENOENT;
3810
3811         for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3812                 if (!peer->keys[i])
3813                         continue;
3814
3815                 /* key flags are not required to delete the key */
3816                 ret = ath11k_install_key(arvif, peer->keys[i],
3817                                          DISABLE_KEY, addr, flags);
3818                 if (ret < 0 && first_errno == 0)
3819                         first_errno = ret;
3820
3821                 if (ret < 0)
3822                         ath11k_warn(ab, "failed to remove peer key %d: %d\n",
3823                                     i, ret);
3824
3825                 spin_lock_bh(&ab->base_lock);
3826                 peer->keys[i] = NULL;
3827                 spin_unlock_bh(&ab->base_lock);
3828         }
3829
3830         return first_errno;
3831 }
3832
3833 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3834                                  struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3835                                  struct ieee80211_key_conf *key)
3836 {
3837         struct ath11k *ar = hw->priv;
3838         struct ath11k_base *ab = ar->ab;
3839         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3840         struct ath11k_peer *peer;
3841         struct ath11k_sta *arsta;
3842         const u8 *peer_addr;
3843         int ret = 0;
3844         u32 flags = 0;
3845
3846         /* BIP needs to be done in software */
3847         if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3848             key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3849             key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3850             key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3851                 return 1;
3852
3853         if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3854                 return 1;
3855
3856         if (key->keyidx > WMI_MAX_KEY_INDEX)
3857                 return -ENOSPC;
3858
3859         mutex_lock(&ar->conf_mutex);
3860
3861         if (sta)
3862                 peer_addr = sta->addr;
3863         else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3864                 peer_addr = vif->bss_conf.bssid;
3865         else
3866                 peer_addr = vif->addr;
3867
3868         key->hw_key_idx = key->keyidx;
3869
3870         /* the peer should not disappear in mid-way (unless FW goes awry) since
3871          * we already hold conf_mutex. we just make sure its there now.
3872          */
3873         spin_lock_bh(&ab->base_lock);
3874         peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3875
3876         /* flush the fragments cache during key (re)install to
3877          * ensure all frags in the new frag list belong to the same key.
3878          */
3879         if (peer && sta && cmd == SET_KEY)
3880                 ath11k_peer_frags_flush(ar, peer);
3881         spin_unlock_bh(&ab->base_lock);
3882
3883         if (!peer) {
3884                 if (cmd == SET_KEY) {
3885                         ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
3886                                     peer_addr);
3887                         ret = -EOPNOTSUPP;
3888                         goto exit;
3889                 } else {
3890                         /* if the peer doesn't exist there is no key to disable
3891                          * anymore
3892                          */
3893                         goto exit;
3894                 }
3895         }
3896
3897         if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3898                 flags |= WMI_KEY_PAIRWISE;
3899         else
3900                 flags |= WMI_KEY_GROUP;
3901
3902         ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
3903         if (ret) {
3904                 ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
3905                 goto exit;
3906         }
3907
3908         ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
3909         if (ret) {
3910                 ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3911                 goto exit;
3912         }
3913
3914         spin_lock_bh(&ab->base_lock);
3915         peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
3916         if (peer && cmd == SET_KEY) {
3917                 peer->keys[key->keyidx] = key;
3918                 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3919                         peer->ucast_keyidx = key->keyidx;
3920                         peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
3921                 } else {
3922                         peer->mcast_keyidx = key->keyidx;
3923                         peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
3924                 }
3925         } else if (peer && cmd == DISABLE_KEY) {
3926                 peer->keys[key->keyidx] = NULL;
3927                 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3928                         peer->ucast_keyidx = 0;
3929                 else
3930                         peer->mcast_keyidx = 0;
3931         } else if (!peer)
3932                 /* impossible unless FW goes crazy */
3933                 ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3934
3935         if (sta) {
3936                 arsta = (struct ath11k_sta *)sta->drv_priv;
3937
3938                 switch (key->cipher) {
3939                 case WLAN_CIPHER_SUITE_TKIP:
3940                 case WLAN_CIPHER_SUITE_CCMP:
3941                 case WLAN_CIPHER_SUITE_CCMP_256:
3942                 case WLAN_CIPHER_SUITE_GCMP:
3943                 case WLAN_CIPHER_SUITE_GCMP_256:
3944                         if (cmd == SET_KEY)
3945                                 arsta->pn_type = HAL_PN_TYPE_WPA;
3946                         else
3947                                 arsta->pn_type = HAL_PN_TYPE_NONE;
3948                         break;
3949                 default:
3950                         arsta->pn_type = HAL_PN_TYPE_NONE;
3951                         break;
3952                 }
3953         }
3954
3955         spin_unlock_bh(&ab->base_lock);
3956
3957 exit:
3958         mutex_unlock(&ar->conf_mutex);
3959         return ret;
3960 }
3961
3962 static int
3963 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
3964                                       enum nl80211_band band,
3965                                       const struct cfg80211_bitrate_mask *mask)
3966 {
3967         int num_rates = 0;
3968         int i;
3969
3970         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3971                 num_rates += hweight16(mask->control[band].vht_mcs[i]);
3972
3973         return num_rates;
3974 }
3975
3976 static int
3977 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
3978                                      enum nl80211_band band,
3979                                      const struct cfg80211_bitrate_mask *mask)
3980 {
3981         int num_rates = 0;
3982         int i;
3983
3984         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
3985                 num_rates += hweight16(mask->control[band].he_mcs[i]);
3986
3987         return num_rates;
3988 }
3989
3990 static int
3991 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
3992                                    struct ieee80211_sta *sta,
3993                                    const struct cfg80211_bitrate_mask *mask,
3994                                    enum nl80211_band band)
3995 {
3996         struct ath11k *ar = arvif->ar;
3997         u8 vht_rate, nss;
3998         u32 rate_code;
3999         int ret, i;
4000
4001         lockdep_assert_held(&ar->conf_mutex);
4002
4003         nss = 0;
4004
4005         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
4006                 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4007                         nss = i + 1;
4008                         vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4009                 }
4010         }
4011
4012         if (!nss) {
4013                 ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4014                             sta->addr);
4015                 return -EINVAL;
4016         }
4017
4018         /* Avoid updating invalid nss as fixed rate*/
4019         if (nss > sta->deflink.rx_nss)
4020                 return -EINVAL;
4021
4022         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4023                    "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4024                    sta->addr);
4025
4026         rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4027                                         WMI_RATE_PREAMBLE_VHT);
4028         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4029                                         arvif->vdev_id,
4030                                         WMI_PEER_PARAM_FIXED_RATE,
4031                                         rate_code);
4032         if (ret)
4033                 ath11k_warn(ar->ab,
4034                             "failed to update STA %pM Fixed Rate %d: %d\n",
4035                              sta->addr, rate_code, ret);
4036
4037         return ret;
4038 }
4039
4040 static int
4041 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4042                                   struct ieee80211_sta *sta,
4043                                   const struct cfg80211_bitrate_mask *mask,
4044                                   enum nl80211_band band)
4045 {
4046         struct ath11k *ar = arvif->ar;
4047         u8 he_rate, nss;
4048         u32 rate_code;
4049         int ret, i;
4050
4051         lockdep_assert_held(&ar->conf_mutex);
4052
4053         nss = 0;
4054
4055         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4056                 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4057                         nss = i + 1;
4058                         he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4059                 }
4060         }
4061
4062         if (!nss) {
4063                 ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4064                             sta->addr);
4065                 return -EINVAL;
4066         }
4067
4068         /* Avoid updating invalid nss as fixed rate */
4069         if (nss > sta->deflink.rx_nss)
4070                 return -EINVAL;
4071
4072         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4073                    "mac setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4074                    sta->addr);
4075
4076         rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4077                                         WMI_RATE_PREAMBLE_HE);
4078
4079         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4080                                         arvif->vdev_id,
4081                                         WMI_PEER_PARAM_FIXED_RATE,
4082                                         rate_code);
4083         if (ret)
4084                 ath11k_warn(ar->ab,
4085                             "failed to update sta %pM fixed rate %d: %d\n",
4086                             sta->addr, rate_code, ret);
4087
4088         return ret;
4089 }
4090
4091 static int ath11k_station_assoc(struct ath11k *ar,
4092                                 struct ieee80211_vif *vif,
4093                                 struct ieee80211_sta *sta,
4094                                 bool reassoc)
4095 {
4096         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4097         struct peer_assoc_params peer_arg;
4098         int ret = 0;
4099         struct cfg80211_chan_def def;
4100         enum nl80211_band band;
4101         struct cfg80211_bitrate_mask *mask;
4102         u8 num_vht_rates, num_he_rates;
4103
4104         lockdep_assert_held(&ar->conf_mutex);
4105
4106         if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4107                 return -EPERM;
4108
4109         band = def.chan->band;
4110         mask = &arvif->bitrate_mask;
4111
4112         ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4113
4114         peer_arg.is_assoc = true;
4115         ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4116         if (ret) {
4117                 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4118                             sta->addr, arvif->vdev_id, ret);
4119                 return ret;
4120         }
4121
4122         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4123                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4124                             sta->addr, arvif->vdev_id);
4125                 return -ETIMEDOUT;
4126         }
4127
4128         num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4129         num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4130
4131         /* If single VHT/HE rate is configured (by set_bitrate_mask()),
4132          * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4133          * fixed param.
4134          * Note that all other rates and NSS will be disabled for this peer.
4135          */
4136         if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4137                 ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4138                                                          band);
4139                 if (ret)
4140                         return ret;
4141         } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4142                 ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4143                                                         band);
4144                 if (ret)
4145                         return ret;
4146         }
4147
4148         /* Re-assoc is run only to update supported rates for given station. It
4149          * doesn't make much sense to reconfigure the peer completely.
4150          */
4151         if (reassoc)
4152                 return 0;
4153
4154         ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4155                                      &sta->deflink.ht_cap,
4156                                      le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4157         if (ret) {
4158                 ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4159                             arvif->vdev_id, ret);
4160                 return ret;
4161         }
4162
4163         if (!sta->wme) {
4164                 arvif->num_legacy_stations++;
4165                 ret = ath11k_recalc_rtscts_prot(arvif);
4166                 if (ret)
4167                         return ret;
4168         }
4169
4170         if (sta->wme && sta->uapsd_queues) {
4171                 ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4172                 if (ret) {
4173                         ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4174                                     sta->addr, arvif->vdev_id, ret);
4175                         return ret;
4176                 }
4177         }
4178
4179         return 0;
4180 }
4181
4182 static int ath11k_station_disassoc(struct ath11k *ar,
4183                                    struct ieee80211_vif *vif,
4184                                    struct ieee80211_sta *sta)
4185 {
4186         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4187         int ret = 0;
4188
4189         lockdep_assert_held(&ar->conf_mutex);
4190
4191         if (!sta->wme) {
4192                 arvif->num_legacy_stations--;
4193                 ret = ath11k_recalc_rtscts_prot(arvif);
4194                 if (ret)
4195                         return ret;
4196         }
4197
4198         ret = ath11k_clear_peer_keys(arvif, sta->addr);
4199         if (ret) {
4200                 ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4201                             arvif->vdev_id, ret);
4202                 return ret;
4203         }
4204         return 0;
4205 }
4206
4207 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4208 {
4209         struct ath11k *ar;
4210         struct ath11k_vif *arvif;
4211         struct ath11k_sta *arsta;
4212         struct ieee80211_sta *sta;
4213         struct cfg80211_chan_def def;
4214         enum nl80211_band band;
4215         const u8 *ht_mcs_mask;
4216         const u16 *vht_mcs_mask;
4217         const u16 *he_mcs_mask;
4218         u32 changed, bw, nss, smps;
4219         int err, num_vht_rates, num_he_rates;
4220         const struct cfg80211_bitrate_mask *mask;
4221         struct peer_assoc_params peer_arg;
4222
4223         arsta = container_of(wk, struct ath11k_sta, update_wk);
4224         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4225         arvif = arsta->arvif;
4226         ar = arvif->ar;
4227
4228         if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4229                 return;
4230
4231         band = def.chan->band;
4232         ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4233         vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4234         he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4235
4236         spin_lock_bh(&ar->data_lock);
4237
4238         changed = arsta->changed;
4239         arsta->changed = 0;
4240
4241         bw = arsta->bw;
4242         nss = arsta->nss;
4243         smps = arsta->smps;
4244
4245         spin_unlock_bh(&ar->data_lock);
4246
4247         mutex_lock(&ar->conf_mutex);
4248
4249         nss = max_t(u32, 1, nss);
4250         nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
4251                                ath11k_mac_max_vht_nss(vht_mcs_mask)),
4252                            ath11k_mac_max_he_nss(he_mcs_mask)));
4253
4254         if (changed & IEEE80211_RC_BW_CHANGED) {
4255                 /* Send peer assoc command before set peer bandwidth param to
4256                  * avoid the mismatch between the peer phymode and the peer
4257                  * bandwidth.
4258                  */
4259                 ath11k_peer_assoc_prepare(ar, arvif->vif, sta, &peer_arg, true);
4260
4261                 peer_arg.is_assoc = false;
4262                 err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4263                 if (err) {
4264                         ath11k_warn(ar->ab, "failed to send peer assoc for STA %pM vdev %i: %d\n",
4265                                     sta->addr, arvif->vdev_id, err);
4266                 } else if (wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4267                         err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4268                                                         WMI_PEER_CHWIDTH, bw);
4269                         if (err)
4270                                 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4271                                             sta->addr, bw, err);
4272                 } else {
4273                         ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4274                                     sta->addr, arvif->vdev_id);
4275                 }
4276         }
4277
4278         if (changed & IEEE80211_RC_NSS_CHANGED) {
4279                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n",
4280                            sta->addr, nss);
4281
4282                 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4283                                                 WMI_PEER_NSS, nss);
4284                 if (err)
4285                         ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4286                                     sta->addr, nss, err);
4287         }
4288
4289         if (changed & IEEE80211_RC_SMPS_CHANGED) {
4290                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n",
4291                            sta->addr, smps);
4292
4293                 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4294                                                 WMI_PEER_MIMO_PS_STATE, smps);
4295                 if (err)
4296                         ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4297                                     sta->addr, smps, err);
4298         }
4299
4300         if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4301                 mask = &arvif->bitrate_mask;
4302                 num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4303                                                                       mask);
4304                 num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4305                                                                     mask);
4306
4307                 /* Peer_assoc_prepare will reject vht rates in
4308                  * bitrate_mask if its not available in range format and
4309                  * sets vht tx_rateset as unsupported. So multiple VHT MCS
4310                  * setting(eg. MCS 4,5,6) per peer is not supported here.
4311                  * But, Single rate in VHT mask can be set as per-peer
4312                  * fixed rate. But even if any HT rates are configured in
4313                  * the bitrate mask, device will not switch to those rates
4314                  * when per-peer Fixed rate is set.
4315                  * TODO: Check RATEMASK_CMDID to support auto rates selection
4316                  * across HT/VHT and for multiple VHT MCS support.
4317                  */
4318                 if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4319                         ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4320                                                            band);
4321                 } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4322                         ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4323                                                           band);
4324                 } else {
4325                         /* If the peer is non-VHT/HE or no fixed VHT/HE rate
4326                          * is provided in the new bitrate mask we set the
4327                          * other rates using peer_assoc command. Also clear
4328                          * the peer fixed rate settings as it has higher proprity
4329                          * than peer assoc
4330                          */
4331                         err = ath11k_wmi_set_peer_param(ar, sta->addr,
4332                                                         arvif->vdev_id,
4333                                                         WMI_PEER_PARAM_FIXED_RATE,
4334                                                         WMI_FIXED_RATE_NONE);
4335                         if (err)
4336                                 ath11k_warn(ar->ab,
4337                                             "failed to disable peer fixed rate for sta %pM: %d\n",
4338                                             sta->addr, err);
4339
4340                         ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4341                                                   &peer_arg, true);
4342
4343                         peer_arg.is_assoc = false;
4344                         err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4345                         if (err)
4346                                 ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4347                                             sta->addr, arvif->vdev_id, err);
4348
4349                         if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4350                                 ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4351                                             sta->addr, arvif->vdev_id);
4352                 }
4353         }
4354
4355         mutex_unlock(&ar->conf_mutex);
4356 }
4357
4358 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4359 {
4360         struct ath11k *ar;
4361         struct ath11k_vif *arvif;
4362         struct ath11k_sta *arsta;
4363         struct ieee80211_sta *sta;
4364         int ret = 0;
4365
4366         arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4367         sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4368         arvif = arsta->arvif;
4369         ar = arvif->ar;
4370
4371         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4372                    "setting USE_4ADDR for peer %pM\n", sta->addr);
4373
4374         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4375                                         arvif->vdev_id,
4376                                         WMI_PEER_USE_4ADDR, 1);
4377
4378         if (ret)
4379                 ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4380                             sta->addr, ret);
4381 }
4382
4383 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4384                                        struct ieee80211_sta *sta)
4385 {
4386         struct ath11k *ar = arvif->ar;
4387
4388         lockdep_assert_held(&ar->conf_mutex);
4389
4390         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4391                 return 0;
4392
4393         if (ar->num_stations >= ar->max_num_stations)
4394                 return -ENOBUFS;
4395
4396         ar->num_stations++;
4397
4398         return 0;
4399 }
4400
4401 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4402                                         struct ieee80211_sta *sta)
4403 {
4404         struct ath11k *ar = arvif->ar;
4405
4406         lockdep_assert_held(&ar->conf_mutex);
4407
4408         if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4409                 return;
4410
4411         ar->num_stations--;
4412 }
4413
4414 static int ath11k_mac_station_add(struct ath11k *ar,
4415                                   struct ieee80211_vif *vif,
4416                                   struct ieee80211_sta *sta)
4417 {
4418         struct ath11k_base *ab = ar->ab;
4419         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4420         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4421         struct peer_create_params peer_param;
4422         int ret;
4423
4424         lockdep_assert_held(&ar->conf_mutex);
4425
4426         ret = ath11k_mac_inc_num_stations(arvif, sta);
4427         if (ret) {
4428                 ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
4429                             ar->max_num_stations);
4430                 goto exit;
4431         }
4432
4433         arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
4434         if (!arsta->rx_stats) {
4435                 ret = -ENOMEM;
4436                 goto dec_num_station;
4437         }
4438
4439         peer_param.vdev_id = arvif->vdev_id;
4440         peer_param.peer_addr = sta->addr;
4441         peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4442
4443         ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
4444         if (ret) {
4445                 ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
4446                             sta->addr, arvif->vdev_id);
4447                 goto free_rx_stats;
4448         }
4449
4450         ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
4451                    sta->addr, arvif->vdev_id);
4452
4453         if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
4454                 arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
4455                 if (!arsta->tx_stats) {
4456                         ret = -ENOMEM;
4457                         goto free_peer;
4458                 }
4459         }
4460
4461         if (ieee80211_vif_is_mesh(vif)) {
4462                 ath11k_dbg(ab, ATH11K_DBG_MAC,
4463                            "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
4464                 ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4465                                                 arvif->vdev_id,
4466                                                 WMI_PEER_USE_4ADDR, 1);
4467                 if (ret) {
4468                         ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
4469                                     sta->addr, ret);
4470                         goto free_tx_stats;
4471                 }
4472         }
4473
4474         ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
4475         if (ret) {
4476                 ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
4477                             sta->addr, arvif->vdev_id, ret);
4478                 goto free_tx_stats;
4479         }
4480
4481         if (ab->hw_params.vdev_start_delay &&
4482             !arvif->is_started &&
4483             arvif->vdev_type != WMI_VDEV_TYPE_AP) {
4484                 ret = ath11k_start_vdev_delay(ar->hw, vif);
4485                 if (ret) {
4486                         ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
4487                         goto free_tx_stats;
4488                 }
4489         }
4490
4491         ewma_avg_rssi_init(&arsta->avg_rssi);
4492         return 0;
4493
4494 free_tx_stats:
4495         kfree(arsta->tx_stats);
4496         arsta->tx_stats = NULL;
4497 free_peer:
4498         ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4499 free_rx_stats:
4500         kfree(arsta->rx_stats);
4501         arsta->rx_stats = NULL;
4502 dec_num_station:
4503         ath11k_mac_dec_num_stations(arvif, sta);
4504 exit:
4505         return ret;
4506 }
4507
4508 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
4509                                    struct ieee80211_vif *vif,
4510                                    struct ieee80211_sta *sta,
4511                                    enum ieee80211_sta_state old_state,
4512                                    enum ieee80211_sta_state new_state)
4513 {
4514         struct ath11k *ar = hw->priv;
4515         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4516         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4517         struct ath11k_peer *peer;
4518         int ret = 0;
4519
4520         /* cancel must be done outside the mutex to avoid deadlock */
4521         if ((old_state == IEEE80211_STA_NONE &&
4522              new_state == IEEE80211_STA_NOTEXIST)) {
4523                 cancel_work_sync(&arsta->update_wk);
4524                 cancel_work_sync(&arsta->set_4addr_wk);
4525         }
4526
4527         mutex_lock(&ar->conf_mutex);
4528
4529         if (old_state == IEEE80211_STA_NOTEXIST &&
4530             new_state == IEEE80211_STA_NONE) {
4531                 memset(arsta, 0, sizeof(*arsta));
4532                 arsta->arvif = arvif;
4533                 arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
4534                 INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
4535                 INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
4536
4537                 ret = ath11k_mac_station_add(ar, vif, sta);
4538                 if (ret)
4539                         ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
4540                                     sta->addr, arvif->vdev_id);
4541         } else if ((old_state == IEEE80211_STA_NONE &&
4542                     new_state == IEEE80211_STA_NOTEXIST)) {
4543                 bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay &&
4544                         vif->type == NL80211_IFTYPE_STATION;
4545
4546                 ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4547
4548                 if (!skip_peer_delete) {
4549                         ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4550                         if (ret)
4551                                 ath11k_warn(ar->ab,
4552                                             "Failed to delete peer: %pM for VDEV: %d\n",
4553                                             sta->addr, arvif->vdev_id);
4554                         else
4555                                 ath11k_dbg(ar->ab,
4556                                            ATH11K_DBG_MAC,
4557                                            "Removed peer: %pM for VDEV: %d\n",
4558                                            sta->addr, arvif->vdev_id);
4559                 }
4560
4561                 ath11k_mac_dec_num_stations(arvif, sta);
4562                 mutex_lock(&ar->ab->tbl_mtx_lock);
4563                 spin_lock_bh(&ar->ab->base_lock);
4564                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4565                 if (skip_peer_delete && peer) {
4566                         peer->sta = NULL;
4567                 } else if (peer && peer->sta == sta) {
4568                         ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4569                                     vif->addr, arvif->vdev_id);
4570                         ath11k_peer_rhash_delete(ar->ab, peer);
4571                         peer->sta = NULL;
4572                         list_del(&peer->list);
4573                         kfree(peer);
4574                         ar->num_peers--;
4575                 }
4576                 spin_unlock_bh(&ar->ab->base_lock);
4577                 mutex_unlock(&ar->ab->tbl_mtx_lock);
4578
4579                 kfree(arsta->tx_stats);
4580                 arsta->tx_stats = NULL;
4581
4582                 kfree(arsta->rx_stats);
4583                 arsta->rx_stats = NULL;
4584         } else if (old_state == IEEE80211_STA_AUTH &&
4585                    new_state == IEEE80211_STA_ASSOC &&
4586                    (vif->type == NL80211_IFTYPE_AP ||
4587                     vif->type == NL80211_IFTYPE_MESH_POINT ||
4588                     vif->type == NL80211_IFTYPE_ADHOC)) {
4589                 ret = ath11k_station_assoc(ar, vif, sta, false);
4590                 if (ret)
4591                         ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
4592                                     sta->addr);
4593         } else if (old_state == IEEE80211_STA_ASSOC &&
4594                    new_state == IEEE80211_STA_AUTHORIZED) {
4595                 spin_lock_bh(&ar->ab->base_lock);
4596
4597                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4598                 if (peer)
4599                         peer->is_authorized = true;
4600
4601                 spin_unlock_bh(&ar->ab->base_lock);
4602
4603                 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4604                         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4605                                                         arvif->vdev_id,
4606                                                         WMI_PEER_AUTHORIZE,
4607                                                         1);
4608                         if (ret)
4609                                 ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4610                                             sta->addr, arvif->vdev_id, ret);
4611                 }
4612         } else if (old_state == IEEE80211_STA_AUTHORIZED &&
4613                    new_state == IEEE80211_STA_ASSOC) {
4614                 spin_lock_bh(&ar->ab->base_lock);
4615
4616                 peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4617                 if (peer)
4618                         peer->is_authorized = false;
4619
4620                 spin_unlock_bh(&ar->ab->base_lock);
4621         } else if (old_state == IEEE80211_STA_ASSOC &&
4622                    new_state == IEEE80211_STA_AUTH &&
4623                    (vif->type == NL80211_IFTYPE_AP ||
4624                     vif->type == NL80211_IFTYPE_MESH_POINT ||
4625                     vif->type == NL80211_IFTYPE_ADHOC)) {
4626                 ret = ath11k_station_disassoc(ar, vif, sta);
4627                 if (ret)
4628                         ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4629                                     sta->addr);
4630         }
4631
4632         mutex_unlock(&ar->conf_mutex);
4633         return ret;
4634 }
4635
4636 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4637                                        struct ieee80211_vif *vif,
4638                                        struct ieee80211_sta *sta)
4639 {
4640         struct ath11k *ar = hw->priv;
4641         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4642         int ret = 0;
4643         s16 txpwr;
4644
4645         if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4646                 txpwr = 0;
4647         } else {
4648                 txpwr = sta->deflink.txpwr.power;
4649                 if (!txpwr)
4650                         return -EINVAL;
4651         }
4652
4653         if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
4654                 return -EINVAL;
4655
4656         mutex_lock(&ar->conf_mutex);
4657
4658         ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4659                                         WMI_PEER_USE_FIXED_PWR, txpwr);
4660         if (ret) {
4661                 ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4662                             ret);
4663                 goto out;
4664         }
4665
4666 out:
4667         mutex_unlock(&ar->conf_mutex);
4668         return ret;
4669 }
4670
4671 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
4672                                         struct ieee80211_vif *vif,
4673                                         struct ieee80211_sta *sta, bool enabled)
4674 {
4675         struct ath11k *ar = hw->priv;
4676         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4677
4678         if (enabled && !arsta->use_4addr_set) {
4679                 ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
4680                 arsta->use_4addr_set = true;
4681         }
4682 }
4683
4684 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4685                                         struct ieee80211_vif *vif,
4686                                         struct ieee80211_sta *sta,
4687                                         u32 changed)
4688 {
4689         struct ath11k *ar = hw->priv;
4690         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
4691         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4692         struct ath11k_peer *peer;
4693         u32 bw, smps;
4694
4695         spin_lock_bh(&ar->ab->base_lock);
4696
4697         peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4698         if (!peer) {
4699                 spin_unlock_bh(&ar->ab->base_lock);
4700                 ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4701                             sta->addr, arvif->vdev_id);
4702                 return;
4703         }
4704
4705         spin_unlock_bh(&ar->ab->base_lock);
4706
4707         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4708                    "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4709                    sta->addr, changed, sta->deflink.bandwidth,
4710                    sta->deflink.rx_nss,
4711                    sta->deflink.smps_mode);
4712
4713         spin_lock_bh(&ar->data_lock);
4714
4715         if (changed & IEEE80211_RC_BW_CHANGED) {
4716                 bw = WMI_PEER_CHWIDTH_20MHZ;
4717
4718                 switch (sta->deflink.bandwidth) {
4719                 case IEEE80211_STA_RX_BW_20:
4720                         bw = WMI_PEER_CHWIDTH_20MHZ;
4721                         break;
4722                 case IEEE80211_STA_RX_BW_40:
4723                         bw = WMI_PEER_CHWIDTH_40MHZ;
4724                         break;
4725                 case IEEE80211_STA_RX_BW_80:
4726                         bw = WMI_PEER_CHWIDTH_80MHZ;
4727                         break;
4728                 case IEEE80211_STA_RX_BW_160:
4729                         bw = WMI_PEER_CHWIDTH_160MHZ;
4730                         break;
4731                 default:
4732                         ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
4733                                     sta->deflink.bandwidth, sta->addr);
4734                         bw = WMI_PEER_CHWIDTH_20MHZ;
4735                         break;
4736                 }
4737
4738                 arsta->bw = bw;
4739         }
4740
4741         if (changed & IEEE80211_RC_NSS_CHANGED)
4742                 arsta->nss = sta->deflink.rx_nss;
4743
4744         if (changed & IEEE80211_RC_SMPS_CHANGED) {
4745                 smps = WMI_PEER_SMPS_PS_NONE;
4746
4747                 switch (sta->deflink.smps_mode) {
4748                 case IEEE80211_SMPS_AUTOMATIC:
4749                 case IEEE80211_SMPS_OFF:
4750                         smps = WMI_PEER_SMPS_PS_NONE;
4751                         break;
4752                 case IEEE80211_SMPS_STATIC:
4753                         smps = WMI_PEER_SMPS_STATIC;
4754                         break;
4755                 case IEEE80211_SMPS_DYNAMIC:
4756                         smps = WMI_PEER_SMPS_DYNAMIC;
4757                         break;
4758                 default:
4759                         ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4760                                     sta->deflink.smps_mode, sta->addr);
4761                         smps = WMI_PEER_SMPS_PS_NONE;
4762                         break;
4763                 }
4764
4765                 arsta->smps = smps;
4766         }
4767
4768         arsta->changed |= changed;
4769
4770         spin_unlock_bh(&ar->data_lock);
4771
4772         ieee80211_queue_work(hw, &arsta->update_wk);
4773 }
4774
4775 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
4776                                 u16 ac, bool enable)
4777 {
4778         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4779         u32 value = 0;
4780         int ret = 0;
4781
4782         if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4783                 return 0;
4784
4785         switch (ac) {
4786         case IEEE80211_AC_VO:
4787                 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4788                         WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4789                 break;
4790         case IEEE80211_AC_VI:
4791                 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4792                         WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4793                 break;
4794         case IEEE80211_AC_BE:
4795                 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4796                         WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4797                 break;
4798         case IEEE80211_AC_BK:
4799                 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4800                         WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4801                 break;
4802         }
4803
4804         if (enable)
4805                 arvif->u.sta.uapsd |= value;
4806         else
4807                 arvif->u.sta.uapsd &= ~value;
4808
4809         ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4810                                           WMI_STA_PS_PARAM_UAPSD,
4811                                           arvif->u.sta.uapsd);
4812         if (ret) {
4813                 ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4814                 goto exit;
4815         }
4816
4817         if (arvif->u.sta.uapsd)
4818                 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4819         else
4820                 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4821
4822         ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4823                                           WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4824                                           value);
4825         if (ret)
4826                 ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4827
4828 exit:
4829         return ret;
4830 }
4831
4832 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
4833                                  struct ieee80211_vif *vif,
4834                                  unsigned int link_id, u16 ac,
4835                                  const struct ieee80211_tx_queue_params *params)
4836 {
4837         struct ath11k *ar = hw->priv;
4838         struct ath11k_vif *arvif = (void *)vif->drv_priv;
4839         struct wmi_wmm_params_arg *p = NULL;
4840         int ret;
4841
4842         mutex_lock(&ar->conf_mutex);
4843
4844         switch (ac) {
4845         case IEEE80211_AC_VO:
4846                 p = &arvif->wmm_params.ac_vo;
4847                 break;
4848         case IEEE80211_AC_VI:
4849                 p = &arvif->wmm_params.ac_vi;
4850                 break;
4851         case IEEE80211_AC_BE:
4852                 p = &arvif->wmm_params.ac_be;
4853                 break;
4854         case IEEE80211_AC_BK:
4855                 p = &arvif->wmm_params.ac_bk;
4856                 break;
4857         }
4858
4859         if (WARN_ON(!p)) {
4860                 ret = -EINVAL;
4861                 goto exit;
4862         }
4863
4864         p->cwmin = params->cw_min;
4865         p->cwmax = params->cw_max;
4866         p->aifs = params->aifs;
4867         p->txop = params->txop;
4868
4869         ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
4870                                                  &arvif->wmm_params);
4871         if (ret) {
4872                 ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
4873                 goto exit;
4874         }
4875
4876         ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
4877
4878         if (ret)
4879                 ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
4880
4881 exit:
4882         mutex_unlock(&ar->conf_mutex);
4883         return ret;
4884 }
4885
4886 static struct ieee80211_sta_ht_cap
4887 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4888 {
4889         int i;
4890         struct ieee80211_sta_ht_cap ht_cap = {0};
4891         u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4892
4893         if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4894                 return ht_cap;
4895
4896         ht_cap.ht_supported = 1;
4897         ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4898         ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4899         ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4900         ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4901         ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4902
4903         if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4904                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4905
4906         if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4907                 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4908
4909         if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4910                 u32 smps;
4911
4912                 smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
4913                 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4914
4915                 ht_cap.cap |= smps;
4916         }
4917
4918         if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4919                 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4920
4921         if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4922                 u32 stbc;
4923
4924                 stbc   = ar_ht_cap;
4925                 stbc  &= WMI_HT_CAP_RX_STBC;
4926                 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4927                 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4928                 stbc  &= IEEE80211_HT_CAP_RX_STBC;
4929
4930                 ht_cap.cap |= stbc;
4931         }
4932
4933         if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4934                 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4935
4936         if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4937                 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4938
4939         if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4940                 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4941
4942         for (i = 0; i < ar->num_rx_chains; i++) {
4943                 if (rate_cap_rx_chainmask & BIT(i))
4944                         ht_cap.mcs.rx_mask[i] = 0xFF;
4945         }
4946
4947         ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4948
4949         return ht_cap;
4950 }
4951
4952 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
4953 {
4954         u32 value = 0;
4955         struct ath11k *ar = arvif->ar;
4956         int nsts;
4957         int sound_dim;
4958         u32 vht_cap = ar->pdev->cap.vht_cap;
4959         u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4960
4961         if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4962                 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4963                 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4964                 if (nsts > (ar->num_rx_chains - 1))
4965                         nsts = ar->num_rx_chains - 1;
4966                 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4967         }
4968
4969         if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4970                 sound_dim = vht_cap &
4971                             IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4972                 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4973                 if (sound_dim > (ar->num_tx_chains - 1))
4974                         sound_dim = ar->num_tx_chains - 1;
4975                 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4976         }
4977
4978         if (!value)
4979                 return 0;
4980
4981         if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4982                 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4983
4984                 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4985                     arvif->vdev_type == WMI_VDEV_TYPE_AP)
4986                         value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4987         }
4988
4989         /* TODO: SUBFEE not validated in HK, disable here until validated? */
4990
4991         if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4992                 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4993
4994                 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4995                     arvif->vdev_type == WMI_VDEV_TYPE_STA)
4996                         value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4997         }
4998
4999         return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5000                                              vdev_param, value);
5001 }
5002
5003 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
5004 {
5005         bool subfer, subfee;
5006         int sound_dim = 0, nsts = 0;
5007
5008         subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
5009         subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5010
5011         if (ar->num_tx_chains < 2) {
5012                 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5013                 subfer = false;
5014         }
5015
5016         if (ar->num_rx_chains < 2) {
5017                 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
5018                 subfee = false;
5019         }
5020
5021         /* If SU Beaformer is not set, then disable MU Beamformer Capability */
5022         if (!subfer)
5023                 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5024
5025         /* If SU Beaformee is not set, then disable MU Beamformee Capability */
5026         if (!subfee)
5027                 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5028
5029         sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5030         sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5031         *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5032
5033         nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5034         nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5035         *vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5036
5037         /* Enable Sounding Dimension Field only if SU BF is enabled */
5038         if (subfer) {
5039                 if (sound_dim > (ar->num_tx_chains - 1))
5040                         sound_dim = ar->num_tx_chains - 1;
5041
5042                 sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5043                 sound_dim &=  IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5044                 *vht_cap |= sound_dim;
5045         }
5046
5047         /* Enable Beamformee STS Field only if SU BF is enabled */
5048         if (subfee) {
5049                 if (nsts > (ar->num_rx_chains - 1))
5050                         nsts = ar->num_rx_chains - 1;
5051
5052                 nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5053                 nsts &=  IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5054                 *vht_cap |= nsts;
5055         }
5056 }
5057
5058 static struct ieee80211_sta_vht_cap
5059 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5060                       u32 rate_cap_rx_chainmask)
5061 {
5062         struct ieee80211_sta_vht_cap vht_cap = {0};
5063         u16 txmcs_map, rxmcs_map;
5064         int i;
5065
5066         vht_cap.vht_supported = 1;
5067         vht_cap.cap = ar->pdev->cap.vht_cap;
5068
5069         if (ar->pdev->cap.nss_ratio_enabled)
5070                 vht_cap.vht_mcs.tx_highest |=
5071                         cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5072
5073         ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5074
5075         rxmcs_map = 0;
5076         txmcs_map = 0;
5077         for (i = 0; i < 8; i++) {
5078                 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5079                         txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5080                 else
5081                         txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5082
5083                 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5084                         rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5085                 else
5086                         rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5087         }
5088
5089         if (rate_cap_tx_chainmask <= 1)
5090                 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5091
5092         vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5093         vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5094
5095         return vht_cap;
5096 }
5097
5098 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5099                                         struct ath11k_pdev_cap *cap,
5100                                         u32 *ht_cap_info)
5101 {
5102         struct ieee80211_supported_band *band;
5103         u32 rate_cap_tx_chainmask;
5104         u32 rate_cap_rx_chainmask;
5105         u32 ht_cap;
5106
5107         rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5108         rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5109
5110         if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5111                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5112                 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5113                 if (ht_cap_info)
5114                         *ht_cap_info = ht_cap;
5115                 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5116                                                     rate_cap_rx_chainmask);
5117         }
5118
5119         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5120             (ar->ab->hw_params.single_pdev_only ||
5121              !ar->supports_6ghz)) {
5122                 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5123                 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5124                 if (ht_cap_info)
5125                         *ht_cap_info = ht_cap;
5126                 band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5127                                                     rate_cap_rx_chainmask);
5128                 band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5129                                                       rate_cap_rx_chainmask);
5130         }
5131 }
5132
5133 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5134 {
5135         /* TODO: Check the request chainmask against the supported
5136          * chainmask table which is advertised in extented_service_ready event
5137          */
5138
5139         return 0;
5140 }
5141
5142 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5143                                   u8 *he_ppet)
5144 {
5145         int nss, ru;
5146         u8 bit = 7;
5147
5148         he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5149         he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5150                        IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5151                       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5152         for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5153                 for (ru = 0; ru < 4; ru++) {
5154                         u8 val;
5155                         int i;
5156
5157                         if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5158                                 continue;
5159                         val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5160                                0x3f;
5161                         val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5162                         for (i = 5; i >= 0; i--) {
5163                                 he_ppet[bit / 8] |=
5164                                         ((val >> i) & 0x1) << ((bit % 8));
5165                                 bit++;
5166                         }
5167                 }
5168         }
5169 }
5170
5171 static void
5172 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5173 {
5174         u8 m;
5175
5176         m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5177             IEEE80211_HE_MAC_CAP0_TWT_REQ;
5178         he_cap_elem->mac_cap_info[0] &= ~m;
5179
5180         m = IEEE80211_HE_MAC_CAP2_TRS |
5181             IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5182             IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5183         he_cap_elem->mac_cap_info[2] &= ~m;
5184
5185         m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5186             IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5187             IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5188         he_cap_elem->mac_cap_info[3] &= ~m;
5189
5190         m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5191             IEEE80211_HE_MAC_CAP4_BQR;
5192         he_cap_elem->mac_cap_info[4] &= ~m;
5193
5194         m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5195             IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5196             IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5197             IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5198         he_cap_elem->mac_cap_info[5] &= ~m;
5199
5200         m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5201             IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5202         he_cap_elem->phy_cap_info[2] &= ~m;
5203
5204         m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5205             IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5206             IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5207         he_cap_elem->phy_cap_info[3] &= ~m;
5208
5209         m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5210         he_cap_elem->phy_cap_info[4] &= ~m;
5211
5212         m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5213         he_cap_elem->phy_cap_info[5] &= ~m;
5214
5215         m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5216             IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5217             IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5218             IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5219         he_cap_elem->phy_cap_info[6] &= ~m;
5220
5221         m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5222             IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5223             IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5224             IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5225         he_cap_elem->phy_cap_info[7] &= ~m;
5226
5227         m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5228             IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5229             IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5230             IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5231         he_cap_elem->phy_cap_info[8] &= ~m;
5232
5233         m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5234             IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5235             IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5236             IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5237             IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5238             IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5239         he_cap_elem->phy_cap_info[9] &= ~m;
5240 }
5241
5242 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5243                                            struct ath11k_band_cap *bcap)
5244 {
5245         u8 val;
5246
5247         bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5248         if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5249                 bcap->he_6ghz_capa |=
5250                         FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5251                                    WLAN_HT_CAP_SM_PS_DYNAMIC);
5252         else
5253                 bcap->he_6ghz_capa |=
5254                         FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5255                                    WLAN_HT_CAP_SM_PS_DISABLED);
5256         val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5257                         pcap->vht_cap);
5258         bcap->he_6ghz_capa |=
5259                 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5260         val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5261         bcap->he_6ghz_capa |=
5262                 FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5263         if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5264                 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5265         if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5266                 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5267
5268         return cpu_to_le16(bcap->he_6ghz_capa);
5269 }
5270
5271 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5272                                   struct ath11k_pdev_cap *cap,
5273                                   struct ieee80211_sband_iftype_data *data,
5274                                   int band)
5275 {
5276         int i, idx = 0;
5277
5278         for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5279                 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5280                 struct ath11k_band_cap *band_cap = &cap->band[band];
5281                 struct ieee80211_he_cap_elem *he_cap_elem =
5282                                 &he_cap->he_cap_elem;
5283
5284                 switch (i) {
5285                 case NL80211_IFTYPE_STATION:
5286                 case NL80211_IFTYPE_AP:
5287                 case NL80211_IFTYPE_MESH_POINT:
5288                         break;
5289
5290                 default:
5291                         continue;
5292                 }
5293
5294                 data[idx].types_mask = BIT(i);
5295                 he_cap->has_he = true;
5296                 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5297                        sizeof(he_cap_elem->mac_cap_info));
5298                 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5299                        sizeof(he_cap_elem->phy_cap_info));
5300
5301                 he_cap_elem->mac_cap_info[1] &=
5302                         IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5303
5304                 he_cap_elem->phy_cap_info[5] &=
5305                         ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5306                 he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5307
5308                 switch (i) {
5309                 case NL80211_IFTYPE_AP:
5310                         he_cap_elem->phy_cap_info[3] &=
5311                                 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5312                         he_cap_elem->phy_cap_info[9] |=
5313                                 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5314                         break;
5315                 case NL80211_IFTYPE_STATION:
5316                         he_cap_elem->mac_cap_info[0] &=
5317                                 ~IEEE80211_HE_MAC_CAP0_TWT_RES;
5318                         he_cap_elem->mac_cap_info[0] |=
5319                                 IEEE80211_HE_MAC_CAP0_TWT_REQ;
5320                         he_cap_elem->phy_cap_info[9] |=
5321                                 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5322                         break;
5323                 case NL80211_IFTYPE_MESH_POINT:
5324                         ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5325                         break;
5326                 }
5327
5328                 he_cap->he_mcs_nss_supp.rx_mcs_80 =
5329                         cpu_to_le16(band_cap->he_mcs & 0xffff);
5330                 he_cap->he_mcs_nss_supp.tx_mcs_80 =
5331                         cpu_to_le16(band_cap->he_mcs & 0xffff);
5332                 he_cap->he_mcs_nss_supp.rx_mcs_160 =
5333                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5334                 he_cap->he_mcs_nss_supp.tx_mcs_160 =
5335                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5336                 he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5337                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5338                 he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5339                         cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
5340
5341                 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5342                 if (he_cap_elem->phy_cap_info[6] &
5343                     IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5344                         ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5345                                               he_cap->ppe_thres);
5346
5347                 if (band == NL80211_BAND_6GHZ) {
5348                         data[idx].he_6ghz_capa.capa =
5349                                 ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5350                 }
5351                 idx++;
5352         }
5353
5354         return idx;
5355 }
5356
5357 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5358                                     struct ath11k_pdev_cap *cap)
5359 {
5360         struct ieee80211_supported_band *band;
5361         int count;
5362
5363         if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5364                 count = ath11k_mac_copy_he_cap(ar, cap,
5365                                                ar->mac.iftype[NL80211_BAND_2GHZ],
5366                                                NL80211_BAND_2GHZ);
5367                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5368                 band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
5369                 band->n_iftype_data = count;
5370         }
5371
5372         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5373                 count = ath11k_mac_copy_he_cap(ar, cap,
5374                                                ar->mac.iftype[NL80211_BAND_5GHZ],
5375                                                NL80211_BAND_5GHZ);
5376                 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5377                 band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
5378                 band->n_iftype_data = count;
5379         }
5380
5381         if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5382             ar->supports_6ghz) {
5383                 count = ath11k_mac_copy_he_cap(ar, cap,
5384                                                ar->mac.iftype[NL80211_BAND_6GHZ],
5385                                                NL80211_BAND_6GHZ);
5386                 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5387                 band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
5388                 band->n_iftype_data = count;
5389         }
5390 }
5391
5392 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5393 {
5394         int ret;
5395
5396         lockdep_assert_held(&ar->conf_mutex);
5397
5398         if (ath11k_check_chain_mask(ar, tx_ant, true))
5399                 return -EINVAL;
5400
5401         if (ath11k_check_chain_mask(ar, rx_ant, false))
5402                 return -EINVAL;
5403
5404         ar->cfg_tx_chainmask = tx_ant;
5405         ar->cfg_rx_chainmask = rx_ant;
5406
5407         if (ar->state != ATH11K_STATE_ON &&
5408             ar->state != ATH11K_STATE_RESTARTED)
5409                 return 0;
5410
5411         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5412                                         tx_ant, ar->pdev->pdev_id);
5413         if (ret) {
5414                 ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5415                             ret, tx_ant);
5416                 return ret;
5417         }
5418
5419         ar->num_tx_chains = get_num_chains(tx_ant);
5420
5421         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5422                                         rx_ant, ar->pdev->pdev_id);
5423         if (ret) {
5424                 ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5425                             ret, rx_ant);
5426                 return ret;
5427         }
5428
5429         ar->num_rx_chains = get_num_chains(rx_ant);
5430
5431         /* Reload HT/VHT/HE capability */
5432         ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5433         ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5434
5435         return 0;
5436 }
5437
5438 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5439 {
5440         int num_mgmt;
5441
5442         ieee80211_free_txskb(ar->hw, skb);
5443
5444         num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5445
5446         if (num_mgmt < 0)
5447                 WARN_ON_ONCE(1);
5448
5449         if (!num_mgmt)
5450                 wake_up(&ar->txmgmt_empty_waitq);
5451 }
5452
5453 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5454 {
5455         struct sk_buff *msdu;
5456         struct ieee80211_tx_info *info;
5457
5458         spin_lock_bh(&ar->txmgmt_idr_lock);
5459         msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5460         spin_unlock_bh(&ar->txmgmt_idr_lock);
5461
5462         if (!msdu)
5463                 return;
5464
5465         dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
5466                          DMA_TO_DEVICE);
5467
5468         info = IEEE80211_SKB_CB(msdu);
5469         memset(&info->status, 0, sizeof(info->status));
5470
5471         ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
5472 }
5473
5474 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5475 {
5476         struct ath11k *ar = ctx;
5477
5478         ath11k_mac_tx_mgmt_free(ar, buf_id);
5479
5480         return 0;
5481 }
5482
5483 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5484 {
5485         struct ieee80211_vif *vif = ctx;
5486         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
5487         struct ath11k *ar = skb_cb->ar;
5488
5489         if (skb_cb->vif == vif)
5490                 ath11k_mac_tx_mgmt_free(ar, buf_id);
5491
5492         return 0;
5493 }
5494
5495 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
5496                                   struct sk_buff *skb)
5497 {
5498         struct ath11k_base *ab = ar->ab;
5499         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5500         struct ieee80211_tx_info *info;
5501         dma_addr_t paddr;
5502         int buf_id;
5503         int ret;
5504
5505         ATH11K_SKB_CB(skb)->ar = ar;
5506
5507         spin_lock_bh(&ar->txmgmt_idr_lock);
5508         buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5509                            ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5510         spin_unlock_bh(&ar->txmgmt_idr_lock);
5511
5512         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5513                    "mac tx mgmt frame, buf id %d\n", buf_id);
5514
5515         if (buf_id < 0)
5516                 return -ENOSPC;
5517
5518         info = IEEE80211_SKB_CB(skb);
5519         if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5520                 if ((ieee80211_is_action(hdr->frame_control) ||
5521                      ieee80211_is_deauth(hdr->frame_control) ||
5522                      ieee80211_is_disassoc(hdr->frame_control)) &&
5523                      ieee80211_has_protected(hdr->frame_control)) {
5524                         skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5525                 }
5526         }
5527
5528         paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5529         if (dma_mapping_error(ab->dev, paddr)) {
5530                 ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5531                 ret = -EIO;
5532                 goto err_free_idr;
5533         }
5534
5535         ATH11K_SKB_CB(skb)->paddr = paddr;
5536
5537         ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5538         if (ret) {
5539                 ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5540                 goto err_unmap_buf;
5541         }
5542
5543         return 0;
5544
5545 err_unmap_buf:
5546         dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
5547                          skb->len, DMA_TO_DEVICE);
5548 err_free_idr:
5549         spin_lock_bh(&ar->txmgmt_idr_lock);
5550         idr_remove(&ar->txmgmt_idr, buf_id);
5551         spin_unlock_bh(&ar->txmgmt_idr_lock);
5552
5553         return ret;
5554 }
5555
5556 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
5557 {
5558         struct sk_buff *skb;
5559
5560         while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5561                 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5562 }
5563
5564 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
5565 {
5566         struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
5567         struct ath11k_skb_cb *skb_cb;
5568         struct ath11k_vif *arvif;
5569         struct sk_buff *skb;
5570         int ret;
5571
5572         while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5573                 skb_cb = ATH11K_SKB_CB(skb);
5574                 if (!skb_cb->vif) {
5575                         ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
5576                         ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5577                         continue;
5578                 }
5579
5580                 arvif = ath11k_vif_to_arvif(skb_cb->vif);
5581                 mutex_lock(&ar->conf_mutex);
5582                 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5583                         ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
5584                         if (ret) {
5585                                 ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5586                                             arvif->vdev_id, ret);
5587                                 ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5588                         } else {
5589                                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5590                                            "mac tx mgmt frame, vdev_id %d\n",
5591                                            arvif->vdev_id);
5592                         }
5593                 } else {
5594                         ath11k_warn(ar->ab,
5595                                     "dropping mgmt frame for vdev %d, is_started %d\n",
5596                                     arvif->vdev_id,
5597                                     arvif->is_started);
5598                         ath11k_mgmt_over_wmi_tx_drop(ar, skb);
5599                 }
5600                 mutex_unlock(&ar->conf_mutex);
5601         }
5602 }
5603
5604 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
5605                               bool is_prb_rsp)
5606 {
5607         struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5608
5609         if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5610                 return -ESHUTDOWN;
5611
5612         /* Drop probe response packets when the pending management tx
5613          * count has reached a certain threshold, so as to prioritize
5614          * other mgmt packets like auth and assoc to be sent on time
5615          * for establishing successful connections.
5616          */
5617         if (is_prb_rsp &&
5618             atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
5619                 ath11k_warn(ar->ab,
5620                             "dropping probe response as pending queue is almost full\n");
5621                 return -ENOSPC;
5622         }
5623
5624         if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
5625                 ath11k_warn(ar->ab, "mgmt tx queue is full\n");
5626                 return -ENOSPC;
5627         }
5628
5629         skb_queue_tail(q, skb);
5630         atomic_inc(&ar->num_pending_mgmt_tx);
5631         queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
5632
5633         return 0;
5634 }
5635
5636 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
5637                              struct ieee80211_tx_control *control,
5638                              struct sk_buff *skb)
5639 {
5640         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
5641         struct ath11k *ar = hw->priv;
5642         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5643         struct ieee80211_vif *vif = info->control.vif;
5644         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5645         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5646         struct ieee80211_key_conf *key = info->control.hw_key;
5647         struct ath11k_sta *arsta = NULL;
5648         u32 info_flags = info->flags;
5649         bool is_prb_rsp;
5650         int ret;
5651
5652         memset(skb_cb, 0, sizeof(*skb_cb));
5653         skb_cb->vif = vif;
5654
5655         if (key) {
5656                 skb_cb->cipher = key->cipher;
5657                 skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
5658         }
5659
5660         if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5661                 skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
5662         } else if (ieee80211_is_mgmt(hdr->frame_control)) {
5663                 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5664                 ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5665                 if (ret) {
5666                         ath11k_warn(ar->ab, "failed to queue management frame %d\n",
5667                                     ret);
5668                         ieee80211_free_txskb(ar->hw, skb);
5669                 }
5670                 return;
5671         }
5672
5673         if (control->sta)
5674                 arsta = (struct ath11k_sta *)control->sta->drv_priv;
5675
5676         ret = ath11k_dp_tx(ar, arvif, arsta, skb);
5677         if (unlikely(ret)) {
5678                 ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5679                 ieee80211_free_txskb(ar->hw, skb);
5680         }
5681 }
5682
5683 void ath11k_mac_drain_tx(struct ath11k *ar)
5684 {
5685         /* make sure rcu-protected mac80211 tx path itself is drained */
5686         synchronize_net();
5687
5688         cancel_work_sync(&ar->wmi_mgmt_tx_work);
5689         ath11k_mgmt_over_wmi_tx_purge(ar);
5690 }
5691
5692 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
5693 {
5694         struct htt_rx_ring_tlv_filter tlv_filter = {0};
5695         struct ath11k_base *ab = ar->ab;
5696         int i, ret = 0;
5697         u32 ring_id;
5698
5699         if (enable) {
5700                 tlv_filter = ath11k_mac_mon_status_filter_default;
5701                 if (ath11k_debugfs_rx_filter(ar))
5702                         tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
5703         }
5704
5705         for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
5706                 ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
5707                 ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
5708                                                        ar->dp.mac_id + i,
5709                                                        HAL_RXDMA_MONITOR_STATUS,
5710                                                        DP_RX_BUFFER_SIZE,
5711                                                        &tlv_filter);
5712         }
5713
5714         if (enable && !ar->ab->hw_params.rxdma1_enable)
5715                 mod_timer(&ar->ab->mon_reap_timer, jiffies +
5716                           msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
5717
5718         return ret;
5719 }
5720
5721 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
5722 {
5723         int recovery_start_count;
5724
5725         if (!ab->is_reset)
5726                 return;
5727
5728         recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
5729         ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
5730
5731         if (recovery_start_count == ab->num_radios) {
5732                 complete(&ab->recovery_start);
5733                 ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
5734         }
5735
5736         ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
5737
5738         wait_for_completion_timeout(&ab->reconfigure_complete,
5739                                     ATH11K_RECONFIGURE_TIMEOUT_HZ);
5740 }
5741
5742 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
5743 {
5744         struct ath11k *ar = hw->priv;
5745         struct ath11k_base *ab = ar->ab;
5746         struct ath11k_pdev *pdev = ar->pdev;
5747         int ret;
5748
5749         ath11k_mac_drain_tx(ar);
5750         mutex_lock(&ar->conf_mutex);
5751
5752         switch (ar->state) {
5753         case ATH11K_STATE_OFF:
5754                 ar->state = ATH11K_STATE_ON;
5755                 break;
5756         case ATH11K_STATE_RESTARTING:
5757                 ar->state = ATH11K_STATE_RESTARTED;
5758                 ath11k_mac_wait_reconfigure(ab);
5759                 break;
5760         case ATH11K_STATE_RESTARTED:
5761         case ATH11K_STATE_WEDGED:
5762         case ATH11K_STATE_ON:
5763                 WARN_ON(1);
5764                 ret = -EINVAL;
5765                 goto err;
5766         }
5767
5768         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5769                                         1, pdev->pdev_id);
5770
5771         if (ret) {
5772                 ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
5773                 goto err;
5774         }
5775
5776         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5777                                         pdev->pdev_id);
5778         if (ret) {
5779                 ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
5780                 goto err;
5781         }
5782
5783         if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
5784                 ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
5785                 if (ret) {
5786                         ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
5787                         goto err;
5788                 }
5789         }
5790
5791         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5792                                         0, pdev->pdev_id);
5793         if (ret) {
5794                 ath11k_err(ab, "failed to set ac override for ARP: %d\n",
5795                            ret);
5796                 goto err;
5797         }
5798
5799         ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5800         if (ret) {
5801                 ath11k_err(ab, "failed to offload radar detection: %d\n",
5802                            ret);
5803                 goto err;
5804         }
5805
5806         ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5807                                                   HTT_PPDU_STATS_TAG_DEFAULT);
5808         if (ret) {
5809                 ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
5810                 goto err;
5811         }
5812
5813         ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5814                                         1, pdev->pdev_id);
5815
5816         if (ret) {
5817                 ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5818                 goto err;
5819         }
5820
5821         __ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5822
5823         /* TODO: Do we need to enable ANI? */
5824
5825         ath11k_reg_update_chan_list(ar, false);
5826
5827         ar->num_started_vdevs = 0;
5828         ar->num_created_vdevs = 0;
5829         ar->num_peers = 0;
5830         ar->allocated_vdev_map = 0;
5831
5832         /* Configure monitor status ring with default rx_filter to get rx status
5833          * such as rssi, rx_duration.
5834          */
5835         ret = ath11k_mac_config_mon_status_default(ar, true);
5836         if (ret) {
5837                 ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5838                            ret);
5839                 goto err;
5840         }
5841
5842         /* Configure the hash seed for hash based reo dest ring selection */
5843         ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5844
5845         /* allow device to enter IMPS */
5846         if (ab->hw_params.idle_ps) {
5847                 ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5848                                                 1, pdev->pdev_id);
5849                 if (ret) {
5850                         ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
5851                         goto err;
5852                 }
5853         }
5854
5855         mutex_unlock(&ar->conf_mutex);
5856
5857         rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5858                            &ab->pdevs[ar->pdev_idx]);
5859
5860         return 0;
5861
5862 err:
5863         ar->state = ATH11K_STATE_OFF;
5864         mutex_unlock(&ar->conf_mutex);
5865
5866         return ret;
5867 }
5868
5869 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
5870 {
5871         struct ath11k *ar = hw->priv;
5872         struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5873         int ret;
5874
5875         ath11k_mac_drain_tx(ar);
5876
5877         mutex_lock(&ar->conf_mutex);
5878         ret = ath11k_mac_config_mon_status_default(ar, false);
5879         if (ret)
5880                 ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5881                            ret);
5882
5883         clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
5884         ar->state = ATH11K_STATE_OFF;
5885         mutex_unlock(&ar->conf_mutex);
5886
5887         cancel_delayed_work_sync(&ar->scan.timeout);
5888         cancel_work_sync(&ar->regd_update_work);
5889         cancel_work_sync(&ar->ab->update_11d_work);
5890
5891         if (ar->state_11d == ATH11K_11D_PREPARING) {
5892                 ar->state_11d = ATH11K_11D_IDLE;
5893                 complete(&ar->completed_11d_scan);
5894         }
5895
5896         spin_lock_bh(&ar->data_lock);
5897         list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5898                 list_del(&ppdu_stats->list);
5899                 kfree(ppdu_stats);
5900         }
5901         spin_unlock_bh(&ar->data_lock);
5902
5903         rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5904
5905         synchronize_rcu();
5906
5907         atomic_set(&ar->num_pending_mgmt_tx, 0);
5908 }
5909
5910 static void
5911 ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
5912                                     struct vdev_create_params *params)
5913 {
5914         struct ath11k *ar = arvif->ar;
5915         struct ath11k_pdev *pdev = ar->pdev;
5916
5917         params->if_id = arvif->vdev_id;
5918         params->type = arvif->vdev_type;
5919         params->subtype = arvif->vdev_subtype;
5920         params->pdev_id = pdev->pdev_id;
5921
5922         if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5923                 params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5924                 params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5925         }
5926         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5927                 params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5928                 params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5929         }
5930         if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5931             ar->supports_6ghz) {
5932                 params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5933                 params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5934         }
5935 }
5936
5937 static u32
5938 ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype)
5939 {
5940         struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
5941         struct ath11k_band_cap *cap_band = NULL;
5942         u32 *hecap_phy_ptr = NULL;
5943         u32 hemode = 0;
5944
5945         if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5946                 cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5947         else
5948                 cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5949
5950         hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5951
5952         hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) |
5953                  FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) |
5954                  FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr));
5955
5956         /* TODO WDS and other modes */
5957         if (viftype == NL80211_IFTYPE_AP) {
5958                 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER,
5959                           HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) |
5960                           FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
5961                           FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
5962         } else {
5963                 hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
5964         }
5965
5966         return hemode;
5967 }
5968
5969 static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar,
5970                                           struct ath11k_vif *arvif)
5971 {
5972         u32 param_id, param_value;
5973         struct ath11k_base *ab = ar->ab;
5974         int ret = 0;
5975
5976         param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5977         param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5978         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5979                                             param_id, param_value);
5980         if (ret) {
5981                 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5982                             arvif->vdev_id, ret, param_value);
5983                 return ret;
5984         }
5985         param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5986         param_value =
5987                 FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
5988                 FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
5989                            HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
5990         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5991                                             param_id, param_value);
5992         if (ret) {
5993                 ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5994                             arvif->vdev_id, ret);
5995                 return ret;
5996         }
5997         return ret;
5998 }
5999
6000 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6001                                              struct ieee80211_vif *vif)
6002 {
6003         struct ath11k *ar = hw->priv;
6004         struct ath11k_base *ab = ar->ab;
6005         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6006         u32 param_id, param_value;
6007         int ret;
6008
6009         param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6010         if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6011             (vif->type != NL80211_IFTYPE_STATION &&
6012              vif->type != NL80211_IFTYPE_AP))
6013                 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6014                                         IEEE80211_OFFLOAD_DECAP_ENABLED);
6015
6016         if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6017                 param_value = ATH11K_HW_TXRX_ETHERNET;
6018         else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6019                 param_value = ATH11K_HW_TXRX_RAW;
6020         else
6021                 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6022
6023         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6024                                             param_id, param_value);
6025         if (ret) {
6026                 ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6027                             arvif->vdev_id, ret);
6028                 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6029         }
6030
6031         param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6032         if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6033                 param_value = ATH11K_HW_TXRX_ETHERNET;
6034         else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6035                 param_value = ATH11K_HW_TXRX_RAW;
6036         else
6037                 param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6038
6039         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6040                                             param_id, param_value);
6041         if (ret) {
6042                 ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6043                             arvif->vdev_id, ret);
6044                 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6045         }
6046 }
6047
6048 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6049 {
6050         struct ath11k *ar;
6051         struct ath11k_pdev *pdev;
6052         struct ath11k_vif *arvif;
6053         int i;
6054
6055         for (i = 0; i < ab->num_radios; i++) {
6056                 pdev = &ab->pdevs[i];
6057                 ar = pdev->ar;
6058                 list_for_each_entry(arvif, &ar->arvifs, list) {
6059                         if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6060                                 return true;
6061                 }
6062         }
6063         return false;
6064 }
6065
6066 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6067 {
6068         struct wmi_11d_scan_start_params param;
6069         int ret;
6070
6071         mutex_lock(&ar->ab->vdev_id_11d_lock);
6072
6073         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev id for 11d scan %d\n",
6074                    ar->vdev_id_11d_scan);
6075
6076         if (ar->regdom_set_by_user)
6077                 goto fin;
6078
6079         if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6080                 goto fin;
6081
6082         if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6083                 goto fin;
6084
6085         if (ath11k_mac_vif_ap_active_any(ar->ab))
6086                 goto fin;
6087
6088         param.vdev_id = vdev_id;
6089         param.start_interval_msec = 0;
6090         param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6091
6092         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac start 11d scan\n");
6093
6094         ret = ath11k_wmi_send_11d_scan_start_cmd(ar, &param);
6095         if (ret) {
6096                 ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6097                             vdev_id, ret);
6098         } else {
6099                 ar->vdev_id_11d_scan = vdev_id;
6100                 if (ar->state_11d == ATH11K_11D_PREPARING)
6101                         ar->state_11d = ATH11K_11D_RUNNING;
6102         }
6103
6104 fin:
6105         if (ar->state_11d == ATH11K_11D_PREPARING) {
6106                 ar->state_11d = ATH11K_11D_IDLE;
6107                 complete(&ar->completed_11d_scan);
6108         }
6109
6110         mutex_unlock(&ar->ab->vdev_id_11d_lock);
6111 }
6112
6113 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6114 {
6115         int ret;
6116         u32 vdev_id;
6117
6118         if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6119                 return;
6120
6121         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d scan\n");
6122
6123         mutex_lock(&ar->ab->vdev_id_11d_lock);
6124
6125         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac stop 11d vdev id %d\n",
6126                    ar->vdev_id_11d_scan);
6127
6128         if (ar->state_11d == ATH11K_11D_PREPARING) {
6129                 ar->state_11d = ATH11K_11D_IDLE;
6130                 complete(&ar->completed_11d_scan);
6131         }
6132
6133         if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6134                 vdev_id = ar->vdev_id_11d_scan;
6135
6136                 ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6137                 if (ret) {
6138                         ath11k_warn(ar->ab,
6139                                     "failed to stopt 11d scan vdev %d ret: %d\n",
6140                                     vdev_id, ret);
6141                 } else {
6142                         ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6143                         ar->state_11d = ATH11K_11D_IDLE;
6144                         complete(&ar->completed_11d_scan);
6145                 }
6146         }
6147         mutex_unlock(&ar->ab->vdev_id_11d_lock);
6148 }
6149
6150 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6151 {
6152         struct ath11k *ar;
6153         struct ath11k_pdev *pdev;
6154         int i;
6155
6156         ath11k_dbg(ab, ATH11K_DBG_MAC, "mac stop soc 11d scan\n");
6157
6158         for (i = 0; i < ab->num_radios; i++) {
6159                 pdev = &ab->pdevs[i];
6160                 ar = pdev->ar;
6161
6162                 ath11k_mac_11d_scan_stop(ar);
6163         }
6164 }
6165
6166 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6167                                        struct ieee80211_vif *vif)
6168 {
6169         struct ath11k *ar = hw->priv;
6170         struct ath11k_base *ab = ar->ab;
6171         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6172         struct vdev_create_params vdev_param = {0};
6173         struct peer_create_params peer_param;
6174         u32 param_id, param_value;
6175         u16 nss;
6176         int i;
6177         int ret, fbret;
6178         int bit;
6179
6180         vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6181
6182         mutex_lock(&ar->conf_mutex);
6183
6184         if (vif->type == NL80211_IFTYPE_AP &&
6185             ar->num_peers > (ar->max_num_peers - 1)) {
6186                 ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6187                 ret = -ENOBUFS;
6188                 goto err;
6189         }
6190
6191         if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6192                 ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6193                             ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6194                 ret = -EBUSY;
6195                 goto err;
6196         }
6197
6198         /* In the case of hardware recovery, debugfs files are
6199          * not deleted since ieee80211_ops.remove_interface() is
6200          * not invoked. In such cases, try to delete the files.
6201          * These will be re-created later.
6202          */
6203         ath11k_debugfs_remove_interface(arvif);
6204
6205         memset(arvif, 0, sizeof(*arvif));
6206
6207         arvif->ar = ar;
6208         arvif->vif = vif;
6209
6210         INIT_LIST_HEAD(&arvif->list);
6211         INIT_DELAYED_WORK(&arvif->connection_loss_work,
6212                           ath11k_mac_vif_sta_connection_loss_work);
6213
6214         for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6215                 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6216                 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6217                 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6218                        sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6219                 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6220                        sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6221                 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6222                        sizeof(arvif->bitrate_mask.control[i].he_mcs));
6223         }
6224
6225         bit = __ffs64(ab->free_vdev_map);
6226
6227         arvif->vdev_id = bit;
6228         arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6229
6230         switch (vif->type) {
6231         case NL80211_IFTYPE_UNSPECIFIED:
6232         case NL80211_IFTYPE_STATION:
6233                 arvif->vdev_type = WMI_VDEV_TYPE_STA;
6234                 break;
6235         case NL80211_IFTYPE_MESH_POINT:
6236                 arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6237                 fallthrough;
6238         case NL80211_IFTYPE_AP:
6239                 arvif->vdev_type = WMI_VDEV_TYPE_AP;
6240                 break;
6241         case NL80211_IFTYPE_MONITOR:
6242                 arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6243                 ar->monitor_vdev_id = bit;
6244                 break;
6245         default:
6246                 WARN_ON(1);
6247                 break;
6248         }
6249
6250         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
6251                    arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6252                    ab->free_vdev_map);
6253
6254         vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6255         for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6256                 vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6257
6258         ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6259
6260         ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6261         if (ret) {
6262                 ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6263                             arvif->vdev_id, ret);
6264                 goto err;
6265         }
6266
6267         ar->num_created_vdevs++;
6268         ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6269                    vif->addr, arvif->vdev_id);
6270         ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6271         ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6272
6273         spin_lock_bh(&ar->data_lock);
6274         list_add(&arvif->list, &ar->arvifs);
6275         spin_unlock_bh(&ar->data_lock);
6276
6277         ath11k_mac_op_update_vif_offload(hw, vif);
6278
6279         nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6280         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6281                                             WMI_VDEV_PARAM_NSS, nss);
6282         if (ret) {
6283                 ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6284                             arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6285                 goto err_vdev_del;
6286         }
6287
6288         switch (arvif->vdev_type) {
6289         case WMI_VDEV_TYPE_AP:
6290                 peer_param.vdev_id = arvif->vdev_id;
6291                 peer_param.peer_addr = vif->addr;
6292                 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6293                 ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6294                 if (ret) {
6295                         ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6296                                     arvif->vdev_id, ret);
6297                         goto err_vdev_del;
6298                 }
6299
6300                 ret = ath11k_mac_set_kickout(arvif);
6301                 if (ret) {
6302                         ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6303                                     arvif->vdev_id, ret);
6304                         goto err_peer_del;
6305                 }
6306
6307                 ath11k_mac_11d_scan_stop_all(ar->ab);
6308                 break;
6309         case WMI_VDEV_TYPE_STA:
6310                 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6311                 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6312                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6313                                                   param_id, param_value);
6314                 if (ret) {
6315                         ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6316                                     arvif->vdev_id, ret);
6317                         goto err_peer_del;
6318                 }
6319
6320                 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6321                 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6322                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6323                                                   param_id, param_value);
6324                 if (ret) {
6325                         ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6326                                     arvif->vdev_id, ret);
6327                         goto err_peer_del;
6328                 }
6329
6330                 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6331                 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6332                 ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6333                                                   param_id, param_value);
6334                 if (ret) {
6335                         ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6336                                     arvif->vdev_id, ret);
6337                         goto err_peer_del;
6338                 }
6339
6340                 ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6341                                                   WMI_STA_PS_MODE_DISABLED);
6342                 if (ret) {
6343                         ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6344                                     arvif->vdev_id, ret);
6345                         goto err_peer_del;
6346                 }
6347
6348                 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6349                         reinit_completion(&ar->completed_11d_scan);
6350                         ar->state_11d = ATH11K_11D_PREPARING;
6351                 }
6352                 break;
6353         case WMI_VDEV_TYPE_MONITOR:
6354                 set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6355                 break;
6356         default:
6357                 break;
6358         }
6359
6360         arvif->txpower = vif->bss_conf.txpower;
6361         ret = ath11k_mac_txpower_recalc(ar);
6362         if (ret)
6363                 goto err_peer_del;
6364
6365         param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6366         param_value = ar->hw->wiphy->rts_threshold;
6367         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6368                                             param_id, param_value);
6369         if (ret) {
6370                 ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6371                             arvif->vdev_id, ret);
6372         }
6373
6374         ath11k_dp_vdev_tx_attach(ar, arvif);
6375
6376         if (vif->type != NL80211_IFTYPE_MONITOR &&
6377             test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6378                 ret = ath11k_mac_monitor_vdev_create(ar);
6379                 if (ret) {
6380                         ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6381                                     ret);
6382                         goto err_peer_del;
6383                 }
6384         }
6385
6386         ath11k_debugfs_add_interface(arvif);
6387
6388         mutex_unlock(&ar->conf_mutex);
6389
6390         return 0;
6391
6392 err_peer_del:
6393         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6394                 fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6395                 if (fbret) {
6396                         ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6397                                     vif->addr, arvif->vdev_id, fbret);
6398                         goto err;
6399                 }
6400         }
6401
6402 err_vdev_del:
6403         ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6404         ar->num_created_vdevs--;
6405         ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6406         ab->free_vdev_map |= 1LL << arvif->vdev_id;
6407         spin_lock_bh(&ar->data_lock);
6408         list_del(&arvif->list);
6409         spin_unlock_bh(&ar->data_lock);
6410
6411 err:
6412         ath11k_debugfs_remove_interface(arvif);
6413         mutex_unlock(&ar->conf_mutex);
6414
6415         return ret;
6416 }
6417
6418 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6419 {
6420         struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
6421         struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6422
6423         if (skb_cb->vif == vif)
6424                 skb_cb->vif = NULL;
6425
6426         return 0;
6427 }
6428
6429 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6430                                            struct ieee80211_vif *vif)
6431 {
6432         struct ath11k *ar = hw->priv;
6433         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6434         struct ath11k_base *ab = ar->ab;
6435         unsigned long time_left;
6436         int ret;
6437         int i;
6438
6439         cancel_delayed_work_sync(&arvif->connection_loss_work);
6440
6441         mutex_lock(&ar->conf_mutex);
6442
6443         ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n",
6444                    arvif->vdev_id);
6445
6446         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
6447                 ath11k_mac_11d_scan_stop(ar);
6448
6449         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6450                 ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6451                 if (ret)
6452                         ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6453                                     arvif->vdev_id, ret);
6454         }
6455
6456         reinit_completion(&ar->vdev_delete_done);
6457
6458         ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6459         if (ret) {
6460                 ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6461                             arvif->vdev_id, ret);
6462                 goto err_vdev_del;
6463         }
6464
6465         time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6466                                                 ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6467         if (time_left == 0) {
6468                 ath11k_warn(ab, "Timeout in receiving vdev delete response\n");
6469                 goto err_vdev_del;
6470         }
6471
6472         ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6473         ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6474         ar->num_created_vdevs--;
6475
6476         ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6477                    vif->addr, arvif->vdev_id);
6478
6479         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6480                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6481                 ar->monitor_vdev_id = -1;
6482         } else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
6483                    !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
6484                 ret = ath11k_mac_monitor_vdev_delete(ar);
6485                 if (ret)
6486                         /* continue even if there's an error */
6487                         ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
6488                                     ret);
6489         }
6490
6491 err_vdev_del:
6492         spin_lock_bh(&ar->data_lock);
6493         list_del(&arvif->list);
6494         spin_unlock_bh(&ar->data_lock);
6495
6496         ath11k_peer_cleanup(ar, arvif->vdev_id);
6497
6498         idr_for_each(&ar->txmgmt_idr,
6499                      ath11k_mac_vif_txmgmt_idr_remove, vif);
6500
6501         for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
6502                 spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6503                 idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
6504                              ath11k_mac_vif_unref, vif);
6505                 spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
6506         }
6507
6508         /* Recalc txpower for remaining vdev */
6509         ath11k_mac_txpower_recalc(ar);
6510
6511         ath11k_debugfs_remove_interface(arvif);
6512
6513         /* TODO: recal traffic pause state based on the available vdevs */
6514
6515         mutex_unlock(&ar->conf_mutex);
6516 }
6517
6518 /* FIXME: Has to be verified. */
6519 #define SUPPORTED_FILTERS                       \
6520         (FIF_ALLMULTI |                         \
6521         FIF_CONTROL |                           \
6522         FIF_PSPOLL |                            \
6523         FIF_OTHER_BSS |                         \
6524         FIF_BCN_PRBRESP_PROMISC |               \
6525         FIF_PROBE_REQ |                         \
6526         FIF_FCSFAIL)
6527
6528 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
6529                                            unsigned int changed_flags,
6530                                            unsigned int *total_flags,
6531                                            u64 multicast)
6532 {
6533         struct ath11k *ar = hw->priv;
6534
6535         mutex_lock(&ar->conf_mutex);
6536
6537         *total_flags &= SUPPORTED_FILTERS;
6538         ar->filter_flags = *total_flags;
6539
6540         mutex_unlock(&ar->conf_mutex);
6541 }
6542
6543 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6544 {
6545         struct ath11k *ar = hw->priv;
6546
6547         mutex_lock(&ar->conf_mutex);
6548
6549         *tx_ant = ar->cfg_tx_chainmask;
6550         *rx_ant = ar->cfg_rx_chainmask;
6551
6552         mutex_unlock(&ar->conf_mutex);
6553
6554         return 0;
6555 }
6556
6557 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6558 {
6559         struct ath11k *ar = hw->priv;
6560         int ret;
6561
6562         mutex_lock(&ar->conf_mutex);
6563         ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
6564         mutex_unlock(&ar->conf_mutex);
6565
6566         return ret;
6567 }
6568
6569 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6570                                       struct ieee80211_vif *vif,
6571                                       struct ieee80211_ampdu_params *params)
6572 {
6573         struct ath11k *ar = hw->priv;
6574         int ret = -EINVAL;
6575
6576         mutex_lock(&ar->conf_mutex);
6577
6578         switch (params->action) {
6579         case IEEE80211_AMPDU_RX_START:
6580                 ret = ath11k_dp_rx_ampdu_start(ar, params);
6581                 break;
6582         case IEEE80211_AMPDU_RX_STOP:
6583                 ret = ath11k_dp_rx_ampdu_stop(ar, params);
6584                 break;
6585         case IEEE80211_AMPDU_TX_START:
6586         case IEEE80211_AMPDU_TX_STOP_CONT:
6587         case IEEE80211_AMPDU_TX_STOP_FLUSH:
6588         case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6589         case IEEE80211_AMPDU_TX_OPERATIONAL:
6590                 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6591                  * Tx aggregation requests.
6592                  */
6593                 ret = -EOPNOTSUPP;
6594                 break;
6595         }
6596
6597         mutex_unlock(&ar->conf_mutex);
6598
6599         return ret;
6600 }
6601
6602 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6603                                      struct ieee80211_chanctx_conf *ctx)
6604 {
6605         struct ath11k *ar = hw->priv;
6606         struct ath11k_base *ab = ar->ab;
6607
6608         ath11k_dbg(ab, ATH11K_DBG_MAC,
6609                    "mac chanctx add freq %u width %d ptr %pK\n",
6610                    ctx->def.chan->center_freq, ctx->def.width, ctx);
6611
6612         mutex_lock(&ar->conf_mutex);
6613
6614         spin_lock_bh(&ar->data_lock);
6615         /* TODO: In case of multiple channel context, populate rx_channel from
6616          * Rx PPDU desc information.
6617          */
6618         ar->rx_channel = ctx->def.chan;
6619         spin_unlock_bh(&ar->data_lock);
6620
6621         mutex_unlock(&ar->conf_mutex);
6622
6623         return 0;
6624 }
6625
6626 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6627                                          struct ieee80211_chanctx_conf *ctx)
6628 {
6629         struct ath11k *ar = hw->priv;
6630         struct ath11k_base *ab = ar->ab;
6631
6632         ath11k_dbg(ab, ATH11K_DBG_MAC,
6633                    "mac chanctx remove freq %u width %d ptr %pK\n",
6634                    ctx->def.chan->center_freq, ctx->def.width, ctx);
6635
6636         mutex_lock(&ar->conf_mutex);
6637
6638         spin_lock_bh(&ar->data_lock);
6639         /* TODO: In case of there is one more channel context left, populate
6640          * rx_channel with the channel of that remaining channel context.
6641          */
6642         ar->rx_channel = NULL;
6643         spin_unlock_bh(&ar->data_lock);
6644
6645         mutex_unlock(&ar->conf_mutex);
6646 }
6647
6648 static int
6649 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
6650                               struct ieee80211_chanctx_conf *ctx,
6651                               bool restart)
6652 {
6653         struct ath11k *ar = arvif->ar;
6654         struct ath11k_base *ab = ar->ab;
6655         struct wmi_vdev_start_req_arg arg = {};
6656         const struct cfg80211_chan_def *chandef = &ctx->def;
6657         int he_support = arvif->vif->bss_conf.he_support;
6658         int ret = 0;
6659
6660         lockdep_assert_held(&ar->conf_mutex);
6661
6662         reinit_completion(&ar->vdev_setup_done);
6663
6664         arg.vdev_id = arvif->vdev_id;
6665         arg.dtim_period = arvif->dtim_period;
6666         arg.bcn_intval = arvif->beacon_interval;
6667
6668         arg.channel.freq = chandef->chan->center_freq;
6669         arg.channel.band_center_freq1 = chandef->center_freq1;
6670         arg.channel.band_center_freq2 = chandef->center_freq2;
6671         arg.channel.mode =
6672                 ath11k_phymodes[chandef->chan->band][chandef->width];
6673
6674         arg.channel.min_power = 0;
6675         arg.channel.max_power = chandef->chan->max_power;
6676         arg.channel.max_reg_power = chandef->chan->max_reg_power;
6677         arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
6678
6679         arg.pref_tx_streams = ar->num_tx_chains;
6680         arg.pref_rx_streams = ar->num_rx_chains;
6681
6682         if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6683                 arg.ssid = arvif->u.ap.ssid;
6684                 arg.ssid_len = arvif->u.ap.ssid_len;
6685                 arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6686
6687                 /* For now allow DFS for AP mode */
6688                 arg.channel.chan_radar =
6689                         !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6690
6691                 arg.channel.freq2_radar = ctx->radar_enabled;
6692
6693                 arg.channel.passive = arg.channel.chan_radar;
6694
6695                 spin_lock_bh(&ab->base_lock);
6696                 arg.regdomain = ar->ab->dfs_region;
6697                 spin_unlock_bh(&ab->base_lock);
6698
6699                 if (he_support) {
6700                         ret = ath11k_set_he_mu_sounding_mode(ar, arvif);
6701                         if (ret) {
6702                                 ath11k_warn(ar->ab, "failed to set he mode vdev %i\n",
6703                                             arg.vdev_id);
6704                                 return ret;
6705                         }
6706                 }
6707         }
6708
6709         arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6710
6711         ath11k_dbg(ab, ATH11K_DBG_MAC,
6712                    "mac vdev %d start center_freq %d phymode %s\n",
6713                    arg.vdev_id, arg.channel.freq,
6714                    ath11k_wmi_phymode_str(arg.channel.mode));
6715
6716         ret = ath11k_wmi_vdev_start(ar, &arg, restart);
6717         if (ret) {
6718                 ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6719                             restart ? "restart" : "start", arg.vdev_id);
6720                 return ret;
6721         }
6722
6723         ret = ath11k_mac_vdev_setup_sync(ar);
6724         if (ret) {
6725                 ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6726                             arg.vdev_id, restart ? "restart" : "start", ret);
6727                 return ret;
6728         }
6729
6730         if (!restart)
6731                 ar->num_started_vdevs++;
6732
6733         ath11k_dbg(ab, ATH11K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
6734                    arvif->vif->addr, arvif->vdev_id);
6735
6736         /* Enable CAC Flag in the driver by checking the channel DFS cac time,
6737          * i.e dfs_cac_ms value which will be valid only for radar channels
6738          * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6739          * done before channel usage. This flags is used to drop rx packets.
6740          * during CAC.
6741          */
6742         /* TODO Set the flag for other interface types as required */
6743         if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6744             chandef->chan->dfs_cac_ms &&
6745             chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6746                 set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6747                 ath11k_dbg(ab, ATH11K_DBG_MAC,
6748                            "CAC Started in chan_freq %d for vdev %d\n",
6749                            arg.channel.freq, arg.vdev_id);
6750         }
6751
6752         ret = ath11k_mac_set_txbf_conf(arvif);
6753         if (ret)
6754                 ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6755                             arvif->vdev_id, ret);
6756
6757         return 0;
6758 }
6759
6760 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
6761 {
6762         struct ath11k *ar = arvif->ar;
6763         int ret;
6764
6765         lockdep_assert_held(&ar->conf_mutex);
6766
6767         reinit_completion(&ar->vdev_setup_done);
6768
6769         ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
6770         if (ret) {
6771                 ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
6772                             arvif->vdev_id, ret);
6773                 goto err;
6774         }
6775
6776         ret = ath11k_mac_vdev_setup_sync(ar);
6777         if (ret) {
6778                 ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
6779                             arvif->vdev_id, ret);
6780                 goto err;
6781         }
6782
6783         WARN_ON(ar->num_started_vdevs == 0);
6784
6785         ar->num_started_vdevs--;
6786         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
6787                    arvif->vif->addr, arvif->vdev_id);
6788
6789         if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
6790                 clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6791                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
6792                            arvif->vdev_id);
6793         }
6794
6795         return 0;
6796 err:
6797         return ret;
6798 }
6799
6800 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
6801                                  struct ieee80211_chanctx_conf *ctx)
6802 {
6803         return ath11k_mac_vdev_start_restart(arvif, ctx, false);
6804 }
6805
6806 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
6807                                    struct ieee80211_chanctx_conf *ctx)
6808 {
6809         return ath11k_mac_vdev_start_restart(arvif, ctx, true);
6810 }
6811
6812 struct ath11k_mac_change_chanctx_arg {
6813         struct ieee80211_chanctx_conf *ctx;
6814         struct ieee80211_vif_chanctx_switch *vifs;
6815         int n_vifs;
6816         int next_vif;
6817 };
6818
6819 static void
6820 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6821                                    struct ieee80211_vif *vif)
6822 {
6823         struct ath11k_mac_change_chanctx_arg *arg = data;
6824
6825         if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
6826                 return;
6827
6828         arg->n_vifs++;
6829 }
6830
6831 static void
6832 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6833                                     struct ieee80211_vif *vif)
6834 {
6835         struct ath11k_mac_change_chanctx_arg *arg = data;
6836         struct ieee80211_chanctx_conf *ctx;
6837
6838         ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
6839         if (ctx != arg->ctx)
6840                 return;
6841
6842         if (WARN_ON(arg->next_vif == arg->n_vifs))
6843                 return;
6844
6845         arg->vifs[arg->next_vif].vif = vif;
6846         arg->vifs[arg->next_vif].old_ctx = ctx;
6847         arg->vifs[arg->next_vif].new_ctx = ctx;
6848         arg->next_vif++;
6849 }
6850
6851 static void
6852 ath11k_mac_update_vif_chan(struct ath11k *ar,
6853                            struct ieee80211_vif_chanctx_switch *vifs,
6854                            int n_vifs)
6855 {
6856         struct ath11k_base *ab = ar->ab;
6857         struct ath11k_vif *arvif;
6858         int ret;
6859         int i;
6860         bool monitor_vif = false;
6861
6862         lockdep_assert_held(&ar->conf_mutex);
6863
6864         /* Associated channel resources of all relevant vdevs
6865          * should be available for the channel switch now.
6866          */
6867
6868         /* TODO: Update ar->rx_channel */
6869
6870         for (i = 0; i < n_vifs; i++) {
6871                 arvif = (void *)vifs[i].vif->drv_priv;
6872
6873                 if (WARN_ON(!arvif->is_started))
6874                         continue;
6875
6876                 /* change_chanctx can be called even before vdev_up from
6877                  * ieee80211_start_ap->ieee80211_vif_use_channel->
6878                  * ieee80211_recalc_radar_chanctx.
6879                  *
6880                  * Firmware expect vdev_restart only if vdev is up.
6881                  * If vdev is down then it expect vdev_stop->vdev_start.
6882                  */
6883                 if (arvif->is_up) {
6884                         ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6885                         if (ret) {
6886                                 ath11k_warn(ab, "failed to restart vdev %d: %d\n",
6887                                             arvif->vdev_id, ret);
6888                                 continue;
6889                         }
6890                 } else {
6891                         ret = ath11k_mac_vdev_stop(arvif);
6892                         if (ret) {
6893                                 ath11k_warn(ab, "failed to stop vdev %d: %d\n",
6894                                             arvif->vdev_id, ret);
6895                                 continue;
6896                         }
6897
6898                         ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
6899                         if (ret)
6900                                 ath11k_warn(ab, "failed to start vdev %d: %d\n",
6901                                             arvif->vdev_id, ret);
6902
6903                         continue;
6904                 }
6905
6906                 ret = ath11k_mac_setup_bcn_tmpl(arvif);
6907                 if (ret)
6908                         ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6909                                     ret);
6910
6911                 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6912                                          arvif->bssid);
6913                 if (ret) {
6914                         ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
6915                                     arvif->vdev_id, ret);
6916                         continue;
6917                 }
6918         }
6919
6920         /* Restart the internal monitor vdev on new channel */
6921         if (!monitor_vif &&
6922             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
6923                 ret = ath11k_mac_monitor_stop(ar);
6924                 if (ret) {
6925                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
6926                                     ret);
6927                         return;
6928                 }
6929
6930                 ret = ath11k_mac_monitor_start(ar);
6931                 if (ret) {
6932                         ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
6933                                     ret);
6934                         return;
6935                 }
6936         }
6937 }
6938
6939 static void
6940 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
6941                                   struct ieee80211_chanctx_conf *ctx)
6942 {
6943         struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
6944
6945         lockdep_assert_held(&ar->conf_mutex);
6946
6947         ieee80211_iterate_active_interfaces_atomic(ar->hw,
6948                                                    IEEE80211_IFACE_ITER_NORMAL,
6949                                                    ath11k_mac_change_chanctx_cnt_iter,
6950                                                    &arg);
6951         if (arg.n_vifs == 0)
6952                 return;
6953
6954         arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6955         if (!arg.vifs)
6956                 return;
6957
6958         ieee80211_iterate_active_interfaces_atomic(ar->hw,
6959                                                    IEEE80211_IFACE_ITER_NORMAL,
6960                                                    ath11k_mac_change_chanctx_fill_iter,
6961                                                    &arg);
6962
6963         ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6964
6965         kfree(arg.vifs);
6966 }
6967
6968 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6969                                          struct ieee80211_chanctx_conf *ctx,
6970                                          u32 changed)
6971 {
6972         struct ath11k *ar = hw->priv;
6973         struct ath11k_base *ab = ar->ab;
6974
6975         mutex_lock(&ar->conf_mutex);
6976
6977         ath11k_dbg(ab, ATH11K_DBG_MAC,
6978                    "mac chanctx change freq %u width %d ptr %pK changed %x\n",
6979                    ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6980
6981         /* This shouldn't really happen because channel switching should use
6982          * switch_vif_chanctx().
6983          */
6984         if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6985                 goto unlock;
6986
6987         if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
6988             changed & IEEE80211_CHANCTX_CHANGE_RADAR)
6989                 ath11k_mac_update_active_vif_chan(ar, ctx);
6990
6991         /* TODO: Recalc radar detection */
6992
6993 unlock:
6994         mutex_unlock(&ar->conf_mutex);
6995 }
6996
6997 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
6998                                    struct ieee80211_vif *vif)
6999 {
7000         struct ath11k *ar = hw->priv;
7001         struct ath11k_base *ab = ar->ab;
7002         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7003         int ret;
7004
7005         if (WARN_ON(arvif->is_started))
7006                 return -EBUSY;
7007
7008         ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7009         if (ret) {
7010                 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7011                             arvif->vdev_id, vif->addr,
7012                             arvif->chanctx.def.chan->center_freq, ret);
7013                 return ret;
7014         }
7015
7016         /* Reconfigure hardware rate code since it is cleared by firmware.
7017          */
7018         if (ar->hw_rate_code > 0) {
7019                 u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7020
7021                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7022                                                     ar->hw_rate_code);
7023                 if (ret) {
7024                         ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7025                         return ret;
7026                 }
7027         }
7028
7029         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7030                 ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr);
7031                 if (ret) {
7032                         ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7033                         return ret;
7034                 }
7035         }
7036
7037         arvif->is_started = true;
7038
7039         /* TODO: Setup ps and cts/rts protection */
7040         return 0;
7041 }
7042
7043 static int
7044 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7045                                  struct ieee80211_vif *vif,
7046                                  struct ieee80211_bss_conf *link_conf,
7047                                  struct ieee80211_chanctx_conf *ctx)
7048 {
7049         struct ath11k *ar = hw->priv;
7050         struct ath11k_base *ab = ar->ab;
7051         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7052         int ret;
7053         struct peer_create_params param;
7054
7055         mutex_lock(&ar->conf_mutex);
7056
7057         ath11k_dbg(ab, ATH11K_DBG_MAC,
7058                    "mac chanctx assign ptr %pK vdev_id %i\n",
7059                    ctx, arvif->vdev_id);
7060
7061         /* for QCA6390 bss peer must be created before vdev_start */
7062         if (ab->hw_params.vdev_start_delay &&
7063             arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7064             arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7065             !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7066                 memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7067                 ret = 0;
7068                 goto out;
7069         }
7070
7071         if (WARN_ON(arvif->is_started)) {
7072                 ret = -EBUSY;
7073                 goto out;
7074         }
7075
7076         if (ab->hw_params.vdev_start_delay &&
7077             arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7078             arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
7079                 param.vdev_id = arvif->vdev_id;
7080                 param.peer_type = WMI_PEER_TYPE_DEFAULT;
7081                 param.peer_addr = ar->mac_addr;
7082
7083                 ret = ath11k_peer_create(ar, arvif, NULL, &param);
7084                 if (ret) {
7085                         ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
7086                                     ret);
7087                         goto out;
7088                 }
7089         }
7090
7091         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7092                 ret = ath11k_mac_monitor_start(ar);
7093                 if (ret) {
7094                         ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7095                                     ret);
7096                         goto out;
7097                 }
7098
7099                 arvif->is_started = true;
7100                 goto out;
7101         }
7102
7103         ret = ath11k_mac_vdev_start(arvif, ctx);
7104         if (ret) {
7105                 ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7106                             arvif->vdev_id, vif->addr,
7107                             ctx->def.chan->center_freq, ret);
7108                 goto out;
7109         }
7110
7111         arvif->is_started = true;
7112
7113         if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7114             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7115                 ret = ath11k_mac_monitor_start(ar);
7116                 if (ret) {
7117                         ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7118                                     ret);
7119                         goto out;
7120                 }
7121         }
7122
7123         /* TODO: Setup ps and cts/rts protection */
7124
7125         ret = 0;
7126
7127 out:
7128         mutex_unlock(&ar->conf_mutex);
7129
7130         return ret;
7131 }
7132
7133 static void
7134 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7135                                    struct ieee80211_vif *vif,
7136                                    struct ieee80211_bss_conf *link_conf,
7137                                    struct ieee80211_chanctx_conf *ctx)
7138 {
7139         struct ath11k *ar = hw->priv;
7140         struct ath11k_base *ab = ar->ab;
7141         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7142         struct ath11k_peer *peer;
7143         int ret;
7144
7145         mutex_lock(&ar->conf_mutex);
7146
7147         ath11k_dbg(ab, ATH11K_DBG_MAC,
7148                    "mac chanctx unassign ptr %pK vdev_id %i\n",
7149                    ctx, arvif->vdev_id);
7150
7151         WARN_ON(!arvif->is_started);
7152
7153         if (ab->hw_params.vdev_start_delay &&
7154             arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7155                 spin_lock_bh(&ab->base_lock);
7156                 peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
7157                 spin_unlock_bh(&ab->base_lock);
7158                 if (peer)
7159                         ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
7160         }
7161
7162         if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7163                 ret = ath11k_mac_monitor_stop(ar);
7164                 if (ret) {
7165                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7166                                     ret);
7167                         mutex_unlock(&ar->conf_mutex);
7168                         return;
7169                 }
7170
7171                 arvif->is_started = false;
7172                 mutex_unlock(&ar->conf_mutex);
7173                 return;
7174         }
7175
7176         ret = ath11k_mac_vdev_stop(arvif);
7177         if (ret)
7178                 ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7179                             arvif->vdev_id, ret);
7180
7181         arvif->is_started = false;
7182
7183         if (ab->hw_params.vdev_start_delay &&
7184             arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7185                 ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
7186                 if (ret)
7187                         ath11k_warn(ar->ab,
7188                                     "failed to delete peer %pM for vdev %d: %d\n",
7189                                     arvif->bssid, arvif->vdev_id, ret);
7190                 else
7191                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7192                                    "mac removed peer %pM  vdev %d after vdev stop\n",
7193                                    arvif->bssid, arvif->vdev_id);
7194         }
7195
7196         if (ab->hw_params.vdev_start_delay &&
7197             arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
7198                 ath11k_wmi_vdev_down(ar, arvif->vdev_id);
7199
7200         if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7201             ar->num_started_vdevs == 1 &&
7202             test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7203                 ret = ath11k_mac_monitor_stop(ar);
7204                 if (ret)
7205                         /* continue even if there's an error */
7206                         ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7207                                     ret);
7208         }
7209
7210         if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7211                 ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
7212
7213         mutex_unlock(&ar->conf_mutex);
7214 }
7215
7216 static int
7217 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7218                                  struct ieee80211_vif_chanctx_switch *vifs,
7219                                  int n_vifs,
7220                                  enum ieee80211_chanctx_switch_mode mode)
7221 {
7222         struct ath11k *ar = hw->priv;
7223
7224         mutex_lock(&ar->conf_mutex);
7225
7226         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7227                    "mac chanctx switch n_vifs %d mode %d\n",
7228                    n_vifs, mode);
7229         ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
7230
7231         mutex_unlock(&ar->conf_mutex);
7232
7233         return 0;
7234 }
7235
7236 static int
7237 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
7238 {
7239         struct ath11k_vif *arvif;
7240         int ret = 0;
7241
7242         mutex_lock(&ar->conf_mutex);
7243         list_for_each_entry(arvif, &ar->arvifs, list) {
7244                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
7245                            param, arvif->vdev_id, value);
7246
7247                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7248                                                     param, value);
7249                 if (ret) {
7250                         ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
7251                                     param, arvif->vdev_id, ret);
7252                         break;
7253                 }
7254         }
7255         mutex_unlock(&ar->conf_mutex);
7256         return ret;
7257 }
7258
7259 /* mac80211 stores device specific RTS/Fragmentation threshold value,
7260  * this is set interface specific to firmware from ath11k driver
7261  */
7262 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7263 {
7264         struct ath11k *ar = hw->priv;
7265         int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
7266
7267         return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
7268 }
7269
7270 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7271 {
7272         /* Even though there's a WMI vdev param for fragmentation threshold no
7273          * known firmware actually implements it. Moreover it is not possible to
7274          * rely frame fragmentation to mac80211 because firmware clears the
7275          * "more fragments" bit in frame control making it impossible for remote
7276          * devices to reassemble frames.
7277          *
7278          * Hence implement a dummy callback just to say fragmentation isn't
7279          * supported. This effectively prevents mac80211 from doing frame
7280          * fragmentation in software.
7281          */
7282         return -EOPNOTSUPP;
7283 }
7284
7285 static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
7286 {
7287         long time_left;
7288         int ret = 0;
7289
7290         time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
7291                                        (atomic_read(&ar->dp.num_tx_pending) == 0),
7292                                        ATH11K_FLUSH_TIMEOUT);
7293         if (time_left == 0) {
7294                 ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
7295                             atomic_read(&ar->dp.num_tx_pending));
7296                 ret = -ETIMEDOUT;
7297         }
7298
7299         time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
7300                                        (atomic_read(&ar->num_pending_mgmt_tx) == 0),
7301                                        ATH11K_FLUSH_TIMEOUT);
7302         if (time_left == 0) {
7303                 ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
7304                             atomic_read(&ar->num_pending_mgmt_tx));
7305                 ret = -ETIMEDOUT;
7306         }
7307
7308         return ret;
7309 }
7310
7311 int ath11k_mac_wait_tx_complete(struct ath11k *ar)
7312 {
7313         ath11k_mac_drain_tx(ar);
7314         return ath11k_mac_flush_tx_complete(ar);
7315 }
7316
7317 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7318                                 u32 queues, bool drop)
7319 {
7320         struct ath11k *ar = hw->priv;
7321
7322         if (drop)
7323                 return;
7324
7325         ath11k_mac_flush_tx_complete(ar);
7326 }
7327
7328 static int
7329 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
7330                                      enum nl80211_band band,
7331                                      const struct cfg80211_bitrate_mask *mask)
7332 {
7333         int num_rates = 0;
7334         int i;
7335
7336         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
7337                 num_rates += hweight16(mask->control[band].ht_mcs[i]);
7338
7339         return num_rates;
7340 }
7341
7342 static bool
7343 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
7344                                   enum nl80211_band band,
7345                                   const struct cfg80211_bitrate_mask *mask)
7346 {
7347         int num_rates = 0;
7348
7349         num_rates = hweight32(mask->control[band].legacy);
7350
7351         if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
7352                 return false;
7353
7354         if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
7355                 return false;
7356
7357         if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
7358                 return false;
7359
7360         return num_rates == 1;
7361 }
7362
7363 static __le16
7364 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
7365 {
7366         if (he_cap->he_cap_elem.phy_cap_info[0] &
7367             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
7368                 return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
7369
7370         if (he_cap->he_cap_elem.phy_cap_info[0] &
7371             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
7372                 return he_cap->he_mcs_nss_supp.tx_mcs_160;
7373
7374         return he_cap->he_mcs_nss_supp.tx_mcs_80;
7375 }
7376
7377 static bool
7378 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
7379                                        enum nl80211_band band,
7380                                        const struct cfg80211_bitrate_mask *mask,
7381                                        int *nss)
7382 {
7383         struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7384         u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7385         u16 he_mcs_map = 0;
7386         u8 ht_nss_mask = 0;
7387         u8 vht_nss_mask = 0;
7388         u8 he_nss_mask = 0;
7389         int i;
7390
7391         /* No need to consider legacy here. Basic rates are always present
7392          * in bitrate mask
7393          */
7394
7395         for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7396                 if (mask->control[band].ht_mcs[i] == 0)
7397                         continue;
7398                 else if (mask->control[band].ht_mcs[i] ==
7399                          sband->ht_cap.mcs.rx_mask[i])
7400                         ht_nss_mask |= BIT(i);
7401                 else
7402                         return false;
7403         }
7404
7405         for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7406                 if (mask->control[band].vht_mcs[i] == 0)
7407                         continue;
7408                 else if (mask->control[band].vht_mcs[i] ==
7409                          ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7410                         vht_nss_mask |= BIT(i);
7411                 else
7412                         return false;
7413         }
7414
7415         he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
7416
7417         for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
7418                 if (mask->control[band].he_mcs[i] == 0)
7419                         continue;
7420
7421                 if (mask->control[band].he_mcs[i] ==
7422                     ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
7423                         he_nss_mask |= BIT(i);
7424                 else
7425                         return false;
7426         }
7427
7428         if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
7429                 return false;
7430
7431         if (ht_nss_mask == 0)
7432                 return false;
7433
7434         if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7435                 return false;
7436
7437         *nss = fls(ht_nss_mask);
7438
7439         return true;
7440 }
7441
7442 static int
7443 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
7444                                   enum nl80211_band band,
7445                                   const struct cfg80211_bitrate_mask *mask,
7446                                   u32 *rate, u8 *nss)
7447 {
7448         int rate_idx;
7449         u16 bitrate;
7450         u8 preamble;
7451         u8 hw_rate;
7452
7453         if (hweight32(mask->control[band].legacy) != 1)
7454                 return -EINVAL;
7455
7456         rate_idx = ffs(mask->control[band].legacy) - 1;
7457
7458         if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7459                 rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
7460
7461         hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
7462         bitrate = ath11k_legacy_rates[rate_idx].bitrate;
7463
7464         if (ath11k_mac_bitrate_is_cck(bitrate))
7465                 preamble = WMI_RATE_PREAMBLE_CCK;
7466         else
7467                 preamble = WMI_RATE_PREAMBLE_OFDM;
7468
7469         *nss = 1;
7470         *rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
7471
7472         return 0;
7473 }
7474
7475 static int
7476 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
7477 {
7478         struct ath11k *ar = arvif->ar;
7479         int ret;
7480
7481         /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
7482         if (he_gi && he_gi != 0xFF)
7483                 he_gi += 1;
7484
7485         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7486                                             WMI_VDEV_PARAM_SGI, he_gi);
7487         if (ret) {
7488                 ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
7489                             he_gi, ret);
7490                 return ret;
7491         }
7492         /* start from 1 */
7493         if (he_ltf != 0xFF)
7494                 he_ltf += 1;
7495
7496         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7497                                             WMI_VDEV_PARAM_HE_LTF, he_ltf);
7498         if (ret) {
7499                 ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
7500                             he_ltf, ret);
7501                 return ret;
7502         }
7503
7504         return 0;
7505 }
7506
7507 static int
7508 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
7509 {
7510         struct ath11k *ar = arvif->ar;
7511         int ret;
7512         u32 he_ar_gi_ltf;
7513
7514         if (he_gi != 0xFF) {
7515                 switch (he_gi) {
7516                 case NL80211_RATE_INFO_HE_GI_0_8:
7517                         he_gi = WMI_AUTORATE_800NS_GI;
7518                         break;
7519                 case NL80211_RATE_INFO_HE_GI_1_6:
7520                         he_gi = WMI_AUTORATE_1600NS_GI;
7521                         break;
7522                 case NL80211_RATE_INFO_HE_GI_3_2:
7523                         he_gi = WMI_AUTORATE_3200NS_GI;
7524                         break;
7525                 default:
7526                         ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
7527                         return -EINVAL;
7528                 }
7529         }
7530
7531         if (he_ltf != 0xFF) {
7532                 switch (he_ltf) {
7533                 case NL80211_RATE_INFO_HE_1XLTF:
7534                         he_ltf = WMI_HE_AUTORATE_LTF_1X;
7535                         break;
7536                 case NL80211_RATE_INFO_HE_2XLTF:
7537                         he_ltf = WMI_HE_AUTORATE_LTF_2X;
7538                         break;
7539                 case NL80211_RATE_INFO_HE_4XLTF:
7540                         he_ltf = WMI_HE_AUTORATE_LTF_4X;
7541                         break;
7542                 default:
7543                         ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
7544                         return -EINVAL;
7545                 }
7546         }
7547
7548         he_ar_gi_ltf = he_gi | he_ltf;
7549         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7550                                             WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
7551                                             he_ar_gi_ltf);
7552         if (ret) {
7553                 ath11k_warn(ar->ab,
7554                             "failed to set he autorate gi %u ltf %u: %d\n",
7555                             he_gi, he_ltf, ret);
7556                 return ret;
7557         }
7558
7559         return 0;
7560 }
7561
7562 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
7563                                       u32 rate, u8 nss, u8 sgi, u8 ldpc,
7564                                       u8 he_gi, u8 he_ltf, bool he_fixed_rate)
7565 {
7566         struct ath11k *ar = arvif->ar;
7567         u32 vdev_param;
7568         int ret;
7569
7570         lockdep_assert_held(&ar->conf_mutex);
7571
7572         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7573                    "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",
7574                    arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
7575                    he_ltf, he_fixed_rate);
7576
7577         if (!arvif->vif->bss_conf.he_support) {
7578                 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
7579                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7580                                                     vdev_param, rate);
7581                 if (ret) {
7582                         ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
7583                                     rate, ret);
7584                         return ret;
7585                 }
7586         }
7587
7588         vdev_param = WMI_VDEV_PARAM_NSS;
7589         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7590                                             vdev_param, nss);
7591         if (ret) {
7592                 ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
7593                             nss, ret);
7594                 return ret;
7595         }
7596
7597         vdev_param = WMI_VDEV_PARAM_LDPC;
7598         ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7599                                             vdev_param, ldpc);
7600         if (ret) {
7601                 ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
7602                             ldpc, ret);
7603                 return ret;
7604         }
7605
7606         if (arvif->vif->bss_conf.he_support) {
7607                 if (he_fixed_rate) {
7608                         ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
7609                                                                he_ltf);
7610                         if (ret) {
7611                                 ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
7612                                             ret);
7613                                 return ret;
7614                         }
7615                 } else {
7616                         ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
7617                                                               he_ltf);
7618                         if (ret) {
7619                                 ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
7620                                             ret);
7621                                 return ret;
7622                         }
7623                 }
7624         } else {
7625                 vdev_param = WMI_VDEV_PARAM_SGI;
7626                 ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7627                                                     vdev_param, sgi);
7628                 if (ret) {
7629                         ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
7630                                     sgi, ret);
7631                         return ret;
7632                 }
7633         }
7634
7635         return 0;
7636 }
7637
7638 static bool
7639 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
7640                                  enum nl80211_band band,
7641                                  const struct cfg80211_bitrate_mask *mask)
7642 {
7643         int i;
7644         u16 vht_mcs;
7645
7646         for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7647                 vht_mcs = mask->control[band].vht_mcs[i];
7648
7649                 switch (vht_mcs) {
7650                 case 0:
7651                 case BIT(8) - 1:
7652                 case BIT(9) - 1:
7653                 case BIT(10) - 1:
7654                         break;
7655                 default:
7656                         return false;
7657                 }
7658         }
7659
7660         return true;
7661 }
7662
7663 static bool
7664 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
7665                                 enum nl80211_band band,
7666                                 const struct cfg80211_bitrate_mask *mask)
7667 {
7668         int i;
7669         u16 he_mcs;
7670
7671         for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
7672                 he_mcs = mask->control[band].he_mcs[i];
7673
7674                 switch (he_mcs) {
7675                 case 0:
7676                 case BIT(8) - 1:
7677                 case BIT(10) - 1:
7678                 case BIT(12) - 1:
7679                         break;
7680                 default:
7681                         return false;
7682                 }
7683         }
7684
7685         return true;
7686 }
7687
7688 static void ath11k_mac_set_bitrate_mask_iter(void *data,
7689                                              struct ieee80211_sta *sta)
7690 {
7691         struct ath11k_vif *arvif = data;
7692         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
7693         struct ath11k *ar = arvif->ar;
7694
7695         spin_lock_bh(&ar->data_lock);
7696         arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7697         spin_unlock_bh(&ar->data_lock);
7698
7699         ieee80211_queue_work(ar->hw, &arsta->update_wk);
7700 }
7701
7702 static void ath11k_mac_disable_peer_fixed_rate(void *data,
7703                                                struct ieee80211_sta *sta)
7704 {
7705         struct ath11k_vif *arvif = data;
7706         struct ath11k *ar = arvif->ar;
7707         int ret;
7708
7709         ret = ath11k_wmi_set_peer_param(ar, sta->addr,
7710                                         arvif->vdev_id,
7711                                         WMI_PEER_PARAM_FIXED_RATE,
7712                                         WMI_FIXED_RATE_NONE);
7713         if (ret)
7714                 ath11k_warn(ar->ab,
7715                             "failed to disable peer fixed rate for STA %pM ret %d\n",
7716                             sta->addr, ret);
7717 }
7718
7719 static bool
7720 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
7721                                                const struct cfg80211_bitrate_mask *mask)
7722 {
7723         bool he_fixed_rate = false, vht_fixed_rate = false;
7724         struct ath11k_peer *peer, *tmp;
7725         const u16 *vht_mcs_mask, *he_mcs_mask;
7726         struct ieee80211_link_sta *deflink;
7727         u8 vht_nss, he_nss;
7728         bool ret = true;
7729
7730         vht_mcs_mask = mask->control[band].vht_mcs;
7731         he_mcs_mask = mask->control[band].he_mcs;
7732
7733         if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
7734                 vht_fixed_rate = true;
7735
7736         if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
7737                 he_fixed_rate = true;
7738
7739         if (!vht_fixed_rate && !he_fixed_rate)
7740                 return true;
7741
7742         vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
7743         he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
7744
7745         rcu_read_lock();
7746         spin_lock_bh(&ar->ab->base_lock);
7747         list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
7748                 if (peer->sta) {
7749                         deflink = &peer->sta->deflink;
7750
7751                         if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
7752                                                deflink->rx_nss < vht_nss)) {
7753                                 ret = false;
7754                                 goto out;
7755                         }
7756
7757                         if (he_fixed_rate && (!deflink->he_cap.has_he ||
7758                                               deflink->rx_nss < he_nss)) {
7759                                 ret = false;
7760                                 goto out;
7761                         }
7762                 }
7763         }
7764
7765 out:
7766         spin_unlock_bh(&ar->ab->base_lock);
7767         rcu_read_unlock();
7768         return ret;
7769 }
7770
7771 static int
7772 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7773                                struct ieee80211_vif *vif,
7774                                const struct cfg80211_bitrate_mask *mask)
7775 {
7776         struct ath11k_vif *arvif = (void *)vif->drv_priv;
7777         struct cfg80211_chan_def def;
7778         struct ath11k_pdev_cap *cap;
7779         struct ath11k *ar = arvif->ar;
7780         enum nl80211_band band;
7781         const u8 *ht_mcs_mask;
7782         const u16 *vht_mcs_mask;
7783         const u16 *he_mcs_mask;
7784         u8 he_ltf = 0;
7785         u8 he_gi = 0;
7786         u32 rate;
7787         u8 nss;
7788         u8 sgi;
7789         u8 ldpc;
7790         int single_nss;
7791         int ret;
7792         int num_rates;
7793         bool he_fixed_rate = false;
7794
7795         if (ath11k_mac_vif_chan(vif, &def))
7796                 return -EPERM;
7797
7798         band = def.chan->band;
7799         cap = &ar->pdev->cap;
7800         ht_mcs_mask = mask->control[band].ht_mcs;
7801         vht_mcs_mask = mask->control[band].vht_mcs;
7802         he_mcs_mask = mask->control[band].he_mcs;
7803         ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
7804
7805         sgi = mask->control[band].gi;
7806         if (sgi == NL80211_TXRATE_FORCE_LGI)
7807                 return -EINVAL;
7808
7809         he_gi = mask->control[band].he_gi;
7810         he_ltf = mask->control[band].he_ltf;
7811
7812         /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
7813          * requires passing at least one of used basic rates along with them.
7814          * Fixed rate setting across different preambles(legacy, HT, VHT) is
7815          * not supported by the FW. Hence use of FIXED_RATE vdev param is not
7816          * suitable for setting single HT/VHT rates.
7817          * But, there could be a single basic rate passed from userspace which
7818          * can be done through the FIXED_RATE param.
7819          */
7820         if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
7821                 ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
7822                                                         &nss);
7823                 if (ret) {
7824                         ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
7825                                     arvif->vdev_id, ret);
7826                         return ret;
7827                 }
7828                 ieee80211_iterate_stations_atomic(ar->hw,
7829                                                   ath11k_mac_disable_peer_fixed_rate,
7830                                                   arvif);
7831         } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7832                                                           &single_nss)) {
7833                 rate = WMI_FIXED_RATE_NONE;
7834                 nss = single_nss;
7835                 mutex_lock(&ar->conf_mutex);
7836                 arvif->bitrate_mask = *mask;
7837                 ieee80211_iterate_stations_atomic(ar->hw,
7838                                                   ath11k_mac_set_bitrate_mask_iter,
7839                                                   arvif);
7840                 mutex_unlock(&ar->conf_mutex);
7841         } else {
7842                 rate = WMI_FIXED_RATE_NONE;
7843
7844                 if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
7845                         ath11k_warn(ar->ab,
7846                                     "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
7847                 nss = min_t(u32, ar->num_tx_chains,
7848                             max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
7849                                     ath11k_mac_max_vht_nss(vht_mcs_mask)),
7850                                 ath11k_mac_max_he_nss(he_mcs_mask)));
7851
7852                 /* If multiple rates across different preambles are given
7853                  * we can reconfigure this info with all peers using PEER_ASSOC
7854                  * command with the below exception cases.
7855                  * - Single VHT Rate : peer_assoc command accommodates only MCS
7856                  * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
7857                  * mandates passing basic rates along with HT/VHT rates, FW
7858                  * doesn't allow switching from VHT to Legacy. Hence instead of
7859                  * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
7860                  * we could set this VHT rate as peer fixed rate param, which
7861                  * will override FIXED rate and FW rate control algorithm.
7862                  * If single VHT rate is passed along with HT rates, we select
7863                  * the VHT rate as fixed rate for vht peers.
7864                  * - Multiple VHT Rates : When Multiple VHT rates are given,this
7865                  * can be set using RATEMASK CMD which uses FW rate-ctl alg.
7866                  * TODO: Setting multiple VHT MCS and replacing peer_assoc with
7867                  * RATEMASK_CMDID can cover all use cases of setting rates
7868                  * across multiple preambles and rates within same type.
7869                  * But requires more validation of the command at this point.
7870                  */
7871
7872                 num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
7873                                                                   mask);
7874
7875                 if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
7876                     num_rates > 1) {
7877                         /* TODO: Handle multiple VHT MCS values setting using
7878                          * RATEMASK CMD
7879                          */
7880                         ath11k_warn(ar->ab,
7881                                     "setting %d mcs values in bitrate mask not supported\n",
7882                                 num_rates);
7883                         return -EINVAL;
7884                 }
7885
7886                 num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
7887                                                                  mask);
7888                 if (num_rates == 1)
7889                         he_fixed_rate = true;
7890
7891                 if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
7892                     num_rates > 1) {
7893                         ath11k_warn(ar->ab,
7894                                     "Setting more than one HE MCS Value in bitrate mask not supported\n");
7895                         return -EINVAL;
7896                 }
7897
7898                 mutex_lock(&ar->conf_mutex);
7899                 ieee80211_iterate_stations_atomic(ar->hw,
7900                                                   ath11k_mac_disable_peer_fixed_rate,
7901                                                   arvif);
7902
7903                 arvif->bitrate_mask = *mask;
7904                 ieee80211_iterate_stations_atomic(ar->hw,
7905                                                   ath11k_mac_set_bitrate_mask_iter,
7906                                                   arvif);
7907
7908                 mutex_unlock(&ar->conf_mutex);
7909         }
7910
7911         mutex_lock(&ar->conf_mutex);
7912
7913         ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
7914                                          he_ltf, he_fixed_rate);
7915         if (ret) {
7916                 ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
7917                             arvif->vdev_id, ret);
7918         }
7919
7920         mutex_unlock(&ar->conf_mutex);
7921
7922         return ret;
7923 }
7924
7925 static void
7926 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
7927                                 enum ieee80211_reconfig_type reconfig_type)
7928 {
7929         struct ath11k *ar = hw->priv;
7930         struct ath11k_base *ab = ar->ab;
7931         int recovery_count;
7932
7933         if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7934                 return;
7935
7936         mutex_lock(&ar->conf_mutex);
7937
7938         if (ar->state == ATH11K_STATE_RESTARTED) {
7939                 ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
7940                             ar->pdev->pdev_id);
7941                 ar->state = ATH11K_STATE_ON;
7942                 ieee80211_wake_queues(ar->hw);
7943
7944                 if (ar->ab->hw_params.current_cc_support &&
7945                     ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
7946                         struct wmi_set_current_country_params set_current_param = {};
7947
7948                         memcpy(&set_current_param.alpha2, ar->alpha2, 2);
7949                         ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
7950                 }
7951
7952                 if (ab->is_reset) {
7953                         recovery_count = atomic_inc_return(&ab->recovery_count);
7954                         ath11k_dbg(ab, ATH11K_DBG_BOOT,
7955                                    "recovery count %d\n", recovery_count);
7956                         /* When there are multiple radios in an SOC,
7957                          * the recovery has to be done for each radio
7958                          */
7959                         if (recovery_count == ab->num_radios) {
7960                                 atomic_dec(&ab->reset_count);
7961                                 complete(&ab->reset_complete);
7962                                 ab->is_reset = false;
7963                                 atomic_set(&ab->fail_cont_count, 0);
7964                                 ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
7965                         }
7966                 }
7967         }
7968
7969         mutex_unlock(&ar->conf_mutex);
7970 }
7971
7972 static void
7973 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
7974                                   struct ieee80211_channel *channel)
7975 {
7976         int ret;
7977         enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
7978
7979         lockdep_assert_held(&ar->conf_mutex);
7980
7981         if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
7982             ar->rx_channel != channel)
7983                 return;
7984
7985         if (ar->scan.state != ATH11K_SCAN_IDLE) {
7986                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7987                            "ignoring bss chan info req while scanning..\n");
7988                 return;
7989         }
7990
7991         reinit_completion(&ar->bss_survey_done);
7992
7993         ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
7994         if (ret) {
7995                 ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
7996                 return;
7997         }
7998
7999         ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8000         if (ret == 0)
8001                 ath11k_warn(ar->ab, "bss channel survey timed out\n");
8002 }
8003
8004 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8005                                     struct survey_info *survey)
8006 {
8007         struct ath11k *ar = hw->priv;
8008         struct ieee80211_supported_band *sband;
8009         struct survey_info *ar_survey;
8010         int ret = 0;
8011
8012         if (idx >= ATH11K_NUM_CHANS)
8013                 return -ENOENT;
8014
8015         ar_survey = &ar->survey[idx];
8016
8017         mutex_lock(&ar->conf_mutex);
8018
8019         sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8020         if (sband && idx >= sband->n_channels) {
8021                 idx -= sband->n_channels;
8022                 sband = NULL;
8023         }
8024
8025         if (!sband)
8026                 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8027         if (sband && idx >= sband->n_channels) {
8028                 idx -= sband->n_channels;
8029                 sband = NULL;
8030         }
8031
8032         if (!sband)
8033                 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8034         if (!sband || idx >= sband->n_channels) {
8035                 ret = -ENOENT;
8036                 goto exit;
8037         }
8038
8039         ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8040
8041         spin_lock_bh(&ar->data_lock);
8042         memcpy(survey, ar_survey, sizeof(*survey));
8043         spin_unlock_bh(&ar->data_lock);
8044
8045         survey->channel = &sband->channels[idx];
8046
8047         if (ar->rx_channel == survey->channel)
8048                 survey->filled |= SURVEY_INFO_IN_USE;
8049
8050 exit:
8051         mutex_unlock(&ar->conf_mutex);
8052         return ret;
8053 }
8054
8055 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8056                                       struct ath11k_sta *arsta,
8057                                       char *pre,
8058                                       bool clear)
8059 {
8060         struct ath11k *ar = arsta->arvif->ar;
8061         int i;
8062         s8 rssi;
8063
8064         for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8065                 sinfo->chains &= ~BIT(i);
8066                 rssi = arsta->chain_signal[i];
8067                 if (clear)
8068                         arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8069
8070                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8071                            "mac sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8072
8073                 if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8074                     rssi != ATH11K_INVALID_RSSI_FULL &&
8075                     rssi != ATH11K_INVALID_RSSI_EMPTY &&
8076                     rssi != 0) {
8077                         sinfo->chain_signal[i] = rssi;
8078                         sinfo->chains |= BIT(i);
8079                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8080                 }
8081         }
8082 }
8083
8084 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8085                                          struct ieee80211_vif *vif,
8086                                          struct ieee80211_sta *sta,
8087                                          struct station_info *sinfo)
8088 {
8089         struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
8090         struct ath11k *ar = arsta->arvif->ar;
8091         s8 signal;
8092         bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8093                                ar->ab->wmi_ab.svc_map);
8094
8095         sinfo->rx_duration = arsta->rx_duration;
8096         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8097
8098         sinfo->tx_duration = arsta->tx_duration;
8099         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8100
8101         if (arsta->txrate.legacy || arsta->txrate.nss) {
8102                 if (arsta->txrate.legacy) {
8103                         sinfo->txrate.legacy = arsta->txrate.legacy;
8104                 } else {
8105                         sinfo->txrate.mcs = arsta->txrate.mcs;
8106                         sinfo->txrate.nss = arsta->txrate.nss;
8107                         sinfo->txrate.bw = arsta->txrate.bw;
8108                         sinfo->txrate.he_gi = arsta->txrate.he_gi;
8109                         sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8110                         sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8111                 }
8112                 sinfo->txrate.flags = arsta->txrate.flags;
8113                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8114         }
8115
8116         ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8117
8118         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8119             arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8120             ar->ab->hw_params.supports_rssi_stats &&
8121             !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8122                                          WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8123                 ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8124         }
8125
8126         signal = arsta->rssi_comb;
8127         if (!signal &&
8128             arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8129             ar->ab->hw_params.supports_rssi_stats &&
8130             !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8131                                         WMI_REQUEST_VDEV_STAT)))
8132                 signal = arsta->rssi_beacon;
8133
8134         ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8135                    "mac sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8136                    db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8137
8138         if (signal) {
8139                 sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8140                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8141         }
8142
8143         sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
8144                 ATH11K_DEFAULT_NOISE_FLOOR;
8145         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8146 }
8147
8148 #if IS_ENABLED(CONFIG_IPV6)
8149 static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
8150                                        struct ath11k_arp_ns_offload *offload)
8151 {
8152         int i;
8153
8154         for (i = 0; i < offload->ipv6_count; i++) {
8155                 offload->self_ipv6_addr[i][0] = 0xff;
8156                 offload->self_ipv6_addr[i][1] = 0x02;
8157                 offload->self_ipv6_addr[i][11] = 0x01;
8158                 offload->self_ipv6_addr[i][12] = 0xff;
8159                 offload->self_ipv6_addr[i][13] =
8160                                         offload->ipv6_addr[i][13];
8161                 offload->self_ipv6_addr[i][14] =
8162                                         offload->ipv6_addr[i][14];
8163                 offload->self_ipv6_addr[i][15] =
8164                                         offload->ipv6_addr[i][15];
8165                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
8166                            offload->self_ipv6_addr[i]);
8167         }
8168 }
8169
8170 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
8171                                        struct ieee80211_vif *vif,
8172                                        struct inet6_dev *idev)
8173 {
8174         struct ath11k *ar = hw->priv;
8175         struct ath11k_arp_ns_offload *offload;
8176         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8177         struct inet6_ifaddr *ifa6;
8178         struct ifacaddr6 *ifaca6;
8179         struct list_head *p;
8180         u32 count, scope;
8181
8182         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac op ipv6 changed\n");
8183
8184         offload = &arvif->arp_ns_offload;
8185         count = 0;
8186
8187         read_lock_bh(&idev->lock);
8188
8189         memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
8190         memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
8191         memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
8192
8193         /* get unicast address */
8194         list_for_each(p, &idev->addr_list) {
8195                 if (count >= ATH11K_IPV6_MAX_COUNT)
8196                         goto generate;
8197
8198                 ifa6 = list_entry(p, struct inet6_ifaddr, if_list);
8199                 if (ifa6->flags & IFA_F_DADFAILED)
8200                         continue;
8201                 scope = ipv6_addr_src_scope(&ifa6->addr);
8202                 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8203                     scope == IPV6_ADDR_SCOPE_GLOBAL) {
8204                         memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
8205                                sizeof(ifa6->addr.s6_addr));
8206                         offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
8207                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac count %d ipv6 uc %pI6 scope %d\n",
8208                                    count, offload->ipv6_addr[count],
8209                                    scope);
8210                         count++;
8211                 } else {
8212                         ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
8213                 }
8214         }
8215
8216         /* get anycast address */
8217         for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) {
8218                 if (count >= ATH11K_IPV6_MAX_COUNT)
8219                         goto generate;
8220
8221                 scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
8222                 if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8223                     scope == IPV6_ADDR_SCOPE_GLOBAL) {
8224                         memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
8225                                sizeof(ifaca6->aca_addr));
8226                         offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
8227                         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac count %d ipv6 ac %pI6 scope %d\n",
8228                                    count, offload->ipv6_addr[count],
8229                                    scope);
8230                         count++;
8231                 } else {
8232                         ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
8233                 }
8234         }
8235
8236 generate:
8237         offload->ipv6_count = count;
8238         read_unlock_bh(&idev->lock);
8239
8240         /* generate ns multicast address */
8241         ath11k_generate_ns_mc_addr(ar, offload);
8242 }
8243 #endif
8244
8245 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
8246                                          struct ieee80211_vif *vif,
8247                                          struct cfg80211_gtk_rekey_data *data)
8248 {
8249         struct ath11k *ar = hw->priv;
8250         struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8251         struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
8252
8253         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac set rekey data vdev %d\n",
8254                    arvif->vdev_id);
8255
8256         mutex_lock(&ar->conf_mutex);
8257
8258         memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
8259         memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
8260
8261         /* The supplicant works on big-endian, the firmware expects it on
8262          * little endian.
8263          */
8264         rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
8265
8266         arvif->rekey_data.enable_offload = true;
8267
8268         ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
8269                         rekey_data->kck, NL80211_KCK_LEN);
8270         ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
8271                         rekey_data->kck, NL80211_KEK_LEN);
8272         ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
8273                         &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
8274
8275         mutex_unlock(&ar->conf_mutex);
8276 }
8277
8278 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
8279                                             const struct cfg80211_sar_specs *sar)
8280 {
8281         struct ath11k *ar = hw->priv;
8282         const struct cfg80211_sar_sub_specs *sspec;
8283         int ret, index;
8284         u8 *sar_tbl;
8285         u32 i;
8286
8287         if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
8288             sar->num_sub_specs == 0)
8289                 return -EINVAL;
8290
8291         mutex_lock(&ar->conf_mutex);
8292
8293         if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
8294             !ar->ab->hw_params.bios_sar_capa) {
8295                 ret = -EOPNOTSUPP;
8296                 goto exit;
8297         }
8298
8299         ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
8300         if (ret) {
8301                 ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
8302                 goto exit;
8303         }
8304
8305         sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
8306         if (!sar_tbl) {
8307                 ret = -ENOMEM;
8308                 goto exit;
8309         }
8310
8311         sspec = sar->sub_specs;
8312         for (i = 0; i < sar->num_sub_specs; i++) {
8313                 if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
8314                         ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
8315                                     sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
8316                         continue;
8317                 }
8318
8319                 /* chain0 and chain1 share same power setting */
8320                 sar_tbl[sspec->freq_range_index] = sspec->power;
8321                 index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
8322                 sar_tbl[index] = sspec->power;
8323                 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
8324                            sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
8325                 sspec++;
8326         }
8327
8328         ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
8329         if (ret)
8330                 ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
8331
8332         kfree(sar_tbl);
8333 exit:
8334         mutex_unlock(&ar->conf_mutex);
8335
8336         return ret;
8337 }
8338
8339 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
8340                                                   struct ieee80211_vif *vif)
8341 {
8342         struct ath11k *ar = hw->priv;
8343
8344         mutex_lock(&ar->conf_mutex);
8345
8346         spin_lock_bh(&ar->data_lock);
8347         ar->scan.roc_notify = false;
8348         spin_unlock_bh(&ar->data_lock);
8349
8350         ath11k_scan_abort(ar);
8351
8352         mutex_unlock(&ar->conf_mutex);
8353
8354         cancel_delayed_work_sync(&ar->scan.timeout);
8355
8356         return 0;
8357 }
8358
8359 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
8360                                            struct ieee80211_vif *vif,
8361                                            struct ieee80211_channel *chan,
8362                                            int duration,
8363                                            enum ieee80211_roc_type type)
8364 {
8365         struct ath11k *ar = hw->priv;
8366         struct ath11k_vif *arvif = (void *)vif->drv_priv;
8367         struct scan_req_params arg;
8368         int ret;
8369         u32 scan_time_msec;
8370
8371         mutex_lock(&ar->conf_mutex);
8372
8373         spin_lock_bh(&ar->data_lock);
8374         switch (ar->scan.state) {
8375         case ATH11K_SCAN_IDLE:
8376                 reinit_completion(&ar->scan.started);
8377                 reinit_completion(&ar->scan.completed);
8378                 reinit_completion(&ar->scan.on_channel);
8379                 ar->scan.state = ATH11K_SCAN_STARTING;
8380                 ar->scan.is_roc = true;
8381                 ar->scan.vdev_id = arvif->vdev_id;
8382                 ar->scan.roc_freq = chan->center_freq;
8383                 ar->scan.roc_notify = true;
8384                 ret = 0;
8385                 break;
8386         case ATH11K_SCAN_STARTING:
8387         case ATH11K_SCAN_RUNNING:
8388         case ATH11K_SCAN_ABORTING:
8389                 ret = -EBUSY;
8390                 break;
8391         }
8392         spin_unlock_bh(&ar->data_lock);
8393
8394         if (ret)
8395                 goto exit;
8396
8397         scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
8398
8399         memset(&arg, 0, sizeof(arg));
8400         ath11k_wmi_start_scan_init(ar, &arg);
8401         arg.num_chan = 1;
8402         arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
8403                                 GFP_KERNEL);
8404         if (!arg.chan_list) {
8405                 ret = -ENOMEM;
8406                 goto exit;
8407         }
8408
8409         arg.vdev_id = arvif->vdev_id;
8410         arg.scan_id = ATH11K_SCAN_ID;
8411         arg.chan_list[0] = chan->center_freq;
8412         arg.dwell_time_active = scan_time_msec;
8413         arg.dwell_time_passive = scan_time_msec;
8414         arg.max_scan_time = scan_time_msec;
8415         arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
8416         arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
8417         arg.burst_duration = duration;
8418
8419         ret = ath11k_start_scan(ar, &arg);
8420         if (ret) {
8421                 ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
8422
8423                 spin_lock_bh(&ar->data_lock);
8424                 ar->scan.state = ATH11K_SCAN_IDLE;
8425                 spin_unlock_bh(&ar->data_lock);
8426                 goto free_chan_list;
8427         }
8428
8429         ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
8430         if (ret == 0) {
8431                 ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
8432                 ret = ath11k_scan_stop(ar);
8433                 if (ret)
8434                         ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
8435                 ret = -ETIMEDOUT;
8436                 goto free_chan_list;
8437         }
8438
8439         ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
8440                                      msecs_to_jiffies(duration));
8441
8442         ret = 0;
8443
8444 free_chan_list:
8445         kfree(arg.chan_list);
8446 exit:
8447         mutex_unlock(&ar->conf_mutex);
8448         return ret;
8449 }
8450
8451 static int ath11k_fw_stats_request(struct ath11k *ar,
8452                                    struct stats_request_params *req_param)
8453 {
8454         struct ath11k_base *ab = ar->ab;
8455         unsigned long time_left;
8456         int ret;
8457
8458         lockdep_assert_held(&ar->conf_mutex);
8459
8460         spin_lock_bh(&ar->data_lock);
8461         ar->fw_stats_done = false;
8462         ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
8463         spin_unlock_bh(&ar->data_lock);
8464
8465         reinit_completion(&ar->fw_stats_complete);
8466
8467         ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
8468         if (ret) {
8469                 ath11k_warn(ab, "could not request fw stats (%d)\n",
8470                             ret);
8471                 return ret;
8472         }
8473
8474         time_left = wait_for_completion_timeout(&ar->fw_stats_complete,
8475                                                 1 * HZ);
8476
8477         if (!time_left)
8478                 return -ETIMEDOUT;
8479
8480         return 0;
8481 }
8482
8483 static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
8484                                      struct ieee80211_vif *vif,
8485                                      int *dbm)
8486 {
8487         struct ath11k *ar = hw->priv;
8488         struct ath11k_base *ab = ar->ab;
8489         struct stats_request_params req_param = {0};
8490         struct ath11k_fw_stats_pdev *pdev;
8491         int ret;
8492
8493         /* Final Tx power is minimum of Target Power, CTL power, Regulatory
8494          * Power, PSD EIRP Power. We just know the Regulatory power from the
8495          * regulatory rules obtained. FW knows all these power and sets the min
8496          * of these. Hence, we request the FW pdev stats in which FW reports
8497          * the minimum of all vdev's channel Tx power.
8498          */
8499         mutex_lock(&ar->conf_mutex);
8500
8501         if (ar->state != ATH11K_STATE_ON)
8502                 goto err_fallback;
8503
8504         req_param.pdev_id = ar->pdev->pdev_id;
8505         req_param.stats_id = WMI_REQUEST_PDEV_STAT;
8506
8507         ret = ath11k_fw_stats_request(ar, &req_param);
8508         if (ret) {
8509                 ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
8510                 goto err_fallback;
8511         }
8512
8513         spin_lock_bh(&ar->data_lock);
8514         pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
8515                                         struct ath11k_fw_stats_pdev, list);
8516         if (!pdev) {
8517                 spin_unlock_bh(&ar->data_lock);
8518                 goto err_fallback;
8519         }
8520
8521         /* tx power is set as 2 units per dBm in FW. */
8522         *dbm = pdev->chan_tx_power / 2;
8523
8524         spin_unlock_bh(&ar->data_lock);
8525         mutex_unlock(&ar->conf_mutex);
8526
8527         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
8528                    pdev->chan_tx_power, *dbm);
8529         return 0;
8530
8531 err_fallback:
8532         mutex_unlock(&ar->conf_mutex);
8533         /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
8534         *dbm = vif->bss_conf.txpower;
8535         ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
8536                    *dbm);
8537         return 0;
8538 }
8539
8540 static const struct ieee80211_ops ath11k_ops = {
8541         .tx                             = ath11k_mac_op_tx,
8542         .start                          = ath11k_mac_op_start,
8543         .stop                           = ath11k_mac_op_stop,
8544         .reconfig_complete              = ath11k_mac_op_reconfig_complete,
8545         .add_interface                  = ath11k_mac_op_add_interface,
8546         .remove_interface               = ath11k_mac_op_remove_interface,
8547         .update_vif_offload             = ath11k_mac_op_update_vif_offload,
8548         .config                         = ath11k_mac_op_config,
8549         .bss_info_changed               = ath11k_mac_op_bss_info_changed,
8550         .configure_filter               = ath11k_mac_op_configure_filter,
8551         .hw_scan                        = ath11k_mac_op_hw_scan,
8552         .cancel_hw_scan                 = ath11k_mac_op_cancel_hw_scan,
8553         .set_key                        = ath11k_mac_op_set_key,
8554         .set_rekey_data                 = ath11k_mac_op_set_rekey_data,
8555         .sta_state                      = ath11k_mac_op_sta_state,
8556         .sta_set_4addr                  = ath11k_mac_op_sta_set_4addr,
8557         .sta_set_txpwr                  = ath11k_mac_op_sta_set_txpwr,
8558         .sta_rc_update                  = ath11k_mac_op_sta_rc_update,
8559         .conf_tx                        = ath11k_mac_op_conf_tx,
8560         .set_antenna                    = ath11k_mac_op_set_antenna,
8561         .get_antenna                    = ath11k_mac_op_get_antenna,
8562         .ampdu_action                   = ath11k_mac_op_ampdu_action,
8563         .add_chanctx                    = ath11k_mac_op_add_chanctx,
8564         .remove_chanctx                 = ath11k_mac_op_remove_chanctx,
8565         .change_chanctx                 = ath11k_mac_op_change_chanctx,
8566         .assign_vif_chanctx             = ath11k_mac_op_assign_vif_chanctx,
8567         .unassign_vif_chanctx           = ath11k_mac_op_unassign_vif_chanctx,
8568         .switch_vif_chanctx             = ath11k_mac_op_switch_vif_chanctx,
8569         .set_rts_threshold              = ath11k_mac_op_set_rts_threshold,
8570         .set_frag_threshold             = ath11k_mac_op_set_frag_threshold,
8571         .set_bitrate_mask               = ath11k_mac_op_set_bitrate_mask,
8572         .get_survey                     = ath11k_mac_op_get_survey,
8573         .flush                          = ath11k_mac_op_flush,
8574         .sta_statistics                 = ath11k_mac_op_sta_statistics,
8575         CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
8576
8577 #ifdef CONFIG_PM
8578         .suspend                        = ath11k_wow_op_suspend,
8579         .resume                         = ath11k_wow_op_resume,
8580         .set_wakeup                     = ath11k_wow_op_set_wakeup,
8581 #endif
8582
8583 #ifdef CONFIG_ATH11K_DEBUGFS
8584         .sta_add_debugfs                = ath11k_debugfs_sta_op_add,
8585 #endif
8586
8587 #if IS_ENABLED(CONFIG_IPV6)
8588         .ipv6_addr_change = ath11k_mac_op_ipv6_changed,
8589 #endif
8590         .get_txpower                    = ath11k_mac_op_get_txpower,
8591
8592         .set_sar_specs                  = ath11k_mac_op_set_bios_sar_specs,
8593         .remain_on_channel              = ath11k_mac_op_remain_on_channel,
8594         .cancel_remain_on_channel       = ath11k_mac_op_cancel_remain_on_channel,
8595 };
8596
8597 static void ath11k_mac_update_ch_list(struct ath11k *ar,
8598                                       struct ieee80211_supported_band *band,
8599                                       u32 freq_low, u32 freq_high)
8600 {
8601         int i;
8602
8603         if (!(freq_low && freq_high))
8604                 return;
8605
8606         for (i = 0; i < band->n_channels; i++) {
8607                 if (band->channels[i].center_freq < freq_low ||
8608                     band->channels[i].center_freq > freq_high)
8609                         band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
8610         }
8611 }
8612
8613 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
8614 {
8615         struct ath11k_pdev *pdev = ar->pdev;
8616         struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
8617
8618         if (band == WMI_HOST_WLAN_2G_CAP)
8619                 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
8620
8621         if (band == WMI_HOST_WLAN_5G_CAP)
8622                 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
8623
8624         ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
8625
8626         return 0;
8627 }
8628
8629 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
8630                                            u32 supported_bands)
8631 {
8632         struct ieee80211_supported_band *band;
8633         struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
8634         void *channels;
8635         u32 phy_id;
8636
8637         BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
8638                       ARRAY_SIZE(ath11k_5ghz_channels) +
8639                       ARRAY_SIZE(ath11k_6ghz_channels)) !=
8640                      ATH11K_NUM_CHANS);
8641
8642         reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
8643         temp_reg_cap = reg_cap;
8644
8645         if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
8646                 channels = kmemdup(ath11k_2ghz_channels,
8647                                    sizeof(ath11k_2ghz_channels),
8648                                    GFP_KERNEL);
8649                 if (!channels)
8650                         return -ENOMEM;
8651
8652                 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
8653                 band->band = NL80211_BAND_2GHZ;
8654                 band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
8655                 band->channels = channels;
8656                 band->n_bitrates = ath11k_g_rates_size;
8657                 band->bitrates = ath11k_g_rates;
8658                 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
8659
8660                 if (ar->ab->hw_params.single_pdev_only) {
8661                         phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
8662                         temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8663                 }
8664                 ath11k_mac_update_ch_list(ar, band,
8665                                           temp_reg_cap->low_2ghz_chan,
8666                                           temp_reg_cap->high_2ghz_chan);
8667         }
8668
8669         if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
8670                 if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) {
8671                         channels = kmemdup(ath11k_6ghz_channels,
8672                                            sizeof(ath11k_6ghz_channels), GFP_KERNEL);
8673                         if (!channels) {
8674                                 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8675                                 return -ENOMEM;
8676                         }
8677
8678                         ar->supports_6ghz = true;
8679                         band = &ar->mac.sbands[NL80211_BAND_6GHZ];
8680                         band->band = NL80211_BAND_6GHZ;
8681                         band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
8682                         band->channels = channels;
8683                         band->n_bitrates = ath11k_a_rates_size;
8684                         band->bitrates = ath11k_a_rates;
8685                         ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
8686
8687                         if (ar->ab->hw_params.single_pdev_only) {
8688                                 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8689                                 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8690                         }
8691
8692                         ath11k_mac_update_ch_list(ar, band,
8693                                                   temp_reg_cap->low_5ghz_chan,
8694                                                   temp_reg_cap->high_5ghz_chan);
8695                 }
8696
8697                 if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
8698                         channels = kmemdup(ath11k_5ghz_channels,
8699                                            sizeof(ath11k_5ghz_channels),
8700                                            GFP_KERNEL);
8701                         if (!channels) {
8702                                 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8703                                 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8704                                 return -ENOMEM;
8705                         }
8706
8707                         band = &ar->mac.sbands[NL80211_BAND_5GHZ];
8708                         band->band = NL80211_BAND_5GHZ;
8709                         band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
8710                         band->channels = channels;
8711                         band->n_bitrates = ath11k_a_rates_size;
8712                         band->bitrates = ath11k_a_rates;
8713                         ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
8714
8715                         if (ar->ab->hw_params.single_pdev_only) {
8716                                 phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
8717                                 temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
8718                         }
8719
8720                         ath11k_mac_update_ch_list(ar, band,
8721                                                   temp_reg_cap->low_5ghz_chan,
8722                                                   temp_reg_cap->high_5ghz_chan);
8723                 }
8724         }
8725
8726         return 0;
8727 }
8728
8729 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
8730 {
8731         struct ath11k_base *ab = ar->ab;
8732         struct ieee80211_iface_combination *combinations;
8733         struct ieee80211_iface_limit *limits;
8734         int n_limits;
8735
8736         combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
8737         if (!combinations)
8738                 return -ENOMEM;
8739
8740         n_limits = 2;
8741
8742         limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
8743         if (!limits) {
8744                 kfree(combinations);
8745                 return -ENOMEM;
8746         }
8747
8748         limits[0].max = 1;
8749         limits[0].types |= BIT(NL80211_IFTYPE_STATION);
8750
8751         limits[1].max = 16;
8752         limits[1].types |= BIT(NL80211_IFTYPE_AP);
8753
8754         if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
8755             ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
8756                 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
8757
8758         combinations[0].limits = limits;
8759         combinations[0].n_limits = n_limits;
8760         combinations[0].max_interfaces = 16;
8761         combinations[0].num_different_channels = 1;
8762         combinations[0].beacon_int_infra_match = true;
8763         combinations[0].beacon_int_min_gcd = 100;
8764         combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
8765                                                 BIT(NL80211_CHAN_WIDTH_20) |
8766                                                 BIT(NL80211_CHAN_WIDTH_40) |
8767                                                 BIT(NL80211_CHAN_WIDTH_80) |
8768                                                 BIT(NL80211_CHAN_WIDTH_80P80) |
8769                                                 BIT(NL80211_CHAN_WIDTH_160);
8770
8771         ar->hw->wiphy->iface_combinations = combinations;
8772         ar->hw->wiphy->n_iface_combinations = 1;
8773
8774         return 0;
8775 }
8776
8777 static const u8 ath11k_if_types_ext_capa[] = {
8778         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8779         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8780 };
8781
8782 static const u8 ath11k_if_types_ext_capa_sta[] = {
8783         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8784         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8785         [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
8786 };
8787
8788 static const u8 ath11k_if_types_ext_capa_ap[] = {
8789         [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
8790         [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
8791         [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
8792 };
8793
8794 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
8795         {
8796                 .extended_capabilities = ath11k_if_types_ext_capa,
8797                 .extended_capabilities_mask = ath11k_if_types_ext_capa,
8798                 .extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
8799         }, {
8800                 .iftype = NL80211_IFTYPE_STATION,
8801                 .extended_capabilities = ath11k_if_types_ext_capa_sta,
8802                 .extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
8803                 .extended_capabilities_len =
8804                                 sizeof(ath11k_if_types_ext_capa_sta),
8805         }, {
8806                 .iftype = NL80211_IFTYPE_AP,
8807                 .extended_capabilities = ath11k_if_types_ext_capa_ap,
8808                 .extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
8809                 .extended_capabilities_len =
8810                                 sizeof(ath11k_if_types_ext_capa_ap),
8811         },
8812 };
8813
8814 static void __ath11k_mac_unregister(struct ath11k *ar)
8815 {
8816         cancel_work_sync(&ar->regd_update_work);
8817
8818         ieee80211_unregister_hw(ar->hw);
8819
8820         idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
8821         idr_destroy(&ar->txmgmt_idr);
8822
8823         kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
8824         kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
8825         kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
8826
8827         kfree(ar->hw->wiphy->iface_combinations[0].limits);
8828         kfree(ar->hw->wiphy->iface_combinations);
8829
8830         SET_IEEE80211_DEV(ar->hw, NULL);
8831 }
8832
8833 void ath11k_mac_unregister(struct ath11k_base *ab)
8834 {
8835         struct ath11k *ar;
8836         struct ath11k_pdev *pdev;
8837         int i;
8838
8839         for (i = 0; i < ab->num_radios; i++) {
8840                 pdev = &ab->pdevs[i];
8841                 ar = pdev->ar;
8842                 if (!ar)
8843                         continue;
8844
8845                 __ath11k_mac_unregister(ar);
8846         }
8847
8848         ath11k_peer_rhash_tbl_destroy(ab);
8849 }
8850
8851 static int __ath11k_mac_register(struct ath11k *ar)
8852 {
8853         struct ath11k_base *ab = ar->ab;
8854         struct ath11k_pdev_cap *cap = &ar->pdev->cap;
8855         static const u32 cipher_suites[] = {
8856                 WLAN_CIPHER_SUITE_TKIP,
8857                 WLAN_CIPHER_SUITE_CCMP,
8858                 WLAN_CIPHER_SUITE_AES_CMAC,
8859                 WLAN_CIPHER_SUITE_BIP_CMAC_256,
8860                 WLAN_CIPHER_SUITE_BIP_GMAC_128,
8861                 WLAN_CIPHER_SUITE_BIP_GMAC_256,
8862                 WLAN_CIPHER_SUITE_GCMP,
8863                 WLAN_CIPHER_SUITE_GCMP_256,
8864                 WLAN_CIPHER_SUITE_CCMP_256,
8865         };
8866         int ret;
8867         u32 ht_cap = 0;
8868
8869         ath11k_pdev_caps_update(ar);
8870
8871         SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
8872
8873         SET_IEEE80211_DEV(ar->hw, ab->dev);
8874
8875         ret = ath11k_mac_setup_channels_rates(ar,
8876                                               cap->supported_bands);
8877         if (ret)
8878                 goto err;
8879
8880         ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
8881         ath11k_mac_setup_he_cap(ar, cap);
8882
8883         ret = ath11k_mac_setup_iface_combinations(ar);
8884         if (ret) {
8885                 ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
8886                 goto err_free_channels;
8887         }
8888
8889         ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
8890         ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
8891
8892         ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
8893
8894         if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
8895                 ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
8896
8897         if (ab->hw_params.supports_multi_bssid) {
8898                 ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
8899                 ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
8900         }
8901
8902         ieee80211_hw_set(ar->hw, SIGNAL_DBM);
8903         ieee80211_hw_set(ar->hw, SUPPORTS_PS);
8904         ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
8905         ieee80211_hw_set(ar->hw, MFP_CAPABLE);
8906         ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
8907         ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
8908         ieee80211_hw_set(ar->hw, AP_LINK_PS);
8909         ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
8910         ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
8911         ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
8912         ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
8913         ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
8914         ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
8915         ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
8916         ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
8917
8918         if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
8919                 ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
8920                 ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
8921         }
8922
8923         if (cap->nss_ratio_enabled)
8924                 ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
8925
8926         if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
8927                 ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
8928                 ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
8929                 ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
8930                 ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
8931                 ieee80211_hw_set(ar->hw, USES_RSS);
8932         }
8933
8934         ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8935         ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8936
8937         /* TODO: Check if HT capability advertised from firmware is different
8938          * for each band for a dual band capable radio. It will be tricky to
8939          * handle it when the ht capability different for each band.
8940          */
8941         if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
8942             (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
8943                 ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8944
8945         ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8946         ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8947
8948         ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
8949
8950         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8951         ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8952         ar->hw->wiphy->max_remain_on_channel_duration = 5000;
8953
8954         ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8955         ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8956                                    NL80211_FEATURE_AP_SCAN;
8957
8958         ar->max_num_stations = TARGET_NUM_STATIONS(ab);
8959         ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
8960
8961         ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
8962
8963         if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
8964                 ar->hw->wiphy->features |=
8965                         NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
8966         }
8967
8968         if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
8969                 ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
8970                 ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
8971                 ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
8972                 ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
8973                 ar->hw->wiphy->max_sched_scan_plan_interval =
8974                         WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
8975                 ar->hw->wiphy->max_sched_scan_plan_iterations =
8976                         WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
8977                 ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
8978         }
8979
8980         ret = ath11k_wow_init(ar);
8981         if (ret) {
8982                 ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
8983                 goto err_free_if_combs;
8984         }
8985
8986         ar->hw->queues = ATH11K_HW_MAX_QUEUES;
8987         ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
8988         ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
8989         ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
8990
8991         ar->hw->vif_data_size = sizeof(struct ath11k_vif);
8992         ar->hw->sta_data_size = sizeof(struct ath11k_sta);
8993
8994         wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8995         wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
8996         if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
8997                      ar->ab->wmi_ab.svc_map)) {
8998                 wiphy_ext_feature_set(ar->hw->wiphy,
8999                                       NL80211_EXT_FEATURE_BSS_COLOR);
9000                 ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
9001         }
9002
9003         ar->hw->wiphy->cipher_suites = cipher_suites;
9004         ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
9005
9006         ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
9007         ar->hw->wiphy->num_iftype_ext_capab =
9008                 ARRAY_SIZE(ath11k_iftypes_ext_capa);
9009
9010         if (ar->supports_6ghz) {
9011                 wiphy_ext_feature_set(ar->hw->wiphy,
9012                                       NL80211_EXT_FEATURE_FILS_DISCOVERY);
9013                 wiphy_ext_feature_set(ar->hw->wiphy,
9014                                       NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
9015         }
9016
9017         ath11k_reg_init(ar);
9018
9019         if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
9020                 ar->hw->netdev_features = NETIF_F_HW_CSUM;
9021                 ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
9022                 ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
9023         }
9024
9025         if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
9026             ab->hw_params.bios_sar_capa)
9027                 ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
9028
9029         ret = ieee80211_register_hw(ar->hw);
9030         if (ret) {
9031                 ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
9032                 goto err_free_if_combs;
9033         }
9034
9035         if (!ab->hw_params.supports_monitor)
9036                 /* There's a race between calling ieee80211_register_hw()
9037                  * and here where the monitor mode is enabled for a little
9038                  * while. But that time is so short and in practise it make
9039                  * a difference in real life.
9040                  */
9041                 ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
9042
9043         /* Apply the regd received during initialization */
9044         ret = ath11k_regd_update(ar);
9045         if (ret) {
9046                 ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
9047                 goto err_unregister_hw;
9048         }
9049
9050         if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
9051                 struct wmi_set_current_country_params set_current_param = {};
9052
9053                 memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
9054                 memcpy(&ar->alpha2, ab->new_alpha2, 2);
9055                 ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
9056                 if (ret)
9057                         ath11k_warn(ar->ab,
9058                                     "failed set cc code for mac register: %d\n", ret);
9059         }
9060
9061         ret = ath11k_debugfs_register(ar);
9062         if (ret) {
9063                 ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
9064                 goto err_unregister_hw;
9065         }
9066
9067         return 0;
9068
9069 err_unregister_hw:
9070         ieee80211_unregister_hw(ar->hw);
9071
9072 err_free_if_combs:
9073         kfree(ar->hw->wiphy->iface_combinations[0].limits);
9074         kfree(ar->hw->wiphy->iface_combinations);
9075
9076 err_free_channels:
9077         kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9078         kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9079         kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9080
9081 err:
9082         SET_IEEE80211_DEV(ar->hw, NULL);
9083         return ret;
9084 }
9085
9086 int ath11k_mac_register(struct ath11k_base *ab)
9087 {
9088         struct ath11k *ar;
9089         struct ath11k_pdev *pdev;
9090         int i;
9091         int ret;
9092         u8 mac_addr[ETH_ALEN] = {0};
9093
9094         if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9095                 return 0;
9096
9097         /* Initialize channel counters frequency value in hertz */
9098         ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
9099         ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
9100
9101         ret = ath11k_peer_rhash_tbl_init(ab);
9102         if (ret)
9103                 return ret;
9104
9105         device_get_mac_address(ab->dev, mac_addr);
9106
9107         for (i = 0; i < ab->num_radios; i++) {
9108                 pdev = &ab->pdevs[i];
9109                 ar = pdev->ar;
9110                 if (ab->pdevs_macaddr_valid) {
9111                         ether_addr_copy(ar->mac_addr, pdev->mac_addr);
9112                 } else {
9113                         if (is_zero_ether_addr(mac_addr))
9114                                 ether_addr_copy(ar->mac_addr, ab->mac_addr);
9115                         else
9116                                 ether_addr_copy(ar->mac_addr, mac_addr);
9117                         ar->mac_addr[4] += i;
9118                 }
9119
9120                 idr_init(&ar->txmgmt_idr);
9121                 spin_lock_init(&ar->txmgmt_idr_lock);
9122
9123                 ret = __ath11k_mac_register(ar);
9124                 if (ret)
9125                         goto err_cleanup;
9126
9127                 init_waitqueue_head(&ar->txmgmt_empty_waitq);
9128         }
9129
9130         return 0;
9131
9132 err_cleanup:
9133         for (i = i - 1; i >= 0; i--) {
9134                 pdev = &ab->pdevs[i];
9135                 ar = pdev->ar;
9136                 __ath11k_mac_unregister(ar);
9137         }
9138
9139         ath11k_peer_rhash_tbl_destroy(ab);
9140
9141         return ret;
9142 }
9143
9144 int ath11k_mac_allocate(struct ath11k_base *ab)
9145 {
9146         struct ieee80211_hw *hw;
9147         struct ath11k *ar;
9148         struct ath11k_pdev *pdev;
9149         int ret;
9150         int i;
9151
9152         if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9153                 return 0;
9154
9155         for (i = 0; i < ab->num_radios; i++) {
9156                 pdev = &ab->pdevs[i];
9157                 hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
9158                 if (!hw) {
9159                         ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
9160                         ret = -ENOMEM;
9161                         goto err_free_mac;
9162                 }
9163
9164                 ar = hw->priv;
9165                 ar->hw = hw;
9166                 ar->ab = ab;
9167                 ar->pdev = pdev;
9168                 ar->pdev_idx = i;
9169                 ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
9170
9171                 ar->wmi = &ab->wmi_ab.wmi[i];
9172                 /* FIXME wmi[0] is already initialized during attach,
9173                  * Should we do this again?
9174                  */
9175                 ath11k_wmi_pdev_attach(ab, i);
9176
9177                 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
9178                 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
9179                 ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
9180                 ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
9181
9182                 pdev->ar = ar;
9183                 spin_lock_init(&ar->data_lock);
9184                 INIT_LIST_HEAD(&ar->arvifs);
9185                 INIT_LIST_HEAD(&ar->ppdu_stats_info);
9186                 mutex_init(&ar->conf_mutex);
9187                 init_completion(&ar->vdev_setup_done);
9188                 init_completion(&ar->vdev_delete_done);
9189                 init_completion(&ar->peer_assoc_done);
9190                 init_completion(&ar->peer_delete_done);
9191                 init_completion(&ar->install_key_done);
9192                 init_completion(&ar->bss_survey_done);
9193                 init_completion(&ar->scan.started);
9194                 init_completion(&ar->scan.completed);
9195                 init_completion(&ar->scan.on_channel);
9196                 init_completion(&ar->thermal.wmi_sync);
9197
9198                 INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
9199                 INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
9200
9201                 INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
9202                 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
9203
9204                 clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
9205
9206                 ar->monitor_vdev_id = -1;
9207                 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
9208                 ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
9209                 init_completion(&ar->completed_11d_scan);
9210
9211                 ath11k_fw_stats_init(ar);
9212         }
9213
9214         return 0;
9215
9216 err_free_mac:
9217         ath11k_mac_destroy(ab);
9218
9219         return ret;
9220 }
9221
9222 void ath11k_mac_destroy(struct ath11k_base *ab)
9223 {
9224         struct ath11k *ar;
9225         struct ath11k_pdev *pdev;
9226         int i;
9227
9228         for (i = 0; i < ab->num_radios; i++) {
9229                 pdev = &ab->pdevs[i];
9230                 ar = pdev->ar;
9231                 if (!ar)
9232                         continue;
9233
9234                 ieee80211_free_hw(ar->hw);
9235                 pdev->ar = NULL;
9236         }
9237 }
9238
9239 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
9240                                  enum wmi_sta_keepalive_method method,
9241                                  u32 interval)
9242 {
9243         struct ath11k *ar = arvif->ar;
9244         struct wmi_sta_keepalive_arg arg = {};
9245         int ret;
9246
9247         lockdep_assert_held(&ar->conf_mutex);
9248
9249         if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
9250                 return 0;
9251
9252         if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
9253                 return 0;
9254
9255         arg.vdev_id = arvif->vdev_id;
9256         arg.enabled = 1;
9257         arg.method = method;
9258         arg.interval = interval;
9259
9260         ret = ath11k_wmi_sta_keepalive(ar, &arg);
9261         if (ret) {
9262                 ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
9263                             arvif->vdev_id, ret);
9264                 return ret;
9265         }
9266
9267         return 0;
9268 }