1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5 */
6
7 #include <net/mac80211.h>
8 #include <net/cfg80211.h>
9 #include <linux/etherdevice.h>
10
11 #include "mac.h"
12 #include "core.h"
13 #include "debug.h"
14 #include "wmi.h"
15 #include "hw.h"
16 #include "dp_tx.h"
17 #include "dp_rx.h"
18 #include "testmode.h"
19 #include "peer.h"
20 #include "debugfs.h"
21 #include "hif.h"
22 #include "wow.h"
23 #include "debugfs_sta.h"
24
25 #define CHAN2G(_channel, _freq, _flags) { \
26 .band = NL80211_BAND_2GHZ, \
27 .hw_value = (_channel), \
28 .center_freq = (_freq), \
29 .flags = (_flags), \
30 .max_antenna_gain = 0, \
31 .max_power = 30, \
32 }
33
34 #define CHAN5G(_channel, _freq, _flags) { \
35 .band = NL80211_BAND_5GHZ, \
36 .hw_value = (_channel), \
37 .center_freq = (_freq), \
38 .flags = (_flags), \
39 .max_antenna_gain = 0, \
40 .max_power = 30, \
41 }
42
43 #define CHAN6G(_channel, _freq, _flags) { \
44 .band = NL80211_BAND_6GHZ, \
45 .hw_value = (_channel), \
46 .center_freq = (_freq), \
47 .flags = (_flags), \
48 .max_antenna_gain = 0, \
49 .max_power = 30, \
50 }
51
52 static const struct ieee80211_channel ath12k_2ghz_channels[] = {
53 CHAN2G(1, 2412, 0),
54 CHAN2G(2, 2417, 0),
55 CHAN2G(3, 2422, 0),
56 CHAN2G(4, 2427, 0),
57 CHAN2G(5, 2432, 0),
58 CHAN2G(6, 2437, 0),
59 CHAN2G(7, 2442, 0),
60 CHAN2G(8, 2447, 0),
61 CHAN2G(9, 2452, 0),
62 CHAN2G(10, 2457, 0),
63 CHAN2G(11, 2462, 0),
64 CHAN2G(12, 2467, 0),
65 CHAN2G(13, 2472, 0),
66 CHAN2G(14, 2484, 0),
67 };
68
69 static const struct ieee80211_channel ath12k_5ghz_channels[] = {
70 CHAN5G(36, 5180, 0),
71 CHAN5G(40, 5200, 0),
72 CHAN5G(44, 5220, 0),
73 CHAN5G(48, 5240, 0),
74 CHAN5G(52, 5260, 0),
75 CHAN5G(56, 5280, 0),
76 CHAN5G(60, 5300, 0),
77 CHAN5G(64, 5320, 0),
78 CHAN5G(100, 5500, 0),
79 CHAN5G(104, 5520, 0),
80 CHAN5G(108, 5540, 0),
81 CHAN5G(112, 5560, 0),
82 CHAN5G(116, 5580, 0),
83 CHAN5G(120, 5600, 0),
84 CHAN5G(124, 5620, 0),
85 CHAN5G(128, 5640, 0),
86 CHAN5G(132, 5660, 0),
87 CHAN5G(136, 5680, 0),
88 CHAN5G(140, 5700, 0),
89 CHAN5G(144, 5720, 0),
90 CHAN5G(149, 5745, 0),
91 CHAN5G(153, 5765, 0),
92 CHAN5G(157, 5785, 0),
93 CHAN5G(161, 5805, 0),
94 CHAN5G(165, 5825, 0),
95 CHAN5G(169, 5845, 0),
96 CHAN5G(173, 5865, 0),
97 };
98
99 static const struct ieee80211_channel ath12k_6ghz_channels[] = {
100 /* Operating Class 136 */
101 CHAN6G(2, 5935, 0),
102
103 /* Operating Classes 131-135 */
104 CHAN6G(1, 5955, 0),
105 CHAN6G(5, 5975, 0),
106 CHAN6G(9, 5995, 0),
107 CHAN6G(13, 6015, 0),
108 CHAN6G(17, 6035, 0),
109 CHAN6G(21, 6055, 0),
110 CHAN6G(25, 6075, 0),
111 CHAN6G(29, 6095, 0),
112 CHAN6G(33, 6115, 0),
113 CHAN6G(37, 6135, 0),
114 CHAN6G(41, 6155, 0),
115 CHAN6G(45, 6175, 0),
116 CHAN6G(49, 6195, 0),
117 CHAN6G(53, 6215, 0),
118 CHAN6G(57, 6235, 0),
119 CHAN6G(61, 6255, 0),
120 CHAN6G(65, 6275, 0),
121 CHAN6G(69, 6295, 0),
122 CHAN6G(73, 6315, 0),
123 CHAN6G(77, 6335, 0),
124 CHAN6G(81, 6355, 0),
125 CHAN6G(85, 6375, 0),
126 CHAN6G(89, 6395, 0),
127 CHAN6G(93, 6415, 0),
128 CHAN6G(97, 6435, 0),
129 CHAN6G(101, 6455, 0),
130 CHAN6G(105, 6475, 0),
131 CHAN6G(109, 6495, 0),
132 CHAN6G(113, 6515, 0),
133 CHAN6G(117, 6535, 0),
134 CHAN6G(121, 6555, 0),
135 CHAN6G(125, 6575, 0),
136 CHAN6G(129, 6595, 0),
137 CHAN6G(133, 6615, 0),
138 CHAN6G(137, 6635, 0),
139 CHAN6G(141, 6655, 0),
140 CHAN6G(145, 6675, 0),
141 CHAN6G(149, 6695, 0),
142 CHAN6G(153, 6715, 0),
143 CHAN6G(157, 6735, 0),
144 CHAN6G(161, 6755, 0),
145 CHAN6G(165, 6775, 0),
146 CHAN6G(169, 6795, 0),
147 CHAN6G(173, 6815, 0),
148 CHAN6G(177, 6835, 0),
149 CHAN6G(181, 6855, 0),
150 CHAN6G(185, 6875, 0),
151 CHAN6G(189, 6895, 0),
152 CHAN6G(193, 6915, 0),
153 CHAN6G(197, 6935, 0),
154 CHAN6G(201, 6955, 0),
155 CHAN6G(205, 6975, 0),
156 CHAN6G(209, 6995, 0),
157 CHAN6G(213, 7015, 0),
158 CHAN6G(217, 7035, 0),
159 CHAN6G(221, 7055, 0),
160 CHAN6G(225, 7075, 0),
161 CHAN6G(229, 7095, 0),
162 CHAN6G(233, 7115, 0),
163 };
164
165 static struct ieee80211_rate ath12k_legacy_rates[] = {
166 { .bitrate = 10,
167 .hw_value = ATH12K_HW_RATE_CCK_LP_1M },
168 { .bitrate = 20,
169 .hw_value = ATH12K_HW_RATE_CCK_LP_2M,
170 .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
171 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
172 { .bitrate = 55,
173 .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
174 .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
175 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
176 { .bitrate = 110,
177 .hw_value = ATH12K_HW_RATE_CCK_LP_11M,
178 .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
179 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
180
181 { .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
182 { .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
183 { .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
184 { .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
185 { .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
186 { .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
187 { .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
188 { .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
189 };
190
191 static const int
192 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
193 [NL80211_BAND_2GHZ] = {
194 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
197 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
198 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
199 [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
200 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
201 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
202 [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
203 },
204 [NL80211_BAND_5GHZ] = {
205 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_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_UNKNOWN,
213 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
214 },
215 [NL80211_BAND_6GHZ] = {
216 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
217 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
218 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
219 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
220 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
221 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
222 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
223 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
224 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
225 },
226
227 };
228
229 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
230 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
232 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE |
233 HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO,
234 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
235 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
236 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
237 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
238 HTT_RX_FP_CTRL_FILTER_FLASG3
239 };
240
241 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
242 #define ath12k_g_rates ath12k_legacy_rates
243 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
244 #define ath12k_a_rates (ath12k_legacy_rates + 4)
245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
246
247 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
248
249 static const u32 ath12k_smps_map[] = {
250 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
251 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
252 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
253 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
254 };
255
256 static int ath12k_start_vdev_delay(struct ath12k *ar,
257 struct ath12k_link_vif *arvif);
258 static void ath12k_mac_stop(struct ath12k *ar);
259 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif);
260 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif);
261
ath12k_mac_phymode_str(enum wmi_phy_mode mode)262 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
263 {
264 switch (mode) {
265 case MODE_11A:
266 return "11a";
267 case MODE_11G:
268 return "11g";
269 case MODE_11B:
270 return "11b";
271 case MODE_11GONLY:
272 return "11gonly";
273 case MODE_11NA_HT20:
274 return "11na-ht20";
275 case MODE_11NG_HT20:
276 return "11ng-ht20";
277 case MODE_11NA_HT40:
278 return "11na-ht40";
279 case MODE_11NG_HT40:
280 return "11ng-ht40";
281 case MODE_11AC_VHT20:
282 return "11ac-vht20";
283 case MODE_11AC_VHT40:
284 return "11ac-vht40";
285 case MODE_11AC_VHT80:
286 return "11ac-vht80";
287 case MODE_11AC_VHT160:
288 return "11ac-vht160";
289 case MODE_11AC_VHT80_80:
290 return "11ac-vht80+80";
291 case MODE_11AC_VHT20_2G:
292 return "11ac-vht20-2g";
293 case MODE_11AC_VHT40_2G:
294 return "11ac-vht40-2g";
295 case MODE_11AC_VHT80_2G:
296 return "11ac-vht80-2g";
297 case MODE_11AX_HE20:
298 return "11ax-he20";
299 case MODE_11AX_HE40:
300 return "11ax-he40";
301 case MODE_11AX_HE80:
302 return "11ax-he80";
303 case MODE_11AX_HE80_80:
304 return "11ax-he80+80";
305 case MODE_11AX_HE160:
306 return "11ax-he160";
307 case MODE_11AX_HE20_2G:
308 return "11ax-he20-2g";
309 case MODE_11AX_HE40_2G:
310 return "11ax-he40-2g";
311 case MODE_11AX_HE80_2G:
312 return "11ax-he80-2g";
313 case MODE_11BE_EHT20:
314 return "11be-eht20";
315 case MODE_11BE_EHT40:
316 return "11be-eht40";
317 case MODE_11BE_EHT80:
318 return "11be-eht80";
319 case MODE_11BE_EHT80_80:
320 return "11be-eht80+80";
321 case MODE_11BE_EHT160:
322 return "11be-eht160";
323 case MODE_11BE_EHT160_160:
324 return "11be-eht160+160";
325 case MODE_11BE_EHT320:
326 return "11be-eht320";
327 case MODE_11BE_EHT20_2G:
328 return "11be-eht20-2g";
329 case MODE_11BE_EHT40_2G:
330 return "11be-eht40-2g";
331 case MODE_UNKNOWN:
332 /* skip */
333 break;
334
335 /* no default handler to allow compiler to check that the
336 * enum is fully handled
337 */
338 }
339
340 return "<unknown>";
341 }
342
ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)343 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)
344 {
345 switch (tones) {
346 case 26:
347 return RU_26;
348 case 52:
349 return RU_52;
350 case 106:
351 return RU_106;
352 case 242:
353 return RU_242;
354 case 484:
355 return RU_484;
356 case 996:
357 return RU_996;
358 case (996 * 2):
359 return RU_2X996;
360 default:
361 return RU_26;
362 }
363 }
364
ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)365 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)
366 {
367 switch (sgi) {
368 case RX_MSDU_START_SGI_0_8_US:
369 return NL80211_RATE_INFO_EHT_GI_0_8;
370 case RX_MSDU_START_SGI_1_6_US:
371 return NL80211_RATE_INFO_EHT_GI_1_6;
372 case RX_MSDU_START_SGI_3_2_US:
373 return NL80211_RATE_INFO_EHT_GI_3_2;
374 default:
375 return NL80211_RATE_INFO_EHT_GI_0_8;
376 }
377 }
378
ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)379 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)
380 {
381 switch (ru_tones) {
382 case 26:
383 return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
384 case 52:
385 return NL80211_RATE_INFO_EHT_RU_ALLOC_52;
386 case (52 + 26):
387 return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26;
388 case 106:
389 return NL80211_RATE_INFO_EHT_RU_ALLOC_106;
390 case (106 + 26):
391 return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26;
392 case 242:
393 return NL80211_RATE_INFO_EHT_RU_ALLOC_242;
394 case 484:
395 return NL80211_RATE_INFO_EHT_RU_ALLOC_484;
396 case (484 + 242):
397 return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242;
398 case 996:
399 return NL80211_RATE_INFO_EHT_RU_ALLOC_996;
400 case (996 + 484):
401 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484;
402 case (996 + 484 + 242):
403 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242;
404 case (2 * 996):
405 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996;
406 case (2 * 996 + 484):
407 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484;
408 case (3 * 996):
409 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996;
410 case (3 * 996 + 484):
411 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484;
412 case (4 * 996):
413 return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996;
414 default:
415 return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
416 }
417 }
418
419 enum rate_info_bw
ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)420 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
421 {
422 u8 ret = RATE_INFO_BW_20;
423
424 switch (bw) {
425 case ATH12K_BW_20:
426 ret = RATE_INFO_BW_20;
427 break;
428 case ATH12K_BW_40:
429 ret = RATE_INFO_BW_40;
430 break;
431 case ATH12K_BW_80:
432 ret = RATE_INFO_BW_80;
433 break;
434 case ATH12K_BW_160:
435 ret = RATE_INFO_BW_160;
436 break;
437 case ATH12K_BW_320:
438 ret = RATE_INFO_BW_320;
439 break;
440 }
441
442 return ret;
443 }
444
ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)445 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
446 {
447 switch (bw) {
448 case RATE_INFO_BW_20:
449 return ATH12K_BW_20;
450 case RATE_INFO_BW_40:
451 return ATH12K_BW_40;
452 case RATE_INFO_BW_80:
453 return ATH12K_BW_80;
454 case RATE_INFO_BW_160:
455 return ATH12K_BW_160;
456 case RATE_INFO_BW_320:
457 return ATH12K_BW_320;
458 default:
459 return ATH12K_BW_20;
460 }
461 }
462
ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc,u8 preamble,u8 * rateidx,u16 * rate)463 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
464 u16 *rate)
465 {
466 /* As default, it is OFDM rates */
467 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
468 int max_rates_idx = ath12k_g_rates_size;
469
470 if (preamble == WMI_RATE_PREAMBLE_CCK) {
471 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
472 i = 0;
473 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
474 }
475
476 while (i < max_rates_idx) {
477 if (hw_rc == ath12k_legacy_rates[i].hw_value) {
478 *rateidx = i;
479 *rate = ath12k_legacy_rates[i].bitrate;
480 return 0;
481 }
482 i++;
483 }
484
485 return -EINVAL;
486 }
487
ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band * sband,u32 bitrate)488 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
489 u32 bitrate)
490 {
491 int i;
492
493 for (i = 0; i < sband->n_bitrates; i++)
494 if (sband->bitrates[i].bitrate == bitrate)
495 return i;
496
497 return 0;
498 }
499
500 static u32
ath12k_mac_max_ht_nss(const u8 * ht_mcs_mask)501 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
502 {
503 int nss;
504
505 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
506 if (ht_mcs_mask[nss])
507 return nss + 1;
508
509 return 1;
510 }
511
512 static u32
ath12k_mac_max_vht_nss(const u16 * vht_mcs_mask)513 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
514 {
515 int nss;
516
517 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
518 if (vht_mcs_mask[nss])
519 return nss + 1;
520
521 return 1;
522 }
523
524 static u32
ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])525 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
526 {
527 int nss;
528
529 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
530 if (he_mcs_mask[nss])
531 return nss + 1;
532
533 return 1;
534 }
535
536 static u32
ath12k_mac_max_eht_nss(const u16 eht_mcs_mask[NL80211_EHT_NSS_MAX])537 ath12k_mac_max_eht_nss(const u16 eht_mcs_mask[NL80211_EHT_NSS_MAX])
538 {
539 int nss;
540
541 for (nss = NL80211_EHT_NSS_MAX - 1; nss >= 0; nss--)
542 if (eht_mcs_mask[nss])
543 return nss + 1;
544
545 return 1;
546 }
547
548 static u32
ath12k_mac_max_eht_mcs_nss(const u8 * eht_mcs,int eht_mcs_set_size)549 ath12k_mac_max_eht_mcs_nss(const u8 *eht_mcs, int eht_mcs_set_size)
550 {
551 int i;
552 u8 nss = 0;
553
554 for (i = 0; i < eht_mcs_set_size; i++)
555 nss = max(nss, u8_get_bits(eht_mcs[i], IEEE80211_EHT_MCS_NSS_RX));
556
557 return nss;
558 }
559
ath12k_parse_mpdudensity(u8 mpdudensity)560 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
561 {
562 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
563 * 0 for no restriction
564 * 1 for 1/4 us
565 * 2 for 1/2 us
566 * 3 for 1 us
567 * 4 for 2 us
568 * 5 for 4 us
569 * 6 for 8 us
570 * 7 for 16 us
571 */
572 switch (mpdudensity) {
573 case 0:
574 return 0;
575 case 1:
576 case 2:
577 case 3:
578 /* Our lower layer calculations limit our precision to
579 * 1 microsecond
580 */
581 return 1;
582 case 4:
583 return 2;
584 case 5:
585 return 4;
586 case 6:
587 return 8;
588 case 7:
589 return 16;
590 default:
591 return 0;
592 }
593 }
594
ath12k_mac_vif_link_chan(struct ieee80211_vif * vif,u8 link_id,struct cfg80211_chan_def * def)595 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id,
596 struct cfg80211_chan_def *def)
597 {
598 struct ieee80211_bss_conf *link_conf;
599 struct ieee80211_chanctx_conf *conf;
600
601 rcu_read_lock();
602 link_conf = rcu_dereference(vif->link_conf[link_id]);
603
604 if (!link_conf) {
605 rcu_read_unlock();
606 return -ENOLINK;
607 }
608
609 conf = rcu_dereference(link_conf->chanctx_conf);
610 if (!conf) {
611 rcu_read_unlock();
612 return -ENOENT;
613 }
614 *def = conf->def;
615 rcu_read_unlock();
616
617 return 0;
618 }
619
620 static struct ath12k_link_vif *
ath12k_mac_get_tx_arvif(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * link_conf)621 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif,
622 struct ieee80211_bss_conf *link_conf)
623 {
624 struct ieee80211_bss_conf *tx_bss_conf;
625 struct ath12k *ar = arvif->ar;
626 struct ath12k_vif *tx_ahvif;
627
628 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
629
630 tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
631 link_conf->tx_bss_conf);
632 if (tx_bss_conf) {
633 tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif);
634 return wiphy_dereference(tx_ahvif->ah->hw->wiphy,
635 tx_ahvif->link[tx_bss_conf->link_id]);
636 }
637
638 return NULL;
639 }
640
ath12k_mac_get_tx_bssid(struct ath12k_link_vif * arvif)641 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif)
642 {
643 struct ieee80211_bss_conf *link_conf;
644 struct ath12k_link_vif *tx_arvif;
645 struct ath12k *ar = arvif->ar;
646
647 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
648
649 link_conf = ath12k_mac_get_link_bss_conf(arvif);
650 if (!link_conf) {
651 ath12k_warn(ar->ab,
652 "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
653 arvif->link_id);
654 return NULL;
655 }
656 if (link_conf->vif->type == NL80211_IFTYPE_STATION) {
657 if (link_conf->nontransmitted)
658 return link_conf->transmitter_bssid;
659 } else {
660 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
661 if (tx_arvif)
662 return tx_arvif->bssid;
663 }
664
665 return NULL;
666 }
667
668 struct ieee80211_bss_conf *
ath12k_mac_get_link_bss_conf(struct ath12k_link_vif * arvif)669 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif)
670 {
671 struct ieee80211_vif *vif = arvif->ahvif->vif;
672 struct ieee80211_bss_conf *link_conf;
673 struct ath12k *ar = arvif->ar;
674
675 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
676
677 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
678 return NULL;
679
680 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
681 vif->link_conf[arvif->link_id]);
682
683 return link_conf;
684 }
685
ath12k_mac_get_link_sta(struct ath12k_link_sta * arsta)686 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta)
687 {
688 struct ath12k_sta *ahsta = arsta->ahsta;
689 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
690 struct ieee80211_link_sta *link_sta;
691
692 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy);
693
694 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
695 return NULL;
696
697 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy,
698 sta->link[arsta->link_id]);
699
700 return link_sta;
701 }
702
ath12k_mac_bitrate_is_cck(int bitrate)703 static bool ath12k_mac_bitrate_is_cck(int bitrate)
704 {
705 switch (bitrate) {
706 case 10:
707 case 20:
708 case 55:
709 case 110:
710 return true;
711 }
712
713 return false;
714 }
715
ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band * sband,u8 hw_rate,bool cck)716 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
717 u8 hw_rate, bool cck)
718 {
719 const struct ieee80211_rate *rate;
720 int i;
721
722 for (i = 0; i < sband->n_bitrates; i++) {
723 rate = &sband->bitrates[i];
724
725 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
726 continue;
727
728 if (rate->hw_value == hw_rate)
729 return i;
730 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
731 rate->hw_value_short == hw_rate)
732 return i;
733 }
734
735 return 0;
736 }
737
ath12k_mac_bitrate_to_rate(int bitrate)738 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
739 {
740 return DIV_ROUND_UP(bitrate, 5) |
741 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
742 }
743
ath12k_get_arvif_iter(void * data,u8 * mac,struct ieee80211_vif * vif)744 static void ath12k_get_arvif_iter(void *data, u8 *mac,
745 struct ieee80211_vif *vif)
746 {
747 struct ath12k_vif_iter *arvif_iter = data;
748 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
749 unsigned long links_map = ahvif->links_map;
750 struct ath12k_link_vif *arvif;
751 u8 link_id;
752
753 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
754 arvif = rcu_dereference(ahvif->link[link_id]);
755
756 if (WARN_ON(!arvif))
757 continue;
758
759 if (!arvif->is_created)
760 continue;
761
762 if (arvif->vdev_id == arvif_iter->vdev_id &&
763 arvif->ar == arvif_iter->ar) {
764 arvif_iter->arvif = arvif;
765 break;
766 }
767 }
768 }
769
ath12k_mac_get_arvif(struct ath12k * ar,u32 vdev_id)770 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
771 {
772 struct ath12k_vif_iter arvif_iter = {};
773 u32 flags;
774
775 /* To use the arvif returned, caller must have held rcu read lock.
776 */
777 WARN_ON(!rcu_read_lock_any_held());
778 arvif_iter.vdev_id = vdev_id;
779 arvif_iter.ar = ar;
780
781 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
782 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
783 flags,
784 ath12k_get_arvif_iter,
785 &arvif_iter);
786 if (!arvif_iter.arvif) {
787 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
788 return NULL;
789 }
790
791 return arvif_iter.arvif;
792 }
793
ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)794 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
795 u32 vdev_id)
796 {
797 int i;
798 struct ath12k_pdev *pdev;
799 struct ath12k_link_vif *arvif;
800
801 for (i = 0; i < ab->num_radios; i++) {
802 pdev = rcu_dereference(ab->pdevs_active[i]);
803 if (pdev && pdev->ar &&
804 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
805 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
806 if (arvif)
807 return arvif;
808 }
809 }
810
811 return NULL;
812 }
813
ath12k_mac_get_ar_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)814 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
815 {
816 int i;
817 struct ath12k_pdev *pdev;
818
819 for (i = 0; i < ab->num_radios; i++) {
820 pdev = rcu_dereference(ab->pdevs_active[i]);
821 if (pdev && pdev->ar) {
822 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
823 return pdev->ar;
824 }
825 }
826
827 return NULL;
828 }
829
ath12k_mac_get_ar_by_pdev_id(struct ath12k_base * ab,u32 pdev_id)830 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
831 {
832 int i;
833 struct ath12k_pdev *pdev;
834
835 if (ab->hw_params->single_pdev_only) {
836 pdev = rcu_dereference(ab->pdevs_active[0]);
837 return pdev ? pdev->ar : NULL;
838 }
839
840 if (WARN_ON(pdev_id > ab->num_radios))
841 return NULL;
842
843 for (i = 0; i < ab->num_radios; i++) {
844 if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM)
845 pdev = &ab->pdevs[i];
846 else
847 pdev = rcu_dereference(ab->pdevs_active[i]);
848
849 if (pdev && pdev->pdev_id == pdev_id)
850 return (pdev->ar ? pdev->ar : NULL);
851 }
852
853 return NULL;
854 }
855
ath12k_mac_is_ml_arvif(struct ath12k_link_vif * arvif)856 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif)
857 {
858 struct ath12k_vif *ahvif = arvif->ahvif;
859
860 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
861
862 if (ahvif->vif->valid_links & BIT(arvif->link_id))
863 return true;
864
865 return false;
866 }
867
ath12k_mac_get_ar_by_chan(struct ieee80211_hw * hw,struct ieee80211_channel * channel)868 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw,
869 struct ieee80211_channel *channel)
870 {
871 struct ath12k_hw *ah = hw->priv;
872 struct ath12k *ar;
873 int i;
874
875 ar = ah->radio;
876
877 if (ah->num_radio == 1)
878 return ar;
879
880 for_each_ar(ah, ar, i) {
881 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
882 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
883 return ar;
884 }
885 return NULL;
886 }
887
ath12k_get_ar_by_ctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)888 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw,
889 struct ieee80211_chanctx_conf *ctx)
890 {
891 if (!ctx)
892 return NULL;
893
894 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan);
895 }
896
ath12k_get_ar_by_vif(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u8 link_id)897 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw,
898 struct ieee80211_vif *vif,
899 u8 link_id)
900 {
901 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
902 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
903 struct ath12k_link_vif *arvif;
904
905 lockdep_assert_wiphy(hw->wiphy);
906
907 /* If there is one pdev within ah, then we return
908 * ar directly.
909 */
910 if (ah->num_radio == 1)
911 return ah->radio;
912
913 if (!(ahvif->links_map & BIT(link_id)))
914 return NULL;
915
916 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
917 if (arvif && arvif->is_created)
918 return arvif->ar;
919
920 return NULL;
921 }
922
ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)923 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw,
924 struct ieee80211_chanctx_conf *conf,
925 void *data)
926 {
927 struct ath12k_mac_get_any_chanctx_conf_arg *arg = data;
928 struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf);
929
930 if (ctx_ar == arg->ar)
931 arg->chanctx_conf = conf;
932 }
933
ath12k_mac_get_vif_up(struct ath12k * ar)934 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar)
935 {
936 struct ath12k_link_vif *arvif;
937
938 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
939
940 list_for_each_entry(arvif, &ar->arvifs, list) {
941 if (arvif->is_up)
942 return arvif;
943 }
944
945 return NULL;
946 }
947
ath12k_mac_band_match(enum nl80211_band band1,enum WMI_HOST_WLAN_BAND band2)948 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
949 {
950 switch (band1) {
951 case NL80211_BAND_2GHZ:
952 if (band2 & WMI_HOST_WLAN_2GHZ_CAP)
953 return true;
954 break;
955 case NL80211_BAND_5GHZ:
956 case NL80211_BAND_6GHZ:
957 if (band2 & WMI_HOST_WLAN_5GHZ_CAP)
958 return true;
959 break;
960 default:
961 return false;
962 }
963
964 return false;
965 }
966
ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif * arvif)967 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif)
968 {
969 struct ath12k *ar = arvif->ar;
970 struct ath12k_base *ab = ar->ab;
971 struct ieee80211_vif *vif = arvif->ahvif->vif;
972 struct cfg80211_chan_def def;
973 enum nl80211_band band;
974 u8 pdev_id = ab->fw_pdev[0].pdev_id;
975 int i;
976
977 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
978 return pdev_id;
979
980 band = def.chan->band;
981
982 for (i = 0; i < ab->fw_pdev_count; i++) {
983 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands))
984 return ab->fw_pdev[i].pdev_id;
985 }
986
987 return pdev_id;
988 }
989
ath12k_mac_get_target_pdev_id(struct ath12k * ar)990 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar)
991 {
992 struct ath12k_link_vif *arvif;
993 struct ath12k_base *ab = ar->ab;
994
995 if (!ab->hw_params->single_pdev_only)
996 return ar->pdev->pdev_id;
997
998 arvif = ath12k_mac_get_vif_up(ar);
999
1000 /* fw_pdev array has pdev ids derived from phy capability
1001 * service ready event (pdev_and_hw_link_ids).
1002 * If no vif is active, return default first index.
1003 */
1004 if (!arvif)
1005 return ar->ab->fw_pdev[0].pdev_id;
1006
1007 /* If active vif is found, return the pdev id matching chandef band */
1008 return ath12k_mac_get_target_pdev_id_from_vif(arvif);
1009 }
1010
ath12k_pdev_caps_update(struct ath12k * ar)1011 static void ath12k_pdev_caps_update(struct ath12k *ar)
1012 {
1013 struct ath12k_base *ab = ar->ab;
1014
1015 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
1016
1017 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
1018 * But since the received value in svcrdy is same as hw_max_tx_power,
1019 * we can set ar->min_tx_power to 0 currently until
1020 * this is fixed in firmware
1021 */
1022 ar->min_tx_power = 0;
1023
1024 ar->txpower_limit_2g = ar->max_tx_power;
1025 ar->txpower_limit_5g = ar->max_tx_power;
1026 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
1027 }
1028
ath12k_mac_txpower_recalc(struct ath12k * ar)1029 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
1030 {
1031 struct ath12k_pdev *pdev = ar->pdev;
1032 struct ath12k_link_vif *arvif;
1033 int ret, txpower = -1;
1034 u32 param;
1035
1036 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1037
1038 list_for_each_entry(arvif, &ar->arvifs, list) {
1039 if (arvif->txpower <= 0)
1040 continue;
1041
1042 if (txpower == -1)
1043 txpower = arvif->txpower;
1044 else
1045 txpower = min(txpower, arvif->txpower);
1046 }
1047
1048 if (txpower == -1)
1049 return 0;
1050
1051 /* txpwr is set as 2 units per dBm in FW*/
1052 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
1053 ar->max_tx_power) * 2;
1054
1055 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
1056 txpower / 2);
1057
1058 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) &&
1059 ar->txpower_limit_2g != txpower) {
1060 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
1061 ret = ath12k_wmi_pdev_set_param(ar, param,
1062 txpower, ar->pdev->pdev_id);
1063 if (ret)
1064 goto fail;
1065 ar->txpower_limit_2g = txpower;
1066 }
1067
1068 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) &&
1069 ar->txpower_limit_5g != txpower) {
1070 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
1071 ret = ath12k_wmi_pdev_set_param(ar, param,
1072 txpower, ar->pdev->pdev_id);
1073 if (ret)
1074 goto fail;
1075 ar->txpower_limit_5g = txpower;
1076 }
1077
1078 return 0;
1079
1080 fail:
1081 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
1082 txpower / 2, param, ret);
1083 return ret;
1084 }
1085
ath12k_recalc_rtscts_prot(struct ath12k_link_vif * arvif)1086 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif)
1087 {
1088 struct ath12k *ar = arvif->ar;
1089 u32 vdev_param, rts_cts;
1090 int ret;
1091
1092 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1093
1094 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
1095
1096 /* Enable RTS/CTS protection for sw retries (when legacy stations
1097 * are in BSS) or by default only for second rate series.
1098 * TODO: Check if we need to enable CTS 2 Self in any case
1099 */
1100 rts_cts = WMI_USE_RTS_CTS;
1101
1102 if (arvif->num_legacy_stations > 0)
1103 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
1104 else
1105 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
1106
1107 /* Need not send duplicate param value to firmware */
1108 if (arvif->rtscts_prot_mode == rts_cts)
1109 return 0;
1110
1111 arvif->rtscts_prot_mode = rts_cts;
1112
1113 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1114 arvif->vdev_id, rts_cts);
1115
1116 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1117 vdev_param, rts_cts);
1118 if (ret)
1119 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1120 arvif->vdev_id, ret);
1121
1122 return ret;
1123 }
1124
ath12k_mac_set_kickout(struct ath12k_link_vif * arvif)1125 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif)
1126 {
1127 struct ath12k *ar = arvif->ar;
1128 u32 param;
1129 int ret;
1130
1131 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
1132 ATH12K_KICKOUT_THRESHOLD,
1133 ar->pdev->pdev_id);
1134 if (ret) {
1135 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
1136 arvif->vdev_id, ret);
1137 return ret;
1138 }
1139
1140 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
1141 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1142 ATH12K_KEEPALIVE_MIN_IDLE);
1143 if (ret) {
1144 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
1145 arvif->vdev_id, ret);
1146 return ret;
1147 }
1148
1149 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
1150 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1151 ATH12K_KEEPALIVE_MAX_IDLE);
1152 if (ret) {
1153 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
1154 arvif->vdev_id, ret);
1155 return ret;
1156 }
1157
1158 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
1159 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1160 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
1161 if (ret) {
1162 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
1163 arvif->vdev_id, ret);
1164 return ret;
1165 }
1166
1167 return 0;
1168 }
1169
ath12k_mac_peer_cleanup_all(struct ath12k * ar)1170 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
1171 {
1172 struct ath12k_peer *peer, *tmp;
1173 struct ath12k_base *ab = ar->ab;
1174
1175 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1176
1177 spin_lock_bh(&ab->base_lock);
1178 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
1179 /* Skip Rx TID cleanup for self peer */
1180 if (peer->sta)
1181 ath12k_dp_rx_peer_tid_cleanup(ar, peer);
1182
1183 list_del(&peer->list);
1184 kfree(peer);
1185 }
1186 spin_unlock_bh(&ab->base_lock);
1187
1188 ar->num_peers = 0;
1189 ar->num_stations = 0;
1190 }
1191
ath12k_mac_vdev_setup_sync(struct ath12k * ar)1192 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
1193 {
1194 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1195
1196 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
1197 return -ESHUTDOWN;
1198
1199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
1200 ATH12K_VDEV_SETUP_TIMEOUT_HZ);
1201
1202 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
1203 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
1204 return -ETIMEDOUT;
1205
1206 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
1207 }
1208
ath12k_monitor_vdev_up(struct ath12k * ar,int vdev_id)1209 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
1210 {
1211 struct ath12k_wmi_vdev_up_params params = {};
1212 int ret;
1213
1214 params.vdev_id = vdev_id;
1215 params.bssid = ar->mac_addr;
1216 ret = ath12k_wmi_vdev_up(ar, ¶ms);
1217 if (ret) {
1218 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
1219 vdev_id, ret);
1220 return ret;
1221 }
1222
1223 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
1224 vdev_id);
1225 return 0;
1226 }
1227
ath12k_mac_monitor_vdev_start(struct ath12k * ar,int vdev_id,struct cfg80211_chan_def * chandef)1228 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
1229 struct cfg80211_chan_def *chandef)
1230 {
1231 struct ieee80211_channel *channel;
1232 struct wmi_vdev_start_req_arg arg = {};
1233 struct ath12k_wmi_vdev_up_params params = {};
1234 int ret;
1235
1236 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1237
1238 channel = chandef->chan;
1239 arg.vdev_id = vdev_id;
1240 arg.freq = channel->center_freq;
1241 arg.band_center_freq1 = chandef->center_freq1;
1242 arg.band_center_freq2 = chandef->center_freq2;
1243 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
1244 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
1245
1246 arg.min_power = 0;
1247 arg.max_power = channel->max_power;
1248 arg.max_reg_power = channel->max_reg_power;
1249 arg.max_antenna_gain = channel->max_antenna_gain;
1250
1251 arg.pref_tx_streams = ar->num_tx_chains;
1252 arg.pref_rx_streams = ar->num_rx_chains;
1253 arg.punct_bitmap = 0xFFFFFFFF;
1254
1255 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
1256
1257 reinit_completion(&ar->vdev_setup_done);
1258 reinit_completion(&ar->vdev_delete_done);
1259
1260 ret = ath12k_wmi_vdev_start(ar, &arg, false);
1261 if (ret) {
1262 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
1263 vdev_id, ret);
1264 return ret;
1265 }
1266
1267 ret = ath12k_mac_vdev_setup_sync(ar);
1268 if (ret) {
1269 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
1270 vdev_id, ret);
1271 return ret;
1272 }
1273
1274 params.vdev_id = vdev_id;
1275 params.bssid = ar->mac_addr;
1276 ret = ath12k_wmi_vdev_up(ar, ¶ms);
1277 if (ret) {
1278 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
1279 vdev_id, ret);
1280 goto vdev_stop;
1281 }
1282
1283 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
1284 vdev_id);
1285 return 0;
1286
1287 vdev_stop:
1288 ret = ath12k_wmi_vdev_stop(ar, vdev_id);
1289 if (ret)
1290 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
1291 vdev_id, ret);
1292 return ret;
1293 }
1294
ath12k_mac_monitor_vdev_stop(struct ath12k * ar)1295 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
1296 {
1297 int ret;
1298
1299 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1300
1301 reinit_completion(&ar->vdev_setup_done);
1302
1303 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1304 if (ret)
1305 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1306 ar->monitor_vdev_id, ret);
1307
1308 ret = ath12k_mac_vdev_setup_sync(ar);
1309 if (ret)
1310 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1311 ar->monitor_vdev_id, ret);
1312
1313 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1314 if (ret)
1315 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1316 ar->monitor_vdev_id, ret);
1317
1318 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
1319 ar->monitor_vdev_id);
1320 return ret;
1321 }
1322
ath12k_mac_monitor_vdev_delete(struct ath12k * ar)1323 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
1324 {
1325 int ret;
1326 unsigned long time_left;
1327
1328 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1329
1330 if (!ar->monitor_vdev_created)
1331 return 0;
1332
1333 reinit_completion(&ar->vdev_delete_done);
1334
1335 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1336 if (ret) {
1337 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1338 ar->monitor_vdev_id, ret);
1339 return ret;
1340 }
1341
1342 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1343 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
1344 if (time_left == 0) {
1345 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1346 } else {
1347 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1348 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1349 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
1350 ar->monitor_vdev_id);
1351 ar->num_created_vdevs--;
1352 ar->monitor_vdev_id = -1;
1353 ar->monitor_vdev_created = false;
1354 }
1355
1356 return ret;
1357 }
1358
ath12k_mac_monitor_start(struct ath12k * ar)1359 static int ath12k_mac_monitor_start(struct ath12k *ar)
1360 {
1361 struct ath12k_mac_get_any_chanctx_conf_arg arg;
1362 int ret;
1363
1364 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1365
1366 if (ar->monitor_started)
1367 return 0;
1368
1369 arg.ar = ar;
1370 arg.chanctx_conf = NULL;
1371 ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar),
1372 ath12k_mac_get_any_chanctx_conf_iter,
1373 &arg);
1374 if (!arg.chanctx_conf)
1375 return 0;
1376
1377 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id,
1378 &arg.chanctx_conf->def);
1379 if (ret) {
1380 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1381 return ret;
1382 }
1383
1384 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1385 if (ret) {
1386 ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret);
1387 return ret;
1388 }
1389
1390 ar->monitor_started = true;
1391 ar->num_started_vdevs++;
1392
1393 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n");
1394
1395 return 0;
1396 }
1397
ath12k_mac_monitor_stop(struct ath12k * ar)1398 static int ath12k_mac_monitor_stop(struct ath12k *ar)
1399 {
1400 int ret;
1401
1402 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1403
1404 if (!ar->monitor_started)
1405 return 0;
1406
1407 ret = ath12k_mac_monitor_vdev_stop(ar);
1408 if (ret) {
1409 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1410 return ret;
1411 }
1412
1413 ar->monitor_started = false;
1414 ar->num_started_vdevs--;
1415 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1416 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1417 return ret;
1418 }
1419
ath12k_mac_vdev_stop(struct ath12k_link_vif * arvif)1420 int ath12k_mac_vdev_stop(struct ath12k_link_vif *arvif)
1421 {
1422 struct ath12k_vif *ahvif = arvif->ahvif;
1423 struct ath12k *ar = arvif->ar;
1424 int ret;
1425
1426 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1427
1428 reinit_completion(&ar->vdev_setup_done);
1429
1430 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
1431 if (ret) {
1432 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
1433 arvif->vdev_id, ret);
1434 goto err;
1435 }
1436
1437 ret = ath12k_mac_vdev_setup_sync(ar);
1438 if (ret) {
1439 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
1440 arvif->vdev_id, ret);
1441 goto err;
1442 }
1443
1444 WARN_ON(ar->num_started_vdevs == 0);
1445
1446 ar->num_started_vdevs--;
1447 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
1448 ahvif->vif->addr, arvif->vdev_id);
1449
1450 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) {
1451 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
1452 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
1453 arvif->vdev_id);
1454 }
1455
1456 return 0;
1457 err:
1458 return ret;
1459 }
1460
ath12k_mac_op_config(struct ieee80211_hw * hw,int radio_idx,u32 changed)1461 static int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed)
1462 {
1463 return 0;
1464 }
1465
ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif * arvif,struct sk_buff * bcn)1466 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif *arvif,
1467 struct sk_buff *bcn)
1468 {
1469 struct ath12k *ar = arvif->ar;
1470 struct ieee80211_mgmt *mgmt;
1471 const u8 *p2p_ie;
1472 int ret;
1473
1474 mgmt = (void *)bcn->data;
1475 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1476 mgmt->u.beacon.variable,
1477 bcn->len - (mgmt->u.beacon.variable -
1478 bcn->data));
1479 if (!p2p_ie) {
1480 ath12k_warn(ar->ab, "no P2P ie found in beacon\n");
1481 return -ENOENT;
1482 }
1483
1484 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1485 if (ret) {
1486 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n",
1487 arvif->vdev_id, ret);
1488 return ret;
1489 }
1490
1491 return 0;
1492 }
1493
ath12k_mac_remove_vendor_ie(struct sk_buff * skb,unsigned int oui,u8 oui_type,size_t ie_offset)1494 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1495 u8 oui_type, size_t ie_offset)
1496 {
1497 const u8 *next, *end;
1498 size_t len;
1499 u8 *ie;
1500
1501 if (WARN_ON(skb->len < ie_offset))
1502 return -EINVAL;
1503
1504 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1505 skb->data + ie_offset,
1506 skb->len - ie_offset);
1507 if (!ie)
1508 return -ENOENT;
1509
1510 len = ie[1] + 2;
1511 end = skb->data + skb->len;
1512 next = ie + len;
1513
1514 if (WARN_ON(next > end))
1515 return -EINVAL;
1516
1517 memmove(ie, next, end - next);
1518 skb_trim(skb, skb->len - len);
1519
1520 return 0;
1521 }
1522
ath12k_mac_set_arvif_ies(struct ath12k_link_vif * arvif,struct ath12k_link_vif * tx_arvif,struct sk_buff * bcn,u8 bssid_index,bool * nontx_profile_found)1523 static void ath12k_mac_set_arvif_ies(struct ath12k_link_vif *arvif,
1524 struct ath12k_link_vif *tx_arvif,
1525 struct sk_buff *bcn,
1526 u8 bssid_index, bool *nontx_profile_found)
1527 {
1528 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data;
1529 const struct element *elem, *nontx, *index, *nie, *ext_cap_ie;
1530 const u8 *start, *tail;
1531 u16 rem_len;
1532 u8 i;
1533
1534 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon);
1535 tail = skb_tail_pointer(bcn);
1536 rem_len = tail - start;
1537
1538 arvif->rsnie_present = false;
1539 arvif->wpaie_present = false;
1540
1541 if (cfg80211_find_ie(WLAN_EID_RSN, start, rem_len))
1542 arvif->rsnie_present = true;
1543 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPA,
1544 start, rem_len))
1545 arvif->wpaie_present = true;
1546
1547 ext_cap_ie = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, start, rem_len);
1548 if (ext_cap_ie && ext_cap_ie->datalen >= 11 &&
1549 (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT))
1550 tx_arvif->beacon_prot = true;
1551
1552 /* Return from here for the transmitted profile */
1553 if (!bssid_index)
1554 return;
1555
1556 /* Initial rsnie_present for the nontransmitted profile is set to be same as that
1557 * of the transmitted profile. It will be changed if security configurations are
1558 * different.
1559 */
1560 *nontx_profile_found = false;
1561 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, rem_len) {
1562 /* Fixed minimum MBSSID element length with at least one
1563 * nontransmitted BSSID profile is 12 bytes as given below;
1564 * 1 (max BSSID indicator) +
1565 * 2 (Nontransmitted BSSID profile: Subelement ID + length) +
1566 * 4 (Nontransmitted BSSID Capabilities: tag + length + info)
1567 * 2 (Nontransmitted BSSID SSID: tag + length)
1568 * 3 (Nontransmitted BSSID Index: tag + length + BSSID index
1569 */
1570 if (elem->datalen < 12 || elem->data[0] < 1)
1571 continue; /* Max BSSID indicator must be >=1 */
1572
1573 for_each_element(nontx, elem->data + 1, elem->datalen - 1) {
1574 start = nontx->data;
1575
1576 if (nontx->id != 0 || nontx->datalen < 4)
1577 continue; /* Invalid nontransmitted profile */
1578
1579 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
1580 nontx->data[1] != 2) {
1581 continue; /* Missing nontransmitted BSS capabilities */
1582 }
1583
1584 if (nontx->data[4] != WLAN_EID_SSID)
1585 continue; /* Missing SSID for nontransmitted BSS */
1586
1587 index = cfg80211_find_elem(WLAN_EID_MULTI_BSSID_IDX,
1588 start, nontx->datalen);
1589 if (!index || index->datalen < 1 || index->data[0] == 0)
1590 continue; /* Invalid MBSSID Index element */
1591
1592 if (index->data[0] == bssid_index) {
1593 *nontx_profile_found = true;
1594
1595 /* Check if nontx BSS has beacon protection enabled */
1596 if (!tx_arvif->beacon_prot) {
1597 ext_cap_ie =
1598 cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY,
1599 nontx->data,
1600 nontx->datalen);
1601 if (ext_cap_ie && ext_cap_ie->datalen >= 11 &&
1602 (ext_cap_ie->data[10] &
1603 WLAN_EXT_CAPA11_BCN_PROTECT))
1604 tx_arvif->beacon_prot = true;
1605 }
1606
1607 if (cfg80211_find_ie(WLAN_EID_RSN,
1608 nontx->data,
1609 nontx->datalen)) {
1610 arvif->rsnie_present = true;
1611 return;
1612 } else if (!arvif->rsnie_present) {
1613 return; /* Both tx and nontx BSS are open */
1614 }
1615
1616 nie = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
1617 nontx->data,
1618 nontx->datalen);
1619 if (!nie || nie->datalen < 2)
1620 return; /* Invalid non-inheritance element */
1621
1622 for (i = 1; i < nie->datalen - 1; i++) {
1623 if (nie->data[i] == WLAN_EID_RSN) {
1624 arvif->rsnie_present = false;
1625 break;
1626 }
1627 }
1628
1629 return;
1630 }
1631 }
1632 }
1633 }
1634
ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif * arvif,struct ath12k_link_vif * tx_arvif,u8 bssid_index)1635 static int ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif *arvif,
1636 struct ath12k_link_vif *tx_arvif,
1637 u8 bssid_index)
1638 {
1639 struct ath12k_wmi_bcn_tmpl_ema_arg ema_args;
1640 struct ieee80211_ema_beacons *beacons;
1641 bool nontx_profile_found = false;
1642 int ret = 0;
1643 u8 i;
1644
1645 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar),
1646 tx_arvif->ahvif->vif,
1647 tx_arvif->link_id);
1648 if (!beacons || !beacons->cnt) {
1649 ath12k_warn(arvif->ar->ab,
1650 "failed to get ema beacon templates from mac80211\n");
1651 return -EPERM;
1652 }
1653
1654 if (tx_arvif == arvif)
1655 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL);
1656
1657 for (i = 0; i < beacons->cnt; i++) {
1658 if (tx_arvif != arvif && !nontx_profile_found)
1659 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb,
1660 bssid_index,
1661 &nontx_profile_found);
1662
1663 ema_args.bcn_cnt = beacons->cnt;
1664 ema_args.bcn_index = i;
1665 ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs,
1666 beacons->bcn[i].skb, &ema_args);
1667 if (ret) {
1668 ath12k_warn(tx_arvif->ar->ab,
1669 "failed to set ema beacon template id %i error %d\n",
1670 i, ret);
1671 break;
1672 }
1673 }
1674
1675 if (tx_arvif != arvif && !nontx_profile_found)
1676 ath12k_warn(arvif->ar->ab,
1677 "nontransmitted bssid index %u not found in beacon template\n",
1678 bssid_index);
1679
1680 ieee80211_beacon_free_ema_list(beacons);
1681 return ret;
1682 }
1683
ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif * arvif)1684 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif)
1685 {
1686 struct ath12k_vif *ahvif = arvif->ahvif;
1687 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
1688 struct ieee80211_bss_conf *link_conf;
1689 struct ath12k_link_vif *tx_arvif;
1690 struct ath12k *ar = arvif->ar;
1691 struct ath12k_base *ab = ar->ab;
1692 struct ieee80211_mutable_offsets offs = {};
1693 bool nontx_profile_found = false;
1694 struct sk_buff *bcn;
1695 int ret;
1696
1697 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP)
1698 return 0;
1699
1700 link_conf = ath12k_mac_get_link_bss_conf(arvif);
1701 if (!link_conf) {
1702 ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n",
1703 vif->addr, arvif->link_id);
1704 return -ENOLINK;
1705 }
1706
1707 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
1708 if (tx_arvif) {
1709 if (tx_arvif != arvif && arvif->is_up)
1710 return 0;
1711
1712 if (link_conf->ema_ap)
1713 return ath12k_mac_setup_bcn_tmpl_ema(arvif, tx_arvif,
1714 link_conf->bssid_index);
1715 } else {
1716 tx_arvif = arvif;
1717 }
1718
1719 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar),
1720 tx_arvif->ahvif->vif,
1721 &offs, tx_arvif->link_id);
1722 if (!bcn) {
1723 ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1724 return -EPERM;
1725 }
1726
1727 if (tx_arvif == arvif) {
1728 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 0, NULL);
1729 } else {
1730 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn,
1731 link_conf->bssid_index,
1732 &nontx_profile_found);
1733 if (!nontx_profile_found)
1734 ath12k_warn(ab,
1735 "nontransmitted profile not found in beacon template\n");
1736 }
1737
1738 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) {
1739 ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn);
1740 if (ret) {
1741 ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n",
1742 ret);
1743 goto free_bcn_skb;
1744 }
1745
1746 /* P2P IE is inserted by firmware automatically (as
1747 * configured above) so remove it from the base beacon
1748 * template to avoid duplicate P2P IEs in beacon frames.
1749 */
1750 ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA,
1751 WLAN_OUI_TYPE_WFA_P2P,
1752 offsetof(struct ieee80211_mgmt,
1753 u.beacon.variable));
1754 if (ret) {
1755 ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n",
1756 ret);
1757 goto free_bcn_skb;
1758 }
1759 }
1760
1761 ret = ath12k_wmi_bcn_tmpl(arvif, &offs, bcn, NULL);
1762
1763 if (ret)
1764 ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1765 ret);
1766
1767 free_bcn_skb:
1768 kfree_skb(bcn);
1769 return ret;
1770 }
1771
ath12k_control_beaconing(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)1772 static void ath12k_control_beaconing(struct ath12k_link_vif *arvif,
1773 struct ieee80211_bss_conf *info)
1774 {
1775 struct ath12k_wmi_vdev_up_params params = {};
1776 struct ath12k_vif *ahvif = arvif->ahvif;
1777 struct ath12k *ar = arvif->ar;
1778 int ret;
1779
1780 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy);
1781
1782 if (!info->enable_beacon) {
1783 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1784 if (ret)
1785 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1786 arvif->vdev_id, ret);
1787
1788 arvif->is_up = false;
1789 return;
1790 }
1791
1792 /* Install the beacon template to the FW */
1793 ret = ath12k_mac_setup_bcn_tmpl(arvif);
1794 if (ret) {
1795 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1796 ret);
1797 return;
1798 }
1799
1800 ahvif->aid = 0;
1801
1802 ether_addr_copy(arvif->bssid, info->addr);
1803
1804 params.vdev_id = arvif->vdev_id;
1805 params.aid = ahvif->aid;
1806 params.bssid = arvif->bssid;
1807 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
1808 if (params.tx_bssid) {
1809 params.nontx_profile_idx = info->bssid_index;
1810 params.nontx_profile_cnt = 1 << info->bssid_indicator;
1811 }
1812 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
1813 if (ret) {
1814 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1815 arvif->vdev_id, ret);
1816 return;
1817 }
1818
1819 arvif->is_up = true;
1820
1821 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1822 }
1823
ath12k_mac_handle_beacon_iter(void * data,u8 * mac,struct ieee80211_vif * vif)1824 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac,
1825 struct ieee80211_vif *vif)
1826 {
1827 struct sk_buff *skb = data;
1828 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1829 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
1830 struct ath12k_link_vif *arvif = &ahvif->deflink;
1831
1832 if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created)
1833 return;
1834
1835 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1836 return;
1837
1838 cancel_delayed_work(&arvif->connection_loss_work);
1839 }
1840
ath12k_mac_handle_beacon(struct ath12k * ar,struct sk_buff * skb)1841 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb)
1842 {
1843 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
1844 IEEE80211_IFACE_ITER_NORMAL,
1845 ath12k_mac_handle_beacon_iter,
1846 skb);
1847 }
1848
ath12k_mac_handle_beacon_miss(struct ath12k * ar,struct ath12k_link_vif * arvif)1849 void ath12k_mac_handle_beacon_miss(struct ath12k *ar,
1850 struct ath12k_link_vif *arvif)
1851 {
1852 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1853 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1854
1855 if (!(arvif->is_created && arvif->is_up))
1856 return;
1857
1858 ieee80211_beacon_loss(vif);
1859
1860 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1861 * (done by mac80211) succeeds but beacons do not resume then it
1862 * doesn't make sense to continue operation. Queue connection loss work
1863 * which can be cancelled when beacon is received.
1864 */
1865 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1866 ATH12K_CONNECTION_LOSS_HZ);
1867 }
1868
ath12k_mac_vif_sta_connection_loss_work(struct work_struct * work)1869 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1870 {
1871 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif,
1872 connection_loss_work.work);
1873 struct ieee80211_vif *vif = arvif->ahvif->vif;
1874
1875 if (!arvif->is_up)
1876 return;
1877
1878 ieee80211_connection_loss(vif);
1879 }
1880
ath12k_peer_assoc_h_basic(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1881 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1882 struct ath12k_link_vif *arvif,
1883 struct ath12k_link_sta *arsta,
1884 struct ath12k_wmi_peer_assoc_arg *arg)
1885 {
1886 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1887 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1888 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1889 struct ieee80211_bss_conf *bss_conf;
1890 u32 aid;
1891
1892 lockdep_assert_wiphy(hw->wiphy);
1893
1894 if (vif->type == NL80211_IFTYPE_STATION)
1895 aid = vif->cfg.aid;
1896 else
1897 aid = sta->aid;
1898
1899 ether_addr_copy(arg->peer_mac, arsta->addr);
1900 arg->vdev_id = arvif->vdev_id;
1901 arg->peer_associd = aid;
1902 arg->auth_flag = true;
1903 /* TODO: STA WAR in ath10k for listen interval required? */
1904 arg->peer_listen_intval = hw->conf.listen_interval;
1905 arg->peer_nss = 1;
1906
1907 bss_conf = ath12k_mac_get_link_bss_conf(arvif);
1908 if (!bss_conf) {
1909 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n",
1910 vif->addr, arvif->link_id);
1911 return;
1912 }
1913
1914 arg->peer_caps = bss_conf->assoc_capability;
1915 }
1916
ath12k_peer_assoc_h_crypto(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1917 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1918 struct ath12k_link_vif *arvif,
1919 struct ath12k_link_sta *arsta,
1920 struct ath12k_wmi_peer_assoc_arg *arg)
1921 {
1922 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1923 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1924 struct ieee80211_bss_conf *info;
1925 struct cfg80211_chan_def def;
1926 struct cfg80211_bss *bss;
1927 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1928 const u8 *rsnie = NULL;
1929 const u8 *wpaie = NULL;
1930
1931 lockdep_assert_wiphy(hw->wiphy);
1932
1933 info = ath12k_mac_get_link_bss_conf(arvif);
1934 if (!info) {
1935 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n",
1936 vif->addr, arvif->link_id);
1937 return;
1938 }
1939
1940 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1941 return;
1942
1943 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1944 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1945
1946 if (arvif->rsnie_present || arvif->wpaie_present) {
1947 arg->need_ptk_4_way = true;
1948 if (arvif->wpaie_present)
1949 arg->need_gtk_2_way = true;
1950 } else if (bss) {
1951 const struct cfg80211_bss_ies *ies;
1952
1953 rcu_read_lock();
1954 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1955
1956 ies = rcu_dereference(bss->ies);
1957
1958 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1959 WLAN_OUI_TYPE_MICROSOFT_WPA,
1960 ies->data,
1961 ies->len);
1962 rcu_read_unlock();
1963 cfg80211_put_bss(hw->wiphy, bss);
1964 }
1965
1966 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1967 if (rsnie || wpaie) {
1968 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1969 "%s: rsn ie found\n", __func__);
1970 arg->need_ptk_4_way = true;
1971 }
1972
1973 if (wpaie) {
1974 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1975 "%s: wpa ie found\n", __func__);
1976 arg->need_gtk_2_way = true;
1977 }
1978
1979 if (sta->mfp) {
1980 /* TODO: Need to check if FW supports PMF? */
1981 arg->is_pmf_enabled = true;
1982 }
1983
1984 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1985 }
1986
ath12k_peer_assoc_h_rates(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1987 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1988 struct ath12k_link_vif *arvif,
1989 struct ath12k_link_sta *arsta,
1990 struct ath12k_wmi_peer_assoc_arg *arg)
1991 {
1992 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1993 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1994 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1995 struct ieee80211_link_sta *link_sta;
1996 struct cfg80211_chan_def def;
1997 const struct ieee80211_supported_band *sband;
1998 const struct ieee80211_rate *rates;
1999 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2000 enum nl80211_band band;
2001 u32 ratemask;
2002 u8 rate;
2003 int i;
2004
2005 lockdep_assert_wiphy(hw->wiphy);
2006
2007 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2008 return;
2009
2010 link_sta = ath12k_mac_get_link_sta(arsta);
2011 if (!link_sta) {
2012 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n",
2013 sta->addr, arsta->link_id);
2014 return;
2015 }
2016
2017 band = def.chan->band;
2018 sband = hw->wiphy->bands[band];
2019 ratemask = link_sta->supp_rates[band];
2020 ratemask &= arvif->bitrate_mask.control[band].legacy;
2021 rates = sband->bitrates;
2022
2023 rateset->num_rates = 0;
2024
2025 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2026 if (!(ratemask & 1))
2027 continue;
2028
2029 rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
2030 rateset->rates[rateset->num_rates] = rate;
2031 rateset->num_rates++;
2032 }
2033 }
2034
2035 static bool
ath12k_peer_assoc_h_ht_masked(const u8 * ht_mcs_mask)2036 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
2037 {
2038 int nss;
2039
2040 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2041 if (ht_mcs_mask[nss])
2042 return false;
2043
2044 return true;
2045 }
2046
2047 static bool
ath12k_peer_assoc_h_vht_masked(const u16 * vht_mcs_mask)2048 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
2049 {
2050 int nss;
2051
2052 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2053 if (vht_mcs_mask[nss])
2054 return false;
2055
2056 return true;
2057 }
2058
ath12k_peer_assoc_h_ht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2059 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
2060 struct ath12k_link_vif *arvif,
2061 struct ath12k_link_sta *arsta,
2062 struct ath12k_wmi_peer_assoc_arg *arg)
2063 {
2064 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2065 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2066 const struct ieee80211_sta_ht_cap *ht_cap;
2067 struct ieee80211_link_sta *link_sta;
2068 struct cfg80211_chan_def def;
2069 enum nl80211_band band;
2070 const u8 *ht_mcs_mask;
2071 int i, n;
2072 u8 max_nss;
2073 u32 stbc;
2074
2075 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2076
2077 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2078 return;
2079
2080 link_sta = ath12k_mac_get_link_sta(arsta);
2081 if (!link_sta) {
2082 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n",
2083 sta->addr, arsta->link_id);
2084 return;
2085 }
2086
2087 ht_cap = &link_sta->ht_cap;
2088 if (!ht_cap->ht_supported)
2089 return;
2090
2091 band = def.chan->band;
2092 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2093
2094 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
2095 return;
2096
2097 arg->ht_flag = true;
2098
2099 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2100 ht_cap->ampdu_factor)) - 1;
2101
2102 arg->peer_mpdu_density =
2103 ath12k_parse_mpdudensity(ht_cap->ampdu_density);
2104
2105 arg->peer_ht_caps = ht_cap->cap;
2106 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
2107
2108 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2109 arg->ldpc_flag = true;
2110
2111 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2112 arg->bw_40 = true;
2113 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
2114 }
2115
2116 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20
2117 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both
2118 * flags if guard interval is to force Long GI
2119 */
2120 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) {
2121 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40);
2122 } else {
2123 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */
2124 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40))
2125 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
2126 }
2127
2128 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2129 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
2130 arg->stbc_flag = true;
2131 }
2132
2133 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2134 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2135 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2136 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
2137 arg->peer_rate_caps |= stbc;
2138 arg->stbc_flag = true;
2139 }
2140
2141 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2142 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
2143 else if (ht_cap->mcs.rx_mask[1])
2144 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
2145
2146 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2147 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2148 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2149 max_nss = (i / 8) + 1;
2150 arg->peer_ht_rates.rates[n++] = i;
2151 }
2152
2153 /* This is a workaround for HT-enabled STAs which break the spec
2154 * and have no HT capabilities RX mask (no HT RX MCS map).
2155 *
2156 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2157 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2158 *
2159 * Firmware asserts if such situation occurs.
2160 */
2161 if (n == 0) {
2162 arg->peer_ht_rates.num_rates = 8;
2163 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2164 arg->peer_ht_rates.rates[i] = i;
2165 } else {
2166 arg->peer_ht_rates.num_rates = n;
2167 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2168 }
2169
2170 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2171 arg->peer_mac,
2172 arg->peer_ht_rates.num_rates,
2173 arg->peer_nss);
2174 }
2175
ath12k_mac_get_max_vht_mcs_map(u16 mcs_map,int nss)2176 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
2177 {
2178 switch ((mcs_map >> (2 * nss)) & 0x3) {
2179 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
2180 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
2181 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
2182 }
2183 return 0;
2184 }
2185
2186 static u16
ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])2187 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2188 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2189 {
2190 int idx_limit;
2191 int nss;
2192 u16 mcs_map;
2193 u16 mcs;
2194
2195 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2196 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2197 vht_mcs_limit[nss];
2198
2199 if (mcs_map)
2200 idx_limit = fls(mcs_map) - 1;
2201 else
2202 idx_limit = -1;
2203
2204 switch (idx_limit) {
2205 case 0:
2206 case 1:
2207 case 2:
2208 case 3:
2209 case 4:
2210 case 5:
2211 case 6:
2212 case 7:
2213 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2214 break;
2215 case 8:
2216 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2217 break;
2218 case 9:
2219 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2220 break;
2221 default:
2222 WARN_ON(1);
2223 fallthrough;
2224 case -1:
2225 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2226 break;
2227 }
2228
2229 tx_mcs_set &= ~(0x3 << (nss * 2));
2230 tx_mcs_set |= mcs << (nss * 2);
2231 }
2232
2233 return tx_mcs_set;
2234 }
2235
ath12k_get_nss_160mhz(struct ath12k * ar,u8 max_nss)2236 static u8 ath12k_get_nss_160mhz(struct ath12k *ar,
2237 u8 max_nss)
2238 {
2239 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2240 u8 max_sup_nss = 0;
2241
2242 switch (nss_ratio_info) {
2243 case WMI_NSS_RATIO_1BY2_NSS:
2244 max_sup_nss = max_nss >> 1;
2245 break;
2246 case WMI_NSS_RATIO_3BY4_NSS:
2247 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2248 break;
2249 case WMI_NSS_RATIO_1_NSS:
2250 max_sup_nss = max_nss;
2251 break;
2252 case WMI_NSS_RATIO_2_NSS:
2253 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2254 break;
2255 default:
2256 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n",
2257 nss_ratio_info);
2258 break;
2259 }
2260
2261 return max_sup_nss;
2262 }
2263
ath12k_peer_assoc_h_vht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2264 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
2265 struct ath12k_link_vif *arvif,
2266 struct ath12k_link_sta *arsta,
2267 struct ath12k_wmi_peer_assoc_arg *arg)
2268 {
2269 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2270 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2271 const struct ieee80211_sta_vht_cap *vht_cap;
2272 struct ieee80211_link_sta *link_sta;
2273 struct cfg80211_chan_def def;
2274 enum nl80211_band band;
2275 u16 *vht_mcs_mask;
2276 u8 ampdu_factor;
2277 u8 max_nss, vht_mcs;
2278 int i, vht_nss, nss_idx;
2279 bool user_rate_valid = true;
2280 u32 rx_nss, tx_nss, nss_160;
2281
2282 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2283
2284 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2285 return;
2286
2287 link_sta = ath12k_mac_get_link_sta(arsta);
2288 if (!link_sta) {
2289 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n",
2290 sta->addr, arsta->link_id);
2291 return;
2292 }
2293
2294 vht_cap = &link_sta->vht_cap;
2295 if (!vht_cap->vht_supported)
2296 return;
2297
2298 band = def.chan->band;
2299 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2300
2301 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
2302 return;
2303
2304 arg->vht_flag = true;
2305
2306 /* TODO: similar flags required? */
2307 arg->vht_capable = true;
2308
2309 if (def.chan->band == NL80211_BAND_2GHZ)
2310 arg->vht_ng_flag = true;
2311
2312 arg->peer_vht_caps = vht_cap->cap;
2313
2314 ampdu_factor = (vht_cap->cap &
2315 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2316 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2317
2318 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2319 * zero in VHT IE. Using it would result in degraded throughput.
2320 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2321 * it if VHT max_mpdu is smaller.
2322 */
2323 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2324 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2325 ampdu_factor)) - 1);
2326
2327 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2328 arg->bw_80 = true;
2329
2330 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2331 arg->bw_160 = true;
2332
2333 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
2334
2335 if (vht_nss > link_sta->rx_nss) {
2336 user_rate_valid = false;
2337 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2338 if (vht_mcs_mask[nss_idx]) {
2339 user_rate_valid = true;
2340 break;
2341 }
2342 }
2343 }
2344
2345 if (!user_rate_valid) {
2346 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2347 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n",
2348 link_sta->rx_nss, arsta->addr);
2349 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2350 }
2351
2352 /* Calculate peer NSS capability from VHT capabilities if STA
2353 * supports VHT.
2354 */
2355 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2356 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2357 (2 * i) & 3;
2358
2359 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2360 vht_mcs_mask[i])
2361 max_nss = i + 1;
2362 }
2363 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2364 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2365 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2366 arg->rx_mcs_set = ath12k_peer_assoc_h_vht_limit(arg->rx_mcs_set, vht_mcs_mask);
2367
2368 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2369 arg->tx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
2370
2371 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
2372 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
2373 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2374 */
2375 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2376 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2377
2378 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2379 IEEE80211_VHT_MCS_NOT_SUPPORTED)
2380 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2381
2382 /* TODO: Check */
2383 arg->tx_max_mcs_nss = 0xFF;
2384
2385 if (arg->peer_phymode == MODE_11AC_VHT160) {
2386 tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
2387 rx_nss = min(arg->peer_nss, tx_nss);
2388 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2389
2390 if (!rx_nss) {
2391 ath12k_warn(ar->ab, "invalid max_nss\n");
2392 return;
2393 }
2394
2395 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2396 arg->peer_bw_rxnss_override |= nss_160;
2397 }
2398
2399 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2400 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2401 arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
2402 arg->peer_bw_rxnss_override);
2403 }
2404
ath12k_mac_get_max_he_mcs_map(u16 mcs_map,int nss)2405 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2406 {
2407 switch ((mcs_map >> (2 * nss)) & 0x3) {
2408 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2409 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2410 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2411 }
2412 return 0;
2413 }
2414
ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,const u16 * he_mcs_limit)2415 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2416 const u16 *he_mcs_limit)
2417 {
2418 int idx_limit;
2419 int nss;
2420 u16 mcs_map;
2421 u16 mcs;
2422
2423 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2424 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2425 he_mcs_limit[nss];
2426
2427 if (mcs_map)
2428 idx_limit = fls(mcs_map) - 1;
2429 else
2430 idx_limit = -1;
2431
2432 switch (idx_limit) {
2433 case 0 ... 7:
2434 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2435 break;
2436 case 8:
2437 case 9:
2438 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2439 break;
2440 case 10:
2441 case 11:
2442 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2443 break;
2444 default:
2445 WARN_ON(1);
2446 fallthrough;
2447 case -1:
2448 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2449 break;
2450 }
2451
2452 tx_mcs_set &= ~(0x3 << (nss * 2));
2453 tx_mcs_set |= mcs << (nss * 2);
2454 }
2455
2456 return tx_mcs_set;
2457 }
2458
2459 static bool
ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])2460 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2461 {
2462 int nss;
2463
2464 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2465 if (he_mcs_mask[nss])
2466 return false;
2467
2468 return true;
2469 }
2470
ath12k_peer_assoc_h_he(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2471 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
2472 struct ath12k_link_vif *arvif,
2473 struct ath12k_link_sta *arsta,
2474 struct ath12k_wmi_peer_assoc_arg *arg)
2475 {
2476 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2477 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2478 const struct ieee80211_sta_he_cap *he_cap;
2479 struct ieee80211_bss_conf *link_conf;
2480 struct ieee80211_link_sta *link_sta;
2481 struct cfg80211_chan_def def;
2482 int i;
2483 u8 ampdu_factor, max_nss;
2484 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2485 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2486 u16 mcs_160_map, mcs_80_map;
2487 u8 link_id = arvif->link_id;
2488 bool support_160;
2489 enum nl80211_band band;
2490 u16 *he_mcs_mask;
2491 u8 he_mcs;
2492 u16 he_tx_mcs = 0, v = 0;
2493 int he_nss, nss_idx;
2494 bool user_rate_valid = true;
2495 u32 rx_nss, tx_nss, nss_160;
2496
2497 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
2498 return;
2499
2500 link_conf = ath12k_mac_get_link_bss_conf(arvif);
2501 if (!link_conf) {
2502 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u",
2503 vif->addr, link_id);
2504 return;
2505 }
2506
2507 link_sta = ath12k_mac_get_link_sta(arsta);
2508 if (!link_sta) {
2509 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2510 sta->addr, arsta->link_id);
2511 return;
2512 }
2513
2514 he_cap = &link_sta->he_cap;
2515 if (!he_cap->has_he)
2516 return;
2517
2518 band = def.chan->band;
2519 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2520
2521 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask))
2522 return;
2523
2524 arg->he_flag = true;
2525
2526 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2527 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2528
2529 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2530 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2531 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2532
2533 if (support_160) {
2534 for (i = 7; i >= 0; i--) {
2535 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2536
2537 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2538 rx_mcs_160 = i + 1;
2539 break;
2540 }
2541 }
2542 }
2543
2544 for (i = 7; i >= 0; i--) {
2545 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2546
2547 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2548 rx_mcs_80 = i + 1;
2549 break;
2550 }
2551 }
2552
2553 if (support_160)
2554 max_nss = min(rx_mcs_80, rx_mcs_160);
2555 else
2556 max_nss = rx_mcs_80;
2557
2558 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2559
2560 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
2561 sizeof(he_cap->he_cap_elem.mac_cap_info));
2562 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
2563 sizeof(he_cap->he_cap_elem.phy_cap_info));
2564 arg->peer_he_ops = link_conf->he_oper.params;
2565
2566 /* the top most byte is used to indicate BSS color info */
2567 arg->peer_he_ops &= 0xffffff;
2568
2569 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
2570 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
2571 * as calculated while parsing VHT caps(if VHT caps is present)
2572 * or HT caps (if VHT caps is not present).
2573 *
2574 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
2575 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2576 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2577 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2578 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2579 * length.
2580 */
2581 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2582 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2583
2584 if (ampdu_factor) {
2585 if (link_sta->vht_cap.vht_supported)
2586 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2587 ampdu_factor)) - 1;
2588 else if (link_sta->ht_cap.ht_supported)
2589 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2590 ampdu_factor)) - 1;
2591 }
2592
2593 if (he_cap->he_cap_elem.phy_cap_info[6] &
2594 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2595 int bit = 7;
2596 int nss, ru;
2597
2598 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2599 IEEE80211_PPE_THRES_NSS_MASK;
2600 arg->peer_ppet.ru_bit_mask =
2601 (he_cap->ppe_thres[0] &
2602 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2603 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2604
2605 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2606 for (ru = 0; ru < 4; ru++) {
2607 u32 val = 0;
2608 int i;
2609
2610 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2611 continue;
2612 for (i = 0; i < 6; i++) {
2613 val >>= 1;
2614 val |= ((he_cap->ppe_thres[bit / 8] >>
2615 (bit % 8)) & 0x1) << 5;
2616 bit++;
2617 }
2618 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2619 val << (ru * 6);
2620 }
2621 }
2622 }
2623
2624 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2625 arg->twt_responder = true;
2626 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2627 arg->twt_requester = true;
2628
2629 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
2630
2631 if (he_nss > link_sta->rx_nss) {
2632 user_rate_valid = false;
2633 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2634 if (he_mcs_mask[nss_idx]) {
2635 user_rate_valid = true;
2636 break;
2637 }
2638 }
2639 }
2640
2641 if (!user_rate_valid) {
2642 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2643 "Setting he range MCS value to peer supported nss:%d for peer %pM\n",
2644 link_sta->rx_nss, arsta->addr);
2645 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2646 }
2647
2648 switch (link_sta->bandwidth) {
2649 case IEEE80211_STA_RX_BW_160:
2650 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2651 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2652 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2653
2654 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2655 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2656
2657 arg->peer_he_mcs_count++;
2658 if (!he_tx_mcs)
2659 he_tx_mcs = v;
2660 fallthrough;
2661
2662 default:
2663 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2664 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2665 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2666
2667 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2668 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2669
2670 arg->peer_he_mcs_count++;
2671 if (!he_tx_mcs)
2672 he_tx_mcs = v;
2673 break;
2674 }
2675
2676 /* Calculate peer NSS capability from HE capabilities if STA
2677 * supports HE.
2678 */
2679 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2680 he_mcs = he_tx_mcs >> (2 * i) & 3;
2681
2682 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2683 * unsupported range, with he_mcs_mask set, so check either of them
2684 * to find nss.
2685 */
2686 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2687 he_mcs_mask[i])
2688 max_nss = i + 1;
2689 }
2690
2691 max_nss = min(max_nss, ar->num_tx_chains);
2692 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2693
2694 if (arg->peer_phymode == MODE_11AX_HE160) {
2695 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
2696 rx_nss = min(arg->peer_nss, tx_nss);
2697
2698 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
2699 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2700
2701 if (!rx_nss) {
2702 ath12k_warn(ar->ab, "invalid max_nss\n");
2703 return;
2704 }
2705
2706 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2707 arg->peer_bw_rxnss_override |= nss_160;
2708 }
2709
2710 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2711 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2712 arsta->addr, arg->peer_nss,
2713 arg->peer_he_mcs_count,
2714 arg->peer_bw_rxnss_override);
2715 }
2716
ath12k_peer_assoc_h_he_6ghz(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2717 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
2718 struct ath12k_link_vif *arvif,
2719 struct ath12k_link_sta *arsta,
2720 struct ath12k_wmi_peer_assoc_arg *arg)
2721 {
2722 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2723 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2724 const struct ieee80211_sta_he_cap *he_cap;
2725 struct ieee80211_link_sta *link_sta;
2726 struct cfg80211_chan_def def;
2727 enum nl80211_band band;
2728 u8 ampdu_factor, mpdu_density;
2729
2730 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2731 return;
2732
2733 band = def.chan->band;
2734
2735 link_sta = ath12k_mac_get_link_sta(arsta);
2736 if (!link_sta) {
2737 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n",
2738 sta->addr, arsta->link_id);
2739 return;
2740 }
2741
2742 he_cap = &link_sta->he_cap;
2743
2744 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa)
2745 return;
2746
2747 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2748 arg->bw_40 = true;
2749
2750 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2751 arg->bw_80 = true;
2752
2753 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2754 arg->bw_160 = true;
2755
2756 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2757 arg->bw_320 = true;
2758
2759 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa);
2760
2761 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz,
2762 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
2763 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density);
2764
2765 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2766 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2767 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2768 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2769 * Band Capabilities element in the 6 GHz band.
2770 *
2771 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2772 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2773 */
2774 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2775 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) +
2776 u32_get_bits(arg->peer_he_caps_6ghz,
2777 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
2778
2779 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2780 ampdu_factor)) - 1;
2781 }
2782
ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa,int * smps)2783 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap,
2784 const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
2785 int *smps)
2786 {
2787 if (ht_cap->ht_supported)
2788 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS);
2789 else
2790 *smps = le16_get_bits(he_6ghz_capa->capa,
2791 IEEE80211_HE_6GHZ_CAP_SM_PS);
2792
2793 if (*smps >= ARRAY_SIZE(ath12k_smps_map))
2794 return -EINVAL;
2795
2796 return 0;
2797 }
2798
ath12k_peer_assoc_h_smps(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2799 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta,
2800 struct ath12k_wmi_peer_assoc_arg *arg)
2801 {
2802 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2803 const struct ieee80211_he_6ghz_capa *he_6ghz_capa;
2804 struct ath12k_link_vif *arvif = arsta->arvif;
2805 const struct ieee80211_sta_ht_cap *ht_cap;
2806 struct ieee80211_link_sta *link_sta;
2807 struct ath12k *ar = arvif->ar;
2808 int smps;
2809
2810 link_sta = ath12k_mac_get_link_sta(arsta);
2811 if (!link_sta) {
2812 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2813 sta->addr, arsta->link_id);
2814 return;
2815 }
2816
2817 he_6ghz_capa = &link_sta->he_6ghz_capa;
2818 ht_cap = &link_sta->ht_cap;
2819
2820 if (!ht_cap->ht_supported && !he_6ghz_capa->capa)
2821 return;
2822
2823 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps))
2824 return;
2825
2826 switch (smps) {
2827 case WLAN_HT_CAP_SM_PS_STATIC:
2828 arg->static_mimops_flag = true;
2829 break;
2830 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2831 arg->dynamic_mimops_flag = true;
2832 break;
2833 case WLAN_HT_CAP_SM_PS_DISABLED:
2834 arg->spatial_mux_flag = true;
2835 break;
2836 default:
2837 break;
2838 }
2839 }
2840
ath12k_peer_assoc_h_qos(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2841 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
2842 struct ath12k_link_vif *arvif,
2843 struct ath12k_link_sta *arsta,
2844 struct ath12k_wmi_peer_assoc_arg *arg)
2845 {
2846 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2847
2848 switch (arvif->ahvif->vdev_type) {
2849 case WMI_VDEV_TYPE_AP:
2850 if (sta->wme) {
2851 /* TODO: Check WME vs QoS */
2852 arg->is_wme_set = true;
2853 arg->qos_flag = true;
2854 }
2855
2856 if (sta->wme && sta->uapsd_queues) {
2857 /* TODO: Check WME vs QoS */
2858 arg->is_wme_set = true;
2859 arg->apsd_flag = true;
2860 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2861 }
2862 break;
2863 case WMI_VDEV_TYPE_STA:
2864 if (sta->wme) {
2865 arg->is_wme_set = true;
2866 arg->qos_flag = true;
2867 }
2868 break;
2869 default:
2870 break;
2871 }
2872
2873 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
2874 arsta->addr, arg->qos_flag);
2875 }
2876
ath12k_peer_assoc_qos_ap(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)2877 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
2878 struct ath12k_link_vif *arvif,
2879 struct ath12k_link_sta *arsta)
2880 {
2881 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2882 struct ath12k_wmi_ap_ps_arg arg;
2883 u32 max_sp;
2884 u32 uapsd;
2885 int ret;
2886
2887 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2888
2889 arg.vdev_id = arvif->vdev_id;
2890
2891 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2892 sta->uapsd_queues, sta->max_sp);
2893
2894 uapsd = 0;
2895 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2896 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2897 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2898 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2899 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2900 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2901 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2902 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2903 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2904 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2905 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2906 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2907
2908 max_sp = 0;
2909 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2910 max_sp = sta->max_sp;
2911
2912 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2913 arg.value = uapsd;
2914 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2915 if (ret)
2916 goto err;
2917
2918 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2919 arg.value = max_sp;
2920 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2921 if (ret)
2922 goto err;
2923
2924 /* TODO: revisit during testing */
2925 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2926 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2927 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2928 if (ret)
2929 goto err;
2930
2931 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2932 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2933 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2934 if (ret)
2935 goto err;
2936
2937 return 0;
2938
2939 err:
2940 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2941 arg.param, arvif->vdev_id, ret);
2942 return ret;
2943 }
2944
ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta * sta)2945 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta)
2946 {
2947 return sta->supp_rates[NL80211_BAND_2GHZ] >>
2948 ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2949 }
2950
ath12k_mac_get_phymode_vht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2951 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2952 struct ieee80211_link_sta *link_sta)
2953 {
2954 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2955 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2956 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
2957 return MODE_11AC_VHT160;
2958
2959 /* Allow STA to connect even if it does not explicitly advertise 160 MHz
2960 * support
2961 */
2962 return MODE_11AC_VHT160;
2963 }
2964
2965 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2966 return MODE_11AC_VHT80;
2967
2968 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2969 return MODE_11AC_VHT40;
2970
2971 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2972 return MODE_11AC_VHT20;
2973
2974 return MODE_UNKNOWN;
2975 }
2976
ath12k_mac_get_phymode_he(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2977 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2978 struct ieee80211_link_sta *link_sta)
2979 {
2980 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2981 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2982 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2983 return MODE_11AX_HE160;
2984
2985 return MODE_UNKNOWN;
2986 }
2987
2988 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2989 return MODE_11AX_HE80;
2990
2991 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2992 return MODE_11AX_HE40;
2993
2994 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2995 return MODE_11AX_HE20;
2996
2997 return MODE_UNKNOWN;
2998 }
2999
ath12k_mac_get_phymode_eht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)3000 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
3001 struct ieee80211_link_sta *link_sta)
3002 {
3003 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
3004 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] &
3005 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
3006 return MODE_11BE_EHT320;
3007
3008 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
3009 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
3010 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
3011 return MODE_11BE_EHT160;
3012
3013 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
3014 link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
3015
3016 return MODE_UNKNOWN;
3017 }
3018
3019 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3020 return MODE_11BE_EHT80;
3021
3022 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3023 return MODE_11BE_EHT40;
3024
3025 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
3026 return MODE_11BE_EHT20;
3027
3028 return MODE_UNKNOWN;
3029 }
3030
3031 static bool
ath12k_peer_assoc_h_eht_masked(const u16 eht_mcs_mask[NL80211_EHT_NSS_MAX])3032 ath12k_peer_assoc_h_eht_masked(const u16 eht_mcs_mask[NL80211_EHT_NSS_MAX])
3033 {
3034 int nss;
3035
3036 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++)
3037 if (eht_mcs_mask[nss])
3038 return false;
3039
3040 return true;
3041 }
3042
ath12k_peer_assoc_h_phymode(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3043 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
3044 struct ath12k_link_vif *arvif,
3045 struct ath12k_link_sta *arsta,
3046 struct ath12k_wmi_peer_assoc_arg *arg)
3047 {
3048 struct ieee80211_link_sta *link_sta;
3049 struct cfg80211_chan_def def;
3050 enum nl80211_band band;
3051 const u8 *ht_mcs_mask;
3052 const u16 *vht_mcs_mask;
3053 const u16 *he_mcs_mask;
3054 const u16 *eht_mcs_mask;
3055 enum wmi_phy_mode phymode = MODE_UNKNOWN;
3056
3057 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3058
3059 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3060 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3061
3062 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
3063 return;
3064
3065 band = def.chan->band;
3066 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3067 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3068 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
3069 eht_mcs_mask = arvif->bitrate_mask.control[band].eht_mcs;
3070
3071 link_sta = ath12k_mac_get_link_sta(arsta);
3072 if (!link_sta) {
3073 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
3074 sta->addr, arsta->link_id);
3075 return;
3076 }
3077
3078 switch (band) {
3079 case NL80211_BAND_2GHZ:
3080 if (link_sta->eht_cap.has_eht &&
3081 !ath12k_peer_assoc_h_eht_masked(eht_mcs_mask)) {
3082 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3083 phymode = MODE_11BE_EHT40_2G;
3084 else
3085 phymode = MODE_11BE_EHT20_2G;
3086 } else if (link_sta->he_cap.has_he &&
3087 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3088 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3089 phymode = MODE_11AX_HE80_2G;
3090 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3091 phymode = MODE_11AX_HE40_2G;
3092 else
3093 phymode = MODE_11AX_HE20_2G;
3094 } else if (link_sta->vht_cap.vht_supported &&
3095 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3096 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3097 phymode = MODE_11AC_VHT40;
3098 else
3099 phymode = MODE_11AC_VHT20;
3100 } else if (link_sta->ht_cap.ht_supported &&
3101 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3102 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3103 phymode = MODE_11NG_HT40;
3104 else
3105 phymode = MODE_11NG_HT20;
3106 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) {
3107 phymode = MODE_11G;
3108 } else {
3109 phymode = MODE_11B;
3110 }
3111 break;
3112 case NL80211_BAND_5GHZ:
3113 case NL80211_BAND_6GHZ:
3114 /* Check EHT first */
3115 if (link_sta->eht_cap.has_eht) {
3116 phymode = ath12k_mac_get_phymode_eht(ar, link_sta);
3117 } else if (link_sta->he_cap.has_he &&
3118 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3119 phymode = ath12k_mac_get_phymode_he(ar, link_sta);
3120 } else if (link_sta->vht_cap.vht_supported &&
3121 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3122 phymode = ath12k_mac_get_phymode_vht(ar, link_sta);
3123 } else if (link_sta->ht_cap.ht_supported &&
3124 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3125 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40)
3126 phymode = MODE_11NA_HT40;
3127 else
3128 phymode = MODE_11NA_HT20;
3129 } else {
3130 phymode = MODE_11A;
3131 }
3132 break;
3133 default:
3134 break;
3135 }
3136
3137 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
3138 arsta->addr, ath12k_mac_phymode_str(phymode));
3139
3140 arg->peer_phymode = phymode;
3141 WARN_ON(phymode == MODE_UNKNOWN);
3142 }
3143
3144 #define ATH12K_EHT_MCS_7_ENABLED 0x00FF
3145 #define ATH12K_EHT_MCS_9_ENABLED 0x0300
3146 #define ATH12K_EHT_MCS_11_ENABLED 0x0C00
3147 #define ATH12K_EHT_MCS_13_ENABLED 0x3000
3148
ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7,u8 rx_tx_mcs9,u8 rx_tx_mcs11,u8 rx_tx_mcs13,u32 * rx_mcs,u32 * tx_mcs,const u16 eht_mcs_limit[NL80211_EHT_NSS_MAX])3149 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
3150 u8 rx_tx_mcs11, u8 rx_tx_mcs13,
3151 u32 *rx_mcs, u32 *tx_mcs,
3152 const u16 eht_mcs_limit[NL80211_EHT_NSS_MAX])
3153 {
3154 int nss;
3155 u8 mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0;
3156 u8 peer_mcs_7, peer_mcs_9, peer_mcs_11, peer_mcs_13;
3157
3158 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) {
3159 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_7_ENABLED)
3160 mcs_7++;
3161 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_9_ENABLED)
3162 mcs_9++;
3163 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_11_ENABLED)
3164 mcs_11++;
3165 if (eht_mcs_limit[nss] & ATH12K_EHT_MCS_13_ENABLED)
3166 mcs_13++;
3167 }
3168
3169 peer_mcs_7 = u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX);
3170 peer_mcs_9 = u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX);
3171 peer_mcs_11 = u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX);
3172 peer_mcs_13 = u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX);
3173
3174 *rx_mcs = u32_encode_bits(min(peer_mcs_7, mcs_7), WMI_EHT_MCS_NSS_0_7) |
3175 u32_encode_bits(min(peer_mcs_9, mcs_9), WMI_EHT_MCS_NSS_8_9) |
3176 u32_encode_bits(min(peer_mcs_11, mcs_11), WMI_EHT_MCS_NSS_10_11) |
3177 u32_encode_bits(min(peer_mcs_13, mcs_13), WMI_EHT_MCS_NSS_12_13);
3178
3179 peer_mcs_7 = u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX);
3180 peer_mcs_9 = u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX);
3181 peer_mcs_11 = u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX);
3182 peer_mcs_13 = u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX);
3183
3184 *tx_mcs = u32_encode_bits(min(peer_mcs_7, mcs_7), WMI_EHT_MCS_NSS_0_7) |
3185 u32_encode_bits(min(peer_mcs_9, mcs_9), WMI_EHT_MCS_NSS_8_9) |
3186 u32_encode_bits(min(peer_mcs_11, mcs_11), WMI_EHT_MCS_NSS_10_11) |
3187 u32_encode_bits(min(peer_mcs_13, mcs_13), WMI_EHT_MCS_NSS_12_13);
3188 }
3189
ath12k_mac_set_eht_ppe_threshold(const u8 * ppe_thres,struct ath12k_wmi_ppe_threshold_arg * ppet)3190 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
3191 struct ath12k_wmi_ppe_threshold_arg *ppet)
3192 {
3193 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
3194 u8 nss, ru, i;
3195 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
3196
3197 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
3198 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
3199 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3200
3201 for (nss = 0; nss <= ppet->numss_m1; nss++) {
3202 for (ru = 0;
3203 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3204 ru++) {
3205 if ((ppet->ru_bit_mask & BIT(ru)) == 0)
3206 continue;
3207
3208 val = 0;
3209 for (i = 0; i < ppet_bit_len_per_ru; i++) {
3210 val |= (((ppe_thres[bit_pos / 8] >>
3211 (bit_pos % 8)) & 0x1) << i);
3212 bit_pos++;
3213 }
3214 ppet->ppet16_ppet8_ru3_ru0[nss] |=
3215 (val << (ru * ppet_bit_len_per_ru));
3216 }
3217 }
3218 }
3219
ath12k_peer_assoc_h_eht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3220 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
3221 struct ath12k_link_vif *arvif,
3222 struct ath12k_link_sta *arsta,
3223 struct ath12k_wmi_peer_assoc_arg *arg)
3224 {
3225 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3226 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3227 const struct ieee80211_eht_mcs_nss_supp *own_eht_mcs_nss_supp;
3228 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
3229 const struct ieee80211_sta_eht_cap *eht_cap, *own_eht_cap;
3230 const struct ieee80211_sband_iftype_data *iftd;
3231 const struct ieee80211_eht_mcs_nss_supp_bw *bw;
3232 const struct ieee80211_sta_he_cap *he_cap;
3233 struct ieee80211_link_sta *link_sta;
3234 struct ieee80211_bss_conf *link_conf;
3235 struct cfg80211_chan_def def;
3236 bool user_rate_valid = true;
3237 enum nl80211_band band;
3238 int eht_nss, nss_idx;
3239 u32 *rx_mcs, *tx_mcs;
3240 u16 *eht_mcs_mask;
3241 u8 max_nss = 0;
3242
3243 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3244
3245 link_sta = ath12k_mac_get_link_sta(arsta);
3246 if (!link_sta) {
3247 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n",
3248 sta->addr, arsta->link_id);
3249 return;
3250 }
3251
3252 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3253 if (!link_conf) {
3254 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n");
3255 return;
3256 }
3257
3258 eht_cap = &link_sta->eht_cap;
3259 he_cap = &link_sta->he_cap;
3260 if (!he_cap->has_he || !eht_cap->has_eht)
3261 return;
3262
3263 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
3264 return;
3265
3266 band = def.chan->band;
3267 eht_mcs_mask = arvif->bitrate_mask.control[band].eht_mcs;
3268
3269 iftd = ieee80211_get_sband_iftype_data(&ar->mac.sbands[band], vif->type);
3270 if (!iftd) {
3271 ath12k_warn(ar->ab,
3272 "unable to access iftype_data in struct ieee80211_supported_band\n");
3273 return;
3274 }
3275
3276 own_eht_cap = &iftd->eht_cap;
3277 own_eht_mcs_nss_supp = &own_eht_cap->eht_mcs_nss_supp;
3278
3279 arg->eht_flag = true;
3280
3281 if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
3282 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
3283 eht_cap->eht_ppe_thres[0] != 0)
3284 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
3285 &arg->peer_eht_ppet);
3286
3287 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
3288 sizeof(eht_cap->eht_cap_elem.mac_cap_info));
3289 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
3290 sizeof(eht_cap->eht_cap_elem.phy_cap_info));
3291
3292 rx_mcs = arg->peer_eht_rx_mcs_set;
3293 tx_mcs = arg->peer_eht_tx_mcs_set;
3294
3295 eht_nss = ath12k_mac_max_eht_mcs_nss((void *)own_eht_mcs_nss_supp,
3296 sizeof(*own_eht_mcs_nss_supp));
3297 if (eht_nss > link_sta->rx_nss) {
3298 user_rate_valid = false;
3299 for (nss_idx = (link_sta->rx_nss - 1); nss_idx >= 0; nss_idx--) {
3300 if (eht_mcs_mask[nss_idx]) {
3301 user_rate_valid = true;
3302 break;
3303 }
3304 }
3305 }
3306
3307 if (!user_rate_valid) {
3308 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3309 "Setting eht range MCS value to peer supported nss %d for peer %pM\n",
3310 link_sta->rx_nss, arsta->addr);
3311 eht_mcs_mask[link_sta->rx_nss - 1] = eht_mcs_mask[eht_nss - 1];
3312 }
3313
3314 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
3315 bw = &eht_cap->eht_mcs_nss_supp.bw._80;
3316
3317 switch (link_sta->bandwidth) {
3318 case IEEE80211_STA_RX_BW_320:
3319 bw = &eht_cap->eht_mcs_nss_supp.bw._320;
3320 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3321 bw->rx_tx_mcs9_max_nss,
3322 bw->rx_tx_mcs11_max_nss,
3323 bw->rx_tx_mcs13_max_nss,
3324 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
3325 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
3326 eht_mcs_mask);
3327 arg->peer_eht_mcs_count++;
3328 fallthrough;
3329 case IEEE80211_STA_RX_BW_160:
3330 bw = &eht_cap->eht_mcs_nss_supp.bw._160;
3331 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3332 bw->rx_tx_mcs9_max_nss,
3333 bw->rx_tx_mcs11_max_nss,
3334 bw->rx_tx_mcs13_max_nss,
3335 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
3336 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
3337 eht_mcs_mask);
3338 arg->peer_eht_mcs_count++;
3339 fallthrough;
3340 default:
3341 if (!(link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
3342 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL)) {
3343 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
3344
3345 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
3346 bw_20->rx_tx_mcs9_max_nss,
3347 bw_20->rx_tx_mcs11_max_nss,
3348 bw_20->rx_tx_mcs13_max_nss,
3349 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3350 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3351 eht_mcs_mask);
3352 } else {
3353 bw = &eht_cap->eht_mcs_nss_supp.bw._80;
3354 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3355 bw->rx_tx_mcs9_max_nss,
3356 bw->rx_tx_mcs11_max_nss,
3357 bw->rx_tx_mcs13_max_nss,
3358 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3359 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3360 eht_mcs_mask);
3361 }
3362
3363 arg->peer_eht_mcs_count++;
3364 break;
3365 }
3366
3367 arg->punct_bitmap = ~arvif->punct_bitmap;
3368 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15;
3369
3370 if (!(link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
3371 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL)) {
3372 if (bw_20->rx_tx_mcs13_max_nss)
3373 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs13_max_nss,
3374 IEEE80211_EHT_MCS_NSS_RX));
3375 if (bw_20->rx_tx_mcs11_max_nss)
3376 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs11_max_nss,
3377 IEEE80211_EHT_MCS_NSS_RX));
3378 if (bw_20->rx_tx_mcs9_max_nss)
3379 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs9_max_nss,
3380 IEEE80211_EHT_MCS_NSS_RX));
3381 if (bw_20->rx_tx_mcs7_max_nss)
3382 max_nss = max(max_nss, u8_get_bits(bw_20->rx_tx_mcs7_max_nss,
3383 IEEE80211_EHT_MCS_NSS_RX));
3384 } else {
3385 if (bw->rx_tx_mcs13_max_nss)
3386 max_nss = max(max_nss, u8_get_bits(bw->rx_tx_mcs13_max_nss,
3387 IEEE80211_EHT_MCS_NSS_RX));
3388 if (bw->rx_tx_mcs11_max_nss)
3389 max_nss = max(max_nss, u8_get_bits(bw->rx_tx_mcs11_max_nss,
3390 IEEE80211_EHT_MCS_NSS_RX));
3391 if (bw->rx_tx_mcs9_max_nss)
3392 max_nss = max(max_nss, u8_get_bits(bw->rx_tx_mcs9_max_nss,
3393 IEEE80211_EHT_MCS_NSS_RX));
3394 }
3395
3396 max_nss = min(max_nss, (uint8_t)eht_nss);
3397
3398 arg->peer_nss = min(link_sta->rx_nss, max_nss);
3399
3400 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3401 "mac eht peer %pM nss %d mcs cnt %d ru_punct_bitmap 0x%x\n",
3402 arsta->addr, arg->peer_nss, arg->peer_eht_mcs_count,
3403 arg->punct_bitmap);
3404 }
3405
ath12k_peer_assoc_h_mlo(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3406 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta,
3407 struct ath12k_wmi_peer_assoc_arg *arg)
3408 {
3409 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3410 struct peer_assoc_mlo_params *ml = &arg->ml;
3411 struct ath12k_sta *ahsta = arsta->ahsta;
3412 struct ath12k_link_sta *arsta_p;
3413 struct ath12k_link_vif *arvif;
3414 unsigned long links;
3415 u8 link_id;
3416 int i;
3417
3418 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID)
3419 return;
3420
3421 ml->enabled = true;
3422 ml->assoc_link = arsta->is_assoc_link;
3423
3424 /* For now considering the primary umac based on assoc link */
3425 ml->primary_umac = arsta->is_assoc_link;
3426 ml->peer_id_valid = true;
3427 ml->logical_link_idx_valid = true;
3428
3429 ether_addr_copy(ml->mld_addr, sta->addr);
3430 ml->logical_link_idx = arsta->link_idx;
3431 ml->ml_peer_id = ahsta->ml_peer_id;
3432 ml->ieee_link_id = arsta->link_id;
3433 ml->num_partner_links = 0;
3434 ml->eml_cap = sta->eml_cap;
3435 links = ahsta->links_map;
3436
3437 rcu_read_lock();
3438
3439 i = 0;
3440
3441 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
3442 if (i >= ATH12K_WMI_MLO_MAX_LINKS)
3443 break;
3444
3445 arsta_p = rcu_dereference(ahsta->link[link_id]);
3446 arvif = rcu_dereference(ahsta->ahvif->link[link_id]);
3447
3448 if (arsta_p == arsta)
3449 continue;
3450
3451 if (!arvif->is_started)
3452 continue;
3453
3454 ml->partner_info[i].vdev_id = arvif->vdev_id;
3455 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id;
3456 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link;
3457 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link;
3458 ml->partner_info[i].logical_link_idx_valid = true;
3459 ml->partner_info[i].logical_link_idx = arsta_p->link_idx;
3460 ml->num_partner_links++;
3461
3462 i++;
3463 }
3464
3465 rcu_read_unlock();
3466 }
3467
ath12k_peer_assoc_prepare(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg,bool reassoc)3468 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
3469 struct ath12k_link_vif *arvif,
3470 struct ath12k_link_sta *arsta,
3471 struct ath12k_wmi_peer_assoc_arg *arg,
3472 bool reassoc)
3473 {
3474 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3475
3476 memset(arg, 0, sizeof(*arg));
3477
3478 reinit_completion(&ar->peer_assoc_done);
3479
3480 arg->peer_new_assoc = !reassoc;
3481 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg);
3482 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg);
3483 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg);
3484 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg);
3485 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg);
3486 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg);
3487 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg);
3488 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg);
3489 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg);
3490 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg);
3491 ath12k_peer_assoc_h_smps(arsta, arg);
3492 ath12k_peer_assoc_h_mlo(arsta, arg);
3493
3494 arsta->peer_nss = arg->peer_nss;
3495 /* TODO: amsdu_disable req? */
3496 }
3497
ath12k_setup_peer_smps(struct ath12k * ar,struct ath12k_link_vif * arvif,const u8 * addr,const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa)3498 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif,
3499 const u8 *addr,
3500 const struct ieee80211_sta_ht_cap *ht_cap,
3501 const struct ieee80211_he_6ghz_capa *he_6ghz_capa)
3502 {
3503 int smps, ret = 0;
3504
3505 if (!ht_cap->ht_supported && !he_6ghz_capa)
3506 return 0;
3507
3508 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps);
3509 if (ret < 0)
3510 return ret;
3511
3512 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
3513 WMI_PEER_MIMO_PS_STATE,
3514 ath12k_smps_map[smps]);
3515 }
3516
ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif * arvif)3517 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
3518 {
3519 struct ath12k_vif *ahvif = arvif->ahvif;
3520 struct ath12k *ar = arvif->ar;
3521 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
3522 u32 value = 0;
3523 int ret;
3524 struct ieee80211_bss_conf *link_conf;
3525
3526 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3527 if (!link_conf) {
3528 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n");
3529 return -EINVAL;
3530 }
3531
3532 if (!link_conf->he_support)
3533 return 0;
3534
3535 if (link_conf->he_su_beamformer) {
3536 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3537 if (link_conf->he_mu_beamformer &&
3538 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3539 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER);
3540 }
3541
3542 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3543 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3544 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3545
3546 if (link_conf->he_full_ul_mumimo)
3547 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO);
3548
3549 if (link_conf->he_su_beamformee)
3550 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3551 }
3552
3553 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3554 if (ret) {
3555 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
3556 arvif->vdev_id, ret);
3557 return ret;
3558 }
3559
3560 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
3561 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
3562 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
3563 HE_TRIG_NONTRIG_SOUNDING_MODE);
3564 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3565 param, value);
3566 if (ret) {
3567 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
3568 arvif->vdev_id, ret);
3569 return ret;
3570 }
3571
3572 return 0;
3573 }
3574
ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_sta_he_cap * he_cap,int * hemode)3575 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
3576 struct ath12k_link_vif *arvif,
3577 struct ieee80211_sta_he_cap *he_cap,
3578 int *hemode)
3579 {
3580 struct ieee80211_vif *vif = arvif->ahvif->vif;
3581 struct ieee80211_he_cap_elem he_cap_elem = {};
3582 struct ieee80211_sta_he_cap *cap_band;
3583 struct cfg80211_chan_def def;
3584 u8 link_id = arvif->link_id;
3585 struct ieee80211_bss_conf *link_conf;
3586
3587 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3588 if (!link_conf) {
3589 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n");
3590 return -EINVAL;
3591 }
3592
3593 if (!link_conf->he_support)
3594 return 0;
3595
3596 if (vif->type != NL80211_IFTYPE_STATION)
3597 return -EINVAL;
3598
3599 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
3600 return -EINVAL;
3601
3602 if (def.chan->band == NL80211_BAND_2GHZ)
3603 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
3604 else
3605 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
3606
3607 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
3608
3609 *hemode = 0;
3610 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
3611 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3612 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3613 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3614 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
3615 }
3616
3617 if (vif->type != NL80211_IFTYPE_MESH_POINT) {
3618 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3619 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3620
3621 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
3622 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
3623 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE,
3624 HE_MODE_UL_MUMIMO);
3625
3626 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE))
3627 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3628
3629 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER))
3630 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3631 }
3632
3633 return 0;
3634 }
3635
ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif * arvif)3636 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
3637 {
3638 struct ath12k_vif *ahvif = arvif->ahvif;
3639 struct ath12k *ar = arvif->ar;
3640 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
3641 u32 value = 0;
3642 int ret;
3643 struct ieee80211_bss_conf *link_conf;
3644
3645 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3646 if (!link_conf) {
3647 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
3648 return -ENOENT;
3649 }
3650
3651 if (!link_conf->eht_support)
3652 return 0;
3653
3654 if (link_conf->eht_su_beamformer) {
3655 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
3656 if (link_conf->eht_mu_beamformer &&
3657 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3658 value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
3659 EHT_MODE_MU_TX_BFER) |
3660 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
3661 EHT_MODE_DL_OFDMA_MUMIMO) |
3662 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
3663 EHT_MODE_UL_OFDMA_MUMIMO);
3664 }
3665
3666 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3667 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
3668 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
3669
3670 if (link_conf->eht_80mhz_full_bw_ul_mumimo)
3671 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
3672
3673 if (link_conf->eht_su_beamformee)
3674 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
3675 EHT_MODE_SU_TX_BFEE);
3676 }
3677
3678 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3679 if (ret) {
3680 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
3681 arvif->vdev_id, ret);
3682 return ret;
3683 }
3684
3685 return 0;
3686 }
3687
ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k * ar,struct ieee80211_link_sta * link_sta)3688 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3689 struct ieee80211_link_sta *link_sta)
3690 {
3691 u32 bw;
3692
3693 switch (link_sta->bandwidth) {
3694 case IEEE80211_STA_RX_BW_20:
3695 bw = WMI_PEER_CHWIDTH_20MHZ;
3696 break;
3697 case IEEE80211_STA_RX_BW_40:
3698 bw = WMI_PEER_CHWIDTH_40MHZ;
3699 break;
3700 case IEEE80211_STA_RX_BW_80:
3701 bw = WMI_PEER_CHWIDTH_80MHZ;
3702 break;
3703 case IEEE80211_STA_RX_BW_160:
3704 bw = WMI_PEER_CHWIDTH_160MHZ;
3705 break;
3706 case IEEE80211_STA_RX_BW_320:
3707 bw = WMI_PEER_CHWIDTH_320MHZ;
3708 break;
3709 default:
3710 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n",
3711 link_sta->bandwidth, link_sta->addr);
3712 bw = WMI_PEER_CHWIDTH_20MHZ;
3713 break;
3714 }
3715
3716 return bw;
3717 }
3718
ath12k_bss_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * bss_conf)3719 static void ath12k_bss_assoc(struct ath12k *ar,
3720 struct ath12k_link_vif *arvif,
3721 struct ieee80211_bss_conf *bss_conf)
3722 {
3723 struct ath12k_vif *ahvif = arvif->ahvif;
3724 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
3725 struct ath12k_wmi_vdev_up_params params = {};
3726 struct ieee80211_link_sta *link_sta;
3727 u8 link_id = bss_conf->link_id;
3728 struct ath12k_link_sta *arsta;
3729 struct ieee80211_sta *ap_sta;
3730 struct ath12k_sta *ahsta;
3731 struct ath12k_peer *peer;
3732 bool is_auth = false;
3733 u32 hemode = 0;
3734 int ret;
3735
3736 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3737
3738 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
3739 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
3740 if (!peer_arg)
3741 return;
3742
3743 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3744 "mac vdev %i link id %u assoc bssid %pM aid %d\n",
3745 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid);
3746
3747 rcu_read_lock();
3748
3749 /* During ML connection, cfg.ap_addr has the MLD address. For
3750 * non-ML connection, it has the BSSID.
3751 */
3752 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
3753 if (!ap_sta) {
3754 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3755 vif->cfg.ap_addr, arvif->vdev_id);
3756 rcu_read_unlock();
3757 return;
3758 }
3759
3760 ahsta = ath12k_sta_to_ahsta(ap_sta);
3761
3762 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
3763 ahsta->link[link_id]);
3764 if (WARN_ON(!arsta)) {
3765 rcu_read_unlock();
3766 return;
3767 }
3768
3769 link_sta = ath12k_mac_get_link_sta(arsta);
3770 if (WARN_ON(!link_sta)) {
3771 rcu_read_unlock();
3772 return;
3773 }
3774
3775 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);
3776
3777 /* link_sta->he_cap must be protected by rcu_read_lock */
3778 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode);
3779 if (ret) {
3780 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n",
3781 arvif->vdev_id, bss_conf->bssid, ret);
3782 rcu_read_unlock();
3783 return;
3784 }
3785
3786 rcu_read_unlock();
3787
3788 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */
3789 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3790 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode);
3791 if (ret) {
3792 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
3793 hemode, ret);
3794 return;
3795 }
3796
3797 peer_arg->is_assoc = true;
3798 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
3799 if (ret) {
3800 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3801 bss_conf->bssid, arvif->vdev_id, ret);
3802 return;
3803 }
3804
3805 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3806 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3807 bss_conf->bssid, arvif->vdev_id);
3808 return;
3809 }
3810
3811 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3812 &link_sta->ht_cap, &link_sta->he_6ghz_capa);
3813 if (ret) {
3814 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3815 arvif->vdev_id, ret);
3816 return;
3817 }
3818
3819 WARN_ON(arvif->is_up);
3820
3821 ahvif->aid = vif->cfg.aid;
3822 ether_addr_copy(arvif->bssid, bss_conf->bssid);
3823
3824 params.vdev_id = arvif->vdev_id;
3825 params.aid = ahvif->aid;
3826 params.bssid = arvif->bssid;
3827 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
3828 if (params.tx_bssid) {
3829 params.nontx_profile_idx = bss_conf->bssid_index;
3830 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator;
3831 }
3832 ret = ath12k_wmi_vdev_up(ar, ¶ms);
3833 if (ret) {
3834 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3835 arvif->vdev_id, ret);
3836 return;
3837 }
3838
3839 arvif->is_up = true;
3840 arvif->rekey_data.enable_offload = false;
3841
3842 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3843 "mac vdev %d up (associated) bssid %pM aid %d\n",
3844 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3845
3846 spin_lock_bh(&ar->ab->base_lock);
3847
3848 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3849 if (peer && peer->is_authorized)
3850 is_auth = true;
3851
3852 spin_unlock_bh(&ar->ab->base_lock);
3853
3854 /* Authorize BSS Peer */
3855 if (is_auth) {
3856 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
3857 arvif->vdev_id,
3858 WMI_PEER_AUTHORIZE,
3859 1);
3860 if (ret)
3861 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3862 }
3863
3864 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3865 &bss_conf->he_obss_pd);
3866 if (ret)
3867 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3868 arvif->vdev_id, ret);
3869
3870 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3871 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3872 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3873 ath12k_mac_11d_scan_stop_all(ar->ab);
3874 }
3875
ath12k_bss_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif)3876 static void ath12k_bss_disassoc(struct ath12k *ar,
3877 struct ath12k_link_vif *arvif)
3878 {
3879 int ret;
3880
3881 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3882
3883 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3884 arvif->vdev_id, arvif->bssid);
3885
3886 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
3887 if (ret)
3888 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
3889 arvif->vdev_id, ret);
3890
3891 arvif->is_up = false;
3892
3893 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3894
3895 cancel_delayed_work(&arvif->connection_loss_work);
3896 }
3897
ath12k_mac_get_rate_hw_value(int bitrate)3898 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
3899 {
3900 u32 preamble;
3901 u16 hw_value;
3902 int rate;
3903 size_t i;
3904
3905 if (ath12k_mac_bitrate_is_cck(bitrate))
3906 preamble = WMI_RATE_PREAMBLE_CCK;
3907 else
3908 preamble = WMI_RATE_PREAMBLE_OFDM;
3909
3910 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
3911 if (ath12k_legacy_rates[i].bitrate != bitrate)
3912 continue;
3913
3914 hw_value = ath12k_legacy_rates[i].hw_value;
3915 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
3916
3917 return rate;
3918 }
3919
3920 return -EINVAL;
3921 }
3922
ath12k_recalculate_mgmt_rate(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def * def)3923 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
3924 struct ath12k_link_vif *arvif,
3925 struct cfg80211_chan_def *def)
3926 {
3927 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3928 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
3929 const struct ieee80211_supported_band *sband;
3930 struct ieee80211_bss_conf *bss_conf;
3931 u8 basic_rate_idx;
3932 int hw_rate_code;
3933 u32 vdev_param;
3934 u16 bitrate;
3935 int ret;
3936
3937 lockdep_assert_wiphy(hw->wiphy);
3938
3939 bss_conf = ath12k_mac_get_link_bss_conf(arvif);
3940 if (!bss_conf) {
3941 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n",
3942 vif->addr, arvif->link_id);
3943 return;
3944 }
3945
3946 sband = hw->wiphy->bands[def->chan->band];
3947 if (bss_conf->basic_rates)
3948 basic_rate_idx = __ffs(bss_conf->basic_rates);
3949 else
3950 basic_rate_idx = 0;
3951 bitrate = sband->bitrates[basic_rate_idx].bitrate;
3952
3953 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
3954 if (hw_rate_code < 0) {
3955 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3956 return;
3957 }
3958
3959 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3960 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3961 hw_rate_code);
3962 if (ret)
3963 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3964
3965 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3966 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3967 hw_rate_code);
3968 if (ret)
3969 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3970 }
3971
ath12k_mac_bcn_tx_event(struct ath12k_link_vif * arvif)3972 static void ath12k_mac_bcn_tx_event(struct ath12k_link_vif *arvif)
3973 {
3974 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3975 struct ieee80211_bss_conf *link_conf;
3976
3977 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3978 if (!link_conf) {
3979 ath12k_warn(arvif->ar->ab, "failed to get link conf for vdev %u\n",
3980 arvif->vdev_id);
3981 return;
3982 }
3983
3984 if (link_conf->color_change_active) {
3985 if (ieee80211_beacon_cntdwn_is_complete(vif, arvif->link_id)) {
3986 ieee80211_color_change_finish(vif, arvif->link_id);
3987 return;
3988 }
3989
3990 ieee80211_beacon_update_cntdwn(vif, arvif->link_id);
3991 ath12k_mac_setup_bcn_tmpl(arvif);
3992 }
3993 }
3994
ath12k_mac_bcn_tx_work(struct wiphy * wiphy,struct wiphy_work * work)3995 static void ath12k_mac_bcn_tx_work(struct wiphy *wiphy, struct wiphy_work *work)
3996 {
3997 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif,
3998 bcn_tx_work);
3999
4000 lockdep_assert_wiphy(wiphy);
4001 ath12k_mac_bcn_tx_event(arvif);
4002 }
4003
ath12k_mac_init_arvif(struct ath12k_vif * ahvif,struct ath12k_link_vif * arvif,int link_id)4004 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
4005 struct ath12k_link_vif *arvif, int link_id)
4006 {
4007 struct ath12k_hw *ah = ahvif->ah;
4008 u8 _link_id;
4009 int i;
4010
4011 lockdep_assert_wiphy(ah->hw->wiphy);
4012
4013 if (WARN_ON(!arvif))
4014 return;
4015
4016 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
4017 return;
4018
4019 if (link_id < 0)
4020 _link_id = 0;
4021 else
4022 _link_id = link_id;
4023
4024 arvif->ahvif = ahvif;
4025 arvif->link_id = _link_id;
4026
4027 /* Protects the datapath stats update on a per link basis */
4028 spin_lock_init(&arvif->link_stats_lock);
4029
4030 INIT_LIST_HEAD(&arvif->list);
4031 INIT_DELAYED_WORK(&arvif->connection_loss_work,
4032 ath12k_mac_vif_sta_connection_loss_work);
4033 wiphy_work_init(&arvif->bcn_tx_work, ath12k_mac_bcn_tx_work);
4034
4035 arvif->num_stations = 0;
4036
4037 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
4038 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
4039 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
4040 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
4041 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
4042 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
4043 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
4044 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
4045 sizeof(arvif->bitrate_mask.control[i].he_mcs));
4046 memset(arvif->bitrate_mask.control[i].eht_mcs, 0xff,
4047 sizeof(arvif->bitrate_mask.control[i].eht_mcs));
4048 }
4049
4050 /* Handle MLO related assignments */
4051 if (link_id >= 0) {
4052 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
4053 ahvif->links_map |= BIT(_link_id);
4054 }
4055
4056 ath12k_generic_dbg(ATH12K_DBG_MAC,
4057 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
4058 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
4059 ahvif->links_map);
4060 }
4061
ath12k_mac_remove_link_interface(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif)4062 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
4063 struct ath12k_link_vif *arvif)
4064 {
4065 struct ath12k_vif *ahvif = arvif->ahvif;
4066 struct ath12k_hw *ah = hw->priv;
4067 struct ath12k *ar = arvif->ar;
4068 int ret;
4069
4070 lockdep_assert_wiphy(ah->hw->wiphy);
4071
4072 cancel_delayed_work_sync(&arvif->connection_loss_work);
4073 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &arvif->bcn_tx_work);
4074
4075 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
4076 arvif->vdev_id, arvif->link_id);
4077
4078 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
4079 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
4080 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
4081 ath12k_mac_11d_scan_stop(ar);
4082
4083 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
4084 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
4085 if (ret)
4086 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
4087 arvif->vdev_id, arvif->link_id, ret);
4088 }
4089 ath12k_mac_vdev_delete(ar, arvif);
4090 }
4091
ath12k_mac_assign_link_vif(struct ath12k_hw * ah,struct ieee80211_vif * vif,u8 link_id)4092 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
4093 struct ieee80211_vif *vif,
4094 u8 link_id)
4095 {
4096 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4097 struct ath12k_link_vif *arvif;
4098
4099 lockdep_assert_wiphy(ah->hw->wiphy);
4100
4101 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4102 if (arvif)
4103 return arvif;
4104
4105 /* If this is the first link arvif being created for an ML VIF
4106 * use the preallocated deflink memory except for scan arvifs
4107 */
4108 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) {
4109 arvif = &ahvif->deflink;
4110
4111 if (vif->type == NL80211_IFTYPE_STATION)
4112 arvif->is_sta_assoc_link = true;
4113 } else {
4114 arvif = kzalloc(sizeof(*arvif), GFP_KERNEL);
4115 if (!arvif)
4116 return NULL;
4117 }
4118
4119 ath12k_mac_init_arvif(ahvif, arvif, link_id);
4120
4121 return arvif;
4122 }
4123
ath12k_mac_unassign_link_vif(struct ath12k_link_vif * arvif)4124 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
4125 {
4126 struct ath12k_vif *ahvif = arvif->ahvif;
4127 struct ath12k_hw *ah = ahvif->ah;
4128
4129 lockdep_assert_wiphy(ah->hw->wiphy);
4130
4131 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
4132 synchronize_rcu();
4133 ahvif->links_map &= ~BIT(arvif->link_id);
4134
4135 if (arvif != &ahvif->deflink)
4136 kfree(arvif);
4137 else
4138 memset(arvif, 0, sizeof(*arvif));
4139 }
4140
4141 static int
ath12k_mac_op_change_vif_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 old_links,u16 new_links,struct ieee80211_bss_conf * ol[IEEE80211_MLD_MAX_NUM_LINKS])4142 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw,
4143 struct ieee80211_vif *vif,
4144 u16 old_links, u16 new_links,
4145 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS])
4146 {
4147 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4148 unsigned long to_remove = old_links & ~new_links;
4149 unsigned long to_add = ~old_links & new_links;
4150 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4151 struct ath12k_link_vif *arvif;
4152 u8 link_id;
4153
4154 lockdep_assert_wiphy(hw->wiphy);
4155
4156 ath12k_generic_dbg(ATH12K_DBG_MAC,
4157 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n",
4158 vif->addr, old_links, new_links);
4159
4160 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) {
4161 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4162 /* mac80211 wants to add link but driver already has the
4163 * link. This should not happen ideally.
4164 */
4165 if (WARN_ON(arvif))
4166 return -EINVAL;
4167
4168 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
4169 if (WARN_ON(!arvif))
4170 return -EINVAL;
4171 }
4172
4173 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) {
4174 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4175 if (WARN_ON(!arvif))
4176 return -EINVAL;
4177
4178 if (!arvif->is_created)
4179 continue;
4180
4181 if (WARN_ON(!arvif->ar))
4182 return -EINVAL;
4183
4184 ath12k_mac_remove_link_interface(hw, arvif);
4185 ath12k_mac_unassign_link_vif(arvif);
4186 }
4187
4188 return 0;
4189 }
4190
ath12k_mac_fils_discovery(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)4191 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
4192 struct ieee80211_bss_conf *info)
4193 {
4194 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
4195 struct ath12k *ar = arvif->ar;
4196 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4197 struct sk_buff *tmpl;
4198 int ret;
4199 u32 interval;
4200 bool unsol_bcast_probe_resp_enabled = false;
4201
4202 if (info->fils_discovery.max_interval) {
4203 interval = info->fils_discovery.max_interval;
4204
4205 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif);
4206 if (tmpl)
4207 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
4208 tmpl);
4209 } else if (info->unsol_bcast_probe_resp_interval) {
4210 unsol_bcast_probe_resp_enabled = 1;
4211 interval = info->unsol_bcast_probe_resp_interval;
4212
4213 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
4214 if (tmpl)
4215 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
4216 tmpl);
4217 } else { /* Disable */
4218 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
4219 }
4220
4221 if (!tmpl) {
4222 ath12k_warn(ar->ab,
4223 "mac vdev %i failed to retrieve %s template\n",
4224 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
4225 "unsolicited broadcast probe response" :
4226 "FILS discovery"));
4227 return -EPERM;
4228 }
4229 kfree_skb(tmpl);
4230
4231 if (!ret)
4232 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
4233 unsol_bcast_probe_resp_enabled);
4234
4235 return ret;
4236 }
4237
ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 changed)4238 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw,
4239 struct ieee80211_vif *vif,
4240 u64 changed)
4241 {
4242 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4243 unsigned long links = ahvif->links_map;
4244 struct ieee80211_bss_conf *info;
4245 struct ath12k_link_vif *arvif;
4246 struct ieee80211_sta *sta;
4247 struct ath12k_sta *ahsta;
4248 struct ath12k *ar;
4249 u8 link_id;
4250
4251 lockdep_assert_wiphy(hw->wiphy);
4252
4253 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) {
4254 ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4255 if (vif->cfg.ssid_len)
4256 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4257 }
4258
4259 if (changed & BSS_CHANGED_ASSOC) {
4260 if (vif->cfg.assoc) {
4261 /* only in station mode we can get here, so it's safe
4262 * to use ap_addr
4263 */
4264 rcu_read_lock();
4265 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
4266 if (!sta) {
4267 rcu_read_unlock();
4268 WARN_ONCE(1, "failed to find sta with addr %pM\n",
4269 vif->cfg.ap_addr);
4270 return;
4271 }
4272
4273 ahsta = ath12k_sta_to_ahsta(sta);
4274 arvif = wiphy_dereference(hw->wiphy,
4275 ahvif->link[ahsta->assoc_link_id]);
4276 rcu_read_unlock();
4277
4278 ar = arvif->ar;
4279 /* there is no reason for which an assoc link's
4280 * bss info does not exist
4281 */
4282 info = ath12k_mac_get_link_bss_conf(arvif);
4283 ath12k_bss_assoc(ar, arvif, info);
4284
4285 /* exclude assoc link as it is done above */
4286 links &= ~BIT(ahsta->assoc_link_id);
4287 }
4288
4289 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4290 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4291 if (!arvif || !arvif->ar)
4292 continue;
4293
4294 ar = arvif->ar;
4295
4296 if (vif->cfg.assoc) {
4297 info = ath12k_mac_get_link_bss_conf(arvif);
4298 if (!info)
4299 continue;
4300
4301 ath12k_bss_assoc(ar, arvif, info);
4302 } else {
4303 ath12k_bss_disassoc(ar, arvif);
4304 }
4305 }
4306 }
4307 }
4308
ath12k_mac_vif_setup_ps(struct ath12k_link_vif * arvif)4309 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif)
4310 {
4311 struct ath12k *ar = arvif->ar;
4312 struct ieee80211_vif *vif = arvif->ahvif->vif;
4313 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
4314 enum wmi_sta_powersave_param param;
4315 struct ieee80211_bss_conf *info;
4316 enum wmi_sta_ps_mode psmode;
4317 int ret;
4318 int timeout;
4319 bool enable_ps;
4320
4321 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4322
4323 if (vif->type != NL80211_IFTYPE_STATION)
4324 return;
4325
4326 enable_ps = arvif->ahvif->ps;
4327 if (enable_ps) {
4328 psmode = WMI_STA_PS_MODE_ENABLED;
4329 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
4330
4331 timeout = conf->dynamic_ps_timeout;
4332 if (timeout == 0) {
4333 info = ath12k_mac_get_link_bss_conf(arvif);
4334 if (!info) {
4335 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n",
4336 vif->addr, arvif->link_id);
4337 return;
4338 }
4339
4340 /* firmware doesn't like 0 */
4341 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000;
4342 }
4343
4344 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
4345 timeout);
4346 if (ret) {
4347 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
4348 arvif->vdev_id, ret);
4349 return;
4350 }
4351 } else {
4352 psmode = WMI_STA_PS_MODE_DISABLED;
4353 }
4354
4355 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
4356 arvif->vdev_id, psmode ? "enable" : "disable");
4357
4358 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
4359 if (ret)
4360 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
4361 psmode, arvif->vdev_id, ret);
4362 }
4363
ath12k_mac_supports_tpc(struct ath12k * ar,struct ath12k_vif * ahvif,const struct cfg80211_chan_def * chandef)4364 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif,
4365 const struct cfg80211_chan_def *chandef)
4366 {
4367 return ath12k_wmi_supports_6ghz_cc_ext(ar) &&
4368 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
4369 (ahvif->vdev_type == WMI_VDEV_TYPE_STA ||
4370 ahvif->vdev_type == WMI_VDEV_TYPE_AP) &&
4371 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
4372 chandef->chan &&
4373 chandef->chan->band == NL80211_BAND_6GHZ;
4374 }
4375
ath12k_wmi_vdev_params_up(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_vif * tx_arvif,struct ieee80211_bss_conf * info,u16 aid)4376 static void ath12k_wmi_vdev_params_up(struct ath12k *ar,
4377 struct ath12k_link_vif *arvif,
4378 struct ath12k_link_vif *tx_arvif,
4379 struct ieee80211_bss_conf *info, u16 aid)
4380 {
4381 struct ath12k_wmi_vdev_up_params params = {
4382 .vdev_id = arvif->vdev_id,
4383 .aid = aid,
4384 .bssid = arvif->bssid
4385 };
4386 int ret;
4387
4388 if (tx_arvif) {
4389 params.tx_bssid = tx_arvif->bssid;
4390 params.nontx_profile_idx = info->bssid_index;
4391 params.nontx_profile_cnt = 1 << info->bssid_indicator;
4392 }
4393
4394 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
4395 if (ret)
4396 ath12k_warn(ar->ab, "failed to bring vdev up %d: %d\n",
4397 arvif->vdev_id, ret);
4398 }
4399
ath12k_mac_bss_info_changed(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info,u64 changed)4400 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
4401 struct ath12k_link_vif *arvif,
4402 struct ieee80211_bss_conf *info,
4403 u64 changed)
4404 {
4405 struct ath12k_vif *ahvif = arvif->ahvif;
4406 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
4407 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg;
4408 struct ath12k_link_vif *tx_arvif;
4409 struct cfg80211_chan_def def;
4410 u32 param_id, param_value;
4411 enum nl80211_band band;
4412 u32 vdev_param;
4413 int mcast_rate;
4414 u32 preamble;
4415 u16 hw_value;
4416 u16 bitrate;
4417 u8 rateidx;
4418 u32 rate;
4419 int ret;
4420
4421 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4422
4423 if (changed & BSS_CHANGED_BEACON_INT) {
4424 arvif->beacon_interval = info->beacon_int;
4425
4426 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
4427 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4428 param_id,
4429 arvif->beacon_interval);
4430 if (ret)
4431 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
4432 arvif->vdev_id);
4433 else
4434 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4435 "Beacon interval: %d set for VDEV: %d\n",
4436 arvif->beacon_interval, arvif->vdev_id);
4437 }
4438
4439 if (changed & BSS_CHANGED_BEACON) {
4440 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
4441 param_value = WMI_BEACON_BURST_MODE;
4442 ret = ath12k_wmi_pdev_set_param(ar, param_id,
4443 param_value, ar->pdev->pdev_id);
4444 if (ret)
4445 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
4446 arvif->vdev_id);
4447 else
4448 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4449 "Set burst beacon mode for VDEV: %d\n",
4450 arvif->vdev_id);
4451
4452 /* In MBSSID case, need to install transmitting VIF's template first */
4453
4454 ret = ath12k_mac_setup_bcn_tmpl(arvif);
4455 if (ret)
4456 ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
4457 ret);
4458
4459 if (!arvif->is_csa_in_progress)
4460 goto skip_vdev_up;
4461
4462 tx_arvif = ath12k_mac_get_tx_arvif(arvif, info);
4463 if (tx_arvif && arvif != tx_arvif && tx_arvif->is_csa_in_progress)
4464 /* skip non tx vif's */
4465 goto skip_vdev_up;
4466
4467 ath12k_wmi_vdev_params_up(ar, arvif, tx_arvif, info, ahvif->aid);
4468
4469 arvif->is_csa_in_progress = false;
4470
4471 if (tx_arvif && arvif == tx_arvif) {
4472 struct ath12k_link_vif *arvif_itr;
4473
4474 list_for_each_entry(arvif_itr, &ar->arvifs, list) {
4475 if (!arvif_itr->is_csa_in_progress)
4476 continue;
4477
4478 ath12k_wmi_vdev_params_up(ar, arvif, tx_arvif,
4479 info, ahvif->aid);
4480 arvif_itr->is_csa_in_progress = false;
4481 }
4482 }
4483 }
4484
4485 skip_vdev_up:
4486
4487 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
4488 arvif->dtim_period = info->dtim_period;
4489
4490 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
4491 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4492 param_id,
4493 arvif->dtim_period);
4494
4495 if (ret)
4496 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
4497 arvif->vdev_id, ret);
4498 else
4499 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4500 "DTIM period: %d set for VDEV: %d\n",
4501 arvif->dtim_period, arvif->vdev_id);
4502 }
4503
4504 if (changed & BSS_CHANGED_SSID &&
4505 vif->type == NL80211_IFTYPE_AP) {
4506 ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4507 if (vif->cfg.ssid_len)
4508 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4509 ahvif->u.ap.hidden_ssid = info->hidden_ssid;
4510 }
4511
4512 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4513 ether_addr_copy(arvif->bssid, info->bssid);
4514
4515 if (changed & BSS_CHANGED_BEACON_ENABLED) {
4516 if (info->enable_beacon) {
4517 ret = ath12k_mac_set_he_txbf_conf(arvif);
4518 if (ret)
4519 ath12k_warn(ar->ab,
4520 "failed to set HE TXBF config for vdev: %d\n",
4521 arvif->vdev_id);
4522
4523 ret = ath12k_mac_set_eht_txbf_conf(arvif);
4524 if (ret)
4525 ath12k_warn(ar->ab,
4526 "failed to set EHT TXBF config for vdev: %d\n",
4527 arvif->vdev_id);
4528 }
4529 ath12k_control_beaconing(arvif, info);
4530
4531 if (arvif->is_up && info->he_support &&
4532 info->he_oper.params) {
4533 /* TODO: Extend to support 1024 BA Bitmap size */
4534 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4535 WMI_VDEV_PARAM_BA_MODE,
4536 WMI_BA_MODE_BUFFER_SIZE_256);
4537 if (ret)
4538 ath12k_warn(ar->ab,
4539 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
4540 arvif->vdev_id);
4541
4542 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
4543 param_value = info->he_oper.params;
4544 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4545 param_id, param_value);
4546 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4547 "he oper param: %x set for VDEV: %d\n",
4548 param_value, arvif->vdev_id);
4549
4550 if (ret)
4551 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
4552 param_value, arvif->vdev_id, ret);
4553 }
4554 }
4555
4556 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4557 u32 cts_prot;
4558
4559 cts_prot = !!(info->use_cts_prot);
4560 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
4561
4562 if (arvif->is_started) {
4563 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4564 param_id, cts_prot);
4565 if (ret)
4566 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
4567 arvif->vdev_id);
4568 else
4569 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
4570 cts_prot, arvif->vdev_id);
4571 } else {
4572 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
4573 }
4574 }
4575
4576 if (changed & BSS_CHANGED_ERP_SLOT) {
4577 u32 slottime;
4578
4579 if (info->use_short_slot)
4580 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4581
4582 else
4583 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4584
4585 param_id = WMI_VDEV_PARAM_SLOT_TIME;
4586 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4587 param_id, slottime);
4588 if (ret)
4589 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
4590 arvif->vdev_id);
4591 else
4592 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4593 "Set slottime: %d for VDEV: %d\n",
4594 slottime, arvif->vdev_id);
4595 }
4596
4597 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4598 u32 preamble;
4599
4600 if (info->use_short_preamble)
4601 preamble = WMI_VDEV_PREAMBLE_SHORT;
4602 else
4603 preamble = WMI_VDEV_PREAMBLE_LONG;
4604
4605 param_id = WMI_VDEV_PARAM_PREAMBLE;
4606 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4607 param_id, preamble);
4608 if (ret)
4609 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
4610 arvif->vdev_id);
4611 else
4612 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4613 "Set preamble: %d for VDEV: %d\n",
4614 preamble, arvif->vdev_id);
4615 }
4616
4617 if (changed & BSS_CHANGED_ASSOC) {
4618 if (vif->cfg.assoc)
4619 ath12k_bss_assoc(ar, arvif, info);
4620 else
4621 ath12k_bss_disassoc(ar, arvif);
4622 }
4623
4624 if (changed & BSS_CHANGED_TXPOWER) {
4625 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4626 arvif->vdev_id, info->txpower);
4627
4628 arvif->txpower = info->txpower;
4629 ath12k_mac_txpower_recalc(ar);
4630 }
4631
4632 if (changed & BSS_CHANGED_MCAST_RATE &&
4633 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
4634 band = def.chan->band;
4635 mcast_rate = info->mcast_rate[band];
4636
4637 if (mcast_rate > 0) {
4638 rateidx = mcast_rate - 1;
4639 } else {
4640 if (info->basic_rates)
4641 rateidx = __ffs(info->basic_rates);
4642 else
4643 rateidx = 0;
4644 }
4645
4646 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP)
4647 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
4648
4649 bitrate = ath12k_legacy_rates[rateidx].bitrate;
4650 hw_value = ath12k_legacy_rates[rateidx].hw_value;
4651
4652 if (ath12k_mac_bitrate_is_cck(bitrate))
4653 preamble = WMI_RATE_PREAMBLE_CCK;
4654 else
4655 preamble = WMI_RATE_PREAMBLE_OFDM;
4656
4657 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
4658
4659 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4660 "mac vdev %d mcast_rate %x\n",
4661 arvif->vdev_id, rate);
4662
4663 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
4664 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4665 vdev_param, rate);
4666 if (ret)
4667 ath12k_warn(ar->ab,
4668 "failed to set mcast rate on vdev %i: %d\n",
4669 arvif->vdev_id, ret);
4670
4671 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
4672 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4673 vdev_param, rate);
4674 if (ret)
4675 ath12k_warn(ar->ab,
4676 "failed to set bcast rate on vdev %i: %d\n",
4677 arvif->vdev_id, ret);
4678 }
4679
4680 if (changed & BSS_CHANGED_BASIC_RATES &&
4681 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))
4682 ath12k_recalculate_mgmt_rate(ar, arvif, &def);
4683
4684 if (changed & BSS_CHANGED_TWT) {
4685 if (info->twt_requester || info->twt_responder)
4686 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
4687 else
4688 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
4689 }
4690
4691 if (changed & BSS_CHANGED_HE_OBSS_PD)
4692 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
4693 &info->he_obss_pd);
4694
4695 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
4696 if (vif->type == NL80211_IFTYPE_AP) {
4697 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4698 arvif->vdev_id,
4699 info->he_bss_color.color,
4700 ATH12K_BSS_COLOR_AP_PERIODS,
4701 info->he_bss_color.enabled);
4702 if (ret)
4703 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %u: %d\n",
4704 arvif->vdev_id, ret);
4705
4706 param_id = WMI_VDEV_PARAM_BSS_COLOR;
4707 if (info->he_bss_color.enabled)
4708 param_value = info->he_bss_color.color <<
4709 IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
4710 else
4711 param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
4712
4713 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4714 param_id,
4715 param_value);
4716 if (ret)
4717 ath12k_warn(ar->ab, "failed to set bss color param on vdev %u: %d\n",
4718 arvif->vdev_id, ret);
4719 else
4720 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "bss color param 0x%x set on vdev %u\n",
4721 param_value, arvif->vdev_id);
4722 } else if (vif->type == NL80211_IFTYPE_STATION) {
4723 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
4724 arvif->vdev_id,
4725 1);
4726 if (ret)
4727 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
4728 arvif->vdev_id, ret);
4729 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4730 arvif->vdev_id,
4731 0,
4732 ATH12K_BSS_COLOR_STA_PERIODS,
4733 1);
4734 if (ret)
4735 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4736 arvif->vdev_id, ret);
4737 }
4738 }
4739
4740 ath12k_mac_fils_discovery(arvif, info);
4741
4742 if (changed & BSS_CHANGED_PS &&
4743 ar->ab->hw_params->supports_sta_ps) {
4744 ahvif->ps = vif_cfg->ps;
4745 ath12k_mac_vif_setup_ps(arvif);
4746 }
4747 }
4748
ath12k_ahvif_get_link_cache(struct ath12k_vif * ahvif,u8 link_id)4749 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif,
4750 u8 link_id)
4751 {
4752 if (!ahvif->cache[link_id]) {
4753 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL);
4754 if (ahvif->cache[link_id])
4755 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list);
4756 }
4757
4758 return ahvif->cache[link_id];
4759 }
4760
ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache * cache)4761 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache)
4762 {
4763 struct ath12k_key_conf *key_conf, *tmp;
4764
4765 if (!cache || list_empty(&cache->key_conf.list))
4766 return;
4767 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
4768 list_del(&key_conf->list);
4769 kfree(key_conf);
4770 }
4771 }
4772
ath12k_ahvif_put_link_cache(struct ath12k_vif * ahvif,u8 link_id)4773 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id)
4774 {
4775 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
4776 return;
4777
4778 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]);
4779 kfree(ahvif->cache[link_id]);
4780 ahvif->cache[link_id] = NULL;
4781 }
4782
ath12k_mac_op_link_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u64 changed)4783 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
4784 struct ieee80211_vif *vif,
4785 struct ieee80211_bss_conf *info,
4786 u64 changed)
4787 {
4788 struct ath12k *ar;
4789 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4790 struct ath12k_vif_cache *cache;
4791 struct ath12k_link_vif *arvif;
4792 u8 link_id = info->link_id;
4793
4794 lockdep_assert_wiphy(hw->wiphy);
4795
4796 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4797
4798 /* if the vdev is not created on a certain radio,
4799 * cache the info to be updated later on vdev creation
4800 */
4801
4802 if (!arvif || !arvif->is_created) {
4803 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
4804 if (!cache)
4805 return;
4806
4807 cache->bss_conf_changed |= changed;
4808
4809 return;
4810 }
4811
4812 ar = arvif->ar;
4813
4814 ath12k_mac_bss_info_changed(ar, arvif, info, changed);
4815 }
4816
4817 static struct ath12k*
ath12k_mac_select_scan_device(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 center_freq)4818 ath12k_mac_select_scan_device(struct ieee80211_hw *hw,
4819 struct ieee80211_vif *vif,
4820 u32 center_freq)
4821 {
4822 struct ath12k_hw *ah = hw->priv;
4823 enum nl80211_band band;
4824 struct ath12k *ar;
4825 int i;
4826
4827 if (ah->num_radio == 1)
4828 return ah->radio;
4829
4830 /* Currently mac80211 supports splitting scan requests into
4831 * multiple scan requests per band.
4832 * Loop through first channel and determine the scan radio
4833 * TODO: There could be 5 GHz low/high channels in that case
4834 * split the hw request and perform multiple scans
4835 */
4836
4837 if (center_freq < ATH12K_MIN_5GHZ_FREQ)
4838 band = NL80211_BAND_2GHZ;
4839 else if (center_freq < ATH12K_MIN_6GHZ_FREQ)
4840 band = NL80211_BAND_5GHZ;
4841 else
4842 band = NL80211_BAND_6GHZ;
4843
4844 for_each_ar(ah, ar, i) {
4845 if (ar->mac.sbands[band].channels &&
4846 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
4847 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
4848 return ar;
4849 }
4850
4851 return NULL;
4852 }
4853
__ath12k_mac_scan_finish(struct ath12k * ar)4854 void __ath12k_mac_scan_finish(struct ath12k *ar)
4855 {
4856 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4857
4858 lockdep_assert_held(&ar->data_lock);
4859
4860 switch (ar->scan.state) {
4861 case ATH12K_SCAN_IDLE:
4862 break;
4863 case ATH12K_SCAN_RUNNING:
4864 case ATH12K_SCAN_ABORTING:
4865 if (ar->scan.is_roc && ar->scan.roc_notify)
4866 ieee80211_remain_on_channel_expired(hw);
4867 fallthrough;
4868 case ATH12K_SCAN_STARTING:
4869 cancel_delayed_work(&ar->scan.timeout);
4870 complete_all(&ar->scan.completed);
4871 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
4872 break;
4873 }
4874 }
4875
ath12k_mac_scan_finish(struct ath12k * ar)4876 void ath12k_mac_scan_finish(struct ath12k *ar)
4877 {
4878 spin_lock_bh(&ar->data_lock);
4879 __ath12k_mac_scan_finish(ar);
4880 spin_unlock_bh(&ar->data_lock);
4881 }
4882
ath12k_scan_stop(struct ath12k * ar)4883 static int ath12k_scan_stop(struct ath12k *ar)
4884 {
4885 struct ath12k_wmi_scan_cancel_arg arg = {
4886 .req_type = WLAN_SCAN_CANCEL_SINGLE,
4887 .scan_id = ATH12K_SCAN_ID,
4888 };
4889 int ret;
4890
4891 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4892
4893 /* TODO: Fill other STOP Params */
4894 arg.pdev_id = ar->pdev->pdev_id;
4895
4896 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
4897 if (ret) {
4898 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
4899 goto out;
4900 }
4901
4902 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4903 if (ret == 0) {
4904 ath12k_warn(ar->ab,
4905 "failed to receive scan abort comple: timed out\n");
4906 ret = -ETIMEDOUT;
4907 } else if (ret > 0) {
4908 ret = 0;
4909 }
4910
4911 out:
4912 /* Scan state should be updated in scan completion worker but in
4913 * case firmware fails to deliver the event (for whatever reason)
4914 * it is desired to clean up scan state anyway. Firmware may have
4915 * just dropped the scan completion event delivery due to transport
4916 * pipe being overflown with data and/or it can recover on its own
4917 * before next scan request is submitted.
4918 */
4919 spin_lock_bh(&ar->data_lock);
4920 if (ret)
4921 __ath12k_mac_scan_finish(ar);
4922 spin_unlock_bh(&ar->data_lock);
4923
4924 return ret;
4925 }
4926
ath12k_scan_abort(struct ath12k * ar)4927 static void ath12k_scan_abort(struct ath12k *ar)
4928 {
4929 int ret;
4930
4931 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4932
4933 spin_lock_bh(&ar->data_lock);
4934
4935 switch (ar->scan.state) {
4936 case ATH12K_SCAN_IDLE:
4937 /* This can happen if timeout worker kicked in and called
4938 * abortion while scan completion was being processed.
4939 */
4940 break;
4941 case ATH12K_SCAN_STARTING:
4942 case ATH12K_SCAN_ABORTING:
4943 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
4944 ar->scan.state);
4945 break;
4946 case ATH12K_SCAN_RUNNING:
4947 ar->scan.state = ATH12K_SCAN_ABORTING;
4948 spin_unlock_bh(&ar->data_lock);
4949
4950 ret = ath12k_scan_stop(ar);
4951 if (ret)
4952 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
4953
4954 spin_lock_bh(&ar->data_lock);
4955 break;
4956 }
4957
4958 spin_unlock_bh(&ar->data_lock);
4959 }
4960
ath12k_scan_timeout_work(struct work_struct * work)4961 static void ath12k_scan_timeout_work(struct work_struct *work)
4962 {
4963 struct ath12k *ar = container_of(work, struct ath12k,
4964 scan.timeout.work);
4965
4966 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
4967 ath12k_scan_abort(ar);
4968 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
4969 }
4970
ath12k_mac_scan_send_complete(struct ath12k * ar,struct cfg80211_scan_info * info)4971 static void ath12k_mac_scan_send_complete(struct ath12k *ar,
4972 struct cfg80211_scan_info *info)
4973 {
4974 struct ath12k_hw *ah = ar->ah;
4975 struct ath12k *partner_ar;
4976 int i;
4977
4978 lockdep_assert_wiphy(ah->hw->wiphy);
4979
4980 for_each_ar(ah, partner_ar, i)
4981 if (partner_ar != ar &&
4982 partner_ar->scan.state == ATH12K_SCAN_RUNNING)
4983 return;
4984
4985 ieee80211_scan_completed(ah->hw, info);
4986 }
4987
ath12k_scan_vdev_clean_work(struct wiphy * wiphy,struct wiphy_work * work)4988 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work)
4989 {
4990 struct ath12k *ar = container_of(work, struct ath12k,
4991 scan.vdev_clean_wk);
4992 struct ath12k_hw *ah = ar->ah;
4993 struct ath12k_link_vif *arvif;
4994
4995 lockdep_assert_wiphy(wiphy);
4996
4997 arvif = ar->scan.arvif;
4998
4999 /* The scan vdev has already been deleted. This can occur when a
5000 * new scan request is made on the same vif with a different
5001 * frequency, causing the scan arvif to move from one radio to
5002 * another. Or, scan was abrupted and via remove interface, the
5003 * arvif is already deleted. Alternatively, if the scan vdev is not
5004 * being used as an actual vdev, then do not delete it.
5005 */
5006 if (!arvif || arvif->is_started)
5007 goto work_complete;
5008
5009 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)",
5010 arvif->link_id);
5011
5012 ath12k_mac_remove_link_interface(ah->hw, arvif);
5013 ath12k_mac_unassign_link_vif(arvif);
5014
5015 work_complete:
5016 spin_lock_bh(&ar->data_lock);
5017 ar->scan.arvif = NULL;
5018 if (!ar->scan.is_roc) {
5019 struct cfg80211_scan_info info = {
5020 .aborted = ((ar->scan.state ==
5021 ATH12K_SCAN_ABORTING) ||
5022 (ar->scan.state ==
5023 ATH12K_SCAN_STARTING)),
5024 };
5025
5026 ath12k_mac_scan_send_complete(ar, &info);
5027 }
5028
5029 ar->scan.state = ATH12K_SCAN_IDLE;
5030 ar->scan_channel = NULL;
5031 ar->scan.roc_freq = 0;
5032 spin_unlock_bh(&ar->data_lock);
5033 }
5034
ath12k_start_scan(struct ath12k * ar,struct ath12k_wmi_scan_req_arg * arg)5035 static int ath12k_start_scan(struct ath12k *ar,
5036 struct ath12k_wmi_scan_req_arg *arg)
5037 {
5038 int ret;
5039
5040 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5041
5042 ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
5043 if (ret)
5044 return ret;
5045
5046 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
5047 if (ret == 0) {
5048 ret = ath12k_scan_stop(ar);
5049 if (ret)
5050 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
5051
5052 return -ETIMEDOUT;
5053 }
5054
5055 /* If we failed to start the scan, return error code at
5056 * this point. This is probably due to some issue in the
5057 * firmware, but no need to wedge the driver due to that...
5058 */
5059 spin_lock_bh(&ar->data_lock);
5060 if (ar->scan.state == ATH12K_SCAN_IDLE) {
5061 spin_unlock_bh(&ar->data_lock);
5062 return -EINVAL;
5063 }
5064 spin_unlock_bh(&ar->data_lock);
5065
5066 return 0;
5067 }
5068
ath12k_mac_get_fw_stats(struct ath12k * ar,struct ath12k_fw_stats_req_params * param)5069 int ath12k_mac_get_fw_stats(struct ath12k *ar,
5070 struct ath12k_fw_stats_req_params *param)
5071 {
5072 struct ath12k_base *ab = ar->ab;
5073 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
5074 unsigned long time_left;
5075 int ret;
5076
5077 guard(mutex)(&ah->hw_mutex);
5078
5079 if (ah->state != ATH12K_HW_STATE_ON)
5080 return -ENETDOWN;
5081
5082 reinit_completion(&ar->fw_stats_complete);
5083 reinit_completion(&ar->fw_stats_done);
5084
5085 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id,
5086 param->vdev_id, param->pdev_id);
5087 if (ret) {
5088 ath12k_warn(ab, "failed to request fw stats: %d\n", ret);
5089 return ret;
5090 }
5091
5092 ath12k_dbg(ab, ATH12K_DBG_WMI,
5093 "get fw stat pdev id %d vdev id %d stats id 0x%x\n",
5094 param->pdev_id, param->vdev_id, param->stats_id);
5095
5096 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
5097 if (!time_left) {
5098 ath12k_warn(ab, "time out while waiting for get fw stats\n");
5099 return -ETIMEDOUT;
5100 }
5101
5102 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back
5103 * when stats data buffer limit is reached. fw_stats_complete
5104 * is completed once host receives first event from firmware, but
5105 * still there could be more events following. Below is to wait
5106 * until firmware completes sending all the events.
5107 */
5108 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
5109 if (!time_left) {
5110 ath12k_warn(ab, "time out while waiting for fw stats done\n");
5111 return -ETIMEDOUT;
5112 }
5113
5114 return 0;
5115 }
5116
ath12k_mac_op_get_txpower(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,int * dbm)5117 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw,
5118 struct ieee80211_vif *vif,
5119 unsigned int link_id,
5120 int *dbm)
5121 {
5122 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5123 struct ath12k_fw_stats_req_params params = {};
5124 struct ath12k_fw_stats_pdev *pdev;
5125 struct ath12k_hw *ah = hw->priv;
5126 struct ath12k_link_vif *arvif;
5127 struct ath12k_base *ab;
5128 struct ath12k *ar;
5129 int ret;
5130
5131 /* Final Tx power is minimum of Target Power, CTL power, Regulatory
5132 * Power, PSD EIRP Power. We just know the Regulatory power from the
5133 * regulatory rules obtained. FW knows all these power and sets the min
5134 * of these. Hence, we request the FW pdev stats in which FW reports
5135 * the minimum of all vdev's channel Tx power.
5136 */
5137 lockdep_assert_wiphy(hw->wiphy);
5138
5139 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
5140 if (!arvif || !arvif->ar)
5141 return -EINVAL;
5142
5143 ar = arvif->ar;
5144 ab = ar->ab;
5145 if (ah->state != ATH12K_HW_STATE_ON)
5146 goto err_fallback;
5147
5148 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags))
5149 return -EAGAIN;
5150
5151 /* Limit the requests to Firmware for fetching the tx power */
5152 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID &&
5153 time_before(jiffies,
5154 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) +
5155 ar->last_tx_power_update))
5156 goto send_tx_power;
5157
5158 params.pdev_id = ar->pdev->pdev_id;
5159 params.vdev_id = arvif->vdev_id;
5160 params.stats_id = WMI_REQUEST_PDEV_STAT;
5161 ret = ath12k_mac_get_fw_stats(ar, ¶ms);
5162 if (ret) {
5163 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
5164 goto err_fallback;
5165 }
5166
5167 spin_lock_bh(&ar->data_lock);
5168 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
5169 struct ath12k_fw_stats_pdev, list);
5170 if (!pdev) {
5171 spin_unlock_bh(&ar->data_lock);
5172 goto err_fallback;
5173 }
5174
5175 /* tx power reported by firmware is in units of 0.5 dBm */
5176 ar->chan_tx_pwr = pdev->chan_tx_power / 2;
5177 spin_unlock_bh(&ar->data_lock);
5178 ar->last_tx_power_update = jiffies;
5179 ath12k_fw_stats_reset(ar);
5180
5181 send_tx_power:
5182 *dbm = ar->chan_tx_pwr;
5183 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n",
5184 *dbm);
5185 return 0;
5186
5187 err_fallback:
5188 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
5189 *dbm = vif->bss_conf.txpower;
5190 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
5191 *dbm);
5192 return 0;
5193 }
5194
5195 static u8
ath12k_mac_find_link_id_by_ar(struct ath12k_vif * ahvif,struct ath12k * ar)5196 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar)
5197 {
5198 struct ath12k_link_vif *arvif;
5199 struct ath12k_hw *ah = ahvif->ah;
5200 unsigned long links = ahvif->links_map;
5201 unsigned long scan_links_map;
5202 u8 link_id;
5203
5204 lockdep_assert_wiphy(ah->hw->wiphy);
5205
5206 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) {
5207 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
5208
5209 if (!arvif || !arvif->is_created)
5210 continue;
5211
5212 if (ar == arvif->ar)
5213 return link_id;
5214 }
5215
5216 /* input ar is not assigned to any of the links of ML VIF, use next
5217 * available scan link for scan vdev creation. There are cases where
5218 * single scan req needs to be split in driver and initiate separate
5219 * scan requests to firmware based on device.
5220 */
5221
5222 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will
5223 * choose an available link among scan links (i.e link id >= 15)
5224 */
5225 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
5226 if (scan_links_map)
5227 return __ffs(scan_links_map);
5228
5229 return ATH12K_FIRST_SCAN_LINK;
5230 }
5231
ath12k_mac_initiate_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req,int n_channels,struct ieee80211_channel ** chan_list,struct ath12k * ar)5232 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw,
5233 struct ieee80211_vif *vif,
5234 struct ieee80211_scan_request *hw_req,
5235 int n_channels,
5236 struct ieee80211_channel **chan_list,
5237 struct ath12k *ar)
5238 {
5239 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5240 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5241 struct ath12k_link_vif *arvif;
5242 struct cfg80211_scan_request *req = &hw_req->req;
5243 struct ath12k_wmi_scan_req_arg *arg = NULL;
5244 u8 link_id;
5245 int ret;
5246 int i;
5247 bool create = true;
5248
5249 lockdep_assert_wiphy(hw->wiphy);
5250
5251 arvif = &ahvif->deflink;
5252
5253 /* check if any of the links of ML VIF is already started on
5254 * radio(ar) corresponding to given scan frequency and use it,
5255 * if not use scan link (link id >= 15) for scan purpose.
5256 */
5257 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
5258 /* All scan links are occupied. ideally this shouldn't happen as
5259 * mac80211 won't schedule scan for same band until ongoing scan is
5260 * completed, don't try to exceed max links just in case if it happens.
5261 */
5262 if (link_id >= ATH12K_NUM_MAX_LINKS)
5263 return -EBUSY;
5264
5265 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5266
5267 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan",
5268 arvif->link_id);
5269
5270 /* If the vif is already assigned to a specific vdev of an ar,
5271 * check whether its already started, vdev which is started
5272 * are not allowed to switch to a new radio.
5273 * If the vdev is not started, but was earlier created on a
5274 * different ar, delete that vdev and create a new one. We don't
5275 * delete at the scan stop as an optimization to avoid redundant
5276 * delete-create vdev's for the same ar, in case the request is
5277 * always on the same band for the vif
5278 */
5279 if (arvif->is_created) {
5280 if (WARN_ON(!arvif->ar))
5281 return -EINVAL;
5282
5283 if (ar != arvif->ar && arvif->is_started)
5284 return -EINVAL;
5285
5286 if (ar != arvif->ar) {
5287 ath12k_mac_remove_link_interface(hw, arvif);
5288 ath12k_mac_unassign_link_vif(arvif);
5289 } else {
5290 create = false;
5291 }
5292 }
5293
5294 if (create) {
5295 /* Previous arvif would've been cleared in radio switch block
5296 * above, assign arvif again for create.
5297 */
5298 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5299
5300 ret = ath12k_mac_vdev_create(ar, arvif);
5301 if (ret) {
5302 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
5303 ath12k_mac_unassign_link_vif(arvif);
5304 return ret;
5305 }
5306 }
5307
5308 spin_lock_bh(&ar->data_lock);
5309 switch (ar->scan.state) {
5310 case ATH12K_SCAN_IDLE:
5311 reinit_completion(&ar->scan.started);
5312 reinit_completion(&ar->scan.completed);
5313 ar->scan.state = ATH12K_SCAN_STARTING;
5314 ar->scan.is_roc = false;
5315 ar->scan.arvif = arvif;
5316 ret = 0;
5317 break;
5318 case ATH12K_SCAN_STARTING:
5319 case ATH12K_SCAN_RUNNING:
5320 case ATH12K_SCAN_ABORTING:
5321 ret = -EBUSY;
5322 break;
5323 }
5324 spin_unlock_bh(&ar->data_lock);
5325
5326 if (ret)
5327 goto exit;
5328
5329 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
5330 if (!arg) {
5331 ret = -ENOMEM;
5332 goto exit;
5333 }
5334
5335 ath12k_wmi_start_scan_init(ar, arg);
5336 arg->vdev_id = arvif->vdev_id;
5337 arg->scan_id = ATH12K_SCAN_ID;
5338
5339 if (req->ie_len) {
5340 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
5341 if (!arg->extraie.ptr) {
5342 ret = -ENOMEM;
5343 goto exit;
5344 }
5345 arg->extraie.len = req->ie_len;
5346 }
5347
5348 if (req->n_ssids) {
5349 arg->num_ssids = req->n_ssids;
5350 for (i = 0; i < arg->num_ssids; i++)
5351 arg->ssid[i] = req->ssids[i];
5352 } else {
5353 arg->scan_f_passive = 1;
5354 }
5355
5356 if (n_channels) {
5357 arg->num_chan = n_channels;
5358 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
5359 GFP_KERNEL);
5360 if (!arg->chan_list) {
5361 ret = -ENOMEM;
5362 goto exit;
5363 }
5364
5365 for (i = 0; i < arg->num_chan; i++)
5366 arg->chan_list[i] = chan_list[i]->center_freq;
5367 }
5368
5369 ret = ath12k_start_scan(ar, arg);
5370 if (ret) {
5371 if (ret == -EBUSY)
5372 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5373 "scan engine is busy 11d state %d\n", ar->state_11d);
5374 else
5375 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
5376
5377 spin_lock_bh(&ar->data_lock);
5378 ar->scan.state = ATH12K_SCAN_IDLE;
5379 spin_unlock_bh(&ar->data_lock);
5380 goto exit;
5381 }
5382
5383 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started");
5384
5385 /* Add a margin to account for event/command processing */
5386 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
5387 msecs_to_jiffies(arg->max_scan_time +
5388 ATH12K_MAC_SCAN_TIMEOUT_MSECS));
5389
5390 exit:
5391 if (arg) {
5392 kfree(arg->chan_list);
5393 kfree(arg->extraie.ptr);
5394 kfree(arg);
5395 }
5396
5397 if (ar->state_11d == ATH12K_11D_PREPARING &&
5398 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5399 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
5400 ath12k_mac_11d_scan_start(ar, arvif->vdev_id);
5401
5402 return ret;
5403 }
5404
ath12k_mac_op_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req)5405 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
5406 struct ieee80211_vif *vif,
5407 struct ieee80211_scan_request *hw_req)
5408 {
5409 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5410 struct ieee80211_channel **chan_list, *chan;
5411 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5412 unsigned long links_map, link_id;
5413 struct ath12k_link_vif *arvif;
5414 struct ath12k *ar, *scan_ar;
5415 int i, j, ret = 0;
5416
5417 lockdep_assert_wiphy(hw->wiphy);
5418
5419 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL);
5420 if (!chan_list)
5421 return -ENOMEM;
5422
5423 /* There could be channels that belong to multiple underlying radio
5424 * in same scan request as mac80211 sees it as single band. In that
5425 * case split the hw_req based on frequency range and schedule scans to
5426 * corresponding radio.
5427 */
5428 for_each_ar(ah, ar, i) {
5429 int n_chans = 0;
5430
5431 for (j = 0; j < hw_req->req.n_channels; j++) {
5432 chan = hw_req->req.channels[j];
5433 scan_ar = ath12k_mac_select_scan_device(hw, vif,
5434 chan->center_freq);
5435 if (!scan_ar) {
5436 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n",
5437 chan->center_freq);
5438 ret = -EINVAL;
5439 goto abort;
5440 }
5441 if (ar != scan_ar)
5442 continue;
5443
5444 chan_list[n_chans++] = chan;
5445 }
5446 if (n_chans) {
5447 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans,
5448 chan_list, ar);
5449 if (ret)
5450 goto abort;
5451 }
5452 }
5453 abort:
5454 /* If any of the parallel scans initiated fails, abort all and
5455 * remove the scan interfaces created. Return complete scan
5456 * failure as mac80211 assumes this as single scan request.
5457 */
5458 if (ret) {
5459 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret);
5460 links_map = ahvif->links_map;
5461 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5462 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5463 if (!arvif)
5464 continue;
5465
5466 ar = arvif->ar;
5467 if (ar->scan.arvif == arvif) {
5468 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
5469 spin_lock_bh(&ar->data_lock);
5470 ar->scan.arvif = NULL;
5471 ar->scan.state = ATH12K_SCAN_IDLE;
5472 ar->scan_channel = NULL;
5473 ar->scan.roc_freq = 0;
5474 spin_unlock_bh(&ar->data_lock);
5475 }
5476 if (link_id >= ATH12K_FIRST_SCAN_LINK) {
5477 ath12k_mac_remove_link_interface(hw, arvif);
5478 ath12k_mac_unassign_link_vif(arvif);
5479 }
5480 }
5481 }
5482 kfree(chan_list);
5483 return ret;
5484 }
5485
ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5486 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
5487 struct ieee80211_vif *vif)
5488 {
5489 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5490 unsigned long link_id, links_map = ahvif->links_map;
5491 struct ath12k_link_vif *arvif;
5492 struct ath12k *ar;
5493
5494 lockdep_assert_wiphy(hw->wiphy);
5495
5496 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5497 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5498 if (!arvif || arvif->is_started)
5499 continue;
5500
5501 ar = arvif->ar;
5502
5503 ath12k_scan_abort(ar);
5504
5505 cancel_delayed_work_sync(&ar->scan.timeout);
5506 }
5507 }
5508
ath12k_install_key(struct ath12k_link_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)5509 static int ath12k_install_key(struct ath12k_link_vif *arvif,
5510 struct ieee80211_key_conf *key,
5511 enum set_key_cmd cmd,
5512 const u8 *macaddr, u32 flags)
5513 {
5514 int ret;
5515 struct ath12k *ar = arvif->ar;
5516 struct wmi_vdev_install_key_arg arg = {
5517 .vdev_id = arvif->vdev_id,
5518 .key_idx = key->keyidx,
5519 .key_len = key->keylen,
5520 .key_data = key->key,
5521 .key_flags = flags,
5522 .ieee80211_key_cipher = key->cipher,
5523 .macaddr = macaddr,
5524 };
5525 struct ath12k_vif *ahvif = arvif->ahvif;
5526
5527 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5528
5529 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
5530 return 0;
5531
5532 if (cmd == DISABLE_KEY) {
5533 /* TODO: Check if FW expects value other than NONE for del */
5534 /* arg.key_cipher = WMI_CIPHER_NONE; */
5535 arg.key_len = 0;
5536 arg.key_data = NULL;
5537 goto check_order;
5538 }
5539
5540 switch (key->cipher) {
5541 case WLAN_CIPHER_SUITE_CCMP:
5542 case WLAN_CIPHER_SUITE_CCMP_256:
5543 arg.key_cipher = WMI_CIPHER_AES_CCM;
5544 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5545 break;
5546 case WLAN_CIPHER_SUITE_TKIP:
5547 arg.key_cipher = WMI_CIPHER_TKIP;
5548 arg.key_txmic_len = 8;
5549 arg.key_rxmic_len = 8;
5550 break;
5551 case WLAN_CIPHER_SUITE_GCMP:
5552 case WLAN_CIPHER_SUITE_GCMP_256:
5553 arg.key_cipher = WMI_CIPHER_AES_GCM;
5554 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5555 break;
5556 case WLAN_CIPHER_SUITE_AES_CMAC:
5557 arg.key_cipher = WMI_CIPHER_AES_CMAC;
5558 break;
5559 case WLAN_CIPHER_SUITE_BIP_GMAC_128:
5560 case WLAN_CIPHER_SUITE_BIP_GMAC_256:
5561 arg.key_cipher = WMI_CIPHER_AES_GMAC;
5562 break;
5563 case WLAN_CIPHER_SUITE_BIP_CMAC_256:
5564 arg.key_cipher = WMI_CIPHER_AES_CMAC;
5565 break;
5566 default:
5567 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
5568 return -EOPNOTSUPP;
5569 }
5570
5571 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
5572 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
5573 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
5574
5575 check_order:
5576 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5577 arg.key_flags == WMI_KEY_GROUP) {
5578 if (cmd == SET_KEY) {
5579 if (arvif->pairwise_key_done) {
5580 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5581 "vdev %u pairwise key done, go install group key\n",
5582 arg.vdev_id);
5583 goto install;
5584 } else {
5585 /* WCN7850 firmware requires pairwise key to be installed
5586 * before group key. In case group key comes first, cache
5587 * it and return. Will revisit it once pairwise key gets
5588 * installed.
5589 */
5590 arvif->group_key = arg;
5591 arvif->group_key_valid = true;
5592 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5593 "vdev %u group key before pairwise key, cache and skip\n",
5594 arg.vdev_id);
5595
5596 ret = 0;
5597 goto out;
5598 }
5599 } else {
5600 arvif->group_key_valid = false;
5601 }
5602 }
5603
5604 install:
5605 reinit_completion(&ar->install_key_done);
5606
5607 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
5608 if (ret)
5609 return ret;
5610
5611 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
5612 return -ETIMEDOUT;
5613
5614 if (ether_addr_equal(arg.macaddr, arvif->bssid))
5615 ahvif->key_cipher = arg.ieee80211_key_cipher;
5616
5617 if (ar->install_key_status) {
5618 ret = -EINVAL;
5619 goto out;
5620 }
5621
5622 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5623 arg.key_flags == WMI_KEY_PAIRWISE) {
5624 if (cmd == SET_KEY) {
5625 arvif->pairwise_key_done = true;
5626 if (arvif->group_key_valid) {
5627 /* Install cached GTK */
5628 arvif->group_key_valid = false;
5629 arg = arvif->group_key;
5630 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5631 "vdev %u pairwise key done, group key ready, go install\n",
5632 arg.vdev_id);
5633 goto install;
5634 }
5635 } else {
5636 arvif->pairwise_key_done = false;
5637 }
5638 }
5639
5640 out:
5641 if (ret) {
5642 /* In case of failure userspace may not do DISABLE_KEY
5643 * but triggers re-connection directly, so manually reset
5644 * status here.
5645 */
5646 arvif->group_key_valid = false;
5647 arvif->pairwise_key_done = false;
5648 }
5649
5650 return ret;
5651 }
5652
ath12k_clear_peer_keys(struct ath12k_link_vif * arvif,const u8 * addr)5653 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif,
5654 const u8 *addr)
5655 {
5656 struct ath12k *ar = arvif->ar;
5657 struct ath12k_base *ab = ar->ab;
5658 struct ath12k_peer *peer;
5659 int first_errno = 0;
5660 int ret;
5661 int i;
5662 u32 flags = 0;
5663
5664 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5665
5666 spin_lock_bh(&ab->base_lock);
5667 peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
5668 spin_unlock_bh(&ab->base_lock);
5669
5670 if (!peer)
5671 return -ENOENT;
5672
5673 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
5674 if (!peer->keys[i])
5675 continue;
5676
5677 /* key flags are not required to delete the key */
5678 ret = ath12k_install_key(arvif, peer->keys[i],
5679 DISABLE_KEY, addr, flags);
5680 if (ret < 0 && first_errno == 0)
5681 first_errno = ret;
5682
5683 if (ret < 0)
5684 ath12k_warn(ab, "failed to remove peer key %d: %d\n",
5685 i, ret);
5686
5687 spin_lock_bh(&ab->base_lock);
5688 peer->keys[i] = NULL;
5689 spin_unlock_bh(&ab->base_lock);
5690 }
5691
5692 return first_errno;
5693 }
5694
ath12k_mac_set_key(struct ath12k * ar,enum set_key_cmd cmd,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ieee80211_key_conf * key)5695 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
5696 struct ath12k_link_vif *arvif,
5697 struct ath12k_link_sta *arsta,
5698 struct ieee80211_key_conf *key)
5699 {
5700 struct ieee80211_sta *sta = NULL;
5701 struct ath12k_base *ab = ar->ab;
5702 struct ath12k_peer *peer;
5703 struct ath12k_sta *ahsta;
5704 const u8 *peer_addr;
5705 int ret;
5706 u32 flags = 0;
5707
5708 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5709
5710 if (arsta)
5711 sta = ath12k_ahsta_to_sta(arsta->ahsta);
5712
5713 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
5714 return 1;
5715
5716 if (sta)
5717 peer_addr = arsta->addr;
5718 else
5719 peer_addr = arvif->bssid;
5720
5721 key->hw_key_idx = key->keyidx;
5722
5723 /* the peer should not disappear in mid-way (unless FW goes awry) since
5724 * we already hold wiphy lock. we just make sure its there now.
5725 */
5726 spin_lock_bh(&ab->base_lock);
5727 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5728 spin_unlock_bh(&ab->base_lock);
5729
5730 if (!peer) {
5731 if (cmd == SET_KEY) {
5732 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
5733 peer_addr);
5734 return -EOPNOTSUPP;
5735 }
5736
5737 /* if the peer doesn't exist there is no key to disable
5738 * anymore
5739 */
5740 return 0;
5741 }
5742
5743 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5744 flags = WMI_KEY_PAIRWISE;
5745 else
5746 flags = WMI_KEY_GROUP;
5747
5748 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
5749 if (ret) {
5750 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
5751 return ret;
5752 }
5753
5754 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
5755 if (ret) {
5756 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
5757 return ret;
5758 }
5759
5760 spin_lock_bh(&ab->base_lock);
5761 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5762 if (peer && cmd == SET_KEY) {
5763 peer->keys[key->keyidx] = key;
5764 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
5765 peer->ucast_keyidx = key->keyidx;
5766 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
5767 } else {
5768 peer->mcast_keyidx = key->keyidx;
5769 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
5770 }
5771 } else if (peer && cmd == DISABLE_KEY) {
5772 peer->keys[key->keyidx] = NULL;
5773 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5774 peer->ucast_keyidx = 0;
5775 else
5776 peer->mcast_keyidx = 0;
5777 } else if (!peer)
5778 /* impossible unless FW goes crazy */
5779 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
5780
5781 if (sta) {
5782 ahsta = ath12k_sta_to_ahsta(sta);
5783
5784 switch (key->cipher) {
5785 case WLAN_CIPHER_SUITE_TKIP:
5786 case WLAN_CIPHER_SUITE_CCMP:
5787 case WLAN_CIPHER_SUITE_CCMP_256:
5788 case WLAN_CIPHER_SUITE_GCMP:
5789 case WLAN_CIPHER_SUITE_GCMP_256:
5790 if (cmd == SET_KEY)
5791 ahsta->pn_type = HAL_PN_TYPE_WPA;
5792 else
5793 ahsta->pn_type = HAL_PN_TYPE_NONE;
5794 break;
5795 default:
5796 ahsta->pn_type = HAL_PN_TYPE_NONE;
5797 break;
5798 }
5799 }
5800
5801 spin_unlock_bh(&ab->base_lock);
5802
5803 return 0;
5804 }
5805
ath12k_mac_update_key_cache(struct ath12k_vif_cache * cache,enum set_key_cmd cmd,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5806 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache,
5807 enum set_key_cmd cmd,
5808 struct ieee80211_sta *sta,
5809 struct ieee80211_key_conf *key)
5810 {
5811 struct ath12k_key_conf *key_conf, *tmp;
5812
5813 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
5814 if (key_conf->key != key)
5815 continue;
5816
5817 /* If SET key entry is already present in cache, nothing to do,
5818 * just return
5819 */
5820 if (cmd == SET_KEY)
5821 return 0;
5822
5823 /* DEL key for an old SET key which driver hasn't flushed yet.
5824 */
5825 list_del(&key_conf->list);
5826 kfree(key_conf);
5827 }
5828
5829 if (cmd == SET_KEY) {
5830 key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL);
5831
5832 if (!key_conf)
5833 return -ENOMEM;
5834
5835 key_conf->cmd = cmd;
5836 key_conf->sta = sta;
5837 key_conf->key = key;
5838 list_add_tail(&key_conf->list,
5839 &cache->key_conf.list);
5840 }
5841
5842 return 0;
5843 }
5844
ath12k_mac_op_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5845 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5846 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5847 struct ieee80211_key_conf *key)
5848 {
5849 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5850 struct ath12k_link_vif *arvif;
5851 struct ath12k_link_sta *arsta = NULL;
5852 struct ath12k_vif_cache *cache;
5853 struct ath12k_sta *ahsta;
5854 unsigned long links;
5855 u8 link_id;
5856 int ret;
5857
5858 lockdep_assert_wiphy(hw->wiphy);
5859
5860 /* IGTK needs to be done in host software */
5861 if (key->keyidx == 4 || key->keyidx == 5)
5862 return 1;
5863
5864 if (key->keyidx > WMI_MAX_KEY_INDEX)
5865 return -ENOSPC;
5866
5867 if (sta) {
5868 ahsta = ath12k_sta_to_ahsta(sta);
5869
5870 /* For an ML STA Pairwise key is same for all associated link Stations,
5871 * hence do set key for all link STAs which are active.
5872 */
5873 if (sta->mlo) {
5874 links = ahsta->links_map;
5875 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
5876 arvif = wiphy_dereference(hw->wiphy,
5877 ahvif->link[link_id]);
5878 arsta = wiphy_dereference(hw->wiphy,
5879 ahsta->link[link_id]);
5880
5881 if (WARN_ON(!arvif || !arsta))
5882 /* arvif and arsta are expected to be valid when
5883 * STA is present.
5884 */
5885 continue;
5886
5887 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif,
5888 arsta, key);
5889 if (ret)
5890 break;
5891 }
5892
5893 return 0;
5894 }
5895
5896 arsta = &ahsta->deflink;
5897 arvif = arsta->arvif;
5898 if (WARN_ON(!arvif))
5899 return -EINVAL;
5900
5901 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key);
5902 if (ret)
5903 return ret;
5904
5905 return 0;
5906 }
5907
5908 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
5909 link_id = key->link_id;
5910 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5911 } else {
5912 link_id = 0;
5913 arvif = &ahvif->deflink;
5914 }
5915
5916 if (!arvif || !arvif->is_created) {
5917 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
5918 if (!cache)
5919 return -ENOSPC;
5920
5921 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key);
5922 if (ret)
5923 return ret;
5924
5925 return 0;
5926 }
5927
5928 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key);
5929 if (ret)
5930 return ret;
5931
5932 return 0;
5933 }
5934
5935 static int
ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5936 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
5937 enum nl80211_band band,
5938 const struct cfg80211_bitrate_mask *mask)
5939 {
5940 int num_rates = 0;
5941 int i;
5942
5943 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5944 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5945
5946 return num_rates;
5947 }
5948
5949 static int
ath12k_mac_bitrate_mask_num_he_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5950 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar,
5951 enum nl80211_band band,
5952 const struct cfg80211_bitrate_mask *mask)
5953 {
5954 int num_rates = 0;
5955 int i;
5956
5957 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
5958 num_rates += hweight16(mask->control[band].he_mcs[i]);
5959
5960 return num_rates;
5961 }
5962
5963 static int
ath12k_mac_bitrate_mask_num_eht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5964 ath12k_mac_bitrate_mask_num_eht_rates(struct ath12k *ar,
5965 enum nl80211_band band,
5966 const struct cfg80211_bitrate_mask *mask)
5967 {
5968 int num_rates = 0;
5969 int i;
5970
5971 for (i = 0; i < ARRAY_SIZE(mask->control[band].eht_mcs); i++)
5972 num_rates += hweight16(mask->control[band].eht_mcs[i]);
5973
5974 return num_rates;
5975 }
5976
5977 static int
ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)5978 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
5979 struct ath12k_link_sta *arsta,
5980 const struct cfg80211_bitrate_mask *mask,
5981 enum nl80211_band band)
5982 {
5983 struct ath12k *ar = arvif->ar;
5984 u8 vht_rate, nss;
5985 u32 rate_code;
5986 int ret, i;
5987
5988 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5989
5990 nss = 0;
5991
5992 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5993 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5994 nss = i + 1;
5995 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
5996 }
5997 }
5998
5999 if (!nss) {
6000 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
6001 arsta->addr);
6002 return -EINVAL;
6003 }
6004
6005 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6006 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
6007 arsta->addr);
6008
6009 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
6010 WMI_RATE_PREAMBLE_VHT);
6011 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6012 arvif->vdev_id,
6013 WMI_PEER_PARAM_FIXED_RATE,
6014 rate_code);
6015 if (ret)
6016 ath12k_warn(ar->ab,
6017 "failed to update STA %pM Fixed Rate %d: %d\n",
6018 arsta->addr, rate_code, ret);
6019
6020 return ret;
6021 }
6022
6023 static int
ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)6024 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif,
6025 struct ath12k_link_sta *arsta,
6026 const struct cfg80211_bitrate_mask *mask,
6027 enum nl80211_band band)
6028 {
6029 struct ath12k *ar = arvif->ar;
6030 u8 he_rate, nss;
6031 u32 rate_code;
6032 int ret, i;
6033 struct ath12k_sta *ahsta = arsta->ahsta;
6034 struct ieee80211_sta *sta;
6035
6036 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6037
6038 sta = ath12k_ahsta_to_sta(ahsta);
6039 nss = 0;
6040
6041 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
6042 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
6043 nss = i + 1;
6044 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
6045 }
6046 }
6047
6048 if (!nss) {
6049 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM",
6050 arsta->addr);
6051 return -EINVAL;
6052 }
6053
6054 /* Avoid updating invalid nss as fixed rate*/
6055 if (nss > sta->deflink.rx_nss)
6056 return -EINVAL;
6057
6058 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6059 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates",
6060 arsta->addr);
6061
6062 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1,
6063 WMI_RATE_PREAMBLE_HE);
6064
6065 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6066 arvif->vdev_id,
6067 WMI_PEER_PARAM_FIXED_RATE,
6068 rate_code);
6069 if (ret)
6070 ath12k_warn(ar->ab,
6071 "failed to update STA %pM Fixed Rate %d: %d\n",
6072 arsta->addr, rate_code, ret);
6073
6074 return ret;
6075 }
6076
6077 static int
ath12k_mac_set_peer_eht_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)6078 ath12k_mac_set_peer_eht_fixed_rate(struct ath12k_link_vif *arvif,
6079 struct ath12k_link_sta *arsta,
6080 const struct cfg80211_bitrate_mask *mask,
6081 enum nl80211_band band)
6082 {
6083 struct ath12k_sta *ahsta = arsta->ahsta;
6084 struct ath12k *ar = arvif->ar;
6085 struct ieee80211_sta *sta;
6086 struct ieee80211_link_sta *link_sta;
6087 u8 eht_rate, nss = 0;
6088 u32 rate_code;
6089 int ret, i;
6090
6091 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6092
6093 sta = ath12k_ahsta_to_sta(ahsta);
6094
6095 for (i = 0; i < ARRAY_SIZE(mask->control[band].eht_mcs); i++) {
6096 if (hweight16(mask->control[band].eht_mcs[i]) == 1) {
6097 nss = i + 1;
6098 eht_rate = ffs(mask->control[band].eht_mcs[i]) - 1;
6099 }
6100 }
6101
6102 if (!nss) {
6103 ath12k_warn(ar->ab, "No single EHT Fixed rate found to set for %pM\n",
6104 arsta->addr);
6105 return -EINVAL;
6106 }
6107
6108 /* Avoid updating invalid nss as fixed rate*/
6109 link_sta = ath12k_mac_get_link_sta(arsta);
6110 if (!link_sta || nss > link_sta->rx_nss) {
6111 ath12k_warn(ar->ab,
6112 "unable to access link sta for sta %pM link %u or fixed nss of %u is not supported by sta\n",
6113 sta->addr, arsta->link_id, nss);
6114 return -EINVAL;
6115 }
6116
6117 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6118 "Setting Fixed EHT Rate for peer %pM. Device will not switch to any other selected rates\n",
6119 arsta->addr);
6120
6121 rate_code = ATH12K_HW_RATE_CODE(eht_rate, nss - 1,
6122 WMI_RATE_PREAMBLE_EHT);
6123
6124 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6125 arvif->vdev_id,
6126 WMI_PEER_PARAM_FIXED_RATE,
6127 rate_code);
6128 if (ret)
6129 ath12k_warn(ar->ab,
6130 "failed to update STA %pM Fixed Rate %d: %d\n",
6131 arsta->addr, rate_code, ret);
6132
6133 return ret;
6134 }
6135
ath12k_mac_station_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,bool reassoc)6136 static int ath12k_mac_station_assoc(struct ath12k *ar,
6137 struct ath12k_link_vif *arvif,
6138 struct ath12k_link_sta *arsta,
6139 bool reassoc)
6140 {
6141 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6142 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6143 struct ieee80211_link_sta *link_sta;
6144 int ret;
6145 struct cfg80211_chan_def def;
6146 enum nl80211_band band;
6147 struct cfg80211_bitrate_mask *mask;
6148 u8 num_vht_rates, num_he_rates, num_eht_rates;
6149 u8 link_id = arvif->link_id;
6150
6151 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6152
6153 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
6154 return -EPERM;
6155
6156 if (WARN_ON(!rcu_access_pointer(sta->link[link_id])))
6157 return -EINVAL;
6158
6159 band = def.chan->band;
6160 mask = &arvif->bitrate_mask;
6161
6162 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
6163 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
6164 if (!peer_arg)
6165 return -ENOMEM;
6166
6167 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc);
6168
6169 if (peer_arg->peer_nss < 1) {
6170 ath12k_warn(ar->ab,
6171 "invalid peer NSS %d\n", peer_arg->peer_nss);
6172 return -EINVAL;
6173 }
6174
6175 peer_arg->is_assoc = true;
6176 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
6177 if (ret) {
6178 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
6179 arsta->addr, arvif->vdev_id, ret);
6180 return ret;
6181 }
6182
6183 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
6184 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
6185 arsta->addr, arvif->vdev_id);
6186 return -ETIMEDOUT;
6187 }
6188
6189 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
6190 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
6191 num_eht_rates = ath12k_mac_bitrate_mask_num_eht_rates(ar, band, mask);
6192
6193 /* If single VHT/HE/EHT rate is configured (by set_bitrate_mask()),
6194 * peer_assoc will disable VHT/HE/EHT. This is now enabled by a peer
6195 * specific fixed param.
6196 * Note that all other rates and NSS will be disabled for this peer.
6197 */
6198 link_sta = ath12k_mac_get_link_sta(arsta);
6199 if (!link_sta) {
6200 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n");
6201 return -EINVAL;
6202 }
6203
6204 spin_lock_bh(&ar->data_lock);
6205 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
6206 arsta->bw_prev = link_sta->bandwidth;
6207 spin_unlock_bh(&ar->data_lock);
6208
6209 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
6210 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band);
6211 } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
6212 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
6213 if (ret)
6214 return ret;
6215 } else if (link_sta->eht_cap.has_eht && num_eht_rates == 1) {
6216 ret = ath12k_mac_set_peer_eht_fixed_rate(arvif, arsta, mask, band);
6217 if (ret)
6218 return ret;
6219 }
6220
6221 /* Re-assoc is run only to update supported rates for given station. It
6222 * doesn't make much sense to reconfigure the peer completely.
6223 */
6224 if (reassoc)
6225 return 0;
6226
6227 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr,
6228 &link_sta->ht_cap, &link_sta->he_6ghz_capa);
6229 if (ret) {
6230 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
6231 arvif->vdev_id, ret);
6232 return ret;
6233 }
6234
6235 if (!sta->wme) {
6236 arvif->num_legacy_stations++;
6237 ret = ath12k_recalc_rtscts_prot(arvif);
6238 if (ret)
6239 return ret;
6240 }
6241
6242 if (sta->wme && sta->uapsd_queues) {
6243 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta);
6244 if (ret) {
6245 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
6246 arsta->addr, arvif->vdev_id, ret);
6247 return ret;
6248 }
6249 }
6250
6251 return 0;
6252 }
6253
ath12k_mac_station_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6254 static int ath12k_mac_station_disassoc(struct ath12k *ar,
6255 struct ath12k_link_vif *arvif,
6256 struct ath12k_link_sta *arsta)
6257 {
6258 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6259
6260 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6261
6262 if (!sta->wme) {
6263 arvif->num_legacy_stations--;
6264 return ath12k_recalc_rtscts_prot(arvif);
6265 }
6266
6267 return 0;
6268 }
6269
ath12k_sta_rc_update_wk(struct wiphy * wiphy,struct wiphy_work * wk)6270 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
6271 {
6272 struct ieee80211_link_sta *link_sta;
6273 struct ath12k *ar;
6274 struct ath12k_link_vif *arvif;
6275 struct ieee80211_sta *sta;
6276 struct cfg80211_chan_def def;
6277 enum nl80211_band band;
6278 const u8 *ht_mcs_mask;
6279 const u16 *vht_mcs_mask;
6280 const u16 *he_mcs_mask;
6281 const u16 *eht_mcs_mask;
6282 u32 changed, bw, nss, mac_nss, smps, bw_prev;
6283 int err, num_vht_rates, num_he_rates, num_eht_rates;
6284 const struct cfg80211_bitrate_mask *mask;
6285 enum wmi_phy_mode peer_phymode;
6286 struct ath12k_link_sta *arsta;
6287 struct ieee80211_vif *vif;
6288
6289 lockdep_assert_wiphy(wiphy);
6290
6291 arsta = container_of(wk, struct ath12k_link_sta, update_wk);
6292 sta = ath12k_ahsta_to_sta(arsta->ahsta);
6293 arvif = arsta->arvif;
6294 vif = ath12k_ahvif_to_vif(arvif->ahvif);
6295 ar = arvif->ar;
6296
6297 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
6298 return;
6299
6300 band = def.chan->band;
6301 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
6302 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
6303 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
6304 eht_mcs_mask = arvif->bitrate_mask.control[band].eht_mcs;
6305
6306 spin_lock_bh(&ar->data_lock);
6307
6308 changed = arsta->changed;
6309 arsta->changed = 0;
6310
6311 bw = arsta->bw;
6312 bw_prev = arsta->bw_prev;
6313 nss = arsta->nss;
6314 smps = arsta->smps;
6315
6316 spin_unlock_bh(&ar->data_lock);
6317
6318 nss = max_t(u32, 1, nss);
6319 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
6320 ath12k_mac_max_vht_nss(vht_mcs_mask),
6321 ath12k_mac_max_he_nss(he_mcs_mask));
6322 mac_nss = max(mac_nss, ath12k_mac_max_eht_nss(eht_mcs_mask));
6323 nss = min(nss, mac_nss);
6324
6325 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
6326 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
6327 if (!peer_arg)
6328 return;
6329
6330 if (changed & IEEE80211_RC_BW_CHANGED) {
6331 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg);
6332 peer_phymode = peer_arg->peer_phymode;
6333
6334 if (bw > bw_prev) {
6335 /* Phymode shows maximum supported channel width, if we
6336 * upgrade bandwidth then due to sanity check of firmware,
6337 * we have to send WMI_PEER_PHYMODE followed by
6338 * WMI_PEER_CHWIDTH
6339 */
6340 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
6341 arsta->addr, bw, bw_prev);
6342 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6343 arvif->vdev_id, WMI_PEER_PHYMODE,
6344 peer_phymode);
6345 if (err) {
6346 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6347 arsta->addr, peer_phymode, err);
6348 return;
6349 }
6350 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6351 arvif->vdev_id, WMI_PEER_CHWIDTH,
6352 bw);
6353 if (err)
6354 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
6355 arsta->addr, bw, err);
6356 } else {
6357 /* When we downgrade bandwidth this will conflict with phymode
6358 * and cause to trigger firmware crash. In this case we send
6359 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
6360 */
6361 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
6362 arsta->addr, bw, bw_prev);
6363 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6364 arvif->vdev_id, WMI_PEER_CHWIDTH,
6365 bw);
6366 if (err) {
6367 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
6368 arsta->addr, bw, err);
6369 return;
6370 }
6371 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6372 arvif->vdev_id, WMI_PEER_PHYMODE,
6373 peer_phymode);
6374 if (err)
6375 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6376 arsta->addr, peer_phymode, err);
6377 }
6378 }
6379
6380 if (changed & IEEE80211_RC_NSS_CHANGED) {
6381 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
6382 arsta->addr, nss);
6383
6384 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6385 WMI_PEER_NSS, nss);
6386 if (err)
6387 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
6388 arsta->addr, nss, err);
6389 }
6390
6391 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6392 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
6393 arsta->addr, smps);
6394
6395 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6396 WMI_PEER_MIMO_PS_STATE, smps);
6397 if (err)
6398 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
6399 arsta->addr, smps, err);
6400 }
6401
6402 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6403 mask = &arvif->bitrate_mask;
6404 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6405 mask);
6406 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band,
6407 mask);
6408 num_eht_rates = ath12k_mac_bitrate_mask_num_eht_rates(ar, band,
6409 mask);
6410
6411 /* Peer_assoc_prepare will reject vht rates in
6412 * bitrate_mask if its not available in range format and
6413 * sets vht tx_rateset as unsupported. So multiple VHT MCS
6414 * setting(eg. MCS 4,5,6) per peer is not supported here.
6415 * But, Single rate in VHT mask can be set as per-peer
6416 * fixed rate. But even if any HT rates are configured in
6417 * the bitrate mask, device will not switch to those rates
6418 * when per-peer Fixed rate is set.
6419 * TODO: Check RATEMASK_CMDID to support auto rates selection
6420 * across HT/VHT and for multiple VHT MCS support.
6421 */
6422 link_sta = ath12k_mac_get_link_sta(arsta);
6423 if (!link_sta) {
6424 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
6425 sta->addr, arsta->link_id);
6426 return;
6427 }
6428
6429 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
6430 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
6431 band);
6432 } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
6433 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
6434 } else if (link_sta->eht_cap.has_eht && num_eht_rates == 1) {
6435 err = ath12k_mac_set_peer_eht_fixed_rate(arvif, arsta,
6436 mask, band);
6437 if (err) {
6438 ath12k_warn(ar->ab,
6439 "failed to set peer EHT fixed rate for STA %pM ret %d\n",
6440 arsta->addr, err);
6441 return;
6442 }
6443 } else {
6444 /* If the peer is non-VHT/HE/EHT or no fixed VHT/HE/EHT
6445 * rate is provided in the new bitrate mask we set the
6446 * other rates using peer_assoc command. Also clear
6447 * the peer fixed rate settings as it has higher proprity
6448 * than peer assoc
6449 */
6450 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6451 arvif->vdev_id,
6452 WMI_PEER_PARAM_FIXED_RATE,
6453 WMI_FIXED_RATE_NONE);
6454 if (err)
6455 ath12k_warn(ar->ab,
6456 "failed to disable peer fixed rate for STA %pM ret %d\n",
6457 arsta->addr, err);
6458
6459 ath12k_peer_assoc_prepare(ar, arvif, arsta,
6460 peer_arg, true);
6461
6462 peer_arg->is_assoc = false;
6463 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
6464 if (err)
6465 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
6466 arsta->addr, arvif->vdev_id, err);
6467
6468 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
6469 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
6470 arsta->addr, arvif->vdev_id);
6471 }
6472 }
6473 }
6474
ath12k_mac_free_unassign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,u8 link_id)6475 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah,
6476 struct ath12k_sta *ahsta,
6477 u8 link_id)
6478 {
6479 struct ath12k_link_sta *arsta;
6480
6481 lockdep_assert_wiphy(ah->hw->wiphy);
6482
6483 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
6484 return;
6485
6486 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6487 if (WARN_ON(!arsta))
6488 return;
6489
6490 ahsta->links_map &= ~BIT(link_id);
6491 rcu_assign_pointer(ahsta->link[link_id], NULL);
6492 synchronize_rcu();
6493
6494 if (arsta == &ahsta->deflink) {
6495 arsta->link_id = ATH12K_INVALID_LINK_ID;
6496 arsta->ahsta = NULL;
6497 arsta->arvif = NULL;
6498 return;
6499 }
6500
6501 kfree(arsta);
6502 }
6503
ath12k_mac_inc_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6504 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif,
6505 struct ath12k_link_sta *arsta)
6506 {
6507 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6508 struct ath12k *ar = arvif->ar;
6509
6510 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6511
6512 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6513 return 0;
6514
6515 if (ar->num_stations >= ar->max_num_stations)
6516 return -ENOBUFS;
6517
6518 ar->num_stations++;
6519 arvif->num_stations++;
6520
6521 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6522 "mac station %pM connected to vdev %u num_stations %u\n",
6523 arsta->addr, arvif->vdev_id, arvif->num_stations);
6524
6525 return 0;
6526 }
6527
ath12k_mac_dec_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6528 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif,
6529 struct ath12k_link_sta *arsta)
6530 {
6531 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6532 struct ath12k *ar = arvif->ar;
6533
6534 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6535
6536 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6537 return;
6538
6539 ar->num_stations--;
6540
6541 if (arvif->num_stations) {
6542 arvif->num_stations--;
6543 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6544 "mac station %pM disconnected from vdev %u num_stations %u\n",
6545 arsta->addr, arvif->vdev_id, arvif->num_stations);
6546 } else {
6547 ath12k_warn(ar->ab,
6548 "mac station %pM disconnect for vdev %u without any connected station\n",
6549 arsta->addr, arvif->vdev_id);
6550 }
6551 }
6552
ath12k_mac_station_post_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6553 static void ath12k_mac_station_post_remove(struct ath12k *ar,
6554 struct ath12k_link_vif *arvif,
6555 struct ath12k_link_sta *arsta)
6556 {
6557 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6558 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6559 struct ath12k_peer *peer;
6560
6561 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6562
6563 ath12k_mac_dec_num_stations(arvif, arsta);
6564
6565 spin_lock_bh(&ar->ab->base_lock);
6566
6567 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6568 if (peer && peer->sta == sta) {
6569 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
6570 vif->addr, arvif->vdev_id);
6571 peer->sta = NULL;
6572 list_del(&peer->list);
6573 kfree(peer);
6574 ar->num_peers--;
6575 }
6576
6577 spin_unlock_bh(&ar->ab->base_lock);
6578
6579 kfree(arsta->rx_stats);
6580 arsta->rx_stats = NULL;
6581 }
6582
ath12k_mac_station_unauthorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6583 static int ath12k_mac_station_unauthorize(struct ath12k *ar,
6584 struct ath12k_link_vif *arvif,
6585 struct ath12k_link_sta *arsta)
6586 {
6587 struct ath12k_peer *peer;
6588 int ret;
6589
6590 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6591
6592 spin_lock_bh(&ar->ab->base_lock);
6593
6594 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6595 if (peer)
6596 peer->is_authorized = false;
6597
6598 spin_unlock_bh(&ar->ab->base_lock);
6599
6600 /* Driver must clear the keys during the state change from
6601 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
6602 * returning from here, mac80211 is going to delete the keys
6603 * in __sta_info_destroy_part2(). This will ensure that the driver does
6604 * not retain stale key references after mac80211 deletes the keys.
6605 */
6606 ret = ath12k_clear_peer_keys(arvif, arsta->addr);
6607 if (ret) {
6608 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
6609 arvif->vdev_id, ret);
6610 return ret;
6611 }
6612
6613 return 0;
6614 }
6615
ath12k_mac_station_authorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6616 static int ath12k_mac_station_authorize(struct ath12k *ar,
6617 struct ath12k_link_vif *arvif,
6618 struct ath12k_link_sta *arsta)
6619 {
6620 struct ath12k_peer *peer;
6621 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6622 int ret;
6623
6624 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6625
6626 spin_lock_bh(&ar->ab->base_lock);
6627
6628 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6629 if (peer)
6630 peer->is_authorized = true;
6631
6632 spin_unlock_bh(&ar->ab->base_lock);
6633
6634 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
6635 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6636 arvif->vdev_id,
6637 WMI_PEER_AUTHORIZE,
6638 1);
6639 if (ret) {
6640 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
6641 arsta->addr, arvif->vdev_id, ret);
6642 return ret;
6643 }
6644 }
6645
6646 return 0;
6647 }
6648
ath12k_mac_station_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6649 static int ath12k_mac_station_remove(struct ath12k *ar,
6650 struct ath12k_link_vif *arvif,
6651 struct ath12k_link_sta *arsta)
6652 {
6653 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6654 struct ath12k_vif *ahvif = arvif->ahvif;
6655 int ret = 0;
6656
6657 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6658
6659 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk);
6660
6661 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6662 ath12k_bss_disassoc(ar, arvif);
6663 ret = ath12k_mac_vdev_stop(arvif);
6664 if (ret)
6665 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
6666 arvif->vdev_id, ret);
6667 }
6668
6669 if (sta->mlo)
6670 return ret;
6671
6672 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr);
6673
6674 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6675 if (ret)
6676 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
6677 arsta->addr, arvif->vdev_id);
6678 else
6679 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
6680 arsta->addr, arvif->vdev_id);
6681
6682 ath12k_mac_station_post_remove(ar, arvif, arsta);
6683
6684 if (sta->valid_links)
6685 ath12k_mac_free_unassign_link_sta(ahvif->ah,
6686 arsta->ahsta, arsta->link_id);
6687
6688 return ret;
6689 }
6690
ath12k_mac_station_add(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6691 static int ath12k_mac_station_add(struct ath12k *ar,
6692 struct ath12k_link_vif *arvif,
6693 struct ath12k_link_sta *arsta)
6694 {
6695 struct ath12k_base *ab = ar->ab;
6696 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6697 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6698 struct ath12k_wmi_peer_create_arg peer_param = {};
6699 int ret;
6700
6701 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6702
6703 ret = ath12k_mac_inc_num_stations(arvif, arsta);
6704 if (ret) {
6705 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
6706 ar->max_num_stations);
6707 goto exit;
6708 }
6709
6710 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) {
6711 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
6712 if (!arsta->rx_stats) {
6713 ret = -ENOMEM;
6714 goto dec_num_station;
6715 }
6716 }
6717
6718 peer_param.vdev_id = arvif->vdev_id;
6719 peer_param.peer_addr = arsta->addr;
6720 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6721 peer_param.ml_enabled = sta->mlo;
6722
6723 ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
6724 if (ret) {
6725 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
6726 arsta->addr, arvif->vdev_id);
6727 goto free_peer;
6728 }
6729
6730 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
6731 arsta->addr, arvif->vdev_id);
6732
6733 if (ieee80211_vif_is_mesh(vif)) {
6734 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6735 arvif->vdev_id,
6736 WMI_PEER_USE_4ADDR, 1);
6737 if (ret) {
6738 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
6739 arsta->addr, ret);
6740 goto free_peer;
6741 }
6742 }
6743
6744 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr);
6745 if (ret) {
6746 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
6747 arsta->addr, arvif->vdev_id, ret);
6748 goto free_peer;
6749 }
6750
6751 if (ab->hw_params->vdev_start_delay &&
6752 !arvif->is_started &&
6753 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) {
6754 ret = ath12k_start_vdev_delay(ar, arvif);
6755 if (ret) {
6756 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
6757 goto free_peer;
6758 }
6759 }
6760
6761 ewma_avg_rssi_init(&arsta->avg_rssi);
6762 return 0;
6763
6764 free_peer:
6765 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6766 kfree(arsta->rx_stats);
6767 arsta->rx_stats = NULL;
6768 dec_num_station:
6769 ath12k_mac_dec_num_stations(arvif, arsta);
6770 exit:
6771 return ret;
6772 }
6773
ath12k_mac_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_link_sta * arsta,struct ath12k_vif * ahvif,u8 link_id)6774 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
6775 struct ath12k_sta *ahsta,
6776 struct ath12k_link_sta *arsta,
6777 struct ath12k_vif *ahvif,
6778 u8 link_id)
6779 {
6780 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6781 struct ieee80211_link_sta *link_sta;
6782 struct ath12k_link_vif *arvif;
6783
6784 lockdep_assert_wiphy(ah->hw->wiphy);
6785
6786 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
6787 return -EINVAL;
6788
6789 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6790 if (!arvif)
6791 return -EINVAL;
6792
6793 memset(arsta, 0, sizeof(*arsta));
6794
6795 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]);
6796 if (!link_sta)
6797 return -EINVAL;
6798
6799 ether_addr_copy(arsta->addr, link_sta->addr);
6800
6801 /* logical index of the link sta in order of creation */
6802 arsta->link_idx = ahsta->num_peer++;
6803
6804 arsta->link_id = link_id;
6805 ahsta->links_map |= BIT(arsta->link_id);
6806 arsta->arvif = arvif;
6807 arsta->ahsta = ahsta;
6808 ahsta->ahvif = ahvif;
6809
6810 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);
6811
6812 rcu_assign_pointer(ahsta->link[link_id], arsta);
6813
6814 return 0;
6815 }
6816
ath12k_mac_ml_station_remove(struct ath12k_vif * ahvif,struct ath12k_sta * ahsta)6817 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif,
6818 struct ath12k_sta *ahsta)
6819 {
6820 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6821 struct ath12k_hw *ah = ahvif->ah;
6822 struct ath12k_link_vif *arvif;
6823 struct ath12k_link_sta *arsta;
6824 unsigned long links;
6825 struct ath12k *ar;
6826 u8 link_id;
6827
6828 lockdep_assert_wiphy(ah->hw->wiphy);
6829
6830 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta);
6831
6832 /* validate link station removal and clear arsta links */
6833 links = ahsta->links_map;
6834 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6835 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6836 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6837 if (!arvif || !arsta)
6838 continue;
6839
6840 ar = arvif->ar;
6841
6842 ath12k_mac_station_post_remove(ar, arvif, arsta);
6843
6844 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
6845 }
6846
6847 ath12k_peer_ml_delete(ah, sta);
6848 }
6849
ath12k_mac_handle_link_sta_state(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)6850 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
6851 struct ath12k_link_vif *arvif,
6852 struct ath12k_link_sta *arsta,
6853 enum ieee80211_sta_state old_state,
6854 enum ieee80211_sta_state new_state)
6855 {
6856 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6857 struct ieee80211_bss_conf *link_conf;
6858 struct ath12k *ar = arvif->ar;
6859 struct ath12k_reg_info *reg_info;
6860 struct ath12k_base *ab = ar->ab;
6861 int ret = 0;
6862
6863 lockdep_assert_wiphy(hw->wiphy);
6864
6865 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
6866 arsta->link_id, arsta->addr, old_state, new_state);
6867
6868 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
6869 * from driver
6870 */
6871 if ((old_state == IEEE80211_STA_NONE &&
6872 new_state == IEEE80211_STA_NOTEXIST)) {
6873 ret = ath12k_mac_station_remove(ar, arvif, arsta);
6874 if (ret) {
6875 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n",
6876 arsta->addr, arvif->vdev_id);
6877 goto exit;
6878 }
6879 }
6880
6881 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */
6882 if (old_state == IEEE80211_STA_NOTEXIST &&
6883 new_state == IEEE80211_STA_NONE) {
6884 ret = ath12k_mac_station_add(ar, arvif, arsta);
6885 if (ret)
6886 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n",
6887 arsta->addr, arvif->vdev_id);
6888
6889 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
6890 * peer associated to AP/Mesh/ADHOC vif type.
6891 */
6892 } else if (old_state == IEEE80211_STA_AUTH &&
6893 new_state == IEEE80211_STA_ASSOC &&
6894 (vif->type == NL80211_IFTYPE_AP ||
6895 vif->type == NL80211_IFTYPE_MESH_POINT ||
6896 vif->type == NL80211_IFTYPE_ADHOC)) {
6897 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
6898 if (ret)
6899 ath12k_warn(ab, "Failed to associate station: %pM\n",
6900 arsta->addr);
6901
6902 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
6903 * authorized
6904 */
6905 } else if (old_state == IEEE80211_STA_ASSOC &&
6906 new_state == IEEE80211_STA_AUTHORIZED) {
6907 ret = ath12k_mac_station_authorize(ar, arvif, arsta);
6908 if (ret) {
6909 ath12k_warn(ab, "Failed to authorize station: %pM\n",
6910 arsta->addr);
6911 goto exit;
6912 }
6913
6914 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
6915 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6916 link_conf = ath12k_mac_get_link_bss_conf(arvif);
6917 reg_info = ab->reg_info[ar->pdev_idx];
6918 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n");
6919 ath12k_hw_to_ah(hw)->regd_updated = false;
6920 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type,
6921 link_conf->power_type);
6922 }
6923
6924 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
6925 * deauthorize it.
6926 */
6927 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
6928 new_state == IEEE80211_STA_ASSOC) {
6929 ath12k_mac_station_unauthorize(ar, arvif, arsta);
6930
6931 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to
6932 * AP/mesh/ADHOC vif type.
6933 */
6934 } else if (old_state == IEEE80211_STA_ASSOC &&
6935 new_state == IEEE80211_STA_AUTH &&
6936 (vif->type == NL80211_IFTYPE_AP ||
6937 vif->type == NL80211_IFTYPE_MESH_POINT ||
6938 vif->type == NL80211_IFTYPE_ADHOC)) {
6939 ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
6940 if (ret)
6941 ath12k_warn(ab, "Failed to disassociate station: %pM\n",
6942 arsta->addr);
6943 }
6944
6945 exit:
6946 return ret;
6947 }
6948
ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq,u8 mac_id)6949 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range,
6950 u32 freq, u8 mac_id)
6951 {
6952 return (freq >= freq_range[mac_id].low_2ghz_freq &&
6953 freq <= freq_range[mac_id].high_2ghz_freq) ||
6954 (freq >= freq_range[mac_id].low_5ghz_freq &&
6955 freq <= freq_range[mac_id].high_5ghz_freq);
6956 }
6957
6958 static bool
ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base * ab,struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq_link1,u32 freq_link2)6959 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab,
6960 struct ath12k_hw_mode_freq_range_arg *freq_range,
6961 u32 freq_link1, u32 freq_link2)
6962 {
6963 u8 i;
6964
6965 for (i = 0; i < MAX_RADIOS; i++) {
6966 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) &&
6967 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i))
6968 return true;
6969 }
6970
6971 return false;
6972 }
6973
ath12k_mac_is_hw_dbs_capable(struct ath12k_base * ab)6974 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab)
6975 {
6976 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6977 ab->wmi_ab.svc_map) &&
6978 ab->wmi_ab.hw_mode_info.support_dbs;
6979 }
6980
ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6981 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab,
6982 u32 freq_link1, u32 freq_link2)
6983 {
6984 struct ath12k_hw_mode_freq_range_arg *freq_range;
6985
6986 if (!ath12k_mac_is_hw_dbs_capable(ab))
6987 return true;
6988
6989 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS];
6990 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range,
6991 freq_link1, freq_link2);
6992 }
6993
ath12k_mac_is_hw_sbs_capable(struct ath12k_base * ab)6994 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab)
6995 {
6996 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6997 ab->wmi_ab.svc_map) &&
6998 ab->wmi_ab.hw_mode_info.support_sbs;
6999 }
7000
ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)7001 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab,
7002 u32 freq_link1, u32 freq_link2)
7003 {
7004 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info;
7005 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share;
7006 struct ath12k_hw_mode_freq_range_arg *sbs_low_share;
7007 struct ath12k_hw_mode_freq_range_arg *sbs_range;
7008
7009 if (!ath12k_mac_is_hw_sbs_capable(ab))
7010 return true;
7011
7012 if (ab->wmi_ab.sbs_lower_band_end_freq) {
7013 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE];
7014 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE];
7015
7016 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share,
7017 freq_link1, freq_link2) ||
7018 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share,
7019 freq_link1, freq_link2);
7020 }
7021
7022 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS];
7023 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range,
7024 freq_link1, freq_link2);
7025 }
7026
ath12k_mac_freqs_on_same_mac(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)7027 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab,
7028 u32 freq_link1, u32 freq_link2)
7029 {
7030 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) &&
7031 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2);
7032 }
7033
ath12k_mac_mlo_sta_set_link_active(struct ath12k_base * ab,enum wmi_mlo_link_force_reason reason,enum wmi_mlo_link_force_mode mode,u8 * mlo_vdev_id_lst,u8 num_mlo_vdev,u8 * mlo_inactive_vdev_lst,u8 num_mlo_inactive_vdev)7034 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab,
7035 enum wmi_mlo_link_force_reason reason,
7036 enum wmi_mlo_link_force_mode mode,
7037 u8 *mlo_vdev_id_lst,
7038 u8 num_mlo_vdev,
7039 u8 *mlo_inactive_vdev_lst,
7040 u8 num_mlo_inactive_vdev)
7041 {
7042 struct wmi_mlo_link_set_active_arg param = {};
7043 u32 entry_idx, entry_offset, vdev_idx;
7044 u8 vdev_id;
7045
7046 param.reason = reason;
7047 param.force_mode = mode;
7048
7049 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
7050 vdev_id = mlo_vdev_id_lst[vdev_idx];
7051 entry_idx = vdev_id / 32;
7052 entry_offset = vdev_id % 32;
7053 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
7054 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
7055 entry_idx, num_mlo_vdev, vdev_id);
7056 return -EINVAL;
7057 }
7058 param.vdev_bitmap[entry_idx] |= 1 << entry_offset;
7059 /* update entry number if entry index changed */
7060 if (param.num_vdev_bitmap < entry_idx + 1)
7061 param.num_vdev_bitmap = entry_idx + 1;
7062 }
7063
7064 ath12k_dbg(ab, ATH12K_DBG_MAC,
7065 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
7066 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]);
7067
7068 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) {
7069 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) {
7070 vdev_id = mlo_inactive_vdev_lst[vdev_idx];
7071 entry_idx = vdev_id / 32;
7072 entry_offset = vdev_id % 32;
7073 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
7074 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
7075 entry_idx, num_mlo_inactive_vdev, vdev_id);
7076 return -EINVAL;
7077 }
7078 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset;
7079 /* update entry number if entry index changed */
7080 if (param.num_inactive_vdev_bitmap < entry_idx + 1)
7081 param.num_inactive_vdev_bitmap = entry_idx + 1;
7082 }
7083
7084 ath12k_dbg(ab, ATH12K_DBG_MAC,
7085 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x",
7086 param.num_inactive_vdev_bitmap,
7087 param.inactive_vdev_bitmap[0],
7088 param.inactive_vdev_bitmap[1]);
7089 }
7090
7091 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM ||
7092 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) {
7093 param.num_link_entry = 1;
7094 param.link_num[0].num_of_link = num_mlo_vdev - 1;
7095 }
7096
7097 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m);
7098 }
7099
ath12k_mac_mlo_sta_update_link_active(struct ath12k_base * ab,struct ieee80211_hw * hw,struct ath12k_vif * ahvif)7100 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab,
7101 struct ieee80211_hw *hw,
7102 struct ath12k_vif *ahvif)
7103 {
7104 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {};
7105 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {};
7106 unsigned long links = ahvif->links_map;
7107 enum wmi_mlo_link_force_reason reason;
7108 struct ieee80211_chanctx_conf *conf;
7109 enum wmi_mlo_link_force_mode mode;
7110 struct ieee80211_bss_conf *info;
7111 struct ath12k_link_vif *arvif;
7112 u8 num_mlo_vdev = 0;
7113 u8 link_id;
7114
7115 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
7116 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7117 /* make sure vdev is created on this device */
7118 if (!arvif || !arvif->is_created || arvif->ar->ab != ab)
7119 continue;
7120
7121 info = ath12k_mac_get_link_bss_conf(arvif);
7122 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf);
7123 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq;
7124
7125 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id;
7126 num_mlo_vdev++;
7127 }
7128
7129 /* It is not allowed to activate more links than a single device
7130 * supported. Something goes wrong if we reach here.
7131 */
7132 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
7133 WARN_ON_ONCE(1);
7134 return -EINVAL;
7135 }
7136
7137 /* if 2 links are established and both link channels fall on the
7138 * same hardware MAC, send command to firmware to deactivate one
7139 * of them.
7140 */
7141 if (num_mlo_vdev == 2 &&
7142 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0],
7143 mlo_freq_list[1])) {
7144 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM;
7145 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT;
7146 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode,
7147 mlo_vdev_id_lst, num_mlo_vdev,
7148 NULL, 0);
7149 }
7150
7151 return 0;
7152 }
7153
ath12k_mac_are_sbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)7154 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
7155 {
7156 if (!ath12k_mac_is_hw_sbs_capable(ab))
7157 return false;
7158
7159 if (ath12k_is_2ghz_channel_freq(freq_1) ||
7160 ath12k_is_2ghz_channel_freq(freq_2))
7161 return false;
7162
7163 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2);
7164 }
7165
ath12k_mac_are_dbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)7166 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
7167 {
7168 if (!ath12k_mac_is_hw_dbs_capable(ab))
7169 return false;
7170
7171 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2);
7172 }
7173
ath12k_mac_select_links(struct ath12k_base * ab,struct ieee80211_vif * vif,struct ieee80211_hw * hw,u16 * selected_links)7174 static int ath12k_mac_select_links(struct ath12k_base *ab,
7175 struct ieee80211_vif *vif,
7176 struct ieee80211_hw *hw,
7177 u16 *selected_links)
7178 {
7179 unsigned long useful_links = ieee80211_vif_usable_links(vif);
7180 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7181 u8 num_useful_links = hweight_long(useful_links);
7182 struct ieee80211_chanctx_conf *chanctx;
7183 struct ath12k_link_vif *assoc_arvif;
7184 u32 assoc_link_freq, partner_freq;
7185 u16 sbs_links = 0, dbs_links = 0;
7186 struct ieee80211_bss_conf *info;
7187 struct ieee80211_channel *chan;
7188 struct ieee80211_sta *sta;
7189 struct ath12k_sta *ahsta;
7190 u8 link_id;
7191
7192 /* activate all useful links if less than max supported */
7193 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
7194 *selected_links = useful_links;
7195 return 0;
7196 }
7197
7198 /* only in station mode we can get here, so it's safe
7199 * to use ap_addr
7200 */
7201 rcu_read_lock();
7202 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
7203 if (!sta) {
7204 rcu_read_unlock();
7205 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr);
7206 return -EINVAL;
7207 }
7208
7209 ahsta = ath12k_sta_to_ahsta(sta);
7210 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]);
7211 info = ath12k_mac_get_link_bss_conf(assoc_arvif);
7212 chanctx = rcu_dereference(info->chanctx_conf);
7213 assoc_link_freq = chanctx->def.chan->center_freq;
7214 rcu_read_unlock();
7215 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n",
7216 assoc_arvif->link_id, assoc_link_freq);
7217
7218 /* assoc link is already activated and has to be kept active,
7219 * only need to select a partner link from others.
7220 */
7221 useful_links &= ~BIT(assoc_arvif->link_id);
7222 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7223 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
7224 if (!info) {
7225 ath12k_warn(ab, "failed to get link info for link: %u\n",
7226 link_id);
7227 return -ENOLINK;
7228 }
7229
7230 chan = info->chanreq.oper.chan;
7231 if (!chan) {
7232 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id);
7233 return -EINVAL;
7234 }
7235
7236 partner_freq = chan->center_freq;
7237 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) {
7238 sbs_links |= BIT(link_id);
7239 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n",
7240 link_id, partner_freq);
7241 continue;
7242 }
7243
7244 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) {
7245 dbs_links |= BIT(link_id);
7246 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n",
7247 link_id, partner_freq);
7248 continue;
7249 }
7250
7251 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n",
7252 link_id, partner_freq);
7253 }
7254
7255 /* choose the first candidate no matter how many is in the list */
7256 if (sbs_links)
7257 link_id = __ffs(sbs_links);
7258 else if (dbs_links)
7259 link_id = __ffs(dbs_links);
7260 else
7261 link_id = ffs(useful_links) - 1;
7262
7263 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id);
7264
7265 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id);
7266
7267 return 0;
7268 }
7269
ath12k_mac_op_sta_state(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)7270 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
7271 struct ieee80211_vif *vif,
7272 struct ieee80211_sta *sta,
7273 enum ieee80211_sta_state old_state,
7274 enum ieee80211_sta_state new_state)
7275 {
7276 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7277 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7278 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7279 struct ath12k_base *prev_ab = NULL, *ab;
7280 struct ath12k_link_vif *arvif;
7281 struct ath12k_link_sta *arsta;
7282 unsigned long valid_links;
7283 u16 selected_links = 0;
7284 u8 link_id = 0, i;
7285 struct ath12k *ar;
7286 int ret;
7287
7288 lockdep_assert_wiphy(hw->wiphy);
7289
7290 if (ieee80211_vif_is_mld(vif) && sta->valid_links) {
7291 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1);
7292 link_id = ffs(sta->valid_links) - 1;
7293 }
7294
7295 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE:
7296 * New station add received. If this is a ML station then
7297 * ahsta->links_map will be zero and sta->valid_links will be 1.
7298 * Assign default link to the first link sta.
7299 */
7300 if (old_state == IEEE80211_STA_NOTEXIST &&
7301 new_state == IEEE80211_STA_NONE) {
7302 memset(ahsta, 0, sizeof(*ahsta));
7303
7304 arsta = &ahsta->deflink;
7305
7306 /* ML sta */
7307 if (sta->mlo && !ahsta->links_map &&
7308 (hweight16(sta->valid_links) == 1)) {
7309 ret = ath12k_peer_ml_create(ah, sta);
7310 if (ret) {
7311 ath12k_hw_warn(ah, "unable to create ML peer for sta %pM",
7312 sta->addr);
7313 goto exit;
7314 }
7315 }
7316
7317 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif,
7318 link_id);
7319 if (ret) {
7320 ath12k_hw_warn(ah, "unable assign link %d for sta %pM",
7321 link_id, sta->addr);
7322 goto exit;
7323 }
7324
7325 /* above arsta will get memset, hence do this after assign
7326 * link sta
7327 */
7328 if (sta->mlo) {
7329 /* For station mode, arvif->is_sta_assoc_link has been set when
7330 * vdev starts. Make sure the arvif/arsta pair have same setting
7331 */
7332 if (vif->type == NL80211_IFTYPE_STATION &&
7333 !arsta->arvif->is_sta_assoc_link) {
7334 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n",
7335 link_id);
7336 ret = -EINVAL;
7337 goto exit;
7338 }
7339
7340 arsta->is_assoc_link = true;
7341 ahsta->assoc_link_id = link_id;
7342 }
7343 }
7344
7345 /* In the ML station scenario, activate all partner links once the
7346 * client is transitioning to the associated state.
7347 *
7348 * FIXME: Ideally, this activation should occur when the client
7349 * transitions to the authorized state. However, there are some
7350 * issues with handling this in the firmware. Until the firmware
7351 * can manage it properly, activate the links when the client is
7352 * about to move to the associated state.
7353 */
7354 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7355 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) {
7356 /* TODO: for now only do link selection for single device
7357 * MLO case. Other cases would be handled in the future.
7358 */
7359 ab = ah->radio[0].ab;
7360 if (ab->ag->num_devices == 1) {
7361 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links);
7362 if (ret) {
7363 ath12k_warn(ab,
7364 "failed to get selected links: %d\n", ret);
7365 goto exit;
7366 }
7367 } else {
7368 selected_links = ieee80211_vif_usable_links(vif);
7369 }
7370
7371 ieee80211_set_active_links(vif, selected_links);
7372 }
7373
7374 /* Handle all the other state transitions in generic way */
7375 valid_links = ahsta->links_map;
7376 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7377 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7378 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7379 /* some assumptions went wrong! */
7380 if (WARN_ON(!arvif || !arsta))
7381 continue;
7382
7383 /* vdev might be in deleted */
7384 if (WARN_ON(!arvif->ar))
7385 continue;
7386
7387 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta,
7388 old_state, new_state);
7389 if (ret) {
7390 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d",
7391 link_id, arsta->addr, old_state, new_state);
7392 goto exit;
7393 }
7394 }
7395
7396 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7397 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) {
7398 for_each_ar(ah, ar, i) {
7399 ab = ar->ab;
7400 if (prev_ab == ab)
7401 continue;
7402
7403 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif);
7404 if (ret) {
7405 ath12k_warn(ab,
7406 "failed to update link active state on connect %d\n",
7407 ret);
7408 goto exit;
7409 }
7410
7411 prev_ab = ab;
7412 }
7413 }
7414 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST:
7415 * Remove the station from driver (handle ML sta here since that
7416 * needs special handling. Normal sta will be handled in generic
7417 * handler below
7418 */
7419 if (old_state == IEEE80211_STA_NONE &&
7420 new_state == IEEE80211_STA_NOTEXIST && sta->mlo)
7421 ath12k_mac_ml_station_remove(ahvif, ahsta);
7422
7423 ret = 0;
7424
7425 exit:
7426 /* update the state if everything went well */
7427 if (!ret)
7428 ahsta->state = new_state;
7429
7430 return ret;
7431 }
7432
ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)7433 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
7434 struct ieee80211_vif *vif,
7435 struct ieee80211_sta *sta)
7436 {
7437 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7438 struct ath12k *ar;
7439 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7440 struct ath12k_link_vif *arvif;
7441 struct ath12k_link_sta *arsta;
7442 u8 link_id;
7443 int ret;
7444 s16 txpwr;
7445
7446 lockdep_assert_wiphy(hw->wiphy);
7447
7448 /* TODO: use link id from mac80211 once that's implemented */
7449 link_id = 0;
7450
7451 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7452 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7453
7454 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
7455 txpwr = 0;
7456 } else {
7457 txpwr = sta->deflink.txpwr.power;
7458 if (!txpwr) {
7459 ret = -EINVAL;
7460 goto out;
7461 }
7462 }
7463
7464 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) {
7465 ret = -EINVAL;
7466 goto out;
7467 }
7468
7469 ar = arvif->ar;
7470
7471 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
7472 WMI_PEER_USE_FIXED_PWR, txpwr);
7473 if (ret) {
7474 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
7475 ret);
7476 goto out;
7477 }
7478
7479 out:
7480 return ret;
7481 }
7482
ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,u32 changed)7483 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
7484 struct ieee80211_vif *vif,
7485 struct ieee80211_link_sta *link_sta,
7486 u32 changed)
7487 {
7488 struct ieee80211_sta *sta = link_sta->sta;
7489 struct ath12k *ar;
7490 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7491 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7492 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7493 struct ath12k_link_sta *arsta;
7494 struct ath12k_link_vif *arvif;
7495 struct ath12k_peer *peer;
7496 u32 bw, smps;
7497
7498 rcu_read_lock();
7499 arvif = rcu_dereference(ahvif->link[link_sta->link_id]);
7500 if (!arvif) {
7501 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n",
7502 link_sta->link_id, sta->addr);
7503 rcu_read_unlock();
7504 return;
7505 }
7506
7507 ar = arvif->ar;
7508
7509 arsta = rcu_dereference(ahsta->link[link_sta->link_id]);
7510 if (!arsta) {
7511 rcu_read_unlock();
7512 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n",
7513 link_sta->link_id, sta->addr);
7514 return;
7515 }
7516 spin_lock_bh(&ar->ab->base_lock);
7517
7518 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
7519 if (!peer) {
7520 spin_unlock_bh(&ar->ab->base_lock);
7521 rcu_read_unlock();
7522 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
7523 arsta->addr, arvif->vdev_id);
7524 return;
7525 }
7526
7527 spin_unlock_bh(&ar->ab->base_lock);
7528
7529 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
7530 rcu_read_unlock();
7531 return;
7532 }
7533
7534 link_sta = rcu_dereference(sta->link[arsta->link_id]);
7535 if (!link_sta) {
7536 rcu_read_unlock();
7537 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n",
7538 sta->addr, arsta->link_id);
7539 return;
7540 }
7541
7542 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7543 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7544 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss,
7545 link_sta->smps_mode);
7546
7547 spin_lock_bh(&ar->data_lock);
7548
7549 if (changed & IEEE80211_RC_BW_CHANGED) {
7550 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
7551 arsta->bw_prev = arsta->bw;
7552 arsta->bw = bw;
7553 }
7554
7555 if (changed & IEEE80211_RC_NSS_CHANGED)
7556 arsta->nss = link_sta->rx_nss;
7557
7558 if (changed & IEEE80211_RC_SMPS_CHANGED) {
7559 smps = WMI_PEER_SMPS_PS_NONE;
7560
7561 switch (link_sta->smps_mode) {
7562 case IEEE80211_SMPS_AUTOMATIC:
7563 case IEEE80211_SMPS_OFF:
7564 smps = WMI_PEER_SMPS_PS_NONE;
7565 break;
7566 case IEEE80211_SMPS_STATIC:
7567 smps = WMI_PEER_SMPS_STATIC;
7568 break;
7569 case IEEE80211_SMPS_DYNAMIC:
7570 smps = WMI_PEER_SMPS_DYNAMIC;
7571 break;
7572 default:
7573 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n",
7574 link_sta->smps_mode, arsta->addr, link_sta->link_id);
7575 smps = WMI_PEER_SMPS_PS_NONE;
7576 break;
7577 }
7578
7579 arsta->smps = smps;
7580 }
7581
7582 arsta->changed |= changed;
7583
7584 spin_unlock_bh(&ar->data_lock);
7585
7586 wiphy_work_queue(hw->wiphy, &arsta->update_wk);
7587
7588 rcu_read_unlock();
7589 }
7590
ath12k_mac_alloc_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_vif * ahvif,u8 link_id)7591 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah,
7592 struct ath12k_sta *ahsta,
7593 struct ath12k_vif *ahvif,
7594 u8 link_id)
7595 {
7596 struct ath12k_link_sta *arsta;
7597 int ret;
7598
7599 lockdep_assert_wiphy(ah->hw->wiphy);
7600
7601 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7602 return NULL;
7603
7604 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
7605 if (arsta)
7606 return NULL;
7607
7608 arsta = kmalloc(sizeof(*arsta), GFP_KERNEL);
7609 if (!arsta)
7610 return NULL;
7611
7612 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id);
7613 if (ret) {
7614 kfree(arsta);
7615 return NULL;
7616 }
7617
7618 return arsta;
7619 }
7620
ath12k_mac_op_change_sta_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u16 old_links,u16 new_links)7621 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,
7622 struct ieee80211_vif *vif,
7623 struct ieee80211_sta *sta,
7624 u16 old_links, u16 new_links)
7625 {
7626 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7627 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7628 struct ath12k_hw *ah = hw->priv;
7629 struct ath12k_link_vif *arvif;
7630 struct ath12k_link_sta *arsta;
7631 unsigned long valid_links;
7632 struct ath12k *ar;
7633 u8 link_id;
7634 int ret;
7635
7636 lockdep_assert_wiphy(hw->wiphy);
7637
7638 if (!sta->valid_links)
7639 return -EINVAL;
7640
7641 /* Firmware does not support removal of one of link stas. All sta
7642 * would be removed during ML STA delete in sta_state(), hence link
7643 * sta removal is not handled here.
7644 */
7645 if (new_links < old_links)
7646 return 0;
7647
7648 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) {
7649 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr);
7650 return -EINVAL;
7651 }
7652
7653 /* this op is expected only after initial sta insertion with default link */
7654 if (WARN_ON(ahsta->links_map == 0))
7655 return -EINVAL;
7656
7657 valid_links = new_links;
7658 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7659 if (ahsta->links_map & BIT(link_id))
7660 continue;
7661
7662 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7663 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id);
7664
7665 if (!arvif || !arsta) {
7666 ath12k_hw_warn(ah, "Failed to alloc/assign link sta");
7667 continue;
7668 }
7669
7670 ar = arvif->ar;
7671 if (!ar)
7672 continue;
7673
7674 ret = ath12k_mac_station_add(ar, arvif, arsta);
7675 if (ret) {
7676 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
7677 arsta->addr, arvif->vdev_id);
7678 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
7679 return ret;
7680 }
7681 }
7682
7683 return 0;
7684 }
7685
ath12k_mac_op_can_activate_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 active_links)7686 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw,
7687 struct ieee80211_vif *vif,
7688 u16 active_links)
7689 {
7690 /* TODO: Handle recovery case */
7691
7692 return true;
7693 }
7694
ath12k_conf_tx_uapsd(struct ath12k_link_vif * arvif,u16 ac,bool enable)7695 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif,
7696 u16 ac, bool enable)
7697 {
7698 struct ath12k *ar = arvif->ar;
7699 struct ath12k_vif *ahvif = arvif->ahvif;
7700 u32 value;
7701 int ret;
7702
7703 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
7704 return 0;
7705
7706 switch (ac) {
7707 case IEEE80211_AC_VO:
7708 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7709 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7710 break;
7711 case IEEE80211_AC_VI:
7712 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7713 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7714 break;
7715 case IEEE80211_AC_BE:
7716 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7717 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7718 break;
7719 case IEEE80211_AC_BK:
7720 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7721 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7722 break;
7723 }
7724
7725 if (enable)
7726 ahvif->u.sta.uapsd |= value;
7727 else
7728 ahvif->u.sta.uapsd &= ~value;
7729
7730 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7731 WMI_STA_PS_PARAM_UAPSD,
7732 ahvif->u.sta.uapsd);
7733 if (ret) {
7734 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
7735 goto exit;
7736 }
7737
7738 if (ahvif->u.sta.uapsd)
7739 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7740 else
7741 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7742
7743 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7744 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7745 value);
7746 if (ret)
7747 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
7748
7749 exit:
7750 return ret;
7751 }
7752
ath12k_mac_conf_tx(struct ath12k_link_vif * arvif,u16 ac,const struct ieee80211_tx_queue_params * params)7753 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac,
7754 const struct ieee80211_tx_queue_params *params)
7755 {
7756 struct wmi_wmm_params_arg *p = NULL;
7757 struct ath12k *ar = arvif->ar;
7758 struct ath12k_base *ab = ar->ab;
7759 int ret;
7760
7761 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
7762
7763 switch (ac) {
7764 case IEEE80211_AC_VO:
7765 p = &arvif->wmm_params.ac_vo;
7766 break;
7767 case IEEE80211_AC_VI:
7768 p = &arvif->wmm_params.ac_vi;
7769 break;
7770 case IEEE80211_AC_BE:
7771 p = &arvif->wmm_params.ac_be;
7772 break;
7773 case IEEE80211_AC_BK:
7774 p = &arvif->wmm_params.ac_bk;
7775 break;
7776 }
7777
7778 if (WARN_ON(!p)) {
7779 ret = -EINVAL;
7780 goto exit;
7781 }
7782
7783 p->cwmin = params->cw_min;
7784 p->cwmax = params->cw_max;
7785 p->aifs = params->aifs;
7786 p->txop = params->txop;
7787
7788 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
7789 &arvif->wmm_params);
7790 if (ret) {
7791 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
7792 ar->pdev_idx, ret);
7793 goto exit;
7794 }
7795
7796 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
7797 if (ret)
7798 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
7799 ar->pdev_idx, ret);
7800
7801 exit:
7802 return ret;
7803 }
7804
ath12k_mac_op_conf_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,u16 ac,const struct ieee80211_tx_queue_params * params)7805 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
7806 struct ieee80211_vif *vif,
7807 unsigned int link_id, u16 ac,
7808 const struct ieee80211_tx_queue_params *params)
7809 {
7810 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7811 struct ath12k_link_vif *arvif;
7812 struct ath12k_vif_cache *cache;
7813 int ret;
7814
7815 lockdep_assert_wiphy(hw->wiphy);
7816
7817 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7818 return -EINVAL;
7819
7820 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7821 if (!arvif || !arvif->is_created) {
7822 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
7823 if (!cache)
7824 return -ENOSPC;
7825
7826 cache->tx_conf.changed = true;
7827 cache->tx_conf.ac = ac;
7828 cache->tx_conf.tx_queue_params = *params;
7829
7830 return 0;
7831 }
7832
7833 ret = ath12k_mac_conf_tx(arvif, ac, params);
7834
7835 return ret;
7836 }
7837
7838 static struct ieee80211_sta_ht_cap
ath12k_create_ht_cap(struct ath12k * ar,u32 ar_ht_cap,u32 rate_cap_rx_chainmask)7839 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
7840 {
7841 int i;
7842 struct ieee80211_sta_ht_cap ht_cap = {};
7843 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
7844
7845 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
7846 return ht_cap;
7847
7848 ht_cap.ht_supported = 1;
7849 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
7850 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
7851 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7852 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
7853 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
7854
7855 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
7856 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
7857
7858 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
7859 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
7860
7861 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
7862 u32 smps;
7863
7864 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
7865 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
7866
7867 ht_cap.cap |= smps;
7868 }
7869
7870 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
7871 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
7872
7873 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
7874 u32 stbc;
7875
7876 stbc = ar_ht_cap;
7877 stbc &= WMI_HT_CAP_RX_STBC;
7878 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
7879 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
7880 stbc &= IEEE80211_HT_CAP_RX_STBC;
7881
7882 ht_cap.cap |= stbc;
7883 }
7884
7885 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
7886 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
7887
7888 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
7889 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
7890
7891 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
7892 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
7893
7894 for (i = 0; i < ar->num_rx_chains; i++) {
7895 if (rate_cap_rx_chainmask & BIT(i))
7896 ht_cap.mcs.rx_mask[i] = 0xFF;
7897 }
7898
7899 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
7900
7901 return ht_cap;
7902 }
7903
ath12k_mac_set_txbf_conf(struct ath12k_link_vif * arvif)7904 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif)
7905 {
7906 u32 value = 0;
7907 struct ath12k *ar = arvif->ar;
7908 struct ath12k_vif *ahvif = arvif->ahvif;
7909 int nsts;
7910 int sound_dim;
7911 u32 vht_cap = ar->pdev->cap.vht_cap;
7912 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
7913
7914 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
7915 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
7916 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
7917 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
7918 }
7919
7920 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
7921 sound_dim = vht_cap &
7922 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
7923 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
7924 if (sound_dim > (ar->num_tx_chains - 1))
7925 sound_dim = ar->num_tx_chains - 1;
7926 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
7927 }
7928
7929 if (!value)
7930 return 0;
7931
7932 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
7933 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
7934
7935 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
7936 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
7937 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
7938 }
7939
7940 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
7941 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
7942
7943 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
7944 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
7945 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
7946 }
7947
7948 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7949 vdev_param, value);
7950 }
7951
ath12k_set_vht_txbf_cap(struct ath12k * ar,u32 * vht_cap)7952 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
7953 {
7954 bool subfer, subfee;
7955 int sound_dim = 0;
7956
7957 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
7958 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
7959
7960 if (ar->num_tx_chains < 2) {
7961 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
7962 subfer = false;
7963 }
7964
7965 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
7966 if (!subfer)
7967 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
7968
7969 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
7970 if (!subfee)
7971 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
7972
7973 sound_dim = u32_get_bits(*vht_cap,
7974 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7975 *vht_cap = u32_replace_bits(*vht_cap, 0,
7976 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7977
7978 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
7979
7980 /* Enable Sounding Dimension Field only if SU BF is enabled */
7981 if (subfer) {
7982 if (sound_dim > (ar->num_tx_chains - 1))
7983 sound_dim = ar->num_tx_chains - 1;
7984
7985 *vht_cap = u32_replace_bits(*vht_cap, sound_dim,
7986 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7987 }
7988
7989 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
7990 if (!subfee)
7991 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
7992 }
7993
7994 static struct ieee80211_sta_vht_cap
ath12k_create_vht_cap(struct ath12k * ar,u32 rate_cap_tx_chainmask,u32 rate_cap_rx_chainmask)7995 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
7996 u32 rate_cap_rx_chainmask)
7997 {
7998 struct ieee80211_sta_vht_cap vht_cap = {};
7999 u16 txmcs_map, rxmcs_map;
8000 int i;
8001
8002 vht_cap.vht_supported = 1;
8003 vht_cap.cap = ar->pdev->cap.vht_cap;
8004
8005 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
8006
8007 /* 80P80 is not supported */
8008 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
8009
8010 rxmcs_map = 0;
8011 txmcs_map = 0;
8012 for (i = 0; i < 8; i++) {
8013 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
8014 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
8015 else
8016 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
8017
8018 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
8019 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
8020 else
8021 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
8022 }
8023
8024 if (rate_cap_tx_chainmask <= 1)
8025 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
8026
8027 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
8028 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
8029
8030 /* Check if the HW supports 1:1 NSS ratio and reset
8031 * EXT NSS BW Support field to 0 to indicate 1:1 ratio
8032 */
8033 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS)
8034 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK;
8035
8036 return vht_cap;
8037 }
8038
ath12k_mac_setup_ht_vht_cap(struct ath12k * ar,struct ath12k_pdev_cap * cap,u32 * ht_cap_info)8039 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
8040 struct ath12k_pdev_cap *cap,
8041 u32 *ht_cap_info)
8042 {
8043 struct ieee80211_supported_band *band;
8044 u32 rate_cap_tx_chainmask;
8045 u32 rate_cap_rx_chainmask;
8046 u32 ht_cap;
8047
8048 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
8049 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
8050
8051 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
8052 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
8053 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
8054 if (ht_cap_info)
8055 *ht_cap_info = ht_cap;
8056 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
8057 rate_cap_rx_chainmask);
8058 }
8059
8060 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
8061 (ar->ab->hw_params->single_pdev_only ||
8062 !ar->supports_6ghz)) {
8063 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
8064 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
8065 if (ht_cap_info)
8066 *ht_cap_info = ht_cap;
8067 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
8068 rate_cap_rx_chainmask);
8069 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
8070 rate_cap_rx_chainmask);
8071 }
8072 }
8073
ath12k_check_chain_mask(struct ath12k * ar,u32 ant,bool is_tx_ant)8074 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
8075 {
8076 /* TODO: Check the request chainmask against the supported
8077 * chainmask table which is advertised in extented_service_ready event
8078 */
8079
8080 return 0;
8081 }
8082
ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,u8 * he_ppet)8083 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
8084 u8 *he_ppet)
8085 {
8086 int nss, ru;
8087 u8 bit = 7;
8088
8089 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
8090 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
8091 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
8092 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
8093 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
8094 for (ru = 0; ru < 4; ru++) {
8095 u8 val;
8096 int i;
8097
8098 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
8099 continue;
8100 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
8101 0x3f;
8102 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
8103 for (i = 5; i >= 0; i--) {
8104 he_ppet[bit / 8] |=
8105 ((val >> i) & 0x1) << ((bit % 8));
8106 bit++;
8107 }
8108 }
8109 }
8110 }
8111
8112 static void
ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem * he_cap_elem)8113 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
8114 {
8115 u8 m;
8116
8117 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
8118 IEEE80211_HE_MAC_CAP0_TWT_REQ;
8119 he_cap_elem->mac_cap_info[0] &= ~m;
8120
8121 m = IEEE80211_HE_MAC_CAP2_TRS |
8122 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
8123 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
8124 he_cap_elem->mac_cap_info[2] &= ~m;
8125
8126 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
8127 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
8128 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
8129 he_cap_elem->mac_cap_info[3] &= ~m;
8130
8131 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
8132 IEEE80211_HE_MAC_CAP4_BQR;
8133 he_cap_elem->mac_cap_info[4] &= ~m;
8134
8135 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
8136 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
8137 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
8138 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
8139 he_cap_elem->mac_cap_info[5] &= ~m;
8140
8141 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
8142 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
8143 he_cap_elem->phy_cap_info[2] &= ~m;
8144
8145 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
8146 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
8147 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
8148 he_cap_elem->phy_cap_info[3] &= ~m;
8149
8150 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
8151 he_cap_elem->phy_cap_info[4] &= ~m;
8152
8153 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
8154 he_cap_elem->phy_cap_info[5] &= ~m;
8155
8156 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
8157 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
8158 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
8159 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
8160 he_cap_elem->phy_cap_info[6] &= ~m;
8161
8162 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
8163 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
8164 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
8165 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
8166 he_cap_elem->phy_cap_info[7] &= ~m;
8167
8168 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
8169 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
8170 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
8171 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
8172 he_cap_elem->phy_cap_info[8] &= ~m;
8173
8174 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
8175 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
8176 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
8177 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
8178 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
8179 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
8180 he_cap_elem->phy_cap_info[9] &= ~m;
8181 }
8182
ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap * pcap,struct ath12k_band_cap * bcap)8183 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
8184 struct ath12k_band_cap *bcap)
8185 {
8186 u8 val;
8187
8188 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
8189 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
8190 bcap->he_6ghz_capa |=
8191 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
8192 IEEE80211_HE_6GHZ_CAP_SM_PS);
8193 else
8194 bcap->he_6ghz_capa |=
8195 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
8196 IEEE80211_HE_6GHZ_CAP_SM_PS);
8197 val = u32_get_bits(pcap->vht_cap,
8198 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
8199 bcap->he_6ghz_capa |=
8200 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
8201 val = u32_get_bits(pcap->vht_cap,
8202 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
8203 bcap->he_6ghz_capa |=
8204 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
8205 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
8206 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
8207 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
8208 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
8209
8210 return cpu_to_le16(bcap->he_6ghz_capa);
8211 }
8212
ath12k_mac_set_hemcsmap(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sta_he_cap * he_cap)8213 static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
8214 struct ath12k_pdev_cap *cap,
8215 struct ieee80211_sta_he_cap *he_cap)
8216 {
8217 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
8218 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
8219 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains);
8220 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0;
8221 u16 txmcs_map = 0, rxmcs_map = 0;
8222 u32 i;
8223
8224 for (i = 0; i < 8; i++) {
8225 if (i < ar->num_tx_chains &&
8226 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
8227 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
8228 else
8229 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
8230
8231 if (i < ar->num_rx_chains &&
8232 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
8233 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
8234 else
8235 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
8236
8237 if (i < maxtxnss_160 &&
8238 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
8239 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
8240 else
8241 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
8242
8243 if (i < maxrxnss_160 &&
8244 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
8245 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
8246 else
8247 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
8248 }
8249
8250 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
8251 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
8252 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff);
8253 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff);
8254 }
8255
ath12k_mac_copy_he_cap(struct ath12k * ar,struct ath12k_band_cap * band_cap,int iftype,u8 num_tx_chains,struct ieee80211_sta_he_cap * he_cap)8256 static void ath12k_mac_copy_he_cap(struct ath12k *ar,
8257 struct ath12k_band_cap *band_cap,
8258 int iftype, u8 num_tx_chains,
8259 struct ieee80211_sta_he_cap *he_cap)
8260 {
8261 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
8262
8263 he_cap->has_he = true;
8264 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
8265 sizeof(he_cap_elem->mac_cap_info));
8266 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
8267 sizeof(he_cap_elem->phy_cap_info));
8268
8269 he_cap_elem->mac_cap_info[1] &=
8270 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
8271 he_cap_elem->phy_cap_info[0] &=
8272 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8273 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
8274 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
8275 /* 80PLUS80 is not supported */
8276 he_cap_elem->phy_cap_info[0] &=
8277 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
8278 he_cap_elem->phy_cap_info[5] &=
8279 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
8280 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
8281
8282 switch (iftype) {
8283 case NL80211_IFTYPE_AP:
8284 he_cap_elem->mac_cap_info[2] &=
8285 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT;
8286 he_cap_elem->phy_cap_info[3] &=
8287 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
8288 he_cap_elem->phy_cap_info[9] |=
8289 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
8290 break;
8291 case NL80211_IFTYPE_STATION:
8292 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
8293 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
8294 he_cap_elem->phy_cap_info[9] |=
8295 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
8296 break;
8297 case NL80211_IFTYPE_MESH_POINT:
8298 ath12k_mac_filter_he_cap_mesh(he_cap_elem);
8299 break;
8300 }
8301
8302 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
8303 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
8304 if (he_cap_elem->phy_cap_info[6] &
8305 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
8306 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
8307 }
8308
8309 static void
ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap * band_cap,struct ieee80211_eht_mcs_nss_supp * mcs_nss,const struct ieee80211_he_cap_elem * he_cap,const struct ieee80211_eht_cap_elem_fixed * eht_cap)8310 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
8311 struct ieee80211_eht_mcs_nss_supp *mcs_nss,
8312 const struct ieee80211_he_cap_elem *he_cap,
8313 const struct ieee80211_eht_cap_elem_fixed *eht_cap)
8314 {
8315 if ((he_cap->phy_cap_info[0] &
8316 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8317 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
8318 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
8319 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
8320 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
8321 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
8322
8323 if (he_cap->phy_cap_info[0] &
8324 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8325 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
8326 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
8327 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8328
8329 if (he_cap->phy_cap_info[0] &
8330 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8331 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
8332 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8333
8334 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
8335 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
8336 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8337 }
8338
ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,struct ieee80211_sta_eht_cap * cap)8339 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
8340 struct ieee80211_sta_eht_cap *cap)
8341 {
8342 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
8343 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
8344
8345 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
8346 IEEE80211_EHT_PPE_THRES_NSS_MASK);
8347
8348 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
8349 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8350
8351 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
8352 for (ru = 0;
8353 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8354 ru++) {
8355 u32 val = 0;
8356
8357 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
8358 continue;
8359
8360 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
8361 (ru * ppet_bit_len_per_ru),
8362 GENMASK(ppet_bit_len_per_ru - 1, 0));
8363
8364 for (i = 0; i < ppet_bit_len_per_ru; i++) {
8365 cap->eht_ppe_thres[bit / 8] |=
8366 (((val >> i) & 0x1) << ((bit % 8)));
8367 bit++;
8368 }
8369 }
8370 }
8371 }
8372
8373 static void
ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed * eht_cap_elem)8374 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
8375 *eht_cap_elem)
8376 {
8377 u8 m;
8378
8379 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
8380 eht_cap_elem->mac_cap_info[0] &= ~m;
8381
8382 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
8383 eht_cap_elem->phy_cap_info[0] &= ~m;
8384
8385 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
8386 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
8387 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
8388 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
8389 eht_cap_elem->phy_cap_info[3] &= ~m;
8390
8391 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
8392 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
8393 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
8394 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
8395 eht_cap_elem->phy_cap_info[4] &= ~m;
8396
8397 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
8398 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
8399 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
8400 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
8401 eht_cap_elem->phy_cap_info[5] &= ~m;
8402
8403 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
8404 eht_cap_elem->phy_cap_info[6] &= ~m;
8405
8406 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8407 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8408 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
8409 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8410 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8411 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
8412 eht_cap_elem->phy_cap_info[7] &= ~m;
8413 }
8414
ath12k_mac_copy_eht_cap(struct ath12k * ar,struct ath12k_band_cap * band_cap,struct ieee80211_he_cap_elem * he_cap_elem,int iftype,struct ieee80211_sta_eht_cap * eht_cap)8415 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
8416 struct ath12k_band_cap *band_cap,
8417 struct ieee80211_he_cap_elem *he_cap_elem,
8418 int iftype,
8419 struct ieee80211_sta_eht_cap *eht_cap)
8420 {
8421 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
8422
8423 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
8424
8425 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) ||
8426 ath12k_acpi_get_disable_11be(ar->ab))
8427 return;
8428
8429 eht_cap->has_eht = true;
8430 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
8431 sizeof(eht_cap_elem->mac_cap_info));
8432 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
8433 sizeof(eht_cap_elem->phy_cap_info));
8434
8435 switch (iftype) {
8436 case NL80211_IFTYPE_AP:
8437 eht_cap_elem->phy_cap_info[0] &=
8438 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
8439 eht_cap_elem->phy_cap_info[4] &=
8440 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
8441 eht_cap_elem->phy_cap_info[5] &=
8442 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
8443 break;
8444 case NL80211_IFTYPE_STATION:
8445 eht_cap_elem->phy_cap_info[7] &=
8446 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8447 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8448 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
8449 eht_cap_elem->phy_cap_info[7] &=
8450 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8451 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8452 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
8453 break;
8454 case NL80211_IFTYPE_MESH_POINT:
8455 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
8456 break;
8457 default:
8458 break;
8459 }
8460
8461 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
8462 he_cap_elem, eht_cap_elem);
8463
8464 if (eht_cap_elem->phy_cap_info[5] &
8465 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
8466 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
8467 }
8468
ath12k_mac_copy_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sband_iftype_data * data,int band)8469 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
8470 struct ath12k_pdev_cap *cap,
8471 struct ieee80211_sband_iftype_data *data,
8472 int band)
8473 {
8474 struct ath12k_band_cap *band_cap = &cap->band[band];
8475 int i, idx = 0;
8476
8477 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
8478 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
8479
8480 switch (i) {
8481 case NL80211_IFTYPE_STATION:
8482 case NL80211_IFTYPE_AP:
8483 case NL80211_IFTYPE_MESH_POINT:
8484 break;
8485
8486 default:
8487 continue;
8488 }
8489
8490 data[idx].types_mask = BIT(i);
8491
8492 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
8493 if (band == NL80211_BAND_6GHZ) {
8494 data[idx].he_6ghz_capa.capa =
8495 ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
8496 }
8497 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
8498 &data[idx].eht_cap);
8499 idx++;
8500 }
8501
8502 return idx;
8503 }
8504
ath12k_mac_setup_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap)8505 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
8506 struct ath12k_pdev_cap *cap)
8507 {
8508 struct ieee80211_supported_band *sband;
8509 enum nl80211_band band;
8510 int count;
8511
8512 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
8513 band = NL80211_BAND_2GHZ;
8514 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8515 ar->mac.iftype[band],
8516 band);
8517 sband = &ar->mac.sbands[band];
8518 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8519 count);
8520 }
8521
8522 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
8523 band = NL80211_BAND_5GHZ;
8524 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8525 ar->mac.iftype[band],
8526 band);
8527 sband = &ar->mac.sbands[band];
8528 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8529 count);
8530 }
8531
8532 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
8533 ar->supports_6ghz) {
8534 band = NL80211_BAND_6GHZ;
8535 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8536 ar->mac.iftype[band],
8537 band);
8538 sband = &ar->mac.sbands[band];
8539 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8540 count);
8541 }
8542 }
8543
__ath12k_set_antenna(struct ath12k * ar,u32 tx_ant,u32 rx_ant)8544 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
8545 {
8546 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
8547 int ret;
8548
8549 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8550
8551 if (ath12k_check_chain_mask(ar, tx_ant, true))
8552 return -EINVAL;
8553
8554 if (ath12k_check_chain_mask(ar, rx_ant, false))
8555 return -EINVAL;
8556
8557 /* Since we advertised the max cap of all radios combined during wiphy
8558 * registration, ensure we don't set the antenna config higher than the
8559 * limits
8560 */
8561 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask);
8562 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask);
8563
8564 ar->cfg_tx_chainmask = tx_ant;
8565 ar->cfg_rx_chainmask = rx_ant;
8566
8567 if (ah->state != ATH12K_HW_STATE_ON &&
8568 ah->state != ATH12K_HW_STATE_RESTARTED)
8569 return 0;
8570
8571 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
8572 tx_ant, ar->pdev->pdev_id);
8573 if (ret) {
8574 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
8575 ret, tx_ant);
8576 return ret;
8577 }
8578
8579 ar->num_tx_chains = hweight32(tx_ant);
8580
8581 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
8582 rx_ant, ar->pdev->pdev_id);
8583 if (ret) {
8584 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
8585 ret, rx_ant);
8586 return ret;
8587 }
8588
8589 ar->num_rx_chains = hweight32(rx_ant);
8590
8591 /* Reload HT/VHT/HE capability */
8592 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
8593 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
8594
8595 return 0;
8596 }
8597
ath12k_mgmt_over_wmi_tx_drop(struct ath12k * ar,struct sk_buff * skb)8598 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
8599 {
8600 int num_mgmt;
8601
8602 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8603
8604 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
8605
8606 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
8607
8608 if (num_mgmt < 0)
8609 WARN_ON_ONCE(1);
8610
8611 if (!num_mgmt)
8612 wake_up(&ar->txmgmt_empty_waitq);
8613 }
8614
ath12k_mac_tx_mgmt_free(struct ath12k * ar,int buf_id)8615 static void ath12k_mac_tx_mgmt_free(struct ath12k *ar, int buf_id)
8616 {
8617 struct sk_buff *msdu;
8618 struct ieee80211_tx_info *info;
8619
8620 spin_lock_bh(&ar->txmgmt_idr_lock);
8621 msdu = idr_remove(&ar->txmgmt_idr, buf_id);
8622 spin_unlock_bh(&ar->txmgmt_idr_lock);
8623
8624 if (!msdu)
8625 return;
8626
8627 dma_unmap_single(ar->ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
8628 DMA_TO_DEVICE);
8629
8630 info = IEEE80211_SKB_CB(msdu);
8631 memset(&info->status, 0, sizeof(info->status));
8632
8633 ath12k_mgmt_over_wmi_tx_drop(ar, msdu);
8634 }
8635
ath12k_mac_tx_mgmt_pending_free(int buf_id,void * skb,void * ctx)8636 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
8637 {
8638 struct ath12k *ar = ctx;
8639
8640 ath12k_mac_tx_mgmt_free(ar, buf_id);
8641
8642 return 0;
8643 }
8644
ath12k_mac_vif_txmgmt_idr_remove(int buf_id,void * skb,void * ctx)8645 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
8646 {
8647 struct ieee80211_vif *vif = ctx;
8648 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8649 struct ath12k *ar = skb_cb->ar;
8650
8651 if (skb_cb->vif == vif)
8652 ath12k_mac_tx_mgmt_free(ar, buf_id);
8653
8654 return 0;
8655 }
8656
ath12k_mac_mgmt_tx_wmi(struct ath12k * ar,struct ath12k_link_vif * arvif,struct sk_buff * skb)8657 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif,
8658 struct sk_buff *skb)
8659 {
8660 struct ath12k_base *ab = ar->ab;
8661 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8662 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8663 struct ieee80211_tx_info *info;
8664 enum hal_encrypt_type enctype;
8665 unsigned int mic_len;
8666 dma_addr_t paddr;
8667 int buf_id;
8668 int ret;
8669
8670 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8671
8672 skb_cb->ar = ar;
8673 spin_lock_bh(&ar->txmgmt_idr_lock);
8674 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
8675 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
8676 spin_unlock_bh(&ar->txmgmt_idr_lock);
8677 if (buf_id < 0)
8678 return -ENOSPC;
8679
8680 info = IEEE80211_SKB_CB(skb);
8681 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8682 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
8683 if ((ieee80211_is_action(hdr->frame_control) ||
8684 ieee80211_is_deauth(hdr->frame_control) ||
8685 ieee80211_is_disassoc(hdr->frame_control)) &&
8686 ieee80211_has_protected(hdr->frame_control)) {
8687 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
8688 mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype);
8689 skb_put(skb, mic_len);
8690 }
8691 }
8692
8693 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
8694 if (dma_mapping_error(ab->dev, paddr)) {
8695 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
8696 ret = -EIO;
8697 goto err_free_idr;
8698 }
8699
8700 skb_cb->paddr = paddr;
8701
8702 ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb);
8703 if (ret) {
8704 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
8705 goto err_unmap_buf;
8706 }
8707
8708 return 0;
8709
8710 err_unmap_buf:
8711 dma_unmap_single(ab->dev, skb_cb->paddr,
8712 skb->len, DMA_TO_DEVICE);
8713 err_free_idr:
8714 spin_lock_bh(&ar->txmgmt_idr_lock);
8715 idr_remove(&ar->txmgmt_idr, buf_id);
8716 spin_unlock_bh(&ar->txmgmt_idr_lock);
8717
8718 return ret;
8719 }
8720
ath12k_mgmt_over_wmi_tx_purge(struct ath12k * ar)8721 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
8722 {
8723 struct sk_buff *skb;
8724
8725 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
8726 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8727 }
8728
ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8729 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8730 struct sk_buff *skb)
8731 {
8732 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8733 u8 category, *buf, iv_len, action_code, dialog_token;
8734 struct ieee80211_bss_conf *link_conf;
8735 struct ieee80211_chanctx_conf *conf;
8736 int cur_tx_power, max_tx_power;
8737 struct ath12k *ar = arvif->ar;
8738 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
8739 struct wiphy *wiphy = hw->wiphy;
8740 struct ath12k_skb_cb *skb_cb;
8741 struct ieee80211_mgmt *mgmt;
8742 unsigned int remaining_len;
8743 bool has_protected;
8744
8745 lockdep_assert_wiphy(wiphy);
8746
8747 /* make sure category field is present */
8748 if (skb->len < IEEE80211_MIN_ACTION_SIZE)
8749 return -EINVAL;
8750
8751 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE;
8752 has_protected = ieee80211_has_protected(hdr->frame_control);
8753
8754 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted,
8755 * we can't put in data in this case
8756 */
8757 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8758 has_protected)
8759 return 0;
8760
8761 mgmt = (struct ieee80211_mgmt *)hdr;
8762 buf = (u8 *)&mgmt->u.action;
8763
8764 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that
8765 * many bytes if it is there
8766 */
8767 if (has_protected) {
8768 skb_cb = ATH12K_SKB_CB(skb);
8769
8770 switch (skb_cb->cipher) {
8771 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in
8772 * key needs to be processed. See ath12k_install_key()
8773 */
8774 case WLAN_CIPHER_SUITE_CCMP:
8775 case WLAN_CIPHER_SUITE_CCMP_256:
8776 case WLAN_CIPHER_SUITE_GCMP:
8777 case WLAN_CIPHER_SUITE_GCMP_256:
8778 iv_len = IEEE80211_CCMP_HDR_LEN;
8779 break;
8780 case WLAN_CIPHER_SUITE_TKIP:
8781 iv_len = 0;
8782 break;
8783 default:
8784 return -EINVAL;
8785 }
8786
8787 if (remaining_len < iv_len)
8788 return -EINVAL;
8789
8790 buf += iv_len;
8791 remaining_len -= iv_len;
8792 }
8793
8794 category = *buf++;
8795 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence
8796 * no need to adjust remaining_len
8797 */
8798
8799 switch (category) {
8800 case WLAN_CATEGORY_RADIO_MEASUREMENT:
8801 /* need action code and dialog token */
8802 if (remaining_len < 2)
8803 return -EINVAL;
8804
8805 /* Packet Format:
8806 * Action Code | Dialog Token | Variable Len (based on Action Code)
8807 */
8808 action_code = *buf++;
8809 dialog_token = *buf++;
8810 remaining_len -= 2;
8811
8812 link_conf = ath12k_mac_get_link_bss_conf(arvif);
8813 if (!link_conf) {
8814 ath12k_warn(ar->ab,
8815 "failed to get bss link conf for vdev %d in RM handling\n",
8816 arvif->vdev_id);
8817 return -EINVAL;
8818 }
8819
8820 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf);
8821 if (!conf)
8822 return -ENOENT;
8823
8824 cur_tx_power = link_conf->txpower;
8825 max_tx_power = min(conf->def.chan->max_reg_power,
8826 (int)ar->max_tx_power / 2);
8827
8828 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id,
8829 &cur_tx_power);
8830
8831 switch (action_code) {
8832 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST:
8833 /* need variable fields to be present in len */
8834 if (remaining_len < 2)
8835 return -EINVAL;
8836
8837 /* Variable length format as defined in IEEE 802.11-2024,
8838 * Figure 9-1187-Link Measurement Request frame Action field
8839 * format.
8840 * Transmit Power | Max Tx Power
8841 * We fill both of these.
8842 */
8843 *buf++ = cur_tx_power;
8844 *buf = max_tx_power;
8845
8846 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8847 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n",
8848 dialog_token, cur_tx_power, max_tx_power);
8849 break;
8850 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT:
8851 /* need variable fields to be present in len */
8852 if (remaining_len < 3)
8853 return -EINVAL;
8854
8855 /* Variable length format as defined in IEEE 802.11-2024,
8856 * Figure 9-1188-Link Measurement Report frame Action field format
8857 * TPC Report | Variable Fields
8858 *
8859 * TPC Report Format:
8860 * Element ID | Len | Tx Power | Link Margin
8861 *
8862 * We fill Tx power in the TPC Report (2nd index)
8863 */
8864 buf[2] = cur_tx_power;
8865
8866 /* TODO: At present, Link margin data is not present so can't
8867 * really fill it now. Once it is available, it can be added
8868 * here
8869 */
8870 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8871 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n",
8872 dialog_token, cur_tx_power);
8873 break;
8874 default:
8875 return -EINVAL;
8876 }
8877 break;
8878 default:
8879 /* nothing to fill */
8880 return 0;
8881 }
8882
8883 return 0;
8884 }
8885
ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8886 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8887 struct sk_buff *skb)
8888 {
8889 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8890
8891 if (!ieee80211_is_action(hdr->frame_control))
8892 return 0;
8893
8894 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb);
8895 }
8896
ath12k_mgmt_over_wmi_tx_work(struct wiphy * wiphy,struct wiphy_work * work)8897 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work)
8898 {
8899 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
8900 struct ath12k_hw *ah = ar->ah;
8901 struct ath12k_skb_cb *skb_cb;
8902 struct ath12k_vif *ahvif;
8903 struct ath12k_link_vif *arvif;
8904 struct sk_buff *skb;
8905 int ret;
8906
8907 lockdep_assert_wiphy(wiphy);
8908
8909 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
8910 skb_cb = ATH12K_SKB_CB(skb);
8911 if (!skb_cb->vif) {
8912 ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
8913 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8914 continue;
8915 }
8916
8917 ahvif = ath12k_vif_to_ahvif(skb_cb->vif);
8918 if (!(ahvif->links_map & BIT(skb_cb->link_id))) {
8919 ath12k_warn(ar->ab,
8920 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n",
8921 skb_cb->link_id, ahvif->links_map);
8922 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8923 continue;
8924 }
8925
8926 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]);
8927 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
8928 /* Fill in the data which is required to be filled by the driver
8929 * For example: Max Tx power in Link Measurement Request/Report
8930 */
8931 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb);
8932 if (ret) {
8933 /* If we couldn't fill the data due to any reason,
8934 * let's not discard transmitting the packet.
8935 * For example: Software crypto and PMF case
8936 */
8937 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8938 "Failed to fill the required data for the mgmt packet err %d\n",
8939 ret);
8940 }
8941
8942 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
8943 if (ret) {
8944 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
8945 arvif->vdev_id, ret);
8946 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8947 }
8948 } else {
8949 ath12k_warn(ar->ab,
8950 "dropping mgmt frame for vdev %d link %u is_started %d\n",
8951 arvif->vdev_id,
8952 skb_cb->link_id,
8953 arvif->is_started);
8954 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8955 }
8956 }
8957 }
8958
ath12k_mac_mgmt_tx(struct ath12k * ar,struct sk_buff * skb,bool is_prb_rsp)8959 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
8960 bool is_prb_rsp)
8961 {
8962 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
8963
8964 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
8965 return -ESHUTDOWN;
8966
8967 /* Drop probe response packets when the pending management tx
8968 * count has reached a certain threshold, so as to prioritize
8969 * other mgmt packets like auth and assoc to be sent on time
8970 * for establishing successful connections.
8971 */
8972 if (is_prb_rsp &&
8973 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
8974 ath12k_warn(ar->ab,
8975 "dropping probe response as pending queue is almost full\n");
8976 return -ENOSPC;
8977 }
8978
8979 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
8980 ath12k_warn(ar->ab, "mgmt tx queue is full\n");
8981 return -ENOSPC;
8982 }
8983
8984 skb_queue_tail(q, skb);
8985 atomic_inc(&ar->num_pending_mgmt_tx);
8986 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8987
8988 return 0;
8989 }
8990
ath12k_mac_add_p2p_noa_ie(struct ath12k * ar,struct ieee80211_vif * vif,struct sk_buff * skb,bool is_prb_rsp)8991 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
8992 struct ieee80211_vif *vif,
8993 struct sk_buff *skb,
8994 bool is_prb_rsp)
8995 {
8996 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8997
8998 if (likely(!is_prb_rsp))
8999 return;
9000
9001 spin_lock_bh(&ar->data_lock);
9002
9003 if (ahvif->u.ap.noa_data &&
9004 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len,
9005 GFP_ATOMIC))
9006 skb_put_data(skb, ahvif->u.ap.noa_data,
9007 ahvif->u.ap.noa_len);
9008
9009 spin_unlock_bh(&ar->data_lock);
9010 }
9011
9012 /* Note: called under rcu_read_lock() */
ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif * vif,u8 link_id,struct sk_buff * skb,u32 info_flags)9013 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif,
9014 u8 link_id, struct sk_buff *skb,
9015 u32 info_flags)
9016 {
9017 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
9018 struct ieee80211_bss_conf *bss_conf;
9019
9020 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
9021 return;
9022
9023 bss_conf = rcu_dereference(vif->link_conf[link_id]);
9024 if (bss_conf)
9025 ether_addr_copy(hdr->addr2, bss_conf->addr);
9026 }
9027
9028 /* Note: called under rcu_read_lock() */
ath12k_mac_get_tx_link(struct ieee80211_sta * sta,struct ieee80211_vif * vif,u8 link,struct sk_buff * skb,u32 info_flags)9029 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
9030 u8 link, struct sk_buff *skb, u32 info_flags)
9031 {
9032 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
9033 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9034 struct ieee80211_link_sta *link_sta;
9035 struct ieee80211_bss_conf *bss_conf;
9036 struct ath12k_sta *ahsta;
9037
9038 /* Use the link id passed or the default vif link */
9039 if (!sta) {
9040 if (link != IEEE80211_LINK_UNSPECIFIED)
9041 return link;
9042
9043 return ahvif->deflink.link_id;
9044 }
9045
9046 ahsta = ath12k_sta_to_ahsta(sta);
9047
9048 /* Below translation ensures we pass proper A2 & A3 for non ML clients.
9049 * Also it assumes for now support only for MLO AP in this path
9050 */
9051 if (!sta->mlo) {
9052 link = ahsta->deflink.link_id;
9053
9054 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
9055 return link;
9056
9057 bss_conf = rcu_dereference(vif->link_conf[link]);
9058 if (bss_conf) {
9059 ether_addr_copy(hdr->addr2, bss_conf->addr);
9060 if (!ieee80211_has_tods(hdr->frame_control) &&
9061 !ieee80211_has_fromds(hdr->frame_control))
9062 ether_addr_copy(hdr->addr3, bss_conf->addr);
9063 }
9064
9065 return link;
9066 }
9067
9068 /* enqueue eth enacap & data frames on primary link, FW does link
9069 * selection and address translation.
9070 */
9071 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
9072 ieee80211_is_data(hdr->frame_control))
9073 return ahsta->assoc_link_id;
9074
9075 /* 802.11 frame cases */
9076 if (link == IEEE80211_LINK_UNSPECIFIED)
9077 link = ahsta->deflink.link_id;
9078
9079 if (!ieee80211_is_mgmt(hdr->frame_control))
9080 return link;
9081
9082 /* Perform address conversion for ML STA Tx */
9083 bss_conf = rcu_dereference(vif->link_conf[link]);
9084 link_sta = rcu_dereference(sta->link[link]);
9085
9086 if (bss_conf && link_sta) {
9087 ether_addr_copy(hdr->addr1, link_sta->addr);
9088 ether_addr_copy(hdr->addr2, bss_conf->addr);
9089
9090 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
9091 ether_addr_copy(hdr->addr3, bss_conf->bssid);
9092 else if (vif->type == NL80211_IFTYPE_AP)
9093 ether_addr_copy(hdr->addr3, bss_conf->addr);
9094
9095 return link;
9096 }
9097
9098 if (bss_conf) {
9099 /* In certain cases where a ML sta associated and added subset of
9100 * links on which the ML AP is active, but now sends some frame
9101 * (ex. Probe request) on a different link which is active in our
9102 * MLD but was not added during previous association, we can
9103 * still honor the Tx to that ML STA via the requested link.
9104 * The control would reach here in such case only when that link
9105 * address is same as the MLD address or in worst case clients
9106 * used MLD address at TA wrongly which would have helped
9107 * identify the ML sta object and pass it here.
9108 * If the link address of that STA is different from MLD address,
9109 * then the sta object would be NULL and control won't reach
9110 * here but return at the start of the function itself with !sta
9111 * check. Also this would not need any translation at hdr->addr1
9112 * from MLD to link address since the RA is the MLD address
9113 * (same as that link address ideally) already.
9114 */
9115 ether_addr_copy(hdr->addr2, bss_conf->addr);
9116
9117 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
9118 ether_addr_copy(hdr->addr3, bss_conf->bssid);
9119 else if (vif->type == NL80211_IFTYPE_AP)
9120 ether_addr_copy(hdr->addr3, bss_conf->addr);
9121 }
9122
9123 return link;
9124 }
9125
9126 /* Note: called under rcu_read_lock() */
ath12k_mac_op_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)9127 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
9128 struct ieee80211_tx_control *control,
9129 struct sk_buff *skb)
9130 {
9131 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
9132 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
9133 struct ieee80211_vif *vif = info->control.vif;
9134 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9135 struct ath12k_link_vif *arvif = &ahvif->deflink;
9136 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
9137 struct ieee80211_key_conf *key = info->control.hw_key;
9138 struct ieee80211_sta *sta = control->sta;
9139 struct ath12k_link_vif *tmp_arvif;
9140 u32 info_flags = info->flags;
9141 struct sk_buff *msdu_copied;
9142 struct ath12k *ar, *tmp_ar;
9143 struct ath12k_peer *peer;
9144 unsigned long links_map;
9145 bool is_mcast = false;
9146 bool is_dvlan = false;
9147 struct ethhdr *eth;
9148 bool is_prb_rsp;
9149 u16 mcbc_gsn;
9150 u8 link_id;
9151 int ret;
9152
9153 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
9154 ieee80211_free_txskb(hw, skb);
9155 return;
9156 }
9157
9158 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
9159 memset(skb_cb, 0, sizeof(*skb_cb));
9160 skb_cb->vif = vif;
9161
9162 if (key) {
9163 skb_cb->cipher = key->cipher;
9164 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
9165 }
9166
9167 /* handle only for MLO case, use deflink for non MLO case */
9168 if (ieee80211_vif_is_mld(vif)) {
9169 link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags);
9170 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
9171 ieee80211_free_txskb(hw, skb);
9172 return;
9173 }
9174 } else {
9175 link_id = 0;
9176 }
9177
9178 arvif = rcu_dereference(ahvif->link[link_id]);
9179 if (!arvif || !arvif->ar) {
9180 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission",
9181 link_id);
9182 ieee80211_free_txskb(hw, skb);
9183 return;
9184 }
9185
9186 ar = arvif->ar;
9187 skb_cb->link_id = link_id;
9188 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
9189
9190 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
9191 eth = (struct ethhdr *)skb->data;
9192 is_mcast = is_multicast_ether_addr(eth->h_dest);
9193
9194 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
9195 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
9196 if (sta && sta->mlo)
9197 skb_cb->flags |= ATH12K_SKB_MLO_STA;
9198
9199 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
9200 if (ret) {
9201 ath12k_warn(ar->ab, "failed to queue management frame %d\n",
9202 ret);
9203 ieee80211_free_txskb(hw, skb);
9204 }
9205 return;
9206 }
9207
9208 if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
9209 is_mcast = is_multicast_ether_addr(hdr->addr1);
9210
9211 /* This is case only for P2P_GO */
9212 if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
9213 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
9214
9215 /* Checking if it is a DVLAN frame */
9216 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
9217 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
9218 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
9219 ieee80211_has_protected(hdr->frame_control))
9220 is_dvlan = true;
9221
9222 if (!vif->valid_links || !is_mcast || is_dvlan ||
9223 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
9224 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
9225 ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast);
9226 if (unlikely(ret)) {
9227 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
9228 ieee80211_free_txskb(ar->ah->hw, skb);
9229 return;
9230 }
9231 } else {
9232 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff;
9233
9234 links_map = ahvif->links_map;
9235 for_each_set_bit(link_id, &links_map,
9236 IEEE80211_MLD_MAX_NUM_LINKS) {
9237 tmp_arvif = rcu_dereference(ahvif->link[link_id]);
9238 if (!tmp_arvif || !tmp_arvif->is_up)
9239 continue;
9240
9241 tmp_ar = tmp_arvif->ar;
9242 msdu_copied = skb_copy(skb, GFP_ATOMIC);
9243 if (!msdu_copied) {
9244 ath12k_err(ar->ab,
9245 "skb copy failure link_id 0x%X vdevid 0x%X\n",
9246 link_id, tmp_arvif->vdev_id);
9247 continue;
9248 }
9249
9250 ath12k_mlo_mcast_update_tx_link_address(vif, link_id,
9251 msdu_copied,
9252 info_flags);
9253
9254 skb_cb = ATH12K_SKB_CB(msdu_copied);
9255 skb_cb->link_id = link_id;
9256
9257 /* For open mode, skip peer find logic */
9258 if (unlikely(!ahvif->key_cipher))
9259 goto skip_peer_find;
9260
9261 spin_lock_bh(&tmp_ar->ab->base_lock);
9262 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid);
9263 if (!peer) {
9264 spin_unlock_bh(&tmp_ar->ab->base_lock);
9265 ath12k_warn(tmp_ar->ab,
9266 "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n",
9267 tmp_arvif->vdev_id, tmp_arvif->bssid,
9268 ahvif->links_map);
9269 dev_kfree_skb_any(msdu_copied);
9270 continue;
9271 }
9272
9273 key = peer->keys[peer->mcast_keyidx];
9274 if (key) {
9275 skb_cb->cipher = key->cipher;
9276 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
9277
9278 hdr = (struct ieee80211_hdr *)msdu_copied->data;
9279 if (!ieee80211_has_protected(hdr->frame_control))
9280 hdr->frame_control |=
9281 cpu_to_le16(IEEE80211_FCTL_PROTECTED);
9282 }
9283 spin_unlock_bh(&tmp_ar->ab->base_lock);
9284
9285 skip_peer_find:
9286 ret = ath12k_dp_tx(tmp_ar, tmp_arvif,
9287 msdu_copied, true, mcbc_gsn, is_mcast);
9288 if (unlikely(ret)) {
9289 if (ret == -ENOMEM) {
9290 /* Drops are expected during heavy multicast
9291 * frame flood. Print with debug log
9292 * level to avoid lot of console prints
9293 */
9294 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
9295 "failed to transmit frame %d\n",
9296 ret);
9297 } else {
9298 ath12k_warn(ar->ab,
9299 "failed to transmit frame %d\n",
9300 ret);
9301 }
9302
9303 dev_kfree_skb_any(msdu_copied);
9304 }
9305 }
9306 ieee80211_free_txskb(ar->ah->hw, skb);
9307 }
9308 }
9309
ath12k_mac_drain_tx(struct ath12k * ar)9310 void ath12k_mac_drain_tx(struct ath12k *ar)
9311 {
9312 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9313
9314 /* make sure rcu-protected mac80211 tx path itself is drained */
9315 synchronize_net();
9316
9317 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
9318 ath12k_mgmt_over_wmi_tx_purge(ar);
9319 }
9320
ath12k_mac_config_mon_status_default(struct ath12k * ar,bool enable)9321 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
9322 {
9323 struct htt_rx_ring_tlv_filter tlv_filter = {};
9324 struct ath12k_base *ab = ar->ab;
9325 u32 ring_id, i;
9326 int ret = 0;
9327
9328 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9329
9330 if (!ab->hw_params->rxdma1_enable)
9331 return ret;
9332
9333 if (enable) {
9334 tlv_filter = ath12k_mac_mon_status_filter_default;
9335
9336 if (ath12k_debugfs_rx_filter(ar))
9337 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar);
9338 } else {
9339 tlv_filter.rxmon_disable = true;
9340 }
9341
9342 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) {
9343 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id;
9344 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id,
9345 ar->dp.mac_id + i,
9346 HAL_RXDMA_MONITOR_DST,
9347 DP_RXDMA_REFILL_RING_SIZE,
9348 &tlv_filter);
9349 if (ret) {
9350 ath12k_err(ab,
9351 "failed to setup filter for monitor buf %d\n",
9352 ret);
9353 }
9354 }
9355
9356 return ret;
9357 }
9358
ath12k_mac_start(struct ath12k * ar)9359 static int ath12k_mac_start(struct ath12k *ar)
9360 {
9361 struct ath12k_hw *ah = ar->ah;
9362 struct ath12k_base *ab = ar->ab;
9363 struct ath12k_pdev *pdev = ar->pdev;
9364 int ret;
9365
9366 lockdep_assert_held(&ah->hw_mutex);
9367 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9368
9369 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
9370 1, pdev->pdev_id);
9371
9372 if (ret) {
9373 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret);
9374 goto err;
9375 }
9376
9377 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
9378 pdev->pdev_id);
9379 if (ret) {
9380 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
9381 goto err;
9382 }
9383
9384 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
9385 0, pdev->pdev_id);
9386 if (ret) {
9387 ath12k_err(ab, "failed to set ac override for ARP: %d\n",
9388 ret);
9389 goto err;
9390 }
9391
9392 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
9393 if (ret) {
9394 ath12k_err(ab, "failed to offload radar detection: %d\n",
9395 ret);
9396 goto err;
9397 }
9398
9399 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
9400 HTT_PPDU_STATS_TAG_DEFAULT);
9401 if (ret) {
9402 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
9403 goto err;
9404 }
9405
9406 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
9407 1, pdev->pdev_id);
9408
9409 if (ret) {
9410 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
9411 goto err;
9412 }
9413
9414 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
9415
9416 /* TODO: Do we need to enable ANI? */
9417
9418 ret = ath12k_reg_update_chan_list(ar, false);
9419
9420 /* The ar state alone can be turned off for non supported country
9421 * without returning the error value. As we need to update the channel
9422 * for the next ar.
9423 */
9424 if (ret) {
9425 if (ret == -EINVAL)
9426 ret = 0;
9427 goto err;
9428 }
9429
9430 ar->num_started_vdevs = 0;
9431 ar->num_created_vdevs = 0;
9432 ar->num_peers = 0;
9433 ar->allocated_vdev_map = 0;
9434 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
9435
9436 /* Configure monitor status ring with default rx_filter to get rx status
9437 * such as rssi, rx_duration.
9438 */
9439 ret = ath12k_mac_config_mon_status_default(ar, true);
9440 if (ret && (ret != -EOPNOTSUPP)) {
9441 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
9442 ret);
9443 goto err;
9444 }
9445
9446 if (ret == -EOPNOTSUPP)
9447 ath12k_dbg(ab, ATH12K_DBG_MAC,
9448 "monitor status config is not yet supported");
9449
9450 /* Configure the hash seed for hash based reo dest ring selection */
9451 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
9452
9453 /* allow device to enter IMPS */
9454 if (ab->hw_params->idle_ps) {
9455 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
9456 1, pdev->pdev_id);
9457 if (ret) {
9458 ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
9459 goto err;
9460 }
9461 }
9462
9463 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
9464 &ab->pdevs[ar->pdev_idx]);
9465
9466 return 0;
9467 err:
9468
9469 return ret;
9470 }
9471
ath12k_drain_tx(struct ath12k_hw * ah)9472 static void ath12k_drain_tx(struct ath12k_hw *ah)
9473 {
9474 struct ath12k *ar;
9475 int i;
9476
9477 lockdep_assert_wiphy(ah->hw->wiphy);
9478
9479 for_each_ar(ah, ar, i)
9480 ath12k_mac_drain_tx(ar);
9481 }
9482
ath12k_mac_op_start(struct ieee80211_hw * hw)9483 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
9484 {
9485 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9486 struct ath12k *ar;
9487 int ret, i;
9488
9489 if (ath12k_ftm_mode)
9490 return -EPERM;
9491
9492 lockdep_assert_wiphy(hw->wiphy);
9493
9494 ath12k_drain_tx(ah);
9495
9496 guard(mutex)(&ah->hw_mutex);
9497
9498 switch (ah->state) {
9499 case ATH12K_HW_STATE_OFF:
9500 ah->state = ATH12K_HW_STATE_ON;
9501 break;
9502 case ATH12K_HW_STATE_RESTARTING:
9503 ah->state = ATH12K_HW_STATE_RESTARTED;
9504 break;
9505 case ATH12K_HW_STATE_RESTARTED:
9506 case ATH12K_HW_STATE_WEDGED:
9507 case ATH12K_HW_STATE_ON:
9508 case ATH12K_HW_STATE_TM:
9509 ah->state = ATH12K_HW_STATE_OFF;
9510
9511 WARN_ON(1);
9512 return -EINVAL;
9513 }
9514
9515 for_each_ar(ah, ar, i) {
9516 ret = ath12k_mac_start(ar);
9517 if (ret) {
9518 ah->state = ATH12K_HW_STATE_OFF;
9519
9520 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n",
9521 ar->pdev_idx, ret);
9522 goto fail_start;
9523 }
9524 }
9525
9526 return 0;
9527
9528 fail_start:
9529 for (; i > 0; i--) {
9530 ar = ath12k_ah_to_ar(ah, i - 1);
9531 ath12k_mac_stop(ar);
9532 }
9533
9534 return ret;
9535 }
9536
ath12k_mac_rfkill_config(struct ath12k * ar)9537 int ath12k_mac_rfkill_config(struct ath12k *ar)
9538 {
9539 struct ath12k_base *ab = ar->ab;
9540 u32 param;
9541 int ret;
9542
9543 if (ab->hw_params->rfkill_pin == 0)
9544 return -EOPNOTSUPP;
9545
9546 ath12k_dbg(ab, ATH12K_DBG_MAC,
9547 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
9548 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
9549 ab->hw_params->rfkill_on_level);
9550
9551 param = u32_encode_bits(ab->hw_params->rfkill_on_level,
9552 WMI_RFKILL_CFG_RADIO_LEVEL) |
9553 u32_encode_bits(ab->hw_params->rfkill_pin,
9554 WMI_RFKILL_CFG_GPIO_PIN_NUM) |
9555 u32_encode_bits(ab->hw_params->rfkill_cfg,
9556 WMI_RFKILL_CFG_PIN_AS_GPIO);
9557
9558 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
9559 param, ar->pdev->pdev_id);
9560 if (ret) {
9561 ath12k_warn(ab,
9562 "failed to set rfkill config 0x%x: %d\n",
9563 param, ret);
9564 return ret;
9565 }
9566
9567 return 0;
9568 }
9569
ath12k_mac_rfkill_enable_radio(struct ath12k * ar,bool enable)9570 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
9571 {
9572 enum wmi_rfkill_enable_radio param;
9573 int ret;
9574
9575 if (enable)
9576 param = WMI_RFKILL_ENABLE_RADIO_ON;
9577 else
9578 param = WMI_RFKILL_ENABLE_RADIO_OFF;
9579
9580 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
9581 ar->pdev_idx, param);
9582
9583 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
9584 param, ar->pdev->pdev_id);
9585 if (ret) {
9586 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
9587 param, ret);
9588 return ret;
9589 }
9590
9591 return 0;
9592 }
9593
ath12k_mac_stop(struct ath12k * ar)9594 static void ath12k_mac_stop(struct ath12k *ar)
9595 {
9596 struct ath12k_hw *ah = ar->ah;
9597 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
9598 struct ath12k_wmi_scan_chan_list_arg *arg;
9599 int ret;
9600
9601 lockdep_assert_held(&ah->hw_mutex);
9602 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9603
9604 ret = ath12k_mac_config_mon_status_default(ar, false);
9605 if (ret && (ret != -EOPNOTSUPP))
9606 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
9607 ret);
9608
9609 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
9610
9611 cancel_delayed_work_sync(&ar->scan.timeout);
9612 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk);
9613 cancel_work_sync(&ar->regd_channel_update_work);
9614 cancel_work_sync(&ar->regd_update_work);
9615 cancel_work_sync(&ar->ab->rfkill_work);
9616 cancel_work_sync(&ar->ab->update_11d_work);
9617 ar->state_11d = ATH12K_11D_IDLE;
9618 complete(&ar->completed_11d_scan);
9619
9620 spin_lock_bh(&ar->data_lock);
9621
9622 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
9623 list_del(&ppdu_stats->list);
9624 kfree(ppdu_stats);
9625 }
9626
9627 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue,
9628 struct ath12k_wmi_scan_chan_list_arg,
9629 list))) {
9630 list_del(&arg->list);
9631 kfree(arg);
9632 }
9633 spin_unlock_bh(&ar->data_lock);
9634
9635 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
9636
9637 synchronize_rcu();
9638
9639 atomic_set(&ar->num_pending_mgmt_tx, 0);
9640 }
9641
ath12k_mac_op_stop(struct ieee80211_hw * hw,bool suspend)9642 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend)
9643 {
9644 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9645 struct ath12k *ar;
9646 int i;
9647
9648 lockdep_assert_wiphy(hw->wiphy);
9649
9650 ath12k_drain_tx(ah);
9651
9652 mutex_lock(&ah->hw_mutex);
9653
9654 ah->state = ATH12K_HW_STATE_OFF;
9655
9656 for_each_ar(ah, ar, i)
9657 ath12k_mac_stop(ar);
9658
9659 mutex_unlock(&ah->hw_mutex);
9660 }
9661
9662 static u8
ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif * arvif)9663 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif)
9664 {
9665 struct ath12k_base *ab = arvif->ar->ab;
9666 u8 vdev_stats_id = 0;
9667
9668 do {
9669 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
9670 vdev_stats_id++;
9671 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
9672 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
9673 break;
9674 }
9675 } else {
9676 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
9677 break;
9678 }
9679 } while (vdev_stats_id);
9680
9681 arvif->vdev_stats_id = vdev_stats_id;
9682 return vdev_stats_id;
9683 }
9684
ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif * arvif,u32 * flags,u32 * tx_vdev_id)9685 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif,
9686 u32 *flags, u32 *tx_vdev_id)
9687 {
9688 struct ath12k_vif *ahvif = arvif->ahvif;
9689 struct ieee80211_bss_conf *link_conf;
9690 struct ath12k *ar = arvif->ar;
9691 struct ath12k_link_vif *tx_arvif;
9692
9693 link_conf = ath12k_mac_get_link_bss_conf(arvif);
9694 if (!link_conf) {
9695 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n",
9696 ahvif->vif->addr, arvif->link_id);
9697 return -ENOLINK;
9698 }
9699
9700 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
9701 if (!tx_arvif)
9702 return 0;
9703
9704 if (link_conf->nontransmitted) {
9705 if (ath12k_ar_to_hw(ar)->wiphy !=
9706 ath12k_ar_to_hw(tx_arvif->ar)->wiphy)
9707 return -EINVAL;
9708
9709 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP;
9710 *tx_vdev_id = tx_arvif->vdev_id;
9711 } else if (tx_arvif == arvif) {
9712 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP;
9713 } else {
9714 return -EINVAL;
9715 }
9716
9717 if (link_conf->ema_ap)
9718 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE;
9719
9720 return 0;
9721 }
9722
ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif * arvif,struct ath12k_wmi_vdev_create_arg * arg)9723 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif,
9724 struct ath12k_wmi_vdev_create_arg *arg)
9725 {
9726 struct ath12k *ar = arvif->ar;
9727 struct ath12k_pdev *pdev = ar->pdev;
9728 struct ath12k_vif *ahvif = arvif->ahvif;
9729 int ret;
9730
9731 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9732
9733 arg->if_id = arvif->vdev_id;
9734 arg->type = ahvif->vdev_type;
9735 arg->subtype = ahvif->vdev_subtype;
9736 arg->pdev_id = pdev->pdev_id;
9737
9738 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
9739 arg->mbssid_tx_vdev_id = 0;
9740 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
9741 ar->ab->wmi_ab.svc_map)) {
9742 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
9743 &arg->mbssid_flags,
9744 &arg->mbssid_tx_vdev_id);
9745 if (ret)
9746 return ret;
9747 }
9748
9749 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
9750 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
9751 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
9752 }
9753 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
9754 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
9755 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
9756 }
9757 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
9758 ar->supports_6ghz) {
9759 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
9760 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
9761 }
9762
9763 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
9764
9765 if (ath12k_mac_is_ml_arvif(arvif)) {
9766 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) {
9767 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d",
9768 ahvif->vif->valid_links);
9769 return -EINVAL;
9770 }
9771
9772 ether_addr_copy(arg->mld_addr, ahvif->vif->addr);
9773 }
9774
9775 return 0;
9776 }
9777
ath12k_mac_update_vif_offload(struct ath12k_link_vif * arvif)9778 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
9779 {
9780 struct ath12k_vif *ahvif = arvif->ahvif;
9781 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9782 struct ath12k *ar = arvif->ar;
9783 struct ath12k_base *ab = ar->ab;
9784 u32 param_id, param_value;
9785 int ret;
9786
9787 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
9788 if (vif->type != NL80211_IFTYPE_STATION &&
9789 vif->type != NL80211_IFTYPE_AP)
9790 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
9791 IEEE80211_OFFLOAD_DECAP_ENABLED);
9792
9793 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
9794 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
9795 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9796 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
9797 else
9798 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
9799
9800 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9801 param_id, ahvif->tx_encap_type);
9802 if (ret) {
9803 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
9804 arvif->vdev_id, ret);
9805 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
9806 }
9807
9808 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
9809 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
9810 param_value = ATH12K_HW_TXRX_ETHERNET;
9811 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9812 param_value = ATH12K_HW_TXRX_RAW;
9813 else
9814 param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
9815
9816 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9817 param_id, param_value);
9818 if (ret) {
9819 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
9820 arvif->vdev_id, ret);
9821 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
9822 }
9823 }
9824
ath12k_mac_op_update_vif_offload(struct ieee80211_hw * hw,struct ieee80211_vif * vif)9825 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
9826 struct ieee80211_vif *vif)
9827 {
9828 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9829 struct ath12k_link_vif *arvif;
9830 unsigned long links;
9831 int link_id;
9832
9833 lockdep_assert_wiphy(hw->wiphy);
9834
9835 if (vif->valid_links) {
9836 links = vif->valid_links;
9837 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
9838 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
9839 if (!(arvif && arvif->ar))
9840 continue;
9841
9842 ath12k_mac_update_vif_offload(arvif);
9843 }
9844
9845 return;
9846 }
9847
9848 ath12k_mac_update_vif_offload(&ahvif->deflink);
9849 }
9850
ath12k_mac_vif_ap_active_any(struct ath12k_base * ab)9851 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab)
9852 {
9853 struct ath12k *ar;
9854 struct ath12k_pdev *pdev;
9855 struct ath12k_link_vif *arvif;
9856 int i;
9857
9858 for (i = 0; i < ab->num_radios; i++) {
9859 pdev = &ab->pdevs[i];
9860 ar = pdev->ar;
9861 list_for_each_entry(arvif, &ar->arvifs, list) {
9862 if (arvif->is_up &&
9863 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP)
9864 return true;
9865 }
9866 }
9867 return false;
9868 }
9869
ath12k_mac_11d_scan_start(struct ath12k * ar,u32 vdev_id)9870 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id)
9871 {
9872 struct wmi_11d_scan_start_arg arg;
9873 int ret;
9874
9875 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9876
9877 if (ar->regdom_set_by_user)
9878 goto fin;
9879
9880 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID)
9881 goto fin;
9882
9883 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9884 goto fin;
9885
9886 if (ath12k_mac_vif_ap_active_any(ar->ab))
9887 goto fin;
9888
9889 arg.vdev_id = vdev_id;
9890 arg.start_interval_msec = 0;
9891 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL;
9892
9893 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
9894 "mac start 11d scan for vdev %d\n", vdev_id);
9895
9896 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg);
9897 if (ret) {
9898 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
9899 vdev_id, ret);
9900 } else {
9901 ar->vdev_id_11d_scan = vdev_id;
9902 if (ar->state_11d == ATH12K_11D_PREPARING)
9903 ar->state_11d = ATH12K_11D_RUNNING;
9904 }
9905
9906 fin:
9907 if (ar->state_11d == ATH12K_11D_PREPARING) {
9908 ar->state_11d = ATH12K_11D_IDLE;
9909 complete(&ar->completed_11d_scan);
9910 }
9911 }
9912
ath12k_mac_11d_scan_stop(struct ath12k * ar)9913 void ath12k_mac_11d_scan_stop(struct ath12k *ar)
9914 {
9915 int ret;
9916 u32 vdev_id;
9917
9918 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9919
9920 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9921 return;
9922
9923 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n",
9924 ar->vdev_id_11d_scan);
9925
9926 if (ar->state_11d == ATH12K_11D_PREPARING) {
9927 ar->state_11d = ATH12K_11D_IDLE;
9928 complete(&ar->completed_11d_scan);
9929 }
9930
9931 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) {
9932 vdev_id = ar->vdev_id_11d_scan;
9933
9934 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
9935 if (ret) {
9936 ath12k_warn(ar->ab,
9937 "failed to stopt 11d scan vdev %d ret: %d\n",
9938 vdev_id, ret);
9939 } else {
9940 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
9941 ar->state_11d = ATH12K_11D_IDLE;
9942 complete(&ar->completed_11d_scan);
9943 }
9944 }
9945 }
9946
ath12k_mac_11d_scan_stop_all(struct ath12k_base * ab)9947 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab)
9948 {
9949 struct ath12k *ar;
9950 struct ath12k_pdev *pdev;
9951 int i;
9952
9953 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n");
9954
9955 for (i = 0; i < ab->num_radios; i++) {
9956 pdev = &ab->pdevs[i];
9957 ar = pdev->ar;
9958
9959 ath12k_mac_11d_scan_stop(ar);
9960 }
9961 }
9962
ath12k_mac_determine_vdev_type(struct ieee80211_vif * vif,struct ath12k_vif * ahvif)9963 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif,
9964 struct ath12k_vif *ahvif)
9965 {
9966 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
9967
9968 switch (vif->type) {
9969 case NL80211_IFTYPE_UNSPECIFIED:
9970 case NL80211_IFTYPE_STATION:
9971 ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9972
9973 if (vif->p2p)
9974 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
9975
9976 break;
9977 case NL80211_IFTYPE_MESH_POINT:
9978 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
9979 fallthrough;
9980 case NL80211_IFTYPE_AP:
9981 ahvif->vdev_type = WMI_VDEV_TYPE_AP;
9982
9983 if (vif->p2p)
9984 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
9985
9986 break;
9987 case NL80211_IFTYPE_MONITOR:
9988 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
9989 break;
9990 case NL80211_IFTYPE_P2P_DEVICE:
9991 ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9992 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
9993 break;
9994 default:
9995 WARN_ON(1);
9996 break;
9997 }
9998 }
9999
ath12k_mac_vdev_create(struct ath12k * ar,struct ath12k_link_vif * arvif)10000 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
10001 {
10002 struct ath12k_hw *ah = ar->ah;
10003 struct ath12k_base *ab = ar->ab;
10004 struct ieee80211_hw *hw = ah->hw;
10005 struct ath12k_vif *ahvif = arvif->ahvif;
10006 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10007 struct ath12k_wmi_vdev_create_arg vdev_arg = {};
10008 struct ath12k_wmi_peer_create_arg peer_param = {};
10009 struct ieee80211_bss_conf *link_conf = NULL;
10010 u32 param_id, param_value;
10011 u16 nss;
10012 int i;
10013 int ret, vdev_id;
10014 u8 link_id;
10015
10016 lockdep_assert_wiphy(hw->wiphy);
10017
10018 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor
10019 * interface in each radio
10020 */
10021 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created)
10022 return -EINVAL;
10023
10024 if (ar->num_created_vdevs >= TARGET_NUM_VDEVS(ab)) {
10025 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
10026 TARGET_NUM_VDEVS(ab));
10027 return -ENOSPC;
10028 }
10029
10030 link_id = arvif->link_id;
10031
10032 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
10033 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
10034 if (!link_conf) {
10035 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n",
10036 vif->addr, arvif->link_id);
10037 return -ENOLINK;
10038 }
10039 }
10040
10041 if (link_conf)
10042 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN);
10043 else
10044 memcpy(arvif->bssid, vif->addr, ETH_ALEN);
10045
10046 arvif->ar = ar;
10047 vdev_id = __ffs64(ab->free_vdev_map);
10048 arvif->vdev_id = vdev_id;
10049 if (vif->type == NL80211_IFTYPE_MONITOR)
10050 ar->monitor_vdev_id = vdev_id;
10051
10052 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n",
10053 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype,
10054 ab->free_vdev_map);
10055
10056 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
10057 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10058 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
10059
10060 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
10061 if (ret) {
10062 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n",
10063 arvif->vdev_id, ret);
10064 goto err;
10065 }
10066
10067 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg);
10068 if (ret) {
10069 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
10070 arvif->vdev_id, ret);
10071 return ret;
10072 }
10073
10074 ar->num_created_vdevs++;
10075 arvif->is_created = true;
10076 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
10077 vif->addr, arvif->vdev_id);
10078 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
10079 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
10080
10081 spin_lock_bh(&ar->data_lock);
10082 list_add(&arvif->list, &ar->arvifs);
10083 spin_unlock_bh(&ar->data_lock);
10084
10085 ath12k_mac_update_vif_offload(arvif);
10086
10087 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
10088 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
10089 WMI_VDEV_PARAM_NSS, nss);
10090 if (ret) {
10091 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
10092 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
10093 goto err_vdev_del;
10094 }
10095
10096 switch (ahvif->vdev_type) {
10097 case WMI_VDEV_TYPE_AP:
10098 peer_param.vdev_id = arvif->vdev_id;
10099 peer_param.peer_addr = arvif->bssid;
10100 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
10101 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
10102 if (ret) {
10103 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
10104 arvif->vdev_id, ret);
10105 goto err_vdev_del;
10106 }
10107
10108 ret = ath12k_mac_set_kickout(arvif);
10109 if (ret) {
10110 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
10111 arvif->vdev_id, ret);
10112 goto err_peer_del;
10113 }
10114 ath12k_mac_11d_scan_stop_all(ar->ab);
10115 break;
10116 case WMI_VDEV_TYPE_STA:
10117 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
10118 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
10119 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
10120 param_id, param_value);
10121 if (ret) {
10122 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
10123 arvif->vdev_id, ret);
10124 goto err_peer_del;
10125 }
10126
10127 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
10128 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
10129 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
10130 param_id, param_value);
10131 if (ret) {
10132 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
10133 arvif->vdev_id, ret);
10134 goto err_peer_del;
10135 }
10136
10137 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
10138 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
10139 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
10140 param_id, param_value);
10141 if (ret) {
10142 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
10143 arvif->vdev_id, ret);
10144 goto err_peer_del;
10145 }
10146
10147 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
10148 if (ret) {
10149 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
10150 arvif->vdev_id, ret);
10151 goto err_peer_del;
10152 }
10153
10154 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
10155 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
10156 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
10157 reinit_completion(&ar->completed_11d_scan);
10158 ar->state_11d = ATH12K_11D_PREPARING;
10159 }
10160 break;
10161 case WMI_VDEV_TYPE_MONITOR:
10162 ar->monitor_vdev_created = true;
10163 break;
10164 default:
10165 break;
10166 }
10167
10168 if (link_conf)
10169 arvif->txpower = link_conf->txpower;
10170 else
10171 arvif->txpower = NL80211_TX_POWER_AUTOMATIC;
10172
10173 ret = ath12k_mac_txpower_recalc(ar);
10174 if (ret)
10175 goto err_peer_del;
10176
10177 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
10178 param_value = hw->wiphy->rts_threshold;
10179 ar->rts_threshold = param_value;
10180 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
10181 param_id, param_value);
10182 if (ret) {
10183 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
10184 arvif->vdev_id, ret);
10185 }
10186
10187 ath12k_dp_vdev_tx_attach(ar, arvif);
10188
10189 return ret;
10190
10191 err_peer_del:
10192 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10193 reinit_completion(&ar->peer_delete_done);
10194
10195 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid,
10196 arvif->vdev_id);
10197 if (ret) {
10198 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
10199 arvif->vdev_id, arvif->bssid);
10200 goto err;
10201 }
10202
10203 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
10204 arvif->bssid);
10205 if (ret)
10206 goto err_vdev_del;
10207
10208 ar->num_peers--;
10209 }
10210
10211 err_vdev_del:
10212 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10213 ar->monitor_vdev_id = -1;
10214 ar->monitor_vdev_created = false;
10215 }
10216
10217 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10218 ar->num_created_vdevs--;
10219 arvif->is_created = false;
10220 arvif->ar = NULL;
10221 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10222 ab->free_vdev_map |= 1LL << arvif->vdev_id;
10223 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
10224 spin_lock_bh(&ar->data_lock);
10225 list_del(&arvif->list);
10226 spin_unlock_bh(&ar->data_lock);
10227
10228 err:
10229 arvif->ar = NULL;
10230 return ret;
10231 }
10232
ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif * arvif)10233 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif)
10234 {
10235 struct ath12k_key_conf *key_conf, *tmp;
10236 struct ath12k_vif *ahvif = arvif->ahvif;
10237 struct ath12k_hw *ah = ahvif->ah;
10238 struct ath12k_sta *ahsta;
10239 struct ath12k_link_sta *arsta;
10240 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
10241 int ret;
10242
10243 lockdep_assert_wiphy(ah->hw->wiphy);
10244
10245 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
10246 arsta = NULL;
10247 if (key_conf->sta) {
10248 ahsta = ath12k_sta_to_ahsta(key_conf->sta);
10249 arsta = wiphy_dereference(ah->hw->wiphy,
10250 ahsta->link[arvif->link_id]);
10251 if (!arsta)
10252 goto free_cache;
10253 }
10254
10255 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd,
10256 arvif, arsta,
10257 key_conf->key);
10258 if (ret)
10259 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n",
10260 arvif->vdev_id, ret);
10261 free_cache:
10262 list_del(&key_conf->list);
10263 kfree(key_conf);
10264 }
10265 }
10266
ath12k_mac_vif_cache_flush(struct ath12k * ar,struct ath12k_link_vif * arvif)10267 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif)
10268 {
10269 struct ath12k_vif *ahvif = arvif->ahvif;
10270 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10271 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
10272 struct ath12k_base *ab = ar->ab;
10273 struct ieee80211_bss_conf *link_conf;
10274
10275 int ret;
10276
10277 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10278
10279 if (!cache)
10280 return;
10281
10282 if (cache->tx_conf.changed) {
10283 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac,
10284 &cache->tx_conf.tx_queue_params);
10285 if (ret)
10286 ath12k_warn(ab,
10287 "unable to apply tx config parameters to vdev %d\n",
10288 ret);
10289 }
10290
10291 if (cache->bss_conf_changed) {
10292 link_conf = ath12k_mac_get_link_bss_conf(arvif);
10293 if (!link_conf) {
10294 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n",
10295 vif->addr, arvif->link_id);
10296 return;
10297 }
10298 ath12k_mac_bss_info_changed(ar, arvif, link_conf,
10299 cache->bss_conf_changed);
10300 }
10301
10302 if (!list_empty(&cache->key_conf.list))
10303 ath12k_mac_vif_flush_key_cache(arvif);
10304
10305 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10306 }
10307
ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10308 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
10309 struct ath12k_link_vif *arvif,
10310 struct ieee80211_chanctx_conf *ctx)
10311 {
10312 struct ath12k_vif *ahvif = arvif->ahvif;
10313 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10314 struct ath12k_link_vif *scan_arvif;
10315 struct ath12k_hw *ah = hw->priv;
10316 struct ath12k *ar;
10317 struct ath12k_base *ab;
10318 u8 link_id = arvif->link_id, scan_link_id;
10319 unsigned long scan_link_map;
10320 int ret;
10321
10322 lockdep_assert_wiphy(hw->wiphy);
10323
10324 if (ah->num_radio == 1)
10325 ar = ah->radio;
10326 else if (ctx)
10327 ar = ath12k_get_ar_by_ctx(hw, ctx);
10328 else
10329 return NULL;
10330
10331 if (!ar)
10332 return NULL;
10333
10334 /* cleanup the scan vdev if we are done scan on that ar
10335 * and now we want to create for actual usage.
10336 */
10337 if (ieee80211_vif_is_mld(vif)) {
10338 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
10339 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) {
10340 scan_arvif = wiphy_dereference(hw->wiphy,
10341 ahvif->link[scan_link_id]);
10342 if (scan_arvif && scan_arvif->ar == ar) {
10343 ar->scan.arvif = NULL;
10344 ath12k_mac_remove_link_interface(hw, scan_arvif);
10345 ath12k_mac_unassign_link_vif(scan_arvif);
10346 break;
10347 }
10348 }
10349 }
10350
10351 if (arvif->ar) {
10352 /* This is not expected really */
10353 if (WARN_ON(!arvif->is_created)) {
10354 arvif->ar = NULL;
10355 return NULL;
10356 }
10357
10358 if (ah->num_radio == 1)
10359 return arvif->ar;
10360
10361 /* This can happen as scan vdev gets created during multiple scans
10362 * across different radios before a vdev is brought up in
10363 * a certain radio.
10364 */
10365 if (ar != arvif->ar) {
10366 if (WARN_ON(arvif->is_started))
10367 return NULL;
10368
10369 ath12k_mac_remove_link_interface(hw, arvif);
10370 ath12k_mac_unassign_link_vif(arvif);
10371 }
10372 }
10373
10374 ab = ar->ab;
10375
10376 /* Assign arvif again here since previous radio switch block
10377 * would've unassigned and cleared it.
10378 */
10379 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
10380 if (vif->type == NL80211_IFTYPE_AP &&
10381 ar->num_peers > (ar->max_num_peers - 1)) {
10382 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
10383 goto unlock;
10384 }
10385
10386 if (arvif->is_created)
10387 goto flush;
10388
10389 ret = ath12k_mac_vdev_create(ar, arvif);
10390 if (ret) {
10391 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
10392 goto unlock;
10393 }
10394
10395 flush:
10396 /* If the vdev is created during channel assign and not during
10397 * add_interface(), Apply any parameters for the vdev which were received
10398 * after add_interface, corresponding to this vif.
10399 */
10400 ath12k_mac_vif_cache_flush(ar, arvif);
10401 unlock:
10402 return arvif->ar;
10403 }
10404
ath12k_mac_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10405 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
10406 struct ieee80211_vif *vif)
10407 {
10408 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10409 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10410 struct ath12k_reg_info *reg_info;
10411 struct ath12k_link_vif *arvif;
10412 struct ath12k_base *ab;
10413 struct ath12k *ar;
10414 int i;
10415
10416 lockdep_assert_wiphy(hw->wiphy);
10417
10418 memset(ahvif, 0, sizeof(*ahvif));
10419
10420 ahvif->ah = ah;
10421 ahvif->vif = vif;
10422 arvif = &ahvif->deflink;
10423
10424 ath12k_mac_init_arvif(ahvif, arvif, -1);
10425
10426 /* Allocate Default Queue now and reassign during actual vdev create */
10427 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE;
10428 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10429 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE;
10430
10431 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
10432
10433 ath12k_mac_determine_vdev_type(vif, ahvif);
10434
10435 for_each_ar(ah, ar, i) {
10436 if (!ath12k_wmi_supports_6ghz_cc_ext(ar))
10437 continue;
10438
10439 ab = ar->ab;
10440 reg_info = ab->reg_info[ar->pdev_idx];
10441 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n");
10442 ah->regd_updated = false;
10443 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type,
10444 IEEE80211_REG_UNSET_AP);
10445 break;
10446 }
10447
10448 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver
10449 * will not know if this interface is an ML vif at this point.
10450 */
10451 return 0;
10452 }
10453
ath12k_mac_vif_unref(struct ath12k_dp * dp,struct ieee80211_vif * vif)10454 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
10455 {
10456 struct ath12k_tx_desc_info *tx_desc_info;
10457 struct ath12k_skb_cb *skb_cb;
10458 struct sk_buff *skb;
10459 int i;
10460
10461 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
10462 spin_lock_bh(&dp->tx_desc_lock[i]);
10463
10464 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
10465 list) {
10466 skb = tx_desc_info->skb;
10467 if (!skb)
10468 continue;
10469
10470 skb_cb = ATH12K_SKB_CB(skb);
10471 if (skb_cb->vif == vif)
10472 skb_cb->vif = NULL;
10473 }
10474
10475 spin_unlock_bh(&dp->tx_desc_lock[i]);
10476 }
10477 }
10478
ath12k_mac_vdev_delete(struct ath12k * ar,struct ath12k_link_vif * arvif)10479 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
10480 {
10481 struct ath12k_vif *ahvif = arvif->ahvif;
10482 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10483 struct ath12k_base *ab = ar->ab;
10484 unsigned long time_left;
10485 int ret;
10486
10487 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10488
10489 reinit_completion(&ar->vdev_delete_done);
10490
10491 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10492 if (ret) {
10493 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
10494 arvif->vdev_id, ret);
10495 goto err_vdev_del;
10496 }
10497
10498 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
10499 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
10500 if (time_left == 0) {
10501 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
10502 goto err_vdev_del;
10503 }
10504
10505 ab->free_vdev_map |= 1LL << arvif->vdev_id;
10506 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10507 ar->num_created_vdevs--;
10508
10509 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10510 ar->monitor_vdev_id = -1;
10511 ar->monitor_vdev_created = false;
10512 }
10513
10514 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
10515 vif->addr, arvif->vdev_id);
10516
10517 err_vdev_del:
10518 spin_lock_bh(&ar->data_lock);
10519 list_del(&arvif->list);
10520 spin_unlock_bh(&ar->data_lock);
10521
10522 ath12k_peer_cleanup(ar, arvif->vdev_id);
10523 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10524
10525 idr_for_each(&ar->txmgmt_idr,
10526 ath12k_mac_vif_txmgmt_idr_remove, vif);
10527
10528 ath12k_mac_vif_unref(&ab->dp, vif);
10529 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
10530
10531 /* Recalc txpower for remaining vdev */
10532 ath12k_mac_txpower_recalc(ar);
10533
10534 /* TODO: recal traffic pause state based on the available vdevs */
10535 arvif->is_created = false;
10536 arvif->ar = NULL;
10537
10538 return ret;
10539 }
10540
ath12k_mac_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10541 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
10542 struct ieee80211_vif *vif)
10543 {
10544 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10545 struct ath12k_link_vif *arvif;
10546 struct ath12k *ar;
10547 u8 link_id;
10548
10549 lockdep_assert_wiphy(hw->wiphy);
10550
10551 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) {
10552 /* if we cached some config but never received assign chanctx,
10553 * free the allocated cache.
10554 */
10555 ath12k_ahvif_put_link_cache(ahvif, link_id);
10556 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
10557 if (!arvif || !arvif->is_created)
10558 continue;
10559
10560 ar = arvif->ar;
10561
10562 /* Scan abortion is in progress since before this, cancel_hw_scan()
10563 * is expected to be executed. Since link is anyways going to be removed
10564 * now, just cancel the worker and send the scan aborted to user space
10565 */
10566 if (ar->scan.arvif == arvif) {
10567 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
10568
10569 spin_lock_bh(&ar->data_lock);
10570 ar->scan.arvif = NULL;
10571 if (!ar->scan.is_roc) {
10572 struct cfg80211_scan_info info = {
10573 .aborted = true,
10574 };
10575
10576 ath12k_mac_scan_send_complete(ar, &info);
10577 }
10578
10579 ar->scan.state = ATH12K_SCAN_IDLE;
10580 ar->scan_channel = NULL;
10581 ar->scan.roc_freq = 0;
10582 spin_unlock_bh(&ar->data_lock);
10583 }
10584
10585 ath12k_mac_remove_link_interface(hw, arvif);
10586 ath12k_mac_unassign_link_vif(arvif);
10587 }
10588 }
10589
10590 /* FIXME: Has to be verified. */
10591 #define SUPPORTED_FILTERS \
10592 (FIF_ALLMULTI | \
10593 FIF_CONTROL | \
10594 FIF_PSPOLL | \
10595 FIF_OTHER_BSS | \
10596 FIF_BCN_PRBRESP_PROMISC | \
10597 FIF_PROBE_REQ | \
10598 FIF_FCSFAIL)
10599
ath12k_mac_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)10600 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
10601 unsigned int changed_flags,
10602 unsigned int *total_flags,
10603 u64 multicast)
10604 {
10605 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10606 struct ath12k *ar;
10607
10608 lockdep_assert_wiphy(hw->wiphy);
10609
10610 ar = ath12k_ah_to_ar(ah, 0);
10611
10612 *total_flags &= SUPPORTED_FILTERS;
10613 ar->filter_flags = *total_flags;
10614 }
10615
ath12k_mac_op_get_antenna(struct ieee80211_hw * hw,int radio_idx,u32 * tx_ant,u32 * rx_ant)10616 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
10617 u32 *tx_ant, u32 *rx_ant)
10618 {
10619 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10620 int antennas_rx = 0, antennas_tx = 0;
10621 struct ath12k *ar;
10622 int i;
10623
10624 lockdep_assert_wiphy(hw->wiphy);
10625
10626 for_each_ar(ah, ar, i) {
10627 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
10628 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
10629 }
10630
10631 *tx_ant = antennas_tx;
10632 *rx_ant = antennas_rx;
10633
10634 return 0;
10635 }
10636
ath12k_mac_op_set_antenna(struct ieee80211_hw * hw,int radio_idx,u32 tx_ant,u32 rx_ant)10637 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
10638 u32 tx_ant, u32 rx_ant)
10639 {
10640 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10641 struct ath12k *ar;
10642 int ret = 0;
10643 int i;
10644
10645 lockdep_assert_wiphy(hw->wiphy);
10646
10647 for_each_ar(ah, ar, i) {
10648 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
10649 if (ret)
10650 break;
10651 }
10652
10653 return ret;
10654 }
10655
ath12k_mac_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params,u8 link_id)10656 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw,
10657 struct ieee80211_vif *vif,
10658 struct ieee80211_ampdu_params *params,
10659 u8 link_id)
10660 {
10661 struct ath12k *ar;
10662 int ret = -EINVAL;
10663
10664 lockdep_assert_wiphy(hw->wiphy);
10665
10666 ar = ath12k_get_ar_by_vif(hw, vif, link_id);
10667 if (!ar)
10668 return -EINVAL;
10669
10670 switch (params->action) {
10671 case IEEE80211_AMPDU_RX_START:
10672 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id);
10673 break;
10674 case IEEE80211_AMPDU_RX_STOP:
10675 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id);
10676 break;
10677 case IEEE80211_AMPDU_TX_START:
10678 case IEEE80211_AMPDU_TX_STOP_CONT:
10679 case IEEE80211_AMPDU_TX_STOP_FLUSH:
10680 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10681 case IEEE80211_AMPDU_TX_OPERATIONAL:
10682 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
10683 * Tx aggregation requests.
10684 */
10685 ret = -EOPNOTSUPP;
10686 break;
10687 }
10688
10689 if (ret)
10690 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n",
10691 params->action, vif->addr, link_id, ret);
10692
10693 return ret;
10694 }
10695
ath12k_mac_op_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)10696 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
10697 struct ieee80211_vif *vif,
10698 struct ieee80211_ampdu_params *params)
10699 {
10700 struct ieee80211_sta *sta = params->sta;
10701 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
10702 unsigned long links_map = ahsta->links_map;
10703 int ret = -EINVAL;
10704 u8 link_id;
10705
10706 lockdep_assert_wiphy(hw->wiphy);
10707
10708 if (WARN_ON(!links_map))
10709 return ret;
10710
10711 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10712 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id);
10713 if (ret)
10714 return ret;
10715 }
10716
10717 return 0;
10718 }
10719
ath12k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10720 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
10721 struct ieee80211_chanctx_conf *ctx)
10722 {
10723 struct ath12k *ar;
10724 struct ath12k_base *ab;
10725
10726 lockdep_assert_wiphy(hw->wiphy);
10727
10728 ar = ath12k_get_ar_by_ctx(hw, ctx);
10729 if (!ar)
10730 return -EINVAL;
10731
10732 ab = ar->ab;
10733
10734 ath12k_dbg(ab, ATH12K_DBG_MAC,
10735 "mac chanctx add freq %u width %d ptr %p\n",
10736 ctx->def.chan->center_freq, ctx->def.width, ctx);
10737
10738 spin_lock_bh(&ar->data_lock);
10739 /* TODO: In case of multiple channel context, populate rx_channel from
10740 * Rx PPDU desc information.
10741 */
10742 ar->rx_channel = ctx->def.chan;
10743 spin_unlock_bh(&ar->data_lock);
10744 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10745
10746 return 0;
10747 }
10748
ath12k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10749 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
10750 struct ieee80211_chanctx_conf *ctx)
10751 {
10752 struct ath12k *ar;
10753 struct ath12k_base *ab;
10754
10755 lockdep_assert_wiphy(hw->wiphy);
10756
10757 ar = ath12k_get_ar_by_ctx(hw, ctx);
10758 if (!ar)
10759 return;
10760
10761 ab = ar->ab;
10762
10763 ath12k_dbg(ab, ATH12K_DBG_MAC,
10764 "mac chanctx remove freq %u width %d ptr %p\n",
10765 ctx->def.chan->center_freq, ctx->def.width, ctx);
10766
10767 spin_lock_bh(&ar->data_lock);
10768 /* TODO: In case of there is one more channel context left, populate
10769 * rx_channel with the channel of that remaining channel context.
10770 */
10771 ar->rx_channel = NULL;
10772 spin_unlock_bh(&ar->data_lock);
10773 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10774 }
10775
10776 static enum wmi_phy_mode
ath12k_mac_check_down_grade_phy_mode(struct ath12k * ar,enum wmi_phy_mode mode,enum nl80211_band band,enum nl80211_iftype type)10777 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
10778 enum wmi_phy_mode mode,
10779 enum nl80211_band band,
10780 enum nl80211_iftype type)
10781 {
10782 struct ieee80211_sta_eht_cap *eht_cap = NULL;
10783 enum wmi_phy_mode down_mode;
10784 int n = ar->mac.sbands[band].n_iftype_data;
10785 int i;
10786 struct ieee80211_sband_iftype_data *data;
10787
10788 if (mode < MODE_11BE_EHT20)
10789 return mode;
10790
10791 data = ar->mac.iftype[band];
10792 for (i = 0; i < n; i++) {
10793 if (data[i].types_mask & BIT(type)) {
10794 eht_cap = &data[i].eht_cap;
10795 break;
10796 }
10797 }
10798
10799 if (eht_cap && eht_cap->has_eht)
10800 return mode;
10801
10802 switch (mode) {
10803 case MODE_11BE_EHT20:
10804 down_mode = MODE_11AX_HE20;
10805 break;
10806 case MODE_11BE_EHT40:
10807 down_mode = MODE_11AX_HE40;
10808 break;
10809 case MODE_11BE_EHT80:
10810 down_mode = MODE_11AX_HE80;
10811 break;
10812 case MODE_11BE_EHT80_80:
10813 down_mode = MODE_11AX_HE80_80;
10814 break;
10815 case MODE_11BE_EHT160:
10816 case MODE_11BE_EHT160_160:
10817 case MODE_11BE_EHT320:
10818 down_mode = MODE_11AX_HE160;
10819 break;
10820 case MODE_11BE_EHT20_2G:
10821 down_mode = MODE_11AX_HE20_2G;
10822 break;
10823 case MODE_11BE_EHT40_2G:
10824 down_mode = MODE_11AX_HE40_2G;
10825 break;
10826 default:
10827 down_mode = mode;
10828 break;
10829 }
10830
10831 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10832 "mac vdev start phymode %s downgrade to %s\n",
10833 ath12k_mac_phymode_str(mode),
10834 ath12k_mac_phymode_str(down_mode));
10835
10836 return down_mode;
10837 }
10838
10839 static void
ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif * arvif,struct wmi_ml_arg * ml_arg)10840 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif,
10841 struct wmi_ml_arg *ml_arg)
10842 {
10843 struct ath12k_vif *ahvif = arvif->ahvif;
10844 struct wmi_ml_partner_info *partner_info;
10845 struct ieee80211_bss_conf *link_conf;
10846 struct ath12k_link_vif *arvif_p;
10847 unsigned long links;
10848 u8 link_id;
10849
10850 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10851
10852 if (!ath12k_mac_is_ml_arvif(arvif))
10853 return;
10854
10855 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS)
10856 return;
10857
10858 ml_arg->enabled = true;
10859
10860 /* Driver always add a new link via VDEV START, FW takes
10861 * care of internally adding this link to existing
10862 * link vdevs which are advertised as partners below
10863 */
10864 ml_arg->link_add = true;
10865
10866 ml_arg->assoc_link = arvif->is_sta_assoc_link;
10867
10868 partner_info = ml_arg->partner_info;
10869
10870 links = ahvif->links_map;
10871 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
10872 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10873
10874 if (WARN_ON(!arvif_p))
10875 continue;
10876
10877 if (arvif == arvif_p)
10878 continue;
10879
10880 if (!arvif_p->is_created)
10881 continue;
10882
10883 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10884 ahvif->vif->link_conf[arvif_p->link_id]);
10885
10886 if (!link_conf)
10887 continue;
10888
10889 partner_info->vdev_id = arvif_p->vdev_id;
10890 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id;
10891 ether_addr_copy(partner_info->addr, link_conf->addr);
10892 ml_arg->num_partner_links++;
10893 partner_info++;
10894 }
10895 }
10896
10897 static int
ath12k_mac_vdev_start_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx,bool restart)10898 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif,
10899 struct ieee80211_chanctx_conf *ctx,
10900 bool restart)
10901 {
10902 struct ath12k *ar = arvif->ar;
10903 struct ath12k_base *ab = ar->ab;
10904 struct wmi_vdev_start_req_arg arg = {};
10905 const struct cfg80211_chan_def *chandef = &ctx->def;
10906 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10907 struct ath12k_vif *ahvif = arvif->ahvif;
10908 struct ieee80211_bss_conf *link_conf;
10909 unsigned int dfs_cac_time;
10910 int ret;
10911
10912 lockdep_assert_wiphy(hw->wiphy);
10913
10914 link_conf = ath12k_mac_get_link_bss_conf(arvif);
10915 if (!link_conf) {
10916 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n",
10917 ahvif->vif->addr, arvif->link_id);
10918 return -ENOLINK;
10919 }
10920
10921 reinit_completion(&ar->vdev_setup_done);
10922
10923 arg.vdev_id = arvif->vdev_id;
10924 arg.dtim_period = arvif->dtim_period;
10925 arg.bcn_intval = arvif->beacon_interval;
10926 arg.punct_bitmap = ~arvif->punct_bitmap;
10927
10928 arg.freq = chandef->chan->center_freq;
10929 arg.band_center_freq1 = chandef->center_freq1;
10930 arg.band_center_freq2 = chandef->center_freq2;
10931 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
10932
10933 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
10934 chandef->chan->band,
10935 ahvif->vif->type);
10936 arg.min_power = 0;
10937 arg.max_power = chandef->chan->max_power;
10938 arg.max_reg_power = chandef->chan->max_reg_power;
10939 arg.max_antenna_gain = chandef->chan->max_antenna_gain;
10940
10941 arg.pref_tx_streams = ar->num_tx_chains;
10942 arg.pref_rx_streams = ar->num_rx_chains;
10943
10944 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
10945 arg.mbssid_tx_vdev_id = 0;
10946 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
10947 ar->ab->wmi_ab.svc_map)) {
10948 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
10949 &arg.mbssid_flags,
10950 &arg.mbssid_tx_vdev_id);
10951 if (ret)
10952 return ret;
10953 }
10954
10955 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10956 arg.ssid = ahvif->u.ap.ssid;
10957 arg.ssid_len = ahvif->u.ap.ssid_len;
10958 arg.hidden_ssid = ahvif->u.ap.hidden_ssid;
10959
10960 /* For now allow DFS for AP mode */
10961 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
10962
10963 arg.freq2_radar = ctx->radar_enabled;
10964
10965 arg.passive = arg.chan_radar;
10966
10967 spin_lock_bh(&ab->base_lock);
10968 arg.regdomain = ar->ab->dfs_region;
10969 spin_unlock_bh(&ab->base_lock);
10970
10971 /* TODO: Notify if secondary 80Mhz also needs radar detection */
10972 }
10973
10974 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
10975
10976 if (!restart)
10977 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml);
10978
10979 ath12k_dbg(ab, ATH12K_DBG_MAC,
10980 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
10981 arg.vdev_id, arg.freq,
10982 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
10983
10984 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
10985 if (ret) {
10986 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
10987 restart ? "restart" : "start", arg.vdev_id);
10988 return ret;
10989 }
10990
10991 ret = ath12k_mac_vdev_setup_sync(ar);
10992 if (ret) {
10993 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
10994 arg.vdev_id, restart ? "restart" : "start", ret);
10995 return ret;
10996 }
10997
10998 /* TODO: For now we only set TPC power here. However when
10999 * channel changes, say CSA, it should be updated again.
11000 */
11001 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) {
11002 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx);
11003 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
11004 &arvif->reg_tpc_info);
11005 }
11006
11007 ar->num_started_vdevs++;
11008 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
11009 ahvif->vif->addr, arvif->vdev_id);
11010
11011 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS
11012 * state as NL80211_DFS_USABLE which indicates CAC needs to be
11013 * done before channel usage. This flag is used to drop rx packets.
11014 * during CAC.
11015 */
11016 /* TODO: Set the flag for other interface types as required */
11017 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
11018 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) {
11019 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
11020 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef);
11021
11022 ath12k_dbg(ab, ATH12K_DBG_MAC,
11023 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
11024 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id);
11025 }
11026
11027 ret = ath12k_mac_set_txbf_conf(arvif);
11028 if (ret)
11029 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
11030 arvif->vdev_id, ret);
11031
11032 return 0;
11033 }
11034
ath12k_mac_vdev_start(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11035 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif,
11036 struct ieee80211_chanctx_conf *ctx)
11037 {
11038 return ath12k_mac_vdev_start_restart(arvif, ctx, false);
11039 }
11040
ath12k_mac_vdev_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11041 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif,
11042 struct ieee80211_chanctx_conf *ctx)
11043 {
11044 return ath12k_mac_vdev_start_restart(arvif, ctx, true);
11045 }
11046
11047 struct ath12k_mac_change_chanctx_arg {
11048 struct ieee80211_chanctx_conf *ctx;
11049 struct ieee80211_vif_chanctx_switch *vifs;
11050 int n_vifs;
11051 int next_vif;
11052 struct ath12k *ar;
11053 };
11054
11055 static void
ath12k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)11056 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
11057 struct ieee80211_vif *vif)
11058 {
11059 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11060 struct ath12k_mac_change_chanctx_arg *arg = data;
11061 struct ieee80211_bss_conf *link_conf;
11062 struct ath12k_link_vif *arvif;
11063 unsigned long links_map;
11064 u8 link_id;
11065
11066 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
11067
11068 links_map = ahvif->links_map;
11069 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
11070 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
11071 if (WARN_ON(!arvif))
11072 continue;
11073
11074 if (!arvif->is_created || arvif->ar != arg->ar)
11075 continue;
11076
11077 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
11078 vif->link_conf[link_id]);
11079 if (WARN_ON(!link_conf))
11080 continue;
11081
11082 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx)
11083 continue;
11084
11085 arg->n_vifs++;
11086 }
11087 }
11088
11089 static void
ath12k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)11090 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
11091 struct ieee80211_vif *vif)
11092 {
11093 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11094 struct ath12k_mac_change_chanctx_arg *arg = data;
11095 struct ieee80211_bss_conf *link_conf;
11096 struct ieee80211_chanctx_conf *ctx;
11097 struct ath12k_link_vif *arvif;
11098 unsigned long links_map;
11099 u8 link_id;
11100
11101 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
11102
11103 links_map = ahvif->links_map;
11104 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
11105 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
11106 if (WARN_ON(!arvif))
11107 continue;
11108
11109 if (!arvif->is_created || arvif->ar != arg->ar)
11110 continue;
11111
11112 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
11113 vif->link_conf[arvif->link_id]);
11114 if (WARN_ON(!link_conf))
11115 continue;
11116
11117 ctx = rcu_access_pointer(link_conf->chanctx_conf);
11118 if (ctx != arg->ctx)
11119 continue;
11120
11121 if (WARN_ON(arg->next_vif == arg->n_vifs))
11122 return;
11123
11124 arg->vifs[arg->next_vif].vif = vif;
11125 arg->vifs[arg->next_vif].old_ctx = ctx;
11126 arg->vifs[arg->next_vif].new_ctx = ctx;
11127 arg->vifs[arg->next_vif].link_conf = link_conf;
11128 arg->next_vif++;
11129 }
11130 }
11131
ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)11132 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
11133 {
11134 switch (width) {
11135 case NL80211_CHAN_WIDTH_20:
11136 return WMI_CHAN_WIDTH_20;
11137 case NL80211_CHAN_WIDTH_40:
11138 return WMI_CHAN_WIDTH_40;
11139 case NL80211_CHAN_WIDTH_80:
11140 return WMI_CHAN_WIDTH_80;
11141 case NL80211_CHAN_WIDTH_160:
11142 return WMI_CHAN_WIDTH_160;
11143 case NL80211_CHAN_WIDTH_80P80:
11144 return WMI_CHAN_WIDTH_80P80;
11145 case NL80211_CHAN_WIDTH_5:
11146 return WMI_CHAN_WIDTH_5;
11147 case NL80211_CHAN_WIDTH_10:
11148 return WMI_CHAN_WIDTH_10;
11149 case NL80211_CHAN_WIDTH_320:
11150 return WMI_CHAN_WIDTH_320;
11151 default:
11152 WARN_ON(1);
11153 return WMI_CHAN_WIDTH_20;
11154 }
11155 }
11156
ath12k_mac_update_peer_puncturing_width(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def def)11157 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
11158 struct ath12k_link_vif *arvif,
11159 struct cfg80211_chan_def def)
11160 {
11161 u32 param_id, param_value;
11162 int ret;
11163
11164 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
11165 return 0;
11166
11167 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
11168 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
11169 u32_encode_bits((~def.punctured),
11170 WMI_PEER_PUNCTURE_BITMAP);
11171
11172 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11173 "punctured bitmap %02x width %d vdev %d\n",
11174 def.punctured, def.width, arvif->vdev_id);
11175
11176 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
11177 arvif->vdev_id, param_id,
11178 param_value);
11179
11180 return ret;
11181 }
11182
11183 static void
ath12k_mac_update_vif_chan(struct ath12k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)11184 ath12k_mac_update_vif_chan(struct ath12k *ar,
11185 struct ieee80211_vif_chanctx_switch *vifs,
11186 int n_vifs)
11187 {
11188 struct ath12k_wmi_vdev_up_params params = {};
11189 struct ieee80211_bss_conf *link_conf;
11190 struct ath12k_base *ab = ar->ab;
11191 struct ath12k_link_vif *arvif;
11192 struct ieee80211_vif *vif;
11193 struct ath12k_vif *ahvif;
11194 u8 link_id;
11195 int ret;
11196 int i;
11197 bool monitor_vif = false;
11198
11199 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11200
11201 for (i = 0; i < n_vifs; i++) {
11202 vif = vifs[i].vif;
11203 ahvif = ath12k_vif_to_ahvif(vif);
11204 link_conf = vifs[i].link_conf;
11205 link_id = link_conf->link_id;
11206 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
11207 ahvif->link[link_id]);
11208
11209 if (vif->type == NL80211_IFTYPE_MONITOR) {
11210 monitor_vif = true;
11211 continue;
11212 }
11213
11214 ath12k_dbg(ab, ATH12K_DBG_MAC,
11215 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
11216 arvif->vdev_id,
11217 vifs[i].old_ctx->def.chan->center_freq,
11218 vifs[i].new_ctx->def.chan->center_freq,
11219 vifs[i].old_ctx->def.width,
11220 vifs[i].new_ctx->def.width);
11221
11222 if (WARN_ON(!arvif->is_started))
11223 continue;
11224
11225 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
11226
11227 /* Firmware expect vdev_restart only if vdev is up.
11228 * If vdev is down then it expect vdev_stop->vdev_start.
11229 */
11230 if (arvif->is_up) {
11231 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
11232 if (ret) {
11233 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
11234 arvif->vdev_id, ret);
11235 continue;
11236 }
11237 } else {
11238 ret = ath12k_mac_vdev_stop(arvif);
11239 if (ret) {
11240 ath12k_warn(ab, "failed to stop vdev %d: %d\n",
11241 arvif->vdev_id, ret);
11242 continue;
11243 }
11244
11245 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
11246 if (ret)
11247 ath12k_warn(ab, "failed to start vdev %d: %d\n",
11248 arvif->vdev_id, ret);
11249 continue;
11250 }
11251
11252 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
11253 vifs[i].new_ctx->def);
11254 if (ret) {
11255 ath12k_warn(ar->ab,
11256 "failed to update puncturing bitmap %02x and width %d: %d\n",
11257 vifs[i].new_ctx->def.punctured,
11258 vifs[i].new_ctx->def.width, ret);
11259 continue;
11260 }
11261
11262 /* Defer VDEV bring-up during CSA to avoid installing stale
11263 * beacon templates. The beacon content is updated only
11264 * after CSA finalize, so we mark CSA in progress and skip
11265 * VDEV_UP for now. It will be handled later in
11266 * bss_info_changed().
11267 */
11268 if (link_conf->csa_active &&
11269 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
11270 arvif->is_csa_in_progress = true;
11271 continue;
11272 }
11273
11274 ret = ath12k_mac_setup_bcn_tmpl(arvif);
11275 if (ret)
11276 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
11277 ret);
11278
11279 memset(¶ms, 0, sizeof(params));
11280 params.vdev_id = arvif->vdev_id;
11281 params.aid = ahvif->aid;
11282 params.bssid = arvif->bssid;
11283 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
11284 if (params.tx_bssid) {
11285 params.nontx_profile_idx = link_conf->bssid_index;
11286 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator;
11287 }
11288 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
11289 if (ret) {
11290 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
11291 arvif->vdev_id, ret);
11292 continue;
11293 }
11294 }
11295
11296 /* Restart the internal monitor vdev on new channel */
11297 if (!monitor_vif && ar->monitor_vdev_created) {
11298 if (!ath12k_mac_monitor_stop(ar))
11299 ath12k_mac_monitor_start(ar);
11300 }
11301 }
11302
11303 static void
ath12k_mac_update_active_vif_chan(struct ath12k * ar,struct ieee80211_chanctx_conf * ctx)11304 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
11305 struct ieee80211_chanctx_conf *ctx)
11306 {
11307 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
11308 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
11309
11310 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11311
11312 ieee80211_iterate_active_interfaces_atomic(hw,
11313 IEEE80211_IFACE_ITER_NORMAL,
11314 ath12k_mac_change_chanctx_cnt_iter,
11315 &arg);
11316 if (arg.n_vifs == 0)
11317 return;
11318
11319 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
11320 if (!arg.vifs)
11321 return;
11322
11323 ieee80211_iterate_active_interfaces_atomic(hw,
11324 IEEE80211_IFACE_ITER_NORMAL,
11325 ath12k_mac_change_chanctx_fill_iter,
11326 &arg);
11327
11328 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
11329
11330 kfree(arg.vifs);
11331 }
11332
ath12k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)11333 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
11334 struct ieee80211_chanctx_conf *ctx,
11335 u32 changed)
11336 {
11337 struct ath12k *ar;
11338 struct ath12k_base *ab;
11339
11340 lockdep_assert_wiphy(hw->wiphy);
11341
11342 ar = ath12k_get_ar_by_ctx(hw, ctx);
11343 if (!ar)
11344 return;
11345
11346 ab = ar->ab;
11347
11348 ath12k_dbg(ab, ATH12K_DBG_MAC,
11349 "mac chanctx change freq %u width %d ptr %p changed %x\n",
11350 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
11351
11352 /* This shouldn't really happen because channel switching should use
11353 * switch_vif_chanctx().
11354 */
11355 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
11356 return;
11357
11358 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
11359 changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
11360 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
11361 ath12k_mac_update_active_vif_chan(ar, ctx);
11362
11363 /* TODO: Recalc radar detection */
11364 }
11365
ath12k_start_vdev_delay(struct ath12k * ar,struct ath12k_link_vif * arvif)11366 static int ath12k_start_vdev_delay(struct ath12k *ar,
11367 struct ath12k_link_vif *arvif)
11368 {
11369 struct ath12k_base *ab = ar->ab;
11370 struct ath12k_vif *ahvif = arvif->ahvif;
11371 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
11372 struct ieee80211_chanctx_conf *chanctx;
11373 struct ieee80211_bss_conf *link_conf;
11374 int ret;
11375
11376 if (WARN_ON(arvif->is_started))
11377 return -EBUSY;
11378
11379 link_conf = ath12k_mac_get_link_bss_conf(arvif);
11380 if (!link_conf) {
11381 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id);
11382 return -EINVAL;
11383 }
11384
11385 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy,
11386 link_conf->chanctx_conf);
11387 ret = ath12k_mac_vdev_start(arvif, chanctx);
11388 if (ret) {
11389 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11390 arvif->vdev_id, vif->addr,
11391 chanctx->def.chan->center_freq, ret);
11392 return ret;
11393 }
11394
11395 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11396 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
11397 if (ret) {
11398 ath12k_warn(ab, "failed put monitor up: %d\n", ret);
11399 return ret;
11400 }
11401 }
11402
11403 arvif->is_started = true;
11404
11405 /* TODO: Setup ps and cts/rts protection */
11406 return 0;
11407 }
11408
ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def * chan_def)11409 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
11410 {
11411 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
11412 switch (chan_def->width) {
11413 case NL80211_CHAN_WIDTH_20:
11414 return 1;
11415 case NL80211_CHAN_WIDTH_40:
11416 return 2;
11417 case NL80211_CHAN_WIDTH_80:
11418 return 4;
11419 case NL80211_CHAN_WIDTH_160:
11420 return 8;
11421 case NL80211_CHAN_WIDTH_320:
11422 return 16;
11423 default:
11424 return 1;
11425 }
11426 } else {
11427 switch (chan_def->width) {
11428 case NL80211_CHAN_WIDTH_20:
11429 return 1;
11430 case NL80211_CHAN_WIDTH_40:
11431 return 2;
11432 case NL80211_CHAN_WIDTH_80:
11433 return 3;
11434 case NL80211_CHAN_WIDTH_160:
11435 return 4;
11436 case NL80211_CHAN_WIDTH_320:
11437 return 5;
11438 default:
11439 return 1;
11440 }
11441 }
11442 }
11443
ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def * chan_def)11444 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
11445 {
11446 u16 diff_seq;
11447
11448 /* It is to get the lowest channel number's center frequency of the chan.
11449 * For example,
11450 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
11451 * with center frequency 5955, its diff is 5965 - 5955 = 10.
11452 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
11453 * with center frequency 5955, its diff is 5985 - 5955 = 30.
11454 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
11455 * with center frequency 5955, its diff is 6025 - 5955 = 70.
11456 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1
11457 * with center frequency 5955, its diff is 6105 - 5955 = 70.
11458 */
11459 switch (chan_def->width) {
11460 case NL80211_CHAN_WIDTH_320:
11461 diff_seq = 150;
11462 break;
11463 case NL80211_CHAN_WIDTH_160:
11464 diff_seq = 70;
11465 break;
11466 case NL80211_CHAN_WIDTH_80:
11467 diff_seq = 30;
11468 break;
11469 case NL80211_CHAN_WIDTH_40:
11470 diff_seq = 10;
11471 break;
11472 default:
11473 diff_seq = 0;
11474 }
11475
11476 return chan_def->center_freq1 - diff_seq;
11477 }
11478
ath12k_mac_get_seg_freq(struct cfg80211_chan_def * chan_def,u16 start_seq,u8 seq)11479 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
11480 u16 start_seq, u8 seq)
11481 {
11482 u16 seg_seq;
11483
11484 /* It is to get the center frequency of the specific bandwidth.
11485 * start_seq means the lowest channel number's center frequency.
11486 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz.
11487 * For example,
11488 * lowest channel is 1, its center frequency 5955,
11489 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
11490 * lowest channel is 1, its center frequency 5955,
11491 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
11492 * lowest channel is 1, its center frequency 5955,
11493 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
11494 * lowest channel is 1, its center frequency 5955,
11495 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
11496 */
11497 seg_seq = 10 * (BIT(seq) - 1);
11498 return seg_seq + start_seq;
11499 }
11500
ath12k_mac_get_psd_channel(struct ath12k * ar,u16 step_freq,u16 * start_freq,u16 * center_freq,u8 i,struct ieee80211_channel ** temp_chan,s8 * tx_power)11501 static void ath12k_mac_get_psd_channel(struct ath12k *ar,
11502 u16 step_freq,
11503 u16 *start_freq,
11504 u16 *center_freq,
11505 u8 i,
11506 struct ieee80211_channel **temp_chan,
11507 s8 *tx_power)
11508 {
11509 /* It is to get the center frequency for each 20 MHz.
11510 * For example, if the chan is 160 MHz and center frequency is 6025,
11511 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
11512 * channel number 1's center frequency is 5955, it is parameter start_freq.
11513 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
11514 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
11515 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
11516 * the gap is 20 for each channel, parameter step_freq means the gap.
11517 * after get the center frequency of each channel, it is easy to find the
11518 * struct ieee80211_channel of it and get the max_reg_power.
11519 */
11520 *center_freq = *start_freq + i * step_freq;
11521 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11522 *tx_power = (*temp_chan)->max_reg_power;
11523 }
11524
ath12k_mac_get_eirp_power(struct ath12k * ar,u16 * start_freq,u16 * center_freq,u8 i,struct ieee80211_channel ** temp_chan,struct cfg80211_chan_def * def,s8 * tx_power)11525 static void ath12k_mac_get_eirp_power(struct ath12k *ar,
11526 u16 *start_freq,
11527 u16 *center_freq,
11528 u8 i,
11529 struct ieee80211_channel **temp_chan,
11530 struct cfg80211_chan_def *def,
11531 s8 *tx_power)
11532 {
11533 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
11534 * 160 MHz bandwidth, and then plus 10 to the center frequency,
11535 * it is the center frequency of a channel number.
11536 * For example, when configured channel number is 1.
11537 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
11538 * then it is channel number 5.
11539 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
11540 * then it is channel number 9.
11541 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
11542 * then it is channel number 17.
11543 * after get the center frequency of each channel, it is easy to find the
11544 * struct ieee80211_channel of it and get the max_reg_power.
11545 */
11546 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i);
11547
11548 /* For the 20 MHz, its center frequency is same with same channel */
11549 if (i != 0)
11550 *center_freq += 10;
11551
11552 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11553 *tx_power = (*temp_chan)->max_reg_power;
11554 }
11555
ath12k_mac_fill_reg_tpc_info(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11556 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
11557 struct ath12k_link_vif *arvif,
11558 struct ieee80211_chanctx_conf *ctx)
11559 {
11560 struct ath12k_base *ab = ar->ab;
11561 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
11562 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11563 struct ieee80211_channel *chan, *temp_chan;
11564 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
11565 bool is_psd_power = false, is_tpe_present = false;
11566 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], psd_power, tx_power;
11567 s8 eirp_power = 0;
11568 struct ath12k_vif *ahvif = arvif->ahvif;
11569 u16 start_freq, center_freq;
11570 u8 reg_6ghz_power_mode;
11571
11572 chan = ctx->def.chan;
11573 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def);
11574 pwr_reduction = bss_conf->pwr_reduction;
11575
11576 if (arvif->reg_tpc_info.num_pwr_levels) {
11577 is_tpe_present = true;
11578 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
11579 } else {
11580 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def);
11581 }
11582
11583 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
11584 /* STA received TPE IE*/
11585 if (is_tpe_present) {
11586 /* local power is PSD power*/
11587 if (chan->flags & IEEE80211_CHAN_PSD) {
11588 /* Connecting AP is psd power */
11589 if (reg_tpc_info->is_psd_power) {
11590 is_psd_power = true;
11591 ath12k_mac_get_psd_channel(ar, 20,
11592 &start_freq,
11593 ¢er_freq,
11594 pwr_lvl_idx,
11595 &temp_chan,
11596 &tx_power);
11597 psd_power = temp_chan->psd;
11598 eirp_power = tx_power;
11599 max_tx_power[pwr_lvl_idx] =
11600 min_t(s8,
11601 psd_power,
11602 reg_tpc_info->tpe[pwr_lvl_idx]);
11603 /* Connecting AP is not psd power */
11604 } else {
11605 ath12k_mac_get_eirp_power(ar,
11606 &start_freq,
11607 ¢er_freq,
11608 pwr_lvl_idx,
11609 &temp_chan,
11610 &ctx->def,
11611 &tx_power);
11612 psd_power = temp_chan->psd;
11613 /* convert psd power to EIRP power based
11614 * on channel width
11615 */
11616 tx_power =
11617 min_t(s8, tx_power,
11618 psd_power + 13 + pwr_lvl_idx * 3);
11619 max_tx_power[pwr_lvl_idx] =
11620 min_t(s8,
11621 tx_power,
11622 reg_tpc_info->tpe[pwr_lvl_idx]);
11623 }
11624 /* local power is not PSD power */
11625 } else {
11626 /* Connecting AP is psd power */
11627 if (reg_tpc_info->is_psd_power) {
11628 is_psd_power = true;
11629 ath12k_mac_get_psd_channel(ar, 20,
11630 &start_freq,
11631 ¢er_freq,
11632 pwr_lvl_idx,
11633 &temp_chan,
11634 &tx_power);
11635 eirp_power = tx_power;
11636 max_tx_power[pwr_lvl_idx] =
11637 reg_tpc_info->tpe[pwr_lvl_idx];
11638 /* Connecting AP is not psd power */
11639 } else {
11640 ath12k_mac_get_eirp_power(ar,
11641 &start_freq,
11642 ¢er_freq,
11643 pwr_lvl_idx,
11644 &temp_chan,
11645 &ctx->def,
11646 &tx_power);
11647 max_tx_power[pwr_lvl_idx] =
11648 min_t(s8,
11649 tx_power,
11650 reg_tpc_info->tpe[pwr_lvl_idx]);
11651 }
11652 }
11653 /* STA not received TPE IE */
11654 } else {
11655 /* local power is PSD power*/
11656 if (chan->flags & IEEE80211_CHAN_PSD) {
11657 is_psd_power = true;
11658 ath12k_mac_get_psd_channel(ar, 20,
11659 &start_freq,
11660 ¢er_freq,
11661 pwr_lvl_idx,
11662 &temp_chan,
11663 &tx_power);
11664 psd_power = temp_chan->psd;
11665 eirp_power = tx_power;
11666 max_tx_power[pwr_lvl_idx] = psd_power;
11667 } else {
11668 ath12k_mac_get_eirp_power(ar,
11669 &start_freq,
11670 ¢er_freq,
11671 pwr_lvl_idx,
11672 &temp_chan,
11673 &ctx->def,
11674 &tx_power);
11675 max_tx_power[pwr_lvl_idx] = tx_power;
11676 }
11677 }
11678
11679 if (is_psd_power) {
11680 /* If AP local power constraint is present */
11681 if (pwr_reduction)
11682 eirp_power = eirp_power - pwr_reduction;
11683
11684 /* If firmware updated max tx power is non zero, then take
11685 * the min of firmware updated ap tx power
11686 * and max power derived from above mentioned parameters.
11687 */
11688 ath12k_dbg(ab, ATH12K_DBG_MAC,
11689 "eirp power : %d firmware report power : %d\n",
11690 eirp_power, ar->max_allowed_tx_power);
11691 /* Firmware reports lower max_allowed_tx_power during vdev
11692 * start response. In case of 6 GHz, firmware is not aware
11693 * of EIRP power unless driver sets EIRP power through WMI
11694 * TPC command. So radio which does not support idle power
11695 * save can set maximum calculated EIRP power directly to
11696 * firmware through TPC command without min comparison with
11697 * vdev start response's max_allowed_tx_power.
11698 */
11699 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11700 eirp_power = min_t(s8,
11701 eirp_power,
11702 ar->max_allowed_tx_power);
11703 } else {
11704 /* If AP local power constraint is present */
11705 if (pwr_reduction)
11706 max_tx_power[pwr_lvl_idx] =
11707 max_tx_power[pwr_lvl_idx] - pwr_reduction;
11708 /* If firmware updated max tx power is non zero, then take
11709 * the min of firmware updated ap tx power
11710 * and max power derived from above mentioned parameters.
11711 */
11712 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11713 max_tx_power[pwr_lvl_idx] =
11714 min_t(s8,
11715 max_tx_power[pwr_lvl_idx],
11716 ar->max_allowed_tx_power);
11717 }
11718 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
11719 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
11720 max_tx_power[pwr_lvl_idx];
11721 }
11722
11723 reg_tpc_info->num_pwr_levels = num_pwr_levels;
11724 reg_tpc_info->is_psd_power = is_psd_power;
11725 reg_tpc_info->eirp_power = eirp_power;
11726 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11727 reg_6ghz_power_mode = bss_conf->power_type;
11728 else
11729 /* For now, LPI is the only supported AP power mode */
11730 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP;
11731
11732 reg_tpc_info->ap_power_type =
11733 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode);
11734 }
11735
ath12k_mac_parse_tx_pwr_env(struct ath12k * ar,struct ath12k_link_vif * arvif)11736 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar,
11737 struct ath12k_link_vif *arvif)
11738 {
11739 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11740 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info;
11741 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd;
11742 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd;
11743 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe;
11744 enum wmi_reg_6g_client_type client_type;
11745 struct ath12k_reg_info *reg_info;
11746 struct ath12k_base *ab = ar->ab;
11747 bool psd_valid, non_psd_valid;
11748 int i;
11749
11750 reg_info = ab->reg_info[ar->pdev_idx];
11751 client_type = reg_info->client_type;
11752
11753 local_psd = &tpe->psd_local[client_type];
11754 reg_psd = &tpe->psd_reg_client[client_type];
11755 local_non_psd = &tpe->max_local[client_type];
11756 reg_non_psd = &tpe->max_reg_client[client_type];
11757
11758 psd_valid = local_psd->valid | reg_psd->valid;
11759 non_psd_valid = local_non_psd->valid | reg_non_psd->valid;
11760
11761 if (!psd_valid && !non_psd_valid) {
11762 ath12k_warn(ab,
11763 "no transmit power envelope match client power type %d\n",
11764 client_type);
11765 return;
11766 }
11767
11768 if (psd_valid) {
11769 tpc_info->is_psd_power = true;
11770
11771 tpc_info->num_pwr_levels = max(local_psd->count,
11772 reg_psd->count);
11773 tpc_info->num_pwr_levels =
11774 min3(tpc_info->num_pwr_levels,
11775 IEEE80211_TPE_PSD_ENTRIES_320MHZ,
11776 ATH12K_NUM_PWR_LEVELS);
11777
11778 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11779 tpc_info->tpe[i] = min(local_psd->power[i],
11780 reg_psd->power[i]) / 2;
11781 ath12k_dbg(ab, ATH12K_DBG_MAC,
11782 "TPE PSD power[%d] : %d\n",
11783 i, tpc_info->tpe[i]);
11784 }
11785 } else {
11786 tpc_info->is_psd_power = false;
11787 tpc_info->eirp_power = 0;
11788
11789 tpc_info->num_pwr_levels = max(local_non_psd->count,
11790 reg_non_psd->count);
11791 tpc_info->num_pwr_levels =
11792 min3(tpc_info->num_pwr_levels,
11793 IEEE80211_TPE_EIRP_ENTRIES_320MHZ,
11794 ATH12K_NUM_PWR_LEVELS);
11795
11796 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11797 tpc_info->tpe[i] = min(local_non_psd->power[i],
11798 reg_non_psd->power[i]) / 2;
11799 ath12k_dbg(ab, ATH12K_DBG_MAC,
11800 "non PSD power[%d] : %d\n",
11801 i, tpc_info->tpe[i]);
11802 }
11803 }
11804 }
11805
11806 static int
ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf,struct ieee80211_chanctx_conf * ctx)11807 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
11808 struct ieee80211_vif *vif,
11809 struct ieee80211_bss_conf *link_conf,
11810 struct ieee80211_chanctx_conf *ctx)
11811 {
11812 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11813 struct ath12k *ar;
11814 struct ath12k_base *ab;
11815 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11816 u8 link_id = link_conf->link_id;
11817 struct ath12k_link_vif *arvif;
11818 int ret;
11819
11820 lockdep_assert_wiphy(hw->wiphy);
11821
11822 /* For multi radio wiphy, the vdev was not created during add_interface
11823 * create now since we have a channel ctx now to assign to a specific ar/fw
11824 */
11825 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
11826 if (!arvif) {
11827 WARN_ON(1);
11828 return -ENOMEM;
11829 }
11830
11831 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
11832 if (!ar) {
11833 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started",
11834 vif->addr, link_id);
11835 return -EINVAL;
11836 }
11837
11838 ab = ar->ab;
11839
11840 ath12k_dbg(ab, ATH12K_DBG_MAC,
11841 "mac chanctx assign ptr %p vdev_id %i\n",
11842 ctx, arvif->vdev_id);
11843
11844 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
11845 ctx->def.chan->band == NL80211_BAND_6GHZ &&
11846 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11847 ath12k_mac_parse_tx_pwr_env(ar, arvif);
11848
11849 arvif->punct_bitmap = ctx->def.punctured;
11850
11851 /* for some targets bss peer must be created before vdev_start */
11852 if (ab->hw_params->vdev_start_delay &&
11853 ahvif->vdev_type != WMI_VDEV_TYPE_AP &&
11854 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
11855 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
11856 ret = 0;
11857 goto out;
11858 }
11859
11860 if (WARN_ON(arvif->is_started)) {
11861 ret = -EBUSY;
11862 goto out;
11863 }
11864
11865 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11866 ret = ath12k_mac_monitor_start(ar);
11867 if (ret) {
11868 ath12k_mac_monitor_vdev_delete(ar);
11869 goto out;
11870 }
11871
11872 arvif->is_started = true;
11873 goto out;
11874 }
11875
11876 ret = ath12k_mac_vdev_start(arvif, ctx);
11877 if (ret) {
11878 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11879 arvif->vdev_id, vif->addr,
11880 ctx->def.chan->center_freq, ret);
11881 goto out;
11882 }
11883
11884 arvif->is_started = true;
11885
11886 /* TODO: Setup ps and cts/rts protection */
11887
11888 out:
11889 return ret;
11890 }
11891
11892 static void
ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf,struct ieee80211_chanctx_conf * ctx)11893 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
11894 struct ieee80211_vif *vif,
11895 struct ieee80211_bss_conf *link_conf,
11896 struct ieee80211_chanctx_conf *ctx)
11897 {
11898 struct ath12k *ar;
11899 struct ath12k_base *ab;
11900 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11901 struct ath12k_link_vif *arvif;
11902 u8 link_id = link_conf->link_id;
11903 int ret;
11904
11905 lockdep_assert_wiphy(hw->wiphy);
11906
11907 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11908
11909 /* The vif is expected to be attached to an ar's VDEV.
11910 * We leave the vif/vdev in this function as is
11911 * and not delete the vdev symmetric to assign_vif_chanctx()
11912 * the VDEV will be deleted and unassigned either during
11913 * remove_interface() or when there is a change in channel
11914 * that moves the vif to a new ar
11915 */
11916 if (!arvif || !arvif->is_created)
11917 return;
11918
11919 ar = arvif->ar;
11920 ab = ar->ab;
11921
11922 ath12k_dbg(ab, ATH12K_DBG_MAC,
11923 "mac chanctx unassign ptr %p vdev_id %i\n",
11924 ctx, arvif->vdev_id);
11925
11926 WARN_ON(!arvif->is_started);
11927
11928 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11929 ret = ath12k_mac_monitor_stop(ar);
11930 if (ret)
11931 return;
11932
11933 arvif->is_started = false;
11934 }
11935
11936 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA &&
11937 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
11938 ath12k_bss_disassoc(ar, arvif);
11939 ret = ath12k_mac_vdev_stop(arvif);
11940 if (ret)
11941 ath12k_warn(ab, "failed to stop vdev %i: %d\n",
11942 arvif->vdev_id, ret);
11943 }
11944 arvif->is_started = false;
11945
11946 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
11947 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
11948 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
11949 ar->state_11d != ATH12K_11D_PREPARING) {
11950 reinit_completion(&ar->completed_11d_scan);
11951 ar->state_11d = ATH12K_11D_PREPARING;
11952 }
11953
11954 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) {
11955 ath12k_scan_abort(ar);
11956 ar->scan.arvif = NULL;
11957 }
11958 }
11959
11960 static int
ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode)11961 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
11962 struct ieee80211_vif_chanctx_switch *vifs,
11963 int n_vifs,
11964 enum ieee80211_chanctx_switch_mode mode)
11965 {
11966 struct ath12k *ar;
11967
11968 lockdep_assert_wiphy(hw->wiphy);
11969
11970 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx);
11971 if (!ar)
11972 return -EINVAL;
11973
11974 /* Switching channels across radio is not allowed */
11975 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
11976 return -EINVAL;
11977
11978 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11979 "mac chanctx switch n_vifs %d mode %d\n",
11980 n_vifs, mode);
11981 ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
11982
11983 return 0;
11984 }
11985
11986 static int
ath12k_set_vdev_param_to_all_vifs(struct ath12k * ar,int param,u32 value)11987 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
11988 {
11989 struct ath12k_link_vif *arvif;
11990 int ret = 0;
11991
11992 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11993
11994 list_for_each_entry(arvif, &ar->arvifs, list) {
11995 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
11996 param, arvif->vdev_id, value);
11997
11998 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11999 param, value);
12000 if (ret) {
12001 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
12002 param, arvif->vdev_id, ret);
12003 break;
12004 }
12005 }
12006
12007 return ret;
12008 }
12009
12010 /* mac80211 stores device specific RTS/Fragmentation threshold value,
12011 * this is set interface specific to firmware from ath12k driver
12012 */
ath12k_mac_op_set_rts_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)12013 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
12014 int radio_idx, u32 value)
12015 {
12016 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12017 struct wiphy *wiphy = hw->wiphy;
12018 struct ath12k *ar;
12019 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
12020 int ret = 0, ret_err, i;
12021
12022 lockdep_assert_wiphy(hw->wiphy);
12023
12024 if (radio_idx >= wiphy->n_radio || radio_idx < -1)
12025 return -EINVAL;
12026
12027 if (radio_idx != -1) {
12028 /* Update RTS threshold in specified radio */
12029 ar = ath12k_ah_to_ar(ah, radio_idx);
12030 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
12031 if (ret) {
12032 ath12k_warn(ar->ab,
12033 "failed to set RTS config for all vdevs of pdev %d",
12034 ar->pdev->pdev_id);
12035 return ret;
12036 }
12037
12038 ar->rts_threshold = value;
12039 return 0;
12040 }
12041
12042 /* Radio_index passed is -1, so set RTS threshold for all radios. */
12043 for_each_ar(ah, ar, i) {
12044 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
12045 if (ret) {
12046 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d",
12047 ar->pdev->pdev_id);
12048 break;
12049 }
12050 }
12051 if (!ret) {
12052 /* Setting new RTS threshold for vdevs of all radios passed, so update
12053 * the RTS threshold value for all radios
12054 */
12055 for_each_ar(ah, ar, i)
12056 ar->rts_threshold = value;
12057 return 0;
12058 }
12059
12060 /* RTS threshold config failed, revert to the previous RTS threshold */
12061 for (i = i - 1; i >= 0; i--) {
12062 ar = ath12k_ah_to_ar(ah, i);
12063 ret_err = ath12k_set_vdev_param_to_all_vifs(ar, param_id,
12064 ar->rts_threshold);
12065 if (ret_err)
12066 ath12k_warn(ar->ab,
12067 "failed to restore RTS threshold for all vdevs of pdev %d",
12068 ar->pdev->pdev_id);
12069 }
12070
12071 return ret;
12072 }
12073
ath12k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)12074 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
12075 int radio_idx, u32 value)
12076 {
12077 /* Even though there's a WMI vdev param for fragmentation threshold no
12078 * known firmware actually implements it. Moreover it is not possible to
12079 * rely frame fragmentation to mac80211 because firmware clears the
12080 * "more fragments" bit in frame control making it impossible for remote
12081 * devices to reassemble frames.
12082 *
12083 * Hence implement a dummy callback just to say fragmentation isn't
12084 * supported. This effectively prevents mac80211 from doing frame
12085 * fragmentation in software.
12086 */
12087
12088 lockdep_assert_wiphy(hw->wiphy);
12089
12090 return -EOPNOTSUPP;
12091 }
12092
ath12k_mac_flush(struct ath12k * ar)12093 static int ath12k_mac_flush(struct ath12k *ar)
12094 {
12095 long time_left;
12096 int ret = 0;
12097
12098 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
12099 (atomic_read(&ar->dp.num_tx_pending) == 0),
12100 ATH12K_FLUSH_TIMEOUT);
12101 if (time_left == 0) {
12102 ath12k_warn(ar->ab,
12103 "failed to flush transmit queue, data pkts pending %d\n",
12104 atomic_read(&ar->dp.num_tx_pending));
12105 ret = -ETIMEDOUT;
12106 }
12107
12108 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
12109 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
12110 ATH12K_FLUSH_TIMEOUT);
12111 if (time_left == 0) {
12112 ath12k_warn(ar->ab,
12113 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
12114 atomic_read(&ar->num_pending_mgmt_tx));
12115 ret = -ETIMEDOUT;
12116 }
12117
12118 return ret;
12119 }
12120
ath12k_mac_wait_tx_complete(struct ath12k * ar)12121 int ath12k_mac_wait_tx_complete(struct ath12k *ar)
12122 {
12123 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12124
12125 ath12k_mac_drain_tx(ar);
12126 return ath12k_mac_flush(ar);
12127 }
12128
ath12k_mac_op_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)12129 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
12130 u32 queues, bool drop)
12131 {
12132 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12133 struct ath12k_link_vif *arvif;
12134 struct ath12k_vif *ahvif;
12135 unsigned long links;
12136 struct ath12k *ar;
12137 u8 link_id;
12138 int i;
12139
12140 lockdep_assert_wiphy(hw->wiphy);
12141
12142 if (drop)
12143 return;
12144
12145 /* vif can be NULL when flush() is considered for hw */
12146 if (!vif) {
12147 for_each_ar(ah, ar, i)
12148 ath12k_mac_flush(ar);
12149 return;
12150 }
12151
12152 for_each_ar(ah, ar, i)
12153 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work);
12154
12155 ahvif = ath12k_vif_to_ahvif(vif);
12156 links = ahvif->links_map;
12157 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
12158 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
12159 if (!(arvif && arvif->ar))
12160 continue;
12161
12162 ath12k_mac_flush(arvif->ar);
12163 }
12164 }
12165
12166 static int
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12167 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
12168 enum nl80211_band band,
12169 const struct cfg80211_bitrate_mask *mask)
12170 {
12171 int num_rates = 0;
12172 int i;
12173
12174 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
12175 num_rates += hweight16(mask->control[band].ht_mcs[i]);
12176
12177 return num_rates;
12178 }
12179
12180 static bool
ath12k_mac_has_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12181 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
12182 enum nl80211_band band,
12183 const struct cfg80211_bitrate_mask *mask)
12184 {
12185 int num_rates = 0;
12186
12187 num_rates = hweight32(mask->control[band].legacy);
12188
12189 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
12190 return false;
12191
12192 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
12193 return false;
12194
12195 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask))
12196 return false;
12197
12198 if (ath12k_mac_bitrate_mask_num_eht_rates(ar, band, mask))
12199 return false;
12200
12201 return num_rates == 1;
12202 }
12203
12204 static __le16
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap * he_cap)12205 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
12206 {
12207 if (he_cap->he_cap_elem.phy_cap_info[0] &
12208 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
12209 return he_cap->he_mcs_nss_supp.tx_mcs_160;
12210
12211 return he_cap->he_mcs_nss_supp.tx_mcs_80;
12212 }
12213
12214 static bool
ath12k_mac_bitrate_mask_get_single_nss(struct ath12k * ar,struct ieee80211_vif * vif,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,int * nss)12215 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
12216 struct ieee80211_vif *vif,
12217 enum nl80211_band band,
12218 const struct cfg80211_bitrate_mask *mask,
12219 int *nss)
12220 {
12221 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
12222 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
12223 const struct ieee80211_sband_iftype_data *data;
12224 const struct ieee80211_sta_he_cap *he_cap;
12225 u16 he_mcs_map = 0;
12226 u16 eht_mcs_map = 0;
12227 u8 ht_nss_mask = 0;
12228 u8 vht_nss_mask = 0;
12229 u8 he_nss_mask = 0;
12230 u8 eht_nss_mask = 0;
12231 u8 mcs_nss_len;
12232 int i;
12233
12234 /* No need to consider legacy here. Basic rates are always present
12235 * in bitrate mask
12236 */
12237
12238 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
12239 if (mask->control[band].ht_mcs[i] == 0)
12240 continue;
12241 else if (mask->control[band].ht_mcs[i] ==
12242 sband->ht_cap.mcs.rx_mask[i])
12243 ht_nss_mask |= BIT(i);
12244 else
12245 return false;
12246 }
12247
12248 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
12249 if (mask->control[band].vht_mcs[i] == 0)
12250 continue;
12251 else if (mask->control[band].vht_mcs[i] ==
12252 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
12253 vht_nss_mask |= BIT(i);
12254 else
12255 return false;
12256 }
12257
12258 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif);
12259 if (!he_cap)
12260 return false;
12261
12262 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap));
12263
12264 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
12265 if (mask->control[band].he_mcs[i] == 0)
12266 continue;
12267
12268 if (mask->control[band].he_mcs[i] ==
12269 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i))
12270 he_nss_mask |= BIT(i);
12271 else
12272 return false;
12273 }
12274
12275 data = ieee80211_get_sband_iftype_data(sband, vif->type);
12276
12277 mcs_nss_len = ieee80211_eht_mcs_nss_size(&data->he_cap.he_cap_elem,
12278 &data->eht_cap.eht_cap_elem,
12279 false);
12280 if (mcs_nss_len == 4) {
12281 /* 20 MHz only STA case */
12282 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *eht_mcs_nss =
12283 &data->eht_cap.eht_mcs_nss_supp.only_20mhz;
12284 if (eht_mcs_nss->rx_tx_mcs13_max_nss)
12285 eht_mcs_map = 0x1fff;
12286 else if (eht_mcs_nss->rx_tx_mcs11_max_nss)
12287 eht_mcs_map = 0x07ff;
12288 else if (eht_mcs_nss->rx_tx_mcs9_max_nss)
12289 eht_mcs_map = 0x01ff;
12290 else
12291 eht_mcs_map = 0x007f;
12292 } else {
12293 const struct ieee80211_eht_mcs_nss_supp_bw *eht_mcs_nss;
12294
12295 switch (mcs_nss_len) {
12296 case 9:
12297 eht_mcs_nss = &data->eht_cap.eht_mcs_nss_supp.bw._320;
12298 break;
12299 case 6:
12300 eht_mcs_nss = &data->eht_cap.eht_mcs_nss_supp.bw._160;
12301 break;
12302 case 3:
12303 eht_mcs_nss = &data->eht_cap.eht_mcs_nss_supp.bw._80;
12304 break;
12305 default:
12306 return false;
12307 }
12308
12309 if (eht_mcs_nss->rx_tx_mcs13_max_nss)
12310 eht_mcs_map = 0x1fff;
12311 else if (eht_mcs_nss->rx_tx_mcs11_max_nss)
12312 eht_mcs_map = 0x7ff;
12313 else
12314 eht_mcs_map = 0x1ff;
12315 }
12316
12317 for (i = 0; i < ARRAY_SIZE(mask->control[band].eht_mcs); i++) {
12318 if (mask->control[band].eht_mcs[i] == 0)
12319 continue;
12320
12321 if (mask->control[band].eht_mcs[i] < eht_mcs_map)
12322 eht_nss_mask |= BIT(i);
12323 else
12324 return false;
12325 }
12326
12327 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask ||
12328 ht_nss_mask != eht_nss_mask)
12329 return false;
12330
12331 if (ht_nss_mask == 0)
12332 return false;
12333
12334 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
12335 return false;
12336
12337 *nss = fls(ht_nss_mask);
12338
12339 return true;
12340 }
12341
12342 static int
ath12k_mac_get_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,u32 * rate,u8 * nss)12343 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
12344 enum nl80211_band band,
12345 const struct cfg80211_bitrate_mask *mask,
12346 u32 *rate, u8 *nss)
12347 {
12348 int rate_idx;
12349 u16 bitrate;
12350 u8 preamble;
12351 u8 hw_rate;
12352
12353 if (hweight32(mask->control[band].legacy) != 1)
12354 return -EINVAL;
12355
12356 rate_idx = ffs(mask->control[band].legacy) - 1;
12357
12358 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
12359 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
12360
12361 hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
12362 bitrate = ath12k_legacy_rates[rate_idx].bitrate;
12363
12364 if (ath12k_mac_bitrate_is_cck(bitrate))
12365 preamble = WMI_RATE_PREAMBLE_CCK;
12366 else
12367 preamble = WMI_RATE_PREAMBLE_OFDM;
12368
12369 *nss = 1;
12370 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
12371
12372 return 0;
12373 }
12374
12375 static int
ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif * arvif,u8 gi,u8 ltf,u32 param)12376 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 gi, u8 ltf,
12377 u32 param)
12378 {
12379 struct ath12k *ar = arvif->ar;
12380 int ret;
12381
12382 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12383
12384 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
12385 if (gi && gi != 0xFF)
12386 gi += 1;
12387
12388 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12389 WMI_VDEV_PARAM_SGI, gi);
12390 if (ret) {
12391 ath12k_warn(ar->ab, "failed to set GI:%d, error:%d\n",
12392 gi, ret);
12393 return ret;
12394 }
12395
12396 if (param == WMI_VDEV_PARAM_HE_LTF) {
12397 /* HE values start from 1 */
12398 if (ltf != 0xFF)
12399 ltf += 1;
12400 } else {
12401 /* EHT values start from 5 */
12402 if (ltf != 0xFF)
12403 ltf += 4;
12404 }
12405
12406 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12407 param, ltf);
12408 if (ret) {
12409 ath12k_warn(ar->ab, "failed to set LTF:%d, error:%d\n",
12410 ltf, ret);
12411 return ret;
12412 }
12413 return 0;
12414 }
12415
12416 static int
ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif * arvif,u16 gi,u8 ltf)12417 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 gi, u8 ltf)
12418 {
12419 struct ath12k *ar = arvif->ar;
12420 int ret;
12421 u32 ar_gi_ltf;
12422
12423 if (gi != 0xFF) {
12424 switch (gi) {
12425 case ATH12K_RATE_INFO_GI_0_8:
12426 gi = WMI_AUTORATE_800NS_GI;
12427 break;
12428 case ATH12K_RATE_INFO_GI_1_6:
12429 gi = WMI_AUTORATE_1600NS_GI;
12430 break;
12431 case ATH12K_RATE_INFO_GI_3_2:
12432 gi = WMI_AUTORATE_3200NS_GI;
12433 break;
12434 default:
12435 ath12k_warn(ar->ab, "Invalid GI\n");
12436 return -EINVAL;
12437 }
12438 }
12439
12440 if (ltf != 0xFF) {
12441 switch (ltf) {
12442 case ATH12K_RATE_INFO_1XLTF:
12443 ltf = WMI_AUTORATE_LTF_1X;
12444 break;
12445 case ATH12K_RATE_INFO_2XLTF:
12446 ltf = WMI_AUTORATE_LTF_2X;
12447 break;
12448 case ATH12K_RATE_INFO_4XLTF:
12449 ltf = WMI_AUTORATE_LTF_4X;
12450 break;
12451 default:
12452 ath12k_warn(ar->ab, "Invalid LTF\n");
12453 return -EINVAL;
12454 }
12455 }
12456
12457 ar_gi_ltf = gi | ltf;
12458
12459 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12460 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
12461 ar_gi_ltf);
12462 if (ret) {
12463 ath12k_warn(ar->ab,
12464 "failed to set autorate GI:%u, LTF:%u params, error:%d\n",
12465 gi, ltf, ret);
12466 return ret;
12467 }
12468
12469 return 0;
12470 }
12471
ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)12472 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
12473 {
12474 switch (gi) {
12475 case NL80211_TXRATE_DEFAULT_GI:
12476 return WMI_GI_400_NS;
12477 case NL80211_TXRATE_FORCE_LGI:
12478 return WMI_GI_800_NS;
12479 default:
12480 return WMI_GI_400_NS;
12481 }
12482 }
12483
ath12k_mac_set_rate_params(struct ath12k_link_vif * arvif,u32 rate,u8 nss,u8 sgi,u8 ldpc,u8 he_gi,u8 he_ltf,bool he_fixed_rate,u8 eht_gi,u8 eht_ltf,bool eht_fixed_rate)12484 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
12485 u32 rate, u8 nss, u8 sgi, u8 ldpc,
12486 u8 he_gi, u8 he_ltf, bool he_fixed_rate,
12487 u8 eht_gi, u8 eht_ltf,
12488 bool eht_fixed_rate)
12489 {
12490 struct ieee80211_bss_conf *link_conf;
12491 struct ath12k *ar = arvif->ar;
12492 bool he_support, eht_support, gi_ltf_set = false;
12493 u32 vdev_param;
12494 u32 param_value;
12495 int ret;
12496
12497 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12498
12499 link_conf = ath12k_mac_get_link_bss_conf(arvif);
12500 if (!link_conf)
12501 return -EINVAL;
12502
12503 he_support = link_conf->he_support;
12504 eht_support = link_conf->eht_support;
12505
12506 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12507 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n",
12508 arvif->vdev_id, rate, nss, sgi, ldpc);
12509
12510 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12511 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
12512 he_ltf, he_fixed_rate);
12513
12514 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12515 "eht_gi 0x%02x eht_ltf 0x%02x eht_fixed_rate %d\n",
12516 eht_gi, eht_ltf, eht_fixed_rate);
12517
12518 if (!he_support && !eht_support) {
12519 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
12520 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12521 vdev_param, rate);
12522 if (ret) {
12523 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
12524 rate, ret);
12525 return ret;
12526 }
12527 }
12528
12529 vdev_param = WMI_VDEV_PARAM_NSS;
12530
12531 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12532 vdev_param, nss);
12533 if (ret) {
12534 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
12535 nss, ret);
12536 return ret;
12537 }
12538
12539 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12540 WMI_VDEV_PARAM_LDPC, ldpc);
12541 if (ret) {
12542 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
12543 ldpc, ret);
12544 return ret;
12545 }
12546
12547 if (eht_support) {
12548 if (eht_fixed_rate)
12549 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, eht_gi, eht_ltf,
12550 WMI_VDEV_PARAM_EHT_LTF);
12551 else
12552 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, eht_gi, eht_ltf);
12553
12554 if (ret) {
12555 ath12k_warn(ar->ab,
12556 "failed to set EHT LTF/GI params %d/%d: %d\n",
12557 eht_gi, eht_ltf, ret);
12558 return ret;
12559 }
12560 gi_ltf_set = true;
12561 }
12562
12563 if (he_support) {
12564 if (he_fixed_rate)
12565 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf,
12566 WMI_VDEV_PARAM_HE_LTF);
12567 else
12568 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf);
12569 if (ret)
12570 return ret;
12571 gi_ltf_set = true;
12572 }
12573
12574 if (!gi_ltf_set) {
12575 vdev_param = WMI_VDEV_PARAM_SGI;
12576 param_value = ath12k_mac_nlgi_to_wmigi(sgi);
12577 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12578 vdev_param, param_value);
12579 if (ret) {
12580 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
12581 sgi, ret);
12582 return ret;
12583 }
12584 }
12585
12586 return 0;
12587 }
12588
12589 static bool
ath12k_mac_vht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12590 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
12591 enum nl80211_band band,
12592 const struct cfg80211_bitrate_mask *mask)
12593 {
12594 int i;
12595 u16 vht_mcs;
12596
12597 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
12598 vht_mcs = mask->control[band].vht_mcs[i];
12599
12600 switch (vht_mcs) {
12601 case 0:
12602 case BIT(8) - 1:
12603 case BIT(9) - 1:
12604 case BIT(10) - 1:
12605 break;
12606 default:
12607 return false;
12608 }
12609 }
12610
12611 return true;
12612 }
12613
12614 static bool
ath12k_mac_he_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12615 ath12k_mac_he_mcs_range_present(struct ath12k *ar,
12616 enum nl80211_band band,
12617 const struct cfg80211_bitrate_mask *mask)
12618 {
12619 int i;
12620 u16 he_mcs;
12621
12622 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
12623 he_mcs = mask->control[band].he_mcs[i];
12624
12625 switch (he_mcs) {
12626 case 0:
12627 case BIT(8) - 1:
12628 case BIT(10) - 1:
12629 case BIT(12) - 1:
12630 break;
12631 default:
12632 return false;
12633 }
12634 }
12635
12636 return true;
12637 }
12638
12639 static bool
ath12k_mac_eht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12640 ath12k_mac_eht_mcs_range_present(struct ath12k *ar,
12641 enum nl80211_band band,
12642 const struct cfg80211_bitrate_mask *mask)
12643 {
12644 u16 eht_mcs;
12645 int i;
12646
12647 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) {
12648 eht_mcs = mask->control[band].eht_mcs[i];
12649
12650 switch (eht_mcs) {
12651 case 0:
12652 case BIT(8) - 1:
12653 case BIT(10) - 1:
12654 case BIT(12) - 1:
12655 case BIT(14) - 1:
12656 break;
12657 case BIT(15) - 1:
12658 case BIT(16) - 1:
12659 case BIT(16) - BIT(14) - 1:
12660 if (i != 0)
12661 return false;
12662 break;
12663 default:
12664 return false;
12665 }
12666 }
12667
12668 return true;
12669 }
12670
ath12k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)12671 static void ath12k_mac_set_bitrate_mask_iter(void *data,
12672 struct ieee80211_sta *sta)
12673 {
12674 struct ath12k_link_vif *arvif = data;
12675 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12676 struct ath12k_link_sta *arsta;
12677 struct ath12k *ar = arvif->ar;
12678
12679 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12680
12681 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12682 ahsta->link[arvif->link_id]);
12683 if (!arsta || arsta->arvif != arvif)
12684 return;
12685
12686 spin_lock_bh(&ar->data_lock);
12687 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
12688 spin_unlock_bh(&ar->data_lock);
12689
12690 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
12691 }
12692
ath12k_mac_disable_peer_fixed_rate(void * data,struct ieee80211_sta * sta)12693 static void ath12k_mac_disable_peer_fixed_rate(void *data,
12694 struct ieee80211_sta *sta)
12695 {
12696 struct ath12k_link_vif *arvif = data;
12697 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12698 struct ath12k_link_sta *arsta;
12699 struct ath12k *ar = arvif->ar;
12700 int ret;
12701
12702 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12703
12704 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12705 ahsta->link[arvif->link_id]);
12706
12707 if (!arsta || arsta->arvif != arvif)
12708 return;
12709
12710 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
12711 arvif->vdev_id,
12712 WMI_PEER_PARAM_FIXED_RATE,
12713 WMI_FIXED_RATE_NONE);
12714 if (ret)
12715 ath12k_warn(ar->ab,
12716 "failed to disable peer fixed rate for STA %pM ret %d\n",
12717 arsta->addr, ret);
12718 }
12719
12720 static bool
ath12k_mac_validate_fixed_rate_settings(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,unsigned int link_id)12721 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band,
12722 const struct cfg80211_bitrate_mask *mask,
12723 unsigned int link_id)
12724 {
12725 bool eht_fixed_rate = false, he_fixed_rate = false, vht_fixed_rate = false;
12726 const u16 *vht_mcs_mask, *he_mcs_mask, *eht_mcs_mask;
12727 struct ieee80211_link_sta *link_sta;
12728 struct ath12k_peer *peer, *tmp;
12729 u8 vht_nss, he_nss, eht_nss;
12730 int ret = true;
12731
12732 vht_mcs_mask = mask->control[band].vht_mcs;
12733 he_mcs_mask = mask->control[band].he_mcs;
12734 eht_mcs_mask = mask->control[band].eht_mcs;
12735
12736 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
12737 vht_fixed_rate = true;
12738
12739 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
12740 he_fixed_rate = true;
12741
12742 if (ath12k_mac_bitrate_mask_num_eht_rates(ar, band, mask) == 1)
12743 eht_fixed_rate = true;
12744
12745 if (!vht_fixed_rate && !he_fixed_rate && !eht_fixed_rate)
12746 return true;
12747
12748 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
12749 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
12750 eht_nss = ath12k_mac_max_eht_nss(eht_mcs_mask);
12751
12752 rcu_read_lock();
12753 spin_lock_bh(&ar->ab->base_lock);
12754 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
12755 if (peer->sta) {
12756 link_sta = rcu_dereference(peer->sta->link[link_id]);
12757 if (!link_sta) {
12758 ret = false;
12759 goto exit;
12760 }
12761
12762 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
12763 link_sta->rx_nss < vht_nss)) {
12764 ret = false;
12765 goto exit;
12766 }
12767 if (he_fixed_rate && (!link_sta->he_cap.has_he ||
12768 link_sta->rx_nss < he_nss)) {
12769 ret = false;
12770 goto exit;
12771 }
12772 if (eht_fixed_rate && (!link_sta->eht_cap.has_eht ||
12773 link_sta->rx_nss < eht_nss)) {
12774 ret = false;
12775 goto exit;
12776 }
12777 }
12778 }
12779 exit:
12780 spin_unlock_bh(&ar->ab->base_lock);
12781 rcu_read_unlock();
12782 return ret;
12783 }
12784
12785 static int
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)12786 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
12787 struct ieee80211_vif *vif,
12788 const struct cfg80211_bitrate_mask *mask)
12789 {
12790 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12791 struct ath12k_link_vif *arvif;
12792 struct cfg80211_chan_def def;
12793 struct ath12k *ar;
12794 enum nl80211_band band;
12795 const u8 *ht_mcs_mask;
12796 const u16 *vht_mcs_mask;
12797 const u16 *he_mcs_mask;
12798 const u16 *eht_mcs_mask;
12799 u8 he_ltf = 0;
12800 u8 he_gi = 0;
12801 u8 eht_ltf = 0, eht_gi = 0;
12802 u32 rate;
12803 u8 nss, mac_nss;
12804 u8 sgi;
12805 u8 ldpc;
12806 int single_nss;
12807 int ret;
12808 int num_rates;
12809 bool he_fixed_rate = false;
12810 bool eht_fixed_rate = false;
12811
12812 lockdep_assert_wiphy(hw->wiphy);
12813
12814 arvif = &ahvif->deflink;
12815
12816 ar = arvif->ar;
12817 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
12818 ret = -EPERM;
12819 goto out;
12820 }
12821
12822 band = def.chan->band;
12823 ht_mcs_mask = mask->control[band].ht_mcs;
12824 vht_mcs_mask = mask->control[band].vht_mcs;
12825 he_mcs_mask = mask->control[band].he_mcs;
12826 eht_mcs_mask = mask->control[band].eht_mcs;
12827 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
12828
12829 sgi = mask->control[band].gi;
12830 if (sgi == NL80211_TXRATE_FORCE_SGI) {
12831 ret = -EINVAL;
12832 goto out;
12833 }
12834
12835 he_gi = mask->control[band].he_gi;
12836 he_ltf = mask->control[band].he_ltf;
12837
12838 eht_gi = mask->control[band].eht_gi;
12839 eht_ltf = mask->control[band].eht_ltf;
12840
12841 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
12842 * requires passing at least one of used basic rates along with them.
12843 * Fixed rate setting across different preambles(legacy, HT, VHT) is
12844 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
12845 * suitable for setting single HT/VHT rates.
12846 * But, there could be a single basic rate passed from userspace which
12847 * can be done through the FIXED_RATE param.
12848 */
12849 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
12850 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
12851 &nss);
12852 if (ret) {
12853 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
12854 arvif->vdev_id, ret);
12855 goto out;
12856 }
12857
12858 ieee80211_iterate_stations_mtx(hw,
12859 ath12k_mac_disable_peer_fixed_rate,
12860 arvif);
12861 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask,
12862 &single_nss)) {
12863 rate = WMI_FIXED_RATE_NONE;
12864 nss = single_nss;
12865 arvif->bitrate_mask = *mask;
12866
12867 ieee80211_iterate_stations_atomic(hw,
12868 ath12k_mac_set_bitrate_mask_iter,
12869 arvif);
12870 } else {
12871 rate = WMI_FIXED_RATE_NONE;
12872
12873 if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
12874 mask, arvif->link_id))
12875 ath12k_warn(ar->ab,
12876 "failed to update fixed rate settings due to mcs/nss incompatibility\n");
12877
12878 mac_nss = max(max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
12879 ath12k_mac_max_vht_nss(vht_mcs_mask),
12880 ath12k_mac_max_he_nss(he_mcs_mask)),
12881 ath12k_mac_max_eht_nss(eht_mcs_mask));
12882 nss = min_t(u32, ar->num_tx_chains, mac_nss);
12883
12884 /* If multiple rates across different preambles are given
12885 * we can reconfigure this info with all peers using PEER_ASSOC
12886 * command with the below exception cases.
12887 * - Single VHT Rate : peer_assoc command accommodates only MCS
12888 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
12889 * mandates passing basic rates along with HT/VHT rates, FW
12890 * doesn't allow switching from VHT to Legacy. Hence instead of
12891 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
12892 * we could set this VHT rate as peer fixed rate param, which
12893 * will override FIXED rate and FW rate control algorithm.
12894 * If single VHT rate is passed along with HT rates, we select
12895 * the VHT rate as fixed rate for vht peers.
12896 * - Multiple VHT Rates : When Multiple VHT rates are given,this
12897 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
12898 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
12899 * RATEMASK_CMDID can cover all use cases of setting rates
12900 * across multiple preambles and rates within same type.
12901 * But requires more validation of the command at this point.
12902 */
12903
12904 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
12905 mask);
12906
12907 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
12908 num_rates > 1) {
12909 /* TODO: Handle multiple VHT MCS values setting using
12910 * RATEMASK CMD
12911 */
12912 ath12k_warn(ar->ab,
12913 "Setting more than one MCS Value in bitrate mask not supported\n");
12914 ret = -EINVAL;
12915 goto out;
12916 }
12917
12918 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
12919 if (num_rates == 1)
12920 he_fixed_rate = true;
12921
12922 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) &&
12923 num_rates > 1) {
12924 ath12k_warn(ar->ab,
12925 "Setting more than one HE MCS Value in bitrate mask not supported\n");
12926 ret = -EINVAL;
12927 goto out;
12928 }
12929
12930 num_rates = ath12k_mac_bitrate_mask_num_eht_rates(ar, band,
12931 mask);
12932 if (num_rates == 1)
12933 eht_fixed_rate = true;
12934
12935 if (!ath12k_mac_eht_mcs_range_present(ar, band, mask) &&
12936 num_rates > 1) {
12937 ath12k_warn(ar->ab,
12938 "Setting more than one EHT MCS Value in bitrate mask not supported\n");
12939 ret = -EINVAL;
12940 goto out;
12941 }
12942
12943 ieee80211_iterate_stations_mtx(hw,
12944 ath12k_mac_disable_peer_fixed_rate,
12945 arvif);
12946
12947 arvif->bitrate_mask = *mask;
12948 ieee80211_iterate_stations_mtx(hw,
12949 ath12k_mac_set_bitrate_mask_iter,
12950 arvif);
12951 }
12952
12953 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
12954 he_ltf, he_fixed_rate, eht_gi, eht_ltf,
12955 eht_fixed_rate);
12956 if (ret) {
12957 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
12958 arvif->vdev_id, ret);
12959 }
12960
12961 out:
12962 return ret;
12963 }
12964
12965 static void
ath12k_mac_op_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)12966 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
12967 enum ieee80211_reconfig_type reconfig_type)
12968 {
12969 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12970 struct ath12k *ar;
12971 struct ath12k_base *ab;
12972 struct ath12k_vif *ahvif;
12973 struct ath12k_link_vif *arvif;
12974 int recovery_count, i;
12975
12976 lockdep_assert_wiphy(hw->wiphy);
12977
12978 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
12979 return;
12980
12981 guard(mutex)(&ah->hw_mutex);
12982
12983 if (ah->state != ATH12K_HW_STATE_RESTARTED)
12984 return;
12985
12986 ah->state = ATH12K_HW_STATE_ON;
12987 ieee80211_wake_queues(hw);
12988
12989 for_each_ar(ah, ar, i) {
12990 ab = ar->ab;
12991
12992 ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
12993 ar->pdev->pdev_id);
12994
12995 if (ar->ab->hw_params->current_cc_support &&
12996 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
12997 struct wmi_set_current_country_arg arg = {};
12998
12999 memcpy(&arg.alpha2, ar->alpha2, 2);
13000 reinit_completion(&ar->regd_update_completed);
13001 ath12k_wmi_send_set_current_country_cmd(ar, &arg);
13002 }
13003
13004 if (ab->is_reset) {
13005 recovery_count = atomic_inc_return(&ab->recovery_count);
13006
13007 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
13008 recovery_count);
13009
13010 /* When there are multiple radios in an SOC,
13011 * the recovery has to be done for each radio
13012 */
13013 if (recovery_count == ab->num_radios) {
13014 atomic_dec(&ab->reset_count);
13015 complete(&ab->reset_complete);
13016 ab->is_reset = false;
13017 atomic_set(&ab->fail_cont_count, 0);
13018 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
13019 }
13020 }
13021
13022 list_for_each_entry(arvif, &ar->arvifs, list) {
13023 ahvif = arvif->ahvif;
13024 ath12k_dbg(ab, ATH12K_DBG_BOOT,
13025 "reconfig cipher %d up %d vdev type %d\n",
13026 ahvif->key_cipher,
13027 arvif->is_up,
13028 ahvif->vdev_type);
13029
13030 /* After trigger disconnect, then upper layer will
13031 * trigger connect again, then the PN number of
13032 * upper layer will be reset to keep up with AP
13033 * side, hence PN number mismatch will not happen.
13034 */
13035 if (arvif->is_up &&
13036 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
13037 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
13038 ieee80211_hw_restart_disconnect(ahvif->vif);
13039
13040 ath12k_dbg(ab, ATH12K_DBG_BOOT,
13041 "restart disconnect\n");
13042 }
13043 }
13044 }
13045 }
13046
13047 static void
ath12k_mac_update_bss_chan_survey(struct ath12k * ar,struct ieee80211_channel * channel)13048 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
13049 struct ieee80211_channel *channel)
13050 {
13051 int ret;
13052 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
13053
13054 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
13055
13056 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
13057 ar->rx_channel != channel)
13058 return;
13059
13060 if (ar->scan.state != ATH12K_SCAN_IDLE) {
13061 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13062 "ignoring bss chan info req while scanning..\n");
13063 return;
13064 }
13065
13066 reinit_completion(&ar->bss_survey_done);
13067
13068 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
13069 if (ret) {
13070 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
13071 return;
13072 }
13073
13074 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
13075 if (ret == 0)
13076 ath12k_warn(ar->ab, "bss channel survey timed out\n");
13077 }
13078
ath12k_mac_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)13079 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
13080 struct survey_info *survey)
13081 {
13082 struct ath12k *ar;
13083 struct ieee80211_supported_band *sband;
13084 struct survey_info *ar_survey;
13085
13086 lockdep_assert_wiphy(hw->wiphy);
13087
13088 if (idx >= ATH12K_NUM_CHANS)
13089 return -ENOENT;
13090
13091 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
13092 if (sband && idx >= sband->n_channels) {
13093 idx -= sband->n_channels;
13094 sband = NULL;
13095 }
13096
13097 if (!sband)
13098 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
13099 if (sband && idx >= sband->n_channels) {
13100 idx -= sband->n_channels;
13101 sband = NULL;
13102 }
13103
13104 if (!sband)
13105 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
13106
13107 if (!sband || idx >= sband->n_channels)
13108 return -ENOENT;
13109
13110 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
13111 if (!ar) {
13112 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
13113 memset(survey, 0, sizeof(*survey));
13114 return 0;
13115 }
13116 return -ENOENT;
13117 }
13118
13119 ar_survey = &ar->survey[idx];
13120
13121 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
13122
13123 spin_lock_bh(&ar->data_lock);
13124 memcpy(survey, ar_survey, sizeof(*survey));
13125 spin_unlock_bh(&ar->data_lock);
13126
13127 survey->channel = &sband->channels[idx];
13128
13129 if (ar->rx_channel == survey->channel)
13130 survey->filled |= SURVEY_INFO_IN_USE;
13131
13132 return 0;
13133 }
13134
ath12k_mac_put_chain_rssi(struct station_info * sinfo,struct ath12k_link_sta * arsta)13135 static void ath12k_mac_put_chain_rssi(struct station_info *sinfo,
13136 struct ath12k_link_sta *arsta)
13137 {
13138 s8 rssi;
13139 int i;
13140
13141 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
13142 sinfo->chains &= ~BIT(i);
13143 rssi = arsta->chain_signal[i];
13144
13145 if (rssi != ATH12K_DEFAULT_NOISE_FLOOR &&
13146 rssi != ATH12K_INVALID_RSSI_FULL &&
13147 rssi != ATH12K_INVALID_RSSI_EMPTY &&
13148 rssi != 0) {
13149 sinfo->chain_signal[i] = rssi;
13150 sinfo->chains |= BIT(i);
13151 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
13152 }
13153 }
13154 }
13155
ath12k_mac_op_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)13156 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
13157 struct ieee80211_vif *vif,
13158 struct ieee80211_sta *sta,
13159 struct station_info *sinfo)
13160 {
13161 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
13162 struct ath12k_fw_stats_req_params params = {};
13163 struct ath12k_link_sta *arsta;
13164 s8 signal, noise_floor;
13165 struct ath12k *ar;
13166 bool db2dbm;
13167
13168 lockdep_assert_wiphy(hw->wiphy);
13169
13170 arsta = &ahsta->deflink;
13171 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
13172 if (!ar)
13173 return;
13174
13175 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
13176 ar->ab->wmi_ab.svc_map);
13177
13178 sinfo->rx_duration = arsta->rx_duration;
13179 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
13180
13181 sinfo->tx_duration = arsta->tx_duration;
13182 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
13183
13184 if (arsta->txrate.legacy || arsta->txrate.nss) {
13185 if (arsta->txrate.legacy) {
13186 sinfo->txrate.legacy = arsta->txrate.legacy;
13187 } else {
13188 sinfo->txrate.mcs = arsta->txrate.mcs;
13189 sinfo->txrate.nss = arsta->txrate.nss;
13190 sinfo->txrate.bw = arsta->txrate.bw;
13191 sinfo->txrate.he_gi = arsta->txrate.he_gi;
13192 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
13193 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
13194 sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
13195 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc;
13196 }
13197 sinfo->txrate.flags = arsta->txrate.flags;
13198 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
13199 }
13200
13201 /* TODO: Use real NF instead of default one. */
13202 signal = arsta->rssi_comb;
13203
13204 params.pdev_id = ar->pdev->pdev_id;
13205 params.vdev_id = 0;
13206 params.stats_id = WMI_REQUEST_VDEV_STAT;
13207
13208 if (!signal &&
13209 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
13210 !(ath12k_mac_get_fw_stats(ar, ¶ms))) {
13211 signal = arsta->rssi_beacon;
13212 ath12k_fw_stats_reset(ar);
13213 }
13214
13215 params.stats_id = WMI_REQUEST_RSSI_PER_CHAIN_STAT;
13216 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
13217 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
13218 !(ath12k_mac_get_fw_stats(ar, ¶ms))) {
13219 ath12k_mac_put_chain_rssi(sinfo, arsta);
13220 ath12k_fw_stats_reset(ar);
13221 }
13222
13223 spin_lock_bh(&ar->data_lock);
13224 noise_floor = ath12k_pdev_get_noise_floor(ar);
13225 spin_unlock_bh(&ar->data_lock);
13226
13227 if (signal) {
13228 sinfo->signal = db2dbm ? signal : signal + noise_floor;
13229 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
13230 }
13231
13232 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
13233
13234 if (!db2dbm)
13235 sinfo->signal_avg += noise_floor;
13236
13237 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
13238
13239 sinfo->tx_retries = arsta->tx_retry_count;
13240 sinfo->tx_failed = arsta->tx_retry_failed;
13241 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
13242 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
13243 }
13244
ath12k_mac_op_link_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,struct link_station_info * link_sinfo)13245 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
13246 struct ieee80211_vif *vif,
13247 struct ieee80211_link_sta *link_sta,
13248 struct link_station_info *link_sinfo)
13249 {
13250 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta);
13251 struct ath12k_fw_stats_req_params params = {};
13252 struct ath12k_link_sta *arsta;
13253 struct ath12k *ar;
13254 s8 signal;
13255 bool db2dbm;
13256
13257 lockdep_assert_wiphy(hw->wiphy);
13258
13259 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]);
13260
13261 if (!arsta)
13262 return;
13263
13264 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
13265 if (!ar)
13266 return;
13267
13268 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
13269 ar->ab->wmi_ab.svc_map);
13270
13271 link_sinfo->rx_duration = arsta->rx_duration;
13272 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
13273
13274 link_sinfo->tx_duration = arsta->tx_duration;
13275 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
13276
13277 if (arsta->txrate.legacy || arsta->txrate.nss) {
13278 if (arsta->txrate.legacy) {
13279 link_sinfo->txrate.legacy = arsta->txrate.legacy;
13280 } else {
13281 link_sinfo->txrate.mcs = arsta->txrate.mcs;
13282 link_sinfo->txrate.nss = arsta->txrate.nss;
13283 link_sinfo->txrate.bw = arsta->txrate.bw;
13284 link_sinfo->txrate.he_gi = arsta->txrate.he_gi;
13285 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
13286 link_sinfo->txrate.he_ru_alloc =
13287 arsta->txrate.he_ru_alloc;
13288 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
13289 link_sinfo->txrate.eht_ru_alloc =
13290 arsta->txrate.eht_ru_alloc;
13291 }
13292 link_sinfo->txrate.flags = arsta->txrate.flags;
13293 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
13294 }
13295
13296 /* TODO: Use real NF instead of default one. */
13297 signal = arsta->rssi_comb;
13298
13299 params.pdev_id = ar->pdev->pdev_id;
13300 params.vdev_id = 0;
13301 params.stats_id = WMI_REQUEST_VDEV_STAT;
13302
13303 if (!signal &&
13304 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
13305 !(ath12k_mac_get_fw_stats(ar, ¶ms))) {
13306 signal = arsta->rssi_beacon;
13307 ath12k_fw_stats_reset(ar);
13308 }
13309
13310 if (signal) {
13311 link_sinfo->signal =
13312 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
13313 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
13314 }
13315
13316 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
13317
13318 if (!db2dbm)
13319 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
13320
13321 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
13322
13323 link_sinfo->tx_retries = arsta->tx_retry_count;
13324 link_sinfo->tx_failed = arsta->tx_retry_failed;
13325 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
13326 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
13327 }
13328
ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)13329 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
13330 struct ieee80211_vif *vif)
13331 {
13332 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
13333 struct ath12k *ar;
13334
13335 ar = ath12k_ah_to_ar(ah, 0);
13336
13337 lockdep_assert_wiphy(hw->wiphy);
13338
13339 spin_lock_bh(&ar->data_lock);
13340 ar->scan.roc_notify = false;
13341 spin_unlock_bh(&ar->data_lock);
13342
13343 ath12k_scan_abort(ar);
13344
13345 cancel_delayed_work_sync(&ar->scan.timeout);
13346 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
13347
13348 return 0;
13349 }
13350
ath12k_mac_op_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel * chan,int duration,enum ieee80211_roc_type type)13351 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
13352 struct ieee80211_vif *vif,
13353 struct ieee80211_channel *chan,
13354 int duration,
13355 enum ieee80211_roc_type type)
13356 {
13357 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
13358 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
13359 struct ath12k_link_vif *arvif;
13360 struct ath12k *ar;
13361 u32 scan_time_msec;
13362 bool create = true;
13363 u8 link_id;
13364 int ret;
13365
13366 lockdep_assert_wiphy(hw->wiphy);
13367
13368 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq);
13369 if (!ar)
13370 return -EINVAL;
13371
13372 /* check if any of the links of ML VIF is already started on
13373 * radio(ar) corresponding to given scan frequency and use it,
13374 * if not use deflink(link 0) for scan purpose.
13375 */
13376
13377 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
13378 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
13379 /* If the vif is already assigned to a specific vdev of an ar,
13380 * check whether its already started, vdev which is started
13381 * are not allowed to switch to a new radio.
13382 * If the vdev is not started, but was earlier created on a
13383 * different ar, delete that vdev and create a new one. We don't
13384 * delete at the scan stop as an optimization to avoid redundant
13385 * delete-create vdev's for the same ar, in case the request is
13386 * always on the same band for the vif
13387 */
13388 if (arvif->is_created) {
13389 if (WARN_ON(!arvif->ar))
13390 return -EINVAL;
13391
13392 if (ar != arvif->ar && arvif->is_started)
13393 return -EBUSY;
13394
13395 if (ar != arvif->ar) {
13396 ath12k_mac_remove_link_interface(hw, arvif);
13397 ath12k_mac_unassign_link_vif(arvif);
13398 } else {
13399 create = false;
13400 }
13401 }
13402
13403 if (create) {
13404 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
13405
13406 ret = ath12k_mac_vdev_create(ar, arvif);
13407 if (ret) {
13408 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
13409 ret);
13410 ath12k_mac_unassign_link_vif(arvif);
13411 return ret;
13412 }
13413 }
13414
13415 spin_lock_bh(&ar->data_lock);
13416
13417 switch (ar->scan.state) {
13418 case ATH12K_SCAN_IDLE:
13419 reinit_completion(&ar->scan.started);
13420 reinit_completion(&ar->scan.completed);
13421 reinit_completion(&ar->scan.on_channel);
13422 ar->scan.state = ATH12K_SCAN_STARTING;
13423 ar->scan.is_roc = true;
13424 ar->scan.arvif = arvif;
13425 ar->scan.roc_freq = chan->center_freq;
13426 ar->scan.roc_notify = true;
13427 ret = 0;
13428 break;
13429 case ATH12K_SCAN_STARTING:
13430 case ATH12K_SCAN_RUNNING:
13431 case ATH12K_SCAN_ABORTING:
13432 ret = -EBUSY;
13433 break;
13434 }
13435
13436 spin_unlock_bh(&ar->data_lock);
13437
13438 if (ret)
13439 return ret;
13440
13441 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
13442
13443 struct ath12k_wmi_scan_req_arg *arg __free(kfree) =
13444 kzalloc(sizeof(*arg), GFP_KERNEL);
13445 if (!arg)
13446 return -ENOMEM;
13447
13448 ath12k_wmi_start_scan_init(ar, arg);
13449 arg->num_chan = 1;
13450
13451 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list),
13452 GFP_KERNEL);
13453 if (!chan_list)
13454 return -ENOMEM;
13455
13456 arg->chan_list = chan_list;
13457 arg->vdev_id = arvif->vdev_id;
13458 arg->scan_id = ATH12K_SCAN_ID;
13459 arg->chan_list[0] = chan->center_freq;
13460 arg->dwell_time_active = scan_time_msec;
13461 arg->dwell_time_passive = scan_time_msec;
13462 arg->max_scan_time = scan_time_msec;
13463 arg->scan_f_passive = 1;
13464 arg->burst_duration = duration;
13465
13466 ret = ath12k_start_scan(ar, arg);
13467 if (ret) {
13468 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
13469
13470 spin_lock_bh(&ar->data_lock);
13471 ar->scan.state = ATH12K_SCAN_IDLE;
13472 spin_unlock_bh(&ar->data_lock);
13473 return ret;
13474 }
13475
13476 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
13477 if (ret == 0) {
13478 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
13479 ret = ath12k_scan_stop(ar);
13480 if (ret)
13481 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
13482 return -ETIMEDOUT;
13483 }
13484
13485 ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
13486 msecs_to_jiffies(duration));
13487
13488 return 0;
13489 }
13490
ath12k_mac_op_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)13491 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
13492 struct ieee80211_vif *vif,
13493 struct cfg80211_gtk_rekey_data *data)
13494 {
13495 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
13496 struct ath12k_rekey_data *rekey_data;
13497 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
13498 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
13499 struct ath12k_link_vif *arvif;
13500
13501 lockdep_assert_wiphy(hw->wiphy);
13502
13503 arvif = &ahvif->deflink;
13504 rekey_data = &arvif->rekey_data;
13505
13506 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
13507 arvif->vdev_id);
13508
13509 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
13510 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
13511
13512 /* The supplicant works on big-endian, the firmware expects it on
13513 * little endian.
13514 */
13515 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
13516
13517 arvif->rekey_data.enable_offload = true;
13518
13519 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL,
13520 rekey_data->kck, NL80211_KCK_LEN);
13521 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL,
13522 rekey_data->kck, NL80211_KEK_LEN);
13523 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
13524 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
13525 }
13526
13527 static const struct ieee80211_ops ath12k_ops = {
13528 .tx = ath12k_mac_op_tx,
13529 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
13530 .start = ath12k_mac_op_start,
13531 .stop = ath12k_mac_op_stop,
13532 .reconfig_complete = ath12k_mac_op_reconfig_complete,
13533 .add_interface = ath12k_mac_op_add_interface,
13534 .remove_interface = ath12k_mac_op_remove_interface,
13535 .update_vif_offload = ath12k_mac_op_update_vif_offload,
13536 .config = ath12k_mac_op_config,
13537 .link_info_changed = ath12k_mac_op_link_info_changed,
13538 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed,
13539 .change_vif_links = ath12k_mac_op_change_vif_links,
13540 .configure_filter = ath12k_mac_op_configure_filter,
13541 .hw_scan = ath12k_mac_op_hw_scan,
13542 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
13543 .set_key = ath12k_mac_op_set_key,
13544 .set_rekey_data = ath12k_mac_op_set_rekey_data,
13545 .sta_state = ath12k_mac_op_sta_state,
13546 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
13547 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update,
13548 .conf_tx = ath12k_mac_op_conf_tx,
13549 .set_antenna = ath12k_mac_op_set_antenna,
13550 .get_antenna = ath12k_mac_op_get_antenna,
13551 .ampdu_action = ath12k_mac_op_ampdu_action,
13552 .add_chanctx = ath12k_mac_op_add_chanctx,
13553 .remove_chanctx = ath12k_mac_op_remove_chanctx,
13554 .change_chanctx = ath12k_mac_op_change_chanctx,
13555 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
13556 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
13557 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
13558 .get_txpower = ath12k_mac_op_get_txpower,
13559 .set_rts_threshold = ath12k_mac_op_set_rts_threshold,
13560 .set_frag_threshold = ath12k_mac_op_set_frag_threshold,
13561 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
13562 .get_survey = ath12k_mac_op_get_survey,
13563 .flush = ath12k_mac_op_flush,
13564 .sta_statistics = ath12k_mac_op_sta_statistics,
13565 .link_sta_statistics = ath12k_mac_op_link_sta_statistics,
13566 .remain_on_channel = ath12k_mac_op_remain_on_channel,
13567 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel,
13568 .change_sta_links = ath12k_mac_op_change_sta_links,
13569 .can_activate_links = ath12k_mac_op_can_activate_links,
13570 #ifdef CONFIG_PM
13571 .suspend = ath12k_wow_op_suspend,
13572 .resume = ath12k_wow_op_resume,
13573 .set_wakeup = ath12k_wow_op_set_wakeup,
13574 #endif
13575 #ifdef CONFIG_ATH12K_DEBUGFS
13576 .vif_add_debugfs = ath12k_debugfs_op_vif_add,
13577 #endif
13578 CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
13579 #ifdef CONFIG_ATH12K_DEBUGFS
13580 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add,
13581 #endif
13582 };
13583
ath12k_mac_update_freq_range(struct ath12k * ar,u32 freq_low,u32 freq_high)13584 void ath12k_mac_update_freq_range(struct ath12k *ar,
13585 u32 freq_low, u32 freq_high)
13586 {
13587 if (!(freq_low && freq_high))
13588 return;
13589
13590 if (ar->freq_range.start_freq || ar->freq_range.end_freq) {
13591 ar->freq_range.start_freq = min(ar->freq_range.start_freq,
13592 MHZ_TO_KHZ(freq_low));
13593 ar->freq_range.end_freq = max(ar->freq_range.end_freq,
13594 MHZ_TO_KHZ(freq_high));
13595 } else {
13596 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low);
13597 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high);
13598 }
13599
13600 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13601 "mac pdev %u freq limit updated. New range %u->%u MHz\n",
13602 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq),
13603 KHZ_TO_MHZ(ar->freq_range.end_freq));
13604 }
13605
ath12k_mac_update_ch_list(struct ath12k * ar,struct ieee80211_supported_band * band,u32 freq_low,u32 freq_high)13606 static void ath12k_mac_update_ch_list(struct ath12k *ar,
13607 struct ieee80211_supported_band *band,
13608 u32 freq_low, u32 freq_high)
13609 {
13610 int i;
13611
13612 if (!(freq_low && freq_high))
13613 return;
13614
13615 for (i = 0; i < band->n_channels; i++) {
13616 if (band->channels[i].center_freq < freq_low ||
13617 band->channels[i].center_freq > freq_high)
13618 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
13619 }
13620 }
13621
ath12k_get_phy_id(struct ath12k * ar,u32 band)13622 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
13623 {
13624 struct ath12k_pdev *pdev = ar->pdev;
13625 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
13626
13627 if (band == WMI_HOST_WLAN_2GHZ_CAP)
13628 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
13629
13630 if (band == WMI_HOST_WLAN_5GHZ_CAP)
13631 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
13632
13633 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
13634
13635 return 0;
13636 }
13637
ath12k_mac_update_band(struct ath12k * ar,struct ieee80211_supported_band * orig_band,struct ieee80211_supported_band * new_band)13638 static int ath12k_mac_update_band(struct ath12k *ar,
13639 struct ieee80211_supported_band *orig_band,
13640 struct ieee80211_supported_band *new_band)
13641 {
13642 int i;
13643
13644 if (!orig_band || !new_band)
13645 return -EINVAL;
13646
13647 if (orig_band->band != new_band->band)
13648 return -EINVAL;
13649
13650 for (i = 0; i < new_band->n_channels; i++) {
13651 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
13652 continue;
13653 /* An enabled channel in new_band should not be already enabled
13654 * in the orig_band
13655 */
13656 if (WARN_ON(!(orig_band->channels[i].flags &
13657 IEEE80211_CHAN_DISABLED)))
13658 return -EINVAL;
13659 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
13660 }
13661 return 0;
13662 }
13663
ath12k_mac_setup_channels_rates(struct ath12k * ar,u32 supported_bands,struct ieee80211_supported_band * bands[])13664 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
13665 u32 supported_bands,
13666 struct ieee80211_supported_band *bands[])
13667 {
13668 struct ieee80211_supported_band *band;
13669 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
13670 struct ath12k_base *ab = ar->ab;
13671 u32 phy_id, freq_low, freq_high;
13672 struct ath12k_hw *ah = ar->ah;
13673 void *channels;
13674 int ret;
13675
13676 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
13677 ARRAY_SIZE(ath12k_5ghz_channels) +
13678 ARRAY_SIZE(ath12k_6ghz_channels)) !=
13679 ATH12K_NUM_CHANS);
13680
13681 reg_cap = &ab->hal_reg_cap[ar->pdev_idx];
13682
13683 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
13684 channels = kmemdup(ath12k_2ghz_channels,
13685 sizeof(ath12k_2ghz_channels),
13686 GFP_KERNEL);
13687 if (!channels)
13688 return -ENOMEM;
13689
13690 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
13691 band->band = NL80211_BAND_2GHZ;
13692 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
13693 band->channels = channels;
13694 band->n_bitrates = ath12k_g_rates_size;
13695 band->bitrates = ath12k_g_rates;
13696
13697 if (ab->hw_params->single_pdev_only) {
13698 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
13699 reg_cap = &ab->hal_reg_cap[phy_id];
13700 }
13701
13702 freq_low = max(reg_cap->low_2ghz_chan,
13703 ab->reg_freq_2ghz.start_freq);
13704 freq_high = min(reg_cap->high_2ghz_chan,
13705 ab->reg_freq_2ghz.end_freq);
13706
13707 ath12k_mac_update_ch_list(ar, band,
13708 reg_cap->low_2ghz_chan,
13709 reg_cap->high_2ghz_chan);
13710
13711 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13712
13713 if (!bands[NL80211_BAND_2GHZ]) {
13714 bands[NL80211_BAND_2GHZ] = band;
13715 } else {
13716 /* Split mac in same band under same wiphy */
13717 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
13718 if (ret) {
13719 kfree(channels);
13720 band->channels = NULL;
13721 return ret;
13722 }
13723 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
13724 ar->pdev->pdev_id,
13725 KHZ_TO_MHZ(ar->freq_range.start_freq),
13726 KHZ_TO_MHZ(ar->freq_range.end_freq));
13727 }
13728 }
13729
13730 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
13731 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) {
13732 channels = kmemdup(ath12k_6ghz_channels,
13733 sizeof(ath12k_6ghz_channels), GFP_KERNEL);
13734 if (!channels) {
13735 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13736 return -ENOMEM;
13737 }
13738
13739 ar->supports_6ghz = true;
13740 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
13741 band->band = NL80211_BAND_6GHZ;
13742 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
13743 band->channels = channels;
13744 band->n_bitrates = ath12k_a_rates_size;
13745 band->bitrates = ath12k_a_rates;
13746
13747 freq_low = max(reg_cap->low_5ghz_chan,
13748 ab->reg_freq_6ghz.start_freq);
13749 freq_high = min(reg_cap->high_5ghz_chan,
13750 ab->reg_freq_6ghz.end_freq);
13751
13752 ath12k_mac_update_ch_list(ar, band,
13753 reg_cap->low_5ghz_chan,
13754 reg_cap->high_5ghz_chan);
13755
13756 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13757 ah->use_6ghz_regd = true;
13758
13759 if (!bands[NL80211_BAND_6GHZ]) {
13760 bands[NL80211_BAND_6GHZ] = band;
13761 } else {
13762 /* Split mac in same band under same wiphy */
13763 ret = ath12k_mac_update_band(ar,
13764 bands[NL80211_BAND_6GHZ],
13765 band);
13766 if (ret) {
13767 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13768 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13769 kfree(channels);
13770 band->channels = NULL;
13771 return ret;
13772 }
13773 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
13774 ar->pdev->pdev_id,
13775 KHZ_TO_MHZ(ar->freq_range.start_freq),
13776 KHZ_TO_MHZ(ar->freq_range.end_freq));
13777 }
13778 }
13779
13780 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
13781 channels = kmemdup(ath12k_5ghz_channels,
13782 sizeof(ath12k_5ghz_channels),
13783 GFP_KERNEL);
13784 if (!channels) {
13785 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13786 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13787 return -ENOMEM;
13788 }
13789
13790 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
13791 band->band = NL80211_BAND_5GHZ;
13792 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
13793 band->channels = channels;
13794 band->n_bitrates = ath12k_a_rates_size;
13795 band->bitrates = ath12k_a_rates;
13796
13797 if (ab->hw_params->single_pdev_only) {
13798 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
13799 reg_cap = &ab->hal_reg_cap[phy_id];
13800 }
13801
13802 freq_low = max(reg_cap->low_5ghz_chan,
13803 ab->reg_freq_5ghz.start_freq);
13804 freq_high = min(reg_cap->high_5ghz_chan,
13805 ab->reg_freq_5ghz.end_freq);
13806
13807 ath12k_mac_update_ch_list(ar, band,
13808 reg_cap->low_5ghz_chan,
13809 reg_cap->high_5ghz_chan);
13810
13811 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13812
13813 if (!bands[NL80211_BAND_5GHZ]) {
13814 bands[NL80211_BAND_5GHZ] = band;
13815 } else {
13816 /* Split mac in same band under same wiphy */
13817 ret = ath12k_mac_update_band(ar,
13818 bands[NL80211_BAND_5GHZ],
13819 band);
13820 if (ret) {
13821 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13822 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13823 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13824 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13825 kfree(channels);
13826 band->channels = NULL;
13827 return ret;
13828 }
13829 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
13830 ar->pdev->pdev_id,
13831 KHZ_TO_MHZ(ar->freq_range.start_freq),
13832 KHZ_TO_MHZ(ar->freq_range.end_freq));
13833 }
13834 }
13835 }
13836
13837 return 0;
13838 }
13839
ath12k_mac_get_ifmodes(struct ath12k_hw * ah)13840 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
13841 {
13842 struct ath12k *ar;
13843 int i;
13844 u16 interface_modes = U16_MAX;
13845
13846 for_each_ar(ah, ar, i)
13847 interface_modes &= ar->ab->hw_params->interface_modes;
13848
13849 return interface_modes == U16_MAX ? 0 : interface_modes;
13850 }
13851
ath12k_mac_is_iface_mode_enable(struct ath12k_hw * ah,enum nl80211_iftype type)13852 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
13853 enum nl80211_iftype type)
13854 {
13855 struct ath12k *ar;
13856 int i;
13857 u16 interface_modes, mode = 0;
13858 bool is_enable = false;
13859
13860 if (type == NL80211_IFTYPE_MESH_POINT) {
13861 if (IS_ENABLED(CONFIG_MAC80211_MESH))
13862 mode = BIT(type);
13863 } else {
13864 mode = BIT(type);
13865 }
13866
13867 for_each_ar(ah, ar, i) {
13868 interface_modes = ar->ab->hw_params->interface_modes;
13869 if (interface_modes & mode) {
13870 is_enable = true;
13871 break;
13872 }
13873 }
13874
13875 return is_enable;
13876 }
13877
13878 static int
ath12k_mac_setup_radio_iface_comb(struct ath12k * ar,struct ieee80211_iface_combination * comb)13879 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar,
13880 struct ieee80211_iface_combination *comb)
13881 {
13882 u16 interface_modes = ar->ab->hw_params->interface_modes;
13883 struct ieee80211_iface_limit *limits;
13884 int n_limits, max_interfaces;
13885 bool ap, mesh, p2p;
13886
13887 ap = interface_modes & BIT(NL80211_IFTYPE_AP);
13888 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
13889
13890 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
13891 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT));
13892
13893 if ((ap || mesh) && !p2p) {
13894 n_limits = 2;
13895 max_interfaces = 16;
13896 } else if (p2p) {
13897 n_limits = 3;
13898 if (ap || mesh)
13899 max_interfaces = 16;
13900 else
13901 max_interfaces = 3;
13902 } else {
13903 n_limits = 1;
13904 max_interfaces = 1;
13905 }
13906
13907 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13908 if (!limits)
13909 return -ENOMEM;
13910
13911 limits[0].max = 1;
13912 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
13913
13914 if (ap || mesh || p2p)
13915 limits[1].max = max_interfaces;
13916
13917 if (ap)
13918 limits[1].types |= BIT(NL80211_IFTYPE_AP);
13919
13920 if (mesh)
13921 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
13922
13923 if (p2p) {
13924 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
13925 BIT(NL80211_IFTYPE_P2P_GO);
13926 limits[2].max = 1;
13927 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
13928 }
13929
13930 comb[0].limits = limits;
13931 comb[0].n_limits = n_limits;
13932 comb[0].max_interfaces = max_interfaces;
13933 comb[0].beacon_int_infra_match = true;
13934 comb[0].beacon_int_min_gcd = 100;
13935
13936 comb[0].num_different_channels = 1;
13937 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
13938 BIT(NL80211_CHAN_WIDTH_20) |
13939 BIT(NL80211_CHAN_WIDTH_40) |
13940 BIT(NL80211_CHAN_WIDTH_80) |
13941 BIT(NL80211_CHAN_WIDTH_160);
13942
13943 return 0;
13944 }
13945
13946 static int
ath12k_mac_setup_global_iface_comb(struct ath12k_hw * ah,struct wiphy_radio * radio,u8 n_radio,struct ieee80211_iface_combination * comb)13947 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah,
13948 struct wiphy_radio *radio,
13949 u8 n_radio,
13950 struct ieee80211_iface_combination *comb)
13951 {
13952 const struct ieee80211_iface_combination *iter_comb;
13953 struct ieee80211_iface_limit *limits;
13954 int i, j, n_limits;
13955 bool ap, mesh, p2p;
13956
13957 if (!n_radio)
13958 return 0;
13959
13960 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
13961 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
13962 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
13963
13964 if ((ap || mesh) && !p2p)
13965 n_limits = 2;
13966 else if (p2p)
13967 n_limits = 3;
13968 else
13969 n_limits = 1;
13970
13971 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13972 if (!limits)
13973 return -ENOMEM;
13974
13975 for (i = 0; i < n_radio; i++) {
13976 iter_comb = radio[i].iface_combinations;
13977 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) {
13978 limits[j].types |= iter_comb->limits[j].types;
13979 limits[j].max += iter_comb->limits[j].max;
13980 }
13981
13982 comb->max_interfaces += iter_comb->max_interfaces;
13983 comb->num_different_channels += iter_comb->num_different_channels;
13984 comb->radar_detect_widths |= iter_comb->radar_detect_widths;
13985 }
13986
13987 comb->limits = limits;
13988 comb->n_limits = n_limits;
13989 comb->beacon_int_infra_match = true;
13990 comb->beacon_int_min_gcd = 100;
13991
13992 return 0;
13993 }
13994
13995 static
ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination * iface_comb)13996 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb)
13997 {
13998 kfree(iface_comb[0].limits);
13999 kfree(iface_comb);
14000 }
14001
ath12k_mac_cleanup_iface_combinations(struct ath12k_hw * ah)14002 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah)
14003 {
14004 struct wiphy *wiphy = ah->hw->wiphy;
14005 const struct wiphy_radio *radio;
14006 int i;
14007
14008 if (wiphy->n_radio > 0) {
14009 radio = wiphy->radio;
14010 for (i = 0; i < wiphy->n_radio; i++)
14011 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
14012
14013 kfree(wiphy->radio);
14014 }
14015
14016 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations);
14017 }
14018
ath12k_mac_setup_iface_combinations(struct ath12k_hw * ah)14019 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
14020 {
14021 struct ieee80211_iface_combination *combinations, *comb;
14022 struct wiphy *wiphy = ah->hw->wiphy;
14023 struct wiphy_radio *radio;
14024 int n_combinations = 1;
14025 struct ath12k *ar;
14026 int i, ret;
14027
14028 if (ah->num_radio == 1) {
14029 ar = &ah->radio[0];
14030
14031 if (ar->ab->hw_params->single_pdev_only)
14032 n_combinations = 2;
14033
14034 combinations = kcalloc(n_combinations, sizeof(*combinations),
14035 GFP_KERNEL);
14036 if (!combinations)
14037 return -ENOMEM;
14038
14039 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations);
14040 if (ret) {
14041 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d",
14042 ret);
14043 goto err_free_combinations;
14044 }
14045
14046 if (ar->ab->hw_params->single_pdev_only) {
14047 comb = combinations + 1;
14048 memcpy(comb, combinations, sizeof(*comb));
14049 comb->num_different_channels = 2;
14050 comb->radar_detect_widths = 0;
14051 }
14052
14053 goto out;
14054 }
14055
14056 combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL);
14057 if (!combinations)
14058 return -ENOMEM;
14059
14060 /* there are multiple radios */
14061
14062 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL);
14063 if (!radio) {
14064 ret = -ENOMEM;
14065 goto err_free_combinations;
14066 }
14067
14068 for_each_ar(ah, ar, i) {
14069 comb = kzalloc(sizeof(*comb), GFP_KERNEL);
14070 if (!comb) {
14071 ret = -ENOMEM;
14072 goto err_free_radios;
14073 }
14074
14075 ret = ath12k_mac_setup_radio_iface_comb(ar, comb);
14076 if (ret) {
14077 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d",
14078 i, ret);
14079 kfree(comb);
14080 goto err_free_radios;
14081 }
14082
14083 radio[i].freq_range = &ar->freq_range;
14084 radio[i].n_freq_range = 1;
14085
14086 radio[i].iface_combinations = comb;
14087 radio[i].n_iface_combinations = 1;
14088 }
14089
14090 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations);
14091 if (ret) {
14092 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d",
14093 ret);
14094 goto err_free_all_radios;
14095 }
14096
14097 wiphy->radio = radio;
14098 wiphy->n_radio = ah->num_radio;
14099
14100 out:
14101 wiphy->iface_combinations = combinations;
14102 wiphy->n_iface_combinations = n_combinations;
14103
14104 return 0;
14105
14106 err_free_all_radios:
14107 i = ah->num_radio;
14108
14109 err_free_radios:
14110 while (i--)
14111 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
14112
14113 kfree(radio);
14114
14115 err_free_combinations:
14116 kfree(combinations);
14117
14118 return ret;
14119 }
14120
14121 static const u8 ath12k_if_types_ext_capa[] = {
14122 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
14123 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
14124 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
14125 };
14126
14127 static const u8 ath12k_if_types_ext_capa_sta[] = {
14128 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
14129 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
14130 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
14131 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
14132 };
14133
14134 static const u8 ath12k_if_types_ext_capa_ap[] = {
14135 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
14136 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
14137 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
14138 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
14139 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
14140 };
14141
14142 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
14143 {
14144 .extended_capabilities = ath12k_if_types_ext_capa,
14145 .extended_capabilities_mask = ath12k_if_types_ext_capa,
14146 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
14147 }, {
14148 .iftype = NL80211_IFTYPE_STATION,
14149 .extended_capabilities = ath12k_if_types_ext_capa_sta,
14150 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
14151 .extended_capabilities_len =
14152 sizeof(ath12k_if_types_ext_capa_sta),
14153 }, {
14154 .iftype = NL80211_IFTYPE_AP,
14155 .extended_capabilities = ath12k_if_types_ext_capa_ap,
14156 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
14157 .extended_capabilities_len =
14158 sizeof(ath12k_if_types_ext_capa_ap),
14159 .eml_capabilities = 0,
14160 .mld_capa_and_ops = 0,
14161 },
14162 };
14163
ath12k_mac_cleanup_unregister(struct ath12k * ar)14164 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
14165 {
14166 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
14167 idr_destroy(&ar->txmgmt_idr);
14168
14169 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
14170 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
14171 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
14172 }
14173
ath12k_mac_hw_unregister(struct ath12k_hw * ah)14174 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
14175 {
14176 struct ieee80211_hw *hw = ah->hw;
14177 struct ath12k *ar;
14178 int i;
14179
14180 for_each_ar(ah, ar, i) {
14181 cancel_work_sync(&ar->regd_channel_update_work);
14182 cancel_work_sync(&ar->regd_update_work);
14183 ath12k_debugfs_unregister(ar);
14184 ath12k_fw_stats_reset(ar);
14185 }
14186
14187 ieee80211_unregister_hw(hw);
14188
14189 for_each_ar(ah, ar, i)
14190 ath12k_mac_cleanup_unregister(ar);
14191
14192 ath12k_mac_cleanup_iface_combinations(ah);
14193
14194 SET_IEEE80211_DEV(hw, NULL);
14195 }
14196
ath12k_mac_setup_register(struct ath12k * ar,u32 * ht_cap,struct ieee80211_supported_band * bands[])14197 static int ath12k_mac_setup_register(struct ath12k *ar,
14198 u32 *ht_cap,
14199 struct ieee80211_supported_band *bands[])
14200 {
14201 struct ath12k_pdev_cap *cap = &ar->pdev->cap;
14202 int ret;
14203
14204 init_waitqueue_head(&ar->txmgmt_empty_waitq);
14205 idr_init(&ar->txmgmt_idr);
14206 spin_lock_init(&ar->txmgmt_idr_lock);
14207
14208 ath12k_pdev_caps_update(ar);
14209
14210 ret = ath12k_mac_setup_channels_rates(ar,
14211 cap->supported_bands,
14212 bands);
14213 if (ret)
14214 return ret;
14215
14216 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
14217 ath12k_mac_setup_sband_iftype_data(ar, cap);
14218
14219 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
14220 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
14221
14222 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR;
14223 ar->rssi_info.temp_offset = 0;
14224 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset;
14225
14226 return 0;
14227 }
14228
ath12k_mac_hw_register(struct ath12k_hw * ah)14229 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
14230 {
14231 struct ieee80211_hw *hw = ah->hw;
14232 struct wiphy *wiphy = hw->wiphy;
14233 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
14234 struct ath12k_base *ab = ar->ab;
14235 struct ath12k_pdev *pdev;
14236 struct ath12k_pdev_cap *cap;
14237 static const u32 cipher_suites[] = {
14238 WLAN_CIPHER_SUITE_TKIP,
14239 WLAN_CIPHER_SUITE_CCMP,
14240 WLAN_CIPHER_SUITE_AES_CMAC,
14241 WLAN_CIPHER_SUITE_BIP_CMAC_256,
14242 WLAN_CIPHER_SUITE_BIP_GMAC_128,
14243 WLAN_CIPHER_SUITE_BIP_GMAC_256,
14244 WLAN_CIPHER_SUITE_GCMP,
14245 WLAN_CIPHER_SUITE_GCMP_256,
14246 WLAN_CIPHER_SUITE_CCMP_256,
14247 };
14248 int ret, i, j;
14249 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0;
14250 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false;
14251 u8 *mac_addr = NULL;
14252 u8 mbssid_max_interfaces = 0;
14253
14254 wiphy->max_ap_assoc_sta = 0;
14255
14256 for_each_ar(ah, ar, i) {
14257 u32 ht_cap_info = 0;
14258
14259 pdev = ar->pdev;
14260 if (ar->ab->pdevs_macaddr_valid) {
14261 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
14262 } else {
14263 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr);
14264 ar->mac_addr[4] += ar->pdev_idx;
14265 }
14266
14267 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands);
14268 if (ret)
14269 goto err_cleanup_unregister;
14270
14271 /* 6 GHz does not support HT Cap, hence do not consider it */
14272 if (!ar->supports_6ghz)
14273 ht_cap &= ht_cap_info;
14274
14275 wiphy->max_ap_assoc_sta += ar->max_num_stations;
14276
14277 /* Advertise the max antenna support of all radios, driver can handle
14278 * per pdev specific antenna setting based on pdev cap when antenna
14279 * changes are made
14280 */
14281 cap = &pdev->cap;
14282
14283 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask);
14284 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask);
14285
14286 if (ar->supports_6ghz)
14287 is_6ghz = true;
14288
14289 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
14290 is_raw_mode = true;
14291
14292 if (!ar->ab->hw_params->supports_monitor)
14293 is_monitor_disable = true;
14294
14295 if (i == 0)
14296 mac_addr = ar->mac_addr;
14297 else
14298 mac_addr = ab->mac_addr;
14299
14300 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab);
14301 }
14302
14303 wiphy->available_antennas_rx = antennas_rx;
14304 wiphy->available_antennas_tx = antennas_tx;
14305
14306 SET_IEEE80211_PERM_ADDR(hw, mac_addr);
14307 SET_IEEE80211_DEV(hw, ab->dev);
14308
14309 ret = ath12k_mac_setup_iface_combinations(ah);
14310 if (ret) {
14311 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
14312 goto err_complete_cleanup_unregister;
14313 }
14314
14315 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
14316
14317 if (ah->num_radio == 1 &&
14318 wiphy->bands[NL80211_BAND_2GHZ] &&
14319 wiphy->bands[NL80211_BAND_5GHZ] &&
14320 wiphy->bands[NL80211_BAND_6GHZ])
14321 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
14322
14323 ieee80211_hw_set(hw, SIGNAL_DBM);
14324 ieee80211_hw_set(hw, SUPPORTS_PS);
14325 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
14326 ieee80211_hw_set(hw, MFP_CAPABLE);
14327 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
14328 ieee80211_hw_set(hw, HAS_RATE_CONTROL);
14329 ieee80211_hw_set(hw, AP_LINK_PS);
14330 ieee80211_hw_set(hw, SPECTRUM_MGMT);
14331 ieee80211_hw_set(hw, CONNECTION_MONITOR);
14332 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
14333 ieee80211_hw_set(hw, CHANCTX_STA_CSA);
14334 ieee80211_hw_set(hw, QUEUE_CONTROL);
14335 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
14336 ieee80211_hw_set(hw, REPORTS_LOW_ACK);
14337 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
14338
14339 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) {
14340 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
14341 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
14342 }
14343
14344 if (cap->nss_ratio_enabled)
14345 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
14346
14347 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
14348 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
14349 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
14350 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
14351 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
14352 ieee80211_hw_set(hw, USES_RSS);
14353 }
14354
14355 wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
14356 wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
14357
14358 /* TODO: Check if HT capability advertised from firmware is different
14359 * for each band for a dual band capable radio. It will be tricky to
14360 * handle it when the ht capability different for each band.
14361 */
14362 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
14363 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz))
14364 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
14365
14366 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
14367 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
14368
14369 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
14370
14371 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
14372 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
14373 wiphy->max_remain_on_channel_duration = 5000;
14374
14375 wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
14376 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
14377 NL80211_FEATURE_AP_SCAN;
14378
14379 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
14380
14381 /* MLO is not yet supported so disable Wireless Extensions for now
14382 * to make sure ath12k users don't use it. This flag can be removed
14383 * once WIPHY_FLAG_SUPPORTS_MLO is enabled.
14384 */
14385 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
14386
14387 /* Copy over MLO related capabilities received from
14388 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set.
14389 */
14390 if (ab->ag->mlo_capable) {
14391 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap;
14392 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap;
14393 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
14394
14395 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX);
14396 }
14397
14398 hw->queues = ATH12K_HW_MAX_QUEUES;
14399 wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
14400 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
14401 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
14402
14403 hw->vif_data_size = sizeof(struct ath12k_vif);
14404 hw->sta_data_size = sizeof(struct ath12k_sta);
14405 hw->extra_tx_headroom = ab->hw_params->iova_mask;
14406
14407 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
14408 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
14409 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
14410 if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
14411 ab->wmi_ab.svc_map)) {
14412 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BSS_COLOR);
14413 ieee80211_hw_set(hw, DETECTS_COLOR_COLLISION);
14414 }
14415
14416 wiphy->cipher_suites = cipher_suites;
14417 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
14418
14419 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
14420 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
14421
14422 wiphy->mbssid_max_interfaces = mbssid_max_interfaces;
14423 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
14424 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
14425
14426 if (is_6ghz) {
14427 wiphy_ext_feature_set(wiphy,
14428 NL80211_EXT_FEATURE_FILS_DISCOVERY);
14429 wiphy_ext_feature_set(wiphy,
14430 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
14431 }
14432
14433 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
14434 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map))
14435 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
14436
14437 ath12k_reg_init(hw);
14438
14439 if (!is_raw_mode) {
14440 hw->netdev_features = NETIF_F_HW_CSUM;
14441 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
14442 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
14443 }
14444
14445 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
14446 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
14447 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
14448 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
14449 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
14450 wiphy->max_sched_scan_plan_interval =
14451 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
14452 wiphy->max_sched_scan_plan_iterations =
14453 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
14454 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
14455 }
14456
14457 ret = ath12k_wow_init(ar);
14458 if (ret) {
14459 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret);
14460 goto err_cleanup_if_combs;
14461 }
14462
14463 /* Boot-time regulatory updates have already been processed.
14464 * Mark them as complete now, because after registration,
14465 * cfg80211 will notify us again if there are any pending hints.
14466 * We need to wait for those hints to be processed, so it's
14467 * important to mark the boot-time updates as complete before
14468 * proceeding with registration.
14469 */
14470 for_each_ar(ah, ar, i)
14471 complete_all(&ar->regd_update_completed);
14472
14473 ret = ieee80211_register_hw(hw);
14474 if (ret) {
14475 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
14476 goto err_cleanup_if_combs;
14477 }
14478
14479 if (is_monitor_disable)
14480 /* There's a race between calling ieee80211_register_hw()
14481 * and here where the monitor mode is enabled for a little
14482 * while. But that time is so short and in practise it make
14483 * a difference in real life.
14484 */
14485 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
14486
14487 for_each_ar(ah, ar, i) {
14488 /* Apply the regd received during initialization */
14489 ret = ath12k_regd_update(ar, true);
14490 if (ret) {
14491 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
14492 goto err_unregister_hw;
14493 }
14494
14495 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
14496 struct wmi_set_current_country_arg current_cc = {};
14497
14498 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2);
14499 memcpy(&ar->alpha2, ab->new_alpha2, 2);
14500
14501 reinit_completion(&ar->regd_update_completed);
14502
14503 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc);
14504 if (ret)
14505 ath12k_warn(ar->ab,
14506 "failed set cc code for mac register: %d\n",
14507 ret);
14508 }
14509
14510 ath12k_fw_stats_init(ar);
14511 ath12k_debugfs_register(ar);
14512 }
14513
14514 return 0;
14515
14516 err_unregister_hw:
14517 for_each_ar(ah, ar, i)
14518 ath12k_debugfs_unregister(ar);
14519
14520 ieee80211_unregister_hw(hw);
14521
14522 err_cleanup_if_combs:
14523 ath12k_mac_cleanup_iface_combinations(ah);
14524
14525 err_complete_cleanup_unregister:
14526 i = ah->num_radio;
14527
14528 err_cleanup_unregister:
14529 for (j = 0; j < i; j++) {
14530 ar = ath12k_ah_to_ar(ah, j);
14531 ath12k_mac_cleanup_unregister(ar);
14532 }
14533
14534 SET_IEEE80211_DEV(hw, NULL);
14535
14536 return ret;
14537 }
14538
ath12k_mac_setup(struct ath12k * ar)14539 static void ath12k_mac_setup(struct ath12k *ar)
14540 {
14541 struct ath12k_base *ab = ar->ab;
14542 struct ath12k_pdev *pdev = ar->pdev;
14543 u8 pdev_idx = ar->pdev_idx;
14544
14545 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
14546
14547 ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
14548 /* FIXME: wmi[0] is already initialized during attach,
14549 * Should we do this again?
14550 */
14551 ath12k_wmi_pdev_attach(ab, pdev_idx);
14552
14553 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
14554 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
14555 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
14556 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
14557 ar->scan.arvif = NULL;
14558 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
14559
14560 spin_lock_init(&ar->data_lock);
14561 INIT_LIST_HEAD(&ar->arvifs);
14562 INIT_LIST_HEAD(&ar->ppdu_stats_info);
14563
14564 init_completion(&ar->vdev_setup_done);
14565 init_completion(&ar->vdev_delete_done);
14566 init_completion(&ar->peer_assoc_done);
14567 init_completion(&ar->peer_delete_done);
14568 init_completion(&ar->install_key_done);
14569 init_completion(&ar->bss_survey_done);
14570 init_completion(&ar->scan.started);
14571 init_completion(&ar->scan.completed);
14572 init_completion(&ar->scan.on_channel);
14573 init_completion(&ar->mlo_setup_done);
14574 init_completion(&ar->completed_11d_scan);
14575 init_completion(&ar->regd_update_completed);
14576
14577 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
14578 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
14579 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work);
14580 INIT_LIST_HEAD(&ar->regd_channel_update_queue);
14581 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
14582
14583 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
14584 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
14585
14586 ar->monitor_vdev_id = -1;
14587 ar->monitor_vdev_created = false;
14588 ar->monitor_started = false;
14589 }
14590
__ath12k_mac_mlo_setup(struct ath12k * ar)14591 static int __ath12k_mac_mlo_setup(struct ath12k *ar)
14592 {
14593 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {};
14594 struct ath12k_base *partner_ab, *ab = ar->ab;
14595 struct ath12k_hw_group *ag = ab->ag;
14596 struct wmi_mlo_setup_arg mlo = {};
14597 struct ath12k_pdev *pdev;
14598 unsigned long time_left;
14599 int i, j, ret;
14600
14601 lockdep_assert_held(&ag->mutex);
14602
14603 reinit_completion(&ar->mlo_setup_done);
14604
14605 for (i = 0; i < ag->num_devices; i++) {
14606 partner_ab = ag->ab[i];
14607
14608 for (j = 0; j < partner_ab->num_radios; j++) {
14609 pdev = &partner_ab->pdevs[j];
14610
14611 /* Avoid the self link */
14612 if (ar == pdev->ar)
14613 continue;
14614
14615 partner_link_id[num_link] = pdev->hw_link_id;
14616 num_link++;
14617
14618 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n",
14619 i, j, pdev->hw_link_id, num_link);
14620 }
14621 }
14622
14623 if (num_link == 0)
14624 return 0;
14625
14626 mlo.group_id = cpu_to_le32(ag->id);
14627 mlo.partner_link_id = partner_link_id;
14628 mlo.num_partner_links = num_link;
14629 ar->mlo_setup_status = 0;
14630
14631 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link);
14632
14633 ret = ath12k_wmi_mlo_setup(ar, &mlo);
14634 if (ret) {
14635 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n",
14636 ar->pdev_idx, ret);
14637 return ret;
14638 }
14639
14640 time_left = wait_for_completion_timeout(&ar->mlo_setup_done,
14641 WMI_MLO_CMD_TIMEOUT_HZ);
14642
14643 if (!time_left || ar->mlo_setup_status)
14644 return ar->mlo_setup_status ? : -ETIMEDOUT;
14645
14646 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx);
14647
14648 return 0;
14649 }
14650
__ath12k_mac_mlo_teardown(struct ath12k * ar)14651 static int __ath12k_mac_mlo_teardown(struct ath12k *ar)
14652 {
14653 struct ath12k_base *ab = ar->ab;
14654 int ret;
14655 u8 num_link;
14656
14657 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
14658 return 0;
14659
14660 num_link = ath12k_get_num_partner_link(ar);
14661
14662 if (num_link == 0)
14663 return 0;
14664
14665 ret = ath12k_wmi_mlo_teardown(ar);
14666 if (ret) {
14667 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n",
14668 ar->pdev_idx, ret);
14669 return ret;
14670 }
14671
14672 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx);
14673
14674 return 0;
14675 }
14676
ath12k_mac_mlo_setup(struct ath12k_hw_group * ag)14677 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag)
14678 {
14679 struct ath12k_hw *ah;
14680 struct ath12k *ar;
14681 int ret;
14682 int i, j;
14683
14684 for (i = 0; i < ag->num_hw; i++) {
14685 ah = ag->ah[i];
14686 if (!ah)
14687 continue;
14688
14689 for_each_ar(ah, ar, j) {
14690 ar = &ah->radio[j];
14691 ret = __ath12k_mac_mlo_setup(ar);
14692 if (ret) {
14693 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret);
14694 goto err_setup;
14695 }
14696 }
14697 }
14698
14699 return 0;
14700
14701 err_setup:
14702 for (i = i - 1; i >= 0; i--) {
14703 ah = ag->ah[i];
14704 if (!ah)
14705 continue;
14706
14707 for (j = j - 1; j >= 0; j--) {
14708 ar = &ah->radio[j];
14709 if (!ar)
14710 continue;
14711
14712 __ath12k_mac_mlo_teardown(ar);
14713 }
14714 }
14715
14716 return ret;
14717 }
14718
ath12k_mac_mlo_teardown(struct ath12k_hw_group * ag)14719 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag)
14720 {
14721 struct ath12k_hw *ah;
14722 struct ath12k *ar;
14723 int ret, i, j;
14724
14725 for (i = 0; i < ag->num_hw; i++) {
14726 ah = ag->ah[i];
14727 if (!ah)
14728 continue;
14729
14730 for_each_ar(ah, ar, j) {
14731 ar = &ah->radio[j];
14732 ret = __ath12k_mac_mlo_teardown(ar);
14733 if (ret) {
14734 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret);
14735 break;
14736 }
14737 }
14738 }
14739 }
14740
ath12k_mac_register(struct ath12k_hw_group * ag)14741 int ath12k_mac_register(struct ath12k_hw_group *ag)
14742 {
14743 struct ath12k_hw *ah;
14744 int i;
14745 int ret;
14746
14747 for (i = 0; i < ag->num_hw; i++) {
14748 ah = ath12k_ag_to_ah(ag, i);
14749
14750 ret = ath12k_mac_hw_register(ah);
14751 if (ret)
14752 goto err;
14753 }
14754
14755 return 0;
14756
14757 err:
14758 for (i = i - 1; i >= 0; i--) {
14759 ah = ath12k_ag_to_ah(ag, i);
14760 if (!ah)
14761 continue;
14762
14763 ath12k_mac_hw_unregister(ah);
14764 }
14765
14766 return ret;
14767 }
14768
ath12k_mac_unregister(struct ath12k_hw_group * ag)14769 void ath12k_mac_unregister(struct ath12k_hw_group *ag)
14770 {
14771 struct ath12k_hw *ah;
14772 int i;
14773
14774 for (i = ag->num_hw - 1; i >= 0; i--) {
14775 ah = ath12k_ag_to_ah(ag, i);
14776 if (!ah)
14777 continue;
14778
14779 ath12k_mac_hw_unregister(ah);
14780 }
14781 }
14782
ath12k_mac_hw_destroy(struct ath12k_hw * ah)14783 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
14784 {
14785 ieee80211_free_hw(ah->hw);
14786 }
14787
ath12k_mac_hw_allocate(struct ath12k_hw_group * ag,struct ath12k_pdev_map * pdev_map,u8 num_pdev_map)14788 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag,
14789 struct ath12k_pdev_map *pdev_map,
14790 u8 num_pdev_map)
14791 {
14792 struct ieee80211_hw *hw;
14793 struct ath12k *ar;
14794 struct ath12k_base *ab;
14795 struct ath12k_pdev *pdev;
14796 struct ath12k_hw *ah;
14797 int i;
14798 u8 pdev_idx;
14799
14800 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
14801 &ath12k_ops);
14802 if (!hw)
14803 return NULL;
14804
14805 ah = ath12k_hw_to_ah(hw);
14806 ah->hw = hw;
14807 ah->num_radio = num_pdev_map;
14808
14809 mutex_init(&ah->hw_mutex);
14810 INIT_LIST_HEAD(&ah->ml_peers);
14811
14812 for (i = 0; i < num_pdev_map; i++) {
14813 ab = pdev_map[i].ab;
14814 pdev_idx = pdev_map[i].pdev_idx;
14815 pdev = &ab->pdevs[pdev_idx];
14816
14817 ar = ath12k_ah_to_ar(ah, i);
14818 ar->ah = ah;
14819 ar->ab = ab;
14820 ar->hw_link_id = pdev->hw_link_id;
14821 ar->pdev = pdev;
14822 ar->pdev_idx = pdev_idx;
14823 pdev->ar = ar;
14824
14825 ag->hw_links[ar->hw_link_id].device_id = ab->device_id;
14826 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx;
14827
14828 ath12k_mac_setup(ar);
14829 ath12k_dp_pdev_pre_alloc(ar);
14830 }
14831
14832 return ah;
14833 }
14834
ath12k_mac_destroy(struct ath12k_hw_group * ag)14835 void ath12k_mac_destroy(struct ath12k_hw_group *ag)
14836 {
14837 struct ath12k_pdev *pdev;
14838 struct ath12k_base *ab = ag->ab[0];
14839 int i, j;
14840 struct ath12k_hw *ah;
14841
14842 for (i = 0; i < ag->num_devices; i++) {
14843 ab = ag->ab[i];
14844 if (!ab)
14845 continue;
14846
14847 for (j = 0; j < ab->num_radios; j++) {
14848 pdev = &ab->pdevs[j];
14849 if (!pdev->ar)
14850 continue;
14851 pdev->ar = NULL;
14852 }
14853 }
14854
14855 for (i = 0; i < ag->num_hw; i++) {
14856 ah = ath12k_ag_to_ah(ag, i);
14857 if (!ah)
14858 continue;
14859
14860 ath12k_mac_hw_destroy(ah);
14861 ath12k_ag_set_ah(ag, i, NULL);
14862 }
14863 }
14864
ath12k_mac_set_device_defaults(struct ath12k_base * ab)14865 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab)
14866 {
14867 int total_vdev;
14868
14869 /* Initialize channel counters frequency value in hertz */
14870 ab->cc_freq_hz = 320000;
14871 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab);
14872 ab->free_vdev_map = (1LL << total_vdev) - 1;
14873 }
14874
ath12k_mac_allocate(struct ath12k_hw_group * ag)14875 int ath12k_mac_allocate(struct ath12k_hw_group *ag)
14876 {
14877 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO];
14878 int mac_id, device_id, total_radio, num_hw;
14879 struct ath12k_base *ab;
14880 struct ath12k_hw *ah;
14881 int ret, i, j;
14882 u8 radio_per_hw;
14883
14884 total_radio = 0;
14885 for (i = 0; i < ag->num_devices; i++) {
14886 ab = ag->ab[i];
14887 if (!ab)
14888 continue;
14889
14890 ath12k_debugfs_pdev_create(ab);
14891 ath12k_mac_set_device_defaults(ab);
14892 total_radio += ab->num_radios;
14893 }
14894
14895 if (!total_radio)
14896 return -EINVAL;
14897
14898 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO))
14899 return -ENOSPC;
14900
14901 /* All pdev get combined and register as single wiphy based on
14902 * hardware group which participate in multi-link operation else
14903 * each pdev get register separately.
14904 */
14905 if (ag->mlo_capable)
14906 radio_per_hw = total_radio;
14907 else
14908 radio_per_hw = 1;
14909
14910 num_hw = total_radio / radio_per_hw;
14911
14912 ag->num_hw = 0;
14913 device_id = 0;
14914 mac_id = 0;
14915 for (i = 0; i < num_hw; i++) {
14916 for (j = 0; j < radio_per_hw; j++) {
14917 if (device_id >= ag->num_devices || !ag->ab[device_id]) {
14918 ret = -ENOSPC;
14919 goto err;
14920 }
14921
14922 ab = ag->ab[device_id];
14923 pdev_map[j].ab = ab;
14924 pdev_map[j].pdev_idx = mac_id;
14925 mac_id++;
14926
14927 /* If mac_id falls beyond the current device MACs then
14928 * move to next device
14929 */
14930 if (mac_id >= ab->num_radios) {
14931 mac_id = 0;
14932 device_id++;
14933 }
14934 }
14935
14936 ab = pdev_map->ab;
14937
14938 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw);
14939 if (!ah) {
14940 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
14941 i);
14942 ret = -ENOMEM;
14943 goto err;
14944 }
14945
14946 ah->dev = ab->dev;
14947
14948 ag->ah[i] = ah;
14949 ag->num_hw++;
14950 }
14951
14952 return 0;
14953
14954 err:
14955 for (i = i - 1; i >= 0; i--) {
14956 ah = ath12k_ag_to_ah(ag, i);
14957 if (!ah)
14958 continue;
14959
14960 ath12k_mac_hw_destroy(ah);
14961 ath12k_ag_set_ah(ag, i, NULL);
14962 }
14963
14964 return ret;
14965 }
14966
ath12k_mac_vif_set_keepalive(struct ath12k_link_vif * arvif,enum wmi_sta_keepalive_method method,u32 interval)14967 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif,
14968 enum wmi_sta_keepalive_method method,
14969 u32 interval)
14970 {
14971 struct wmi_sta_keepalive_arg arg = {};
14972 struct ath12k *ar = arvif->ar;
14973 int ret;
14974
14975 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
14976
14977 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
14978 return 0;
14979
14980 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
14981 return 0;
14982
14983 arg.vdev_id = arvif->vdev_id;
14984 arg.enabled = 1;
14985 arg.method = method;
14986 arg.interval = interval;
14987
14988 ret = ath12k_wmi_sta_keepalive(ar, &arg);
14989 if (ret) {
14990 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
14991 arvif->vdev_id, ret);
14992 return ret;
14993 }
14994
14995 return 0;
14996 }
14997