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