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_pending_free(int buf_id,void * skb,void * ctx)8293 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
8294 {
8295 struct sk_buff *msdu = skb;
8296 struct ieee80211_tx_info *info;
8297 struct ath12k *ar = ctx;
8298 struct ath12k_base *ab = ar->ab;
8299
8300 spin_lock_bh(&ar->txmgmt_idr_lock);
8301 idr_remove(&ar->txmgmt_idr, buf_id);
8302 spin_unlock_bh(&ar->txmgmt_idr_lock);
8303 dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
8304 DMA_TO_DEVICE);
8305
8306 info = IEEE80211_SKB_CB(msdu);
8307 memset(&info->status, 0, sizeof(info->status));
8308
8309 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8310
8311 return 0;
8312 }
8313
ath12k_mac_vif_txmgmt_idr_remove(int buf_id,void * skb,void * ctx)8314 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
8315 {
8316 struct ieee80211_vif *vif = ctx;
8317 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8318 struct sk_buff *msdu = skb;
8319 struct ath12k *ar = skb_cb->ar;
8320 struct ath12k_base *ab = ar->ab;
8321
8322 if (skb_cb->vif == vif) {
8323 spin_lock_bh(&ar->txmgmt_idr_lock);
8324 idr_remove(&ar->txmgmt_idr, buf_id);
8325 spin_unlock_bh(&ar->txmgmt_idr_lock);
8326 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
8327 DMA_TO_DEVICE);
8328 }
8329
8330 return 0;
8331 }
8332
ath12k_mac_mgmt_tx_wmi(struct ath12k * ar,struct ath12k_link_vif * arvif,struct sk_buff * skb)8333 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif,
8334 struct sk_buff *skb)
8335 {
8336 struct ath12k_base *ab = ar->ab;
8337 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8338 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8339 struct ieee80211_tx_info *info;
8340 enum hal_encrypt_type enctype;
8341 unsigned int mic_len;
8342 dma_addr_t paddr;
8343 int buf_id;
8344 int ret;
8345
8346 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8347
8348 skb_cb->ar = ar;
8349 spin_lock_bh(&ar->txmgmt_idr_lock);
8350 buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
8351 ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
8352 spin_unlock_bh(&ar->txmgmt_idr_lock);
8353 if (buf_id < 0)
8354 return -ENOSPC;
8355
8356 info = IEEE80211_SKB_CB(skb);
8357 if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8358 !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
8359 if ((ieee80211_is_action(hdr->frame_control) ||
8360 ieee80211_is_deauth(hdr->frame_control) ||
8361 ieee80211_is_disassoc(hdr->frame_control)) &&
8362 ieee80211_has_protected(hdr->frame_control)) {
8363 enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
8364 mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype);
8365 skb_put(skb, mic_len);
8366 }
8367 }
8368
8369 paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
8370 if (dma_mapping_error(ab->dev, paddr)) {
8371 ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
8372 ret = -EIO;
8373 goto err_free_idr;
8374 }
8375
8376 skb_cb->paddr = paddr;
8377
8378 ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb);
8379 if (ret) {
8380 ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
8381 goto err_unmap_buf;
8382 }
8383
8384 return 0;
8385
8386 err_unmap_buf:
8387 dma_unmap_single(ab->dev, skb_cb->paddr,
8388 skb->len, DMA_TO_DEVICE);
8389 err_free_idr:
8390 spin_lock_bh(&ar->txmgmt_idr_lock);
8391 idr_remove(&ar->txmgmt_idr, buf_id);
8392 spin_unlock_bh(&ar->txmgmt_idr_lock);
8393
8394 return ret;
8395 }
8396
ath12k_mgmt_over_wmi_tx_purge(struct ath12k * ar)8397 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
8398 {
8399 struct sk_buff *skb;
8400
8401 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
8402 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8403 }
8404
ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8405 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8406 struct sk_buff *skb)
8407 {
8408 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8409 u8 category, *buf, iv_len, action_code, dialog_token;
8410 struct ieee80211_bss_conf *link_conf;
8411 struct ieee80211_chanctx_conf *conf;
8412 int cur_tx_power, max_tx_power;
8413 struct ath12k *ar = arvif->ar;
8414 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
8415 struct wiphy *wiphy = hw->wiphy;
8416 struct ath12k_skb_cb *skb_cb;
8417 struct ieee80211_mgmt *mgmt;
8418 unsigned int remaining_len;
8419 bool has_protected;
8420
8421 lockdep_assert_wiphy(wiphy);
8422
8423 /* make sure category field is present */
8424 if (skb->len < IEEE80211_MIN_ACTION_SIZE)
8425 return -EINVAL;
8426
8427 remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE;
8428 has_protected = ieee80211_has_protected(hdr->frame_control);
8429
8430 /* In case of SW crypto and hdr protected (PMF), packet will already be encrypted,
8431 * we can't put in data in this case
8432 */
8433 if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8434 has_protected)
8435 return 0;
8436
8437 mgmt = (struct ieee80211_mgmt *)hdr;
8438 buf = (u8 *)&mgmt->u.action;
8439
8440 /* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that
8441 * many bytes if it is there
8442 */
8443 if (has_protected) {
8444 skb_cb = ATH12K_SKB_CB(skb);
8445
8446 switch (skb_cb->cipher) {
8447 /* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in
8448 * key needs to be processed. See ath12k_install_key()
8449 */
8450 case WLAN_CIPHER_SUITE_CCMP:
8451 case WLAN_CIPHER_SUITE_CCMP_256:
8452 case WLAN_CIPHER_SUITE_GCMP:
8453 case WLAN_CIPHER_SUITE_GCMP_256:
8454 iv_len = IEEE80211_CCMP_HDR_LEN;
8455 break;
8456 case WLAN_CIPHER_SUITE_TKIP:
8457 iv_len = 0;
8458 break;
8459 default:
8460 return -EINVAL;
8461 }
8462
8463 if (remaining_len < iv_len)
8464 return -EINVAL;
8465
8466 buf += iv_len;
8467 remaining_len -= iv_len;
8468 }
8469
8470 category = *buf++;
8471 /* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence
8472 * no need to adjust remaining_len
8473 */
8474
8475 switch (category) {
8476 case WLAN_CATEGORY_RADIO_MEASUREMENT:
8477 /* need action code and dialog token */
8478 if (remaining_len < 2)
8479 return -EINVAL;
8480
8481 /* Packet Format:
8482 * Action Code | Dialog Token | Variable Len (based on Action Code)
8483 */
8484 action_code = *buf++;
8485 dialog_token = *buf++;
8486 remaining_len -= 2;
8487
8488 link_conf = ath12k_mac_get_link_bss_conf(arvif);
8489 if (!link_conf) {
8490 ath12k_warn(ar->ab,
8491 "failed to get bss link conf for vdev %d in RM handling\n",
8492 arvif->vdev_id);
8493 return -EINVAL;
8494 }
8495
8496 conf = wiphy_dereference(wiphy, link_conf->chanctx_conf);
8497 if (!conf)
8498 return -ENOENT;
8499
8500 cur_tx_power = link_conf->txpower;
8501 max_tx_power = min(conf->def.chan->max_reg_power,
8502 (int)ar->max_tx_power / 2);
8503
8504 ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id,
8505 &cur_tx_power);
8506
8507 switch (action_code) {
8508 case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST:
8509 /* need variable fields to be present in len */
8510 if (remaining_len < 2)
8511 return -EINVAL;
8512
8513 /* Variable length format as defined in IEEE 802.11-2024,
8514 * Figure 9-1187-Link Measurement Request frame Action field
8515 * format.
8516 * Transmit Power | Max Tx Power
8517 * We fill both of these.
8518 */
8519 *buf++ = cur_tx_power;
8520 *buf = max_tx_power;
8521
8522 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8523 "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n",
8524 dialog_token, cur_tx_power, max_tx_power);
8525 break;
8526 case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT:
8527 /* need variable fields to be present in len */
8528 if (remaining_len < 3)
8529 return -EINVAL;
8530
8531 /* Variable length format as defined in IEEE 802.11-2024,
8532 * Figure 9-1188-Link Measurement Report frame Action field format
8533 * TPC Report | Variable Fields
8534 *
8535 * TPC Report Format:
8536 * Element ID | Len | Tx Power | Link Margin
8537 *
8538 * We fill Tx power in the TPC Report (2nd index)
8539 */
8540 buf[2] = cur_tx_power;
8541
8542 /* TODO: At present, Link margin data is not present so can't
8543 * really fill it now. Once it is available, it can be added
8544 * here
8545 */
8546 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8547 "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n",
8548 dialog_token, cur_tx_power);
8549 break;
8550 default:
8551 return -EINVAL;
8552 }
8553 break;
8554 default:
8555 /* nothing to fill */
8556 return 0;
8557 }
8558
8559 return 0;
8560 }
8561
ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8562 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8563 struct sk_buff *skb)
8564 {
8565 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8566
8567 if (!ieee80211_is_action(hdr->frame_control))
8568 return 0;
8569
8570 return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb);
8571 }
8572
ath12k_mgmt_over_wmi_tx_work(struct wiphy * wiphy,struct wiphy_work * work)8573 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work)
8574 {
8575 struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
8576 struct ath12k_hw *ah = ar->ah;
8577 struct ath12k_skb_cb *skb_cb;
8578 struct ath12k_vif *ahvif;
8579 struct ath12k_link_vif *arvif;
8580 struct sk_buff *skb;
8581 int ret;
8582
8583 lockdep_assert_wiphy(wiphy);
8584
8585 while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
8586 skb_cb = ATH12K_SKB_CB(skb);
8587 if (!skb_cb->vif) {
8588 ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
8589 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8590 continue;
8591 }
8592
8593 ahvif = ath12k_vif_to_ahvif(skb_cb->vif);
8594 if (!(ahvif->links_map & BIT(skb_cb->link_id))) {
8595 ath12k_warn(ar->ab,
8596 "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n",
8597 skb_cb->link_id, ahvif->links_map);
8598 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8599 continue;
8600 }
8601
8602 arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]);
8603 if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
8604 /* Fill in the data which is required to be filled by the driver
8605 * For example: Max Tx power in Link Measurement Request/Report
8606 */
8607 ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb);
8608 if (ret) {
8609 /* If we couldn't fill the data due to any reason,
8610 * let's not discard transmitting the packet.
8611 * For example: Software crypto and PMF case
8612 */
8613 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8614 "Failed to fill the required data for the mgmt packet err %d\n",
8615 ret);
8616 }
8617
8618 ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
8619 if (ret) {
8620 ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
8621 arvif->vdev_id, ret);
8622 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8623 }
8624 } else {
8625 ath12k_warn(ar->ab,
8626 "dropping mgmt frame for vdev %d link %u is_started %d\n",
8627 arvif->vdev_id,
8628 skb_cb->link_id,
8629 arvif->is_started);
8630 ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8631 }
8632 }
8633 }
8634
ath12k_mac_mgmt_tx(struct ath12k * ar,struct sk_buff * skb,bool is_prb_rsp)8635 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
8636 bool is_prb_rsp)
8637 {
8638 struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
8639
8640 if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
8641 return -ESHUTDOWN;
8642
8643 /* Drop probe response packets when the pending management tx
8644 * count has reached a certain threshold, so as to prioritize
8645 * other mgmt packets like auth and assoc to be sent on time
8646 * for establishing successful connections.
8647 */
8648 if (is_prb_rsp &&
8649 atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
8650 ath12k_warn(ar->ab,
8651 "dropping probe response as pending queue is almost full\n");
8652 return -ENOSPC;
8653 }
8654
8655 if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
8656 ath12k_warn(ar->ab, "mgmt tx queue is full\n");
8657 return -ENOSPC;
8658 }
8659
8660 skb_queue_tail(q, skb);
8661 atomic_inc(&ar->num_pending_mgmt_tx);
8662 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8663
8664 return 0;
8665 }
8666
ath12k_mac_add_p2p_noa_ie(struct ath12k * ar,struct ieee80211_vif * vif,struct sk_buff * skb,bool is_prb_rsp)8667 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
8668 struct ieee80211_vif *vif,
8669 struct sk_buff *skb,
8670 bool is_prb_rsp)
8671 {
8672 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8673
8674 if (likely(!is_prb_rsp))
8675 return;
8676
8677 spin_lock_bh(&ar->data_lock);
8678
8679 if (ahvif->u.ap.noa_data &&
8680 !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len,
8681 GFP_ATOMIC))
8682 skb_put_data(skb, ahvif->u.ap.noa_data,
8683 ahvif->u.ap.noa_len);
8684
8685 spin_unlock_bh(&ar->data_lock);
8686 }
8687
8688 /* 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)8689 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif,
8690 u8 link_id, struct sk_buff *skb,
8691 u32 info_flags)
8692 {
8693 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8694 struct ieee80211_bss_conf *bss_conf;
8695
8696 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8697 return;
8698
8699 bss_conf = rcu_dereference(vif->link_conf[link_id]);
8700 if (bss_conf)
8701 ether_addr_copy(hdr->addr2, bss_conf->addr);
8702 }
8703
8704 /* 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)8705 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
8706 u8 link, struct sk_buff *skb, u32 info_flags)
8707 {
8708 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8709 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8710 struct ieee80211_link_sta *link_sta;
8711 struct ieee80211_bss_conf *bss_conf;
8712 struct ath12k_sta *ahsta;
8713
8714 /* Use the link id passed or the default vif link */
8715 if (!sta) {
8716 if (link != IEEE80211_LINK_UNSPECIFIED)
8717 return link;
8718
8719 return ahvif->deflink.link_id;
8720 }
8721
8722 ahsta = ath12k_sta_to_ahsta(sta);
8723
8724 /* Below translation ensures we pass proper A2 & A3 for non ML clients.
8725 * Also it assumes for now support only for MLO AP in this path
8726 */
8727 if (!sta->mlo) {
8728 link = ahsta->deflink.link_id;
8729
8730 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8731 return link;
8732
8733 bss_conf = rcu_dereference(vif->link_conf[link]);
8734 if (bss_conf) {
8735 ether_addr_copy(hdr->addr2, bss_conf->addr);
8736 if (!ieee80211_has_tods(hdr->frame_control) &&
8737 !ieee80211_has_fromds(hdr->frame_control))
8738 ether_addr_copy(hdr->addr3, bss_conf->addr);
8739 }
8740
8741 return link;
8742 }
8743
8744 /* enqueue eth enacap & data frames on primary link, FW does link
8745 * selection and address translation.
8746 */
8747 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
8748 ieee80211_is_data(hdr->frame_control))
8749 return ahsta->assoc_link_id;
8750
8751 /* 802.11 frame cases */
8752 if (link == IEEE80211_LINK_UNSPECIFIED)
8753 link = ahsta->deflink.link_id;
8754
8755 if (!ieee80211_is_mgmt(hdr->frame_control))
8756 return link;
8757
8758 /* Perform address conversion for ML STA Tx */
8759 bss_conf = rcu_dereference(vif->link_conf[link]);
8760 link_sta = rcu_dereference(sta->link[link]);
8761
8762 if (bss_conf && link_sta) {
8763 ether_addr_copy(hdr->addr1, link_sta->addr);
8764 ether_addr_copy(hdr->addr2, bss_conf->addr);
8765
8766 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8767 ether_addr_copy(hdr->addr3, bss_conf->bssid);
8768 else if (vif->type == NL80211_IFTYPE_AP)
8769 ether_addr_copy(hdr->addr3, bss_conf->addr);
8770
8771 return link;
8772 }
8773
8774 if (bss_conf) {
8775 /* In certain cases where a ML sta associated and added subset of
8776 * links on which the ML AP is active, but now sends some frame
8777 * (ex. Probe request) on a different link which is active in our
8778 * MLD but was not added during previous association, we can
8779 * still honor the Tx to that ML STA via the requested link.
8780 * The control would reach here in such case only when that link
8781 * address is same as the MLD address or in worst case clients
8782 * used MLD address at TA wrongly which would have helped
8783 * identify the ML sta object and pass it here.
8784 * If the link address of that STA is different from MLD address,
8785 * then the sta object would be NULL and control won't reach
8786 * here but return at the start of the function itself with !sta
8787 * check. Also this would not need any translation at hdr->addr1
8788 * from MLD to link address since the RA is the MLD address
8789 * (same as that link address ideally) already.
8790 */
8791 ether_addr_copy(hdr->addr2, bss_conf->addr);
8792
8793 if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8794 ether_addr_copy(hdr->addr3, bss_conf->bssid);
8795 else if (vif->type == NL80211_IFTYPE_AP)
8796 ether_addr_copy(hdr->addr3, bss_conf->addr);
8797 }
8798
8799 return link;
8800 }
8801
8802 /* Note: called under rcu_read_lock() */
ath12k_mac_op_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)8803 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
8804 struct ieee80211_tx_control *control,
8805 struct sk_buff *skb)
8806 {
8807 struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8808 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
8809 struct ieee80211_vif *vif = info->control.vif;
8810 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8811 struct ath12k_link_vif *arvif = &ahvif->deflink;
8812 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8813 struct ieee80211_key_conf *key = info->control.hw_key;
8814 struct ieee80211_sta *sta = control->sta;
8815 struct ath12k_link_vif *tmp_arvif;
8816 u32 info_flags = info->flags;
8817 struct sk_buff *msdu_copied;
8818 struct ath12k *ar, *tmp_ar;
8819 struct ath12k_peer *peer;
8820 unsigned long links_map;
8821 bool is_mcast = false;
8822 bool is_dvlan = false;
8823 struct ethhdr *eth;
8824 bool is_prb_rsp;
8825 u16 mcbc_gsn;
8826 u8 link_id;
8827 int ret;
8828
8829 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8830 ieee80211_free_txskb(hw, skb);
8831 return;
8832 }
8833
8834 link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
8835 memset(skb_cb, 0, sizeof(*skb_cb));
8836 skb_cb->vif = vif;
8837
8838 if (key) {
8839 skb_cb->cipher = key->cipher;
8840 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8841 }
8842
8843 /* handle only for MLO case, use deflink for non MLO case */
8844 if (ieee80211_vif_is_mld(vif)) {
8845 link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags);
8846 if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
8847 ieee80211_free_txskb(hw, skb);
8848 return;
8849 }
8850 } else {
8851 link_id = 0;
8852 }
8853
8854 arvif = rcu_dereference(ahvif->link[link_id]);
8855 if (!arvif || !arvif->ar) {
8856 ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission",
8857 link_id);
8858 ieee80211_free_txskb(hw, skb);
8859 return;
8860 }
8861
8862 ar = arvif->ar;
8863 skb_cb->link_id = link_id;
8864 is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
8865
8866 if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
8867 eth = (struct ethhdr *)skb->data;
8868 is_mcast = is_multicast_ether_addr(eth->h_dest);
8869
8870 skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
8871 } else if (ieee80211_is_mgmt(hdr->frame_control)) {
8872 if (sta && sta->mlo)
8873 skb_cb->flags |= ATH12K_SKB_MLO_STA;
8874
8875 ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
8876 if (ret) {
8877 ath12k_warn(ar->ab, "failed to queue management frame %d\n",
8878 ret);
8879 ieee80211_free_txskb(hw, skb);
8880 }
8881 return;
8882 }
8883
8884 if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
8885 is_mcast = is_multicast_ether_addr(hdr->addr1);
8886
8887 /* This is case only for P2P_GO */
8888 if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
8889 ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
8890
8891 /* Checking if it is a DVLAN frame */
8892 if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8893 !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
8894 !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8895 ieee80211_has_protected(hdr->frame_control))
8896 is_dvlan = true;
8897
8898 if (!vif->valid_links || !is_mcast || is_dvlan ||
8899 (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
8900 test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
8901 ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast);
8902 if (unlikely(ret)) {
8903 ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
8904 ieee80211_free_txskb(ar->ah->hw, skb);
8905 return;
8906 }
8907 } else {
8908 mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff;
8909
8910 links_map = ahvif->links_map;
8911 for_each_set_bit(link_id, &links_map,
8912 IEEE80211_MLD_MAX_NUM_LINKS) {
8913 tmp_arvif = rcu_dereference(ahvif->link[link_id]);
8914 if (!tmp_arvif || !tmp_arvif->is_up)
8915 continue;
8916
8917 tmp_ar = tmp_arvif->ar;
8918 msdu_copied = skb_copy(skb, GFP_ATOMIC);
8919 if (!msdu_copied) {
8920 ath12k_err(ar->ab,
8921 "skb copy failure link_id 0x%X vdevid 0x%X\n",
8922 link_id, tmp_arvif->vdev_id);
8923 continue;
8924 }
8925
8926 ath12k_mlo_mcast_update_tx_link_address(vif, link_id,
8927 msdu_copied,
8928 info_flags);
8929
8930 skb_cb = ATH12K_SKB_CB(msdu_copied);
8931 skb_cb->link_id = link_id;
8932
8933 /* For open mode, skip peer find logic */
8934 if (unlikely(!ahvif->key_cipher))
8935 goto skip_peer_find;
8936
8937 spin_lock_bh(&tmp_ar->ab->base_lock);
8938 peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid);
8939 if (!peer) {
8940 spin_unlock_bh(&tmp_ar->ab->base_lock);
8941 ath12k_warn(tmp_ar->ab,
8942 "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n",
8943 tmp_arvif->vdev_id, tmp_arvif->bssid,
8944 ahvif->links_map);
8945 dev_kfree_skb_any(msdu_copied);
8946 continue;
8947 }
8948
8949 key = peer->keys[peer->mcast_keyidx];
8950 if (key) {
8951 skb_cb->cipher = key->cipher;
8952 skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8953
8954 hdr = (struct ieee80211_hdr *)msdu_copied->data;
8955 if (!ieee80211_has_protected(hdr->frame_control))
8956 hdr->frame_control |=
8957 cpu_to_le16(IEEE80211_FCTL_PROTECTED);
8958 }
8959 spin_unlock_bh(&tmp_ar->ab->base_lock);
8960
8961 skip_peer_find:
8962 ret = ath12k_dp_tx(tmp_ar, tmp_arvif,
8963 msdu_copied, true, mcbc_gsn, is_mcast);
8964 if (unlikely(ret)) {
8965 if (ret == -ENOMEM) {
8966 /* Drops are expected during heavy multicast
8967 * frame flood. Print with debug log
8968 * level to avoid lot of console prints
8969 */
8970 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8971 "failed to transmit frame %d\n",
8972 ret);
8973 } else {
8974 ath12k_warn(ar->ab,
8975 "failed to transmit frame %d\n",
8976 ret);
8977 }
8978
8979 dev_kfree_skb_any(msdu_copied);
8980 }
8981 }
8982 ieee80211_free_txskb(ar->ah->hw, skb);
8983 }
8984 }
8985
ath12k_mac_drain_tx(struct ath12k * ar)8986 void ath12k_mac_drain_tx(struct ath12k *ar)
8987 {
8988 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8989
8990 /* make sure rcu-protected mac80211 tx path itself is drained */
8991 synchronize_net();
8992
8993 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8994 ath12k_mgmt_over_wmi_tx_purge(ar);
8995 }
8996
ath12k_mac_config_mon_status_default(struct ath12k * ar,bool enable)8997 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
8998 {
8999 struct htt_rx_ring_tlv_filter tlv_filter = {};
9000 struct ath12k_base *ab = ar->ab;
9001 u32 ring_id, i;
9002 int ret = 0;
9003
9004 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9005
9006 if (!ab->hw_params->rxdma1_enable)
9007 return ret;
9008
9009 if (enable) {
9010 tlv_filter = ath12k_mac_mon_status_filter_default;
9011
9012 if (ath12k_debugfs_rx_filter(ar))
9013 tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar);
9014 } else {
9015 tlv_filter.rxmon_disable = true;
9016 }
9017
9018 for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) {
9019 ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id;
9020 ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id,
9021 ar->dp.mac_id + i,
9022 HAL_RXDMA_MONITOR_DST,
9023 DP_RXDMA_REFILL_RING_SIZE,
9024 &tlv_filter);
9025 if (ret) {
9026 ath12k_err(ab,
9027 "failed to setup filter for monitor buf %d\n",
9028 ret);
9029 }
9030 }
9031
9032 return ret;
9033 }
9034
ath12k_mac_start(struct ath12k * ar)9035 static int ath12k_mac_start(struct ath12k *ar)
9036 {
9037 struct ath12k_hw *ah = ar->ah;
9038 struct ath12k_base *ab = ar->ab;
9039 struct ath12k_pdev *pdev = ar->pdev;
9040 int ret;
9041
9042 lockdep_assert_held(&ah->hw_mutex);
9043 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9044
9045 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
9046 1, pdev->pdev_id);
9047
9048 if (ret) {
9049 ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret);
9050 goto err;
9051 }
9052
9053 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
9054 pdev->pdev_id);
9055 if (ret) {
9056 ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
9057 goto err;
9058 }
9059
9060 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
9061 0, pdev->pdev_id);
9062 if (ret) {
9063 ath12k_err(ab, "failed to set ac override for ARP: %d\n",
9064 ret);
9065 goto err;
9066 }
9067
9068 ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
9069 if (ret) {
9070 ath12k_err(ab, "failed to offload radar detection: %d\n",
9071 ret);
9072 goto err;
9073 }
9074
9075 ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
9076 HTT_PPDU_STATS_TAG_DEFAULT);
9077 if (ret) {
9078 ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
9079 goto err;
9080 }
9081
9082 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
9083 1, pdev->pdev_id);
9084
9085 if (ret) {
9086 ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
9087 goto err;
9088 }
9089
9090 __ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
9091
9092 /* TODO: Do we need to enable ANI? */
9093
9094 ret = ath12k_reg_update_chan_list(ar, false);
9095
9096 /* The ar state alone can be turned off for non supported country
9097 * without returning the error value. As we need to update the channel
9098 * for the next ar.
9099 */
9100 if (ret) {
9101 if (ret == -EINVAL)
9102 ret = 0;
9103 goto err;
9104 }
9105
9106 ar->num_started_vdevs = 0;
9107 ar->num_created_vdevs = 0;
9108 ar->num_peers = 0;
9109 ar->allocated_vdev_map = 0;
9110 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
9111
9112 /* Configure monitor status ring with default rx_filter to get rx status
9113 * such as rssi, rx_duration.
9114 */
9115 ret = ath12k_mac_config_mon_status_default(ar, true);
9116 if (ret && (ret != -EOPNOTSUPP)) {
9117 ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
9118 ret);
9119 goto err;
9120 }
9121
9122 if (ret == -EOPNOTSUPP)
9123 ath12k_dbg(ab, ATH12K_DBG_MAC,
9124 "monitor status config is not yet supported");
9125
9126 /* Configure the hash seed for hash based reo dest ring selection */
9127 ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
9128
9129 /* allow device to enter IMPS */
9130 if (ab->hw_params->idle_ps) {
9131 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
9132 1, pdev->pdev_id);
9133 if (ret) {
9134 ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
9135 goto err;
9136 }
9137 }
9138
9139 rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
9140 &ab->pdevs[ar->pdev_idx]);
9141
9142 return 0;
9143 err:
9144
9145 return ret;
9146 }
9147
ath12k_drain_tx(struct ath12k_hw * ah)9148 static void ath12k_drain_tx(struct ath12k_hw *ah)
9149 {
9150 struct ath12k *ar;
9151 int i;
9152
9153 lockdep_assert_wiphy(ah->hw->wiphy);
9154
9155 for_each_ar(ah, ar, i)
9156 ath12k_mac_drain_tx(ar);
9157 }
9158
ath12k_mac_op_start(struct ieee80211_hw * hw)9159 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
9160 {
9161 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9162 struct ath12k *ar;
9163 int ret, i;
9164
9165 if (ath12k_ftm_mode)
9166 return -EPERM;
9167
9168 lockdep_assert_wiphy(hw->wiphy);
9169
9170 ath12k_drain_tx(ah);
9171
9172 guard(mutex)(&ah->hw_mutex);
9173
9174 switch (ah->state) {
9175 case ATH12K_HW_STATE_OFF:
9176 ah->state = ATH12K_HW_STATE_ON;
9177 break;
9178 case ATH12K_HW_STATE_RESTARTING:
9179 ah->state = ATH12K_HW_STATE_RESTARTED;
9180 break;
9181 case ATH12K_HW_STATE_RESTARTED:
9182 case ATH12K_HW_STATE_WEDGED:
9183 case ATH12K_HW_STATE_ON:
9184 case ATH12K_HW_STATE_TM:
9185 ah->state = ATH12K_HW_STATE_OFF;
9186
9187 WARN_ON(1);
9188 return -EINVAL;
9189 }
9190
9191 for_each_ar(ah, ar, i) {
9192 ret = ath12k_mac_start(ar);
9193 if (ret) {
9194 ah->state = ATH12K_HW_STATE_OFF;
9195
9196 ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n",
9197 ar->pdev_idx, ret);
9198 goto fail_start;
9199 }
9200 }
9201
9202 return 0;
9203
9204 fail_start:
9205 for (; i > 0; i--) {
9206 ar = ath12k_ah_to_ar(ah, i - 1);
9207 ath12k_mac_stop(ar);
9208 }
9209
9210 return ret;
9211 }
9212
ath12k_mac_rfkill_config(struct ath12k * ar)9213 int ath12k_mac_rfkill_config(struct ath12k *ar)
9214 {
9215 struct ath12k_base *ab = ar->ab;
9216 u32 param;
9217 int ret;
9218
9219 if (ab->hw_params->rfkill_pin == 0)
9220 return -EOPNOTSUPP;
9221
9222 ath12k_dbg(ab, ATH12K_DBG_MAC,
9223 "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
9224 ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
9225 ab->hw_params->rfkill_on_level);
9226
9227 param = u32_encode_bits(ab->hw_params->rfkill_on_level,
9228 WMI_RFKILL_CFG_RADIO_LEVEL) |
9229 u32_encode_bits(ab->hw_params->rfkill_pin,
9230 WMI_RFKILL_CFG_GPIO_PIN_NUM) |
9231 u32_encode_bits(ab->hw_params->rfkill_cfg,
9232 WMI_RFKILL_CFG_PIN_AS_GPIO);
9233
9234 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
9235 param, ar->pdev->pdev_id);
9236 if (ret) {
9237 ath12k_warn(ab,
9238 "failed to set rfkill config 0x%x: %d\n",
9239 param, ret);
9240 return ret;
9241 }
9242
9243 return 0;
9244 }
9245
ath12k_mac_rfkill_enable_radio(struct ath12k * ar,bool enable)9246 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
9247 {
9248 enum wmi_rfkill_enable_radio param;
9249 int ret;
9250
9251 if (enable)
9252 param = WMI_RFKILL_ENABLE_RADIO_ON;
9253 else
9254 param = WMI_RFKILL_ENABLE_RADIO_OFF;
9255
9256 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
9257 ar->pdev_idx, param);
9258
9259 ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
9260 param, ar->pdev->pdev_id);
9261 if (ret) {
9262 ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
9263 param, ret);
9264 return ret;
9265 }
9266
9267 return 0;
9268 }
9269
ath12k_mac_stop(struct ath12k * ar)9270 static void ath12k_mac_stop(struct ath12k *ar)
9271 {
9272 struct ath12k_hw *ah = ar->ah;
9273 struct htt_ppdu_stats_info *ppdu_stats, *tmp;
9274 struct ath12k_wmi_scan_chan_list_arg *arg;
9275 int ret;
9276
9277 lockdep_assert_held(&ah->hw_mutex);
9278 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9279
9280 ret = ath12k_mac_config_mon_status_default(ar, false);
9281 if (ret && (ret != -EOPNOTSUPP))
9282 ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
9283 ret);
9284
9285 clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
9286
9287 cancel_delayed_work_sync(&ar->scan.timeout);
9288 wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk);
9289 cancel_work_sync(&ar->regd_channel_update_work);
9290 cancel_work_sync(&ar->regd_update_work);
9291 cancel_work_sync(&ar->ab->rfkill_work);
9292 cancel_work_sync(&ar->ab->update_11d_work);
9293 ar->state_11d = ATH12K_11D_IDLE;
9294 complete(&ar->completed_11d_scan);
9295
9296 spin_lock_bh(&ar->data_lock);
9297
9298 list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
9299 list_del(&ppdu_stats->list);
9300 kfree(ppdu_stats);
9301 }
9302
9303 while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue,
9304 struct ath12k_wmi_scan_chan_list_arg,
9305 list))) {
9306 list_del(&arg->list);
9307 kfree(arg);
9308 }
9309 spin_unlock_bh(&ar->data_lock);
9310
9311 rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
9312
9313 synchronize_rcu();
9314
9315 atomic_set(&ar->num_pending_mgmt_tx, 0);
9316 }
9317
ath12k_mac_op_stop(struct ieee80211_hw * hw,bool suspend)9318 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend)
9319 {
9320 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9321 struct ath12k *ar;
9322 int i;
9323
9324 lockdep_assert_wiphy(hw->wiphy);
9325
9326 ath12k_drain_tx(ah);
9327
9328 mutex_lock(&ah->hw_mutex);
9329
9330 ah->state = ATH12K_HW_STATE_OFF;
9331
9332 for_each_ar(ah, ar, i)
9333 ath12k_mac_stop(ar);
9334
9335 mutex_unlock(&ah->hw_mutex);
9336 }
9337
9338 static u8
ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif * arvif)9339 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif)
9340 {
9341 struct ath12k_base *ab = arvif->ar->ab;
9342 u8 vdev_stats_id = 0;
9343
9344 do {
9345 if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
9346 vdev_stats_id++;
9347 if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
9348 vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
9349 break;
9350 }
9351 } else {
9352 ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
9353 break;
9354 }
9355 } while (vdev_stats_id);
9356
9357 arvif->vdev_stats_id = vdev_stats_id;
9358 return vdev_stats_id;
9359 }
9360
ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif * arvif,u32 * flags,u32 * tx_vdev_id)9361 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif,
9362 u32 *flags, u32 *tx_vdev_id)
9363 {
9364 struct ath12k_vif *ahvif = arvif->ahvif;
9365 struct ieee80211_bss_conf *link_conf;
9366 struct ath12k *ar = arvif->ar;
9367 struct ath12k_link_vif *tx_arvif;
9368
9369 link_conf = ath12k_mac_get_link_bss_conf(arvif);
9370 if (!link_conf) {
9371 ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n",
9372 ahvif->vif->addr, arvif->link_id);
9373 return -ENOLINK;
9374 }
9375
9376 tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
9377 if (!tx_arvif)
9378 return 0;
9379
9380 if (link_conf->nontransmitted) {
9381 if (ath12k_ar_to_hw(ar)->wiphy !=
9382 ath12k_ar_to_hw(tx_arvif->ar)->wiphy)
9383 return -EINVAL;
9384
9385 *flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP;
9386 *tx_vdev_id = tx_arvif->vdev_id;
9387 } else if (tx_arvif == arvif) {
9388 *flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP;
9389 } else {
9390 return -EINVAL;
9391 }
9392
9393 if (link_conf->ema_ap)
9394 *flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE;
9395
9396 return 0;
9397 }
9398
ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif * arvif,struct ath12k_wmi_vdev_create_arg * arg)9399 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif,
9400 struct ath12k_wmi_vdev_create_arg *arg)
9401 {
9402 struct ath12k *ar = arvif->ar;
9403 struct ath12k_pdev *pdev = ar->pdev;
9404 struct ath12k_vif *ahvif = arvif->ahvif;
9405 int ret;
9406
9407 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9408
9409 arg->if_id = arvif->vdev_id;
9410 arg->type = ahvif->vdev_type;
9411 arg->subtype = ahvif->vdev_subtype;
9412 arg->pdev_id = pdev->pdev_id;
9413
9414 arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
9415 arg->mbssid_tx_vdev_id = 0;
9416 if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
9417 ar->ab->wmi_ab.svc_map)) {
9418 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
9419 &arg->mbssid_flags,
9420 &arg->mbssid_tx_vdev_id);
9421 if (ret)
9422 return ret;
9423 }
9424
9425 if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
9426 arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
9427 arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
9428 }
9429 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
9430 arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
9431 arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
9432 }
9433 if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
9434 ar->supports_6ghz) {
9435 arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
9436 arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
9437 }
9438
9439 arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
9440
9441 if (ath12k_mac_is_ml_arvif(arvif)) {
9442 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) {
9443 ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d",
9444 ahvif->vif->valid_links);
9445 return -EINVAL;
9446 }
9447
9448 ether_addr_copy(arg->mld_addr, ahvif->vif->addr);
9449 }
9450
9451 return 0;
9452 }
9453
ath12k_mac_update_vif_offload(struct ath12k_link_vif * arvif)9454 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
9455 {
9456 struct ath12k_vif *ahvif = arvif->ahvif;
9457 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9458 struct ath12k *ar = arvif->ar;
9459 struct ath12k_base *ab = ar->ab;
9460 u32 param_id, param_value;
9461 int ret;
9462
9463 param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
9464 if (vif->type != NL80211_IFTYPE_STATION &&
9465 vif->type != NL80211_IFTYPE_AP)
9466 vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
9467 IEEE80211_OFFLOAD_DECAP_ENABLED);
9468
9469 if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
9470 ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
9471 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9472 ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
9473 else
9474 ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
9475
9476 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9477 param_id, ahvif->tx_encap_type);
9478 if (ret) {
9479 ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
9480 arvif->vdev_id, ret);
9481 vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
9482 }
9483
9484 param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
9485 if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
9486 param_value = ATH12K_HW_TXRX_ETHERNET;
9487 else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9488 param_value = ATH12K_HW_TXRX_RAW;
9489 else
9490 param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
9491
9492 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9493 param_id, param_value);
9494 if (ret) {
9495 ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
9496 arvif->vdev_id, ret);
9497 vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
9498 }
9499 }
9500
ath12k_mac_op_update_vif_offload(struct ieee80211_hw * hw,struct ieee80211_vif * vif)9501 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
9502 struct ieee80211_vif *vif)
9503 {
9504 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9505 struct ath12k_link_vif *arvif;
9506 unsigned long links;
9507 int link_id;
9508
9509 lockdep_assert_wiphy(hw->wiphy);
9510
9511 if (vif->valid_links) {
9512 links = vif->valid_links;
9513 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
9514 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
9515 if (!(arvif && arvif->ar))
9516 continue;
9517
9518 ath12k_mac_update_vif_offload(arvif);
9519 }
9520
9521 return;
9522 }
9523
9524 ath12k_mac_update_vif_offload(&ahvif->deflink);
9525 }
9526
ath12k_mac_vif_ap_active_any(struct ath12k_base * ab)9527 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab)
9528 {
9529 struct ath12k *ar;
9530 struct ath12k_pdev *pdev;
9531 struct ath12k_link_vif *arvif;
9532 int i;
9533
9534 for (i = 0; i < ab->num_radios; i++) {
9535 pdev = &ab->pdevs[i];
9536 ar = pdev->ar;
9537 list_for_each_entry(arvif, &ar->arvifs, list) {
9538 if (arvif->is_up &&
9539 arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP)
9540 return true;
9541 }
9542 }
9543 return false;
9544 }
9545
ath12k_mac_11d_scan_start(struct ath12k * ar,u32 vdev_id)9546 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id)
9547 {
9548 struct wmi_11d_scan_start_arg arg;
9549 int ret;
9550
9551 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9552
9553 if (ar->regdom_set_by_user)
9554 goto fin;
9555
9556 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID)
9557 goto fin;
9558
9559 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9560 goto fin;
9561
9562 if (ath12k_mac_vif_ap_active_any(ar->ab))
9563 goto fin;
9564
9565 arg.vdev_id = vdev_id;
9566 arg.start_interval_msec = 0;
9567 arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL;
9568
9569 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
9570 "mac start 11d scan for vdev %d\n", vdev_id);
9571
9572 ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg);
9573 if (ret) {
9574 ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
9575 vdev_id, ret);
9576 } else {
9577 ar->vdev_id_11d_scan = vdev_id;
9578 if (ar->state_11d == ATH12K_11D_PREPARING)
9579 ar->state_11d = ATH12K_11D_RUNNING;
9580 }
9581
9582 fin:
9583 if (ar->state_11d == ATH12K_11D_PREPARING) {
9584 ar->state_11d = ATH12K_11D_IDLE;
9585 complete(&ar->completed_11d_scan);
9586 }
9587 }
9588
ath12k_mac_11d_scan_stop(struct ath12k * ar)9589 void ath12k_mac_11d_scan_stop(struct ath12k *ar)
9590 {
9591 int ret;
9592 u32 vdev_id;
9593
9594 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9595
9596 if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9597 return;
9598
9599 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n",
9600 ar->vdev_id_11d_scan);
9601
9602 if (ar->state_11d == ATH12K_11D_PREPARING) {
9603 ar->state_11d = ATH12K_11D_IDLE;
9604 complete(&ar->completed_11d_scan);
9605 }
9606
9607 if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) {
9608 vdev_id = ar->vdev_id_11d_scan;
9609
9610 ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
9611 if (ret) {
9612 ath12k_warn(ar->ab,
9613 "failed to stopt 11d scan vdev %d ret: %d\n",
9614 vdev_id, ret);
9615 } else {
9616 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
9617 ar->state_11d = ATH12K_11D_IDLE;
9618 complete(&ar->completed_11d_scan);
9619 }
9620 }
9621 }
9622
ath12k_mac_11d_scan_stop_all(struct ath12k_base * ab)9623 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab)
9624 {
9625 struct ath12k *ar;
9626 struct ath12k_pdev *pdev;
9627 int i;
9628
9629 ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n");
9630
9631 for (i = 0; i < ab->num_radios; i++) {
9632 pdev = &ab->pdevs[i];
9633 ar = pdev->ar;
9634
9635 ath12k_mac_11d_scan_stop(ar);
9636 }
9637 }
9638
ath12k_mac_determine_vdev_type(struct ieee80211_vif * vif,struct ath12k_vif * ahvif)9639 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif,
9640 struct ath12k_vif *ahvif)
9641 {
9642 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
9643
9644 switch (vif->type) {
9645 case NL80211_IFTYPE_UNSPECIFIED:
9646 case NL80211_IFTYPE_STATION:
9647 ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9648
9649 if (vif->p2p)
9650 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
9651
9652 break;
9653 case NL80211_IFTYPE_MESH_POINT:
9654 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
9655 fallthrough;
9656 case NL80211_IFTYPE_AP:
9657 ahvif->vdev_type = WMI_VDEV_TYPE_AP;
9658
9659 if (vif->p2p)
9660 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
9661
9662 break;
9663 case NL80211_IFTYPE_MONITOR:
9664 ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
9665 break;
9666 case NL80211_IFTYPE_P2P_DEVICE:
9667 ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9668 ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
9669 break;
9670 default:
9671 WARN_ON(1);
9672 break;
9673 }
9674 }
9675
ath12k_mac_vdev_create(struct ath12k * ar,struct ath12k_link_vif * arvif)9676 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
9677 {
9678 struct ath12k_hw *ah = ar->ah;
9679 struct ath12k_base *ab = ar->ab;
9680 struct ieee80211_hw *hw = ah->hw;
9681 struct ath12k_vif *ahvif = arvif->ahvif;
9682 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9683 struct ath12k_wmi_vdev_create_arg vdev_arg = {};
9684 struct ath12k_wmi_peer_create_arg peer_param = {};
9685 struct ieee80211_bss_conf *link_conf = NULL;
9686 u32 param_id, param_value;
9687 u16 nss;
9688 int i;
9689 int ret, vdev_id;
9690 u8 link_id;
9691
9692 lockdep_assert_wiphy(hw->wiphy);
9693
9694 /* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor
9695 * interface in each radio
9696 */
9697 if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created)
9698 return -EINVAL;
9699
9700 link_id = arvif->link_id;
9701
9702 if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
9703 link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
9704 if (!link_conf) {
9705 ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n",
9706 vif->addr, arvif->link_id);
9707 return -ENOLINK;
9708 }
9709 }
9710
9711 if (link_conf)
9712 memcpy(arvif->bssid, link_conf->addr, ETH_ALEN);
9713 else
9714 memcpy(arvif->bssid, vif->addr, ETH_ALEN);
9715
9716 arvif->ar = ar;
9717 vdev_id = __ffs64(ab->free_vdev_map);
9718 arvif->vdev_id = vdev_id;
9719 if (vif->type == NL80211_IFTYPE_MONITOR)
9720 ar->monitor_vdev_id = vdev_id;
9721
9722 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n",
9723 arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype,
9724 ab->free_vdev_map);
9725
9726 vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
9727 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
9728 vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
9729
9730 ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
9731 if (ret) {
9732 ath12k_warn(ab, "failed to create vdev parameters %d: %d\n",
9733 arvif->vdev_id, ret);
9734 goto err;
9735 }
9736
9737 ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg);
9738 if (ret) {
9739 ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
9740 arvif->vdev_id, ret);
9741 return ret;
9742 }
9743
9744 ar->num_created_vdevs++;
9745 arvif->is_created = true;
9746 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
9747 vif->addr, arvif->vdev_id);
9748 ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
9749 ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
9750
9751 spin_lock_bh(&ar->data_lock);
9752 list_add(&arvif->list, &ar->arvifs);
9753 spin_unlock_bh(&ar->data_lock);
9754
9755 ath12k_mac_update_vif_offload(arvif);
9756
9757 nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
9758 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9759 WMI_VDEV_PARAM_NSS, nss);
9760 if (ret) {
9761 ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
9762 arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
9763 goto err_vdev_del;
9764 }
9765
9766 switch (ahvif->vdev_type) {
9767 case WMI_VDEV_TYPE_AP:
9768 peer_param.vdev_id = arvif->vdev_id;
9769 peer_param.peer_addr = arvif->bssid;
9770 peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9771 ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
9772 if (ret) {
9773 ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
9774 arvif->vdev_id, ret);
9775 goto err_vdev_del;
9776 }
9777
9778 ret = ath12k_mac_set_kickout(arvif);
9779 if (ret) {
9780 ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
9781 arvif->vdev_id, ret);
9782 goto err_peer_del;
9783 }
9784 ath12k_mac_11d_scan_stop_all(ar->ab);
9785 break;
9786 case WMI_VDEV_TYPE_STA:
9787 param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
9788 param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
9789 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9790 param_id, param_value);
9791 if (ret) {
9792 ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
9793 arvif->vdev_id, ret);
9794 goto err_peer_del;
9795 }
9796
9797 param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
9798 param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
9799 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9800 param_id, param_value);
9801 if (ret) {
9802 ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
9803 arvif->vdev_id, ret);
9804 goto err_peer_del;
9805 }
9806
9807 param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
9808 param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
9809 ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9810 param_id, param_value);
9811 if (ret) {
9812 ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
9813 arvif->vdev_id, ret);
9814 goto err_peer_del;
9815 }
9816
9817 ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
9818 if (ret) {
9819 ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
9820 arvif->vdev_id, ret);
9821 goto err_peer_del;
9822 }
9823
9824 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
9825 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
9826 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
9827 reinit_completion(&ar->completed_11d_scan);
9828 ar->state_11d = ATH12K_11D_PREPARING;
9829 }
9830 break;
9831 case WMI_VDEV_TYPE_MONITOR:
9832 ar->monitor_vdev_created = true;
9833 break;
9834 default:
9835 break;
9836 }
9837
9838 if (link_conf)
9839 arvif->txpower = link_conf->txpower;
9840 else
9841 arvif->txpower = NL80211_TX_POWER_AUTOMATIC;
9842
9843 ret = ath12k_mac_txpower_recalc(ar);
9844 if (ret)
9845 goto err_peer_del;
9846
9847 param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
9848 param_value = hw->wiphy->rts_threshold;
9849 ar->rts_threshold = param_value;
9850 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9851 param_id, param_value);
9852 if (ret) {
9853 ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
9854 arvif->vdev_id, ret);
9855 }
9856
9857 ath12k_dp_vdev_tx_attach(ar, arvif);
9858
9859 return ret;
9860
9861 err_peer_del:
9862 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
9863 reinit_completion(&ar->peer_delete_done);
9864
9865 ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid,
9866 arvif->vdev_id);
9867 if (ret) {
9868 ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
9869 arvif->vdev_id, arvif->bssid);
9870 goto err;
9871 }
9872
9873 ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
9874 arvif->bssid);
9875 if (ret)
9876 goto err_vdev_del;
9877
9878 ar->num_peers--;
9879 }
9880
9881 err_vdev_del:
9882 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
9883 ar->monitor_vdev_id = -1;
9884 ar->monitor_vdev_created = false;
9885 }
9886
9887 ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
9888 ar->num_created_vdevs--;
9889 arvif->is_created = false;
9890 arvif->ar = NULL;
9891 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
9892 ab->free_vdev_map |= 1LL << arvif->vdev_id;
9893 ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
9894 spin_lock_bh(&ar->data_lock);
9895 list_del(&arvif->list);
9896 spin_unlock_bh(&ar->data_lock);
9897
9898 err:
9899 arvif->ar = NULL;
9900 return ret;
9901 }
9902
ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif * arvif)9903 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif)
9904 {
9905 struct ath12k_key_conf *key_conf, *tmp;
9906 struct ath12k_vif *ahvif = arvif->ahvif;
9907 struct ath12k_hw *ah = ahvif->ah;
9908 struct ath12k_sta *ahsta;
9909 struct ath12k_link_sta *arsta;
9910 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9911 int ret;
9912
9913 lockdep_assert_wiphy(ah->hw->wiphy);
9914
9915 list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
9916 arsta = NULL;
9917 if (key_conf->sta) {
9918 ahsta = ath12k_sta_to_ahsta(key_conf->sta);
9919 arsta = wiphy_dereference(ah->hw->wiphy,
9920 ahsta->link[arvif->link_id]);
9921 if (!arsta)
9922 goto free_cache;
9923 }
9924
9925 ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd,
9926 arvif, arsta,
9927 key_conf->key);
9928 if (ret)
9929 ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n",
9930 arvif->vdev_id, ret);
9931 free_cache:
9932 list_del(&key_conf->list);
9933 kfree(key_conf);
9934 }
9935 }
9936
ath12k_mac_vif_cache_flush(struct ath12k * ar,struct ath12k_link_vif * arvif)9937 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif)
9938 {
9939 struct ath12k_vif *ahvif = arvif->ahvif;
9940 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9941 struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9942 struct ath12k_base *ab = ar->ab;
9943 struct ieee80211_bss_conf *link_conf;
9944
9945 int ret;
9946
9947 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9948
9949 if (!cache)
9950 return;
9951
9952 if (cache->tx_conf.changed) {
9953 ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac,
9954 &cache->tx_conf.tx_queue_params);
9955 if (ret)
9956 ath12k_warn(ab,
9957 "unable to apply tx config parameters to vdev %d\n",
9958 ret);
9959 }
9960
9961 if (cache->bss_conf_changed) {
9962 link_conf = ath12k_mac_get_link_bss_conf(arvif);
9963 if (!link_conf) {
9964 ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n",
9965 vif->addr, arvif->link_id);
9966 return;
9967 }
9968 ath12k_mac_bss_info_changed(ar, arvif, link_conf,
9969 cache->bss_conf_changed);
9970 }
9971
9972 if (!list_empty(&cache->key_conf.list))
9973 ath12k_mac_vif_flush_key_cache(arvif);
9974
9975 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
9976 }
9977
ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)9978 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
9979 struct ath12k_link_vif *arvif,
9980 struct ieee80211_chanctx_conf *ctx)
9981 {
9982 struct ath12k_vif *ahvif = arvif->ahvif;
9983 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9984 struct ath12k_link_vif *scan_arvif;
9985 struct ath12k_hw *ah = hw->priv;
9986 struct ath12k *ar;
9987 struct ath12k_base *ab;
9988 u8 link_id = arvif->link_id, scan_link_id;
9989 unsigned long scan_link_map;
9990 int ret;
9991
9992 lockdep_assert_wiphy(hw->wiphy);
9993
9994 if (ah->num_radio == 1)
9995 ar = ah->radio;
9996 else if (ctx)
9997 ar = ath12k_get_ar_by_ctx(hw, ctx);
9998 else
9999 return NULL;
10000
10001 if (!ar)
10002 return NULL;
10003
10004 /* cleanup the scan vdev if we are done scan on that ar
10005 * and now we want to create for actual usage.
10006 */
10007 if (ieee80211_vif_is_mld(vif)) {
10008 scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
10009 for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) {
10010 scan_arvif = wiphy_dereference(hw->wiphy,
10011 ahvif->link[scan_link_id]);
10012 if (scan_arvif && scan_arvif->ar == ar) {
10013 ar->scan.arvif = NULL;
10014 ath12k_mac_remove_link_interface(hw, scan_arvif);
10015 ath12k_mac_unassign_link_vif(scan_arvif);
10016 break;
10017 }
10018 }
10019 }
10020
10021 if (arvif->ar) {
10022 /* This is not expected really */
10023 if (WARN_ON(!arvif->is_created)) {
10024 arvif->ar = NULL;
10025 return NULL;
10026 }
10027
10028 if (ah->num_radio == 1)
10029 return arvif->ar;
10030
10031 /* This can happen as scan vdev gets created during multiple scans
10032 * across different radios before a vdev is brought up in
10033 * a certain radio.
10034 */
10035 if (ar != arvif->ar) {
10036 if (WARN_ON(arvif->is_started))
10037 return NULL;
10038
10039 ath12k_mac_remove_link_interface(hw, arvif);
10040 ath12k_mac_unassign_link_vif(arvif);
10041 }
10042 }
10043
10044 ab = ar->ab;
10045
10046 /* Assign arvif again here since previous radio switch block
10047 * would've unassigned and cleared it.
10048 */
10049 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
10050 if (vif->type == NL80211_IFTYPE_AP &&
10051 ar->num_peers > (ar->max_num_peers - 1)) {
10052 ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
10053 goto unlock;
10054 }
10055
10056 if (arvif->is_created)
10057 goto flush;
10058
10059 if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
10060 ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
10061 TARGET_NUM_VDEVS(ab));
10062 goto unlock;
10063 }
10064
10065 ret = ath12k_mac_vdev_create(ar, arvif);
10066 if (ret) {
10067 ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
10068 goto unlock;
10069 }
10070
10071 flush:
10072 /* If the vdev is created during channel assign and not during
10073 * add_interface(), Apply any parameters for the vdev which were received
10074 * after add_interface, corresponding to this vif.
10075 */
10076 ath12k_mac_vif_cache_flush(ar, arvif);
10077 unlock:
10078 return arvif->ar;
10079 }
10080
ath12k_mac_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10081 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
10082 struct ieee80211_vif *vif)
10083 {
10084 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10085 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10086 struct ath12k_reg_info *reg_info;
10087 struct ath12k_link_vif *arvif;
10088 struct ath12k_base *ab;
10089 struct ath12k *ar;
10090 int i;
10091
10092 lockdep_assert_wiphy(hw->wiphy);
10093
10094 memset(ahvif, 0, sizeof(*ahvif));
10095
10096 ahvif->ah = ah;
10097 ahvif->vif = vif;
10098 arvif = &ahvif->deflink;
10099
10100 ath12k_mac_init_arvif(ahvif, arvif, -1);
10101
10102 /* Allocate Default Queue now and reassign during actual vdev create */
10103 vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE;
10104 for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10105 vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE;
10106
10107 vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
10108
10109 ath12k_mac_determine_vdev_type(vif, ahvif);
10110
10111 for_each_ar(ah, ar, i) {
10112 if (!ath12k_wmi_supports_6ghz_cc_ext(ar))
10113 continue;
10114
10115 ab = ar->ab;
10116 reg_info = ab->reg_info[ar->pdev_idx];
10117 ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n");
10118 ah->regd_updated = false;
10119 ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type,
10120 IEEE80211_REG_UNSET_AP);
10121 break;
10122 }
10123
10124 /* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver
10125 * will not know if this interface is an ML vif at this point.
10126 */
10127 return 0;
10128 }
10129
ath12k_mac_vif_unref(struct ath12k_dp * dp,struct ieee80211_vif * vif)10130 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
10131 {
10132 struct ath12k_tx_desc_info *tx_desc_info;
10133 struct ath12k_skb_cb *skb_cb;
10134 struct sk_buff *skb;
10135 int i;
10136
10137 for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
10138 spin_lock_bh(&dp->tx_desc_lock[i]);
10139
10140 list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
10141 list) {
10142 skb = tx_desc_info->skb;
10143 if (!skb)
10144 continue;
10145
10146 skb_cb = ATH12K_SKB_CB(skb);
10147 if (skb_cb->vif == vif)
10148 skb_cb->vif = NULL;
10149 }
10150
10151 spin_unlock_bh(&dp->tx_desc_lock[i]);
10152 }
10153 }
10154
ath12k_mac_vdev_delete(struct ath12k * ar,struct ath12k_link_vif * arvif)10155 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
10156 {
10157 struct ath12k_vif *ahvif = arvif->ahvif;
10158 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10159 struct ath12k_base *ab = ar->ab;
10160 unsigned long time_left;
10161 int ret;
10162
10163 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10164
10165 reinit_completion(&ar->vdev_delete_done);
10166
10167 ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10168 if (ret) {
10169 ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
10170 arvif->vdev_id, ret);
10171 goto err_vdev_del;
10172 }
10173
10174 time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
10175 ATH12K_VDEV_DELETE_TIMEOUT_HZ);
10176 if (time_left == 0) {
10177 ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
10178 goto err_vdev_del;
10179 }
10180
10181 ab->free_vdev_map |= 1LL << arvif->vdev_id;
10182 ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10183 ar->num_created_vdevs--;
10184
10185 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10186 ar->monitor_vdev_id = -1;
10187 ar->monitor_vdev_created = false;
10188 }
10189
10190 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
10191 vif->addr, arvif->vdev_id);
10192
10193 err_vdev_del:
10194 spin_lock_bh(&ar->data_lock);
10195 list_del(&arvif->list);
10196 spin_unlock_bh(&ar->data_lock);
10197
10198 ath12k_peer_cleanup(ar, arvif->vdev_id);
10199 ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10200
10201 idr_for_each(&ar->txmgmt_idr,
10202 ath12k_mac_vif_txmgmt_idr_remove, vif);
10203
10204 ath12k_mac_vif_unref(&ab->dp, vif);
10205 ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
10206
10207 /* Recalc txpower for remaining vdev */
10208 ath12k_mac_txpower_recalc(ar);
10209
10210 /* TODO: recal traffic pause state based on the available vdevs */
10211 arvif->is_created = false;
10212 arvif->ar = NULL;
10213
10214 return ret;
10215 }
10216
ath12k_mac_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10217 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
10218 struct ieee80211_vif *vif)
10219 {
10220 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10221 struct ath12k_link_vif *arvif;
10222 struct ath12k *ar;
10223 u8 link_id;
10224
10225 lockdep_assert_wiphy(hw->wiphy);
10226
10227 for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) {
10228 /* if we cached some config but never received assign chanctx,
10229 * free the allocated cache.
10230 */
10231 ath12k_ahvif_put_link_cache(ahvif, link_id);
10232 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
10233 if (!arvif || !arvif->is_created)
10234 continue;
10235
10236 ar = arvif->ar;
10237
10238 /* Scan abortion is in progress since before this, cancel_hw_scan()
10239 * is expected to be executed. Since link is anyways going to be removed
10240 * now, just cancel the worker and send the scan aborted to user space
10241 */
10242 if (ar->scan.arvif == arvif) {
10243 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
10244
10245 spin_lock_bh(&ar->data_lock);
10246 ar->scan.arvif = NULL;
10247 if (!ar->scan.is_roc) {
10248 struct cfg80211_scan_info info = {
10249 .aborted = true,
10250 };
10251
10252 ath12k_mac_scan_send_complete(ar, &info);
10253 }
10254
10255 ar->scan.state = ATH12K_SCAN_IDLE;
10256 ar->scan_channel = NULL;
10257 ar->scan.roc_freq = 0;
10258 spin_unlock_bh(&ar->data_lock);
10259 }
10260
10261 ath12k_mac_remove_link_interface(hw, arvif);
10262 ath12k_mac_unassign_link_vif(arvif);
10263 }
10264 }
10265
10266 /* FIXME: Has to be verified. */
10267 #define SUPPORTED_FILTERS \
10268 (FIF_ALLMULTI | \
10269 FIF_CONTROL | \
10270 FIF_PSPOLL | \
10271 FIF_OTHER_BSS | \
10272 FIF_BCN_PRBRESP_PROMISC | \
10273 FIF_PROBE_REQ | \
10274 FIF_FCSFAIL)
10275
ath12k_mac_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)10276 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
10277 unsigned int changed_flags,
10278 unsigned int *total_flags,
10279 u64 multicast)
10280 {
10281 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10282 struct ath12k *ar;
10283
10284 lockdep_assert_wiphy(hw->wiphy);
10285
10286 ar = ath12k_ah_to_ar(ah, 0);
10287
10288 *total_flags &= SUPPORTED_FILTERS;
10289 ar->filter_flags = *total_flags;
10290 }
10291
ath12k_mac_op_get_antenna(struct ieee80211_hw * hw,int radio_idx,u32 * tx_ant,u32 * rx_ant)10292 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
10293 u32 *tx_ant, u32 *rx_ant)
10294 {
10295 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10296 int antennas_rx = 0, antennas_tx = 0;
10297 struct ath12k *ar;
10298 int i;
10299
10300 lockdep_assert_wiphy(hw->wiphy);
10301
10302 for_each_ar(ah, ar, i) {
10303 antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
10304 antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
10305 }
10306
10307 *tx_ant = antennas_tx;
10308 *rx_ant = antennas_rx;
10309
10310 return 0;
10311 }
10312
ath12k_mac_op_set_antenna(struct ieee80211_hw * hw,int radio_idx,u32 tx_ant,u32 rx_ant)10313 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
10314 u32 tx_ant, u32 rx_ant)
10315 {
10316 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10317 struct ath12k *ar;
10318 int ret = 0;
10319 int i;
10320
10321 lockdep_assert_wiphy(hw->wiphy);
10322
10323 for_each_ar(ah, ar, i) {
10324 ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
10325 if (ret)
10326 break;
10327 }
10328
10329 return ret;
10330 }
10331
ath12k_mac_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params,u8 link_id)10332 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw,
10333 struct ieee80211_vif *vif,
10334 struct ieee80211_ampdu_params *params,
10335 u8 link_id)
10336 {
10337 struct ath12k *ar;
10338 int ret = -EINVAL;
10339
10340 lockdep_assert_wiphy(hw->wiphy);
10341
10342 ar = ath12k_get_ar_by_vif(hw, vif, link_id);
10343 if (!ar)
10344 return -EINVAL;
10345
10346 switch (params->action) {
10347 case IEEE80211_AMPDU_RX_START:
10348 ret = ath12k_dp_rx_ampdu_start(ar, params, link_id);
10349 break;
10350 case IEEE80211_AMPDU_RX_STOP:
10351 ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id);
10352 break;
10353 case IEEE80211_AMPDU_TX_START:
10354 case IEEE80211_AMPDU_TX_STOP_CONT:
10355 case IEEE80211_AMPDU_TX_STOP_FLUSH:
10356 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10357 case IEEE80211_AMPDU_TX_OPERATIONAL:
10358 /* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
10359 * Tx aggregation requests.
10360 */
10361 ret = -EOPNOTSUPP;
10362 break;
10363 }
10364
10365 if (ret)
10366 ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n",
10367 params->action, vif->addr, link_id, ret);
10368
10369 return ret;
10370 }
10371
ath12k_mac_op_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)10372 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
10373 struct ieee80211_vif *vif,
10374 struct ieee80211_ampdu_params *params)
10375 {
10376 struct ieee80211_sta *sta = params->sta;
10377 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
10378 unsigned long links_map = ahsta->links_map;
10379 int ret = -EINVAL;
10380 u8 link_id;
10381
10382 lockdep_assert_wiphy(hw->wiphy);
10383
10384 if (WARN_ON(!links_map))
10385 return ret;
10386
10387 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10388 ret = ath12k_mac_ampdu_action(hw, vif, params, link_id);
10389 if (ret)
10390 return ret;
10391 }
10392
10393 return 0;
10394 }
10395
ath12k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10396 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
10397 struct ieee80211_chanctx_conf *ctx)
10398 {
10399 struct ath12k *ar;
10400 struct ath12k_base *ab;
10401
10402 lockdep_assert_wiphy(hw->wiphy);
10403
10404 ar = ath12k_get_ar_by_ctx(hw, ctx);
10405 if (!ar)
10406 return -EINVAL;
10407
10408 ab = ar->ab;
10409
10410 ath12k_dbg(ab, ATH12K_DBG_MAC,
10411 "mac chanctx add freq %u width %d ptr %p\n",
10412 ctx->def.chan->center_freq, ctx->def.width, ctx);
10413
10414 spin_lock_bh(&ar->data_lock);
10415 /* TODO: In case of multiple channel context, populate rx_channel from
10416 * Rx PPDU desc information.
10417 */
10418 ar->rx_channel = ctx->def.chan;
10419 spin_unlock_bh(&ar->data_lock);
10420 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10421
10422 return 0;
10423 }
10424
ath12k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10425 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
10426 struct ieee80211_chanctx_conf *ctx)
10427 {
10428 struct ath12k *ar;
10429 struct ath12k_base *ab;
10430
10431 lockdep_assert_wiphy(hw->wiphy);
10432
10433 ar = ath12k_get_ar_by_ctx(hw, ctx);
10434 if (!ar)
10435 return;
10436
10437 ab = ar->ab;
10438
10439 ath12k_dbg(ab, ATH12K_DBG_MAC,
10440 "mac chanctx remove freq %u width %d ptr %p\n",
10441 ctx->def.chan->center_freq, ctx->def.width, ctx);
10442
10443 spin_lock_bh(&ar->data_lock);
10444 /* TODO: In case of there is one more channel context left, populate
10445 * rx_channel with the channel of that remaining channel context.
10446 */
10447 ar->rx_channel = NULL;
10448 spin_unlock_bh(&ar->data_lock);
10449 ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10450 }
10451
10452 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)10453 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
10454 enum wmi_phy_mode mode,
10455 enum nl80211_band band,
10456 enum nl80211_iftype type)
10457 {
10458 struct ieee80211_sta_eht_cap *eht_cap = NULL;
10459 enum wmi_phy_mode down_mode;
10460 int n = ar->mac.sbands[band].n_iftype_data;
10461 int i;
10462 struct ieee80211_sband_iftype_data *data;
10463
10464 if (mode < MODE_11BE_EHT20)
10465 return mode;
10466
10467 data = ar->mac.iftype[band];
10468 for (i = 0; i < n; i++) {
10469 if (data[i].types_mask & BIT(type)) {
10470 eht_cap = &data[i].eht_cap;
10471 break;
10472 }
10473 }
10474
10475 if (eht_cap && eht_cap->has_eht)
10476 return mode;
10477
10478 switch (mode) {
10479 case MODE_11BE_EHT20:
10480 down_mode = MODE_11AX_HE20;
10481 break;
10482 case MODE_11BE_EHT40:
10483 down_mode = MODE_11AX_HE40;
10484 break;
10485 case MODE_11BE_EHT80:
10486 down_mode = MODE_11AX_HE80;
10487 break;
10488 case MODE_11BE_EHT80_80:
10489 down_mode = MODE_11AX_HE80_80;
10490 break;
10491 case MODE_11BE_EHT160:
10492 case MODE_11BE_EHT160_160:
10493 case MODE_11BE_EHT320:
10494 down_mode = MODE_11AX_HE160;
10495 break;
10496 case MODE_11BE_EHT20_2G:
10497 down_mode = MODE_11AX_HE20_2G;
10498 break;
10499 case MODE_11BE_EHT40_2G:
10500 down_mode = MODE_11AX_HE40_2G;
10501 break;
10502 default:
10503 down_mode = mode;
10504 break;
10505 }
10506
10507 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10508 "mac vdev start phymode %s downgrade to %s\n",
10509 ath12k_mac_phymode_str(mode),
10510 ath12k_mac_phymode_str(down_mode));
10511
10512 return down_mode;
10513 }
10514
10515 static void
ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif * arvif,struct wmi_ml_arg * ml_arg)10516 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif,
10517 struct wmi_ml_arg *ml_arg)
10518 {
10519 struct ath12k_vif *ahvif = arvif->ahvif;
10520 struct wmi_ml_partner_info *partner_info;
10521 struct ieee80211_bss_conf *link_conf;
10522 struct ath12k_link_vif *arvif_p;
10523 unsigned long links;
10524 u8 link_id;
10525
10526 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10527
10528 if (!ath12k_mac_is_ml_arvif(arvif))
10529 return;
10530
10531 if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS)
10532 return;
10533
10534 ml_arg->enabled = true;
10535
10536 /* Driver always add a new link via VDEV START, FW takes
10537 * care of internally adding this link to existing
10538 * link vdevs which are advertised as partners below
10539 */
10540 ml_arg->link_add = true;
10541
10542 ml_arg->assoc_link = arvif->is_sta_assoc_link;
10543
10544 partner_info = ml_arg->partner_info;
10545
10546 links = ahvif->links_map;
10547 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
10548 arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10549
10550 if (WARN_ON(!arvif_p))
10551 continue;
10552
10553 if (arvif == arvif_p)
10554 continue;
10555
10556 if (!arvif_p->is_created)
10557 continue;
10558
10559 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10560 ahvif->vif->link_conf[arvif_p->link_id]);
10561
10562 if (!link_conf)
10563 continue;
10564
10565 partner_info->vdev_id = arvif_p->vdev_id;
10566 partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id;
10567 ether_addr_copy(partner_info->addr, link_conf->addr);
10568 ml_arg->num_partner_links++;
10569 partner_info++;
10570 }
10571 }
10572
10573 static int
ath12k_mac_vdev_start_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx,bool restart)10574 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif,
10575 struct ieee80211_chanctx_conf *ctx,
10576 bool restart)
10577 {
10578 struct ath12k *ar = arvif->ar;
10579 struct ath12k_base *ab = ar->ab;
10580 struct wmi_vdev_start_req_arg arg = {};
10581 const struct cfg80211_chan_def *chandef = &ctx->def;
10582 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10583 struct ath12k_vif *ahvif = arvif->ahvif;
10584 struct ieee80211_bss_conf *link_conf;
10585 unsigned int dfs_cac_time;
10586 int ret;
10587
10588 lockdep_assert_wiphy(hw->wiphy);
10589
10590 link_conf = ath12k_mac_get_link_bss_conf(arvif);
10591 if (!link_conf) {
10592 ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n",
10593 ahvif->vif->addr, arvif->link_id);
10594 return -ENOLINK;
10595 }
10596
10597 reinit_completion(&ar->vdev_setup_done);
10598
10599 arg.vdev_id = arvif->vdev_id;
10600 arg.dtim_period = arvif->dtim_period;
10601 arg.bcn_intval = arvif->beacon_interval;
10602 arg.punct_bitmap = ~arvif->punct_bitmap;
10603
10604 arg.freq = chandef->chan->center_freq;
10605 arg.band_center_freq1 = chandef->center_freq1;
10606 arg.band_center_freq2 = chandef->center_freq2;
10607 arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
10608
10609 arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
10610 chandef->chan->band,
10611 ahvif->vif->type);
10612 arg.min_power = 0;
10613 arg.max_power = chandef->chan->max_power;
10614 arg.max_reg_power = chandef->chan->max_reg_power;
10615 arg.max_antenna_gain = chandef->chan->max_antenna_gain;
10616
10617 arg.pref_tx_streams = ar->num_tx_chains;
10618 arg.pref_rx_streams = ar->num_rx_chains;
10619
10620 arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
10621 arg.mbssid_tx_vdev_id = 0;
10622 if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
10623 ar->ab->wmi_ab.svc_map)) {
10624 ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
10625 &arg.mbssid_flags,
10626 &arg.mbssid_tx_vdev_id);
10627 if (ret)
10628 return ret;
10629 }
10630
10631 if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10632 arg.ssid = ahvif->u.ap.ssid;
10633 arg.ssid_len = ahvif->u.ap.ssid_len;
10634 arg.hidden_ssid = ahvif->u.ap.hidden_ssid;
10635
10636 /* For now allow DFS for AP mode */
10637 arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
10638
10639 arg.freq2_radar = ctx->radar_enabled;
10640
10641 arg.passive = arg.chan_radar;
10642
10643 spin_lock_bh(&ab->base_lock);
10644 arg.regdomain = ar->ab->dfs_region;
10645 spin_unlock_bh(&ab->base_lock);
10646
10647 /* TODO: Notify if secondary 80Mhz also needs radar detection */
10648 }
10649
10650 arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
10651
10652 if (!restart)
10653 ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml);
10654
10655 ath12k_dbg(ab, ATH12K_DBG_MAC,
10656 "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
10657 arg.vdev_id, arg.freq,
10658 ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
10659
10660 ret = ath12k_wmi_vdev_start(ar, &arg, restart);
10661 if (ret) {
10662 ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
10663 restart ? "restart" : "start", arg.vdev_id);
10664 return ret;
10665 }
10666
10667 ret = ath12k_mac_vdev_setup_sync(ar);
10668 if (ret) {
10669 ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
10670 arg.vdev_id, restart ? "restart" : "start", ret);
10671 return ret;
10672 }
10673
10674 /* TODO: For now we only set TPC power here. However when
10675 * channel changes, say CSA, it should be updated again.
10676 */
10677 if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) {
10678 ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx);
10679 ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
10680 &arvif->reg_tpc_info);
10681 }
10682
10683 ar->num_started_vdevs++;
10684 ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
10685 ahvif->vif->addr, arvif->vdev_id);
10686
10687 /* Enable CAC Running Flag in the driver by checking all sub-channel's DFS
10688 * state as NL80211_DFS_USABLE which indicates CAC needs to be
10689 * done before channel usage. This flag is used to drop rx packets.
10690 * during CAC.
10691 */
10692 /* TODO: Set the flag for other interface types as required */
10693 if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
10694 cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) {
10695 set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
10696 dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef);
10697
10698 ath12k_dbg(ab, ATH12K_DBG_MAC,
10699 "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
10700 dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id);
10701 }
10702
10703 ret = ath12k_mac_set_txbf_conf(arvif);
10704 if (ret)
10705 ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
10706 arvif->vdev_id, ret);
10707
10708 return 0;
10709 }
10710
ath12k_mac_vdev_start(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10711 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif,
10712 struct ieee80211_chanctx_conf *ctx)
10713 {
10714 return ath12k_mac_vdev_start_restart(arvif, ctx, false);
10715 }
10716
ath12k_mac_vdev_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10717 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif,
10718 struct ieee80211_chanctx_conf *ctx)
10719 {
10720 return ath12k_mac_vdev_start_restart(arvif, ctx, true);
10721 }
10722
10723 struct ath12k_mac_change_chanctx_arg {
10724 struct ieee80211_chanctx_conf *ctx;
10725 struct ieee80211_vif_chanctx_switch *vifs;
10726 int n_vifs;
10727 int next_vif;
10728 struct ath12k *ar;
10729 };
10730
10731 static void
ath12k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10732 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
10733 struct ieee80211_vif *vif)
10734 {
10735 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10736 struct ath12k_mac_change_chanctx_arg *arg = data;
10737 struct ieee80211_bss_conf *link_conf;
10738 struct ath12k_link_vif *arvif;
10739 unsigned long links_map;
10740 u8 link_id;
10741
10742 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10743
10744 links_map = ahvif->links_map;
10745 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10746 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10747 if (WARN_ON(!arvif))
10748 continue;
10749
10750 if (!arvif->is_created || arvif->ar != arg->ar)
10751 continue;
10752
10753 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10754 vif->link_conf[link_id]);
10755 if (WARN_ON(!link_conf))
10756 continue;
10757
10758 if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx)
10759 continue;
10760
10761 arg->n_vifs++;
10762 }
10763 }
10764
10765 static void
ath12k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10766 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
10767 struct ieee80211_vif *vif)
10768 {
10769 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10770 struct ath12k_mac_change_chanctx_arg *arg = data;
10771 struct ieee80211_bss_conf *link_conf;
10772 struct ieee80211_chanctx_conf *ctx;
10773 struct ath12k_link_vif *arvif;
10774 unsigned long links_map;
10775 u8 link_id;
10776
10777 lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10778
10779 links_map = ahvif->links_map;
10780 for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10781 arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10782 if (WARN_ON(!arvif))
10783 continue;
10784
10785 if (!arvif->is_created || arvif->ar != arg->ar)
10786 continue;
10787
10788 link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10789 vif->link_conf[arvif->link_id]);
10790 if (WARN_ON(!link_conf))
10791 continue;
10792
10793 ctx = rcu_access_pointer(link_conf->chanctx_conf);
10794 if (ctx != arg->ctx)
10795 continue;
10796
10797 if (WARN_ON(arg->next_vif == arg->n_vifs))
10798 return;
10799
10800 arg->vifs[arg->next_vif].vif = vif;
10801 arg->vifs[arg->next_vif].old_ctx = ctx;
10802 arg->vifs[arg->next_vif].new_ctx = ctx;
10803 arg->vifs[arg->next_vif].link_conf = link_conf;
10804 arg->next_vif++;
10805 }
10806 }
10807
ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)10808 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
10809 {
10810 switch (width) {
10811 case NL80211_CHAN_WIDTH_20:
10812 return WMI_CHAN_WIDTH_20;
10813 case NL80211_CHAN_WIDTH_40:
10814 return WMI_CHAN_WIDTH_40;
10815 case NL80211_CHAN_WIDTH_80:
10816 return WMI_CHAN_WIDTH_80;
10817 case NL80211_CHAN_WIDTH_160:
10818 return WMI_CHAN_WIDTH_160;
10819 case NL80211_CHAN_WIDTH_80P80:
10820 return WMI_CHAN_WIDTH_80P80;
10821 case NL80211_CHAN_WIDTH_5:
10822 return WMI_CHAN_WIDTH_5;
10823 case NL80211_CHAN_WIDTH_10:
10824 return WMI_CHAN_WIDTH_10;
10825 case NL80211_CHAN_WIDTH_320:
10826 return WMI_CHAN_WIDTH_320;
10827 default:
10828 WARN_ON(1);
10829 return WMI_CHAN_WIDTH_20;
10830 }
10831 }
10832
ath12k_mac_update_peer_puncturing_width(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def def)10833 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
10834 struct ath12k_link_vif *arvif,
10835 struct cfg80211_chan_def def)
10836 {
10837 u32 param_id, param_value;
10838 int ret;
10839
10840 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
10841 return 0;
10842
10843 param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
10844 param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
10845 u32_encode_bits((~def.punctured),
10846 WMI_PEER_PUNCTURE_BITMAP);
10847
10848 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10849 "punctured bitmap %02x width %d vdev %d\n",
10850 def.punctured, def.width, arvif->vdev_id);
10851
10852 ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
10853 arvif->vdev_id, param_id,
10854 param_value);
10855
10856 return ret;
10857 }
10858
10859 static void
ath12k_mac_update_vif_chan(struct ath12k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)10860 ath12k_mac_update_vif_chan(struct ath12k *ar,
10861 struct ieee80211_vif_chanctx_switch *vifs,
10862 int n_vifs)
10863 {
10864 struct ath12k_wmi_vdev_up_params params = {};
10865 struct ath12k_link_vif *arvif;
10866 struct ieee80211_bss_conf *link_conf;
10867 struct ath12k_base *ab = ar->ab;
10868 struct ieee80211_vif *vif;
10869 struct ath12k_vif *ahvif;
10870 u8 link_id;
10871 int ret;
10872 int i;
10873 bool monitor_vif = false;
10874
10875 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10876
10877 for (i = 0; i < n_vifs; i++) {
10878 vif = vifs[i].vif;
10879 ahvif = ath12k_vif_to_ahvif(vif);
10880 link_conf = vifs[i].link_conf;
10881 link_id = link_conf->link_id;
10882 arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
10883 ahvif->link[link_id]);
10884
10885 if (vif->type == NL80211_IFTYPE_MONITOR) {
10886 monitor_vif = true;
10887 continue;
10888 }
10889
10890 ath12k_dbg(ab, ATH12K_DBG_MAC,
10891 "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
10892 arvif->vdev_id,
10893 vifs[i].old_ctx->def.chan->center_freq,
10894 vifs[i].new_ctx->def.chan->center_freq,
10895 vifs[i].old_ctx->def.width,
10896 vifs[i].new_ctx->def.width);
10897
10898 if (WARN_ON(!arvif->is_started))
10899 continue;
10900
10901 arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
10902
10903 /* Firmware expect vdev_restart only if vdev is up.
10904 * If vdev is down then it expect vdev_stop->vdev_start.
10905 */
10906 if (arvif->is_up) {
10907 ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
10908 if (ret) {
10909 ath12k_warn(ab, "failed to restart vdev %d: %d\n",
10910 arvif->vdev_id, ret);
10911 continue;
10912 }
10913 } else {
10914 ret = ath12k_mac_vdev_stop(arvif);
10915 if (ret) {
10916 ath12k_warn(ab, "failed to stop vdev %d: %d\n",
10917 arvif->vdev_id, ret);
10918 continue;
10919 }
10920
10921 ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
10922 if (ret)
10923 ath12k_warn(ab, "failed to start vdev %d: %d\n",
10924 arvif->vdev_id, ret);
10925 continue;
10926 }
10927
10928 ret = ath12k_mac_setup_bcn_tmpl(arvif);
10929 if (ret)
10930 ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
10931 ret);
10932
10933 memset(¶ms, 0, sizeof(params));
10934 params.vdev_id = arvif->vdev_id;
10935 params.aid = ahvif->aid;
10936 params.bssid = arvif->bssid;
10937 params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
10938 if (params.tx_bssid) {
10939 params.nontx_profile_idx = link_conf->bssid_index;
10940 params.nontx_profile_cnt = 1 << link_conf->bssid_indicator;
10941 }
10942 ret = ath12k_wmi_vdev_up(arvif->ar, ¶ms);
10943 if (ret) {
10944 ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
10945 arvif->vdev_id, ret);
10946 continue;
10947 }
10948
10949 ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
10950 vifs[i].new_ctx->def);
10951 if (ret) {
10952 ath12k_warn(ar->ab,
10953 "failed to update puncturing bitmap %02x and width %d: %d\n",
10954 vifs[i].new_ctx->def.punctured,
10955 vifs[i].new_ctx->def.width, ret);
10956 continue;
10957 }
10958 }
10959
10960 /* Restart the internal monitor vdev on new channel */
10961 if (!monitor_vif && ar->monitor_vdev_created) {
10962 if (!ath12k_mac_monitor_stop(ar))
10963 ath12k_mac_monitor_start(ar);
10964 }
10965 }
10966
10967 static void
ath12k_mac_update_active_vif_chan(struct ath12k * ar,struct ieee80211_chanctx_conf * ctx)10968 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
10969 struct ieee80211_chanctx_conf *ctx)
10970 {
10971 struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
10972 struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10973
10974 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10975
10976 ieee80211_iterate_active_interfaces_atomic(hw,
10977 IEEE80211_IFACE_ITER_NORMAL,
10978 ath12k_mac_change_chanctx_cnt_iter,
10979 &arg);
10980 if (arg.n_vifs == 0)
10981 return;
10982
10983 arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
10984 if (!arg.vifs)
10985 return;
10986
10987 ieee80211_iterate_active_interfaces_atomic(hw,
10988 IEEE80211_IFACE_ITER_NORMAL,
10989 ath12k_mac_change_chanctx_fill_iter,
10990 &arg);
10991
10992 ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
10993
10994 kfree(arg.vifs);
10995 }
10996
ath12k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)10997 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
10998 struct ieee80211_chanctx_conf *ctx,
10999 u32 changed)
11000 {
11001 struct ath12k *ar;
11002 struct ath12k_base *ab;
11003
11004 lockdep_assert_wiphy(hw->wiphy);
11005
11006 ar = ath12k_get_ar_by_ctx(hw, ctx);
11007 if (!ar)
11008 return;
11009
11010 ab = ar->ab;
11011
11012 ath12k_dbg(ab, ATH12K_DBG_MAC,
11013 "mac chanctx change freq %u width %d ptr %p changed %x\n",
11014 ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
11015
11016 /* This shouldn't really happen because channel switching should use
11017 * switch_vif_chanctx().
11018 */
11019 if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
11020 return;
11021
11022 if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
11023 changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
11024 changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
11025 ath12k_mac_update_active_vif_chan(ar, ctx);
11026
11027 /* TODO: Recalc radar detection */
11028 }
11029
ath12k_start_vdev_delay(struct ath12k * ar,struct ath12k_link_vif * arvif)11030 static int ath12k_start_vdev_delay(struct ath12k *ar,
11031 struct ath12k_link_vif *arvif)
11032 {
11033 struct ath12k_base *ab = ar->ab;
11034 struct ath12k_vif *ahvif = arvif->ahvif;
11035 struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
11036 struct ieee80211_chanctx_conf *chanctx;
11037 struct ieee80211_bss_conf *link_conf;
11038 int ret;
11039
11040 if (WARN_ON(arvif->is_started))
11041 return -EBUSY;
11042
11043 link_conf = ath12k_mac_get_link_bss_conf(arvif);
11044 if (!link_conf) {
11045 ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id);
11046 return -EINVAL;
11047 }
11048
11049 chanctx = wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy,
11050 link_conf->chanctx_conf);
11051 ret = ath12k_mac_vdev_start(arvif, chanctx);
11052 if (ret) {
11053 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11054 arvif->vdev_id, vif->addr,
11055 chanctx->def.chan->center_freq, ret);
11056 return ret;
11057 }
11058
11059 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11060 ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
11061 if (ret) {
11062 ath12k_warn(ab, "failed put monitor up: %d\n", ret);
11063 return ret;
11064 }
11065 }
11066
11067 arvif->is_started = true;
11068
11069 /* TODO: Setup ps and cts/rts protection */
11070 return 0;
11071 }
11072
ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def * chan_def)11073 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
11074 {
11075 if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
11076 switch (chan_def->width) {
11077 case NL80211_CHAN_WIDTH_20:
11078 return 1;
11079 case NL80211_CHAN_WIDTH_40:
11080 return 2;
11081 case NL80211_CHAN_WIDTH_80:
11082 return 4;
11083 case NL80211_CHAN_WIDTH_160:
11084 return 8;
11085 case NL80211_CHAN_WIDTH_320:
11086 return 16;
11087 default:
11088 return 1;
11089 }
11090 } else {
11091 switch (chan_def->width) {
11092 case NL80211_CHAN_WIDTH_20:
11093 return 1;
11094 case NL80211_CHAN_WIDTH_40:
11095 return 2;
11096 case NL80211_CHAN_WIDTH_80:
11097 return 3;
11098 case NL80211_CHAN_WIDTH_160:
11099 return 4;
11100 case NL80211_CHAN_WIDTH_320:
11101 return 5;
11102 default:
11103 return 1;
11104 }
11105 }
11106 }
11107
ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def * chan_def)11108 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
11109 {
11110 u16 diff_seq;
11111
11112 /* It is to get the lowest channel number's center frequency of the chan.
11113 * For example,
11114 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
11115 * with center frequency 5955, its diff is 5965 - 5955 = 10.
11116 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
11117 * with center frequency 5955, its diff is 5985 - 5955 = 30.
11118 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
11119 * with center frequency 5955, its diff is 6025 - 5955 = 70.
11120 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1
11121 * with center frequency 5955, its diff is 6105 - 5955 = 70.
11122 */
11123 switch (chan_def->width) {
11124 case NL80211_CHAN_WIDTH_320:
11125 diff_seq = 150;
11126 break;
11127 case NL80211_CHAN_WIDTH_160:
11128 diff_seq = 70;
11129 break;
11130 case NL80211_CHAN_WIDTH_80:
11131 diff_seq = 30;
11132 break;
11133 case NL80211_CHAN_WIDTH_40:
11134 diff_seq = 10;
11135 break;
11136 default:
11137 diff_seq = 0;
11138 }
11139
11140 return chan_def->center_freq1 - diff_seq;
11141 }
11142
ath12k_mac_get_seg_freq(struct cfg80211_chan_def * chan_def,u16 start_seq,u8 seq)11143 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
11144 u16 start_seq, u8 seq)
11145 {
11146 u16 seg_seq;
11147
11148 /* It is to get the center frequency of the specific bandwidth.
11149 * start_seq means the lowest channel number's center frequency.
11150 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz.
11151 * For example,
11152 * lowest channel is 1, its center frequency 5955,
11153 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
11154 * lowest channel is 1, its center frequency 5955,
11155 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
11156 * lowest channel is 1, its center frequency 5955,
11157 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
11158 * lowest channel is 1, its center frequency 5955,
11159 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
11160 */
11161 seg_seq = 10 * (BIT(seq) - 1);
11162 return seg_seq + start_seq;
11163 }
11164
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)11165 static void ath12k_mac_get_psd_channel(struct ath12k *ar,
11166 u16 step_freq,
11167 u16 *start_freq,
11168 u16 *center_freq,
11169 u8 i,
11170 struct ieee80211_channel **temp_chan,
11171 s8 *tx_power)
11172 {
11173 /* It is to get the center frequency for each 20 MHz.
11174 * For example, if the chan is 160 MHz and center frequency is 6025,
11175 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
11176 * channel number 1's center frequency is 5955, it is parameter start_freq.
11177 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
11178 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
11179 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
11180 * the gap is 20 for each channel, parameter step_freq means the gap.
11181 * after get the center frequency of each channel, it is easy to find the
11182 * struct ieee80211_channel of it and get the max_reg_power.
11183 */
11184 *center_freq = *start_freq + i * step_freq;
11185 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11186 *tx_power = (*temp_chan)->max_reg_power;
11187 }
11188
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)11189 static void ath12k_mac_get_eirp_power(struct ath12k *ar,
11190 u16 *start_freq,
11191 u16 *center_freq,
11192 u8 i,
11193 struct ieee80211_channel **temp_chan,
11194 struct cfg80211_chan_def *def,
11195 s8 *tx_power)
11196 {
11197 /* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
11198 * 160 MHz bandwidth, and then plus 10 to the center frequency,
11199 * it is the center frequency of a channel number.
11200 * For example, when configured channel number is 1.
11201 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
11202 * then it is channel number 5.
11203 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
11204 * then it is channel number 9.
11205 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
11206 * then it is channel number 17.
11207 * after get the center frequency of each channel, it is easy to find the
11208 * struct ieee80211_channel of it and get the max_reg_power.
11209 */
11210 *center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i);
11211
11212 /* For the 20 MHz, its center frequency is same with same channel */
11213 if (i != 0)
11214 *center_freq += 10;
11215
11216 *temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11217 *tx_power = (*temp_chan)->max_reg_power;
11218 }
11219
ath12k_mac_fill_reg_tpc_info(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11220 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
11221 struct ath12k_link_vif *arvif,
11222 struct ieee80211_chanctx_conf *ctx)
11223 {
11224 struct ath12k_base *ab = ar->ab;
11225 struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
11226 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11227 struct ieee80211_channel *chan, *temp_chan;
11228 u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
11229 bool is_psd_power = false, is_tpe_present = false;
11230 s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], psd_power, tx_power;
11231 s8 eirp_power = 0;
11232 struct ath12k_vif *ahvif = arvif->ahvif;
11233 u16 start_freq, center_freq;
11234 u8 reg_6ghz_power_mode;
11235
11236 chan = ctx->def.chan;
11237 start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def);
11238 pwr_reduction = bss_conf->pwr_reduction;
11239
11240 if (arvif->reg_tpc_info.num_pwr_levels) {
11241 is_tpe_present = true;
11242 num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
11243 } else {
11244 num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def);
11245 }
11246
11247 for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
11248 /* STA received TPE IE*/
11249 if (is_tpe_present) {
11250 /* local power is PSD power*/
11251 if (chan->flags & IEEE80211_CHAN_PSD) {
11252 /* Connecting AP is psd power */
11253 if (reg_tpc_info->is_psd_power) {
11254 is_psd_power = true;
11255 ath12k_mac_get_psd_channel(ar, 20,
11256 &start_freq,
11257 ¢er_freq,
11258 pwr_lvl_idx,
11259 &temp_chan,
11260 &tx_power);
11261 psd_power = temp_chan->psd;
11262 eirp_power = tx_power;
11263 max_tx_power[pwr_lvl_idx] =
11264 min_t(s8,
11265 psd_power,
11266 reg_tpc_info->tpe[pwr_lvl_idx]);
11267 /* Connecting AP is not psd power */
11268 } else {
11269 ath12k_mac_get_eirp_power(ar,
11270 &start_freq,
11271 ¢er_freq,
11272 pwr_lvl_idx,
11273 &temp_chan,
11274 &ctx->def,
11275 &tx_power);
11276 psd_power = temp_chan->psd;
11277 /* convert psd power to EIRP power based
11278 * on channel width
11279 */
11280 tx_power =
11281 min_t(s8, tx_power,
11282 psd_power + 13 + pwr_lvl_idx * 3);
11283 max_tx_power[pwr_lvl_idx] =
11284 min_t(s8,
11285 tx_power,
11286 reg_tpc_info->tpe[pwr_lvl_idx]);
11287 }
11288 /* local power is not PSD power */
11289 } else {
11290 /* Connecting AP is psd power */
11291 if (reg_tpc_info->is_psd_power) {
11292 is_psd_power = true;
11293 ath12k_mac_get_psd_channel(ar, 20,
11294 &start_freq,
11295 ¢er_freq,
11296 pwr_lvl_idx,
11297 &temp_chan,
11298 &tx_power);
11299 eirp_power = tx_power;
11300 max_tx_power[pwr_lvl_idx] =
11301 reg_tpc_info->tpe[pwr_lvl_idx];
11302 /* Connecting AP is not psd power */
11303 } else {
11304 ath12k_mac_get_eirp_power(ar,
11305 &start_freq,
11306 ¢er_freq,
11307 pwr_lvl_idx,
11308 &temp_chan,
11309 &ctx->def,
11310 &tx_power);
11311 max_tx_power[pwr_lvl_idx] =
11312 min_t(s8,
11313 tx_power,
11314 reg_tpc_info->tpe[pwr_lvl_idx]);
11315 }
11316 }
11317 /* STA not received TPE IE */
11318 } else {
11319 /* local power is PSD power*/
11320 if (chan->flags & IEEE80211_CHAN_PSD) {
11321 is_psd_power = true;
11322 ath12k_mac_get_psd_channel(ar, 20,
11323 &start_freq,
11324 ¢er_freq,
11325 pwr_lvl_idx,
11326 &temp_chan,
11327 &tx_power);
11328 psd_power = temp_chan->psd;
11329 eirp_power = tx_power;
11330 max_tx_power[pwr_lvl_idx] = psd_power;
11331 } else {
11332 ath12k_mac_get_eirp_power(ar,
11333 &start_freq,
11334 ¢er_freq,
11335 pwr_lvl_idx,
11336 &temp_chan,
11337 &ctx->def,
11338 &tx_power);
11339 max_tx_power[pwr_lvl_idx] = tx_power;
11340 }
11341 }
11342
11343 if (is_psd_power) {
11344 /* If AP local power constraint is present */
11345 if (pwr_reduction)
11346 eirp_power = eirp_power - pwr_reduction;
11347
11348 /* If firmware updated max tx power is non zero, then take
11349 * the min of firmware updated ap tx power
11350 * and max power derived from above mentioned parameters.
11351 */
11352 ath12k_dbg(ab, ATH12K_DBG_MAC,
11353 "eirp power : %d firmware report power : %d\n",
11354 eirp_power, ar->max_allowed_tx_power);
11355 /* Firmware reports lower max_allowed_tx_power during vdev
11356 * start response. In case of 6 GHz, firmware is not aware
11357 * of EIRP power unless driver sets EIRP power through WMI
11358 * TPC command. So radio which does not support idle power
11359 * save can set maximum calculated EIRP power directly to
11360 * firmware through TPC command without min comparison with
11361 * vdev start response's max_allowed_tx_power.
11362 */
11363 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11364 eirp_power = min_t(s8,
11365 eirp_power,
11366 ar->max_allowed_tx_power);
11367 } else {
11368 /* If AP local power constraint is present */
11369 if (pwr_reduction)
11370 max_tx_power[pwr_lvl_idx] =
11371 max_tx_power[pwr_lvl_idx] - pwr_reduction;
11372 /* If firmware updated max tx power is non zero, then take
11373 * the min of firmware updated ap tx power
11374 * and max power derived from above mentioned parameters.
11375 */
11376 if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11377 max_tx_power[pwr_lvl_idx] =
11378 min_t(s8,
11379 max_tx_power[pwr_lvl_idx],
11380 ar->max_allowed_tx_power);
11381 }
11382 reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
11383 reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
11384 max_tx_power[pwr_lvl_idx];
11385 }
11386
11387 reg_tpc_info->num_pwr_levels = num_pwr_levels;
11388 reg_tpc_info->is_psd_power = is_psd_power;
11389 reg_tpc_info->eirp_power = eirp_power;
11390 if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11391 reg_6ghz_power_mode = bss_conf->power_type;
11392 else
11393 /* For now, LPI is the only supported AP power mode */
11394 reg_6ghz_power_mode = IEEE80211_REG_LPI_AP;
11395
11396 reg_tpc_info->ap_power_type =
11397 ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode);
11398 }
11399
ath12k_mac_parse_tx_pwr_env(struct ath12k * ar,struct ath12k_link_vif * arvif)11400 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar,
11401 struct ath12k_link_vif *arvif)
11402 {
11403 struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11404 struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info;
11405 struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd;
11406 struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd;
11407 struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe;
11408 enum wmi_reg_6g_client_type client_type;
11409 struct ath12k_reg_info *reg_info;
11410 struct ath12k_base *ab = ar->ab;
11411 bool psd_valid, non_psd_valid;
11412 int i;
11413
11414 reg_info = ab->reg_info[ar->pdev_idx];
11415 client_type = reg_info->client_type;
11416
11417 local_psd = &tpe->psd_local[client_type];
11418 reg_psd = &tpe->psd_reg_client[client_type];
11419 local_non_psd = &tpe->max_local[client_type];
11420 reg_non_psd = &tpe->max_reg_client[client_type];
11421
11422 psd_valid = local_psd->valid | reg_psd->valid;
11423 non_psd_valid = local_non_psd->valid | reg_non_psd->valid;
11424
11425 if (!psd_valid && !non_psd_valid) {
11426 ath12k_warn(ab,
11427 "no transmit power envelope match client power type %d\n",
11428 client_type);
11429 return;
11430 }
11431
11432 if (psd_valid) {
11433 tpc_info->is_psd_power = true;
11434
11435 tpc_info->num_pwr_levels = max(local_psd->count,
11436 reg_psd->count);
11437 tpc_info->num_pwr_levels =
11438 min3(tpc_info->num_pwr_levels,
11439 IEEE80211_TPE_PSD_ENTRIES_320MHZ,
11440 ATH12K_NUM_PWR_LEVELS);
11441
11442 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11443 tpc_info->tpe[i] = min(local_psd->power[i],
11444 reg_psd->power[i]) / 2;
11445 ath12k_dbg(ab, ATH12K_DBG_MAC,
11446 "TPE PSD power[%d] : %d\n",
11447 i, tpc_info->tpe[i]);
11448 }
11449 } else {
11450 tpc_info->is_psd_power = false;
11451 tpc_info->eirp_power = 0;
11452
11453 tpc_info->num_pwr_levels = max(local_non_psd->count,
11454 reg_non_psd->count);
11455 tpc_info->num_pwr_levels =
11456 min3(tpc_info->num_pwr_levels,
11457 IEEE80211_TPE_EIRP_ENTRIES_320MHZ,
11458 ATH12K_NUM_PWR_LEVELS);
11459
11460 for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11461 tpc_info->tpe[i] = min(local_non_psd->power[i],
11462 reg_non_psd->power[i]) / 2;
11463 ath12k_dbg(ab, ATH12K_DBG_MAC,
11464 "non PSD power[%d] : %d\n",
11465 i, tpc_info->tpe[i]);
11466 }
11467 }
11468 }
11469
11470 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)11471 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
11472 struct ieee80211_vif *vif,
11473 struct ieee80211_bss_conf *link_conf,
11474 struct ieee80211_chanctx_conf *ctx)
11475 {
11476 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11477 struct ath12k *ar;
11478 struct ath12k_base *ab;
11479 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11480 u8 link_id = link_conf->link_id;
11481 struct ath12k_link_vif *arvif;
11482 int ret;
11483
11484 lockdep_assert_wiphy(hw->wiphy);
11485
11486 /* For multi radio wiphy, the vdev was not created during add_interface
11487 * create now since we have a channel ctx now to assign to a specific ar/fw
11488 */
11489 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
11490 if (!arvif) {
11491 WARN_ON(1);
11492 return -ENOMEM;
11493 }
11494
11495 ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
11496 if (!ar) {
11497 ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started",
11498 vif->addr, link_id);
11499 return -EINVAL;
11500 }
11501
11502 ab = ar->ab;
11503
11504 ath12k_dbg(ab, ATH12K_DBG_MAC,
11505 "mac chanctx assign ptr %p vdev_id %i\n",
11506 ctx, arvif->vdev_id);
11507
11508 if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
11509 ctx->def.chan->band == NL80211_BAND_6GHZ &&
11510 ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11511 ath12k_mac_parse_tx_pwr_env(ar, arvif);
11512
11513 arvif->punct_bitmap = ctx->def.punctured;
11514
11515 /* for some targets bss peer must be created before vdev_start */
11516 if (ab->hw_params->vdev_start_delay &&
11517 ahvif->vdev_type != WMI_VDEV_TYPE_AP &&
11518 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
11519 !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
11520 ret = 0;
11521 goto out;
11522 }
11523
11524 if (WARN_ON(arvif->is_started)) {
11525 ret = -EBUSY;
11526 goto out;
11527 }
11528
11529 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11530 ret = ath12k_mac_monitor_start(ar);
11531 if (ret) {
11532 ath12k_mac_monitor_vdev_delete(ar);
11533 goto out;
11534 }
11535
11536 arvif->is_started = true;
11537 goto out;
11538 }
11539
11540 ret = ath12k_mac_vdev_start(arvif, ctx);
11541 if (ret) {
11542 ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11543 arvif->vdev_id, vif->addr,
11544 ctx->def.chan->center_freq, ret);
11545 goto out;
11546 }
11547
11548 arvif->is_started = true;
11549
11550 /* TODO: Setup ps and cts/rts protection */
11551
11552 out:
11553 return ret;
11554 }
11555
11556 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)11557 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
11558 struct ieee80211_vif *vif,
11559 struct ieee80211_bss_conf *link_conf,
11560 struct ieee80211_chanctx_conf *ctx)
11561 {
11562 struct ath12k *ar;
11563 struct ath12k_base *ab;
11564 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11565 struct ath12k_link_vif *arvif;
11566 u8 link_id = link_conf->link_id;
11567 int ret;
11568
11569 lockdep_assert_wiphy(hw->wiphy);
11570
11571 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11572
11573 /* The vif is expected to be attached to an ar's VDEV.
11574 * We leave the vif/vdev in this function as is
11575 * and not delete the vdev symmetric to assign_vif_chanctx()
11576 * the VDEV will be deleted and unassigned either during
11577 * remove_interface() or when there is a change in channel
11578 * that moves the vif to a new ar
11579 */
11580 if (!arvif || !arvif->is_created)
11581 return;
11582
11583 ar = arvif->ar;
11584 ab = ar->ab;
11585
11586 ath12k_dbg(ab, ATH12K_DBG_MAC,
11587 "mac chanctx unassign ptr %p vdev_id %i\n",
11588 ctx, arvif->vdev_id);
11589
11590 WARN_ON(!arvif->is_started);
11591
11592 if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11593 ret = ath12k_mac_monitor_stop(ar);
11594 if (ret)
11595 return;
11596
11597 arvif->is_started = false;
11598 }
11599
11600 if (ahvif->vdev_type != WMI_VDEV_TYPE_STA &&
11601 ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
11602 ath12k_bss_disassoc(ar, arvif);
11603 ret = ath12k_mac_vdev_stop(arvif);
11604 if (ret)
11605 ath12k_warn(ab, "failed to stop vdev %i: %d\n",
11606 arvif->vdev_id, ret);
11607 }
11608 arvif->is_started = false;
11609
11610 if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
11611 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
11612 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
11613 ar->state_11d != ATH12K_11D_PREPARING) {
11614 reinit_completion(&ar->completed_11d_scan);
11615 ar->state_11d = ATH12K_11D_PREPARING;
11616 }
11617
11618 if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) {
11619 ath12k_scan_abort(ar);
11620 ar->scan.arvif = NULL;
11621 }
11622 }
11623
11624 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)11625 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
11626 struct ieee80211_vif_chanctx_switch *vifs,
11627 int n_vifs,
11628 enum ieee80211_chanctx_switch_mode mode)
11629 {
11630 struct ath12k *ar;
11631
11632 lockdep_assert_wiphy(hw->wiphy);
11633
11634 ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx);
11635 if (!ar)
11636 return -EINVAL;
11637
11638 /* Switching channels across radio is not allowed */
11639 if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
11640 return -EINVAL;
11641
11642 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11643 "mac chanctx switch n_vifs %d mode %d\n",
11644 n_vifs, mode);
11645 ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
11646
11647 return 0;
11648 }
11649
11650 static int
ath12k_set_vdev_param_to_all_vifs(struct ath12k * ar,int param,u32 value)11651 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
11652 {
11653 struct ath12k_link_vif *arvif;
11654 int ret = 0;
11655
11656 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11657
11658 list_for_each_entry(arvif, &ar->arvifs, list) {
11659 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
11660 param, arvif->vdev_id, value);
11661
11662 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11663 param, value);
11664 if (ret) {
11665 ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
11666 param, arvif->vdev_id, ret);
11667 break;
11668 }
11669 }
11670
11671 return ret;
11672 }
11673
11674 /* mac80211 stores device specific RTS/Fragmentation threshold value,
11675 * this is set interface specific to firmware from ath12k driver
11676 */
ath12k_mac_op_set_rts_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11677 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
11678 int radio_idx, u32 value)
11679 {
11680 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11681 struct wiphy *wiphy = hw->wiphy;
11682 struct ath12k *ar;
11683 int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
11684 int ret = 0, ret_err, i;
11685
11686 lockdep_assert_wiphy(hw->wiphy);
11687
11688 if (radio_idx >= wiphy->n_radio || radio_idx < -1)
11689 return -EINVAL;
11690
11691 if (radio_idx != -1) {
11692 /* Update RTS threshold in specified radio */
11693 ar = ath12k_ah_to_ar(ah, radio_idx);
11694 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11695 if (ret) {
11696 ath12k_warn(ar->ab,
11697 "failed to set RTS config for all vdevs of pdev %d",
11698 ar->pdev->pdev_id);
11699 return ret;
11700 }
11701
11702 ar->rts_threshold = value;
11703 return 0;
11704 }
11705
11706 /* Radio_index passed is -1, so set RTS threshold for all radios. */
11707 for_each_ar(ah, ar, i) {
11708 ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11709 if (ret) {
11710 ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d",
11711 ar->pdev->pdev_id);
11712 break;
11713 }
11714 }
11715 if (!ret) {
11716 /* Setting new RTS threshold for vdevs of all radios passed, so update
11717 * the RTS threshold value for all radios
11718 */
11719 for_each_ar(ah, ar, i)
11720 ar->rts_threshold = value;
11721 return 0;
11722 }
11723
11724 /* RTS threshold config failed, revert to the previous RTS threshold */
11725 for (i = i - 1; i >= 0; i--) {
11726 ar = ath12k_ah_to_ar(ah, i);
11727 ret_err = ath12k_set_vdev_param_to_all_vifs(ar, param_id,
11728 ar->rts_threshold);
11729 if (ret_err)
11730 ath12k_warn(ar->ab,
11731 "failed to restore RTS threshold for all vdevs of pdev %d",
11732 ar->pdev->pdev_id);
11733 }
11734
11735 return ret;
11736 }
11737
ath12k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11738 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
11739 int radio_idx, u32 value)
11740 {
11741 /* Even though there's a WMI vdev param for fragmentation threshold no
11742 * known firmware actually implements it. Moreover it is not possible to
11743 * rely frame fragmentation to mac80211 because firmware clears the
11744 * "more fragments" bit in frame control making it impossible for remote
11745 * devices to reassemble frames.
11746 *
11747 * Hence implement a dummy callback just to say fragmentation isn't
11748 * supported. This effectively prevents mac80211 from doing frame
11749 * fragmentation in software.
11750 */
11751
11752 lockdep_assert_wiphy(hw->wiphy);
11753
11754 return -EOPNOTSUPP;
11755 }
11756
ath12k_mac_flush(struct ath12k * ar)11757 static int ath12k_mac_flush(struct ath12k *ar)
11758 {
11759 long time_left;
11760 int ret = 0;
11761
11762 time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
11763 (atomic_read(&ar->dp.num_tx_pending) == 0),
11764 ATH12K_FLUSH_TIMEOUT);
11765 if (time_left == 0) {
11766 ath12k_warn(ar->ab,
11767 "failed to flush transmit queue, data pkts pending %d\n",
11768 atomic_read(&ar->dp.num_tx_pending));
11769 ret = -ETIMEDOUT;
11770 }
11771
11772 time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
11773 (atomic_read(&ar->num_pending_mgmt_tx) == 0),
11774 ATH12K_FLUSH_TIMEOUT);
11775 if (time_left == 0) {
11776 ath12k_warn(ar->ab,
11777 "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
11778 atomic_read(&ar->num_pending_mgmt_tx));
11779 ret = -ETIMEDOUT;
11780 }
11781
11782 return ret;
11783 }
11784
ath12k_mac_wait_tx_complete(struct ath12k * ar)11785 int ath12k_mac_wait_tx_complete(struct ath12k *ar)
11786 {
11787 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11788
11789 ath12k_mac_drain_tx(ar);
11790 return ath12k_mac_flush(ar);
11791 }
11792
ath12k_mac_op_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)11793 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
11794 u32 queues, bool drop)
11795 {
11796 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11797 struct ath12k_link_vif *arvif;
11798 struct ath12k_vif *ahvif;
11799 unsigned long links;
11800 struct ath12k *ar;
11801 u8 link_id;
11802 int i;
11803
11804 lockdep_assert_wiphy(hw->wiphy);
11805
11806 if (drop)
11807 return;
11808
11809 /* vif can be NULL when flush() is considered for hw */
11810 if (!vif) {
11811 for_each_ar(ah, ar, i)
11812 ath12k_mac_flush(ar);
11813 return;
11814 }
11815
11816 for_each_ar(ah, ar, i)
11817 wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work);
11818
11819 ahvif = ath12k_vif_to_ahvif(vif);
11820 links = ahvif->links_map;
11821 for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
11822 arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11823 if (!(arvif && arvif->ar))
11824 continue;
11825
11826 ath12k_mac_flush(arvif->ar);
11827 }
11828 }
11829
11830 static int
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11831 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
11832 enum nl80211_band band,
11833 const struct cfg80211_bitrate_mask *mask)
11834 {
11835 int num_rates = 0;
11836 int i;
11837
11838 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
11839 num_rates += hweight16(mask->control[band].ht_mcs[i]);
11840
11841 return num_rates;
11842 }
11843
11844 static bool
ath12k_mac_has_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11845 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
11846 enum nl80211_band band,
11847 const struct cfg80211_bitrate_mask *mask)
11848 {
11849 int num_rates = 0;
11850
11851 num_rates = hweight32(mask->control[band].legacy);
11852
11853 if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
11854 return false;
11855
11856 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
11857 return false;
11858
11859 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask))
11860 return false;
11861
11862 return num_rates == 1;
11863 }
11864
11865 static __le16
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap * he_cap)11866 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
11867 {
11868 if (he_cap->he_cap_elem.phy_cap_info[0] &
11869 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
11870 return he_cap->he_mcs_nss_supp.tx_mcs_160;
11871
11872 return he_cap->he_mcs_nss_supp.tx_mcs_80;
11873 }
11874
11875 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)11876 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
11877 struct ieee80211_vif *vif,
11878 enum nl80211_band band,
11879 const struct cfg80211_bitrate_mask *mask,
11880 int *nss)
11881 {
11882 struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
11883 u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
11884 const struct ieee80211_sta_he_cap *he_cap;
11885 u16 he_mcs_map = 0;
11886 u8 ht_nss_mask = 0;
11887 u8 vht_nss_mask = 0;
11888 u8 he_nss_mask = 0;
11889 int i;
11890
11891 /* No need to consider legacy here. Basic rates are always present
11892 * in bitrate mask
11893 */
11894
11895 for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
11896 if (mask->control[band].ht_mcs[i] == 0)
11897 continue;
11898 else if (mask->control[band].ht_mcs[i] ==
11899 sband->ht_cap.mcs.rx_mask[i])
11900 ht_nss_mask |= BIT(i);
11901 else
11902 return false;
11903 }
11904
11905 for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
11906 if (mask->control[band].vht_mcs[i] == 0)
11907 continue;
11908 else if (mask->control[band].vht_mcs[i] ==
11909 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
11910 vht_nss_mask |= BIT(i);
11911 else
11912 return false;
11913 }
11914
11915 he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif);
11916 if (!he_cap)
11917 return false;
11918
11919 he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap));
11920
11921 for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
11922 if (mask->control[band].he_mcs[i] == 0)
11923 continue;
11924
11925 if (mask->control[band].he_mcs[i] ==
11926 ath12k_mac_get_max_he_mcs_map(he_mcs_map, i))
11927 he_nss_mask |= BIT(i);
11928 else
11929 return false;
11930 }
11931
11932 if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
11933 return false;
11934
11935 if (ht_nss_mask == 0)
11936 return false;
11937
11938 if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
11939 return false;
11940
11941 *nss = fls(ht_nss_mask);
11942
11943 return true;
11944 }
11945
11946 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)11947 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
11948 enum nl80211_band band,
11949 const struct cfg80211_bitrate_mask *mask,
11950 u32 *rate, u8 *nss)
11951 {
11952 int rate_idx;
11953 u16 bitrate;
11954 u8 preamble;
11955 u8 hw_rate;
11956
11957 if (hweight32(mask->control[band].legacy) != 1)
11958 return -EINVAL;
11959
11960 rate_idx = ffs(mask->control[band].legacy) - 1;
11961
11962 if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
11963 rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
11964
11965 hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
11966 bitrate = ath12k_legacy_rates[rate_idx].bitrate;
11967
11968 if (ath12k_mac_bitrate_is_cck(bitrate))
11969 preamble = WMI_RATE_PREAMBLE_CCK;
11970 else
11971 preamble = WMI_RATE_PREAMBLE_OFDM;
11972
11973 *nss = 1;
11974 *rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
11975
11976 return 0;
11977 }
11978
11979 static int
ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif * arvif,u8 he_gi,u8 he_ltf)11980 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf)
11981 {
11982 struct ath12k *ar = arvif->ar;
11983 int ret;
11984
11985 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11986
11987 /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
11988 if (he_gi && he_gi != 0xFF)
11989 he_gi += 1;
11990
11991 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11992 WMI_VDEV_PARAM_SGI, he_gi);
11993 if (ret) {
11994 ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n",
11995 he_gi, ret);
11996 return ret;
11997 }
11998 /* start from 1 */
11999 if (he_ltf != 0xFF)
12000 he_ltf += 1;
12001
12002 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12003 WMI_VDEV_PARAM_HE_LTF, he_ltf);
12004 if (ret) {
12005 ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n",
12006 he_ltf, ret);
12007 return ret;
12008 }
12009 return 0;
12010 }
12011
12012 static int
ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif * arvif,u16 he_gi,u8 he_ltf)12013 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf)
12014 {
12015 struct ath12k *ar = arvif->ar;
12016 int ret;
12017 u32 he_ar_gi_ltf;
12018
12019 if (he_gi != 0xFF) {
12020 switch (he_gi) {
12021 case NL80211_RATE_INFO_HE_GI_0_8:
12022 he_gi = WMI_AUTORATE_800NS_GI;
12023 break;
12024 case NL80211_RATE_INFO_HE_GI_1_6:
12025 he_gi = WMI_AUTORATE_1600NS_GI;
12026 break;
12027 case NL80211_RATE_INFO_HE_GI_3_2:
12028 he_gi = WMI_AUTORATE_3200NS_GI;
12029 break;
12030 default:
12031 ath12k_warn(ar->ab, "Invalid GI\n");
12032 return -EINVAL;
12033 }
12034 }
12035
12036 if (he_ltf != 0xFF) {
12037 switch (he_ltf) {
12038 case NL80211_RATE_INFO_HE_1XLTF:
12039 he_ltf = WMI_HE_AUTORATE_LTF_1X;
12040 break;
12041 case NL80211_RATE_INFO_HE_2XLTF:
12042 he_ltf = WMI_HE_AUTORATE_LTF_2X;
12043 break;
12044 case NL80211_RATE_INFO_HE_4XLTF:
12045 he_ltf = WMI_HE_AUTORATE_LTF_4X;
12046 break;
12047 default:
12048 ath12k_warn(ar->ab, "Invalid LTF\n");
12049 return -EINVAL;
12050 }
12051 }
12052
12053 he_ar_gi_ltf = he_gi | he_ltf;
12054
12055 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12056 WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
12057 he_ar_gi_ltf);
12058 if (ret) {
12059 ath12k_warn(ar->ab,
12060 "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n",
12061 he_gi, he_ltf, ret);
12062 return ret;
12063 }
12064
12065 return 0;
12066 }
12067
ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)12068 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
12069 {
12070 switch (gi) {
12071 case NL80211_TXRATE_DEFAULT_GI:
12072 return WMI_GI_400_NS;
12073 case NL80211_TXRATE_FORCE_LGI:
12074 return WMI_GI_800_NS;
12075 default:
12076 return WMI_GI_400_NS;
12077 }
12078 }
12079
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)12080 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
12081 u32 rate, u8 nss, u8 sgi, u8 ldpc,
12082 u8 he_gi, u8 he_ltf, bool he_fixed_rate)
12083 {
12084 struct ieee80211_bss_conf *link_conf;
12085 struct ath12k *ar = arvif->ar;
12086 u32 vdev_param;
12087 u32 param_value;
12088 int ret;
12089 bool he_support;
12090
12091 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12092
12093 link_conf = ath12k_mac_get_link_bss_conf(arvif);
12094 if (!link_conf)
12095 return -EINVAL;
12096
12097 he_support = link_conf->he_support;
12098
12099 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12100 "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n",
12101 arvif->vdev_id, rate, nss, sgi, ldpc);
12102
12103 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12104 "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
12105 he_ltf, he_fixed_rate);
12106
12107 if (!he_support) {
12108 vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
12109 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12110 vdev_param, rate);
12111 if (ret) {
12112 ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
12113 rate, ret);
12114 return ret;
12115 }
12116 }
12117
12118 vdev_param = WMI_VDEV_PARAM_NSS;
12119
12120 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12121 vdev_param, nss);
12122 if (ret) {
12123 ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
12124 nss, ret);
12125 return ret;
12126 }
12127
12128 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12129 WMI_VDEV_PARAM_LDPC, ldpc);
12130 if (ret) {
12131 ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
12132 ldpc, ret);
12133 return ret;
12134 }
12135
12136 if (he_support) {
12137 if (he_fixed_rate)
12138 ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf);
12139 else
12140 ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf);
12141 if (ret)
12142 return ret;
12143 } else {
12144 vdev_param = WMI_VDEV_PARAM_SGI;
12145 param_value = ath12k_mac_nlgi_to_wmigi(sgi);
12146 ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12147 vdev_param, param_value);
12148 if (ret) {
12149 ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
12150 sgi, ret);
12151 return ret;
12152 }
12153 }
12154
12155 return 0;
12156 }
12157
12158 static bool
ath12k_mac_vht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12159 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
12160 enum nl80211_band band,
12161 const struct cfg80211_bitrate_mask *mask)
12162 {
12163 int i;
12164 u16 vht_mcs;
12165
12166 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
12167 vht_mcs = mask->control[band].vht_mcs[i];
12168
12169 switch (vht_mcs) {
12170 case 0:
12171 case BIT(8) - 1:
12172 case BIT(9) - 1:
12173 case BIT(10) - 1:
12174 break;
12175 default:
12176 return false;
12177 }
12178 }
12179
12180 return true;
12181 }
12182
12183 static bool
ath12k_mac_he_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12184 ath12k_mac_he_mcs_range_present(struct ath12k *ar,
12185 enum nl80211_band band,
12186 const struct cfg80211_bitrate_mask *mask)
12187 {
12188 int i;
12189 u16 he_mcs;
12190
12191 for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
12192 he_mcs = mask->control[band].he_mcs[i];
12193
12194 switch (he_mcs) {
12195 case 0:
12196 case BIT(8) - 1:
12197 case BIT(10) - 1:
12198 case BIT(12) - 1:
12199 break;
12200 default:
12201 return false;
12202 }
12203 }
12204
12205 return true;
12206 }
12207
ath12k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)12208 static void ath12k_mac_set_bitrate_mask_iter(void *data,
12209 struct ieee80211_sta *sta)
12210 {
12211 struct ath12k_link_vif *arvif = data;
12212 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12213 struct ath12k_link_sta *arsta;
12214 struct ath12k *ar = arvif->ar;
12215
12216 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12217
12218 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12219 ahsta->link[arvif->link_id]);
12220 if (!arsta || arsta->arvif != arvif)
12221 return;
12222
12223 spin_lock_bh(&ar->data_lock);
12224 arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
12225 spin_unlock_bh(&ar->data_lock);
12226
12227 wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
12228 }
12229
ath12k_mac_disable_peer_fixed_rate(void * data,struct ieee80211_sta * sta)12230 static void ath12k_mac_disable_peer_fixed_rate(void *data,
12231 struct ieee80211_sta *sta)
12232 {
12233 struct ath12k_link_vif *arvif = data;
12234 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12235 struct ath12k_link_sta *arsta;
12236 struct ath12k *ar = arvif->ar;
12237 int ret;
12238
12239 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12240
12241 arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12242 ahsta->link[arvif->link_id]);
12243
12244 if (!arsta || arsta->arvif != arvif)
12245 return;
12246
12247 ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
12248 arvif->vdev_id,
12249 WMI_PEER_PARAM_FIXED_RATE,
12250 WMI_FIXED_RATE_NONE);
12251 if (ret)
12252 ath12k_warn(ar->ab,
12253 "failed to disable peer fixed rate for STA %pM ret %d\n",
12254 arsta->addr, ret);
12255 }
12256
12257 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)12258 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band,
12259 const struct cfg80211_bitrate_mask *mask,
12260 unsigned int link_id)
12261 {
12262 bool he_fixed_rate = false, vht_fixed_rate = false;
12263 const u16 *vht_mcs_mask, *he_mcs_mask;
12264 struct ieee80211_link_sta *link_sta;
12265 struct ath12k_peer *peer, *tmp;
12266 u8 vht_nss, he_nss;
12267 int ret = true;
12268
12269 vht_mcs_mask = mask->control[band].vht_mcs;
12270 he_mcs_mask = mask->control[band].he_mcs;
12271
12272 if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
12273 vht_fixed_rate = true;
12274
12275 if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
12276 he_fixed_rate = true;
12277
12278 if (!vht_fixed_rate && !he_fixed_rate)
12279 return true;
12280
12281 vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
12282 he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
12283
12284 rcu_read_lock();
12285 spin_lock_bh(&ar->ab->base_lock);
12286 list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
12287 if (peer->sta) {
12288 link_sta = rcu_dereference(peer->sta->link[link_id]);
12289 if (!link_sta) {
12290 ret = false;
12291 goto exit;
12292 }
12293
12294 if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
12295 link_sta->rx_nss < vht_nss)) {
12296 ret = false;
12297 goto exit;
12298 }
12299 if (he_fixed_rate && (!link_sta->he_cap.has_he ||
12300 link_sta->rx_nss < he_nss)) {
12301 ret = false;
12302 goto exit;
12303 }
12304 }
12305 }
12306 exit:
12307 spin_unlock_bh(&ar->ab->base_lock);
12308 rcu_read_unlock();
12309 return ret;
12310 }
12311
12312 static int
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)12313 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
12314 struct ieee80211_vif *vif,
12315 const struct cfg80211_bitrate_mask *mask)
12316 {
12317 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12318 struct ath12k_link_vif *arvif;
12319 struct cfg80211_chan_def def;
12320 struct ath12k *ar;
12321 enum nl80211_band band;
12322 const u8 *ht_mcs_mask;
12323 const u16 *vht_mcs_mask;
12324 const u16 *he_mcs_mask;
12325 u8 he_ltf = 0;
12326 u8 he_gi = 0;
12327 u32 rate;
12328 u8 nss, mac_nss;
12329 u8 sgi;
12330 u8 ldpc;
12331 int single_nss;
12332 int ret;
12333 int num_rates;
12334 bool he_fixed_rate = false;
12335
12336 lockdep_assert_wiphy(hw->wiphy);
12337
12338 arvif = &ahvif->deflink;
12339
12340 ar = arvif->ar;
12341 if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
12342 ret = -EPERM;
12343 goto out;
12344 }
12345
12346 band = def.chan->band;
12347 ht_mcs_mask = mask->control[band].ht_mcs;
12348 vht_mcs_mask = mask->control[band].vht_mcs;
12349 he_mcs_mask = mask->control[band].he_mcs;
12350 ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
12351
12352 sgi = mask->control[band].gi;
12353 if (sgi == NL80211_TXRATE_FORCE_SGI) {
12354 ret = -EINVAL;
12355 goto out;
12356 }
12357
12358 he_gi = mask->control[band].he_gi;
12359 he_ltf = mask->control[band].he_ltf;
12360
12361 /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
12362 * requires passing at least one of used basic rates along with them.
12363 * Fixed rate setting across different preambles(legacy, HT, VHT) is
12364 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
12365 * suitable for setting single HT/VHT rates.
12366 * But, there could be a single basic rate passed from userspace which
12367 * can be done through the FIXED_RATE param.
12368 */
12369 if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
12370 ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
12371 &nss);
12372 if (ret) {
12373 ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
12374 arvif->vdev_id, ret);
12375 goto out;
12376 }
12377
12378 ieee80211_iterate_stations_mtx(hw,
12379 ath12k_mac_disable_peer_fixed_rate,
12380 arvif);
12381 } else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask,
12382 &single_nss)) {
12383 rate = WMI_FIXED_RATE_NONE;
12384 nss = single_nss;
12385 arvif->bitrate_mask = *mask;
12386
12387 ieee80211_iterate_stations_atomic(hw,
12388 ath12k_mac_set_bitrate_mask_iter,
12389 arvif);
12390 } else {
12391 rate = WMI_FIXED_RATE_NONE;
12392
12393 if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
12394 mask, arvif->link_id))
12395 ath12k_warn(ar->ab,
12396 "failed to update fixed rate settings due to mcs/nss incompatibility\n");
12397
12398 mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
12399 ath12k_mac_max_vht_nss(vht_mcs_mask),
12400 ath12k_mac_max_he_nss(he_mcs_mask));
12401 nss = min_t(u32, ar->num_tx_chains, mac_nss);
12402
12403 /* If multiple rates across different preambles are given
12404 * we can reconfigure this info with all peers using PEER_ASSOC
12405 * command with the below exception cases.
12406 * - Single VHT Rate : peer_assoc command accommodates only MCS
12407 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
12408 * mandates passing basic rates along with HT/VHT rates, FW
12409 * doesn't allow switching from VHT to Legacy. Hence instead of
12410 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
12411 * we could set this VHT rate as peer fixed rate param, which
12412 * will override FIXED rate and FW rate control algorithm.
12413 * If single VHT rate is passed along with HT rates, we select
12414 * the VHT rate as fixed rate for vht peers.
12415 * - Multiple VHT Rates : When Multiple VHT rates are given,this
12416 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
12417 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
12418 * RATEMASK_CMDID can cover all use cases of setting rates
12419 * across multiple preambles and rates within same type.
12420 * But requires more validation of the command at this point.
12421 */
12422
12423 num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
12424 mask);
12425
12426 if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
12427 num_rates > 1) {
12428 /* TODO: Handle multiple VHT MCS values setting using
12429 * RATEMASK CMD
12430 */
12431 ath12k_warn(ar->ab,
12432 "Setting more than one MCS Value in bitrate mask not supported\n");
12433 ret = -EINVAL;
12434 goto out;
12435 }
12436
12437 num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
12438 if (num_rates == 1)
12439 he_fixed_rate = true;
12440
12441 if (!ath12k_mac_he_mcs_range_present(ar, band, mask) &&
12442 num_rates > 1) {
12443 ath12k_warn(ar->ab,
12444 "Setting more than one HE MCS Value in bitrate mask not supported\n");
12445 ret = -EINVAL;
12446 goto out;
12447 }
12448 ieee80211_iterate_stations_mtx(hw,
12449 ath12k_mac_disable_peer_fixed_rate,
12450 arvif);
12451
12452 arvif->bitrate_mask = *mask;
12453 ieee80211_iterate_stations_mtx(hw,
12454 ath12k_mac_set_bitrate_mask_iter,
12455 arvif);
12456 }
12457
12458 ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
12459 he_ltf, he_fixed_rate);
12460 if (ret) {
12461 ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
12462 arvif->vdev_id, ret);
12463 }
12464
12465 out:
12466 return ret;
12467 }
12468
12469 static void
ath12k_mac_op_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)12470 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
12471 enum ieee80211_reconfig_type reconfig_type)
12472 {
12473 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12474 struct ath12k *ar;
12475 struct ath12k_base *ab;
12476 struct ath12k_vif *ahvif;
12477 struct ath12k_link_vif *arvif;
12478 int recovery_count, i;
12479
12480 lockdep_assert_wiphy(hw->wiphy);
12481
12482 if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
12483 return;
12484
12485 guard(mutex)(&ah->hw_mutex);
12486
12487 if (ah->state != ATH12K_HW_STATE_RESTARTED)
12488 return;
12489
12490 ah->state = ATH12K_HW_STATE_ON;
12491 ieee80211_wake_queues(hw);
12492
12493 for_each_ar(ah, ar, i) {
12494 ab = ar->ab;
12495
12496 ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
12497 ar->pdev->pdev_id);
12498
12499 if (ar->ab->hw_params->current_cc_support &&
12500 ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
12501 struct wmi_set_current_country_arg arg = {};
12502
12503 memcpy(&arg.alpha2, ar->alpha2, 2);
12504 reinit_completion(&ar->regd_update_completed);
12505 ath12k_wmi_send_set_current_country_cmd(ar, &arg);
12506 }
12507
12508 if (ab->is_reset) {
12509 recovery_count = atomic_inc_return(&ab->recovery_count);
12510
12511 ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
12512 recovery_count);
12513
12514 /* When there are multiple radios in an SOC,
12515 * the recovery has to be done for each radio
12516 */
12517 if (recovery_count == ab->num_radios) {
12518 atomic_dec(&ab->reset_count);
12519 complete(&ab->reset_complete);
12520 ab->is_reset = false;
12521 atomic_set(&ab->fail_cont_count, 0);
12522 ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
12523 }
12524 }
12525
12526 list_for_each_entry(arvif, &ar->arvifs, list) {
12527 ahvif = arvif->ahvif;
12528 ath12k_dbg(ab, ATH12K_DBG_BOOT,
12529 "reconfig cipher %d up %d vdev type %d\n",
12530 ahvif->key_cipher,
12531 arvif->is_up,
12532 ahvif->vdev_type);
12533
12534 /* After trigger disconnect, then upper layer will
12535 * trigger connect again, then the PN number of
12536 * upper layer will be reset to keep up with AP
12537 * side, hence PN number mismatch will not happen.
12538 */
12539 if (arvif->is_up &&
12540 ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12541 ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
12542 ieee80211_hw_restart_disconnect(ahvif->vif);
12543
12544 ath12k_dbg(ab, ATH12K_DBG_BOOT,
12545 "restart disconnect\n");
12546 }
12547 }
12548 }
12549 }
12550
12551 static void
ath12k_mac_update_bss_chan_survey(struct ath12k * ar,struct ieee80211_channel * channel)12552 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
12553 struct ieee80211_channel *channel)
12554 {
12555 int ret;
12556 enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
12557
12558 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12559
12560 if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
12561 ar->rx_channel != channel)
12562 return;
12563
12564 if (ar->scan.state != ATH12K_SCAN_IDLE) {
12565 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12566 "ignoring bss chan info req while scanning..\n");
12567 return;
12568 }
12569
12570 reinit_completion(&ar->bss_survey_done);
12571
12572 ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
12573 if (ret) {
12574 ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
12575 return;
12576 }
12577
12578 ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
12579 if (ret == 0)
12580 ath12k_warn(ar->ab, "bss channel survey timed out\n");
12581 }
12582
ath12k_mac_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)12583 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
12584 struct survey_info *survey)
12585 {
12586 struct ath12k *ar;
12587 struct ieee80211_supported_band *sband;
12588 struct survey_info *ar_survey;
12589
12590 lockdep_assert_wiphy(hw->wiphy);
12591
12592 if (idx >= ATH12K_NUM_CHANS)
12593 return -ENOENT;
12594
12595 sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
12596 if (sband && idx >= sband->n_channels) {
12597 idx -= sband->n_channels;
12598 sband = NULL;
12599 }
12600
12601 if (!sband)
12602 sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
12603 if (sband && idx >= sband->n_channels) {
12604 idx -= sband->n_channels;
12605 sband = NULL;
12606 }
12607
12608 if (!sband)
12609 sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
12610
12611 if (!sband || idx >= sband->n_channels)
12612 return -ENOENT;
12613
12614 ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
12615 if (!ar) {
12616 if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
12617 memset(survey, 0, sizeof(*survey));
12618 return 0;
12619 }
12620 return -ENOENT;
12621 }
12622
12623 ar_survey = &ar->survey[idx];
12624
12625 ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
12626
12627 spin_lock_bh(&ar->data_lock);
12628 memcpy(survey, ar_survey, sizeof(*survey));
12629 spin_unlock_bh(&ar->data_lock);
12630
12631 survey->channel = &sband->channels[idx];
12632
12633 if (ar->rx_channel == survey->channel)
12634 survey->filled |= SURVEY_INFO_IN_USE;
12635
12636 return 0;
12637 }
12638
ath12k_mac_put_chain_rssi(struct station_info * sinfo,struct ath12k_link_sta * arsta)12639 static void ath12k_mac_put_chain_rssi(struct station_info *sinfo,
12640 struct ath12k_link_sta *arsta)
12641 {
12642 s8 rssi;
12643 int i;
12644
12645 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
12646 sinfo->chains &= ~BIT(i);
12647 rssi = arsta->chain_signal[i];
12648
12649 if (rssi != ATH12K_DEFAULT_NOISE_FLOOR &&
12650 rssi != ATH12K_INVALID_RSSI_FULL &&
12651 rssi != ATH12K_INVALID_RSSI_EMPTY &&
12652 rssi != 0) {
12653 sinfo->chain_signal[i] = rssi;
12654 sinfo->chains |= BIT(i);
12655 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
12656 }
12657 }
12658 }
12659
ath12k_mac_op_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)12660 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
12661 struct ieee80211_vif *vif,
12662 struct ieee80211_sta *sta,
12663 struct station_info *sinfo)
12664 {
12665 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12666 struct ath12k_fw_stats_req_params params = {};
12667 struct ath12k_link_sta *arsta;
12668 s8 signal, noise_floor;
12669 struct ath12k *ar;
12670 bool db2dbm;
12671
12672 lockdep_assert_wiphy(hw->wiphy);
12673
12674 arsta = &ahsta->deflink;
12675 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12676 if (!ar)
12677 return;
12678
12679 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12680 ar->ab->wmi_ab.svc_map);
12681
12682 sinfo->rx_duration = arsta->rx_duration;
12683 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12684
12685 sinfo->tx_duration = arsta->tx_duration;
12686 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12687
12688 if (arsta->txrate.legacy || arsta->txrate.nss) {
12689 if (arsta->txrate.legacy) {
12690 sinfo->txrate.legacy = arsta->txrate.legacy;
12691 } else {
12692 sinfo->txrate.mcs = arsta->txrate.mcs;
12693 sinfo->txrate.nss = arsta->txrate.nss;
12694 sinfo->txrate.bw = arsta->txrate.bw;
12695 sinfo->txrate.he_gi = arsta->txrate.he_gi;
12696 sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12697 sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
12698 sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12699 sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc;
12700 }
12701 sinfo->txrate.flags = arsta->txrate.flags;
12702 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12703 }
12704
12705 /* TODO: Use real NF instead of default one. */
12706 signal = arsta->rssi_comb;
12707
12708 params.pdev_id = ar->pdev->pdev_id;
12709 params.vdev_id = 0;
12710 params.stats_id = WMI_REQUEST_VDEV_STAT;
12711
12712 if (!signal &&
12713 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12714 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12715 signal = arsta->rssi_beacon;
12716
12717 params.stats_id = WMI_REQUEST_RSSI_PER_CHAIN_STAT;
12718 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
12719 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12720 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12721 ath12k_mac_put_chain_rssi(sinfo, arsta);
12722
12723 spin_lock_bh(&ar->data_lock);
12724 noise_floor = ath12k_pdev_get_noise_floor(ar);
12725 spin_unlock_bh(&ar->data_lock);
12726
12727 if (signal) {
12728 sinfo->signal = db2dbm ? signal : signal + noise_floor;
12729 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12730 }
12731
12732 sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12733
12734 if (!db2dbm)
12735 sinfo->signal_avg += noise_floor;
12736
12737 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12738
12739 sinfo->tx_retries = arsta->tx_retry_count;
12740 sinfo->tx_failed = arsta->tx_retry_failed;
12741 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12742 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12743 }
12744
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)12745 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
12746 struct ieee80211_vif *vif,
12747 struct ieee80211_link_sta *link_sta,
12748 struct link_station_info *link_sinfo)
12749 {
12750 struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta);
12751 struct ath12k_fw_stats_req_params params = {};
12752 struct ath12k_link_sta *arsta;
12753 struct ath12k *ar;
12754 s8 signal;
12755 bool db2dbm;
12756
12757 lockdep_assert_wiphy(hw->wiphy);
12758
12759 arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]);
12760
12761 if (!arsta)
12762 return;
12763
12764 ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12765 if (!ar)
12766 return;
12767
12768 db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12769 ar->ab->wmi_ab.svc_map);
12770
12771 link_sinfo->rx_duration = arsta->rx_duration;
12772 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12773
12774 link_sinfo->tx_duration = arsta->tx_duration;
12775 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12776
12777 if (arsta->txrate.legacy || arsta->txrate.nss) {
12778 if (arsta->txrate.legacy) {
12779 link_sinfo->txrate.legacy = arsta->txrate.legacy;
12780 } else {
12781 link_sinfo->txrate.mcs = arsta->txrate.mcs;
12782 link_sinfo->txrate.nss = arsta->txrate.nss;
12783 link_sinfo->txrate.bw = arsta->txrate.bw;
12784 link_sinfo->txrate.he_gi = arsta->txrate.he_gi;
12785 link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12786 link_sinfo->txrate.he_ru_alloc =
12787 arsta->txrate.he_ru_alloc;
12788 link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12789 link_sinfo->txrate.eht_ru_alloc =
12790 arsta->txrate.eht_ru_alloc;
12791 }
12792 link_sinfo->txrate.flags = arsta->txrate.flags;
12793 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12794 }
12795
12796 /* TODO: Use real NF instead of default one. */
12797 signal = arsta->rssi_comb;
12798
12799 params.pdev_id = ar->pdev->pdev_id;
12800 params.vdev_id = 0;
12801 params.stats_id = WMI_REQUEST_VDEV_STAT;
12802
12803 if (!signal &&
12804 ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12805 !(ath12k_mac_get_fw_stats(ar, ¶ms)))
12806 signal = arsta->rssi_beacon;
12807
12808 if (signal) {
12809 link_sinfo->signal =
12810 db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
12811 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12812 }
12813
12814 link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12815
12816 if (!db2dbm)
12817 link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
12818
12819 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12820
12821 link_sinfo->tx_retries = arsta->tx_retry_count;
12822 link_sinfo->tx_failed = arsta->tx_retry_failed;
12823 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12824 link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12825 }
12826
ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)12827 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
12828 struct ieee80211_vif *vif)
12829 {
12830 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12831 struct ath12k *ar;
12832
12833 ar = ath12k_ah_to_ar(ah, 0);
12834
12835 lockdep_assert_wiphy(hw->wiphy);
12836
12837 spin_lock_bh(&ar->data_lock);
12838 ar->scan.roc_notify = false;
12839 spin_unlock_bh(&ar->data_lock);
12840
12841 ath12k_scan_abort(ar);
12842
12843 cancel_delayed_work_sync(&ar->scan.timeout);
12844 wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
12845
12846 return 0;
12847 }
12848
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)12849 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
12850 struct ieee80211_vif *vif,
12851 struct ieee80211_channel *chan,
12852 int duration,
12853 enum ieee80211_roc_type type)
12854 {
12855 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12856 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12857 struct ath12k_link_vif *arvif;
12858 struct ath12k *ar;
12859 u32 scan_time_msec;
12860 bool create = true;
12861 u8 link_id;
12862 int ret;
12863
12864 lockdep_assert_wiphy(hw->wiphy);
12865
12866 ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq);
12867 if (!ar)
12868 return -EINVAL;
12869
12870 /* check if any of the links of ML VIF is already started on
12871 * radio(ar) corresponding to given scan frequency and use it,
12872 * if not use deflink(link 0) for scan purpose.
12873 */
12874
12875 link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
12876 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12877 /* If the vif is already assigned to a specific vdev of an ar,
12878 * check whether its already started, vdev which is started
12879 * are not allowed to switch to a new radio.
12880 * If the vdev is not started, but was earlier created on a
12881 * different ar, delete that vdev and create a new one. We don't
12882 * delete at the scan stop as an optimization to avoid redundant
12883 * delete-create vdev's for the same ar, in case the request is
12884 * always on the same band for the vif
12885 */
12886 if (arvif->is_created) {
12887 if (WARN_ON(!arvif->ar))
12888 return -EINVAL;
12889
12890 if (ar != arvif->ar && arvif->is_started)
12891 return -EBUSY;
12892
12893 if (ar != arvif->ar) {
12894 ath12k_mac_remove_link_interface(hw, arvif);
12895 ath12k_mac_unassign_link_vif(arvif);
12896 } else {
12897 create = false;
12898 }
12899 }
12900
12901 if (create) {
12902 arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12903
12904 ret = ath12k_mac_vdev_create(ar, arvif);
12905 if (ret) {
12906 ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
12907 ret);
12908 return ret;
12909 }
12910 }
12911
12912 spin_lock_bh(&ar->data_lock);
12913
12914 switch (ar->scan.state) {
12915 case ATH12K_SCAN_IDLE:
12916 reinit_completion(&ar->scan.started);
12917 reinit_completion(&ar->scan.completed);
12918 reinit_completion(&ar->scan.on_channel);
12919 ar->scan.state = ATH12K_SCAN_STARTING;
12920 ar->scan.is_roc = true;
12921 ar->scan.arvif = arvif;
12922 ar->scan.roc_freq = chan->center_freq;
12923 ar->scan.roc_notify = true;
12924 ret = 0;
12925 break;
12926 case ATH12K_SCAN_STARTING:
12927 case ATH12K_SCAN_RUNNING:
12928 case ATH12K_SCAN_ABORTING:
12929 ret = -EBUSY;
12930 break;
12931 }
12932
12933 spin_unlock_bh(&ar->data_lock);
12934
12935 if (ret)
12936 return ret;
12937
12938 scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
12939
12940 struct ath12k_wmi_scan_req_arg *arg __free(kfree) =
12941 kzalloc(sizeof(*arg), GFP_KERNEL);
12942 if (!arg)
12943 return -ENOMEM;
12944
12945 ath12k_wmi_start_scan_init(ar, arg);
12946 arg->num_chan = 1;
12947
12948 u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list),
12949 GFP_KERNEL);
12950 if (!chan_list)
12951 return -ENOMEM;
12952
12953 arg->chan_list = chan_list;
12954 arg->vdev_id = arvif->vdev_id;
12955 arg->scan_id = ATH12K_SCAN_ID;
12956 arg->chan_list[0] = chan->center_freq;
12957 arg->dwell_time_active = scan_time_msec;
12958 arg->dwell_time_passive = scan_time_msec;
12959 arg->max_scan_time = scan_time_msec;
12960 arg->scan_f_passive = 1;
12961 arg->burst_duration = duration;
12962
12963 ret = ath12k_start_scan(ar, arg);
12964 if (ret) {
12965 ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
12966
12967 spin_lock_bh(&ar->data_lock);
12968 ar->scan.state = ATH12K_SCAN_IDLE;
12969 spin_unlock_bh(&ar->data_lock);
12970 return ret;
12971 }
12972
12973 ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
12974 if (ret == 0) {
12975 ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
12976 ret = ath12k_scan_stop(ar);
12977 if (ret)
12978 ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
12979 return -ETIMEDOUT;
12980 }
12981
12982 ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
12983 msecs_to_jiffies(duration));
12984
12985 return 0;
12986 }
12987
ath12k_mac_op_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)12988 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
12989 struct ieee80211_vif *vif,
12990 struct cfg80211_gtk_rekey_data *data)
12991 {
12992 struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12993 struct ath12k_rekey_data *rekey_data;
12994 struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12995 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
12996 struct ath12k_link_vif *arvif;
12997
12998 lockdep_assert_wiphy(hw->wiphy);
12999
13000 arvif = &ahvif->deflink;
13001 rekey_data = &arvif->rekey_data;
13002
13003 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
13004 arvif->vdev_id);
13005
13006 memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
13007 memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
13008
13009 /* The supplicant works on big-endian, the firmware expects it on
13010 * little endian.
13011 */
13012 rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
13013
13014 arvif->rekey_data.enable_offload = true;
13015
13016 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL,
13017 rekey_data->kck, NL80211_KCK_LEN);
13018 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL,
13019 rekey_data->kck, NL80211_KEK_LEN);
13020 ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
13021 &rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
13022 }
13023
13024 static const struct ieee80211_ops ath12k_ops = {
13025 .tx = ath12k_mac_op_tx,
13026 .wake_tx_queue = ieee80211_handle_wake_tx_queue,
13027 .start = ath12k_mac_op_start,
13028 .stop = ath12k_mac_op_stop,
13029 .reconfig_complete = ath12k_mac_op_reconfig_complete,
13030 .add_interface = ath12k_mac_op_add_interface,
13031 .remove_interface = ath12k_mac_op_remove_interface,
13032 .update_vif_offload = ath12k_mac_op_update_vif_offload,
13033 .config = ath12k_mac_op_config,
13034 .link_info_changed = ath12k_mac_op_link_info_changed,
13035 .vif_cfg_changed = ath12k_mac_op_vif_cfg_changed,
13036 .change_vif_links = ath12k_mac_op_change_vif_links,
13037 .configure_filter = ath12k_mac_op_configure_filter,
13038 .hw_scan = ath12k_mac_op_hw_scan,
13039 .cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
13040 .set_key = ath12k_mac_op_set_key,
13041 .set_rekey_data = ath12k_mac_op_set_rekey_data,
13042 .sta_state = ath12k_mac_op_sta_state,
13043 .sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
13044 .link_sta_rc_update = ath12k_mac_op_link_sta_rc_update,
13045 .conf_tx = ath12k_mac_op_conf_tx,
13046 .set_antenna = ath12k_mac_op_set_antenna,
13047 .get_antenna = ath12k_mac_op_get_antenna,
13048 .ampdu_action = ath12k_mac_op_ampdu_action,
13049 .add_chanctx = ath12k_mac_op_add_chanctx,
13050 .remove_chanctx = ath12k_mac_op_remove_chanctx,
13051 .change_chanctx = ath12k_mac_op_change_chanctx,
13052 .assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
13053 .unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
13054 .switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
13055 .get_txpower = ath12k_mac_op_get_txpower,
13056 .set_rts_threshold = ath12k_mac_op_set_rts_threshold,
13057 .set_frag_threshold = ath12k_mac_op_set_frag_threshold,
13058 .set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
13059 .get_survey = ath12k_mac_op_get_survey,
13060 .flush = ath12k_mac_op_flush,
13061 .sta_statistics = ath12k_mac_op_sta_statistics,
13062 .link_sta_statistics = ath12k_mac_op_link_sta_statistics,
13063 .remain_on_channel = ath12k_mac_op_remain_on_channel,
13064 .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel,
13065 .change_sta_links = ath12k_mac_op_change_sta_links,
13066 .can_activate_links = ath12k_mac_op_can_activate_links,
13067 #ifdef CONFIG_PM
13068 .suspend = ath12k_wow_op_suspend,
13069 .resume = ath12k_wow_op_resume,
13070 .set_wakeup = ath12k_wow_op_set_wakeup,
13071 #endif
13072 #ifdef CONFIG_ATH12K_DEBUGFS
13073 .vif_add_debugfs = ath12k_debugfs_op_vif_add,
13074 #endif
13075 CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
13076 #ifdef CONFIG_ATH12K_DEBUGFS
13077 .link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add,
13078 #endif
13079 };
13080
ath12k_mac_update_freq_range(struct ath12k * ar,u32 freq_low,u32 freq_high)13081 void ath12k_mac_update_freq_range(struct ath12k *ar,
13082 u32 freq_low, u32 freq_high)
13083 {
13084 if (!(freq_low && freq_high))
13085 return;
13086
13087 if (ar->freq_range.start_freq || ar->freq_range.end_freq) {
13088 ar->freq_range.start_freq = min(ar->freq_range.start_freq,
13089 MHZ_TO_KHZ(freq_low));
13090 ar->freq_range.end_freq = max(ar->freq_range.end_freq,
13091 MHZ_TO_KHZ(freq_high));
13092 } else {
13093 ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low);
13094 ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high);
13095 }
13096
13097 ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13098 "mac pdev %u freq limit updated. New range %u->%u MHz\n",
13099 ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq),
13100 KHZ_TO_MHZ(ar->freq_range.end_freq));
13101 }
13102
ath12k_mac_update_ch_list(struct ath12k * ar,struct ieee80211_supported_band * band,u32 freq_low,u32 freq_high)13103 static void ath12k_mac_update_ch_list(struct ath12k *ar,
13104 struct ieee80211_supported_band *band,
13105 u32 freq_low, u32 freq_high)
13106 {
13107 int i;
13108
13109 if (!(freq_low && freq_high))
13110 return;
13111
13112 for (i = 0; i < band->n_channels; i++) {
13113 if (band->channels[i].center_freq < freq_low ||
13114 band->channels[i].center_freq > freq_high)
13115 band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
13116 }
13117 }
13118
ath12k_get_phy_id(struct ath12k * ar,u32 band)13119 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
13120 {
13121 struct ath12k_pdev *pdev = ar->pdev;
13122 struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
13123
13124 if (band == WMI_HOST_WLAN_2GHZ_CAP)
13125 return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
13126
13127 if (band == WMI_HOST_WLAN_5GHZ_CAP)
13128 return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
13129
13130 ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
13131
13132 return 0;
13133 }
13134
ath12k_mac_update_band(struct ath12k * ar,struct ieee80211_supported_band * orig_band,struct ieee80211_supported_band * new_band)13135 static int ath12k_mac_update_band(struct ath12k *ar,
13136 struct ieee80211_supported_band *orig_band,
13137 struct ieee80211_supported_band *new_band)
13138 {
13139 int i;
13140
13141 if (!orig_band || !new_band)
13142 return -EINVAL;
13143
13144 if (orig_band->band != new_band->band)
13145 return -EINVAL;
13146
13147 for (i = 0; i < new_band->n_channels; i++) {
13148 if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
13149 continue;
13150 /* An enabled channel in new_band should not be already enabled
13151 * in the orig_band
13152 */
13153 if (WARN_ON(!(orig_band->channels[i].flags &
13154 IEEE80211_CHAN_DISABLED)))
13155 return -EINVAL;
13156 orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
13157 }
13158 return 0;
13159 }
13160
ath12k_mac_setup_channels_rates(struct ath12k * ar,u32 supported_bands,struct ieee80211_supported_band * bands[])13161 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
13162 u32 supported_bands,
13163 struct ieee80211_supported_band *bands[])
13164 {
13165 struct ieee80211_supported_band *band;
13166 struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
13167 struct ath12k_base *ab = ar->ab;
13168 u32 phy_id, freq_low, freq_high;
13169 struct ath12k_hw *ah = ar->ah;
13170 void *channels;
13171 int ret;
13172
13173 BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
13174 ARRAY_SIZE(ath12k_5ghz_channels) +
13175 ARRAY_SIZE(ath12k_6ghz_channels)) !=
13176 ATH12K_NUM_CHANS);
13177
13178 reg_cap = &ab->hal_reg_cap[ar->pdev_idx];
13179
13180 if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
13181 channels = kmemdup(ath12k_2ghz_channels,
13182 sizeof(ath12k_2ghz_channels),
13183 GFP_KERNEL);
13184 if (!channels)
13185 return -ENOMEM;
13186
13187 band = &ar->mac.sbands[NL80211_BAND_2GHZ];
13188 band->band = NL80211_BAND_2GHZ;
13189 band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
13190 band->channels = channels;
13191 band->n_bitrates = ath12k_g_rates_size;
13192 band->bitrates = ath12k_g_rates;
13193
13194 if (ab->hw_params->single_pdev_only) {
13195 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
13196 reg_cap = &ab->hal_reg_cap[phy_id];
13197 }
13198
13199 freq_low = max(reg_cap->low_2ghz_chan,
13200 ab->reg_freq_2ghz.start_freq);
13201 freq_high = min(reg_cap->high_2ghz_chan,
13202 ab->reg_freq_2ghz.end_freq);
13203
13204 ath12k_mac_update_ch_list(ar, band,
13205 reg_cap->low_2ghz_chan,
13206 reg_cap->high_2ghz_chan);
13207
13208 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13209
13210 if (!bands[NL80211_BAND_2GHZ]) {
13211 bands[NL80211_BAND_2GHZ] = band;
13212 } else {
13213 /* Split mac in same band under same wiphy */
13214 ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
13215 if (ret) {
13216 kfree(channels);
13217 band->channels = NULL;
13218 return ret;
13219 }
13220 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
13221 ar->pdev->pdev_id,
13222 KHZ_TO_MHZ(ar->freq_range.start_freq),
13223 KHZ_TO_MHZ(ar->freq_range.end_freq));
13224 }
13225 }
13226
13227 if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
13228 if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) {
13229 channels = kmemdup(ath12k_6ghz_channels,
13230 sizeof(ath12k_6ghz_channels), GFP_KERNEL);
13231 if (!channels) {
13232 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13233 return -ENOMEM;
13234 }
13235
13236 ar->supports_6ghz = true;
13237 band = &ar->mac.sbands[NL80211_BAND_6GHZ];
13238 band->band = NL80211_BAND_6GHZ;
13239 band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
13240 band->channels = channels;
13241 band->n_bitrates = ath12k_a_rates_size;
13242 band->bitrates = ath12k_a_rates;
13243
13244 freq_low = max(reg_cap->low_5ghz_chan,
13245 ab->reg_freq_6ghz.start_freq);
13246 freq_high = min(reg_cap->high_5ghz_chan,
13247 ab->reg_freq_6ghz.end_freq);
13248
13249 ath12k_mac_update_ch_list(ar, band,
13250 reg_cap->low_5ghz_chan,
13251 reg_cap->high_5ghz_chan);
13252
13253 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13254 ah->use_6ghz_regd = true;
13255
13256 if (!bands[NL80211_BAND_6GHZ]) {
13257 bands[NL80211_BAND_6GHZ] = band;
13258 } else {
13259 /* Split mac in same band under same wiphy */
13260 ret = ath12k_mac_update_band(ar,
13261 bands[NL80211_BAND_6GHZ],
13262 band);
13263 if (ret) {
13264 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13265 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13266 kfree(channels);
13267 band->channels = NULL;
13268 return ret;
13269 }
13270 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
13271 ar->pdev->pdev_id,
13272 KHZ_TO_MHZ(ar->freq_range.start_freq),
13273 KHZ_TO_MHZ(ar->freq_range.end_freq));
13274 }
13275 }
13276
13277 if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
13278 channels = kmemdup(ath12k_5ghz_channels,
13279 sizeof(ath12k_5ghz_channels),
13280 GFP_KERNEL);
13281 if (!channels) {
13282 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13283 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13284 return -ENOMEM;
13285 }
13286
13287 band = &ar->mac.sbands[NL80211_BAND_5GHZ];
13288 band->band = NL80211_BAND_5GHZ;
13289 band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
13290 band->channels = channels;
13291 band->n_bitrates = ath12k_a_rates_size;
13292 band->bitrates = ath12k_a_rates;
13293
13294 if (ab->hw_params->single_pdev_only) {
13295 phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
13296 reg_cap = &ab->hal_reg_cap[phy_id];
13297 }
13298
13299 freq_low = max(reg_cap->low_5ghz_chan,
13300 ab->reg_freq_5ghz.start_freq);
13301 freq_high = min(reg_cap->high_5ghz_chan,
13302 ab->reg_freq_5ghz.end_freq);
13303
13304 ath12k_mac_update_ch_list(ar, band,
13305 reg_cap->low_5ghz_chan,
13306 reg_cap->high_5ghz_chan);
13307
13308 ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13309
13310 if (!bands[NL80211_BAND_5GHZ]) {
13311 bands[NL80211_BAND_5GHZ] = band;
13312 } else {
13313 /* Split mac in same band under same wiphy */
13314 ret = ath12k_mac_update_band(ar,
13315 bands[NL80211_BAND_5GHZ],
13316 band);
13317 if (ret) {
13318 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13319 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13320 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13321 ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13322 kfree(channels);
13323 band->channels = NULL;
13324 return ret;
13325 }
13326 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
13327 ar->pdev->pdev_id,
13328 KHZ_TO_MHZ(ar->freq_range.start_freq),
13329 KHZ_TO_MHZ(ar->freq_range.end_freq));
13330 }
13331 }
13332 }
13333
13334 return 0;
13335 }
13336
ath12k_mac_get_ifmodes(struct ath12k_hw * ah)13337 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
13338 {
13339 struct ath12k *ar;
13340 int i;
13341 u16 interface_modes = U16_MAX;
13342
13343 for_each_ar(ah, ar, i)
13344 interface_modes &= ar->ab->hw_params->interface_modes;
13345
13346 return interface_modes == U16_MAX ? 0 : interface_modes;
13347 }
13348
ath12k_mac_is_iface_mode_enable(struct ath12k_hw * ah,enum nl80211_iftype type)13349 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
13350 enum nl80211_iftype type)
13351 {
13352 struct ath12k *ar;
13353 int i;
13354 u16 interface_modes, mode = 0;
13355 bool is_enable = false;
13356
13357 if (type == NL80211_IFTYPE_MESH_POINT) {
13358 if (IS_ENABLED(CONFIG_MAC80211_MESH))
13359 mode = BIT(type);
13360 } else {
13361 mode = BIT(type);
13362 }
13363
13364 for_each_ar(ah, ar, i) {
13365 interface_modes = ar->ab->hw_params->interface_modes;
13366 if (interface_modes & mode) {
13367 is_enable = true;
13368 break;
13369 }
13370 }
13371
13372 return is_enable;
13373 }
13374
13375 static int
ath12k_mac_setup_radio_iface_comb(struct ath12k * ar,struct ieee80211_iface_combination * comb)13376 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar,
13377 struct ieee80211_iface_combination *comb)
13378 {
13379 u16 interface_modes = ar->ab->hw_params->interface_modes;
13380 struct ieee80211_iface_limit *limits;
13381 int n_limits, max_interfaces;
13382 bool ap, mesh, p2p;
13383
13384 ap = interface_modes & BIT(NL80211_IFTYPE_AP);
13385 p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
13386
13387 mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
13388 (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT));
13389
13390 if ((ap || mesh) && !p2p) {
13391 n_limits = 2;
13392 max_interfaces = 16;
13393 } else if (p2p) {
13394 n_limits = 3;
13395 if (ap || mesh)
13396 max_interfaces = 16;
13397 else
13398 max_interfaces = 3;
13399 } else {
13400 n_limits = 1;
13401 max_interfaces = 1;
13402 }
13403
13404 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13405 if (!limits)
13406 return -ENOMEM;
13407
13408 limits[0].max = 1;
13409 limits[0].types |= BIT(NL80211_IFTYPE_STATION);
13410
13411 if (ap || mesh || p2p)
13412 limits[1].max = max_interfaces;
13413
13414 if (ap)
13415 limits[1].types |= BIT(NL80211_IFTYPE_AP);
13416
13417 if (mesh)
13418 limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
13419
13420 if (p2p) {
13421 limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
13422 BIT(NL80211_IFTYPE_P2P_GO);
13423 limits[2].max = 1;
13424 limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
13425 }
13426
13427 comb[0].limits = limits;
13428 comb[0].n_limits = n_limits;
13429 comb[0].max_interfaces = max_interfaces;
13430 comb[0].beacon_int_infra_match = true;
13431 comb[0].beacon_int_min_gcd = 100;
13432
13433 comb[0].num_different_channels = 1;
13434 comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
13435 BIT(NL80211_CHAN_WIDTH_20) |
13436 BIT(NL80211_CHAN_WIDTH_40) |
13437 BIT(NL80211_CHAN_WIDTH_80) |
13438 BIT(NL80211_CHAN_WIDTH_160);
13439
13440 return 0;
13441 }
13442
13443 static int
ath12k_mac_setup_global_iface_comb(struct ath12k_hw * ah,struct wiphy_radio * radio,u8 n_radio,struct ieee80211_iface_combination * comb)13444 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah,
13445 struct wiphy_radio *radio,
13446 u8 n_radio,
13447 struct ieee80211_iface_combination *comb)
13448 {
13449 const struct ieee80211_iface_combination *iter_comb;
13450 struct ieee80211_iface_limit *limits;
13451 int i, j, n_limits;
13452 bool ap, mesh, p2p;
13453
13454 if (!n_radio)
13455 return 0;
13456
13457 ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
13458 p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
13459 mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
13460
13461 if ((ap || mesh) && !p2p)
13462 n_limits = 2;
13463 else if (p2p)
13464 n_limits = 3;
13465 else
13466 n_limits = 1;
13467
13468 limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13469 if (!limits)
13470 return -ENOMEM;
13471
13472 for (i = 0; i < n_radio; i++) {
13473 iter_comb = radio[i].iface_combinations;
13474 for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) {
13475 limits[j].types |= iter_comb->limits[j].types;
13476 limits[j].max += iter_comb->limits[j].max;
13477 }
13478
13479 comb->max_interfaces += iter_comb->max_interfaces;
13480 comb->num_different_channels += iter_comb->num_different_channels;
13481 comb->radar_detect_widths |= iter_comb->radar_detect_widths;
13482 }
13483
13484 comb->limits = limits;
13485 comb->n_limits = n_limits;
13486 comb->beacon_int_infra_match = true;
13487 comb->beacon_int_min_gcd = 100;
13488
13489 return 0;
13490 }
13491
13492 static
ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination * iface_comb)13493 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb)
13494 {
13495 kfree(iface_comb[0].limits);
13496 kfree(iface_comb);
13497 }
13498
ath12k_mac_cleanup_iface_combinations(struct ath12k_hw * ah)13499 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah)
13500 {
13501 struct wiphy *wiphy = ah->hw->wiphy;
13502 const struct wiphy_radio *radio;
13503 int i;
13504
13505 if (wiphy->n_radio > 0) {
13506 radio = wiphy->radio;
13507 for (i = 0; i < wiphy->n_radio; i++)
13508 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13509
13510 kfree(wiphy->radio);
13511 }
13512
13513 ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations);
13514 }
13515
ath12k_mac_setup_iface_combinations(struct ath12k_hw * ah)13516 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
13517 {
13518 struct ieee80211_iface_combination *combinations, *comb;
13519 struct wiphy *wiphy = ah->hw->wiphy;
13520 struct wiphy_radio *radio;
13521 int n_combinations = 1;
13522 struct ath12k *ar;
13523 int i, ret;
13524
13525 if (ah->num_radio == 1) {
13526 ar = &ah->radio[0];
13527
13528 if (ar->ab->hw_params->single_pdev_only)
13529 n_combinations = 2;
13530
13531 combinations = kcalloc(n_combinations, sizeof(*combinations),
13532 GFP_KERNEL);
13533 if (!combinations)
13534 return -ENOMEM;
13535
13536 ret = ath12k_mac_setup_radio_iface_comb(ar, combinations);
13537 if (ret) {
13538 ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d",
13539 ret);
13540 goto err_free_combinations;
13541 }
13542
13543 if (ar->ab->hw_params->single_pdev_only) {
13544 comb = combinations + 1;
13545 memcpy(comb, combinations, sizeof(*comb));
13546 comb->num_different_channels = 2;
13547 comb->radar_detect_widths = 0;
13548 }
13549
13550 goto out;
13551 }
13552
13553 combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL);
13554 if (!combinations)
13555 return -ENOMEM;
13556
13557 /* there are multiple radios */
13558
13559 radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL);
13560 if (!radio) {
13561 ret = -ENOMEM;
13562 goto err_free_combinations;
13563 }
13564
13565 for_each_ar(ah, ar, i) {
13566 comb = kzalloc(sizeof(*comb), GFP_KERNEL);
13567 if (!comb) {
13568 ret = -ENOMEM;
13569 goto err_free_radios;
13570 }
13571
13572 ret = ath12k_mac_setup_radio_iface_comb(ar, comb);
13573 if (ret) {
13574 ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d",
13575 i, ret);
13576 kfree(comb);
13577 goto err_free_radios;
13578 }
13579
13580 radio[i].freq_range = &ar->freq_range;
13581 radio[i].n_freq_range = 1;
13582
13583 radio[i].iface_combinations = comb;
13584 radio[i].n_iface_combinations = 1;
13585 }
13586
13587 ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations);
13588 if (ret) {
13589 ath12k_hw_warn(ah, "failed to setup global interface combinations: %d",
13590 ret);
13591 goto err_free_all_radios;
13592 }
13593
13594 wiphy->radio = radio;
13595 wiphy->n_radio = ah->num_radio;
13596
13597 out:
13598 wiphy->iface_combinations = combinations;
13599 wiphy->n_iface_combinations = n_combinations;
13600
13601 return 0;
13602
13603 err_free_all_radios:
13604 i = ah->num_radio;
13605
13606 err_free_radios:
13607 while (i--)
13608 ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13609
13610 kfree(radio);
13611
13612 err_free_combinations:
13613 kfree(combinations);
13614
13615 return ret;
13616 }
13617
13618 static const u8 ath12k_if_types_ext_capa[] = {
13619 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13620 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13621 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13622 };
13623
13624 static const u8 ath12k_if_types_ext_capa_sta[] = {
13625 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13626 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13627 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13628 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
13629 };
13630
13631 static const u8 ath12k_if_types_ext_capa_ap[] = {
13632 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13633 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13634 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13635 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
13636 [10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
13637 };
13638
13639 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
13640 {
13641 .extended_capabilities = ath12k_if_types_ext_capa,
13642 .extended_capabilities_mask = ath12k_if_types_ext_capa,
13643 .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
13644 }, {
13645 .iftype = NL80211_IFTYPE_STATION,
13646 .extended_capabilities = ath12k_if_types_ext_capa_sta,
13647 .extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
13648 .extended_capabilities_len =
13649 sizeof(ath12k_if_types_ext_capa_sta),
13650 }, {
13651 .iftype = NL80211_IFTYPE_AP,
13652 .extended_capabilities = ath12k_if_types_ext_capa_ap,
13653 .extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
13654 .extended_capabilities_len =
13655 sizeof(ath12k_if_types_ext_capa_ap),
13656 .eml_capabilities = 0,
13657 .mld_capa_and_ops = 0,
13658 },
13659 };
13660
ath12k_mac_cleanup_unregister(struct ath12k * ar)13661 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
13662 {
13663 idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
13664 idr_destroy(&ar->txmgmt_idr);
13665
13666 kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13667 kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
13668 kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13669 }
13670
ath12k_mac_hw_unregister(struct ath12k_hw * ah)13671 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
13672 {
13673 struct ieee80211_hw *hw = ah->hw;
13674 struct ath12k *ar;
13675 int i;
13676
13677 for_each_ar(ah, ar, i) {
13678 cancel_work_sync(&ar->regd_channel_update_work);
13679 cancel_work_sync(&ar->regd_update_work);
13680 ath12k_debugfs_unregister(ar);
13681 ath12k_fw_stats_reset(ar);
13682 }
13683
13684 ieee80211_unregister_hw(hw);
13685
13686 for_each_ar(ah, ar, i)
13687 ath12k_mac_cleanup_unregister(ar);
13688
13689 ath12k_mac_cleanup_iface_combinations(ah);
13690
13691 SET_IEEE80211_DEV(hw, NULL);
13692 }
13693
ath12k_mac_setup_register(struct ath12k * ar,u32 * ht_cap,struct ieee80211_supported_band * bands[])13694 static int ath12k_mac_setup_register(struct ath12k *ar,
13695 u32 *ht_cap,
13696 struct ieee80211_supported_band *bands[])
13697 {
13698 struct ath12k_pdev_cap *cap = &ar->pdev->cap;
13699 int ret;
13700
13701 init_waitqueue_head(&ar->txmgmt_empty_waitq);
13702 idr_init(&ar->txmgmt_idr);
13703 spin_lock_init(&ar->txmgmt_idr_lock);
13704
13705 ath12k_pdev_caps_update(ar);
13706
13707 ret = ath12k_mac_setup_channels_rates(ar,
13708 cap->supported_bands,
13709 bands);
13710 if (ret)
13711 return ret;
13712
13713 ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
13714 ath12k_mac_setup_sband_iftype_data(ar, cap);
13715
13716 ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
13717 ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
13718
13719 ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR;
13720 ar->rssi_info.temp_offset = 0;
13721 ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset;
13722
13723 return 0;
13724 }
13725
ath12k_mac_hw_register(struct ath12k_hw * ah)13726 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
13727 {
13728 struct ieee80211_hw *hw = ah->hw;
13729 struct wiphy *wiphy = hw->wiphy;
13730 struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
13731 struct ath12k_base *ab = ar->ab;
13732 struct ath12k_pdev *pdev;
13733 struct ath12k_pdev_cap *cap;
13734 static const u32 cipher_suites[] = {
13735 WLAN_CIPHER_SUITE_TKIP,
13736 WLAN_CIPHER_SUITE_CCMP,
13737 WLAN_CIPHER_SUITE_AES_CMAC,
13738 WLAN_CIPHER_SUITE_BIP_CMAC_256,
13739 WLAN_CIPHER_SUITE_BIP_GMAC_128,
13740 WLAN_CIPHER_SUITE_BIP_GMAC_256,
13741 WLAN_CIPHER_SUITE_GCMP,
13742 WLAN_CIPHER_SUITE_GCMP_256,
13743 WLAN_CIPHER_SUITE_CCMP_256,
13744 };
13745 int ret, i, j;
13746 u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0;
13747 bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false;
13748 u8 *mac_addr = NULL;
13749 u8 mbssid_max_interfaces = 0;
13750
13751 wiphy->max_ap_assoc_sta = 0;
13752
13753 for_each_ar(ah, ar, i) {
13754 u32 ht_cap_info = 0;
13755
13756 pdev = ar->pdev;
13757 if (ar->ab->pdevs_macaddr_valid) {
13758 ether_addr_copy(ar->mac_addr, pdev->mac_addr);
13759 } else {
13760 ether_addr_copy(ar->mac_addr, ar->ab->mac_addr);
13761 ar->mac_addr[4] += ar->pdev_idx;
13762 }
13763
13764 ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands);
13765 if (ret)
13766 goto err_cleanup_unregister;
13767
13768 /* 6 GHz does not support HT Cap, hence do not consider it */
13769 if (!ar->supports_6ghz)
13770 ht_cap &= ht_cap_info;
13771
13772 wiphy->max_ap_assoc_sta += ar->max_num_stations;
13773
13774 /* Advertise the max antenna support of all radios, driver can handle
13775 * per pdev specific antenna setting based on pdev cap when antenna
13776 * changes are made
13777 */
13778 cap = &pdev->cap;
13779
13780 antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask);
13781 antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask);
13782
13783 if (ar->supports_6ghz)
13784 is_6ghz = true;
13785
13786 if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
13787 is_raw_mode = true;
13788
13789 if (!ar->ab->hw_params->supports_monitor)
13790 is_monitor_disable = true;
13791
13792 if (i == 0)
13793 mac_addr = ar->mac_addr;
13794 else
13795 mac_addr = ab->mac_addr;
13796
13797 mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab);
13798 }
13799
13800 wiphy->available_antennas_rx = antennas_rx;
13801 wiphy->available_antennas_tx = antennas_tx;
13802
13803 SET_IEEE80211_PERM_ADDR(hw, mac_addr);
13804 SET_IEEE80211_DEV(hw, ab->dev);
13805
13806 ret = ath12k_mac_setup_iface_combinations(ah);
13807 if (ret) {
13808 ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
13809 goto err_complete_cleanup_unregister;
13810 }
13811
13812 wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
13813
13814 if (ah->num_radio == 1 &&
13815 wiphy->bands[NL80211_BAND_2GHZ] &&
13816 wiphy->bands[NL80211_BAND_5GHZ] &&
13817 wiphy->bands[NL80211_BAND_6GHZ])
13818 ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
13819
13820 ieee80211_hw_set(hw, SIGNAL_DBM);
13821 ieee80211_hw_set(hw, SUPPORTS_PS);
13822 ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
13823 ieee80211_hw_set(hw, MFP_CAPABLE);
13824 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
13825 ieee80211_hw_set(hw, HAS_RATE_CONTROL);
13826 ieee80211_hw_set(hw, AP_LINK_PS);
13827 ieee80211_hw_set(hw, SPECTRUM_MGMT);
13828 ieee80211_hw_set(hw, CONNECTION_MONITOR);
13829 ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
13830 ieee80211_hw_set(hw, CHANCTX_STA_CSA);
13831 ieee80211_hw_set(hw, QUEUE_CONTROL);
13832 ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
13833 ieee80211_hw_set(hw, REPORTS_LOW_ACK);
13834 ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
13835
13836 if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) {
13837 ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
13838 ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
13839 }
13840
13841 if (cap->nss_ratio_enabled)
13842 ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
13843
13844 if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
13845 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
13846 ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
13847 ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
13848 ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
13849 ieee80211_hw_set(hw, USES_RSS);
13850 }
13851
13852 wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
13853 wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
13854
13855 /* TODO: Check if HT capability advertised from firmware is different
13856 * for each band for a dual band capable radio. It will be tricky to
13857 * handle it when the ht capability different for each band.
13858 */
13859 if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
13860 (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz))
13861 wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
13862
13863 wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
13864 wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
13865
13866 hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
13867
13868 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
13869 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
13870 wiphy->max_remain_on_channel_duration = 5000;
13871
13872 wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
13873 wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
13874 NL80211_FEATURE_AP_SCAN;
13875
13876 wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
13877
13878 /* MLO is not yet supported so disable Wireless Extensions for now
13879 * to make sure ath12k users don't use it. This flag can be removed
13880 * once WIPHY_FLAG_SUPPORTS_MLO is enabled.
13881 */
13882 wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
13883
13884 /* Copy over MLO related capabilities received from
13885 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set.
13886 */
13887 if (ab->ag->mlo_capable) {
13888 ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap;
13889 ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap;
13890 wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
13891
13892 ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX);
13893 }
13894
13895 hw->queues = ATH12K_HW_MAX_QUEUES;
13896 wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
13897 hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
13898 hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
13899
13900 hw->vif_data_size = sizeof(struct ath12k_vif);
13901 hw->sta_data_size = sizeof(struct ath12k_sta);
13902 hw->extra_tx_headroom = ab->hw_params->iova_mask;
13903
13904 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
13905 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
13906 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
13907
13908 wiphy->cipher_suites = cipher_suites;
13909 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
13910
13911 wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
13912 wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
13913
13914 wiphy->mbssid_max_interfaces = mbssid_max_interfaces;
13915 wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
13916 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
13917
13918 if (is_6ghz) {
13919 wiphy_ext_feature_set(wiphy,
13920 NL80211_EXT_FEATURE_FILS_DISCOVERY);
13921 wiphy_ext_feature_set(wiphy,
13922 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
13923 }
13924
13925 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
13926 if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map))
13927 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
13928
13929 ath12k_reg_init(hw);
13930
13931 if (!is_raw_mode) {
13932 hw->netdev_features = NETIF_F_HW_CSUM;
13933 ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
13934 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
13935 }
13936
13937 if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
13938 wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
13939 wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
13940 wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
13941 wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
13942 wiphy->max_sched_scan_plan_interval =
13943 WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
13944 wiphy->max_sched_scan_plan_iterations =
13945 WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
13946 wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
13947 }
13948
13949 ret = ath12k_wow_init(ar);
13950 if (ret) {
13951 ath12k_warn(ar->ab, "failed to init wow: %d\n", ret);
13952 goto err_cleanup_if_combs;
13953 }
13954
13955 /* Boot-time regulatory updates have already been processed.
13956 * Mark them as complete now, because after registration,
13957 * cfg80211 will notify us again if there are any pending hints.
13958 * We need to wait for those hints to be processed, so it's
13959 * important to mark the boot-time updates as complete before
13960 * proceeding with registration.
13961 */
13962 for_each_ar(ah, ar, i)
13963 complete_all(&ar->regd_update_completed);
13964
13965 ret = ieee80211_register_hw(hw);
13966 if (ret) {
13967 ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
13968 goto err_cleanup_if_combs;
13969 }
13970
13971 if (is_monitor_disable)
13972 /* There's a race between calling ieee80211_register_hw()
13973 * and here where the monitor mode is enabled for a little
13974 * while. But that time is so short and in practise it make
13975 * a difference in real life.
13976 */
13977 wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
13978
13979 for_each_ar(ah, ar, i) {
13980 /* Apply the regd received during initialization */
13981 ret = ath12k_regd_update(ar, true);
13982 if (ret) {
13983 ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
13984 goto err_unregister_hw;
13985 }
13986
13987 if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
13988 struct wmi_set_current_country_arg current_cc = {};
13989
13990 memcpy(¤t_cc.alpha2, ab->new_alpha2, 2);
13991 memcpy(&ar->alpha2, ab->new_alpha2, 2);
13992
13993 reinit_completion(&ar->regd_update_completed);
13994
13995 ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_cc);
13996 if (ret)
13997 ath12k_warn(ar->ab,
13998 "failed set cc code for mac register: %d\n",
13999 ret);
14000 }
14001
14002 ath12k_fw_stats_init(ar);
14003 ath12k_debugfs_register(ar);
14004 }
14005
14006 return 0;
14007
14008 err_unregister_hw:
14009 for_each_ar(ah, ar, i)
14010 ath12k_debugfs_unregister(ar);
14011
14012 ieee80211_unregister_hw(hw);
14013
14014 err_cleanup_if_combs:
14015 ath12k_mac_cleanup_iface_combinations(ah);
14016
14017 err_complete_cleanup_unregister:
14018 i = ah->num_radio;
14019
14020 err_cleanup_unregister:
14021 for (j = 0; j < i; j++) {
14022 ar = ath12k_ah_to_ar(ah, j);
14023 ath12k_mac_cleanup_unregister(ar);
14024 }
14025
14026 SET_IEEE80211_DEV(hw, NULL);
14027
14028 return ret;
14029 }
14030
ath12k_mac_setup(struct ath12k * ar)14031 static void ath12k_mac_setup(struct ath12k *ar)
14032 {
14033 struct ath12k_base *ab = ar->ab;
14034 struct ath12k_pdev *pdev = ar->pdev;
14035 u8 pdev_idx = ar->pdev_idx;
14036
14037 ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
14038
14039 ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
14040 /* FIXME: wmi[0] is already initialized during attach,
14041 * Should we do this again?
14042 */
14043 ath12k_wmi_pdev_attach(ab, pdev_idx);
14044
14045 ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
14046 ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
14047 ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
14048 ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
14049 ar->scan.arvif = NULL;
14050 ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
14051
14052 spin_lock_init(&ar->data_lock);
14053 INIT_LIST_HEAD(&ar->arvifs);
14054 INIT_LIST_HEAD(&ar->ppdu_stats_info);
14055
14056 init_completion(&ar->vdev_setup_done);
14057 init_completion(&ar->vdev_delete_done);
14058 init_completion(&ar->peer_assoc_done);
14059 init_completion(&ar->peer_delete_done);
14060 init_completion(&ar->install_key_done);
14061 init_completion(&ar->bss_survey_done);
14062 init_completion(&ar->scan.started);
14063 init_completion(&ar->scan.completed);
14064 init_completion(&ar->scan.on_channel);
14065 init_completion(&ar->mlo_setup_done);
14066 init_completion(&ar->completed_11d_scan);
14067 init_completion(&ar->regd_update_completed);
14068
14069 INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
14070 wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
14071 INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work);
14072 INIT_LIST_HEAD(&ar->regd_channel_update_queue);
14073 INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
14074
14075 wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
14076 skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
14077
14078 ar->monitor_vdev_id = -1;
14079 ar->monitor_vdev_created = false;
14080 ar->monitor_started = false;
14081 }
14082
__ath12k_mac_mlo_setup(struct ath12k * ar)14083 static int __ath12k_mac_mlo_setup(struct ath12k *ar)
14084 {
14085 u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {};
14086 struct ath12k_base *partner_ab, *ab = ar->ab;
14087 struct ath12k_hw_group *ag = ab->ag;
14088 struct wmi_mlo_setup_arg mlo = {};
14089 struct ath12k_pdev *pdev;
14090 unsigned long time_left;
14091 int i, j, ret;
14092
14093 lockdep_assert_held(&ag->mutex);
14094
14095 reinit_completion(&ar->mlo_setup_done);
14096
14097 for (i = 0; i < ag->num_devices; i++) {
14098 partner_ab = ag->ab[i];
14099
14100 for (j = 0; j < partner_ab->num_radios; j++) {
14101 pdev = &partner_ab->pdevs[j];
14102
14103 /* Avoid the self link */
14104 if (ar == pdev->ar)
14105 continue;
14106
14107 partner_link_id[num_link] = pdev->hw_link_id;
14108 num_link++;
14109
14110 ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n",
14111 i, j, pdev->hw_link_id, num_link);
14112 }
14113 }
14114
14115 if (num_link == 0)
14116 return 0;
14117
14118 mlo.group_id = cpu_to_le32(ag->id);
14119 mlo.partner_link_id = partner_link_id;
14120 mlo.num_partner_links = num_link;
14121 ar->mlo_setup_status = 0;
14122
14123 ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link);
14124
14125 ret = ath12k_wmi_mlo_setup(ar, &mlo);
14126 if (ret) {
14127 ath12k_err(ab, "failed to send setup MLO WMI command for pdev %d: %d\n",
14128 ar->pdev_idx, ret);
14129 return ret;
14130 }
14131
14132 time_left = wait_for_completion_timeout(&ar->mlo_setup_done,
14133 WMI_MLO_CMD_TIMEOUT_HZ);
14134
14135 if (!time_left || ar->mlo_setup_status)
14136 return ar->mlo_setup_status ? : -ETIMEDOUT;
14137
14138 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx);
14139
14140 return 0;
14141 }
14142
__ath12k_mac_mlo_teardown(struct ath12k * ar)14143 static int __ath12k_mac_mlo_teardown(struct ath12k *ar)
14144 {
14145 struct ath12k_base *ab = ar->ab;
14146 int ret;
14147 u8 num_link;
14148
14149 if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
14150 return 0;
14151
14152 num_link = ath12k_get_num_partner_link(ar);
14153
14154 if (num_link == 0)
14155 return 0;
14156
14157 ret = ath12k_wmi_mlo_teardown(ar);
14158 if (ret) {
14159 ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n",
14160 ar->pdev_idx, ret);
14161 return ret;
14162 }
14163
14164 ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx);
14165
14166 return 0;
14167 }
14168
ath12k_mac_mlo_setup(struct ath12k_hw_group * ag)14169 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag)
14170 {
14171 struct ath12k_hw *ah;
14172 struct ath12k *ar;
14173 int ret;
14174 int i, j;
14175
14176 for (i = 0; i < ag->num_hw; i++) {
14177 ah = ag->ah[i];
14178 if (!ah)
14179 continue;
14180
14181 for_each_ar(ah, ar, j) {
14182 ar = &ah->radio[j];
14183 ret = __ath12k_mac_mlo_setup(ar);
14184 if (ret) {
14185 ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret);
14186 goto err_setup;
14187 }
14188 }
14189 }
14190
14191 return 0;
14192
14193 err_setup:
14194 for (i = i - 1; i >= 0; i--) {
14195 ah = ag->ah[i];
14196 if (!ah)
14197 continue;
14198
14199 for (j = j - 1; j >= 0; j--) {
14200 ar = &ah->radio[j];
14201 if (!ar)
14202 continue;
14203
14204 __ath12k_mac_mlo_teardown(ar);
14205 }
14206 }
14207
14208 return ret;
14209 }
14210
ath12k_mac_mlo_teardown(struct ath12k_hw_group * ag)14211 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag)
14212 {
14213 struct ath12k_hw *ah;
14214 struct ath12k *ar;
14215 int ret, i, j;
14216
14217 for (i = 0; i < ag->num_hw; i++) {
14218 ah = ag->ah[i];
14219 if (!ah)
14220 continue;
14221
14222 for_each_ar(ah, ar, j) {
14223 ar = &ah->radio[j];
14224 ret = __ath12k_mac_mlo_teardown(ar);
14225 if (ret) {
14226 ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret);
14227 break;
14228 }
14229 }
14230 }
14231 }
14232
ath12k_mac_register(struct ath12k_hw_group * ag)14233 int ath12k_mac_register(struct ath12k_hw_group *ag)
14234 {
14235 struct ath12k_hw *ah;
14236 int i;
14237 int ret;
14238
14239 for (i = 0; i < ag->num_hw; i++) {
14240 ah = ath12k_ag_to_ah(ag, i);
14241
14242 ret = ath12k_mac_hw_register(ah);
14243 if (ret)
14244 goto err;
14245 }
14246
14247 return 0;
14248
14249 err:
14250 for (i = i - 1; i >= 0; i--) {
14251 ah = ath12k_ag_to_ah(ag, i);
14252 if (!ah)
14253 continue;
14254
14255 ath12k_mac_hw_unregister(ah);
14256 }
14257
14258 return ret;
14259 }
14260
ath12k_mac_unregister(struct ath12k_hw_group * ag)14261 void ath12k_mac_unregister(struct ath12k_hw_group *ag)
14262 {
14263 struct ath12k_hw *ah;
14264 int i;
14265
14266 for (i = ag->num_hw - 1; i >= 0; i--) {
14267 ah = ath12k_ag_to_ah(ag, i);
14268 if (!ah)
14269 continue;
14270
14271 ath12k_mac_hw_unregister(ah);
14272 }
14273 }
14274
ath12k_mac_hw_destroy(struct ath12k_hw * ah)14275 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
14276 {
14277 ieee80211_free_hw(ah->hw);
14278 }
14279
ath12k_mac_hw_allocate(struct ath12k_hw_group * ag,struct ath12k_pdev_map * pdev_map,u8 num_pdev_map)14280 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag,
14281 struct ath12k_pdev_map *pdev_map,
14282 u8 num_pdev_map)
14283 {
14284 struct ieee80211_hw *hw;
14285 struct ath12k *ar;
14286 struct ath12k_base *ab;
14287 struct ath12k_pdev *pdev;
14288 struct ath12k_hw *ah;
14289 int i;
14290 u8 pdev_idx;
14291
14292 hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
14293 &ath12k_ops);
14294 if (!hw)
14295 return NULL;
14296
14297 ah = ath12k_hw_to_ah(hw);
14298 ah->hw = hw;
14299 ah->num_radio = num_pdev_map;
14300
14301 mutex_init(&ah->hw_mutex);
14302 INIT_LIST_HEAD(&ah->ml_peers);
14303
14304 for (i = 0; i < num_pdev_map; i++) {
14305 ab = pdev_map[i].ab;
14306 pdev_idx = pdev_map[i].pdev_idx;
14307 pdev = &ab->pdevs[pdev_idx];
14308
14309 ar = ath12k_ah_to_ar(ah, i);
14310 ar->ah = ah;
14311 ar->ab = ab;
14312 ar->hw_link_id = pdev->hw_link_id;
14313 ar->pdev = pdev;
14314 ar->pdev_idx = pdev_idx;
14315 pdev->ar = ar;
14316
14317 ag->hw_links[ar->hw_link_id].device_id = ab->device_id;
14318 ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx;
14319
14320 ath12k_mac_setup(ar);
14321 ath12k_dp_pdev_pre_alloc(ar);
14322 }
14323
14324 return ah;
14325 }
14326
ath12k_mac_destroy(struct ath12k_hw_group * ag)14327 void ath12k_mac_destroy(struct ath12k_hw_group *ag)
14328 {
14329 struct ath12k_pdev *pdev;
14330 struct ath12k_base *ab = ag->ab[0];
14331 int i, j;
14332 struct ath12k_hw *ah;
14333
14334 for (i = 0; i < ag->num_devices; i++) {
14335 ab = ag->ab[i];
14336 if (!ab)
14337 continue;
14338
14339 for (j = 0; j < ab->num_radios; j++) {
14340 pdev = &ab->pdevs[j];
14341 if (!pdev->ar)
14342 continue;
14343 pdev->ar = NULL;
14344 }
14345 }
14346
14347 for (i = 0; i < ag->num_hw; i++) {
14348 ah = ath12k_ag_to_ah(ag, i);
14349 if (!ah)
14350 continue;
14351
14352 ath12k_mac_hw_destroy(ah);
14353 ath12k_ag_set_ah(ag, i, NULL);
14354 }
14355 }
14356
ath12k_mac_set_device_defaults(struct ath12k_base * ab)14357 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab)
14358 {
14359 int total_vdev;
14360
14361 /* Initialize channel counters frequency value in hertz */
14362 ab->cc_freq_hz = 320000;
14363 total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab);
14364 ab->free_vdev_map = (1LL << total_vdev) - 1;
14365 }
14366
ath12k_mac_allocate(struct ath12k_hw_group * ag)14367 int ath12k_mac_allocate(struct ath12k_hw_group *ag)
14368 {
14369 struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO];
14370 int mac_id, device_id, total_radio, num_hw;
14371 struct ath12k_base *ab;
14372 struct ath12k_hw *ah;
14373 int ret, i, j;
14374 u8 radio_per_hw;
14375
14376 total_radio = 0;
14377 for (i = 0; i < ag->num_devices; i++) {
14378 ab = ag->ab[i];
14379 if (!ab)
14380 continue;
14381
14382 ath12k_debugfs_pdev_create(ab);
14383 ath12k_mac_set_device_defaults(ab);
14384 total_radio += ab->num_radios;
14385 }
14386
14387 if (!total_radio)
14388 return -EINVAL;
14389
14390 if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO))
14391 return -ENOSPC;
14392
14393 /* All pdev get combined and register as single wiphy based on
14394 * hardware group which participate in multi-link operation else
14395 * each pdev get register separately.
14396 */
14397 if (ag->mlo_capable)
14398 radio_per_hw = total_radio;
14399 else
14400 radio_per_hw = 1;
14401
14402 num_hw = total_radio / radio_per_hw;
14403
14404 ag->num_hw = 0;
14405 device_id = 0;
14406 mac_id = 0;
14407 for (i = 0; i < num_hw; i++) {
14408 for (j = 0; j < radio_per_hw; j++) {
14409 if (device_id >= ag->num_devices || !ag->ab[device_id]) {
14410 ret = -ENOSPC;
14411 goto err;
14412 }
14413
14414 ab = ag->ab[device_id];
14415 pdev_map[j].ab = ab;
14416 pdev_map[j].pdev_idx = mac_id;
14417 mac_id++;
14418
14419 /* If mac_id falls beyond the current device MACs then
14420 * move to next device
14421 */
14422 if (mac_id >= ab->num_radios) {
14423 mac_id = 0;
14424 device_id++;
14425 }
14426 }
14427
14428 ab = pdev_map->ab;
14429
14430 ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw);
14431 if (!ah) {
14432 ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
14433 i);
14434 ret = -ENOMEM;
14435 goto err;
14436 }
14437
14438 ah->dev = ab->dev;
14439
14440 ag->ah[i] = ah;
14441 ag->num_hw++;
14442 }
14443
14444 return 0;
14445
14446 err:
14447 for (i = i - 1; i >= 0; i--) {
14448 ah = ath12k_ag_to_ah(ag, i);
14449 if (!ah)
14450 continue;
14451
14452 ath12k_mac_hw_destroy(ah);
14453 ath12k_ag_set_ah(ag, i, NULL);
14454 }
14455
14456 return ret;
14457 }
14458
ath12k_mac_vif_set_keepalive(struct ath12k_link_vif * arvif,enum wmi_sta_keepalive_method method,u32 interval)14459 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif,
14460 enum wmi_sta_keepalive_method method,
14461 u32 interval)
14462 {
14463 struct wmi_sta_keepalive_arg arg = {};
14464 struct ath12k *ar = arvif->ar;
14465 int ret;
14466
14467 lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
14468
14469 if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
14470 return 0;
14471
14472 if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
14473 return 0;
14474
14475 arg.vdev_id = arvif->vdev_id;
14476 arg.enabled = 1;
14477 arg.method = method;
14478 arg.interval = interval;
14479
14480 ret = ath12k_wmi_sta_keepalive(ar, &arg);
14481 if (ret) {
14482 ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
14483 arvif->vdev_id, ret);
14484 return ret;
14485 }
14486
14487 return 0;
14488 }
14489