1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
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
ath12k_parse_mpdudensity(u8 mpdudensity)536 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
537 {
538 /* From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
539 * 0 for no restriction
540 * 1 for 1/4 us
541 * 2 for 1/2 us
542 * 3 for 1 us
543 * 4 for 2 us
544 * 5 for 4 us
545 * 6 for 8 us
546 * 7 for 16 us
547 */
548 switch (mpdudensity) {
549 case 0:
550 return 0;
551 case 1:
552 case 2:
553 case 3:
554 /* Our lower layer calculations limit our precision to
555 * 1 microsecond
556 */
557 return 1;
558 case 4:
559 return 2;
560 case 5:
561 return 4;
562 case 6:
563 return 8;
564 case 7:
565 return 16;
566 default:
567 return 0;
568 }
569 }
570
ath12k_mac_vif_link_chan(struct ieee80211_vif * vif,u8 link_id,struct cfg80211_chan_def * def)571 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id,
572 struct cfg80211_chan_def *def)
573 {
574 struct ieee80211_bss_conf *link_conf;
575 struct ieee80211_chanctx_conf *conf;
576
577 rcu_read_lock();
578 link_conf = rcu_dereference(vif->link_conf[link_id]);
579
580 if (!link_conf) {
581 rcu_read_unlock();
582 return -ENOLINK;
583 }
584
585 conf = rcu_dereference(link_conf->chanctx_conf);
586 if (!conf) {
587 rcu_read_unlock();
588 return -ENOENT;
589 }
590 *def = conf->def;
591 rcu_read_unlock();
592
593 return 0;
594 }
595
596 static struct ath12k_link_vif *
ath12k_mac_get_tx_arvif(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * link_conf)597 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif,
598 struct ieee80211_bss_conf *link_conf)
599 {
600 struct ieee80211_bss_conf *tx_bss_conf;
601 struct ath12k *ar = arvif->ar;
602 struct ath12k_vif *tx_ahvif;
603
604 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
605
606 tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
607 link_conf->tx_bss_conf);
608 if (tx_bss_conf) {
609 tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif);
610 return wiphy_dereference(tx_ahvif->ah->hw->wiphy,
611 tx_ahvif->link[tx_bss_conf->link_id]);
612 }
613
614 return NULL;
615 }
616
ath12k_mac_get_tx_bssid(struct ath12k_link_vif * arvif)617 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif)
618 {
619 struct ieee80211_bss_conf *link_conf;
620 struct ath12k_link_vif *tx_arvif;
621 struct ath12k *ar = arvif->ar;
622
623 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
624
625 link_conf = ath12k_mac_get_link_bss_conf(arvif);
626 if (!link_conf) {
627 ath12k_warn(ar->ab,
628 "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
629 arvif->link_id);
630 return NULL;
631 }
632 if (link_conf->vif->type == NL80211_IFTYPE_STATION) {
633 if (link_conf->nontransmitted)
634 return link_conf->transmitter_bssid;
635 } else {
636 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
637 if (tx_arvif)
638 return tx_arvif->bssid;
639 }
640
641 return NULL;
642 }
643
644 struct ieee80211_bss_conf *
ath12k_mac_get_link_bss_conf(struct ath12k_link_vif * arvif)645 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif)
646 {
647 struct ieee80211_vif *vif = arvif->ahvif->vif;
648 struct ieee80211_bss_conf *link_conf;
649 struct ath12k *ar = arvif->ar;
650
651 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
652
653 if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
654 return NULL;
655
656 link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
657 vif->link_conf[arvif->link_id]);
658
659 return link_conf;
660 }
661
ath12k_mac_get_link_sta(struct ath12k_link_sta * arsta)662 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta)
663 {
664 struct ath12k_sta *ahsta = arsta->ahsta;
665 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
666 struct ieee80211_link_sta *link_sta;
667
668 lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy);
669
670 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
671 return NULL;
672
673 link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy,
674 sta->link[arsta->link_id]);
675
676 return link_sta;
677 }
678
ath12k_mac_bitrate_is_cck(int bitrate)679 static bool ath12k_mac_bitrate_is_cck(int bitrate)
680 {
681 switch (bitrate) {
682 case 10:
683 case 20:
684 case 55:
685 case 110:
686 return true;
687 }
688
689 return false;
690 }
691
ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band * sband,u8 hw_rate,bool cck)692 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
693 u8 hw_rate, bool cck)
694 {
695 const struct ieee80211_rate *rate;
696 int i;
697
698 for (i = 0; i < sband->n_bitrates; i++) {
699 rate = &sband->bitrates[i];
700
701 if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
702 continue;
703
704 if (rate->hw_value == hw_rate)
705 return i;
706 else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
707 rate->hw_value_short == hw_rate)
708 return i;
709 }
710
711 return 0;
712 }
713
ath12k_mac_bitrate_to_rate(int bitrate)714 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
715 {
716 return DIV_ROUND_UP(bitrate, 5) |
717 (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
718 }
719
ath12k_get_arvif_iter(void * data,u8 * mac,struct ieee80211_vif * vif)720 static void ath12k_get_arvif_iter(void *data, u8 *mac,
721 struct ieee80211_vif *vif)
722 {
723 struct ath12k_vif_iter *arvif_iter = data;
724 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
725 unsigned long links_map = ahvif->links_map;
726 struct ath12k_link_vif *arvif;
727 u8 link_id;
728
729 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
730 arvif = rcu_dereference(ahvif->link[link_id]);
731
732 if (WARN_ON(!arvif))
733 continue;
734
735 if (!arvif->is_created)
736 continue;
737
738 if (arvif->vdev_id == arvif_iter->vdev_id &&
739 arvif->ar == arvif_iter->ar) {
740 arvif_iter->arvif = arvif;
741 break;
742 }
743 }
744 }
745
ath12k_mac_get_arvif(struct ath12k * ar,u32 vdev_id)746 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
747 {
748 struct ath12k_vif_iter arvif_iter = {};
749 u32 flags;
750
751 /* To use the arvif returned, caller must have held rcu read lock.
752 */
753 WARN_ON(!rcu_read_lock_any_held());
754 arvif_iter.vdev_id = vdev_id;
755 arvif_iter.ar = ar;
756
757 flags = IEEE80211_IFACE_ITER_RESUME_ALL;
758 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
759 flags,
760 ath12k_get_arvif_iter,
761 &arvif_iter);
762 if (!arvif_iter.arvif) {
763 ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
764 return NULL;
765 }
766
767 return arvif_iter.arvif;
768 }
769
ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)770 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
771 u32 vdev_id)
772 {
773 int i;
774 struct ath12k_pdev *pdev;
775 struct ath12k_link_vif *arvif;
776
777 for (i = 0; i < ab->num_radios; i++) {
778 pdev = rcu_dereference(ab->pdevs_active[i]);
779 if (pdev && pdev->ar &&
780 (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
781 arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
782 if (arvif)
783 return arvif;
784 }
785 }
786
787 return NULL;
788 }
789
ath12k_mac_get_ar_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)790 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
791 {
792 int i;
793 struct ath12k_pdev *pdev;
794
795 for (i = 0; i < ab->num_radios; i++) {
796 pdev = rcu_dereference(ab->pdevs_active[i]);
797 if (pdev && pdev->ar) {
798 if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
799 return pdev->ar;
800 }
801 }
802
803 return NULL;
804 }
805
ath12k_mac_get_ar_by_pdev_id(struct ath12k_base * ab,u32 pdev_id)806 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
807 {
808 int i;
809 struct ath12k_pdev *pdev;
810
811 if (ab->hw_params->single_pdev_only) {
812 pdev = rcu_dereference(ab->pdevs_active[0]);
813 return pdev ? pdev->ar : NULL;
814 }
815
816 if (WARN_ON(pdev_id > ab->num_radios))
817 return NULL;
818
819 for (i = 0; i < ab->num_radios; i++) {
820 if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM)
821 pdev = &ab->pdevs[i];
822 else
823 pdev = rcu_dereference(ab->pdevs_active[i]);
824
825 if (pdev && pdev->pdev_id == pdev_id)
826 return (pdev->ar ? pdev->ar : NULL);
827 }
828
829 return NULL;
830 }
831
ath12k_mac_is_ml_arvif(struct ath12k_link_vif * arvif)832 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif)
833 {
834 struct ath12k_vif *ahvif = arvif->ahvif;
835
836 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
837
838 if (ahvif->vif->valid_links & BIT(arvif->link_id))
839 return true;
840
841 return false;
842 }
843
ath12k_mac_get_ar_by_chan(struct ieee80211_hw * hw,struct ieee80211_channel * channel)844 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw,
845 struct ieee80211_channel *channel)
846 {
847 struct ath12k_hw *ah = hw->priv;
848 struct ath12k *ar;
849 int i;
850
851 ar = ah->radio;
852
853 if (ah->num_radio == 1)
854 return ar;
855
856 for_each_ar(ah, ar, i) {
857 if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
858 channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
859 return ar;
860 }
861 return NULL;
862 }
863
ath12k_get_ar_by_ctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)864 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw,
865 struct ieee80211_chanctx_conf *ctx)
866 {
867 if (!ctx)
868 return NULL;
869
870 return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan);
871 }
872
ath12k_get_ar_by_vif(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u8 link_id)873 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw,
874 struct ieee80211_vif *vif,
875 u8 link_id)
876 {
877 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
878 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
879 struct ath12k_link_vif *arvif;
880
881 lockdep_assert_wiphy(hw->wiphy);
882
883 /* If there is one pdev within ah, then we return
884 * ar directly.
885 */
886 if (ah->num_radio == 1)
887 return ah->radio;
888
889 if (!(ahvif->links_map & BIT(link_id)))
890 return NULL;
891
892 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
893 if (arvif && arvif->is_created)
894 return arvif->ar;
895
896 return NULL;
897 }
898
ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)899 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw,
900 struct ieee80211_chanctx_conf *conf,
901 void *data)
902 {
903 struct ath12k_mac_get_any_chanctx_conf_arg *arg = data;
904 struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf);
905
906 if (ctx_ar == arg->ar)
907 arg->chanctx_conf = conf;
908 }
909
ath12k_mac_get_vif_up(struct ath12k * ar)910 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar)
911 {
912 struct ath12k_link_vif *arvif;
913
914 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
915
916 list_for_each_entry(arvif, &ar->arvifs, list) {
917 if (arvif->is_up)
918 return arvif;
919 }
920
921 return NULL;
922 }
923
ath12k_mac_band_match(enum nl80211_band band1,enum WMI_HOST_WLAN_BAND band2)924 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
925 {
926 switch (band1) {
927 case NL80211_BAND_2GHZ:
928 if (band2 & WMI_HOST_WLAN_2GHZ_CAP)
929 return true;
930 break;
931 case NL80211_BAND_5GHZ:
932 case NL80211_BAND_6GHZ:
933 if (band2 & WMI_HOST_WLAN_5GHZ_CAP)
934 return true;
935 break;
936 default:
937 return false;
938 }
939
940 return false;
941 }
942
ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif * arvif)943 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif)
944 {
945 struct ath12k *ar = arvif->ar;
946 struct ath12k_base *ab = ar->ab;
947 struct ieee80211_vif *vif = arvif->ahvif->vif;
948 struct cfg80211_chan_def def;
949 enum nl80211_band band;
950 u8 pdev_id = ab->fw_pdev[0].pdev_id;
951 int i;
952
953 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
954 return pdev_id;
955
956 band = def.chan->band;
957
958 for (i = 0; i < ab->fw_pdev_count; i++) {
959 if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands))
960 return ab->fw_pdev[i].pdev_id;
961 }
962
963 return pdev_id;
964 }
965
ath12k_mac_get_target_pdev_id(struct ath12k * ar)966 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar)
967 {
968 struct ath12k_link_vif *arvif;
969 struct ath12k_base *ab = ar->ab;
970
971 if (!ab->hw_params->single_pdev_only)
972 return ar->pdev->pdev_id;
973
974 arvif = ath12k_mac_get_vif_up(ar);
975
976 /* fw_pdev array has pdev ids derived from phy capability
977 * service ready event (pdev_and_hw_link_ids).
978 * If no vif is active, return default first index.
979 */
980 if (!arvif)
981 return ar->ab->fw_pdev[0].pdev_id;
982
983 /* If active vif is found, return the pdev id matching chandef band */
984 return ath12k_mac_get_target_pdev_id_from_vif(arvif);
985 }
986
ath12k_pdev_caps_update(struct ath12k * ar)987 static void ath12k_pdev_caps_update(struct ath12k *ar)
988 {
989 struct ath12k_base *ab = ar->ab;
990
991 ar->max_tx_power = ab->target_caps.hw_max_tx_power;
992
993 /* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
994 * But since the received value in svcrdy is same as hw_max_tx_power,
995 * we can set ar->min_tx_power to 0 currently until
996 * this is fixed in firmware
997 */
998 ar->min_tx_power = 0;
999
1000 ar->txpower_limit_2g = ar->max_tx_power;
1001 ar->txpower_limit_5g = ar->max_tx_power;
1002 ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
1003 }
1004
ath12k_mac_txpower_recalc(struct ath12k * ar)1005 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
1006 {
1007 struct ath12k_pdev *pdev = ar->pdev;
1008 struct ath12k_link_vif *arvif;
1009 int ret, txpower = -1;
1010 u32 param;
1011
1012 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1013
1014 list_for_each_entry(arvif, &ar->arvifs, list) {
1015 if (arvif->txpower <= 0)
1016 continue;
1017
1018 if (txpower == -1)
1019 txpower = arvif->txpower;
1020 else
1021 txpower = min(txpower, arvif->txpower);
1022 }
1023
1024 if (txpower == -1)
1025 return 0;
1026
1027 /* txpwr is set as 2 units per dBm in FW*/
1028 txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
1029 ar->max_tx_power) * 2;
1030
1031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
1032 txpower / 2);
1033
1034 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) &&
1035 ar->txpower_limit_2g != txpower) {
1036 param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
1037 ret = ath12k_wmi_pdev_set_param(ar, param,
1038 txpower, ar->pdev->pdev_id);
1039 if (ret)
1040 goto fail;
1041 ar->txpower_limit_2g = txpower;
1042 }
1043
1044 if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) &&
1045 ar->txpower_limit_5g != txpower) {
1046 param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
1047 ret = ath12k_wmi_pdev_set_param(ar, param,
1048 txpower, ar->pdev->pdev_id);
1049 if (ret)
1050 goto fail;
1051 ar->txpower_limit_5g = txpower;
1052 }
1053
1054 return 0;
1055
1056 fail:
1057 ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
1058 txpower / 2, param, ret);
1059 return ret;
1060 }
1061
ath12k_recalc_rtscts_prot(struct ath12k_link_vif * arvif)1062 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif)
1063 {
1064 struct ath12k *ar = arvif->ar;
1065 u32 vdev_param, rts_cts;
1066 int ret;
1067
1068 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1069
1070 vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
1071
1072 /* Enable RTS/CTS protection for sw retries (when legacy stations
1073 * are in BSS) or by default only for second rate series.
1074 * TODO: Check if we need to enable CTS 2 Self in any case
1075 */
1076 rts_cts = WMI_USE_RTS_CTS;
1077
1078 if (arvif->num_legacy_stations > 0)
1079 rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
1080 else
1081 rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
1082
1083 /* Need not send duplicate param value to firmware */
1084 if (arvif->rtscts_prot_mode == rts_cts)
1085 return 0;
1086
1087 arvif->rtscts_prot_mode = rts_cts;
1088
1089 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1090 arvif->vdev_id, rts_cts);
1091
1092 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1093 vdev_param, rts_cts);
1094 if (ret)
1095 ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1096 arvif->vdev_id, ret);
1097
1098 return ret;
1099 }
1100
ath12k_mac_set_kickout(struct ath12k_link_vif * arvif)1101 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif)
1102 {
1103 struct ath12k *ar = arvif->ar;
1104 u32 param;
1105 int ret;
1106
1107 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
1108 ATH12K_KICKOUT_THRESHOLD,
1109 ar->pdev->pdev_id);
1110 if (ret) {
1111 ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
1112 arvif->vdev_id, ret);
1113 return ret;
1114 }
1115
1116 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
1117 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1118 ATH12K_KEEPALIVE_MIN_IDLE);
1119 if (ret) {
1120 ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
1121 arvif->vdev_id, ret);
1122 return ret;
1123 }
1124
1125 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
1126 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1127 ATH12K_KEEPALIVE_MAX_IDLE);
1128 if (ret) {
1129 ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
1130 arvif->vdev_id, ret);
1131 return ret;
1132 }
1133
1134 param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
1135 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1136 ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
1137 if (ret) {
1138 ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
1139 arvif->vdev_id, ret);
1140 return ret;
1141 }
1142
1143 return 0;
1144 }
1145
ath12k_mac_peer_cleanup_all(struct ath12k * ar)1146 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
1147 {
1148 struct ath12k_peer *peer, *tmp;
1149 struct ath12k_base *ab = ar->ab;
1150
1151 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1152
1153 spin_lock_bh(&ab->base_lock);
1154 list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
1155 /* Skip Rx TID cleanup for self peer */
1156 if (peer->sta)
1157 ath12k_dp_rx_peer_tid_cleanup(ar, peer);
1158
1159 list_del(&peer->list);
1160 kfree(peer);
1161 }
1162 spin_unlock_bh(&ab->base_lock);
1163
1164 ar->num_peers = 0;
1165 ar->num_stations = 0;
1166 }
1167
ath12k_mac_vdev_setup_sync(struct ath12k * ar)1168 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
1169 {
1170 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1171
1172 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
1173 return -ESHUTDOWN;
1174
1175 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
1176 ATH12K_VDEV_SETUP_TIMEOUT_HZ);
1177
1178 if (!wait_for_completion_timeout(&ar->vdev_setup_done,
1179 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
1180 return -ETIMEDOUT;
1181
1182 return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
1183 }
1184
ath12k_monitor_vdev_up(struct ath12k * ar,int vdev_id)1185 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
1186 {
1187 struct ath12k_wmi_vdev_up_params params = {};
1188 int ret;
1189
1190 params.vdev_id = vdev_id;
1191 params.bssid = ar->mac_addr;
1192 ret = ath12k_wmi_vdev_up(ar, ¶ms);
1193 if (ret) {
1194 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
1195 vdev_id, ret);
1196 return ret;
1197 }
1198
1199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
1200 vdev_id);
1201 return 0;
1202 }
1203
ath12k_mac_monitor_vdev_start(struct ath12k * ar,int vdev_id,struct cfg80211_chan_def * chandef)1204 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
1205 struct cfg80211_chan_def *chandef)
1206 {
1207 struct ieee80211_channel *channel;
1208 struct wmi_vdev_start_req_arg arg = {};
1209 struct ath12k_wmi_vdev_up_params params = {};
1210 int ret;
1211
1212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1213
1214 channel = chandef->chan;
1215 arg.vdev_id = vdev_id;
1216 arg.freq = channel->center_freq;
1217 arg.band_center_freq1 = chandef->center_freq1;
1218 arg.band_center_freq2 = chandef->center_freq2;
1219 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
1220 arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
1221
1222 arg.min_power = 0;
1223 arg.max_power = channel->max_power;
1224 arg.max_reg_power = channel->max_reg_power;
1225 arg.max_antenna_gain = channel->max_antenna_gain;
1226
1227 arg.pref_tx_streams = ar->num_tx_chains;
1228 arg.pref_rx_streams = ar->num_rx_chains;
1229 arg.punct_bitmap = 0xFFFFFFFF;
1230
1231 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
1232
1233 reinit_completion(&ar->vdev_setup_done);
1234 reinit_completion(&ar->vdev_delete_done);
1235
1236 ret = ath12k_wmi_vdev_start(ar, &arg, false);
1237 if (ret) {
1238 ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
1239 vdev_id, ret);
1240 return ret;
1241 }
1242
1243 ret = ath12k_mac_vdev_setup_sync(ar);
1244 if (ret) {
1245 ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
1246 vdev_id, ret);
1247 return ret;
1248 }
1249
1250 params.vdev_id = vdev_id;
1251 params.bssid = ar->mac_addr;
1252 ret = ath12k_wmi_vdev_up(ar, ¶ms);
1253 if (ret) {
1254 ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
1255 vdev_id, ret);
1256 goto vdev_stop;
1257 }
1258
1259 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
1260 vdev_id);
1261 return 0;
1262
1263 vdev_stop:
1264 ret = ath12k_wmi_vdev_stop(ar, vdev_id);
1265 if (ret)
1266 ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
1267 vdev_id, ret);
1268 return ret;
1269 }
1270
ath12k_mac_monitor_vdev_stop(struct ath12k * ar)1271 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
1272 {
1273 int ret;
1274
1275 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1276
1277 reinit_completion(&ar->vdev_setup_done);
1278
1279 ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1280 if (ret)
1281 ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1282 ar->monitor_vdev_id, ret);
1283
1284 ret = ath12k_mac_vdev_setup_sync(ar);
1285 if (ret)
1286 ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1287 ar->monitor_vdev_id, ret);
1288
1289 ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1290 if (ret)
1291 ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1292 ar->monitor_vdev_id, ret);
1293
1294 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
1295 ar->monitor_vdev_id);
1296 return ret;
1297 }
1298
ath12k_mac_monitor_vdev_delete(struct ath12k * ar)1299 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
1300 {
1301 int ret;
1302 unsigned long time_left;
1303
1304 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1305
1306 if (!ar->monitor_vdev_created)
1307 return 0;
1308
1309 reinit_completion(&ar->vdev_delete_done);
1310
1311 ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1312 if (ret) {
1313 ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1314 ar->monitor_vdev_id, ret);
1315 return ret;
1316 }
1317
1318 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1319 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
1320 if (time_left == 0) {
1321 ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1322 } else {
1323 ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1324 ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1325 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
1326 ar->monitor_vdev_id);
1327 ar->num_created_vdevs--;
1328 ar->monitor_vdev_id = -1;
1329 ar->monitor_vdev_created = false;
1330 }
1331
1332 return ret;
1333 }
1334
ath12k_mac_monitor_start(struct ath12k * ar)1335 static int ath12k_mac_monitor_start(struct ath12k *ar)
1336 {
1337 struct ath12k_mac_get_any_chanctx_conf_arg arg;
1338 int ret;
1339
1340 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1341
1342 if (ar->monitor_started)
1343 return 0;
1344
1345 arg.ar = ar;
1346 arg.chanctx_conf = NULL;
1347 ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar),
1348 ath12k_mac_get_any_chanctx_conf_iter,
1349 &arg);
1350 if (!arg.chanctx_conf)
1351 return 0;
1352
1353 ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id,
1354 &arg.chanctx_conf->def);
1355 if (ret) {
1356 ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1357 return ret;
1358 }
1359
1360 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1361 if (ret) {
1362 ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret);
1363 return ret;
1364 }
1365
1366 ar->monitor_started = true;
1367 ar->num_started_vdevs++;
1368
1369 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n");
1370
1371 return 0;
1372 }
1373
ath12k_mac_monitor_stop(struct ath12k * ar)1374 static int ath12k_mac_monitor_stop(struct ath12k *ar)
1375 {
1376 int ret;
1377
1378 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1379
1380 if (!ar->monitor_started)
1381 return 0;
1382
1383 ret = ath12k_mac_monitor_vdev_stop(ar);
1384 if (ret) {
1385 ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1386 return ret;
1387 }
1388
1389 ar->monitor_started = false;
1390 ar->num_started_vdevs--;
1391 ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1392 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1393 return ret;
1394 }
1395
ath12k_mac_vdev_stop(struct ath12k_link_vif * arvif)1396 int ath12k_mac_vdev_stop(struct ath12k_link_vif *arvif)
1397 {
1398 struct ath12k_vif *ahvif = arvif->ahvif;
1399 struct ath12k *ar = arvif->ar;
1400 int ret;
1401
1402 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1403
1404 reinit_completion(&ar->vdev_setup_done);
1405
1406 ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
1407 if (ret) {
1408 ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
1409 arvif->vdev_id, ret);
1410 goto err;
1411 }
1412
1413 ret = ath12k_mac_vdev_setup_sync(ar);
1414 if (ret) {
1415 ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
1416 arvif->vdev_id, ret);
1417 goto err;
1418 }
1419
1420 WARN_ON(ar->num_started_vdevs == 0);
1421
1422 ar->num_started_vdevs--;
1423 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
1424 ahvif->vif->addr, arvif->vdev_id);
1425
1426 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) {
1427 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
1428 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
1429 arvif->vdev_id);
1430 }
1431
1432 return 0;
1433 err:
1434 return ret;
1435 }
1436
ath12k_mac_op_config(struct ieee80211_hw * hw,int radio_idx,u32 changed)1437 static int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed)
1438 {
1439 return 0;
1440 }
1441
ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif * arvif,struct sk_buff * bcn)1442 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif *arvif,
1443 struct sk_buff *bcn)
1444 {
1445 struct ath12k *ar = arvif->ar;
1446 struct ieee80211_mgmt *mgmt;
1447 const u8 *p2p_ie;
1448 int ret;
1449
1450 mgmt = (void *)bcn->data;
1451 p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1452 mgmt->u.beacon.variable,
1453 bcn->len - (mgmt->u.beacon.variable -
1454 bcn->data));
1455 if (!p2p_ie) {
1456 ath12k_warn(ar->ab, "no P2P ie found in beacon\n");
1457 return -ENOENT;
1458 }
1459
1460 ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1461 if (ret) {
1462 ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n",
1463 arvif->vdev_id, ret);
1464 return ret;
1465 }
1466
1467 return 0;
1468 }
1469
ath12k_mac_remove_vendor_ie(struct sk_buff * skb,unsigned int oui,u8 oui_type,size_t ie_offset)1470 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1471 u8 oui_type, size_t ie_offset)
1472 {
1473 const u8 *next, *end;
1474 size_t len;
1475 u8 *ie;
1476
1477 if (WARN_ON(skb->len < ie_offset))
1478 return -EINVAL;
1479
1480 ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1481 skb->data + ie_offset,
1482 skb->len - ie_offset);
1483 if (!ie)
1484 return -ENOENT;
1485
1486 len = ie[1] + 2;
1487 end = skb->data + skb->len;
1488 next = ie + len;
1489
1490 if (WARN_ON(next > end))
1491 return -EINVAL;
1492
1493 memmove(ie, next, end - next);
1494 skb_trim(skb, skb->len - len);
1495
1496 return 0;
1497 }
1498
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)1499 static void ath12k_mac_set_arvif_ies(struct ath12k_link_vif *arvif,
1500 struct ath12k_link_vif *tx_arvif,
1501 struct sk_buff *bcn,
1502 u8 bssid_index, bool *nontx_profile_found)
1503 {
1504 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data;
1505 const struct element *elem, *nontx, *index, *nie, *ext_cap_ie;
1506 const u8 *start, *tail;
1507 u16 rem_len;
1508 u8 i;
1509
1510 start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon);
1511 tail = skb_tail_pointer(bcn);
1512 rem_len = tail - start;
1513
1514 arvif->rsnie_present = false;
1515 arvif->wpaie_present = false;
1516
1517 if (cfg80211_find_ie(WLAN_EID_RSN, start, rem_len))
1518 arvif->rsnie_present = true;
1519 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPA,
1520 start, rem_len))
1521 arvif->wpaie_present = true;
1522
1523 ext_cap_ie = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, start, rem_len);
1524 if (ext_cap_ie && ext_cap_ie->datalen >= 11 &&
1525 (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT))
1526 tx_arvif->beacon_prot = true;
1527
1528 /* Return from here for the transmitted profile */
1529 if (!bssid_index)
1530 return;
1531
1532 /* Initial rsnie_present for the nontransmitted profile is set to be same as that
1533 * of the transmitted profile. It will be changed if security configurations are
1534 * different.
1535 */
1536 *nontx_profile_found = false;
1537 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, rem_len) {
1538 /* Fixed minimum MBSSID element length with at least one
1539 * nontransmitted BSSID profile is 12 bytes as given below;
1540 * 1 (max BSSID indicator) +
1541 * 2 (Nontransmitted BSSID profile: Subelement ID + length) +
1542 * 4 (Nontransmitted BSSID Capabilities: tag + length + info)
1543 * 2 (Nontransmitted BSSID SSID: tag + length)
1544 * 3 (Nontransmitted BSSID Index: tag + length + BSSID index
1545 */
1546 if (elem->datalen < 12 || elem->data[0] < 1)
1547 continue; /* Max BSSID indicator must be >=1 */
1548
1549 for_each_element(nontx, elem->data + 1, elem->datalen - 1) {
1550 start = nontx->data;
1551
1552 if (nontx->id != 0 || nontx->datalen < 4)
1553 continue; /* Invalid nontransmitted profile */
1554
1555 if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
1556 nontx->data[1] != 2) {
1557 continue; /* Missing nontransmitted BSS capabilities */
1558 }
1559
1560 if (nontx->data[4] != WLAN_EID_SSID)
1561 continue; /* Missing SSID for nontransmitted BSS */
1562
1563 index = cfg80211_find_elem(WLAN_EID_MULTI_BSSID_IDX,
1564 start, nontx->datalen);
1565 if (!index || index->datalen < 1 || index->data[0] == 0)
1566 continue; /* Invalid MBSSID Index element */
1567
1568 if (index->data[0] == bssid_index) {
1569 *nontx_profile_found = true;
1570
1571 /* Check if nontx BSS has beacon protection enabled */
1572 if (!tx_arvif->beacon_prot) {
1573 ext_cap_ie =
1574 cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY,
1575 nontx->data,
1576 nontx->datalen);
1577 if (ext_cap_ie && ext_cap_ie->datalen >= 11 &&
1578 (ext_cap_ie->data[10] &
1579 WLAN_EXT_CAPA11_BCN_PROTECT))
1580 tx_arvif->beacon_prot = true;
1581 }
1582
1583 if (cfg80211_find_ie(WLAN_EID_RSN,
1584 nontx->data,
1585 nontx->datalen)) {
1586 arvif->rsnie_present = true;
1587 return;
1588 } else if (!arvif->rsnie_present) {
1589 return; /* Both tx and nontx BSS are open */
1590 }
1591
1592 nie = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
1593 nontx->data,
1594 nontx->datalen);
1595 if (!nie || nie->datalen < 2)
1596 return; /* Invalid non-inheritance element */
1597
1598 for (i = 1; i < nie->datalen - 1; i++) {
1599 if (nie->data[i] == WLAN_EID_RSN) {
1600 arvif->rsnie_present = false;
1601 break;
1602 }
1603 }
1604
1605 return;
1606 }
1607 }
1608 }
1609 }
1610
ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif * arvif,struct ath12k_link_vif * tx_arvif,u8 bssid_index)1611 static int ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif *arvif,
1612 struct ath12k_link_vif *tx_arvif,
1613 u8 bssid_index)
1614 {
1615 struct ath12k_wmi_bcn_tmpl_ema_arg ema_args;
1616 struct ieee80211_ema_beacons *beacons;
1617 bool nontx_profile_found = false;
1618 int ret = 0;
1619 u8 i;
1620
1621 beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar),
1622 tx_arvif->ahvif->vif,
1623 tx_arvif->link_id);
1624 if (!beacons || !beacons->cnt) {
1625 ath12k_warn(arvif->ar->ab,
1626 "failed to get ema beacon templates from mac80211\n");
1627 return -EPERM;
1628 }
1629
1630 if (tx_arvif == arvif)
1631 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL);
1632
1633 for (i = 0; i < beacons->cnt; i++) {
1634 if (tx_arvif != arvif && !nontx_profile_found)
1635 ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb,
1636 bssid_index,
1637 &nontx_profile_found);
1638
1639 ema_args.bcn_cnt = beacons->cnt;
1640 ema_args.bcn_index = i;
1641 ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs,
1642 beacons->bcn[i].skb, &ema_args);
1643 if (ret) {
1644 ath12k_warn(tx_arvif->ar->ab,
1645 "failed to set ema beacon template id %i error %d\n",
1646 i, ret);
1647 break;
1648 }
1649 }
1650
1651 if (tx_arvif != arvif && !nontx_profile_found)
1652 ath12k_warn(arvif->ar->ab,
1653 "nontransmitted bssid index %u not found in beacon template\n",
1654 bssid_index);
1655
1656 ieee80211_beacon_free_ema_list(beacons);
1657 return ret;
1658 }
1659
ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif * arvif)1660 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif)
1661 {
1662 struct ath12k_vif *ahvif = arvif->ahvif;
1663 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
1664 struct ieee80211_bss_conf *link_conf;
1665 struct ath12k_link_vif *tx_arvif;
1666 struct ath12k *ar = arvif->ar;
1667 struct ath12k_base *ab = ar->ab;
1668 struct ieee80211_mutable_offsets offs = {};
1669 bool nontx_profile_found = false;
1670 struct sk_buff *bcn;
1671 int ret;
1672
1673 if (ahvif->vdev_type != WMI_VDEV_TYPE_AP)
1674 return 0;
1675
1676 link_conf = ath12k_mac_get_link_bss_conf(arvif);
1677 if (!link_conf) {
1678 ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n",
1679 vif->addr, arvif->link_id);
1680 return -ENOLINK;
1681 }
1682
1683 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
1684 if (tx_arvif) {
1685 if (tx_arvif != arvif && arvif->is_up)
1686 return 0;
1687
1688 if (link_conf->ema_ap)
1689 return ath12k_mac_setup_bcn_tmpl_ema(arvif, tx_arvif,
1690 link_conf->bssid_index);
1691 } else {
1692 tx_arvif = arvif;
1693 }
1694
1695 bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar),
1696 tx_arvif->ahvif->vif,
1697 &offs, tx_arvif->link_id);
1698 if (!bcn) {
1699 ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1700 return -EPERM;
1701 }
1702
1703 if (tx_arvif == arvif) {
1704 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 0, NULL);
1705 } else {
1706 ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn,
1707 link_conf->bssid_index,
1708 &nontx_profile_found);
1709 if (!nontx_profile_found)
1710 ath12k_warn(ab,
1711 "nontransmitted profile not found in beacon template\n");
1712 }
1713
1714 if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) {
1715 ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn);
1716 if (ret) {
1717 ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n",
1718 ret);
1719 goto free_bcn_skb;
1720 }
1721
1722 /* P2P IE is inserted by firmware automatically (as
1723 * configured above) so remove it from the base beacon
1724 * template to avoid duplicate P2P IEs in beacon frames.
1725 */
1726 ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA,
1727 WLAN_OUI_TYPE_WFA_P2P,
1728 offsetof(struct ieee80211_mgmt,
1729 u.beacon.variable));
1730 if (ret) {
1731 ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n",
1732 ret);
1733 goto free_bcn_skb;
1734 }
1735 }
1736
1737 ret = ath12k_wmi_bcn_tmpl(arvif, &offs, bcn, NULL);
1738
1739 if (ret)
1740 ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1741 ret);
1742
1743 free_bcn_skb:
1744 kfree_skb(bcn);
1745 return ret;
1746 }
1747
ath12k_control_beaconing(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)1748 static void ath12k_control_beaconing(struct ath12k_link_vif *arvif,
1749 struct ieee80211_bss_conf *info)
1750 {
1751 struct ath12k_wmi_vdev_up_params params = {};
1752 struct ath12k_vif *ahvif = arvif->ahvif;
1753 struct ath12k *ar = arvif->ar;
1754 int ret;
1755
1756 lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy);
1757
1758 if (!info->enable_beacon) {
1759 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1760 if (ret)
1761 ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1762 arvif->vdev_id, ret);
1763
1764 arvif->is_up = false;
1765 return;
1766 }
1767
1768 /* Install the beacon template to the FW */
1769 ret = ath12k_mac_setup_bcn_tmpl(arvif);
1770 if (ret) {
1771 ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1772 ret);
1773 return;
1774 }
1775
1776 ahvif->aid = 0;
1777
1778 ether_addr_copy(arvif->bssid, info->addr);
1779
1780 params.vdev_id = arvif->vdev_id;
1781 params.aid = ahvif->aid;
1782 params.bssid = arvif->bssid;
1783 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
1784 if (params.tx_bssid) {
1785 params.nontx_profile_idx = info->bssid_index;
1786 params.nontx_profile_cnt = 1 << info->bssid_indicator;
1787 }
1788 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
1789 if (ret) {
1790 ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1791 arvif->vdev_id, ret);
1792 return;
1793 }
1794
1795 arvif->is_up = true;
1796
1797 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1798 }
1799
ath12k_mac_handle_beacon_iter(void * data,u8 * mac,struct ieee80211_vif * vif)1800 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac,
1801 struct ieee80211_vif *vif)
1802 {
1803 struct sk_buff *skb = data;
1804 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1805 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
1806 struct ath12k_link_vif *arvif = &ahvif->deflink;
1807
1808 if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created)
1809 return;
1810
1811 if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1812 return;
1813
1814 cancel_delayed_work(&arvif->connection_loss_work);
1815 }
1816
ath12k_mac_handle_beacon(struct ath12k * ar,struct sk_buff * skb)1817 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb)
1818 {
1819 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
1820 IEEE80211_IFACE_ITER_NORMAL,
1821 ath12k_mac_handle_beacon_iter,
1822 skb);
1823 }
1824
ath12k_mac_handle_beacon_miss_iter(void * data,u8 * mac,struct ieee80211_vif * vif)1825 static void ath12k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1826 struct ieee80211_vif *vif)
1827 {
1828 u32 *vdev_id = data;
1829 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
1830 struct ath12k_link_vif *arvif = &ahvif->deflink;
1831 struct ieee80211_hw *hw;
1832
1833 if (!arvif->is_created || arvif->vdev_id != *vdev_id)
1834 return;
1835
1836 if (!arvif->is_up)
1837 return;
1838
1839 ieee80211_beacon_loss(vif);
1840 hw = ath12k_ar_to_hw(arvif->ar);
1841
1842 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1843 * (done by mac80211) succeeds but beacons do not resume then it
1844 * doesn't make sense to continue operation. Queue connection loss work
1845 * which can be cancelled when beacon is received.
1846 */
1847 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1848 ATH12K_CONNECTION_LOSS_HZ);
1849 }
1850
ath12k_mac_handle_beacon_miss(struct ath12k * ar,u32 vdev_id)1851 void ath12k_mac_handle_beacon_miss(struct ath12k *ar, u32 vdev_id)
1852 {
1853 ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
1854 IEEE80211_IFACE_ITER_NORMAL,
1855 ath12k_mac_handle_beacon_miss_iter,
1856 &vdev_id);
1857 }
1858
ath12k_mac_vif_sta_connection_loss_work(struct work_struct * work)1859 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1860 {
1861 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif,
1862 connection_loss_work.work);
1863 struct ieee80211_vif *vif = arvif->ahvif->vif;
1864
1865 if (!arvif->is_up)
1866 return;
1867
1868 ieee80211_connection_loss(vif);
1869 }
1870
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)1871 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1872 struct ath12k_link_vif *arvif,
1873 struct ath12k_link_sta *arsta,
1874 struct ath12k_wmi_peer_assoc_arg *arg)
1875 {
1876 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1877 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1878 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1879 struct ieee80211_bss_conf *bss_conf;
1880 u32 aid;
1881
1882 lockdep_assert_wiphy(hw->wiphy);
1883
1884 if (vif->type == NL80211_IFTYPE_STATION)
1885 aid = vif->cfg.aid;
1886 else
1887 aid = sta->aid;
1888
1889 ether_addr_copy(arg->peer_mac, arsta->addr);
1890 arg->vdev_id = arvif->vdev_id;
1891 arg->peer_associd = aid;
1892 arg->auth_flag = true;
1893 /* TODO: STA WAR in ath10k for listen interval required? */
1894 arg->peer_listen_intval = hw->conf.listen_interval;
1895 arg->peer_nss = 1;
1896
1897 bss_conf = ath12k_mac_get_link_bss_conf(arvif);
1898 if (!bss_conf) {
1899 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n",
1900 vif->addr, arvif->link_id);
1901 return;
1902 }
1903
1904 arg->peer_caps = bss_conf->assoc_capability;
1905 }
1906
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)1907 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1908 struct ath12k_link_vif *arvif,
1909 struct ath12k_link_sta *arsta,
1910 struct ath12k_wmi_peer_assoc_arg *arg)
1911 {
1912 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1913 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1914 struct ieee80211_bss_conf *info;
1915 struct cfg80211_chan_def def;
1916 struct cfg80211_bss *bss;
1917 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1918 const u8 *rsnie = NULL;
1919 const u8 *wpaie = NULL;
1920
1921 lockdep_assert_wiphy(hw->wiphy);
1922
1923 info = ath12k_mac_get_link_bss_conf(arvif);
1924 if (!info) {
1925 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n",
1926 vif->addr, arvif->link_id);
1927 return;
1928 }
1929
1930 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1931 return;
1932
1933 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1934 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1935
1936 if (arvif->rsnie_present || arvif->wpaie_present) {
1937 arg->need_ptk_4_way = true;
1938 if (arvif->wpaie_present)
1939 arg->need_gtk_2_way = true;
1940 } else if (bss) {
1941 const struct cfg80211_bss_ies *ies;
1942
1943 rcu_read_lock();
1944 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1945
1946 ies = rcu_dereference(bss->ies);
1947
1948 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1949 WLAN_OUI_TYPE_MICROSOFT_WPA,
1950 ies->data,
1951 ies->len);
1952 rcu_read_unlock();
1953 cfg80211_put_bss(hw->wiphy, bss);
1954 }
1955
1956 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1957 if (rsnie || wpaie) {
1958 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1959 "%s: rsn ie found\n", __func__);
1960 arg->need_ptk_4_way = true;
1961 }
1962
1963 if (wpaie) {
1964 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1965 "%s: wpa ie found\n", __func__);
1966 arg->need_gtk_2_way = true;
1967 }
1968
1969 if (sta->mfp) {
1970 /* TODO: Need to check if FW supports PMF? */
1971 arg->is_pmf_enabled = true;
1972 }
1973
1974 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1975 }
1976
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)1977 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1978 struct ath12k_link_vif *arvif,
1979 struct ath12k_link_sta *arsta,
1980 struct ath12k_wmi_peer_assoc_arg *arg)
1981 {
1982 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1983 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1984 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1985 struct ieee80211_link_sta *link_sta;
1986 struct cfg80211_chan_def def;
1987 const struct ieee80211_supported_band *sband;
1988 const struct ieee80211_rate *rates;
1989 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1990 enum nl80211_band band;
1991 u32 ratemask;
1992 u8 rate;
1993 int i;
1994
1995 lockdep_assert_wiphy(hw->wiphy);
1996
1997 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1998 return;
1999
2000 link_sta = ath12k_mac_get_link_sta(arsta);
2001 if (!link_sta) {
2002 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n",
2003 sta->addr, arsta->link_id);
2004 return;
2005 }
2006
2007 band = def.chan->band;
2008 sband = hw->wiphy->bands[band];
2009 ratemask = link_sta->supp_rates[band];
2010 ratemask &= arvif->bitrate_mask.control[band].legacy;
2011 rates = sband->bitrates;
2012
2013 rateset->num_rates = 0;
2014
2015 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2016 if (!(ratemask & 1))
2017 continue;
2018
2019 rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
2020 rateset->rates[rateset->num_rates] = rate;
2021 rateset->num_rates++;
2022 }
2023 }
2024
2025 static bool
ath12k_peer_assoc_h_ht_masked(const u8 * ht_mcs_mask)2026 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
2027 {
2028 int nss;
2029
2030 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2031 if (ht_mcs_mask[nss])
2032 return false;
2033
2034 return true;
2035 }
2036
2037 static bool
ath12k_peer_assoc_h_vht_masked(const u16 * vht_mcs_mask)2038 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
2039 {
2040 int nss;
2041
2042 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2043 if (vht_mcs_mask[nss])
2044 return false;
2045
2046 return true;
2047 }
2048
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)2049 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
2050 struct ath12k_link_vif *arvif,
2051 struct ath12k_link_sta *arsta,
2052 struct ath12k_wmi_peer_assoc_arg *arg)
2053 {
2054 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2055 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2056 const struct ieee80211_sta_ht_cap *ht_cap;
2057 struct ieee80211_link_sta *link_sta;
2058 struct cfg80211_chan_def def;
2059 enum nl80211_band band;
2060 const u8 *ht_mcs_mask;
2061 int i, n;
2062 u8 max_nss;
2063 u32 stbc;
2064
2065 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2066
2067 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2068 return;
2069
2070 link_sta = ath12k_mac_get_link_sta(arsta);
2071 if (!link_sta) {
2072 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n",
2073 sta->addr, arsta->link_id);
2074 return;
2075 }
2076
2077 ht_cap = &link_sta->ht_cap;
2078 if (!ht_cap->ht_supported)
2079 return;
2080
2081 band = def.chan->band;
2082 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2083
2084 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
2085 return;
2086
2087 arg->ht_flag = true;
2088
2089 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2090 ht_cap->ampdu_factor)) - 1;
2091
2092 arg->peer_mpdu_density =
2093 ath12k_parse_mpdudensity(ht_cap->ampdu_density);
2094
2095 arg->peer_ht_caps = ht_cap->cap;
2096 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
2097
2098 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2099 arg->ldpc_flag = true;
2100
2101 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2102 arg->bw_40 = true;
2103 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
2104 }
2105
2106 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20
2107 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both
2108 * flags if guard interval is to force Long GI
2109 */
2110 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) {
2111 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40);
2112 } else {
2113 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */
2114 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40))
2115 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
2116 }
2117
2118 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2119 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
2120 arg->stbc_flag = true;
2121 }
2122
2123 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2124 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2125 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2126 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
2127 arg->peer_rate_caps |= stbc;
2128 arg->stbc_flag = true;
2129 }
2130
2131 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2132 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
2133 else if (ht_cap->mcs.rx_mask[1])
2134 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
2135
2136 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2137 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2138 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2139 max_nss = (i / 8) + 1;
2140 arg->peer_ht_rates.rates[n++] = i;
2141 }
2142
2143 /* This is a workaround for HT-enabled STAs which break the spec
2144 * and have no HT capabilities RX mask (no HT RX MCS map).
2145 *
2146 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2147 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2148 *
2149 * Firmware asserts if such situation occurs.
2150 */
2151 if (n == 0) {
2152 arg->peer_ht_rates.num_rates = 8;
2153 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2154 arg->peer_ht_rates.rates[i] = i;
2155 } else {
2156 arg->peer_ht_rates.num_rates = n;
2157 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2158 }
2159
2160 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2161 arg->peer_mac,
2162 arg->peer_ht_rates.num_rates,
2163 arg->peer_nss);
2164 }
2165
ath12k_mac_get_max_vht_mcs_map(u16 mcs_map,int nss)2166 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
2167 {
2168 switch ((mcs_map >> (2 * nss)) & 0x3) {
2169 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
2170 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
2171 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
2172 }
2173 return 0;
2174 }
2175
2176 static u16
ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])2177 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2178 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2179 {
2180 int idx_limit;
2181 int nss;
2182 u16 mcs_map;
2183 u16 mcs;
2184
2185 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2186 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2187 vht_mcs_limit[nss];
2188
2189 if (mcs_map)
2190 idx_limit = fls(mcs_map) - 1;
2191 else
2192 idx_limit = -1;
2193
2194 switch (idx_limit) {
2195 case 0:
2196 case 1:
2197 case 2:
2198 case 3:
2199 case 4:
2200 case 5:
2201 case 6:
2202 case 7:
2203 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2204 break;
2205 case 8:
2206 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2207 break;
2208 case 9:
2209 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2210 break;
2211 default:
2212 WARN_ON(1);
2213 fallthrough;
2214 case -1:
2215 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2216 break;
2217 }
2218
2219 tx_mcs_set &= ~(0x3 << (nss * 2));
2220 tx_mcs_set |= mcs << (nss * 2);
2221 }
2222
2223 return tx_mcs_set;
2224 }
2225
ath12k_get_nss_160mhz(struct ath12k * ar,u8 max_nss)2226 static u8 ath12k_get_nss_160mhz(struct ath12k *ar,
2227 u8 max_nss)
2228 {
2229 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2230 u8 max_sup_nss = 0;
2231
2232 switch (nss_ratio_info) {
2233 case WMI_NSS_RATIO_1BY2_NSS:
2234 max_sup_nss = max_nss >> 1;
2235 break;
2236 case WMI_NSS_RATIO_3BY4_NSS:
2237 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2238 break;
2239 case WMI_NSS_RATIO_1_NSS:
2240 max_sup_nss = max_nss;
2241 break;
2242 case WMI_NSS_RATIO_2_NSS:
2243 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2244 break;
2245 default:
2246 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n",
2247 nss_ratio_info);
2248 break;
2249 }
2250
2251 return max_sup_nss;
2252 }
2253
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)2254 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
2255 struct ath12k_link_vif *arvif,
2256 struct ath12k_link_sta *arsta,
2257 struct ath12k_wmi_peer_assoc_arg *arg)
2258 {
2259 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2260 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2261 const struct ieee80211_sta_vht_cap *vht_cap;
2262 struct ieee80211_link_sta *link_sta;
2263 struct cfg80211_chan_def def;
2264 enum nl80211_band band;
2265 u16 *vht_mcs_mask;
2266 u16 tx_mcs_map;
2267 u8 ampdu_factor;
2268 u8 max_nss, vht_mcs;
2269 int i, vht_nss, nss_idx;
2270 bool user_rate_valid = true;
2271 u32 rx_nss, tx_nss, nss_160;
2272
2273 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2274
2275 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2276 return;
2277
2278 link_sta = ath12k_mac_get_link_sta(arsta);
2279 if (!link_sta) {
2280 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n",
2281 sta->addr, arsta->link_id);
2282 return;
2283 }
2284
2285 vht_cap = &link_sta->vht_cap;
2286 if (!vht_cap->vht_supported)
2287 return;
2288
2289 band = def.chan->band;
2290 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2291
2292 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
2293 return;
2294
2295 arg->vht_flag = true;
2296
2297 /* TODO: similar flags required? */
2298 arg->vht_capable = true;
2299
2300 if (def.chan->band == NL80211_BAND_2GHZ)
2301 arg->vht_ng_flag = true;
2302
2303 arg->peer_vht_caps = vht_cap->cap;
2304
2305 ampdu_factor = (vht_cap->cap &
2306 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2307 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2308
2309 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2310 * zero in VHT IE. Using it would result in degraded throughput.
2311 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2312 * it if VHT max_mpdu is smaller.
2313 */
2314 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2315 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2316 ampdu_factor)) - 1);
2317
2318 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2319 arg->bw_80 = true;
2320
2321 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2322 arg->bw_160 = true;
2323
2324 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
2325
2326 if (vht_nss > link_sta->rx_nss) {
2327 user_rate_valid = false;
2328 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2329 if (vht_mcs_mask[nss_idx]) {
2330 user_rate_valid = true;
2331 break;
2332 }
2333 }
2334 }
2335
2336 if (!user_rate_valid) {
2337 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2338 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n",
2339 link_sta->rx_nss, arsta->addr);
2340 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2341 }
2342
2343 /* Calculate peer NSS capability from VHT capabilities if STA
2344 * supports VHT.
2345 */
2346 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2347 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2348 (2 * i) & 3;
2349
2350 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2351 vht_mcs_mask[i])
2352 max_nss = i + 1;
2353 }
2354 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2355 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2356 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2357 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2358
2359 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
2360 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
2361
2362 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
2363 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
2364 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2365 */
2366 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2367 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2368
2369 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2370 IEEE80211_VHT_MCS_NOT_SUPPORTED)
2371 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2372
2373 /* TODO: Check */
2374 arg->tx_max_mcs_nss = 0xFF;
2375
2376 if (arg->peer_phymode == MODE_11AC_VHT160) {
2377 tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
2378 rx_nss = min(arg->peer_nss, tx_nss);
2379 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2380
2381 if (!rx_nss) {
2382 ath12k_warn(ar->ab, "invalid max_nss\n");
2383 return;
2384 }
2385
2386 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2387 arg->peer_bw_rxnss_override |= nss_160;
2388 }
2389
2390 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2391 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2392 arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
2393 arg->peer_bw_rxnss_override);
2394 }
2395
ath12k_mac_get_max_he_mcs_map(u16 mcs_map,int nss)2396 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2397 {
2398 switch ((mcs_map >> (2 * nss)) & 0x3) {
2399 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2400 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2401 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2402 }
2403 return 0;
2404 }
2405
ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,const u16 * he_mcs_limit)2406 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2407 const u16 *he_mcs_limit)
2408 {
2409 int idx_limit;
2410 int nss;
2411 u16 mcs_map;
2412 u16 mcs;
2413
2414 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2415 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2416 he_mcs_limit[nss];
2417
2418 if (mcs_map)
2419 idx_limit = fls(mcs_map) - 1;
2420 else
2421 idx_limit = -1;
2422
2423 switch (idx_limit) {
2424 case 0 ... 7:
2425 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2426 break;
2427 case 8:
2428 case 9:
2429 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2430 break;
2431 case 10:
2432 case 11:
2433 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2434 break;
2435 default:
2436 WARN_ON(1);
2437 fallthrough;
2438 case -1:
2439 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2440 break;
2441 }
2442
2443 tx_mcs_set &= ~(0x3 << (nss * 2));
2444 tx_mcs_set |= mcs << (nss * 2);
2445 }
2446
2447 return tx_mcs_set;
2448 }
2449
2450 static bool
ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])2451 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2452 {
2453 int nss;
2454
2455 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2456 if (he_mcs_mask[nss])
2457 return false;
2458
2459 return true;
2460 }
2461
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)2462 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
2463 struct ath12k_link_vif *arvif,
2464 struct ath12k_link_sta *arsta,
2465 struct ath12k_wmi_peer_assoc_arg *arg)
2466 {
2467 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2468 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2469 const struct ieee80211_sta_he_cap *he_cap;
2470 struct ieee80211_bss_conf *link_conf;
2471 struct ieee80211_link_sta *link_sta;
2472 struct cfg80211_chan_def def;
2473 int i;
2474 u8 ampdu_factor, max_nss;
2475 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2476 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2477 u16 mcs_160_map, mcs_80_map;
2478 u8 link_id = arvif->link_id;
2479 bool support_160;
2480 enum nl80211_band band;
2481 u16 *he_mcs_mask;
2482 u8 he_mcs;
2483 u16 he_tx_mcs = 0, v = 0;
2484 int he_nss, nss_idx;
2485 bool user_rate_valid = true;
2486 u32 rx_nss, tx_nss, nss_160;
2487
2488 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
2489 return;
2490
2491 link_conf = ath12k_mac_get_link_bss_conf(arvif);
2492 if (!link_conf) {
2493 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u",
2494 vif->addr, link_id);
2495 return;
2496 }
2497
2498 link_sta = ath12k_mac_get_link_sta(arsta);
2499 if (!link_sta) {
2500 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2501 sta->addr, arsta->link_id);
2502 return;
2503 }
2504
2505 he_cap = &link_sta->he_cap;
2506 if (!he_cap->has_he)
2507 return;
2508
2509 band = def.chan->band;
2510 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2511
2512 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask))
2513 return;
2514
2515 arg->he_flag = true;
2516
2517 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2518 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2519
2520 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2521 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2522 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2523
2524 if (support_160) {
2525 for (i = 7; i >= 0; i--) {
2526 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2527
2528 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2529 rx_mcs_160 = i + 1;
2530 break;
2531 }
2532 }
2533 }
2534
2535 for (i = 7; i >= 0; i--) {
2536 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2537
2538 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2539 rx_mcs_80 = i + 1;
2540 break;
2541 }
2542 }
2543
2544 if (support_160)
2545 max_nss = min(rx_mcs_80, rx_mcs_160);
2546 else
2547 max_nss = rx_mcs_80;
2548
2549 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2550
2551 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
2552 sizeof(he_cap->he_cap_elem.mac_cap_info));
2553 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
2554 sizeof(he_cap->he_cap_elem.phy_cap_info));
2555 arg->peer_he_ops = link_conf->he_oper.params;
2556
2557 /* the top most byte is used to indicate BSS color info */
2558 arg->peer_he_ops &= 0xffffff;
2559
2560 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
2561 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
2562 * as calculated while parsing VHT caps(if VHT caps is present)
2563 * or HT caps (if VHT caps is not present).
2564 *
2565 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
2566 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2567 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2568 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2569 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2570 * length.
2571 */
2572 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2573 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2574
2575 if (ampdu_factor) {
2576 if (link_sta->vht_cap.vht_supported)
2577 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2578 ampdu_factor)) - 1;
2579 else if (link_sta->ht_cap.ht_supported)
2580 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2581 ampdu_factor)) - 1;
2582 }
2583
2584 if (he_cap->he_cap_elem.phy_cap_info[6] &
2585 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2586 int bit = 7;
2587 int nss, ru;
2588
2589 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2590 IEEE80211_PPE_THRES_NSS_MASK;
2591 arg->peer_ppet.ru_bit_mask =
2592 (he_cap->ppe_thres[0] &
2593 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2594 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2595
2596 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2597 for (ru = 0; ru < 4; ru++) {
2598 u32 val = 0;
2599 int i;
2600
2601 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2602 continue;
2603 for (i = 0; i < 6; i++) {
2604 val >>= 1;
2605 val |= ((he_cap->ppe_thres[bit / 8] >>
2606 (bit % 8)) & 0x1) << 5;
2607 bit++;
2608 }
2609 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2610 val << (ru * 6);
2611 }
2612 }
2613 }
2614
2615 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2616 arg->twt_responder = true;
2617 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2618 arg->twt_requester = true;
2619
2620 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
2621
2622 if (he_nss > link_sta->rx_nss) {
2623 user_rate_valid = false;
2624 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2625 if (he_mcs_mask[nss_idx]) {
2626 user_rate_valid = true;
2627 break;
2628 }
2629 }
2630 }
2631
2632 if (!user_rate_valid) {
2633 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2634 "Setting he range MCS value to peer supported nss:%d for peer %pM\n",
2635 link_sta->rx_nss, arsta->addr);
2636 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2637 }
2638
2639 switch (link_sta->bandwidth) {
2640 case IEEE80211_STA_RX_BW_160:
2641 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2642 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2643
2644 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2645 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2646
2647 arg->peer_he_mcs_count++;
2648 if (!he_tx_mcs)
2649 he_tx_mcs = v;
2650 fallthrough;
2651
2652 default:
2653 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2654 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2655
2656 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2657 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2658 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2659
2660 arg->peer_he_mcs_count++;
2661 if (!he_tx_mcs)
2662 he_tx_mcs = v;
2663 break;
2664 }
2665
2666 /* Calculate peer NSS capability from HE capabilities if STA
2667 * supports HE.
2668 */
2669 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2670 he_mcs = he_tx_mcs >> (2 * i) & 3;
2671
2672 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2673 * unsupported range, with he_mcs_mask set, so check either of them
2674 * to find nss.
2675 */
2676 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2677 he_mcs_mask[i])
2678 max_nss = i + 1;
2679 }
2680
2681 max_nss = min(max_nss, ar->num_tx_chains);
2682 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2683
2684 if (arg->peer_phymode == MODE_11AX_HE160) {
2685 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
2686 rx_nss = min(arg->peer_nss, tx_nss);
2687
2688 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
2689 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2690
2691 if (!rx_nss) {
2692 ath12k_warn(ar->ab, "invalid max_nss\n");
2693 return;
2694 }
2695
2696 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2697 arg->peer_bw_rxnss_override |= nss_160;
2698 }
2699
2700 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2701 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2702 arsta->addr, arg->peer_nss,
2703 arg->peer_he_mcs_count,
2704 arg->peer_bw_rxnss_override);
2705 }
2706
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)2707 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
2708 struct ath12k_link_vif *arvif,
2709 struct ath12k_link_sta *arsta,
2710 struct ath12k_wmi_peer_assoc_arg *arg)
2711 {
2712 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2713 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2714 const struct ieee80211_sta_he_cap *he_cap;
2715 struct ieee80211_link_sta *link_sta;
2716 struct cfg80211_chan_def def;
2717 enum nl80211_band band;
2718 u8 ampdu_factor, mpdu_density;
2719
2720 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2721 return;
2722
2723 band = def.chan->band;
2724
2725 link_sta = ath12k_mac_get_link_sta(arsta);
2726 if (!link_sta) {
2727 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n",
2728 sta->addr, arsta->link_id);
2729 return;
2730 }
2731
2732 he_cap = &link_sta->he_cap;
2733
2734 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa)
2735 return;
2736
2737 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2738 arg->bw_40 = true;
2739
2740 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2741 arg->bw_80 = true;
2742
2743 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2744 arg->bw_160 = true;
2745
2746 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2747 arg->bw_320 = true;
2748
2749 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa);
2750
2751 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz,
2752 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
2753 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density);
2754
2755 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2756 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2757 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2758 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2759 * Band Capabilities element in the 6 GHz band.
2760 *
2761 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2762 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2763 */
2764 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2765 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) +
2766 u32_get_bits(arg->peer_he_caps_6ghz,
2767 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
2768
2769 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2770 ampdu_factor)) - 1;
2771 }
2772
ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa,int * smps)2773 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap,
2774 const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
2775 int *smps)
2776 {
2777 if (ht_cap->ht_supported)
2778 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS);
2779 else
2780 *smps = le16_get_bits(he_6ghz_capa->capa,
2781 IEEE80211_HE_6GHZ_CAP_SM_PS);
2782
2783 if (*smps >= ARRAY_SIZE(ath12k_smps_map))
2784 return -EINVAL;
2785
2786 return 0;
2787 }
2788
ath12k_peer_assoc_h_smps(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2789 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta,
2790 struct ath12k_wmi_peer_assoc_arg *arg)
2791 {
2792 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2793 const struct ieee80211_he_6ghz_capa *he_6ghz_capa;
2794 struct ath12k_link_vif *arvif = arsta->arvif;
2795 const struct ieee80211_sta_ht_cap *ht_cap;
2796 struct ieee80211_link_sta *link_sta;
2797 struct ath12k *ar = arvif->ar;
2798 int smps;
2799
2800 link_sta = ath12k_mac_get_link_sta(arsta);
2801 if (!link_sta) {
2802 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2803 sta->addr, arsta->link_id);
2804 return;
2805 }
2806
2807 he_6ghz_capa = &link_sta->he_6ghz_capa;
2808 ht_cap = &link_sta->ht_cap;
2809
2810 if (!ht_cap->ht_supported && !he_6ghz_capa->capa)
2811 return;
2812
2813 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps))
2814 return;
2815
2816 switch (smps) {
2817 case WLAN_HT_CAP_SM_PS_STATIC:
2818 arg->static_mimops_flag = true;
2819 break;
2820 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2821 arg->dynamic_mimops_flag = true;
2822 break;
2823 case WLAN_HT_CAP_SM_PS_DISABLED:
2824 arg->spatial_mux_flag = true;
2825 break;
2826 default:
2827 break;
2828 }
2829 }
2830
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)2831 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
2832 struct ath12k_link_vif *arvif,
2833 struct ath12k_link_sta *arsta,
2834 struct ath12k_wmi_peer_assoc_arg *arg)
2835 {
2836 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2837
2838 switch (arvif->ahvif->vdev_type) {
2839 case WMI_VDEV_TYPE_AP:
2840 if (sta->wme) {
2841 /* TODO: Check WME vs QoS */
2842 arg->is_wme_set = true;
2843 arg->qos_flag = true;
2844 }
2845
2846 if (sta->wme && sta->uapsd_queues) {
2847 /* TODO: Check WME vs QoS */
2848 arg->is_wme_set = true;
2849 arg->apsd_flag = true;
2850 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2851 }
2852 break;
2853 case WMI_VDEV_TYPE_STA:
2854 if (sta->wme) {
2855 arg->is_wme_set = true;
2856 arg->qos_flag = true;
2857 }
2858 break;
2859 default:
2860 break;
2861 }
2862
2863 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
2864 arsta->addr, arg->qos_flag);
2865 }
2866
ath12k_peer_assoc_qos_ap(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)2867 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
2868 struct ath12k_link_vif *arvif,
2869 struct ath12k_link_sta *arsta)
2870 {
2871 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2872 struct ath12k_wmi_ap_ps_arg arg;
2873 u32 max_sp;
2874 u32 uapsd;
2875 int ret;
2876
2877 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2878
2879 arg.vdev_id = arvif->vdev_id;
2880
2881 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2882 sta->uapsd_queues, sta->max_sp);
2883
2884 uapsd = 0;
2885 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2886 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2887 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2888 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2889 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2890 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2891 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2892 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2893 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2894 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2895 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2896 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2897
2898 max_sp = 0;
2899 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2900 max_sp = sta->max_sp;
2901
2902 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2903 arg.value = uapsd;
2904 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2905 if (ret)
2906 goto err;
2907
2908 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2909 arg.value = max_sp;
2910 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2911 if (ret)
2912 goto err;
2913
2914 /* TODO: revisit during testing */
2915 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2916 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2917 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2918 if (ret)
2919 goto err;
2920
2921 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2922 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2923 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2924 if (ret)
2925 goto err;
2926
2927 return 0;
2928
2929 err:
2930 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2931 arg.param, arvif->vdev_id, ret);
2932 return ret;
2933 }
2934
ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta * sta)2935 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta)
2936 {
2937 return sta->supp_rates[NL80211_BAND_2GHZ] >>
2938 ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2939 }
2940
ath12k_mac_get_phymode_vht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2941 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2942 struct ieee80211_link_sta *link_sta)
2943 {
2944 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2945 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2946 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
2947 return MODE_11AC_VHT160;
2948
2949 /* Allow STA to connect even if it does not explicitly advertise 160 MHz
2950 * support
2951 */
2952 return MODE_11AC_VHT160;
2953 }
2954
2955 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2956 return MODE_11AC_VHT80;
2957
2958 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2959 return MODE_11AC_VHT40;
2960
2961 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2962 return MODE_11AC_VHT20;
2963
2964 return MODE_UNKNOWN;
2965 }
2966
ath12k_mac_get_phymode_he(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2967 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2968 struct ieee80211_link_sta *link_sta)
2969 {
2970 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2971 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2972 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2973 return MODE_11AX_HE160;
2974
2975 return MODE_UNKNOWN;
2976 }
2977
2978 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2979 return MODE_11AX_HE80;
2980
2981 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2982 return MODE_11AX_HE40;
2983
2984 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2985 return MODE_11AX_HE20;
2986
2987 return MODE_UNKNOWN;
2988 }
2989
ath12k_mac_get_phymode_eht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2990 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
2991 struct ieee80211_link_sta *link_sta)
2992 {
2993 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2994 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] &
2995 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2996 return MODE_11BE_EHT320;
2997
2998 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2999 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
3000 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
3001 return MODE_11BE_EHT160;
3002
3003 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
3004 link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
3005
3006 return MODE_UNKNOWN;
3007 }
3008
3009 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3010 return MODE_11BE_EHT80;
3011
3012 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3013 return MODE_11BE_EHT40;
3014
3015 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
3016 return MODE_11BE_EHT20;
3017
3018 return MODE_UNKNOWN;
3019 }
3020
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)3021 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
3022 struct ath12k_link_vif *arvif,
3023 struct ath12k_link_sta *arsta,
3024 struct ath12k_wmi_peer_assoc_arg *arg)
3025 {
3026 struct ieee80211_link_sta *link_sta;
3027 struct cfg80211_chan_def def;
3028 enum nl80211_band band;
3029 const u8 *ht_mcs_mask;
3030 const u16 *vht_mcs_mask;
3031 const u16 *he_mcs_mask;
3032 enum wmi_phy_mode phymode = MODE_UNKNOWN;
3033
3034 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3035
3036 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3037 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3038
3039 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
3040 return;
3041
3042 band = def.chan->band;
3043 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3044 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3045 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
3046
3047 link_sta = ath12k_mac_get_link_sta(arsta);
3048 if (!link_sta) {
3049 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
3050 sta->addr, arsta->link_id);
3051 return;
3052 }
3053
3054 switch (band) {
3055 case NL80211_BAND_2GHZ:
3056 if (link_sta->eht_cap.has_eht) {
3057 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3058 phymode = MODE_11BE_EHT40_2G;
3059 else
3060 phymode = MODE_11BE_EHT20_2G;
3061 } else if (link_sta->he_cap.has_he &&
3062 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3063 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3064 phymode = MODE_11AX_HE80_2G;
3065 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3066 phymode = MODE_11AX_HE40_2G;
3067 else
3068 phymode = MODE_11AX_HE20_2G;
3069 } else if (link_sta->vht_cap.vht_supported &&
3070 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3071 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3072 phymode = MODE_11AC_VHT40;
3073 else
3074 phymode = MODE_11AC_VHT20;
3075 } else if (link_sta->ht_cap.ht_supported &&
3076 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3077 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3078 phymode = MODE_11NG_HT40;
3079 else
3080 phymode = MODE_11NG_HT20;
3081 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) {
3082 phymode = MODE_11G;
3083 } else {
3084 phymode = MODE_11B;
3085 }
3086 break;
3087 case NL80211_BAND_5GHZ:
3088 case NL80211_BAND_6GHZ:
3089 /* Check EHT first */
3090 if (link_sta->eht_cap.has_eht) {
3091 phymode = ath12k_mac_get_phymode_eht(ar, link_sta);
3092 } else if (link_sta->he_cap.has_he &&
3093 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3094 phymode = ath12k_mac_get_phymode_he(ar, link_sta);
3095 } else if (link_sta->vht_cap.vht_supported &&
3096 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3097 phymode = ath12k_mac_get_phymode_vht(ar, link_sta);
3098 } else if (link_sta->ht_cap.ht_supported &&
3099 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3100 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40)
3101 phymode = MODE_11NA_HT40;
3102 else
3103 phymode = MODE_11NA_HT20;
3104 } else {
3105 phymode = MODE_11A;
3106 }
3107 break;
3108 default:
3109 break;
3110 }
3111
3112 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
3113 arsta->addr, ath12k_mac_phymode_str(phymode));
3114
3115 arg->peer_phymode = phymode;
3116 WARN_ON(phymode == MODE_UNKNOWN);
3117 }
3118
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)3119 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
3120 u8 rx_tx_mcs11, u8 rx_tx_mcs13,
3121 u32 *rx_mcs, u32 *tx_mcs)
3122 {
3123 *rx_mcs = 0;
3124 u32p_replace_bits(rx_mcs,
3125 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
3126 WMI_EHT_MCS_NSS_0_7);
3127 u32p_replace_bits(rx_mcs,
3128 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
3129 WMI_EHT_MCS_NSS_8_9);
3130 u32p_replace_bits(rx_mcs,
3131 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
3132 WMI_EHT_MCS_NSS_10_11);
3133 u32p_replace_bits(rx_mcs,
3134 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
3135 WMI_EHT_MCS_NSS_12_13);
3136
3137 *tx_mcs = 0;
3138 u32p_replace_bits(tx_mcs,
3139 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
3140 WMI_EHT_MCS_NSS_0_7);
3141 u32p_replace_bits(tx_mcs,
3142 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
3143 WMI_EHT_MCS_NSS_8_9);
3144 u32p_replace_bits(tx_mcs,
3145 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
3146 WMI_EHT_MCS_NSS_10_11);
3147 u32p_replace_bits(tx_mcs,
3148 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
3149 WMI_EHT_MCS_NSS_12_13);
3150 }
3151
ath12k_mac_set_eht_ppe_threshold(const u8 * ppe_thres,struct ath12k_wmi_ppe_threshold_arg * ppet)3152 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
3153 struct ath12k_wmi_ppe_threshold_arg *ppet)
3154 {
3155 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
3156 u8 nss, ru, i;
3157 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
3158
3159 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
3160 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
3161 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3162
3163 for (nss = 0; nss <= ppet->numss_m1; nss++) {
3164 for (ru = 0;
3165 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3166 ru++) {
3167 if ((ppet->ru_bit_mask & BIT(ru)) == 0)
3168 continue;
3169
3170 val = 0;
3171 for (i = 0; i < ppet_bit_len_per_ru; i++) {
3172 val |= (((ppe_thres[bit_pos / 8] >>
3173 (bit_pos % 8)) & 0x1) << i);
3174 bit_pos++;
3175 }
3176 ppet->ppet16_ppet8_ru3_ru0[nss] |=
3177 (val << (ru * ppet_bit_len_per_ru));
3178 }
3179 }
3180 }
3181
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)3182 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
3183 struct ath12k_link_vif *arvif,
3184 struct ath12k_link_sta *arsta,
3185 struct ath12k_wmi_peer_assoc_arg *arg)
3186 {
3187 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3188 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
3189 const struct ieee80211_eht_mcs_nss_supp_bw *bw;
3190 const struct ieee80211_sta_eht_cap *eht_cap;
3191 const struct ieee80211_sta_he_cap *he_cap;
3192 struct ieee80211_link_sta *link_sta;
3193 struct ieee80211_bss_conf *link_conf;
3194 u32 *rx_mcs, *tx_mcs;
3195
3196 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3197
3198 link_sta = ath12k_mac_get_link_sta(arsta);
3199 if (!link_sta) {
3200 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n",
3201 sta->addr, arsta->link_id);
3202 return;
3203 }
3204
3205 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3206 if (!link_conf) {
3207 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n");
3208 return;
3209 }
3210
3211 eht_cap = &link_sta->eht_cap;
3212 he_cap = &link_sta->he_cap;
3213 if (!he_cap->has_he || !eht_cap->has_eht)
3214 return;
3215
3216 arg->eht_flag = true;
3217
3218 if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
3219 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
3220 eht_cap->eht_ppe_thres[0] != 0)
3221 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
3222 &arg->peer_eht_ppet);
3223
3224 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
3225 sizeof(eht_cap->eht_cap_elem.mac_cap_info));
3226 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
3227 sizeof(eht_cap->eht_cap_elem.phy_cap_info));
3228
3229 rx_mcs = arg->peer_eht_rx_mcs_set;
3230 tx_mcs = arg->peer_eht_tx_mcs_set;
3231
3232 switch (link_sta->bandwidth) {
3233 case IEEE80211_STA_RX_BW_320:
3234 bw = &eht_cap->eht_mcs_nss_supp.bw._320;
3235 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3236 bw->rx_tx_mcs9_max_nss,
3237 bw->rx_tx_mcs11_max_nss,
3238 bw->rx_tx_mcs13_max_nss,
3239 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
3240 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
3241 arg->peer_eht_mcs_count++;
3242 fallthrough;
3243 case IEEE80211_STA_RX_BW_160:
3244 bw = &eht_cap->eht_mcs_nss_supp.bw._160;
3245 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3246 bw->rx_tx_mcs9_max_nss,
3247 bw->rx_tx_mcs11_max_nss,
3248 bw->rx_tx_mcs13_max_nss,
3249 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
3250 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
3251 arg->peer_eht_mcs_count++;
3252 fallthrough;
3253 default:
3254 if ((he_cap->he_cap_elem.phy_cap_info[0] &
3255 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
3256 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3257 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
3258 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
3259 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
3260
3261 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
3262 bw_20->rx_tx_mcs9_max_nss,
3263 bw_20->rx_tx_mcs11_max_nss,
3264 bw_20->rx_tx_mcs13_max_nss,
3265 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3266 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3267 } else {
3268 bw = &eht_cap->eht_mcs_nss_supp.bw._80;
3269 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3270 bw->rx_tx_mcs9_max_nss,
3271 bw->rx_tx_mcs11_max_nss,
3272 bw->rx_tx_mcs13_max_nss,
3273 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3274 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3275 }
3276
3277 arg->peer_eht_mcs_count++;
3278 break;
3279 }
3280
3281 arg->punct_bitmap = ~arvif->punct_bitmap;
3282 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15;
3283 }
3284
ath12k_peer_assoc_h_mlo(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3285 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta,
3286 struct ath12k_wmi_peer_assoc_arg *arg)
3287 {
3288 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3289 struct peer_assoc_mlo_params *ml = &arg->ml;
3290 struct ath12k_sta *ahsta = arsta->ahsta;
3291 struct ath12k_link_sta *arsta_p;
3292 struct ath12k_link_vif *arvif;
3293 unsigned long links;
3294 u8 link_id;
3295 int i;
3296
3297 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID)
3298 return;
3299
3300 ml->enabled = true;
3301 ml->assoc_link = arsta->is_assoc_link;
3302
3303 /* For now considering the primary umac based on assoc link */
3304 ml->primary_umac = arsta->is_assoc_link;
3305 ml->peer_id_valid = true;
3306 ml->logical_link_idx_valid = true;
3307
3308 ether_addr_copy(ml->mld_addr, sta->addr);
3309 ml->logical_link_idx = arsta->link_idx;
3310 ml->ml_peer_id = ahsta->ml_peer_id;
3311 ml->ieee_link_id = arsta->link_id;
3312 ml->num_partner_links = 0;
3313 ml->eml_cap = sta->eml_cap;
3314 links = ahsta->links_map;
3315
3316 rcu_read_lock();
3317
3318 i = 0;
3319
3320 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
3321 if (i >= ATH12K_WMI_MLO_MAX_LINKS)
3322 break;
3323
3324 arsta_p = rcu_dereference(ahsta->link[link_id]);
3325 arvif = rcu_dereference(ahsta->ahvif->link[link_id]);
3326
3327 if (arsta_p == arsta)
3328 continue;
3329
3330 if (!arvif->is_started)
3331 continue;
3332
3333 ml->partner_info[i].vdev_id = arvif->vdev_id;
3334 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id;
3335 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link;
3336 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link;
3337 ml->partner_info[i].logical_link_idx_valid = true;
3338 ml->partner_info[i].logical_link_idx = arsta_p->link_idx;
3339 ml->num_partner_links++;
3340
3341 i++;
3342 }
3343
3344 rcu_read_unlock();
3345 }
3346
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)3347 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
3348 struct ath12k_link_vif *arvif,
3349 struct ath12k_link_sta *arsta,
3350 struct ath12k_wmi_peer_assoc_arg *arg,
3351 bool reassoc)
3352 {
3353 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3354
3355 memset(arg, 0, sizeof(*arg));
3356
3357 reinit_completion(&ar->peer_assoc_done);
3358
3359 arg->peer_new_assoc = !reassoc;
3360 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg);
3361 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg);
3362 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg);
3363 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg);
3364 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg);
3365 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg);
3366 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg);
3367 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg);
3368 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg);
3369 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg);
3370 ath12k_peer_assoc_h_smps(arsta, arg);
3371 ath12k_peer_assoc_h_mlo(arsta, arg);
3372
3373 arsta->peer_nss = arg->peer_nss;
3374 /* TODO: amsdu_disable req? */
3375 }
3376
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)3377 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif,
3378 const u8 *addr,
3379 const struct ieee80211_sta_ht_cap *ht_cap,
3380 const struct ieee80211_he_6ghz_capa *he_6ghz_capa)
3381 {
3382 int smps, ret = 0;
3383
3384 if (!ht_cap->ht_supported && !he_6ghz_capa)
3385 return 0;
3386
3387 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps);
3388 if (ret < 0)
3389 return ret;
3390
3391 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
3392 WMI_PEER_MIMO_PS_STATE,
3393 ath12k_smps_map[smps]);
3394 }
3395
ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif * arvif)3396 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
3397 {
3398 struct ath12k_vif *ahvif = arvif->ahvif;
3399 struct ath12k *ar = arvif->ar;
3400 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
3401 u32 value = 0;
3402 int ret;
3403 struct ieee80211_bss_conf *link_conf;
3404
3405 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3406 if (!link_conf) {
3407 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n");
3408 return -EINVAL;
3409 }
3410
3411 if (!link_conf->he_support)
3412 return 0;
3413
3414 if (link_conf->he_su_beamformer) {
3415 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3416 if (link_conf->he_mu_beamformer &&
3417 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3418 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER);
3419 }
3420
3421 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3422 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3423 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3424
3425 if (link_conf->he_full_ul_mumimo)
3426 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO);
3427
3428 if (link_conf->he_su_beamformee)
3429 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3430 }
3431
3432 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3433 if (ret) {
3434 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
3435 arvif->vdev_id, ret);
3436 return ret;
3437 }
3438
3439 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
3440 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
3441 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
3442 HE_TRIG_NONTRIG_SOUNDING_MODE);
3443 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3444 param, value);
3445 if (ret) {
3446 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
3447 arvif->vdev_id, ret);
3448 return ret;
3449 }
3450
3451 return 0;
3452 }
3453
ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_sta_he_cap * he_cap,int * hemode)3454 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
3455 struct ath12k_link_vif *arvif,
3456 struct ieee80211_sta_he_cap *he_cap,
3457 int *hemode)
3458 {
3459 struct ieee80211_vif *vif = arvif->ahvif->vif;
3460 struct ieee80211_he_cap_elem he_cap_elem = {};
3461 struct ieee80211_sta_he_cap *cap_band;
3462 struct cfg80211_chan_def def;
3463 u8 link_id = arvif->link_id;
3464 struct ieee80211_bss_conf *link_conf;
3465
3466 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3467 if (!link_conf) {
3468 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n");
3469 return -EINVAL;
3470 }
3471
3472 if (!link_conf->he_support)
3473 return 0;
3474
3475 if (vif->type != NL80211_IFTYPE_STATION)
3476 return -EINVAL;
3477
3478 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
3479 return -EINVAL;
3480
3481 if (def.chan->band == NL80211_BAND_2GHZ)
3482 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
3483 else
3484 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
3485
3486 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
3487
3488 *hemode = 0;
3489 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
3490 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3491 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3492 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3493 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
3494 }
3495
3496 if (vif->type != NL80211_IFTYPE_MESH_POINT) {
3497 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3498 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3499
3500 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
3501 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
3502 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE,
3503 HE_MODE_UL_MUMIMO);
3504
3505 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE))
3506 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3507
3508 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER))
3509 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3510 }
3511
3512 return 0;
3513 }
3514
ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif * arvif)3515 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
3516 {
3517 struct ath12k_vif *ahvif = arvif->ahvif;
3518 struct ath12k *ar = arvif->ar;
3519 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
3520 u32 value = 0;
3521 int ret;
3522 struct ieee80211_bss_conf *link_conf;
3523
3524 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3525 if (!link_conf) {
3526 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
3527 return -ENOENT;
3528 }
3529
3530 if (!link_conf->eht_support)
3531 return 0;
3532
3533 if (link_conf->eht_su_beamformer) {
3534 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
3535 if (link_conf->eht_mu_beamformer &&
3536 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3537 value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
3538 EHT_MODE_MU_TX_BFER) |
3539 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
3540 EHT_MODE_DL_OFDMA_MUMIMO) |
3541 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
3542 EHT_MODE_UL_OFDMA_MUMIMO);
3543 }
3544
3545 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3546 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
3547 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
3548
3549 if (link_conf->eht_80mhz_full_bw_ul_mumimo)
3550 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
3551
3552 if (link_conf->eht_su_beamformee)
3553 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
3554 EHT_MODE_SU_TX_BFEE);
3555 }
3556
3557 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3558 if (ret) {
3559 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
3560 arvif->vdev_id, ret);
3561 return ret;
3562 }
3563
3564 return 0;
3565 }
3566
ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k * ar,struct ieee80211_link_sta * link_sta)3567 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3568 struct ieee80211_link_sta *link_sta)
3569 {
3570 u32 bw;
3571
3572 switch (link_sta->bandwidth) {
3573 case IEEE80211_STA_RX_BW_20:
3574 bw = WMI_PEER_CHWIDTH_20MHZ;
3575 break;
3576 case IEEE80211_STA_RX_BW_40:
3577 bw = WMI_PEER_CHWIDTH_40MHZ;
3578 break;
3579 case IEEE80211_STA_RX_BW_80:
3580 bw = WMI_PEER_CHWIDTH_80MHZ;
3581 break;
3582 case IEEE80211_STA_RX_BW_160:
3583 bw = WMI_PEER_CHWIDTH_160MHZ;
3584 break;
3585 case IEEE80211_STA_RX_BW_320:
3586 bw = WMI_PEER_CHWIDTH_320MHZ;
3587 break;
3588 default:
3589 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n",
3590 link_sta->bandwidth, link_sta->addr);
3591 bw = WMI_PEER_CHWIDTH_20MHZ;
3592 break;
3593 }
3594
3595 return bw;
3596 }
3597
ath12k_bss_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * bss_conf)3598 static void ath12k_bss_assoc(struct ath12k *ar,
3599 struct ath12k_link_vif *arvif,
3600 struct ieee80211_bss_conf *bss_conf)
3601 {
3602 struct ath12k_vif *ahvif = arvif->ahvif;
3603 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
3604 struct ath12k_wmi_vdev_up_params params = {};
3605 struct ieee80211_link_sta *link_sta;
3606 u8 link_id = bss_conf->link_id;
3607 struct ath12k_link_sta *arsta;
3608 struct ieee80211_sta *ap_sta;
3609 struct ath12k_sta *ahsta;
3610 struct ath12k_peer *peer;
3611 bool is_auth = false;
3612 u32 hemode = 0;
3613 int ret;
3614
3615 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3616
3617 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
3618 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
3619 if (!peer_arg)
3620 return;
3621
3622 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3623 "mac vdev %i link id %u assoc bssid %pM aid %d\n",
3624 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid);
3625
3626 rcu_read_lock();
3627
3628 /* During ML connection, cfg.ap_addr has the MLD address. For
3629 * non-ML connection, it has the BSSID.
3630 */
3631 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
3632 if (!ap_sta) {
3633 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3634 vif->cfg.ap_addr, arvif->vdev_id);
3635 rcu_read_unlock();
3636 return;
3637 }
3638
3639 ahsta = ath12k_sta_to_ahsta(ap_sta);
3640
3641 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
3642 ahsta->link[link_id]);
3643 if (WARN_ON(!arsta)) {
3644 rcu_read_unlock();
3645 return;
3646 }
3647
3648 link_sta = ath12k_mac_get_link_sta(arsta);
3649 if (WARN_ON(!link_sta)) {
3650 rcu_read_unlock();
3651 return;
3652 }
3653
3654 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);
3655
3656 /* link_sta->he_cap must be protected by rcu_read_lock */
3657 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode);
3658 if (ret) {
3659 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n",
3660 arvif->vdev_id, bss_conf->bssid, ret);
3661 rcu_read_unlock();
3662 return;
3663 }
3664
3665 rcu_read_unlock();
3666
3667 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */
3668 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3669 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode);
3670 if (ret) {
3671 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
3672 hemode, ret);
3673 return;
3674 }
3675
3676 peer_arg->is_assoc = true;
3677 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
3678 if (ret) {
3679 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3680 bss_conf->bssid, arvif->vdev_id, ret);
3681 return;
3682 }
3683
3684 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3685 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3686 bss_conf->bssid, arvif->vdev_id);
3687 return;
3688 }
3689
3690 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3691 &link_sta->ht_cap, &link_sta->he_6ghz_capa);
3692 if (ret) {
3693 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3694 arvif->vdev_id, ret);
3695 return;
3696 }
3697
3698 WARN_ON(arvif->is_up);
3699
3700 ahvif->aid = vif->cfg.aid;
3701 ether_addr_copy(arvif->bssid, bss_conf->bssid);
3702
3703 params.vdev_id = arvif->vdev_id;
3704 params.aid = ahvif->aid;
3705 params.bssid = arvif->bssid;
3706 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
3707 if (params.tx_bssid) {
3708 params.nontx_profile_idx = bss_conf->bssid_index;
3709 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator;
3710 }
3711 ret = ath12k_wmi_vdev_up(ar, ¶ms);
3712 if (ret) {
3713 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3714 arvif->vdev_id, ret);
3715 return;
3716 }
3717
3718 arvif->is_up = true;
3719 arvif->rekey_data.enable_offload = false;
3720
3721 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3722 "mac vdev %d up (associated) bssid %pM aid %d\n",
3723 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3724
3725 spin_lock_bh(&ar->ab->base_lock);
3726
3727 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3728 if (peer && peer->is_authorized)
3729 is_auth = true;
3730
3731 spin_unlock_bh(&ar->ab->base_lock);
3732
3733 /* Authorize BSS Peer */
3734 if (is_auth) {
3735 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
3736 arvif->vdev_id,
3737 WMI_PEER_AUTHORIZE,
3738 1);
3739 if (ret)
3740 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3741 }
3742
3743 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3744 &bss_conf->he_obss_pd);
3745 if (ret)
3746 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3747 arvif->vdev_id, ret);
3748
3749 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3750 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3751 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3752 ath12k_mac_11d_scan_stop_all(ar->ab);
3753 }
3754
ath12k_bss_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif)3755 static void ath12k_bss_disassoc(struct ath12k *ar,
3756 struct ath12k_link_vif *arvif)
3757 {
3758 int ret;
3759
3760 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3761
3762 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3763 arvif->vdev_id, arvif->bssid);
3764
3765 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
3766 if (ret)
3767 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
3768 arvif->vdev_id, ret);
3769
3770 arvif->is_up = false;
3771
3772 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3773
3774 cancel_delayed_work(&arvif->connection_loss_work);
3775 }
3776
ath12k_mac_get_rate_hw_value(int bitrate)3777 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
3778 {
3779 u32 preamble;
3780 u16 hw_value;
3781 int rate;
3782 size_t i;
3783
3784 if (ath12k_mac_bitrate_is_cck(bitrate))
3785 preamble = WMI_RATE_PREAMBLE_CCK;
3786 else
3787 preamble = WMI_RATE_PREAMBLE_OFDM;
3788
3789 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
3790 if (ath12k_legacy_rates[i].bitrate != bitrate)
3791 continue;
3792
3793 hw_value = ath12k_legacy_rates[i].hw_value;
3794 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
3795
3796 return rate;
3797 }
3798
3799 return -EINVAL;
3800 }
3801
ath12k_recalculate_mgmt_rate(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def * def)3802 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
3803 struct ath12k_link_vif *arvif,
3804 struct cfg80211_chan_def *def)
3805 {
3806 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3807 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
3808 const struct ieee80211_supported_band *sband;
3809 struct ieee80211_bss_conf *bss_conf;
3810 u8 basic_rate_idx;
3811 int hw_rate_code;
3812 u32 vdev_param;
3813 u16 bitrate;
3814 int ret;
3815
3816 lockdep_assert_wiphy(hw->wiphy);
3817
3818 bss_conf = ath12k_mac_get_link_bss_conf(arvif);
3819 if (!bss_conf) {
3820 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n",
3821 vif->addr, arvif->link_id);
3822 return;
3823 }
3824
3825 sband = hw->wiphy->bands[def->chan->band];
3826 if (bss_conf->basic_rates)
3827 basic_rate_idx = __ffs(bss_conf->basic_rates);
3828 else
3829 basic_rate_idx = 0;
3830 bitrate = sband->bitrates[basic_rate_idx].bitrate;
3831
3832 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
3833 if (hw_rate_code < 0) {
3834 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3835 return;
3836 }
3837
3838 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3839 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3840 hw_rate_code);
3841 if (ret)
3842 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3843
3844 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3845 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3846 hw_rate_code);
3847 if (ret)
3848 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3849 }
3850
ath12k_mac_init_arvif(struct ath12k_vif * ahvif,struct ath12k_link_vif * arvif,int link_id)3851 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
3852 struct ath12k_link_vif *arvif, int link_id)
3853 {
3854 struct ath12k_hw *ah = ahvif->ah;
3855 u8 _link_id;
3856 int i;
3857
3858 lockdep_assert_wiphy(ah->hw->wiphy);
3859
3860 if (WARN_ON(!arvif))
3861 return;
3862
3863 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
3864 return;
3865
3866 if (link_id < 0)
3867 _link_id = 0;
3868 else
3869 _link_id = link_id;
3870
3871 arvif->ahvif = ahvif;
3872 arvif->link_id = _link_id;
3873
3874 /* Protects the datapath stats update on a per link basis */
3875 spin_lock_init(&arvif->link_stats_lock);
3876
3877 INIT_LIST_HEAD(&arvif->list);
3878 INIT_DELAYED_WORK(&arvif->connection_loss_work,
3879 ath12k_mac_vif_sta_connection_loss_work);
3880
3881 arvif->num_stations = 0;
3882
3883 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
3884 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
3885 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
3886 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
3887 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
3888 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
3889 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
3890 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
3891 sizeof(arvif->bitrate_mask.control[i].he_mcs));
3892 }
3893
3894 /* Handle MLO related assignments */
3895 if (link_id >= 0) {
3896 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
3897 ahvif->links_map |= BIT(_link_id);
3898 }
3899
3900 ath12k_generic_dbg(ATH12K_DBG_MAC,
3901 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
3902 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
3903 ahvif->links_map);
3904 }
3905
ath12k_mac_remove_link_interface(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif)3906 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
3907 struct ath12k_link_vif *arvif)
3908 {
3909 struct ath12k_vif *ahvif = arvif->ahvif;
3910 struct ath12k_hw *ah = hw->priv;
3911 struct ath12k *ar = arvif->ar;
3912 int ret;
3913
3914 lockdep_assert_wiphy(ah->hw->wiphy);
3915
3916 cancel_delayed_work_sync(&arvif->connection_loss_work);
3917
3918 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
3919 arvif->vdev_id, arvif->link_id);
3920
3921 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3922 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3923 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3924 ath12k_mac_11d_scan_stop(ar);
3925
3926 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
3927 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
3928 if (ret)
3929 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
3930 arvif->vdev_id, arvif->link_id, ret);
3931 }
3932 ath12k_mac_vdev_delete(ar, arvif);
3933 }
3934
ath12k_mac_assign_link_vif(struct ath12k_hw * ah,struct ieee80211_vif * vif,u8 link_id)3935 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
3936 struct ieee80211_vif *vif,
3937 u8 link_id)
3938 {
3939 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3940 struct ath12k_link_vif *arvif;
3941
3942 lockdep_assert_wiphy(ah->hw->wiphy);
3943
3944 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
3945 if (arvif)
3946 return arvif;
3947
3948 /* If this is the first link arvif being created for an ML VIF
3949 * use the preallocated deflink memory except for scan arvifs
3950 */
3951 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) {
3952 arvif = &ahvif->deflink;
3953
3954 if (vif->type == NL80211_IFTYPE_STATION)
3955 arvif->is_sta_assoc_link = true;
3956 } else {
3957 arvif = kzalloc(sizeof(*arvif), GFP_KERNEL);
3958 if (!arvif)
3959 return NULL;
3960 }
3961
3962 ath12k_mac_init_arvif(ahvif, arvif, link_id);
3963
3964 return arvif;
3965 }
3966
ath12k_mac_unassign_link_vif(struct ath12k_link_vif * arvif)3967 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
3968 {
3969 struct ath12k_vif *ahvif = arvif->ahvif;
3970 struct ath12k_hw *ah = ahvif->ah;
3971
3972 lockdep_assert_wiphy(ah->hw->wiphy);
3973
3974 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
3975 synchronize_rcu();
3976 ahvif->links_map &= ~BIT(arvif->link_id);
3977
3978 if (arvif != &ahvif->deflink)
3979 kfree(arvif);
3980 else
3981 memset(arvif, 0, sizeof(*arvif));
3982 }
3983
3984 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])3985 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw,
3986 struct ieee80211_vif *vif,
3987 u16 old_links, u16 new_links,
3988 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS])
3989 {
3990 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3991 unsigned long to_remove = old_links & ~new_links;
3992 unsigned long to_add = ~old_links & new_links;
3993 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3994 struct ath12k_link_vif *arvif;
3995 u8 link_id;
3996
3997 lockdep_assert_wiphy(hw->wiphy);
3998
3999 ath12k_generic_dbg(ATH12K_DBG_MAC,
4000 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n",
4001 vif->addr, old_links, new_links);
4002
4003 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) {
4004 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4005 /* mac80211 wants to add link but driver already has the
4006 * link. This should not happen ideally.
4007 */
4008 if (WARN_ON(arvif))
4009 return -EINVAL;
4010
4011 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
4012 if (WARN_ON(!arvif))
4013 return -EINVAL;
4014 }
4015
4016 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) {
4017 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4018 if (WARN_ON(!arvif))
4019 return -EINVAL;
4020
4021 if (!arvif->is_created)
4022 continue;
4023
4024 if (WARN_ON(!arvif->ar))
4025 return -EINVAL;
4026
4027 ath12k_mac_remove_link_interface(hw, arvif);
4028 ath12k_mac_unassign_link_vif(arvif);
4029 }
4030
4031 return 0;
4032 }
4033
ath12k_mac_fils_discovery(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)4034 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
4035 struct ieee80211_bss_conf *info)
4036 {
4037 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
4038 struct ath12k *ar = arvif->ar;
4039 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4040 struct sk_buff *tmpl;
4041 int ret;
4042 u32 interval;
4043 bool unsol_bcast_probe_resp_enabled = false;
4044
4045 if (info->fils_discovery.max_interval) {
4046 interval = info->fils_discovery.max_interval;
4047
4048 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif);
4049 if (tmpl)
4050 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
4051 tmpl);
4052 } else if (info->unsol_bcast_probe_resp_interval) {
4053 unsol_bcast_probe_resp_enabled = 1;
4054 interval = info->unsol_bcast_probe_resp_interval;
4055
4056 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
4057 if (tmpl)
4058 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
4059 tmpl);
4060 } else { /* Disable */
4061 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
4062 }
4063
4064 if (!tmpl) {
4065 ath12k_warn(ar->ab,
4066 "mac vdev %i failed to retrieve %s template\n",
4067 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
4068 "unsolicited broadcast probe response" :
4069 "FILS discovery"));
4070 return -EPERM;
4071 }
4072 kfree_skb(tmpl);
4073
4074 if (!ret)
4075 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
4076 unsol_bcast_probe_resp_enabled);
4077
4078 return ret;
4079 }
4080
ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 changed)4081 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw,
4082 struct ieee80211_vif *vif,
4083 u64 changed)
4084 {
4085 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4086 unsigned long links = ahvif->links_map;
4087 struct ieee80211_bss_conf *info;
4088 struct ath12k_link_vif *arvif;
4089 struct ieee80211_sta *sta;
4090 struct ath12k_sta *ahsta;
4091 struct ath12k *ar;
4092 u8 link_id;
4093
4094 lockdep_assert_wiphy(hw->wiphy);
4095
4096 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) {
4097 ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4098 if (vif->cfg.ssid_len)
4099 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4100 }
4101
4102 if (changed & BSS_CHANGED_ASSOC) {
4103 if (vif->cfg.assoc) {
4104 /* only in station mode we can get here, so it's safe
4105 * to use ap_addr
4106 */
4107 rcu_read_lock();
4108 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
4109 if (!sta) {
4110 rcu_read_unlock();
4111 WARN_ONCE(1, "failed to find sta with addr %pM\n",
4112 vif->cfg.ap_addr);
4113 return;
4114 }
4115
4116 ahsta = ath12k_sta_to_ahsta(sta);
4117 arvif = wiphy_dereference(hw->wiphy,
4118 ahvif->link[ahsta->assoc_link_id]);
4119 rcu_read_unlock();
4120
4121 ar = arvif->ar;
4122 /* there is no reason for which an assoc link's
4123 * bss info does not exist
4124 */
4125 info = ath12k_mac_get_link_bss_conf(arvif);
4126 ath12k_bss_assoc(ar, arvif, info);
4127
4128 /* exclude assoc link as it is done above */
4129 links &= ~BIT(ahsta->assoc_link_id);
4130 }
4131
4132 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4133 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4134 if (!arvif || !arvif->ar)
4135 continue;
4136
4137 ar = arvif->ar;
4138
4139 if (vif->cfg.assoc) {
4140 info = ath12k_mac_get_link_bss_conf(arvif);
4141 if (!info)
4142 continue;
4143
4144 ath12k_bss_assoc(ar, arvif, info);
4145 } else {
4146 ath12k_bss_disassoc(ar, arvif);
4147 }
4148 }
4149 }
4150 }
4151
ath12k_mac_vif_setup_ps(struct ath12k_link_vif * arvif)4152 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif)
4153 {
4154 struct ath12k *ar = arvif->ar;
4155 struct ieee80211_vif *vif = arvif->ahvif->vif;
4156 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
4157 enum wmi_sta_powersave_param param;
4158 struct ieee80211_bss_conf *info;
4159 enum wmi_sta_ps_mode psmode;
4160 int ret;
4161 int timeout;
4162 bool enable_ps;
4163
4164 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4165
4166 if (vif->type != NL80211_IFTYPE_STATION)
4167 return;
4168
4169 enable_ps = arvif->ahvif->ps;
4170 if (enable_ps) {
4171 psmode = WMI_STA_PS_MODE_ENABLED;
4172 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
4173
4174 timeout = conf->dynamic_ps_timeout;
4175 if (timeout == 0) {
4176 info = ath12k_mac_get_link_bss_conf(arvif);
4177 if (!info) {
4178 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n",
4179 vif->addr, arvif->link_id);
4180 return;
4181 }
4182
4183 /* firmware doesn't like 0 */
4184 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000;
4185 }
4186
4187 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
4188 timeout);
4189 if (ret) {
4190 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
4191 arvif->vdev_id, ret);
4192 return;
4193 }
4194 } else {
4195 psmode = WMI_STA_PS_MODE_DISABLED;
4196 }
4197
4198 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
4199 arvif->vdev_id, psmode ? "enable" : "disable");
4200
4201 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
4202 if (ret)
4203 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
4204 psmode, arvif->vdev_id, ret);
4205 }
4206
ath12k_mac_supports_tpc(struct ath12k * ar,struct ath12k_vif * ahvif,const struct cfg80211_chan_def * chandef)4207 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif,
4208 const struct cfg80211_chan_def *chandef)
4209 {
4210 return ath12k_wmi_supports_6ghz_cc_ext(ar) &&
4211 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
4212 (ahvif->vdev_type == WMI_VDEV_TYPE_STA ||
4213 ahvif->vdev_type == WMI_VDEV_TYPE_AP) &&
4214 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
4215 chandef->chan &&
4216 chandef->chan->band == NL80211_BAND_6GHZ;
4217 }
4218
ath12k_mac_bss_info_changed(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info,u64 changed)4219 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
4220 struct ath12k_link_vif *arvif,
4221 struct ieee80211_bss_conf *info,
4222 u64 changed)
4223 {
4224 struct ath12k_vif *ahvif = arvif->ahvif;
4225 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
4226 struct ieee80211_vif_cfg *vif_cfg = &vif->cfg;
4227 struct cfg80211_chan_def def;
4228 u32 param_id, param_value;
4229 enum nl80211_band band;
4230 u32 vdev_param;
4231 int mcast_rate;
4232 u32 preamble;
4233 u16 hw_value;
4234 u16 bitrate;
4235 int ret;
4236 u8 rateidx;
4237 u32 rate;
4238
4239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4240
4241 if (changed & BSS_CHANGED_BEACON_INT) {
4242 arvif->beacon_interval = info->beacon_int;
4243
4244 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
4245 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4246 param_id,
4247 arvif->beacon_interval);
4248 if (ret)
4249 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
4250 arvif->vdev_id);
4251 else
4252 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4253 "Beacon interval: %d set for VDEV: %d\n",
4254 arvif->beacon_interval, arvif->vdev_id);
4255 }
4256
4257 if (changed & BSS_CHANGED_BEACON) {
4258 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
4259 param_value = WMI_BEACON_BURST_MODE;
4260 ret = ath12k_wmi_pdev_set_param(ar, param_id,
4261 param_value, ar->pdev->pdev_id);
4262 if (ret)
4263 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
4264 arvif->vdev_id);
4265 else
4266 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4267 "Set burst beacon mode for VDEV: %d\n",
4268 arvif->vdev_id);
4269
4270 ret = ath12k_mac_setup_bcn_tmpl(arvif);
4271 if (ret)
4272 ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
4273 ret);
4274 }
4275
4276 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
4277 arvif->dtim_period = info->dtim_period;
4278
4279 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
4280 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4281 param_id,
4282 arvif->dtim_period);
4283
4284 if (ret)
4285 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
4286 arvif->vdev_id, ret);
4287 else
4288 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4289 "DTIM period: %d set for VDEV: %d\n",
4290 arvif->dtim_period, arvif->vdev_id);
4291 }
4292
4293 if (changed & BSS_CHANGED_SSID &&
4294 vif->type == NL80211_IFTYPE_AP) {
4295 ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4296 if (vif->cfg.ssid_len)
4297 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4298 ahvif->u.ap.hidden_ssid = info->hidden_ssid;
4299 }
4300
4301 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4302 ether_addr_copy(arvif->bssid, info->bssid);
4303
4304 if (changed & BSS_CHANGED_BEACON_ENABLED) {
4305 if (info->enable_beacon) {
4306 ret = ath12k_mac_set_he_txbf_conf(arvif);
4307 if (ret)
4308 ath12k_warn(ar->ab,
4309 "failed to set HE TXBF config for vdev: %d\n",
4310 arvif->vdev_id);
4311
4312 ret = ath12k_mac_set_eht_txbf_conf(arvif);
4313 if (ret)
4314 ath12k_warn(ar->ab,
4315 "failed to set EHT TXBF config for vdev: %d\n",
4316 arvif->vdev_id);
4317 }
4318 ath12k_control_beaconing(arvif, info);
4319
4320 if (arvif->is_up && info->he_support &&
4321 info->he_oper.params) {
4322 /* TODO: Extend to support 1024 BA Bitmap size */
4323 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4324 WMI_VDEV_PARAM_BA_MODE,
4325 WMI_BA_MODE_BUFFER_SIZE_256);
4326 if (ret)
4327 ath12k_warn(ar->ab,
4328 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
4329 arvif->vdev_id);
4330
4331 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
4332 param_value = info->he_oper.params;
4333 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4334 param_id, param_value);
4335 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4336 "he oper param: %x set for VDEV: %d\n",
4337 param_value, arvif->vdev_id);
4338
4339 if (ret)
4340 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
4341 param_value, arvif->vdev_id, ret);
4342 }
4343 }
4344
4345 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4346 u32 cts_prot;
4347
4348 cts_prot = !!(info->use_cts_prot);
4349 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
4350
4351 if (arvif->is_started) {
4352 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4353 param_id, cts_prot);
4354 if (ret)
4355 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
4356 arvif->vdev_id);
4357 else
4358 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
4359 cts_prot, arvif->vdev_id);
4360 } else {
4361 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
4362 }
4363 }
4364
4365 if (changed & BSS_CHANGED_ERP_SLOT) {
4366 u32 slottime;
4367
4368 if (info->use_short_slot)
4369 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4370
4371 else
4372 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4373
4374 param_id = WMI_VDEV_PARAM_SLOT_TIME;
4375 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4376 param_id, slottime);
4377 if (ret)
4378 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
4379 arvif->vdev_id);
4380 else
4381 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4382 "Set slottime: %d for VDEV: %d\n",
4383 slottime, arvif->vdev_id);
4384 }
4385
4386 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4387 u32 preamble;
4388
4389 if (info->use_short_preamble)
4390 preamble = WMI_VDEV_PREAMBLE_SHORT;
4391 else
4392 preamble = WMI_VDEV_PREAMBLE_LONG;
4393
4394 param_id = WMI_VDEV_PARAM_PREAMBLE;
4395 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4396 param_id, preamble);
4397 if (ret)
4398 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
4399 arvif->vdev_id);
4400 else
4401 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4402 "Set preamble: %d for VDEV: %d\n",
4403 preamble, arvif->vdev_id);
4404 }
4405
4406 if (changed & BSS_CHANGED_ASSOC) {
4407 if (vif->cfg.assoc)
4408 ath12k_bss_assoc(ar, arvif, info);
4409 else
4410 ath12k_bss_disassoc(ar, arvif);
4411 }
4412
4413 if (changed & BSS_CHANGED_TXPOWER) {
4414 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4415 arvif->vdev_id, info->txpower);
4416
4417 arvif->txpower = info->txpower;
4418 ath12k_mac_txpower_recalc(ar);
4419 }
4420
4421 if (changed & BSS_CHANGED_MCAST_RATE &&
4422 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
4423 band = def.chan->band;
4424 mcast_rate = info->mcast_rate[band];
4425
4426 if (mcast_rate > 0) {
4427 rateidx = mcast_rate - 1;
4428 } else {
4429 if (info->basic_rates)
4430 rateidx = __ffs(info->basic_rates);
4431 else
4432 rateidx = 0;
4433 }
4434
4435 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP)
4436 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
4437
4438 bitrate = ath12k_legacy_rates[rateidx].bitrate;
4439 hw_value = ath12k_legacy_rates[rateidx].hw_value;
4440
4441 if (ath12k_mac_bitrate_is_cck(bitrate))
4442 preamble = WMI_RATE_PREAMBLE_CCK;
4443 else
4444 preamble = WMI_RATE_PREAMBLE_OFDM;
4445
4446 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
4447
4448 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4449 "mac vdev %d mcast_rate %x\n",
4450 arvif->vdev_id, rate);
4451
4452 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
4453 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4454 vdev_param, rate);
4455 if (ret)
4456 ath12k_warn(ar->ab,
4457 "failed to set mcast rate on vdev %i: %d\n",
4458 arvif->vdev_id, ret);
4459
4460 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
4461 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4462 vdev_param, rate);
4463 if (ret)
4464 ath12k_warn(ar->ab,
4465 "failed to set bcast rate on vdev %i: %d\n",
4466 arvif->vdev_id, ret);
4467 }
4468
4469 if (changed & BSS_CHANGED_BASIC_RATES &&
4470 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))
4471 ath12k_recalculate_mgmt_rate(ar, arvif, &def);
4472
4473 if (changed & BSS_CHANGED_TWT) {
4474 if (info->twt_requester || info->twt_responder)
4475 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
4476 else
4477 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
4478 }
4479
4480 if (changed & BSS_CHANGED_HE_OBSS_PD)
4481 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
4482 &info->he_obss_pd);
4483
4484 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
4485 if (vif->type == NL80211_IFTYPE_AP) {
4486 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4487 arvif->vdev_id,
4488 info->he_bss_color.color,
4489 ATH12K_BSS_COLOR_AP_PERIODS,
4490 info->he_bss_color.enabled);
4491 if (ret)
4492 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4493 arvif->vdev_id, ret);
4494 } else if (vif->type == NL80211_IFTYPE_STATION) {
4495 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
4496 arvif->vdev_id,
4497 1);
4498 if (ret)
4499 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
4500 arvif->vdev_id, ret);
4501 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4502 arvif->vdev_id,
4503 0,
4504 ATH12K_BSS_COLOR_STA_PERIODS,
4505 1);
4506 if (ret)
4507 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4508 arvif->vdev_id, ret);
4509 }
4510 }
4511
4512 ath12k_mac_fils_discovery(arvif, info);
4513
4514 if (changed & BSS_CHANGED_PS &&
4515 ar->ab->hw_params->supports_sta_ps) {
4516 ahvif->ps = vif_cfg->ps;
4517 ath12k_mac_vif_setup_ps(arvif);
4518 }
4519 }
4520
ath12k_ahvif_get_link_cache(struct ath12k_vif * ahvif,u8 link_id)4521 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif,
4522 u8 link_id)
4523 {
4524 if (!ahvif->cache[link_id]) {
4525 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL);
4526 if (ahvif->cache[link_id])
4527 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list);
4528 }
4529
4530 return ahvif->cache[link_id];
4531 }
4532
ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache * cache)4533 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache)
4534 {
4535 struct ath12k_key_conf *key_conf, *tmp;
4536
4537 if (!cache || list_empty(&cache->key_conf.list))
4538 return;
4539 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
4540 list_del(&key_conf->list);
4541 kfree(key_conf);
4542 }
4543 }
4544
ath12k_ahvif_put_link_cache(struct ath12k_vif * ahvif,u8 link_id)4545 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id)
4546 {
4547 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
4548 return;
4549
4550 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]);
4551 kfree(ahvif->cache[link_id]);
4552 ahvif->cache[link_id] = NULL;
4553 }
4554
ath12k_mac_op_link_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u64 changed)4555 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
4556 struct ieee80211_vif *vif,
4557 struct ieee80211_bss_conf *info,
4558 u64 changed)
4559 {
4560 struct ath12k *ar;
4561 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4562 struct ath12k_vif_cache *cache;
4563 struct ath12k_link_vif *arvif;
4564 u8 link_id = info->link_id;
4565
4566 lockdep_assert_wiphy(hw->wiphy);
4567
4568 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4569
4570 /* if the vdev is not created on a certain radio,
4571 * cache the info to be updated later on vdev creation
4572 */
4573
4574 if (!arvif || !arvif->is_created) {
4575 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
4576 if (!cache)
4577 return;
4578
4579 cache->bss_conf_changed |= changed;
4580
4581 return;
4582 }
4583
4584 ar = arvif->ar;
4585
4586 ath12k_mac_bss_info_changed(ar, arvif, info, changed);
4587 }
4588
4589 static struct ath12k*
ath12k_mac_select_scan_device(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 center_freq)4590 ath12k_mac_select_scan_device(struct ieee80211_hw *hw,
4591 struct ieee80211_vif *vif,
4592 u32 center_freq)
4593 {
4594 struct ath12k_hw *ah = hw->priv;
4595 enum nl80211_band band;
4596 struct ath12k *ar;
4597 int i;
4598
4599 if (ah->num_radio == 1)
4600 return ah->radio;
4601
4602 /* Currently mac80211 supports splitting scan requests into
4603 * multiple scan requests per band.
4604 * Loop through first channel and determine the scan radio
4605 * TODO: There could be 5 GHz low/high channels in that case
4606 * split the hw request and perform multiple scans
4607 */
4608
4609 if (center_freq < ATH12K_MIN_5GHZ_FREQ)
4610 band = NL80211_BAND_2GHZ;
4611 else if (center_freq < ATH12K_MIN_6GHZ_FREQ)
4612 band = NL80211_BAND_5GHZ;
4613 else
4614 band = NL80211_BAND_6GHZ;
4615
4616 for_each_ar(ah, ar, i) {
4617 if (ar->mac.sbands[band].channels &&
4618 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
4619 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
4620 return ar;
4621 }
4622
4623 return NULL;
4624 }
4625
__ath12k_mac_scan_finish(struct ath12k * ar)4626 void __ath12k_mac_scan_finish(struct ath12k *ar)
4627 {
4628 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4629
4630 lockdep_assert_held(&ar->data_lock);
4631
4632 switch (ar->scan.state) {
4633 case ATH12K_SCAN_IDLE:
4634 break;
4635 case ATH12K_SCAN_RUNNING:
4636 case ATH12K_SCAN_ABORTING:
4637 if (ar->scan.is_roc && ar->scan.roc_notify)
4638 ieee80211_remain_on_channel_expired(hw);
4639 fallthrough;
4640 case ATH12K_SCAN_STARTING:
4641 cancel_delayed_work(&ar->scan.timeout);
4642 complete_all(&ar->scan.completed);
4643 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
4644 break;
4645 }
4646 }
4647
ath12k_mac_scan_finish(struct ath12k * ar)4648 void ath12k_mac_scan_finish(struct ath12k *ar)
4649 {
4650 spin_lock_bh(&ar->data_lock);
4651 __ath12k_mac_scan_finish(ar);
4652 spin_unlock_bh(&ar->data_lock);
4653 }
4654
ath12k_scan_stop(struct ath12k * ar)4655 static int ath12k_scan_stop(struct ath12k *ar)
4656 {
4657 struct ath12k_wmi_scan_cancel_arg arg = {
4658 .req_type = WLAN_SCAN_CANCEL_SINGLE,
4659 .scan_id = ATH12K_SCAN_ID,
4660 };
4661 int ret;
4662
4663 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4664
4665 /* TODO: Fill other STOP Params */
4666 arg.pdev_id = ar->pdev->pdev_id;
4667
4668 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
4669 if (ret) {
4670 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
4671 goto out;
4672 }
4673
4674 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4675 if (ret == 0) {
4676 ath12k_warn(ar->ab,
4677 "failed to receive scan abort comple: timed out\n");
4678 ret = -ETIMEDOUT;
4679 } else if (ret > 0) {
4680 ret = 0;
4681 }
4682
4683 out:
4684 /* Scan state should be updated in scan completion worker but in
4685 * case firmware fails to deliver the event (for whatever reason)
4686 * it is desired to clean up scan state anyway. Firmware may have
4687 * just dropped the scan completion event delivery due to transport
4688 * pipe being overflown with data and/or it can recover on its own
4689 * before next scan request is submitted.
4690 */
4691 spin_lock_bh(&ar->data_lock);
4692 if (ret)
4693 __ath12k_mac_scan_finish(ar);
4694 spin_unlock_bh(&ar->data_lock);
4695
4696 return ret;
4697 }
4698
ath12k_scan_abort(struct ath12k * ar)4699 static void ath12k_scan_abort(struct ath12k *ar)
4700 {
4701 int ret;
4702
4703 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4704
4705 spin_lock_bh(&ar->data_lock);
4706
4707 switch (ar->scan.state) {
4708 case ATH12K_SCAN_IDLE:
4709 /* This can happen if timeout worker kicked in and called
4710 * abortion while scan completion was being processed.
4711 */
4712 break;
4713 case ATH12K_SCAN_STARTING:
4714 case ATH12K_SCAN_ABORTING:
4715 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
4716 ar->scan.state);
4717 break;
4718 case ATH12K_SCAN_RUNNING:
4719 ar->scan.state = ATH12K_SCAN_ABORTING;
4720 spin_unlock_bh(&ar->data_lock);
4721
4722 ret = ath12k_scan_stop(ar);
4723 if (ret)
4724 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
4725
4726 spin_lock_bh(&ar->data_lock);
4727 break;
4728 }
4729
4730 spin_unlock_bh(&ar->data_lock);
4731 }
4732
ath12k_scan_timeout_work(struct work_struct * work)4733 static void ath12k_scan_timeout_work(struct work_struct *work)
4734 {
4735 struct ath12k *ar = container_of(work, struct ath12k,
4736 scan.timeout.work);
4737
4738 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
4739 ath12k_scan_abort(ar);
4740 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
4741 }
4742
ath12k_mac_scan_send_complete(struct ath12k * ar,struct cfg80211_scan_info * info)4743 static void ath12k_mac_scan_send_complete(struct ath12k *ar,
4744 struct cfg80211_scan_info *info)
4745 {
4746 struct ath12k_hw *ah = ar->ah;
4747 struct ath12k *partner_ar;
4748 int i;
4749
4750 lockdep_assert_wiphy(ah->hw->wiphy);
4751
4752 for_each_ar(ah, partner_ar, i)
4753 if (partner_ar != ar &&
4754 partner_ar->scan.state == ATH12K_SCAN_RUNNING)
4755 return;
4756
4757 ieee80211_scan_completed(ah->hw, info);
4758 }
4759
ath12k_scan_vdev_clean_work(struct wiphy * wiphy,struct wiphy_work * work)4760 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work)
4761 {
4762 struct ath12k *ar = container_of(work, struct ath12k,
4763 scan.vdev_clean_wk);
4764 struct ath12k_hw *ah = ar->ah;
4765 struct ath12k_link_vif *arvif;
4766
4767 lockdep_assert_wiphy(wiphy);
4768
4769 arvif = ar->scan.arvif;
4770
4771 /* The scan vdev has already been deleted. This can occur when a
4772 * new scan request is made on the same vif with a different
4773 * frequency, causing the scan arvif to move from one radio to
4774 * another. Or, scan was abrupted and via remove interface, the
4775 * arvif is already deleted. Alternatively, if the scan vdev is not
4776 * being used as an actual vdev, then do not delete it.
4777 */
4778 if (!arvif || arvif->is_started)
4779 goto work_complete;
4780
4781 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)",
4782 arvif->link_id);
4783
4784 ath12k_mac_remove_link_interface(ah->hw, arvif);
4785 ath12k_mac_unassign_link_vif(arvif);
4786
4787 work_complete:
4788 spin_lock_bh(&ar->data_lock);
4789 ar->scan.arvif = NULL;
4790 if (!ar->scan.is_roc) {
4791 struct cfg80211_scan_info info = {
4792 .aborted = ((ar->scan.state ==
4793 ATH12K_SCAN_ABORTING) ||
4794 (ar->scan.state ==
4795 ATH12K_SCAN_STARTING)),
4796 };
4797
4798 ath12k_mac_scan_send_complete(ar, &info);
4799 }
4800
4801 ar->scan.state = ATH12K_SCAN_IDLE;
4802 ar->scan_channel = NULL;
4803 ar->scan.roc_freq = 0;
4804 spin_unlock_bh(&ar->data_lock);
4805 }
4806
ath12k_start_scan(struct ath12k * ar,struct ath12k_wmi_scan_req_arg * arg)4807 static int ath12k_start_scan(struct ath12k *ar,
4808 struct ath12k_wmi_scan_req_arg *arg)
4809 {
4810 int ret;
4811
4812 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4813
4814 ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
4815 if (ret)
4816 return ret;
4817
4818 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4819 if (ret == 0) {
4820 ret = ath12k_scan_stop(ar);
4821 if (ret)
4822 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
4823
4824 return -ETIMEDOUT;
4825 }
4826
4827 /* If we failed to start the scan, return error code at
4828 * this point. This is probably due to some issue in the
4829 * firmware, but no need to wedge the driver due to that...
4830 */
4831 spin_lock_bh(&ar->data_lock);
4832 if (ar->scan.state == ATH12K_SCAN_IDLE) {
4833 spin_unlock_bh(&ar->data_lock);
4834 return -EINVAL;
4835 }
4836 spin_unlock_bh(&ar->data_lock);
4837
4838 return 0;
4839 }
4840
ath12k_mac_get_fw_stats(struct ath12k * ar,struct ath12k_fw_stats_req_params * param)4841 int ath12k_mac_get_fw_stats(struct ath12k *ar,
4842 struct ath12k_fw_stats_req_params *param)
4843 {
4844 struct ath12k_base *ab = ar->ab;
4845 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
4846 unsigned long time_left;
4847 int ret;
4848
4849 guard(mutex)(&ah->hw_mutex);
4850
4851 if (ah->state != ATH12K_HW_STATE_ON)
4852 return -ENETDOWN;
4853
4854 ath12k_fw_stats_reset(ar);
4855
4856 reinit_completion(&ar->fw_stats_complete);
4857 reinit_completion(&ar->fw_stats_done);
4858
4859 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id,
4860 param->vdev_id, param->pdev_id);
4861 if (ret) {
4862 ath12k_warn(ab, "failed to request fw stats: %d\n", ret);
4863 return ret;
4864 }
4865
4866 ath12k_dbg(ab, ATH12K_DBG_WMI,
4867 "get fw stat pdev id %d vdev id %d stats id 0x%x\n",
4868 param->pdev_id, param->vdev_id, param->stats_id);
4869
4870 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
4871 if (!time_left) {
4872 ath12k_warn(ab, "time out while waiting for get fw stats\n");
4873 return -ETIMEDOUT;
4874 }
4875
4876 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back
4877 * when stats data buffer limit is reached. fw_stats_complete
4878 * is completed once host receives first event from firmware, but
4879 * still there could be more events following. Below is to wait
4880 * until firmware completes sending all the events.
4881 */
4882 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
4883 if (!time_left) {
4884 ath12k_warn(ab, "time out while waiting for fw stats done\n");
4885 return -ETIMEDOUT;
4886 }
4887
4888 return 0;
4889 }
4890
ath12k_mac_op_get_txpower(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,int * dbm)4891 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw,
4892 struct ieee80211_vif *vif,
4893 unsigned int link_id,
4894 int *dbm)
4895 {
4896 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4897 struct ath12k_fw_stats_req_params params = {};
4898 struct ath12k_fw_stats_pdev *pdev;
4899 struct ath12k_hw *ah = hw->priv;
4900 struct ath12k_link_vif *arvif;
4901 struct ath12k_base *ab;
4902 struct ath12k *ar;
4903 int ret;
4904
4905 /* Final Tx power is minimum of Target Power, CTL power, Regulatory
4906 * Power, PSD EIRP Power. We just know the Regulatory power from the
4907 * regulatory rules obtained. FW knows all these power and sets the min
4908 * of these. Hence, we request the FW pdev stats in which FW reports
4909 * the minimum of all vdev's channel Tx power.
4910 */
4911 lockdep_assert_wiphy(hw->wiphy);
4912
4913 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4914 if (!arvif || !arvif->ar)
4915 return -EINVAL;
4916
4917 ar = arvif->ar;
4918 ab = ar->ab;
4919 if (ah->state != ATH12K_HW_STATE_ON)
4920 goto err_fallback;
4921
4922 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags))
4923 return -EAGAIN;
4924
4925 /* Limit the requests to Firmware for fetching the tx power */
4926 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID &&
4927 time_before(jiffies,
4928 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) +
4929 ar->last_tx_power_update))
4930 goto send_tx_power;
4931
4932 params.pdev_id = ar->pdev->pdev_id;
4933 params.vdev_id = arvif->vdev_id;
4934 params.stats_id = WMI_REQUEST_PDEV_STAT;
4935 ret = ath12k_mac_get_fw_stats(ar, ¶ms);
4936 if (ret) {
4937 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
4938 goto err_fallback;
4939 }
4940
4941 spin_lock_bh(&ar->data_lock);
4942 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
4943 struct ath12k_fw_stats_pdev, list);
4944 if (!pdev) {
4945 spin_unlock_bh(&ar->data_lock);
4946 goto err_fallback;
4947 }
4948
4949 /* tx power reported by firmware is in units of 0.5 dBm */
4950 ar->chan_tx_pwr = pdev->chan_tx_power / 2;
4951 spin_unlock_bh(&ar->data_lock);
4952 ar->last_tx_power_update = jiffies;
4953
4954 send_tx_power:
4955 *dbm = ar->chan_tx_pwr;
4956 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n",
4957 *dbm);
4958 return 0;
4959
4960 err_fallback:
4961 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
4962 *dbm = vif->bss_conf.txpower;
4963 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
4964 *dbm);
4965 return 0;
4966 }
4967
4968 static u8
ath12k_mac_find_link_id_by_ar(struct ath12k_vif * ahvif,struct ath12k * ar)4969 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar)
4970 {
4971 struct ath12k_link_vif *arvif;
4972 struct ath12k_hw *ah = ahvif->ah;
4973 unsigned long links = ahvif->links_map;
4974 unsigned long scan_links_map;
4975 u8 link_id;
4976
4977 lockdep_assert_wiphy(ah->hw->wiphy);
4978
4979 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) {
4980 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4981
4982 if (!arvif || !arvif->is_created)
4983 continue;
4984
4985 if (ar == arvif->ar)
4986 return link_id;
4987 }
4988
4989 /* input ar is not assigned to any of the links of ML VIF, use next
4990 * available scan link for scan vdev creation. There are cases where
4991 * single scan req needs to be split in driver and initiate separate
4992 * scan requests to firmware based on device.
4993 */
4994
4995 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will
4996 * choose an available link among scan links (i.e link id >= 15)
4997 */
4998 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
4999 if (scan_links_map)
5000 return __ffs(scan_links_map);
5001
5002 return ATH12K_FIRST_SCAN_LINK;
5003 }
5004
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)5005 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw,
5006 struct ieee80211_vif *vif,
5007 struct ieee80211_scan_request *hw_req,
5008 int n_channels,
5009 struct ieee80211_channel **chan_list,
5010 struct ath12k *ar)
5011 {
5012 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5013 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5014 struct ath12k_link_vif *arvif;
5015 struct cfg80211_scan_request *req = &hw_req->req;
5016 struct ath12k_wmi_scan_req_arg *arg = NULL;
5017 u8 link_id;
5018 int ret;
5019 int i;
5020 bool create = true;
5021
5022 lockdep_assert_wiphy(hw->wiphy);
5023
5024 arvif = &ahvif->deflink;
5025
5026 /* check if any of the links of ML VIF is already started on
5027 * radio(ar) corresponding to given scan frequency and use it,
5028 * if not use scan link (link id >= 15) for scan purpose.
5029 */
5030 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
5031 /* All scan links are occupied. ideally this shouldn't happen as
5032 * mac80211 won't schedule scan for same band until ongoing scan is
5033 * completed, don't try to exceed max links just in case if it happens.
5034 */
5035 if (link_id >= ATH12K_NUM_MAX_LINKS)
5036 return -EBUSY;
5037
5038 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5039
5040 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan",
5041 arvif->link_id);
5042
5043 /* If the vif is already assigned to a specific vdev of an ar,
5044 * check whether its already started, vdev which is started
5045 * are not allowed to switch to a new radio.
5046 * If the vdev is not started, but was earlier created on a
5047 * different ar, delete that vdev and create a new one. We don't
5048 * delete at the scan stop as an optimization to avoid redundant
5049 * delete-create vdev's for the same ar, in case the request is
5050 * always on the same band for the vif
5051 */
5052 if (arvif->is_created) {
5053 if (WARN_ON(!arvif->ar))
5054 return -EINVAL;
5055
5056 if (ar != arvif->ar && arvif->is_started)
5057 return -EINVAL;
5058
5059 if (ar != arvif->ar) {
5060 ath12k_mac_remove_link_interface(hw, arvif);
5061 ath12k_mac_unassign_link_vif(arvif);
5062 } else {
5063 create = false;
5064 }
5065 }
5066
5067 if (create) {
5068 /* Previous arvif would've been cleared in radio switch block
5069 * above, assign arvif again for create.
5070 */
5071 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5072
5073 ret = ath12k_mac_vdev_create(ar, arvif);
5074 if (ret) {
5075 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
5076 return -EINVAL;
5077 }
5078 }
5079
5080 spin_lock_bh(&ar->data_lock);
5081 switch (ar->scan.state) {
5082 case ATH12K_SCAN_IDLE:
5083 reinit_completion(&ar->scan.started);
5084 reinit_completion(&ar->scan.completed);
5085 ar->scan.state = ATH12K_SCAN_STARTING;
5086 ar->scan.is_roc = false;
5087 ar->scan.arvif = arvif;
5088 ret = 0;
5089 break;
5090 case ATH12K_SCAN_STARTING:
5091 case ATH12K_SCAN_RUNNING:
5092 case ATH12K_SCAN_ABORTING:
5093 ret = -EBUSY;
5094 break;
5095 }
5096 spin_unlock_bh(&ar->data_lock);
5097
5098 if (ret)
5099 goto exit;
5100
5101 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
5102 if (!arg) {
5103 ret = -ENOMEM;
5104 goto exit;
5105 }
5106
5107 ath12k_wmi_start_scan_init(ar, arg);
5108 arg->vdev_id = arvif->vdev_id;
5109 arg->scan_id = ATH12K_SCAN_ID;
5110
5111 if (req->ie_len) {
5112 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
5113 if (!arg->extraie.ptr) {
5114 ret = -ENOMEM;
5115 goto exit;
5116 }
5117 arg->extraie.len = req->ie_len;
5118 }
5119
5120 if (req->n_ssids) {
5121 arg->num_ssids = req->n_ssids;
5122 for (i = 0; i < arg->num_ssids; i++)
5123 arg->ssid[i] = req->ssids[i];
5124 } else {
5125 arg->scan_f_passive = 1;
5126 }
5127
5128 if (n_channels) {
5129 arg->num_chan = n_channels;
5130 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
5131 GFP_KERNEL);
5132 if (!arg->chan_list) {
5133 ret = -ENOMEM;
5134 goto exit;
5135 }
5136
5137 for (i = 0; i < arg->num_chan; i++)
5138 arg->chan_list[i] = chan_list[i]->center_freq;
5139 }
5140
5141 ret = ath12k_start_scan(ar, arg);
5142 if (ret) {
5143 if (ret == -EBUSY)
5144 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5145 "scan engine is busy 11d state %d\n", ar->state_11d);
5146 else
5147 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
5148
5149 spin_lock_bh(&ar->data_lock);
5150 ar->scan.state = ATH12K_SCAN_IDLE;
5151 spin_unlock_bh(&ar->data_lock);
5152 goto exit;
5153 }
5154
5155 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started");
5156
5157 /* Add a margin to account for event/command processing */
5158 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
5159 msecs_to_jiffies(arg->max_scan_time +
5160 ATH12K_MAC_SCAN_TIMEOUT_MSECS));
5161
5162 exit:
5163 if (arg) {
5164 kfree(arg->chan_list);
5165 kfree(arg->extraie.ptr);
5166 kfree(arg);
5167 }
5168
5169 if (ar->state_11d == ATH12K_11D_PREPARING &&
5170 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5171 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
5172 ath12k_mac_11d_scan_start(ar, arvif->vdev_id);
5173
5174 return ret;
5175 }
5176
ath12k_mac_op_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req)5177 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
5178 struct ieee80211_vif *vif,
5179 struct ieee80211_scan_request *hw_req)
5180 {
5181 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5182 struct ieee80211_channel **chan_list, *chan;
5183 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5184 unsigned long links_map, link_id;
5185 struct ath12k_link_vif *arvif;
5186 struct ath12k *ar, *scan_ar;
5187 int i, j, ret = 0;
5188
5189 lockdep_assert_wiphy(hw->wiphy);
5190
5191 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL);
5192 if (!chan_list)
5193 return -ENOMEM;
5194
5195 /* There could be channels that belong to multiple underlying radio
5196 * in same scan request as mac80211 sees it as single band. In that
5197 * case split the hw_req based on frequency range and schedule scans to
5198 * corresponding radio.
5199 */
5200 for_each_ar(ah, ar, i) {
5201 int n_chans = 0;
5202
5203 for (j = 0; j < hw_req->req.n_channels; j++) {
5204 chan = hw_req->req.channels[j];
5205 scan_ar = ath12k_mac_select_scan_device(hw, vif,
5206 chan->center_freq);
5207 if (!scan_ar) {
5208 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n",
5209 chan->center_freq);
5210 ret = -EINVAL;
5211 goto abort;
5212 }
5213 if (ar != scan_ar)
5214 continue;
5215
5216 chan_list[n_chans++] = chan;
5217 }
5218 if (n_chans) {
5219 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans,
5220 chan_list, ar);
5221 if (ret)
5222 goto abort;
5223 }
5224 }
5225 abort:
5226 /* If any of the parallel scans initiated fails, abort all and
5227 * remove the scan interfaces created. Return complete scan
5228 * failure as mac80211 assumes this as single scan request.
5229 */
5230 if (ret) {
5231 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret);
5232 links_map = ahvif->links_map;
5233 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5234 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5235 if (!arvif)
5236 continue;
5237
5238 ar = arvif->ar;
5239 if (ar->scan.arvif == arvif) {
5240 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
5241 spin_lock_bh(&ar->data_lock);
5242 ar->scan.arvif = NULL;
5243 ar->scan.state = ATH12K_SCAN_IDLE;
5244 ar->scan_channel = NULL;
5245 ar->scan.roc_freq = 0;
5246 spin_unlock_bh(&ar->data_lock);
5247 }
5248 if (link_id >= ATH12K_FIRST_SCAN_LINK) {
5249 ath12k_mac_remove_link_interface(hw, arvif);
5250 ath12k_mac_unassign_link_vif(arvif);
5251 }
5252 }
5253 }
5254 kfree(chan_list);
5255 return ret;
5256 }
5257
ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5258 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
5259 struct ieee80211_vif *vif)
5260 {
5261 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5262 unsigned long link_id, links_map = ahvif->links_map;
5263 struct ath12k_link_vif *arvif;
5264 struct ath12k *ar;
5265
5266 lockdep_assert_wiphy(hw->wiphy);
5267
5268 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5269 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5270 if (!arvif || arvif->is_started)
5271 continue;
5272
5273 ar = arvif->ar;
5274
5275 ath12k_scan_abort(ar);
5276
5277 cancel_delayed_work_sync(&ar->scan.timeout);
5278 }
5279 }
5280
ath12k_install_key(struct ath12k_link_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)5281 static int ath12k_install_key(struct ath12k_link_vif *arvif,
5282 struct ieee80211_key_conf *key,
5283 enum set_key_cmd cmd,
5284 const u8 *macaddr, u32 flags)
5285 {
5286 int ret;
5287 struct ath12k *ar = arvif->ar;
5288 struct wmi_vdev_install_key_arg arg = {
5289 .vdev_id = arvif->vdev_id,
5290 .key_idx = key->keyidx,
5291 .key_len = key->keylen,
5292 .key_data = key->key,
5293 .key_flags = flags,
5294 .ieee80211_key_cipher = key->cipher,
5295 .macaddr = macaddr,
5296 };
5297 struct ath12k_vif *ahvif = arvif->ahvif;
5298
5299 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5300
5301 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
5302 return 0;
5303
5304 if (cmd == DISABLE_KEY) {
5305 /* TODO: Check if FW expects value other than NONE for del */
5306 /* arg.key_cipher = WMI_CIPHER_NONE; */
5307 arg.key_len = 0;
5308 arg.key_data = NULL;
5309 goto check_order;
5310 }
5311
5312 switch (key->cipher) {
5313 case WLAN_CIPHER_SUITE_CCMP:
5314 case WLAN_CIPHER_SUITE_CCMP_256:
5315 arg.key_cipher = WMI_CIPHER_AES_CCM;
5316 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5317 break;
5318 case WLAN_CIPHER_SUITE_TKIP:
5319 arg.key_cipher = WMI_CIPHER_TKIP;
5320 arg.key_txmic_len = 8;
5321 arg.key_rxmic_len = 8;
5322 break;
5323 case WLAN_CIPHER_SUITE_GCMP:
5324 case WLAN_CIPHER_SUITE_GCMP_256:
5325 arg.key_cipher = WMI_CIPHER_AES_GCM;
5326 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5327 break;
5328 case WLAN_CIPHER_SUITE_AES_CMAC:
5329 arg.key_cipher = WMI_CIPHER_AES_CMAC;
5330 break;
5331 case WLAN_CIPHER_SUITE_BIP_GMAC_128:
5332 case WLAN_CIPHER_SUITE_BIP_GMAC_256:
5333 arg.key_cipher = WMI_CIPHER_AES_GMAC;
5334 break;
5335 case WLAN_CIPHER_SUITE_BIP_CMAC_256:
5336 arg.key_cipher = WMI_CIPHER_AES_CMAC;
5337 break;
5338 default:
5339 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
5340 return -EOPNOTSUPP;
5341 }
5342
5343 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
5344 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
5345 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
5346
5347 check_order:
5348 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5349 arg.key_flags == WMI_KEY_GROUP) {
5350 if (cmd == SET_KEY) {
5351 if (arvif->pairwise_key_done) {
5352 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5353 "vdev %u pairwise key done, go install group key\n",
5354 arg.vdev_id);
5355 goto install;
5356 } else {
5357 /* WCN7850 firmware requires pairwise key to be installed
5358 * before group key. In case group key comes first, cache
5359 * it and return. Will revisit it once pairwise key gets
5360 * installed.
5361 */
5362 arvif->group_key = arg;
5363 arvif->group_key_valid = true;
5364 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5365 "vdev %u group key before pairwise key, cache and skip\n",
5366 arg.vdev_id);
5367
5368 ret = 0;
5369 goto out;
5370 }
5371 } else {
5372 arvif->group_key_valid = false;
5373 }
5374 }
5375
5376 install:
5377 reinit_completion(&ar->install_key_done);
5378
5379 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
5380 if (ret)
5381 return ret;
5382
5383 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
5384 return -ETIMEDOUT;
5385
5386 if (ether_addr_equal(arg.macaddr, arvif->bssid))
5387 ahvif->key_cipher = arg.ieee80211_key_cipher;
5388
5389 if (ar->install_key_status) {
5390 ret = -EINVAL;
5391 goto out;
5392 }
5393
5394 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5395 arg.key_flags == WMI_KEY_PAIRWISE) {
5396 if (cmd == SET_KEY) {
5397 arvif->pairwise_key_done = true;
5398 if (arvif->group_key_valid) {
5399 /* Install cached GTK */
5400 arvif->group_key_valid = false;
5401 arg = arvif->group_key;
5402 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5403 "vdev %u pairwise key done, group key ready, go install\n",
5404 arg.vdev_id);
5405 goto install;
5406 }
5407 } else {
5408 arvif->pairwise_key_done = false;
5409 }
5410 }
5411
5412 out:
5413 if (ret) {
5414 /* In case of failure userspace may not do DISABLE_KEY
5415 * but triggers re-connection directly, so manually reset
5416 * status here.
5417 */
5418 arvif->group_key_valid = false;
5419 arvif->pairwise_key_done = false;
5420 }
5421
5422 return ret;
5423 }
5424
ath12k_clear_peer_keys(struct ath12k_link_vif * arvif,const u8 * addr)5425 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif,
5426 const u8 *addr)
5427 {
5428 struct ath12k *ar = arvif->ar;
5429 struct ath12k_base *ab = ar->ab;
5430 struct ath12k_peer *peer;
5431 int first_errno = 0;
5432 int ret;
5433 int i;
5434 u32 flags = 0;
5435
5436 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5437
5438 spin_lock_bh(&ab->base_lock);
5439 peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
5440 spin_unlock_bh(&ab->base_lock);
5441
5442 if (!peer)
5443 return -ENOENT;
5444
5445 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
5446 if (!peer->keys[i])
5447 continue;
5448
5449 /* key flags are not required to delete the key */
5450 ret = ath12k_install_key(arvif, peer->keys[i],
5451 DISABLE_KEY, addr, flags);
5452 if (ret < 0 && first_errno == 0)
5453 first_errno = ret;
5454
5455 if (ret < 0)
5456 ath12k_warn(ab, "failed to remove peer key %d: %d\n",
5457 i, ret);
5458
5459 spin_lock_bh(&ab->base_lock);
5460 peer->keys[i] = NULL;
5461 spin_unlock_bh(&ab->base_lock);
5462 }
5463
5464 return first_errno;
5465 }
5466
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)5467 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
5468 struct ath12k_link_vif *arvif,
5469 struct ath12k_link_sta *arsta,
5470 struct ieee80211_key_conf *key)
5471 {
5472 struct ieee80211_sta *sta = NULL;
5473 struct ath12k_base *ab = ar->ab;
5474 struct ath12k_peer *peer;
5475 struct ath12k_sta *ahsta;
5476 const u8 *peer_addr;
5477 int ret;
5478 u32 flags = 0;
5479
5480 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5481
5482 if (arsta)
5483 sta = ath12k_ahsta_to_sta(arsta->ahsta);
5484
5485 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
5486 return 1;
5487
5488 if (sta)
5489 peer_addr = arsta->addr;
5490 else
5491 peer_addr = arvif->bssid;
5492
5493 key->hw_key_idx = key->keyidx;
5494
5495 /* the peer should not disappear in mid-way (unless FW goes awry) since
5496 * we already hold wiphy lock. we just make sure its there now.
5497 */
5498 spin_lock_bh(&ab->base_lock);
5499 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5500 spin_unlock_bh(&ab->base_lock);
5501
5502 if (!peer) {
5503 if (cmd == SET_KEY) {
5504 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
5505 peer_addr);
5506 return -EOPNOTSUPP;
5507 }
5508
5509 /* if the peer doesn't exist there is no key to disable
5510 * anymore
5511 */
5512 return 0;
5513 }
5514
5515 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5516 flags = WMI_KEY_PAIRWISE;
5517 else
5518 flags = WMI_KEY_GROUP;
5519
5520 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
5521 if (ret) {
5522 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
5523 return ret;
5524 }
5525
5526 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
5527 if (ret) {
5528 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
5529 return ret;
5530 }
5531
5532 spin_lock_bh(&ab->base_lock);
5533 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5534 if (peer && cmd == SET_KEY) {
5535 peer->keys[key->keyidx] = key;
5536 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
5537 peer->ucast_keyidx = key->keyidx;
5538 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
5539 } else {
5540 peer->mcast_keyidx = key->keyidx;
5541 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
5542 }
5543 } else if (peer && cmd == DISABLE_KEY) {
5544 peer->keys[key->keyidx] = NULL;
5545 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5546 peer->ucast_keyidx = 0;
5547 else
5548 peer->mcast_keyidx = 0;
5549 } else if (!peer)
5550 /* impossible unless FW goes crazy */
5551 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
5552
5553 if (sta) {
5554 ahsta = ath12k_sta_to_ahsta(sta);
5555
5556 switch (key->cipher) {
5557 case WLAN_CIPHER_SUITE_TKIP:
5558 case WLAN_CIPHER_SUITE_CCMP:
5559 case WLAN_CIPHER_SUITE_CCMP_256:
5560 case WLAN_CIPHER_SUITE_GCMP:
5561 case WLAN_CIPHER_SUITE_GCMP_256:
5562 if (cmd == SET_KEY)
5563 ahsta->pn_type = HAL_PN_TYPE_WPA;
5564 else
5565 ahsta->pn_type = HAL_PN_TYPE_NONE;
5566 break;
5567 default:
5568 ahsta->pn_type = HAL_PN_TYPE_NONE;
5569 break;
5570 }
5571 }
5572
5573 spin_unlock_bh(&ab->base_lock);
5574
5575 return 0;
5576 }
5577
ath12k_mac_update_key_cache(struct ath12k_vif_cache * cache,enum set_key_cmd cmd,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5578 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache,
5579 enum set_key_cmd cmd,
5580 struct ieee80211_sta *sta,
5581 struct ieee80211_key_conf *key)
5582 {
5583 struct ath12k_key_conf *key_conf, *tmp;
5584
5585 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
5586 if (key_conf->key != key)
5587 continue;
5588
5589 /* If SET key entry is already present in cache, nothing to do,
5590 * just return
5591 */
5592 if (cmd == SET_KEY)
5593 return 0;
5594
5595 /* DEL key for an old SET key which driver hasn't flushed yet.
5596 */
5597 list_del(&key_conf->list);
5598 kfree(key_conf);
5599 }
5600
5601 if (cmd == SET_KEY) {
5602 key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL);
5603
5604 if (!key_conf)
5605 return -ENOMEM;
5606
5607 key_conf->cmd = cmd;
5608 key_conf->sta = sta;
5609 key_conf->key = key;
5610 list_add_tail(&key_conf->list,
5611 &cache->key_conf.list);
5612 }
5613
5614 return 0;
5615 }
5616
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)5617 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5618 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5619 struct ieee80211_key_conf *key)
5620 {
5621 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5622 struct ath12k_link_vif *arvif;
5623 struct ath12k_link_sta *arsta = NULL;
5624 struct ath12k_vif_cache *cache;
5625 struct ath12k_sta *ahsta;
5626 unsigned long links;
5627 u8 link_id;
5628 int ret;
5629
5630 lockdep_assert_wiphy(hw->wiphy);
5631
5632 /* IGTK needs to be done in host software */
5633 if (key->keyidx == 4 || key->keyidx == 5)
5634 return 1;
5635
5636 if (key->keyidx > WMI_MAX_KEY_INDEX)
5637 return -ENOSPC;
5638
5639 if (sta) {
5640 ahsta = ath12k_sta_to_ahsta(sta);
5641
5642 /* For an ML STA Pairwise key is same for all associated link Stations,
5643 * hence do set key for all link STAs which are active.
5644 */
5645 if (sta->mlo) {
5646 links = ahsta->links_map;
5647 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
5648 arvif = wiphy_dereference(hw->wiphy,
5649 ahvif->link[link_id]);
5650 arsta = wiphy_dereference(hw->wiphy,
5651 ahsta->link[link_id]);
5652
5653 if (WARN_ON(!arvif || !arsta))
5654 /* arvif and arsta are expected to be valid when
5655 * STA is present.
5656 */
5657 continue;
5658
5659 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif,
5660 arsta, key);
5661 if (ret)
5662 break;
5663 }
5664
5665 return 0;
5666 }
5667
5668 arsta = &ahsta->deflink;
5669 arvif = arsta->arvif;
5670 if (WARN_ON(!arvif))
5671 return -EINVAL;
5672
5673 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key);
5674 if (ret)
5675 return ret;
5676
5677 return 0;
5678 }
5679
5680 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
5681 link_id = key->link_id;
5682 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5683 } else {
5684 link_id = 0;
5685 arvif = &ahvif->deflink;
5686 }
5687
5688 if (!arvif || !arvif->is_created) {
5689 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
5690 if (!cache)
5691 return -ENOSPC;
5692
5693 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key);
5694 if (ret)
5695 return ret;
5696
5697 return 0;
5698 }
5699
5700 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key);
5701 if (ret)
5702 return ret;
5703
5704 return 0;
5705 }
5706
5707 static int
ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5708 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
5709 enum nl80211_band band,
5710 const struct cfg80211_bitrate_mask *mask)
5711 {
5712 int num_rates = 0;
5713 int i;
5714
5715 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5716 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5717
5718 return num_rates;
5719 }
5720
5721 static int
ath12k_mac_bitrate_mask_num_he_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5722 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar,
5723 enum nl80211_band band,
5724 const struct cfg80211_bitrate_mask *mask)
5725 {
5726 int num_rates = 0;
5727 int i;
5728
5729 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
5730 num_rates += hweight16(mask->control[band].he_mcs[i]);
5731
5732 return num_rates;
5733 }
5734
5735 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)5736 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
5737 struct ath12k_link_sta *arsta,
5738 const struct cfg80211_bitrate_mask *mask,
5739 enum nl80211_band band)
5740 {
5741 struct ath12k *ar = arvif->ar;
5742 u8 vht_rate, nss;
5743 u32 rate_code;
5744 int ret, i;
5745
5746 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5747
5748 nss = 0;
5749
5750 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5751 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5752 nss = i + 1;
5753 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
5754 }
5755 }
5756
5757 if (!nss) {
5758 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
5759 arsta->addr);
5760 return -EINVAL;
5761 }
5762
5763 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5764 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
5765 arsta->addr);
5766
5767 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
5768 WMI_RATE_PREAMBLE_VHT);
5769 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5770 arvif->vdev_id,
5771 WMI_PEER_PARAM_FIXED_RATE,
5772 rate_code);
5773 if (ret)
5774 ath12k_warn(ar->ab,
5775 "failed to update STA %pM Fixed Rate %d: %d\n",
5776 arsta->addr, rate_code, ret);
5777
5778 return ret;
5779 }
5780
5781 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)5782 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif,
5783 struct ath12k_link_sta *arsta,
5784 const struct cfg80211_bitrate_mask *mask,
5785 enum nl80211_band band)
5786 {
5787 struct ath12k *ar = arvif->ar;
5788 u8 he_rate, nss;
5789 u32 rate_code;
5790 int ret, i;
5791 struct ath12k_sta *ahsta = arsta->ahsta;
5792 struct ieee80211_sta *sta;
5793
5794 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5795
5796 sta = ath12k_ahsta_to_sta(ahsta);
5797 nss = 0;
5798
5799 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
5800 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
5801 nss = i + 1;
5802 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
5803 }
5804 }
5805
5806 if (!nss) {
5807 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM",
5808 arsta->addr);
5809 return -EINVAL;
5810 }
5811
5812 /* Avoid updating invalid nss as fixed rate*/
5813 if (nss > sta->deflink.rx_nss)
5814 return -EINVAL;
5815
5816 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5817 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates",
5818 arsta->addr);
5819
5820 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1,
5821 WMI_RATE_PREAMBLE_HE);
5822
5823 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5824 arvif->vdev_id,
5825 WMI_PEER_PARAM_FIXED_RATE,
5826 rate_code);
5827 if (ret)
5828 ath12k_warn(ar->ab,
5829 "failed to update STA %pM Fixed Rate %d: %d\n",
5830 arsta->addr, rate_code, ret);
5831
5832 return ret;
5833 }
5834
ath12k_mac_station_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,bool reassoc)5835 static int ath12k_mac_station_assoc(struct ath12k *ar,
5836 struct ath12k_link_vif *arvif,
5837 struct ath12k_link_sta *arsta,
5838 bool reassoc)
5839 {
5840 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
5841 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5842 struct ieee80211_link_sta *link_sta;
5843 int ret;
5844 struct cfg80211_chan_def def;
5845 enum nl80211_band band;
5846 struct cfg80211_bitrate_mask *mask;
5847 u8 num_vht_rates, num_he_rates;
5848 u8 link_id = arvif->link_id;
5849
5850 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5851
5852 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5853 return -EPERM;
5854
5855 if (WARN_ON(!rcu_access_pointer(sta->link[link_id])))
5856 return -EINVAL;
5857
5858 band = def.chan->band;
5859 mask = &arvif->bitrate_mask;
5860
5861 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
5862 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
5863 if (!peer_arg)
5864 return -ENOMEM;
5865
5866 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc);
5867
5868 if (peer_arg->peer_nss < 1) {
5869 ath12k_warn(ar->ab,
5870 "invalid peer NSS %d\n", peer_arg->peer_nss);
5871 return -EINVAL;
5872 }
5873
5874 peer_arg->is_assoc = true;
5875 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
5876 if (ret) {
5877 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
5878 arsta->addr, arvif->vdev_id, ret);
5879 return ret;
5880 }
5881
5882 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
5883 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
5884 arsta->addr, arvif->vdev_id);
5885 return -ETIMEDOUT;
5886 }
5887
5888 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
5889 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
5890
5891 /* If single VHT/HE rate is configured (by set_bitrate_mask()),
5892 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
5893 * fixed param.
5894 * Note that all other rates and NSS will be disabled for this peer.
5895 */
5896 link_sta = ath12k_mac_get_link_sta(arsta);
5897 if (!link_sta) {
5898 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n");
5899 return -EINVAL;
5900 }
5901
5902 spin_lock_bh(&ar->data_lock);
5903 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
5904 arsta->bw_prev = link_sta->bandwidth;
5905 spin_unlock_bh(&ar->data_lock);
5906
5907 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
5908 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band);
5909 } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
5910 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
5911 if (ret)
5912 return ret;
5913 }
5914
5915 /* Re-assoc is run only to update supported rates for given station. It
5916 * doesn't make much sense to reconfigure the peer completely.
5917 */
5918 if (reassoc)
5919 return 0;
5920
5921 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr,
5922 &link_sta->ht_cap, &link_sta->he_6ghz_capa);
5923 if (ret) {
5924 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
5925 arvif->vdev_id, ret);
5926 return ret;
5927 }
5928
5929 if (!sta->wme) {
5930 arvif->num_legacy_stations++;
5931 ret = ath12k_recalc_rtscts_prot(arvif);
5932 if (ret)
5933 return ret;
5934 }
5935
5936 if (sta->wme && sta->uapsd_queues) {
5937 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta);
5938 if (ret) {
5939 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
5940 arsta->addr, arvif->vdev_id, ret);
5941 return ret;
5942 }
5943 }
5944
5945 return 0;
5946 }
5947
ath12k_mac_station_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)5948 static int ath12k_mac_station_disassoc(struct ath12k *ar,
5949 struct ath12k_link_vif *arvif,
5950 struct ath12k_link_sta *arsta)
5951 {
5952 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5953
5954 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5955
5956 if (!sta->wme) {
5957 arvif->num_legacy_stations--;
5958 return ath12k_recalc_rtscts_prot(arvif);
5959 }
5960
5961 return 0;
5962 }
5963
ath12k_sta_rc_update_wk(struct wiphy * wiphy,struct wiphy_work * wk)5964 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
5965 {
5966 struct ieee80211_link_sta *link_sta;
5967 struct ath12k *ar;
5968 struct ath12k_link_vif *arvif;
5969 struct ieee80211_sta *sta;
5970 struct cfg80211_chan_def def;
5971 enum nl80211_band band;
5972 const u8 *ht_mcs_mask;
5973 const u16 *vht_mcs_mask;
5974 const u16 *he_mcs_mask;
5975 u32 changed, bw, nss, mac_nss, smps, bw_prev;
5976 int err, num_vht_rates, num_he_rates;
5977 const struct cfg80211_bitrate_mask *mask;
5978 enum wmi_phy_mode peer_phymode;
5979 struct ath12k_link_sta *arsta;
5980 struct ieee80211_vif *vif;
5981
5982 lockdep_assert_wiphy(wiphy);
5983
5984 arsta = container_of(wk, struct ath12k_link_sta, update_wk);
5985 sta = ath12k_ahsta_to_sta(arsta->ahsta);
5986 arvif = arsta->arvif;
5987 vif = ath12k_ahvif_to_vif(arvif->ahvif);
5988 ar = arvif->ar;
5989
5990 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5991 return;
5992
5993 band = def.chan->band;
5994 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5995 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5996 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
5997
5998 spin_lock_bh(&ar->data_lock);
5999
6000 changed = arsta->changed;
6001 arsta->changed = 0;
6002
6003 bw = arsta->bw;
6004 bw_prev = arsta->bw_prev;
6005 nss = arsta->nss;
6006 smps = arsta->smps;
6007
6008 spin_unlock_bh(&ar->data_lock);
6009
6010 nss = max_t(u32, 1, nss);
6011 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
6012 ath12k_mac_max_vht_nss(vht_mcs_mask),
6013 ath12k_mac_max_he_nss(he_mcs_mask));
6014 nss = min(nss, mac_nss);
6015
6016 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
6017 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
6018 if (!peer_arg)
6019 return;
6020
6021 if (changed & IEEE80211_RC_BW_CHANGED) {
6022 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg);
6023 peer_phymode = peer_arg->peer_phymode;
6024
6025 if (bw > bw_prev) {
6026 /* Phymode shows maximum supported channel width, if we
6027 * upgrade bandwidth then due to sanity check of firmware,
6028 * we have to send WMI_PEER_PHYMODE followed by
6029 * WMI_PEER_CHWIDTH
6030 */
6031 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
6032 arsta->addr, bw, bw_prev);
6033 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6034 arvif->vdev_id, WMI_PEER_PHYMODE,
6035 peer_phymode);
6036 if (err) {
6037 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6038 arsta->addr, peer_phymode, err);
6039 return;
6040 }
6041 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6042 arvif->vdev_id, WMI_PEER_CHWIDTH,
6043 bw);
6044 if (err)
6045 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
6046 arsta->addr, bw, err);
6047 } else {
6048 /* When we downgrade bandwidth this will conflict with phymode
6049 * and cause to trigger firmware crash. In this case we send
6050 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
6051 */
6052 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
6053 arsta->addr, bw, bw_prev);
6054 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6055 arvif->vdev_id, WMI_PEER_CHWIDTH,
6056 bw);
6057 if (err) {
6058 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
6059 arsta->addr, bw, err);
6060 return;
6061 }
6062 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6063 arvif->vdev_id, WMI_PEER_PHYMODE,
6064 peer_phymode);
6065 if (err)
6066 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6067 arsta->addr, peer_phymode, err);
6068 }
6069 }
6070
6071 if (changed & IEEE80211_RC_NSS_CHANGED) {
6072 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
6073 arsta->addr, nss);
6074
6075 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6076 WMI_PEER_NSS, nss);
6077 if (err)
6078 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
6079 arsta->addr, nss, err);
6080 }
6081
6082 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6083 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
6084 arsta->addr, smps);
6085
6086 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6087 WMI_PEER_MIMO_PS_STATE, smps);
6088 if (err)
6089 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
6090 arsta->addr, smps, err);
6091 }
6092
6093 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6094 mask = &arvif->bitrate_mask;
6095 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6096 mask);
6097 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band,
6098 mask);
6099
6100 /* Peer_assoc_prepare will reject vht rates in
6101 * bitrate_mask if its not available in range format and
6102 * sets vht tx_rateset as unsupported. So multiple VHT MCS
6103 * setting(eg. MCS 4,5,6) per peer is not supported here.
6104 * But, Single rate in VHT mask can be set as per-peer
6105 * fixed rate. But even if any HT rates are configured in
6106 * the bitrate mask, device will not switch to those rates
6107 * when per-peer Fixed rate is set.
6108 * TODO: Check RATEMASK_CMDID to support auto rates selection
6109 * across HT/VHT and for multiple VHT MCS support.
6110 */
6111 link_sta = ath12k_mac_get_link_sta(arsta);
6112 if (!link_sta) {
6113 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
6114 sta->addr, arsta->link_id);
6115 return;
6116 }
6117
6118 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
6119 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
6120 band);
6121 } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
6122 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
6123 } else {
6124 /* If the peer is non-VHT/HE or no fixed VHT/HE rate
6125 * is provided in the new bitrate mask we set the
6126 * other rates using peer_assoc command. Also clear
6127 * the peer fixed rate settings as it has higher proprity
6128 * than peer assoc
6129 */
6130 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6131 arvif->vdev_id,
6132 WMI_PEER_PARAM_FIXED_RATE,
6133 WMI_FIXED_RATE_NONE);
6134 if (err)
6135 ath12k_warn(ar->ab,
6136 "failed to disable peer fixed rate for STA %pM ret %d\n",
6137 arsta->addr, err);
6138
6139 ath12k_peer_assoc_prepare(ar, arvif, arsta,
6140 peer_arg, true);
6141
6142 peer_arg->is_assoc = false;
6143 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
6144 if (err)
6145 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
6146 arsta->addr, arvif->vdev_id, err);
6147
6148 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
6149 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
6150 arsta->addr, arvif->vdev_id);
6151 }
6152 }
6153 }
6154
ath12k_mac_free_unassign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,u8 link_id)6155 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah,
6156 struct ath12k_sta *ahsta,
6157 u8 link_id)
6158 {
6159 struct ath12k_link_sta *arsta;
6160
6161 lockdep_assert_wiphy(ah->hw->wiphy);
6162
6163 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
6164 return;
6165
6166 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6167 if (WARN_ON(!arsta))
6168 return;
6169
6170 ahsta->links_map &= ~BIT(link_id);
6171 rcu_assign_pointer(ahsta->link[link_id], NULL);
6172 synchronize_rcu();
6173
6174 if (arsta == &ahsta->deflink) {
6175 arsta->link_id = ATH12K_INVALID_LINK_ID;
6176 arsta->ahsta = NULL;
6177 arsta->arvif = NULL;
6178 return;
6179 }
6180
6181 kfree(arsta);
6182 }
6183
ath12k_mac_inc_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6184 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif,
6185 struct ath12k_link_sta *arsta)
6186 {
6187 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6188 struct ath12k *ar = arvif->ar;
6189
6190 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6191
6192 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6193 return 0;
6194
6195 if (ar->num_stations >= ar->max_num_stations)
6196 return -ENOBUFS;
6197
6198 ar->num_stations++;
6199 arvif->num_stations++;
6200
6201 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6202 "mac station %pM connected to vdev %u num_stations %u\n",
6203 arsta->addr, arvif->vdev_id, arvif->num_stations);
6204
6205 return 0;
6206 }
6207
ath12k_mac_dec_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6208 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif,
6209 struct ath12k_link_sta *arsta)
6210 {
6211 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6212 struct ath12k *ar = arvif->ar;
6213
6214 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6215
6216 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6217 return;
6218
6219 ar->num_stations--;
6220
6221 if (arvif->num_stations) {
6222 arvif->num_stations--;
6223 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6224 "mac station %pM disconnected from vdev %u num_stations %u\n",
6225 arsta->addr, arvif->vdev_id, arvif->num_stations);
6226 } else {
6227 ath12k_warn(ar->ab,
6228 "mac station %pM disconnect for vdev %u without any connected station\n",
6229 arsta->addr, arvif->vdev_id);
6230 }
6231 }
6232
ath12k_mac_station_post_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6233 static void ath12k_mac_station_post_remove(struct ath12k *ar,
6234 struct ath12k_link_vif *arvif,
6235 struct ath12k_link_sta *arsta)
6236 {
6237 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6238 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6239 struct ath12k_peer *peer;
6240
6241 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6242
6243 ath12k_mac_dec_num_stations(arvif, arsta);
6244
6245 spin_lock_bh(&ar->ab->base_lock);
6246
6247 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6248 if (peer && peer->sta == sta) {
6249 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
6250 vif->addr, arvif->vdev_id);
6251 peer->sta = NULL;
6252 list_del(&peer->list);
6253 kfree(peer);
6254 ar->num_peers--;
6255 }
6256
6257 spin_unlock_bh(&ar->ab->base_lock);
6258
6259 kfree(arsta->rx_stats);
6260 arsta->rx_stats = NULL;
6261 }
6262
ath12k_mac_station_unauthorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6263 static int ath12k_mac_station_unauthorize(struct ath12k *ar,
6264 struct ath12k_link_vif *arvif,
6265 struct ath12k_link_sta *arsta)
6266 {
6267 struct ath12k_peer *peer;
6268 int ret;
6269
6270 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6271
6272 spin_lock_bh(&ar->ab->base_lock);
6273
6274 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6275 if (peer)
6276 peer->is_authorized = false;
6277
6278 spin_unlock_bh(&ar->ab->base_lock);
6279
6280 /* Driver must clear the keys during the state change from
6281 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
6282 * returning from here, mac80211 is going to delete the keys
6283 * in __sta_info_destroy_part2(). This will ensure that the driver does
6284 * not retain stale key references after mac80211 deletes the keys.
6285 */
6286 ret = ath12k_clear_peer_keys(arvif, arsta->addr);
6287 if (ret) {
6288 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
6289 arvif->vdev_id, ret);
6290 return ret;
6291 }
6292
6293 return 0;
6294 }
6295
ath12k_mac_station_authorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6296 static int ath12k_mac_station_authorize(struct ath12k *ar,
6297 struct ath12k_link_vif *arvif,
6298 struct ath12k_link_sta *arsta)
6299 {
6300 struct ath12k_peer *peer;
6301 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6302 int ret;
6303
6304 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6305
6306 spin_lock_bh(&ar->ab->base_lock);
6307
6308 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6309 if (peer)
6310 peer->is_authorized = true;
6311
6312 spin_unlock_bh(&ar->ab->base_lock);
6313
6314 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
6315 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6316 arvif->vdev_id,
6317 WMI_PEER_AUTHORIZE,
6318 1);
6319 if (ret) {
6320 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
6321 arsta->addr, arvif->vdev_id, ret);
6322 return ret;
6323 }
6324 }
6325
6326 return 0;
6327 }
6328
ath12k_mac_station_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6329 static int ath12k_mac_station_remove(struct ath12k *ar,
6330 struct ath12k_link_vif *arvif,
6331 struct ath12k_link_sta *arsta)
6332 {
6333 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6334 struct ath12k_vif *ahvif = arvif->ahvif;
6335 int ret = 0;
6336
6337 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6338
6339 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk);
6340
6341 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6342 ath12k_bss_disassoc(ar, arvif);
6343 ret = ath12k_mac_vdev_stop(arvif);
6344 if (ret)
6345 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
6346 arvif->vdev_id, ret);
6347 }
6348
6349 if (sta->mlo)
6350 return ret;
6351
6352 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr);
6353
6354 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6355 if (ret)
6356 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
6357 arsta->addr, arvif->vdev_id);
6358 else
6359 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
6360 arsta->addr, arvif->vdev_id);
6361
6362 ath12k_mac_station_post_remove(ar, arvif, arsta);
6363
6364 if (sta->valid_links)
6365 ath12k_mac_free_unassign_link_sta(ahvif->ah,
6366 arsta->ahsta, arsta->link_id);
6367
6368 return ret;
6369 }
6370
ath12k_mac_station_add(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6371 static int ath12k_mac_station_add(struct ath12k *ar,
6372 struct ath12k_link_vif *arvif,
6373 struct ath12k_link_sta *arsta)
6374 {
6375 struct ath12k_base *ab = ar->ab;
6376 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6377 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6378 struct ath12k_wmi_peer_create_arg peer_param = {};
6379 int ret;
6380
6381 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6382
6383 ret = ath12k_mac_inc_num_stations(arvif, arsta);
6384 if (ret) {
6385 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
6386 ar->max_num_stations);
6387 goto exit;
6388 }
6389
6390 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) {
6391 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
6392 if (!arsta->rx_stats) {
6393 ret = -ENOMEM;
6394 goto dec_num_station;
6395 }
6396 }
6397
6398 peer_param.vdev_id = arvif->vdev_id;
6399 peer_param.peer_addr = arsta->addr;
6400 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6401 peer_param.ml_enabled = sta->mlo;
6402
6403 ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
6404 if (ret) {
6405 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
6406 arsta->addr, arvif->vdev_id);
6407 goto free_peer;
6408 }
6409
6410 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
6411 arsta->addr, arvif->vdev_id);
6412
6413 if (ieee80211_vif_is_mesh(vif)) {
6414 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6415 arvif->vdev_id,
6416 WMI_PEER_USE_4ADDR, 1);
6417 if (ret) {
6418 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
6419 arsta->addr, ret);
6420 goto free_peer;
6421 }
6422 }
6423
6424 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr);
6425 if (ret) {
6426 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
6427 arsta->addr, arvif->vdev_id, ret);
6428 goto free_peer;
6429 }
6430
6431 if (ab->hw_params->vdev_start_delay &&
6432 !arvif->is_started &&
6433 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) {
6434 ret = ath12k_start_vdev_delay(ar, arvif);
6435 if (ret) {
6436 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
6437 goto free_peer;
6438 }
6439 }
6440
6441 ewma_avg_rssi_init(&arsta->avg_rssi);
6442 return 0;
6443
6444 free_peer:
6445 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6446 kfree(arsta->rx_stats);
6447 arsta->rx_stats = NULL;
6448 dec_num_station:
6449 ath12k_mac_dec_num_stations(arvif, arsta);
6450 exit:
6451 return ret;
6452 }
6453
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)6454 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
6455 struct ath12k_sta *ahsta,
6456 struct ath12k_link_sta *arsta,
6457 struct ath12k_vif *ahvif,
6458 u8 link_id)
6459 {
6460 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6461 struct ieee80211_link_sta *link_sta;
6462 struct ath12k_link_vif *arvif;
6463
6464 lockdep_assert_wiphy(ah->hw->wiphy);
6465
6466 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
6467 return -EINVAL;
6468
6469 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6470 if (!arvif)
6471 return -EINVAL;
6472
6473 memset(arsta, 0, sizeof(*arsta));
6474
6475 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]);
6476 if (!link_sta)
6477 return -EINVAL;
6478
6479 ether_addr_copy(arsta->addr, link_sta->addr);
6480
6481 /* logical index of the link sta in order of creation */
6482 arsta->link_idx = ahsta->num_peer++;
6483
6484 arsta->link_id = link_id;
6485 ahsta->links_map |= BIT(arsta->link_id);
6486 arsta->arvif = arvif;
6487 arsta->ahsta = ahsta;
6488 ahsta->ahvif = ahvif;
6489
6490 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);
6491
6492 rcu_assign_pointer(ahsta->link[link_id], arsta);
6493
6494 return 0;
6495 }
6496
ath12k_mac_ml_station_remove(struct ath12k_vif * ahvif,struct ath12k_sta * ahsta)6497 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif,
6498 struct ath12k_sta *ahsta)
6499 {
6500 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6501 struct ath12k_hw *ah = ahvif->ah;
6502 struct ath12k_link_vif *arvif;
6503 struct ath12k_link_sta *arsta;
6504 unsigned long links;
6505 struct ath12k *ar;
6506 u8 link_id;
6507
6508 lockdep_assert_wiphy(ah->hw->wiphy);
6509
6510 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta);
6511
6512 /* validate link station removal and clear arsta links */
6513 links = ahsta->links_map;
6514 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6515 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6516 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6517 if (!arvif || !arsta)
6518 continue;
6519
6520 ar = arvif->ar;
6521
6522 ath12k_mac_station_post_remove(ar, arvif, arsta);
6523
6524 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
6525 }
6526
6527 ath12k_peer_ml_delete(ah, sta);
6528 }
6529
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)6530 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
6531 struct ath12k_link_vif *arvif,
6532 struct ath12k_link_sta *arsta,
6533 enum ieee80211_sta_state old_state,
6534 enum ieee80211_sta_state new_state)
6535 {
6536 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6537 struct ieee80211_bss_conf *link_conf;
6538 struct ath12k *ar = arvif->ar;
6539 struct ath12k_reg_info *reg_info;
6540 struct ath12k_base *ab = ar->ab;
6541 int ret = 0;
6542
6543 lockdep_assert_wiphy(hw->wiphy);
6544
6545 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
6546 arsta->link_id, arsta->addr, old_state, new_state);
6547
6548 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
6549 * from driver
6550 */
6551 if ((old_state == IEEE80211_STA_NONE &&
6552 new_state == IEEE80211_STA_NOTEXIST)) {
6553 ret = ath12k_mac_station_remove(ar, arvif, arsta);
6554 if (ret) {
6555 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n",
6556 arsta->addr, arvif->vdev_id);
6557 goto exit;
6558 }
6559 }
6560
6561 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */
6562 if (old_state == IEEE80211_STA_NOTEXIST &&
6563 new_state == IEEE80211_STA_NONE) {
6564 ret = ath12k_mac_station_add(ar, arvif, arsta);
6565 if (ret)
6566 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n",
6567 arsta->addr, arvif->vdev_id);
6568
6569 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
6570 * peer associated to AP/Mesh/ADHOC vif type.
6571 */
6572 } else if (old_state == IEEE80211_STA_AUTH &&
6573 new_state == IEEE80211_STA_ASSOC &&
6574 (vif->type == NL80211_IFTYPE_AP ||
6575 vif->type == NL80211_IFTYPE_MESH_POINT ||
6576 vif->type == NL80211_IFTYPE_ADHOC)) {
6577 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
6578 if (ret)
6579 ath12k_warn(ab, "Failed to associate station: %pM\n",
6580 arsta->addr);
6581
6582 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
6583 * authorized
6584 */
6585 } else if (old_state == IEEE80211_STA_ASSOC &&
6586 new_state == IEEE80211_STA_AUTHORIZED) {
6587 ret = ath12k_mac_station_authorize(ar, arvif, arsta);
6588 if (ret) {
6589 ath12k_warn(ab, "Failed to authorize station: %pM\n",
6590 arsta->addr);
6591 goto exit;
6592 }
6593
6594 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
6595 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6596 link_conf = ath12k_mac_get_link_bss_conf(arvif);
6597 reg_info = ab->reg_info[ar->pdev_idx];
6598 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n");
6599 ath12k_hw_to_ah(hw)->regd_updated = false;
6600 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type,
6601 link_conf->power_type);
6602 }
6603
6604 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
6605 * deauthorize it.
6606 */
6607 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
6608 new_state == IEEE80211_STA_ASSOC) {
6609 ath12k_mac_station_unauthorize(ar, arvif, arsta);
6610
6611 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to
6612 * AP/mesh/ADHOC vif type.
6613 */
6614 } else if (old_state == IEEE80211_STA_ASSOC &&
6615 new_state == IEEE80211_STA_AUTH &&
6616 (vif->type == NL80211_IFTYPE_AP ||
6617 vif->type == NL80211_IFTYPE_MESH_POINT ||
6618 vif->type == NL80211_IFTYPE_ADHOC)) {
6619 ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
6620 if (ret)
6621 ath12k_warn(ab, "Failed to disassociate station: %pM\n",
6622 arsta->addr);
6623 }
6624
6625 exit:
6626 return ret;
6627 }
6628
ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq,u8 mac_id)6629 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range,
6630 u32 freq, u8 mac_id)
6631 {
6632 return (freq >= freq_range[mac_id].low_2ghz_freq &&
6633 freq <= freq_range[mac_id].high_2ghz_freq) ||
6634 (freq >= freq_range[mac_id].low_5ghz_freq &&
6635 freq <= freq_range[mac_id].high_5ghz_freq);
6636 }
6637
6638 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)6639 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab,
6640 struct ath12k_hw_mode_freq_range_arg *freq_range,
6641 u32 freq_link1, u32 freq_link2)
6642 {
6643 u8 i;
6644
6645 for (i = 0; i < MAX_RADIOS; i++) {
6646 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) &&
6647 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i))
6648 return true;
6649 }
6650
6651 return false;
6652 }
6653
ath12k_mac_is_hw_dbs_capable(struct ath12k_base * ab)6654 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab)
6655 {
6656 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6657 ab->wmi_ab.svc_map) &&
6658 ab->wmi_ab.hw_mode_info.support_dbs;
6659 }
6660
ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6661 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab,
6662 u32 freq_link1, u32 freq_link2)
6663 {
6664 struct ath12k_hw_mode_freq_range_arg *freq_range;
6665
6666 if (!ath12k_mac_is_hw_dbs_capable(ab))
6667 return true;
6668
6669 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS];
6670 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range,
6671 freq_link1, freq_link2);
6672 }
6673
ath12k_mac_is_hw_sbs_capable(struct ath12k_base * ab)6674 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab)
6675 {
6676 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6677 ab->wmi_ab.svc_map) &&
6678 ab->wmi_ab.hw_mode_info.support_sbs;
6679 }
6680
ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6681 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab,
6682 u32 freq_link1, u32 freq_link2)
6683 {
6684 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info;
6685 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share;
6686 struct ath12k_hw_mode_freq_range_arg *sbs_low_share;
6687 struct ath12k_hw_mode_freq_range_arg *sbs_range;
6688
6689 if (!ath12k_mac_is_hw_sbs_capable(ab))
6690 return true;
6691
6692 if (ab->wmi_ab.sbs_lower_band_end_freq) {
6693 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE];
6694 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE];
6695
6696 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share,
6697 freq_link1, freq_link2) ||
6698 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share,
6699 freq_link1, freq_link2);
6700 }
6701
6702 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS];
6703 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range,
6704 freq_link1, freq_link2);
6705 }
6706
ath12k_mac_freqs_on_same_mac(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6707 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab,
6708 u32 freq_link1, u32 freq_link2)
6709 {
6710 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) &&
6711 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2);
6712 }
6713
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)6714 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab,
6715 enum wmi_mlo_link_force_reason reason,
6716 enum wmi_mlo_link_force_mode mode,
6717 u8 *mlo_vdev_id_lst,
6718 u8 num_mlo_vdev,
6719 u8 *mlo_inactive_vdev_lst,
6720 u8 num_mlo_inactive_vdev)
6721 {
6722 struct wmi_mlo_link_set_active_arg param = {};
6723 u32 entry_idx, entry_offset, vdev_idx;
6724 u8 vdev_id;
6725
6726 param.reason = reason;
6727 param.force_mode = mode;
6728
6729 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
6730 vdev_id = mlo_vdev_id_lst[vdev_idx];
6731 entry_idx = vdev_id / 32;
6732 entry_offset = vdev_id % 32;
6733 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6734 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6735 entry_idx, num_mlo_vdev, vdev_id);
6736 return -EINVAL;
6737 }
6738 param.vdev_bitmap[entry_idx] |= 1 << entry_offset;
6739 /* update entry number if entry index changed */
6740 if (param.num_vdev_bitmap < entry_idx + 1)
6741 param.num_vdev_bitmap = entry_idx + 1;
6742 }
6743
6744 ath12k_dbg(ab, ATH12K_DBG_MAC,
6745 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
6746 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]);
6747
6748 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) {
6749 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) {
6750 vdev_id = mlo_inactive_vdev_lst[vdev_idx];
6751 entry_idx = vdev_id / 32;
6752 entry_offset = vdev_id % 32;
6753 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6754 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6755 entry_idx, num_mlo_inactive_vdev, vdev_id);
6756 return -EINVAL;
6757 }
6758 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset;
6759 /* update entry number if entry index changed */
6760 if (param.num_inactive_vdev_bitmap < entry_idx + 1)
6761 param.num_inactive_vdev_bitmap = entry_idx + 1;
6762 }
6763
6764 ath12k_dbg(ab, ATH12K_DBG_MAC,
6765 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x",
6766 param.num_inactive_vdev_bitmap,
6767 param.inactive_vdev_bitmap[0],
6768 param.inactive_vdev_bitmap[1]);
6769 }
6770
6771 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM ||
6772 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) {
6773 param.num_link_entry = 1;
6774 param.link_num[0].num_of_link = num_mlo_vdev - 1;
6775 }
6776
6777 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m);
6778 }
6779
ath12k_mac_mlo_sta_update_link_active(struct ath12k_base * ab,struct ieee80211_hw * hw,struct ath12k_vif * ahvif)6780 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab,
6781 struct ieee80211_hw *hw,
6782 struct ath12k_vif *ahvif)
6783 {
6784 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6785 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6786 unsigned long links = ahvif->links_map;
6787 enum wmi_mlo_link_force_reason reason;
6788 struct ieee80211_chanctx_conf *conf;
6789 enum wmi_mlo_link_force_mode mode;
6790 struct ieee80211_bss_conf *info;
6791 struct ath12k_link_vif *arvif;
6792 u8 num_mlo_vdev = 0;
6793 u8 link_id;
6794
6795 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6796 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
6797 /* make sure vdev is created on this device */
6798 if (!arvif || !arvif->is_created || arvif->ar->ab != ab)
6799 continue;
6800
6801 info = ath12k_mac_get_link_bss_conf(arvif);
6802 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf);
6803 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq;
6804
6805 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id;
6806 num_mlo_vdev++;
6807 }
6808
6809 /* It is not allowed to activate more links than a single device
6810 * supported. Something goes wrong if we reach here.
6811 */
6812 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6813 WARN_ON_ONCE(1);
6814 return -EINVAL;
6815 }
6816
6817 /* if 2 links are established and both link channels fall on the
6818 * same hardware MAC, send command to firmware to deactivate one
6819 * of them.
6820 */
6821 if (num_mlo_vdev == 2 &&
6822 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0],
6823 mlo_freq_list[1])) {
6824 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM;
6825 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT;
6826 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode,
6827 mlo_vdev_id_lst, num_mlo_vdev,
6828 NULL, 0);
6829 }
6830
6831 return 0;
6832 }
6833
ath12k_mac_are_sbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6834 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6835 {
6836 if (!ath12k_mac_is_hw_sbs_capable(ab))
6837 return false;
6838
6839 if (ath12k_is_2ghz_channel_freq(freq_1) ||
6840 ath12k_is_2ghz_channel_freq(freq_2))
6841 return false;
6842
6843 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2);
6844 }
6845
ath12k_mac_are_dbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6846 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6847 {
6848 if (!ath12k_mac_is_hw_dbs_capable(ab))
6849 return false;
6850
6851 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2);
6852 }
6853
ath12k_mac_select_links(struct ath12k_base * ab,struct ieee80211_vif * vif,struct ieee80211_hw * hw,u16 * selected_links)6854 static int ath12k_mac_select_links(struct ath12k_base *ab,
6855 struct ieee80211_vif *vif,
6856 struct ieee80211_hw *hw,
6857 u16 *selected_links)
6858 {
6859 unsigned long useful_links = ieee80211_vif_usable_links(vif);
6860 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6861 u8 num_useful_links = hweight_long(useful_links);
6862 struct ieee80211_chanctx_conf *chanctx;
6863 struct ath12k_link_vif *assoc_arvif;
6864 u32 assoc_link_freq, partner_freq;
6865 u16 sbs_links = 0, dbs_links = 0;
6866 struct ieee80211_bss_conf *info;
6867 struct ieee80211_channel *chan;
6868 struct ieee80211_sta *sta;
6869 struct ath12k_sta *ahsta;
6870 u8 link_id;
6871
6872 /* activate all useful links if less than max supported */
6873 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6874 *selected_links = useful_links;
6875 return 0;
6876 }
6877
6878 /* only in station mode we can get here, so it's safe
6879 * to use ap_addr
6880 */
6881 rcu_read_lock();
6882 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
6883 if (!sta) {
6884 rcu_read_unlock();
6885 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr);
6886 return -EINVAL;
6887 }
6888
6889 ahsta = ath12k_sta_to_ahsta(sta);
6890 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]);
6891 info = ath12k_mac_get_link_bss_conf(assoc_arvif);
6892 chanctx = rcu_dereference(info->chanctx_conf);
6893 assoc_link_freq = chanctx->def.chan->center_freq;
6894 rcu_read_unlock();
6895 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n",
6896 assoc_arvif->link_id, assoc_link_freq);
6897
6898 /* assoc link is already activated and has to be kept active,
6899 * only need to select a partner link from others.
6900 */
6901 useful_links &= ~BIT(assoc_arvif->link_id);
6902 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) {
6903 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
6904 if (!info) {
6905 ath12k_warn(ab, "failed to get link info for link: %u\n",
6906 link_id);
6907 return -ENOLINK;
6908 }
6909
6910 chan = info->chanreq.oper.chan;
6911 if (!chan) {
6912 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id);
6913 return -EINVAL;
6914 }
6915
6916 partner_freq = chan->center_freq;
6917 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) {
6918 sbs_links |= BIT(link_id);
6919 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n",
6920 link_id, partner_freq);
6921 continue;
6922 }
6923
6924 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) {
6925 dbs_links |= BIT(link_id);
6926 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n",
6927 link_id, partner_freq);
6928 continue;
6929 }
6930
6931 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n",
6932 link_id, partner_freq);
6933 }
6934
6935 /* choose the first candidate no matter how many is in the list */
6936 if (sbs_links)
6937 link_id = __ffs(sbs_links);
6938 else if (dbs_links)
6939 link_id = __ffs(dbs_links);
6940 else
6941 link_id = ffs(useful_links) - 1;
6942
6943 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id);
6944
6945 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id);
6946
6947 return 0;
6948 }
6949
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)6950 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
6951 struct ieee80211_vif *vif,
6952 struct ieee80211_sta *sta,
6953 enum ieee80211_sta_state old_state,
6954 enum ieee80211_sta_state new_state)
6955 {
6956 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6957 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
6958 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6959 struct ath12k_base *prev_ab = NULL, *ab;
6960 struct ath12k_link_vif *arvif;
6961 struct ath12k_link_sta *arsta;
6962 unsigned long valid_links;
6963 u16 selected_links = 0;
6964 u8 link_id = 0, i;
6965 struct ath12k *ar;
6966 int ret;
6967
6968 lockdep_assert_wiphy(hw->wiphy);
6969
6970 if (ieee80211_vif_is_mld(vif) && sta->valid_links) {
6971 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1);
6972 link_id = ffs(sta->valid_links) - 1;
6973 }
6974
6975 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE:
6976 * New station add received. If this is a ML station then
6977 * ahsta->links_map will be zero and sta->valid_links will be 1.
6978 * Assign default link to the first link sta.
6979 */
6980 if (old_state == IEEE80211_STA_NOTEXIST &&
6981 new_state == IEEE80211_STA_NONE) {
6982 memset(ahsta, 0, sizeof(*ahsta));
6983
6984 arsta = &ahsta->deflink;
6985
6986 /* ML sta */
6987 if (sta->mlo && !ahsta->links_map &&
6988 (hweight16(sta->valid_links) == 1)) {
6989 ret = ath12k_peer_ml_create(ah, sta);
6990 if (ret) {
6991 ath12k_hw_warn(ah, "unable to create ML peer for sta %pM",
6992 sta->addr);
6993 goto exit;
6994 }
6995 }
6996
6997 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif,
6998 link_id);
6999 if (ret) {
7000 ath12k_hw_warn(ah, "unable assign link %d for sta %pM",
7001 link_id, sta->addr);
7002 goto exit;
7003 }
7004
7005 /* above arsta will get memset, hence do this after assign
7006 * link sta
7007 */
7008 if (sta->mlo) {
7009 /* For station mode, arvif->is_sta_assoc_link has been set when
7010 * vdev starts. Make sure the arvif/arsta pair have same setting
7011 */
7012 if (vif->type == NL80211_IFTYPE_STATION &&
7013 !arsta->arvif->is_sta_assoc_link) {
7014 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n",
7015 link_id);
7016 ret = -EINVAL;
7017 goto exit;
7018 }
7019
7020 arsta->is_assoc_link = true;
7021 ahsta->assoc_link_id = link_id;
7022 }
7023 }
7024
7025 /* In the ML station scenario, activate all partner links once the
7026 * client is transitioning to the associated state.
7027 *
7028 * FIXME: Ideally, this activation should occur when the client
7029 * transitions to the authorized state. However, there are some
7030 * issues with handling this in the firmware. Until the firmware
7031 * can manage it properly, activate the links when the client is
7032 * about to move to the associated state.
7033 */
7034 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7035 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) {
7036 /* TODO: for now only do link selection for single device
7037 * MLO case. Other cases would be handled in the future.
7038 */
7039 ab = ah->radio[0].ab;
7040 if (ab->ag->num_devices == 1) {
7041 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links);
7042 if (ret) {
7043 ath12k_warn(ab,
7044 "failed to get selected links: %d\n", ret);
7045 goto exit;
7046 }
7047 } else {
7048 selected_links = ieee80211_vif_usable_links(vif);
7049 }
7050
7051 ieee80211_set_active_links(vif, selected_links);
7052 }
7053
7054 /* Handle all the other state transitions in generic way */
7055 valid_links = ahsta->links_map;
7056 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7057 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7058 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7059 /* some assumptions went wrong! */
7060 if (WARN_ON(!arvif || !arsta))
7061 continue;
7062
7063 /* vdev might be in deleted */
7064 if (WARN_ON(!arvif->ar))
7065 continue;
7066
7067 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta,
7068 old_state, new_state);
7069 if (ret) {
7070 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d",
7071 link_id, arsta->addr, old_state, new_state);
7072 goto exit;
7073 }
7074 }
7075
7076 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7077 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) {
7078 for_each_ar(ah, ar, i) {
7079 ab = ar->ab;
7080 if (prev_ab == ab)
7081 continue;
7082
7083 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif);
7084 if (ret) {
7085 ath12k_warn(ab,
7086 "failed to update link active state on connect %d\n",
7087 ret);
7088 goto exit;
7089 }
7090
7091 prev_ab = ab;
7092 }
7093 }
7094 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST:
7095 * Remove the station from driver (handle ML sta here since that
7096 * needs special handling. Normal sta will be handled in generic
7097 * handler below
7098 */
7099 if (old_state == IEEE80211_STA_NONE &&
7100 new_state == IEEE80211_STA_NOTEXIST && sta->mlo)
7101 ath12k_mac_ml_station_remove(ahvif, ahsta);
7102
7103 ret = 0;
7104
7105 exit:
7106 /* update the state if everything went well */
7107 if (!ret)
7108 ahsta->state = new_state;
7109
7110 return ret;
7111 }
7112
ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)7113 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
7114 struct ieee80211_vif *vif,
7115 struct ieee80211_sta *sta)
7116 {
7117 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7118 struct ath12k *ar;
7119 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7120 struct ath12k_link_vif *arvif;
7121 struct ath12k_link_sta *arsta;
7122 u8 link_id;
7123 int ret;
7124 s16 txpwr;
7125
7126 lockdep_assert_wiphy(hw->wiphy);
7127
7128 /* TODO: use link id from mac80211 once that's implemented */
7129 link_id = 0;
7130
7131 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7132 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7133
7134 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
7135 txpwr = 0;
7136 } else {
7137 txpwr = sta->deflink.txpwr.power;
7138 if (!txpwr) {
7139 ret = -EINVAL;
7140 goto out;
7141 }
7142 }
7143
7144 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) {
7145 ret = -EINVAL;
7146 goto out;
7147 }
7148
7149 ar = arvif->ar;
7150
7151 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
7152 WMI_PEER_USE_FIXED_PWR, txpwr);
7153 if (ret) {
7154 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
7155 ret);
7156 goto out;
7157 }
7158
7159 out:
7160 return ret;
7161 }
7162
ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,u32 changed)7163 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
7164 struct ieee80211_vif *vif,
7165 struct ieee80211_link_sta *link_sta,
7166 u32 changed)
7167 {
7168 struct ieee80211_sta *sta = link_sta->sta;
7169 struct ath12k *ar;
7170 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7171 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7172 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7173 struct ath12k_link_sta *arsta;
7174 struct ath12k_link_vif *arvif;
7175 struct ath12k_peer *peer;
7176 u32 bw, smps;
7177
7178 rcu_read_lock();
7179 arvif = rcu_dereference(ahvif->link[link_sta->link_id]);
7180 if (!arvif) {
7181 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n",
7182 link_sta->link_id, sta->addr);
7183 rcu_read_unlock();
7184 return;
7185 }
7186
7187 ar = arvif->ar;
7188
7189 arsta = rcu_dereference(ahsta->link[link_sta->link_id]);
7190 if (!arsta) {
7191 rcu_read_unlock();
7192 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n",
7193 link_sta->link_id, sta->addr);
7194 return;
7195 }
7196 spin_lock_bh(&ar->ab->base_lock);
7197
7198 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
7199 if (!peer) {
7200 spin_unlock_bh(&ar->ab->base_lock);
7201 rcu_read_unlock();
7202 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
7203 arsta->addr, arvif->vdev_id);
7204 return;
7205 }
7206
7207 spin_unlock_bh(&ar->ab->base_lock);
7208
7209 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
7210 rcu_read_unlock();
7211 return;
7212 }
7213
7214 link_sta = rcu_dereference(sta->link[arsta->link_id]);
7215 if (!link_sta) {
7216 rcu_read_unlock();
7217 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n",
7218 sta->addr, arsta->link_id);
7219 return;
7220 }
7221
7222 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7223 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7224 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss,
7225 link_sta->smps_mode);
7226
7227 spin_lock_bh(&ar->data_lock);
7228
7229 if (changed & IEEE80211_RC_BW_CHANGED) {
7230 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
7231 arsta->bw_prev = arsta->bw;
7232 arsta->bw = bw;
7233 }
7234
7235 if (changed & IEEE80211_RC_NSS_CHANGED)
7236 arsta->nss = link_sta->rx_nss;
7237
7238 if (changed & IEEE80211_RC_SMPS_CHANGED) {
7239 smps = WMI_PEER_SMPS_PS_NONE;
7240
7241 switch (link_sta->smps_mode) {
7242 case IEEE80211_SMPS_AUTOMATIC:
7243 case IEEE80211_SMPS_OFF:
7244 smps = WMI_PEER_SMPS_PS_NONE;
7245 break;
7246 case IEEE80211_SMPS_STATIC:
7247 smps = WMI_PEER_SMPS_STATIC;
7248 break;
7249 case IEEE80211_SMPS_DYNAMIC:
7250 smps = WMI_PEER_SMPS_DYNAMIC;
7251 break;
7252 default:
7253 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n",
7254 link_sta->smps_mode, arsta->addr, link_sta->link_id);
7255 smps = WMI_PEER_SMPS_PS_NONE;
7256 break;
7257 }
7258
7259 arsta->smps = smps;
7260 }
7261
7262 arsta->changed |= changed;
7263
7264 spin_unlock_bh(&ar->data_lock);
7265
7266 wiphy_work_queue(hw->wiphy, &arsta->update_wk);
7267
7268 rcu_read_unlock();
7269 }
7270
ath12k_mac_alloc_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_vif * ahvif,u8 link_id)7271 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah,
7272 struct ath12k_sta *ahsta,
7273 struct ath12k_vif *ahvif,
7274 u8 link_id)
7275 {
7276 struct ath12k_link_sta *arsta;
7277 int ret;
7278
7279 lockdep_assert_wiphy(ah->hw->wiphy);
7280
7281 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7282 return NULL;
7283
7284 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
7285 if (arsta)
7286 return NULL;
7287
7288 arsta = kmalloc(sizeof(*arsta), GFP_KERNEL);
7289 if (!arsta)
7290 return NULL;
7291
7292 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id);
7293 if (ret) {
7294 kfree(arsta);
7295 return NULL;
7296 }
7297
7298 return arsta;
7299 }
7300
ath12k_mac_op_change_sta_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u16 old_links,u16 new_links)7301 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,
7302 struct ieee80211_vif *vif,
7303 struct ieee80211_sta *sta,
7304 u16 old_links, u16 new_links)
7305 {
7306 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7307 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7308 struct ath12k_hw *ah = hw->priv;
7309 struct ath12k_link_vif *arvif;
7310 struct ath12k_link_sta *arsta;
7311 unsigned long valid_links;
7312 struct ath12k *ar;
7313 u8 link_id;
7314 int ret;
7315
7316 lockdep_assert_wiphy(hw->wiphy);
7317
7318 if (!sta->valid_links)
7319 return -EINVAL;
7320
7321 /* Firmware does not support removal of one of link stas. All sta
7322 * would be removed during ML STA delete in sta_state(), hence link
7323 * sta removal is not handled here.
7324 */
7325 if (new_links < old_links)
7326 return 0;
7327
7328 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) {
7329 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr);
7330 return -EINVAL;
7331 }
7332
7333 /* this op is expected only after initial sta insertion with default link */
7334 if (WARN_ON(ahsta->links_map == 0))
7335 return -EINVAL;
7336
7337 valid_links = new_links;
7338 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7339 if (ahsta->links_map & BIT(link_id))
7340 continue;
7341
7342 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7343 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id);
7344
7345 if (!arvif || !arsta) {
7346 ath12k_hw_warn(ah, "Failed to alloc/assign link sta");
7347 continue;
7348 }
7349
7350 ar = arvif->ar;
7351 if (!ar)
7352 continue;
7353
7354 ret = ath12k_mac_station_add(ar, arvif, arsta);
7355 if (ret) {
7356 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
7357 arsta->addr, arvif->vdev_id);
7358 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
7359 return ret;
7360 }
7361 }
7362
7363 return 0;
7364 }
7365
ath12k_mac_op_can_activate_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 active_links)7366 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw,
7367 struct ieee80211_vif *vif,
7368 u16 active_links)
7369 {
7370 /* TODO: Handle recovery case */
7371
7372 return true;
7373 }
7374
ath12k_conf_tx_uapsd(struct ath12k_link_vif * arvif,u16 ac,bool enable)7375 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif,
7376 u16 ac, bool enable)
7377 {
7378 struct ath12k *ar = arvif->ar;
7379 struct ath12k_vif *ahvif = arvif->ahvif;
7380 u32 value;
7381 int ret;
7382
7383 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
7384 return 0;
7385
7386 switch (ac) {
7387 case IEEE80211_AC_VO:
7388 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7389 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7390 break;
7391 case IEEE80211_AC_VI:
7392 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7393 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7394 break;
7395 case IEEE80211_AC_BE:
7396 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7397 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7398 break;
7399 case IEEE80211_AC_BK:
7400 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7401 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7402 break;
7403 }
7404
7405 if (enable)
7406 ahvif->u.sta.uapsd |= value;
7407 else
7408 ahvif->u.sta.uapsd &= ~value;
7409
7410 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7411 WMI_STA_PS_PARAM_UAPSD,
7412 ahvif->u.sta.uapsd);
7413 if (ret) {
7414 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
7415 goto exit;
7416 }
7417
7418 if (ahvif->u.sta.uapsd)
7419 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7420 else
7421 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7422
7423 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7424 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7425 value);
7426 if (ret)
7427 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
7428
7429 exit:
7430 return ret;
7431 }
7432
ath12k_mac_conf_tx(struct ath12k_link_vif * arvif,u16 ac,const struct ieee80211_tx_queue_params * params)7433 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac,
7434 const struct ieee80211_tx_queue_params *params)
7435 {
7436 struct wmi_wmm_params_arg *p = NULL;
7437 struct ath12k *ar = arvif->ar;
7438 struct ath12k_base *ab = ar->ab;
7439 int ret;
7440
7441 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
7442
7443 switch (ac) {
7444 case IEEE80211_AC_VO:
7445 p = &arvif->wmm_params.ac_vo;
7446 break;
7447 case IEEE80211_AC_VI:
7448 p = &arvif->wmm_params.ac_vi;
7449 break;
7450 case IEEE80211_AC_BE:
7451 p = &arvif->wmm_params.ac_be;
7452 break;
7453 case IEEE80211_AC_BK:
7454 p = &arvif->wmm_params.ac_bk;
7455 break;
7456 }
7457
7458 if (WARN_ON(!p)) {
7459 ret = -EINVAL;
7460 goto exit;
7461 }
7462
7463 p->cwmin = params->cw_min;
7464 p->cwmax = params->cw_max;
7465 p->aifs = params->aifs;
7466 p->txop = params->txop;
7467
7468 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
7469 &arvif->wmm_params);
7470 if (ret) {
7471 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
7472 ar->pdev_idx, ret);
7473 goto exit;
7474 }
7475
7476 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
7477 if (ret)
7478 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
7479 ar->pdev_idx, ret);
7480
7481 exit:
7482 return ret;
7483 }
7484
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)7485 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
7486 struct ieee80211_vif *vif,
7487 unsigned int link_id, u16 ac,
7488 const struct ieee80211_tx_queue_params *params)
7489 {
7490 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7491 struct ath12k_link_vif *arvif;
7492 struct ath12k_vif_cache *cache;
7493 int ret;
7494
7495 lockdep_assert_wiphy(hw->wiphy);
7496
7497 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7498 return -EINVAL;
7499
7500 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7501 if (!arvif || !arvif->is_created) {
7502 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
7503 if (!cache)
7504 return -ENOSPC;
7505
7506 cache->tx_conf.changed = true;
7507 cache->tx_conf.ac = ac;
7508 cache->tx_conf.tx_queue_params = *params;
7509
7510 return 0;
7511 }
7512
7513 ret = ath12k_mac_conf_tx(arvif, ac, params);
7514
7515 return ret;
7516 }
7517
7518 static struct ieee80211_sta_ht_cap
ath12k_create_ht_cap(struct ath12k * ar,u32 ar_ht_cap,u32 rate_cap_rx_chainmask)7519 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
7520 {
7521 int i;
7522 struct ieee80211_sta_ht_cap ht_cap = {};
7523 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
7524
7525 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
7526 return ht_cap;
7527
7528 ht_cap.ht_supported = 1;
7529 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
7530 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
7531 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7532 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
7533 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
7534
7535 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
7536 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
7537
7538 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
7539 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
7540
7541 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
7542 u32 smps;
7543
7544 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
7545 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
7546
7547 ht_cap.cap |= smps;
7548 }
7549
7550 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
7551 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
7552
7553 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
7554 u32 stbc;
7555
7556 stbc = ar_ht_cap;
7557 stbc &= WMI_HT_CAP_RX_STBC;
7558 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
7559 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
7560 stbc &= IEEE80211_HT_CAP_RX_STBC;
7561
7562 ht_cap.cap |= stbc;
7563 }
7564
7565 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
7566 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
7567
7568 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
7569 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
7570
7571 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
7572 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
7573
7574 for (i = 0; i < ar->num_rx_chains; i++) {
7575 if (rate_cap_rx_chainmask & BIT(i))
7576 ht_cap.mcs.rx_mask[i] = 0xFF;
7577 }
7578
7579 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
7580
7581 return ht_cap;
7582 }
7583
ath12k_mac_set_txbf_conf(struct ath12k_link_vif * arvif)7584 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif)
7585 {
7586 u32 value = 0;
7587 struct ath12k *ar = arvif->ar;
7588 struct ath12k_vif *ahvif = arvif->ahvif;
7589 int nsts;
7590 int sound_dim;
7591 u32 vht_cap = ar->pdev->cap.vht_cap;
7592 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
7593
7594 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
7595 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
7596 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
7597 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
7598 }
7599
7600 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
7601 sound_dim = vht_cap &
7602 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
7603 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
7604 if (sound_dim > (ar->num_tx_chains - 1))
7605 sound_dim = ar->num_tx_chains - 1;
7606 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
7607 }
7608
7609 if (!value)
7610 return 0;
7611
7612 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
7613 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
7614
7615 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
7616 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
7617 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
7618 }
7619
7620 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
7621 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
7622
7623 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
7624 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
7625 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
7626 }
7627
7628 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7629 vdev_param, value);
7630 }
7631
ath12k_set_vht_txbf_cap(struct ath12k * ar,u32 * vht_cap)7632 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
7633 {
7634 bool subfer, subfee;
7635 int sound_dim = 0;
7636
7637 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
7638 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
7639
7640 if (ar->num_tx_chains < 2) {
7641 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
7642 subfer = false;
7643 }
7644
7645 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
7646 if (!subfer)
7647 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
7648
7649 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
7650 if (!subfee)
7651 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
7652
7653 sound_dim = u32_get_bits(*vht_cap,
7654 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7655 *vht_cap = u32_replace_bits(*vht_cap, 0,
7656 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7657
7658 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
7659
7660 /* Enable Sounding Dimension Field only if SU BF is enabled */
7661 if (subfer) {
7662 if (sound_dim > (ar->num_tx_chains - 1))
7663 sound_dim = ar->num_tx_chains - 1;
7664
7665 *vht_cap = u32_replace_bits(*vht_cap, sound_dim,
7666 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7667 }
7668
7669 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
7670 if (!subfee)
7671 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
7672 }
7673
7674 static struct ieee80211_sta_vht_cap
ath12k_create_vht_cap(struct ath12k * ar,u32 rate_cap_tx_chainmask,u32 rate_cap_rx_chainmask)7675 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
7676 u32 rate_cap_rx_chainmask)
7677 {
7678 struct ieee80211_sta_vht_cap vht_cap = {};
7679 u16 txmcs_map, rxmcs_map;
7680 int i;
7681
7682 vht_cap.vht_supported = 1;
7683 vht_cap.cap = ar->pdev->cap.vht_cap;
7684
7685 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
7686
7687 /* 80P80 is not supported */
7688 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
7689
7690 rxmcs_map = 0;
7691 txmcs_map = 0;
7692 for (i = 0; i < 8; i++) {
7693 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
7694 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7695 else
7696 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7697
7698 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
7699 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7700 else
7701 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7702 }
7703
7704 if (rate_cap_tx_chainmask <= 1)
7705 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
7706
7707 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
7708 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
7709
7710 /* Check if the HW supports 1:1 NSS ratio and reset
7711 * EXT NSS BW Support field to 0 to indicate 1:1 ratio
7712 */
7713 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS)
7714 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK;
7715
7716 return vht_cap;
7717 }
7718
ath12k_mac_setup_ht_vht_cap(struct ath12k * ar,struct ath12k_pdev_cap * cap,u32 * ht_cap_info)7719 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
7720 struct ath12k_pdev_cap *cap,
7721 u32 *ht_cap_info)
7722 {
7723 struct ieee80211_supported_band *band;
7724 u32 rate_cap_tx_chainmask;
7725 u32 rate_cap_rx_chainmask;
7726 u32 ht_cap;
7727
7728 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
7729 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
7730
7731 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
7732 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7733 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
7734 if (ht_cap_info)
7735 *ht_cap_info = ht_cap;
7736 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7737 rate_cap_rx_chainmask);
7738 }
7739
7740 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
7741 (ar->ab->hw_params->single_pdev_only ||
7742 !ar->supports_6ghz)) {
7743 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7744 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
7745 if (ht_cap_info)
7746 *ht_cap_info = ht_cap;
7747 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7748 rate_cap_rx_chainmask);
7749 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
7750 rate_cap_rx_chainmask);
7751 }
7752 }
7753
ath12k_check_chain_mask(struct ath12k * ar,u32 ant,bool is_tx_ant)7754 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
7755 {
7756 /* TODO: Check the request chainmask against the supported
7757 * chainmask table which is advertised in extented_service_ready event
7758 */
7759
7760 return 0;
7761 }
7762
ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,u8 * he_ppet)7763 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
7764 u8 *he_ppet)
7765 {
7766 int nss, ru;
7767 u8 bit = 7;
7768
7769 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
7770 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
7771 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
7772 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
7773 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
7774 for (ru = 0; ru < 4; ru++) {
7775 u8 val;
7776 int i;
7777
7778 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
7779 continue;
7780 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
7781 0x3f;
7782 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
7783 for (i = 5; i >= 0; i--) {
7784 he_ppet[bit / 8] |=
7785 ((val >> i) & 0x1) << ((bit % 8));
7786 bit++;
7787 }
7788 }
7789 }
7790 }
7791
7792 static void
ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem * he_cap_elem)7793 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
7794 {
7795 u8 m;
7796
7797 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
7798 IEEE80211_HE_MAC_CAP0_TWT_REQ;
7799 he_cap_elem->mac_cap_info[0] &= ~m;
7800
7801 m = IEEE80211_HE_MAC_CAP2_TRS |
7802 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7803 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7804 he_cap_elem->mac_cap_info[2] &= ~m;
7805
7806 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
7807 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7808 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7809 he_cap_elem->mac_cap_info[3] &= ~m;
7810
7811 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
7812 IEEE80211_HE_MAC_CAP4_BQR;
7813 he_cap_elem->mac_cap_info[4] &= ~m;
7814
7815 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
7816 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
7817 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
7818 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
7819 he_cap_elem->mac_cap_info[5] &= ~m;
7820
7821 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
7822 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
7823 he_cap_elem->phy_cap_info[2] &= ~m;
7824
7825 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
7826 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
7827 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
7828 he_cap_elem->phy_cap_info[3] &= ~m;
7829
7830 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
7831 he_cap_elem->phy_cap_info[4] &= ~m;
7832
7833 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
7834 he_cap_elem->phy_cap_info[5] &= ~m;
7835
7836 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
7837 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
7838 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
7839 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
7840 he_cap_elem->phy_cap_info[6] &= ~m;
7841
7842 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
7843 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
7844 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
7845 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
7846 he_cap_elem->phy_cap_info[7] &= ~m;
7847
7848 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
7849 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
7850 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
7851 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
7852 he_cap_elem->phy_cap_info[8] &= ~m;
7853
7854 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
7855 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
7856 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
7857 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
7858 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
7859 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
7860 he_cap_elem->phy_cap_info[9] &= ~m;
7861 }
7862
ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap * pcap,struct ath12k_band_cap * bcap)7863 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
7864 struct ath12k_band_cap *bcap)
7865 {
7866 u8 val;
7867
7868 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
7869 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
7870 bcap->he_6ghz_capa |=
7871 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
7872 IEEE80211_HE_6GHZ_CAP_SM_PS);
7873 else
7874 bcap->he_6ghz_capa |=
7875 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
7876 IEEE80211_HE_6GHZ_CAP_SM_PS);
7877 val = u32_get_bits(pcap->vht_cap,
7878 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
7879 bcap->he_6ghz_capa |=
7880 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
7881 val = u32_get_bits(pcap->vht_cap,
7882 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
7883 bcap->he_6ghz_capa |=
7884 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
7885 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
7886 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
7887 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
7888 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
7889
7890 return cpu_to_le16(bcap->he_6ghz_capa);
7891 }
7892
ath12k_mac_set_hemcsmap(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sta_he_cap * he_cap)7893 static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
7894 struct ath12k_pdev_cap *cap,
7895 struct ieee80211_sta_he_cap *he_cap)
7896 {
7897 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
7898 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
7899 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains);
7900 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0;
7901 u16 txmcs_map = 0, rxmcs_map = 0;
7902 u32 i;
7903
7904 for (i = 0; i < 8; i++) {
7905 if (i < ar->num_tx_chains &&
7906 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7907 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7908 else
7909 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7910
7911 if (i < ar->num_rx_chains &&
7912 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7913 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7914 else
7915 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7916
7917 if (i < maxtxnss_160 &&
7918 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7919 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7920 else
7921 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7922
7923 if (i < maxrxnss_160 &&
7924 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7925 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7926 else
7927 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7928 }
7929
7930 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
7931 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
7932 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff);
7933 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff);
7934 }
7935
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)7936 static void ath12k_mac_copy_he_cap(struct ath12k *ar,
7937 struct ath12k_band_cap *band_cap,
7938 int iftype, u8 num_tx_chains,
7939 struct ieee80211_sta_he_cap *he_cap)
7940 {
7941 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
7942
7943 he_cap->has_he = true;
7944 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
7945 sizeof(he_cap_elem->mac_cap_info));
7946 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
7947 sizeof(he_cap_elem->phy_cap_info));
7948
7949 he_cap_elem->mac_cap_info[1] &=
7950 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
7951 he_cap_elem->phy_cap_info[0] &=
7952 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7953 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7954 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
7955 /* 80PLUS80 is not supported */
7956 he_cap_elem->phy_cap_info[0] &=
7957 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
7958 he_cap_elem->phy_cap_info[5] &=
7959 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
7960 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
7961
7962 switch (iftype) {
7963 case NL80211_IFTYPE_AP:
7964 he_cap_elem->mac_cap_info[2] &=
7965 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT;
7966 he_cap_elem->phy_cap_info[3] &=
7967 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
7968 he_cap_elem->phy_cap_info[9] |=
7969 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
7970 break;
7971 case NL80211_IFTYPE_STATION:
7972 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
7973 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
7974 he_cap_elem->phy_cap_info[9] |=
7975 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
7976 break;
7977 case NL80211_IFTYPE_MESH_POINT:
7978 ath12k_mac_filter_he_cap_mesh(he_cap_elem);
7979 break;
7980 }
7981
7982 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
7983 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
7984 if (he_cap_elem->phy_cap_info[6] &
7985 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
7986 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
7987 }
7988
7989 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)7990 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
7991 struct ieee80211_eht_mcs_nss_supp *mcs_nss,
7992 const struct ieee80211_he_cap_elem *he_cap,
7993 const struct ieee80211_eht_cap_elem_fixed *eht_cap)
7994 {
7995 if ((he_cap->phy_cap_info[0] &
7996 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7997 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7998 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
7999 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
8000 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
8001 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
8002
8003 if (he_cap->phy_cap_info[0] &
8004 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8005 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
8006 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
8007 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8008
8009 if (he_cap->phy_cap_info[0] &
8010 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8011 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
8012 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8013
8014 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
8015 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
8016 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8017 }
8018
ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,struct ieee80211_sta_eht_cap * cap)8019 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
8020 struct ieee80211_sta_eht_cap *cap)
8021 {
8022 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
8023 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
8024
8025 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
8026 IEEE80211_EHT_PPE_THRES_NSS_MASK);
8027
8028 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
8029 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8030
8031 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
8032 for (ru = 0;
8033 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8034 ru++) {
8035 u32 val = 0;
8036
8037 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
8038 continue;
8039
8040 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
8041 (ru * ppet_bit_len_per_ru),
8042 GENMASK(ppet_bit_len_per_ru - 1, 0));
8043
8044 for (i = 0; i < ppet_bit_len_per_ru; i++) {
8045 cap->eht_ppe_thres[bit / 8] |=
8046 (((val >> i) & 0x1) << ((bit % 8)));
8047 bit++;
8048 }
8049 }
8050 }
8051 }
8052
8053 static void
ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed * eht_cap_elem)8054 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
8055 *eht_cap_elem)
8056 {
8057 u8 m;
8058
8059 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
8060 eht_cap_elem->mac_cap_info[0] &= ~m;
8061
8062 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
8063 eht_cap_elem->phy_cap_info[0] &= ~m;
8064
8065 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
8066 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
8067 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
8068 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
8069 eht_cap_elem->phy_cap_info[3] &= ~m;
8070
8071 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
8072 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
8073 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
8074 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
8075 eht_cap_elem->phy_cap_info[4] &= ~m;
8076
8077 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
8078 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
8079 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
8080 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
8081 eht_cap_elem->phy_cap_info[5] &= ~m;
8082
8083 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
8084 eht_cap_elem->phy_cap_info[6] &= ~m;
8085
8086 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8087 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8088 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
8089 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8090 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8091 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
8092 eht_cap_elem->phy_cap_info[7] &= ~m;
8093 }
8094
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)8095 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
8096 struct ath12k_band_cap *band_cap,
8097 struct ieee80211_he_cap_elem *he_cap_elem,
8098 int iftype,
8099 struct ieee80211_sta_eht_cap *eht_cap)
8100 {
8101 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
8102
8103 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
8104
8105 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) ||
8106 ath12k_acpi_get_disable_11be(ar->ab))
8107 return;
8108
8109 eht_cap->has_eht = true;
8110 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
8111 sizeof(eht_cap_elem->mac_cap_info));
8112 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
8113 sizeof(eht_cap_elem->phy_cap_info));
8114
8115 switch (iftype) {
8116 case NL80211_IFTYPE_AP:
8117 eht_cap_elem->phy_cap_info[0] &=
8118 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
8119 eht_cap_elem->phy_cap_info[4] &=
8120 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
8121 eht_cap_elem->phy_cap_info[5] &=
8122 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
8123 break;
8124 case NL80211_IFTYPE_STATION:
8125 eht_cap_elem->phy_cap_info[7] &=
8126 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8127 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8128 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
8129 eht_cap_elem->phy_cap_info[7] &=
8130 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8131 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8132 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
8133 break;
8134 case NL80211_IFTYPE_MESH_POINT:
8135 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
8136 break;
8137 default:
8138 break;
8139 }
8140
8141 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
8142 he_cap_elem, eht_cap_elem);
8143
8144 if (eht_cap_elem->phy_cap_info[5] &
8145 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
8146 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
8147 }
8148
ath12k_mac_copy_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sband_iftype_data * data,int band)8149 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
8150 struct ath12k_pdev_cap *cap,
8151 struct ieee80211_sband_iftype_data *data,
8152 int band)
8153 {
8154 struct ath12k_band_cap *band_cap = &cap->band[band];
8155 int i, idx = 0;
8156
8157 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
8158 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
8159
8160 switch (i) {
8161 case NL80211_IFTYPE_STATION:
8162 case NL80211_IFTYPE_AP:
8163 case NL80211_IFTYPE_MESH_POINT:
8164 break;
8165
8166 default:
8167 continue;
8168 }
8169
8170 data[idx].types_mask = BIT(i);
8171
8172 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
8173 if (band == NL80211_BAND_6GHZ) {
8174 data[idx].he_6ghz_capa.capa =
8175 ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
8176 }
8177 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
8178 &data[idx].eht_cap);
8179 idx++;
8180 }
8181
8182 return idx;
8183 }
8184
ath12k_mac_setup_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap)8185 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
8186 struct ath12k_pdev_cap *cap)
8187 {
8188 struct ieee80211_supported_band *sband;
8189 enum nl80211_band band;
8190 int count;
8191
8192 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
8193 band = NL80211_BAND_2GHZ;
8194 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8195 ar->mac.iftype[band],
8196 band);
8197 sband = &ar->mac.sbands[band];
8198 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8199 count);
8200 }
8201
8202 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
8203 band = NL80211_BAND_5GHZ;
8204 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8205 ar->mac.iftype[band],
8206 band);
8207 sband = &ar->mac.sbands[band];
8208 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8209 count);
8210 }
8211
8212 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
8213 ar->supports_6ghz) {
8214 band = NL80211_BAND_6GHZ;
8215 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8216 ar->mac.iftype[band],
8217 band);
8218 sband = &ar->mac.sbands[band];
8219 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8220 count);
8221 }
8222 }
8223
__ath12k_set_antenna(struct ath12k * ar,u32 tx_ant,u32 rx_ant)8224 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
8225 {
8226 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
8227 int ret;
8228
8229 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8230
8231 if (ath12k_check_chain_mask(ar, tx_ant, true))
8232 return -EINVAL;
8233
8234 if (ath12k_check_chain_mask(ar, rx_ant, false))
8235 return -EINVAL;
8236
8237 /* Since we advertised the max cap of all radios combined during wiphy
8238 * registration, ensure we don't set the antenna config higher than the
8239 * limits
8240 */
8241 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask);
8242 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask);
8243
8244 ar->cfg_tx_chainmask = tx_ant;
8245 ar->cfg_rx_chainmask = rx_ant;
8246
8247 if (ah->state != ATH12K_HW_STATE_ON &&
8248 ah->state != ATH12K_HW_STATE_RESTARTED)
8249 return 0;
8250
8251 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
8252 tx_ant, ar->pdev->pdev_id);
8253 if (ret) {
8254 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
8255 ret, tx_ant);
8256 return ret;
8257 }
8258
8259 ar->num_tx_chains = hweight32(tx_ant);
8260
8261 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
8262 rx_ant, ar->pdev->pdev_id);
8263 if (ret) {
8264 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
8265 ret, rx_ant);
8266 return ret;
8267 }
8268
8269 ar->num_rx_chains = hweight32(rx_ant);
8270
8271 /* Reload HT/VHT/HE capability */
8272 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
8273 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
8274
8275 return 0;
8276 }
8277
ath12k_mgmt_over_wmi_tx_drop(struct ath12k * ar,struct sk_buff * skb)8278 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
8279 {
8280 int num_mgmt;
8281
8282 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8283
8284 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
8285
8286 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
8287
8288 if (num_mgmt < 0)
8289 WARN_ON_ONCE(1);
8290
8291 if (!num_mgmt)
8292 wake_up(&ar->txmgmt_empty_waitq);
8293 }
8294
ath12k_mac_tx_mgmt_pending_free(int buf_id,void * skb,void * ctx)8295 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
8296 {
8297 struct sk_buff *msdu = skb;
8298 struct ieee80211_tx_info *info;
8299 struct ath12k *ar = ctx;
8300 struct ath12k_base *ab = ar->ab;
8301
8302 spin_lock_bh(&ar->txmgmt_idr_lock);
8303 idr_remove(&ar->txmgmt_idr, buf_id);
8304 spin_unlock_bh(&ar->txmgmt_idr_lock);
8305 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
8306 DMA_TO_DEVICE);
8307
8308 info = IEEE80211_SKB_CB(msdu);
8309 memset(&info->status, 0, sizeof(info->status));
8310
8311 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8312
8313 return 0;
8314 }
8315
ath12k_mac_vif_txmgmt_idr_remove(int buf_id,void * skb,void * ctx)8316 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
8317 {
8318 struct ieee80211_vif *vif = ctx;
8319 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8320 struct sk_buff *msdu = skb;
8321 struct ath12k *ar = skb_cb->ar;
8322 struct ath12k_base *ab = ar->ab;
8323
8324 if (skb_cb->vif == vif) {
8325 spin_lock_bh(&ar->txmgmt_idr_lock);
8326 idr_remove(&ar->txmgmt_idr, buf_id);
8327 spin_unlock_bh(&ar->txmgmt_idr_lock);
8328 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
8329 DMA_TO_DEVICE);
8330 }
8331
8332 return 0;
8333 }
8334
ath12k_mac_mgmt_tx_wmi(struct ath12k * ar,struct ath12k_link_vif * arvif,struct sk_buff * skb)8335 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif,
8336 struct sk_buff *skb)
8337 {
8338 struct ath12k_base *ab = ar->ab;
8339 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8340 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8341 struct ieee80211_tx_info *info;
8342 enum hal_encrypt_type enctype;
8343 unsigned int mic_len;
8344 dma_addr_t paddr;
8345 int buf_id;
8346 int ret;
8347
8348 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8349
8350 skb_cb->ar = ar;
8351 spin_lock_bh(&ar->txmgmt_idr_lock);
8352 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
8353 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
8354 spin_unlock_bh(&ar->txmgmt_idr_lock);
8355 if (buf_id < 0)
8356 return -ENOSPC;
8357
8358 info = IEEE80211_SKB_CB(skb);
8359 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8360 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
8361 if ((ieee80211_is_action(hdr->frame_control) ||
8362 ieee80211_is_deauth(hdr->frame_control) ||
8363 ieee80211_is_disassoc(hdr->frame_control)) &&
8364 ieee80211_has_protected(hdr->frame_control)) {
8365 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
8366 mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype);
8367 skb_put(skb, mic_len);
8368 }
8369 }
8370
8371 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
8372 if (dma_mapping_error(ab->dev, paddr)) {
8373 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
8374 ret = -EIO;
8375 goto err_free_idr;
8376 }
8377
8378 skb_cb->paddr = paddr;
8379
8380 ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb);
8381 if (ret) {
8382 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
8383 goto err_unmap_buf;
8384 }
8385
8386 return 0;
8387
8388 err_unmap_buf:
8389 dma_unmap_single(ab->dev, skb_cb->paddr,
8390 skb->len, DMA_TO_DEVICE);
8391 err_free_idr:
8392 spin_lock_bh(&ar->txmgmt_idr_lock);
8393 idr_remove(&ar->txmgmt_idr, buf_id);
8394 spin_unlock_bh(&ar->txmgmt_idr_lock);
8395
8396 return ret;
8397 }
8398
ath12k_mgmt_over_wmi_tx_purge(struct ath12k * ar)8399 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
8400 {
8401 struct sk_buff *skb;
8402
8403 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
8404 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8405 }
8406
ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8407 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8408 struct sk_buff *skb)
8409 {
8410 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8411 u8 category, *buf, iv_len, action_code, dialog_token;
8412 struct ieee80211_bss_conf *link_conf;
8413 struct ieee80211_chanctx_conf *conf;
8414 int cur_tx_power, max_tx_power;
8415 struct ath12k *ar = arvif->ar;
8416 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
8417 struct wiphy *wiphy = hw->wiphy;
8418 struct ath12k_skb_cb *skb_cb;
8419 struct ieee80211_mgmt *mgmt;
8420 unsigned int remaining_len;
8421 bool has_protected;
8422
8423 lockdep_assert_wiphy(wiphy);
8424
8425 /* make sure category field is present */
8426 if (skb->len < IEEE80211_MIN_ACTION_SIZE)
8427 return -EINVAL;
8428
8429 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE;
8430 has_protected = ieee80211_has_protected(hdr->frame_control);
8431
8432 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted,
8433 * we can't put in data in this case
8434 */
8435 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8436 has_protected)
8437 return 0;
8438
8439 mgmt = (struct ieee80211_mgmt *)hdr;
8440 buf = (u8 *)&mgmt->u.action;
8441
8442 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that
8443 * many bytes if it is there
8444 */
8445 if (has_protected) {
8446 skb_cb = ATH12K_SKB_CB(skb);
8447
8448 switch (skb_cb->cipher) {
8449 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in
8450 * key needs to be processed. See ath12k_install_key()
8451 */
8452 case WLAN_CIPHER_SUITE_CCMP:
8453 case WLAN_CIPHER_SUITE_CCMP_256:
8454 case WLAN_CIPHER_SUITE_GCMP:
8455 case WLAN_CIPHER_SUITE_GCMP_256:
8456 iv_len = IEEE80211_CCMP_HDR_LEN;
8457 break;
8458 case WLAN_CIPHER_SUITE_TKIP:
8459 iv_len = 0;
8460 break;
8461 default:
8462 return -EINVAL;
8463 }
8464
8465 if (remaining_len < iv_len)
8466 return -EINVAL;
8467
8468 buf += iv_len;
8469 remaining_len -= iv_len;
8470 }
8471
8472 category = *buf++;
8473 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence
8474 * no need to adjust remaining_len
8475 */
8476
8477 switch (category) {
8478 case WLAN_CATEGORY_RADIO_MEASUREMENT:
8479 /* need action code and dialog token */
8480 if (remaining_len < 2)
8481 return -EINVAL;
8482
8483 /* Packet Format:
8484 * Action Code | Dialog Token | Variable Len (based on Action Code)
8485 */
8486 action_code = *buf++;
8487 dialog_token = *buf++;
8488 remaining_len -= 2;
8489
8490 link_conf = ath12k_mac_get_link_bss_conf(arvif);
8491 if (!link_conf) {
8492 ath12k_warn(ar->ab,
8493 "failed to get bss link conf for vdev %d in RM handling\n",
8494 arvif->vdev_id);
8495 return -EINVAL;
8496 }
8497
8498 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf);
8499 if (!conf)
8500 return -ENOENT;
8501
8502 cur_tx_power = link_conf->txpower;
8503 max_tx_power = min(conf->def.chan->max_reg_power,
8504 (int)ar->max_tx_power / 2);
8505
8506 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id,
8507 &cur_tx_power);
8508
8509 switch (action_code) {
8510 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST:
8511 /* need variable fields to be present in len */
8512 if (remaining_len < 2)
8513 return -EINVAL;
8514
8515 /* Variable length format as defined in IEEE 802.11-2024,
8516 * Figure 9-1187-Link Measurement Request frame Action field
8517 * format.
8518 * Transmit Power | Max Tx Power
8519 * We fill both of these.
8520 */
8521 *buf++ = cur_tx_power;
8522 *buf = max_tx_power;
8523
8524 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8525 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n",
8526 dialog_token, cur_tx_power, max_tx_power);
8527 break;
8528 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT:
8529 /* need variable fields to be present in len */
8530 if (remaining_len < 3)
8531 return -EINVAL;
8532
8533 /* Variable length format as defined in IEEE 802.11-2024,
8534 * Figure 9-1188-Link Measurement Report frame Action field format
8535 * TPC Report | Variable Fields
8536 *
8537 * TPC Report Format:
8538 * Element ID | Len | Tx Power | Link Margin
8539 *
8540 * We fill Tx power in the TPC Report (2nd index)
8541 */
8542 buf[2] = cur_tx_power;
8543
8544 /* TODO: At present, Link margin data is not present so can't
8545 * really fill it now. Once it is available, it can be added
8546 * here
8547 */
8548 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8549 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n",
8550 dialog_token, cur_tx_power);
8551 break;
8552 default:
8553 return -EINVAL;
8554 }
8555 break;
8556 default:
8557 /* nothing to fill */
8558 return 0;
8559 }
8560
8561 return 0;
8562 }
8563
ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8564 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8565 struct sk_buff *skb)
8566 {
8567 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8568
8569 if (!ieee80211_is_action(hdr->frame_control))
8570 return 0;
8571
8572 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb);
8573 }
8574
ath12k_mgmt_over_wmi_tx_work(struct wiphy * wiphy,struct wiphy_work * work)8575 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work)
8576 {
8577 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
8578 struct ath12k_hw *ah = ar->ah;
8579 struct ath12k_skb_cb *skb_cb;
8580 struct ath12k_vif *ahvif;
8581 struct ath12k_link_vif *arvif;
8582 struct sk_buff *skb;
8583 int ret;
8584
8585 lockdep_assert_wiphy(wiphy);
8586
8587 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
8588 skb_cb = ATH12K_SKB_CB(skb);
8589 if (!skb_cb->vif) {
8590 ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
8591 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8592 continue;
8593 }
8594
8595 ahvif = ath12k_vif_to_ahvif(skb_cb->vif);
8596 if (!(ahvif->links_map & BIT(skb_cb->link_id))) {
8597 ath12k_warn(ar->ab,
8598 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n",
8599 skb_cb->link_id, ahvif->links_map);
8600 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8601 continue;
8602 }
8603
8604 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]);
8605 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
8606 /* Fill in the data which is required to be filled by the driver
8607 * For example: Max Tx power in Link Measurement Request/Report
8608 */
8609 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb);
8610 if (ret) {
8611 /* If we couldn't fill the data due to any reason,
8612 * let's not discard transmitting the packet.
8613 * For example: Software crypto and PMF case
8614 */
8615 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8616 "Failed to fill the required data for the mgmt packet err %d\n",
8617 ret);
8618 }
8619
8620 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
8621 if (ret) {
8622 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
8623 arvif->vdev_id, ret);
8624 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8625 }
8626 } else {
8627 ath12k_warn(ar->ab,
8628 "dropping mgmt frame for vdev %d link %u is_started %d\n",
8629 arvif->vdev_id,
8630 skb_cb->link_id,
8631 arvif->is_started);
8632 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8633 }
8634 }
8635 }
8636
ath12k_mac_mgmt_tx(struct ath12k * ar,struct sk_buff * skb,bool is_prb_rsp)8637 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
8638 bool is_prb_rsp)
8639 {
8640 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
8641
8642 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
8643 return -ESHUTDOWN;
8644
8645 /* Drop probe response packets when the pending management tx
8646 * count has reached a certain threshold, so as to prioritize
8647 * other mgmt packets like auth and assoc to be sent on time
8648 * for establishing successful connections.
8649 */
8650 if (is_prb_rsp &&
8651 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
8652 ath12k_warn(ar->ab,
8653 "dropping probe response as pending queue is almost full\n");
8654 return -ENOSPC;
8655 }
8656
8657 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
8658 ath12k_warn(ar->ab, "mgmt tx queue is full\n");
8659 return -ENOSPC;
8660 }
8661
8662 skb_queue_tail(q, skb);
8663 atomic_inc(&ar->num_pending_mgmt_tx);
8664 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8665
8666 return 0;
8667 }
8668
ath12k_mac_add_p2p_noa_ie(struct ath12k * ar,struct ieee80211_vif * vif,struct sk_buff * skb,bool is_prb_rsp)8669 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
8670 struct ieee80211_vif *vif,
8671 struct sk_buff *skb,
8672 bool is_prb_rsp)
8673 {
8674 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8675
8676 if (likely(!is_prb_rsp))
8677 return;
8678
8679 spin_lock_bh(&ar->data_lock);
8680
8681 if (ahvif->u.ap.noa_data &&
8682 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len,
8683 GFP_ATOMIC))
8684 skb_put_data(skb, ahvif->u.ap.noa_data,
8685 ahvif->u.ap.noa_len);
8686
8687 spin_unlock_bh(&ar->data_lock);
8688 }
8689
8690 /* 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)8691 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif,
8692 u8 link_id, struct sk_buff *skb,
8693 u32 info_flags)
8694 {
8695 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8696 struct ieee80211_bss_conf *bss_conf;
8697
8698 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8699 return;
8700
8701 bss_conf = rcu_dereference(vif->link_conf[link_id]);
8702 if (bss_conf)
8703 ether_addr_copy(hdr->addr2, bss_conf->addr);
8704 }
8705
8706 /* 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)8707 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
8708 u8 link, struct sk_buff *skb, u32 info_flags)
8709 {
8710 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8711 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8712 struct ieee80211_link_sta *link_sta;
8713 struct ieee80211_bss_conf *bss_conf;
8714 struct ath12k_sta *ahsta;
8715
8716 /* Use the link id passed or the default vif link */
8717 if (!sta) {
8718 if (link != IEEE80211_LINK_UNSPECIFIED)
8719 return link;
8720
8721 return ahvif->deflink.link_id;
8722 }
8723
8724 ahsta = ath12k_sta_to_ahsta(sta);
8725
8726 /* Below translation ensures we pass proper A2 & A3 for non ML clients.
8727 * Also it assumes for now support only for MLO AP in this path
8728 */
8729 if (!sta->mlo) {
8730 link = ahsta->deflink.link_id;
8731
8732 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8733 return link;
8734
8735 bss_conf = rcu_dereference(vif->link_conf[link]);
8736 if (bss_conf) {
8737 ether_addr_copy(hdr->addr2, bss_conf->addr);
8738 if (!ieee80211_has_tods(hdr->frame_control) &&
8739 !ieee80211_has_fromds(hdr->frame_control))
8740 ether_addr_copy(hdr->addr3, bss_conf->addr);
8741 }
8742
8743 return link;
8744 }
8745
8746 /* enqueue eth enacap & data frames on primary link, FW does link
8747 * selection and address translation.
8748 */
8749 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
8750 ieee80211_is_data(hdr->frame_control))
8751 return ahsta->assoc_link_id;
8752
8753 /* 802.11 frame cases */
8754 if (link == IEEE80211_LINK_UNSPECIFIED)
8755 link = ahsta->deflink.link_id;
8756
8757 if (!ieee80211_is_mgmt(hdr->frame_control))
8758 return link;
8759
8760 /* Perform address conversion for ML STA Tx */
8761 bss_conf = rcu_dereference(vif->link_conf[link]);
8762 link_sta = rcu_dereference(sta->link[link]);
8763
8764 if (bss_conf && link_sta) {
8765 ether_addr_copy(hdr->addr1, link_sta->addr);
8766 ether_addr_copy(hdr->addr2, bss_conf->addr);
8767
8768 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8769 ether_addr_copy(hdr->addr3, bss_conf->bssid);
8770 else if (vif->type == NL80211_IFTYPE_AP)
8771 ether_addr_copy(hdr->addr3, bss_conf->addr);
8772
8773 return link;
8774 }
8775
8776 if (bss_conf) {
8777 /* In certain cases where a ML sta associated and added subset of
8778 * links on which the ML AP is active, but now sends some frame
8779 * (ex. Probe request) on a different link which is active in our
8780 * MLD but was not added during previous association, we can
8781 * still honor the Tx to that ML STA via the requested link.
8782 * The control would reach here in such case only when that link
8783 * address is same as the MLD address or in worst case clients
8784 * used MLD address at TA wrongly which would have helped
8785 * identify the ML sta object and pass it here.
8786 * If the link address of that STA is different from MLD address,
8787 * then the sta object would be NULL and control won't reach
8788 * here but return at the start of the function itself with !sta
8789 * check. Also this would not need any translation at hdr->addr1
8790 * from MLD to link address since the RA is the MLD address
8791 * (same as that link address ideally) already.
8792 */
8793 ether_addr_copy(hdr->addr2, bss_conf->addr);
8794
8795 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8796 ether_addr_copy(hdr->addr3, bss_conf->bssid);
8797 else if (vif->type == NL80211_IFTYPE_AP)
8798 ether_addr_copy(hdr->addr3, bss_conf->addr);
8799 }
8800
8801 return link;
8802 }
8803
8804 /* Note: called under rcu_read_lock() */
ath12k_mac_op_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)8805 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
8806 struct ieee80211_tx_control *control,
8807 struct sk_buff *skb)
8808 {
8809 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8810 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
8811 struct ieee80211_vif *vif = info->control.vif;
8812 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8813 struct ath12k_link_vif *arvif = &ahvif->deflink;
8814 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8815 struct ieee80211_key_conf *key = info->control.hw_key;
8816 struct ieee80211_sta *sta = control->sta;
8817 struct ath12k_link_vif *tmp_arvif;
8818 u32 info_flags = info->flags;
8819 struct sk_buff *msdu_copied;
8820 struct ath12k *ar, *tmp_ar;
8821 struct ath12k_peer *peer;
8822 unsigned long links_map;
8823 bool is_mcast = false;
8824 bool is_dvlan = false;
8825 struct ethhdr *eth;
8826 bool is_prb_rsp;
8827 u16 mcbc_gsn;
8828 u8 link_id;
8829 int ret;
8830
8831 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8832 ieee80211_free_txskb(hw, skb);
8833 return;
8834 }
8835
8836 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
8837 memset(skb_cb, 0, sizeof(*skb_cb));
8838 skb_cb->vif = vif;
8839
8840 if (key) {
8841 skb_cb->cipher = key->cipher;
8842 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8843 }
8844
8845 /* handle only for MLO case, use deflink for non MLO case */
8846 if (ieee80211_vif_is_mld(vif)) {
8847 link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags);
8848 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
8849 ieee80211_free_txskb(hw, skb);
8850 return;
8851 }
8852 } else {
8853 link_id = 0;
8854 }
8855
8856 arvif = rcu_dereference(ahvif->link[link_id]);
8857 if (!arvif || !arvif->ar) {
8858 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission",
8859 link_id);
8860 ieee80211_free_txskb(hw, skb);
8861 return;
8862 }
8863
8864 ar = arvif->ar;
8865 skb_cb->link_id = link_id;
8866 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
8867
8868 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
8869 eth = (struct ethhdr *)skb->data;
8870 is_mcast = is_multicast_ether_addr(eth->h_dest);
8871
8872 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
8873 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
8874 if (sta && sta->mlo)
8875 skb_cb->flags |= ATH12K_SKB_MLO_STA;
8876
8877 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
8878 if (ret) {
8879 ath12k_warn(ar->ab, "failed to queue management frame %d\n",
8880 ret);
8881 ieee80211_free_txskb(hw, skb);
8882 }
8883 return;
8884 }
8885
8886 if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
8887 is_mcast = is_multicast_ether_addr(hdr->addr1);
8888
8889 /* This is case only for P2P_GO */
8890 if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
8891 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
8892
8893 /* Checking if it is a DVLAN frame */
8894 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8895 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
8896 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8897 ieee80211_has_protected(hdr->frame_control))
8898 is_dvlan = true;
8899
8900 if (!vif->valid_links || !is_mcast || is_dvlan ||
8901 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
8902 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
8903 ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast);
8904 if (unlikely(ret)) {
8905 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
8906 ieee80211_free_txskb(ar->ah->hw, skb);
8907 return;
8908 }
8909 } else {
8910 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff;
8911
8912 links_map = ahvif->links_map;
8913 for_each_set_bit(link_id, &links_map,
8914 IEEE80211_MLD_MAX_NUM_LINKS) {
8915 tmp_arvif = rcu_dereference(ahvif->link[link_id]);
8916 if (!tmp_arvif || !tmp_arvif->is_up)
8917 continue;
8918
8919 tmp_ar = tmp_arvif->ar;
8920 msdu_copied = skb_copy(skb, GFP_ATOMIC);
8921 if (!msdu_copied) {
8922 ath12k_err(ar->ab,
8923 "skb copy failure link_id 0x%X vdevid 0x%X\n",
8924 link_id, tmp_arvif->vdev_id);
8925 continue;
8926 }
8927
8928 ath12k_mlo_mcast_update_tx_link_address(vif, link_id,
8929 msdu_copied,
8930 info_flags);
8931
8932 skb_cb = ATH12K_SKB_CB(msdu_copied);
8933 skb_cb->link_id = link_id;
8934
8935 /* For open mode, skip peer find logic */
8936 if (unlikely(!ahvif->key_cipher))
8937 goto skip_peer_find;
8938
8939 spin_lock_bh(&tmp_ar->ab->base_lock);
8940 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid);
8941 if (!peer) {
8942 spin_unlock_bh(&tmp_ar->ab->base_lock);
8943 ath12k_warn(tmp_ar->ab,
8944 "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n",
8945 tmp_arvif->vdev_id, tmp_arvif->bssid,
8946 ahvif->links_map);
8947 dev_kfree_skb_any(msdu_copied);
8948 continue;
8949 }
8950
8951 key = peer->keys[peer->mcast_keyidx];
8952 if (key) {
8953 skb_cb->cipher = key->cipher;
8954 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8955
8956 hdr = (struct ieee80211_hdr *)msdu_copied->data;
8957 if (!ieee80211_has_protected(hdr->frame_control))
8958 hdr->frame_control |=
8959 cpu_to_le16(IEEE80211_FCTL_PROTECTED);
8960 }
8961 spin_unlock_bh(&tmp_ar->ab->base_lock);
8962
8963 skip_peer_find:
8964 ret = ath12k_dp_tx(tmp_ar, tmp_arvif,
8965 msdu_copied, true, mcbc_gsn, is_mcast);
8966 if (unlikely(ret)) {
8967 if (ret == -ENOMEM) {
8968 /* Drops are expected during heavy multicast
8969 * frame flood. Print with debug log
8970 * level to avoid lot of console prints
8971 */
8972 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8973 "failed to transmit frame %d\n",
8974 ret);
8975 } else {
8976 ath12k_warn(ar->ab,
8977 "failed to transmit frame %d\n",
8978 ret);
8979 }
8980
8981 dev_kfree_skb_any(msdu_copied);
8982 }
8983 }
8984 ieee80211_free_txskb(ar->ah->hw, skb);
8985 }
8986 }
8987
ath12k_mac_drain_tx(struct ath12k * ar)8988 void ath12k_mac_drain_tx(struct ath12k *ar)
8989 {
8990 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8991
8992 /* make sure rcu-protected mac80211 tx path itself is drained */
8993 synchronize_net();
8994
8995 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8996 ath12k_mgmt_over_wmi_tx_purge(ar);
8997 }
8998
ath12k_mac_config_mon_status_default(struct ath12k * ar,bool enable)8999 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
9000 {
9001 struct htt_rx_ring_tlv_filter tlv_filter = {};
9002 struct ath12k_base *ab = ar->ab;
9003 u32 ring_id, i;
9004 int ret = 0;
9005
9006 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9007
9008 if (!ab->hw_params->rxdma1_enable)
9009 return ret;
9010
9011 if (enable) {
9012 tlv_filter = ath12k_mac_mon_status_filter_default;
9013
9014 if (ath12k_debugfs_rx_filter(ar))
9015 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar);
9016 } else {
9017 tlv_filter.rxmon_disable = true;
9018 }
9019
9020 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) {
9021 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id;
9022 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id,
9023 ar->dp.mac_id + i,
9024 HAL_RXDMA_MONITOR_DST,
9025 DP_RXDMA_REFILL_RING_SIZE,
9026 &tlv_filter);
9027 if (ret) {
9028 ath12k_err(ab,
9029 "failed to setup filter for monitor buf %d\n",
9030 ret);
9031 }
9032 }
9033
9034 return ret;
9035 }
9036
ath12k_mac_start(struct ath12k * ar)9037 static int ath12k_mac_start(struct ath12k *ar)
9038 {
9039 struct ath12k_hw *ah = ar->ah;
9040 struct ath12k_base *ab = ar->ab;
9041 struct ath12k_pdev *pdev = ar->pdev;
9042 int ret;
9043
9044 lockdep_assert_held(&ah->hw_mutex);
9045 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9046
9047 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
9048 1, pdev->pdev_id);
9049
9050 if (ret) {
9051 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret);
9052 goto err;
9053 }
9054
9055 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
9056 pdev->pdev_id);
9057 if (ret) {
9058 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
9059 goto err;
9060 }
9061
9062 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
9063 0, pdev->pdev_id);
9064 if (ret) {
9065 ath12k_err(ab, "failed to set ac override for ARP: %d\n",
9066 ret);
9067 goto err;
9068 }
9069
9070 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
9071 if (ret) {
9072 ath12k_err(ab, "failed to offload radar detection: %d\n",
9073 ret);
9074 goto err;
9075 }
9076
9077 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
9078 HTT_PPDU_STATS_TAG_DEFAULT);
9079 if (ret) {
9080 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
9081 goto err;
9082 }
9083
9084 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
9085 1, pdev->pdev_id);
9086
9087 if (ret) {
9088 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
9089 goto err;
9090 }
9091
9092 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
9093
9094 /* TODO: Do we need to enable ANI? */
9095
9096 ret = ath12k_reg_update_chan_list(ar, false);
9097
9098 /* The ar state alone can be turned off for non supported country
9099 * without returning the error value. As we need to update the channel
9100 * for the next ar.
9101 */
9102 if (ret) {
9103 if (ret == -EINVAL)
9104 ret = 0;
9105 goto err;
9106 }
9107
9108 ar->num_started_vdevs = 0;
9109 ar->num_created_vdevs = 0;
9110 ar->num_peers = 0;
9111 ar->allocated_vdev_map = 0;
9112 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
9113
9114 /* Configure monitor status ring with default rx_filter to get rx status
9115 * such as rssi, rx_duration.
9116 */
9117 ret = ath12k_mac_config_mon_status_default(ar, true);
9118 if (ret && (ret != -EOPNOTSUPP)) {
9119 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
9120 ret);
9121 goto err;
9122 }
9123
9124 if (ret == -EOPNOTSUPP)
9125 ath12k_dbg(ab, ATH12K_DBG_MAC,
9126 "monitor status config is not yet supported");
9127
9128 /* Configure the hash seed for hash based reo dest ring selection */
9129 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
9130
9131 /* allow device to enter IMPS */
9132 if (ab->hw_params->idle_ps) {
9133 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
9134 1, pdev->pdev_id);
9135 if (ret) {
9136 ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
9137 goto err;
9138 }
9139 }
9140
9141 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
9142 &ab->pdevs[ar->pdev_idx]);
9143
9144 return 0;
9145 err:
9146
9147 return ret;
9148 }
9149
ath12k_drain_tx(struct ath12k_hw * ah)9150 static void ath12k_drain_tx(struct ath12k_hw *ah)
9151 {
9152 struct ath12k *ar;
9153 int i;
9154
9155 lockdep_assert_wiphy(ah->hw->wiphy);
9156
9157 for_each_ar(ah, ar, i)
9158 ath12k_mac_drain_tx(ar);
9159 }
9160
ath12k_mac_op_start(struct ieee80211_hw * hw)9161 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
9162 {
9163 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9164 struct ath12k *ar;
9165 int ret, i;
9166
9167 if (ath12k_ftm_mode)
9168 return -EPERM;
9169
9170 lockdep_assert_wiphy(hw->wiphy);
9171
9172 ath12k_drain_tx(ah);
9173
9174 guard(mutex)(&ah->hw_mutex);
9175
9176 switch (ah->state) {
9177 case ATH12K_HW_STATE_OFF:
9178 ah->state = ATH12K_HW_STATE_ON;
9179 break;
9180 case ATH12K_HW_STATE_RESTARTING:
9181 ah->state = ATH12K_HW_STATE_RESTARTED;
9182 break;
9183 case ATH12K_HW_STATE_RESTARTED:
9184 case ATH12K_HW_STATE_WEDGED:
9185 case ATH12K_HW_STATE_ON:
9186 case ATH12K_HW_STATE_TM:
9187 ah->state = ATH12K_HW_STATE_OFF;
9188
9189 WARN_ON(1);
9190 return -EINVAL;
9191 }
9192
9193 for_each_ar(ah, ar, i) {
9194 ret = ath12k_mac_start(ar);
9195 if (ret) {
9196 ah->state = ATH12K_HW_STATE_OFF;
9197
9198 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n",
9199 ar->pdev_idx, ret);
9200 goto fail_start;
9201 }
9202 }
9203
9204 return 0;
9205
9206 fail_start:
9207 for (; i > 0; i--) {
9208 ar = ath12k_ah_to_ar(ah, i - 1);
9209 ath12k_mac_stop(ar);
9210 }
9211
9212 return ret;
9213 }
9214
ath12k_mac_rfkill_config(struct ath12k * ar)9215 int ath12k_mac_rfkill_config(struct ath12k *ar)
9216 {
9217 struct ath12k_base *ab = ar->ab;
9218 u32 param;
9219 int ret;
9220
9221 if (ab->hw_params->rfkill_pin == 0)
9222 return -EOPNOTSUPP;
9223
9224 ath12k_dbg(ab, ATH12K_DBG_MAC,
9225 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
9226 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
9227 ab->hw_params->rfkill_on_level);
9228
9229 param = u32_encode_bits(ab->hw_params->rfkill_on_level,
9230 WMI_RFKILL_CFG_RADIO_LEVEL) |
9231 u32_encode_bits(ab->hw_params->rfkill_pin,
9232 WMI_RFKILL_CFG_GPIO_PIN_NUM) |
9233 u32_encode_bits(ab->hw_params->rfkill_cfg,
9234 WMI_RFKILL_CFG_PIN_AS_GPIO);
9235
9236 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
9237 param, ar->pdev->pdev_id);
9238 if (ret) {
9239 ath12k_warn(ab,
9240 "failed to set rfkill config 0x%x: %d\n",
9241 param, ret);
9242 return ret;
9243 }
9244
9245 return 0;
9246 }
9247
ath12k_mac_rfkill_enable_radio(struct ath12k * ar,bool enable)9248 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
9249 {
9250 enum wmi_rfkill_enable_radio param;
9251 int ret;
9252
9253 if (enable)
9254 param = WMI_RFKILL_ENABLE_RADIO_ON;
9255 else
9256 param = WMI_RFKILL_ENABLE_RADIO_OFF;
9257
9258 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
9259 ar->pdev_idx, param);
9260
9261 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
9262 param, ar->pdev->pdev_id);
9263 if (ret) {
9264 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
9265 param, ret);
9266 return ret;
9267 }
9268
9269 return 0;
9270 }
9271
ath12k_mac_stop(struct ath12k * ar)9272 static void ath12k_mac_stop(struct ath12k *ar)
9273 {
9274 struct ath12k_hw *ah = ar->ah;
9275 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
9276 struct ath12k_wmi_scan_chan_list_arg *arg;
9277 int ret;
9278
9279 lockdep_assert_held(&ah->hw_mutex);
9280 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9281
9282 ret = ath12k_mac_config_mon_status_default(ar, false);
9283 if (ret && (ret != -EOPNOTSUPP))
9284 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
9285 ret);
9286
9287 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
9288
9289 cancel_delayed_work_sync(&ar->scan.timeout);
9290 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk);
9291 cancel_work_sync(&ar->regd_channel_update_work);
9292 cancel_work_sync(&ar->regd_update_work);
9293 cancel_work_sync(&ar->ab->rfkill_work);
9294 cancel_work_sync(&ar->ab->update_11d_work);
9295 ar->state_11d = ATH12K_11D_IDLE;
9296 complete(&ar->completed_11d_scan);
9297
9298 spin_lock_bh(&ar->data_lock);
9299
9300 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
9301 list_del(&ppdu_stats->list);
9302 kfree(ppdu_stats);
9303 }
9304
9305 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue,
9306 struct ath12k_wmi_scan_chan_list_arg,
9307 list))) {
9308 list_del(&arg->list);
9309 kfree(arg);
9310 }
9311 spin_unlock_bh(&ar->data_lock);
9312
9313 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
9314
9315 synchronize_rcu();
9316
9317 atomic_set(&ar->num_pending_mgmt_tx, 0);
9318 }
9319
ath12k_mac_op_stop(struct ieee80211_hw * hw,bool suspend)9320 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend)
9321 {
9322 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9323 struct ath12k *ar;
9324 int i;
9325
9326 lockdep_assert_wiphy(hw->wiphy);
9327
9328 ath12k_drain_tx(ah);
9329
9330 mutex_lock(&ah->hw_mutex);
9331
9332 ah->state = ATH12K_HW_STATE_OFF;
9333
9334 for_each_ar(ah, ar, i)
9335 ath12k_mac_stop(ar);
9336
9337 mutex_unlock(&ah->hw_mutex);
9338 }
9339
9340 static u8
ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif * arvif)9341 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif)
9342 {
9343 struct ath12k_base *ab = arvif->ar->ab;
9344 u8 vdev_stats_id = 0;
9345
9346 do {
9347 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
9348 vdev_stats_id++;
9349 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
9350 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
9351 break;
9352 }
9353 } else {
9354 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
9355 break;
9356 }
9357 } while (vdev_stats_id);
9358
9359 arvif->vdev_stats_id = vdev_stats_id;
9360 return vdev_stats_id;
9361 }
9362
ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif * arvif,u32 * flags,u32 * tx_vdev_id)9363 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif,
9364 u32 *flags, u32 *tx_vdev_id)
9365 {
9366 struct ath12k_vif *ahvif = arvif->ahvif;
9367 struct ieee80211_bss_conf *link_conf;
9368 struct ath12k *ar = arvif->ar;
9369 struct ath12k_link_vif *tx_arvif;
9370
9371 link_conf = ath12k_mac_get_link_bss_conf(arvif);
9372 if (!link_conf) {
9373 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n",
9374 ahvif->vif->addr, arvif->link_id);
9375 return -ENOLINK;
9376 }
9377
9378 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
9379 if (!tx_arvif)
9380 return 0;
9381
9382 if (link_conf->nontransmitted) {
9383 if (ath12k_ar_to_hw(ar)->wiphy !=
9384 ath12k_ar_to_hw(tx_arvif->ar)->wiphy)
9385 return -EINVAL;
9386
9387 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP;
9388 *tx_vdev_id = tx_arvif->vdev_id;
9389 } else if (tx_arvif == arvif) {
9390 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP;
9391 } else {
9392 return -EINVAL;
9393 }
9394
9395 if (link_conf->ema_ap)
9396 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE;
9397
9398 return 0;
9399 }
9400
ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif * arvif,struct ath12k_wmi_vdev_create_arg * arg)9401 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif,
9402 struct ath12k_wmi_vdev_create_arg *arg)
9403 {
9404 struct ath12k *ar = arvif->ar;
9405 struct ath12k_pdev *pdev = ar->pdev;
9406 struct ath12k_vif *ahvif = arvif->ahvif;
9407 int ret;
9408
9409 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9410
9411 arg->if_id = arvif->vdev_id;
9412 arg->type = ahvif->vdev_type;
9413 arg->subtype = ahvif->vdev_subtype;
9414 arg->pdev_id = pdev->pdev_id;
9415
9416 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
9417 arg->mbssid_tx_vdev_id = 0;
9418 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
9419 ar->ab->wmi_ab.svc_map)) {
9420 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
9421 &arg->mbssid_flags,
9422 &arg->mbssid_tx_vdev_id);
9423 if (ret)
9424 return ret;
9425 }
9426
9427 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
9428 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
9429 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
9430 }
9431 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
9432 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
9433 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
9434 }
9435 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
9436 ar->supports_6ghz) {
9437 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
9438 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
9439 }
9440
9441 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
9442
9443 if (ath12k_mac_is_ml_arvif(arvif)) {
9444 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) {
9445 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d",
9446 ahvif->vif->valid_links);
9447 return -EINVAL;
9448 }
9449
9450 ether_addr_copy(arg->mld_addr, ahvif->vif->addr);
9451 }
9452
9453 return 0;
9454 }
9455
ath12k_mac_update_vif_offload(struct ath12k_link_vif * arvif)9456 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
9457 {
9458 struct ath12k_vif *ahvif = arvif->ahvif;
9459 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9460 struct ath12k *ar = arvif->ar;
9461 struct ath12k_base *ab = ar->ab;
9462 u32 param_id, param_value;
9463 int ret;
9464
9465 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
9466 if (vif->type != NL80211_IFTYPE_STATION &&
9467 vif->type != NL80211_IFTYPE_AP)
9468 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
9469 IEEE80211_OFFLOAD_DECAP_ENABLED);
9470
9471 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
9472 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
9473 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9474 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
9475 else
9476 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
9477
9478 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9479 param_id, ahvif->tx_encap_type);
9480 if (ret) {
9481 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
9482 arvif->vdev_id, ret);
9483 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
9484 }
9485
9486 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
9487 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
9488 param_value = ATH12K_HW_TXRX_ETHERNET;
9489 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9490 param_value = ATH12K_HW_TXRX_RAW;
9491 else
9492 param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
9493
9494 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9495 param_id, param_value);
9496 if (ret) {
9497 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
9498 arvif->vdev_id, ret);
9499 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
9500 }
9501 }
9502
ath12k_mac_op_update_vif_offload(struct ieee80211_hw * hw,struct ieee80211_vif * vif)9503 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
9504 struct ieee80211_vif *vif)
9505 {
9506 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9507 struct ath12k_link_vif *arvif;
9508 unsigned long links;
9509 int link_id;
9510
9511 lockdep_assert_wiphy(hw->wiphy);
9512
9513 if (vif->valid_links) {
9514 links = vif->valid_links;
9515 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
9516 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
9517 if (!(arvif && arvif->ar))
9518 continue;
9519
9520 ath12k_mac_update_vif_offload(arvif);
9521 }
9522
9523 return;
9524 }
9525
9526 ath12k_mac_update_vif_offload(&ahvif->deflink);
9527 }
9528
ath12k_mac_vif_ap_active_any(struct ath12k_base * ab)9529 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab)
9530 {
9531 struct ath12k *ar;
9532 struct ath12k_pdev *pdev;
9533 struct ath12k_link_vif *arvif;
9534 int i;
9535
9536 for (i = 0; i < ab->num_radios; i++) {
9537 pdev = &ab->pdevs[i];
9538 ar = pdev->ar;
9539 list_for_each_entry(arvif, &ar->arvifs, list) {
9540 if (arvif->is_up &&
9541 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP)
9542 return true;
9543 }
9544 }
9545 return false;
9546 }
9547
ath12k_mac_11d_scan_start(struct ath12k * ar,u32 vdev_id)9548 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id)
9549 {
9550 struct wmi_11d_scan_start_arg arg;
9551 int ret;
9552
9553 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9554
9555 if (ar->regdom_set_by_user)
9556 goto fin;
9557
9558 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID)
9559 goto fin;
9560
9561 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9562 goto fin;
9563
9564 if (ath12k_mac_vif_ap_active_any(ar->ab))
9565 goto fin;
9566
9567 arg.vdev_id = vdev_id;
9568 arg.start_interval_msec = 0;
9569 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL;
9570
9571 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
9572 "mac start 11d scan for vdev %d\n", vdev_id);
9573
9574 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg);
9575 if (ret) {
9576 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
9577 vdev_id, ret);
9578 } else {
9579 ar->vdev_id_11d_scan = vdev_id;
9580 if (ar->state_11d == ATH12K_11D_PREPARING)
9581 ar->state_11d = ATH12K_11D_RUNNING;
9582 }
9583
9584 fin:
9585 if (ar->state_11d == ATH12K_11D_PREPARING) {
9586 ar->state_11d = ATH12K_11D_IDLE;
9587 complete(&ar->completed_11d_scan);
9588 }
9589 }
9590
ath12k_mac_11d_scan_stop(struct ath12k * ar)9591 void ath12k_mac_11d_scan_stop(struct ath12k *ar)
9592 {
9593 int ret;
9594 u32 vdev_id;
9595
9596 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9597
9598 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9599 return;
9600
9601 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n",
9602 ar->vdev_id_11d_scan);
9603
9604 if (ar->state_11d == ATH12K_11D_PREPARING) {
9605 ar->state_11d = ATH12K_11D_IDLE;
9606 complete(&ar->completed_11d_scan);
9607 }
9608
9609 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) {
9610 vdev_id = ar->vdev_id_11d_scan;
9611
9612 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
9613 if (ret) {
9614 ath12k_warn(ar->ab,
9615 "failed to stopt 11d scan vdev %d ret: %d\n",
9616 vdev_id, ret);
9617 } else {
9618 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
9619 ar->state_11d = ATH12K_11D_IDLE;
9620 complete(&ar->completed_11d_scan);
9621 }
9622 }
9623 }
9624
ath12k_mac_11d_scan_stop_all(struct ath12k_base * ab)9625 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab)
9626 {
9627 struct ath12k *ar;
9628 struct ath12k_pdev *pdev;
9629 int i;
9630
9631 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n");
9632
9633 for (i = 0; i < ab->num_radios; i++) {
9634 pdev = &ab->pdevs[i];
9635 ar = pdev->ar;
9636
9637 ath12k_mac_11d_scan_stop(ar);
9638 }
9639 }
9640
ath12k_mac_determine_vdev_type(struct ieee80211_vif * vif,struct ath12k_vif * ahvif)9641 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif,
9642 struct ath12k_vif *ahvif)
9643 {
9644 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
9645
9646 switch (vif->type) {
9647 case NL80211_IFTYPE_UNSPECIFIED:
9648 case NL80211_IFTYPE_STATION:
9649 ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9650
9651 if (vif->p2p)
9652 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
9653
9654 break;
9655 case NL80211_IFTYPE_MESH_POINT:
9656 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
9657 fallthrough;
9658 case NL80211_IFTYPE_AP:
9659 ahvif->vdev_type = WMI_VDEV_TYPE_AP;
9660
9661 if (vif->p2p)
9662 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
9663
9664 break;
9665 case NL80211_IFTYPE_MONITOR:
9666 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
9667 break;
9668 case NL80211_IFTYPE_P2P_DEVICE:
9669 ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9670 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
9671 break;
9672 default:
9673 WARN_ON(1);
9674 break;
9675 }
9676 }
9677
ath12k_mac_vdev_create(struct ath12k * ar,struct ath12k_link_vif * arvif)9678 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
9679 {
9680 struct ath12k_hw *ah = ar->ah;
9681 struct ath12k_base *ab = ar->ab;
9682 struct ieee80211_hw *hw = ah->hw;
9683 struct ath12k_vif *ahvif = arvif->ahvif;
9684 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9685 struct ath12k_wmi_vdev_create_arg vdev_arg = {};
9686 struct ath12k_wmi_peer_create_arg peer_param = {};
9687 struct ieee80211_bss_conf *link_conf = NULL;
9688 u32 param_id, param_value;
9689 u16 nss;
9690 int i;
9691 int ret, vdev_id;
9692 u8 link_id;
9693
9694 lockdep_assert_wiphy(hw->wiphy);
9695
9696 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor
9697 * interface in each radio
9698 */
9699 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created)
9700 return -EINVAL;
9701
9702 link_id = arvif->link_id;
9703
9704 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
9705 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
9706 if (!link_conf) {
9707 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n",
9708 vif->addr, arvif->link_id);
9709 return -ENOLINK;
9710 }
9711 }
9712
9713 if (link_conf)
9714 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN);
9715 else
9716 memcpy(arvif->bssid, vif->addr, ETH_ALEN);
9717
9718 arvif->ar = ar;
9719 vdev_id = __ffs64(ab->free_vdev_map);
9720 arvif->vdev_id = vdev_id;
9721 if (vif->type == NL80211_IFTYPE_MONITOR)
9722 ar->monitor_vdev_id = vdev_id;
9723
9724 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n",
9725 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype,
9726 ab->free_vdev_map);
9727
9728 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
9729 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
9730 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
9731
9732 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
9733 if (ret) {
9734 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n",
9735 arvif->vdev_id, ret);
9736 goto err;
9737 }
9738
9739 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg);
9740 if (ret) {
9741 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
9742 arvif->vdev_id, ret);
9743 return ret;
9744 }
9745
9746 ar->num_created_vdevs++;
9747 arvif->is_created = true;
9748 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
9749 vif->addr, arvif->vdev_id);
9750 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
9751 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
9752
9753 spin_lock_bh(&ar->data_lock);
9754 list_add(&arvif->list, &ar->arvifs);
9755 spin_unlock_bh(&ar->data_lock);
9756
9757 ath12k_mac_update_vif_offload(arvif);
9758
9759 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
9760 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9761 WMI_VDEV_PARAM_NSS, nss);
9762 if (ret) {
9763 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
9764 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
9765 goto err_vdev_del;
9766 }
9767
9768 switch (ahvif->vdev_type) {
9769 case WMI_VDEV_TYPE_AP:
9770 peer_param.vdev_id = arvif->vdev_id;
9771 peer_param.peer_addr = arvif->bssid;
9772 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9773 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
9774 if (ret) {
9775 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
9776 arvif->vdev_id, ret);
9777 goto err_vdev_del;
9778 }
9779
9780 ret = ath12k_mac_set_kickout(arvif);
9781 if (ret) {
9782 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
9783 arvif->vdev_id, ret);
9784 goto err_peer_del;
9785 }
9786 ath12k_mac_11d_scan_stop_all(ar->ab);
9787 break;
9788 case WMI_VDEV_TYPE_STA:
9789 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
9790 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
9791 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9792 param_id, param_value);
9793 if (ret) {
9794 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
9795 arvif->vdev_id, ret);
9796 goto err_peer_del;
9797 }
9798
9799 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
9800 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
9801 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9802 param_id, param_value);
9803 if (ret) {
9804 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
9805 arvif->vdev_id, ret);
9806 goto err_peer_del;
9807 }
9808
9809 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
9810 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
9811 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9812 param_id, param_value);
9813 if (ret) {
9814 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
9815 arvif->vdev_id, ret);
9816 goto err_peer_del;
9817 }
9818
9819 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
9820 if (ret) {
9821 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
9822 arvif->vdev_id, ret);
9823 goto err_peer_del;
9824 }
9825
9826 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
9827 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
9828 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
9829 reinit_completion(&ar->completed_11d_scan);
9830 ar->state_11d = ATH12K_11D_PREPARING;
9831 }
9832 break;
9833 case WMI_VDEV_TYPE_MONITOR:
9834 ar->monitor_vdev_created = true;
9835 break;
9836 default:
9837 break;
9838 }
9839
9840 if (link_conf)
9841 arvif->txpower = link_conf->txpower;
9842 else
9843 arvif->txpower = NL80211_TX_POWER_AUTOMATIC;
9844
9845 ret = ath12k_mac_txpower_recalc(ar);
9846 if (ret)
9847 goto err_peer_del;
9848
9849 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
9850 param_value = hw->wiphy->rts_threshold;
9851 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9852 param_id, param_value);
9853 if (ret) {
9854 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
9855 arvif->vdev_id, ret);
9856 }
9857
9858 ath12k_dp_vdev_tx_attach(ar, arvif);
9859
9860 return ret;
9861
9862 err_peer_del:
9863 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
9864 reinit_completion(&ar->peer_delete_done);
9865
9866 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid,
9867 arvif->vdev_id);
9868 if (ret) {
9869 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
9870 arvif->vdev_id, arvif->bssid);
9871 goto err;
9872 }
9873
9874 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
9875 arvif->bssid);
9876 if (ret)
9877 goto err_vdev_del;
9878
9879 ar->num_peers--;
9880 }
9881
9882 err_vdev_del:
9883 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
9884 ar->monitor_vdev_id = -1;
9885 ar->monitor_vdev_created = false;
9886 }
9887
9888 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
9889 ar->num_created_vdevs--;
9890 arvif->is_created = false;
9891 arvif->ar = NULL;
9892 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
9893 ab->free_vdev_map |= 1LL << arvif->vdev_id;
9894 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
9895 spin_lock_bh(&ar->data_lock);
9896 list_del(&arvif->list);
9897 spin_unlock_bh(&ar->data_lock);
9898
9899 err:
9900 arvif->ar = NULL;
9901 return ret;
9902 }
9903
ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif * arvif)9904 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif)
9905 {
9906 struct ath12k_key_conf *key_conf, *tmp;
9907 struct ath12k_vif *ahvif = arvif->ahvif;
9908 struct ath12k_hw *ah = ahvif->ah;
9909 struct ath12k_sta *ahsta;
9910 struct ath12k_link_sta *arsta;
9911 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9912 int ret;
9913
9914 lockdep_assert_wiphy(ah->hw->wiphy);
9915
9916 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
9917 arsta = NULL;
9918 if (key_conf->sta) {
9919 ahsta = ath12k_sta_to_ahsta(key_conf->sta);
9920 arsta = wiphy_dereference(ah->hw->wiphy,
9921 ahsta->link[arvif->link_id]);
9922 if (!arsta)
9923 goto free_cache;
9924 }
9925
9926 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd,
9927 arvif, arsta,
9928 key_conf->key);
9929 if (ret)
9930 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n",
9931 arvif->vdev_id, ret);
9932 free_cache:
9933 list_del(&key_conf->list);
9934 kfree(key_conf);
9935 }
9936 }
9937
ath12k_mac_vif_cache_flush(struct ath12k * ar,struct ath12k_link_vif * arvif)9938 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif)
9939 {
9940 struct ath12k_vif *ahvif = arvif->ahvif;
9941 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9942 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9943 struct ath12k_base *ab = ar->ab;
9944 struct ieee80211_bss_conf *link_conf;
9945
9946 int ret;
9947
9948 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9949
9950 if (!cache)
9951 return;
9952
9953 if (cache->tx_conf.changed) {
9954 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac,
9955 &cache->tx_conf.tx_queue_params);
9956 if (ret)
9957 ath12k_warn(ab,
9958 "unable to apply tx config parameters to vdev %d\n",
9959 ret);
9960 }
9961
9962 if (cache->bss_conf_changed) {
9963 link_conf = ath12k_mac_get_link_bss_conf(arvif);
9964 if (!link_conf) {
9965 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n",
9966 vif->addr, arvif->link_id);
9967 return;
9968 }
9969 ath12k_mac_bss_info_changed(ar, arvif, link_conf,
9970 cache->bss_conf_changed);
9971 }
9972
9973 if (!list_empty(&cache->key_conf.list))
9974 ath12k_mac_vif_flush_key_cache(arvif);
9975
9976 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
9977 }
9978
ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)9979 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
9980 struct ath12k_link_vif *arvif,
9981 struct ieee80211_chanctx_conf *ctx)
9982 {
9983 struct ath12k_vif *ahvif = arvif->ahvif;
9984 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9985 struct ath12k_link_vif *scan_arvif;
9986 struct ath12k_hw *ah = hw->priv;
9987 struct ath12k *ar;
9988 struct ath12k_base *ab;
9989 u8 link_id = arvif->link_id, scan_link_id;
9990 unsigned long scan_link_map;
9991 int ret;
9992
9993 lockdep_assert_wiphy(hw->wiphy);
9994
9995 if (ah->num_radio == 1)
9996 ar = ah->radio;
9997 else if (ctx)
9998 ar = ath12k_get_ar_by_ctx(hw, ctx);
9999 else
10000 return NULL;
10001
10002 if (!ar)
10003 return NULL;
10004
10005 /* cleanup the scan vdev if we are done scan on that ar
10006 * and now we want to create for actual usage.
10007 */
10008 if (ieee80211_vif_is_mld(vif)) {
10009 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
10010 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) {
10011 scan_arvif = wiphy_dereference(hw->wiphy,
10012 ahvif->link[scan_link_id]);
10013 if (scan_arvif && scan_arvif->ar == ar) {
10014 ar->scan.arvif = NULL;
10015 ath12k_mac_remove_link_interface(hw, scan_arvif);
10016 ath12k_mac_unassign_link_vif(scan_arvif);
10017 break;
10018 }
10019 }
10020 }
10021
10022 if (arvif->ar) {
10023 /* This is not expected really */
10024 if (WARN_ON(!arvif->is_created)) {
10025 arvif->ar = NULL;
10026 return NULL;
10027 }
10028
10029 if (ah->num_radio == 1)
10030 return arvif->ar;
10031
10032 /* This can happen as scan vdev gets created during multiple scans
10033 * across different radios before a vdev is brought up in
10034 * a certain radio.
10035 */
10036 if (ar != arvif->ar) {
10037 if (WARN_ON(arvif->is_started))
10038 return NULL;
10039
10040 ath12k_mac_remove_link_interface(hw, arvif);
10041 ath12k_mac_unassign_link_vif(arvif);
10042 }
10043 }
10044
10045 ab = ar->ab;
10046
10047 /* Assign arvif again here since previous radio switch block
10048 * would've unassigned and cleared it.
10049 */
10050 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
10051 if (vif->type == NL80211_IFTYPE_AP &&
10052 ar->num_peers > (ar->max_num_peers - 1)) {
10053 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
10054 goto unlock;
10055 }
10056
10057 if (arvif->is_created)
10058 goto flush;
10059
10060 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
10061 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
10062 TARGET_NUM_VDEVS(ab));
10063 goto unlock;
10064 }
10065
10066 ret = ath12k_mac_vdev_create(ar, arvif);
10067 if (ret) {
10068 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
10069 goto unlock;
10070 }
10071
10072 flush:
10073 /* If the vdev is created during channel assign and not during
10074 * add_interface(), Apply any parameters for the vdev which were received
10075 * after add_interface, corresponding to this vif.
10076 */
10077 ath12k_mac_vif_cache_flush(ar, arvif);
10078 unlock:
10079 return arvif->ar;
10080 }
10081
ath12k_mac_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10082 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
10083 struct ieee80211_vif *vif)
10084 {
10085 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10086 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10087 struct ath12k_reg_info *reg_info;
10088 struct ath12k_link_vif *arvif;
10089 struct ath12k_base *ab;
10090 struct ath12k *ar;
10091 int i;
10092
10093 lockdep_assert_wiphy(hw->wiphy);
10094
10095 memset(ahvif, 0, sizeof(*ahvif));
10096
10097 ahvif->ah = ah;
10098 ahvif->vif = vif;
10099 arvif = &ahvif->deflink;
10100
10101 ath12k_mac_init_arvif(ahvif, arvif, -1);
10102
10103 /* Allocate Default Queue now and reassign during actual vdev create */
10104 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE;
10105 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10106 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE;
10107
10108 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
10109
10110 ath12k_mac_determine_vdev_type(vif, ahvif);
10111
10112 for_each_ar(ah, ar, i) {
10113 if (!ath12k_wmi_supports_6ghz_cc_ext(ar))
10114 continue;
10115
10116 ab = ar->ab;
10117 reg_info = ab->reg_info[ar->pdev_idx];
10118 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n");
10119 ah->regd_updated = false;
10120 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type,
10121 IEEE80211_REG_UNSET_AP);
10122 break;
10123 }
10124
10125 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver
10126 * will not know if this interface is an ML vif at this point.
10127 */
10128 return 0;
10129 }
10130
ath12k_mac_vif_unref(struct ath12k_dp * dp,struct ieee80211_vif * vif)10131 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
10132 {
10133 struct ath12k_tx_desc_info *tx_desc_info;
10134 struct ath12k_skb_cb *skb_cb;
10135 struct sk_buff *skb;
10136 int i;
10137
10138 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
10139 spin_lock_bh(&dp->tx_desc_lock[i]);
10140
10141 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
10142 list) {
10143 skb = tx_desc_info->skb;
10144 if (!skb)
10145 continue;
10146
10147 skb_cb = ATH12K_SKB_CB(skb);
10148 if (skb_cb->vif == vif)
10149 skb_cb->vif = NULL;
10150 }
10151
10152 spin_unlock_bh(&dp->tx_desc_lock[i]);
10153 }
10154 }
10155
ath12k_mac_vdev_delete(struct ath12k * ar,struct ath12k_link_vif * arvif)10156 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
10157 {
10158 struct ath12k_vif *ahvif = arvif->ahvif;
10159 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10160 struct ath12k_base *ab = ar->ab;
10161 unsigned long time_left;
10162 int ret;
10163
10164 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10165
10166 reinit_completion(&ar->vdev_delete_done);
10167
10168 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10169 if (ret) {
10170 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
10171 arvif->vdev_id, ret);
10172 goto err_vdev_del;
10173 }
10174
10175 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
10176 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
10177 if (time_left == 0) {
10178 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
10179 goto err_vdev_del;
10180 }
10181
10182 ab->free_vdev_map |= 1LL << arvif->vdev_id;
10183 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10184 ar->num_created_vdevs--;
10185
10186 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10187 ar->monitor_vdev_id = -1;
10188 ar->monitor_vdev_created = false;
10189 }
10190
10191 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
10192 vif->addr, arvif->vdev_id);
10193
10194 err_vdev_del:
10195 spin_lock_bh(&ar->data_lock);
10196 list_del(&arvif->list);
10197 spin_unlock_bh(&ar->data_lock);
10198
10199 ath12k_peer_cleanup(ar, arvif->vdev_id);
10200 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10201
10202 idr_for_each(&ar->txmgmt_idr,
10203 ath12k_mac_vif_txmgmt_idr_remove, vif);
10204
10205 ath12k_mac_vif_unref(&ab->dp, vif);
10206 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
10207
10208 /* Recalc txpower for remaining vdev */
10209 ath12k_mac_txpower_recalc(ar);
10210
10211 /* TODO: recal traffic pause state based on the available vdevs */
10212 arvif->is_created = false;
10213 arvif->ar = NULL;
10214
10215 return ret;
10216 }
10217
ath12k_mac_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10218 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
10219 struct ieee80211_vif *vif)
10220 {
10221 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10222 struct ath12k_link_vif *arvif;
10223 struct ath12k *ar;
10224 u8 link_id;
10225
10226 lockdep_assert_wiphy(hw->wiphy);
10227
10228 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) {
10229 /* if we cached some config but never received assign chanctx,
10230 * free the allocated cache.
10231 */
10232 ath12k_ahvif_put_link_cache(ahvif, link_id);
10233 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
10234 if (!arvif || !arvif->is_created)
10235 continue;
10236
10237 ar = arvif->ar;
10238
10239 /* Scan abortion is in progress since before this, cancel_hw_scan()
10240 * is expected to be executed. Since link is anyways going to be removed
10241 * now, just cancel the worker and send the scan aborted to user space
10242 */
10243 if (ar->scan.arvif == arvif) {
10244 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
10245
10246 spin_lock_bh(&ar->data_lock);
10247 ar->scan.arvif = NULL;
10248 if (!ar->scan.is_roc) {
10249 struct cfg80211_scan_info info = {
10250 .aborted = true,
10251 };
10252
10253 ath12k_mac_scan_send_complete(ar, &info);
10254 }
10255
10256 ar->scan.state = ATH12K_SCAN_IDLE;
10257 ar->scan_channel = NULL;
10258 ar->scan.roc_freq = 0;
10259 spin_unlock_bh(&ar->data_lock);
10260 }
10261
10262 ath12k_mac_remove_link_interface(hw, arvif);
10263 ath12k_mac_unassign_link_vif(arvif);
10264 }
10265 }
10266
10267 /* FIXME: Has to be verified. */
10268 #define SUPPORTED_FILTERS \
10269 (FIF_ALLMULTI | \
10270 FIF_CONTROL | \
10271 FIF_PSPOLL | \
10272 FIF_OTHER_BSS | \
10273 FIF_BCN_PRBRESP_PROMISC | \
10274 FIF_PROBE_REQ | \
10275 FIF_FCSFAIL)
10276
ath12k_mac_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)10277 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
10278 unsigned int changed_flags,
10279 unsigned int *total_flags,
10280 u64 multicast)
10281 {
10282 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10283 struct ath12k *ar;
10284
10285 lockdep_assert_wiphy(hw->wiphy);
10286
10287 ar = ath12k_ah_to_ar(ah, 0);
10288
10289 *total_flags &= SUPPORTED_FILTERS;
10290 ar->filter_flags = *total_flags;
10291 }
10292
ath12k_mac_op_get_antenna(struct ieee80211_hw * hw,int radio_idx,u32 * tx_ant,u32 * rx_ant)10293 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
10294 u32 *tx_ant, u32 *rx_ant)
10295 {
10296 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10297 int antennas_rx = 0, antennas_tx = 0;
10298 struct ath12k *ar;
10299 int i;
10300
10301 lockdep_assert_wiphy(hw->wiphy);
10302
10303 for_each_ar(ah, ar, i) {
10304 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
10305 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
10306 }
10307
10308 *tx_ant = antennas_tx;
10309 *rx_ant = antennas_rx;
10310
10311 return 0;
10312 }
10313
ath12k_mac_op_set_antenna(struct ieee80211_hw * hw,int radio_idx,u32 tx_ant,u32 rx_ant)10314 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
10315 u32 tx_ant, u32 rx_ant)
10316 {
10317 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10318 struct ath12k *ar;
10319 int ret = 0;
10320 int i;
10321
10322 lockdep_assert_wiphy(hw->wiphy);
10323
10324 for_each_ar(ah, ar, i) {
10325 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
10326 if (ret)
10327 break;
10328 }
10329
10330 return ret;
10331 }
10332
ath12k_mac_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params,u8 link_id)10333 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw,
10334 struct ieee80211_vif *vif,
10335 struct ieee80211_ampdu_params *params,
10336 u8 link_id)
10337 {
10338 struct ath12k *ar;
10339 int ret = -EINVAL;
10340
10341 lockdep_assert_wiphy(hw->wiphy);
10342
10343 ar = ath12k_get_ar_by_vif(hw, vif, link_id);
10344 if (!ar)
10345 return -EINVAL;
10346
10347 switch (params->action) {
10348 case IEEE80211_AMPDU_RX_START:
10349 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id);
10350 break;
10351 case IEEE80211_AMPDU_RX_STOP:
10352 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id);
10353 break;
10354 case IEEE80211_AMPDU_TX_START:
10355 case IEEE80211_AMPDU_TX_STOP_CONT:
10356 case IEEE80211_AMPDU_TX_STOP_FLUSH:
10357 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10358 case IEEE80211_AMPDU_TX_OPERATIONAL:
10359 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
10360 * Tx aggregation requests.
10361 */
10362 ret = -EOPNOTSUPP;
10363 break;
10364 }
10365
10366 if (ret)
10367 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n",
10368 params->action, vif->addr, link_id, ret);
10369
10370 return ret;
10371 }
10372
ath12k_mac_op_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)10373 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
10374 struct ieee80211_vif *vif,
10375 struct ieee80211_ampdu_params *params)
10376 {
10377 struct ieee80211_sta *sta = params->sta;
10378 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
10379 unsigned long links_map = ahsta->links_map;
10380 int ret = -EINVAL;
10381 u8 link_id;
10382
10383 lockdep_assert_wiphy(hw->wiphy);
10384
10385 if (WARN_ON(!links_map))
10386 return ret;
10387
10388 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10389 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id);
10390 if (ret)
10391 return ret;
10392 }
10393
10394 return 0;
10395 }
10396
ath12k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10397 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
10398 struct ieee80211_chanctx_conf *ctx)
10399 {
10400 struct ath12k *ar;
10401 struct ath12k_base *ab;
10402
10403 lockdep_assert_wiphy(hw->wiphy);
10404
10405 ar = ath12k_get_ar_by_ctx(hw, ctx);
10406 if (!ar)
10407 return -EINVAL;
10408
10409 ab = ar->ab;
10410
10411 ath12k_dbg(ab, ATH12K_DBG_MAC,
10412 "mac chanctx add freq %u width %d ptr %p\n",
10413 ctx->def.chan->center_freq, ctx->def.width, ctx);
10414
10415 spin_lock_bh(&ar->data_lock);
10416 /* TODO: In case of multiple channel context, populate rx_channel from
10417 * Rx PPDU desc information.
10418 */
10419 ar->rx_channel = ctx->def.chan;
10420 spin_unlock_bh(&ar->data_lock);
10421 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10422
10423 return 0;
10424 }
10425
ath12k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10426 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
10427 struct ieee80211_chanctx_conf *ctx)
10428 {
10429 struct ath12k *ar;
10430 struct ath12k_base *ab;
10431
10432 lockdep_assert_wiphy(hw->wiphy);
10433
10434 ar = ath12k_get_ar_by_ctx(hw, ctx);
10435 if (!ar)
10436 return;
10437
10438 ab = ar->ab;
10439
10440 ath12k_dbg(ab, ATH12K_DBG_MAC,
10441 "mac chanctx remove freq %u width %d ptr %p\n",
10442 ctx->def.chan->center_freq, ctx->def.width, ctx);
10443
10444 spin_lock_bh(&ar->data_lock);
10445 /* TODO: In case of there is one more channel context left, populate
10446 * rx_channel with the channel of that remaining channel context.
10447 */
10448 ar->rx_channel = NULL;
10449 spin_unlock_bh(&ar->data_lock);
10450 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10451 }
10452
10453 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)10454 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
10455 enum wmi_phy_mode mode,
10456 enum nl80211_band band,
10457 enum nl80211_iftype type)
10458 {
10459 struct ieee80211_sta_eht_cap *eht_cap = NULL;
10460 enum wmi_phy_mode down_mode;
10461 int n = ar->mac.sbands[band].n_iftype_data;
10462 int i;
10463 struct ieee80211_sband_iftype_data *data;
10464
10465 if (mode < MODE_11BE_EHT20)
10466 return mode;
10467
10468 data = ar->mac.iftype[band];
10469 for (i = 0; i < n; i++) {
10470 if (data[i].types_mask & BIT(type)) {
10471 eht_cap = &data[i].eht_cap;
10472 break;
10473 }
10474 }
10475
10476 if (eht_cap && eht_cap->has_eht)
10477 return mode;
10478
10479 switch (mode) {
10480 case MODE_11BE_EHT20:
10481 down_mode = MODE_11AX_HE20;
10482 break;
10483 case MODE_11BE_EHT40:
10484 down_mode = MODE_11AX_HE40;
10485 break;
10486 case MODE_11BE_EHT80:
10487 down_mode = MODE_11AX_HE80;
10488 break;
10489 case MODE_11BE_EHT80_80:
10490 down_mode = MODE_11AX_HE80_80;
10491 break;
10492 case MODE_11BE_EHT160:
10493 case MODE_11BE_EHT160_160:
10494 case MODE_11BE_EHT320:
10495 down_mode = MODE_11AX_HE160;
10496 break;
10497 case MODE_11BE_EHT20_2G:
10498 down_mode = MODE_11AX_HE20_2G;
10499 break;
10500 case MODE_11BE_EHT40_2G:
10501 down_mode = MODE_11AX_HE40_2G;
10502 break;
10503 default:
10504 down_mode = mode;
10505 break;
10506 }
10507
10508 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10509 "mac vdev start phymode %s downgrade to %s\n",
10510 ath12k_mac_phymode_str(mode),
10511 ath12k_mac_phymode_str(down_mode));
10512
10513 return down_mode;
10514 }
10515
10516 static void
ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif * arvif,struct wmi_ml_arg * ml_arg)10517 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif,
10518 struct wmi_ml_arg *ml_arg)
10519 {
10520 struct ath12k_vif *ahvif = arvif->ahvif;
10521 struct wmi_ml_partner_info *partner_info;
10522 struct ieee80211_bss_conf *link_conf;
10523 struct ath12k_link_vif *arvif_p;
10524 unsigned long links;
10525 u8 link_id;
10526
10527 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10528
10529 if (!ath12k_mac_is_ml_arvif(arvif))
10530 return;
10531
10532 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS)
10533 return;
10534
10535 ml_arg->enabled = true;
10536
10537 /* Driver always add a new link via VDEV START, FW takes
10538 * care of internally adding this link to existing
10539 * link vdevs which are advertised as partners below
10540 */
10541 ml_arg->link_add = true;
10542
10543 ml_arg->assoc_link = arvif->is_sta_assoc_link;
10544
10545 partner_info = ml_arg->partner_info;
10546
10547 links = ahvif->links_map;
10548 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
10549 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10550
10551 if (WARN_ON(!arvif_p))
10552 continue;
10553
10554 if (arvif == arvif_p)
10555 continue;
10556
10557 if (!arvif_p->is_created)
10558 continue;
10559
10560 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10561 ahvif->vif->link_conf[arvif_p->link_id]);
10562
10563 if (!link_conf)
10564 continue;
10565
10566 partner_info->vdev_id = arvif_p->vdev_id;
10567 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id;
10568 ether_addr_copy(partner_info->addr, link_conf->addr);
10569 ml_arg->num_partner_links++;
10570 partner_info++;
10571 }
10572 }
10573
10574 static int
ath12k_mac_vdev_start_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx,bool restart)10575 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif,
10576 struct ieee80211_chanctx_conf *ctx,
10577 bool restart)
10578 {
10579 struct ath12k *ar = arvif->ar;
10580 struct ath12k_base *ab = ar->ab;
10581 struct wmi_vdev_start_req_arg arg = {};
10582 const struct cfg80211_chan_def *chandef = &ctx->def;
10583 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10584 struct ath12k_vif *ahvif = arvif->ahvif;
10585 struct ieee80211_bss_conf *link_conf;
10586 unsigned int dfs_cac_time;
10587 int ret;
10588
10589 lockdep_assert_wiphy(hw->wiphy);
10590
10591 link_conf = ath12k_mac_get_link_bss_conf(arvif);
10592 if (!link_conf) {
10593 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n",
10594 ahvif->vif->addr, arvif->link_id);
10595 return -ENOLINK;
10596 }
10597
10598 reinit_completion(&ar->vdev_setup_done);
10599
10600 arg.vdev_id = arvif->vdev_id;
10601 arg.dtim_period = arvif->dtim_period;
10602 arg.bcn_intval = arvif->beacon_interval;
10603 arg.punct_bitmap = ~arvif->punct_bitmap;
10604
10605 arg.freq = chandef->chan->center_freq;
10606 arg.band_center_freq1 = chandef->center_freq1;
10607 arg.band_center_freq2 = chandef->center_freq2;
10608 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
10609
10610 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
10611 chandef->chan->band,
10612 ahvif->vif->type);
10613 arg.min_power = 0;
10614 arg.max_power = chandef->chan->max_power;
10615 arg.max_reg_power = chandef->chan->max_reg_power;
10616 arg.max_antenna_gain = chandef->chan->max_antenna_gain;
10617
10618 arg.pref_tx_streams = ar->num_tx_chains;
10619 arg.pref_rx_streams = ar->num_rx_chains;
10620
10621 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
10622 arg.mbssid_tx_vdev_id = 0;
10623 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
10624 ar->ab->wmi_ab.svc_map)) {
10625 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
10626 &arg.mbssid_flags,
10627 &arg.mbssid_tx_vdev_id);
10628 if (ret)
10629 return ret;
10630 }
10631
10632 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10633 arg.ssid = ahvif->u.ap.ssid;
10634 arg.ssid_len = ahvif->u.ap.ssid_len;
10635 arg.hidden_ssid = ahvif->u.ap.hidden_ssid;
10636
10637 /* For now allow DFS for AP mode */
10638 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
10639
10640 arg.freq2_radar = ctx->radar_enabled;
10641
10642 arg.passive = arg.chan_radar;
10643
10644 spin_lock_bh(&ab->base_lock);
10645 arg.regdomain = ar->ab->dfs_region;
10646 spin_unlock_bh(&ab->base_lock);
10647
10648 /* TODO: Notify if secondary 80Mhz also needs radar detection */
10649 }
10650
10651 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
10652
10653 if (!restart)
10654 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml);
10655
10656 ath12k_dbg(ab, ATH12K_DBG_MAC,
10657 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
10658 arg.vdev_id, arg.freq,
10659 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
10660
10661 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
10662 if (ret) {
10663 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
10664 restart ? "restart" : "start", arg.vdev_id);
10665 return ret;
10666 }
10667
10668 ret = ath12k_mac_vdev_setup_sync(ar);
10669 if (ret) {
10670 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
10671 arg.vdev_id, restart ? "restart" : "start", ret);
10672 return ret;
10673 }
10674
10675 /* TODO: For now we only set TPC power here. However when
10676 * channel changes, say CSA, it should be updated again.
10677 */
10678 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) {
10679 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx);
10680 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
10681 &arvif->reg_tpc_info);
10682 }
10683
10684 ar->num_started_vdevs++;
10685 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
10686 ahvif->vif->addr, arvif->vdev_id);
10687
10688 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS
10689 * state as NL80211_DFS_USABLE which indicates CAC needs to be
10690 * done before channel usage. This flag is used to drop rx packets.
10691 * during CAC.
10692 */
10693 /* TODO: Set the flag for other interface types as required */
10694 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
10695 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) {
10696 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
10697 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef);
10698
10699 ath12k_dbg(ab, ATH12K_DBG_MAC,
10700 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
10701 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id);
10702 }
10703
10704 ret = ath12k_mac_set_txbf_conf(arvif);
10705 if (ret)
10706 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
10707 arvif->vdev_id, ret);
10708
10709 return 0;
10710 }
10711
ath12k_mac_vdev_start(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10712 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif,
10713 struct ieee80211_chanctx_conf *ctx)
10714 {
10715 return ath12k_mac_vdev_start_restart(arvif, ctx, false);
10716 }
10717
ath12k_mac_vdev_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10718 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif,
10719 struct ieee80211_chanctx_conf *ctx)
10720 {
10721 return ath12k_mac_vdev_start_restart(arvif, ctx, true);
10722 }
10723
10724 struct ath12k_mac_change_chanctx_arg {
10725 struct ieee80211_chanctx_conf *ctx;
10726 struct ieee80211_vif_chanctx_switch *vifs;
10727 int n_vifs;
10728 int next_vif;
10729 struct ath12k *ar;
10730 };
10731
10732 static void
ath12k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10733 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
10734 struct ieee80211_vif *vif)
10735 {
10736 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10737 struct ath12k_mac_change_chanctx_arg *arg = data;
10738 struct ieee80211_bss_conf *link_conf;
10739 struct ath12k_link_vif *arvif;
10740 unsigned long links_map;
10741 u8 link_id;
10742
10743 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10744
10745 links_map = ahvif->links_map;
10746 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10747 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10748 if (WARN_ON(!arvif))
10749 continue;
10750
10751 if (!arvif->is_created || arvif->ar != arg->ar)
10752 continue;
10753
10754 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10755 vif->link_conf[link_id]);
10756 if (WARN_ON(!link_conf))
10757 continue;
10758
10759 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx)
10760 continue;
10761
10762 arg->n_vifs++;
10763 }
10764 }
10765
10766 static void
ath12k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10767 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
10768 struct ieee80211_vif *vif)
10769 {
10770 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10771 struct ath12k_mac_change_chanctx_arg *arg = data;
10772 struct ieee80211_bss_conf *link_conf;
10773 struct ieee80211_chanctx_conf *ctx;
10774 struct ath12k_link_vif *arvif;
10775 unsigned long links_map;
10776 u8 link_id;
10777
10778 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10779
10780 links_map = ahvif->links_map;
10781 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10782 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10783 if (WARN_ON(!arvif))
10784 continue;
10785
10786 if (!arvif->is_created || arvif->ar != arg->ar)
10787 continue;
10788
10789 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10790 vif->link_conf[arvif->link_id]);
10791 if (WARN_ON(!link_conf))
10792 continue;
10793
10794 ctx = rcu_access_pointer(link_conf->chanctx_conf);
10795 if (ctx != arg->ctx)
10796 continue;
10797
10798 if (WARN_ON(arg->next_vif == arg->n_vifs))
10799 return;
10800
10801 arg->vifs[arg->next_vif].vif = vif;
10802 arg->vifs[arg->next_vif].old_ctx = ctx;
10803 arg->vifs[arg->next_vif].new_ctx = ctx;
10804 arg->vifs[arg->next_vif].link_conf = link_conf;
10805 arg->next_vif++;
10806 }
10807 }
10808
ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)10809 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
10810 {
10811 switch (width) {
10812 case NL80211_CHAN_WIDTH_20:
10813 return WMI_CHAN_WIDTH_20;
10814 case NL80211_CHAN_WIDTH_40:
10815 return WMI_CHAN_WIDTH_40;
10816 case NL80211_CHAN_WIDTH_80:
10817 return WMI_CHAN_WIDTH_80;
10818 case NL80211_CHAN_WIDTH_160:
10819 return WMI_CHAN_WIDTH_160;
10820 case NL80211_CHAN_WIDTH_80P80:
10821 return WMI_CHAN_WIDTH_80P80;
10822 case NL80211_CHAN_WIDTH_5:
10823 return WMI_CHAN_WIDTH_5;
10824 case NL80211_CHAN_WIDTH_10:
10825 return WMI_CHAN_WIDTH_10;
10826 case NL80211_CHAN_WIDTH_320:
10827 return WMI_CHAN_WIDTH_320;
10828 default:
10829 WARN_ON(1);
10830 return WMI_CHAN_WIDTH_20;
10831 }
10832 }
10833
ath12k_mac_update_peer_puncturing_width(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def def)10834 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
10835 struct ath12k_link_vif *arvif,
10836 struct cfg80211_chan_def def)
10837 {
10838 u32 param_id, param_value;
10839 int ret;
10840
10841 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
10842 return 0;
10843
10844 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
10845 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
10846 u32_encode_bits((~def.punctured),
10847 WMI_PEER_PUNCTURE_BITMAP);
10848
10849 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10850 "punctured bitmap %02x width %d vdev %d\n",
10851 def.punctured, def.width, arvif->vdev_id);
10852
10853 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
10854 arvif->vdev_id, param_id,
10855 param_value);
10856
10857 return ret;
10858 }
10859
10860 static void
ath12k_mac_update_vif_chan(struct ath12k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)10861 ath12k_mac_update_vif_chan(struct ath12k *ar,
10862 struct ieee80211_vif_chanctx_switch *vifs,
10863 int n_vifs)
10864 {
10865 struct ath12k_wmi_vdev_up_params params = {};
10866 struct ath12k_link_vif *arvif;
10867 struct ieee80211_bss_conf *link_conf;
10868 struct ath12k_base *ab = ar->ab;
10869 struct ieee80211_vif *vif;
10870 struct ath12k_vif *ahvif;
10871 u8 link_id;
10872 int ret;
10873 int i;
10874 bool monitor_vif = false;
10875
10876 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10877
10878 for (i = 0; i < n_vifs; i++) {
10879 vif = vifs[i].vif;
10880 ahvif = ath12k_vif_to_ahvif(vif);
10881 link_conf = vifs[i].link_conf;
10882 link_id = link_conf->link_id;
10883 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
10884 ahvif->link[link_id]);
10885
10886 if (vif->type == NL80211_IFTYPE_MONITOR) {
10887 monitor_vif = true;
10888 continue;
10889 }
10890
10891 ath12k_dbg(ab, ATH12K_DBG_MAC,
10892 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
10893 arvif->vdev_id,
10894 vifs[i].old_ctx->def.chan->center_freq,
10895 vifs[i].new_ctx->def.chan->center_freq,
10896 vifs[i].old_ctx->def.width,
10897 vifs[i].new_ctx->def.width);
10898
10899 if (WARN_ON(!arvif->is_started))
10900 continue;
10901
10902 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
10903
10904 /* Firmware expect vdev_restart only if vdev is up.
10905 * If vdev is down then it expect vdev_stop->vdev_start.
10906 */
10907 if (arvif->is_up) {
10908 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
10909 if (ret) {
10910 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
10911 arvif->vdev_id, ret);
10912 continue;
10913 }
10914 } else {
10915 ret = ath12k_mac_vdev_stop(arvif);
10916 if (ret) {
10917 ath12k_warn(ab, "failed to stop vdev %d: %d\n",
10918 arvif->vdev_id, ret);
10919 continue;
10920 }
10921
10922 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
10923 if (ret)
10924 ath12k_warn(ab, "failed to start vdev %d: %d\n",
10925 arvif->vdev_id, ret);
10926 continue;
10927 }
10928
10929 ret = ath12k_mac_setup_bcn_tmpl(arvif);
10930 if (ret)
10931 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
10932 ret);
10933
10934 memset(¶ms, 0, sizeof(params));
10935 params.vdev_id = arvif->vdev_id;
10936 params.aid = ahvif->aid;
10937 params.bssid = arvif->bssid;
10938 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
10939 if (params.tx_bssid) {
10940 params.nontx_profile_idx = link_conf->bssid_index;
10941 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator;
10942 }
10943 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
10944 if (ret) {
10945 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
10946 arvif->vdev_id, ret);
10947 continue;
10948 }
10949
10950 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
10951 vifs[i].new_ctx->def);
10952 if (ret) {
10953 ath12k_warn(ar->ab,
10954 "failed to update puncturing bitmap %02x and width %d: %d\n",
10955 vifs[i].new_ctx->def.punctured,
10956 vifs[i].new_ctx->def.width, ret);
10957 continue;
10958 }
10959 }
10960
10961 /* Restart the internal monitor vdev on new channel */
10962 if (!monitor_vif && ar->monitor_vdev_created) {
10963 if (!ath12k_mac_monitor_stop(ar))
10964 ath12k_mac_monitor_start(ar);
10965 }
10966 }
10967
10968 static void
ath12k_mac_update_active_vif_chan(struct ath12k * ar,struct ieee80211_chanctx_conf * ctx)10969 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
10970 struct ieee80211_chanctx_conf *ctx)
10971 {
10972 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
10973 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10974
10975 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10976
10977 ieee80211_iterate_active_interfaces_atomic(hw,
10978 IEEE80211_IFACE_ITER_NORMAL,
10979 ath12k_mac_change_chanctx_cnt_iter,
10980 &arg);
10981 if (arg.n_vifs == 0)
10982 return;
10983
10984 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
10985 if (!arg.vifs)
10986 return;
10987
10988 ieee80211_iterate_active_interfaces_atomic(hw,
10989 IEEE80211_IFACE_ITER_NORMAL,
10990 ath12k_mac_change_chanctx_fill_iter,
10991 &arg);
10992
10993 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
10994
10995 kfree(arg.vifs);
10996 }
10997
ath12k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)10998 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
10999 struct ieee80211_chanctx_conf *ctx,
11000 u32 changed)
11001 {
11002 struct ath12k *ar;
11003 struct ath12k_base *ab;
11004
11005 lockdep_assert_wiphy(hw->wiphy);
11006
11007 ar = ath12k_get_ar_by_ctx(hw, ctx);
11008 if (!ar)
11009 return;
11010
11011 ab = ar->ab;
11012
11013 ath12k_dbg(ab, ATH12K_DBG_MAC,
11014 "mac chanctx change freq %u width %d ptr %p changed %x\n",
11015 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
11016
11017 /* This shouldn't really happen because channel switching should use
11018 * switch_vif_chanctx().
11019 */
11020 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
11021 return;
11022
11023 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
11024 changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
11025 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
11026 ath12k_mac_update_active_vif_chan(ar, ctx);
11027
11028 /* TODO: Recalc radar detection */
11029 }
11030
ath12k_start_vdev_delay(struct ath12k * ar,struct ath12k_link_vif * arvif)11031 static int ath12k_start_vdev_delay(struct ath12k *ar,
11032 struct ath12k_link_vif *arvif)
11033 {
11034 struct ath12k_base *ab = ar->ab;
11035 struct ath12k_vif *ahvif = arvif->ahvif;
11036 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
11037 struct ieee80211_chanctx_conf *chanctx;
11038 struct ieee80211_bss_conf *link_conf;
11039 int ret;
11040
11041 if (WARN_ON(arvif->is_started))
11042 return -EBUSY;
11043
11044 link_conf = ath12k_mac_get_link_bss_conf(arvif);
11045 if (!link_conf) {
11046 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id);
11047 return -EINVAL;
11048 }
11049
11050 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy,
11051 link_conf->chanctx_conf);
11052 ret = ath12k_mac_vdev_start(arvif, chanctx);
11053 if (ret) {
11054 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11055 arvif->vdev_id, vif->addr,
11056 chanctx->def.chan->center_freq, ret);
11057 return ret;
11058 }
11059
11060 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11061 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
11062 if (ret) {
11063 ath12k_warn(ab, "failed put monitor up: %d\n", ret);
11064 return ret;
11065 }
11066 }
11067
11068 arvif->is_started = true;
11069
11070 /* TODO: Setup ps and cts/rts protection */
11071 return 0;
11072 }
11073
ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def * chan_def)11074 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
11075 {
11076 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
11077 switch (chan_def->width) {
11078 case NL80211_CHAN_WIDTH_20:
11079 return 1;
11080 case NL80211_CHAN_WIDTH_40:
11081 return 2;
11082 case NL80211_CHAN_WIDTH_80:
11083 return 4;
11084 case NL80211_CHAN_WIDTH_160:
11085 return 8;
11086 case NL80211_CHAN_WIDTH_320:
11087 return 16;
11088 default:
11089 return 1;
11090 }
11091 } else {
11092 switch (chan_def->width) {
11093 case NL80211_CHAN_WIDTH_20:
11094 return 1;
11095 case NL80211_CHAN_WIDTH_40:
11096 return 2;
11097 case NL80211_CHAN_WIDTH_80:
11098 return 3;
11099 case NL80211_CHAN_WIDTH_160:
11100 return 4;
11101 case NL80211_CHAN_WIDTH_320:
11102 return 5;
11103 default:
11104 return 1;
11105 }
11106 }
11107 }
11108
ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def * chan_def)11109 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
11110 {
11111 u16 diff_seq;
11112
11113 /* It is to get the lowest channel number's center frequency of the chan.
11114 * For example,
11115 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
11116 * with center frequency 5955, its diff is 5965 - 5955 = 10.
11117 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
11118 * with center frequency 5955, its diff is 5985 - 5955 = 30.
11119 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
11120 * with center frequency 5955, its diff is 6025 - 5955 = 70.
11121 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1
11122 * with center frequency 5955, its diff is 6105 - 5955 = 70.
11123 */
11124 switch (chan_def->width) {
11125 case NL80211_CHAN_WIDTH_320:
11126 diff_seq = 150;
11127 break;
11128 case NL80211_CHAN_WIDTH_160:
11129 diff_seq = 70;
11130 break;
11131 case NL80211_CHAN_WIDTH_80:
11132 diff_seq = 30;
11133 break;
11134 case NL80211_CHAN_WIDTH_40:
11135 diff_seq = 10;
11136 break;
11137 default:
11138 diff_seq = 0;
11139 }
11140
11141 return chan_def->center_freq1 - diff_seq;
11142 }
11143
ath12k_mac_get_seg_freq(struct cfg80211_chan_def * chan_def,u16 start_seq,u8 seq)11144 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
11145 u16 start_seq, u8 seq)
11146 {
11147 u16 seg_seq;
11148
11149 /* It is to get the center frequency of the specific bandwidth.
11150 * start_seq means the lowest channel number's center frequency.
11151 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz.
11152 * For example,
11153 * lowest channel is 1, its center frequency 5955,
11154 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
11155 * lowest channel is 1, its center frequency 5955,
11156 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
11157 * lowest channel is 1, its center frequency 5955,
11158 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
11159 * lowest channel is 1, its center frequency 5955,
11160 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
11161 */
11162 seg_seq = 10 * (BIT(seq) - 1);
11163 return seg_seq + start_seq;
11164 }
11165
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)11166 static void ath12k_mac_get_psd_channel(struct ath12k *ar,
11167 u16 step_freq,
11168 u16 *start_freq,
11169 u16 *center_freq,
11170 u8 i,
11171 struct ieee80211_channel **temp_chan,
11172 s8 *tx_power)
11173 {
11174 /* It is to get the center frequency for each 20 MHz.
11175 * For example, if the chan is 160 MHz and center frequency is 6025,
11176 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
11177 * channel number 1's center frequency is 5955, it is parameter start_freq.
11178 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
11179 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
11180 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
11181 * the gap is 20 for each channel, parameter step_freq means the gap.
11182 * after get the center frequency of each channel, it is easy to find the
11183 * struct ieee80211_channel of it and get the max_reg_power.
11184 */
11185 *center_freq = *start_freq + i * step_freq;
11186 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11187 *tx_power = (*temp_chan)->max_reg_power;
11188 }
11189
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)11190 static void ath12k_mac_get_eirp_power(struct ath12k *ar,
11191 u16 *start_freq,
11192 u16 *center_freq,
11193 u8 i,
11194 struct ieee80211_channel **temp_chan,
11195 struct cfg80211_chan_def *def,
11196 s8 *tx_power)
11197 {
11198 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
11199 * 160 MHz bandwidth, and then plus 10 to the center frequency,
11200 * it is the center frequency of a channel number.
11201 * For example, when configured channel number is 1.
11202 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
11203 * then it is channel number 5.
11204 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
11205 * then it is channel number 9.
11206 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
11207 * then it is channel number 17.
11208 * after get the center frequency of each channel, it is easy to find the
11209 * struct ieee80211_channel of it and get the max_reg_power.
11210 */
11211 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i);
11212
11213 /* For the 20 MHz, its center frequency is same with same channel */
11214 if (i != 0)
11215 *center_freq += 10;
11216
11217 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11218 *tx_power = (*temp_chan)->max_reg_power;
11219 }
11220
ath12k_mac_fill_reg_tpc_info(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11221 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
11222 struct ath12k_link_vif *arvif,
11223 struct ieee80211_chanctx_conf *ctx)
11224 {
11225 struct ath12k_base *ab = ar->ab;
11226 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
11227 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11228 struct ieee80211_channel *chan, *temp_chan;
11229 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
11230 bool is_psd_power = false, is_tpe_present = false;
11231 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS],
11232 psd_power, tx_power, eirp_power;
11233 struct ath12k_vif *ahvif = arvif->ahvif;
11234 u16 start_freq, center_freq;
11235 u8 reg_6ghz_power_mode;
11236
11237 chan = ctx->def.chan;
11238 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def);
11239 pwr_reduction = bss_conf->pwr_reduction;
11240
11241 if (arvif->reg_tpc_info.num_pwr_levels) {
11242 is_tpe_present = true;
11243 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
11244 } else {
11245 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def);
11246 }
11247
11248 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
11249 /* STA received TPE IE*/
11250 if (is_tpe_present) {
11251 /* local power is PSD power*/
11252 if (chan->flags & IEEE80211_CHAN_PSD) {
11253 /* Connecting AP is psd power */
11254 if (reg_tpc_info->is_psd_power) {
11255 is_psd_power = true;
11256 ath12k_mac_get_psd_channel(ar, 20,
11257 &start_freq,
11258 ¢er_freq,
11259 pwr_lvl_idx,
11260 &temp_chan,
11261 &tx_power);
11262 psd_power = temp_chan->psd;
11263 eirp_power = tx_power;
11264 max_tx_power[pwr_lvl_idx] =
11265 min_t(s8,
11266 psd_power,
11267 reg_tpc_info->tpe[pwr_lvl_idx]);
11268 /* Connecting AP is not psd power */
11269 } else {
11270 ath12k_mac_get_eirp_power(ar,
11271 &start_freq,
11272 ¢er_freq,
11273 pwr_lvl_idx,
11274 &temp_chan,
11275 &ctx->def,
11276 &tx_power);
11277 psd_power = temp_chan->psd;
11278 /* convert psd power to EIRP power based
11279 * on channel width
11280 */
11281 tx_power =
11282 min_t(s8, tx_power,
11283 psd_power + 13 + pwr_lvl_idx * 3);
11284 max_tx_power[pwr_lvl_idx] =
11285 min_t(s8,
11286 tx_power,
11287 reg_tpc_info->tpe[pwr_lvl_idx]);
11288 }
11289 /* local power is not PSD power */
11290 } else {
11291 /* Connecting AP is psd power */
11292 if (reg_tpc_info->is_psd_power) {
11293 is_psd_power = true;
11294 ath12k_mac_get_psd_channel(ar, 20,
11295 &start_freq,
11296 ¢er_freq,
11297 pwr_lvl_idx,
11298 &temp_chan,
11299 &tx_power);
11300 eirp_power = tx_power;
11301 max_tx_power[pwr_lvl_idx] =
11302 reg_tpc_info->tpe[pwr_lvl_idx];
11303 /* Connecting AP is not psd power */
11304 } else {
11305 ath12k_mac_get_eirp_power(ar,
11306 &start_freq,
11307 ¢er_freq,
11308 pwr_lvl_idx,
11309 &temp_chan,
11310 &ctx->def,
11311 &tx_power);
11312 max_tx_power[pwr_lvl_idx] =
11313 min_t(s8,
11314 tx_power,
11315 reg_tpc_info->tpe[pwr_lvl_idx]);
11316 }
11317 }
11318 /* STA not received TPE IE */
11319 } else {
11320 /* local power is PSD power*/
11321 if (chan->flags & IEEE80211_CHAN_PSD) {
11322 is_psd_power = true;
11323 ath12k_mac_get_psd_channel(ar, 20,
11324 &start_freq,
11325 ¢er_freq,
11326 pwr_lvl_idx,
11327 &temp_chan,
11328 &tx_power);
11329 psd_power = temp_chan->psd;
11330 eirp_power = tx_power;
11331 max_tx_power[pwr_lvl_idx] = psd_power;
11332 } else {
11333 ath12k_mac_get_eirp_power(ar,
11334 &start_freq,
11335 ¢er_freq,
11336 pwr_lvl_idx,
11337 &temp_chan,
11338 &ctx->def,
11339 &tx_power);
11340 max_tx_power[pwr_lvl_idx] = tx_power;
11341 }
11342 }
11343
11344 if (is_psd_power) {
11345 /* If AP local power constraint is present */
11346 if (pwr_reduction)
11347 eirp_power = eirp_power - pwr_reduction;
11348
11349 /* If firmware updated max tx power is non zero, then take
11350 * the min of firmware updated ap tx power
11351 * and max power derived from above mentioned parameters.
11352 */
11353 ath12k_dbg(ab, ATH12K_DBG_MAC,
11354 "eirp power : %d firmware report power : %d\n",
11355 eirp_power, ar->max_allowed_tx_power);
11356 /* Firmware reports lower max_allowed_tx_power during vdev
11357 * start response. In case of 6 GHz, firmware is not aware
11358 * of EIRP power unless driver sets EIRP power through WMI
11359 * TPC command. So radio which does not support idle power
11360 * save can set maximum calculated EIRP power directly to
11361 * firmware through TPC command without min comparison with
11362 * vdev start response's max_allowed_tx_power.
11363 */
11364 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11365 eirp_power = min_t(s8,
11366 eirp_power,
11367 ar->max_allowed_tx_power);
11368 } else {
11369 /* If AP local power constraint is present */
11370 if (pwr_reduction)
11371 max_tx_power[pwr_lvl_idx] =
11372 max_tx_power[pwr_lvl_idx] - pwr_reduction;
11373 /* If firmware updated max tx power is non zero, then take
11374 * the min of firmware updated ap tx power
11375 * and max power derived from above mentioned parameters.
11376 */
11377 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11378 max_tx_power[pwr_lvl_idx] =
11379 min_t(s8,
11380 max_tx_power[pwr_lvl_idx],
11381 ar->max_allowed_tx_power);
11382 }
11383 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
11384 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
11385 max_tx_power[pwr_lvl_idx];
11386 }
11387
11388 reg_tpc_info->num_pwr_levels = num_pwr_levels;
11389 reg_tpc_info->is_psd_power = is_psd_power;
11390 reg_tpc_info->eirp_power = eirp_power;
11391 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11392 reg_6ghz_power_mode = bss_conf->power_type;
11393 else
11394 /* For now, LPI is the only supported AP power mode */
11395 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP;
11396
11397 reg_tpc_info->ap_power_type =
11398 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode);
11399 }
11400
ath12k_mac_parse_tx_pwr_env(struct ath12k * ar,struct ath12k_link_vif * arvif)11401 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar,
11402 struct ath12k_link_vif *arvif)
11403 {
11404 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11405 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info;
11406 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd;
11407 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd;
11408 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe;
11409 enum wmi_reg_6g_client_type client_type;
11410 struct ath12k_reg_info *reg_info;
11411 struct ath12k_base *ab = ar->ab;
11412 bool psd_valid, non_psd_valid;
11413 int i;
11414
11415 reg_info = ab->reg_info[ar->pdev_idx];
11416 client_type = reg_info->client_type;
11417
11418 local_psd = &tpe->psd_local[client_type];
11419 reg_psd = &tpe->psd_reg_client[client_type];
11420 local_non_psd = &tpe->max_local[client_type];
11421 reg_non_psd = &tpe->max_reg_client[client_type];
11422
11423 psd_valid = local_psd->valid | reg_psd->valid;
11424 non_psd_valid = local_non_psd->valid | reg_non_psd->valid;
11425
11426 if (!psd_valid && !non_psd_valid) {
11427 ath12k_warn(ab,
11428 "no transmit power envelope match client power type %d\n",
11429 client_type);
11430 return;
11431 }
11432
11433 if (psd_valid) {
11434 tpc_info->is_psd_power = true;
11435
11436 tpc_info->num_pwr_levels = max(local_psd->count,
11437 reg_psd->count);
11438 if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS)
11439 tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS;
11440
11441 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11442 tpc_info->tpe[i] = min(local_psd->power[i],
11443 reg_psd->power[i]) / 2;
11444 ath12k_dbg(ab, ATH12K_DBG_MAC,
11445 "TPE PSD power[%d] : %d\n",
11446 i, tpc_info->tpe[i]);
11447 }
11448 } else {
11449 tpc_info->is_psd_power = false;
11450 tpc_info->eirp_power = 0;
11451
11452 tpc_info->num_pwr_levels = max(local_non_psd->count,
11453 reg_non_psd->count);
11454 if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS)
11455 tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS;
11456
11457 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11458 tpc_info->tpe[i] = min(local_non_psd->power[i],
11459 reg_non_psd->power[i]) / 2;
11460 ath12k_dbg(ab, ATH12K_DBG_MAC,
11461 "non PSD power[%d] : %d\n",
11462 i, tpc_info->tpe[i]);
11463 }
11464 }
11465 }
11466
11467 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)11468 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
11469 struct ieee80211_vif *vif,
11470 struct ieee80211_bss_conf *link_conf,
11471 struct ieee80211_chanctx_conf *ctx)
11472 {
11473 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11474 struct ath12k *ar;
11475 struct ath12k_base *ab;
11476 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11477 u8 link_id = link_conf->link_id;
11478 struct ath12k_link_vif *arvif;
11479 int ret;
11480
11481 lockdep_assert_wiphy(hw->wiphy);
11482
11483 /* For multi radio wiphy, the vdev was not created during add_interface
11484 * create now since we have a channel ctx now to assign to a specific ar/fw
11485 */
11486 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
11487 if (!arvif) {
11488 WARN_ON(1);
11489 return -ENOMEM;
11490 }
11491
11492 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
11493 if (!ar) {
11494 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started",
11495 vif->addr, link_id);
11496 return -EINVAL;
11497 }
11498
11499 ab = ar->ab;
11500
11501 ath12k_dbg(ab, ATH12K_DBG_MAC,
11502 "mac chanctx assign ptr %p vdev_id %i\n",
11503 ctx, arvif->vdev_id);
11504
11505 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
11506 ctx->def.chan->band == NL80211_BAND_6GHZ &&
11507 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11508 ath12k_mac_parse_tx_pwr_env(ar, arvif);
11509
11510 arvif->punct_bitmap = ctx->def.punctured;
11511
11512 /* for some targets bss peer must be created before vdev_start */
11513 if (ab->hw_params->vdev_start_delay &&
11514 ahvif->vdev_type != WMI_VDEV_TYPE_AP &&
11515 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
11516 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
11517 ret = 0;
11518 goto out;
11519 }
11520
11521 if (WARN_ON(arvif->is_started)) {
11522 ret = -EBUSY;
11523 goto out;
11524 }
11525
11526 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11527 ret = ath12k_mac_monitor_start(ar);
11528 if (ret) {
11529 ath12k_mac_monitor_vdev_delete(ar);
11530 goto out;
11531 }
11532
11533 arvif->is_started = true;
11534 goto out;
11535 }
11536
11537 ret = ath12k_mac_vdev_start(arvif, ctx);
11538 if (ret) {
11539 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11540 arvif->vdev_id, vif->addr,
11541 ctx->def.chan->center_freq, ret);
11542 goto out;
11543 }
11544
11545 arvif->is_started = true;
11546
11547 /* TODO: Setup ps and cts/rts protection */
11548
11549 out:
11550 return ret;
11551 }
11552
11553 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)11554 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
11555 struct ieee80211_vif *vif,
11556 struct ieee80211_bss_conf *link_conf,
11557 struct ieee80211_chanctx_conf *ctx)
11558 {
11559 struct ath12k *ar;
11560 struct ath12k_base *ab;
11561 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11562 struct ath12k_link_vif *arvif;
11563 u8 link_id = link_conf->link_id;
11564 int ret;
11565
11566 lockdep_assert_wiphy(hw->wiphy);
11567
11568 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11569
11570 /* The vif is expected to be attached to an ar's VDEV.
11571 * We leave the vif/vdev in this function as is
11572 * and not delete the vdev symmetric to assign_vif_chanctx()
11573 * the VDEV will be deleted and unassigned either during
11574 * remove_interface() or when there is a change in channel
11575 * that moves the vif to a new ar
11576 */
11577 if (!arvif || !arvif->is_created)
11578 return;
11579
11580 ar = arvif->ar;
11581 ab = ar->ab;
11582
11583 ath12k_dbg(ab, ATH12K_DBG_MAC,
11584 "mac chanctx unassign ptr %p vdev_id %i\n",
11585 ctx, arvif->vdev_id);
11586
11587 WARN_ON(!arvif->is_started);
11588
11589 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11590 ret = ath12k_mac_monitor_stop(ar);
11591 if (ret)
11592 return;
11593
11594 arvif->is_started = false;
11595 }
11596
11597 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA &&
11598 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
11599 ath12k_bss_disassoc(ar, arvif);
11600 ret = ath12k_mac_vdev_stop(arvif);
11601 if (ret)
11602 ath12k_warn(ab, "failed to stop vdev %i: %d\n",
11603 arvif->vdev_id, ret);
11604 }
11605 arvif->is_started = false;
11606
11607 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
11608 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
11609 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
11610 ar->state_11d != ATH12K_11D_PREPARING) {
11611 reinit_completion(&ar->completed_11d_scan);
11612 ar->state_11d = ATH12K_11D_PREPARING;
11613 }
11614
11615 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) {
11616 ath12k_scan_abort(ar);
11617 ar->scan.arvif = NULL;
11618 }
11619 }
11620
11621 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)11622 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
11623 struct ieee80211_vif_chanctx_switch *vifs,
11624 int n_vifs,
11625 enum ieee80211_chanctx_switch_mode mode)
11626 {
11627 struct ath12k *ar;
11628
11629 lockdep_assert_wiphy(hw->wiphy);
11630
11631 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx);
11632 if (!ar)
11633 return -EINVAL;
11634
11635 /* Switching channels across radio is not allowed */
11636 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
11637 return -EINVAL;
11638
11639 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11640 "mac chanctx switch n_vifs %d mode %d\n",
11641 n_vifs, mode);
11642 ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
11643
11644 return 0;
11645 }
11646
11647 static int
ath12k_set_vdev_param_to_all_vifs(struct ath12k * ar,int param,u32 value)11648 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
11649 {
11650 struct ath12k_link_vif *arvif;
11651 int ret = 0;
11652
11653 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11654
11655 list_for_each_entry(arvif, &ar->arvifs, list) {
11656 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
11657 param, arvif->vdev_id, value);
11658
11659 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11660 param, value);
11661 if (ret) {
11662 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
11663 param, arvif->vdev_id, ret);
11664 break;
11665 }
11666 }
11667
11668 return ret;
11669 }
11670
11671 /* mac80211 stores device specific RTS/Fragmentation threshold value,
11672 * this is set interface specific to firmware from ath12k driver
11673 */
ath12k_mac_op_set_rts_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11674 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
11675 int radio_idx, u32 value)
11676 {
11677 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11678 struct ath12k *ar;
11679 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD, ret = 0, i;
11680
11681 lockdep_assert_wiphy(hw->wiphy);
11682
11683 /* Currently we set the rts threshold value to all the vifs across
11684 * all radios of the single wiphy.
11685 * TODO Once support for vif specific RTS threshold in mac80211 is
11686 * available, ath12k can make use of it.
11687 */
11688 for_each_ar(ah, ar, i) {
11689 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11690 if (ret) {
11691 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d",
11692 ar->pdev->pdev_id);
11693 break;
11694 }
11695 }
11696
11697 return ret;
11698 }
11699
ath12k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11700 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
11701 int radio_idx, u32 value)
11702 {
11703 /* Even though there's a WMI vdev param for fragmentation threshold no
11704 * known firmware actually implements it. Moreover it is not possible to
11705 * rely frame fragmentation to mac80211 because firmware clears the
11706 * "more fragments" bit in frame control making it impossible for remote
11707 * devices to reassemble frames.
11708 *
11709 * Hence implement a dummy callback just to say fragmentation isn't
11710 * supported. This effectively prevents mac80211 from doing frame
11711 * fragmentation in software.
11712 */
11713
11714 lockdep_assert_wiphy(hw->wiphy);
11715
11716 return -EOPNOTSUPP;
11717 }
11718
ath12k_mac_flush(struct ath12k * ar)11719 static int ath12k_mac_flush(struct ath12k *ar)
11720 {
11721 long time_left;
11722 int ret = 0;
11723
11724 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
11725 (atomic_read(&ar->dp.num_tx_pending) == 0),
11726 ATH12K_FLUSH_TIMEOUT);
11727 if (time_left == 0) {
11728 ath12k_warn(ar->ab,
11729 "failed to flush transmit queue, data pkts pending %d\n",
11730 atomic_read(&ar->dp.num_tx_pending));
11731 ret = -ETIMEDOUT;
11732 }
11733
11734 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
11735 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
11736 ATH12K_FLUSH_TIMEOUT);
11737 if (time_left == 0) {
11738 ath12k_warn(ar->ab,
11739 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
11740 atomic_read(&ar->num_pending_mgmt_tx));
11741 ret = -ETIMEDOUT;
11742 }
11743
11744 return ret;
11745 }
11746
ath12k_mac_wait_tx_complete(struct ath12k * ar)11747 int ath12k_mac_wait_tx_complete(struct ath12k *ar)
11748 {
11749 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11750
11751 ath12k_mac_drain_tx(ar);
11752 return ath12k_mac_flush(ar);
11753 }
11754
ath12k_mac_op_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)11755 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
11756 u32 queues, bool drop)
11757 {
11758 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11759 struct ath12k_link_vif *arvif;
11760 struct ath12k_vif *ahvif;
11761 unsigned long links;
11762 struct ath12k *ar;
11763 u8 link_id;
11764 int i;
11765
11766 lockdep_assert_wiphy(hw->wiphy);
11767
11768 if (drop)
11769 return;
11770
11771 /* vif can be NULL when flush() is considered for hw */
11772 if (!vif) {
11773 for_each_ar(ah, ar, i)
11774 ath12k_mac_flush(ar);
11775 return;
11776 }
11777
11778 for_each_ar(ah, ar, i)
11779 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work);
11780
11781 ahvif = ath12k_vif_to_ahvif(vif);
11782 links = ahvif->links_map;
11783 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
11784 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11785 if (!(arvif && arvif->ar))
11786 continue;
11787
11788 ath12k_mac_flush(arvif->ar);
11789 }
11790 }
11791
11792 static int
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11793 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
11794 enum nl80211_band band,
11795 const struct cfg80211_bitrate_mask *mask)
11796 {
11797 int num_rates = 0;
11798 int i;
11799
11800 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
11801 num_rates += hweight16(mask->control[band].ht_mcs[i]);
11802
11803 return num_rates;
11804 }
11805
11806 static bool
ath12k_mac_has_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11807 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
11808 enum nl80211_band band,
11809 const struct cfg80211_bitrate_mask *mask)
11810 {
11811 int num_rates = 0;
11812
11813 num_rates = hweight32(mask->control[band].legacy);
11814
11815 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
11816 return false;
11817
11818 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
11819 return false;
11820
11821 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask))
11822 return false;
11823
11824 return num_rates == 1;
11825 }
11826
11827 static __le16
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap * he_cap)11828 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
11829 {
11830 if (he_cap->he_cap_elem.phy_cap_info[0] &
11831 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
11832 return he_cap->he_mcs_nss_supp.tx_mcs_160;
11833
11834 return he_cap->he_mcs_nss_supp.tx_mcs_80;
11835 }
11836
11837 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)11838 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
11839 struct ieee80211_vif *vif,
11840 enum nl80211_band band,
11841 const struct cfg80211_bitrate_mask *mask,
11842 int *nss)
11843 {
11844 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
11845 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
11846 const struct ieee80211_sta_he_cap *he_cap;
11847 u16 he_mcs_map = 0;
11848 u8 ht_nss_mask = 0;
11849 u8 vht_nss_mask = 0;
11850 u8 he_nss_mask = 0;
11851 int i;
11852
11853 /* No need to consider legacy here. Basic rates are always present
11854 * in bitrate mask
11855 */
11856
11857 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
11858 if (mask->control[band].ht_mcs[i] == 0)
11859 continue;
11860 else if (mask->control[band].ht_mcs[i] ==
11861 sband->ht_cap.mcs.rx_mask[i])
11862 ht_nss_mask |= BIT(i);
11863 else
11864 return false;
11865 }
11866
11867 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
11868 if (mask->control[band].vht_mcs[i] == 0)
11869 continue;
11870 else if (mask->control[band].vht_mcs[i] ==
11871 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
11872 vht_nss_mask |= BIT(i);
11873 else
11874 return false;
11875 }
11876
11877 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif);
11878 if (!he_cap)
11879 return false;
11880
11881 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap));
11882
11883 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
11884 if (mask->control[band].he_mcs[i] == 0)
11885 continue;
11886
11887 if (mask->control[band].he_mcs[i] ==
11888 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i))
11889 he_nss_mask |= BIT(i);
11890 else
11891 return false;
11892 }
11893
11894 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
11895 return false;
11896
11897 if (ht_nss_mask == 0)
11898 return false;
11899
11900 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
11901 return false;
11902
11903 *nss = fls(ht_nss_mask);
11904
11905 return true;
11906 }
11907
11908 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)11909 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
11910 enum nl80211_band band,
11911 const struct cfg80211_bitrate_mask *mask,
11912 u32 *rate, u8 *nss)
11913 {
11914 int rate_idx;
11915 u16 bitrate;
11916 u8 preamble;
11917 u8 hw_rate;
11918
11919 if (hweight32(mask->control[band].legacy) != 1)
11920 return -EINVAL;
11921
11922 rate_idx = ffs(mask->control[band].legacy) - 1;
11923
11924 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
11925 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
11926
11927 hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
11928 bitrate = ath12k_legacy_rates[rate_idx].bitrate;
11929
11930 if (ath12k_mac_bitrate_is_cck(bitrate))
11931 preamble = WMI_RATE_PREAMBLE_CCK;
11932 else
11933 preamble = WMI_RATE_PREAMBLE_OFDM;
11934
11935 *nss = 1;
11936 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
11937
11938 return 0;
11939 }
11940
11941 static int
ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif * arvif,u8 he_gi,u8 he_ltf)11942 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf)
11943 {
11944 struct ath12k *ar = arvif->ar;
11945 int ret;
11946
11947 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11948
11949 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
11950 if (he_gi && he_gi != 0xFF)
11951 he_gi += 1;
11952
11953 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11954 WMI_VDEV_PARAM_SGI, he_gi);
11955 if (ret) {
11956 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n",
11957 he_gi, ret);
11958 return ret;
11959 }
11960 /* start from 1 */
11961 if (he_ltf != 0xFF)
11962 he_ltf += 1;
11963
11964 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11965 WMI_VDEV_PARAM_HE_LTF, he_ltf);
11966 if (ret) {
11967 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n",
11968 he_ltf, ret);
11969 return ret;
11970 }
11971 return 0;
11972 }
11973
11974 static int
ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif * arvif,u16 he_gi,u8 he_ltf)11975 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf)
11976 {
11977 struct ath12k *ar = arvif->ar;
11978 int ret;
11979 u32 he_ar_gi_ltf;
11980
11981 if (he_gi != 0xFF) {
11982 switch (he_gi) {
11983 case NL80211_RATE_INFO_HE_GI_0_8:
11984 he_gi = WMI_AUTORATE_800NS_GI;
11985 break;
11986 case NL80211_RATE_INFO_HE_GI_1_6:
11987 he_gi = WMI_AUTORATE_1600NS_GI;
11988 break;
11989 case NL80211_RATE_INFO_HE_GI_3_2:
11990 he_gi = WMI_AUTORATE_3200NS_GI;
11991 break;
11992 default:
11993 ath12k_warn(ar->ab, "Invalid GI\n");
11994 return -EINVAL;
11995 }
11996 }
11997
11998 if (he_ltf != 0xFF) {
11999 switch (he_ltf) {
12000 case NL80211_RATE_INFO_HE_1XLTF:
12001 he_ltf = WMI_HE_AUTORATE_LTF_1X;
12002 break;
12003 case NL80211_RATE_INFO_HE_2XLTF:
12004 he_ltf = WMI_HE_AUTORATE_LTF_2X;
12005 break;
12006 case NL80211_RATE_INFO_HE_4XLTF:
12007 he_ltf = WMI_HE_AUTORATE_LTF_4X;
12008 break;
12009 default:
12010 ath12k_warn(ar->ab, "Invalid LTF\n");
12011 return -EINVAL;
12012 }
12013 }
12014
12015 he_ar_gi_ltf = he_gi | he_ltf;
12016
12017 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12018 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
12019 he_ar_gi_ltf);
12020 if (ret) {
12021 ath12k_warn(ar->ab,
12022 "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n",
12023 he_gi, he_ltf, ret);
12024 return ret;
12025 }
12026
12027 return 0;
12028 }
12029
ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)12030 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
12031 {
12032 switch (gi) {
12033 case NL80211_TXRATE_DEFAULT_GI:
12034 return WMI_GI_400_NS;
12035 case NL80211_TXRATE_FORCE_LGI:
12036 return WMI_GI_800_NS;
12037 default:
12038 return WMI_GI_400_NS;
12039 }
12040 }
12041
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)12042 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
12043 u32 rate, u8 nss, u8 sgi, u8 ldpc,
12044 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
12045 {
12046 struct ieee80211_bss_conf *link_conf;
12047 struct ath12k *ar = arvif->ar;
12048 u32 vdev_param;
12049 u32 param_value;
12050 int ret;
12051 bool he_support;
12052
12053 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12054
12055 link_conf = ath12k_mac_get_link_bss_conf(arvif);
12056 if (!link_conf)
12057 return -EINVAL;
12058
12059 he_support = link_conf->he_support;
12060
12061 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12062 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n",
12063 arvif->vdev_id, rate, nss, sgi, ldpc);
12064
12065 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12066 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
12067 he_ltf, he_fixed_rate);
12068
12069 if (!he_support) {
12070 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
12071 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12072 vdev_param, rate);
12073 if (ret) {
12074 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
12075 rate, ret);
12076 return ret;
12077 }
12078 }
12079
12080 vdev_param = WMI_VDEV_PARAM_NSS;
12081
12082 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12083 vdev_param, nss);
12084 if (ret) {
12085 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
12086 nss, ret);
12087 return ret;
12088 }
12089
12090 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12091 WMI_VDEV_PARAM_LDPC, ldpc);
12092 if (ret) {
12093 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
12094 ldpc, ret);
12095 return ret;
12096 }
12097
12098 if (he_support) {
12099 if (he_fixed_rate)
12100 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf);
12101 else
12102 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf);
12103 if (ret)
12104 return ret;
12105 } else {
12106 vdev_param = WMI_VDEV_PARAM_SGI;
12107 param_value = ath12k_mac_nlgi_to_wmigi(sgi);
12108 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12109 vdev_param, param_value);
12110 if (ret) {
12111 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
12112 sgi, ret);
12113 return ret;
12114 }
12115 }
12116
12117 return 0;
12118 }
12119
12120 static bool
ath12k_mac_vht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12121 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
12122 enum nl80211_band band,
12123 const struct cfg80211_bitrate_mask *mask)
12124 {
12125 int i;
12126 u16 vht_mcs;
12127
12128 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
12129 vht_mcs = mask->control[band].vht_mcs[i];
12130
12131 switch (vht_mcs) {
12132 case 0:
12133 case BIT(8) - 1:
12134 case BIT(9) - 1:
12135 case BIT(10) - 1:
12136 break;
12137 default:
12138 return false;
12139 }
12140 }
12141
12142 return true;
12143 }
12144
12145 static bool
ath12k_mac_he_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12146 ath12k_mac_he_mcs_range_present(struct ath12k *ar,
12147 enum nl80211_band band,
12148 const struct cfg80211_bitrate_mask *mask)
12149 {
12150 int i;
12151 u16 he_mcs;
12152
12153 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
12154 he_mcs = mask->control[band].he_mcs[i];
12155
12156 switch (he_mcs) {
12157 case 0:
12158 case BIT(8) - 1:
12159 case BIT(10) - 1:
12160 case BIT(12) - 1:
12161 break;
12162 default:
12163 return false;
12164 }
12165 }
12166
12167 return true;
12168 }
12169
ath12k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)12170 static void ath12k_mac_set_bitrate_mask_iter(void *data,
12171 struct ieee80211_sta *sta)
12172 {
12173 struct ath12k_link_vif *arvif = data;
12174 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12175 struct ath12k_link_sta *arsta;
12176 struct ath12k *ar = arvif->ar;
12177
12178 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12179
12180 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12181 ahsta->link[arvif->link_id]);
12182 if (!arsta || arsta->arvif != arvif)
12183 return;
12184
12185 spin_lock_bh(&ar->data_lock);
12186 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
12187 spin_unlock_bh(&ar->data_lock);
12188
12189 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
12190 }
12191
ath12k_mac_disable_peer_fixed_rate(void * data,struct ieee80211_sta * sta)12192 static void ath12k_mac_disable_peer_fixed_rate(void *data,
12193 struct ieee80211_sta *sta)
12194 {
12195 struct ath12k_link_vif *arvif = data;
12196 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12197 struct ath12k_link_sta *arsta;
12198 struct ath12k *ar = arvif->ar;
12199 int ret;
12200
12201 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12202
12203 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12204 ahsta->link[arvif->link_id]);
12205
12206 if (!arsta || arsta->arvif != arvif)
12207 return;
12208
12209 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
12210 arvif->vdev_id,
12211 WMI_PEER_PARAM_FIXED_RATE,
12212 WMI_FIXED_RATE_NONE);
12213 if (ret)
12214 ath12k_warn(ar->ab,
12215 "failed to disable peer fixed rate for STA %pM ret %d\n",
12216 arsta->addr, ret);
12217 }
12218
12219 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)12220 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band,
12221 const struct cfg80211_bitrate_mask *mask,
12222 unsigned int link_id)
12223 {
12224 bool he_fixed_rate = false, vht_fixed_rate = false;
12225 const u16 *vht_mcs_mask, *he_mcs_mask;
12226 struct ieee80211_link_sta *link_sta;
12227 struct ath12k_peer *peer, *tmp;
12228 u8 vht_nss, he_nss;
12229 int ret = true;
12230
12231 vht_mcs_mask = mask->control[band].vht_mcs;
12232 he_mcs_mask = mask->control[band].he_mcs;
12233
12234 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
12235 vht_fixed_rate = true;
12236
12237 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
12238 he_fixed_rate = true;
12239
12240 if (!vht_fixed_rate && !he_fixed_rate)
12241 return true;
12242
12243 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
12244 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
12245
12246 rcu_read_lock();
12247 spin_lock_bh(&ar->ab->base_lock);
12248 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
12249 if (peer->sta) {
12250 link_sta = rcu_dereference(peer->sta->link[link_id]);
12251 if (!link_sta) {
12252 ret = false;
12253 goto exit;
12254 }
12255
12256 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
12257 link_sta->rx_nss < vht_nss)) {
12258 ret = false;
12259 goto exit;
12260 }
12261 if (he_fixed_rate && (!link_sta->he_cap.has_he ||
12262 link_sta->rx_nss < he_nss)) {
12263 ret = false;
12264 goto exit;
12265 }
12266 }
12267 }
12268 exit:
12269 spin_unlock_bh(&ar->ab->base_lock);
12270 rcu_read_unlock();
12271 return ret;
12272 }
12273
12274 static int
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)12275 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
12276 struct ieee80211_vif *vif,
12277 const struct cfg80211_bitrate_mask *mask)
12278 {
12279 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12280 struct ath12k_link_vif *arvif;
12281 struct cfg80211_chan_def def;
12282 struct ath12k *ar;
12283 enum nl80211_band band;
12284 const u8 *ht_mcs_mask;
12285 const u16 *vht_mcs_mask;
12286 const u16 *he_mcs_mask;
12287 u8 he_ltf = 0;
12288 u8 he_gi = 0;
12289 u32 rate;
12290 u8 nss, mac_nss;
12291 u8 sgi;
12292 u8 ldpc;
12293 int single_nss;
12294 int ret;
12295 int num_rates;
12296 bool he_fixed_rate = false;
12297
12298 lockdep_assert_wiphy(hw->wiphy);
12299
12300 arvif = &ahvif->deflink;
12301
12302 ar = arvif->ar;
12303 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
12304 ret = -EPERM;
12305 goto out;
12306 }
12307
12308 band = def.chan->band;
12309 ht_mcs_mask = mask->control[band].ht_mcs;
12310 vht_mcs_mask = mask->control[band].vht_mcs;
12311 he_mcs_mask = mask->control[band].he_mcs;
12312 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
12313
12314 sgi = mask->control[band].gi;
12315 if (sgi == NL80211_TXRATE_FORCE_SGI) {
12316 ret = -EINVAL;
12317 goto out;
12318 }
12319
12320 he_gi = mask->control[band].he_gi;
12321 he_ltf = mask->control[band].he_ltf;
12322
12323 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
12324 * requires passing at least one of used basic rates along with them.
12325 * Fixed rate setting across different preambles(legacy, HT, VHT) is
12326 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
12327 * suitable for setting single HT/VHT rates.
12328 * But, there could be a single basic rate passed from userspace which
12329 * can be done through the FIXED_RATE param.
12330 */
12331 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
12332 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
12333 &nss);
12334 if (ret) {
12335 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
12336 arvif->vdev_id, ret);
12337 goto out;
12338 }
12339
12340 ieee80211_iterate_stations_mtx(hw,
12341 ath12k_mac_disable_peer_fixed_rate,
12342 arvif);
12343 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask,
12344 &single_nss)) {
12345 rate = WMI_FIXED_RATE_NONE;
12346 nss = single_nss;
12347 arvif->bitrate_mask = *mask;
12348
12349 ieee80211_iterate_stations_atomic(hw,
12350 ath12k_mac_set_bitrate_mask_iter,
12351 arvif);
12352 } else {
12353 rate = WMI_FIXED_RATE_NONE;
12354
12355 if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
12356 mask, arvif->link_id))
12357 ath12k_warn(ar->ab,
12358 "failed to update fixed rate settings due to mcs/nss incompatibility\n");
12359
12360 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
12361 ath12k_mac_max_vht_nss(vht_mcs_mask),
12362 ath12k_mac_max_he_nss(he_mcs_mask));
12363 nss = min_t(u32, ar->num_tx_chains, mac_nss);
12364
12365 /* If multiple rates across different preambles are given
12366 * we can reconfigure this info with all peers using PEER_ASSOC
12367 * command with the below exception cases.
12368 * - Single VHT Rate : peer_assoc command accommodates only MCS
12369 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
12370 * mandates passing basic rates along with HT/VHT rates, FW
12371 * doesn't allow switching from VHT to Legacy. Hence instead of
12372 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
12373 * we could set this VHT rate as peer fixed rate param, which
12374 * will override FIXED rate and FW rate control algorithm.
12375 * If single VHT rate is passed along with HT rates, we select
12376 * the VHT rate as fixed rate for vht peers.
12377 * - Multiple VHT Rates : When Multiple VHT rates are given,this
12378 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
12379 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
12380 * RATEMASK_CMDID can cover all use cases of setting rates
12381 * across multiple preambles and rates within same type.
12382 * But requires more validation of the command at this point.
12383 */
12384
12385 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
12386 mask);
12387
12388 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
12389 num_rates > 1) {
12390 /* TODO: Handle multiple VHT MCS values setting using
12391 * RATEMASK CMD
12392 */
12393 ath12k_warn(ar->ab,
12394 "Setting more than one MCS Value in bitrate mask not supported\n");
12395 ret = -EINVAL;
12396 goto out;
12397 }
12398
12399 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
12400 if (num_rates == 1)
12401 he_fixed_rate = true;
12402
12403 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) &&
12404 num_rates > 1) {
12405 ath12k_warn(ar->ab,
12406 "Setting more than one HE MCS Value in bitrate mask not supported\n");
12407 ret = -EINVAL;
12408 goto out;
12409 }
12410 ieee80211_iterate_stations_mtx(hw,
12411 ath12k_mac_disable_peer_fixed_rate,
12412 arvif);
12413
12414 arvif->bitrate_mask = *mask;
12415 ieee80211_iterate_stations_mtx(hw,
12416 ath12k_mac_set_bitrate_mask_iter,
12417 arvif);
12418 }
12419
12420 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
12421 he_ltf, he_fixed_rate);
12422 if (ret) {
12423 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
12424 arvif->vdev_id, ret);
12425 }
12426
12427 out:
12428 return ret;
12429 }
12430
12431 static void
ath12k_mac_op_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)12432 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
12433 enum ieee80211_reconfig_type reconfig_type)
12434 {
12435 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12436 struct ath12k *ar;
12437 struct ath12k_base *ab;
12438 struct ath12k_vif *ahvif;
12439 struct ath12k_link_vif *arvif;
12440 int recovery_count, i;
12441
12442 lockdep_assert_wiphy(hw->wiphy);
12443
12444 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
12445 return;
12446
12447 guard(mutex)(&ah->hw_mutex);
12448
12449 if (ah->state != ATH12K_HW_STATE_RESTARTED)
12450 return;
12451
12452 ah->state = ATH12K_HW_STATE_ON;
12453 ieee80211_wake_queues(hw);
12454
12455 for_each_ar(ah, ar, i) {
12456 ab = ar->ab;
12457
12458 ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
12459 ar->pdev->pdev_id);
12460
12461 if (ar->ab->hw_params->current_cc_support &&
12462 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
12463 struct wmi_set_current_country_arg arg = {};
12464
12465 memcpy(&arg.alpha2, ar->alpha2, 2);
12466 reinit_completion(&ar->regd_update_completed);
12467 ath12k_wmi_send_set_current_country_cmd(ar, &arg);
12468 }
12469
12470 if (ab->is_reset) {
12471 recovery_count = atomic_inc_return(&ab->recovery_count);
12472
12473 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
12474 recovery_count);
12475
12476 /* When there are multiple radios in an SOC,
12477 * the recovery has to be done for each radio
12478 */
12479 if (recovery_count == ab->num_radios) {
12480 atomic_dec(&ab->reset_count);
12481 complete(&ab->reset_complete);
12482 ab->is_reset = false;
12483 atomic_set(&ab->fail_cont_count, 0);
12484 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
12485 }
12486 }
12487
12488 list_for_each_entry(arvif, &ar->arvifs, list) {
12489 ahvif = arvif->ahvif;
12490 ath12k_dbg(ab, ATH12K_DBG_BOOT,
12491 "reconfig cipher %d up %d vdev type %d\n",
12492 ahvif->key_cipher,
12493 arvif->is_up,
12494 ahvif->vdev_type);
12495
12496 /* After trigger disconnect, then upper layer will
12497 * trigger connect again, then the PN number of
12498 * upper layer will be reset to keep up with AP
12499 * side, hence PN number mismatch will not happen.
12500 */
12501 if (arvif->is_up &&
12502 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12503 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
12504 ieee80211_hw_restart_disconnect(ahvif->vif);
12505
12506 ath12k_dbg(ab, ATH12K_DBG_BOOT,
12507 "restart disconnect\n");
12508 }
12509 }
12510 }
12511 }
12512
12513 static void
ath12k_mac_update_bss_chan_survey(struct ath12k * ar,struct ieee80211_channel * channel)12514 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
12515 struct ieee80211_channel *channel)
12516 {
12517 int ret;
12518 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
12519
12520 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12521
12522 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
12523 ar->rx_channel != channel)
12524 return;
12525
12526 if (ar->scan.state != ATH12K_SCAN_IDLE) {
12527 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12528 "ignoring bss chan info req while scanning..\n");
12529 return;
12530 }
12531
12532 reinit_completion(&ar->bss_survey_done);
12533
12534 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
12535 if (ret) {
12536 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
12537 return;
12538 }
12539
12540 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
12541 if (ret == 0)
12542 ath12k_warn(ar->ab, "bss channel survey timed out\n");
12543 }
12544
ath12k_mac_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)12545 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
12546 struct survey_info *survey)
12547 {
12548 struct ath12k *ar;
12549 struct ieee80211_supported_band *sband;
12550 struct survey_info *ar_survey;
12551
12552 lockdep_assert_wiphy(hw->wiphy);
12553
12554 if (idx >= ATH12K_NUM_CHANS)
12555 return -ENOENT;
12556
12557 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
12558 if (sband && idx >= sband->n_channels) {
12559 idx -= sband->n_channels;
12560 sband = NULL;
12561 }
12562
12563 if (!sband)
12564 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
12565 if (sband && idx >= sband->n_channels) {
12566 idx -= sband->n_channels;
12567 sband = NULL;
12568 }
12569
12570 if (!sband)
12571 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
12572
12573 if (!sband || idx >= sband->n_channels)
12574 return -ENOENT;
12575
12576 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
12577 if (!ar) {
12578 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
12579 memset(survey, 0, sizeof(*survey));
12580 return 0;
12581 }
12582 return -ENOENT;
12583 }
12584
12585 ar_survey = &ar->survey[idx];
12586
12587 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
12588
12589 spin_lock_bh(&ar->data_lock);
12590 memcpy(survey, ar_survey, sizeof(*survey));
12591 spin_unlock_bh(&ar->data_lock);
12592
12593 survey->channel = &sband->channels[idx];
12594
12595 if (ar->rx_channel == survey->channel)
12596 survey->filled |= SURVEY_INFO_IN_USE;
12597
12598 return 0;
12599 }
12600
ath12k_mac_op_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)12601 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
12602 struct ieee80211_vif *vif,
12603 struct ieee80211_sta *sta,
12604 struct station_info *sinfo)
12605 {
12606 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12607 struct ath12k_fw_stats_req_params params = {};
12608 struct ath12k_link_sta *arsta;
12609 s8 signal, noise_floor;
12610 struct ath12k *ar;
12611 bool db2dbm;
12612
12613 lockdep_assert_wiphy(hw->wiphy);
12614
12615 arsta = &ahsta->deflink;
12616 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12617 if (!ar)
12618 return;
12619
12620 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12621 ar->ab->wmi_ab.svc_map);
12622
12623 sinfo->rx_duration = arsta->rx_duration;
12624 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12625
12626 sinfo->tx_duration = arsta->tx_duration;
12627 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12628
12629 if (arsta->txrate.legacy || arsta->txrate.nss) {
12630 if (arsta->txrate.legacy) {
12631 sinfo->txrate.legacy = arsta->txrate.legacy;
12632 } else {
12633 sinfo->txrate.mcs = arsta->txrate.mcs;
12634 sinfo->txrate.nss = arsta->txrate.nss;
12635 sinfo->txrate.bw = arsta->txrate.bw;
12636 sinfo->txrate.he_gi = arsta->txrate.he_gi;
12637 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12638 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
12639 sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12640 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc;
12641 }
12642 sinfo->txrate.flags = arsta->txrate.flags;
12643 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12644 }
12645
12646 /* TODO: Use real NF instead of default one. */
12647 signal = arsta->rssi_comb;
12648
12649 params.pdev_id = ar->pdev->pdev_id;
12650 params.vdev_id = 0;
12651 params.stats_id = WMI_REQUEST_VDEV_STAT;
12652
12653 if (!signal &&
12654 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12655 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12656 signal = arsta->rssi_beacon;
12657
12658 spin_lock_bh(&ar->data_lock);
12659 noise_floor = ath12k_pdev_get_noise_floor(ar);
12660 spin_unlock_bh(&ar->data_lock);
12661
12662 if (signal) {
12663 sinfo->signal = db2dbm ? signal : signal + noise_floor;
12664 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12665 }
12666
12667 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12668
12669 if (!db2dbm)
12670 sinfo->signal_avg += noise_floor;
12671
12672 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12673
12674 sinfo->tx_retries = arsta->tx_retry_count;
12675 sinfo->tx_failed = arsta->tx_retry_failed;
12676 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12677 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12678 }
12679
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)12680 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
12681 struct ieee80211_vif *vif,
12682 struct ieee80211_link_sta *link_sta,
12683 struct link_station_info *link_sinfo)
12684 {
12685 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta);
12686 struct ath12k_fw_stats_req_params params = {};
12687 struct ath12k_link_sta *arsta;
12688 struct ath12k *ar;
12689 s8 signal;
12690 bool db2dbm;
12691
12692 lockdep_assert_wiphy(hw->wiphy);
12693
12694 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]);
12695
12696 if (!arsta)
12697 return;
12698
12699 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12700 if (!ar)
12701 return;
12702
12703 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12704 ar->ab->wmi_ab.svc_map);
12705
12706 link_sinfo->rx_duration = arsta->rx_duration;
12707 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12708
12709 link_sinfo->tx_duration = arsta->tx_duration;
12710 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12711
12712 if (arsta->txrate.legacy || arsta->txrate.nss) {
12713 if (arsta->txrate.legacy) {
12714 link_sinfo->txrate.legacy = arsta->txrate.legacy;
12715 } else {
12716 link_sinfo->txrate.mcs = arsta->txrate.mcs;
12717 link_sinfo->txrate.nss = arsta->txrate.nss;
12718 link_sinfo->txrate.bw = arsta->txrate.bw;
12719 link_sinfo->txrate.he_gi = arsta->txrate.he_gi;
12720 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12721 link_sinfo->txrate.he_ru_alloc =
12722 arsta->txrate.he_ru_alloc;
12723 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12724 link_sinfo->txrate.eht_ru_alloc =
12725 arsta->txrate.eht_ru_alloc;
12726 }
12727 link_sinfo->txrate.flags = arsta->txrate.flags;
12728 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12729 }
12730
12731 /* TODO: Use real NF instead of default one. */
12732 signal = arsta->rssi_comb;
12733
12734 params.pdev_id = ar->pdev->pdev_id;
12735 params.vdev_id = 0;
12736 params.stats_id = WMI_REQUEST_VDEV_STAT;
12737
12738 if (!signal &&
12739 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12740 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12741 signal = arsta->rssi_beacon;
12742
12743 if (signal) {
12744 link_sinfo->signal =
12745 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
12746 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12747 }
12748
12749 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12750
12751 if (!db2dbm)
12752 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
12753
12754 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12755
12756 link_sinfo->tx_retries = arsta->tx_retry_count;
12757 link_sinfo->tx_failed = arsta->tx_retry_failed;
12758 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12759 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12760 }
12761
ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)12762 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
12763 struct ieee80211_vif *vif)
12764 {
12765 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12766 struct ath12k *ar;
12767
12768 ar = ath12k_ah_to_ar(ah, 0);
12769
12770 lockdep_assert_wiphy(hw->wiphy);
12771
12772 spin_lock_bh(&ar->data_lock);
12773 ar->scan.roc_notify = false;
12774 spin_unlock_bh(&ar->data_lock);
12775
12776 ath12k_scan_abort(ar);
12777
12778 cancel_delayed_work_sync(&ar->scan.timeout);
12779 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
12780
12781 return 0;
12782 }
12783
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)12784 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
12785 struct ieee80211_vif *vif,
12786 struct ieee80211_channel *chan,
12787 int duration,
12788 enum ieee80211_roc_type type)
12789 {
12790 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12791 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12792 struct ath12k_link_vif *arvif;
12793 struct ath12k *ar;
12794 u32 scan_time_msec;
12795 bool create = true;
12796 u8 link_id;
12797 int ret;
12798
12799 lockdep_assert_wiphy(hw->wiphy);
12800
12801 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq);
12802 if (!ar)
12803 return -EINVAL;
12804
12805 /* check if any of the links of ML VIF is already started on
12806 * radio(ar) corresponding to given scan frequency and use it,
12807 * if not use deflink(link 0) for scan purpose.
12808 */
12809
12810 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
12811 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12812 /* If the vif is already assigned to a specific vdev of an ar,
12813 * check whether its already started, vdev which is started
12814 * are not allowed to switch to a new radio.
12815 * If the vdev is not started, but was earlier created on a
12816 * different ar, delete that vdev and create a new one. We don't
12817 * delete at the scan stop as an optimization to avoid redundant
12818 * delete-create vdev's for the same ar, in case the request is
12819 * always on the same band for the vif
12820 */
12821 if (arvif->is_created) {
12822 if (WARN_ON(!arvif->ar))
12823 return -EINVAL;
12824
12825 if (ar != arvif->ar && arvif->is_started)
12826 return -EBUSY;
12827
12828 if (ar != arvif->ar) {
12829 ath12k_mac_remove_link_interface(hw, arvif);
12830 ath12k_mac_unassign_link_vif(arvif);
12831 } else {
12832 create = false;
12833 }
12834 }
12835
12836 if (create) {
12837 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12838
12839 ret = ath12k_mac_vdev_create(ar, arvif);
12840 if (ret) {
12841 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
12842 ret);
12843 return ret;
12844 }
12845 }
12846
12847 spin_lock_bh(&ar->data_lock);
12848
12849 switch (ar->scan.state) {
12850 case ATH12K_SCAN_IDLE:
12851 reinit_completion(&ar->scan.started);
12852 reinit_completion(&ar->scan.completed);
12853 reinit_completion(&ar->scan.on_channel);
12854 ar->scan.state = ATH12K_SCAN_STARTING;
12855 ar->scan.is_roc = true;
12856 ar->scan.arvif = arvif;
12857 ar->scan.roc_freq = chan->center_freq;
12858 ar->scan.roc_notify = true;
12859 ret = 0;
12860 break;
12861 case ATH12K_SCAN_STARTING:
12862 case ATH12K_SCAN_RUNNING:
12863 case ATH12K_SCAN_ABORTING:
12864 ret = -EBUSY;
12865 break;
12866 }
12867
12868 spin_unlock_bh(&ar->data_lock);
12869
12870 if (ret)
12871 return ret;
12872
12873 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
12874
12875 struct ath12k_wmi_scan_req_arg *arg __free(kfree) =
12876 kzalloc(sizeof(*arg), GFP_KERNEL);
12877 if (!arg)
12878 return -ENOMEM;
12879
12880 ath12k_wmi_start_scan_init(ar, arg);
12881 arg->num_chan = 1;
12882
12883 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list),
12884 GFP_KERNEL);
12885 if (!chan_list)
12886 return -ENOMEM;
12887
12888 arg->chan_list = chan_list;
12889 arg->vdev_id = arvif->vdev_id;
12890 arg->scan_id = ATH12K_SCAN_ID;
12891 arg->chan_list[0] = chan->center_freq;
12892 arg->dwell_time_active = scan_time_msec;
12893 arg->dwell_time_passive = scan_time_msec;
12894 arg->max_scan_time = scan_time_msec;
12895 arg->scan_f_passive = 1;
12896 arg->burst_duration = duration;
12897
12898 ret = ath12k_start_scan(ar, arg);
12899 if (ret) {
12900 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
12901
12902 spin_lock_bh(&ar->data_lock);
12903 ar->scan.state = ATH12K_SCAN_IDLE;
12904 spin_unlock_bh(&ar->data_lock);
12905 return ret;
12906 }
12907
12908 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
12909 if (ret == 0) {
12910 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
12911 ret = ath12k_scan_stop(ar);
12912 if (ret)
12913 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
12914 return -ETIMEDOUT;
12915 }
12916
12917 ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
12918 msecs_to_jiffies(duration));
12919
12920 return 0;
12921 }
12922
ath12k_mac_op_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)12923 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
12924 struct ieee80211_vif *vif,
12925 struct cfg80211_gtk_rekey_data *data)
12926 {
12927 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12928 struct ath12k_rekey_data *rekey_data;
12929 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12930 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
12931 struct ath12k_link_vif *arvif;
12932
12933 lockdep_assert_wiphy(hw->wiphy);
12934
12935 arvif = &ahvif->deflink;
12936 rekey_data = &arvif->rekey_data;
12937
12938 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
12939 arvif->vdev_id);
12940
12941 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
12942 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
12943
12944 /* The supplicant works on big-endian, the firmware expects it on
12945 * little endian.
12946 */
12947 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
12948
12949 arvif->rekey_data.enable_offload = true;
12950
12951 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL,
12952 rekey_data->kck, NL80211_KCK_LEN);
12953 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL,
12954 rekey_data->kck, NL80211_KEK_LEN);
12955 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
12956 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
12957 }
12958
12959 static const struct ieee80211_ops ath12k_ops = {
12960 .tx = ath12k_mac_op_tx,
12961 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
12962 .start = ath12k_mac_op_start,
12963 .stop = ath12k_mac_op_stop,
12964 .reconfig_complete = ath12k_mac_op_reconfig_complete,
12965 .add_interface = ath12k_mac_op_add_interface,
12966 .remove_interface = ath12k_mac_op_remove_interface,
12967 .update_vif_offload = ath12k_mac_op_update_vif_offload,
12968 .config = ath12k_mac_op_config,
12969 .link_info_changed = ath12k_mac_op_link_info_changed,
12970 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed,
12971 .change_vif_links = ath12k_mac_op_change_vif_links,
12972 .configure_filter = ath12k_mac_op_configure_filter,
12973 .hw_scan = ath12k_mac_op_hw_scan,
12974 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
12975 .set_key = ath12k_mac_op_set_key,
12976 .set_rekey_data = ath12k_mac_op_set_rekey_data,
12977 .sta_state = ath12k_mac_op_sta_state,
12978 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
12979 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update,
12980 .conf_tx = ath12k_mac_op_conf_tx,
12981 .set_antenna = ath12k_mac_op_set_antenna,
12982 .get_antenna = ath12k_mac_op_get_antenna,
12983 .ampdu_action = ath12k_mac_op_ampdu_action,
12984 .add_chanctx = ath12k_mac_op_add_chanctx,
12985 .remove_chanctx = ath12k_mac_op_remove_chanctx,
12986 .change_chanctx = ath12k_mac_op_change_chanctx,
12987 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
12988 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
12989 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
12990 .get_txpower = ath12k_mac_op_get_txpower,
12991 .set_rts_threshold = ath12k_mac_op_set_rts_threshold,
12992 .set_frag_threshold = ath12k_mac_op_set_frag_threshold,
12993 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
12994 .get_survey = ath12k_mac_op_get_survey,
12995 .flush = ath12k_mac_op_flush,
12996 .sta_statistics = ath12k_mac_op_sta_statistics,
12997 .link_sta_statistics = ath12k_mac_op_link_sta_statistics,
12998 .remain_on_channel = ath12k_mac_op_remain_on_channel,
12999 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel,
13000 .change_sta_links = ath12k_mac_op_change_sta_links,
13001 .can_activate_links = ath12k_mac_op_can_activate_links,
13002 #ifdef CONFIG_PM
13003 .suspend = ath12k_wow_op_suspend,
13004 .resume = ath12k_wow_op_resume,
13005 .set_wakeup = ath12k_wow_op_set_wakeup,
13006 #endif
13007 #ifdef CONFIG_ATH12K_DEBUGFS
13008 .vif_add_debugfs = ath12k_debugfs_op_vif_add,
13009 #endif
13010 CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
13011 #ifdef CONFIG_ATH12K_DEBUGFS
13012 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add,
13013 #endif
13014 };
13015
ath12k_mac_update_freq_range(struct ath12k * ar,u32 freq_low,u32 freq_high)13016 void ath12k_mac_update_freq_range(struct ath12k *ar,
13017 u32 freq_low, u32 freq_high)
13018 {
13019 if (!(freq_low && freq_high))
13020 return;
13021
13022 if (ar->freq_range.start_freq || ar->freq_range.end_freq) {
13023 ar->freq_range.start_freq = min(ar->freq_range.start_freq,
13024 MHZ_TO_KHZ(freq_low));
13025 ar->freq_range.end_freq = max(ar->freq_range.end_freq,
13026 MHZ_TO_KHZ(freq_high));
13027 } else {
13028 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low);
13029 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high);
13030 }
13031
13032 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13033 "mac pdev %u freq limit updated. New range %u->%u MHz\n",
13034 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq),
13035 KHZ_TO_MHZ(ar->freq_range.end_freq));
13036 }
13037
ath12k_mac_update_ch_list(struct ath12k * ar,struct ieee80211_supported_band * band,u32 freq_low,u32 freq_high)13038 static void ath12k_mac_update_ch_list(struct ath12k *ar,
13039 struct ieee80211_supported_band *band,
13040 u32 freq_low, u32 freq_high)
13041 {
13042 int i;
13043
13044 if (!(freq_low && freq_high))
13045 return;
13046
13047 for (i = 0; i < band->n_channels; i++) {
13048 if (band->channels[i].center_freq < freq_low ||
13049 band->channels[i].center_freq > freq_high)
13050 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
13051 }
13052 }
13053
ath12k_get_phy_id(struct ath12k * ar,u32 band)13054 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
13055 {
13056 struct ath12k_pdev *pdev = ar->pdev;
13057 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
13058
13059 if (band == WMI_HOST_WLAN_2GHZ_CAP)
13060 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
13061
13062 if (band == WMI_HOST_WLAN_5GHZ_CAP)
13063 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
13064
13065 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
13066
13067 return 0;
13068 }
13069
ath12k_mac_update_band(struct ath12k * ar,struct ieee80211_supported_band * orig_band,struct ieee80211_supported_band * new_band)13070 static int ath12k_mac_update_band(struct ath12k *ar,
13071 struct ieee80211_supported_band *orig_band,
13072 struct ieee80211_supported_band *new_band)
13073 {
13074 int i;
13075
13076 if (!orig_band || !new_band)
13077 return -EINVAL;
13078
13079 if (orig_band->band != new_band->band)
13080 return -EINVAL;
13081
13082 for (i = 0; i < new_band->n_channels; i++) {
13083 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
13084 continue;
13085 /* An enabled channel in new_band should not be already enabled
13086 * in the orig_band
13087 */
13088 if (WARN_ON(!(orig_band->channels[i].flags &
13089 IEEE80211_CHAN_DISABLED)))
13090 return -EINVAL;
13091 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
13092 }
13093 return 0;
13094 }
13095
ath12k_mac_setup_channels_rates(struct ath12k * ar,u32 supported_bands,struct ieee80211_supported_band * bands[])13096 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
13097 u32 supported_bands,
13098 struct ieee80211_supported_band *bands[])
13099 {
13100 struct ieee80211_supported_band *band;
13101 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
13102 struct ath12k_base *ab = ar->ab;
13103 u32 phy_id, freq_low, freq_high;
13104 struct ath12k_hw *ah = ar->ah;
13105 void *channels;
13106 int ret;
13107
13108 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
13109 ARRAY_SIZE(ath12k_5ghz_channels) +
13110 ARRAY_SIZE(ath12k_6ghz_channels)) !=
13111 ATH12K_NUM_CHANS);
13112
13113 reg_cap = &ab->hal_reg_cap[ar->pdev_idx];
13114
13115 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
13116 channels = kmemdup(ath12k_2ghz_channels,
13117 sizeof(ath12k_2ghz_channels),
13118 GFP_KERNEL);
13119 if (!channels)
13120 return -ENOMEM;
13121
13122 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
13123 band->band = NL80211_BAND_2GHZ;
13124 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
13125 band->channels = channels;
13126 band->n_bitrates = ath12k_g_rates_size;
13127 band->bitrates = ath12k_g_rates;
13128
13129 if (ab->hw_params->single_pdev_only) {
13130 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
13131 reg_cap = &ab->hal_reg_cap[phy_id];
13132 }
13133
13134 freq_low = max(reg_cap->low_2ghz_chan,
13135 ab->reg_freq_2ghz.start_freq);
13136 freq_high = min(reg_cap->high_2ghz_chan,
13137 ab->reg_freq_2ghz.end_freq);
13138
13139 ath12k_mac_update_ch_list(ar, band,
13140 reg_cap->low_2ghz_chan,
13141 reg_cap->high_2ghz_chan);
13142
13143 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13144
13145 if (!bands[NL80211_BAND_2GHZ]) {
13146 bands[NL80211_BAND_2GHZ] = band;
13147 } else {
13148 /* Split mac in same band under same wiphy */
13149 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
13150 if (ret) {
13151 kfree(channels);
13152 band->channels = NULL;
13153 return ret;
13154 }
13155 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
13156 ar->pdev->pdev_id,
13157 KHZ_TO_MHZ(ar->freq_range.start_freq),
13158 KHZ_TO_MHZ(ar->freq_range.end_freq));
13159 }
13160 }
13161
13162 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
13163 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) {
13164 channels = kmemdup(ath12k_6ghz_channels,
13165 sizeof(ath12k_6ghz_channels), GFP_KERNEL);
13166 if (!channels) {
13167 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13168 return -ENOMEM;
13169 }
13170
13171 ar->supports_6ghz = true;
13172 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
13173 band->band = NL80211_BAND_6GHZ;
13174 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
13175 band->channels = channels;
13176 band->n_bitrates = ath12k_a_rates_size;
13177 band->bitrates = ath12k_a_rates;
13178
13179 freq_low = max(reg_cap->low_5ghz_chan,
13180 ab->reg_freq_6ghz.start_freq);
13181 freq_high = min(reg_cap->high_5ghz_chan,
13182 ab->reg_freq_6ghz.end_freq);
13183
13184 ath12k_mac_update_ch_list(ar, band,
13185 reg_cap->low_5ghz_chan,
13186 reg_cap->high_5ghz_chan);
13187
13188 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13189 ah->use_6ghz_regd = true;
13190
13191 if (!bands[NL80211_BAND_6GHZ]) {
13192 bands[NL80211_BAND_6GHZ] = band;
13193 } else {
13194 /* Split mac in same band under same wiphy */
13195 ret = ath12k_mac_update_band(ar,
13196 bands[NL80211_BAND_6GHZ],
13197 band);
13198 if (ret) {
13199 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13200 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13201 kfree(channels);
13202 band->channels = NULL;
13203 return ret;
13204 }
13205 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
13206 ar->pdev->pdev_id,
13207 KHZ_TO_MHZ(ar->freq_range.start_freq),
13208 KHZ_TO_MHZ(ar->freq_range.end_freq));
13209 }
13210 }
13211
13212 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
13213 channels = kmemdup(ath12k_5ghz_channels,
13214 sizeof(ath12k_5ghz_channels),
13215 GFP_KERNEL);
13216 if (!channels) {
13217 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13218 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13219 return -ENOMEM;
13220 }
13221
13222 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
13223 band->band = NL80211_BAND_5GHZ;
13224 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
13225 band->channels = channels;
13226 band->n_bitrates = ath12k_a_rates_size;
13227 band->bitrates = ath12k_a_rates;
13228
13229 if (ab->hw_params->single_pdev_only) {
13230 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
13231 reg_cap = &ab->hal_reg_cap[phy_id];
13232 }
13233
13234 freq_low = max(reg_cap->low_5ghz_chan,
13235 ab->reg_freq_5ghz.start_freq);
13236 freq_high = min(reg_cap->high_5ghz_chan,
13237 ab->reg_freq_5ghz.end_freq);
13238
13239 ath12k_mac_update_ch_list(ar, band,
13240 reg_cap->low_5ghz_chan,
13241 reg_cap->high_5ghz_chan);
13242
13243 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13244
13245 if (!bands[NL80211_BAND_5GHZ]) {
13246 bands[NL80211_BAND_5GHZ] = band;
13247 } else {
13248 /* Split mac in same band under same wiphy */
13249 ret = ath12k_mac_update_band(ar,
13250 bands[NL80211_BAND_5GHZ],
13251 band);
13252 if (ret) {
13253 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13254 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13255 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13256 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13257 kfree(channels);
13258 band->channels = NULL;
13259 return ret;
13260 }
13261 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
13262 ar->pdev->pdev_id,
13263 KHZ_TO_MHZ(ar->freq_range.start_freq),
13264 KHZ_TO_MHZ(ar->freq_range.end_freq));
13265 }
13266 }
13267 }
13268
13269 return 0;
13270 }
13271
ath12k_mac_get_ifmodes(struct ath12k_hw * ah)13272 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
13273 {
13274 struct ath12k *ar;
13275 int i;
13276 u16 interface_modes = U16_MAX;
13277
13278 for_each_ar(ah, ar, i)
13279 interface_modes &= ar->ab->hw_params->interface_modes;
13280
13281 return interface_modes == U16_MAX ? 0 : interface_modes;
13282 }
13283
ath12k_mac_is_iface_mode_enable(struct ath12k_hw * ah,enum nl80211_iftype type)13284 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
13285 enum nl80211_iftype type)
13286 {
13287 struct ath12k *ar;
13288 int i;
13289 u16 interface_modes, mode = 0;
13290 bool is_enable = false;
13291
13292 if (type == NL80211_IFTYPE_MESH_POINT) {
13293 if (IS_ENABLED(CONFIG_MAC80211_MESH))
13294 mode = BIT(type);
13295 } else {
13296 mode = BIT(type);
13297 }
13298
13299 for_each_ar(ah, ar, i) {
13300 interface_modes = ar->ab->hw_params->interface_modes;
13301 if (interface_modes & mode) {
13302 is_enable = true;
13303 break;
13304 }
13305 }
13306
13307 return is_enable;
13308 }
13309
13310 static int
ath12k_mac_setup_radio_iface_comb(struct ath12k * ar,struct ieee80211_iface_combination * comb)13311 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar,
13312 struct ieee80211_iface_combination *comb)
13313 {
13314 u16 interface_modes = ar->ab->hw_params->interface_modes;
13315 struct ieee80211_iface_limit *limits;
13316 int n_limits, max_interfaces;
13317 bool ap, mesh, p2p;
13318
13319 ap = interface_modes & BIT(NL80211_IFTYPE_AP);
13320 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
13321
13322 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
13323 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT));
13324
13325 if ((ap || mesh) && !p2p) {
13326 n_limits = 2;
13327 max_interfaces = 16;
13328 } else if (p2p) {
13329 n_limits = 3;
13330 if (ap || mesh)
13331 max_interfaces = 16;
13332 else
13333 max_interfaces = 3;
13334 } else {
13335 n_limits = 1;
13336 max_interfaces = 1;
13337 }
13338
13339 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13340 if (!limits)
13341 return -ENOMEM;
13342
13343 limits[0].max = 1;
13344 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
13345
13346 if (ap || mesh || p2p)
13347 limits[1].max = max_interfaces;
13348
13349 if (ap)
13350 limits[1].types |= BIT(NL80211_IFTYPE_AP);
13351
13352 if (mesh)
13353 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
13354
13355 if (p2p) {
13356 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
13357 BIT(NL80211_IFTYPE_P2P_GO);
13358 limits[2].max = 1;
13359 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
13360 }
13361
13362 comb[0].limits = limits;
13363 comb[0].n_limits = n_limits;
13364 comb[0].max_interfaces = max_interfaces;
13365 comb[0].beacon_int_infra_match = true;
13366 comb[0].beacon_int_min_gcd = 100;
13367
13368 comb[0].num_different_channels = 1;
13369 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
13370 BIT(NL80211_CHAN_WIDTH_20) |
13371 BIT(NL80211_CHAN_WIDTH_40) |
13372 BIT(NL80211_CHAN_WIDTH_80) |
13373 BIT(NL80211_CHAN_WIDTH_160);
13374
13375 return 0;
13376 }
13377
13378 static int
ath12k_mac_setup_global_iface_comb(struct ath12k_hw * ah,struct wiphy_radio * radio,u8 n_radio,struct ieee80211_iface_combination * comb)13379 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah,
13380 struct wiphy_radio *radio,
13381 u8 n_radio,
13382 struct ieee80211_iface_combination *comb)
13383 {
13384 const struct ieee80211_iface_combination *iter_comb;
13385 struct ieee80211_iface_limit *limits;
13386 int i, j, n_limits;
13387 bool ap, mesh, p2p;
13388
13389 if (!n_radio)
13390 return 0;
13391
13392 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
13393 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
13394 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
13395
13396 if ((ap || mesh) && !p2p)
13397 n_limits = 2;
13398 else if (p2p)
13399 n_limits = 3;
13400 else
13401 n_limits = 1;
13402
13403 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13404 if (!limits)
13405 return -ENOMEM;
13406
13407 for (i = 0; i < n_radio; i++) {
13408 iter_comb = radio[i].iface_combinations;
13409 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) {
13410 limits[j].types |= iter_comb->limits[j].types;
13411 limits[j].max += iter_comb->limits[j].max;
13412 }
13413
13414 comb->max_interfaces += iter_comb->max_interfaces;
13415 comb->num_different_channels += iter_comb->num_different_channels;
13416 comb->radar_detect_widths |= iter_comb->radar_detect_widths;
13417 }
13418
13419 comb->limits = limits;
13420 comb->n_limits = n_limits;
13421 comb->beacon_int_infra_match = true;
13422 comb->beacon_int_min_gcd = 100;
13423
13424 return 0;
13425 }
13426
13427 static
ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination * iface_comb)13428 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb)
13429 {
13430 kfree(iface_comb[0].limits);
13431 kfree(iface_comb);
13432 }
13433
ath12k_mac_cleanup_iface_combinations(struct ath12k_hw * ah)13434 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah)
13435 {
13436 struct wiphy *wiphy = ah->hw->wiphy;
13437 const struct wiphy_radio *radio;
13438 int i;
13439
13440 if (wiphy->n_radio > 0) {
13441 radio = wiphy->radio;
13442 for (i = 0; i < wiphy->n_radio; i++)
13443 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13444
13445 kfree(wiphy->radio);
13446 }
13447
13448 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations);
13449 }
13450
ath12k_mac_setup_iface_combinations(struct ath12k_hw * ah)13451 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
13452 {
13453 struct ieee80211_iface_combination *combinations, *comb;
13454 struct wiphy *wiphy = ah->hw->wiphy;
13455 struct wiphy_radio *radio;
13456 int n_combinations = 1;
13457 struct ath12k *ar;
13458 int i, ret;
13459
13460 if (ah->num_radio == 1) {
13461 ar = &ah->radio[0];
13462
13463 if (ar->ab->hw_params->single_pdev_only)
13464 n_combinations = 2;
13465
13466 combinations = kcalloc(n_combinations, sizeof(*combinations),
13467 GFP_KERNEL);
13468 if (!combinations)
13469 return -ENOMEM;
13470
13471 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations);
13472 if (ret) {
13473 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d",
13474 ret);
13475 goto err_free_combinations;
13476 }
13477
13478 if (ar->ab->hw_params->single_pdev_only) {
13479 comb = combinations + 1;
13480 memcpy(comb, combinations, sizeof(*comb));
13481 comb->num_different_channels = 2;
13482 comb->radar_detect_widths = 0;
13483 }
13484
13485 goto out;
13486 }
13487
13488 combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL);
13489 if (!combinations)
13490 return -ENOMEM;
13491
13492 /* there are multiple radios */
13493
13494 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL);
13495 if (!radio) {
13496 ret = -ENOMEM;
13497 goto err_free_combinations;
13498 }
13499
13500 for_each_ar(ah, ar, i) {
13501 comb = kzalloc(sizeof(*comb), GFP_KERNEL);
13502 if (!comb) {
13503 ret = -ENOMEM;
13504 goto err_free_radios;
13505 }
13506
13507 ret = ath12k_mac_setup_radio_iface_comb(ar, comb);
13508 if (ret) {
13509 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d",
13510 i, ret);
13511 kfree(comb);
13512 goto err_free_radios;
13513 }
13514
13515 radio[i].freq_range = &ar->freq_range;
13516 radio[i].n_freq_range = 1;
13517
13518 radio[i].iface_combinations = comb;
13519 radio[i].n_iface_combinations = 1;
13520 }
13521
13522 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations);
13523 if (ret) {
13524 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d",
13525 ret);
13526 goto err_free_all_radios;
13527 }
13528
13529 wiphy->radio = radio;
13530 wiphy->n_radio = ah->num_radio;
13531
13532 out:
13533 wiphy->iface_combinations = combinations;
13534 wiphy->n_iface_combinations = n_combinations;
13535
13536 return 0;
13537
13538 err_free_all_radios:
13539 i = ah->num_radio;
13540
13541 err_free_radios:
13542 while (i--)
13543 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13544
13545 kfree(radio);
13546
13547 err_free_combinations:
13548 kfree(combinations);
13549
13550 return ret;
13551 }
13552
13553 static const u8 ath12k_if_types_ext_capa[] = {
13554 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13555 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13556 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13557 };
13558
13559 static const u8 ath12k_if_types_ext_capa_sta[] = {
13560 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13561 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13562 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13563 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
13564 };
13565
13566 static const u8 ath12k_if_types_ext_capa_ap[] = {
13567 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13568 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13569 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13570 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
13571 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
13572 };
13573
13574 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
13575 {
13576 .extended_capabilities = ath12k_if_types_ext_capa,
13577 .extended_capabilities_mask = ath12k_if_types_ext_capa,
13578 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
13579 }, {
13580 .iftype = NL80211_IFTYPE_STATION,
13581 .extended_capabilities = ath12k_if_types_ext_capa_sta,
13582 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
13583 .extended_capabilities_len =
13584 sizeof(ath12k_if_types_ext_capa_sta),
13585 }, {
13586 .iftype = NL80211_IFTYPE_AP,
13587 .extended_capabilities = ath12k_if_types_ext_capa_ap,
13588 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
13589 .extended_capabilities_len =
13590 sizeof(ath12k_if_types_ext_capa_ap),
13591 .eml_capabilities = 0,
13592 .mld_capa_and_ops = 0,
13593 },
13594 };
13595
ath12k_mac_cleanup_unregister(struct ath12k * ar)13596 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
13597 {
13598 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
13599 idr_destroy(&ar->txmgmt_idr);
13600
13601 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13602 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
13603 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13604 }
13605
ath12k_mac_hw_unregister(struct ath12k_hw * ah)13606 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
13607 {
13608 struct ieee80211_hw *hw = ah->hw;
13609 struct ath12k *ar;
13610 int i;
13611
13612 for_each_ar(ah, ar, i) {
13613 cancel_work_sync(&ar->regd_channel_update_work);
13614 cancel_work_sync(&ar->regd_update_work);
13615 ath12k_debugfs_unregister(ar);
13616 ath12k_fw_stats_reset(ar);
13617 }
13618
13619 ieee80211_unregister_hw(hw);
13620
13621 for_each_ar(ah, ar, i)
13622 ath12k_mac_cleanup_unregister(ar);
13623
13624 ath12k_mac_cleanup_iface_combinations(ah);
13625
13626 SET_IEEE80211_DEV(hw, NULL);
13627 }
13628
ath12k_mac_setup_register(struct ath12k * ar,u32 * ht_cap,struct ieee80211_supported_band * bands[])13629 static int ath12k_mac_setup_register(struct ath12k *ar,
13630 u32 *ht_cap,
13631 struct ieee80211_supported_band *bands[])
13632 {
13633 struct ath12k_pdev_cap *cap = &ar->pdev->cap;
13634 int ret;
13635
13636 init_waitqueue_head(&ar->txmgmt_empty_waitq);
13637 idr_init(&ar->txmgmt_idr);
13638 spin_lock_init(&ar->txmgmt_idr_lock);
13639
13640 ath12k_pdev_caps_update(ar);
13641
13642 ret = ath12k_mac_setup_channels_rates(ar,
13643 cap->supported_bands,
13644 bands);
13645 if (ret)
13646 return ret;
13647
13648 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
13649 ath12k_mac_setup_sband_iftype_data(ar, cap);
13650
13651 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
13652 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
13653
13654 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR;
13655 ar->rssi_info.temp_offset = 0;
13656 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset;
13657
13658 return 0;
13659 }
13660
ath12k_mac_hw_register(struct ath12k_hw * ah)13661 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
13662 {
13663 struct ieee80211_hw *hw = ah->hw;
13664 struct wiphy *wiphy = hw->wiphy;
13665 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
13666 struct ath12k_base *ab = ar->ab;
13667 struct ath12k_pdev *pdev;
13668 struct ath12k_pdev_cap *cap;
13669 static const u32 cipher_suites[] = {
13670 WLAN_CIPHER_SUITE_TKIP,
13671 WLAN_CIPHER_SUITE_CCMP,
13672 WLAN_CIPHER_SUITE_AES_CMAC,
13673 WLAN_CIPHER_SUITE_BIP_CMAC_256,
13674 WLAN_CIPHER_SUITE_BIP_GMAC_128,
13675 WLAN_CIPHER_SUITE_BIP_GMAC_256,
13676 WLAN_CIPHER_SUITE_GCMP,
13677 WLAN_CIPHER_SUITE_GCMP_256,
13678 WLAN_CIPHER_SUITE_CCMP_256,
13679 };
13680 int ret, i, j;
13681 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0;
13682 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false;
13683 u8 *mac_addr = NULL;
13684 u8 mbssid_max_interfaces = 0;
13685
13686 wiphy->max_ap_assoc_sta = 0;
13687
13688 for_each_ar(ah, ar, i) {
13689 u32 ht_cap_info = 0;
13690
13691 pdev = ar->pdev;
13692 if (ar->ab->pdevs_macaddr_valid) {
13693 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
13694 } else {
13695 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr);
13696 ar->mac_addr[4] += ar->pdev_idx;
13697 }
13698
13699 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands);
13700 if (ret)
13701 goto err_cleanup_unregister;
13702
13703 /* 6 GHz does not support HT Cap, hence do not consider it */
13704 if (!ar->supports_6ghz)
13705 ht_cap &= ht_cap_info;
13706
13707 wiphy->max_ap_assoc_sta += ar->max_num_stations;
13708
13709 /* Advertise the max antenna support of all radios, driver can handle
13710 * per pdev specific antenna setting based on pdev cap when antenna
13711 * changes are made
13712 */
13713 cap = &pdev->cap;
13714
13715 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask);
13716 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask);
13717
13718 if (ar->supports_6ghz)
13719 is_6ghz = true;
13720
13721 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
13722 is_raw_mode = true;
13723
13724 if (!ar->ab->hw_params->supports_monitor)
13725 is_monitor_disable = true;
13726
13727 if (i == 0)
13728 mac_addr = ar->mac_addr;
13729 else
13730 mac_addr = ab->mac_addr;
13731
13732 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab);
13733 }
13734
13735 wiphy->available_antennas_rx = antennas_rx;
13736 wiphy->available_antennas_tx = antennas_tx;
13737
13738 SET_IEEE80211_PERM_ADDR(hw, mac_addr);
13739 SET_IEEE80211_DEV(hw, ab->dev);
13740
13741 ret = ath12k_mac_setup_iface_combinations(ah);
13742 if (ret) {
13743 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
13744 goto err_complete_cleanup_unregister;
13745 }
13746
13747 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
13748
13749 if (ah->num_radio == 1 &&
13750 wiphy->bands[NL80211_BAND_2GHZ] &&
13751 wiphy->bands[NL80211_BAND_5GHZ] &&
13752 wiphy->bands[NL80211_BAND_6GHZ])
13753 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
13754
13755 ieee80211_hw_set(hw, SIGNAL_DBM);
13756 ieee80211_hw_set(hw, SUPPORTS_PS);
13757 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
13758 ieee80211_hw_set(hw, MFP_CAPABLE);
13759 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
13760 ieee80211_hw_set(hw, HAS_RATE_CONTROL);
13761 ieee80211_hw_set(hw, AP_LINK_PS);
13762 ieee80211_hw_set(hw, SPECTRUM_MGMT);
13763 ieee80211_hw_set(hw, CONNECTION_MONITOR);
13764 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
13765 ieee80211_hw_set(hw, CHANCTX_STA_CSA);
13766 ieee80211_hw_set(hw, QUEUE_CONTROL);
13767 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
13768 ieee80211_hw_set(hw, REPORTS_LOW_ACK);
13769 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
13770
13771 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) {
13772 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
13773 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
13774 }
13775
13776 if (cap->nss_ratio_enabled)
13777 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
13778
13779 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
13780 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
13781 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
13782 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
13783 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
13784 ieee80211_hw_set(hw, USES_RSS);
13785 }
13786
13787 wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
13788 wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
13789
13790 /* TODO: Check if HT capability advertised from firmware is different
13791 * for each band for a dual band capable radio. It will be tricky to
13792 * handle it when the ht capability different for each band.
13793 */
13794 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
13795 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz))
13796 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
13797
13798 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
13799 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
13800
13801 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
13802
13803 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
13804 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
13805 wiphy->max_remain_on_channel_duration = 5000;
13806
13807 wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
13808 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
13809 NL80211_FEATURE_AP_SCAN;
13810
13811 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
13812
13813 /* MLO is not yet supported so disable Wireless Extensions for now
13814 * to make sure ath12k users don't use it. This flag can be removed
13815 * once WIPHY_FLAG_SUPPORTS_MLO is enabled.
13816 */
13817 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
13818
13819 /* Copy over MLO related capabilities received from
13820 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set.
13821 */
13822 if (ab->ag->mlo_capable) {
13823 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap;
13824 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap;
13825 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
13826
13827 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX);
13828 }
13829
13830 hw->queues = ATH12K_HW_MAX_QUEUES;
13831 wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
13832 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
13833 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
13834
13835 hw->vif_data_size = sizeof(struct ath12k_vif);
13836 hw->sta_data_size = sizeof(struct ath12k_sta);
13837 hw->extra_tx_headroom = ab->hw_params->iova_mask;
13838
13839 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
13840 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
13841 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
13842
13843 wiphy->cipher_suites = cipher_suites;
13844 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
13845
13846 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
13847 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
13848
13849 wiphy->mbssid_max_interfaces = mbssid_max_interfaces;
13850 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
13851 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
13852
13853 if (is_6ghz) {
13854 wiphy_ext_feature_set(wiphy,
13855 NL80211_EXT_FEATURE_FILS_DISCOVERY);
13856 wiphy_ext_feature_set(wiphy,
13857 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
13858 }
13859
13860 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
13861 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map))
13862 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
13863
13864 ath12k_reg_init(hw);
13865
13866 if (!is_raw_mode) {
13867 hw->netdev_features = NETIF_F_HW_CSUM;
13868 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
13869 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
13870 }
13871
13872 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
13873 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
13874 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
13875 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
13876 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
13877 wiphy->max_sched_scan_plan_interval =
13878 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
13879 wiphy->max_sched_scan_plan_iterations =
13880 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
13881 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
13882 }
13883
13884 ret = ath12k_wow_init(ar);
13885 if (ret) {
13886 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret);
13887 goto err_cleanup_if_combs;
13888 }
13889
13890 /* Boot-time regulatory updates have already been processed.
13891 * Mark them as complete now, because after registration,
13892 * cfg80211 will notify us again if there are any pending hints.
13893 * We need to wait for those hints to be processed, so it's
13894 * important to mark the boot-time updates as complete before
13895 * proceeding with registration.
13896 */
13897 for_each_ar(ah, ar, i)
13898 complete_all(&ar->regd_update_completed);
13899
13900 ret = ieee80211_register_hw(hw);
13901 if (ret) {
13902 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
13903 goto err_cleanup_if_combs;
13904 }
13905
13906 if (is_monitor_disable)
13907 /* There's a race between calling ieee80211_register_hw()
13908 * and here where the monitor mode is enabled for a little
13909 * while. But that time is so short and in practise it make
13910 * a difference in real life.
13911 */
13912 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
13913
13914 for_each_ar(ah, ar, i) {
13915 /* Apply the regd received during initialization */
13916 ret = ath12k_regd_update(ar, true);
13917 if (ret) {
13918 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
13919 goto err_unregister_hw;
13920 }
13921
13922 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
13923 struct wmi_set_current_country_arg current_cc = {};
13924
13925 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2);
13926 memcpy(&ar->alpha2, ab->new_alpha2, 2);
13927
13928 reinit_completion(&ar->regd_update_completed);
13929
13930 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc);
13931 if (ret)
13932 ath12k_warn(ar->ab,
13933 "failed set cc code for mac register: %d\n",
13934 ret);
13935 }
13936
13937 ath12k_fw_stats_init(ar);
13938 ath12k_debugfs_register(ar);
13939 }
13940
13941 return 0;
13942
13943 err_unregister_hw:
13944 for_each_ar(ah, ar, i)
13945 ath12k_debugfs_unregister(ar);
13946
13947 ieee80211_unregister_hw(hw);
13948
13949 err_cleanup_if_combs:
13950 ath12k_mac_cleanup_iface_combinations(ah);
13951
13952 err_complete_cleanup_unregister:
13953 i = ah->num_radio;
13954
13955 err_cleanup_unregister:
13956 for (j = 0; j < i; j++) {
13957 ar = ath12k_ah_to_ar(ah, j);
13958 ath12k_mac_cleanup_unregister(ar);
13959 }
13960
13961 SET_IEEE80211_DEV(hw, NULL);
13962
13963 return ret;
13964 }
13965
ath12k_mac_setup(struct ath12k * ar)13966 static void ath12k_mac_setup(struct ath12k *ar)
13967 {
13968 struct ath12k_base *ab = ar->ab;
13969 struct ath12k_pdev *pdev = ar->pdev;
13970 u8 pdev_idx = ar->pdev_idx;
13971
13972 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
13973
13974 ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
13975 /* FIXME: wmi[0] is already initialized during attach,
13976 * Should we do this again?
13977 */
13978 ath12k_wmi_pdev_attach(ab, pdev_idx);
13979
13980 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
13981 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
13982 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
13983 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
13984 ar->scan.arvif = NULL;
13985 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
13986
13987 spin_lock_init(&ar->data_lock);
13988 INIT_LIST_HEAD(&ar->arvifs);
13989 INIT_LIST_HEAD(&ar->ppdu_stats_info);
13990
13991 init_completion(&ar->vdev_setup_done);
13992 init_completion(&ar->vdev_delete_done);
13993 init_completion(&ar->peer_assoc_done);
13994 init_completion(&ar->peer_delete_done);
13995 init_completion(&ar->install_key_done);
13996 init_completion(&ar->bss_survey_done);
13997 init_completion(&ar->scan.started);
13998 init_completion(&ar->scan.completed);
13999 init_completion(&ar->scan.on_channel);
14000 init_completion(&ar->mlo_setup_done);
14001 init_completion(&ar->completed_11d_scan);
14002 init_completion(&ar->regd_update_completed);
14003
14004 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
14005 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
14006 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work);
14007 INIT_LIST_HEAD(&ar->regd_channel_update_queue);
14008 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
14009
14010 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
14011 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
14012
14013 ar->monitor_vdev_id = -1;
14014 ar->monitor_vdev_created = false;
14015 ar->monitor_started = false;
14016 }
14017
__ath12k_mac_mlo_setup(struct ath12k * ar)14018 static int __ath12k_mac_mlo_setup(struct ath12k *ar)
14019 {
14020 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {};
14021 struct ath12k_base *partner_ab, *ab = ar->ab;
14022 struct ath12k_hw_group *ag = ab->ag;
14023 struct wmi_mlo_setup_arg mlo = {};
14024 struct ath12k_pdev *pdev;
14025 unsigned long time_left;
14026 int i, j, ret;
14027
14028 lockdep_assert_held(&ag->mutex);
14029
14030 reinit_completion(&ar->mlo_setup_done);
14031
14032 for (i = 0; i < ag->num_devices; i++) {
14033 partner_ab = ag->ab[i];
14034
14035 for (j = 0; j < partner_ab->num_radios; j++) {
14036 pdev = &partner_ab->pdevs[j];
14037
14038 /* Avoid the self link */
14039 if (ar == pdev->ar)
14040 continue;
14041
14042 partner_link_id[num_link] = pdev->hw_link_id;
14043 num_link++;
14044
14045 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n",
14046 i, j, pdev->hw_link_id, num_link);
14047 }
14048 }
14049
14050 if (num_link == 0)
14051 return 0;
14052
14053 mlo.group_id = cpu_to_le32(ag->id);
14054 mlo.partner_link_id = partner_link_id;
14055 mlo.num_partner_links = num_link;
14056 ar->mlo_setup_status = 0;
14057
14058 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link);
14059
14060 ret = ath12k_wmi_mlo_setup(ar, &mlo);
14061 if (ret) {
14062 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n",
14063 ar->pdev_idx, ret);
14064 return ret;
14065 }
14066
14067 time_left = wait_for_completion_timeout(&ar->mlo_setup_done,
14068 WMI_MLO_CMD_TIMEOUT_HZ);
14069
14070 if (!time_left || ar->mlo_setup_status)
14071 return ar->mlo_setup_status ? : -ETIMEDOUT;
14072
14073 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx);
14074
14075 return 0;
14076 }
14077
__ath12k_mac_mlo_teardown(struct ath12k * ar)14078 static int __ath12k_mac_mlo_teardown(struct ath12k *ar)
14079 {
14080 struct ath12k_base *ab = ar->ab;
14081 int ret;
14082 u8 num_link;
14083
14084 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
14085 return 0;
14086
14087 num_link = ath12k_get_num_partner_link(ar);
14088
14089 if (num_link == 0)
14090 return 0;
14091
14092 ret = ath12k_wmi_mlo_teardown(ar);
14093 if (ret) {
14094 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n",
14095 ar->pdev_idx, ret);
14096 return ret;
14097 }
14098
14099 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx);
14100
14101 return 0;
14102 }
14103
ath12k_mac_mlo_setup(struct ath12k_hw_group * ag)14104 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag)
14105 {
14106 struct ath12k_hw *ah;
14107 struct ath12k *ar;
14108 int ret;
14109 int i, j;
14110
14111 for (i = 0; i < ag->num_hw; i++) {
14112 ah = ag->ah[i];
14113 if (!ah)
14114 continue;
14115
14116 for_each_ar(ah, ar, j) {
14117 ar = &ah->radio[j];
14118 ret = __ath12k_mac_mlo_setup(ar);
14119 if (ret) {
14120 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret);
14121 goto err_setup;
14122 }
14123 }
14124 }
14125
14126 return 0;
14127
14128 err_setup:
14129 for (i = i - 1; i >= 0; i--) {
14130 ah = ag->ah[i];
14131 if (!ah)
14132 continue;
14133
14134 for (j = j - 1; j >= 0; j--) {
14135 ar = &ah->radio[j];
14136 if (!ar)
14137 continue;
14138
14139 __ath12k_mac_mlo_teardown(ar);
14140 }
14141 }
14142
14143 return ret;
14144 }
14145
ath12k_mac_mlo_teardown(struct ath12k_hw_group * ag)14146 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag)
14147 {
14148 struct ath12k_hw *ah;
14149 struct ath12k *ar;
14150 int ret, i, j;
14151
14152 for (i = 0; i < ag->num_hw; i++) {
14153 ah = ag->ah[i];
14154 if (!ah)
14155 continue;
14156
14157 for_each_ar(ah, ar, j) {
14158 ar = &ah->radio[j];
14159 ret = __ath12k_mac_mlo_teardown(ar);
14160 if (ret) {
14161 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret);
14162 break;
14163 }
14164 }
14165 }
14166 }
14167
ath12k_mac_register(struct ath12k_hw_group * ag)14168 int ath12k_mac_register(struct ath12k_hw_group *ag)
14169 {
14170 struct ath12k_hw *ah;
14171 int i;
14172 int ret;
14173
14174 for (i = 0; i < ag->num_hw; i++) {
14175 ah = ath12k_ag_to_ah(ag, i);
14176
14177 ret = ath12k_mac_hw_register(ah);
14178 if (ret)
14179 goto err;
14180 }
14181
14182 return 0;
14183
14184 err:
14185 for (i = i - 1; i >= 0; i--) {
14186 ah = ath12k_ag_to_ah(ag, i);
14187 if (!ah)
14188 continue;
14189
14190 ath12k_mac_hw_unregister(ah);
14191 }
14192
14193 return ret;
14194 }
14195
ath12k_mac_unregister(struct ath12k_hw_group * ag)14196 void ath12k_mac_unregister(struct ath12k_hw_group *ag)
14197 {
14198 struct ath12k_hw *ah;
14199 int i;
14200
14201 for (i = ag->num_hw - 1; i >= 0; i--) {
14202 ah = ath12k_ag_to_ah(ag, i);
14203 if (!ah)
14204 continue;
14205
14206 ath12k_mac_hw_unregister(ah);
14207 }
14208 }
14209
ath12k_mac_hw_destroy(struct ath12k_hw * ah)14210 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
14211 {
14212 ieee80211_free_hw(ah->hw);
14213 }
14214
ath12k_mac_hw_allocate(struct ath12k_hw_group * ag,struct ath12k_pdev_map * pdev_map,u8 num_pdev_map)14215 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag,
14216 struct ath12k_pdev_map *pdev_map,
14217 u8 num_pdev_map)
14218 {
14219 struct ieee80211_hw *hw;
14220 struct ath12k *ar;
14221 struct ath12k_base *ab;
14222 struct ath12k_pdev *pdev;
14223 struct ath12k_hw *ah;
14224 int i;
14225 u8 pdev_idx;
14226
14227 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
14228 &ath12k_ops);
14229 if (!hw)
14230 return NULL;
14231
14232 ah = ath12k_hw_to_ah(hw);
14233 ah->hw = hw;
14234 ah->num_radio = num_pdev_map;
14235
14236 mutex_init(&ah->hw_mutex);
14237 INIT_LIST_HEAD(&ah->ml_peers);
14238
14239 for (i = 0; i < num_pdev_map; i++) {
14240 ab = pdev_map[i].ab;
14241 pdev_idx = pdev_map[i].pdev_idx;
14242 pdev = &ab->pdevs[pdev_idx];
14243
14244 ar = ath12k_ah_to_ar(ah, i);
14245 ar->ah = ah;
14246 ar->ab = ab;
14247 ar->hw_link_id = pdev->hw_link_id;
14248 ar->pdev = pdev;
14249 ar->pdev_idx = pdev_idx;
14250 pdev->ar = ar;
14251
14252 ag->hw_links[ar->hw_link_id].device_id = ab->device_id;
14253 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx;
14254
14255 ath12k_mac_setup(ar);
14256 ath12k_dp_pdev_pre_alloc(ar);
14257 }
14258
14259 return ah;
14260 }
14261
ath12k_mac_destroy(struct ath12k_hw_group * ag)14262 void ath12k_mac_destroy(struct ath12k_hw_group *ag)
14263 {
14264 struct ath12k_pdev *pdev;
14265 struct ath12k_base *ab = ag->ab[0];
14266 int i, j;
14267 struct ath12k_hw *ah;
14268
14269 for (i = 0; i < ag->num_devices; i++) {
14270 ab = ag->ab[i];
14271 if (!ab)
14272 continue;
14273
14274 for (j = 0; j < ab->num_radios; j++) {
14275 pdev = &ab->pdevs[j];
14276 if (!pdev->ar)
14277 continue;
14278 pdev->ar = NULL;
14279 }
14280 }
14281
14282 for (i = 0; i < ag->num_hw; i++) {
14283 ah = ath12k_ag_to_ah(ag, i);
14284 if (!ah)
14285 continue;
14286
14287 ath12k_mac_hw_destroy(ah);
14288 ath12k_ag_set_ah(ag, i, NULL);
14289 }
14290 }
14291
ath12k_mac_set_device_defaults(struct ath12k_base * ab)14292 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab)
14293 {
14294 int total_vdev;
14295
14296 /* Initialize channel counters frequency value in hertz */
14297 ab->cc_freq_hz = 320000;
14298 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab);
14299 ab->free_vdev_map = (1LL << total_vdev) - 1;
14300 }
14301
ath12k_mac_allocate(struct ath12k_hw_group * ag)14302 int ath12k_mac_allocate(struct ath12k_hw_group *ag)
14303 {
14304 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO];
14305 int mac_id, device_id, total_radio, num_hw;
14306 struct ath12k_base *ab;
14307 struct ath12k_hw *ah;
14308 int ret, i, j;
14309 u8 radio_per_hw;
14310
14311 total_radio = 0;
14312 for (i = 0; i < ag->num_devices; i++) {
14313 ab = ag->ab[i];
14314 if (!ab)
14315 continue;
14316
14317 ath12k_debugfs_pdev_create(ab);
14318 ath12k_mac_set_device_defaults(ab);
14319 total_radio += ab->num_radios;
14320 }
14321
14322 if (!total_radio)
14323 return -EINVAL;
14324
14325 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO))
14326 return -ENOSPC;
14327
14328 /* All pdev get combined and register as single wiphy based on
14329 * hardware group which participate in multi-link operation else
14330 * each pdev get register separately.
14331 */
14332 if (ag->mlo_capable)
14333 radio_per_hw = total_radio;
14334 else
14335 radio_per_hw = 1;
14336
14337 num_hw = total_radio / radio_per_hw;
14338
14339 ag->num_hw = 0;
14340 device_id = 0;
14341 mac_id = 0;
14342 for (i = 0; i < num_hw; i++) {
14343 for (j = 0; j < radio_per_hw; j++) {
14344 if (device_id >= ag->num_devices || !ag->ab[device_id]) {
14345 ret = -ENOSPC;
14346 goto err;
14347 }
14348
14349 ab = ag->ab[device_id];
14350 pdev_map[j].ab = ab;
14351 pdev_map[j].pdev_idx = mac_id;
14352 mac_id++;
14353
14354 /* If mac_id falls beyond the current device MACs then
14355 * move to next device
14356 */
14357 if (mac_id >= ab->num_radios) {
14358 mac_id = 0;
14359 device_id++;
14360 }
14361 }
14362
14363 ab = pdev_map->ab;
14364
14365 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw);
14366 if (!ah) {
14367 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
14368 i);
14369 ret = -ENOMEM;
14370 goto err;
14371 }
14372
14373 ah->dev = ab->dev;
14374
14375 ag->ah[i] = ah;
14376 ag->num_hw++;
14377 }
14378
14379 return 0;
14380
14381 err:
14382 for (i = i - 1; i >= 0; i--) {
14383 ah = ath12k_ag_to_ah(ag, i);
14384 if (!ah)
14385 continue;
14386
14387 ath12k_mac_hw_destroy(ah);
14388 ath12k_ag_set_ah(ag, i, NULL);
14389 }
14390
14391 return ret;
14392 }
14393
ath12k_mac_vif_set_keepalive(struct ath12k_link_vif * arvif,enum wmi_sta_keepalive_method method,u32 interval)14394 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif,
14395 enum wmi_sta_keepalive_method method,
14396 u32 interval)
14397 {
14398 struct wmi_sta_keepalive_arg arg = {};
14399 struct ath12k *ar = arvif->ar;
14400 int ret;
14401
14402 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
14403
14404 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
14405 return 0;
14406
14407 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
14408 return 0;
14409
14410 arg.vdev_id = arvif->vdev_id;
14411 arg.enabled = 1;
14412 arg.method = method;
14413 arg.interval = interval;
14414
14415 ret = ath12k_wmi_sta_keepalive(ar, &arg);
14416 if (ret) {
14417 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
14418 arvif->vdev_id, ret);
14419 return ret;
14420 }
14421
14422 return 0;
14423 }
14424