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