1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5 */
6
7 #include <net/mac80211.h>
8 #include <net/cfg80211.h>
9 #include <linux/etherdevice.h>
10
11 #include "mac.h"
12 #include "core.h"
13 #include "debug.h"
14 #include "wmi.h"
15 #include "hw.h"
16 #include "dp_tx.h"
17 #include "dp_rx.h"
18 #include "testmode.h"
19 #include "peer.h"
20 #include "debugfs.h"
21 #include "hif.h"
22 #include "wow.h"
23 #include "debugfs_sta.h"
24
25 #define CHAN2G(_channel, _freq, _flags) { \
26 .band = NL80211_BAND_2GHZ, \
27 .hw_value = (_channel), \
28 .center_freq = (_freq), \
29 .flags = (_flags), \
30 .max_antenna_gain = 0, \
31 .max_power = 30, \
32 }
33
34 #define CHAN5G(_channel, _freq, _flags) { \
35 .band = NL80211_BAND_5GHZ, \
36 .hw_value = (_channel), \
37 .center_freq = (_freq), \
38 .flags = (_flags), \
39 .max_antenna_gain = 0, \
40 .max_power = 30, \
41 }
42
43 #define CHAN6G(_channel, _freq, _flags) { \
44 .band = NL80211_BAND_6GHZ, \
45 .hw_value = (_channel), \
46 .center_freq = (_freq), \
47 .flags = (_flags), \
48 .max_antenna_gain = 0, \
49 .max_power = 30, \
50 }
51
52 static const struct ieee80211_channel ath12k_2ghz_channels[] = {
53 CHAN2G(1, 2412, 0),
54 CHAN2G(2, 2417, 0),
55 CHAN2G(3, 2422, 0),
56 CHAN2G(4, 2427, 0),
57 CHAN2G(5, 2432, 0),
58 CHAN2G(6, 2437, 0),
59 CHAN2G(7, 2442, 0),
60 CHAN2G(8, 2447, 0),
61 CHAN2G(9, 2452, 0),
62 CHAN2G(10, 2457, 0),
63 CHAN2G(11, 2462, 0),
64 CHAN2G(12, 2467, 0),
65 CHAN2G(13, 2472, 0),
66 CHAN2G(14, 2484, 0),
67 };
68
69 static const struct ieee80211_channel ath12k_5ghz_channels[] = {
70 CHAN5G(36, 5180, 0),
71 CHAN5G(40, 5200, 0),
72 CHAN5G(44, 5220, 0),
73 CHAN5G(48, 5240, 0),
74 CHAN5G(52, 5260, 0),
75 CHAN5G(56, 5280, 0),
76 CHAN5G(60, 5300, 0),
77 CHAN5G(64, 5320, 0),
78 CHAN5G(100, 5500, 0),
79 CHAN5G(104, 5520, 0),
80 CHAN5G(108, 5540, 0),
81 CHAN5G(112, 5560, 0),
82 CHAN5G(116, 5580, 0),
83 CHAN5G(120, 5600, 0),
84 CHAN5G(124, 5620, 0),
85 CHAN5G(128, 5640, 0),
86 CHAN5G(132, 5660, 0),
87 CHAN5G(136, 5680, 0),
88 CHAN5G(140, 5700, 0),
89 CHAN5G(144, 5720, 0),
90 CHAN5G(149, 5745, 0),
91 CHAN5G(153, 5765, 0),
92 CHAN5G(157, 5785, 0),
93 CHAN5G(161, 5805, 0),
94 CHAN5G(165, 5825, 0),
95 CHAN5G(169, 5845, 0),
96 CHAN5G(173, 5865, 0),
97 };
98
99 static const struct ieee80211_channel ath12k_6ghz_channels[] = {
100 /* Operating Class 136 */
101 CHAN6G(2, 5935, 0),
102
103 /* Operating Classes 131-135 */
104 CHAN6G(1, 5955, 0),
105 CHAN6G(5, 5975, 0),
106 CHAN6G(9, 5995, 0),
107 CHAN6G(13, 6015, 0),
108 CHAN6G(17, 6035, 0),
109 CHAN6G(21, 6055, 0),
110 CHAN6G(25, 6075, 0),
111 CHAN6G(29, 6095, 0),
112 CHAN6G(33, 6115, 0),
113 CHAN6G(37, 6135, 0),
114 CHAN6G(41, 6155, 0),
115 CHAN6G(45, 6175, 0),
116 CHAN6G(49, 6195, 0),
117 CHAN6G(53, 6215, 0),
118 CHAN6G(57, 6235, 0),
119 CHAN6G(61, 6255, 0),
120 CHAN6G(65, 6275, 0),
121 CHAN6G(69, 6295, 0),
122 CHAN6G(73, 6315, 0),
123 CHAN6G(77, 6335, 0),
124 CHAN6G(81, 6355, 0),
125 CHAN6G(85, 6375, 0),
126 CHAN6G(89, 6395, 0),
127 CHAN6G(93, 6415, 0),
128 CHAN6G(97, 6435, 0),
129 CHAN6G(101, 6455, 0),
130 CHAN6G(105, 6475, 0),
131 CHAN6G(109, 6495, 0),
132 CHAN6G(113, 6515, 0),
133 CHAN6G(117, 6535, 0),
134 CHAN6G(121, 6555, 0),
135 CHAN6G(125, 6575, 0),
136 CHAN6G(129, 6595, 0),
137 CHAN6G(133, 6615, 0),
138 CHAN6G(137, 6635, 0),
139 CHAN6G(141, 6655, 0),
140 CHAN6G(145, 6675, 0),
141 CHAN6G(149, 6695, 0),
142 CHAN6G(153, 6715, 0),
143 CHAN6G(157, 6735, 0),
144 CHAN6G(161, 6755, 0),
145 CHAN6G(165, 6775, 0),
146 CHAN6G(169, 6795, 0),
147 CHAN6G(173, 6815, 0),
148 CHAN6G(177, 6835, 0),
149 CHAN6G(181, 6855, 0),
150 CHAN6G(185, 6875, 0),
151 CHAN6G(189, 6895, 0),
152 CHAN6G(193, 6915, 0),
153 CHAN6G(197, 6935, 0),
154 CHAN6G(201, 6955, 0),
155 CHAN6G(205, 6975, 0),
156 CHAN6G(209, 6995, 0),
157 CHAN6G(213, 7015, 0),
158 CHAN6G(217, 7035, 0),
159 CHAN6G(221, 7055, 0),
160 CHAN6G(225, 7075, 0),
161 CHAN6G(229, 7095, 0),
162 CHAN6G(233, 7115, 0),
163 };
164
165 static struct ieee80211_rate ath12k_legacy_rates[] = {
166 { .bitrate = 10,
167 .hw_value = ATH12K_HW_RATE_CCK_LP_1M },
168 { .bitrate = 20,
169 .hw_value = ATH12K_HW_RATE_CCK_LP_2M,
170 .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
171 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
172 { .bitrate = 55,
173 .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
174 .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
175 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
176 { .bitrate = 110,
177 .hw_value = ATH12K_HW_RATE_CCK_LP_11M,
178 .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
179 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
180
181 { .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
182 { .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
183 { .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
184 { .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
185 { .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
186 { .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
187 { .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
188 { .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
189 };
190
191 static const int
192 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
193 [NL80211_BAND_2GHZ] = {
194 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
197 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
198 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
199 [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
200 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
201 [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
202 [NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
203 },
204 [NL80211_BAND_5GHZ] = {
205 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
208 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
209 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
210 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
211 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
212 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
213 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
214 },
215 [NL80211_BAND_6GHZ] = {
216 [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
217 [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
218 [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
219 [NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
220 [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
221 [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
222 [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
223 [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
224 [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
225 },
226
227 };
228
229 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
230 .rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
231 HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
232 HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE |
233 HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO,
234 .pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
235 .pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
236 .pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
237 .pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
238 HTT_RX_FP_CTRL_FILTER_FLASG3
239 };
240
241 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
242 #define ath12k_g_rates ath12k_legacy_rates
243 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
244 #define ath12k_a_rates (ath12k_legacy_rates + 4)
245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
246
247 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
248
249 static const u32 ath12k_smps_map[] = {
250 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
251 [WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
252 [WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
253 [WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
254 };
255
256 static int ath12k_start_vdev_delay(struct ath12k *ar,
257 struct ath12k_link_vif *arvif);
258 static void ath12k_mac_stop(struct ath12k *ar);
259 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif);
260 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif);
261
ath12k_mac_phymode_str(enum wmi_phy_mode mode)262 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
263 {
264 switch (mode) {
265 case MODE_11A:
266 return "11a";
267 case MODE_11G:
268 return "11g";
269 case MODE_11B:
270 return "11b";
271 case MODE_11GONLY:
272 return "11gonly";
273 case MODE_11NA_HT20:
274 return "11na-ht20";
275 case MODE_11NG_HT20:
276 return "11ng-ht20";
277 case MODE_11NA_HT40:
278 return "11na-ht40";
279 case MODE_11NG_HT40:
280 return "11ng-ht40";
281 case MODE_11AC_VHT20:
282 return "11ac-vht20";
283 case MODE_11AC_VHT40:
284 return "11ac-vht40";
285 case MODE_11AC_VHT80:
286 return "11ac-vht80";
287 case MODE_11AC_VHT160:
288 return "11ac-vht160";
289 case MODE_11AC_VHT80_80:
290 return "11ac-vht80+80";
291 case MODE_11AC_VHT20_2G:
292 return "11ac-vht20-2g";
293 case MODE_11AC_VHT40_2G:
294 return "11ac-vht40-2g";
295 case MODE_11AC_VHT80_2G:
296 return "11ac-vht80-2g";
297 case MODE_11AX_HE20:
298 return "11ax-he20";
299 case MODE_11AX_HE40:
300 return "11ax-he40";
301 case MODE_11AX_HE80:
302 return "11ax-he80";
303 case MODE_11AX_HE80_80:
304 return "11ax-he80+80";
305 case MODE_11AX_HE160:
306 return "11ax-he160";
307 case MODE_11AX_HE20_2G:
308 return "11ax-he20-2g";
309 case MODE_11AX_HE40_2G:
310 return "11ax-he40-2g";
311 case MODE_11AX_HE80_2G:
312 return "11ax-he80-2g";
313 case MODE_11BE_EHT20:
314 return "11be-eht20";
315 case MODE_11BE_EHT40:
316 return "11be-eht40";
317 case MODE_11BE_EHT80:
318 return "11be-eht80";
319 case MODE_11BE_EHT80_80:
320 return "11be-eht80+80";
321 case MODE_11BE_EHT160:
322 return "11be-eht160";
323 case MODE_11BE_EHT160_160:
324 return "11be-eht160+160";
325 case MODE_11BE_EHT320:
326 return "11be-eht320";
327 case MODE_11BE_EHT20_2G:
328 return "11be-eht20-2g";
329 case MODE_11BE_EHT40_2G:
330 return "11be-eht40-2g";
331 case MODE_UNKNOWN:
332 /* skip */
333 break;
334
335 /* no default handler to allow compiler to check that the
336 * enum is fully handled
337 */
338 }
339
340 return "<unknown>";
341 }
342
ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)343 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)
344 {
345 switch (tones) {
346 case 26:
347 return RU_26;
348 case 52:
349 return RU_52;
350 case 106:
351 return RU_106;
352 case 242:
353 return RU_242;
354 case 484:
355 return RU_484;
356 case 996:
357 return RU_996;
358 case (996 * 2):
359 return RU_2X996;
360 default:
361 return RU_26;
362 }
363 }
364
ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)365 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)
366 {
367 switch (sgi) {
368 case RX_MSDU_START_SGI_0_8_US:
369 return NL80211_RATE_INFO_EHT_GI_0_8;
370 case RX_MSDU_START_SGI_1_6_US:
371 return NL80211_RATE_INFO_EHT_GI_1_6;
372 case RX_MSDU_START_SGI_3_2_US:
373 return NL80211_RATE_INFO_EHT_GI_3_2;
374 default:
375 return NL80211_RATE_INFO_EHT_GI_0_8;
376 }
377 }
378
ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)379 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)
380 {
381 switch (ru_tones) {
382 case 26:
383 return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
384 case 52:
385 return NL80211_RATE_INFO_EHT_RU_ALLOC_52;
386 case (52 + 26):
387 return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26;
388 case 106:
389 return NL80211_RATE_INFO_EHT_RU_ALLOC_106;
390 case (106 + 26):
391 return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26;
392 case 242:
393 return NL80211_RATE_INFO_EHT_RU_ALLOC_242;
394 case 484:
395 return NL80211_RATE_INFO_EHT_RU_ALLOC_484;
396 case (484 + 242):
397 return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242;
398 case 996:
399 return NL80211_RATE_INFO_EHT_RU_ALLOC_996;
400 case (996 + 484):
401 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484;
402 case (996 + 484 + 242):
403 return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242;
404 case (2 * 996):
405 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996;
406 case (2 * 996 + 484):
407 return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484;
408 case (3 * 996):
409 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996;
410 case (3 * 996 + 484):
411 return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484;
412 case (4 * 996):
413 return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996;
414 default:
415 return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
416 }
417 }
418
419 enum rate_info_bw
ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)420 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
421 {
422 u8 ret = RATE_INFO_BW_20;
423
424 switch (bw) {
425 case ATH12K_BW_20:
426 ret = RATE_INFO_BW_20;
427 break;
428 case ATH12K_BW_40:
429 ret = RATE_INFO_BW_40;
430 break;
431 case ATH12K_BW_80:
432 ret = RATE_INFO_BW_80;
433 break;
434 case ATH12K_BW_160:
435 ret = RATE_INFO_BW_160;
436 break;
437 case ATH12K_BW_320:
438 ret = RATE_INFO_BW_320;
439 break;
440 }
441
442 return ret;
443 }
444
ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)445 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
446 {
447 switch (bw) {
448 case RATE_INFO_BW_20:
449 return ATH12K_BW_20;
450 case RATE_INFO_BW_40:
451 return ATH12K_BW_40;
452 case RATE_INFO_BW_80:
453 return ATH12K_BW_80;
454 case RATE_INFO_BW_160:
455 return ATH12K_BW_160;
456 case RATE_INFO_BW_320:
457 return ATH12K_BW_320;
458 default:
459 return ATH12K_BW_20;
460 }
461 }
462
ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc,u8 preamble,u8 * rateidx,u16 * rate)463 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
464 u16 *rate)
465 {
466 /* As default, it is OFDM rates */
467 int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
468 int max_rates_idx = ath12k_g_rates_size;
469
470 if (preamble == WMI_RATE_PREAMBLE_CCK) {
471 hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
472 i = 0;
473 max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
474 }
475
476 while (i < max_rates_idx) {
477 if (hw_rc == ath12k_legacy_rates[i].hw_value) {
478 *rateidx = i;
479 *rate = ath12k_legacy_rates[i].bitrate;
480 return 0;
481 }
482 i++;
483 }
484
485 return -EINVAL;
486 }
487
ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band * sband,u32 bitrate)488 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
489 u32 bitrate)
490 {
491 int i;
492
493 for (i = 0; i < sband->n_bitrates; i++)
494 if (sband->bitrates[i].bitrate == bitrate)
495 return i;
496
497 return 0;
498 }
499
500 static u32
ath12k_mac_max_ht_nss(const u8 * ht_mcs_mask)501 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
502 {
503 int nss;
504
505 for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
506 if (ht_mcs_mask[nss])
507 return nss + 1;
508
509 return 1;
510 }
511
512 static u32
ath12k_mac_max_vht_nss(const u16 * vht_mcs_mask)513 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
514 {
515 int nss;
516
517 for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
518 if (vht_mcs_mask[nss])
519 return nss + 1;
520
521 return 1;
522 }
523
524 static u32
ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])525 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
526 {
527 int nss;
528
529 for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
530 if (he_mcs_mask[nss])
531 return nss + 1;
532
533 return 1;
534 }
535
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(struct ath12k * ar,struct ath12k_link_vif * arvif)1825 void ath12k_mac_handle_beacon_miss(struct ath12k *ar,
1826 struct ath12k_link_vif *arvif)
1827 {
1828 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1829 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1830
1831 if (!(arvif->is_created && arvif->is_up))
1832 return;
1833
1834 ieee80211_beacon_loss(vif);
1835
1836 /* Firmware doesn't report beacon loss events repeatedly. If AP probe
1837 * (done by mac80211) succeeds but beacons do not resume then it
1838 * doesn't make sense to continue operation. Queue connection loss work
1839 * which can be cancelled when beacon is received.
1840 */
1841 ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1842 ATH12K_CONNECTION_LOSS_HZ);
1843 }
1844
ath12k_mac_vif_sta_connection_loss_work(struct work_struct * work)1845 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1846 {
1847 struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif,
1848 connection_loss_work.work);
1849 struct ieee80211_vif *vif = arvif->ahvif->vif;
1850
1851 if (!arvif->is_up)
1852 return;
1853
1854 ieee80211_connection_loss(vif);
1855 }
1856
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)1857 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1858 struct ath12k_link_vif *arvif,
1859 struct ath12k_link_sta *arsta,
1860 struct ath12k_wmi_peer_assoc_arg *arg)
1861 {
1862 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1863 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1864 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1865 struct ieee80211_bss_conf *bss_conf;
1866 u32 aid;
1867
1868 lockdep_assert_wiphy(hw->wiphy);
1869
1870 if (vif->type == NL80211_IFTYPE_STATION)
1871 aid = vif->cfg.aid;
1872 else
1873 aid = sta->aid;
1874
1875 ether_addr_copy(arg->peer_mac, arsta->addr);
1876 arg->vdev_id = arvif->vdev_id;
1877 arg->peer_associd = aid;
1878 arg->auth_flag = true;
1879 /* TODO: STA WAR in ath10k for listen interval required? */
1880 arg->peer_listen_intval = hw->conf.listen_interval;
1881 arg->peer_nss = 1;
1882
1883 bss_conf = ath12k_mac_get_link_bss_conf(arvif);
1884 if (!bss_conf) {
1885 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n",
1886 vif->addr, arvif->link_id);
1887 return;
1888 }
1889
1890 arg->peer_caps = bss_conf->assoc_capability;
1891 }
1892
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)1893 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1894 struct ath12k_link_vif *arvif,
1895 struct ath12k_link_sta *arsta,
1896 struct ath12k_wmi_peer_assoc_arg *arg)
1897 {
1898 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1899 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1900 struct ieee80211_bss_conf *info;
1901 struct cfg80211_chan_def def;
1902 struct cfg80211_bss *bss;
1903 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1904 const u8 *rsnie = NULL;
1905 const u8 *wpaie = NULL;
1906
1907 lockdep_assert_wiphy(hw->wiphy);
1908
1909 info = ath12k_mac_get_link_bss_conf(arvif);
1910 if (!info) {
1911 ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n",
1912 vif->addr, arvif->link_id);
1913 return;
1914 }
1915
1916 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1917 return;
1918
1919 bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1920 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1921
1922 if (arvif->rsnie_present || arvif->wpaie_present) {
1923 arg->need_ptk_4_way = true;
1924 if (arvif->wpaie_present)
1925 arg->need_gtk_2_way = true;
1926 } else if (bss) {
1927 const struct cfg80211_bss_ies *ies;
1928
1929 rcu_read_lock();
1930 rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1931
1932 ies = rcu_dereference(bss->ies);
1933
1934 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1935 WLAN_OUI_TYPE_MICROSOFT_WPA,
1936 ies->data,
1937 ies->len);
1938 rcu_read_unlock();
1939 cfg80211_put_bss(hw->wiphy, bss);
1940 }
1941
1942 /* FIXME: base on RSN IE/WPA IE is a correct idea? */
1943 if (rsnie || wpaie) {
1944 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1945 "%s: rsn ie found\n", __func__);
1946 arg->need_ptk_4_way = true;
1947 }
1948
1949 if (wpaie) {
1950 ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1951 "%s: wpa ie found\n", __func__);
1952 arg->need_gtk_2_way = true;
1953 }
1954
1955 if (sta->mfp) {
1956 /* TODO: Need to check if FW supports PMF? */
1957 arg->is_pmf_enabled = true;
1958 }
1959
1960 /* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1961 }
1962
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)1963 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1964 struct ath12k_link_vif *arvif,
1965 struct ath12k_link_sta *arsta,
1966 struct ath12k_wmi_peer_assoc_arg *arg)
1967 {
1968 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1969 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1970 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1971 struct ieee80211_link_sta *link_sta;
1972 struct cfg80211_chan_def def;
1973 const struct ieee80211_supported_band *sband;
1974 const struct ieee80211_rate *rates;
1975 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1976 enum nl80211_band band;
1977 u32 ratemask;
1978 u8 rate;
1979 int i;
1980
1981 lockdep_assert_wiphy(hw->wiphy);
1982
1983 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1984 return;
1985
1986 link_sta = ath12k_mac_get_link_sta(arsta);
1987 if (!link_sta) {
1988 ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n",
1989 sta->addr, arsta->link_id);
1990 return;
1991 }
1992
1993 band = def.chan->band;
1994 sband = hw->wiphy->bands[band];
1995 ratemask = link_sta->supp_rates[band];
1996 ratemask &= arvif->bitrate_mask.control[band].legacy;
1997 rates = sband->bitrates;
1998
1999 rateset->num_rates = 0;
2000
2001 for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2002 if (!(ratemask & 1))
2003 continue;
2004
2005 rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
2006 rateset->rates[rateset->num_rates] = rate;
2007 rateset->num_rates++;
2008 }
2009 }
2010
2011 static bool
ath12k_peer_assoc_h_ht_masked(const u8 * ht_mcs_mask)2012 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
2013 {
2014 int nss;
2015
2016 for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2017 if (ht_mcs_mask[nss])
2018 return false;
2019
2020 return true;
2021 }
2022
2023 static bool
ath12k_peer_assoc_h_vht_masked(const u16 * vht_mcs_mask)2024 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
2025 {
2026 int nss;
2027
2028 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2029 if (vht_mcs_mask[nss])
2030 return false;
2031
2032 return true;
2033 }
2034
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)2035 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
2036 struct ath12k_link_vif *arvif,
2037 struct ath12k_link_sta *arsta,
2038 struct ath12k_wmi_peer_assoc_arg *arg)
2039 {
2040 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2041 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2042 const struct ieee80211_sta_ht_cap *ht_cap;
2043 struct ieee80211_link_sta *link_sta;
2044 struct cfg80211_chan_def def;
2045 enum nl80211_band band;
2046 const u8 *ht_mcs_mask;
2047 int i, n;
2048 u8 max_nss;
2049 u32 stbc;
2050
2051 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2052
2053 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2054 return;
2055
2056 link_sta = ath12k_mac_get_link_sta(arsta);
2057 if (!link_sta) {
2058 ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n",
2059 sta->addr, arsta->link_id);
2060 return;
2061 }
2062
2063 ht_cap = &link_sta->ht_cap;
2064 if (!ht_cap->ht_supported)
2065 return;
2066
2067 band = def.chan->band;
2068 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2069
2070 if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
2071 return;
2072
2073 arg->ht_flag = true;
2074
2075 arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2076 ht_cap->ampdu_factor)) - 1;
2077
2078 arg->peer_mpdu_density =
2079 ath12k_parse_mpdudensity(ht_cap->ampdu_density);
2080
2081 arg->peer_ht_caps = ht_cap->cap;
2082 arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
2083
2084 if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2085 arg->ldpc_flag = true;
2086
2087 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2088 arg->bw_40 = true;
2089 arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
2090 }
2091
2092 /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20
2093 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both
2094 * flags if guard interval is to force Long GI
2095 */
2096 if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) {
2097 arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40);
2098 } else {
2099 /* Enable SGI flag if either SGI_20 or SGI_40 is supported */
2100 if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40))
2101 arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
2102 }
2103
2104 if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2105 arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
2106 arg->stbc_flag = true;
2107 }
2108
2109 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2110 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2111 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2112 stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
2113 arg->peer_rate_caps |= stbc;
2114 arg->stbc_flag = true;
2115 }
2116
2117 if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2118 arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
2119 else if (ht_cap->mcs.rx_mask[1])
2120 arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
2121
2122 for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2123 if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2124 (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2125 max_nss = (i / 8) + 1;
2126 arg->peer_ht_rates.rates[n++] = i;
2127 }
2128
2129 /* This is a workaround for HT-enabled STAs which break the spec
2130 * and have no HT capabilities RX mask (no HT RX MCS map).
2131 *
2132 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2133 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2134 *
2135 * Firmware asserts if such situation occurs.
2136 */
2137 if (n == 0) {
2138 arg->peer_ht_rates.num_rates = 8;
2139 for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2140 arg->peer_ht_rates.rates[i] = i;
2141 } else {
2142 arg->peer_ht_rates.num_rates = n;
2143 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2144 }
2145
2146 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2147 arg->peer_mac,
2148 arg->peer_ht_rates.num_rates,
2149 arg->peer_nss);
2150 }
2151
ath12k_mac_get_max_vht_mcs_map(u16 mcs_map,int nss)2152 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
2153 {
2154 switch ((mcs_map >> (2 * nss)) & 0x3) {
2155 case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
2156 case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
2157 case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
2158 }
2159 return 0;
2160 }
2161
2162 static u16
ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])2163 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2164 const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2165 {
2166 int idx_limit;
2167 int nss;
2168 u16 mcs_map;
2169 u16 mcs;
2170
2171 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2172 mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2173 vht_mcs_limit[nss];
2174
2175 if (mcs_map)
2176 idx_limit = fls(mcs_map) - 1;
2177 else
2178 idx_limit = -1;
2179
2180 switch (idx_limit) {
2181 case 0:
2182 case 1:
2183 case 2:
2184 case 3:
2185 case 4:
2186 case 5:
2187 case 6:
2188 case 7:
2189 mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2190 break;
2191 case 8:
2192 mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2193 break;
2194 case 9:
2195 mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2196 break;
2197 default:
2198 WARN_ON(1);
2199 fallthrough;
2200 case -1:
2201 mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2202 break;
2203 }
2204
2205 tx_mcs_set &= ~(0x3 << (nss * 2));
2206 tx_mcs_set |= mcs << (nss * 2);
2207 }
2208
2209 return tx_mcs_set;
2210 }
2211
ath12k_get_nss_160mhz(struct ath12k * ar,u8 max_nss)2212 static u8 ath12k_get_nss_160mhz(struct ath12k *ar,
2213 u8 max_nss)
2214 {
2215 u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2216 u8 max_sup_nss = 0;
2217
2218 switch (nss_ratio_info) {
2219 case WMI_NSS_RATIO_1BY2_NSS:
2220 max_sup_nss = max_nss >> 1;
2221 break;
2222 case WMI_NSS_RATIO_3BY4_NSS:
2223 ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2224 break;
2225 case WMI_NSS_RATIO_1_NSS:
2226 max_sup_nss = max_nss;
2227 break;
2228 case WMI_NSS_RATIO_2_NSS:
2229 ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2230 break;
2231 default:
2232 ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n",
2233 nss_ratio_info);
2234 break;
2235 }
2236
2237 return max_sup_nss;
2238 }
2239
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)2240 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
2241 struct ath12k_link_vif *arvif,
2242 struct ath12k_link_sta *arsta,
2243 struct ath12k_wmi_peer_assoc_arg *arg)
2244 {
2245 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2246 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2247 const struct ieee80211_sta_vht_cap *vht_cap;
2248 struct ieee80211_link_sta *link_sta;
2249 struct cfg80211_chan_def def;
2250 enum nl80211_band band;
2251 u16 *vht_mcs_mask;
2252 u16 tx_mcs_map;
2253 u8 ampdu_factor;
2254 u8 max_nss, vht_mcs;
2255 int i, vht_nss, nss_idx;
2256 bool user_rate_valid = true;
2257 u32 rx_nss, tx_nss, nss_160;
2258
2259 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2260
2261 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2262 return;
2263
2264 link_sta = ath12k_mac_get_link_sta(arsta);
2265 if (!link_sta) {
2266 ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n",
2267 sta->addr, arsta->link_id);
2268 return;
2269 }
2270
2271 vht_cap = &link_sta->vht_cap;
2272 if (!vht_cap->vht_supported)
2273 return;
2274
2275 band = def.chan->band;
2276 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2277
2278 if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
2279 return;
2280
2281 arg->vht_flag = true;
2282
2283 /* TODO: similar flags required? */
2284 arg->vht_capable = true;
2285
2286 if (def.chan->band == NL80211_BAND_2GHZ)
2287 arg->vht_ng_flag = true;
2288
2289 arg->peer_vht_caps = vht_cap->cap;
2290
2291 ampdu_factor = (vht_cap->cap &
2292 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2293 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2294
2295 /* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2296 * zero in VHT IE. Using it would result in degraded throughput.
2297 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2298 * it if VHT max_mpdu is smaller.
2299 */
2300 arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2301 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2302 ampdu_factor)) - 1);
2303
2304 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2305 arg->bw_80 = true;
2306
2307 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2308 arg->bw_160 = true;
2309
2310 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
2311
2312 if (vht_nss > link_sta->rx_nss) {
2313 user_rate_valid = false;
2314 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2315 if (vht_mcs_mask[nss_idx]) {
2316 user_rate_valid = true;
2317 break;
2318 }
2319 }
2320 }
2321
2322 if (!user_rate_valid) {
2323 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2324 "Setting vht range MCS value to peer supported nss:%d for peer %pM\n",
2325 link_sta->rx_nss, arsta->addr);
2326 vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2327 }
2328
2329 /* Calculate peer NSS capability from VHT capabilities if STA
2330 * supports VHT.
2331 */
2332 for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2333 vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2334 (2 * i) & 3;
2335
2336 if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2337 vht_mcs_mask[i])
2338 max_nss = i + 1;
2339 }
2340 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2341 arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2342 arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2343 arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2344
2345 tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
2346 arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
2347
2348 /* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
2349 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
2350 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2351 */
2352 arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2353 arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2354
2355 if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2356 IEEE80211_VHT_MCS_NOT_SUPPORTED)
2357 arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2358
2359 /* TODO: Check */
2360 arg->tx_max_mcs_nss = 0xFF;
2361
2362 if (arg->peer_phymode == MODE_11AC_VHT160) {
2363 tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
2364 rx_nss = min(arg->peer_nss, tx_nss);
2365 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2366
2367 if (!rx_nss) {
2368 ath12k_warn(ar->ab, "invalid max_nss\n");
2369 return;
2370 }
2371
2372 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2373 arg->peer_bw_rxnss_override |= nss_160;
2374 }
2375
2376 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2377 "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2378 arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
2379 arg->peer_bw_rxnss_override);
2380 }
2381
ath12k_mac_get_max_he_mcs_map(u16 mcs_map,int nss)2382 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2383 {
2384 switch ((mcs_map >> (2 * nss)) & 0x3) {
2385 case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2386 case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2387 case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2388 }
2389 return 0;
2390 }
2391
ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,const u16 * he_mcs_limit)2392 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2393 const u16 *he_mcs_limit)
2394 {
2395 int idx_limit;
2396 int nss;
2397 u16 mcs_map;
2398 u16 mcs;
2399
2400 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2401 mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2402 he_mcs_limit[nss];
2403
2404 if (mcs_map)
2405 idx_limit = fls(mcs_map) - 1;
2406 else
2407 idx_limit = -1;
2408
2409 switch (idx_limit) {
2410 case 0 ... 7:
2411 mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2412 break;
2413 case 8:
2414 case 9:
2415 mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2416 break;
2417 case 10:
2418 case 11:
2419 mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2420 break;
2421 default:
2422 WARN_ON(1);
2423 fallthrough;
2424 case -1:
2425 mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2426 break;
2427 }
2428
2429 tx_mcs_set &= ~(0x3 << (nss * 2));
2430 tx_mcs_set |= mcs << (nss * 2);
2431 }
2432
2433 return tx_mcs_set;
2434 }
2435
2436 static bool
ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])2437 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2438 {
2439 int nss;
2440
2441 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2442 if (he_mcs_mask[nss])
2443 return false;
2444
2445 return true;
2446 }
2447
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)2448 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
2449 struct ath12k_link_vif *arvif,
2450 struct ath12k_link_sta *arsta,
2451 struct ath12k_wmi_peer_assoc_arg *arg)
2452 {
2453 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2454 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2455 const struct ieee80211_sta_he_cap *he_cap;
2456 struct ieee80211_bss_conf *link_conf;
2457 struct ieee80211_link_sta *link_sta;
2458 struct cfg80211_chan_def def;
2459 int i;
2460 u8 ampdu_factor, max_nss;
2461 u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2462 u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2463 u16 mcs_160_map, mcs_80_map;
2464 u8 link_id = arvif->link_id;
2465 bool support_160;
2466 enum nl80211_band band;
2467 u16 *he_mcs_mask;
2468 u8 he_mcs;
2469 u16 he_tx_mcs = 0, v = 0;
2470 int he_nss, nss_idx;
2471 bool user_rate_valid = true;
2472 u32 rx_nss, tx_nss, nss_160;
2473
2474 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
2475 return;
2476
2477 link_conf = ath12k_mac_get_link_bss_conf(arvif);
2478 if (!link_conf) {
2479 ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u",
2480 vif->addr, link_id);
2481 return;
2482 }
2483
2484 link_sta = ath12k_mac_get_link_sta(arsta);
2485 if (!link_sta) {
2486 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2487 sta->addr, arsta->link_id);
2488 return;
2489 }
2490
2491 he_cap = &link_sta->he_cap;
2492 if (!he_cap->has_he)
2493 return;
2494
2495 band = def.chan->band;
2496 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2497
2498 if (ath12k_peer_assoc_h_he_masked(he_mcs_mask))
2499 return;
2500
2501 arg->he_flag = true;
2502
2503 support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2504 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2505
2506 /* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2507 mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2508 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2509
2510 if (support_160) {
2511 for (i = 7; i >= 0; i--) {
2512 u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2513
2514 if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2515 rx_mcs_160 = i + 1;
2516 break;
2517 }
2518 }
2519 }
2520
2521 for (i = 7; i >= 0; i--) {
2522 u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2523
2524 if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2525 rx_mcs_80 = i + 1;
2526 break;
2527 }
2528 }
2529
2530 if (support_160)
2531 max_nss = min(rx_mcs_80, rx_mcs_160);
2532 else
2533 max_nss = rx_mcs_80;
2534
2535 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2536
2537 memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
2538 sizeof(he_cap->he_cap_elem.mac_cap_info));
2539 memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
2540 sizeof(he_cap->he_cap_elem.phy_cap_info));
2541 arg->peer_he_ops = link_conf->he_oper.params;
2542
2543 /* the top most byte is used to indicate BSS color info */
2544 arg->peer_he_ops &= 0xffffff;
2545
2546 /* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
2547 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
2548 * as calculated while parsing VHT caps(if VHT caps is present)
2549 * or HT caps (if VHT caps is not present).
2550 *
2551 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
2552 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2553 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2554 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2555 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2556 * length.
2557 */
2558 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2559 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2560
2561 if (ampdu_factor) {
2562 if (link_sta->vht_cap.vht_supported)
2563 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2564 ampdu_factor)) - 1;
2565 else if (link_sta->ht_cap.ht_supported)
2566 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2567 ampdu_factor)) - 1;
2568 }
2569
2570 if (he_cap->he_cap_elem.phy_cap_info[6] &
2571 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2572 int bit = 7;
2573 int nss, ru;
2574
2575 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2576 IEEE80211_PPE_THRES_NSS_MASK;
2577 arg->peer_ppet.ru_bit_mask =
2578 (he_cap->ppe_thres[0] &
2579 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2580 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2581
2582 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2583 for (ru = 0; ru < 4; ru++) {
2584 u32 val = 0;
2585 int i;
2586
2587 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2588 continue;
2589 for (i = 0; i < 6; i++) {
2590 val >>= 1;
2591 val |= ((he_cap->ppe_thres[bit / 8] >>
2592 (bit % 8)) & 0x1) << 5;
2593 bit++;
2594 }
2595 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2596 val << (ru * 6);
2597 }
2598 }
2599 }
2600
2601 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2602 arg->twt_responder = true;
2603 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2604 arg->twt_requester = true;
2605
2606 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
2607
2608 if (he_nss > link_sta->rx_nss) {
2609 user_rate_valid = false;
2610 for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2611 if (he_mcs_mask[nss_idx]) {
2612 user_rate_valid = true;
2613 break;
2614 }
2615 }
2616 }
2617
2618 if (!user_rate_valid) {
2619 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2620 "Setting he range MCS value to peer supported nss:%d for peer %pM\n",
2621 link_sta->rx_nss, arsta->addr);
2622 he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2623 }
2624
2625 switch (link_sta->bandwidth) {
2626 case IEEE80211_STA_RX_BW_160:
2627 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2628 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2629
2630 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2631 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2632
2633 arg->peer_he_mcs_count++;
2634 if (!he_tx_mcs)
2635 he_tx_mcs = v;
2636 fallthrough;
2637
2638 default:
2639 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2640 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2641
2642 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2643 v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2644 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2645
2646 arg->peer_he_mcs_count++;
2647 if (!he_tx_mcs)
2648 he_tx_mcs = v;
2649 break;
2650 }
2651
2652 /* Calculate peer NSS capability from HE capabilities if STA
2653 * supports HE.
2654 */
2655 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2656 he_mcs = he_tx_mcs >> (2 * i) & 3;
2657
2658 /* In case of fixed rates, MCS Range in he_tx_mcs might have
2659 * unsupported range, with he_mcs_mask set, so check either of them
2660 * to find nss.
2661 */
2662 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2663 he_mcs_mask[i])
2664 max_nss = i + 1;
2665 }
2666
2667 max_nss = min(max_nss, ar->num_tx_chains);
2668 arg->peer_nss = min(link_sta->rx_nss, max_nss);
2669
2670 if (arg->peer_phymode == MODE_11AX_HE160) {
2671 tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
2672 rx_nss = min(arg->peer_nss, tx_nss);
2673
2674 arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
2675 arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2676
2677 if (!rx_nss) {
2678 ath12k_warn(ar->ab, "invalid max_nss\n");
2679 return;
2680 }
2681
2682 nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2683 arg->peer_bw_rxnss_override |= nss_160;
2684 }
2685
2686 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2687 "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2688 arsta->addr, arg->peer_nss,
2689 arg->peer_he_mcs_count,
2690 arg->peer_bw_rxnss_override);
2691 }
2692
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)2693 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
2694 struct ath12k_link_vif *arvif,
2695 struct ath12k_link_sta *arsta,
2696 struct ath12k_wmi_peer_assoc_arg *arg)
2697 {
2698 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2699 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2700 const struct ieee80211_sta_he_cap *he_cap;
2701 struct ieee80211_link_sta *link_sta;
2702 struct cfg80211_chan_def def;
2703 enum nl80211_band band;
2704 u8 ampdu_factor, mpdu_density;
2705
2706 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2707 return;
2708
2709 band = def.chan->band;
2710
2711 link_sta = ath12k_mac_get_link_sta(arsta);
2712 if (!link_sta) {
2713 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n",
2714 sta->addr, arsta->link_id);
2715 return;
2716 }
2717
2718 he_cap = &link_sta->he_cap;
2719
2720 if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa)
2721 return;
2722
2723 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2724 arg->bw_40 = true;
2725
2726 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2727 arg->bw_80 = true;
2728
2729 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2730 arg->bw_160 = true;
2731
2732 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2733 arg->bw_320 = true;
2734
2735 arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa);
2736
2737 mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz,
2738 IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
2739 arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density);
2740
2741 /* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2742 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2743 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2744 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2745 * Band Capabilities element in the 6 GHz band.
2746 *
2747 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2748 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2749 */
2750 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2751 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) +
2752 u32_get_bits(arg->peer_he_caps_6ghz,
2753 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
2754
2755 arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2756 ampdu_factor)) - 1;
2757 }
2758
ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa,int * smps)2759 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap,
2760 const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
2761 int *smps)
2762 {
2763 if (ht_cap->ht_supported)
2764 *smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS);
2765 else
2766 *smps = le16_get_bits(he_6ghz_capa->capa,
2767 IEEE80211_HE_6GHZ_CAP_SM_PS);
2768
2769 if (*smps >= ARRAY_SIZE(ath12k_smps_map))
2770 return -EINVAL;
2771
2772 return 0;
2773 }
2774
ath12k_peer_assoc_h_smps(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2775 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta,
2776 struct ath12k_wmi_peer_assoc_arg *arg)
2777 {
2778 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2779 const struct ieee80211_he_6ghz_capa *he_6ghz_capa;
2780 struct ath12k_link_vif *arvif = arsta->arvif;
2781 const struct ieee80211_sta_ht_cap *ht_cap;
2782 struct ieee80211_link_sta *link_sta;
2783 struct ath12k *ar = arvif->ar;
2784 int smps;
2785
2786 link_sta = ath12k_mac_get_link_sta(arsta);
2787 if (!link_sta) {
2788 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2789 sta->addr, arsta->link_id);
2790 return;
2791 }
2792
2793 he_6ghz_capa = &link_sta->he_6ghz_capa;
2794 ht_cap = &link_sta->ht_cap;
2795
2796 if (!ht_cap->ht_supported && !he_6ghz_capa->capa)
2797 return;
2798
2799 if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps))
2800 return;
2801
2802 switch (smps) {
2803 case WLAN_HT_CAP_SM_PS_STATIC:
2804 arg->static_mimops_flag = true;
2805 break;
2806 case WLAN_HT_CAP_SM_PS_DYNAMIC:
2807 arg->dynamic_mimops_flag = true;
2808 break;
2809 case WLAN_HT_CAP_SM_PS_DISABLED:
2810 arg->spatial_mux_flag = true;
2811 break;
2812 default:
2813 break;
2814 }
2815 }
2816
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)2817 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
2818 struct ath12k_link_vif *arvif,
2819 struct ath12k_link_sta *arsta,
2820 struct ath12k_wmi_peer_assoc_arg *arg)
2821 {
2822 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2823
2824 switch (arvif->ahvif->vdev_type) {
2825 case WMI_VDEV_TYPE_AP:
2826 if (sta->wme) {
2827 /* TODO: Check WME vs QoS */
2828 arg->is_wme_set = true;
2829 arg->qos_flag = true;
2830 }
2831
2832 if (sta->wme && sta->uapsd_queues) {
2833 /* TODO: Check WME vs QoS */
2834 arg->is_wme_set = true;
2835 arg->apsd_flag = true;
2836 arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2837 }
2838 break;
2839 case WMI_VDEV_TYPE_STA:
2840 if (sta->wme) {
2841 arg->is_wme_set = true;
2842 arg->qos_flag = true;
2843 }
2844 break;
2845 default:
2846 break;
2847 }
2848
2849 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
2850 arsta->addr, arg->qos_flag);
2851 }
2852
ath12k_peer_assoc_qos_ap(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)2853 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
2854 struct ath12k_link_vif *arvif,
2855 struct ath12k_link_sta *arsta)
2856 {
2857 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2858 struct ath12k_wmi_ap_ps_arg arg;
2859 u32 max_sp;
2860 u32 uapsd;
2861 int ret;
2862
2863 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2864
2865 arg.vdev_id = arvif->vdev_id;
2866
2867 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2868 sta->uapsd_queues, sta->max_sp);
2869
2870 uapsd = 0;
2871 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2872 uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2873 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2874 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2875 uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2876 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2877 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2878 uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2879 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2880 if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2881 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2882 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2883
2884 max_sp = 0;
2885 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2886 max_sp = sta->max_sp;
2887
2888 arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2889 arg.value = uapsd;
2890 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2891 if (ret)
2892 goto err;
2893
2894 arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2895 arg.value = max_sp;
2896 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2897 if (ret)
2898 goto err;
2899
2900 /* TODO: revisit during testing */
2901 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2902 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2903 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2904 if (ret)
2905 goto err;
2906
2907 arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2908 arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2909 ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2910 if (ret)
2911 goto err;
2912
2913 return 0;
2914
2915 err:
2916 ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2917 arg.param, arvif->vdev_id, ret);
2918 return ret;
2919 }
2920
ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta * sta)2921 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta)
2922 {
2923 return sta->supp_rates[NL80211_BAND_2GHZ] >>
2924 ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2925 }
2926
ath12k_mac_get_phymode_vht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2927 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2928 struct ieee80211_link_sta *link_sta)
2929 {
2930 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2931 if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2932 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
2933 return MODE_11AC_VHT160;
2934
2935 /* Allow STA to connect even if it does not explicitly advertise 160 MHz
2936 * support
2937 */
2938 return MODE_11AC_VHT160;
2939 }
2940
2941 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2942 return MODE_11AC_VHT80;
2943
2944 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2945 return MODE_11AC_VHT40;
2946
2947 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2948 return MODE_11AC_VHT20;
2949
2950 return MODE_UNKNOWN;
2951 }
2952
ath12k_mac_get_phymode_he(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2953 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2954 struct ieee80211_link_sta *link_sta)
2955 {
2956 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2957 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2958 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2959 return MODE_11AX_HE160;
2960
2961 return MODE_UNKNOWN;
2962 }
2963
2964 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2965 return MODE_11AX_HE80;
2966
2967 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2968 return MODE_11AX_HE40;
2969
2970 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2971 return MODE_11AX_HE20;
2972
2973 return MODE_UNKNOWN;
2974 }
2975
ath12k_mac_get_phymode_eht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2976 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
2977 struct ieee80211_link_sta *link_sta)
2978 {
2979 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2980 if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] &
2981 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2982 return MODE_11BE_EHT320;
2983
2984 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2985 if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2986 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2987 return MODE_11BE_EHT160;
2988
2989 ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
2990 link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
2991
2992 return MODE_UNKNOWN;
2993 }
2994
2995 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2996 return MODE_11BE_EHT80;
2997
2998 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2999 return MODE_11BE_EHT40;
3000
3001 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
3002 return MODE_11BE_EHT20;
3003
3004 return MODE_UNKNOWN;
3005 }
3006
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)3007 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
3008 struct ath12k_link_vif *arvif,
3009 struct ath12k_link_sta *arsta,
3010 struct ath12k_wmi_peer_assoc_arg *arg)
3011 {
3012 struct ieee80211_link_sta *link_sta;
3013 struct cfg80211_chan_def def;
3014 enum nl80211_band band;
3015 const u8 *ht_mcs_mask;
3016 const u16 *vht_mcs_mask;
3017 const u16 *he_mcs_mask;
3018 enum wmi_phy_mode phymode = MODE_UNKNOWN;
3019
3020 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3021
3022 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3023 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3024
3025 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
3026 return;
3027
3028 band = def.chan->band;
3029 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3030 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3031 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
3032
3033 link_sta = ath12k_mac_get_link_sta(arsta);
3034 if (!link_sta) {
3035 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
3036 sta->addr, arsta->link_id);
3037 return;
3038 }
3039
3040 switch (band) {
3041 case NL80211_BAND_2GHZ:
3042 if (link_sta->eht_cap.has_eht) {
3043 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3044 phymode = MODE_11BE_EHT40_2G;
3045 else
3046 phymode = MODE_11BE_EHT20_2G;
3047 } else if (link_sta->he_cap.has_he &&
3048 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3049 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3050 phymode = MODE_11AX_HE80_2G;
3051 else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3052 phymode = MODE_11AX_HE40_2G;
3053 else
3054 phymode = MODE_11AX_HE20_2G;
3055 } else if (link_sta->vht_cap.vht_supported &&
3056 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3057 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3058 phymode = MODE_11AC_VHT40;
3059 else
3060 phymode = MODE_11AC_VHT20;
3061 } else if (link_sta->ht_cap.ht_supported &&
3062 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3063 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3064 phymode = MODE_11NG_HT40;
3065 else
3066 phymode = MODE_11NG_HT20;
3067 } else if (ath12k_mac_sta_has_ofdm_only(link_sta)) {
3068 phymode = MODE_11G;
3069 } else {
3070 phymode = MODE_11B;
3071 }
3072 break;
3073 case NL80211_BAND_5GHZ:
3074 case NL80211_BAND_6GHZ:
3075 /* Check EHT first */
3076 if (link_sta->eht_cap.has_eht) {
3077 phymode = ath12k_mac_get_phymode_eht(ar, link_sta);
3078 } else if (link_sta->he_cap.has_he &&
3079 !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3080 phymode = ath12k_mac_get_phymode_he(ar, link_sta);
3081 } else if (link_sta->vht_cap.vht_supported &&
3082 !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3083 phymode = ath12k_mac_get_phymode_vht(ar, link_sta);
3084 } else if (link_sta->ht_cap.ht_supported &&
3085 !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3086 if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40)
3087 phymode = MODE_11NA_HT40;
3088 else
3089 phymode = MODE_11NA_HT20;
3090 } else {
3091 phymode = MODE_11A;
3092 }
3093 break;
3094 default:
3095 break;
3096 }
3097
3098 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
3099 arsta->addr, ath12k_mac_phymode_str(phymode));
3100
3101 arg->peer_phymode = phymode;
3102 WARN_ON(phymode == MODE_UNKNOWN);
3103 }
3104
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)3105 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
3106 u8 rx_tx_mcs11, u8 rx_tx_mcs13,
3107 u32 *rx_mcs, u32 *tx_mcs)
3108 {
3109 *rx_mcs = 0;
3110 u32p_replace_bits(rx_mcs,
3111 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
3112 WMI_EHT_MCS_NSS_0_7);
3113 u32p_replace_bits(rx_mcs,
3114 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
3115 WMI_EHT_MCS_NSS_8_9);
3116 u32p_replace_bits(rx_mcs,
3117 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
3118 WMI_EHT_MCS_NSS_10_11);
3119 u32p_replace_bits(rx_mcs,
3120 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
3121 WMI_EHT_MCS_NSS_12_13);
3122
3123 *tx_mcs = 0;
3124 u32p_replace_bits(tx_mcs,
3125 u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
3126 WMI_EHT_MCS_NSS_0_7);
3127 u32p_replace_bits(tx_mcs,
3128 u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
3129 WMI_EHT_MCS_NSS_8_9);
3130 u32p_replace_bits(tx_mcs,
3131 u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
3132 WMI_EHT_MCS_NSS_10_11);
3133 u32p_replace_bits(tx_mcs,
3134 u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
3135 WMI_EHT_MCS_NSS_12_13);
3136 }
3137
ath12k_mac_set_eht_ppe_threshold(const u8 * ppe_thres,struct ath12k_wmi_ppe_threshold_arg * ppet)3138 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
3139 struct ath12k_wmi_ppe_threshold_arg *ppet)
3140 {
3141 u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
3142 u8 nss, ru, i;
3143 u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
3144
3145 ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
3146 ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
3147 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3148
3149 for (nss = 0; nss <= ppet->numss_m1; nss++) {
3150 for (ru = 0;
3151 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3152 ru++) {
3153 if ((ppet->ru_bit_mask & BIT(ru)) == 0)
3154 continue;
3155
3156 val = 0;
3157 for (i = 0; i < ppet_bit_len_per_ru; i++) {
3158 val |= (((ppe_thres[bit_pos / 8] >>
3159 (bit_pos % 8)) & 0x1) << i);
3160 bit_pos++;
3161 }
3162 ppet->ppet16_ppet8_ru3_ru0[nss] |=
3163 (val << (ru * ppet_bit_len_per_ru));
3164 }
3165 }
3166 }
3167
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)3168 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
3169 struct ath12k_link_vif *arvif,
3170 struct ath12k_link_sta *arsta,
3171 struct ath12k_wmi_peer_assoc_arg *arg)
3172 {
3173 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3174 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
3175 const struct ieee80211_eht_mcs_nss_supp_bw *bw;
3176 const struct ieee80211_sta_eht_cap *eht_cap;
3177 const struct ieee80211_sta_he_cap *he_cap;
3178 struct ieee80211_link_sta *link_sta;
3179 struct ieee80211_bss_conf *link_conf;
3180 u32 *rx_mcs, *tx_mcs;
3181
3182 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3183
3184 link_sta = ath12k_mac_get_link_sta(arsta);
3185 if (!link_sta) {
3186 ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n",
3187 sta->addr, arsta->link_id);
3188 return;
3189 }
3190
3191 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3192 if (!link_conf) {
3193 ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n");
3194 return;
3195 }
3196
3197 eht_cap = &link_sta->eht_cap;
3198 he_cap = &link_sta->he_cap;
3199 if (!he_cap->has_he || !eht_cap->has_eht)
3200 return;
3201
3202 arg->eht_flag = true;
3203
3204 if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
3205 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
3206 eht_cap->eht_ppe_thres[0] != 0)
3207 ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
3208 &arg->peer_eht_ppet);
3209
3210 memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
3211 sizeof(eht_cap->eht_cap_elem.mac_cap_info));
3212 memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
3213 sizeof(eht_cap->eht_cap_elem.phy_cap_info));
3214
3215 rx_mcs = arg->peer_eht_rx_mcs_set;
3216 tx_mcs = arg->peer_eht_tx_mcs_set;
3217
3218 switch (link_sta->bandwidth) {
3219 case IEEE80211_STA_RX_BW_320:
3220 bw = &eht_cap->eht_mcs_nss_supp.bw._320;
3221 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3222 bw->rx_tx_mcs9_max_nss,
3223 bw->rx_tx_mcs11_max_nss,
3224 bw->rx_tx_mcs13_max_nss,
3225 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
3226 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
3227 arg->peer_eht_mcs_count++;
3228 fallthrough;
3229 case IEEE80211_STA_RX_BW_160:
3230 bw = &eht_cap->eht_mcs_nss_supp.bw._160;
3231 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3232 bw->rx_tx_mcs9_max_nss,
3233 bw->rx_tx_mcs11_max_nss,
3234 bw->rx_tx_mcs13_max_nss,
3235 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
3236 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
3237 arg->peer_eht_mcs_count++;
3238 fallthrough;
3239 default:
3240 if ((he_cap->he_cap_elem.phy_cap_info[0] &
3241 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
3242 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3243 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
3244 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
3245 bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
3246
3247 ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
3248 bw_20->rx_tx_mcs9_max_nss,
3249 bw_20->rx_tx_mcs11_max_nss,
3250 bw_20->rx_tx_mcs13_max_nss,
3251 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3252 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3253 } else {
3254 bw = &eht_cap->eht_mcs_nss_supp.bw._80;
3255 ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3256 bw->rx_tx_mcs9_max_nss,
3257 bw->rx_tx_mcs11_max_nss,
3258 bw->rx_tx_mcs13_max_nss,
3259 &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3260 &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3261 }
3262
3263 arg->peer_eht_mcs_count++;
3264 break;
3265 }
3266
3267 arg->punct_bitmap = ~arvif->punct_bitmap;
3268 arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15;
3269 }
3270
ath12k_peer_assoc_h_mlo(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3271 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta,
3272 struct ath12k_wmi_peer_assoc_arg *arg)
3273 {
3274 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3275 struct peer_assoc_mlo_params *ml = &arg->ml;
3276 struct ath12k_sta *ahsta = arsta->ahsta;
3277 struct ath12k_link_sta *arsta_p;
3278 struct ath12k_link_vif *arvif;
3279 unsigned long links;
3280 u8 link_id;
3281 int i;
3282
3283 if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID)
3284 return;
3285
3286 ml->enabled = true;
3287 ml->assoc_link = arsta->is_assoc_link;
3288
3289 /* For now considering the primary umac based on assoc link */
3290 ml->primary_umac = arsta->is_assoc_link;
3291 ml->peer_id_valid = true;
3292 ml->logical_link_idx_valid = true;
3293
3294 ether_addr_copy(ml->mld_addr, sta->addr);
3295 ml->logical_link_idx = arsta->link_idx;
3296 ml->ml_peer_id = ahsta->ml_peer_id;
3297 ml->ieee_link_id = arsta->link_id;
3298 ml->num_partner_links = 0;
3299 ml->eml_cap = sta->eml_cap;
3300 links = ahsta->links_map;
3301
3302 rcu_read_lock();
3303
3304 i = 0;
3305
3306 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
3307 if (i >= ATH12K_WMI_MLO_MAX_LINKS)
3308 break;
3309
3310 arsta_p = rcu_dereference(ahsta->link[link_id]);
3311 arvif = rcu_dereference(ahsta->ahvif->link[link_id]);
3312
3313 if (arsta_p == arsta)
3314 continue;
3315
3316 if (!arvif->is_started)
3317 continue;
3318
3319 ml->partner_info[i].vdev_id = arvif->vdev_id;
3320 ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id;
3321 ml->partner_info[i].assoc_link = arsta_p->is_assoc_link;
3322 ml->partner_info[i].primary_umac = arsta_p->is_assoc_link;
3323 ml->partner_info[i].logical_link_idx_valid = true;
3324 ml->partner_info[i].logical_link_idx = arsta_p->link_idx;
3325 ml->num_partner_links++;
3326
3327 i++;
3328 }
3329
3330 rcu_read_unlock();
3331 }
3332
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)3333 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
3334 struct ath12k_link_vif *arvif,
3335 struct ath12k_link_sta *arsta,
3336 struct ath12k_wmi_peer_assoc_arg *arg,
3337 bool reassoc)
3338 {
3339 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3340
3341 memset(arg, 0, sizeof(*arg));
3342
3343 reinit_completion(&ar->peer_assoc_done);
3344
3345 arg->peer_new_assoc = !reassoc;
3346 ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg);
3347 ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg);
3348 ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg);
3349 ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg);
3350 ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg);
3351 ath12k_peer_assoc_h_he(ar, arvif, arsta, arg);
3352 ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg);
3353 ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg);
3354 ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg);
3355 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg);
3356 ath12k_peer_assoc_h_smps(arsta, arg);
3357 ath12k_peer_assoc_h_mlo(arsta, arg);
3358
3359 arsta->peer_nss = arg->peer_nss;
3360 /* TODO: amsdu_disable req? */
3361 }
3362
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)3363 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif,
3364 const u8 *addr,
3365 const struct ieee80211_sta_ht_cap *ht_cap,
3366 const struct ieee80211_he_6ghz_capa *he_6ghz_capa)
3367 {
3368 int smps, ret = 0;
3369
3370 if (!ht_cap->ht_supported && !he_6ghz_capa)
3371 return 0;
3372
3373 ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps);
3374 if (ret < 0)
3375 return ret;
3376
3377 return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
3378 WMI_PEER_MIMO_PS_STATE,
3379 ath12k_smps_map[smps]);
3380 }
3381
ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif * arvif)3382 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
3383 {
3384 struct ath12k_vif *ahvif = arvif->ahvif;
3385 struct ath12k *ar = arvif->ar;
3386 u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
3387 u32 value = 0;
3388 int ret;
3389 struct ieee80211_bss_conf *link_conf;
3390
3391 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3392 if (!link_conf) {
3393 ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n");
3394 return -EINVAL;
3395 }
3396
3397 if (!link_conf->he_support)
3398 return 0;
3399
3400 if (link_conf->he_su_beamformer) {
3401 value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3402 if (link_conf->he_mu_beamformer &&
3403 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3404 value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER);
3405 }
3406
3407 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3408 value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3409 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3410
3411 if (link_conf->he_full_ul_mumimo)
3412 value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO);
3413
3414 if (link_conf->he_su_beamformee)
3415 value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3416 }
3417
3418 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3419 if (ret) {
3420 ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
3421 arvif->vdev_id, ret);
3422 return ret;
3423 }
3424
3425 param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
3426 value = u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
3427 u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
3428 HE_TRIG_NONTRIG_SOUNDING_MODE);
3429 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3430 param, value);
3431 if (ret) {
3432 ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
3433 arvif->vdev_id, ret);
3434 return ret;
3435 }
3436
3437 return 0;
3438 }
3439
ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_sta_he_cap * he_cap,int * hemode)3440 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
3441 struct ath12k_link_vif *arvif,
3442 struct ieee80211_sta_he_cap *he_cap,
3443 int *hemode)
3444 {
3445 struct ieee80211_vif *vif = arvif->ahvif->vif;
3446 struct ieee80211_he_cap_elem he_cap_elem = {};
3447 struct ieee80211_sta_he_cap *cap_band;
3448 struct cfg80211_chan_def def;
3449 u8 link_id = arvif->link_id;
3450 struct ieee80211_bss_conf *link_conf;
3451
3452 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3453 if (!link_conf) {
3454 ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n");
3455 return -EINVAL;
3456 }
3457
3458 if (!link_conf->he_support)
3459 return 0;
3460
3461 if (vif->type != NL80211_IFTYPE_STATION)
3462 return -EINVAL;
3463
3464 if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
3465 return -EINVAL;
3466
3467 if (def.chan->band == NL80211_BAND_2GHZ)
3468 cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
3469 else
3470 cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
3471
3472 memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
3473
3474 *hemode = 0;
3475 if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
3476 if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3477 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3478 if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3479 *hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
3480 }
3481
3482 if (vif->type != NL80211_IFTYPE_MESH_POINT) {
3483 *hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3484 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3485
3486 if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
3487 if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
3488 *hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE,
3489 HE_MODE_UL_MUMIMO);
3490
3491 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE))
3492 *hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3493
3494 if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER))
3495 *hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3496 }
3497
3498 return 0;
3499 }
3500
ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif * arvif)3501 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
3502 {
3503 struct ath12k_vif *ahvif = arvif->ahvif;
3504 struct ath12k *ar = arvif->ar;
3505 u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
3506 u32 value = 0;
3507 int ret;
3508 struct ieee80211_bss_conf *link_conf;
3509
3510 link_conf = ath12k_mac_get_link_bss_conf(arvif);
3511 if (!link_conf) {
3512 ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
3513 return -ENOENT;
3514 }
3515
3516 if (!link_conf->eht_support)
3517 return 0;
3518
3519 if (link_conf->eht_su_beamformer) {
3520 value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
3521 if (link_conf->eht_mu_beamformer &&
3522 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3523 value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
3524 EHT_MODE_MU_TX_BFER) |
3525 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
3526 EHT_MODE_DL_OFDMA_MUMIMO) |
3527 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
3528 EHT_MODE_UL_OFDMA_MUMIMO);
3529 }
3530
3531 if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3532 value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
3533 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
3534
3535 if (link_conf->eht_80mhz_full_bw_ul_mumimo)
3536 value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
3537
3538 if (link_conf->eht_su_beamformee)
3539 value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
3540 EHT_MODE_SU_TX_BFEE);
3541 }
3542
3543 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3544 if (ret) {
3545 ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
3546 arvif->vdev_id, ret);
3547 return ret;
3548 }
3549
3550 return 0;
3551 }
3552
ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k * ar,struct ieee80211_link_sta * link_sta)3553 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3554 struct ieee80211_link_sta *link_sta)
3555 {
3556 u32 bw;
3557
3558 switch (link_sta->bandwidth) {
3559 case IEEE80211_STA_RX_BW_20:
3560 bw = WMI_PEER_CHWIDTH_20MHZ;
3561 break;
3562 case IEEE80211_STA_RX_BW_40:
3563 bw = WMI_PEER_CHWIDTH_40MHZ;
3564 break;
3565 case IEEE80211_STA_RX_BW_80:
3566 bw = WMI_PEER_CHWIDTH_80MHZ;
3567 break;
3568 case IEEE80211_STA_RX_BW_160:
3569 bw = WMI_PEER_CHWIDTH_160MHZ;
3570 break;
3571 case IEEE80211_STA_RX_BW_320:
3572 bw = WMI_PEER_CHWIDTH_320MHZ;
3573 break;
3574 default:
3575 ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n",
3576 link_sta->bandwidth, link_sta->addr);
3577 bw = WMI_PEER_CHWIDTH_20MHZ;
3578 break;
3579 }
3580
3581 return bw;
3582 }
3583
ath12k_bss_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * bss_conf)3584 static void ath12k_bss_assoc(struct ath12k *ar,
3585 struct ath12k_link_vif *arvif,
3586 struct ieee80211_bss_conf *bss_conf)
3587 {
3588 struct ath12k_vif *ahvif = arvif->ahvif;
3589 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
3590 struct ath12k_wmi_vdev_up_params params = {};
3591 struct ieee80211_link_sta *link_sta;
3592 u8 link_id = bss_conf->link_id;
3593 struct ath12k_link_sta *arsta;
3594 struct ieee80211_sta *ap_sta;
3595 struct ath12k_sta *ahsta;
3596 struct ath12k_peer *peer;
3597 bool is_auth = false;
3598 u32 hemode = 0;
3599 int ret;
3600
3601 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3602
3603 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
3604 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
3605 if (!peer_arg)
3606 return;
3607
3608 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3609 "mac vdev %i link id %u assoc bssid %pM aid %d\n",
3610 arvif->vdev_id, link_id, arvif->bssid, ahvif->aid);
3611
3612 rcu_read_lock();
3613
3614 /* During ML connection, cfg.ap_addr has the MLD address. For
3615 * non-ML connection, it has the BSSID.
3616 */
3617 ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
3618 if (!ap_sta) {
3619 ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3620 vif->cfg.ap_addr, arvif->vdev_id);
3621 rcu_read_unlock();
3622 return;
3623 }
3624
3625 ahsta = ath12k_sta_to_ahsta(ap_sta);
3626
3627 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
3628 ahsta->link[link_id]);
3629 if (WARN_ON(!arsta)) {
3630 rcu_read_unlock();
3631 return;
3632 }
3633
3634 link_sta = ath12k_mac_get_link_sta(arsta);
3635 if (WARN_ON(!link_sta)) {
3636 rcu_read_unlock();
3637 return;
3638 }
3639
3640 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);
3641
3642 /* link_sta->he_cap must be protected by rcu_read_lock */
3643 ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode);
3644 if (ret) {
3645 ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n",
3646 arvif->vdev_id, bss_conf->bssid, ret);
3647 rcu_read_unlock();
3648 return;
3649 }
3650
3651 rcu_read_unlock();
3652
3653 /* keep this before ath12k_wmi_send_peer_assoc_cmd() */
3654 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3655 WMI_VDEV_PARAM_SET_HEMU_MODE, hemode);
3656 if (ret) {
3657 ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
3658 hemode, ret);
3659 return;
3660 }
3661
3662 peer_arg->is_assoc = true;
3663 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
3664 if (ret) {
3665 ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3666 bss_conf->bssid, arvif->vdev_id, ret);
3667 return;
3668 }
3669
3670 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3671 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3672 bss_conf->bssid, arvif->vdev_id);
3673 return;
3674 }
3675
3676 ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3677 &link_sta->ht_cap, &link_sta->he_6ghz_capa);
3678 if (ret) {
3679 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3680 arvif->vdev_id, ret);
3681 return;
3682 }
3683
3684 WARN_ON(arvif->is_up);
3685
3686 ahvif->aid = vif->cfg.aid;
3687 ether_addr_copy(arvif->bssid, bss_conf->bssid);
3688
3689 params.vdev_id = arvif->vdev_id;
3690 params.aid = ahvif->aid;
3691 params.bssid = arvif->bssid;
3692 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
3693 if (params.tx_bssid) {
3694 params.nontx_profile_idx = bss_conf->bssid_index;
3695 params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator;
3696 }
3697 ret = ath12k_wmi_vdev_up(ar, ¶ms);
3698 if (ret) {
3699 ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3700 arvif->vdev_id, ret);
3701 return;
3702 }
3703
3704 arvif->is_up = true;
3705 arvif->rekey_data.enable_offload = false;
3706
3707 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3708 "mac vdev %d up (associated) bssid %pM aid %d\n",
3709 arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3710
3711 spin_lock_bh(&ar->ab->base_lock);
3712
3713 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3714 if (peer && peer->is_authorized)
3715 is_auth = true;
3716
3717 spin_unlock_bh(&ar->ab->base_lock);
3718
3719 /* Authorize BSS Peer */
3720 if (is_auth) {
3721 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
3722 arvif->vdev_id,
3723 WMI_PEER_AUTHORIZE,
3724 1);
3725 if (ret)
3726 ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3727 }
3728
3729 ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3730 &bss_conf->he_obss_pd);
3731 if (ret)
3732 ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3733 arvif->vdev_id, ret);
3734
3735 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3736 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3737 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3738 ath12k_mac_11d_scan_stop_all(ar->ab);
3739 }
3740
ath12k_bss_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif)3741 static void ath12k_bss_disassoc(struct ath12k *ar,
3742 struct ath12k_link_vif *arvif)
3743 {
3744 int ret;
3745
3746 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3747
3748 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3749 arvif->vdev_id, arvif->bssid);
3750
3751 ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
3752 if (ret)
3753 ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
3754 arvif->vdev_id, ret);
3755
3756 arvif->is_up = false;
3757
3758 memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3759
3760 cancel_delayed_work(&arvif->connection_loss_work);
3761 }
3762
ath12k_mac_get_rate_hw_value(int bitrate)3763 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
3764 {
3765 u32 preamble;
3766 u16 hw_value;
3767 int rate;
3768 size_t i;
3769
3770 if (ath12k_mac_bitrate_is_cck(bitrate))
3771 preamble = WMI_RATE_PREAMBLE_CCK;
3772 else
3773 preamble = WMI_RATE_PREAMBLE_OFDM;
3774
3775 for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
3776 if (ath12k_legacy_rates[i].bitrate != bitrate)
3777 continue;
3778
3779 hw_value = ath12k_legacy_rates[i].hw_value;
3780 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
3781
3782 return rate;
3783 }
3784
3785 return -EINVAL;
3786 }
3787
ath12k_recalculate_mgmt_rate(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def * def)3788 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
3789 struct ath12k_link_vif *arvif,
3790 struct cfg80211_chan_def *def)
3791 {
3792 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3793 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
3794 const struct ieee80211_supported_band *sband;
3795 struct ieee80211_bss_conf *bss_conf;
3796 u8 basic_rate_idx;
3797 int hw_rate_code;
3798 u32 vdev_param;
3799 u16 bitrate;
3800 int ret;
3801
3802 lockdep_assert_wiphy(hw->wiphy);
3803
3804 bss_conf = ath12k_mac_get_link_bss_conf(arvif);
3805 if (!bss_conf) {
3806 ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n",
3807 vif->addr, arvif->link_id);
3808 return;
3809 }
3810
3811 sband = hw->wiphy->bands[def->chan->band];
3812 if (bss_conf->basic_rates)
3813 basic_rate_idx = __ffs(bss_conf->basic_rates);
3814 else
3815 basic_rate_idx = 0;
3816 bitrate = sband->bitrates[basic_rate_idx].bitrate;
3817
3818 hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
3819 if (hw_rate_code < 0) {
3820 ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3821 return;
3822 }
3823
3824 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3825 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3826 hw_rate_code);
3827 if (ret)
3828 ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3829
3830 vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3831 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3832 hw_rate_code);
3833 if (ret)
3834 ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3835 }
3836
ath12k_mac_init_arvif(struct ath12k_vif * ahvif,struct ath12k_link_vif * arvif,int link_id)3837 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
3838 struct ath12k_link_vif *arvif, int link_id)
3839 {
3840 struct ath12k_hw *ah = ahvif->ah;
3841 u8 _link_id;
3842 int i;
3843
3844 lockdep_assert_wiphy(ah->hw->wiphy);
3845
3846 if (WARN_ON(!arvif))
3847 return;
3848
3849 if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
3850 return;
3851
3852 if (link_id < 0)
3853 _link_id = 0;
3854 else
3855 _link_id = link_id;
3856
3857 arvif->ahvif = ahvif;
3858 arvif->link_id = _link_id;
3859
3860 /* Protects the datapath stats update on a per link basis */
3861 spin_lock_init(&arvif->link_stats_lock);
3862
3863 INIT_LIST_HEAD(&arvif->list);
3864 INIT_DELAYED_WORK(&arvif->connection_loss_work,
3865 ath12k_mac_vif_sta_connection_loss_work);
3866
3867 arvif->num_stations = 0;
3868
3869 for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
3870 arvif->bitrate_mask.control[i].legacy = 0xffffffff;
3871 arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
3872 memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
3873 sizeof(arvif->bitrate_mask.control[i].ht_mcs));
3874 memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
3875 sizeof(arvif->bitrate_mask.control[i].vht_mcs));
3876 memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
3877 sizeof(arvif->bitrate_mask.control[i].he_mcs));
3878 }
3879
3880 /* Handle MLO related assignments */
3881 if (link_id >= 0) {
3882 rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
3883 ahvif->links_map |= BIT(_link_id);
3884 }
3885
3886 ath12k_generic_dbg(ATH12K_DBG_MAC,
3887 "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
3888 _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
3889 ahvif->links_map);
3890 }
3891
ath12k_mac_remove_link_interface(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif)3892 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
3893 struct ath12k_link_vif *arvif)
3894 {
3895 struct ath12k_vif *ahvif = arvif->ahvif;
3896 struct ath12k_hw *ah = hw->priv;
3897 struct ath12k *ar = arvif->ar;
3898 int ret;
3899
3900 lockdep_assert_wiphy(ah->hw->wiphy);
3901
3902 cancel_delayed_work_sync(&arvif->connection_loss_work);
3903
3904 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
3905 arvif->vdev_id, arvif->link_id);
3906
3907 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3908 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3909 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3910 ath12k_mac_11d_scan_stop(ar);
3911
3912 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
3913 ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
3914 if (ret)
3915 ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
3916 arvif->vdev_id, arvif->link_id, ret);
3917 }
3918 ath12k_mac_vdev_delete(ar, arvif);
3919 }
3920
ath12k_mac_assign_link_vif(struct ath12k_hw * ah,struct ieee80211_vif * vif,u8 link_id)3921 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
3922 struct ieee80211_vif *vif,
3923 u8 link_id)
3924 {
3925 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3926 struct ath12k_link_vif *arvif;
3927
3928 lockdep_assert_wiphy(ah->hw->wiphy);
3929
3930 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
3931 if (arvif)
3932 return arvif;
3933
3934 /* If this is the first link arvif being created for an ML VIF
3935 * use the preallocated deflink memory except for scan arvifs
3936 */
3937 if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) {
3938 arvif = &ahvif->deflink;
3939
3940 if (vif->type == NL80211_IFTYPE_STATION)
3941 arvif->is_sta_assoc_link = true;
3942 } else {
3943 arvif = kzalloc(sizeof(*arvif), GFP_KERNEL);
3944 if (!arvif)
3945 return NULL;
3946 }
3947
3948 ath12k_mac_init_arvif(ahvif, arvif, link_id);
3949
3950 return arvif;
3951 }
3952
ath12k_mac_unassign_link_vif(struct ath12k_link_vif * arvif)3953 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
3954 {
3955 struct ath12k_vif *ahvif = arvif->ahvif;
3956 struct ath12k_hw *ah = ahvif->ah;
3957
3958 lockdep_assert_wiphy(ah->hw->wiphy);
3959
3960 rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
3961 synchronize_rcu();
3962 ahvif->links_map &= ~BIT(arvif->link_id);
3963
3964 if (arvif != &ahvif->deflink)
3965 kfree(arvif);
3966 else
3967 memset(arvif, 0, sizeof(*arvif));
3968 }
3969
3970 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])3971 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw,
3972 struct ieee80211_vif *vif,
3973 u16 old_links, u16 new_links,
3974 struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS])
3975 {
3976 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3977 unsigned long to_remove = old_links & ~new_links;
3978 unsigned long to_add = ~old_links & new_links;
3979 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3980 struct ath12k_link_vif *arvif;
3981 u8 link_id;
3982
3983 lockdep_assert_wiphy(hw->wiphy);
3984
3985 ath12k_generic_dbg(ATH12K_DBG_MAC,
3986 "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n",
3987 vif->addr, old_links, new_links);
3988
3989 for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) {
3990 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
3991 /* mac80211 wants to add link but driver already has the
3992 * link. This should not happen ideally.
3993 */
3994 if (WARN_ON(arvif))
3995 return -EINVAL;
3996
3997 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
3998 if (WARN_ON(!arvif))
3999 return -EINVAL;
4000 }
4001
4002 for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) {
4003 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4004 if (WARN_ON(!arvif))
4005 return -EINVAL;
4006
4007 if (!arvif->is_created)
4008 continue;
4009
4010 if (WARN_ON(!arvif->ar))
4011 return -EINVAL;
4012
4013 ath12k_mac_remove_link_interface(hw, arvif);
4014 ath12k_mac_unassign_link_vif(arvif);
4015 }
4016
4017 return 0;
4018 }
4019
ath12k_mac_fils_discovery(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)4020 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
4021 struct ieee80211_bss_conf *info)
4022 {
4023 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
4024 struct ath12k *ar = arvif->ar;
4025 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4026 struct sk_buff *tmpl;
4027 int ret;
4028 u32 interval;
4029 bool unsol_bcast_probe_resp_enabled = false;
4030
4031 if (info->fils_discovery.max_interval) {
4032 interval = info->fils_discovery.max_interval;
4033
4034 tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif);
4035 if (tmpl)
4036 ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
4037 tmpl);
4038 } else if (info->unsol_bcast_probe_resp_interval) {
4039 unsol_bcast_probe_resp_enabled = 1;
4040 interval = info->unsol_bcast_probe_resp_interval;
4041
4042 tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
4043 if (tmpl)
4044 ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
4045 tmpl);
4046 } else { /* Disable */
4047 return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
4048 }
4049
4050 if (!tmpl) {
4051 ath12k_warn(ar->ab,
4052 "mac vdev %i failed to retrieve %s template\n",
4053 arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
4054 "unsolicited broadcast probe response" :
4055 "FILS discovery"));
4056 return -EPERM;
4057 }
4058 kfree_skb(tmpl);
4059
4060 if (!ret)
4061 ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
4062 unsol_bcast_probe_resp_enabled);
4063
4064 return ret;
4065 }
4066
ath12k_mac_vif_setup_ps(struct ath12k_link_vif * arvif)4067 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif)
4068 {
4069 struct ath12k *ar = arvif->ar;
4070 struct ieee80211_vif *vif = arvif->ahvif->vif;
4071 struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
4072 enum wmi_sta_powersave_param param;
4073 struct ieee80211_bss_conf *info;
4074 enum wmi_sta_ps_mode psmode;
4075 int ret;
4076 int timeout;
4077 bool enable_ps;
4078
4079 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4080
4081 if (vif->type != NL80211_IFTYPE_STATION)
4082 return;
4083
4084 enable_ps = arvif->ahvif->ps;
4085 if (enable_ps) {
4086 psmode = WMI_STA_PS_MODE_ENABLED;
4087 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
4088
4089 timeout = conf->dynamic_ps_timeout;
4090 if (timeout == 0) {
4091 info = ath12k_mac_get_link_bss_conf(arvif);
4092 if (!info) {
4093 ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n",
4094 vif->addr, arvif->link_id);
4095 return;
4096 }
4097
4098 /* firmware doesn't like 0 */
4099 timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000;
4100 }
4101
4102 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
4103 timeout);
4104 if (ret) {
4105 ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
4106 arvif->vdev_id, ret);
4107 return;
4108 }
4109 } else {
4110 psmode = WMI_STA_PS_MODE_DISABLED;
4111 }
4112
4113 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
4114 arvif->vdev_id, psmode ? "enable" : "disable");
4115
4116 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
4117 if (ret)
4118 ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
4119 psmode, arvif->vdev_id, ret);
4120 }
4121
ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 changed)4122 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw,
4123 struct ieee80211_vif *vif,
4124 u64 changed)
4125 {
4126 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4127 unsigned long links = ahvif->links_map;
4128 struct ieee80211_vif_cfg *vif_cfg;
4129 struct ieee80211_bss_conf *info;
4130 struct ath12k_link_vif *arvif;
4131 struct ieee80211_sta *sta;
4132 struct ath12k_sta *ahsta;
4133 struct ath12k *ar;
4134 u8 link_id;
4135
4136 lockdep_assert_wiphy(hw->wiphy);
4137
4138 if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) {
4139 ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4140 if (vif->cfg.ssid_len)
4141 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4142 }
4143
4144 if (changed & BSS_CHANGED_ASSOC) {
4145 if (vif->cfg.assoc) {
4146 /* only in station mode we can get here, so it's safe
4147 * to use ap_addr
4148 */
4149 rcu_read_lock();
4150 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
4151 if (!sta) {
4152 rcu_read_unlock();
4153 WARN_ONCE(1, "failed to find sta with addr %pM\n",
4154 vif->cfg.ap_addr);
4155 return;
4156 }
4157
4158 ahsta = ath12k_sta_to_ahsta(sta);
4159 arvif = wiphy_dereference(hw->wiphy,
4160 ahvif->link[ahsta->assoc_link_id]);
4161 rcu_read_unlock();
4162
4163 ar = arvif->ar;
4164 /* there is no reason for which an assoc link's
4165 * bss info does not exist
4166 */
4167 info = ath12k_mac_get_link_bss_conf(arvif);
4168 ath12k_bss_assoc(ar, arvif, info);
4169
4170 /* exclude assoc link as it is done above */
4171 links &= ~BIT(ahsta->assoc_link_id);
4172 }
4173
4174 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4175 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4176 if (!arvif || !arvif->ar)
4177 continue;
4178
4179 ar = arvif->ar;
4180
4181 if (vif->cfg.assoc) {
4182 info = ath12k_mac_get_link_bss_conf(arvif);
4183 if (!info)
4184 continue;
4185
4186 ath12k_bss_assoc(ar, arvif, info);
4187 } else {
4188 ath12k_bss_disassoc(ar, arvif);
4189 }
4190 }
4191 }
4192
4193 if (changed & BSS_CHANGED_PS) {
4194 links = ahvif->links_map;
4195 vif_cfg = &vif->cfg;
4196
4197 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4198 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4199 if (!arvif || !arvif->ar)
4200 continue;
4201
4202 ar = arvif->ar;
4203
4204 if (ar->ab->hw_params->supports_sta_ps) {
4205 ahvif->ps = vif_cfg->ps;
4206 ath12k_mac_vif_setup_ps(arvif);
4207 }
4208 }
4209 }
4210 }
4211
ath12k_mac_supports_tpc(struct ath12k * ar,struct ath12k_vif * ahvif,const struct cfg80211_chan_def * chandef)4212 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif,
4213 const struct cfg80211_chan_def *chandef)
4214 {
4215 return ath12k_wmi_supports_6ghz_cc_ext(ar) &&
4216 test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
4217 (ahvif->vdev_type == WMI_VDEV_TYPE_STA ||
4218 ahvif->vdev_type == WMI_VDEV_TYPE_AP) &&
4219 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
4220 chandef->chan &&
4221 chandef->chan->band == NL80211_BAND_6GHZ;
4222 }
4223
ath12k_mac_bss_info_changed(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info,u64 changed)4224 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
4225 struct ath12k_link_vif *arvif,
4226 struct ieee80211_bss_conf *info,
4227 u64 changed)
4228 {
4229 struct ath12k_vif *ahvif = arvif->ahvif;
4230 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
4231 struct cfg80211_chan_def def;
4232 u32 param_id, param_value;
4233 enum nl80211_band band;
4234 u32 vdev_param;
4235 int mcast_rate;
4236 u32 preamble;
4237 u16 hw_value;
4238 u16 bitrate;
4239 int ret;
4240 u8 rateidx;
4241 u32 rate;
4242
4243 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4244
4245 if (changed & BSS_CHANGED_BEACON_INT) {
4246 arvif->beacon_interval = info->beacon_int;
4247
4248 param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
4249 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4250 param_id,
4251 arvif->beacon_interval);
4252 if (ret)
4253 ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
4254 arvif->vdev_id);
4255 else
4256 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4257 "Beacon interval: %d set for VDEV: %d\n",
4258 arvif->beacon_interval, arvif->vdev_id);
4259 }
4260
4261 if (changed & BSS_CHANGED_BEACON) {
4262 param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
4263 param_value = WMI_BEACON_BURST_MODE;
4264 ret = ath12k_wmi_pdev_set_param(ar, param_id,
4265 param_value, ar->pdev->pdev_id);
4266 if (ret)
4267 ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
4268 arvif->vdev_id);
4269 else
4270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4271 "Set burst beacon mode for VDEV: %d\n",
4272 arvif->vdev_id);
4273
4274 ret = ath12k_mac_setup_bcn_tmpl(arvif);
4275 if (ret)
4276 ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
4277 ret);
4278 }
4279
4280 if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
4281 arvif->dtim_period = info->dtim_period;
4282
4283 param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
4284 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4285 param_id,
4286 arvif->dtim_period);
4287
4288 if (ret)
4289 ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
4290 arvif->vdev_id, ret);
4291 else
4292 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4293 "DTIM period: %d set for VDEV: %d\n",
4294 arvif->dtim_period, arvif->vdev_id);
4295 }
4296
4297 if (changed & BSS_CHANGED_SSID &&
4298 vif->type == NL80211_IFTYPE_AP) {
4299 ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4300 if (vif->cfg.ssid_len)
4301 memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4302 ahvif->u.ap.hidden_ssid = info->hidden_ssid;
4303 }
4304
4305 if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4306 ether_addr_copy(arvif->bssid, info->bssid);
4307
4308 if (changed & BSS_CHANGED_BEACON_ENABLED) {
4309 if (info->enable_beacon) {
4310 ret = ath12k_mac_set_he_txbf_conf(arvif);
4311 if (ret)
4312 ath12k_warn(ar->ab,
4313 "failed to set HE TXBF config for vdev: %d\n",
4314 arvif->vdev_id);
4315
4316 ret = ath12k_mac_set_eht_txbf_conf(arvif);
4317 if (ret)
4318 ath12k_warn(ar->ab,
4319 "failed to set EHT TXBF config for vdev: %d\n",
4320 arvif->vdev_id);
4321 }
4322 ath12k_control_beaconing(arvif, info);
4323
4324 if (arvif->is_up && info->he_support &&
4325 info->he_oper.params) {
4326 /* TODO: Extend to support 1024 BA Bitmap size */
4327 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4328 WMI_VDEV_PARAM_BA_MODE,
4329 WMI_BA_MODE_BUFFER_SIZE_256);
4330 if (ret)
4331 ath12k_warn(ar->ab,
4332 "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
4333 arvif->vdev_id);
4334
4335 param_id = WMI_VDEV_PARAM_HEOPS_0_31;
4336 param_value = info->he_oper.params;
4337 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4338 param_id, param_value);
4339 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4340 "he oper param: %x set for VDEV: %d\n",
4341 param_value, arvif->vdev_id);
4342
4343 if (ret)
4344 ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
4345 param_value, arvif->vdev_id, ret);
4346 }
4347 }
4348
4349 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4350 u32 cts_prot;
4351
4352 cts_prot = !!(info->use_cts_prot);
4353 param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
4354
4355 if (arvif->is_started) {
4356 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4357 param_id, cts_prot);
4358 if (ret)
4359 ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
4360 arvif->vdev_id);
4361 else
4362 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
4363 cts_prot, arvif->vdev_id);
4364 } else {
4365 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
4366 }
4367 }
4368
4369 if (changed & BSS_CHANGED_ERP_SLOT) {
4370 u32 slottime;
4371
4372 if (info->use_short_slot)
4373 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4374
4375 else
4376 slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4377
4378 param_id = WMI_VDEV_PARAM_SLOT_TIME;
4379 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4380 param_id, slottime);
4381 if (ret)
4382 ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
4383 arvif->vdev_id);
4384 else
4385 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4386 "Set slottime: %d for VDEV: %d\n",
4387 slottime, arvif->vdev_id);
4388 }
4389
4390 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4391 u32 preamble;
4392
4393 if (info->use_short_preamble)
4394 preamble = WMI_VDEV_PREAMBLE_SHORT;
4395 else
4396 preamble = WMI_VDEV_PREAMBLE_LONG;
4397
4398 param_id = WMI_VDEV_PARAM_PREAMBLE;
4399 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4400 param_id, preamble);
4401 if (ret)
4402 ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
4403 arvif->vdev_id);
4404 else
4405 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4406 "Set preamble: %d for VDEV: %d\n",
4407 preamble, arvif->vdev_id);
4408 }
4409
4410 if (changed & BSS_CHANGED_ASSOC) {
4411 if (vif->cfg.assoc)
4412 ath12k_bss_assoc(ar, arvif, info);
4413 else
4414 ath12k_bss_disassoc(ar, arvif);
4415 }
4416
4417 if (changed & BSS_CHANGED_TXPOWER) {
4418 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4419 arvif->vdev_id, info->txpower);
4420
4421 arvif->txpower = info->txpower;
4422 ath12k_mac_txpower_recalc(ar);
4423 }
4424
4425 if (changed & BSS_CHANGED_MCAST_RATE &&
4426 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
4427 band = def.chan->band;
4428 mcast_rate = info->mcast_rate[band];
4429
4430 if (mcast_rate > 0) {
4431 rateidx = mcast_rate - 1;
4432 } else {
4433 if (info->basic_rates)
4434 rateidx = __ffs(info->basic_rates);
4435 else
4436 rateidx = 0;
4437 }
4438
4439 if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP)
4440 rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
4441
4442 bitrate = ath12k_legacy_rates[rateidx].bitrate;
4443 hw_value = ath12k_legacy_rates[rateidx].hw_value;
4444
4445 if (ath12k_mac_bitrate_is_cck(bitrate))
4446 preamble = WMI_RATE_PREAMBLE_CCK;
4447 else
4448 preamble = WMI_RATE_PREAMBLE_OFDM;
4449
4450 rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
4451
4452 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4453 "mac vdev %d mcast_rate %x\n",
4454 arvif->vdev_id, rate);
4455
4456 vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
4457 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4458 vdev_param, rate);
4459 if (ret)
4460 ath12k_warn(ar->ab,
4461 "failed to set mcast rate on vdev %i: %d\n",
4462 arvif->vdev_id, ret);
4463
4464 vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
4465 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4466 vdev_param, rate);
4467 if (ret)
4468 ath12k_warn(ar->ab,
4469 "failed to set bcast rate on vdev %i: %d\n",
4470 arvif->vdev_id, ret);
4471 }
4472
4473 if (changed & BSS_CHANGED_BASIC_RATES &&
4474 !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))
4475 ath12k_recalculate_mgmt_rate(ar, arvif, &def);
4476
4477 if (changed & BSS_CHANGED_TWT) {
4478 if (info->twt_requester || info->twt_responder)
4479 ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
4480 else
4481 ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
4482 }
4483
4484 if (changed & BSS_CHANGED_HE_OBSS_PD)
4485 ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
4486 &info->he_obss_pd);
4487
4488 if (changed & BSS_CHANGED_HE_BSS_COLOR) {
4489 if (vif->type == NL80211_IFTYPE_AP) {
4490 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4491 arvif->vdev_id,
4492 info->he_bss_color.color,
4493 ATH12K_BSS_COLOR_AP_PERIODS,
4494 info->he_bss_color.enabled);
4495 if (ret)
4496 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4497 arvif->vdev_id, ret);
4498 } else if (vif->type == NL80211_IFTYPE_STATION) {
4499 ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
4500 arvif->vdev_id,
4501 1);
4502 if (ret)
4503 ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
4504 arvif->vdev_id, ret);
4505 ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4506 arvif->vdev_id,
4507 0,
4508 ATH12K_BSS_COLOR_STA_PERIODS,
4509 1);
4510 if (ret)
4511 ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4512 arvif->vdev_id, ret);
4513 }
4514 }
4515
4516 ath12k_mac_fils_discovery(arvif, info);
4517 }
4518
ath12k_ahvif_get_link_cache(struct ath12k_vif * ahvif,u8 link_id)4519 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif,
4520 u8 link_id)
4521 {
4522 if (!ahvif->cache[link_id]) {
4523 ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL);
4524 if (ahvif->cache[link_id])
4525 INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list);
4526 }
4527
4528 return ahvif->cache[link_id];
4529 }
4530
ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache * cache)4531 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache)
4532 {
4533 struct ath12k_key_conf *key_conf, *tmp;
4534
4535 if (!cache || list_empty(&cache->key_conf.list))
4536 return;
4537 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
4538 list_del(&key_conf->list);
4539 kfree(key_conf);
4540 }
4541 }
4542
ath12k_ahvif_put_link_cache(struct ath12k_vif * ahvif,u8 link_id)4543 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id)
4544 {
4545 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
4546 return;
4547
4548 ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]);
4549 kfree(ahvif->cache[link_id]);
4550 ahvif->cache[link_id] = NULL;
4551 }
4552
ath12k_mac_op_link_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u64 changed)4553 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
4554 struct ieee80211_vif *vif,
4555 struct ieee80211_bss_conf *info,
4556 u64 changed)
4557 {
4558 struct ath12k *ar;
4559 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4560 struct ath12k_vif_cache *cache;
4561 struct ath12k_link_vif *arvif;
4562 u8 link_id = info->link_id;
4563
4564 lockdep_assert_wiphy(hw->wiphy);
4565
4566 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4567
4568 /* if the vdev is not created on a certain radio,
4569 * cache the info to be updated later on vdev creation
4570 */
4571
4572 if (!arvif || !arvif->is_created) {
4573 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
4574 if (!cache)
4575 return;
4576
4577 cache->bss_conf_changed |= changed;
4578
4579 return;
4580 }
4581
4582 ar = arvif->ar;
4583
4584 ath12k_mac_bss_info_changed(ar, arvif, info, changed);
4585 }
4586
4587 static struct ath12k*
ath12k_mac_select_scan_device(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 center_freq)4588 ath12k_mac_select_scan_device(struct ieee80211_hw *hw,
4589 struct ieee80211_vif *vif,
4590 u32 center_freq)
4591 {
4592 struct ath12k_hw *ah = hw->priv;
4593 enum nl80211_band band;
4594 struct ath12k *ar;
4595 int i;
4596
4597 if (ah->num_radio == 1)
4598 return ah->radio;
4599
4600 /* Currently mac80211 supports splitting scan requests into
4601 * multiple scan requests per band.
4602 * Loop through first channel and determine the scan radio
4603 * TODO: There could be 5 GHz low/high channels in that case
4604 * split the hw request and perform multiple scans
4605 */
4606
4607 if (center_freq < ATH12K_MIN_5GHZ_FREQ)
4608 band = NL80211_BAND_2GHZ;
4609 else if (center_freq < ATH12K_MIN_6GHZ_FREQ)
4610 band = NL80211_BAND_5GHZ;
4611 else
4612 band = NL80211_BAND_6GHZ;
4613
4614 for_each_ar(ah, ar, i) {
4615 if (ar->mac.sbands[band].channels &&
4616 center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
4617 center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
4618 return ar;
4619 }
4620
4621 return NULL;
4622 }
4623
__ath12k_mac_scan_finish(struct ath12k * ar)4624 void __ath12k_mac_scan_finish(struct ath12k *ar)
4625 {
4626 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4627
4628 lockdep_assert_held(&ar->data_lock);
4629
4630 switch (ar->scan.state) {
4631 case ATH12K_SCAN_IDLE:
4632 break;
4633 case ATH12K_SCAN_RUNNING:
4634 case ATH12K_SCAN_ABORTING:
4635 if (ar->scan.is_roc && ar->scan.roc_notify)
4636 ieee80211_remain_on_channel_expired(hw);
4637 fallthrough;
4638 case ATH12K_SCAN_STARTING:
4639 cancel_delayed_work(&ar->scan.timeout);
4640 complete_all(&ar->scan.completed);
4641 wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
4642 break;
4643 }
4644 }
4645
ath12k_mac_scan_finish(struct ath12k * ar)4646 void ath12k_mac_scan_finish(struct ath12k *ar)
4647 {
4648 spin_lock_bh(&ar->data_lock);
4649 __ath12k_mac_scan_finish(ar);
4650 spin_unlock_bh(&ar->data_lock);
4651 }
4652
ath12k_scan_stop(struct ath12k * ar)4653 static int ath12k_scan_stop(struct ath12k *ar)
4654 {
4655 struct ath12k_wmi_scan_cancel_arg arg = {
4656 .req_type = WLAN_SCAN_CANCEL_SINGLE,
4657 .scan_id = ATH12K_SCAN_ID,
4658 };
4659 int ret;
4660
4661 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4662
4663 /* TODO: Fill other STOP Params */
4664 arg.pdev_id = ar->pdev->pdev_id;
4665
4666 ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
4667 if (ret) {
4668 ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
4669 goto out;
4670 }
4671
4672 ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4673 if (ret == 0) {
4674 ath12k_warn(ar->ab,
4675 "failed to receive scan abort comple: timed out\n");
4676 ret = -ETIMEDOUT;
4677 } else if (ret > 0) {
4678 ret = 0;
4679 }
4680
4681 out:
4682 /* Scan state should be updated in scan completion worker but in
4683 * case firmware fails to deliver the event (for whatever reason)
4684 * it is desired to clean up scan state anyway. Firmware may have
4685 * just dropped the scan completion event delivery due to transport
4686 * pipe being overflown with data and/or it can recover on its own
4687 * before next scan request is submitted.
4688 */
4689 spin_lock_bh(&ar->data_lock);
4690 if (ret)
4691 __ath12k_mac_scan_finish(ar);
4692 spin_unlock_bh(&ar->data_lock);
4693
4694 return ret;
4695 }
4696
ath12k_scan_abort(struct ath12k * ar)4697 static void ath12k_scan_abort(struct ath12k *ar)
4698 {
4699 int ret;
4700
4701 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4702
4703 spin_lock_bh(&ar->data_lock);
4704
4705 switch (ar->scan.state) {
4706 case ATH12K_SCAN_IDLE:
4707 /* This can happen if timeout worker kicked in and called
4708 * abortion while scan completion was being processed.
4709 */
4710 break;
4711 case ATH12K_SCAN_STARTING:
4712 case ATH12K_SCAN_ABORTING:
4713 ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
4714 ar->scan.state);
4715 break;
4716 case ATH12K_SCAN_RUNNING:
4717 ar->scan.state = ATH12K_SCAN_ABORTING;
4718 spin_unlock_bh(&ar->data_lock);
4719
4720 ret = ath12k_scan_stop(ar);
4721 if (ret)
4722 ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
4723
4724 spin_lock_bh(&ar->data_lock);
4725 break;
4726 }
4727
4728 spin_unlock_bh(&ar->data_lock);
4729 }
4730
ath12k_scan_timeout_work(struct work_struct * work)4731 static void ath12k_scan_timeout_work(struct work_struct *work)
4732 {
4733 struct ath12k *ar = container_of(work, struct ath12k,
4734 scan.timeout.work);
4735
4736 wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
4737 ath12k_scan_abort(ar);
4738 wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
4739 }
4740
ath12k_mac_scan_send_complete(struct ath12k * ar,struct cfg80211_scan_info * info)4741 static void ath12k_mac_scan_send_complete(struct ath12k *ar,
4742 struct cfg80211_scan_info *info)
4743 {
4744 struct ath12k_hw *ah = ar->ah;
4745 struct ath12k *partner_ar;
4746 int i;
4747
4748 lockdep_assert_wiphy(ah->hw->wiphy);
4749
4750 for_each_ar(ah, partner_ar, i)
4751 if (partner_ar != ar &&
4752 partner_ar->scan.state == ATH12K_SCAN_RUNNING)
4753 return;
4754
4755 ieee80211_scan_completed(ah->hw, info);
4756 }
4757
ath12k_scan_vdev_clean_work(struct wiphy * wiphy,struct wiphy_work * work)4758 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work)
4759 {
4760 struct ath12k *ar = container_of(work, struct ath12k,
4761 scan.vdev_clean_wk);
4762 struct ath12k_hw *ah = ar->ah;
4763 struct ath12k_link_vif *arvif;
4764
4765 lockdep_assert_wiphy(wiphy);
4766
4767 arvif = ar->scan.arvif;
4768
4769 /* The scan vdev has already been deleted. This can occur when a
4770 * new scan request is made on the same vif with a different
4771 * frequency, causing the scan arvif to move from one radio to
4772 * another. Or, scan was abrupted and via remove interface, the
4773 * arvif is already deleted. Alternatively, if the scan vdev is not
4774 * being used as an actual vdev, then do not delete it.
4775 */
4776 if (!arvif || arvif->is_started)
4777 goto work_complete;
4778
4779 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)",
4780 arvif->link_id);
4781
4782 ath12k_mac_remove_link_interface(ah->hw, arvif);
4783 ath12k_mac_unassign_link_vif(arvif);
4784
4785 work_complete:
4786 spin_lock_bh(&ar->data_lock);
4787 ar->scan.arvif = NULL;
4788 if (!ar->scan.is_roc) {
4789 struct cfg80211_scan_info info = {
4790 .aborted = ((ar->scan.state ==
4791 ATH12K_SCAN_ABORTING) ||
4792 (ar->scan.state ==
4793 ATH12K_SCAN_STARTING)),
4794 };
4795
4796 ath12k_mac_scan_send_complete(ar, &info);
4797 }
4798
4799 ar->scan.state = ATH12K_SCAN_IDLE;
4800 ar->scan_channel = NULL;
4801 ar->scan.roc_freq = 0;
4802 spin_unlock_bh(&ar->data_lock);
4803 }
4804
ath12k_start_scan(struct ath12k * ar,struct ath12k_wmi_scan_req_arg * arg)4805 static int ath12k_start_scan(struct ath12k *ar,
4806 struct ath12k_wmi_scan_req_arg *arg)
4807 {
4808 int ret;
4809
4810 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4811
4812 ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
4813 if (ret)
4814 return ret;
4815
4816 ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4817 if (ret == 0) {
4818 ret = ath12k_scan_stop(ar);
4819 if (ret)
4820 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
4821
4822 return -ETIMEDOUT;
4823 }
4824
4825 /* If we failed to start the scan, return error code at
4826 * this point. This is probably due to some issue in the
4827 * firmware, but no need to wedge the driver due to that...
4828 */
4829 spin_lock_bh(&ar->data_lock);
4830 if (ar->scan.state == ATH12K_SCAN_IDLE) {
4831 spin_unlock_bh(&ar->data_lock);
4832 return -EINVAL;
4833 }
4834 spin_unlock_bh(&ar->data_lock);
4835
4836 return 0;
4837 }
4838
ath12k_mac_get_fw_stats(struct ath12k * ar,struct ath12k_fw_stats_req_params * param)4839 int ath12k_mac_get_fw_stats(struct ath12k *ar,
4840 struct ath12k_fw_stats_req_params *param)
4841 {
4842 struct ath12k_base *ab = ar->ab;
4843 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
4844 unsigned long time_left;
4845 int ret;
4846
4847 guard(mutex)(&ah->hw_mutex);
4848
4849 if (ah->state != ATH12K_HW_STATE_ON)
4850 return -ENETDOWN;
4851
4852 ath12k_fw_stats_reset(ar);
4853
4854 reinit_completion(&ar->fw_stats_complete);
4855 reinit_completion(&ar->fw_stats_done);
4856
4857 ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id,
4858 param->vdev_id, param->pdev_id);
4859 if (ret) {
4860 ath12k_warn(ab, "failed to request fw stats: %d\n", ret);
4861 return ret;
4862 }
4863
4864 ath12k_dbg(ab, ATH12K_DBG_WMI,
4865 "get fw stat pdev id %d vdev id %d stats id 0x%x\n",
4866 param->pdev_id, param->vdev_id, param->stats_id);
4867
4868 time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
4869 if (!time_left) {
4870 ath12k_warn(ab, "time out while waiting for get fw stats\n");
4871 return -ETIMEDOUT;
4872 }
4873
4874 /* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back
4875 * when stats data buffer limit is reached. fw_stats_complete
4876 * is completed once host receives first event from firmware, but
4877 * still there could be more events following. Below is to wait
4878 * until firmware completes sending all the events.
4879 */
4880 time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
4881 if (!time_left) {
4882 ath12k_warn(ab, "time out while waiting for fw stats done\n");
4883 return -ETIMEDOUT;
4884 }
4885
4886 return 0;
4887 }
4888
ath12k_mac_op_get_txpower(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,int * dbm)4889 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw,
4890 struct ieee80211_vif *vif,
4891 unsigned int link_id,
4892 int *dbm)
4893 {
4894 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4895 struct ath12k_fw_stats_req_params params = {};
4896 struct ath12k_fw_stats_pdev *pdev;
4897 struct ath12k_hw *ah = hw->priv;
4898 struct ath12k_link_vif *arvif;
4899 struct ath12k_base *ab;
4900 struct ath12k *ar;
4901 int ret;
4902
4903 /* Final Tx power is minimum of Target Power, CTL power, Regulatory
4904 * Power, PSD EIRP Power. We just know the Regulatory power from the
4905 * regulatory rules obtained. FW knows all these power and sets the min
4906 * of these. Hence, we request the FW pdev stats in which FW reports
4907 * the minimum of all vdev's channel Tx power.
4908 */
4909 lockdep_assert_wiphy(hw->wiphy);
4910
4911 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4912 if (!arvif || !arvif->ar)
4913 return -EINVAL;
4914
4915 ar = arvif->ar;
4916 ab = ar->ab;
4917 if (ah->state != ATH12K_HW_STATE_ON)
4918 goto err_fallback;
4919
4920 if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags))
4921 return -EAGAIN;
4922
4923 /* Limit the requests to Firmware for fetching the tx power */
4924 if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID &&
4925 time_before(jiffies,
4926 msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) +
4927 ar->last_tx_power_update))
4928 goto send_tx_power;
4929
4930 params.pdev_id = ar->pdev->pdev_id;
4931 params.vdev_id = arvif->vdev_id;
4932 params.stats_id = WMI_REQUEST_PDEV_STAT;
4933 ret = ath12k_mac_get_fw_stats(ar, ¶ms);
4934 if (ret) {
4935 ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
4936 goto err_fallback;
4937 }
4938
4939 spin_lock_bh(&ar->data_lock);
4940 pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
4941 struct ath12k_fw_stats_pdev, list);
4942 if (!pdev) {
4943 spin_unlock_bh(&ar->data_lock);
4944 goto err_fallback;
4945 }
4946
4947 /* tx power reported by firmware is in units of 0.5 dBm */
4948 ar->chan_tx_pwr = pdev->chan_tx_power / 2;
4949 spin_unlock_bh(&ar->data_lock);
4950 ar->last_tx_power_update = jiffies;
4951
4952 send_tx_power:
4953 *dbm = ar->chan_tx_pwr;
4954 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n",
4955 *dbm);
4956 return 0;
4957
4958 err_fallback:
4959 /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
4960 *dbm = vif->bss_conf.txpower;
4961 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
4962 *dbm);
4963 return 0;
4964 }
4965
4966 static u8
ath12k_mac_find_link_id_by_ar(struct ath12k_vif * ahvif,struct ath12k * ar)4967 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar)
4968 {
4969 struct ath12k_link_vif *arvif;
4970 struct ath12k_hw *ah = ahvif->ah;
4971 unsigned long links = ahvif->links_map;
4972 unsigned long scan_links_map;
4973 u8 link_id;
4974
4975 lockdep_assert_wiphy(ah->hw->wiphy);
4976
4977 for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) {
4978 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4979
4980 if (!arvif || !arvif->is_created)
4981 continue;
4982
4983 if (ar == arvif->ar)
4984 return link_id;
4985 }
4986
4987 /* input ar is not assigned to any of the links of ML VIF, use next
4988 * available scan link for scan vdev creation. There are cases where
4989 * single scan req needs to be split in driver and initiate separate
4990 * scan requests to firmware based on device.
4991 */
4992
4993 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will
4994 * choose an available link among scan links (i.e link id >= 15)
4995 */
4996 scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
4997 if (scan_links_map)
4998 return __ffs(scan_links_map);
4999
5000 return ATH12K_FIRST_SCAN_LINK;
5001 }
5002
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)5003 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw,
5004 struct ieee80211_vif *vif,
5005 struct ieee80211_scan_request *hw_req,
5006 int n_channels,
5007 struct ieee80211_channel **chan_list,
5008 struct ath12k *ar)
5009 {
5010 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5011 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5012 struct ath12k_link_vif *arvif;
5013 struct cfg80211_scan_request *req = &hw_req->req;
5014 struct ath12k_wmi_scan_req_arg *arg = NULL;
5015 u8 link_id;
5016 int ret;
5017 int i;
5018 bool create = true;
5019
5020 lockdep_assert_wiphy(hw->wiphy);
5021
5022 arvif = &ahvif->deflink;
5023
5024 /* check if any of the links of ML VIF is already started on
5025 * radio(ar) corresponding to given scan frequency and use it,
5026 * if not use scan link (link id >= 15) for scan purpose.
5027 */
5028 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
5029 /* All scan links are occupied. ideally this shouldn't happen as
5030 * mac80211 won't schedule scan for same band until ongoing scan is
5031 * completed, don't try to exceed max links just in case if it happens.
5032 */
5033 if (link_id >= ATH12K_NUM_MAX_LINKS)
5034 return -EBUSY;
5035
5036 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5037
5038 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan",
5039 arvif->link_id);
5040
5041 /* If the vif is already assigned to a specific vdev of an ar,
5042 * check whether its already started, vdev which is started
5043 * are not allowed to switch to a new radio.
5044 * If the vdev is not started, but was earlier created on a
5045 * different ar, delete that vdev and create a new one. We don't
5046 * delete at the scan stop as an optimization to avoid redundant
5047 * delete-create vdev's for the same ar, in case the request is
5048 * always on the same band for the vif
5049 */
5050 if (arvif->is_created) {
5051 if (WARN_ON(!arvif->ar))
5052 return -EINVAL;
5053
5054 if (ar != arvif->ar && arvif->is_started)
5055 return -EINVAL;
5056
5057 if (ar != arvif->ar) {
5058 ath12k_mac_remove_link_interface(hw, arvif);
5059 ath12k_mac_unassign_link_vif(arvif);
5060 } else {
5061 create = false;
5062 }
5063 }
5064
5065 if (create) {
5066 /* Previous arvif would've been cleared in radio switch block
5067 * above, assign arvif again for create.
5068 */
5069 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5070
5071 ret = ath12k_mac_vdev_create(ar, arvif);
5072 if (ret) {
5073 ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
5074 return -EINVAL;
5075 }
5076 }
5077
5078 spin_lock_bh(&ar->data_lock);
5079 switch (ar->scan.state) {
5080 case ATH12K_SCAN_IDLE:
5081 reinit_completion(&ar->scan.started);
5082 reinit_completion(&ar->scan.completed);
5083 ar->scan.state = ATH12K_SCAN_STARTING;
5084 ar->scan.is_roc = false;
5085 ar->scan.arvif = arvif;
5086 ret = 0;
5087 break;
5088 case ATH12K_SCAN_STARTING:
5089 case ATH12K_SCAN_RUNNING:
5090 case ATH12K_SCAN_ABORTING:
5091 ret = -EBUSY;
5092 break;
5093 }
5094 spin_unlock_bh(&ar->data_lock);
5095
5096 if (ret)
5097 goto exit;
5098
5099 arg = kzalloc(sizeof(*arg), GFP_KERNEL);
5100 if (!arg) {
5101 ret = -ENOMEM;
5102 goto exit;
5103 }
5104
5105 ath12k_wmi_start_scan_init(ar, arg);
5106 arg->vdev_id = arvif->vdev_id;
5107 arg->scan_id = ATH12K_SCAN_ID;
5108
5109 if (req->ie_len) {
5110 arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
5111 if (!arg->extraie.ptr) {
5112 ret = -ENOMEM;
5113 goto exit;
5114 }
5115 arg->extraie.len = req->ie_len;
5116 }
5117
5118 if (req->n_ssids) {
5119 arg->num_ssids = req->n_ssids;
5120 for (i = 0; i < arg->num_ssids; i++)
5121 arg->ssid[i] = req->ssids[i];
5122 } else {
5123 arg->scan_f_passive = 1;
5124 }
5125
5126 if (n_channels) {
5127 arg->num_chan = n_channels;
5128 arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
5129 GFP_KERNEL);
5130 if (!arg->chan_list) {
5131 ret = -ENOMEM;
5132 goto exit;
5133 }
5134
5135 for (i = 0; i < arg->num_chan; i++)
5136 arg->chan_list[i] = chan_list[i]->center_freq;
5137 }
5138
5139 ret = ath12k_start_scan(ar, arg);
5140 if (ret) {
5141 if (ret == -EBUSY)
5142 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5143 "scan engine is busy 11d state %d\n", ar->state_11d);
5144 else
5145 ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
5146
5147 spin_lock_bh(&ar->data_lock);
5148 ar->scan.state = ATH12K_SCAN_IDLE;
5149 spin_unlock_bh(&ar->data_lock);
5150 goto exit;
5151 }
5152
5153 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started");
5154
5155 /* Add a margin to account for event/command processing */
5156 ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
5157 msecs_to_jiffies(arg->max_scan_time +
5158 ATH12K_MAC_SCAN_TIMEOUT_MSECS));
5159
5160 exit:
5161 if (arg) {
5162 kfree(arg->chan_list);
5163 kfree(arg->extraie.ptr);
5164 kfree(arg);
5165 }
5166
5167 if (ar->state_11d == ATH12K_11D_PREPARING &&
5168 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5169 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
5170 ath12k_mac_11d_scan_start(ar, arvif->vdev_id);
5171
5172 return ret;
5173 }
5174
ath12k_mac_op_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req)5175 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
5176 struct ieee80211_vif *vif,
5177 struct ieee80211_scan_request *hw_req)
5178 {
5179 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5180 struct ieee80211_channel **chan_list, *chan;
5181 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5182 unsigned long links_map, link_id;
5183 struct ath12k_link_vif *arvif;
5184 struct ath12k *ar, *scan_ar;
5185 int i, j, ret = 0;
5186
5187 lockdep_assert_wiphy(hw->wiphy);
5188
5189 chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL);
5190 if (!chan_list)
5191 return -ENOMEM;
5192
5193 /* There could be channels that belong to multiple underlying radio
5194 * in same scan request as mac80211 sees it as single band. In that
5195 * case split the hw_req based on frequency range and schedule scans to
5196 * corresponding radio.
5197 */
5198 for_each_ar(ah, ar, i) {
5199 int n_chans = 0;
5200
5201 for (j = 0; j < hw_req->req.n_channels; j++) {
5202 chan = hw_req->req.channels[j];
5203 scan_ar = ath12k_mac_select_scan_device(hw, vif,
5204 chan->center_freq);
5205 if (!scan_ar) {
5206 ath12k_hw_warn(ah, "unable to select scan device for freq %d\n",
5207 chan->center_freq);
5208 ret = -EINVAL;
5209 goto abort;
5210 }
5211 if (ar != scan_ar)
5212 continue;
5213
5214 chan_list[n_chans++] = chan;
5215 }
5216 if (n_chans) {
5217 ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans,
5218 chan_list, ar);
5219 if (ret)
5220 goto abort;
5221 }
5222 }
5223 abort:
5224 /* If any of the parallel scans initiated fails, abort all and
5225 * remove the scan interfaces created. Return complete scan
5226 * failure as mac80211 assumes this as single scan request.
5227 */
5228 if (ret) {
5229 ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret);
5230 links_map = ahvif->links_map;
5231 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5232 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5233 if (!arvif)
5234 continue;
5235
5236 ar = arvif->ar;
5237 if (ar->scan.arvif == arvif) {
5238 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
5239 spin_lock_bh(&ar->data_lock);
5240 ar->scan.arvif = NULL;
5241 ar->scan.state = ATH12K_SCAN_IDLE;
5242 ar->scan_channel = NULL;
5243 ar->scan.roc_freq = 0;
5244 spin_unlock_bh(&ar->data_lock);
5245 }
5246 if (link_id >= ATH12K_FIRST_SCAN_LINK) {
5247 ath12k_mac_remove_link_interface(hw, arvif);
5248 ath12k_mac_unassign_link_vif(arvif);
5249 }
5250 }
5251 }
5252 kfree(chan_list);
5253 return ret;
5254 }
5255
ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5256 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
5257 struct ieee80211_vif *vif)
5258 {
5259 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5260 unsigned long link_id, links_map = ahvif->links_map;
5261 struct ath12k_link_vif *arvif;
5262 struct ath12k *ar;
5263
5264 lockdep_assert_wiphy(hw->wiphy);
5265
5266 for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5267 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5268 if (!arvif || arvif->is_started)
5269 continue;
5270
5271 ar = arvif->ar;
5272
5273 ath12k_scan_abort(ar);
5274
5275 cancel_delayed_work_sync(&ar->scan.timeout);
5276 }
5277 }
5278
ath12k_install_key(struct ath12k_link_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)5279 static int ath12k_install_key(struct ath12k_link_vif *arvif,
5280 struct ieee80211_key_conf *key,
5281 enum set_key_cmd cmd,
5282 const u8 *macaddr, u32 flags)
5283 {
5284 int ret;
5285 struct ath12k *ar = arvif->ar;
5286 struct wmi_vdev_install_key_arg arg = {
5287 .vdev_id = arvif->vdev_id,
5288 .key_idx = key->keyidx,
5289 .key_len = key->keylen,
5290 .key_data = key->key,
5291 .key_flags = flags,
5292 .ieee80211_key_cipher = key->cipher,
5293 .macaddr = macaddr,
5294 };
5295 struct ath12k_vif *ahvif = arvif->ahvif;
5296
5297 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5298
5299 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
5300 return 0;
5301
5302 if (cmd == DISABLE_KEY) {
5303 /* TODO: Check if FW expects value other than NONE for del */
5304 /* arg.key_cipher = WMI_CIPHER_NONE; */
5305 arg.key_len = 0;
5306 arg.key_data = NULL;
5307 goto check_order;
5308 }
5309
5310 switch (key->cipher) {
5311 case WLAN_CIPHER_SUITE_CCMP:
5312 case WLAN_CIPHER_SUITE_CCMP_256:
5313 arg.key_cipher = WMI_CIPHER_AES_CCM;
5314 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5315 break;
5316 case WLAN_CIPHER_SUITE_TKIP:
5317 arg.key_cipher = WMI_CIPHER_TKIP;
5318 arg.key_txmic_len = 8;
5319 arg.key_rxmic_len = 8;
5320 break;
5321 case WLAN_CIPHER_SUITE_GCMP:
5322 case WLAN_CIPHER_SUITE_GCMP_256:
5323 arg.key_cipher = WMI_CIPHER_AES_GCM;
5324 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5325 break;
5326 case WLAN_CIPHER_SUITE_AES_CMAC:
5327 arg.key_cipher = WMI_CIPHER_AES_CMAC;
5328 break;
5329 case WLAN_CIPHER_SUITE_BIP_GMAC_128:
5330 case WLAN_CIPHER_SUITE_BIP_GMAC_256:
5331 arg.key_cipher = WMI_CIPHER_AES_GMAC;
5332 break;
5333 case WLAN_CIPHER_SUITE_BIP_CMAC_256:
5334 arg.key_cipher = WMI_CIPHER_AES_CMAC;
5335 break;
5336 default:
5337 ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
5338 return -EOPNOTSUPP;
5339 }
5340
5341 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
5342 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
5343 IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
5344
5345 check_order:
5346 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5347 arg.key_flags == WMI_KEY_GROUP) {
5348 if (cmd == SET_KEY) {
5349 if (arvif->pairwise_key_done) {
5350 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5351 "vdev %u pairwise key done, go install group key\n",
5352 arg.vdev_id);
5353 goto install;
5354 } else {
5355 /* WCN7850 firmware requires pairwise key to be installed
5356 * before group key. In case group key comes first, cache
5357 * it and return. Will revisit it once pairwise key gets
5358 * installed.
5359 */
5360 arvif->group_key = arg;
5361 arvif->group_key_valid = true;
5362 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5363 "vdev %u group key before pairwise key, cache and skip\n",
5364 arg.vdev_id);
5365
5366 ret = 0;
5367 goto out;
5368 }
5369 } else {
5370 arvif->group_key_valid = false;
5371 }
5372 }
5373
5374 install:
5375 reinit_completion(&ar->install_key_done);
5376
5377 ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
5378 if (ret)
5379 return ret;
5380
5381 if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
5382 return -ETIMEDOUT;
5383
5384 if (ether_addr_equal(arg.macaddr, arvif->bssid))
5385 ahvif->key_cipher = arg.ieee80211_key_cipher;
5386
5387 if (ar->install_key_status) {
5388 ret = -EINVAL;
5389 goto out;
5390 }
5391
5392 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5393 arg.key_flags == WMI_KEY_PAIRWISE) {
5394 if (cmd == SET_KEY) {
5395 arvif->pairwise_key_done = true;
5396 if (arvif->group_key_valid) {
5397 /* Install cached GTK */
5398 arvif->group_key_valid = false;
5399 arg = arvif->group_key;
5400 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5401 "vdev %u pairwise key done, group key ready, go install\n",
5402 arg.vdev_id);
5403 goto install;
5404 }
5405 } else {
5406 arvif->pairwise_key_done = false;
5407 }
5408 }
5409
5410 out:
5411 if (ret) {
5412 /* In case of failure userspace may not do DISABLE_KEY
5413 * but triggers re-connection directly, so manually reset
5414 * status here.
5415 */
5416 arvif->group_key_valid = false;
5417 arvif->pairwise_key_done = false;
5418 }
5419
5420 return ret;
5421 }
5422
ath12k_clear_peer_keys(struct ath12k_link_vif * arvif,const u8 * addr)5423 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif,
5424 const u8 *addr)
5425 {
5426 struct ath12k *ar = arvif->ar;
5427 struct ath12k_base *ab = ar->ab;
5428 struct ath12k_peer *peer;
5429 int first_errno = 0;
5430 int ret;
5431 int i;
5432 u32 flags = 0;
5433
5434 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5435
5436 spin_lock_bh(&ab->base_lock);
5437 peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
5438 spin_unlock_bh(&ab->base_lock);
5439
5440 if (!peer)
5441 return -ENOENT;
5442
5443 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
5444 if (!peer->keys[i])
5445 continue;
5446
5447 /* key flags are not required to delete the key */
5448 ret = ath12k_install_key(arvif, peer->keys[i],
5449 DISABLE_KEY, addr, flags);
5450 if (ret < 0 && first_errno == 0)
5451 first_errno = ret;
5452
5453 if (ret < 0)
5454 ath12k_warn(ab, "failed to remove peer key %d: %d\n",
5455 i, ret);
5456
5457 spin_lock_bh(&ab->base_lock);
5458 peer->keys[i] = NULL;
5459 spin_unlock_bh(&ab->base_lock);
5460 }
5461
5462 return first_errno;
5463 }
5464
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)5465 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
5466 struct ath12k_link_vif *arvif,
5467 struct ath12k_link_sta *arsta,
5468 struct ieee80211_key_conf *key)
5469 {
5470 struct ieee80211_sta *sta = NULL;
5471 struct ath12k_base *ab = ar->ab;
5472 struct ath12k_peer *peer;
5473 struct ath12k_sta *ahsta;
5474 const u8 *peer_addr;
5475 int ret;
5476 u32 flags = 0;
5477
5478 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5479
5480 if (arsta)
5481 sta = ath12k_ahsta_to_sta(arsta->ahsta);
5482
5483 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
5484 return 1;
5485
5486 if (sta)
5487 peer_addr = arsta->addr;
5488 else
5489 peer_addr = arvif->bssid;
5490
5491 key->hw_key_idx = key->keyidx;
5492
5493 /* the peer should not disappear in mid-way (unless FW goes awry) since
5494 * we already hold wiphy lock. we just make sure its there now.
5495 */
5496 spin_lock_bh(&ab->base_lock);
5497 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5498 spin_unlock_bh(&ab->base_lock);
5499
5500 if (!peer) {
5501 if (cmd == SET_KEY) {
5502 ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
5503 peer_addr);
5504 return -EOPNOTSUPP;
5505 }
5506
5507 /* if the peer doesn't exist there is no key to disable
5508 * anymore
5509 */
5510 return 0;
5511 }
5512
5513 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5514 flags = WMI_KEY_PAIRWISE;
5515 else
5516 flags = WMI_KEY_GROUP;
5517
5518 ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
5519 if (ret) {
5520 ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
5521 return ret;
5522 }
5523
5524 ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
5525 if (ret) {
5526 ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
5527 return ret;
5528 }
5529
5530 spin_lock_bh(&ab->base_lock);
5531 peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5532 if (peer && cmd == SET_KEY) {
5533 peer->keys[key->keyidx] = key;
5534 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
5535 peer->ucast_keyidx = key->keyidx;
5536 peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
5537 } else {
5538 peer->mcast_keyidx = key->keyidx;
5539 peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
5540 }
5541 } else if (peer && cmd == DISABLE_KEY) {
5542 peer->keys[key->keyidx] = NULL;
5543 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5544 peer->ucast_keyidx = 0;
5545 else
5546 peer->mcast_keyidx = 0;
5547 } else if (!peer)
5548 /* impossible unless FW goes crazy */
5549 ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
5550
5551 if (sta) {
5552 ahsta = ath12k_sta_to_ahsta(sta);
5553
5554 switch (key->cipher) {
5555 case WLAN_CIPHER_SUITE_TKIP:
5556 case WLAN_CIPHER_SUITE_CCMP:
5557 case WLAN_CIPHER_SUITE_CCMP_256:
5558 case WLAN_CIPHER_SUITE_GCMP:
5559 case WLAN_CIPHER_SUITE_GCMP_256:
5560 if (cmd == SET_KEY)
5561 ahsta->pn_type = HAL_PN_TYPE_WPA;
5562 else
5563 ahsta->pn_type = HAL_PN_TYPE_NONE;
5564 break;
5565 default:
5566 ahsta->pn_type = HAL_PN_TYPE_NONE;
5567 break;
5568 }
5569 }
5570
5571 spin_unlock_bh(&ab->base_lock);
5572
5573 return 0;
5574 }
5575
ath12k_mac_update_key_cache(struct ath12k_vif_cache * cache,enum set_key_cmd cmd,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5576 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache,
5577 enum set_key_cmd cmd,
5578 struct ieee80211_sta *sta,
5579 struct ieee80211_key_conf *key)
5580 {
5581 struct ath12k_key_conf *key_conf, *tmp;
5582
5583 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
5584 if (key_conf->key != key)
5585 continue;
5586
5587 /* If SET key entry is already present in cache, nothing to do,
5588 * just return
5589 */
5590 if (cmd == SET_KEY)
5591 return 0;
5592
5593 /* DEL key for an old SET key which driver hasn't flushed yet.
5594 */
5595 list_del(&key_conf->list);
5596 kfree(key_conf);
5597 }
5598
5599 if (cmd == SET_KEY) {
5600 key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL);
5601
5602 if (!key_conf)
5603 return -ENOMEM;
5604
5605 key_conf->cmd = cmd;
5606 key_conf->sta = sta;
5607 key_conf->key = key;
5608 list_add_tail(&key_conf->list,
5609 &cache->key_conf.list);
5610 }
5611
5612 return 0;
5613 }
5614
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)5615 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5616 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5617 struct ieee80211_key_conf *key)
5618 {
5619 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5620 struct ath12k_link_vif *arvif;
5621 struct ath12k_link_sta *arsta = NULL;
5622 struct ath12k_vif_cache *cache;
5623 struct ath12k_sta *ahsta;
5624 unsigned long links;
5625 u8 link_id;
5626 int ret;
5627
5628 lockdep_assert_wiphy(hw->wiphy);
5629
5630 /* IGTK needs to be done in host software */
5631 if (key->keyidx == 4 || key->keyidx == 5)
5632 return 1;
5633
5634 if (key->keyidx > WMI_MAX_KEY_INDEX)
5635 return -ENOSPC;
5636
5637 if (sta) {
5638 ahsta = ath12k_sta_to_ahsta(sta);
5639
5640 /* For an ML STA Pairwise key is same for all associated link Stations,
5641 * hence do set key for all link STAs which are active.
5642 */
5643 if (sta->mlo) {
5644 links = ahsta->links_map;
5645 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
5646 arvif = wiphy_dereference(hw->wiphy,
5647 ahvif->link[link_id]);
5648 arsta = wiphy_dereference(hw->wiphy,
5649 ahsta->link[link_id]);
5650
5651 if (WARN_ON(!arvif || !arsta))
5652 /* arvif and arsta are expected to be valid when
5653 * STA is present.
5654 */
5655 continue;
5656
5657 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif,
5658 arsta, key);
5659 if (ret)
5660 break;
5661 }
5662
5663 return 0;
5664 }
5665
5666 arsta = &ahsta->deflink;
5667 arvif = arsta->arvif;
5668 if (WARN_ON(!arvif))
5669 return -EINVAL;
5670
5671 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key);
5672 if (ret)
5673 return ret;
5674
5675 return 0;
5676 }
5677
5678 if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
5679 link_id = key->link_id;
5680 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5681 } else {
5682 link_id = 0;
5683 arvif = &ahvif->deflink;
5684 }
5685
5686 if (!arvif || !arvif->is_created) {
5687 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
5688 if (!cache)
5689 return -ENOSPC;
5690
5691 ret = ath12k_mac_update_key_cache(cache, cmd, sta, key);
5692 if (ret)
5693 return ret;
5694
5695 return 0;
5696 }
5697
5698 ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key);
5699 if (ret)
5700 return ret;
5701
5702 return 0;
5703 }
5704
5705 static int
ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5706 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
5707 enum nl80211_band band,
5708 const struct cfg80211_bitrate_mask *mask)
5709 {
5710 int num_rates = 0;
5711 int i;
5712
5713 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5714 num_rates += hweight16(mask->control[band].vht_mcs[i]);
5715
5716 return num_rates;
5717 }
5718
5719 static int
ath12k_mac_bitrate_mask_num_he_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5720 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar,
5721 enum nl80211_band band,
5722 const struct cfg80211_bitrate_mask *mask)
5723 {
5724 int num_rates = 0;
5725 int i;
5726
5727 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
5728 num_rates += hweight16(mask->control[band].he_mcs[i]);
5729
5730 return num_rates;
5731 }
5732
5733 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)5734 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
5735 struct ath12k_link_sta *arsta,
5736 const struct cfg80211_bitrate_mask *mask,
5737 enum nl80211_band band)
5738 {
5739 struct ath12k *ar = arvif->ar;
5740 u8 vht_rate, nss;
5741 u32 rate_code;
5742 int ret, i;
5743
5744 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5745
5746 nss = 0;
5747
5748 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5749 if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5750 nss = i + 1;
5751 vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
5752 }
5753 }
5754
5755 if (!nss) {
5756 ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
5757 arsta->addr);
5758 return -EINVAL;
5759 }
5760
5761 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5762 "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
5763 arsta->addr);
5764
5765 rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
5766 WMI_RATE_PREAMBLE_VHT);
5767 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5768 arvif->vdev_id,
5769 WMI_PEER_PARAM_FIXED_RATE,
5770 rate_code);
5771 if (ret)
5772 ath12k_warn(ar->ab,
5773 "failed to update STA %pM Fixed Rate %d: %d\n",
5774 arsta->addr, rate_code, ret);
5775
5776 return ret;
5777 }
5778
5779 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)5780 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif,
5781 struct ath12k_link_sta *arsta,
5782 const struct cfg80211_bitrate_mask *mask,
5783 enum nl80211_band band)
5784 {
5785 struct ath12k *ar = arvif->ar;
5786 u8 he_rate, nss;
5787 u32 rate_code;
5788 int ret, i;
5789 struct ath12k_sta *ahsta = arsta->ahsta;
5790 struct ieee80211_sta *sta;
5791
5792 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5793
5794 sta = ath12k_ahsta_to_sta(ahsta);
5795 nss = 0;
5796
5797 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
5798 if (hweight16(mask->control[band].he_mcs[i]) == 1) {
5799 nss = i + 1;
5800 he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
5801 }
5802 }
5803
5804 if (!nss) {
5805 ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM",
5806 arsta->addr);
5807 return -EINVAL;
5808 }
5809
5810 /* Avoid updating invalid nss as fixed rate*/
5811 if (nss > sta->deflink.rx_nss)
5812 return -EINVAL;
5813
5814 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5815 "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates",
5816 arsta->addr);
5817
5818 rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1,
5819 WMI_RATE_PREAMBLE_HE);
5820
5821 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5822 arvif->vdev_id,
5823 WMI_PEER_PARAM_FIXED_RATE,
5824 rate_code);
5825 if (ret)
5826 ath12k_warn(ar->ab,
5827 "failed to update STA %pM Fixed Rate %d: %d\n",
5828 arsta->addr, rate_code, ret);
5829
5830 return ret;
5831 }
5832
ath12k_mac_station_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,bool reassoc)5833 static int ath12k_mac_station_assoc(struct ath12k *ar,
5834 struct ath12k_link_vif *arvif,
5835 struct ath12k_link_sta *arsta,
5836 bool reassoc)
5837 {
5838 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
5839 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5840 struct ieee80211_link_sta *link_sta;
5841 int ret;
5842 struct cfg80211_chan_def def;
5843 enum nl80211_band band;
5844 struct cfg80211_bitrate_mask *mask;
5845 u8 num_vht_rates, num_he_rates;
5846 u8 link_id = arvif->link_id;
5847
5848 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5849
5850 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5851 return -EPERM;
5852
5853 if (WARN_ON(!rcu_access_pointer(sta->link[link_id])))
5854 return -EINVAL;
5855
5856 band = def.chan->band;
5857 mask = &arvif->bitrate_mask;
5858
5859 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
5860 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
5861 if (!peer_arg)
5862 return -ENOMEM;
5863
5864 ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc);
5865
5866 if (peer_arg->peer_nss < 1) {
5867 ath12k_warn(ar->ab,
5868 "invalid peer NSS %d\n", peer_arg->peer_nss);
5869 return -EINVAL;
5870 }
5871
5872 peer_arg->is_assoc = true;
5873 ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
5874 if (ret) {
5875 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
5876 arsta->addr, arvif->vdev_id, ret);
5877 return ret;
5878 }
5879
5880 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
5881 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
5882 arsta->addr, arvif->vdev_id);
5883 return -ETIMEDOUT;
5884 }
5885
5886 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
5887 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
5888
5889 /* If single VHT/HE rate is configured (by set_bitrate_mask()),
5890 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
5891 * fixed param.
5892 * Note that all other rates and NSS will be disabled for this peer.
5893 */
5894 link_sta = ath12k_mac_get_link_sta(arsta);
5895 if (!link_sta) {
5896 ath12k_warn(ar->ab, "unable to access link sta in station assoc\n");
5897 return -EINVAL;
5898 }
5899
5900 spin_lock_bh(&ar->data_lock);
5901 arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
5902 arsta->bw_prev = link_sta->bandwidth;
5903 spin_unlock_bh(&ar->data_lock);
5904
5905 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
5906 ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band);
5907 } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
5908 ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
5909 if (ret)
5910 return ret;
5911 }
5912
5913 /* Re-assoc is run only to update supported rates for given station. It
5914 * doesn't make much sense to reconfigure the peer completely.
5915 */
5916 if (reassoc)
5917 return 0;
5918
5919 ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr,
5920 &link_sta->ht_cap, &link_sta->he_6ghz_capa);
5921 if (ret) {
5922 ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
5923 arvif->vdev_id, ret);
5924 return ret;
5925 }
5926
5927 if (!sta->wme) {
5928 arvif->num_legacy_stations++;
5929 ret = ath12k_recalc_rtscts_prot(arvif);
5930 if (ret)
5931 return ret;
5932 }
5933
5934 if (sta->wme && sta->uapsd_queues) {
5935 ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta);
5936 if (ret) {
5937 ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
5938 arsta->addr, arvif->vdev_id, ret);
5939 return ret;
5940 }
5941 }
5942
5943 return 0;
5944 }
5945
ath12k_mac_station_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)5946 static int ath12k_mac_station_disassoc(struct ath12k *ar,
5947 struct ath12k_link_vif *arvif,
5948 struct ath12k_link_sta *arsta)
5949 {
5950 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5951
5952 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5953
5954 if (!sta->wme) {
5955 arvif->num_legacy_stations--;
5956 return ath12k_recalc_rtscts_prot(arvif);
5957 }
5958
5959 return 0;
5960 }
5961
ath12k_sta_rc_update_wk(struct wiphy * wiphy,struct wiphy_work * wk)5962 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
5963 {
5964 struct ieee80211_link_sta *link_sta;
5965 struct ath12k *ar;
5966 struct ath12k_link_vif *arvif;
5967 struct ieee80211_sta *sta;
5968 struct cfg80211_chan_def def;
5969 enum nl80211_band band;
5970 const u8 *ht_mcs_mask;
5971 const u16 *vht_mcs_mask;
5972 const u16 *he_mcs_mask;
5973 u32 changed, bw, nss, mac_nss, smps, bw_prev;
5974 int err, num_vht_rates, num_he_rates;
5975 const struct cfg80211_bitrate_mask *mask;
5976 enum wmi_phy_mode peer_phymode;
5977 struct ath12k_link_sta *arsta;
5978 struct ieee80211_vif *vif;
5979
5980 lockdep_assert_wiphy(wiphy);
5981
5982 arsta = container_of(wk, struct ath12k_link_sta, update_wk);
5983 sta = ath12k_ahsta_to_sta(arsta->ahsta);
5984 arvif = arsta->arvif;
5985 vif = ath12k_ahvif_to_vif(arvif->ahvif);
5986 ar = arvif->ar;
5987
5988 if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5989 return;
5990
5991 band = def.chan->band;
5992 ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5993 vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5994 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
5995
5996 spin_lock_bh(&ar->data_lock);
5997
5998 changed = arsta->changed;
5999 arsta->changed = 0;
6000
6001 bw = arsta->bw;
6002 bw_prev = arsta->bw_prev;
6003 nss = arsta->nss;
6004 smps = arsta->smps;
6005
6006 spin_unlock_bh(&ar->data_lock);
6007
6008 nss = max_t(u32, 1, nss);
6009 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
6010 ath12k_mac_max_vht_nss(vht_mcs_mask),
6011 ath12k_mac_max_he_nss(he_mcs_mask));
6012 nss = min(nss, mac_nss);
6013
6014 struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
6015 kzalloc(sizeof(*peer_arg), GFP_KERNEL);
6016 if (!peer_arg)
6017 return;
6018
6019 if (changed & IEEE80211_RC_BW_CHANGED) {
6020 ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg);
6021 peer_phymode = peer_arg->peer_phymode;
6022
6023 if (bw > bw_prev) {
6024 /* Phymode shows maximum supported channel width, if we
6025 * upgrade bandwidth then due to sanity check of firmware,
6026 * we have to send WMI_PEER_PHYMODE followed by
6027 * WMI_PEER_CHWIDTH
6028 */
6029 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
6030 arsta->addr, bw, bw_prev);
6031 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6032 arvif->vdev_id, WMI_PEER_PHYMODE,
6033 peer_phymode);
6034 if (err) {
6035 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6036 arsta->addr, peer_phymode, err);
6037 return;
6038 }
6039 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6040 arvif->vdev_id, WMI_PEER_CHWIDTH,
6041 bw);
6042 if (err)
6043 ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
6044 arsta->addr, bw, err);
6045 } else {
6046 /* When we downgrade bandwidth this will conflict with phymode
6047 * and cause to trigger firmware crash. In this case we send
6048 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
6049 */
6050 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
6051 arsta->addr, bw, bw_prev);
6052 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6053 arvif->vdev_id, WMI_PEER_CHWIDTH,
6054 bw);
6055 if (err) {
6056 ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
6057 arsta->addr, bw, err);
6058 return;
6059 }
6060 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6061 arvif->vdev_id, WMI_PEER_PHYMODE,
6062 peer_phymode);
6063 if (err)
6064 ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6065 arsta->addr, peer_phymode, err);
6066 }
6067 }
6068
6069 if (changed & IEEE80211_RC_NSS_CHANGED) {
6070 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
6071 arsta->addr, nss);
6072
6073 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6074 WMI_PEER_NSS, nss);
6075 if (err)
6076 ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
6077 arsta->addr, nss, err);
6078 }
6079
6080 if (changed & IEEE80211_RC_SMPS_CHANGED) {
6081 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
6082 arsta->addr, smps);
6083
6084 err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6085 WMI_PEER_MIMO_PS_STATE, smps);
6086 if (err)
6087 ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
6088 arsta->addr, smps, err);
6089 }
6090
6091 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6092 mask = &arvif->bitrate_mask;
6093 num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6094 mask);
6095 num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band,
6096 mask);
6097
6098 /* Peer_assoc_prepare will reject vht rates in
6099 * bitrate_mask if its not available in range format and
6100 * sets vht tx_rateset as unsupported. So multiple VHT MCS
6101 * setting(eg. MCS 4,5,6) per peer is not supported here.
6102 * But, Single rate in VHT mask can be set as per-peer
6103 * fixed rate. But even if any HT rates are configured in
6104 * the bitrate mask, device will not switch to those rates
6105 * when per-peer Fixed rate is set.
6106 * TODO: Check RATEMASK_CMDID to support auto rates selection
6107 * across HT/VHT and for multiple VHT MCS support.
6108 */
6109 link_sta = ath12k_mac_get_link_sta(arsta);
6110 if (!link_sta) {
6111 ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
6112 sta->addr, arsta->link_id);
6113 return;
6114 }
6115
6116 if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
6117 ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
6118 band);
6119 } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
6120 ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
6121 } else {
6122 /* If the peer is non-VHT/HE or no fixed VHT/HE rate
6123 * is provided in the new bitrate mask we set the
6124 * other rates using peer_assoc command. Also clear
6125 * the peer fixed rate settings as it has higher proprity
6126 * than peer assoc
6127 */
6128 err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6129 arvif->vdev_id,
6130 WMI_PEER_PARAM_FIXED_RATE,
6131 WMI_FIXED_RATE_NONE);
6132 if (err)
6133 ath12k_warn(ar->ab,
6134 "failed to disable peer fixed rate for STA %pM ret %d\n",
6135 arsta->addr, err);
6136
6137 ath12k_peer_assoc_prepare(ar, arvif, arsta,
6138 peer_arg, true);
6139
6140 peer_arg->is_assoc = false;
6141 err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
6142 if (err)
6143 ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
6144 arsta->addr, arvif->vdev_id, err);
6145
6146 if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
6147 ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
6148 arsta->addr, arvif->vdev_id);
6149 }
6150 }
6151 }
6152
ath12k_mac_free_unassign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,u8 link_id)6153 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah,
6154 struct ath12k_sta *ahsta,
6155 u8 link_id)
6156 {
6157 struct ath12k_link_sta *arsta;
6158
6159 lockdep_assert_wiphy(ah->hw->wiphy);
6160
6161 if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
6162 return;
6163
6164 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6165 if (WARN_ON(!arsta))
6166 return;
6167
6168 ahsta->links_map &= ~BIT(link_id);
6169 rcu_assign_pointer(ahsta->link[link_id], NULL);
6170 synchronize_rcu();
6171
6172 if (arsta == &ahsta->deflink) {
6173 arsta->link_id = ATH12K_INVALID_LINK_ID;
6174 arsta->ahsta = NULL;
6175 arsta->arvif = NULL;
6176 return;
6177 }
6178
6179 kfree(arsta);
6180 }
6181
ath12k_mac_inc_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6182 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif,
6183 struct ath12k_link_sta *arsta)
6184 {
6185 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6186 struct ath12k *ar = arvif->ar;
6187
6188 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6189
6190 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6191 return 0;
6192
6193 if (ar->num_stations >= ar->max_num_stations)
6194 return -ENOBUFS;
6195
6196 ar->num_stations++;
6197 arvif->num_stations++;
6198
6199 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6200 "mac station %pM connected to vdev %u num_stations %u\n",
6201 arsta->addr, arvif->vdev_id, arvif->num_stations);
6202
6203 return 0;
6204 }
6205
ath12k_mac_dec_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6206 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif,
6207 struct ath12k_link_sta *arsta)
6208 {
6209 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6210 struct ath12k *ar = arvif->ar;
6211
6212 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6213
6214 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6215 return;
6216
6217 ar->num_stations--;
6218
6219 if (arvif->num_stations) {
6220 arvif->num_stations--;
6221 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6222 "mac station %pM disconnected from vdev %u num_stations %u\n",
6223 arsta->addr, arvif->vdev_id, arvif->num_stations);
6224 } else {
6225 ath12k_warn(ar->ab,
6226 "mac station %pM disconnect for vdev %u without any connected station\n",
6227 arsta->addr, arvif->vdev_id);
6228 }
6229 }
6230
ath12k_mac_station_post_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6231 static void ath12k_mac_station_post_remove(struct ath12k *ar,
6232 struct ath12k_link_vif *arvif,
6233 struct ath12k_link_sta *arsta)
6234 {
6235 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6236 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6237 struct ath12k_peer *peer;
6238
6239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6240
6241 ath12k_mac_dec_num_stations(arvif, arsta);
6242
6243 spin_lock_bh(&ar->ab->base_lock);
6244
6245 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6246 if (peer && peer->sta == sta) {
6247 ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
6248 vif->addr, arvif->vdev_id);
6249 peer->sta = NULL;
6250 list_del(&peer->list);
6251 kfree(peer);
6252 ar->num_peers--;
6253 }
6254
6255 spin_unlock_bh(&ar->ab->base_lock);
6256
6257 kfree(arsta->rx_stats);
6258 arsta->rx_stats = NULL;
6259 }
6260
ath12k_mac_station_unauthorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6261 static int ath12k_mac_station_unauthorize(struct ath12k *ar,
6262 struct ath12k_link_vif *arvif,
6263 struct ath12k_link_sta *arsta)
6264 {
6265 struct ath12k_peer *peer;
6266 int ret;
6267
6268 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6269
6270 spin_lock_bh(&ar->ab->base_lock);
6271
6272 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6273 if (peer)
6274 peer->is_authorized = false;
6275
6276 spin_unlock_bh(&ar->ab->base_lock);
6277
6278 /* Driver must clear the keys during the state change from
6279 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
6280 * returning from here, mac80211 is going to delete the keys
6281 * in __sta_info_destroy_part2(). This will ensure that the driver does
6282 * not retain stale key references after mac80211 deletes the keys.
6283 */
6284 ret = ath12k_clear_peer_keys(arvif, arsta->addr);
6285 if (ret) {
6286 ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
6287 arvif->vdev_id, ret);
6288 return ret;
6289 }
6290
6291 return 0;
6292 }
6293
ath12k_mac_station_authorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6294 static int ath12k_mac_station_authorize(struct ath12k *ar,
6295 struct ath12k_link_vif *arvif,
6296 struct ath12k_link_sta *arsta)
6297 {
6298 struct ath12k_peer *peer;
6299 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6300 int ret;
6301
6302 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6303
6304 spin_lock_bh(&ar->ab->base_lock);
6305
6306 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6307 if (peer)
6308 peer->is_authorized = true;
6309
6310 spin_unlock_bh(&ar->ab->base_lock);
6311
6312 if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
6313 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6314 arvif->vdev_id,
6315 WMI_PEER_AUTHORIZE,
6316 1);
6317 if (ret) {
6318 ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
6319 arsta->addr, arvif->vdev_id, ret);
6320 return ret;
6321 }
6322 }
6323
6324 return 0;
6325 }
6326
ath12k_mac_station_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6327 static int ath12k_mac_station_remove(struct ath12k *ar,
6328 struct ath12k_link_vif *arvif,
6329 struct ath12k_link_sta *arsta)
6330 {
6331 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6332 struct ath12k_vif *ahvif = arvif->ahvif;
6333 int ret = 0;
6334
6335 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6336
6337 wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk);
6338
6339 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6340 ath12k_bss_disassoc(ar, arvif);
6341 ret = ath12k_mac_vdev_stop(arvif);
6342 if (ret)
6343 ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
6344 arvif->vdev_id, ret);
6345 }
6346
6347 if (sta->mlo)
6348 return ret;
6349
6350 ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr);
6351
6352 ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6353 if (ret)
6354 ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
6355 arsta->addr, arvif->vdev_id);
6356 else
6357 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
6358 arsta->addr, arvif->vdev_id);
6359
6360 ath12k_mac_station_post_remove(ar, arvif, arsta);
6361
6362 if (sta->valid_links)
6363 ath12k_mac_free_unassign_link_sta(ahvif->ah,
6364 arsta->ahsta, arsta->link_id);
6365
6366 return ret;
6367 }
6368
ath12k_mac_station_add(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6369 static int ath12k_mac_station_add(struct ath12k *ar,
6370 struct ath12k_link_vif *arvif,
6371 struct ath12k_link_sta *arsta)
6372 {
6373 struct ath12k_base *ab = ar->ab;
6374 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6375 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6376 struct ath12k_wmi_peer_create_arg peer_param = {};
6377 int ret;
6378
6379 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6380
6381 ret = ath12k_mac_inc_num_stations(arvif, arsta);
6382 if (ret) {
6383 ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
6384 ar->max_num_stations);
6385 goto exit;
6386 }
6387
6388 if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) {
6389 arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
6390 if (!arsta->rx_stats) {
6391 ret = -ENOMEM;
6392 goto dec_num_station;
6393 }
6394 }
6395
6396 peer_param.vdev_id = arvif->vdev_id;
6397 peer_param.peer_addr = arsta->addr;
6398 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6399 peer_param.ml_enabled = sta->mlo;
6400
6401 ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
6402 if (ret) {
6403 ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
6404 arsta->addr, arvif->vdev_id);
6405 goto free_peer;
6406 }
6407
6408 ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
6409 arsta->addr, arvif->vdev_id);
6410
6411 if (ieee80211_vif_is_mesh(vif)) {
6412 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6413 arvif->vdev_id,
6414 WMI_PEER_USE_4ADDR, 1);
6415 if (ret) {
6416 ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
6417 arsta->addr, ret);
6418 goto free_peer;
6419 }
6420 }
6421
6422 ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr);
6423 if (ret) {
6424 ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
6425 arsta->addr, arvif->vdev_id, ret);
6426 goto free_peer;
6427 }
6428
6429 if (ab->hw_params->vdev_start_delay &&
6430 !arvif->is_started &&
6431 arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) {
6432 ret = ath12k_start_vdev_delay(ar, arvif);
6433 if (ret) {
6434 ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
6435 goto free_peer;
6436 }
6437 }
6438
6439 ewma_avg_rssi_init(&arsta->avg_rssi);
6440 return 0;
6441
6442 free_peer:
6443 ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6444 kfree(arsta->rx_stats);
6445 arsta->rx_stats = NULL;
6446 dec_num_station:
6447 ath12k_mac_dec_num_stations(arvif, arsta);
6448 exit:
6449 return ret;
6450 }
6451
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)6452 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
6453 struct ath12k_sta *ahsta,
6454 struct ath12k_link_sta *arsta,
6455 struct ath12k_vif *ahvif,
6456 u8 link_id)
6457 {
6458 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6459 struct ieee80211_link_sta *link_sta;
6460 struct ath12k_link_vif *arvif;
6461
6462 lockdep_assert_wiphy(ah->hw->wiphy);
6463
6464 if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
6465 return -EINVAL;
6466
6467 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6468 if (!arvif)
6469 return -EINVAL;
6470
6471 memset(arsta, 0, sizeof(*arsta));
6472
6473 link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]);
6474 if (!link_sta)
6475 return -EINVAL;
6476
6477 ether_addr_copy(arsta->addr, link_sta->addr);
6478
6479 /* logical index of the link sta in order of creation */
6480 arsta->link_idx = ahsta->num_peer++;
6481
6482 arsta->link_id = link_id;
6483 ahsta->links_map |= BIT(arsta->link_id);
6484 arsta->arvif = arvif;
6485 arsta->ahsta = ahsta;
6486 ahsta->ahvif = ahvif;
6487
6488 wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);
6489
6490 rcu_assign_pointer(ahsta->link[link_id], arsta);
6491
6492 return 0;
6493 }
6494
ath12k_mac_ml_station_remove(struct ath12k_vif * ahvif,struct ath12k_sta * ahsta)6495 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif,
6496 struct ath12k_sta *ahsta)
6497 {
6498 struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6499 struct ath12k_hw *ah = ahvif->ah;
6500 struct ath12k_link_vif *arvif;
6501 struct ath12k_link_sta *arsta;
6502 unsigned long links;
6503 struct ath12k *ar;
6504 u8 link_id;
6505
6506 lockdep_assert_wiphy(ah->hw->wiphy);
6507
6508 ath12k_peer_mlo_link_peers_delete(ahvif, ahsta);
6509
6510 /* validate link station removal and clear arsta links */
6511 links = ahsta->links_map;
6512 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6513 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6514 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6515 if (!arvif || !arsta)
6516 continue;
6517
6518 ar = arvif->ar;
6519
6520 ath12k_mac_station_post_remove(ar, arvif, arsta);
6521
6522 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
6523 }
6524
6525 ath12k_peer_ml_delete(ah, sta);
6526 }
6527
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)6528 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
6529 struct ath12k_link_vif *arvif,
6530 struct ath12k_link_sta *arsta,
6531 enum ieee80211_sta_state old_state,
6532 enum ieee80211_sta_state new_state)
6533 {
6534 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6535 struct ieee80211_bss_conf *link_conf;
6536 struct ath12k *ar = arvif->ar;
6537 struct ath12k_reg_info *reg_info;
6538 struct ath12k_base *ab = ar->ab;
6539 int ret = 0;
6540
6541 lockdep_assert_wiphy(hw->wiphy);
6542
6543 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
6544 arsta->link_id, arsta->addr, old_state, new_state);
6545
6546 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
6547 * from driver
6548 */
6549 if ((old_state == IEEE80211_STA_NONE &&
6550 new_state == IEEE80211_STA_NOTEXIST)) {
6551 ret = ath12k_mac_station_remove(ar, arvif, arsta);
6552 if (ret) {
6553 ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n",
6554 arsta->addr, arvif->vdev_id);
6555 goto exit;
6556 }
6557 }
6558
6559 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */
6560 if (old_state == IEEE80211_STA_NOTEXIST &&
6561 new_state == IEEE80211_STA_NONE) {
6562 ret = ath12k_mac_station_add(ar, arvif, arsta);
6563 if (ret)
6564 ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n",
6565 arsta->addr, arvif->vdev_id);
6566
6567 /* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
6568 * peer associated to AP/Mesh/ADHOC vif type.
6569 */
6570 } else if (old_state == IEEE80211_STA_AUTH &&
6571 new_state == IEEE80211_STA_ASSOC &&
6572 (vif->type == NL80211_IFTYPE_AP ||
6573 vif->type == NL80211_IFTYPE_MESH_POINT ||
6574 vif->type == NL80211_IFTYPE_ADHOC)) {
6575 ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
6576 if (ret)
6577 ath12k_warn(ab, "Failed to associate station: %pM\n",
6578 arsta->addr);
6579
6580 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
6581 * authorized
6582 */
6583 } else if (old_state == IEEE80211_STA_ASSOC &&
6584 new_state == IEEE80211_STA_AUTHORIZED) {
6585 ret = ath12k_mac_station_authorize(ar, arvif, arsta);
6586 if (ret) {
6587 ath12k_warn(ab, "Failed to authorize station: %pM\n",
6588 arsta->addr);
6589 goto exit;
6590 }
6591
6592 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
6593 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6594 link_conf = ath12k_mac_get_link_bss_conf(arvif);
6595 reg_info = ab->reg_info[ar->pdev_idx];
6596 ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n");
6597 ath12k_hw_to_ah(hw)->regd_updated = false;
6598 ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type,
6599 link_conf->power_type);
6600 }
6601
6602 /* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
6603 * deauthorize it.
6604 */
6605 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
6606 new_state == IEEE80211_STA_ASSOC) {
6607 ath12k_mac_station_unauthorize(ar, arvif, arsta);
6608
6609 /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to
6610 * AP/mesh/ADHOC vif type.
6611 */
6612 } else if (old_state == IEEE80211_STA_ASSOC &&
6613 new_state == IEEE80211_STA_AUTH &&
6614 (vif->type == NL80211_IFTYPE_AP ||
6615 vif->type == NL80211_IFTYPE_MESH_POINT ||
6616 vif->type == NL80211_IFTYPE_ADHOC)) {
6617 ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
6618 if (ret)
6619 ath12k_warn(ab, "Failed to disassociate station: %pM\n",
6620 arsta->addr);
6621 }
6622
6623 exit:
6624 return ret;
6625 }
6626
ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq,u8 mac_id)6627 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range,
6628 u32 freq, u8 mac_id)
6629 {
6630 return (freq >= freq_range[mac_id].low_2ghz_freq &&
6631 freq <= freq_range[mac_id].high_2ghz_freq) ||
6632 (freq >= freq_range[mac_id].low_5ghz_freq &&
6633 freq <= freq_range[mac_id].high_5ghz_freq);
6634 }
6635
6636 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)6637 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab,
6638 struct ath12k_hw_mode_freq_range_arg *freq_range,
6639 u32 freq_link1, u32 freq_link2)
6640 {
6641 u8 i;
6642
6643 for (i = 0; i < MAX_RADIOS; i++) {
6644 if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) &&
6645 ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i))
6646 return true;
6647 }
6648
6649 return false;
6650 }
6651
ath12k_mac_is_hw_dbs_capable(struct ath12k_base * ab)6652 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab)
6653 {
6654 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6655 ab->wmi_ab.svc_map) &&
6656 ab->wmi_ab.hw_mode_info.support_dbs;
6657 }
6658
ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6659 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab,
6660 u32 freq_link1, u32 freq_link2)
6661 {
6662 struct ath12k_hw_mode_freq_range_arg *freq_range;
6663
6664 if (!ath12k_mac_is_hw_dbs_capable(ab))
6665 return true;
6666
6667 freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS];
6668 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range,
6669 freq_link1, freq_link2);
6670 }
6671
ath12k_mac_is_hw_sbs_capable(struct ath12k_base * ab)6672 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab)
6673 {
6674 return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6675 ab->wmi_ab.svc_map) &&
6676 ab->wmi_ab.hw_mode_info.support_sbs;
6677 }
6678
ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6679 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab,
6680 u32 freq_link1, u32 freq_link2)
6681 {
6682 struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info;
6683 struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share;
6684 struct ath12k_hw_mode_freq_range_arg *sbs_low_share;
6685 struct ath12k_hw_mode_freq_range_arg *sbs_range;
6686
6687 if (!ath12k_mac_is_hw_sbs_capable(ab))
6688 return true;
6689
6690 if (ab->wmi_ab.sbs_lower_band_end_freq) {
6691 sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE];
6692 sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE];
6693
6694 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share,
6695 freq_link1, freq_link2) ||
6696 ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share,
6697 freq_link1, freq_link2);
6698 }
6699
6700 sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS];
6701 return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range,
6702 freq_link1, freq_link2);
6703 }
6704
ath12k_mac_freqs_on_same_mac(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6705 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab,
6706 u32 freq_link1, u32 freq_link2)
6707 {
6708 return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) &&
6709 ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2);
6710 }
6711
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)6712 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab,
6713 enum wmi_mlo_link_force_reason reason,
6714 enum wmi_mlo_link_force_mode mode,
6715 u8 *mlo_vdev_id_lst,
6716 u8 num_mlo_vdev,
6717 u8 *mlo_inactive_vdev_lst,
6718 u8 num_mlo_inactive_vdev)
6719 {
6720 struct wmi_mlo_link_set_active_arg param = {};
6721 u32 entry_idx, entry_offset, vdev_idx;
6722 u8 vdev_id;
6723
6724 param.reason = reason;
6725 param.force_mode = mode;
6726
6727 for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
6728 vdev_id = mlo_vdev_id_lst[vdev_idx];
6729 entry_idx = vdev_id / 32;
6730 entry_offset = vdev_id % 32;
6731 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6732 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6733 entry_idx, num_mlo_vdev, vdev_id);
6734 return -EINVAL;
6735 }
6736 param.vdev_bitmap[entry_idx] |= 1 << entry_offset;
6737 /* update entry number if entry index changed */
6738 if (param.num_vdev_bitmap < entry_idx + 1)
6739 param.num_vdev_bitmap = entry_idx + 1;
6740 }
6741
6742 ath12k_dbg(ab, ATH12K_DBG_MAC,
6743 "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
6744 param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]);
6745
6746 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) {
6747 for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) {
6748 vdev_id = mlo_inactive_vdev_lst[vdev_idx];
6749 entry_idx = vdev_id / 32;
6750 entry_offset = vdev_id % 32;
6751 if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6752 ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6753 entry_idx, num_mlo_inactive_vdev, vdev_id);
6754 return -EINVAL;
6755 }
6756 param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset;
6757 /* update entry number if entry index changed */
6758 if (param.num_inactive_vdev_bitmap < entry_idx + 1)
6759 param.num_inactive_vdev_bitmap = entry_idx + 1;
6760 }
6761
6762 ath12k_dbg(ab, ATH12K_DBG_MAC,
6763 "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x",
6764 param.num_inactive_vdev_bitmap,
6765 param.inactive_vdev_bitmap[0],
6766 param.inactive_vdev_bitmap[1]);
6767 }
6768
6769 if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM ||
6770 mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) {
6771 param.num_link_entry = 1;
6772 param.link_num[0].num_of_link = num_mlo_vdev - 1;
6773 }
6774
6775 return ath12k_wmi_send_mlo_link_set_active_cmd(ab, ¶m);
6776 }
6777
ath12k_mac_mlo_sta_update_link_active(struct ath12k_base * ab,struct ieee80211_hw * hw,struct ath12k_vif * ahvif)6778 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab,
6779 struct ieee80211_hw *hw,
6780 struct ath12k_vif *ahvif)
6781 {
6782 u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6783 u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6784 unsigned long links = ahvif->links_map;
6785 enum wmi_mlo_link_force_reason reason;
6786 struct ieee80211_chanctx_conf *conf;
6787 enum wmi_mlo_link_force_mode mode;
6788 struct ieee80211_bss_conf *info;
6789 struct ath12k_link_vif *arvif;
6790 u8 num_mlo_vdev = 0;
6791 u8 link_id;
6792
6793 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6794 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
6795 /* make sure vdev is created on this device */
6796 if (!arvif || !arvif->is_created || arvif->ar->ab != ab)
6797 continue;
6798
6799 info = ath12k_mac_get_link_bss_conf(arvif);
6800 conf = wiphy_dereference(hw->wiphy, info->chanctx_conf);
6801 mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq;
6802
6803 mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id;
6804 num_mlo_vdev++;
6805 }
6806
6807 /* It is not allowed to activate more links than a single device
6808 * supported. Something goes wrong if we reach here.
6809 */
6810 if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6811 WARN_ON_ONCE(1);
6812 return -EINVAL;
6813 }
6814
6815 /* if 2 links are established and both link channels fall on the
6816 * same hardware MAC, send command to firmware to deactivate one
6817 * of them.
6818 */
6819 if (num_mlo_vdev == 2 &&
6820 ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0],
6821 mlo_freq_list[1])) {
6822 mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM;
6823 reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT;
6824 return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode,
6825 mlo_vdev_id_lst, num_mlo_vdev,
6826 NULL, 0);
6827 }
6828
6829 return 0;
6830 }
6831
ath12k_mac_are_sbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6832 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6833 {
6834 if (!ath12k_mac_is_hw_sbs_capable(ab))
6835 return false;
6836
6837 if (ath12k_is_2ghz_channel_freq(freq_1) ||
6838 ath12k_is_2ghz_channel_freq(freq_2))
6839 return false;
6840
6841 return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2);
6842 }
6843
ath12k_mac_are_dbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6844 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6845 {
6846 if (!ath12k_mac_is_hw_dbs_capable(ab))
6847 return false;
6848
6849 return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2);
6850 }
6851
ath12k_mac_select_links(struct ath12k_base * ab,struct ieee80211_vif * vif,struct ieee80211_hw * hw,u16 * selected_links)6852 static int ath12k_mac_select_links(struct ath12k_base *ab,
6853 struct ieee80211_vif *vif,
6854 struct ieee80211_hw *hw,
6855 u16 *selected_links)
6856 {
6857 unsigned long useful_links = ieee80211_vif_usable_links(vif);
6858 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6859 u8 num_useful_links = hweight_long(useful_links);
6860 struct ieee80211_chanctx_conf *chanctx;
6861 struct ath12k_link_vif *assoc_arvif;
6862 u32 assoc_link_freq, partner_freq;
6863 u16 sbs_links = 0, dbs_links = 0;
6864 struct ieee80211_bss_conf *info;
6865 struct ieee80211_channel *chan;
6866 struct ieee80211_sta *sta;
6867 struct ath12k_sta *ahsta;
6868 u8 link_id;
6869
6870 /* activate all useful links if less than max supported */
6871 if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6872 *selected_links = useful_links;
6873 return 0;
6874 }
6875
6876 /* only in station mode we can get here, so it's safe
6877 * to use ap_addr
6878 */
6879 rcu_read_lock();
6880 sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
6881 if (!sta) {
6882 rcu_read_unlock();
6883 ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr);
6884 return -EINVAL;
6885 }
6886
6887 ahsta = ath12k_sta_to_ahsta(sta);
6888 assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]);
6889 info = ath12k_mac_get_link_bss_conf(assoc_arvif);
6890 chanctx = rcu_dereference(info->chanctx_conf);
6891 assoc_link_freq = chanctx->def.chan->center_freq;
6892 rcu_read_unlock();
6893 ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n",
6894 assoc_arvif->link_id, assoc_link_freq);
6895
6896 /* assoc link is already activated and has to be kept active,
6897 * only need to select a partner link from others.
6898 */
6899 useful_links &= ~BIT(assoc_arvif->link_id);
6900 for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) {
6901 info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
6902 if (!info) {
6903 ath12k_warn(ab, "failed to get link info for link: %u\n",
6904 link_id);
6905 return -ENOLINK;
6906 }
6907
6908 chan = info->chanreq.oper.chan;
6909 if (!chan) {
6910 ath12k_warn(ab, "failed to get chan for link: %u\n", link_id);
6911 return -EINVAL;
6912 }
6913
6914 partner_freq = chan->center_freq;
6915 if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) {
6916 sbs_links |= BIT(link_id);
6917 ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n",
6918 link_id, partner_freq);
6919 continue;
6920 }
6921
6922 if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) {
6923 dbs_links |= BIT(link_id);
6924 ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n",
6925 link_id, partner_freq);
6926 continue;
6927 }
6928
6929 ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n",
6930 link_id, partner_freq);
6931 }
6932
6933 /* choose the first candidate no matter how many is in the list */
6934 if (sbs_links)
6935 link_id = __ffs(sbs_links);
6936 else if (dbs_links)
6937 link_id = __ffs(dbs_links);
6938 else
6939 link_id = ffs(useful_links) - 1;
6940
6941 ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id);
6942
6943 *selected_links = BIT(assoc_arvif->link_id) | BIT(link_id);
6944
6945 return 0;
6946 }
6947
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)6948 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
6949 struct ieee80211_vif *vif,
6950 struct ieee80211_sta *sta,
6951 enum ieee80211_sta_state old_state,
6952 enum ieee80211_sta_state new_state)
6953 {
6954 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6955 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
6956 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6957 struct ath12k_base *prev_ab = NULL, *ab;
6958 struct ath12k_link_vif *arvif;
6959 struct ath12k_link_sta *arsta;
6960 unsigned long valid_links;
6961 u16 selected_links = 0;
6962 u8 link_id = 0, i;
6963 struct ath12k *ar;
6964 int ret;
6965
6966 lockdep_assert_wiphy(hw->wiphy);
6967
6968 if (ieee80211_vif_is_mld(vif) && sta->valid_links) {
6969 WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1);
6970 link_id = ffs(sta->valid_links) - 1;
6971 }
6972
6973 /* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE:
6974 * New station add received. If this is a ML station then
6975 * ahsta->links_map will be zero and sta->valid_links will be 1.
6976 * Assign default link to the first link sta.
6977 */
6978 if (old_state == IEEE80211_STA_NOTEXIST &&
6979 new_state == IEEE80211_STA_NONE) {
6980 memset(ahsta, 0, sizeof(*ahsta));
6981
6982 arsta = &ahsta->deflink;
6983
6984 /* ML sta */
6985 if (sta->mlo && !ahsta->links_map &&
6986 (hweight16(sta->valid_links) == 1)) {
6987 ret = ath12k_peer_ml_create(ah, sta);
6988 if (ret) {
6989 ath12k_hw_warn(ah, "unable to create ML peer for sta %pM",
6990 sta->addr);
6991 goto exit;
6992 }
6993 }
6994
6995 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif,
6996 link_id);
6997 if (ret) {
6998 ath12k_hw_warn(ah, "unable assign link %d for sta %pM",
6999 link_id, sta->addr);
7000 goto exit;
7001 }
7002
7003 /* above arsta will get memset, hence do this after assign
7004 * link sta
7005 */
7006 if (sta->mlo) {
7007 /* For station mode, arvif->is_sta_assoc_link has been set when
7008 * vdev starts. Make sure the arvif/arsta pair have same setting
7009 */
7010 if (vif->type == NL80211_IFTYPE_STATION &&
7011 !arsta->arvif->is_sta_assoc_link) {
7012 ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n",
7013 link_id);
7014 ret = -EINVAL;
7015 goto exit;
7016 }
7017
7018 arsta->is_assoc_link = true;
7019 ahsta->assoc_link_id = link_id;
7020 }
7021 }
7022
7023 /* In the ML station scenario, activate all partner links once the
7024 * client is transitioning to the associated state.
7025 *
7026 * FIXME: Ideally, this activation should occur when the client
7027 * transitions to the authorized state. However, there are some
7028 * issues with handling this in the firmware. Until the firmware
7029 * can manage it properly, activate the links when the client is
7030 * about to move to the associated state.
7031 */
7032 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7033 old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) {
7034 /* TODO: for now only do link selection for single device
7035 * MLO case. Other cases would be handled in the future.
7036 */
7037 ab = ah->radio[0].ab;
7038 if (ab->ag->num_devices == 1) {
7039 ret = ath12k_mac_select_links(ab, vif, hw, &selected_links);
7040 if (ret) {
7041 ath12k_warn(ab,
7042 "failed to get selected links: %d\n", ret);
7043 goto exit;
7044 }
7045 } else {
7046 selected_links = ieee80211_vif_usable_links(vif);
7047 }
7048
7049 ieee80211_set_active_links(vif, selected_links);
7050 }
7051
7052 /* Handle all the other state transitions in generic way */
7053 valid_links = ahsta->links_map;
7054 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7055 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7056 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7057 /* some assumptions went wrong! */
7058 if (WARN_ON(!arvif || !arsta))
7059 continue;
7060
7061 /* vdev might be in deleted */
7062 if (WARN_ON(!arvif->ar))
7063 continue;
7064
7065 ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta,
7066 old_state, new_state);
7067 if (ret) {
7068 ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d",
7069 link_id, arsta->addr, old_state, new_state);
7070 goto exit;
7071 }
7072 }
7073
7074 if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7075 old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) {
7076 for_each_ar(ah, ar, i) {
7077 ab = ar->ab;
7078 if (prev_ab == ab)
7079 continue;
7080
7081 ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif);
7082 if (ret) {
7083 ath12k_warn(ab,
7084 "failed to update link active state on connect %d\n",
7085 ret);
7086 goto exit;
7087 }
7088
7089 prev_ab = ab;
7090 }
7091 }
7092 /* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST:
7093 * Remove the station from driver (handle ML sta here since that
7094 * needs special handling. Normal sta will be handled in generic
7095 * handler below
7096 */
7097 if (old_state == IEEE80211_STA_NONE &&
7098 new_state == IEEE80211_STA_NOTEXIST && sta->mlo)
7099 ath12k_mac_ml_station_remove(ahvif, ahsta);
7100
7101 ret = 0;
7102
7103 exit:
7104 /* update the state if everything went well */
7105 if (!ret)
7106 ahsta->state = new_state;
7107
7108 return ret;
7109 }
7110
ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)7111 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
7112 struct ieee80211_vif *vif,
7113 struct ieee80211_sta *sta)
7114 {
7115 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7116 struct ath12k *ar;
7117 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7118 struct ath12k_link_vif *arvif;
7119 struct ath12k_link_sta *arsta;
7120 u8 link_id;
7121 int ret;
7122 s16 txpwr;
7123
7124 lockdep_assert_wiphy(hw->wiphy);
7125
7126 /* TODO: use link id from mac80211 once that's implemented */
7127 link_id = 0;
7128
7129 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7130 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7131
7132 if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
7133 txpwr = 0;
7134 } else {
7135 txpwr = sta->deflink.txpwr.power;
7136 if (!txpwr) {
7137 ret = -EINVAL;
7138 goto out;
7139 }
7140 }
7141
7142 if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) {
7143 ret = -EINVAL;
7144 goto out;
7145 }
7146
7147 ar = arvif->ar;
7148
7149 ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
7150 WMI_PEER_USE_FIXED_PWR, txpwr);
7151 if (ret) {
7152 ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
7153 ret);
7154 goto out;
7155 }
7156
7157 out:
7158 return ret;
7159 }
7160
ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,u32 changed)7161 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
7162 struct ieee80211_vif *vif,
7163 struct ieee80211_link_sta *link_sta,
7164 u32 changed)
7165 {
7166 struct ieee80211_sta *sta = link_sta->sta;
7167 struct ath12k *ar;
7168 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7169 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7170 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7171 struct ath12k_link_sta *arsta;
7172 struct ath12k_link_vif *arvif;
7173 struct ath12k_peer *peer;
7174 u32 bw, smps;
7175
7176 rcu_read_lock();
7177 arvif = rcu_dereference(ahvif->link[link_sta->link_id]);
7178 if (!arvif) {
7179 ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n",
7180 link_sta->link_id, sta->addr);
7181 rcu_read_unlock();
7182 return;
7183 }
7184
7185 ar = arvif->ar;
7186
7187 arsta = rcu_dereference(ahsta->link[link_sta->link_id]);
7188 if (!arsta) {
7189 rcu_read_unlock();
7190 ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n",
7191 link_sta->link_id, sta->addr);
7192 return;
7193 }
7194 spin_lock_bh(&ar->ab->base_lock);
7195
7196 peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
7197 if (!peer) {
7198 spin_unlock_bh(&ar->ab->base_lock);
7199 rcu_read_unlock();
7200 ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
7201 arsta->addr, arvif->vdev_id);
7202 return;
7203 }
7204
7205 spin_unlock_bh(&ar->ab->base_lock);
7206
7207 if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
7208 rcu_read_unlock();
7209 return;
7210 }
7211
7212 link_sta = rcu_dereference(sta->link[arsta->link_id]);
7213 if (!link_sta) {
7214 rcu_read_unlock();
7215 ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n",
7216 sta->addr, arsta->link_id);
7217 return;
7218 }
7219
7220 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7221 "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7222 arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss,
7223 link_sta->smps_mode);
7224
7225 spin_lock_bh(&ar->data_lock);
7226
7227 if (changed & IEEE80211_RC_BW_CHANGED) {
7228 bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
7229 arsta->bw_prev = arsta->bw;
7230 arsta->bw = bw;
7231 }
7232
7233 if (changed & IEEE80211_RC_NSS_CHANGED)
7234 arsta->nss = link_sta->rx_nss;
7235
7236 if (changed & IEEE80211_RC_SMPS_CHANGED) {
7237 smps = WMI_PEER_SMPS_PS_NONE;
7238
7239 switch (link_sta->smps_mode) {
7240 case IEEE80211_SMPS_AUTOMATIC:
7241 case IEEE80211_SMPS_OFF:
7242 smps = WMI_PEER_SMPS_PS_NONE;
7243 break;
7244 case IEEE80211_SMPS_STATIC:
7245 smps = WMI_PEER_SMPS_STATIC;
7246 break;
7247 case IEEE80211_SMPS_DYNAMIC:
7248 smps = WMI_PEER_SMPS_DYNAMIC;
7249 break;
7250 default:
7251 ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n",
7252 link_sta->smps_mode, arsta->addr, link_sta->link_id);
7253 smps = WMI_PEER_SMPS_PS_NONE;
7254 break;
7255 }
7256
7257 arsta->smps = smps;
7258 }
7259
7260 arsta->changed |= changed;
7261
7262 spin_unlock_bh(&ar->data_lock);
7263
7264 wiphy_work_queue(hw->wiphy, &arsta->update_wk);
7265
7266 rcu_read_unlock();
7267 }
7268
ath12k_mac_alloc_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_vif * ahvif,u8 link_id)7269 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah,
7270 struct ath12k_sta *ahsta,
7271 struct ath12k_vif *ahvif,
7272 u8 link_id)
7273 {
7274 struct ath12k_link_sta *arsta;
7275 int ret;
7276
7277 lockdep_assert_wiphy(ah->hw->wiphy);
7278
7279 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7280 return NULL;
7281
7282 arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
7283 if (arsta)
7284 return NULL;
7285
7286 arsta = kmalloc(sizeof(*arsta), GFP_KERNEL);
7287 if (!arsta)
7288 return NULL;
7289
7290 ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id);
7291 if (ret) {
7292 kfree(arsta);
7293 return NULL;
7294 }
7295
7296 return arsta;
7297 }
7298
ath12k_mac_op_change_sta_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u16 old_links,u16 new_links)7299 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,
7300 struct ieee80211_vif *vif,
7301 struct ieee80211_sta *sta,
7302 u16 old_links, u16 new_links)
7303 {
7304 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7305 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7306 struct ath12k_hw *ah = hw->priv;
7307 struct ath12k_link_vif *arvif;
7308 struct ath12k_link_sta *arsta;
7309 unsigned long valid_links;
7310 struct ath12k *ar;
7311 u8 link_id;
7312 int ret;
7313
7314 lockdep_assert_wiphy(hw->wiphy);
7315
7316 if (!sta->valid_links)
7317 return -EINVAL;
7318
7319 /* Firmware does not support removal of one of link stas. All sta
7320 * would be removed during ML STA delete in sta_state(), hence link
7321 * sta removal is not handled here.
7322 */
7323 if (new_links < old_links)
7324 return 0;
7325
7326 if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) {
7327 ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr);
7328 return -EINVAL;
7329 }
7330
7331 /* this op is expected only after initial sta insertion with default link */
7332 if (WARN_ON(ahsta->links_map == 0))
7333 return -EINVAL;
7334
7335 valid_links = new_links;
7336 for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7337 if (ahsta->links_map & BIT(link_id))
7338 continue;
7339
7340 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7341 arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id);
7342
7343 if (!arvif || !arsta) {
7344 ath12k_hw_warn(ah, "Failed to alloc/assign link sta");
7345 continue;
7346 }
7347
7348 ar = arvif->ar;
7349 if (!ar)
7350 continue;
7351
7352 ret = ath12k_mac_station_add(ar, arvif, arsta);
7353 if (ret) {
7354 ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
7355 arsta->addr, arvif->vdev_id);
7356 ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
7357 return ret;
7358 }
7359 }
7360
7361 return 0;
7362 }
7363
ath12k_mac_op_can_activate_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 active_links)7364 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw,
7365 struct ieee80211_vif *vif,
7366 u16 active_links)
7367 {
7368 /* TODO: Handle recovery case */
7369
7370 return true;
7371 }
7372
ath12k_conf_tx_uapsd(struct ath12k_link_vif * arvif,u16 ac,bool enable)7373 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif,
7374 u16 ac, bool enable)
7375 {
7376 struct ath12k *ar = arvif->ar;
7377 struct ath12k_vif *ahvif = arvif->ahvif;
7378 u32 value;
7379 int ret;
7380
7381 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
7382 return 0;
7383
7384 switch (ac) {
7385 case IEEE80211_AC_VO:
7386 value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7387 WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7388 break;
7389 case IEEE80211_AC_VI:
7390 value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7391 WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7392 break;
7393 case IEEE80211_AC_BE:
7394 value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7395 WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7396 break;
7397 case IEEE80211_AC_BK:
7398 value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7399 WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7400 break;
7401 }
7402
7403 if (enable)
7404 ahvif->u.sta.uapsd |= value;
7405 else
7406 ahvif->u.sta.uapsd &= ~value;
7407
7408 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7409 WMI_STA_PS_PARAM_UAPSD,
7410 ahvif->u.sta.uapsd);
7411 if (ret) {
7412 ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
7413 goto exit;
7414 }
7415
7416 if (ahvif->u.sta.uapsd)
7417 value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7418 else
7419 value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7420
7421 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7422 WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7423 value);
7424 if (ret)
7425 ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
7426
7427 exit:
7428 return ret;
7429 }
7430
ath12k_mac_conf_tx(struct ath12k_link_vif * arvif,u16 ac,const struct ieee80211_tx_queue_params * params)7431 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac,
7432 const struct ieee80211_tx_queue_params *params)
7433 {
7434 struct wmi_wmm_params_arg *p = NULL;
7435 struct ath12k *ar = arvif->ar;
7436 struct ath12k_base *ab = ar->ab;
7437 int ret;
7438
7439 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
7440
7441 switch (ac) {
7442 case IEEE80211_AC_VO:
7443 p = &arvif->wmm_params.ac_vo;
7444 break;
7445 case IEEE80211_AC_VI:
7446 p = &arvif->wmm_params.ac_vi;
7447 break;
7448 case IEEE80211_AC_BE:
7449 p = &arvif->wmm_params.ac_be;
7450 break;
7451 case IEEE80211_AC_BK:
7452 p = &arvif->wmm_params.ac_bk;
7453 break;
7454 }
7455
7456 if (WARN_ON(!p)) {
7457 ret = -EINVAL;
7458 goto exit;
7459 }
7460
7461 p->cwmin = params->cw_min;
7462 p->cwmax = params->cw_max;
7463 p->aifs = params->aifs;
7464 p->txop = params->txop;
7465
7466 ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
7467 &arvif->wmm_params);
7468 if (ret) {
7469 ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
7470 ar->pdev_idx, ret);
7471 goto exit;
7472 }
7473
7474 ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
7475 if (ret)
7476 ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
7477 ar->pdev_idx, ret);
7478
7479 exit:
7480 return ret;
7481 }
7482
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)7483 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
7484 struct ieee80211_vif *vif,
7485 unsigned int link_id, u16 ac,
7486 const struct ieee80211_tx_queue_params *params)
7487 {
7488 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7489 struct ath12k_link_vif *arvif;
7490 struct ath12k_vif_cache *cache;
7491 int ret;
7492
7493 lockdep_assert_wiphy(hw->wiphy);
7494
7495 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7496 return -EINVAL;
7497
7498 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7499 if (!arvif || !arvif->is_created) {
7500 cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
7501 if (!cache)
7502 return -ENOSPC;
7503
7504 cache->tx_conf.changed = true;
7505 cache->tx_conf.ac = ac;
7506 cache->tx_conf.tx_queue_params = *params;
7507
7508 return 0;
7509 }
7510
7511 ret = ath12k_mac_conf_tx(arvif, ac, params);
7512
7513 return ret;
7514 }
7515
7516 static struct ieee80211_sta_ht_cap
ath12k_create_ht_cap(struct ath12k * ar,u32 ar_ht_cap,u32 rate_cap_rx_chainmask)7517 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
7518 {
7519 int i;
7520 struct ieee80211_sta_ht_cap ht_cap = {};
7521 u32 ar_vht_cap = ar->pdev->cap.vht_cap;
7522
7523 if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
7524 return ht_cap;
7525
7526 ht_cap.ht_supported = 1;
7527 ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
7528 ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
7529 ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7530 ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
7531 ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
7532
7533 if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
7534 ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
7535
7536 if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
7537 ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
7538
7539 if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
7540 u32 smps;
7541
7542 smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
7543 smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
7544
7545 ht_cap.cap |= smps;
7546 }
7547
7548 if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
7549 ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
7550
7551 if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
7552 u32 stbc;
7553
7554 stbc = ar_ht_cap;
7555 stbc &= WMI_HT_CAP_RX_STBC;
7556 stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
7557 stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
7558 stbc &= IEEE80211_HT_CAP_RX_STBC;
7559
7560 ht_cap.cap |= stbc;
7561 }
7562
7563 if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
7564 ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
7565
7566 if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
7567 ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
7568
7569 if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
7570 ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
7571
7572 for (i = 0; i < ar->num_rx_chains; i++) {
7573 if (rate_cap_rx_chainmask & BIT(i))
7574 ht_cap.mcs.rx_mask[i] = 0xFF;
7575 }
7576
7577 ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
7578
7579 return ht_cap;
7580 }
7581
ath12k_mac_set_txbf_conf(struct ath12k_link_vif * arvif)7582 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif)
7583 {
7584 u32 value = 0;
7585 struct ath12k *ar = arvif->ar;
7586 struct ath12k_vif *ahvif = arvif->ahvif;
7587 int nsts;
7588 int sound_dim;
7589 u32 vht_cap = ar->pdev->cap.vht_cap;
7590 u32 vdev_param = WMI_VDEV_PARAM_TXBF;
7591
7592 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
7593 nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
7594 nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
7595 value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
7596 }
7597
7598 if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
7599 sound_dim = vht_cap &
7600 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
7601 sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
7602 if (sound_dim > (ar->num_tx_chains - 1))
7603 sound_dim = ar->num_tx_chains - 1;
7604 value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
7605 }
7606
7607 if (!value)
7608 return 0;
7609
7610 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
7611 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
7612
7613 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
7614 ahvif->vdev_type == WMI_VDEV_TYPE_AP)
7615 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
7616 }
7617
7618 if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
7619 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
7620
7621 if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
7622 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
7623 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
7624 }
7625
7626 return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7627 vdev_param, value);
7628 }
7629
ath12k_set_vht_txbf_cap(struct ath12k * ar,u32 * vht_cap)7630 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
7631 {
7632 bool subfer, subfee;
7633 int sound_dim = 0;
7634
7635 subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
7636 subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
7637
7638 if (ar->num_tx_chains < 2) {
7639 *vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
7640 subfer = false;
7641 }
7642
7643 /* If SU Beaformer is not set, then disable MU Beamformer Capability */
7644 if (!subfer)
7645 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
7646
7647 /* If SU Beaformee is not set, then disable MU Beamformee Capability */
7648 if (!subfee)
7649 *vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
7650
7651 sound_dim = u32_get_bits(*vht_cap,
7652 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7653 *vht_cap = u32_replace_bits(*vht_cap, 0,
7654 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7655
7656 /* TODO: Need to check invalid STS and Sound_dim values set by FW? */
7657
7658 /* Enable Sounding Dimension Field only if SU BF is enabled */
7659 if (subfer) {
7660 if (sound_dim > (ar->num_tx_chains - 1))
7661 sound_dim = ar->num_tx_chains - 1;
7662
7663 *vht_cap = u32_replace_bits(*vht_cap, sound_dim,
7664 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7665 }
7666
7667 /* Use the STS advertised by FW unless SU Beamformee is not supported*/
7668 if (!subfee)
7669 *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
7670 }
7671
7672 static struct ieee80211_sta_vht_cap
ath12k_create_vht_cap(struct ath12k * ar,u32 rate_cap_tx_chainmask,u32 rate_cap_rx_chainmask)7673 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
7674 u32 rate_cap_rx_chainmask)
7675 {
7676 struct ieee80211_sta_vht_cap vht_cap = {};
7677 u16 txmcs_map, rxmcs_map;
7678 int i;
7679
7680 vht_cap.vht_supported = 1;
7681 vht_cap.cap = ar->pdev->cap.vht_cap;
7682
7683 ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
7684
7685 /* 80P80 is not supported */
7686 vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
7687
7688 rxmcs_map = 0;
7689 txmcs_map = 0;
7690 for (i = 0; i < 8; i++) {
7691 if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
7692 txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7693 else
7694 txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7695
7696 if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
7697 rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7698 else
7699 rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7700 }
7701
7702 if (rate_cap_tx_chainmask <= 1)
7703 vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
7704
7705 vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
7706 vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
7707
7708 /* Check if the HW supports 1:1 NSS ratio and reset
7709 * EXT NSS BW Support field to 0 to indicate 1:1 ratio
7710 */
7711 if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS)
7712 vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK;
7713
7714 return vht_cap;
7715 }
7716
ath12k_mac_setup_ht_vht_cap(struct ath12k * ar,struct ath12k_pdev_cap * cap,u32 * ht_cap_info)7717 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
7718 struct ath12k_pdev_cap *cap,
7719 u32 *ht_cap_info)
7720 {
7721 struct ieee80211_supported_band *band;
7722 u32 rate_cap_tx_chainmask;
7723 u32 rate_cap_rx_chainmask;
7724 u32 ht_cap;
7725
7726 rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
7727 rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
7728
7729 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
7730 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7731 ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
7732 if (ht_cap_info)
7733 *ht_cap_info = ht_cap;
7734 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7735 rate_cap_rx_chainmask);
7736 }
7737
7738 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
7739 (ar->ab->hw_params->single_pdev_only ||
7740 !ar->supports_6ghz)) {
7741 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7742 ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
7743 if (ht_cap_info)
7744 *ht_cap_info = ht_cap;
7745 band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7746 rate_cap_rx_chainmask);
7747 band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
7748 rate_cap_rx_chainmask);
7749 }
7750 }
7751
ath12k_check_chain_mask(struct ath12k * ar,u32 ant,bool is_tx_ant)7752 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
7753 {
7754 /* TODO: Check the request chainmask against the supported
7755 * chainmask table which is advertised in extented_service_ready event
7756 */
7757
7758 return 0;
7759 }
7760
ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,u8 * he_ppet)7761 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
7762 u8 *he_ppet)
7763 {
7764 int nss, ru;
7765 u8 bit = 7;
7766
7767 he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
7768 he_ppet[0] |= (fw_ppet->ru_bit_mask <<
7769 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
7770 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
7771 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
7772 for (ru = 0; ru < 4; ru++) {
7773 u8 val;
7774 int i;
7775
7776 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
7777 continue;
7778 val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
7779 0x3f;
7780 val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
7781 for (i = 5; i >= 0; i--) {
7782 he_ppet[bit / 8] |=
7783 ((val >> i) & 0x1) << ((bit % 8));
7784 bit++;
7785 }
7786 }
7787 }
7788 }
7789
7790 static void
ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem * he_cap_elem)7791 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
7792 {
7793 u8 m;
7794
7795 m = IEEE80211_HE_MAC_CAP0_TWT_RES |
7796 IEEE80211_HE_MAC_CAP0_TWT_REQ;
7797 he_cap_elem->mac_cap_info[0] &= ~m;
7798
7799 m = IEEE80211_HE_MAC_CAP2_TRS |
7800 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7801 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7802 he_cap_elem->mac_cap_info[2] &= ~m;
7803
7804 m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
7805 IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7806 IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7807 he_cap_elem->mac_cap_info[3] &= ~m;
7808
7809 m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
7810 IEEE80211_HE_MAC_CAP4_BQR;
7811 he_cap_elem->mac_cap_info[4] &= ~m;
7812
7813 m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
7814 IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
7815 IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
7816 IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
7817 he_cap_elem->mac_cap_info[5] &= ~m;
7818
7819 m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
7820 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
7821 he_cap_elem->phy_cap_info[2] &= ~m;
7822
7823 m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
7824 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
7825 IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
7826 he_cap_elem->phy_cap_info[3] &= ~m;
7827
7828 m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
7829 he_cap_elem->phy_cap_info[4] &= ~m;
7830
7831 m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
7832 he_cap_elem->phy_cap_info[5] &= ~m;
7833
7834 m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
7835 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
7836 IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
7837 IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
7838 he_cap_elem->phy_cap_info[6] &= ~m;
7839
7840 m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
7841 IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
7842 IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
7843 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
7844 he_cap_elem->phy_cap_info[7] &= ~m;
7845
7846 m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
7847 IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
7848 IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
7849 IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
7850 he_cap_elem->phy_cap_info[8] &= ~m;
7851
7852 m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
7853 IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
7854 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
7855 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
7856 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
7857 IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
7858 he_cap_elem->phy_cap_info[9] &= ~m;
7859 }
7860
ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap * pcap,struct ath12k_band_cap * bcap)7861 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
7862 struct ath12k_band_cap *bcap)
7863 {
7864 u8 val;
7865
7866 bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
7867 if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
7868 bcap->he_6ghz_capa |=
7869 u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
7870 IEEE80211_HE_6GHZ_CAP_SM_PS);
7871 else
7872 bcap->he_6ghz_capa |=
7873 u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
7874 IEEE80211_HE_6GHZ_CAP_SM_PS);
7875 val = u32_get_bits(pcap->vht_cap,
7876 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
7877 bcap->he_6ghz_capa |=
7878 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
7879 val = u32_get_bits(pcap->vht_cap,
7880 IEEE80211_VHT_CAP_MAX_MPDU_MASK);
7881 bcap->he_6ghz_capa |=
7882 u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
7883 if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
7884 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
7885 if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
7886 bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
7887
7888 return cpu_to_le16(bcap->he_6ghz_capa);
7889 }
7890
ath12k_mac_set_hemcsmap(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sta_he_cap * he_cap)7891 static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
7892 struct ath12k_pdev_cap *cap,
7893 struct ieee80211_sta_he_cap *he_cap)
7894 {
7895 struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
7896 u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
7897 u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains);
7898 u16 txmcs_map_160 = 0, rxmcs_map_160 = 0;
7899 u16 txmcs_map = 0, rxmcs_map = 0;
7900 u32 i;
7901
7902 for (i = 0; i < 8; i++) {
7903 if (i < ar->num_tx_chains &&
7904 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7905 txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7906 else
7907 txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7908
7909 if (i < ar->num_rx_chains &&
7910 (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7911 rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7912 else
7913 rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7914
7915 if (i < maxtxnss_160 &&
7916 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7917 txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7918 else
7919 txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7920
7921 if (i < maxrxnss_160 &&
7922 (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7923 rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7924 else
7925 rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7926 }
7927
7928 mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
7929 mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
7930 mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff);
7931 mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff);
7932 }
7933
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)7934 static void ath12k_mac_copy_he_cap(struct ath12k *ar,
7935 struct ath12k_band_cap *band_cap,
7936 int iftype, u8 num_tx_chains,
7937 struct ieee80211_sta_he_cap *he_cap)
7938 {
7939 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
7940
7941 he_cap->has_he = true;
7942 memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
7943 sizeof(he_cap_elem->mac_cap_info));
7944 memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
7945 sizeof(he_cap_elem->phy_cap_info));
7946
7947 he_cap_elem->mac_cap_info[1] &=
7948 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
7949 he_cap_elem->phy_cap_info[0] &=
7950 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7951 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7952 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
7953 /* 80PLUS80 is not supported */
7954 he_cap_elem->phy_cap_info[0] &=
7955 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
7956 he_cap_elem->phy_cap_info[5] &=
7957 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
7958 he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
7959
7960 switch (iftype) {
7961 case NL80211_IFTYPE_AP:
7962 he_cap_elem->mac_cap_info[2] &=
7963 ~IEEE80211_HE_MAC_CAP2_BCAST_TWT;
7964 he_cap_elem->phy_cap_info[3] &=
7965 ~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
7966 he_cap_elem->phy_cap_info[9] |=
7967 IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
7968 break;
7969 case NL80211_IFTYPE_STATION:
7970 he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
7971 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
7972 he_cap_elem->phy_cap_info[9] |=
7973 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
7974 break;
7975 case NL80211_IFTYPE_MESH_POINT:
7976 ath12k_mac_filter_he_cap_mesh(he_cap_elem);
7977 break;
7978 }
7979
7980 ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
7981 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
7982 if (he_cap_elem->phy_cap_info[6] &
7983 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
7984 ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
7985 }
7986
7987 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)7988 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
7989 struct ieee80211_eht_mcs_nss_supp *mcs_nss,
7990 const struct ieee80211_he_cap_elem *he_cap,
7991 const struct ieee80211_eht_cap_elem_fixed *eht_cap)
7992 {
7993 if ((he_cap->phy_cap_info[0] &
7994 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7995 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7996 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
7997 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
7998 memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
7999 sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
8000
8001 if (he_cap->phy_cap_info[0] &
8002 (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8003 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
8004 memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
8005 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8006
8007 if (he_cap->phy_cap_info[0] &
8008 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8009 memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
8010 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8011
8012 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
8013 memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
8014 sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8015 }
8016
ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,struct ieee80211_sta_eht_cap * cap)8017 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
8018 struct ieee80211_sta_eht_cap *cap)
8019 {
8020 u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
8021 u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
8022
8023 u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
8024 IEEE80211_EHT_PPE_THRES_NSS_MASK);
8025
8026 u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
8027 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8028
8029 for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
8030 for (ru = 0;
8031 ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8032 ru++) {
8033 u32 val = 0;
8034
8035 if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
8036 continue;
8037
8038 u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
8039 (ru * ppet_bit_len_per_ru),
8040 GENMASK(ppet_bit_len_per_ru - 1, 0));
8041
8042 for (i = 0; i < ppet_bit_len_per_ru; i++) {
8043 cap->eht_ppe_thres[bit / 8] |=
8044 (((val >> i) & 0x1) << ((bit % 8)));
8045 bit++;
8046 }
8047 }
8048 }
8049 }
8050
8051 static void
ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed * eht_cap_elem)8052 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
8053 *eht_cap_elem)
8054 {
8055 u8 m;
8056
8057 m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
8058 eht_cap_elem->mac_cap_info[0] &= ~m;
8059
8060 m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
8061 eht_cap_elem->phy_cap_info[0] &= ~m;
8062
8063 m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
8064 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
8065 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
8066 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
8067 eht_cap_elem->phy_cap_info[3] &= ~m;
8068
8069 m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
8070 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
8071 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
8072 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
8073 eht_cap_elem->phy_cap_info[4] &= ~m;
8074
8075 m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
8076 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
8077 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
8078 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
8079 eht_cap_elem->phy_cap_info[5] &= ~m;
8080
8081 m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
8082 eht_cap_elem->phy_cap_info[6] &= ~m;
8083
8084 m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8085 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8086 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
8087 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8088 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8089 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
8090 eht_cap_elem->phy_cap_info[7] &= ~m;
8091 }
8092
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)8093 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
8094 struct ath12k_band_cap *band_cap,
8095 struct ieee80211_he_cap_elem *he_cap_elem,
8096 int iftype,
8097 struct ieee80211_sta_eht_cap *eht_cap)
8098 {
8099 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
8100
8101 memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
8102
8103 if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) ||
8104 ath12k_acpi_get_disable_11be(ar->ab))
8105 return;
8106
8107 eht_cap->has_eht = true;
8108 memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
8109 sizeof(eht_cap_elem->mac_cap_info));
8110 memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
8111 sizeof(eht_cap_elem->phy_cap_info));
8112
8113 switch (iftype) {
8114 case NL80211_IFTYPE_AP:
8115 eht_cap_elem->phy_cap_info[0] &=
8116 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
8117 eht_cap_elem->phy_cap_info[4] &=
8118 ~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
8119 eht_cap_elem->phy_cap_info[5] &=
8120 ~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
8121 break;
8122 case NL80211_IFTYPE_STATION:
8123 eht_cap_elem->phy_cap_info[7] &=
8124 ~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8125 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8126 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
8127 eht_cap_elem->phy_cap_info[7] &=
8128 ~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8129 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8130 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
8131 break;
8132 case NL80211_IFTYPE_MESH_POINT:
8133 ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
8134 break;
8135 default:
8136 break;
8137 }
8138
8139 ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
8140 he_cap_elem, eht_cap_elem);
8141
8142 if (eht_cap_elem->phy_cap_info[5] &
8143 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
8144 ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
8145 }
8146
ath12k_mac_copy_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sband_iftype_data * data,int band)8147 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
8148 struct ath12k_pdev_cap *cap,
8149 struct ieee80211_sband_iftype_data *data,
8150 int band)
8151 {
8152 struct ath12k_band_cap *band_cap = &cap->band[band];
8153 int i, idx = 0;
8154
8155 for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
8156 struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
8157
8158 switch (i) {
8159 case NL80211_IFTYPE_STATION:
8160 case NL80211_IFTYPE_AP:
8161 case NL80211_IFTYPE_MESH_POINT:
8162 break;
8163
8164 default:
8165 continue;
8166 }
8167
8168 data[idx].types_mask = BIT(i);
8169
8170 ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
8171 if (band == NL80211_BAND_6GHZ) {
8172 data[idx].he_6ghz_capa.capa =
8173 ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
8174 }
8175 ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
8176 &data[idx].eht_cap);
8177 idx++;
8178 }
8179
8180 return idx;
8181 }
8182
ath12k_mac_setup_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap)8183 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
8184 struct ath12k_pdev_cap *cap)
8185 {
8186 struct ieee80211_supported_band *sband;
8187 enum nl80211_band band;
8188 int count;
8189
8190 if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
8191 band = NL80211_BAND_2GHZ;
8192 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8193 ar->mac.iftype[band],
8194 band);
8195 sband = &ar->mac.sbands[band];
8196 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8197 count);
8198 }
8199
8200 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
8201 band = NL80211_BAND_5GHZ;
8202 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8203 ar->mac.iftype[band],
8204 band);
8205 sband = &ar->mac.sbands[band];
8206 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8207 count);
8208 }
8209
8210 if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
8211 ar->supports_6ghz) {
8212 band = NL80211_BAND_6GHZ;
8213 count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8214 ar->mac.iftype[band],
8215 band);
8216 sband = &ar->mac.sbands[band];
8217 _ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8218 count);
8219 }
8220 }
8221
__ath12k_set_antenna(struct ath12k * ar,u32 tx_ant,u32 rx_ant)8222 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
8223 {
8224 struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
8225 int ret;
8226
8227 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8228
8229 if (ath12k_check_chain_mask(ar, tx_ant, true))
8230 return -EINVAL;
8231
8232 if (ath12k_check_chain_mask(ar, rx_ant, false))
8233 return -EINVAL;
8234
8235 /* Since we advertised the max cap of all radios combined during wiphy
8236 * registration, ensure we don't set the antenna config higher than the
8237 * limits
8238 */
8239 tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask);
8240 rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask);
8241
8242 ar->cfg_tx_chainmask = tx_ant;
8243 ar->cfg_rx_chainmask = rx_ant;
8244
8245 if (ah->state != ATH12K_HW_STATE_ON &&
8246 ah->state != ATH12K_HW_STATE_RESTARTED)
8247 return 0;
8248
8249 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
8250 tx_ant, ar->pdev->pdev_id);
8251 if (ret) {
8252 ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
8253 ret, tx_ant);
8254 return ret;
8255 }
8256
8257 ar->num_tx_chains = hweight32(tx_ant);
8258
8259 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
8260 rx_ant, ar->pdev->pdev_id);
8261 if (ret) {
8262 ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
8263 ret, rx_ant);
8264 return ret;
8265 }
8266
8267 ar->num_rx_chains = hweight32(rx_ant);
8268
8269 /* Reload HT/VHT/HE capability */
8270 ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
8271 ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
8272
8273 return 0;
8274 }
8275
ath12k_mgmt_over_wmi_tx_drop(struct ath12k * ar,struct sk_buff * skb)8276 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
8277 {
8278 int num_mgmt;
8279
8280 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8281
8282 ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
8283
8284 num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
8285
8286 if (num_mgmt < 0)
8287 WARN_ON_ONCE(1);
8288
8289 if (!num_mgmt)
8290 wake_up(&ar->txmgmt_empty_waitq);
8291 }
8292
ath12k_mac_tx_mgmt_free(struct ath12k * ar,int buf_id)8293 static void ath12k_mac_tx_mgmt_free(struct ath12k *ar, int buf_id)
8294 {
8295 struct sk_buff *msdu;
8296 struct ieee80211_tx_info *info;
8297
8298 spin_lock_bh(&ar->txmgmt_idr_lock);
8299 msdu = idr_remove(&ar->txmgmt_idr, buf_id);
8300 spin_unlock_bh(&ar->txmgmt_idr_lock);
8301
8302 if (!msdu)
8303 return;
8304
8305 dma_unmap_single(ar->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, msdu);
8312 }
8313
ath12k_mac_tx_mgmt_pending_free(int buf_id,void * skb,void * ctx)8314 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
8315 {
8316 struct ath12k *ar = ctx;
8317
8318 ath12k_mac_tx_mgmt_free(ar, buf_id);
8319
8320 return 0;
8321 }
8322
ath12k_mac_vif_txmgmt_idr_remove(int buf_id,void * skb,void * ctx)8323 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
8324 {
8325 struct ieee80211_vif *vif = ctx;
8326 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8327 struct ath12k *ar = skb_cb->ar;
8328
8329 if (skb_cb->vif == vif)
8330 ath12k_mac_tx_mgmt_free(ar, buf_id);
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 ar->rts_threshold = param_value;
9852 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9853 param_id, param_value);
9854 if (ret) {
9855 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
9856 arvif->vdev_id, ret);
9857 }
9858
9859 ath12k_dp_vdev_tx_attach(ar, arvif);
9860
9861 return ret;
9862
9863 err_peer_del:
9864 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
9865 reinit_completion(&ar->peer_delete_done);
9866
9867 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid,
9868 arvif->vdev_id);
9869 if (ret) {
9870 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
9871 arvif->vdev_id, arvif->bssid);
9872 goto err;
9873 }
9874
9875 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
9876 arvif->bssid);
9877 if (ret)
9878 goto err_vdev_del;
9879
9880 ar->num_peers--;
9881 }
9882
9883 err_vdev_del:
9884 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
9885 ar->monitor_vdev_id = -1;
9886 ar->monitor_vdev_created = false;
9887 }
9888
9889 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
9890 ar->num_created_vdevs--;
9891 arvif->is_created = false;
9892 arvif->ar = NULL;
9893 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
9894 ab->free_vdev_map |= 1LL << arvif->vdev_id;
9895 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
9896 spin_lock_bh(&ar->data_lock);
9897 list_del(&arvif->list);
9898 spin_unlock_bh(&ar->data_lock);
9899
9900 err:
9901 arvif->ar = NULL;
9902 return ret;
9903 }
9904
ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif * arvif)9905 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif)
9906 {
9907 struct ath12k_key_conf *key_conf, *tmp;
9908 struct ath12k_vif *ahvif = arvif->ahvif;
9909 struct ath12k_hw *ah = ahvif->ah;
9910 struct ath12k_sta *ahsta;
9911 struct ath12k_link_sta *arsta;
9912 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9913 int ret;
9914
9915 lockdep_assert_wiphy(ah->hw->wiphy);
9916
9917 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
9918 arsta = NULL;
9919 if (key_conf->sta) {
9920 ahsta = ath12k_sta_to_ahsta(key_conf->sta);
9921 arsta = wiphy_dereference(ah->hw->wiphy,
9922 ahsta->link[arvif->link_id]);
9923 if (!arsta)
9924 goto free_cache;
9925 }
9926
9927 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd,
9928 arvif, arsta,
9929 key_conf->key);
9930 if (ret)
9931 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n",
9932 arvif->vdev_id, ret);
9933 free_cache:
9934 list_del(&key_conf->list);
9935 kfree(key_conf);
9936 }
9937 }
9938
ath12k_mac_vif_cache_flush(struct ath12k * ar,struct ath12k_link_vif * arvif)9939 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif)
9940 {
9941 struct ath12k_vif *ahvif = arvif->ahvif;
9942 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9943 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9944 struct ath12k_base *ab = ar->ab;
9945 struct ieee80211_bss_conf *link_conf;
9946
9947 int ret;
9948
9949 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9950
9951 if (!cache)
9952 return;
9953
9954 if (cache->tx_conf.changed) {
9955 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac,
9956 &cache->tx_conf.tx_queue_params);
9957 if (ret)
9958 ath12k_warn(ab,
9959 "unable to apply tx config parameters to vdev %d\n",
9960 ret);
9961 }
9962
9963 if (cache->bss_conf_changed) {
9964 link_conf = ath12k_mac_get_link_bss_conf(arvif);
9965 if (!link_conf) {
9966 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n",
9967 vif->addr, arvif->link_id);
9968 return;
9969 }
9970 ath12k_mac_bss_info_changed(ar, arvif, link_conf,
9971 cache->bss_conf_changed);
9972 }
9973
9974 if (!list_empty(&cache->key_conf.list))
9975 ath12k_mac_vif_flush_key_cache(arvif);
9976
9977 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
9978 }
9979
ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)9980 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
9981 struct ath12k_link_vif *arvif,
9982 struct ieee80211_chanctx_conf *ctx)
9983 {
9984 struct ath12k_vif *ahvif = arvif->ahvif;
9985 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9986 struct ath12k_link_vif *scan_arvif;
9987 struct ath12k_hw *ah = hw->priv;
9988 struct ath12k *ar;
9989 struct ath12k_base *ab;
9990 u8 link_id = arvif->link_id, scan_link_id;
9991 unsigned long scan_link_map;
9992 int ret;
9993
9994 lockdep_assert_wiphy(hw->wiphy);
9995
9996 if (ah->num_radio == 1)
9997 ar = ah->radio;
9998 else if (ctx)
9999 ar = ath12k_get_ar_by_ctx(hw, ctx);
10000 else
10001 return NULL;
10002
10003 if (!ar)
10004 return NULL;
10005
10006 /* cleanup the scan vdev if we are done scan on that ar
10007 * and now we want to create for actual usage.
10008 */
10009 if (ieee80211_vif_is_mld(vif)) {
10010 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
10011 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) {
10012 scan_arvif = wiphy_dereference(hw->wiphy,
10013 ahvif->link[scan_link_id]);
10014 if (scan_arvif && scan_arvif->ar == ar) {
10015 ar->scan.arvif = NULL;
10016 ath12k_mac_remove_link_interface(hw, scan_arvif);
10017 ath12k_mac_unassign_link_vif(scan_arvif);
10018 break;
10019 }
10020 }
10021 }
10022
10023 if (arvif->ar) {
10024 /* This is not expected really */
10025 if (WARN_ON(!arvif->is_created)) {
10026 arvif->ar = NULL;
10027 return NULL;
10028 }
10029
10030 if (ah->num_radio == 1)
10031 return arvif->ar;
10032
10033 /* This can happen as scan vdev gets created during multiple scans
10034 * across different radios before a vdev is brought up in
10035 * a certain radio.
10036 */
10037 if (ar != arvif->ar) {
10038 if (WARN_ON(arvif->is_started))
10039 return NULL;
10040
10041 ath12k_mac_remove_link_interface(hw, arvif);
10042 ath12k_mac_unassign_link_vif(arvif);
10043 }
10044 }
10045
10046 ab = ar->ab;
10047
10048 /* Assign arvif again here since previous radio switch block
10049 * would've unassigned and cleared it.
10050 */
10051 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
10052 if (vif->type == NL80211_IFTYPE_AP &&
10053 ar->num_peers > (ar->max_num_peers - 1)) {
10054 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
10055 goto unlock;
10056 }
10057
10058 if (arvif->is_created)
10059 goto flush;
10060
10061 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
10062 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
10063 TARGET_NUM_VDEVS(ab));
10064 goto unlock;
10065 }
10066
10067 ret = ath12k_mac_vdev_create(ar, arvif);
10068 if (ret) {
10069 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
10070 goto unlock;
10071 }
10072
10073 flush:
10074 /* If the vdev is created during channel assign and not during
10075 * add_interface(), Apply any parameters for the vdev which were received
10076 * after add_interface, corresponding to this vif.
10077 */
10078 ath12k_mac_vif_cache_flush(ar, arvif);
10079 unlock:
10080 return arvif->ar;
10081 }
10082
ath12k_mac_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10083 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
10084 struct ieee80211_vif *vif)
10085 {
10086 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10087 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10088 struct ath12k_reg_info *reg_info;
10089 struct ath12k_link_vif *arvif;
10090 struct ath12k_base *ab;
10091 struct ath12k *ar;
10092 int i;
10093
10094 lockdep_assert_wiphy(hw->wiphy);
10095
10096 memset(ahvif, 0, sizeof(*ahvif));
10097
10098 ahvif->ah = ah;
10099 ahvif->vif = vif;
10100 arvif = &ahvif->deflink;
10101
10102 ath12k_mac_init_arvif(ahvif, arvif, -1);
10103
10104 /* Allocate Default Queue now and reassign during actual vdev create */
10105 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE;
10106 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10107 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE;
10108
10109 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
10110
10111 ath12k_mac_determine_vdev_type(vif, ahvif);
10112
10113 for_each_ar(ah, ar, i) {
10114 if (!ath12k_wmi_supports_6ghz_cc_ext(ar))
10115 continue;
10116
10117 ab = ar->ab;
10118 reg_info = ab->reg_info[ar->pdev_idx];
10119 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n");
10120 ah->regd_updated = false;
10121 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type,
10122 IEEE80211_REG_UNSET_AP);
10123 break;
10124 }
10125
10126 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver
10127 * will not know if this interface is an ML vif at this point.
10128 */
10129 return 0;
10130 }
10131
ath12k_mac_vif_unref(struct ath12k_dp * dp,struct ieee80211_vif * vif)10132 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
10133 {
10134 struct ath12k_tx_desc_info *tx_desc_info;
10135 struct ath12k_skb_cb *skb_cb;
10136 struct sk_buff *skb;
10137 int i;
10138
10139 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
10140 spin_lock_bh(&dp->tx_desc_lock[i]);
10141
10142 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
10143 list) {
10144 skb = tx_desc_info->skb;
10145 if (!skb)
10146 continue;
10147
10148 skb_cb = ATH12K_SKB_CB(skb);
10149 if (skb_cb->vif == vif)
10150 skb_cb->vif = NULL;
10151 }
10152
10153 spin_unlock_bh(&dp->tx_desc_lock[i]);
10154 }
10155 }
10156
ath12k_mac_vdev_delete(struct ath12k * ar,struct ath12k_link_vif * arvif)10157 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
10158 {
10159 struct ath12k_vif *ahvif = arvif->ahvif;
10160 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10161 struct ath12k_base *ab = ar->ab;
10162 unsigned long time_left;
10163 int ret;
10164
10165 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10166
10167 reinit_completion(&ar->vdev_delete_done);
10168
10169 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10170 if (ret) {
10171 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
10172 arvif->vdev_id, ret);
10173 goto err_vdev_del;
10174 }
10175
10176 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
10177 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
10178 if (time_left == 0) {
10179 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
10180 goto err_vdev_del;
10181 }
10182
10183 ab->free_vdev_map |= 1LL << arvif->vdev_id;
10184 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10185 ar->num_created_vdevs--;
10186
10187 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10188 ar->monitor_vdev_id = -1;
10189 ar->monitor_vdev_created = false;
10190 }
10191
10192 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
10193 vif->addr, arvif->vdev_id);
10194
10195 err_vdev_del:
10196 spin_lock_bh(&ar->data_lock);
10197 list_del(&arvif->list);
10198 spin_unlock_bh(&ar->data_lock);
10199
10200 ath12k_peer_cleanup(ar, arvif->vdev_id);
10201 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10202
10203 idr_for_each(&ar->txmgmt_idr,
10204 ath12k_mac_vif_txmgmt_idr_remove, vif);
10205
10206 ath12k_mac_vif_unref(&ab->dp, vif);
10207 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
10208
10209 /* Recalc txpower for remaining vdev */
10210 ath12k_mac_txpower_recalc(ar);
10211
10212 /* TODO: recal traffic pause state based on the available vdevs */
10213 arvif->is_created = false;
10214 arvif->ar = NULL;
10215
10216 return ret;
10217 }
10218
ath12k_mac_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10219 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
10220 struct ieee80211_vif *vif)
10221 {
10222 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10223 struct ath12k_link_vif *arvif;
10224 struct ath12k *ar;
10225 u8 link_id;
10226
10227 lockdep_assert_wiphy(hw->wiphy);
10228
10229 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) {
10230 /* if we cached some config but never received assign chanctx,
10231 * free the allocated cache.
10232 */
10233 ath12k_ahvif_put_link_cache(ahvif, link_id);
10234 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
10235 if (!arvif || !arvif->is_created)
10236 continue;
10237
10238 ar = arvif->ar;
10239
10240 /* Scan abortion is in progress since before this, cancel_hw_scan()
10241 * is expected to be executed. Since link is anyways going to be removed
10242 * now, just cancel the worker and send the scan aborted to user space
10243 */
10244 if (ar->scan.arvif == arvif) {
10245 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
10246
10247 spin_lock_bh(&ar->data_lock);
10248 ar->scan.arvif = NULL;
10249 if (!ar->scan.is_roc) {
10250 struct cfg80211_scan_info info = {
10251 .aborted = true,
10252 };
10253
10254 ath12k_mac_scan_send_complete(ar, &info);
10255 }
10256
10257 ar->scan.state = ATH12K_SCAN_IDLE;
10258 ar->scan_channel = NULL;
10259 ar->scan.roc_freq = 0;
10260 spin_unlock_bh(&ar->data_lock);
10261 }
10262
10263 ath12k_mac_remove_link_interface(hw, arvif);
10264 ath12k_mac_unassign_link_vif(arvif);
10265 }
10266 }
10267
10268 /* FIXME: Has to be verified. */
10269 #define SUPPORTED_FILTERS \
10270 (FIF_ALLMULTI | \
10271 FIF_CONTROL | \
10272 FIF_PSPOLL | \
10273 FIF_OTHER_BSS | \
10274 FIF_BCN_PRBRESP_PROMISC | \
10275 FIF_PROBE_REQ | \
10276 FIF_FCSFAIL)
10277
ath12k_mac_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)10278 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
10279 unsigned int changed_flags,
10280 unsigned int *total_flags,
10281 u64 multicast)
10282 {
10283 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10284 struct ath12k *ar;
10285
10286 lockdep_assert_wiphy(hw->wiphy);
10287
10288 ar = ath12k_ah_to_ar(ah, 0);
10289
10290 *total_flags &= SUPPORTED_FILTERS;
10291 ar->filter_flags = *total_flags;
10292 }
10293
ath12k_mac_op_get_antenna(struct ieee80211_hw * hw,int radio_idx,u32 * tx_ant,u32 * rx_ant)10294 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
10295 u32 *tx_ant, u32 *rx_ant)
10296 {
10297 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10298 int antennas_rx = 0, antennas_tx = 0;
10299 struct ath12k *ar;
10300 int i;
10301
10302 lockdep_assert_wiphy(hw->wiphy);
10303
10304 for_each_ar(ah, ar, i) {
10305 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
10306 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
10307 }
10308
10309 *tx_ant = antennas_tx;
10310 *rx_ant = antennas_rx;
10311
10312 return 0;
10313 }
10314
ath12k_mac_op_set_antenna(struct ieee80211_hw * hw,int radio_idx,u32 tx_ant,u32 rx_ant)10315 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
10316 u32 tx_ant, u32 rx_ant)
10317 {
10318 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10319 struct ath12k *ar;
10320 int ret = 0;
10321 int i;
10322
10323 lockdep_assert_wiphy(hw->wiphy);
10324
10325 for_each_ar(ah, ar, i) {
10326 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
10327 if (ret)
10328 break;
10329 }
10330
10331 return ret;
10332 }
10333
ath12k_mac_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params,u8 link_id)10334 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw,
10335 struct ieee80211_vif *vif,
10336 struct ieee80211_ampdu_params *params,
10337 u8 link_id)
10338 {
10339 struct ath12k *ar;
10340 int ret = -EINVAL;
10341
10342 lockdep_assert_wiphy(hw->wiphy);
10343
10344 ar = ath12k_get_ar_by_vif(hw, vif, link_id);
10345 if (!ar)
10346 return -EINVAL;
10347
10348 switch (params->action) {
10349 case IEEE80211_AMPDU_RX_START:
10350 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id);
10351 break;
10352 case IEEE80211_AMPDU_RX_STOP:
10353 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id);
10354 break;
10355 case IEEE80211_AMPDU_TX_START:
10356 case IEEE80211_AMPDU_TX_STOP_CONT:
10357 case IEEE80211_AMPDU_TX_STOP_FLUSH:
10358 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10359 case IEEE80211_AMPDU_TX_OPERATIONAL:
10360 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
10361 * Tx aggregation requests.
10362 */
10363 ret = -EOPNOTSUPP;
10364 break;
10365 }
10366
10367 if (ret)
10368 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n",
10369 params->action, vif->addr, link_id, ret);
10370
10371 return ret;
10372 }
10373
ath12k_mac_op_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)10374 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
10375 struct ieee80211_vif *vif,
10376 struct ieee80211_ampdu_params *params)
10377 {
10378 struct ieee80211_sta *sta = params->sta;
10379 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
10380 unsigned long links_map = ahsta->links_map;
10381 int ret = -EINVAL;
10382 u8 link_id;
10383
10384 lockdep_assert_wiphy(hw->wiphy);
10385
10386 if (WARN_ON(!links_map))
10387 return ret;
10388
10389 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10390 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id);
10391 if (ret)
10392 return ret;
10393 }
10394
10395 return 0;
10396 }
10397
ath12k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10398 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
10399 struct ieee80211_chanctx_conf *ctx)
10400 {
10401 struct ath12k *ar;
10402 struct ath12k_base *ab;
10403
10404 lockdep_assert_wiphy(hw->wiphy);
10405
10406 ar = ath12k_get_ar_by_ctx(hw, ctx);
10407 if (!ar)
10408 return -EINVAL;
10409
10410 ab = ar->ab;
10411
10412 ath12k_dbg(ab, ATH12K_DBG_MAC,
10413 "mac chanctx add freq %u width %d ptr %p\n",
10414 ctx->def.chan->center_freq, ctx->def.width, ctx);
10415
10416 spin_lock_bh(&ar->data_lock);
10417 /* TODO: In case of multiple channel context, populate rx_channel from
10418 * Rx PPDU desc information.
10419 */
10420 ar->rx_channel = ctx->def.chan;
10421 spin_unlock_bh(&ar->data_lock);
10422 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10423
10424 return 0;
10425 }
10426
ath12k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10427 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
10428 struct ieee80211_chanctx_conf *ctx)
10429 {
10430 struct ath12k *ar;
10431 struct ath12k_base *ab;
10432
10433 lockdep_assert_wiphy(hw->wiphy);
10434
10435 ar = ath12k_get_ar_by_ctx(hw, ctx);
10436 if (!ar)
10437 return;
10438
10439 ab = ar->ab;
10440
10441 ath12k_dbg(ab, ATH12K_DBG_MAC,
10442 "mac chanctx remove freq %u width %d ptr %p\n",
10443 ctx->def.chan->center_freq, ctx->def.width, ctx);
10444
10445 spin_lock_bh(&ar->data_lock);
10446 /* TODO: In case of there is one more channel context left, populate
10447 * rx_channel with the channel of that remaining channel context.
10448 */
10449 ar->rx_channel = NULL;
10450 spin_unlock_bh(&ar->data_lock);
10451 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10452 }
10453
10454 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)10455 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
10456 enum wmi_phy_mode mode,
10457 enum nl80211_band band,
10458 enum nl80211_iftype type)
10459 {
10460 struct ieee80211_sta_eht_cap *eht_cap = NULL;
10461 enum wmi_phy_mode down_mode;
10462 int n = ar->mac.sbands[band].n_iftype_data;
10463 int i;
10464 struct ieee80211_sband_iftype_data *data;
10465
10466 if (mode < MODE_11BE_EHT20)
10467 return mode;
10468
10469 data = ar->mac.iftype[band];
10470 for (i = 0; i < n; i++) {
10471 if (data[i].types_mask & BIT(type)) {
10472 eht_cap = &data[i].eht_cap;
10473 break;
10474 }
10475 }
10476
10477 if (eht_cap && eht_cap->has_eht)
10478 return mode;
10479
10480 switch (mode) {
10481 case MODE_11BE_EHT20:
10482 down_mode = MODE_11AX_HE20;
10483 break;
10484 case MODE_11BE_EHT40:
10485 down_mode = MODE_11AX_HE40;
10486 break;
10487 case MODE_11BE_EHT80:
10488 down_mode = MODE_11AX_HE80;
10489 break;
10490 case MODE_11BE_EHT80_80:
10491 down_mode = MODE_11AX_HE80_80;
10492 break;
10493 case MODE_11BE_EHT160:
10494 case MODE_11BE_EHT160_160:
10495 case MODE_11BE_EHT320:
10496 down_mode = MODE_11AX_HE160;
10497 break;
10498 case MODE_11BE_EHT20_2G:
10499 down_mode = MODE_11AX_HE20_2G;
10500 break;
10501 case MODE_11BE_EHT40_2G:
10502 down_mode = MODE_11AX_HE40_2G;
10503 break;
10504 default:
10505 down_mode = mode;
10506 break;
10507 }
10508
10509 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10510 "mac vdev start phymode %s downgrade to %s\n",
10511 ath12k_mac_phymode_str(mode),
10512 ath12k_mac_phymode_str(down_mode));
10513
10514 return down_mode;
10515 }
10516
10517 static void
ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif * arvif,struct wmi_ml_arg * ml_arg)10518 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif,
10519 struct wmi_ml_arg *ml_arg)
10520 {
10521 struct ath12k_vif *ahvif = arvif->ahvif;
10522 struct wmi_ml_partner_info *partner_info;
10523 struct ieee80211_bss_conf *link_conf;
10524 struct ath12k_link_vif *arvif_p;
10525 unsigned long links;
10526 u8 link_id;
10527
10528 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10529
10530 if (!ath12k_mac_is_ml_arvif(arvif))
10531 return;
10532
10533 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS)
10534 return;
10535
10536 ml_arg->enabled = true;
10537
10538 /* Driver always add a new link via VDEV START, FW takes
10539 * care of internally adding this link to existing
10540 * link vdevs which are advertised as partners below
10541 */
10542 ml_arg->link_add = true;
10543
10544 ml_arg->assoc_link = arvif->is_sta_assoc_link;
10545
10546 partner_info = ml_arg->partner_info;
10547
10548 links = ahvif->links_map;
10549 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
10550 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10551
10552 if (WARN_ON(!arvif_p))
10553 continue;
10554
10555 if (arvif == arvif_p)
10556 continue;
10557
10558 if (!arvif_p->is_created)
10559 continue;
10560
10561 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10562 ahvif->vif->link_conf[arvif_p->link_id]);
10563
10564 if (!link_conf)
10565 continue;
10566
10567 partner_info->vdev_id = arvif_p->vdev_id;
10568 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id;
10569 ether_addr_copy(partner_info->addr, link_conf->addr);
10570 ml_arg->num_partner_links++;
10571 partner_info++;
10572 }
10573 }
10574
10575 static int
ath12k_mac_vdev_start_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx,bool restart)10576 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif,
10577 struct ieee80211_chanctx_conf *ctx,
10578 bool restart)
10579 {
10580 struct ath12k *ar = arvif->ar;
10581 struct ath12k_base *ab = ar->ab;
10582 struct wmi_vdev_start_req_arg arg = {};
10583 const struct cfg80211_chan_def *chandef = &ctx->def;
10584 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10585 struct ath12k_vif *ahvif = arvif->ahvif;
10586 struct ieee80211_bss_conf *link_conf;
10587 unsigned int dfs_cac_time;
10588 int ret;
10589
10590 lockdep_assert_wiphy(hw->wiphy);
10591
10592 link_conf = ath12k_mac_get_link_bss_conf(arvif);
10593 if (!link_conf) {
10594 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n",
10595 ahvif->vif->addr, arvif->link_id);
10596 return -ENOLINK;
10597 }
10598
10599 reinit_completion(&ar->vdev_setup_done);
10600
10601 arg.vdev_id = arvif->vdev_id;
10602 arg.dtim_period = arvif->dtim_period;
10603 arg.bcn_intval = arvif->beacon_interval;
10604 arg.punct_bitmap = ~arvif->punct_bitmap;
10605
10606 arg.freq = chandef->chan->center_freq;
10607 arg.band_center_freq1 = chandef->center_freq1;
10608 arg.band_center_freq2 = chandef->center_freq2;
10609 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
10610
10611 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
10612 chandef->chan->band,
10613 ahvif->vif->type);
10614 arg.min_power = 0;
10615 arg.max_power = chandef->chan->max_power;
10616 arg.max_reg_power = chandef->chan->max_reg_power;
10617 arg.max_antenna_gain = chandef->chan->max_antenna_gain;
10618
10619 arg.pref_tx_streams = ar->num_tx_chains;
10620 arg.pref_rx_streams = ar->num_rx_chains;
10621
10622 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
10623 arg.mbssid_tx_vdev_id = 0;
10624 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
10625 ar->ab->wmi_ab.svc_map)) {
10626 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
10627 &arg.mbssid_flags,
10628 &arg.mbssid_tx_vdev_id);
10629 if (ret)
10630 return ret;
10631 }
10632
10633 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10634 arg.ssid = ahvif->u.ap.ssid;
10635 arg.ssid_len = ahvif->u.ap.ssid_len;
10636 arg.hidden_ssid = ahvif->u.ap.hidden_ssid;
10637
10638 /* For now allow DFS for AP mode */
10639 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
10640
10641 arg.freq2_radar = ctx->radar_enabled;
10642
10643 arg.passive = arg.chan_radar;
10644
10645 spin_lock_bh(&ab->base_lock);
10646 arg.regdomain = ar->ab->dfs_region;
10647 spin_unlock_bh(&ab->base_lock);
10648
10649 /* TODO: Notify if secondary 80Mhz also needs radar detection */
10650 }
10651
10652 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
10653
10654 if (!restart)
10655 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml);
10656
10657 ath12k_dbg(ab, ATH12K_DBG_MAC,
10658 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
10659 arg.vdev_id, arg.freq,
10660 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
10661
10662 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
10663 if (ret) {
10664 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
10665 restart ? "restart" : "start", arg.vdev_id);
10666 return ret;
10667 }
10668
10669 ret = ath12k_mac_vdev_setup_sync(ar);
10670 if (ret) {
10671 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
10672 arg.vdev_id, restart ? "restart" : "start", ret);
10673 return ret;
10674 }
10675
10676 /* TODO: For now we only set TPC power here. However when
10677 * channel changes, say CSA, it should be updated again.
10678 */
10679 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) {
10680 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx);
10681 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
10682 &arvif->reg_tpc_info);
10683 }
10684
10685 ar->num_started_vdevs++;
10686 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
10687 ahvif->vif->addr, arvif->vdev_id);
10688
10689 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS
10690 * state as NL80211_DFS_USABLE which indicates CAC needs to be
10691 * done before channel usage. This flag is used to drop rx packets.
10692 * during CAC.
10693 */
10694 /* TODO: Set the flag for other interface types as required */
10695 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
10696 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) {
10697 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
10698 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef);
10699
10700 ath12k_dbg(ab, ATH12K_DBG_MAC,
10701 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
10702 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id);
10703 }
10704
10705 ret = ath12k_mac_set_txbf_conf(arvif);
10706 if (ret)
10707 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
10708 arvif->vdev_id, ret);
10709
10710 return 0;
10711 }
10712
ath12k_mac_vdev_start(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10713 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif,
10714 struct ieee80211_chanctx_conf *ctx)
10715 {
10716 return ath12k_mac_vdev_start_restart(arvif, ctx, false);
10717 }
10718
ath12k_mac_vdev_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10719 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif,
10720 struct ieee80211_chanctx_conf *ctx)
10721 {
10722 return ath12k_mac_vdev_start_restart(arvif, ctx, true);
10723 }
10724
10725 struct ath12k_mac_change_chanctx_arg {
10726 struct ieee80211_chanctx_conf *ctx;
10727 struct ieee80211_vif_chanctx_switch *vifs;
10728 int n_vifs;
10729 int next_vif;
10730 struct ath12k *ar;
10731 };
10732
10733 static void
ath12k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10734 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
10735 struct ieee80211_vif *vif)
10736 {
10737 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10738 struct ath12k_mac_change_chanctx_arg *arg = data;
10739 struct ieee80211_bss_conf *link_conf;
10740 struct ath12k_link_vif *arvif;
10741 unsigned long links_map;
10742 u8 link_id;
10743
10744 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10745
10746 links_map = ahvif->links_map;
10747 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10748 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10749 if (WARN_ON(!arvif))
10750 continue;
10751
10752 if (!arvif->is_created || arvif->ar != arg->ar)
10753 continue;
10754
10755 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10756 vif->link_conf[link_id]);
10757 if (WARN_ON(!link_conf))
10758 continue;
10759
10760 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx)
10761 continue;
10762
10763 arg->n_vifs++;
10764 }
10765 }
10766
10767 static void
ath12k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10768 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
10769 struct ieee80211_vif *vif)
10770 {
10771 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10772 struct ath12k_mac_change_chanctx_arg *arg = data;
10773 struct ieee80211_bss_conf *link_conf;
10774 struct ieee80211_chanctx_conf *ctx;
10775 struct ath12k_link_vif *arvif;
10776 unsigned long links_map;
10777 u8 link_id;
10778
10779 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10780
10781 links_map = ahvif->links_map;
10782 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10783 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10784 if (WARN_ON(!arvif))
10785 continue;
10786
10787 if (!arvif->is_created || arvif->ar != arg->ar)
10788 continue;
10789
10790 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10791 vif->link_conf[arvif->link_id]);
10792 if (WARN_ON(!link_conf))
10793 continue;
10794
10795 ctx = rcu_access_pointer(link_conf->chanctx_conf);
10796 if (ctx != arg->ctx)
10797 continue;
10798
10799 if (WARN_ON(arg->next_vif == arg->n_vifs))
10800 return;
10801
10802 arg->vifs[arg->next_vif].vif = vif;
10803 arg->vifs[arg->next_vif].old_ctx = ctx;
10804 arg->vifs[arg->next_vif].new_ctx = ctx;
10805 arg->vifs[arg->next_vif].link_conf = link_conf;
10806 arg->next_vif++;
10807 }
10808 }
10809
ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)10810 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
10811 {
10812 switch (width) {
10813 case NL80211_CHAN_WIDTH_20:
10814 return WMI_CHAN_WIDTH_20;
10815 case NL80211_CHAN_WIDTH_40:
10816 return WMI_CHAN_WIDTH_40;
10817 case NL80211_CHAN_WIDTH_80:
10818 return WMI_CHAN_WIDTH_80;
10819 case NL80211_CHAN_WIDTH_160:
10820 return WMI_CHAN_WIDTH_160;
10821 case NL80211_CHAN_WIDTH_80P80:
10822 return WMI_CHAN_WIDTH_80P80;
10823 case NL80211_CHAN_WIDTH_5:
10824 return WMI_CHAN_WIDTH_5;
10825 case NL80211_CHAN_WIDTH_10:
10826 return WMI_CHAN_WIDTH_10;
10827 case NL80211_CHAN_WIDTH_320:
10828 return WMI_CHAN_WIDTH_320;
10829 default:
10830 WARN_ON(1);
10831 return WMI_CHAN_WIDTH_20;
10832 }
10833 }
10834
ath12k_mac_update_peer_puncturing_width(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def def)10835 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
10836 struct ath12k_link_vif *arvif,
10837 struct cfg80211_chan_def def)
10838 {
10839 u32 param_id, param_value;
10840 int ret;
10841
10842 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
10843 return 0;
10844
10845 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
10846 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
10847 u32_encode_bits((~def.punctured),
10848 WMI_PEER_PUNCTURE_BITMAP);
10849
10850 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10851 "punctured bitmap %02x width %d vdev %d\n",
10852 def.punctured, def.width, arvif->vdev_id);
10853
10854 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
10855 arvif->vdev_id, param_id,
10856 param_value);
10857
10858 return ret;
10859 }
10860
10861 static void
ath12k_mac_update_vif_chan(struct ath12k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)10862 ath12k_mac_update_vif_chan(struct ath12k *ar,
10863 struct ieee80211_vif_chanctx_switch *vifs,
10864 int n_vifs)
10865 {
10866 struct ath12k_wmi_vdev_up_params params = {};
10867 struct ath12k_link_vif *arvif;
10868 struct ieee80211_bss_conf *link_conf;
10869 struct ath12k_base *ab = ar->ab;
10870 struct ieee80211_vif *vif;
10871 struct ath12k_vif *ahvif;
10872 u8 link_id;
10873 int ret;
10874 int i;
10875 bool monitor_vif = false;
10876
10877 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10878
10879 for (i = 0; i < n_vifs; i++) {
10880 vif = vifs[i].vif;
10881 ahvif = ath12k_vif_to_ahvif(vif);
10882 link_conf = vifs[i].link_conf;
10883 link_id = link_conf->link_id;
10884 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
10885 ahvif->link[link_id]);
10886
10887 if (vif->type == NL80211_IFTYPE_MONITOR) {
10888 monitor_vif = true;
10889 continue;
10890 }
10891
10892 ath12k_dbg(ab, ATH12K_DBG_MAC,
10893 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
10894 arvif->vdev_id,
10895 vifs[i].old_ctx->def.chan->center_freq,
10896 vifs[i].new_ctx->def.chan->center_freq,
10897 vifs[i].old_ctx->def.width,
10898 vifs[i].new_ctx->def.width);
10899
10900 if (WARN_ON(!arvif->is_started))
10901 continue;
10902
10903 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
10904
10905 /* Firmware expect vdev_restart only if vdev is up.
10906 * If vdev is down then it expect vdev_stop->vdev_start.
10907 */
10908 if (arvif->is_up) {
10909 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
10910 if (ret) {
10911 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
10912 arvif->vdev_id, ret);
10913 continue;
10914 }
10915 } else {
10916 ret = ath12k_mac_vdev_stop(arvif);
10917 if (ret) {
10918 ath12k_warn(ab, "failed to stop vdev %d: %d\n",
10919 arvif->vdev_id, ret);
10920 continue;
10921 }
10922
10923 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
10924 if (ret)
10925 ath12k_warn(ab, "failed to start vdev %d: %d\n",
10926 arvif->vdev_id, ret);
10927 continue;
10928 }
10929
10930 ret = ath12k_mac_setup_bcn_tmpl(arvif);
10931 if (ret)
10932 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
10933 ret);
10934
10935 memset(¶ms, 0, sizeof(params));
10936 params.vdev_id = arvif->vdev_id;
10937 params.aid = ahvif->aid;
10938 params.bssid = arvif->bssid;
10939 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
10940 if (params.tx_bssid) {
10941 params.nontx_profile_idx = link_conf->bssid_index;
10942 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator;
10943 }
10944 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
10945 if (ret) {
10946 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
10947 arvif->vdev_id, ret);
10948 continue;
10949 }
10950
10951 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
10952 vifs[i].new_ctx->def);
10953 if (ret) {
10954 ath12k_warn(ar->ab,
10955 "failed to update puncturing bitmap %02x and width %d: %d\n",
10956 vifs[i].new_ctx->def.punctured,
10957 vifs[i].new_ctx->def.width, ret);
10958 continue;
10959 }
10960 }
10961
10962 /* Restart the internal monitor vdev on new channel */
10963 if (!monitor_vif && ar->monitor_vdev_created) {
10964 if (!ath12k_mac_monitor_stop(ar))
10965 ath12k_mac_monitor_start(ar);
10966 }
10967 }
10968
10969 static void
ath12k_mac_update_active_vif_chan(struct ath12k * ar,struct ieee80211_chanctx_conf * ctx)10970 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
10971 struct ieee80211_chanctx_conf *ctx)
10972 {
10973 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
10974 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10975
10976 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10977
10978 ieee80211_iterate_active_interfaces_atomic(hw,
10979 IEEE80211_IFACE_ITER_NORMAL,
10980 ath12k_mac_change_chanctx_cnt_iter,
10981 &arg);
10982 if (arg.n_vifs == 0)
10983 return;
10984
10985 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
10986 if (!arg.vifs)
10987 return;
10988
10989 ieee80211_iterate_active_interfaces_atomic(hw,
10990 IEEE80211_IFACE_ITER_NORMAL,
10991 ath12k_mac_change_chanctx_fill_iter,
10992 &arg);
10993
10994 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
10995
10996 kfree(arg.vifs);
10997 }
10998
ath12k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)10999 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
11000 struct ieee80211_chanctx_conf *ctx,
11001 u32 changed)
11002 {
11003 struct ath12k *ar;
11004 struct ath12k_base *ab;
11005
11006 lockdep_assert_wiphy(hw->wiphy);
11007
11008 ar = ath12k_get_ar_by_ctx(hw, ctx);
11009 if (!ar)
11010 return;
11011
11012 ab = ar->ab;
11013
11014 ath12k_dbg(ab, ATH12K_DBG_MAC,
11015 "mac chanctx change freq %u width %d ptr %p changed %x\n",
11016 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
11017
11018 /* This shouldn't really happen because channel switching should use
11019 * switch_vif_chanctx().
11020 */
11021 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
11022 return;
11023
11024 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
11025 changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
11026 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
11027 ath12k_mac_update_active_vif_chan(ar, ctx);
11028
11029 /* TODO: Recalc radar detection */
11030 }
11031
ath12k_start_vdev_delay(struct ath12k * ar,struct ath12k_link_vif * arvif)11032 static int ath12k_start_vdev_delay(struct ath12k *ar,
11033 struct ath12k_link_vif *arvif)
11034 {
11035 struct ath12k_base *ab = ar->ab;
11036 struct ath12k_vif *ahvif = arvif->ahvif;
11037 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
11038 struct ieee80211_chanctx_conf *chanctx;
11039 struct ieee80211_bss_conf *link_conf;
11040 int ret;
11041
11042 if (WARN_ON(arvif->is_started))
11043 return -EBUSY;
11044
11045 link_conf = ath12k_mac_get_link_bss_conf(arvif);
11046 if (!link_conf) {
11047 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id);
11048 return -EINVAL;
11049 }
11050
11051 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy,
11052 link_conf->chanctx_conf);
11053 ret = ath12k_mac_vdev_start(arvif, chanctx);
11054 if (ret) {
11055 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11056 arvif->vdev_id, vif->addr,
11057 chanctx->def.chan->center_freq, ret);
11058 return ret;
11059 }
11060
11061 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11062 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
11063 if (ret) {
11064 ath12k_warn(ab, "failed put monitor up: %d\n", ret);
11065 return ret;
11066 }
11067 }
11068
11069 arvif->is_started = true;
11070
11071 /* TODO: Setup ps and cts/rts protection */
11072 return 0;
11073 }
11074
ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def * chan_def)11075 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
11076 {
11077 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
11078 switch (chan_def->width) {
11079 case NL80211_CHAN_WIDTH_20:
11080 return 1;
11081 case NL80211_CHAN_WIDTH_40:
11082 return 2;
11083 case NL80211_CHAN_WIDTH_80:
11084 return 4;
11085 case NL80211_CHAN_WIDTH_160:
11086 return 8;
11087 case NL80211_CHAN_WIDTH_320:
11088 return 16;
11089 default:
11090 return 1;
11091 }
11092 } else {
11093 switch (chan_def->width) {
11094 case NL80211_CHAN_WIDTH_20:
11095 return 1;
11096 case NL80211_CHAN_WIDTH_40:
11097 return 2;
11098 case NL80211_CHAN_WIDTH_80:
11099 return 3;
11100 case NL80211_CHAN_WIDTH_160:
11101 return 4;
11102 case NL80211_CHAN_WIDTH_320:
11103 return 5;
11104 default:
11105 return 1;
11106 }
11107 }
11108 }
11109
ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def * chan_def)11110 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
11111 {
11112 u16 diff_seq;
11113
11114 /* It is to get the lowest channel number's center frequency of the chan.
11115 * For example,
11116 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
11117 * with center frequency 5955, its diff is 5965 - 5955 = 10.
11118 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
11119 * with center frequency 5955, its diff is 5985 - 5955 = 30.
11120 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
11121 * with center frequency 5955, its diff is 6025 - 5955 = 70.
11122 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1
11123 * with center frequency 5955, its diff is 6105 - 5955 = 70.
11124 */
11125 switch (chan_def->width) {
11126 case NL80211_CHAN_WIDTH_320:
11127 diff_seq = 150;
11128 break;
11129 case NL80211_CHAN_WIDTH_160:
11130 diff_seq = 70;
11131 break;
11132 case NL80211_CHAN_WIDTH_80:
11133 diff_seq = 30;
11134 break;
11135 case NL80211_CHAN_WIDTH_40:
11136 diff_seq = 10;
11137 break;
11138 default:
11139 diff_seq = 0;
11140 }
11141
11142 return chan_def->center_freq1 - diff_seq;
11143 }
11144
ath12k_mac_get_seg_freq(struct cfg80211_chan_def * chan_def,u16 start_seq,u8 seq)11145 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
11146 u16 start_seq, u8 seq)
11147 {
11148 u16 seg_seq;
11149
11150 /* It is to get the center frequency of the specific bandwidth.
11151 * start_seq means the lowest channel number's center frequency.
11152 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz.
11153 * For example,
11154 * lowest channel is 1, its center frequency 5955,
11155 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
11156 * lowest channel is 1, its center frequency 5955,
11157 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
11158 * lowest channel is 1, its center frequency 5955,
11159 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
11160 * lowest channel is 1, its center frequency 5955,
11161 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
11162 */
11163 seg_seq = 10 * (BIT(seq) - 1);
11164 return seg_seq + start_seq;
11165 }
11166
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)11167 static void ath12k_mac_get_psd_channel(struct ath12k *ar,
11168 u16 step_freq,
11169 u16 *start_freq,
11170 u16 *center_freq,
11171 u8 i,
11172 struct ieee80211_channel **temp_chan,
11173 s8 *tx_power)
11174 {
11175 /* It is to get the center frequency for each 20 MHz.
11176 * For example, if the chan is 160 MHz and center frequency is 6025,
11177 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
11178 * channel number 1's center frequency is 5955, it is parameter start_freq.
11179 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
11180 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
11181 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
11182 * the gap is 20 for each channel, parameter step_freq means the gap.
11183 * after get the center frequency of each channel, it is easy to find the
11184 * struct ieee80211_channel of it and get the max_reg_power.
11185 */
11186 *center_freq = *start_freq + i * step_freq;
11187 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11188 *tx_power = (*temp_chan)->max_reg_power;
11189 }
11190
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)11191 static void ath12k_mac_get_eirp_power(struct ath12k *ar,
11192 u16 *start_freq,
11193 u16 *center_freq,
11194 u8 i,
11195 struct ieee80211_channel **temp_chan,
11196 struct cfg80211_chan_def *def,
11197 s8 *tx_power)
11198 {
11199 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
11200 * 160 MHz bandwidth, and then plus 10 to the center frequency,
11201 * it is the center frequency of a channel number.
11202 * For example, when configured channel number is 1.
11203 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
11204 * then it is channel number 5.
11205 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
11206 * then it is channel number 9.
11207 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
11208 * then it is channel number 17.
11209 * after get the center frequency of each channel, it is easy to find the
11210 * struct ieee80211_channel of it and get the max_reg_power.
11211 */
11212 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i);
11213
11214 /* For the 20 MHz, its center frequency is same with same channel */
11215 if (i != 0)
11216 *center_freq += 10;
11217
11218 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11219 *tx_power = (*temp_chan)->max_reg_power;
11220 }
11221
ath12k_mac_fill_reg_tpc_info(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11222 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
11223 struct ath12k_link_vif *arvif,
11224 struct ieee80211_chanctx_conf *ctx)
11225 {
11226 struct ath12k_base *ab = ar->ab;
11227 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
11228 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11229 struct ieee80211_channel *chan, *temp_chan;
11230 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
11231 bool is_psd_power = false, is_tpe_present = false;
11232 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], psd_power, tx_power;
11233 s8 eirp_power = 0;
11234 struct ath12k_vif *ahvif = arvif->ahvif;
11235 u16 start_freq, center_freq;
11236 u8 reg_6ghz_power_mode;
11237
11238 chan = ctx->def.chan;
11239 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def);
11240 pwr_reduction = bss_conf->pwr_reduction;
11241
11242 if (arvif->reg_tpc_info.num_pwr_levels) {
11243 is_tpe_present = true;
11244 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
11245 } else {
11246 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def);
11247 }
11248
11249 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
11250 /* STA received TPE IE*/
11251 if (is_tpe_present) {
11252 /* local power is PSD power*/
11253 if (chan->flags & IEEE80211_CHAN_PSD) {
11254 /* Connecting AP is psd power */
11255 if (reg_tpc_info->is_psd_power) {
11256 is_psd_power = true;
11257 ath12k_mac_get_psd_channel(ar, 20,
11258 &start_freq,
11259 ¢er_freq,
11260 pwr_lvl_idx,
11261 &temp_chan,
11262 &tx_power);
11263 psd_power = temp_chan->psd;
11264 eirp_power = tx_power;
11265 max_tx_power[pwr_lvl_idx] =
11266 min_t(s8,
11267 psd_power,
11268 reg_tpc_info->tpe[pwr_lvl_idx]);
11269 /* Connecting AP is not psd power */
11270 } else {
11271 ath12k_mac_get_eirp_power(ar,
11272 &start_freq,
11273 ¢er_freq,
11274 pwr_lvl_idx,
11275 &temp_chan,
11276 &ctx->def,
11277 &tx_power);
11278 psd_power = temp_chan->psd;
11279 /* convert psd power to EIRP power based
11280 * on channel width
11281 */
11282 tx_power =
11283 min_t(s8, tx_power,
11284 psd_power + 13 + pwr_lvl_idx * 3);
11285 max_tx_power[pwr_lvl_idx] =
11286 min_t(s8,
11287 tx_power,
11288 reg_tpc_info->tpe[pwr_lvl_idx]);
11289 }
11290 /* local power is not PSD power */
11291 } else {
11292 /* Connecting AP is psd power */
11293 if (reg_tpc_info->is_psd_power) {
11294 is_psd_power = true;
11295 ath12k_mac_get_psd_channel(ar, 20,
11296 &start_freq,
11297 ¢er_freq,
11298 pwr_lvl_idx,
11299 &temp_chan,
11300 &tx_power);
11301 eirp_power = tx_power;
11302 max_tx_power[pwr_lvl_idx] =
11303 reg_tpc_info->tpe[pwr_lvl_idx];
11304 /* Connecting AP is not psd power */
11305 } else {
11306 ath12k_mac_get_eirp_power(ar,
11307 &start_freq,
11308 ¢er_freq,
11309 pwr_lvl_idx,
11310 &temp_chan,
11311 &ctx->def,
11312 &tx_power);
11313 max_tx_power[pwr_lvl_idx] =
11314 min_t(s8,
11315 tx_power,
11316 reg_tpc_info->tpe[pwr_lvl_idx]);
11317 }
11318 }
11319 /* STA not received TPE IE */
11320 } else {
11321 /* local power is PSD power*/
11322 if (chan->flags & IEEE80211_CHAN_PSD) {
11323 is_psd_power = true;
11324 ath12k_mac_get_psd_channel(ar, 20,
11325 &start_freq,
11326 ¢er_freq,
11327 pwr_lvl_idx,
11328 &temp_chan,
11329 &tx_power);
11330 psd_power = temp_chan->psd;
11331 eirp_power = tx_power;
11332 max_tx_power[pwr_lvl_idx] = psd_power;
11333 } else {
11334 ath12k_mac_get_eirp_power(ar,
11335 &start_freq,
11336 ¢er_freq,
11337 pwr_lvl_idx,
11338 &temp_chan,
11339 &ctx->def,
11340 &tx_power);
11341 max_tx_power[pwr_lvl_idx] = tx_power;
11342 }
11343 }
11344
11345 if (is_psd_power) {
11346 /* If AP local power constraint is present */
11347 if (pwr_reduction)
11348 eirp_power = eirp_power - pwr_reduction;
11349
11350 /* If firmware updated max tx power is non zero, then take
11351 * the min of firmware updated ap tx power
11352 * and max power derived from above mentioned parameters.
11353 */
11354 ath12k_dbg(ab, ATH12K_DBG_MAC,
11355 "eirp power : %d firmware report power : %d\n",
11356 eirp_power, ar->max_allowed_tx_power);
11357 /* Firmware reports lower max_allowed_tx_power during vdev
11358 * start response. In case of 6 GHz, firmware is not aware
11359 * of EIRP power unless driver sets EIRP power through WMI
11360 * TPC command. So radio which does not support idle power
11361 * save can set maximum calculated EIRP power directly to
11362 * firmware through TPC command without min comparison with
11363 * vdev start response's max_allowed_tx_power.
11364 */
11365 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11366 eirp_power = min_t(s8,
11367 eirp_power,
11368 ar->max_allowed_tx_power);
11369 } else {
11370 /* If AP local power constraint is present */
11371 if (pwr_reduction)
11372 max_tx_power[pwr_lvl_idx] =
11373 max_tx_power[pwr_lvl_idx] - pwr_reduction;
11374 /* If firmware updated max tx power is non zero, then take
11375 * the min of firmware updated ap tx power
11376 * and max power derived from above mentioned parameters.
11377 */
11378 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11379 max_tx_power[pwr_lvl_idx] =
11380 min_t(s8,
11381 max_tx_power[pwr_lvl_idx],
11382 ar->max_allowed_tx_power);
11383 }
11384 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
11385 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
11386 max_tx_power[pwr_lvl_idx];
11387 }
11388
11389 reg_tpc_info->num_pwr_levels = num_pwr_levels;
11390 reg_tpc_info->is_psd_power = is_psd_power;
11391 reg_tpc_info->eirp_power = eirp_power;
11392 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11393 reg_6ghz_power_mode = bss_conf->power_type;
11394 else
11395 /* For now, LPI is the only supported AP power mode */
11396 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP;
11397
11398 reg_tpc_info->ap_power_type =
11399 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode);
11400 }
11401
ath12k_mac_parse_tx_pwr_env(struct ath12k * ar,struct ath12k_link_vif * arvif)11402 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar,
11403 struct ath12k_link_vif *arvif)
11404 {
11405 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11406 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info;
11407 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd;
11408 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd;
11409 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe;
11410 enum wmi_reg_6g_client_type client_type;
11411 struct ath12k_reg_info *reg_info;
11412 struct ath12k_base *ab = ar->ab;
11413 bool psd_valid, non_psd_valid;
11414 int i;
11415
11416 reg_info = ab->reg_info[ar->pdev_idx];
11417 client_type = reg_info->client_type;
11418
11419 local_psd = &tpe->psd_local[client_type];
11420 reg_psd = &tpe->psd_reg_client[client_type];
11421 local_non_psd = &tpe->max_local[client_type];
11422 reg_non_psd = &tpe->max_reg_client[client_type];
11423
11424 psd_valid = local_psd->valid | reg_psd->valid;
11425 non_psd_valid = local_non_psd->valid | reg_non_psd->valid;
11426
11427 if (!psd_valid && !non_psd_valid) {
11428 ath12k_warn(ab,
11429 "no transmit power envelope match client power type %d\n",
11430 client_type);
11431 return;
11432 }
11433
11434 if (psd_valid) {
11435 tpc_info->is_psd_power = true;
11436
11437 tpc_info->num_pwr_levels = max(local_psd->count,
11438 reg_psd->count);
11439 tpc_info->num_pwr_levels =
11440 min3(tpc_info->num_pwr_levels,
11441 IEEE80211_TPE_PSD_ENTRIES_320MHZ,
11442 ATH12K_NUM_PWR_LEVELS);
11443
11444 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11445 tpc_info->tpe[i] = min(local_psd->power[i],
11446 reg_psd->power[i]) / 2;
11447 ath12k_dbg(ab, ATH12K_DBG_MAC,
11448 "TPE PSD power[%d] : %d\n",
11449 i, tpc_info->tpe[i]);
11450 }
11451 } else {
11452 tpc_info->is_psd_power = false;
11453 tpc_info->eirp_power = 0;
11454
11455 tpc_info->num_pwr_levels = max(local_non_psd->count,
11456 reg_non_psd->count);
11457 tpc_info->num_pwr_levels =
11458 min3(tpc_info->num_pwr_levels,
11459 IEEE80211_TPE_EIRP_ENTRIES_320MHZ,
11460 ATH12K_NUM_PWR_LEVELS);
11461
11462 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11463 tpc_info->tpe[i] = min(local_non_psd->power[i],
11464 reg_non_psd->power[i]) / 2;
11465 ath12k_dbg(ab, ATH12K_DBG_MAC,
11466 "non PSD power[%d] : %d\n",
11467 i, tpc_info->tpe[i]);
11468 }
11469 }
11470 }
11471
11472 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)11473 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
11474 struct ieee80211_vif *vif,
11475 struct ieee80211_bss_conf *link_conf,
11476 struct ieee80211_chanctx_conf *ctx)
11477 {
11478 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11479 struct ath12k *ar;
11480 struct ath12k_base *ab;
11481 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11482 u8 link_id = link_conf->link_id;
11483 struct ath12k_link_vif *arvif;
11484 int ret;
11485
11486 lockdep_assert_wiphy(hw->wiphy);
11487
11488 /* For multi radio wiphy, the vdev was not created during add_interface
11489 * create now since we have a channel ctx now to assign to a specific ar/fw
11490 */
11491 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
11492 if (!arvif) {
11493 WARN_ON(1);
11494 return -ENOMEM;
11495 }
11496
11497 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
11498 if (!ar) {
11499 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started",
11500 vif->addr, link_id);
11501 return -EINVAL;
11502 }
11503
11504 ab = ar->ab;
11505
11506 ath12k_dbg(ab, ATH12K_DBG_MAC,
11507 "mac chanctx assign ptr %p vdev_id %i\n",
11508 ctx, arvif->vdev_id);
11509
11510 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
11511 ctx->def.chan->band == NL80211_BAND_6GHZ &&
11512 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11513 ath12k_mac_parse_tx_pwr_env(ar, arvif);
11514
11515 arvif->punct_bitmap = ctx->def.punctured;
11516
11517 /* for some targets bss peer must be created before vdev_start */
11518 if (ab->hw_params->vdev_start_delay &&
11519 ahvif->vdev_type != WMI_VDEV_TYPE_AP &&
11520 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
11521 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
11522 ret = 0;
11523 goto out;
11524 }
11525
11526 if (WARN_ON(arvif->is_started)) {
11527 ret = -EBUSY;
11528 goto out;
11529 }
11530
11531 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11532 ret = ath12k_mac_monitor_start(ar);
11533 if (ret) {
11534 ath12k_mac_monitor_vdev_delete(ar);
11535 goto out;
11536 }
11537
11538 arvif->is_started = true;
11539 goto out;
11540 }
11541
11542 ret = ath12k_mac_vdev_start(arvif, ctx);
11543 if (ret) {
11544 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11545 arvif->vdev_id, vif->addr,
11546 ctx->def.chan->center_freq, ret);
11547 goto out;
11548 }
11549
11550 arvif->is_started = true;
11551
11552 /* TODO: Setup ps and cts/rts protection */
11553
11554 out:
11555 return ret;
11556 }
11557
11558 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)11559 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
11560 struct ieee80211_vif *vif,
11561 struct ieee80211_bss_conf *link_conf,
11562 struct ieee80211_chanctx_conf *ctx)
11563 {
11564 struct ath12k *ar;
11565 struct ath12k_base *ab;
11566 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11567 struct ath12k_link_vif *arvif;
11568 u8 link_id = link_conf->link_id;
11569 int ret;
11570
11571 lockdep_assert_wiphy(hw->wiphy);
11572
11573 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11574
11575 /* The vif is expected to be attached to an ar's VDEV.
11576 * We leave the vif/vdev in this function as is
11577 * and not delete the vdev symmetric to assign_vif_chanctx()
11578 * the VDEV will be deleted and unassigned either during
11579 * remove_interface() or when there is a change in channel
11580 * that moves the vif to a new ar
11581 */
11582 if (!arvif || !arvif->is_created)
11583 return;
11584
11585 ar = arvif->ar;
11586 ab = ar->ab;
11587
11588 ath12k_dbg(ab, ATH12K_DBG_MAC,
11589 "mac chanctx unassign ptr %p vdev_id %i\n",
11590 ctx, arvif->vdev_id);
11591
11592 WARN_ON(!arvif->is_started);
11593
11594 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11595 ret = ath12k_mac_monitor_stop(ar);
11596 if (ret)
11597 return;
11598
11599 arvif->is_started = false;
11600 }
11601
11602 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA &&
11603 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
11604 ath12k_bss_disassoc(ar, arvif);
11605 ret = ath12k_mac_vdev_stop(arvif);
11606 if (ret)
11607 ath12k_warn(ab, "failed to stop vdev %i: %d\n",
11608 arvif->vdev_id, ret);
11609 }
11610 arvif->is_started = false;
11611
11612 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
11613 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
11614 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
11615 ar->state_11d != ATH12K_11D_PREPARING) {
11616 reinit_completion(&ar->completed_11d_scan);
11617 ar->state_11d = ATH12K_11D_PREPARING;
11618 }
11619
11620 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) {
11621 ath12k_scan_abort(ar);
11622 ar->scan.arvif = NULL;
11623 }
11624 }
11625
11626 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)11627 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
11628 struct ieee80211_vif_chanctx_switch *vifs,
11629 int n_vifs,
11630 enum ieee80211_chanctx_switch_mode mode)
11631 {
11632 struct ath12k *ar;
11633
11634 lockdep_assert_wiphy(hw->wiphy);
11635
11636 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx);
11637 if (!ar)
11638 return -EINVAL;
11639
11640 /* Switching channels across radio is not allowed */
11641 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
11642 return -EINVAL;
11643
11644 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11645 "mac chanctx switch n_vifs %d mode %d\n",
11646 n_vifs, mode);
11647 ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
11648
11649 return 0;
11650 }
11651
11652 static int
ath12k_set_vdev_param_to_all_vifs(struct ath12k * ar,int param,u32 value)11653 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
11654 {
11655 struct ath12k_link_vif *arvif;
11656 int ret = 0;
11657
11658 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11659
11660 list_for_each_entry(arvif, &ar->arvifs, list) {
11661 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
11662 param, arvif->vdev_id, value);
11663
11664 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11665 param, value);
11666 if (ret) {
11667 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
11668 param, arvif->vdev_id, ret);
11669 break;
11670 }
11671 }
11672
11673 return ret;
11674 }
11675
11676 /* mac80211 stores device specific RTS/Fragmentation threshold value,
11677 * this is set interface specific to firmware from ath12k driver
11678 */
ath12k_mac_op_set_rts_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11679 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
11680 int radio_idx, u32 value)
11681 {
11682 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11683 struct wiphy *wiphy = hw->wiphy;
11684 struct ath12k *ar;
11685 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
11686 int ret = 0, ret_err, i;
11687
11688 lockdep_assert_wiphy(hw->wiphy);
11689
11690 if (radio_idx >= wiphy->n_radio || radio_idx < -1)
11691 return -EINVAL;
11692
11693 if (radio_idx != -1) {
11694 /* Update RTS threshold in specified radio */
11695 ar = ath12k_ah_to_ar(ah, radio_idx);
11696 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11697 if (ret) {
11698 ath12k_warn(ar->ab,
11699 "failed to set RTS config for all vdevs of pdev %d",
11700 ar->pdev->pdev_id);
11701 return ret;
11702 }
11703
11704 ar->rts_threshold = value;
11705 return 0;
11706 }
11707
11708 /* Radio_index passed is -1, so set RTS threshold for all radios. */
11709 for_each_ar(ah, ar, i) {
11710 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11711 if (ret) {
11712 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d",
11713 ar->pdev->pdev_id);
11714 break;
11715 }
11716 }
11717 if (!ret) {
11718 /* Setting new RTS threshold for vdevs of all radios passed, so update
11719 * the RTS threshold value for all radios
11720 */
11721 for_each_ar(ah, ar, i)
11722 ar->rts_threshold = value;
11723 return 0;
11724 }
11725
11726 /* RTS threshold config failed, revert to the previous RTS threshold */
11727 for (i = i - 1; i >= 0; i--) {
11728 ar = ath12k_ah_to_ar(ah, i);
11729 ret_err = ath12k_set_vdev_param_to_all_vifs(ar, param_id,
11730 ar->rts_threshold);
11731 if (ret_err)
11732 ath12k_warn(ar->ab,
11733 "failed to restore RTS threshold for all vdevs of pdev %d",
11734 ar->pdev->pdev_id);
11735 }
11736
11737 return ret;
11738 }
11739
ath12k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11740 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
11741 int radio_idx, u32 value)
11742 {
11743 /* Even though there's a WMI vdev param for fragmentation threshold no
11744 * known firmware actually implements it. Moreover it is not possible to
11745 * rely frame fragmentation to mac80211 because firmware clears the
11746 * "more fragments" bit in frame control making it impossible for remote
11747 * devices to reassemble frames.
11748 *
11749 * Hence implement a dummy callback just to say fragmentation isn't
11750 * supported. This effectively prevents mac80211 from doing frame
11751 * fragmentation in software.
11752 */
11753
11754 lockdep_assert_wiphy(hw->wiphy);
11755
11756 return -EOPNOTSUPP;
11757 }
11758
ath12k_mac_flush(struct ath12k * ar)11759 static int ath12k_mac_flush(struct ath12k *ar)
11760 {
11761 long time_left;
11762 int ret = 0;
11763
11764 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
11765 (atomic_read(&ar->dp.num_tx_pending) == 0),
11766 ATH12K_FLUSH_TIMEOUT);
11767 if (time_left == 0) {
11768 ath12k_warn(ar->ab,
11769 "failed to flush transmit queue, data pkts pending %d\n",
11770 atomic_read(&ar->dp.num_tx_pending));
11771 ret = -ETIMEDOUT;
11772 }
11773
11774 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
11775 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
11776 ATH12K_FLUSH_TIMEOUT);
11777 if (time_left == 0) {
11778 ath12k_warn(ar->ab,
11779 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
11780 atomic_read(&ar->num_pending_mgmt_tx));
11781 ret = -ETIMEDOUT;
11782 }
11783
11784 return ret;
11785 }
11786
ath12k_mac_wait_tx_complete(struct ath12k * ar)11787 int ath12k_mac_wait_tx_complete(struct ath12k *ar)
11788 {
11789 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11790
11791 ath12k_mac_drain_tx(ar);
11792 return ath12k_mac_flush(ar);
11793 }
11794
ath12k_mac_op_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)11795 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
11796 u32 queues, bool drop)
11797 {
11798 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11799 struct ath12k_link_vif *arvif;
11800 struct ath12k_vif *ahvif;
11801 unsigned long links;
11802 struct ath12k *ar;
11803 u8 link_id;
11804 int i;
11805
11806 lockdep_assert_wiphy(hw->wiphy);
11807
11808 if (drop)
11809 return;
11810
11811 /* vif can be NULL when flush() is considered for hw */
11812 if (!vif) {
11813 for_each_ar(ah, ar, i)
11814 ath12k_mac_flush(ar);
11815 return;
11816 }
11817
11818 for_each_ar(ah, ar, i)
11819 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work);
11820
11821 ahvif = ath12k_vif_to_ahvif(vif);
11822 links = ahvif->links_map;
11823 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
11824 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11825 if (!(arvif && arvif->ar))
11826 continue;
11827
11828 ath12k_mac_flush(arvif->ar);
11829 }
11830 }
11831
11832 static int
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11833 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
11834 enum nl80211_band band,
11835 const struct cfg80211_bitrate_mask *mask)
11836 {
11837 int num_rates = 0;
11838 int i;
11839
11840 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
11841 num_rates += hweight16(mask->control[band].ht_mcs[i]);
11842
11843 return num_rates;
11844 }
11845
11846 static bool
ath12k_mac_has_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11847 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
11848 enum nl80211_band band,
11849 const struct cfg80211_bitrate_mask *mask)
11850 {
11851 int num_rates = 0;
11852
11853 num_rates = hweight32(mask->control[band].legacy);
11854
11855 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
11856 return false;
11857
11858 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
11859 return false;
11860
11861 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask))
11862 return false;
11863
11864 return num_rates == 1;
11865 }
11866
11867 static __le16
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap * he_cap)11868 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
11869 {
11870 if (he_cap->he_cap_elem.phy_cap_info[0] &
11871 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
11872 return he_cap->he_mcs_nss_supp.tx_mcs_160;
11873
11874 return he_cap->he_mcs_nss_supp.tx_mcs_80;
11875 }
11876
11877 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)11878 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
11879 struct ieee80211_vif *vif,
11880 enum nl80211_band band,
11881 const struct cfg80211_bitrate_mask *mask,
11882 int *nss)
11883 {
11884 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
11885 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
11886 const struct ieee80211_sta_he_cap *he_cap;
11887 u16 he_mcs_map = 0;
11888 u8 ht_nss_mask = 0;
11889 u8 vht_nss_mask = 0;
11890 u8 he_nss_mask = 0;
11891 int i;
11892
11893 /* No need to consider legacy here. Basic rates are always present
11894 * in bitrate mask
11895 */
11896
11897 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
11898 if (mask->control[band].ht_mcs[i] == 0)
11899 continue;
11900 else if (mask->control[band].ht_mcs[i] ==
11901 sband->ht_cap.mcs.rx_mask[i])
11902 ht_nss_mask |= BIT(i);
11903 else
11904 return false;
11905 }
11906
11907 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
11908 if (mask->control[band].vht_mcs[i] == 0)
11909 continue;
11910 else if (mask->control[band].vht_mcs[i] ==
11911 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
11912 vht_nss_mask |= BIT(i);
11913 else
11914 return false;
11915 }
11916
11917 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif);
11918 if (!he_cap)
11919 return false;
11920
11921 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap));
11922
11923 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
11924 if (mask->control[band].he_mcs[i] == 0)
11925 continue;
11926
11927 if (mask->control[band].he_mcs[i] ==
11928 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i))
11929 he_nss_mask |= BIT(i);
11930 else
11931 return false;
11932 }
11933
11934 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
11935 return false;
11936
11937 if (ht_nss_mask == 0)
11938 return false;
11939
11940 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
11941 return false;
11942
11943 *nss = fls(ht_nss_mask);
11944
11945 return true;
11946 }
11947
11948 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)11949 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
11950 enum nl80211_band band,
11951 const struct cfg80211_bitrate_mask *mask,
11952 u32 *rate, u8 *nss)
11953 {
11954 int rate_idx;
11955 u16 bitrate;
11956 u8 preamble;
11957 u8 hw_rate;
11958
11959 if (hweight32(mask->control[band].legacy) != 1)
11960 return -EINVAL;
11961
11962 rate_idx = ffs(mask->control[band].legacy) - 1;
11963
11964 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
11965 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
11966
11967 hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
11968 bitrate = ath12k_legacy_rates[rate_idx].bitrate;
11969
11970 if (ath12k_mac_bitrate_is_cck(bitrate))
11971 preamble = WMI_RATE_PREAMBLE_CCK;
11972 else
11973 preamble = WMI_RATE_PREAMBLE_OFDM;
11974
11975 *nss = 1;
11976 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
11977
11978 return 0;
11979 }
11980
11981 static int
ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif * arvif,u8 he_gi,u8 he_ltf)11982 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf)
11983 {
11984 struct ath12k *ar = arvif->ar;
11985 int ret;
11986
11987 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11988
11989 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
11990 if (he_gi && he_gi != 0xFF)
11991 he_gi += 1;
11992
11993 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11994 WMI_VDEV_PARAM_SGI, he_gi);
11995 if (ret) {
11996 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n",
11997 he_gi, ret);
11998 return ret;
11999 }
12000 /* start from 1 */
12001 if (he_ltf != 0xFF)
12002 he_ltf += 1;
12003
12004 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12005 WMI_VDEV_PARAM_HE_LTF, he_ltf);
12006 if (ret) {
12007 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n",
12008 he_ltf, ret);
12009 return ret;
12010 }
12011 return 0;
12012 }
12013
12014 static int
ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif * arvif,u16 he_gi,u8 he_ltf)12015 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf)
12016 {
12017 struct ath12k *ar = arvif->ar;
12018 int ret;
12019 u32 he_ar_gi_ltf;
12020
12021 if (he_gi != 0xFF) {
12022 switch (he_gi) {
12023 case NL80211_RATE_INFO_HE_GI_0_8:
12024 he_gi = WMI_AUTORATE_800NS_GI;
12025 break;
12026 case NL80211_RATE_INFO_HE_GI_1_6:
12027 he_gi = WMI_AUTORATE_1600NS_GI;
12028 break;
12029 case NL80211_RATE_INFO_HE_GI_3_2:
12030 he_gi = WMI_AUTORATE_3200NS_GI;
12031 break;
12032 default:
12033 ath12k_warn(ar->ab, "Invalid GI\n");
12034 return -EINVAL;
12035 }
12036 }
12037
12038 if (he_ltf != 0xFF) {
12039 switch (he_ltf) {
12040 case NL80211_RATE_INFO_HE_1XLTF:
12041 he_ltf = WMI_HE_AUTORATE_LTF_1X;
12042 break;
12043 case NL80211_RATE_INFO_HE_2XLTF:
12044 he_ltf = WMI_HE_AUTORATE_LTF_2X;
12045 break;
12046 case NL80211_RATE_INFO_HE_4XLTF:
12047 he_ltf = WMI_HE_AUTORATE_LTF_4X;
12048 break;
12049 default:
12050 ath12k_warn(ar->ab, "Invalid LTF\n");
12051 return -EINVAL;
12052 }
12053 }
12054
12055 he_ar_gi_ltf = he_gi | he_ltf;
12056
12057 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12058 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
12059 he_ar_gi_ltf);
12060 if (ret) {
12061 ath12k_warn(ar->ab,
12062 "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n",
12063 he_gi, he_ltf, ret);
12064 return ret;
12065 }
12066
12067 return 0;
12068 }
12069
ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)12070 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
12071 {
12072 switch (gi) {
12073 case NL80211_TXRATE_DEFAULT_GI:
12074 return WMI_GI_400_NS;
12075 case NL80211_TXRATE_FORCE_LGI:
12076 return WMI_GI_800_NS;
12077 default:
12078 return WMI_GI_400_NS;
12079 }
12080 }
12081
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)12082 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
12083 u32 rate, u8 nss, u8 sgi, u8 ldpc,
12084 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
12085 {
12086 struct ieee80211_bss_conf *link_conf;
12087 struct ath12k *ar = arvif->ar;
12088 u32 vdev_param;
12089 u32 param_value;
12090 int ret;
12091 bool he_support;
12092
12093 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12094
12095 link_conf = ath12k_mac_get_link_bss_conf(arvif);
12096 if (!link_conf)
12097 return -EINVAL;
12098
12099 he_support = link_conf->he_support;
12100
12101 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12102 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n",
12103 arvif->vdev_id, rate, nss, sgi, ldpc);
12104
12105 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12106 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
12107 he_ltf, he_fixed_rate);
12108
12109 if (!he_support) {
12110 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
12111 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12112 vdev_param, rate);
12113 if (ret) {
12114 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
12115 rate, ret);
12116 return ret;
12117 }
12118 }
12119
12120 vdev_param = WMI_VDEV_PARAM_NSS;
12121
12122 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12123 vdev_param, nss);
12124 if (ret) {
12125 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
12126 nss, ret);
12127 return ret;
12128 }
12129
12130 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12131 WMI_VDEV_PARAM_LDPC, ldpc);
12132 if (ret) {
12133 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
12134 ldpc, ret);
12135 return ret;
12136 }
12137
12138 if (he_support) {
12139 if (he_fixed_rate)
12140 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf);
12141 else
12142 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf);
12143 if (ret)
12144 return ret;
12145 } else {
12146 vdev_param = WMI_VDEV_PARAM_SGI;
12147 param_value = ath12k_mac_nlgi_to_wmigi(sgi);
12148 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12149 vdev_param, param_value);
12150 if (ret) {
12151 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
12152 sgi, ret);
12153 return ret;
12154 }
12155 }
12156
12157 return 0;
12158 }
12159
12160 static bool
ath12k_mac_vht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12161 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
12162 enum nl80211_band band,
12163 const struct cfg80211_bitrate_mask *mask)
12164 {
12165 int i;
12166 u16 vht_mcs;
12167
12168 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
12169 vht_mcs = mask->control[band].vht_mcs[i];
12170
12171 switch (vht_mcs) {
12172 case 0:
12173 case BIT(8) - 1:
12174 case BIT(9) - 1:
12175 case BIT(10) - 1:
12176 break;
12177 default:
12178 return false;
12179 }
12180 }
12181
12182 return true;
12183 }
12184
12185 static bool
ath12k_mac_he_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12186 ath12k_mac_he_mcs_range_present(struct ath12k *ar,
12187 enum nl80211_band band,
12188 const struct cfg80211_bitrate_mask *mask)
12189 {
12190 int i;
12191 u16 he_mcs;
12192
12193 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
12194 he_mcs = mask->control[band].he_mcs[i];
12195
12196 switch (he_mcs) {
12197 case 0:
12198 case BIT(8) - 1:
12199 case BIT(10) - 1:
12200 case BIT(12) - 1:
12201 break;
12202 default:
12203 return false;
12204 }
12205 }
12206
12207 return true;
12208 }
12209
ath12k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)12210 static void ath12k_mac_set_bitrate_mask_iter(void *data,
12211 struct ieee80211_sta *sta)
12212 {
12213 struct ath12k_link_vif *arvif = data;
12214 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12215 struct ath12k_link_sta *arsta;
12216 struct ath12k *ar = arvif->ar;
12217
12218 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12219
12220 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12221 ahsta->link[arvif->link_id]);
12222 if (!arsta || arsta->arvif != arvif)
12223 return;
12224
12225 spin_lock_bh(&ar->data_lock);
12226 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
12227 spin_unlock_bh(&ar->data_lock);
12228
12229 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
12230 }
12231
ath12k_mac_disable_peer_fixed_rate(void * data,struct ieee80211_sta * sta)12232 static void ath12k_mac_disable_peer_fixed_rate(void *data,
12233 struct ieee80211_sta *sta)
12234 {
12235 struct ath12k_link_vif *arvif = data;
12236 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12237 struct ath12k_link_sta *arsta;
12238 struct ath12k *ar = arvif->ar;
12239 int ret;
12240
12241 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12242
12243 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12244 ahsta->link[arvif->link_id]);
12245
12246 if (!arsta || arsta->arvif != arvif)
12247 return;
12248
12249 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
12250 arvif->vdev_id,
12251 WMI_PEER_PARAM_FIXED_RATE,
12252 WMI_FIXED_RATE_NONE);
12253 if (ret)
12254 ath12k_warn(ar->ab,
12255 "failed to disable peer fixed rate for STA %pM ret %d\n",
12256 arsta->addr, ret);
12257 }
12258
12259 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)12260 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band,
12261 const struct cfg80211_bitrate_mask *mask,
12262 unsigned int link_id)
12263 {
12264 bool he_fixed_rate = false, vht_fixed_rate = false;
12265 const u16 *vht_mcs_mask, *he_mcs_mask;
12266 struct ieee80211_link_sta *link_sta;
12267 struct ath12k_peer *peer, *tmp;
12268 u8 vht_nss, he_nss;
12269 int ret = true;
12270
12271 vht_mcs_mask = mask->control[band].vht_mcs;
12272 he_mcs_mask = mask->control[band].he_mcs;
12273
12274 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
12275 vht_fixed_rate = true;
12276
12277 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
12278 he_fixed_rate = true;
12279
12280 if (!vht_fixed_rate && !he_fixed_rate)
12281 return true;
12282
12283 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
12284 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
12285
12286 rcu_read_lock();
12287 spin_lock_bh(&ar->ab->base_lock);
12288 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
12289 if (peer->sta) {
12290 link_sta = rcu_dereference(peer->sta->link[link_id]);
12291 if (!link_sta) {
12292 ret = false;
12293 goto exit;
12294 }
12295
12296 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
12297 link_sta->rx_nss < vht_nss)) {
12298 ret = false;
12299 goto exit;
12300 }
12301 if (he_fixed_rate && (!link_sta->he_cap.has_he ||
12302 link_sta->rx_nss < he_nss)) {
12303 ret = false;
12304 goto exit;
12305 }
12306 }
12307 }
12308 exit:
12309 spin_unlock_bh(&ar->ab->base_lock);
12310 rcu_read_unlock();
12311 return ret;
12312 }
12313
12314 static int
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)12315 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
12316 struct ieee80211_vif *vif,
12317 const struct cfg80211_bitrate_mask *mask)
12318 {
12319 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12320 struct ath12k_link_vif *arvif;
12321 struct cfg80211_chan_def def;
12322 struct ath12k *ar;
12323 enum nl80211_band band;
12324 const u8 *ht_mcs_mask;
12325 const u16 *vht_mcs_mask;
12326 const u16 *he_mcs_mask;
12327 u8 he_ltf = 0;
12328 u8 he_gi = 0;
12329 u32 rate;
12330 u8 nss, mac_nss;
12331 u8 sgi;
12332 u8 ldpc;
12333 int single_nss;
12334 int ret;
12335 int num_rates;
12336 bool he_fixed_rate = false;
12337
12338 lockdep_assert_wiphy(hw->wiphy);
12339
12340 arvif = &ahvif->deflink;
12341
12342 ar = arvif->ar;
12343 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
12344 ret = -EPERM;
12345 goto out;
12346 }
12347
12348 band = def.chan->band;
12349 ht_mcs_mask = mask->control[band].ht_mcs;
12350 vht_mcs_mask = mask->control[band].vht_mcs;
12351 he_mcs_mask = mask->control[band].he_mcs;
12352 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
12353
12354 sgi = mask->control[band].gi;
12355 if (sgi == NL80211_TXRATE_FORCE_SGI) {
12356 ret = -EINVAL;
12357 goto out;
12358 }
12359
12360 he_gi = mask->control[band].he_gi;
12361 he_ltf = mask->control[band].he_ltf;
12362
12363 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
12364 * requires passing at least one of used basic rates along with them.
12365 * Fixed rate setting across different preambles(legacy, HT, VHT) is
12366 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
12367 * suitable for setting single HT/VHT rates.
12368 * But, there could be a single basic rate passed from userspace which
12369 * can be done through the FIXED_RATE param.
12370 */
12371 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
12372 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
12373 &nss);
12374 if (ret) {
12375 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
12376 arvif->vdev_id, ret);
12377 goto out;
12378 }
12379
12380 ieee80211_iterate_stations_mtx(hw,
12381 ath12k_mac_disable_peer_fixed_rate,
12382 arvif);
12383 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask,
12384 &single_nss)) {
12385 rate = WMI_FIXED_RATE_NONE;
12386 nss = single_nss;
12387 arvif->bitrate_mask = *mask;
12388
12389 ieee80211_iterate_stations_atomic(hw,
12390 ath12k_mac_set_bitrate_mask_iter,
12391 arvif);
12392 } else {
12393 rate = WMI_FIXED_RATE_NONE;
12394
12395 if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
12396 mask, arvif->link_id))
12397 ath12k_warn(ar->ab,
12398 "failed to update fixed rate settings due to mcs/nss incompatibility\n");
12399
12400 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
12401 ath12k_mac_max_vht_nss(vht_mcs_mask),
12402 ath12k_mac_max_he_nss(he_mcs_mask));
12403 nss = min_t(u32, ar->num_tx_chains, mac_nss);
12404
12405 /* If multiple rates across different preambles are given
12406 * we can reconfigure this info with all peers using PEER_ASSOC
12407 * command with the below exception cases.
12408 * - Single VHT Rate : peer_assoc command accommodates only MCS
12409 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
12410 * mandates passing basic rates along with HT/VHT rates, FW
12411 * doesn't allow switching from VHT to Legacy. Hence instead of
12412 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
12413 * we could set this VHT rate as peer fixed rate param, which
12414 * will override FIXED rate and FW rate control algorithm.
12415 * If single VHT rate is passed along with HT rates, we select
12416 * the VHT rate as fixed rate for vht peers.
12417 * - Multiple VHT Rates : When Multiple VHT rates are given,this
12418 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
12419 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
12420 * RATEMASK_CMDID can cover all use cases of setting rates
12421 * across multiple preambles and rates within same type.
12422 * But requires more validation of the command at this point.
12423 */
12424
12425 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
12426 mask);
12427
12428 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
12429 num_rates > 1) {
12430 /* TODO: Handle multiple VHT MCS values setting using
12431 * RATEMASK CMD
12432 */
12433 ath12k_warn(ar->ab,
12434 "Setting more than one MCS Value in bitrate mask not supported\n");
12435 ret = -EINVAL;
12436 goto out;
12437 }
12438
12439 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
12440 if (num_rates == 1)
12441 he_fixed_rate = true;
12442
12443 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) &&
12444 num_rates > 1) {
12445 ath12k_warn(ar->ab,
12446 "Setting more than one HE MCS Value in bitrate mask not supported\n");
12447 ret = -EINVAL;
12448 goto out;
12449 }
12450 ieee80211_iterate_stations_mtx(hw,
12451 ath12k_mac_disable_peer_fixed_rate,
12452 arvif);
12453
12454 arvif->bitrate_mask = *mask;
12455 ieee80211_iterate_stations_mtx(hw,
12456 ath12k_mac_set_bitrate_mask_iter,
12457 arvif);
12458 }
12459
12460 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
12461 he_ltf, he_fixed_rate);
12462 if (ret) {
12463 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
12464 arvif->vdev_id, ret);
12465 }
12466
12467 out:
12468 return ret;
12469 }
12470
12471 static void
ath12k_mac_op_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)12472 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
12473 enum ieee80211_reconfig_type reconfig_type)
12474 {
12475 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12476 struct ath12k *ar;
12477 struct ath12k_base *ab;
12478 struct ath12k_vif *ahvif;
12479 struct ath12k_link_vif *arvif;
12480 int recovery_count, i;
12481
12482 lockdep_assert_wiphy(hw->wiphy);
12483
12484 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
12485 return;
12486
12487 guard(mutex)(&ah->hw_mutex);
12488
12489 if (ah->state != ATH12K_HW_STATE_RESTARTED)
12490 return;
12491
12492 ah->state = ATH12K_HW_STATE_ON;
12493 ieee80211_wake_queues(hw);
12494
12495 for_each_ar(ah, ar, i) {
12496 ab = ar->ab;
12497
12498 ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
12499 ar->pdev->pdev_id);
12500
12501 if (ar->ab->hw_params->current_cc_support &&
12502 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
12503 struct wmi_set_current_country_arg arg = {};
12504
12505 memcpy(&arg.alpha2, ar->alpha2, 2);
12506 reinit_completion(&ar->regd_update_completed);
12507 ath12k_wmi_send_set_current_country_cmd(ar, &arg);
12508 }
12509
12510 if (ab->is_reset) {
12511 recovery_count = atomic_inc_return(&ab->recovery_count);
12512
12513 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
12514 recovery_count);
12515
12516 /* When there are multiple radios in an SOC,
12517 * the recovery has to be done for each radio
12518 */
12519 if (recovery_count == ab->num_radios) {
12520 atomic_dec(&ab->reset_count);
12521 complete(&ab->reset_complete);
12522 ab->is_reset = false;
12523 atomic_set(&ab->fail_cont_count, 0);
12524 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
12525 }
12526 }
12527
12528 list_for_each_entry(arvif, &ar->arvifs, list) {
12529 ahvif = arvif->ahvif;
12530 ath12k_dbg(ab, ATH12K_DBG_BOOT,
12531 "reconfig cipher %d up %d vdev type %d\n",
12532 ahvif->key_cipher,
12533 arvif->is_up,
12534 ahvif->vdev_type);
12535
12536 /* After trigger disconnect, then upper layer will
12537 * trigger connect again, then the PN number of
12538 * upper layer will be reset to keep up with AP
12539 * side, hence PN number mismatch will not happen.
12540 */
12541 if (arvif->is_up &&
12542 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12543 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
12544 ieee80211_hw_restart_disconnect(ahvif->vif);
12545
12546 ath12k_dbg(ab, ATH12K_DBG_BOOT,
12547 "restart disconnect\n");
12548 }
12549 }
12550 }
12551 }
12552
12553 static void
ath12k_mac_update_bss_chan_survey(struct ath12k * ar,struct ieee80211_channel * channel)12554 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
12555 struct ieee80211_channel *channel)
12556 {
12557 int ret;
12558 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
12559
12560 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12561
12562 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
12563 ar->rx_channel != channel)
12564 return;
12565
12566 if (ar->scan.state != ATH12K_SCAN_IDLE) {
12567 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12568 "ignoring bss chan info req while scanning..\n");
12569 return;
12570 }
12571
12572 reinit_completion(&ar->bss_survey_done);
12573
12574 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
12575 if (ret) {
12576 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
12577 return;
12578 }
12579
12580 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
12581 if (ret == 0)
12582 ath12k_warn(ar->ab, "bss channel survey timed out\n");
12583 }
12584
ath12k_mac_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)12585 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
12586 struct survey_info *survey)
12587 {
12588 struct ath12k *ar;
12589 struct ieee80211_supported_band *sband;
12590 struct survey_info *ar_survey;
12591
12592 lockdep_assert_wiphy(hw->wiphy);
12593
12594 if (idx >= ATH12K_NUM_CHANS)
12595 return -ENOENT;
12596
12597 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
12598 if (sband && idx >= sband->n_channels) {
12599 idx -= sband->n_channels;
12600 sband = NULL;
12601 }
12602
12603 if (!sband)
12604 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
12605 if (sband && idx >= sband->n_channels) {
12606 idx -= sband->n_channels;
12607 sband = NULL;
12608 }
12609
12610 if (!sband)
12611 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
12612
12613 if (!sband || idx >= sband->n_channels)
12614 return -ENOENT;
12615
12616 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
12617 if (!ar) {
12618 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
12619 memset(survey, 0, sizeof(*survey));
12620 return 0;
12621 }
12622 return -ENOENT;
12623 }
12624
12625 ar_survey = &ar->survey[idx];
12626
12627 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
12628
12629 spin_lock_bh(&ar->data_lock);
12630 memcpy(survey, ar_survey, sizeof(*survey));
12631 spin_unlock_bh(&ar->data_lock);
12632
12633 survey->channel = &sband->channels[idx];
12634
12635 if (ar->rx_channel == survey->channel)
12636 survey->filled |= SURVEY_INFO_IN_USE;
12637
12638 return 0;
12639 }
12640
ath12k_mac_put_chain_rssi(struct station_info * sinfo,struct ath12k_link_sta * arsta)12641 static void ath12k_mac_put_chain_rssi(struct station_info *sinfo,
12642 struct ath12k_link_sta *arsta)
12643 {
12644 s8 rssi;
12645 int i;
12646
12647 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
12648 sinfo->chains &= ~BIT(i);
12649 rssi = arsta->chain_signal[i];
12650
12651 if (rssi != ATH12K_DEFAULT_NOISE_FLOOR &&
12652 rssi != ATH12K_INVALID_RSSI_FULL &&
12653 rssi != ATH12K_INVALID_RSSI_EMPTY &&
12654 rssi != 0) {
12655 sinfo->chain_signal[i] = rssi;
12656 sinfo->chains |= BIT(i);
12657 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
12658 }
12659 }
12660 }
12661
ath12k_mac_op_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)12662 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
12663 struct ieee80211_vif *vif,
12664 struct ieee80211_sta *sta,
12665 struct station_info *sinfo)
12666 {
12667 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12668 struct ath12k_fw_stats_req_params params = {};
12669 struct ath12k_link_sta *arsta;
12670 s8 signal, noise_floor;
12671 struct ath12k *ar;
12672 bool db2dbm;
12673
12674 lockdep_assert_wiphy(hw->wiphy);
12675
12676 arsta = &ahsta->deflink;
12677 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12678 if (!ar)
12679 return;
12680
12681 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12682 ar->ab->wmi_ab.svc_map);
12683
12684 sinfo->rx_duration = arsta->rx_duration;
12685 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12686
12687 sinfo->tx_duration = arsta->tx_duration;
12688 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12689
12690 if (arsta->txrate.legacy || arsta->txrate.nss) {
12691 if (arsta->txrate.legacy) {
12692 sinfo->txrate.legacy = arsta->txrate.legacy;
12693 } else {
12694 sinfo->txrate.mcs = arsta->txrate.mcs;
12695 sinfo->txrate.nss = arsta->txrate.nss;
12696 sinfo->txrate.bw = arsta->txrate.bw;
12697 sinfo->txrate.he_gi = arsta->txrate.he_gi;
12698 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12699 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
12700 sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12701 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc;
12702 }
12703 sinfo->txrate.flags = arsta->txrate.flags;
12704 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12705 }
12706
12707 /* TODO: Use real NF instead of default one. */
12708 signal = arsta->rssi_comb;
12709
12710 params.pdev_id = ar->pdev->pdev_id;
12711 params.vdev_id = 0;
12712 params.stats_id = WMI_REQUEST_VDEV_STAT;
12713
12714 if (!signal &&
12715 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12716 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12717 signal = arsta->rssi_beacon;
12718
12719 params.stats_id = WMI_REQUEST_RSSI_PER_CHAIN_STAT;
12720 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
12721 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12722 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12723 ath12k_mac_put_chain_rssi(sinfo, arsta);
12724
12725 spin_lock_bh(&ar->data_lock);
12726 noise_floor = ath12k_pdev_get_noise_floor(ar);
12727 spin_unlock_bh(&ar->data_lock);
12728
12729 if (signal) {
12730 sinfo->signal = db2dbm ? signal : signal + noise_floor;
12731 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12732 }
12733
12734 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12735
12736 if (!db2dbm)
12737 sinfo->signal_avg += noise_floor;
12738
12739 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12740
12741 sinfo->tx_retries = arsta->tx_retry_count;
12742 sinfo->tx_failed = arsta->tx_retry_failed;
12743 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12744 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12745 }
12746
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)12747 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
12748 struct ieee80211_vif *vif,
12749 struct ieee80211_link_sta *link_sta,
12750 struct link_station_info *link_sinfo)
12751 {
12752 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta);
12753 struct ath12k_fw_stats_req_params params = {};
12754 struct ath12k_link_sta *arsta;
12755 struct ath12k *ar;
12756 s8 signal;
12757 bool db2dbm;
12758
12759 lockdep_assert_wiphy(hw->wiphy);
12760
12761 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]);
12762
12763 if (!arsta)
12764 return;
12765
12766 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12767 if (!ar)
12768 return;
12769
12770 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12771 ar->ab->wmi_ab.svc_map);
12772
12773 link_sinfo->rx_duration = arsta->rx_duration;
12774 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12775
12776 link_sinfo->tx_duration = arsta->tx_duration;
12777 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12778
12779 if (arsta->txrate.legacy || arsta->txrate.nss) {
12780 if (arsta->txrate.legacy) {
12781 link_sinfo->txrate.legacy = arsta->txrate.legacy;
12782 } else {
12783 link_sinfo->txrate.mcs = arsta->txrate.mcs;
12784 link_sinfo->txrate.nss = arsta->txrate.nss;
12785 link_sinfo->txrate.bw = arsta->txrate.bw;
12786 link_sinfo->txrate.he_gi = arsta->txrate.he_gi;
12787 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12788 link_sinfo->txrate.he_ru_alloc =
12789 arsta->txrate.he_ru_alloc;
12790 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12791 link_sinfo->txrate.eht_ru_alloc =
12792 arsta->txrate.eht_ru_alloc;
12793 }
12794 link_sinfo->txrate.flags = arsta->txrate.flags;
12795 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12796 }
12797
12798 /* TODO: Use real NF instead of default one. */
12799 signal = arsta->rssi_comb;
12800
12801 params.pdev_id = ar->pdev->pdev_id;
12802 params.vdev_id = 0;
12803 params.stats_id = WMI_REQUEST_VDEV_STAT;
12804
12805 if (!signal &&
12806 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12807 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12808 signal = arsta->rssi_beacon;
12809
12810 if (signal) {
12811 link_sinfo->signal =
12812 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
12813 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12814 }
12815
12816 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12817
12818 if (!db2dbm)
12819 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
12820
12821 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12822
12823 link_sinfo->tx_retries = arsta->tx_retry_count;
12824 link_sinfo->tx_failed = arsta->tx_retry_failed;
12825 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12826 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12827 }
12828
ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)12829 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
12830 struct ieee80211_vif *vif)
12831 {
12832 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12833 struct ath12k *ar;
12834
12835 ar = ath12k_ah_to_ar(ah, 0);
12836
12837 lockdep_assert_wiphy(hw->wiphy);
12838
12839 spin_lock_bh(&ar->data_lock);
12840 ar->scan.roc_notify = false;
12841 spin_unlock_bh(&ar->data_lock);
12842
12843 ath12k_scan_abort(ar);
12844
12845 cancel_delayed_work_sync(&ar->scan.timeout);
12846 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
12847
12848 return 0;
12849 }
12850
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)12851 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
12852 struct ieee80211_vif *vif,
12853 struct ieee80211_channel *chan,
12854 int duration,
12855 enum ieee80211_roc_type type)
12856 {
12857 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12858 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12859 struct ath12k_link_vif *arvif;
12860 struct ath12k *ar;
12861 u32 scan_time_msec;
12862 bool create = true;
12863 u8 link_id;
12864 int ret;
12865
12866 lockdep_assert_wiphy(hw->wiphy);
12867
12868 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq);
12869 if (!ar)
12870 return -EINVAL;
12871
12872 /* check if any of the links of ML VIF is already started on
12873 * radio(ar) corresponding to given scan frequency and use it,
12874 * if not use deflink(link 0) for scan purpose.
12875 */
12876
12877 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
12878 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12879 /* If the vif is already assigned to a specific vdev of an ar,
12880 * check whether its already started, vdev which is started
12881 * are not allowed to switch to a new radio.
12882 * If the vdev is not started, but was earlier created on a
12883 * different ar, delete that vdev and create a new one. We don't
12884 * delete at the scan stop as an optimization to avoid redundant
12885 * delete-create vdev's for the same ar, in case the request is
12886 * always on the same band for the vif
12887 */
12888 if (arvif->is_created) {
12889 if (WARN_ON(!arvif->ar))
12890 return -EINVAL;
12891
12892 if (ar != arvif->ar && arvif->is_started)
12893 return -EBUSY;
12894
12895 if (ar != arvif->ar) {
12896 ath12k_mac_remove_link_interface(hw, arvif);
12897 ath12k_mac_unassign_link_vif(arvif);
12898 } else {
12899 create = false;
12900 }
12901 }
12902
12903 if (create) {
12904 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12905
12906 ret = ath12k_mac_vdev_create(ar, arvif);
12907 if (ret) {
12908 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
12909 ret);
12910 return ret;
12911 }
12912 }
12913
12914 spin_lock_bh(&ar->data_lock);
12915
12916 switch (ar->scan.state) {
12917 case ATH12K_SCAN_IDLE:
12918 reinit_completion(&ar->scan.started);
12919 reinit_completion(&ar->scan.completed);
12920 reinit_completion(&ar->scan.on_channel);
12921 ar->scan.state = ATH12K_SCAN_STARTING;
12922 ar->scan.is_roc = true;
12923 ar->scan.arvif = arvif;
12924 ar->scan.roc_freq = chan->center_freq;
12925 ar->scan.roc_notify = true;
12926 ret = 0;
12927 break;
12928 case ATH12K_SCAN_STARTING:
12929 case ATH12K_SCAN_RUNNING:
12930 case ATH12K_SCAN_ABORTING:
12931 ret = -EBUSY;
12932 break;
12933 }
12934
12935 spin_unlock_bh(&ar->data_lock);
12936
12937 if (ret)
12938 return ret;
12939
12940 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
12941
12942 struct ath12k_wmi_scan_req_arg *arg __free(kfree) =
12943 kzalloc(sizeof(*arg), GFP_KERNEL);
12944 if (!arg)
12945 return -ENOMEM;
12946
12947 ath12k_wmi_start_scan_init(ar, arg);
12948 arg->num_chan = 1;
12949
12950 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list),
12951 GFP_KERNEL);
12952 if (!chan_list)
12953 return -ENOMEM;
12954
12955 arg->chan_list = chan_list;
12956 arg->vdev_id = arvif->vdev_id;
12957 arg->scan_id = ATH12K_SCAN_ID;
12958 arg->chan_list[0] = chan->center_freq;
12959 arg->dwell_time_active = scan_time_msec;
12960 arg->dwell_time_passive = scan_time_msec;
12961 arg->max_scan_time = scan_time_msec;
12962 arg->scan_f_passive = 1;
12963 arg->burst_duration = duration;
12964
12965 ret = ath12k_start_scan(ar, arg);
12966 if (ret) {
12967 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
12968
12969 spin_lock_bh(&ar->data_lock);
12970 ar->scan.state = ATH12K_SCAN_IDLE;
12971 spin_unlock_bh(&ar->data_lock);
12972 return ret;
12973 }
12974
12975 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
12976 if (ret == 0) {
12977 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
12978 ret = ath12k_scan_stop(ar);
12979 if (ret)
12980 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
12981 return -ETIMEDOUT;
12982 }
12983
12984 ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
12985 msecs_to_jiffies(duration));
12986
12987 return 0;
12988 }
12989
ath12k_mac_op_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)12990 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
12991 struct ieee80211_vif *vif,
12992 struct cfg80211_gtk_rekey_data *data)
12993 {
12994 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12995 struct ath12k_rekey_data *rekey_data;
12996 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12997 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
12998 struct ath12k_link_vif *arvif;
12999
13000 lockdep_assert_wiphy(hw->wiphy);
13001
13002 arvif = &ahvif->deflink;
13003 rekey_data = &arvif->rekey_data;
13004
13005 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
13006 arvif->vdev_id);
13007
13008 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
13009 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
13010
13011 /* The supplicant works on big-endian, the firmware expects it on
13012 * little endian.
13013 */
13014 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
13015
13016 arvif->rekey_data.enable_offload = true;
13017
13018 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL,
13019 rekey_data->kck, NL80211_KCK_LEN);
13020 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL,
13021 rekey_data->kck, NL80211_KEK_LEN);
13022 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
13023 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
13024 }
13025
13026 static const struct ieee80211_ops ath12k_ops = {
13027 .tx = ath12k_mac_op_tx,
13028 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
13029 .start = ath12k_mac_op_start,
13030 .stop = ath12k_mac_op_stop,
13031 .reconfig_complete = ath12k_mac_op_reconfig_complete,
13032 .add_interface = ath12k_mac_op_add_interface,
13033 .remove_interface = ath12k_mac_op_remove_interface,
13034 .update_vif_offload = ath12k_mac_op_update_vif_offload,
13035 .config = ath12k_mac_op_config,
13036 .link_info_changed = ath12k_mac_op_link_info_changed,
13037 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed,
13038 .change_vif_links = ath12k_mac_op_change_vif_links,
13039 .configure_filter = ath12k_mac_op_configure_filter,
13040 .hw_scan = ath12k_mac_op_hw_scan,
13041 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
13042 .set_key = ath12k_mac_op_set_key,
13043 .set_rekey_data = ath12k_mac_op_set_rekey_data,
13044 .sta_state = ath12k_mac_op_sta_state,
13045 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
13046 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update,
13047 .conf_tx = ath12k_mac_op_conf_tx,
13048 .set_antenna = ath12k_mac_op_set_antenna,
13049 .get_antenna = ath12k_mac_op_get_antenna,
13050 .ampdu_action = ath12k_mac_op_ampdu_action,
13051 .add_chanctx = ath12k_mac_op_add_chanctx,
13052 .remove_chanctx = ath12k_mac_op_remove_chanctx,
13053 .change_chanctx = ath12k_mac_op_change_chanctx,
13054 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
13055 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
13056 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
13057 .get_txpower = ath12k_mac_op_get_txpower,
13058 .set_rts_threshold = ath12k_mac_op_set_rts_threshold,
13059 .set_frag_threshold = ath12k_mac_op_set_frag_threshold,
13060 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
13061 .get_survey = ath12k_mac_op_get_survey,
13062 .flush = ath12k_mac_op_flush,
13063 .sta_statistics = ath12k_mac_op_sta_statistics,
13064 .link_sta_statistics = ath12k_mac_op_link_sta_statistics,
13065 .remain_on_channel = ath12k_mac_op_remain_on_channel,
13066 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel,
13067 .change_sta_links = ath12k_mac_op_change_sta_links,
13068 .can_activate_links = ath12k_mac_op_can_activate_links,
13069 #ifdef CONFIG_PM
13070 .suspend = ath12k_wow_op_suspend,
13071 .resume = ath12k_wow_op_resume,
13072 .set_wakeup = ath12k_wow_op_set_wakeup,
13073 #endif
13074 #ifdef CONFIG_ATH12K_DEBUGFS
13075 .vif_add_debugfs = ath12k_debugfs_op_vif_add,
13076 #endif
13077 CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
13078 #ifdef CONFIG_ATH12K_DEBUGFS
13079 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add,
13080 #endif
13081 };
13082
ath12k_mac_update_freq_range(struct ath12k * ar,u32 freq_low,u32 freq_high)13083 void ath12k_mac_update_freq_range(struct ath12k *ar,
13084 u32 freq_low, u32 freq_high)
13085 {
13086 if (!(freq_low && freq_high))
13087 return;
13088
13089 if (ar->freq_range.start_freq || ar->freq_range.end_freq) {
13090 ar->freq_range.start_freq = min(ar->freq_range.start_freq,
13091 MHZ_TO_KHZ(freq_low));
13092 ar->freq_range.end_freq = max(ar->freq_range.end_freq,
13093 MHZ_TO_KHZ(freq_high));
13094 } else {
13095 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low);
13096 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high);
13097 }
13098
13099 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13100 "mac pdev %u freq limit updated. New range %u->%u MHz\n",
13101 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq),
13102 KHZ_TO_MHZ(ar->freq_range.end_freq));
13103 }
13104
ath12k_mac_update_ch_list(struct ath12k * ar,struct ieee80211_supported_band * band,u32 freq_low,u32 freq_high)13105 static void ath12k_mac_update_ch_list(struct ath12k *ar,
13106 struct ieee80211_supported_band *band,
13107 u32 freq_low, u32 freq_high)
13108 {
13109 int i;
13110
13111 if (!(freq_low && freq_high))
13112 return;
13113
13114 for (i = 0; i < band->n_channels; i++) {
13115 if (band->channels[i].center_freq < freq_low ||
13116 band->channels[i].center_freq > freq_high)
13117 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
13118 }
13119 }
13120
ath12k_get_phy_id(struct ath12k * ar,u32 band)13121 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
13122 {
13123 struct ath12k_pdev *pdev = ar->pdev;
13124 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
13125
13126 if (band == WMI_HOST_WLAN_2GHZ_CAP)
13127 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
13128
13129 if (band == WMI_HOST_WLAN_5GHZ_CAP)
13130 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
13131
13132 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
13133
13134 return 0;
13135 }
13136
ath12k_mac_update_band(struct ath12k * ar,struct ieee80211_supported_band * orig_band,struct ieee80211_supported_band * new_band)13137 static int ath12k_mac_update_band(struct ath12k *ar,
13138 struct ieee80211_supported_band *orig_band,
13139 struct ieee80211_supported_band *new_band)
13140 {
13141 int i;
13142
13143 if (!orig_band || !new_band)
13144 return -EINVAL;
13145
13146 if (orig_band->band != new_band->band)
13147 return -EINVAL;
13148
13149 for (i = 0; i < new_band->n_channels; i++) {
13150 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
13151 continue;
13152 /* An enabled channel in new_band should not be already enabled
13153 * in the orig_band
13154 */
13155 if (WARN_ON(!(orig_band->channels[i].flags &
13156 IEEE80211_CHAN_DISABLED)))
13157 return -EINVAL;
13158 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
13159 }
13160 return 0;
13161 }
13162
ath12k_mac_setup_channels_rates(struct ath12k * ar,u32 supported_bands,struct ieee80211_supported_band * bands[])13163 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
13164 u32 supported_bands,
13165 struct ieee80211_supported_band *bands[])
13166 {
13167 struct ieee80211_supported_band *band;
13168 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
13169 struct ath12k_base *ab = ar->ab;
13170 u32 phy_id, freq_low, freq_high;
13171 struct ath12k_hw *ah = ar->ah;
13172 void *channels;
13173 int ret;
13174
13175 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
13176 ARRAY_SIZE(ath12k_5ghz_channels) +
13177 ARRAY_SIZE(ath12k_6ghz_channels)) !=
13178 ATH12K_NUM_CHANS);
13179
13180 reg_cap = &ab->hal_reg_cap[ar->pdev_idx];
13181
13182 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
13183 channels = kmemdup(ath12k_2ghz_channels,
13184 sizeof(ath12k_2ghz_channels),
13185 GFP_KERNEL);
13186 if (!channels)
13187 return -ENOMEM;
13188
13189 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
13190 band->band = NL80211_BAND_2GHZ;
13191 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
13192 band->channels = channels;
13193 band->n_bitrates = ath12k_g_rates_size;
13194 band->bitrates = ath12k_g_rates;
13195
13196 if (ab->hw_params->single_pdev_only) {
13197 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
13198 reg_cap = &ab->hal_reg_cap[phy_id];
13199 }
13200
13201 freq_low = max(reg_cap->low_2ghz_chan,
13202 ab->reg_freq_2ghz.start_freq);
13203 freq_high = min(reg_cap->high_2ghz_chan,
13204 ab->reg_freq_2ghz.end_freq);
13205
13206 ath12k_mac_update_ch_list(ar, band,
13207 reg_cap->low_2ghz_chan,
13208 reg_cap->high_2ghz_chan);
13209
13210 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13211
13212 if (!bands[NL80211_BAND_2GHZ]) {
13213 bands[NL80211_BAND_2GHZ] = band;
13214 } else {
13215 /* Split mac in same band under same wiphy */
13216 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
13217 if (ret) {
13218 kfree(channels);
13219 band->channels = NULL;
13220 return ret;
13221 }
13222 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
13223 ar->pdev->pdev_id,
13224 KHZ_TO_MHZ(ar->freq_range.start_freq),
13225 KHZ_TO_MHZ(ar->freq_range.end_freq));
13226 }
13227 }
13228
13229 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
13230 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) {
13231 channels = kmemdup(ath12k_6ghz_channels,
13232 sizeof(ath12k_6ghz_channels), GFP_KERNEL);
13233 if (!channels) {
13234 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13235 return -ENOMEM;
13236 }
13237
13238 ar->supports_6ghz = true;
13239 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
13240 band->band = NL80211_BAND_6GHZ;
13241 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
13242 band->channels = channels;
13243 band->n_bitrates = ath12k_a_rates_size;
13244 band->bitrates = ath12k_a_rates;
13245
13246 freq_low = max(reg_cap->low_5ghz_chan,
13247 ab->reg_freq_6ghz.start_freq);
13248 freq_high = min(reg_cap->high_5ghz_chan,
13249 ab->reg_freq_6ghz.end_freq);
13250
13251 ath12k_mac_update_ch_list(ar, band,
13252 reg_cap->low_5ghz_chan,
13253 reg_cap->high_5ghz_chan);
13254
13255 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13256 ah->use_6ghz_regd = true;
13257
13258 if (!bands[NL80211_BAND_6GHZ]) {
13259 bands[NL80211_BAND_6GHZ] = band;
13260 } else {
13261 /* Split mac in same band under same wiphy */
13262 ret = ath12k_mac_update_band(ar,
13263 bands[NL80211_BAND_6GHZ],
13264 band);
13265 if (ret) {
13266 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13267 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13268 kfree(channels);
13269 band->channels = NULL;
13270 return ret;
13271 }
13272 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
13273 ar->pdev->pdev_id,
13274 KHZ_TO_MHZ(ar->freq_range.start_freq),
13275 KHZ_TO_MHZ(ar->freq_range.end_freq));
13276 }
13277 }
13278
13279 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
13280 channels = kmemdup(ath12k_5ghz_channels,
13281 sizeof(ath12k_5ghz_channels),
13282 GFP_KERNEL);
13283 if (!channels) {
13284 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13285 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13286 return -ENOMEM;
13287 }
13288
13289 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
13290 band->band = NL80211_BAND_5GHZ;
13291 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
13292 band->channels = channels;
13293 band->n_bitrates = ath12k_a_rates_size;
13294 band->bitrates = ath12k_a_rates;
13295
13296 if (ab->hw_params->single_pdev_only) {
13297 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
13298 reg_cap = &ab->hal_reg_cap[phy_id];
13299 }
13300
13301 freq_low = max(reg_cap->low_5ghz_chan,
13302 ab->reg_freq_5ghz.start_freq);
13303 freq_high = min(reg_cap->high_5ghz_chan,
13304 ab->reg_freq_5ghz.end_freq);
13305
13306 ath12k_mac_update_ch_list(ar, band,
13307 reg_cap->low_5ghz_chan,
13308 reg_cap->high_5ghz_chan);
13309
13310 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13311
13312 if (!bands[NL80211_BAND_5GHZ]) {
13313 bands[NL80211_BAND_5GHZ] = band;
13314 } else {
13315 /* Split mac in same band under same wiphy */
13316 ret = ath12k_mac_update_band(ar,
13317 bands[NL80211_BAND_5GHZ],
13318 band);
13319 if (ret) {
13320 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13321 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13322 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13323 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13324 kfree(channels);
13325 band->channels = NULL;
13326 return ret;
13327 }
13328 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
13329 ar->pdev->pdev_id,
13330 KHZ_TO_MHZ(ar->freq_range.start_freq),
13331 KHZ_TO_MHZ(ar->freq_range.end_freq));
13332 }
13333 }
13334 }
13335
13336 return 0;
13337 }
13338
ath12k_mac_get_ifmodes(struct ath12k_hw * ah)13339 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
13340 {
13341 struct ath12k *ar;
13342 int i;
13343 u16 interface_modes = U16_MAX;
13344
13345 for_each_ar(ah, ar, i)
13346 interface_modes &= ar->ab->hw_params->interface_modes;
13347
13348 return interface_modes == U16_MAX ? 0 : interface_modes;
13349 }
13350
ath12k_mac_is_iface_mode_enable(struct ath12k_hw * ah,enum nl80211_iftype type)13351 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
13352 enum nl80211_iftype type)
13353 {
13354 struct ath12k *ar;
13355 int i;
13356 u16 interface_modes, mode = 0;
13357 bool is_enable = false;
13358
13359 if (type == NL80211_IFTYPE_MESH_POINT) {
13360 if (IS_ENABLED(CONFIG_MAC80211_MESH))
13361 mode = BIT(type);
13362 } else {
13363 mode = BIT(type);
13364 }
13365
13366 for_each_ar(ah, ar, i) {
13367 interface_modes = ar->ab->hw_params->interface_modes;
13368 if (interface_modes & mode) {
13369 is_enable = true;
13370 break;
13371 }
13372 }
13373
13374 return is_enable;
13375 }
13376
13377 static int
ath12k_mac_setup_radio_iface_comb(struct ath12k * ar,struct ieee80211_iface_combination * comb)13378 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar,
13379 struct ieee80211_iface_combination *comb)
13380 {
13381 u16 interface_modes = ar->ab->hw_params->interface_modes;
13382 struct ieee80211_iface_limit *limits;
13383 int n_limits, max_interfaces;
13384 bool ap, mesh, p2p;
13385
13386 ap = interface_modes & BIT(NL80211_IFTYPE_AP);
13387 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
13388
13389 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
13390 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT));
13391
13392 if ((ap || mesh) && !p2p) {
13393 n_limits = 2;
13394 max_interfaces = 16;
13395 } else if (p2p) {
13396 n_limits = 3;
13397 if (ap || mesh)
13398 max_interfaces = 16;
13399 else
13400 max_interfaces = 3;
13401 } else {
13402 n_limits = 1;
13403 max_interfaces = 1;
13404 }
13405
13406 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13407 if (!limits)
13408 return -ENOMEM;
13409
13410 limits[0].max = 1;
13411 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
13412
13413 if (ap || mesh || p2p)
13414 limits[1].max = max_interfaces;
13415
13416 if (ap)
13417 limits[1].types |= BIT(NL80211_IFTYPE_AP);
13418
13419 if (mesh)
13420 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
13421
13422 if (p2p) {
13423 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
13424 BIT(NL80211_IFTYPE_P2P_GO);
13425 limits[2].max = 1;
13426 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
13427 }
13428
13429 comb[0].limits = limits;
13430 comb[0].n_limits = n_limits;
13431 comb[0].max_interfaces = max_interfaces;
13432 comb[0].beacon_int_infra_match = true;
13433 comb[0].beacon_int_min_gcd = 100;
13434
13435 comb[0].num_different_channels = 1;
13436 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
13437 BIT(NL80211_CHAN_WIDTH_20) |
13438 BIT(NL80211_CHAN_WIDTH_40) |
13439 BIT(NL80211_CHAN_WIDTH_80) |
13440 BIT(NL80211_CHAN_WIDTH_160);
13441
13442 return 0;
13443 }
13444
13445 static int
ath12k_mac_setup_global_iface_comb(struct ath12k_hw * ah,struct wiphy_radio * radio,u8 n_radio,struct ieee80211_iface_combination * comb)13446 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah,
13447 struct wiphy_radio *radio,
13448 u8 n_radio,
13449 struct ieee80211_iface_combination *comb)
13450 {
13451 const struct ieee80211_iface_combination *iter_comb;
13452 struct ieee80211_iface_limit *limits;
13453 int i, j, n_limits;
13454 bool ap, mesh, p2p;
13455
13456 if (!n_radio)
13457 return 0;
13458
13459 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
13460 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
13461 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
13462
13463 if ((ap || mesh) && !p2p)
13464 n_limits = 2;
13465 else if (p2p)
13466 n_limits = 3;
13467 else
13468 n_limits = 1;
13469
13470 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13471 if (!limits)
13472 return -ENOMEM;
13473
13474 for (i = 0; i < n_radio; i++) {
13475 iter_comb = radio[i].iface_combinations;
13476 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) {
13477 limits[j].types |= iter_comb->limits[j].types;
13478 limits[j].max += iter_comb->limits[j].max;
13479 }
13480
13481 comb->max_interfaces += iter_comb->max_interfaces;
13482 comb->num_different_channels += iter_comb->num_different_channels;
13483 comb->radar_detect_widths |= iter_comb->radar_detect_widths;
13484 }
13485
13486 comb->limits = limits;
13487 comb->n_limits = n_limits;
13488 comb->beacon_int_infra_match = true;
13489 comb->beacon_int_min_gcd = 100;
13490
13491 return 0;
13492 }
13493
13494 static
ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination * iface_comb)13495 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb)
13496 {
13497 kfree(iface_comb[0].limits);
13498 kfree(iface_comb);
13499 }
13500
ath12k_mac_cleanup_iface_combinations(struct ath12k_hw * ah)13501 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah)
13502 {
13503 struct wiphy *wiphy = ah->hw->wiphy;
13504 const struct wiphy_radio *radio;
13505 int i;
13506
13507 if (wiphy->n_radio > 0) {
13508 radio = wiphy->radio;
13509 for (i = 0; i < wiphy->n_radio; i++)
13510 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13511
13512 kfree(wiphy->radio);
13513 }
13514
13515 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations);
13516 }
13517
ath12k_mac_setup_iface_combinations(struct ath12k_hw * ah)13518 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
13519 {
13520 struct ieee80211_iface_combination *combinations, *comb;
13521 struct wiphy *wiphy = ah->hw->wiphy;
13522 struct wiphy_radio *radio;
13523 int n_combinations = 1;
13524 struct ath12k *ar;
13525 int i, ret;
13526
13527 if (ah->num_radio == 1) {
13528 ar = &ah->radio[0];
13529
13530 if (ar->ab->hw_params->single_pdev_only)
13531 n_combinations = 2;
13532
13533 combinations = kcalloc(n_combinations, sizeof(*combinations),
13534 GFP_KERNEL);
13535 if (!combinations)
13536 return -ENOMEM;
13537
13538 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations);
13539 if (ret) {
13540 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d",
13541 ret);
13542 goto err_free_combinations;
13543 }
13544
13545 if (ar->ab->hw_params->single_pdev_only) {
13546 comb = combinations + 1;
13547 memcpy(comb, combinations, sizeof(*comb));
13548 comb->num_different_channels = 2;
13549 comb->radar_detect_widths = 0;
13550 }
13551
13552 goto out;
13553 }
13554
13555 combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL);
13556 if (!combinations)
13557 return -ENOMEM;
13558
13559 /* there are multiple radios */
13560
13561 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL);
13562 if (!radio) {
13563 ret = -ENOMEM;
13564 goto err_free_combinations;
13565 }
13566
13567 for_each_ar(ah, ar, i) {
13568 comb = kzalloc(sizeof(*comb), GFP_KERNEL);
13569 if (!comb) {
13570 ret = -ENOMEM;
13571 goto err_free_radios;
13572 }
13573
13574 ret = ath12k_mac_setup_radio_iface_comb(ar, comb);
13575 if (ret) {
13576 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d",
13577 i, ret);
13578 kfree(comb);
13579 goto err_free_radios;
13580 }
13581
13582 radio[i].freq_range = &ar->freq_range;
13583 radio[i].n_freq_range = 1;
13584
13585 radio[i].iface_combinations = comb;
13586 radio[i].n_iface_combinations = 1;
13587 }
13588
13589 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations);
13590 if (ret) {
13591 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d",
13592 ret);
13593 goto err_free_all_radios;
13594 }
13595
13596 wiphy->radio = radio;
13597 wiphy->n_radio = ah->num_radio;
13598
13599 out:
13600 wiphy->iface_combinations = combinations;
13601 wiphy->n_iface_combinations = n_combinations;
13602
13603 return 0;
13604
13605 err_free_all_radios:
13606 i = ah->num_radio;
13607
13608 err_free_radios:
13609 while (i--)
13610 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13611
13612 kfree(radio);
13613
13614 err_free_combinations:
13615 kfree(combinations);
13616
13617 return ret;
13618 }
13619
13620 static const u8 ath12k_if_types_ext_capa[] = {
13621 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13622 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13623 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13624 };
13625
13626 static const u8 ath12k_if_types_ext_capa_sta[] = {
13627 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13628 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13629 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13630 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
13631 };
13632
13633 static const u8 ath12k_if_types_ext_capa_ap[] = {
13634 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13635 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13636 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13637 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
13638 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
13639 };
13640
13641 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
13642 {
13643 .extended_capabilities = ath12k_if_types_ext_capa,
13644 .extended_capabilities_mask = ath12k_if_types_ext_capa,
13645 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
13646 }, {
13647 .iftype = NL80211_IFTYPE_STATION,
13648 .extended_capabilities = ath12k_if_types_ext_capa_sta,
13649 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
13650 .extended_capabilities_len =
13651 sizeof(ath12k_if_types_ext_capa_sta),
13652 }, {
13653 .iftype = NL80211_IFTYPE_AP,
13654 .extended_capabilities = ath12k_if_types_ext_capa_ap,
13655 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
13656 .extended_capabilities_len =
13657 sizeof(ath12k_if_types_ext_capa_ap),
13658 .eml_capabilities = 0,
13659 .mld_capa_and_ops = 0,
13660 },
13661 };
13662
ath12k_mac_cleanup_unregister(struct ath12k * ar)13663 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
13664 {
13665 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
13666 idr_destroy(&ar->txmgmt_idr);
13667
13668 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13669 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
13670 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13671 }
13672
ath12k_mac_hw_unregister(struct ath12k_hw * ah)13673 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
13674 {
13675 struct ieee80211_hw *hw = ah->hw;
13676 struct ath12k *ar;
13677 int i;
13678
13679 for_each_ar(ah, ar, i) {
13680 cancel_work_sync(&ar->regd_channel_update_work);
13681 cancel_work_sync(&ar->regd_update_work);
13682 ath12k_debugfs_unregister(ar);
13683 ath12k_fw_stats_reset(ar);
13684 }
13685
13686 ieee80211_unregister_hw(hw);
13687
13688 for_each_ar(ah, ar, i)
13689 ath12k_mac_cleanup_unregister(ar);
13690
13691 ath12k_mac_cleanup_iface_combinations(ah);
13692
13693 SET_IEEE80211_DEV(hw, NULL);
13694 }
13695
ath12k_mac_setup_register(struct ath12k * ar,u32 * ht_cap,struct ieee80211_supported_band * bands[])13696 static int ath12k_mac_setup_register(struct ath12k *ar,
13697 u32 *ht_cap,
13698 struct ieee80211_supported_band *bands[])
13699 {
13700 struct ath12k_pdev_cap *cap = &ar->pdev->cap;
13701 int ret;
13702
13703 init_waitqueue_head(&ar->txmgmt_empty_waitq);
13704 idr_init(&ar->txmgmt_idr);
13705 spin_lock_init(&ar->txmgmt_idr_lock);
13706
13707 ath12k_pdev_caps_update(ar);
13708
13709 ret = ath12k_mac_setup_channels_rates(ar,
13710 cap->supported_bands,
13711 bands);
13712 if (ret)
13713 return ret;
13714
13715 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
13716 ath12k_mac_setup_sband_iftype_data(ar, cap);
13717
13718 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
13719 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
13720
13721 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR;
13722 ar->rssi_info.temp_offset = 0;
13723 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset;
13724
13725 return 0;
13726 }
13727
ath12k_mac_hw_register(struct ath12k_hw * ah)13728 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
13729 {
13730 struct ieee80211_hw *hw = ah->hw;
13731 struct wiphy *wiphy = hw->wiphy;
13732 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
13733 struct ath12k_base *ab = ar->ab;
13734 struct ath12k_pdev *pdev;
13735 struct ath12k_pdev_cap *cap;
13736 static const u32 cipher_suites[] = {
13737 WLAN_CIPHER_SUITE_TKIP,
13738 WLAN_CIPHER_SUITE_CCMP,
13739 WLAN_CIPHER_SUITE_AES_CMAC,
13740 WLAN_CIPHER_SUITE_BIP_CMAC_256,
13741 WLAN_CIPHER_SUITE_BIP_GMAC_128,
13742 WLAN_CIPHER_SUITE_BIP_GMAC_256,
13743 WLAN_CIPHER_SUITE_GCMP,
13744 WLAN_CIPHER_SUITE_GCMP_256,
13745 WLAN_CIPHER_SUITE_CCMP_256,
13746 };
13747 int ret, i, j;
13748 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0;
13749 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false;
13750 u8 *mac_addr = NULL;
13751 u8 mbssid_max_interfaces = 0;
13752
13753 wiphy->max_ap_assoc_sta = 0;
13754
13755 for_each_ar(ah, ar, i) {
13756 u32 ht_cap_info = 0;
13757
13758 pdev = ar->pdev;
13759 if (ar->ab->pdevs_macaddr_valid) {
13760 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
13761 } else {
13762 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr);
13763 ar->mac_addr[4] += ar->pdev_idx;
13764 }
13765
13766 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands);
13767 if (ret)
13768 goto err_cleanup_unregister;
13769
13770 /* 6 GHz does not support HT Cap, hence do not consider it */
13771 if (!ar->supports_6ghz)
13772 ht_cap &= ht_cap_info;
13773
13774 wiphy->max_ap_assoc_sta += ar->max_num_stations;
13775
13776 /* Advertise the max antenna support of all radios, driver can handle
13777 * per pdev specific antenna setting based on pdev cap when antenna
13778 * changes are made
13779 */
13780 cap = &pdev->cap;
13781
13782 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask);
13783 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask);
13784
13785 if (ar->supports_6ghz)
13786 is_6ghz = true;
13787
13788 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
13789 is_raw_mode = true;
13790
13791 if (!ar->ab->hw_params->supports_monitor)
13792 is_monitor_disable = true;
13793
13794 if (i == 0)
13795 mac_addr = ar->mac_addr;
13796 else
13797 mac_addr = ab->mac_addr;
13798
13799 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab);
13800 }
13801
13802 wiphy->available_antennas_rx = antennas_rx;
13803 wiphy->available_antennas_tx = antennas_tx;
13804
13805 SET_IEEE80211_PERM_ADDR(hw, mac_addr);
13806 SET_IEEE80211_DEV(hw, ab->dev);
13807
13808 ret = ath12k_mac_setup_iface_combinations(ah);
13809 if (ret) {
13810 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
13811 goto err_complete_cleanup_unregister;
13812 }
13813
13814 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
13815
13816 if (ah->num_radio == 1 &&
13817 wiphy->bands[NL80211_BAND_2GHZ] &&
13818 wiphy->bands[NL80211_BAND_5GHZ] &&
13819 wiphy->bands[NL80211_BAND_6GHZ])
13820 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
13821
13822 ieee80211_hw_set(hw, SIGNAL_DBM);
13823 ieee80211_hw_set(hw, SUPPORTS_PS);
13824 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
13825 ieee80211_hw_set(hw, MFP_CAPABLE);
13826 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
13827 ieee80211_hw_set(hw, HAS_RATE_CONTROL);
13828 ieee80211_hw_set(hw, AP_LINK_PS);
13829 ieee80211_hw_set(hw, SPECTRUM_MGMT);
13830 ieee80211_hw_set(hw, CONNECTION_MONITOR);
13831 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
13832 ieee80211_hw_set(hw, CHANCTX_STA_CSA);
13833 ieee80211_hw_set(hw, QUEUE_CONTROL);
13834 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
13835 ieee80211_hw_set(hw, REPORTS_LOW_ACK);
13836 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
13837
13838 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) {
13839 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
13840 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
13841 }
13842
13843 if (cap->nss_ratio_enabled)
13844 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
13845
13846 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
13847 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
13848 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
13849 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
13850 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
13851 ieee80211_hw_set(hw, USES_RSS);
13852 }
13853
13854 wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
13855 wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
13856
13857 /* TODO: Check if HT capability advertised from firmware is different
13858 * for each band for a dual band capable radio. It will be tricky to
13859 * handle it when the ht capability different for each band.
13860 */
13861 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
13862 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz))
13863 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
13864
13865 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
13866 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
13867
13868 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
13869
13870 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
13871 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
13872 wiphy->max_remain_on_channel_duration = 5000;
13873
13874 wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
13875 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
13876 NL80211_FEATURE_AP_SCAN;
13877
13878 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
13879
13880 /* MLO is not yet supported so disable Wireless Extensions for now
13881 * to make sure ath12k users don't use it. This flag can be removed
13882 * once WIPHY_FLAG_SUPPORTS_MLO is enabled.
13883 */
13884 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
13885
13886 /* Copy over MLO related capabilities received from
13887 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set.
13888 */
13889 if (ab->ag->mlo_capable) {
13890 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap;
13891 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap;
13892 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
13893
13894 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX);
13895 }
13896
13897 hw->queues = ATH12K_HW_MAX_QUEUES;
13898 wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
13899 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
13900 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
13901
13902 hw->vif_data_size = sizeof(struct ath12k_vif);
13903 hw->sta_data_size = sizeof(struct ath12k_sta);
13904 hw->extra_tx_headroom = ab->hw_params->iova_mask;
13905
13906 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
13907 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
13908 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
13909
13910 wiphy->cipher_suites = cipher_suites;
13911 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
13912
13913 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
13914 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
13915
13916 wiphy->mbssid_max_interfaces = mbssid_max_interfaces;
13917 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
13918 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
13919
13920 if (is_6ghz) {
13921 wiphy_ext_feature_set(wiphy,
13922 NL80211_EXT_FEATURE_FILS_DISCOVERY);
13923 wiphy_ext_feature_set(wiphy,
13924 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
13925 }
13926
13927 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
13928 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map))
13929 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
13930
13931 ath12k_reg_init(hw);
13932
13933 if (!is_raw_mode) {
13934 hw->netdev_features = NETIF_F_HW_CSUM;
13935 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
13936 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
13937 }
13938
13939 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
13940 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
13941 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
13942 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
13943 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
13944 wiphy->max_sched_scan_plan_interval =
13945 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
13946 wiphy->max_sched_scan_plan_iterations =
13947 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
13948 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
13949 }
13950
13951 ret = ath12k_wow_init(ar);
13952 if (ret) {
13953 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret);
13954 goto err_cleanup_if_combs;
13955 }
13956
13957 /* Boot-time regulatory updates have already been processed.
13958 * Mark them as complete now, because after registration,
13959 * cfg80211 will notify us again if there are any pending hints.
13960 * We need to wait for those hints to be processed, so it's
13961 * important to mark the boot-time updates as complete before
13962 * proceeding with registration.
13963 */
13964 for_each_ar(ah, ar, i)
13965 complete_all(&ar->regd_update_completed);
13966
13967 ret = ieee80211_register_hw(hw);
13968 if (ret) {
13969 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
13970 goto err_cleanup_if_combs;
13971 }
13972
13973 if (is_monitor_disable)
13974 /* There's a race between calling ieee80211_register_hw()
13975 * and here where the monitor mode is enabled for a little
13976 * while. But that time is so short and in practise it make
13977 * a difference in real life.
13978 */
13979 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
13980
13981 for_each_ar(ah, ar, i) {
13982 /* Apply the regd received during initialization */
13983 ret = ath12k_regd_update(ar, true);
13984 if (ret) {
13985 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
13986 goto err_unregister_hw;
13987 }
13988
13989 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
13990 struct wmi_set_current_country_arg current_cc = {};
13991
13992 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2);
13993 memcpy(&ar->alpha2, ab->new_alpha2, 2);
13994
13995 reinit_completion(&ar->regd_update_completed);
13996
13997 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc);
13998 if (ret)
13999 ath12k_warn(ar->ab,
14000 "failed set cc code for mac register: %d\n",
14001 ret);
14002 }
14003
14004 ath12k_fw_stats_init(ar);
14005 ath12k_debugfs_register(ar);
14006 }
14007
14008 return 0;
14009
14010 err_unregister_hw:
14011 for_each_ar(ah, ar, i)
14012 ath12k_debugfs_unregister(ar);
14013
14014 ieee80211_unregister_hw(hw);
14015
14016 err_cleanup_if_combs:
14017 ath12k_mac_cleanup_iface_combinations(ah);
14018
14019 err_complete_cleanup_unregister:
14020 i = ah->num_radio;
14021
14022 err_cleanup_unregister:
14023 for (j = 0; j < i; j++) {
14024 ar = ath12k_ah_to_ar(ah, j);
14025 ath12k_mac_cleanup_unregister(ar);
14026 }
14027
14028 SET_IEEE80211_DEV(hw, NULL);
14029
14030 return ret;
14031 }
14032
ath12k_mac_setup(struct ath12k * ar)14033 static void ath12k_mac_setup(struct ath12k *ar)
14034 {
14035 struct ath12k_base *ab = ar->ab;
14036 struct ath12k_pdev *pdev = ar->pdev;
14037 u8 pdev_idx = ar->pdev_idx;
14038
14039 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
14040
14041 ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
14042 /* FIXME: wmi[0] is already initialized during attach,
14043 * Should we do this again?
14044 */
14045 ath12k_wmi_pdev_attach(ab, pdev_idx);
14046
14047 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
14048 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
14049 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
14050 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
14051 ar->scan.arvif = NULL;
14052 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
14053
14054 spin_lock_init(&ar->data_lock);
14055 INIT_LIST_HEAD(&ar->arvifs);
14056 INIT_LIST_HEAD(&ar->ppdu_stats_info);
14057
14058 init_completion(&ar->vdev_setup_done);
14059 init_completion(&ar->vdev_delete_done);
14060 init_completion(&ar->peer_assoc_done);
14061 init_completion(&ar->peer_delete_done);
14062 init_completion(&ar->install_key_done);
14063 init_completion(&ar->bss_survey_done);
14064 init_completion(&ar->scan.started);
14065 init_completion(&ar->scan.completed);
14066 init_completion(&ar->scan.on_channel);
14067 init_completion(&ar->mlo_setup_done);
14068 init_completion(&ar->completed_11d_scan);
14069 init_completion(&ar->regd_update_completed);
14070
14071 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
14072 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
14073 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work);
14074 INIT_LIST_HEAD(&ar->regd_channel_update_queue);
14075 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
14076
14077 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
14078 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
14079
14080 ar->monitor_vdev_id = -1;
14081 ar->monitor_vdev_created = false;
14082 ar->monitor_started = false;
14083 }
14084
__ath12k_mac_mlo_setup(struct ath12k * ar)14085 static int __ath12k_mac_mlo_setup(struct ath12k *ar)
14086 {
14087 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {};
14088 struct ath12k_base *partner_ab, *ab = ar->ab;
14089 struct ath12k_hw_group *ag = ab->ag;
14090 struct wmi_mlo_setup_arg mlo = {};
14091 struct ath12k_pdev *pdev;
14092 unsigned long time_left;
14093 int i, j, ret;
14094
14095 lockdep_assert_held(&ag->mutex);
14096
14097 reinit_completion(&ar->mlo_setup_done);
14098
14099 for (i = 0; i < ag->num_devices; i++) {
14100 partner_ab = ag->ab[i];
14101
14102 for (j = 0; j < partner_ab->num_radios; j++) {
14103 pdev = &partner_ab->pdevs[j];
14104
14105 /* Avoid the self link */
14106 if (ar == pdev->ar)
14107 continue;
14108
14109 partner_link_id[num_link] = pdev->hw_link_id;
14110 num_link++;
14111
14112 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n",
14113 i, j, pdev->hw_link_id, num_link);
14114 }
14115 }
14116
14117 if (num_link == 0)
14118 return 0;
14119
14120 mlo.group_id = cpu_to_le32(ag->id);
14121 mlo.partner_link_id = partner_link_id;
14122 mlo.num_partner_links = num_link;
14123 ar->mlo_setup_status = 0;
14124
14125 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link);
14126
14127 ret = ath12k_wmi_mlo_setup(ar, &mlo);
14128 if (ret) {
14129 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n",
14130 ar->pdev_idx, ret);
14131 return ret;
14132 }
14133
14134 time_left = wait_for_completion_timeout(&ar->mlo_setup_done,
14135 WMI_MLO_CMD_TIMEOUT_HZ);
14136
14137 if (!time_left || ar->mlo_setup_status)
14138 return ar->mlo_setup_status ? : -ETIMEDOUT;
14139
14140 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx);
14141
14142 return 0;
14143 }
14144
__ath12k_mac_mlo_teardown(struct ath12k * ar)14145 static int __ath12k_mac_mlo_teardown(struct ath12k *ar)
14146 {
14147 struct ath12k_base *ab = ar->ab;
14148 int ret;
14149 u8 num_link;
14150
14151 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
14152 return 0;
14153
14154 num_link = ath12k_get_num_partner_link(ar);
14155
14156 if (num_link == 0)
14157 return 0;
14158
14159 ret = ath12k_wmi_mlo_teardown(ar);
14160 if (ret) {
14161 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n",
14162 ar->pdev_idx, ret);
14163 return ret;
14164 }
14165
14166 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx);
14167
14168 return 0;
14169 }
14170
ath12k_mac_mlo_setup(struct ath12k_hw_group * ag)14171 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag)
14172 {
14173 struct ath12k_hw *ah;
14174 struct ath12k *ar;
14175 int ret;
14176 int i, j;
14177
14178 for (i = 0; i < ag->num_hw; i++) {
14179 ah = ag->ah[i];
14180 if (!ah)
14181 continue;
14182
14183 for_each_ar(ah, ar, j) {
14184 ar = &ah->radio[j];
14185 ret = __ath12k_mac_mlo_setup(ar);
14186 if (ret) {
14187 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret);
14188 goto err_setup;
14189 }
14190 }
14191 }
14192
14193 return 0;
14194
14195 err_setup:
14196 for (i = i - 1; i >= 0; i--) {
14197 ah = ag->ah[i];
14198 if (!ah)
14199 continue;
14200
14201 for (j = j - 1; j >= 0; j--) {
14202 ar = &ah->radio[j];
14203 if (!ar)
14204 continue;
14205
14206 __ath12k_mac_mlo_teardown(ar);
14207 }
14208 }
14209
14210 return ret;
14211 }
14212
ath12k_mac_mlo_teardown(struct ath12k_hw_group * ag)14213 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag)
14214 {
14215 struct ath12k_hw *ah;
14216 struct ath12k *ar;
14217 int ret, i, j;
14218
14219 for (i = 0; i < ag->num_hw; i++) {
14220 ah = ag->ah[i];
14221 if (!ah)
14222 continue;
14223
14224 for_each_ar(ah, ar, j) {
14225 ar = &ah->radio[j];
14226 ret = __ath12k_mac_mlo_teardown(ar);
14227 if (ret) {
14228 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret);
14229 break;
14230 }
14231 }
14232 }
14233 }
14234
ath12k_mac_register(struct ath12k_hw_group * ag)14235 int ath12k_mac_register(struct ath12k_hw_group *ag)
14236 {
14237 struct ath12k_hw *ah;
14238 int i;
14239 int ret;
14240
14241 for (i = 0; i < ag->num_hw; i++) {
14242 ah = ath12k_ag_to_ah(ag, i);
14243
14244 ret = ath12k_mac_hw_register(ah);
14245 if (ret)
14246 goto err;
14247 }
14248
14249 return 0;
14250
14251 err:
14252 for (i = i - 1; i >= 0; i--) {
14253 ah = ath12k_ag_to_ah(ag, i);
14254 if (!ah)
14255 continue;
14256
14257 ath12k_mac_hw_unregister(ah);
14258 }
14259
14260 return ret;
14261 }
14262
ath12k_mac_unregister(struct ath12k_hw_group * ag)14263 void ath12k_mac_unregister(struct ath12k_hw_group *ag)
14264 {
14265 struct ath12k_hw *ah;
14266 int i;
14267
14268 for (i = ag->num_hw - 1; i >= 0; i--) {
14269 ah = ath12k_ag_to_ah(ag, i);
14270 if (!ah)
14271 continue;
14272
14273 ath12k_mac_hw_unregister(ah);
14274 }
14275 }
14276
ath12k_mac_hw_destroy(struct ath12k_hw * ah)14277 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
14278 {
14279 ieee80211_free_hw(ah->hw);
14280 }
14281
ath12k_mac_hw_allocate(struct ath12k_hw_group * ag,struct ath12k_pdev_map * pdev_map,u8 num_pdev_map)14282 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag,
14283 struct ath12k_pdev_map *pdev_map,
14284 u8 num_pdev_map)
14285 {
14286 struct ieee80211_hw *hw;
14287 struct ath12k *ar;
14288 struct ath12k_base *ab;
14289 struct ath12k_pdev *pdev;
14290 struct ath12k_hw *ah;
14291 int i;
14292 u8 pdev_idx;
14293
14294 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
14295 &ath12k_ops);
14296 if (!hw)
14297 return NULL;
14298
14299 ah = ath12k_hw_to_ah(hw);
14300 ah->hw = hw;
14301 ah->num_radio = num_pdev_map;
14302
14303 mutex_init(&ah->hw_mutex);
14304 INIT_LIST_HEAD(&ah->ml_peers);
14305
14306 for (i = 0; i < num_pdev_map; i++) {
14307 ab = pdev_map[i].ab;
14308 pdev_idx = pdev_map[i].pdev_idx;
14309 pdev = &ab->pdevs[pdev_idx];
14310
14311 ar = ath12k_ah_to_ar(ah, i);
14312 ar->ah = ah;
14313 ar->ab = ab;
14314 ar->hw_link_id = pdev->hw_link_id;
14315 ar->pdev = pdev;
14316 ar->pdev_idx = pdev_idx;
14317 pdev->ar = ar;
14318
14319 ag->hw_links[ar->hw_link_id].device_id = ab->device_id;
14320 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx;
14321
14322 ath12k_mac_setup(ar);
14323 ath12k_dp_pdev_pre_alloc(ar);
14324 }
14325
14326 return ah;
14327 }
14328
ath12k_mac_destroy(struct ath12k_hw_group * ag)14329 void ath12k_mac_destroy(struct ath12k_hw_group *ag)
14330 {
14331 struct ath12k_pdev *pdev;
14332 struct ath12k_base *ab = ag->ab[0];
14333 int i, j;
14334 struct ath12k_hw *ah;
14335
14336 for (i = 0; i < ag->num_devices; i++) {
14337 ab = ag->ab[i];
14338 if (!ab)
14339 continue;
14340
14341 for (j = 0; j < ab->num_radios; j++) {
14342 pdev = &ab->pdevs[j];
14343 if (!pdev->ar)
14344 continue;
14345 pdev->ar = NULL;
14346 }
14347 }
14348
14349 for (i = 0; i < ag->num_hw; i++) {
14350 ah = ath12k_ag_to_ah(ag, i);
14351 if (!ah)
14352 continue;
14353
14354 ath12k_mac_hw_destroy(ah);
14355 ath12k_ag_set_ah(ag, i, NULL);
14356 }
14357 }
14358
ath12k_mac_set_device_defaults(struct ath12k_base * ab)14359 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab)
14360 {
14361 int total_vdev;
14362
14363 /* Initialize channel counters frequency value in hertz */
14364 ab->cc_freq_hz = 320000;
14365 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab);
14366 ab->free_vdev_map = (1LL << total_vdev) - 1;
14367 }
14368
ath12k_mac_allocate(struct ath12k_hw_group * ag)14369 int ath12k_mac_allocate(struct ath12k_hw_group *ag)
14370 {
14371 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO];
14372 int mac_id, device_id, total_radio, num_hw;
14373 struct ath12k_base *ab;
14374 struct ath12k_hw *ah;
14375 int ret, i, j;
14376 u8 radio_per_hw;
14377
14378 total_radio = 0;
14379 for (i = 0; i < ag->num_devices; i++) {
14380 ab = ag->ab[i];
14381 if (!ab)
14382 continue;
14383
14384 ath12k_debugfs_pdev_create(ab);
14385 ath12k_mac_set_device_defaults(ab);
14386 total_radio += ab->num_radios;
14387 }
14388
14389 if (!total_radio)
14390 return -EINVAL;
14391
14392 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO))
14393 return -ENOSPC;
14394
14395 /* All pdev get combined and register as single wiphy based on
14396 * hardware group which participate in multi-link operation else
14397 * each pdev get register separately.
14398 */
14399 if (ag->mlo_capable)
14400 radio_per_hw = total_radio;
14401 else
14402 radio_per_hw = 1;
14403
14404 num_hw = total_radio / radio_per_hw;
14405
14406 ag->num_hw = 0;
14407 device_id = 0;
14408 mac_id = 0;
14409 for (i = 0; i < num_hw; i++) {
14410 for (j = 0; j < radio_per_hw; j++) {
14411 if (device_id >= ag->num_devices || !ag->ab[device_id]) {
14412 ret = -ENOSPC;
14413 goto err;
14414 }
14415
14416 ab = ag->ab[device_id];
14417 pdev_map[j].ab = ab;
14418 pdev_map[j].pdev_idx = mac_id;
14419 mac_id++;
14420
14421 /* If mac_id falls beyond the current device MACs then
14422 * move to next device
14423 */
14424 if (mac_id >= ab->num_radios) {
14425 mac_id = 0;
14426 device_id++;
14427 }
14428 }
14429
14430 ab = pdev_map->ab;
14431
14432 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw);
14433 if (!ah) {
14434 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
14435 i);
14436 ret = -ENOMEM;
14437 goto err;
14438 }
14439
14440 ah->dev = ab->dev;
14441
14442 ag->ah[i] = ah;
14443 ag->num_hw++;
14444 }
14445
14446 return 0;
14447
14448 err:
14449 for (i = i - 1; i >= 0; i--) {
14450 ah = ath12k_ag_to_ah(ag, i);
14451 if (!ah)
14452 continue;
14453
14454 ath12k_mac_hw_destroy(ah);
14455 ath12k_ag_set_ah(ag, i, NULL);
14456 }
14457
14458 return ret;
14459 }
14460
ath12k_mac_vif_set_keepalive(struct ath12k_link_vif * arvif,enum wmi_sta_keepalive_method method,u32 interval)14461 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif,
14462 enum wmi_sta_keepalive_method method,
14463 u32 interval)
14464 {
14465 struct wmi_sta_keepalive_arg arg = {};
14466 struct ath12k *ar = arvif->ar;
14467 int ret;
14468
14469 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
14470
14471 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
14472 return 0;
14473
14474 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
14475 return 0;
14476
14477 arg.vdev_id = arvif->vdev_id;
14478 arg.enabled = 1;
14479 arg.method = method;
14480 arg.interval = interval;
14481
14482 ret = ath12k_wmi_sta_keepalive(ar, &arg);
14483 if (ret) {
14484 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
14485 arvif->vdev_id, ret);
14486 return ret;
14487 }
14488
14489 return 0;
14490 }
14491