xref: /linux/drivers/net/wireless/ath/ath12k/mac.c (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
5  */
6 
7 #include <net/mac80211.h>
8 #include <net/cfg80211.h>
9 #include <linux/etherdevice.h>
10 
11 #include "mac.h"
12 #include "core.h"
13 #include "debug.h"
14 #include "wmi.h"
15 #include "hw.h"
16 #include "dp_tx.h"
17 #include "dp_rx.h"
18 #include "testmode.h"
19 #include "peer.h"
20 #include "debugfs.h"
21 #include "hif.h"
22 #include "wow.h"
23 #include "debugfs_sta.h"
24 
25 #define CHAN2G(_channel, _freq, _flags) { \
26 	.band                   = NL80211_BAND_2GHZ, \
27 	.hw_value               = (_channel), \
28 	.center_freq            = (_freq), \
29 	.flags                  = (_flags), \
30 	.max_antenna_gain       = 0, \
31 	.max_power              = 30, \
32 }
33 
34 #define CHAN5G(_channel, _freq, _flags) { \
35 	.band                   = NL80211_BAND_5GHZ, \
36 	.hw_value               = (_channel), \
37 	.center_freq            = (_freq), \
38 	.flags                  = (_flags), \
39 	.max_antenna_gain       = 0, \
40 	.max_power              = 30, \
41 }
42 
43 #define CHAN6G(_channel, _freq, _flags) { \
44 	.band                   = NL80211_BAND_6GHZ, \
45 	.hw_value               = (_channel), \
46 	.center_freq            = (_freq), \
47 	.flags                  = (_flags), \
48 	.max_antenna_gain       = 0, \
49 	.max_power              = 30, \
50 }
51 
52 static const struct ieee80211_channel ath12k_2ghz_channels[] = {
53 	CHAN2G(1, 2412, 0),
54 	CHAN2G(2, 2417, 0),
55 	CHAN2G(3, 2422, 0),
56 	CHAN2G(4, 2427, 0),
57 	CHAN2G(5, 2432, 0),
58 	CHAN2G(6, 2437, 0),
59 	CHAN2G(7, 2442, 0),
60 	CHAN2G(8, 2447, 0),
61 	CHAN2G(9, 2452, 0),
62 	CHAN2G(10, 2457, 0),
63 	CHAN2G(11, 2462, 0),
64 	CHAN2G(12, 2467, 0),
65 	CHAN2G(13, 2472, 0),
66 	CHAN2G(14, 2484, 0),
67 };
68 
69 static const struct ieee80211_channel ath12k_5ghz_channels[] = {
70 	CHAN5G(36, 5180, 0),
71 	CHAN5G(40, 5200, 0),
72 	CHAN5G(44, 5220, 0),
73 	CHAN5G(48, 5240, 0),
74 	CHAN5G(52, 5260, 0),
75 	CHAN5G(56, 5280, 0),
76 	CHAN5G(60, 5300, 0),
77 	CHAN5G(64, 5320, 0),
78 	CHAN5G(100, 5500, 0),
79 	CHAN5G(104, 5520, 0),
80 	CHAN5G(108, 5540, 0),
81 	CHAN5G(112, 5560, 0),
82 	CHAN5G(116, 5580, 0),
83 	CHAN5G(120, 5600, 0),
84 	CHAN5G(124, 5620, 0),
85 	CHAN5G(128, 5640, 0),
86 	CHAN5G(132, 5660, 0),
87 	CHAN5G(136, 5680, 0),
88 	CHAN5G(140, 5700, 0),
89 	CHAN5G(144, 5720, 0),
90 	CHAN5G(149, 5745, 0),
91 	CHAN5G(153, 5765, 0),
92 	CHAN5G(157, 5785, 0),
93 	CHAN5G(161, 5805, 0),
94 	CHAN5G(165, 5825, 0),
95 	CHAN5G(169, 5845, 0),
96 	CHAN5G(173, 5865, 0),
97 };
98 
99 static const struct ieee80211_channel ath12k_6ghz_channels[] = {
100 	/* Operating Class 136 */
101 	CHAN6G(2, 5935, 0),
102 
103 	/* Operating Classes 131-135 */
104 	CHAN6G(1, 5955, 0),
105 	CHAN6G(5, 5975, 0),
106 	CHAN6G(9, 5995, 0),
107 	CHAN6G(13, 6015, 0),
108 	CHAN6G(17, 6035, 0),
109 	CHAN6G(21, 6055, 0),
110 	CHAN6G(25, 6075, 0),
111 	CHAN6G(29, 6095, 0),
112 	CHAN6G(33, 6115, 0),
113 	CHAN6G(37, 6135, 0),
114 	CHAN6G(41, 6155, 0),
115 	CHAN6G(45, 6175, 0),
116 	CHAN6G(49, 6195, 0),
117 	CHAN6G(53, 6215, 0),
118 	CHAN6G(57, 6235, 0),
119 	CHAN6G(61, 6255, 0),
120 	CHAN6G(65, 6275, 0),
121 	CHAN6G(69, 6295, 0),
122 	CHAN6G(73, 6315, 0),
123 	CHAN6G(77, 6335, 0),
124 	CHAN6G(81, 6355, 0),
125 	CHAN6G(85, 6375, 0),
126 	CHAN6G(89, 6395, 0),
127 	CHAN6G(93, 6415, 0),
128 	CHAN6G(97, 6435, 0),
129 	CHAN6G(101, 6455, 0),
130 	CHAN6G(105, 6475, 0),
131 	CHAN6G(109, 6495, 0),
132 	CHAN6G(113, 6515, 0),
133 	CHAN6G(117, 6535, 0),
134 	CHAN6G(121, 6555, 0),
135 	CHAN6G(125, 6575, 0),
136 	CHAN6G(129, 6595, 0),
137 	CHAN6G(133, 6615, 0),
138 	CHAN6G(137, 6635, 0),
139 	CHAN6G(141, 6655, 0),
140 	CHAN6G(145, 6675, 0),
141 	CHAN6G(149, 6695, 0),
142 	CHAN6G(153, 6715, 0),
143 	CHAN6G(157, 6735, 0),
144 	CHAN6G(161, 6755, 0),
145 	CHAN6G(165, 6775, 0),
146 	CHAN6G(169, 6795, 0),
147 	CHAN6G(173, 6815, 0),
148 	CHAN6G(177, 6835, 0),
149 	CHAN6G(181, 6855, 0),
150 	CHAN6G(185, 6875, 0),
151 	CHAN6G(189, 6895, 0),
152 	CHAN6G(193, 6915, 0),
153 	CHAN6G(197, 6935, 0),
154 	CHAN6G(201, 6955, 0),
155 	CHAN6G(205, 6975, 0),
156 	CHAN6G(209, 6995, 0),
157 	CHAN6G(213, 7015, 0),
158 	CHAN6G(217, 7035, 0),
159 	CHAN6G(221, 7055, 0),
160 	CHAN6G(225, 7075, 0),
161 	CHAN6G(229, 7095, 0),
162 	CHAN6G(233, 7115, 0),
163 };
164 
165 static struct ieee80211_rate ath12k_legacy_rates[] = {
166 	{ .bitrate = 10,
167 	  .hw_value = ATH12K_HW_RATE_CCK_LP_1M },
168 	{ .bitrate = 20,
169 	  .hw_value = ATH12K_HW_RATE_CCK_LP_2M,
170 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
171 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
172 	{ .bitrate = 55,
173 	  .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
174 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
175 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
176 	{ .bitrate = 110,
177 	  .hw_value = ATH12K_HW_RATE_CCK_LP_11M,
178 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
179 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
180 
181 	{ .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
182 	{ .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
183 	{ .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
184 	{ .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
185 	{ .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
186 	{ .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
187 	{ .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
188 	{ .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
189 };
190 
191 static const int
192 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
193 	[NL80211_BAND_2GHZ] = {
194 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
197 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
198 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
199 			[NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
200 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
201 			[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
202 			[NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
203 	},
204 	[NL80211_BAND_5GHZ] = {
205 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
208 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
209 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
210 			[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
211 			[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
212 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
213 			[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
214 	},
215 	[NL80211_BAND_6GHZ] = {
216 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
217 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
218 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
219 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
220 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
221 			[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
222 			[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
223 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
224 			[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
225 	},
226 
227 };
228 
229 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
230 	.rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
231 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
232 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE |
233 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO,
234 	.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
235 	.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
236 	.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
237 	.pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
238 			     HTT_RX_FP_CTRL_FILTER_FLASG3
239 };
240 
241 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
242 #define ath12k_g_rates ath12k_legacy_rates
243 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
244 #define ath12k_a_rates (ath12k_legacy_rates + 4)
245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
246 
247 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
248 
249 static const u32 ath12k_smps_map[] = {
250 	[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
251 	[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
252 	[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
253 	[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
254 };
255 
256 static int ath12k_start_vdev_delay(struct ath12k *ar,
257 				   struct ath12k_link_vif *arvif);
258 static void ath12k_mac_stop(struct ath12k *ar);
259 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif);
260 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif);
261 
ath12k_mac_phymode_str(enum wmi_phy_mode mode)262 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
263 {
264 	switch (mode) {
265 	case MODE_11A:
266 		return "11a";
267 	case MODE_11G:
268 		return "11g";
269 	case MODE_11B:
270 		return "11b";
271 	case MODE_11GONLY:
272 		return "11gonly";
273 	case MODE_11NA_HT20:
274 		return "11na-ht20";
275 	case MODE_11NG_HT20:
276 		return "11ng-ht20";
277 	case MODE_11NA_HT40:
278 		return "11na-ht40";
279 	case MODE_11NG_HT40:
280 		return "11ng-ht40";
281 	case MODE_11AC_VHT20:
282 		return "11ac-vht20";
283 	case MODE_11AC_VHT40:
284 		return "11ac-vht40";
285 	case MODE_11AC_VHT80:
286 		return "11ac-vht80";
287 	case MODE_11AC_VHT160:
288 		return "11ac-vht160";
289 	case MODE_11AC_VHT80_80:
290 		return "11ac-vht80+80";
291 	case MODE_11AC_VHT20_2G:
292 		return "11ac-vht20-2g";
293 	case MODE_11AC_VHT40_2G:
294 		return "11ac-vht40-2g";
295 	case MODE_11AC_VHT80_2G:
296 		return "11ac-vht80-2g";
297 	case MODE_11AX_HE20:
298 		return "11ax-he20";
299 	case MODE_11AX_HE40:
300 		return "11ax-he40";
301 	case MODE_11AX_HE80:
302 		return "11ax-he80";
303 	case MODE_11AX_HE80_80:
304 		return "11ax-he80+80";
305 	case MODE_11AX_HE160:
306 		return "11ax-he160";
307 	case MODE_11AX_HE20_2G:
308 		return "11ax-he20-2g";
309 	case MODE_11AX_HE40_2G:
310 		return "11ax-he40-2g";
311 	case MODE_11AX_HE80_2G:
312 		return "11ax-he80-2g";
313 	case MODE_11BE_EHT20:
314 		return "11be-eht20";
315 	case MODE_11BE_EHT40:
316 		return "11be-eht40";
317 	case MODE_11BE_EHT80:
318 		return "11be-eht80";
319 	case MODE_11BE_EHT80_80:
320 		return "11be-eht80+80";
321 	case MODE_11BE_EHT160:
322 		return "11be-eht160";
323 	case MODE_11BE_EHT160_160:
324 		return "11be-eht160+160";
325 	case MODE_11BE_EHT320:
326 		return "11be-eht320";
327 	case MODE_11BE_EHT20_2G:
328 		return "11be-eht20-2g";
329 	case MODE_11BE_EHT40_2G:
330 		return "11be-eht40-2g";
331 	case MODE_UNKNOWN:
332 		/* skip */
333 		break;
334 
335 		/* no default handler to allow compiler to check that the
336 		 * enum is fully handled
337 		 */
338 	}
339 
340 	return "<unknown>";
341 }
342 
ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)343 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)
344 {
345 	switch (tones) {
346 	case 26:
347 		return RU_26;
348 	case 52:
349 		return RU_52;
350 	case 106:
351 		return RU_106;
352 	case 242:
353 		return RU_242;
354 	case 484:
355 		return RU_484;
356 	case 996:
357 		return RU_996;
358 	case (996 * 2):
359 		return RU_2X996;
360 	default:
361 		return RU_26;
362 	}
363 }
364 
ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)365 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)
366 {
367 	switch (sgi) {
368 	case RX_MSDU_START_SGI_0_8_US:
369 		return NL80211_RATE_INFO_EHT_GI_0_8;
370 	case RX_MSDU_START_SGI_1_6_US:
371 		return NL80211_RATE_INFO_EHT_GI_1_6;
372 	case RX_MSDU_START_SGI_3_2_US:
373 		return NL80211_RATE_INFO_EHT_GI_3_2;
374 	default:
375 		return NL80211_RATE_INFO_EHT_GI_0_8;
376 	}
377 }
378 
ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)379 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)
380 {
381 	switch (ru_tones) {
382 	case 26:
383 		return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
384 	case 52:
385 		return NL80211_RATE_INFO_EHT_RU_ALLOC_52;
386 	case (52 + 26):
387 		return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26;
388 	case 106:
389 		return NL80211_RATE_INFO_EHT_RU_ALLOC_106;
390 	case (106 + 26):
391 		return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26;
392 	case 242:
393 		return NL80211_RATE_INFO_EHT_RU_ALLOC_242;
394 	case 484:
395 		return NL80211_RATE_INFO_EHT_RU_ALLOC_484;
396 	case (484 + 242):
397 		return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242;
398 	case 996:
399 		return NL80211_RATE_INFO_EHT_RU_ALLOC_996;
400 	case (996 + 484):
401 		return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484;
402 	case (996 + 484 + 242):
403 		return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242;
404 	case (2 * 996):
405 		return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996;
406 	case (2 * 996 + 484):
407 		return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484;
408 	case (3 * 996):
409 		return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996;
410 	case (3 * 996 + 484):
411 		return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484;
412 	case (4 * 996):
413 		return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996;
414 	default:
415 		return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
416 	}
417 }
418 
419 enum rate_info_bw
ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)420 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
421 {
422 	u8 ret = RATE_INFO_BW_20;
423 
424 	switch (bw) {
425 	case ATH12K_BW_20:
426 		ret = RATE_INFO_BW_20;
427 		break;
428 	case ATH12K_BW_40:
429 		ret = RATE_INFO_BW_40;
430 		break;
431 	case ATH12K_BW_80:
432 		ret = RATE_INFO_BW_80;
433 		break;
434 	case ATH12K_BW_160:
435 		ret = RATE_INFO_BW_160;
436 		break;
437 	case ATH12K_BW_320:
438 		ret = RATE_INFO_BW_320;
439 		break;
440 	}
441 
442 	return ret;
443 }
444 
ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)445 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
446 {
447 	switch (bw) {
448 	case RATE_INFO_BW_20:
449 		return ATH12K_BW_20;
450 	case RATE_INFO_BW_40:
451 		return ATH12K_BW_40;
452 	case RATE_INFO_BW_80:
453 		return ATH12K_BW_80;
454 	case RATE_INFO_BW_160:
455 		return ATH12K_BW_160;
456 	case RATE_INFO_BW_320:
457 		return ATH12K_BW_320;
458 	default:
459 		return ATH12K_BW_20;
460 	}
461 }
462 
ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc,u8 preamble,u8 * rateidx,u16 * rate)463 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
464 					  u16 *rate)
465 {
466 	/* As default, it is OFDM rates */
467 	int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
468 	int max_rates_idx = ath12k_g_rates_size;
469 
470 	if (preamble == WMI_RATE_PREAMBLE_CCK) {
471 		hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
472 		i = 0;
473 		max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
474 	}
475 
476 	while (i < max_rates_idx) {
477 		if (hw_rc == ath12k_legacy_rates[i].hw_value) {
478 			*rateidx = i;
479 			*rate = ath12k_legacy_rates[i].bitrate;
480 			return 0;
481 		}
482 		i++;
483 	}
484 
485 	return -EINVAL;
486 }
487 
ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band * sband,u32 bitrate)488 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
489 			     u32 bitrate)
490 {
491 	int i;
492 
493 	for (i = 0; i < sband->n_bitrates; i++)
494 		if (sband->bitrates[i].bitrate == bitrate)
495 			return i;
496 
497 	return 0;
498 }
499 
500 static u32
ath12k_mac_max_ht_nss(const u8 * ht_mcs_mask)501 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
502 {
503 	int nss;
504 
505 	for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
506 		if (ht_mcs_mask[nss])
507 			return nss + 1;
508 
509 	return 1;
510 }
511 
512 static u32
ath12k_mac_max_vht_nss(const u16 * vht_mcs_mask)513 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
514 {
515 	int nss;
516 
517 	for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
518 		if (vht_mcs_mask[nss])
519 			return nss + 1;
520 
521 	return 1;
522 }
523 
524 static u32
ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])525 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
526 {
527 	int nss;
528 
529 	for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
530 		if (he_mcs_mask[nss])
531 			return nss + 1;
532 
533 	return 1;
534 }
535 
ath12k_parse_mpdudensity(u8 mpdudensity)536 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
537 {
538 /*  From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
539  *   0 for no restriction
540  *   1 for 1/4 us
541  *   2 for 1/2 us
542  *   3 for 1 us
543  *   4 for 2 us
544  *   5 for 4 us
545  *   6 for 8 us
546  *   7 for 16 us
547  */
548 	switch (mpdudensity) {
549 	case 0:
550 		return 0;
551 	case 1:
552 	case 2:
553 	case 3:
554 	/* Our lower layer calculations limit our precision to
555 	 * 1 microsecond
556 	 */
557 		return 1;
558 	case 4:
559 		return 2;
560 	case 5:
561 		return 4;
562 	case 6:
563 		return 8;
564 	case 7:
565 		return 16;
566 	default:
567 		return 0;
568 	}
569 }
570 
ath12k_mac_vif_link_chan(struct ieee80211_vif * vif,u8 link_id,struct cfg80211_chan_def * def)571 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id,
572 				    struct cfg80211_chan_def *def)
573 {
574 	struct ieee80211_bss_conf *link_conf;
575 	struct ieee80211_chanctx_conf *conf;
576 
577 	rcu_read_lock();
578 	link_conf = rcu_dereference(vif->link_conf[link_id]);
579 
580 	if (!link_conf) {
581 		rcu_read_unlock();
582 		return -ENOLINK;
583 	}
584 
585 	conf = rcu_dereference(link_conf->chanctx_conf);
586 	if (!conf) {
587 		rcu_read_unlock();
588 		return -ENOENT;
589 	}
590 	*def = conf->def;
591 	rcu_read_unlock();
592 
593 	return 0;
594 }
595 
596 static struct ath12k_link_vif *
ath12k_mac_get_tx_arvif(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * link_conf)597 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif,
598 			struct ieee80211_bss_conf *link_conf)
599 {
600 	struct ieee80211_bss_conf *tx_bss_conf;
601 	struct ath12k *ar = arvif->ar;
602 	struct ath12k_vif *tx_ahvif;
603 
604 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
605 
606 	tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
607 					link_conf->tx_bss_conf);
608 	if (tx_bss_conf) {
609 		tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif);
610 		return wiphy_dereference(tx_ahvif->ah->hw->wiphy,
611 					 tx_ahvif->link[tx_bss_conf->link_id]);
612 	}
613 
614 	return NULL;
615 }
616 
ath12k_mac_get_tx_bssid(struct ath12k_link_vif * arvif)617 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif)
618 {
619 	struct ieee80211_bss_conf *link_conf;
620 	struct ath12k_link_vif *tx_arvif;
621 	struct ath12k *ar = arvif->ar;
622 
623 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
624 
625 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
626 	if (!link_conf) {
627 		ath12k_warn(ar->ab,
628 			    "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
629 			    arvif->link_id);
630 		return NULL;
631 	}
632 	if (link_conf->vif->type == NL80211_IFTYPE_STATION) {
633 		if (link_conf->nontransmitted)
634 			return link_conf->transmitter_bssid;
635 	} else {
636 		tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
637 		if (tx_arvif)
638 			return tx_arvif->bssid;
639 	}
640 
641 	return NULL;
642 }
643 
644 struct ieee80211_bss_conf *
ath12k_mac_get_link_bss_conf(struct ath12k_link_vif * arvif)645 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif)
646 {
647 	struct ieee80211_vif *vif = arvif->ahvif->vif;
648 	struct ieee80211_bss_conf *link_conf;
649 	struct ath12k *ar = arvif->ar;
650 
651 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
652 
653 	if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
654 		return NULL;
655 
656 	link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
657 				      vif->link_conf[arvif->link_id]);
658 
659 	return link_conf;
660 }
661 
ath12k_mac_get_link_sta(struct ath12k_link_sta * arsta)662 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta)
663 {
664 	struct ath12k_sta *ahsta = arsta->ahsta;
665 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
666 	struct ieee80211_link_sta *link_sta;
667 
668 	lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy);
669 
670 	if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
671 		return NULL;
672 
673 	link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy,
674 				     sta->link[arsta->link_id]);
675 
676 	return link_sta;
677 }
678 
ath12k_mac_bitrate_is_cck(int bitrate)679 static bool ath12k_mac_bitrate_is_cck(int bitrate)
680 {
681 	switch (bitrate) {
682 	case 10:
683 	case 20:
684 	case 55:
685 	case 110:
686 		return true;
687 	}
688 
689 	return false;
690 }
691 
ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band * sband,u8 hw_rate,bool cck)692 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
693 			     u8 hw_rate, bool cck)
694 {
695 	const struct ieee80211_rate *rate;
696 	int i;
697 
698 	for (i = 0; i < sband->n_bitrates; i++) {
699 		rate = &sband->bitrates[i];
700 
701 		if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
702 			continue;
703 
704 		if (rate->hw_value == hw_rate)
705 			return i;
706 		else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
707 			 rate->hw_value_short == hw_rate)
708 			return i;
709 	}
710 
711 	return 0;
712 }
713 
ath12k_mac_bitrate_to_rate(int bitrate)714 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
715 {
716 	return DIV_ROUND_UP(bitrate, 5) |
717 	       (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
718 }
719 
ath12k_get_arvif_iter(void * data,u8 * mac,struct ieee80211_vif * vif)720 static void ath12k_get_arvif_iter(void *data, u8 *mac,
721 				  struct ieee80211_vif *vif)
722 {
723 	struct ath12k_vif_iter *arvif_iter = data;
724 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
725 	unsigned long links_map = ahvif->links_map;
726 	struct ath12k_link_vif *arvif;
727 	u8 link_id;
728 
729 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
730 		arvif = rcu_dereference(ahvif->link[link_id]);
731 
732 		if (WARN_ON(!arvif))
733 			continue;
734 
735 		if (!arvif->is_created)
736 			continue;
737 
738 		if (arvif->vdev_id == arvif_iter->vdev_id &&
739 		    arvif->ar == arvif_iter->ar) {
740 			arvif_iter->arvif = arvif;
741 			break;
742 		}
743 	}
744 }
745 
ath12k_mac_get_arvif(struct ath12k * ar,u32 vdev_id)746 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
747 {
748 	struct ath12k_vif_iter arvif_iter = {};
749 	u32 flags;
750 
751 	/* To use the arvif returned, caller must have held rcu read lock.
752 	 */
753 	WARN_ON(!rcu_read_lock_any_held());
754 	arvif_iter.vdev_id = vdev_id;
755 	arvif_iter.ar = ar;
756 
757 	flags = IEEE80211_IFACE_ITER_RESUME_ALL;
758 	ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
759 						   flags,
760 						   ath12k_get_arvif_iter,
761 						   &arvif_iter);
762 	if (!arvif_iter.arvif) {
763 		ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
764 		return NULL;
765 	}
766 
767 	return arvif_iter.arvif;
768 }
769 
ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)770 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
771 							u32 vdev_id)
772 {
773 	int i;
774 	struct ath12k_pdev *pdev;
775 	struct ath12k_link_vif *arvif;
776 
777 	for (i = 0; i < ab->num_radios; i++) {
778 		pdev = rcu_dereference(ab->pdevs_active[i]);
779 		if (pdev && pdev->ar &&
780 		    (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
781 			arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
782 			if (arvif)
783 				return arvif;
784 		}
785 	}
786 
787 	return NULL;
788 }
789 
ath12k_mac_get_ar_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)790 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
791 {
792 	int i;
793 	struct ath12k_pdev *pdev;
794 
795 	for (i = 0; i < ab->num_radios; i++) {
796 		pdev = rcu_dereference(ab->pdevs_active[i]);
797 		if (pdev && pdev->ar) {
798 			if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
799 				return pdev->ar;
800 		}
801 	}
802 
803 	return NULL;
804 }
805 
ath12k_mac_get_ar_by_pdev_id(struct ath12k_base * ab,u32 pdev_id)806 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
807 {
808 	int i;
809 	struct ath12k_pdev *pdev;
810 
811 	if (ab->hw_params->single_pdev_only) {
812 		pdev = rcu_dereference(ab->pdevs_active[0]);
813 		return pdev ? pdev->ar : NULL;
814 	}
815 
816 	if (WARN_ON(pdev_id > ab->num_radios))
817 		return NULL;
818 
819 	for (i = 0; i < ab->num_radios; i++) {
820 		if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM)
821 			pdev = &ab->pdevs[i];
822 		else
823 			pdev = rcu_dereference(ab->pdevs_active[i]);
824 
825 		if (pdev && pdev->pdev_id == pdev_id)
826 			return (pdev->ar ? pdev->ar : NULL);
827 	}
828 
829 	return NULL;
830 }
831 
ath12k_mac_is_ml_arvif(struct ath12k_link_vif * arvif)832 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif)
833 {
834 	struct ath12k_vif *ahvif = arvif->ahvif;
835 
836 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
837 
838 	if (ahvif->vif->valid_links & BIT(arvif->link_id))
839 		return true;
840 
841 	return false;
842 }
843 
ath12k_mac_get_ar_by_chan(struct ieee80211_hw * hw,struct ieee80211_channel * channel)844 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw,
845 						struct ieee80211_channel *channel)
846 {
847 	struct ath12k_hw *ah = hw->priv;
848 	struct ath12k *ar;
849 	int i;
850 
851 	ar = ah->radio;
852 
853 	if (ah->num_radio == 1)
854 		return ar;
855 
856 	for_each_ar(ah, ar, i) {
857 		if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
858 		    channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
859 			return ar;
860 	}
861 	return NULL;
862 }
863 
ath12k_get_ar_by_ctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)864 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw,
865 					   struct ieee80211_chanctx_conf *ctx)
866 {
867 	if (!ctx)
868 		return NULL;
869 
870 	return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan);
871 }
872 
ath12k_get_ar_by_vif(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u8 link_id)873 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw,
874 				    struct ieee80211_vif *vif,
875 				    u8 link_id)
876 {
877 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
878 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
879 	struct ath12k_link_vif *arvif;
880 
881 	lockdep_assert_wiphy(hw->wiphy);
882 
883 	/* If there is one pdev within ah, then we return
884 	 * ar directly.
885 	 */
886 	if (ah->num_radio == 1)
887 		return ah->radio;
888 
889 	if (!(ahvif->links_map & BIT(link_id)))
890 		return NULL;
891 
892 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
893 	if (arvif && arvif->is_created)
894 		return arvif->ar;
895 
896 	return NULL;
897 }
898 
ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)899 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw,
900 					  struct ieee80211_chanctx_conf *conf,
901 					  void *data)
902 {
903 	struct ath12k_mac_get_any_chanctx_conf_arg *arg = data;
904 	struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf);
905 
906 	if (ctx_ar == arg->ar)
907 		arg->chanctx_conf = conf;
908 }
909 
ath12k_mac_get_vif_up(struct ath12k * ar)910 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar)
911 {
912 	struct ath12k_link_vif *arvif;
913 
914 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
915 
916 	list_for_each_entry(arvif, &ar->arvifs, list) {
917 		if (arvif->is_up)
918 			return arvif;
919 	}
920 
921 	return NULL;
922 }
923 
ath12k_mac_band_match(enum nl80211_band band1,enum WMI_HOST_WLAN_BAND band2)924 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
925 {
926 	switch (band1) {
927 	case NL80211_BAND_2GHZ:
928 		if (band2 & WMI_HOST_WLAN_2GHZ_CAP)
929 			return true;
930 		break;
931 	case NL80211_BAND_5GHZ:
932 	case NL80211_BAND_6GHZ:
933 		if (band2 & WMI_HOST_WLAN_5GHZ_CAP)
934 			return true;
935 		break;
936 	default:
937 		return false;
938 	}
939 
940 	return false;
941 }
942 
ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif * arvif)943 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif)
944 {
945 	struct ath12k *ar = arvif->ar;
946 	struct ath12k_base *ab = ar->ab;
947 	struct ieee80211_vif *vif = arvif->ahvif->vif;
948 	struct cfg80211_chan_def def;
949 	enum nl80211_band band;
950 	u8 pdev_id = ab->fw_pdev[0].pdev_id;
951 	int i;
952 
953 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
954 		return pdev_id;
955 
956 	band = def.chan->band;
957 
958 	for (i = 0; i < ab->fw_pdev_count; i++) {
959 		if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands))
960 			return ab->fw_pdev[i].pdev_id;
961 	}
962 
963 	return pdev_id;
964 }
965 
ath12k_mac_get_target_pdev_id(struct ath12k * ar)966 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar)
967 {
968 	struct ath12k_link_vif *arvif;
969 	struct ath12k_base *ab = ar->ab;
970 
971 	if (!ab->hw_params->single_pdev_only)
972 		return ar->pdev->pdev_id;
973 
974 	arvif = ath12k_mac_get_vif_up(ar);
975 
976 	/* fw_pdev array has pdev ids derived from phy capability
977 	 * service ready event (pdev_and_hw_link_ids).
978 	 * If no vif is active, return default first index.
979 	 */
980 	if (!arvif)
981 		return ar->ab->fw_pdev[0].pdev_id;
982 
983 	/* If active vif is found, return the pdev id matching chandef band */
984 	return ath12k_mac_get_target_pdev_id_from_vif(arvif);
985 }
986 
ath12k_pdev_caps_update(struct ath12k * ar)987 static void ath12k_pdev_caps_update(struct ath12k *ar)
988 {
989 	struct ath12k_base *ab = ar->ab;
990 
991 	ar->max_tx_power = ab->target_caps.hw_max_tx_power;
992 
993 	/* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
994 	 * But since the received value in svcrdy is same as hw_max_tx_power,
995 	 * we can set ar->min_tx_power to 0 currently until
996 	 * this is fixed in firmware
997 	 */
998 	ar->min_tx_power = 0;
999 
1000 	ar->txpower_limit_2g = ar->max_tx_power;
1001 	ar->txpower_limit_5g = ar->max_tx_power;
1002 	ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
1003 }
1004 
ath12k_mac_txpower_recalc(struct ath12k * ar)1005 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
1006 {
1007 	struct ath12k_pdev *pdev = ar->pdev;
1008 	struct ath12k_link_vif *arvif;
1009 	int ret, txpower = -1;
1010 	u32 param;
1011 
1012 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1013 
1014 	list_for_each_entry(arvif, &ar->arvifs, list) {
1015 		if (arvif->txpower <= 0)
1016 			continue;
1017 
1018 		if (txpower == -1)
1019 			txpower = arvif->txpower;
1020 		else
1021 			txpower = min(txpower, arvif->txpower);
1022 	}
1023 
1024 	if (txpower == -1)
1025 		return 0;
1026 
1027 	/* txpwr is set as 2 units per dBm in FW*/
1028 	txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
1029 			ar->max_tx_power) * 2;
1030 
1031 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
1032 		   txpower / 2);
1033 
1034 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) &&
1035 	    ar->txpower_limit_2g != txpower) {
1036 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
1037 		ret = ath12k_wmi_pdev_set_param(ar, param,
1038 						txpower, ar->pdev->pdev_id);
1039 		if (ret)
1040 			goto fail;
1041 		ar->txpower_limit_2g = txpower;
1042 	}
1043 
1044 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) &&
1045 	    ar->txpower_limit_5g != txpower) {
1046 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
1047 		ret = ath12k_wmi_pdev_set_param(ar, param,
1048 						txpower, ar->pdev->pdev_id);
1049 		if (ret)
1050 			goto fail;
1051 		ar->txpower_limit_5g = txpower;
1052 	}
1053 
1054 	return 0;
1055 
1056 fail:
1057 	ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
1058 		    txpower / 2, param, ret);
1059 	return ret;
1060 }
1061 
ath12k_recalc_rtscts_prot(struct ath12k_link_vif * arvif)1062 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif)
1063 {
1064 	struct ath12k *ar = arvif->ar;
1065 	u32 vdev_param, rts_cts;
1066 	int ret;
1067 
1068 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1069 
1070 	vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
1071 
1072 	/* Enable RTS/CTS protection for sw retries (when legacy stations
1073 	 * are in BSS) or by default only for second rate series.
1074 	 * TODO: Check if we need to enable CTS 2 Self in any case
1075 	 */
1076 	rts_cts = WMI_USE_RTS_CTS;
1077 
1078 	if (arvif->num_legacy_stations > 0)
1079 		rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
1080 	else
1081 		rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
1082 
1083 	/* Need not send duplicate param value to firmware */
1084 	if (arvif->rtscts_prot_mode == rts_cts)
1085 		return 0;
1086 
1087 	arvif->rtscts_prot_mode = rts_cts;
1088 
1089 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1090 		   arvif->vdev_id, rts_cts);
1091 
1092 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1093 					    vdev_param, rts_cts);
1094 	if (ret)
1095 		ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1096 			    arvif->vdev_id, ret);
1097 
1098 	return ret;
1099 }
1100 
ath12k_mac_set_kickout(struct ath12k_link_vif * arvif)1101 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif)
1102 {
1103 	struct ath12k *ar = arvif->ar;
1104 	u32 param;
1105 	int ret;
1106 
1107 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
1108 					ATH12K_KICKOUT_THRESHOLD,
1109 					ar->pdev->pdev_id);
1110 	if (ret) {
1111 		ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
1112 			    arvif->vdev_id, ret);
1113 		return ret;
1114 	}
1115 
1116 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
1117 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1118 					    ATH12K_KEEPALIVE_MIN_IDLE);
1119 	if (ret) {
1120 		ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
1121 			    arvif->vdev_id, ret);
1122 		return ret;
1123 	}
1124 
1125 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
1126 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1127 					    ATH12K_KEEPALIVE_MAX_IDLE);
1128 	if (ret) {
1129 		ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
1130 			    arvif->vdev_id, ret);
1131 		return ret;
1132 	}
1133 
1134 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
1135 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1136 					    ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
1137 	if (ret) {
1138 		ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
1139 			    arvif->vdev_id, ret);
1140 		return ret;
1141 	}
1142 
1143 	return 0;
1144 }
1145 
ath12k_mac_peer_cleanup_all(struct ath12k * ar)1146 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
1147 {
1148 	struct ath12k_peer *peer, *tmp;
1149 	struct ath12k_base *ab = ar->ab;
1150 
1151 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1152 
1153 	spin_lock_bh(&ab->base_lock);
1154 	list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
1155 		/* Skip Rx TID cleanup for self peer */
1156 		if (peer->sta)
1157 			ath12k_dp_rx_peer_tid_cleanup(ar, peer);
1158 
1159 		list_del(&peer->list);
1160 		kfree(peer);
1161 	}
1162 	spin_unlock_bh(&ab->base_lock);
1163 
1164 	ar->num_peers = 0;
1165 	ar->num_stations = 0;
1166 }
1167 
ath12k_mac_vdev_setup_sync(struct ath12k * ar)1168 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
1169 {
1170 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1171 
1172 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
1173 		return -ESHUTDOWN;
1174 
1175 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
1176 		   ATH12K_VDEV_SETUP_TIMEOUT_HZ);
1177 
1178 	if (!wait_for_completion_timeout(&ar->vdev_setup_done,
1179 					 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
1180 		return -ETIMEDOUT;
1181 
1182 	return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
1183 }
1184 
ath12k_monitor_vdev_up(struct ath12k * ar,int vdev_id)1185 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
1186 {
1187 	struct ath12k_wmi_vdev_up_params params = {};
1188 	int ret;
1189 
1190 	params.vdev_id = vdev_id;
1191 	params.bssid = ar->mac_addr;
1192 	ret = ath12k_wmi_vdev_up(ar, &params);
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, &params);
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, &params);
1789 	if (ret) {
1790 		ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1791 			    arvif->vdev_id, ret);
1792 		return;
1793 	}
1794 
1795 	arvif->is_up = true;
1796 
1797 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1798 }
1799 
ath12k_mac_handle_beacon_iter(void * data,u8 * mac,struct ieee80211_vif * vif)1800 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac,
1801 					  struct ieee80211_vif *vif)
1802 {
1803 	struct sk_buff *skb = data;
1804 	struct ieee80211_mgmt *mgmt = (void *)skb->data;
1805 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
1806 	struct ath12k_link_vif *arvif = &ahvif->deflink;
1807 
1808 	if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created)
1809 		return;
1810 
1811 	if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1812 		return;
1813 
1814 	cancel_delayed_work(&arvif->connection_loss_work);
1815 }
1816 
ath12k_mac_handle_beacon(struct ath12k * ar,struct sk_buff * skb)1817 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb)
1818 {
1819 	ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
1820 						   IEEE80211_IFACE_ITER_NORMAL,
1821 						   ath12k_mac_handle_beacon_iter,
1822 						   skb);
1823 }
1824 
ath12k_mac_handle_beacon_miss_iter(void * data,u8 * mac,struct ieee80211_vif * vif)1825 static void ath12k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1826 					       struct ieee80211_vif *vif)
1827 {
1828 	u32 *vdev_id = data;
1829 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
1830 	struct ath12k_link_vif *arvif = &ahvif->deflink;
1831 	struct ieee80211_hw *hw;
1832 
1833 	if (!arvif->is_created || arvif->vdev_id != *vdev_id)
1834 		return;
1835 
1836 	if (!arvif->is_up)
1837 		return;
1838 
1839 	ieee80211_beacon_loss(vif);
1840 	hw = ath12k_ar_to_hw(arvif->ar);
1841 
1842 	/* Firmware doesn't report beacon loss events repeatedly. If AP probe
1843 	 * (done by mac80211) succeeds but beacons do not resume then it
1844 	 * doesn't make sense to continue operation. Queue connection loss work
1845 	 * which can be cancelled when beacon is received.
1846 	 */
1847 	ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1848 				     ATH12K_CONNECTION_LOSS_HZ);
1849 }
1850 
ath12k_mac_handle_beacon_miss(struct ath12k * ar,u32 vdev_id)1851 void ath12k_mac_handle_beacon_miss(struct ath12k *ar, u32 vdev_id)
1852 {
1853 	ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
1854 						   IEEE80211_IFACE_ITER_NORMAL,
1855 						   ath12k_mac_handle_beacon_miss_iter,
1856 						   &vdev_id);
1857 }
1858 
ath12k_mac_vif_sta_connection_loss_work(struct work_struct * work)1859 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1860 {
1861 	struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif,
1862 						     connection_loss_work.work);
1863 	struct ieee80211_vif *vif = arvif->ahvif->vif;
1864 
1865 	if (!arvif->is_up)
1866 		return;
1867 
1868 	ieee80211_connection_loss(vif);
1869 }
1870 
ath12k_peer_assoc_h_basic(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1871 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1872 				      struct ath12k_link_vif *arvif,
1873 				      struct ath12k_link_sta *arsta,
1874 				      struct ath12k_wmi_peer_assoc_arg *arg)
1875 {
1876 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1877 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1878 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1879 	struct ieee80211_bss_conf *bss_conf;
1880 	u32 aid;
1881 
1882 	lockdep_assert_wiphy(hw->wiphy);
1883 
1884 	if (vif->type == NL80211_IFTYPE_STATION)
1885 		aid = vif->cfg.aid;
1886 	else
1887 		aid = sta->aid;
1888 
1889 	ether_addr_copy(arg->peer_mac, arsta->addr);
1890 	arg->vdev_id = arvif->vdev_id;
1891 	arg->peer_associd = aid;
1892 	arg->auth_flag = true;
1893 	/* TODO: STA WAR in ath10k for listen interval required? */
1894 	arg->peer_listen_intval = hw->conf.listen_interval;
1895 	arg->peer_nss = 1;
1896 
1897 	bss_conf = ath12k_mac_get_link_bss_conf(arvif);
1898 	if (!bss_conf) {
1899 		ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n",
1900 			    vif->addr, arvif->link_id);
1901 		return;
1902 	}
1903 
1904 	arg->peer_caps = bss_conf->assoc_capability;
1905 }
1906 
ath12k_peer_assoc_h_crypto(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1907 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1908 				       struct ath12k_link_vif *arvif,
1909 				       struct ath12k_link_sta *arsta,
1910 				       struct ath12k_wmi_peer_assoc_arg *arg)
1911 {
1912 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1913 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1914 	struct ieee80211_bss_conf *info;
1915 	struct cfg80211_chan_def def;
1916 	struct cfg80211_bss *bss;
1917 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1918 	const u8 *rsnie = NULL;
1919 	const u8 *wpaie = NULL;
1920 
1921 	lockdep_assert_wiphy(hw->wiphy);
1922 
1923 	info = ath12k_mac_get_link_bss_conf(arvif);
1924 	if (!info) {
1925 		ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n",
1926 			    vif->addr, arvif->link_id);
1927 		return;
1928 	}
1929 
1930 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1931 		return;
1932 
1933 	bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1934 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1935 
1936 	if (arvif->rsnie_present || arvif->wpaie_present) {
1937 		arg->need_ptk_4_way = true;
1938 		if (arvif->wpaie_present)
1939 			arg->need_gtk_2_way = true;
1940 	} else if (bss) {
1941 		const struct cfg80211_bss_ies *ies;
1942 
1943 		rcu_read_lock();
1944 		rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1945 
1946 		ies = rcu_dereference(bss->ies);
1947 
1948 		wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1949 						WLAN_OUI_TYPE_MICROSOFT_WPA,
1950 						ies->data,
1951 						ies->len);
1952 		rcu_read_unlock();
1953 		cfg80211_put_bss(hw->wiphy, bss);
1954 	}
1955 
1956 	/* FIXME: base on RSN IE/WPA IE is a correct idea? */
1957 	if (rsnie || wpaie) {
1958 		ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1959 			   "%s: rsn ie found\n", __func__);
1960 		arg->need_ptk_4_way = true;
1961 	}
1962 
1963 	if (wpaie) {
1964 		ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1965 			   "%s: wpa ie found\n", __func__);
1966 		arg->need_gtk_2_way = true;
1967 	}
1968 
1969 	if (sta->mfp) {
1970 		/* TODO: Need to check if FW supports PMF? */
1971 		arg->is_pmf_enabled = true;
1972 	}
1973 
1974 	/* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1975 }
1976 
ath12k_peer_assoc_h_rates(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1977 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1978 				      struct ath12k_link_vif *arvif,
1979 				      struct ath12k_link_sta *arsta,
1980 				      struct ath12k_wmi_peer_assoc_arg *arg)
1981 {
1982 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1983 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1984 	struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1985 	struct ieee80211_link_sta *link_sta;
1986 	struct cfg80211_chan_def def;
1987 	const struct ieee80211_supported_band *sband;
1988 	const struct ieee80211_rate *rates;
1989 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1990 	enum nl80211_band band;
1991 	u32 ratemask;
1992 	u8 rate;
1993 	int i;
1994 
1995 	lockdep_assert_wiphy(hw->wiphy);
1996 
1997 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1998 		return;
1999 
2000 	link_sta = ath12k_mac_get_link_sta(arsta);
2001 	if (!link_sta) {
2002 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n",
2003 			    sta->addr, arsta->link_id);
2004 		return;
2005 	}
2006 
2007 	band = def.chan->band;
2008 	sband = hw->wiphy->bands[band];
2009 	ratemask = link_sta->supp_rates[band];
2010 	ratemask &= arvif->bitrate_mask.control[band].legacy;
2011 	rates = sband->bitrates;
2012 
2013 	rateset->num_rates = 0;
2014 
2015 	for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2016 		if (!(ratemask & 1))
2017 			continue;
2018 
2019 		rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
2020 		rateset->rates[rateset->num_rates] = rate;
2021 		rateset->num_rates++;
2022 	}
2023 }
2024 
2025 static bool
ath12k_peer_assoc_h_ht_masked(const u8 * ht_mcs_mask)2026 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
2027 {
2028 	int nss;
2029 
2030 	for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2031 		if (ht_mcs_mask[nss])
2032 			return false;
2033 
2034 	return true;
2035 }
2036 
2037 static bool
ath12k_peer_assoc_h_vht_masked(const u16 * vht_mcs_mask)2038 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
2039 {
2040 	int nss;
2041 
2042 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2043 		if (vht_mcs_mask[nss])
2044 			return false;
2045 
2046 	return true;
2047 }
2048 
ath12k_peer_assoc_h_ht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2049 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
2050 				   struct ath12k_link_vif *arvif,
2051 				   struct ath12k_link_sta *arsta,
2052 				   struct ath12k_wmi_peer_assoc_arg *arg)
2053 {
2054 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2055 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2056 	const struct ieee80211_sta_ht_cap *ht_cap;
2057 	struct ieee80211_link_sta *link_sta;
2058 	struct cfg80211_chan_def def;
2059 	enum nl80211_band band;
2060 	const u8 *ht_mcs_mask;
2061 	int i, n;
2062 	u8 max_nss;
2063 	u32 stbc;
2064 
2065 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2066 
2067 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2068 		return;
2069 
2070 	link_sta = ath12k_mac_get_link_sta(arsta);
2071 	if (!link_sta) {
2072 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n",
2073 			    sta->addr, arsta->link_id);
2074 		return;
2075 	}
2076 
2077 	ht_cap = &link_sta->ht_cap;
2078 	if (!ht_cap->ht_supported)
2079 		return;
2080 
2081 	band = def.chan->band;
2082 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2083 
2084 	if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
2085 		return;
2086 
2087 	arg->ht_flag = true;
2088 
2089 	arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2090 				    ht_cap->ampdu_factor)) - 1;
2091 
2092 	arg->peer_mpdu_density =
2093 		ath12k_parse_mpdudensity(ht_cap->ampdu_density);
2094 
2095 	arg->peer_ht_caps = ht_cap->cap;
2096 	arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
2097 
2098 	if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2099 		arg->ldpc_flag = true;
2100 
2101 	if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2102 		arg->bw_40 = true;
2103 		arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
2104 	}
2105 
2106 	/* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20
2107 	 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both
2108 	 * flags if guard interval is to force Long GI
2109 	 */
2110 	if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) {
2111 		arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40);
2112 	} else {
2113 		/* Enable SGI flag if either SGI_20 or SGI_40 is supported */
2114 		if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40))
2115 			arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
2116 	}
2117 
2118 	if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2119 		arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
2120 		arg->stbc_flag = true;
2121 	}
2122 
2123 	if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2124 		stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2125 		stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2126 		stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
2127 		arg->peer_rate_caps |= stbc;
2128 		arg->stbc_flag = true;
2129 	}
2130 
2131 	if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2132 		arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
2133 	else if (ht_cap->mcs.rx_mask[1])
2134 		arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
2135 
2136 	for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2137 		if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2138 		    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2139 			max_nss = (i / 8) + 1;
2140 			arg->peer_ht_rates.rates[n++] = i;
2141 		}
2142 
2143 	/* This is a workaround for HT-enabled STAs which break the spec
2144 	 * and have no HT capabilities RX mask (no HT RX MCS map).
2145 	 *
2146 	 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2147 	 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2148 	 *
2149 	 * Firmware asserts if such situation occurs.
2150 	 */
2151 	if (n == 0) {
2152 		arg->peer_ht_rates.num_rates = 8;
2153 		for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2154 			arg->peer_ht_rates.rates[i] = i;
2155 	} else {
2156 		arg->peer_ht_rates.num_rates = n;
2157 		arg->peer_nss = min(link_sta->rx_nss, max_nss);
2158 	}
2159 
2160 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2161 		   arg->peer_mac,
2162 		   arg->peer_ht_rates.num_rates,
2163 		   arg->peer_nss);
2164 }
2165 
ath12k_mac_get_max_vht_mcs_map(u16 mcs_map,int nss)2166 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
2167 {
2168 	switch ((mcs_map >> (2 * nss)) & 0x3) {
2169 	case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
2170 	case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
2171 	case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
2172 	}
2173 	return 0;
2174 }
2175 
2176 static u16
ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])2177 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2178 			      const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2179 {
2180 	int idx_limit;
2181 	int nss;
2182 	u16 mcs_map;
2183 	u16 mcs;
2184 
2185 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2186 		mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2187 			  vht_mcs_limit[nss];
2188 
2189 		if (mcs_map)
2190 			idx_limit = fls(mcs_map) - 1;
2191 		else
2192 			idx_limit = -1;
2193 
2194 		switch (idx_limit) {
2195 		case 0:
2196 		case 1:
2197 		case 2:
2198 		case 3:
2199 		case 4:
2200 		case 5:
2201 		case 6:
2202 		case 7:
2203 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2204 			break;
2205 		case 8:
2206 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2207 			break;
2208 		case 9:
2209 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2210 			break;
2211 		default:
2212 			WARN_ON(1);
2213 			fallthrough;
2214 		case -1:
2215 			mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2216 			break;
2217 		}
2218 
2219 		tx_mcs_set &= ~(0x3 << (nss * 2));
2220 		tx_mcs_set |= mcs << (nss * 2);
2221 	}
2222 
2223 	return tx_mcs_set;
2224 }
2225 
ath12k_get_nss_160mhz(struct ath12k * ar,u8 max_nss)2226 static u8 ath12k_get_nss_160mhz(struct ath12k *ar,
2227 				u8 max_nss)
2228 {
2229 	u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2230 	u8 max_sup_nss = 0;
2231 
2232 	switch (nss_ratio_info) {
2233 	case WMI_NSS_RATIO_1BY2_NSS:
2234 		max_sup_nss = max_nss >> 1;
2235 		break;
2236 	case WMI_NSS_RATIO_3BY4_NSS:
2237 		ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2238 		break;
2239 	case WMI_NSS_RATIO_1_NSS:
2240 		max_sup_nss = max_nss;
2241 		break;
2242 	case WMI_NSS_RATIO_2_NSS:
2243 		ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2244 		break;
2245 	default:
2246 		ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n",
2247 			    nss_ratio_info);
2248 		break;
2249 	}
2250 
2251 	return max_sup_nss;
2252 }
2253 
ath12k_peer_assoc_h_vht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2254 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
2255 				    struct ath12k_link_vif *arvif,
2256 				    struct ath12k_link_sta *arsta,
2257 				    struct ath12k_wmi_peer_assoc_arg *arg)
2258 {
2259 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2260 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2261 	const struct ieee80211_sta_vht_cap *vht_cap;
2262 	struct ieee80211_link_sta *link_sta;
2263 	struct cfg80211_chan_def def;
2264 	enum nl80211_band band;
2265 	u16 *vht_mcs_mask;
2266 	u16 tx_mcs_map;
2267 	u8 ampdu_factor;
2268 	u8 max_nss, vht_mcs;
2269 	int i, vht_nss, nss_idx;
2270 	bool user_rate_valid = true;
2271 	u32 rx_nss, tx_nss, nss_160;
2272 
2273 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2274 
2275 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2276 		return;
2277 
2278 	link_sta = ath12k_mac_get_link_sta(arsta);
2279 	if (!link_sta) {
2280 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n",
2281 			    sta->addr, arsta->link_id);
2282 		return;
2283 	}
2284 
2285 	vht_cap = &link_sta->vht_cap;
2286 	if (!vht_cap->vht_supported)
2287 		return;
2288 
2289 	band = def.chan->band;
2290 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2291 
2292 	if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
2293 		return;
2294 
2295 	arg->vht_flag = true;
2296 
2297 	/* TODO: similar flags required? */
2298 	arg->vht_capable = true;
2299 
2300 	if (def.chan->band == NL80211_BAND_2GHZ)
2301 		arg->vht_ng_flag = true;
2302 
2303 	arg->peer_vht_caps = vht_cap->cap;
2304 
2305 	ampdu_factor = (vht_cap->cap &
2306 			IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2307 		       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2308 
2309 	/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2310 	 * zero in VHT IE. Using it would result in degraded throughput.
2311 	 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2312 	 * it if VHT max_mpdu is smaller.
2313 	 */
2314 	arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2315 				 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2316 					ampdu_factor)) - 1);
2317 
2318 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2319 		arg->bw_80 = true;
2320 
2321 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2322 		arg->bw_160 = true;
2323 
2324 	vht_nss =  ath12k_mac_max_vht_nss(vht_mcs_mask);
2325 
2326 	if (vht_nss > link_sta->rx_nss) {
2327 		user_rate_valid = false;
2328 		for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2329 			if (vht_mcs_mask[nss_idx]) {
2330 				user_rate_valid = true;
2331 				break;
2332 			}
2333 		}
2334 	}
2335 
2336 	if (!user_rate_valid) {
2337 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2338 			   "Setting vht range MCS value to peer supported nss:%d for peer %pM\n",
2339 			   link_sta->rx_nss, arsta->addr);
2340 		vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2341 	}
2342 
2343 	/* Calculate peer NSS capability from VHT capabilities if STA
2344 	 * supports VHT.
2345 	 */
2346 	for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2347 		vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2348 			  (2 * i) & 3;
2349 
2350 		if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2351 		    vht_mcs_mask[i])
2352 			max_nss = i + 1;
2353 	}
2354 	arg->peer_nss = min(link_sta->rx_nss, max_nss);
2355 	arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2356 	arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2357 	arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2358 
2359 	tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
2360 	arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
2361 
2362 	/* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
2363 	 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
2364 	 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2365 	 */
2366 	arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2367 	arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2368 
2369 	if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2370 			IEEE80211_VHT_MCS_NOT_SUPPORTED)
2371 		arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2372 
2373 	/* TODO:  Check */
2374 	arg->tx_max_mcs_nss = 0xFF;
2375 
2376 	if (arg->peer_phymode == MODE_11AC_VHT160) {
2377 		tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
2378 		rx_nss = min(arg->peer_nss, tx_nss);
2379 		arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2380 
2381 		if (!rx_nss) {
2382 			ath12k_warn(ar->ab, "invalid max_nss\n");
2383 			return;
2384 		}
2385 
2386 		nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2387 		arg->peer_bw_rxnss_override |= nss_160;
2388 	}
2389 
2390 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2391 		   "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2392 		   arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
2393 		   arg->peer_bw_rxnss_override);
2394 }
2395 
ath12k_mac_get_max_he_mcs_map(u16 mcs_map,int nss)2396 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2397 {
2398 	switch ((mcs_map >> (2 * nss)) & 0x3) {
2399 	case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2400 	case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2401 	case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2402 	}
2403 	return 0;
2404 }
2405 
ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,const u16 * he_mcs_limit)2406 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2407 					const u16 *he_mcs_limit)
2408 {
2409 	int idx_limit;
2410 	int nss;
2411 	u16 mcs_map;
2412 	u16 mcs;
2413 
2414 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2415 		mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2416 			he_mcs_limit[nss];
2417 
2418 		if (mcs_map)
2419 			idx_limit = fls(mcs_map) - 1;
2420 		else
2421 			idx_limit = -1;
2422 
2423 		switch (idx_limit) {
2424 		case 0 ... 7:
2425 			mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2426 			break;
2427 		case 8:
2428 		case 9:
2429 			mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2430 			break;
2431 		case 10:
2432 		case 11:
2433 			mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2434 			break;
2435 		default:
2436 			WARN_ON(1);
2437 			fallthrough;
2438 		case -1:
2439 			mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2440 			break;
2441 		}
2442 
2443 		tx_mcs_set &= ~(0x3 << (nss * 2));
2444 		tx_mcs_set |= mcs << (nss * 2);
2445 	}
2446 
2447 	return tx_mcs_set;
2448 }
2449 
2450 static bool
ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])2451 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2452 {
2453 	int nss;
2454 
2455 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2456 		if (he_mcs_mask[nss])
2457 			return false;
2458 
2459 	return true;
2460 }
2461 
ath12k_peer_assoc_h_he(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2462 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
2463 				   struct ath12k_link_vif *arvif,
2464 				   struct ath12k_link_sta *arsta,
2465 				   struct ath12k_wmi_peer_assoc_arg *arg)
2466 {
2467 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2468 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2469 	const struct ieee80211_sta_he_cap *he_cap;
2470 	struct ieee80211_bss_conf *link_conf;
2471 	struct ieee80211_link_sta *link_sta;
2472 	struct cfg80211_chan_def def;
2473 	int i;
2474 	u8 ampdu_factor, max_nss;
2475 	u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2476 	u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2477 	u16 mcs_160_map, mcs_80_map;
2478 	u8 link_id = arvif->link_id;
2479 	bool support_160;
2480 	enum nl80211_band band;
2481 	u16 *he_mcs_mask;
2482 	u8 he_mcs;
2483 	u16 he_tx_mcs = 0, v = 0;
2484 	int he_nss, nss_idx;
2485 	bool user_rate_valid = true;
2486 	u32 rx_nss, tx_nss, nss_160;
2487 
2488 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
2489 		return;
2490 
2491 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
2492 	if (!link_conf) {
2493 		ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u",
2494 			    vif->addr, link_id);
2495 		return;
2496 	}
2497 
2498 	link_sta = ath12k_mac_get_link_sta(arsta);
2499 	if (!link_sta) {
2500 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2501 			    sta->addr, arsta->link_id);
2502 		return;
2503 	}
2504 
2505 	he_cap = &link_sta->he_cap;
2506 	if (!he_cap->has_he)
2507 		return;
2508 
2509 	band = def.chan->band;
2510 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2511 
2512 	if (ath12k_peer_assoc_h_he_masked(he_mcs_mask))
2513 		return;
2514 
2515 	arg->he_flag = true;
2516 
2517 	support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2518 		  IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2519 
2520 	/* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2521 	mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2522 	mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2523 
2524 	if (support_160) {
2525 		for (i = 7; i >= 0; i--) {
2526 			u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2527 
2528 			if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2529 				rx_mcs_160 = i + 1;
2530 				break;
2531 			}
2532 		}
2533 	}
2534 
2535 	for (i = 7; i >= 0; i--) {
2536 		u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2537 
2538 		if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2539 			rx_mcs_80 = i + 1;
2540 			break;
2541 		}
2542 	}
2543 
2544 	if (support_160)
2545 		max_nss = min(rx_mcs_80, rx_mcs_160);
2546 	else
2547 		max_nss = rx_mcs_80;
2548 
2549 	arg->peer_nss = min(link_sta->rx_nss, max_nss);
2550 
2551 	memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
2552 	       sizeof(he_cap->he_cap_elem.mac_cap_info));
2553 	memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
2554 	       sizeof(he_cap->he_cap_elem.phy_cap_info));
2555 	arg->peer_he_ops = link_conf->he_oper.params;
2556 
2557 	/* the top most byte is used to indicate BSS color info */
2558 	arg->peer_he_ops &= 0xffffff;
2559 
2560 	/* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
2561 	 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
2562 	 * as calculated while parsing VHT caps(if VHT caps is present)
2563 	 * or HT caps (if VHT caps is not present).
2564 	 *
2565 	 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
2566 	 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2567 	 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2568 	 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2569 	 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2570 	 * length.
2571 	 */
2572 	ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2573 				   IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2574 
2575 	if (ampdu_factor) {
2576 		if (link_sta->vht_cap.vht_supported)
2577 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2578 						    ampdu_factor)) - 1;
2579 		else if (link_sta->ht_cap.ht_supported)
2580 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2581 						    ampdu_factor)) - 1;
2582 	}
2583 
2584 	if (he_cap->he_cap_elem.phy_cap_info[6] &
2585 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2586 		int bit = 7;
2587 		int nss, ru;
2588 
2589 		arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2590 					  IEEE80211_PPE_THRES_NSS_MASK;
2591 		arg->peer_ppet.ru_bit_mask =
2592 			(he_cap->ppe_thres[0] &
2593 			 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2594 			IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2595 
2596 		for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2597 			for (ru = 0; ru < 4; ru++) {
2598 				u32 val = 0;
2599 				int i;
2600 
2601 				if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2602 					continue;
2603 				for (i = 0; i < 6; i++) {
2604 					val >>= 1;
2605 					val |= ((he_cap->ppe_thres[bit / 8] >>
2606 						 (bit % 8)) & 0x1) << 5;
2607 					bit++;
2608 				}
2609 				arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2610 								val << (ru * 6);
2611 			}
2612 		}
2613 	}
2614 
2615 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2616 		arg->twt_responder = true;
2617 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2618 		arg->twt_requester = true;
2619 
2620 	he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
2621 
2622 	if (he_nss > link_sta->rx_nss) {
2623 		user_rate_valid = false;
2624 		for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2625 			if (he_mcs_mask[nss_idx]) {
2626 				user_rate_valid = true;
2627 				break;
2628 			}
2629 		}
2630 	}
2631 
2632 	if (!user_rate_valid) {
2633 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2634 			   "Setting he range MCS value to peer supported nss:%d for peer %pM\n",
2635 			   link_sta->rx_nss, arsta->addr);
2636 		he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2637 	}
2638 
2639 	switch (link_sta->bandwidth) {
2640 	case IEEE80211_STA_RX_BW_160:
2641 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2642 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2643 
2644 		v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2645 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2646 
2647 		arg->peer_he_mcs_count++;
2648 		if (!he_tx_mcs)
2649 			he_tx_mcs = v;
2650 		fallthrough;
2651 
2652 	default:
2653 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2654 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2655 
2656 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2657 		v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2658 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2659 
2660 		arg->peer_he_mcs_count++;
2661 		if (!he_tx_mcs)
2662 			he_tx_mcs = v;
2663 		break;
2664 	}
2665 
2666 	/* Calculate peer NSS capability from HE capabilities if STA
2667 	 * supports HE.
2668 	 */
2669 	for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2670 		he_mcs = he_tx_mcs >> (2 * i) & 3;
2671 
2672 		/* In case of fixed rates, MCS Range in he_tx_mcs might have
2673 		 * unsupported range, with he_mcs_mask set, so check either of them
2674 		 * to find nss.
2675 		 */
2676 		if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2677 		    he_mcs_mask[i])
2678 			max_nss = i + 1;
2679 	}
2680 
2681 	max_nss = min(max_nss, ar->num_tx_chains);
2682 	arg->peer_nss = min(link_sta->rx_nss, max_nss);
2683 
2684 	if (arg->peer_phymode == MODE_11AX_HE160) {
2685 		tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
2686 		rx_nss = min(arg->peer_nss, tx_nss);
2687 
2688 		arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
2689 		arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2690 
2691 		if (!rx_nss) {
2692 			ath12k_warn(ar->ab, "invalid max_nss\n");
2693 			return;
2694 		}
2695 
2696 		nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2697 		arg->peer_bw_rxnss_override |= nss_160;
2698 	}
2699 
2700 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2701 		   "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2702 		   arsta->addr, arg->peer_nss,
2703 		   arg->peer_he_mcs_count,
2704 		   arg->peer_bw_rxnss_override);
2705 }
2706 
ath12k_peer_assoc_h_he_6ghz(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2707 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
2708 					struct ath12k_link_vif *arvif,
2709 					struct ath12k_link_sta *arsta,
2710 					struct ath12k_wmi_peer_assoc_arg *arg)
2711 {
2712 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2713 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2714 	const struct ieee80211_sta_he_cap *he_cap;
2715 	struct ieee80211_link_sta *link_sta;
2716 	struct cfg80211_chan_def def;
2717 	enum nl80211_band band;
2718 	u8 ampdu_factor, mpdu_density;
2719 
2720 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2721 		return;
2722 
2723 	band = def.chan->band;
2724 
2725 	link_sta = ath12k_mac_get_link_sta(arsta);
2726 	if (!link_sta) {
2727 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n",
2728 			    sta->addr, arsta->link_id);
2729 		return;
2730 	}
2731 
2732 	he_cap = &link_sta->he_cap;
2733 
2734 	if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa)
2735 		return;
2736 
2737 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2738 		arg->bw_40 = true;
2739 
2740 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2741 		arg->bw_80 = true;
2742 
2743 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2744 		arg->bw_160 = true;
2745 
2746 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2747 		arg->bw_320 = true;
2748 
2749 	arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa);
2750 
2751 	mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz,
2752 				    IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
2753 	arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density);
2754 
2755 	/* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2756 	 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2757 	 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2758 	 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2759 	 * Band Capabilities element in the 6 GHz band.
2760 	 *
2761 	 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2762 	 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2763 	 */
2764 	ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2765 				   IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) +
2766 			u32_get_bits(arg->peer_he_caps_6ghz,
2767 				     IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
2768 
2769 	arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2770 				     ampdu_factor)) - 1;
2771 }
2772 
ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa,int * smps)2773 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap,
2774 				     const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
2775 				     int *smps)
2776 {
2777 	if (ht_cap->ht_supported)
2778 		*smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS);
2779 	else
2780 		*smps = le16_get_bits(he_6ghz_capa->capa,
2781 				      IEEE80211_HE_6GHZ_CAP_SM_PS);
2782 
2783 	if (*smps >= ARRAY_SIZE(ath12k_smps_map))
2784 		return -EINVAL;
2785 
2786 	return 0;
2787 }
2788 
ath12k_peer_assoc_h_smps(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2789 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta,
2790 				     struct ath12k_wmi_peer_assoc_arg *arg)
2791 {
2792 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2793 	const struct ieee80211_he_6ghz_capa *he_6ghz_capa;
2794 	struct ath12k_link_vif *arvif = arsta->arvif;
2795 	const struct ieee80211_sta_ht_cap *ht_cap;
2796 	struct ieee80211_link_sta *link_sta;
2797 	struct ath12k *ar = arvif->ar;
2798 	int smps;
2799 
2800 	link_sta = ath12k_mac_get_link_sta(arsta);
2801 	if (!link_sta) {
2802 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2803 			    sta->addr, arsta->link_id);
2804 		return;
2805 	}
2806 
2807 	he_6ghz_capa = &link_sta->he_6ghz_capa;
2808 	ht_cap = &link_sta->ht_cap;
2809 
2810 	if (!ht_cap->ht_supported && !he_6ghz_capa->capa)
2811 		return;
2812 
2813 	if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps))
2814 		return;
2815 
2816 	switch (smps) {
2817 	case WLAN_HT_CAP_SM_PS_STATIC:
2818 		arg->static_mimops_flag = true;
2819 		break;
2820 	case WLAN_HT_CAP_SM_PS_DYNAMIC:
2821 		arg->dynamic_mimops_flag = true;
2822 		break;
2823 	case WLAN_HT_CAP_SM_PS_DISABLED:
2824 		arg->spatial_mux_flag = true;
2825 		break;
2826 	default:
2827 		break;
2828 	}
2829 }
2830 
ath12k_peer_assoc_h_qos(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2831 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
2832 				    struct ath12k_link_vif *arvif,
2833 				    struct ath12k_link_sta *arsta,
2834 				    struct ath12k_wmi_peer_assoc_arg *arg)
2835 {
2836 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2837 
2838 	switch (arvif->ahvif->vdev_type) {
2839 	case WMI_VDEV_TYPE_AP:
2840 		if (sta->wme) {
2841 			/* TODO: Check WME vs QoS */
2842 			arg->is_wme_set = true;
2843 			arg->qos_flag = true;
2844 		}
2845 
2846 		if (sta->wme && sta->uapsd_queues) {
2847 			/* TODO: Check WME vs QoS */
2848 			arg->is_wme_set = true;
2849 			arg->apsd_flag = true;
2850 			arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2851 		}
2852 		break;
2853 	case WMI_VDEV_TYPE_STA:
2854 		if (sta->wme) {
2855 			arg->is_wme_set = true;
2856 			arg->qos_flag = true;
2857 		}
2858 		break;
2859 	default:
2860 		break;
2861 	}
2862 
2863 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
2864 		   arsta->addr, arg->qos_flag);
2865 }
2866 
ath12k_peer_assoc_qos_ap(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)2867 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
2868 				    struct ath12k_link_vif *arvif,
2869 				    struct ath12k_link_sta *arsta)
2870 {
2871 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2872 	struct ath12k_wmi_ap_ps_arg arg;
2873 	u32 max_sp;
2874 	u32 uapsd;
2875 	int ret;
2876 
2877 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2878 
2879 	arg.vdev_id = arvif->vdev_id;
2880 
2881 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2882 		   sta->uapsd_queues, sta->max_sp);
2883 
2884 	uapsd = 0;
2885 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2886 		uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2887 			 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2888 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2889 		uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2890 			 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2891 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2892 		uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2893 			 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2894 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2895 		uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2896 			 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2897 
2898 	max_sp = 0;
2899 	if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2900 		max_sp = sta->max_sp;
2901 
2902 	arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2903 	arg.value = uapsd;
2904 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2905 	if (ret)
2906 		goto err;
2907 
2908 	arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2909 	arg.value = max_sp;
2910 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2911 	if (ret)
2912 		goto err;
2913 
2914 	/* TODO: revisit during testing */
2915 	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2916 	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2917 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2918 	if (ret)
2919 		goto err;
2920 
2921 	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2922 	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2923 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2924 	if (ret)
2925 		goto err;
2926 
2927 	return 0;
2928 
2929 err:
2930 	ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2931 		    arg.param, arvif->vdev_id, ret);
2932 	return ret;
2933 }
2934 
ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta * sta)2935 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta)
2936 {
2937 	return sta->supp_rates[NL80211_BAND_2GHZ] >>
2938 	       ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2939 }
2940 
ath12k_mac_get_phymode_vht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2941 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2942 						    struct ieee80211_link_sta *link_sta)
2943 {
2944 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2945 		if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2946 		    IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
2947 			return MODE_11AC_VHT160;
2948 
2949 		/* Allow STA to connect even if it does not explicitly advertise 160 MHz
2950 		 * support
2951 		 */
2952 		return MODE_11AC_VHT160;
2953 	}
2954 
2955 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2956 		return MODE_11AC_VHT80;
2957 
2958 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2959 		return MODE_11AC_VHT40;
2960 
2961 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2962 		return MODE_11AC_VHT20;
2963 
2964 	return MODE_UNKNOWN;
2965 }
2966 
ath12k_mac_get_phymode_he(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2967 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2968 						   struct ieee80211_link_sta *link_sta)
2969 {
2970 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2971 		if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2972 		     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2973 			return MODE_11AX_HE160;
2974 
2975 		return MODE_UNKNOWN;
2976 	}
2977 
2978 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2979 		return MODE_11AX_HE80;
2980 
2981 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2982 		return MODE_11AX_HE40;
2983 
2984 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2985 		return MODE_11AX_HE20;
2986 
2987 	return MODE_UNKNOWN;
2988 }
2989 
ath12k_mac_get_phymode_eht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2990 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
2991 						    struct ieee80211_link_sta *link_sta)
2992 {
2993 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2994 		if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] &
2995 		    IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2996 			return MODE_11BE_EHT320;
2997 
2998 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2999 		if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
3000 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
3001 			return MODE_11BE_EHT160;
3002 
3003 		ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
3004 			    link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
3005 
3006 		return MODE_UNKNOWN;
3007 	}
3008 
3009 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3010 		return MODE_11BE_EHT80;
3011 
3012 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3013 		return MODE_11BE_EHT40;
3014 
3015 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
3016 		return MODE_11BE_EHT20;
3017 
3018 	return MODE_UNKNOWN;
3019 }
3020 
ath12k_peer_assoc_h_phymode(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3021 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
3022 					struct ath12k_link_vif *arvif,
3023 					struct ath12k_link_sta *arsta,
3024 					struct ath12k_wmi_peer_assoc_arg *arg)
3025 {
3026 	struct ieee80211_link_sta *link_sta;
3027 	struct cfg80211_chan_def def;
3028 	enum nl80211_band band;
3029 	const u8 *ht_mcs_mask;
3030 	const u16 *vht_mcs_mask;
3031 	const u16 *he_mcs_mask;
3032 	enum wmi_phy_mode phymode = MODE_UNKNOWN;
3033 
3034 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3035 
3036 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3037 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3038 
3039 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
3040 		return;
3041 
3042 	band = def.chan->band;
3043 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3044 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3045 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
3046 
3047 	link_sta = ath12k_mac_get_link_sta(arsta);
3048 	if (!link_sta) {
3049 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
3050 			    sta->addr, arsta->link_id);
3051 		return;
3052 	}
3053 
3054 	switch (band) {
3055 	case NL80211_BAND_2GHZ:
3056 		if (link_sta->eht_cap.has_eht) {
3057 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3058 				phymode = MODE_11BE_EHT40_2G;
3059 			else
3060 				phymode = MODE_11BE_EHT20_2G;
3061 		} else if (link_sta->he_cap.has_he &&
3062 			   !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3063 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3064 				phymode = MODE_11AX_HE80_2G;
3065 			else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3066 				phymode = MODE_11AX_HE40_2G;
3067 			else
3068 				phymode = MODE_11AX_HE20_2G;
3069 		} else if (link_sta->vht_cap.vht_supported &&
3070 		    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3071 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3072 				phymode = MODE_11AC_VHT40;
3073 			else
3074 				phymode = MODE_11AC_VHT20;
3075 		} else if (link_sta->ht_cap.ht_supported &&
3076 			   !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3077 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3078 				phymode = MODE_11NG_HT40;
3079 			else
3080 				phymode = MODE_11NG_HT20;
3081 		} else if (ath12k_mac_sta_has_ofdm_only(link_sta)) {
3082 			phymode = MODE_11G;
3083 		} else {
3084 			phymode = MODE_11B;
3085 		}
3086 		break;
3087 	case NL80211_BAND_5GHZ:
3088 	case NL80211_BAND_6GHZ:
3089 		/* Check EHT first */
3090 		if (link_sta->eht_cap.has_eht) {
3091 			phymode = ath12k_mac_get_phymode_eht(ar, link_sta);
3092 		} else if (link_sta->he_cap.has_he &&
3093 			   !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3094 			phymode = ath12k_mac_get_phymode_he(ar, link_sta);
3095 		} else if (link_sta->vht_cap.vht_supported &&
3096 		    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3097 			phymode = ath12k_mac_get_phymode_vht(ar, link_sta);
3098 		} else if (link_sta->ht_cap.ht_supported &&
3099 			   !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3100 			if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40)
3101 				phymode = MODE_11NA_HT40;
3102 			else
3103 				phymode = MODE_11NA_HT20;
3104 		} else {
3105 			phymode = MODE_11A;
3106 		}
3107 		break;
3108 	default:
3109 		break;
3110 	}
3111 
3112 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
3113 		   arsta->addr, ath12k_mac_phymode_str(phymode));
3114 
3115 	arg->peer_phymode = phymode;
3116 	WARN_ON(phymode == MODE_UNKNOWN);
3117 }
3118 
ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7,u8 rx_tx_mcs9,u8 rx_tx_mcs11,u8 rx_tx_mcs13,u32 * rx_mcs,u32 * tx_mcs)3119 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
3120 				   u8 rx_tx_mcs11, u8 rx_tx_mcs13,
3121 				   u32 *rx_mcs, u32 *tx_mcs)
3122 {
3123 	*rx_mcs = 0;
3124 	u32p_replace_bits(rx_mcs,
3125 			  u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
3126 			  WMI_EHT_MCS_NSS_0_7);
3127 	u32p_replace_bits(rx_mcs,
3128 			  u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
3129 			  WMI_EHT_MCS_NSS_8_9);
3130 	u32p_replace_bits(rx_mcs,
3131 			  u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
3132 			  WMI_EHT_MCS_NSS_10_11);
3133 	u32p_replace_bits(rx_mcs,
3134 			  u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
3135 			  WMI_EHT_MCS_NSS_12_13);
3136 
3137 	*tx_mcs = 0;
3138 	u32p_replace_bits(tx_mcs,
3139 			  u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
3140 			  WMI_EHT_MCS_NSS_0_7);
3141 	u32p_replace_bits(tx_mcs,
3142 			  u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
3143 			  WMI_EHT_MCS_NSS_8_9);
3144 	u32p_replace_bits(tx_mcs,
3145 			  u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
3146 			  WMI_EHT_MCS_NSS_10_11);
3147 	u32p_replace_bits(tx_mcs,
3148 			  u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
3149 			  WMI_EHT_MCS_NSS_12_13);
3150 }
3151 
ath12k_mac_set_eht_ppe_threshold(const u8 * ppe_thres,struct ath12k_wmi_ppe_threshold_arg * ppet)3152 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
3153 					     struct ath12k_wmi_ppe_threshold_arg *ppet)
3154 {
3155 	u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
3156 	u8 nss, ru, i;
3157 	u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
3158 
3159 	ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
3160 	ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
3161 					 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3162 
3163 	for (nss = 0; nss <= ppet->numss_m1; nss++) {
3164 		for (ru = 0;
3165 		     ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3166 		     ru++) {
3167 			if ((ppet->ru_bit_mask & BIT(ru)) == 0)
3168 				continue;
3169 
3170 			val = 0;
3171 			for (i = 0; i < ppet_bit_len_per_ru; i++) {
3172 				val |= (((ppe_thres[bit_pos / 8] >>
3173 					  (bit_pos % 8)) & 0x1) << i);
3174 				bit_pos++;
3175 			}
3176 			ppet->ppet16_ppet8_ru3_ru0[nss] |=
3177 					(val << (ru * ppet_bit_len_per_ru));
3178 		}
3179 	}
3180 }
3181 
ath12k_peer_assoc_h_eht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3182 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
3183 				    struct ath12k_link_vif *arvif,
3184 				    struct ath12k_link_sta *arsta,
3185 				    struct ath12k_wmi_peer_assoc_arg *arg)
3186 {
3187 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3188 	const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
3189 	const struct ieee80211_eht_mcs_nss_supp_bw *bw;
3190 	const struct ieee80211_sta_eht_cap *eht_cap;
3191 	const struct ieee80211_sta_he_cap *he_cap;
3192 	struct ieee80211_link_sta *link_sta;
3193 	struct ieee80211_bss_conf *link_conf;
3194 	u32 *rx_mcs, *tx_mcs;
3195 
3196 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3197 
3198 	link_sta = ath12k_mac_get_link_sta(arsta);
3199 	if (!link_sta) {
3200 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n",
3201 			    sta->addr, arsta->link_id);
3202 		return;
3203 	}
3204 
3205 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3206 	if (!link_conf) {
3207 		ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n");
3208 		return;
3209 	}
3210 
3211 	eht_cap = &link_sta->eht_cap;
3212 	he_cap = &link_sta->he_cap;
3213 	if (!he_cap->has_he || !eht_cap->has_eht)
3214 		return;
3215 
3216 	arg->eht_flag = true;
3217 
3218 	if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
3219 	     IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
3220 	    eht_cap->eht_ppe_thres[0] != 0)
3221 		ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
3222 						 &arg->peer_eht_ppet);
3223 
3224 	memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
3225 	       sizeof(eht_cap->eht_cap_elem.mac_cap_info));
3226 	memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
3227 	       sizeof(eht_cap->eht_cap_elem.phy_cap_info));
3228 
3229 	rx_mcs = arg->peer_eht_rx_mcs_set;
3230 	tx_mcs = arg->peer_eht_tx_mcs_set;
3231 
3232 	switch (link_sta->bandwidth) {
3233 	case IEEE80211_STA_RX_BW_320:
3234 		bw = &eht_cap->eht_mcs_nss_supp.bw._320;
3235 		ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3236 				       bw->rx_tx_mcs9_max_nss,
3237 				       bw->rx_tx_mcs11_max_nss,
3238 				       bw->rx_tx_mcs13_max_nss,
3239 				       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
3240 				       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
3241 		arg->peer_eht_mcs_count++;
3242 		fallthrough;
3243 	case IEEE80211_STA_RX_BW_160:
3244 		bw = &eht_cap->eht_mcs_nss_supp.bw._160;
3245 		ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3246 				       bw->rx_tx_mcs9_max_nss,
3247 				       bw->rx_tx_mcs11_max_nss,
3248 				       bw->rx_tx_mcs13_max_nss,
3249 				       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
3250 				       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
3251 		arg->peer_eht_mcs_count++;
3252 		fallthrough;
3253 	default:
3254 		if ((he_cap->he_cap_elem.phy_cap_info[0] &
3255 		     (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
3256 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3257 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
3258 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
3259 			bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
3260 
3261 			ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
3262 					       bw_20->rx_tx_mcs9_max_nss,
3263 					       bw_20->rx_tx_mcs11_max_nss,
3264 					       bw_20->rx_tx_mcs13_max_nss,
3265 					       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3266 					       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3267 		} else {
3268 			bw = &eht_cap->eht_mcs_nss_supp.bw._80;
3269 			ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3270 					       bw->rx_tx_mcs9_max_nss,
3271 					       bw->rx_tx_mcs11_max_nss,
3272 					       bw->rx_tx_mcs13_max_nss,
3273 					       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3274 					       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3275 		}
3276 
3277 		arg->peer_eht_mcs_count++;
3278 		break;
3279 	}
3280 
3281 	arg->punct_bitmap = ~arvif->punct_bitmap;
3282 	arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15;
3283 }
3284 
ath12k_peer_assoc_h_mlo(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3285 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta,
3286 				    struct ath12k_wmi_peer_assoc_arg *arg)
3287 {
3288 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3289 	struct peer_assoc_mlo_params *ml = &arg->ml;
3290 	struct ath12k_sta *ahsta = arsta->ahsta;
3291 	struct ath12k_link_sta *arsta_p;
3292 	struct ath12k_link_vif *arvif;
3293 	unsigned long links;
3294 	u8 link_id;
3295 	int i;
3296 
3297 	if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID)
3298 		return;
3299 
3300 	ml->enabled = true;
3301 	ml->assoc_link = arsta->is_assoc_link;
3302 
3303 	/* For now considering the primary umac based on assoc link */
3304 	ml->primary_umac = arsta->is_assoc_link;
3305 	ml->peer_id_valid = true;
3306 	ml->logical_link_idx_valid = true;
3307 
3308 	ether_addr_copy(ml->mld_addr, sta->addr);
3309 	ml->logical_link_idx = arsta->link_idx;
3310 	ml->ml_peer_id = ahsta->ml_peer_id;
3311 	ml->ieee_link_id = arsta->link_id;
3312 	ml->num_partner_links = 0;
3313 	ml->eml_cap = sta->eml_cap;
3314 	links = ahsta->links_map;
3315 
3316 	rcu_read_lock();
3317 
3318 	i = 0;
3319 
3320 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
3321 		if (i >= ATH12K_WMI_MLO_MAX_LINKS)
3322 			break;
3323 
3324 		arsta_p = rcu_dereference(ahsta->link[link_id]);
3325 		arvif = rcu_dereference(ahsta->ahvif->link[link_id]);
3326 
3327 		if (arsta_p == arsta)
3328 			continue;
3329 
3330 		if (!arvif->is_started)
3331 			continue;
3332 
3333 		ml->partner_info[i].vdev_id = arvif->vdev_id;
3334 		ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id;
3335 		ml->partner_info[i].assoc_link = arsta_p->is_assoc_link;
3336 		ml->partner_info[i].primary_umac = arsta_p->is_assoc_link;
3337 		ml->partner_info[i].logical_link_idx_valid = true;
3338 		ml->partner_info[i].logical_link_idx = arsta_p->link_idx;
3339 		ml->num_partner_links++;
3340 
3341 		i++;
3342 	}
3343 
3344 	rcu_read_unlock();
3345 }
3346 
ath12k_peer_assoc_prepare(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg,bool reassoc)3347 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
3348 				      struct ath12k_link_vif *arvif,
3349 				      struct ath12k_link_sta *arsta,
3350 				      struct ath12k_wmi_peer_assoc_arg *arg,
3351 				      bool reassoc)
3352 {
3353 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3354 
3355 	memset(arg, 0, sizeof(*arg));
3356 
3357 	reinit_completion(&ar->peer_assoc_done);
3358 
3359 	arg->peer_new_assoc = !reassoc;
3360 	ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg);
3361 	ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg);
3362 	ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg);
3363 	ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg);
3364 	ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg);
3365 	ath12k_peer_assoc_h_he(ar, arvif, arsta, arg);
3366 	ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg);
3367 	ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg);
3368 	ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg);
3369 	ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg);
3370 	ath12k_peer_assoc_h_smps(arsta, arg);
3371 	ath12k_peer_assoc_h_mlo(arsta, arg);
3372 
3373 	arsta->peer_nss = arg->peer_nss;
3374 	/* TODO: amsdu_disable req? */
3375 }
3376 
ath12k_setup_peer_smps(struct ath12k * ar,struct ath12k_link_vif * arvif,const u8 * addr,const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa)3377 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif,
3378 				  const u8 *addr,
3379 				  const struct ieee80211_sta_ht_cap *ht_cap,
3380 				  const struct ieee80211_he_6ghz_capa *he_6ghz_capa)
3381 {
3382 	int smps, ret = 0;
3383 
3384 	if (!ht_cap->ht_supported && !he_6ghz_capa)
3385 		return 0;
3386 
3387 	ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps);
3388 	if (ret < 0)
3389 		return ret;
3390 
3391 	return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
3392 					 WMI_PEER_MIMO_PS_STATE,
3393 					 ath12k_smps_map[smps]);
3394 }
3395 
ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif * arvif)3396 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
3397 {
3398 	struct ath12k_vif *ahvif = arvif->ahvif;
3399 	struct ath12k *ar = arvif->ar;
3400 	u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
3401 	u32 value = 0;
3402 	int ret;
3403 	struct ieee80211_bss_conf *link_conf;
3404 
3405 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3406 	if (!link_conf) {
3407 		ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n");
3408 		return -EINVAL;
3409 	}
3410 
3411 	if (!link_conf->he_support)
3412 		return 0;
3413 
3414 	if (link_conf->he_su_beamformer) {
3415 		value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3416 		if (link_conf->he_mu_beamformer &&
3417 		    ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3418 			value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER);
3419 	}
3420 
3421 	if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3422 		value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3423 			 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3424 
3425 		if (link_conf->he_full_ul_mumimo)
3426 			value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO);
3427 
3428 		if (link_conf->he_su_beamformee)
3429 			value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3430 	}
3431 
3432 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3433 	if (ret) {
3434 		ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
3435 			    arvif->vdev_id, ret);
3436 		return ret;
3437 	}
3438 
3439 	param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
3440 	value =	u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
3441 		u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
3442 				HE_TRIG_NONTRIG_SOUNDING_MODE);
3443 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3444 					    param, value);
3445 	if (ret) {
3446 		ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
3447 			    arvif->vdev_id, ret);
3448 		return ret;
3449 	}
3450 
3451 	return 0;
3452 }
3453 
ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_sta_he_cap * he_cap,int * hemode)3454 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
3455 					     struct ath12k_link_vif *arvif,
3456 					     struct ieee80211_sta_he_cap *he_cap,
3457 					     int *hemode)
3458 {
3459 	struct ieee80211_vif *vif = arvif->ahvif->vif;
3460 	struct ieee80211_he_cap_elem he_cap_elem = {};
3461 	struct ieee80211_sta_he_cap *cap_band;
3462 	struct cfg80211_chan_def def;
3463 	u8 link_id = arvif->link_id;
3464 	struct ieee80211_bss_conf *link_conf;
3465 
3466 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3467 	if (!link_conf) {
3468 		ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n");
3469 		return -EINVAL;
3470 	}
3471 
3472 	if (!link_conf->he_support)
3473 		return 0;
3474 
3475 	if (vif->type != NL80211_IFTYPE_STATION)
3476 		return -EINVAL;
3477 
3478 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
3479 		return -EINVAL;
3480 
3481 	if (def.chan->band == NL80211_BAND_2GHZ)
3482 		cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
3483 	else
3484 		cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
3485 
3486 	memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
3487 
3488 	*hemode = 0;
3489 	if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
3490 		if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3491 			*hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3492 		if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3493 			*hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
3494 	}
3495 
3496 	if (vif->type != NL80211_IFTYPE_MESH_POINT) {
3497 		*hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3498 			  u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3499 
3500 		if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
3501 			if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
3502 				*hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE,
3503 							  HE_MODE_UL_MUMIMO);
3504 
3505 		if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE))
3506 			*hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3507 
3508 		if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER))
3509 			*hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3510 	}
3511 
3512 	return 0;
3513 }
3514 
ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif * arvif)3515 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
3516 {
3517 	struct ath12k_vif *ahvif = arvif->ahvif;
3518 	struct ath12k *ar = arvif->ar;
3519 	u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
3520 	u32 value = 0;
3521 	int ret;
3522 	struct ieee80211_bss_conf *link_conf;
3523 
3524 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3525 	if (!link_conf) {
3526 		ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
3527 		return -ENOENT;
3528 	}
3529 
3530 	if (!link_conf->eht_support)
3531 		return 0;
3532 
3533 	if (link_conf->eht_su_beamformer) {
3534 		value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
3535 		if (link_conf->eht_mu_beamformer &&
3536 		    ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3537 			value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
3538 						 EHT_MODE_MU_TX_BFER) |
3539 				 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
3540 						 EHT_MODE_DL_OFDMA_MUMIMO) |
3541 				 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
3542 						 EHT_MODE_UL_OFDMA_MUMIMO);
3543 	}
3544 
3545 	if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3546 		value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
3547 			 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
3548 
3549 		if (link_conf->eht_80mhz_full_bw_ul_mumimo)
3550 			value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
3551 
3552 		if (link_conf->eht_su_beamformee)
3553 			value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
3554 						 EHT_MODE_SU_TX_BFEE);
3555 	}
3556 
3557 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3558 	if (ret) {
3559 		ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
3560 			    arvif->vdev_id, ret);
3561 		return ret;
3562 	}
3563 
3564 	return 0;
3565 }
3566 
ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k * ar,struct ieee80211_link_sta * link_sta)3567 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3568 					      struct ieee80211_link_sta *link_sta)
3569 {
3570 	u32 bw;
3571 
3572 	switch (link_sta->bandwidth) {
3573 	case IEEE80211_STA_RX_BW_20:
3574 		bw = WMI_PEER_CHWIDTH_20MHZ;
3575 		break;
3576 	case IEEE80211_STA_RX_BW_40:
3577 		bw = WMI_PEER_CHWIDTH_40MHZ;
3578 		break;
3579 	case IEEE80211_STA_RX_BW_80:
3580 		bw = WMI_PEER_CHWIDTH_80MHZ;
3581 		break;
3582 	case IEEE80211_STA_RX_BW_160:
3583 		bw = WMI_PEER_CHWIDTH_160MHZ;
3584 		break;
3585 	case IEEE80211_STA_RX_BW_320:
3586 		bw = WMI_PEER_CHWIDTH_320MHZ;
3587 		break;
3588 	default:
3589 		ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n",
3590 			    link_sta->bandwidth, link_sta->addr);
3591 		bw = WMI_PEER_CHWIDTH_20MHZ;
3592 		break;
3593 	}
3594 
3595 	return bw;
3596 }
3597 
ath12k_bss_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * bss_conf)3598 static void ath12k_bss_assoc(struct ath12k *ar,
3599 			     struct ath12k_link_vif *arvif,
3600 			     struct ieee80211_bss_conf *bss_conf)
3601 {
3602 	struct ath12k_vif *ahvif = arvif->ahvif;
3603 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
3604 	struct ath12k_wmi_vdev_up_params params = {};
3605 	struct ieee80211_link_sta *link_sta;
3606 	u8 link_id = bss_conf->link_id;
3607 	struct ath12k_link_sta *arsta;
3608 	struct ieee80211_sta *ap_sta;
3609 	struct ath12k_sta *ahsta;
3610 	struct ath12k_peer *peer;
3611 	bool is_auth = false;
3612 	u32 hemode = 0;
3613 	int ret;
3614 
3615 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3616 
3617 	struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
3618 					kzalloc(sizeof(*peer_arg), GFP_KERNEL);
3619 	if (!peer_arg)
3620 		return;
3621 
3622 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3623 		   "mac vdev %i link id %u assoc bssid %pM aid %d\n",
3624 		   arvif->vdev_id, link_id, arvif->bssid, ahvif->aid);
3625 
3626 	rcu_read_lock();
3627 
3628 	/* During ML connection, cfg.ap_addr has the MLD address. For
3629 	 * non-ML connection, it has the BSSID.
3630 	 */
3631 	ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
3632 	if (!ap_sta) {
3633 		ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3634 			    vif->cfg.ap_addr, arvif->vdev_id);
3635 		rcu_read_unlock();
3636 		return;
3637 	}
3638 
3639 	ahsta = ath12k_sta_to_ahsta(ap_sta);
3640 
3641 	arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
3642 				  ahsta->link[link_id]);
3643 	if (WARN_ON(!arsta)) {
3644 		rcu_read_unlock();
3645 		return;
3646 	}
3647 
3648 	link_sta = ath12k_mac_get_link_sta(arsta);
3649 	if (WARN_ON(!link_sta)) {
3650 		rcu_read_unlock();
3651 		return;
3652 	}
3653 
3654 	ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);
3655 
3656 	/* link_sta->he_cap must be protected by rcu_read_lock */
3657 	ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode);
3658 	if (ret) {
3659 		ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n",
3660 			    arvif->vdev_id, bss_conf->bssid, ret);
3661 		rcu_read_unlock();
3662 		return;
3663 	}
3664 
3665 	rcu_read_unlock();
3666 
3667 	/* keep this before ath12k_wmi_send_peer_assoc_cmd() */
3668 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3669 					    WMI_VDEV_PARAM_SET_HEMU_MODE, hemode);
3670 	if (ret) {
3671 		ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
3672 			    hemode, ret);
3673 		return;
3674 	}
3675 
3676 	peer_arg->is_assoc = true;
3677 	ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
3678 	if (ret) {
3679 		ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3680 			    bss_conf->bssid, arvif->vdev_id, ret);
3681 		return;
3682 	}
3683 
3684 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3685 		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3686 			    bss_conf->bssid, arvif->vdev_id);
3687 		return;
3688 	}
3689 
3690 	ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3691 				     &link_sta->ht_cap, &link_sta->he_6ghz_capa);
3692 	if (ret) {
3693 		ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3694 			    arvif->vdev_id, ret);
3695 		return;
3696 	}
3697 
3698 	WARN_ON(arvif->is_up);
3699 
3700 	ahvif->aid = vif->cfg.aid;
3701 	ether_addr_copy(arvif->bssid, bss_conf->bssid);
3702 
3703 	params.vdev_id = arvif->vdev_id;
3704 	params.aid = ahvif->aid;
3705 	params.bssid = arvif->bssid;
3706 	params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
3707 	if (params.tx_bssid) {
3708 		params.nontx_profile_idx = bss_conf->bssid_index;
3709 		params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator;
3710 	}
3711 	ret = ath12k_wmi_vdev_up(ar, &params);
3712 	if (ret) {
3713 		ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3714 			    arvif->vdev_id, ret);
3715 		return;
3716 	}
3717 
3718 	arvif->is_up = true;
3719 	arvif->rekey_data.enable_offload = false;
3720 
3721 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3722 		   "mac vdev %d up (associated) bssid %pM aid %d\n",
3723 		   arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3724 
3725 	spin_lock_bh(&ar->ab->base_lock);
3726 
3727 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3728 	if (peer && peer->is_authorized)
3729 		is_auth = true;
3730 
3731 	spin_unlock_bh(&ar->ab->base_lock);
3732 
3733 	/* Authorize BSS Peer */
3734 	if (is_auth) {
3735 		ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
3736 						arvif->vdev_id,
3737 						WMI_PEER_AUTHORIZE,
3738 						1);
3739 		if (ret)
3740 			ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3741 	}
3742 
3743 	ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3744 					   &bss_conf->he_obss_pd);
3745 	if (ret)
3746 		ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3747 			    arvif->vdev_id, ret);
3748 
3749 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3750 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3751 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3752 		ath12k_mac_11d_scan_stop_all(ar->ab);
3753 }
3754 
ath12k_bss_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif)3755 static void ath12k_bss_disassoc(struct ath12k *ar,
3756 				struct ath12k_link_vif *arvif)
3757 {
3758 	int ret;
3759 
3760 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3761 
3762 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3763 		   arvif->vdev_id, arvif->bssid);
3764 
3765 	ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
3766 	if (ret)
3767 		ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
3768 			    arvif->vdev_id, ret);
3769 
3770 	arvif->is_up = false;
3771 
3772 	memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3773 
3774 	cancel_delayed_work(&arvif->connection_loss_work);
3775 }
3776 
ath12k_mac_get_rate_hw_value(int bitrate)3777 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
3778 {
3779 	u32 preamble;
3780 	u16 hw_value;
3781 	int rate;
3782 	size_t i;
3783 
3784 	if (ath12k_mac_bitrate_is_cck(bitrate))
3785 		preamble = WMI_RATE_PREAMBLE_CCK;
3786 	else
3787 		preamble = WMI_RATE_PREAMBLE_OFDM;
3788 
3789 	for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
3790 		if (ath12k_legacy_rates[i].bitrate != bitrate)
3791 			continue;
3792 
3793 		hw_value = ath12k_legacy_rates[i].hw_value;
3794 		rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
3795 
3796 		return rate;
3797 	}
3798 
3799 	return -EINVAL;
3800 }
3801 
ath12k_recalculate_mgmt_rate(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def * def)3802 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
3803 					 struct ath12k_link_vif *arvif,
3804 					 struct cfg80211_chan_def *def)
3805 {
3806 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3807 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
3808 	const struct ieee80211_supported_band *sband;
3809 	struct ieee80211_bss_conf *bss_conf;
3810 	u8 basic_rate_idx;
3811 	int hw_rate_code;
3812 	u32 vdev_param;
3813 	u16 bitrate;
3814 	int ret;
3815 
3816 	lockdep_assert_wiphy(hw->wiphy);
3817 
3818 	bss_conf = ath12k_mac_get_link_bss_conf(arvif);
3819 	if (!bss_conf) {
3820 		ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n",
3821 			    vif->addr, arvif->link_id);
3822 		return;
3823 	}
3824 
3825 	sband = hw->wiphy->bands[def->chan->band];
3826 	if (bss_conf->basic_rates)
3827 		basic_rate_idx = __ffs(bss_conf->basic_rates);
3828 	else
3829 		basic_rate_idx = 0;
3830 	bitrate = sband->bitrates[basic_rate_idx].bitrate;
3831 
3832 	hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
3833 	if (hw_rate_code < 0) {
3834 		ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3835 		return;
3836 	}
3837 
3838 	vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3839 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3840 					    hw_rate_code);
3841 	if (ret)
3842 		ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3843 
3844 	vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3845 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3846 					    hw_rate_code);
3847 	if (ret)
3848 		ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3849 }
3850 
ath12k_mac_init_arvif(struct ath12k_vif * ahvif,struct ath12k_link_vif * arvif,int link_id)3851 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
3852 				  struct ath12k_link_vif *arvif, int link_id)
3853 {
3854 	struct ath12k_hw *ah = ahvif->ah;
3855 	u8 _link_id;
3856 	int i;
3857 
3858 	lockdep_assert_wiphy(ah->hw->wiphy);
3859 
3860 	if (WARN_ON(!arvif))
3861 		return;
3862 
3863 	if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
3864 		return;
3865 
3866 	if (link_id < 0)
3867 		_link_id = 0;
3868 	else
3869 		_link_id = link_id;
3870 
3871 	arvif->ahvif = ahvif;
3872 	arvif->link_id = _link_id;
3873 
3874 	/* Protects the datapath stats update on a per link basis */
3875 	spin_lock_init(&arvif->link_stats_lock);
3876 
3877 	INIT_LIST_HEAD(&arvif->list);
3878 	INIT_DELAYED_WORK(&arvif->connection_loss_work,
3879 			  ath12k_mac_vif_sta_connection_loss_work);
3880 
3881 	arvif->num_stations = 0;
3882 
3883 	for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
3884 		arvif->bitrate_mask.control[i].legacy = 0xffffffff;
3885 		arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
3886 		memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
3887 		       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
3888 		memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
3889 		       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
3890 		memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
3891 		       sizeof(arvif->bitrate_mask.control[i].he_mcs));
3892 	}
3893 
3894 	/* Handle MLO related assignments */
3895 	if (link_id >= 0) {
3896 		rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
3897 		ahvif->links_map |= BIT(_link_id);
3898 	}
3899 
3900 	ath12k_generic_dbg(ATH12K_DBG_MAC,
3901 			   "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
3902 			   _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
3903 			   ahvif->links_map);
3904 }
3905 
ath12k_mac_remove_link_interface(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif)3906 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
3907 					     struct ath12k_link_vif *arvif)
3908 {
3909 	struct ath12k_vif *ahvif = arvif->ahvif;
3910 	struct ath12k_hw *ah = hw->priv;
3911 	struct ath12k *ar = arvif->ar;
3912 	int ret;
3913 
3914 	lockdep_assert_wiphy(ah->hw->wiphy);
3915 
3916 	cancel_delayed_work_sync(&arvif->connection_loss_work);
3917 
3918 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
3919 		   arvif->vdev_id, arvif->link_id);
3920 
3921 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3922 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3923 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3924 		ath12k_mac_11d_scan_stop(ar);
3925 
3926 	if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
3927 		ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
3928 		if (ret)
3929 			ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
3930 				    arvif->vdev_id, arvif->link_id, ret);
3931 	}
3932 	ath12k_mac_vdev_delete(ar, arvif);
3933 }
3934 
ath12k_mac_assign_link_vif(struct ath12k_hw * ah,struct ieee80211_vif * vif,u8 link_id)3935 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
3936 							  struct ieee80211_vif *vif,
3937 							  u8 link_id)
3938 {
3939 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3940 	struct ath12k_link_vif *arvif;
3941 
3942 	lockdep_assert_wiphy(ah->hw->wiphy);
3943 
3944 	arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
3945 	if (arvif)
3946 		return arvif;
3947 
3948 	/* If this is the first link arvif being created for an ML VIF
3949 	 * use the preallocated deflink memory except for scan arvifs
3950 	 */
3951 	if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) {
3952 		arvif = &ahvif->deflink;
3953 
3954 		if (vif->type == NL80211_IFTYPE_STATION)
3955 			arvif->is_sta_assoc_link = true;
3956 	} else {
3957 		arvif = kzalloc(sizeof(*arvif), GFP_KERNEL);
3958 		if (!arvif)
3959 			return NULL;
3960 	}
3961 
3962 	ath12k_mac_init_arvif(ahvif, arvif, link_id);
3963 
3964 	return arvif;
3965 }
3966 
ath12k_mac_unassign_link_vif(struct ath12k_link_vif * arvif)3967 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
3968 {
3969 	struct ath12k_vif *ahvif = arvif->ahvif;
3970 	struct ath12k_hw *ah = ahvif->ah;
3971 
3972 	lockdep_assert_wiphy(ah->hw->wiphy);
3973 
3974 	rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
3975 	synchronize_rcu();
3976 	ahvif->links_map &= ~BIT(arvif->link_id);
3977 
3978 	if (arvif != &ahvif->deflink)
3979 		kfree(arvif);
3980 	else
3981 		memset(arvif, 0, sizeof(*arvif));
3982 }
3983 
3984 static int
ath12k_mac_op_change_vif_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 old_links,u16 new_links,struct ieee80211_bss_conf * ol[IEEE80211_MLD_MAX_NUM_LINKS])3985 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw,
3986 			       struct ieee80211_vif *vif,
3987 			       u16 old_links, u16 new_links,
3988 			       struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS])
3989 {
3990 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3991 	unsigned long to_remove = old_links & ~new_links;
3992 	unsigned long to_add = ~old_links & new_links;
3993 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3994 	struct ath12k_link_vif *arvif;
3995 	u8 link_id;
3996 
3997 	lockdep_assert_wiphy(hw->wiphy);
3998 
3999 	ath12k_generic_dbg(ATH12K_DBG_MAC,
4000 			   "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n",
4001 			   vif->addr, old_links, new_links);
4002 
4003 	for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) {
4004 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4005 		/* mac80211 wants to add link but driver already has the
4006 		 * link. This should not happen ideally.
4007 		 */
4008 		if (WARN_ON(arvif))
4009 			return -EINVAL;
4010 
4011 		arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
4012 		if (WARN_ON(!arvif))
4013 			return -EINVAL;
4014 	}
4015 
4016 	for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) {
4017 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4018 		if (WARN_ON(!arvif))
4019 			return -EINVAL;
4020 
4021 		if (!arvif->is_created)
4022 			continue;
4023 
4024 		if (WARN_ON(!arvif->ar))
4025 			return -EINVAL;
4026 
4027 		ath12k_mac_remove_link_interface(hw, arvif);
4028 		ath12k_mac_unassign_link_vif(arvif);
4029 	}
4030 
4031 	return 0;
4032 }
4033 
ath12k_mac_fils_discovery(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)4034 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
4035 				     struct ieee80211_bss_conf *info)
4036 {
4037 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
4038 	struct ath12k *ar = arvif->ar;
4039 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4040 	struct sk_buff *tmpl;
4041 	int ret;
4042 	u32 interval;
4043 	bool unsol_bcast_probe_resp_enabled = false;
4044 
4045 	if (info->fils_discovery.max_interval) {
4046 		interval = info->fils_discovery.max_interval;
4047 
4048 		tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif);
4049 		if (tmpl)
4050 			ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
4051 							     tmpl);
4052 	} else if (info->unsol_bcast_probe_resp_interval) {
4053 		unsol_bcast_probe_resp_enabled = 1;
4054 		interval = info->unsol_bcast_probe_resp_interval;
4055 
4056 		tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
4057 		if (tmpl)
4058 			ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
4059 							 tmpl);
4060 	} else { /* Disable */
4061 		return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
4062 	}
4063 
4064 	if (!tmpl) {
4065 		ath12k_warn(ar->ab,
4066 			    "mac vdev %i failed to retrieve %s template\n",
4067 			    arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
4068 			    "unsolicited broadcast probe response" :
4069 			    "FILS discovery"));
4070 		return -EPERM;
4071 	}
4072 	kfree_skb(tmpl);
4073 
4074 	if (!ret)
4075 		ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
4076 						unsol_bcast_probe_resp_enabled);
4077 
4078 	return ret;
4079 }
4080 
ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 changed)4081 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw,
4082 					  struct ieee80211_vif *vif,
4083 					  u64 changed)
4084 {
4085 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4086 	unsigned long links = ahvif->links_map;
4087 	struct ieee80211_bss_conf *info;
4088 	struct ath12k_link_vif *arvif;
4089 	struct ieee80211_sta *sta;
4090 	struct ath12k_sta *ahsta;
4091 	struct ath12k *ar;
4092 	u8 link_id;
4093 
4094 	lockdep_assert_wiphy(hw->wiphy);
4095 
4096 	if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) {
4097 		ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4098 		if (vif->cfg.ssid_len)
4099 			memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4100 	}
4101 
4102 	if (changed & BSS_CHANGED_ASSOC) {
4103 		if (vif->cfg.assoc) {
4104 			/* only in station mode we can get here, so it's safe
4105 			 * to use ap_addr
4106 			 */
4107 			rcu_read_lock();
4108 			sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
4109 			if (!sta) {
4110 				rcu_read_unlock();
4111 				WARN_ONCE(1, "failed to find sta with addr %pM\n",
4112 					  vif->cfg.ap_addr);
4113 				return;
4114 			}
4115 
4116 			ahsta = ath12k_sta_to_ahsta(sta);
4117 			arvif = wiphy_dereference(hw->wiphy,
4118 						  ahvif->link[ahsta->assoc_link_id]);
4119 			rcu_read_unlock();
4120 
4121 			ar = arvif->ar;
4122 			/* there is no reason for which an assoc link's
4123 			 * bss info does not exist
4124 			 */
4125 			info = ath12k_mac_get_link_bss_conf(arvif);
4126 			ath12k_bss_assoc(ar, arvif, info);
4127 
4128 			/* exclude assoc link as it is done above */
4129 			links &= ~BIT(ahsta->assoc_link_id);
4130 		}
4131 
4132 		for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4133 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4134 			if (!arvif || !arvif->ar)
4135 				continue;
4136 
4137 			ar = arvif->ar;
4138 
4139 			if (vif->cfg.assoc) {
4140 				info = ath12k_mac_get_link_bss_conf(arvif);
4141 				if (!info)
4142 					continue;
4143 
4144 				ath12k_bss_assoc(ar, arvif, info);
4145 			} else {
4146 				ath12k_bss_disassoc(ar, arvif);
4147 			}
4148 		}
4149 	}
4150 }
4151 
ath12k_mac_vif_setup_ps(struct ath12k_link_vif * arvif)4152 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif)
4153 {
4154 	struct ath12k *ar = arvif->ar;
4155 	struct ieee80211_vif *vif = arvif->ahvif->vif;
4156 	struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
4157 	enum wmi_sta_powersave_param param;
4158 	struct ieee80211_bss_conf *info;
4159 	enum wmi_sta_ps_mode psmode;
4160 	int ret;
4161 	int timeout;
4162 	bool enable_ps;
4163 
4164 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4165 
4166 	if (vif->type != NL80211_IFTYPE_STATION)
4167 		return;
4168 
4169 	enable_ps = arvif->ahvif->ps;
4170 	if (enable_ps) {
4171 		psmode = WMI_STA_PS_MODE_ENABLED;
4172 		param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
4173 
4174 		timeout = conf->dynamic_ps_timeout;
4175 		if (timeout == 0) {
4176 			info = ath12k_mac_get_link_bss_conf(arvif);
4177 			if (!info) {
4178 				ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n",
4179 					    vif->addr, arvif->link_id);
4180 				return;
4181 			}
4182 
4183 			/* firmware doesn't like 0 */
4184 			timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000;
4185 		}
4186 
4187 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
4188 						  timeout);
4189 		if (ret) {
4190 			ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
4191 				    arvif->vdev_id, ret);
4192 			return;
4193 		}
4194 	} else {
4195 		psmode = WMI_STA_PS_MODE_DISABLED;
4196 	}
4197 
4198 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
4199 		   arvif->vdev_id, psmode ? "enable" : "disable");
4200 
4201 	ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
4202 	if (ret)
4203 		ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
4204 			    psmode, arvif->vdev_id, ret);
4205 }
4206 
ath12k_mac_supports_tpc(struct ath12k * ar,struct ath12k_vif * ahvif,const struct cfg80211_chan_def * chandef)4207 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif,
4208 				    const struct cfg80211_chan_def *chandef)
4209 {
4210 	return ath12k_wmi_supports_6ghz_cc_ext(ar) &&
4211 		test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
4212 		(ahvif->vdev_type == WMI_VDEV_TYPE_STA  ||
4213 		 ahvif->vdev_type == WMI_VDEV_TYPE_AP) &&
4214 		ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
4215 		chandef->chan &&
4216 		chandef->chan->band == NL80211_BAND_6GHZ;
4217 }
4218 
ath12k_mac_bss_info_changed(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info,u64 changed)4219 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
4220 					struct ath12k_link_vif *arvif,
4221 					struct ieee80211_bss_conf *info,
4222 					u64 changed)
4223 {
4224 	struct ath12k_vif *ahvif = arvif->ahvif;
4225 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
4226 	struct ieee80211_vif_cfg *vif_cfg = &vif->cfg;
4227 	struct cfg80211_chan_def def;
4228 	u32 param_id, param_value;
4229 	enum nl80211_band band;
4230 	u32 vdev_param;
4231 	int mcast_rate;
4232 	u32 preamble;
4233 	u16 hw_value;
4234 	u16 bitrate;
4235 	int ret;
4236 	u8 rateidx;
4237 	u32 rate;
4238 
4239 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4240 
4241 	if (changed & BSS_CHANGED_BEACON_INT) {
4242 		arvif->beacon_interval = info->beacon_int;
4243 
4244 		param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
4245 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4246 						    param_id,
4247 						    arvif->beacon_interval);
4248 		if (ret)
4249 			ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
4250 				    arvif->vdev_id);
4251 		else
4252 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4253 				   "Beacon interval: %d set for VDEV: %d\n",
4254 				   arvif->beacon_interval, arvif->vdev_id);
4255 	}
4256 
4257 	if (changed & BSS_CHANGED_BEACON) {
4258 		param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
4259 		param_value = WMI_BEACON_BURST_MODE;
4260 		ret = ath12k_wmi_pdev_set_param(ar, param_id,
4261 						param_value, ar->pdev->pdev_id);
4262 		if (ret)
4263 			ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
4264 				    arvif->vdev_id);
4265 		else
4266 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4267 				   "Set burst beacon mode for VDEV: %d\n",
4268 				   arvif->vdev_id);
4269 
4270 		ret = ath12k_mac_setup_bcn_tmpl(arvif);
4271 		if (ret)
4272 			ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
4273 				    ret);
4274 	}
4275 
4276 	if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
4277 		arvif->dtim_period = info->dtim_period;
4278 
4279 		param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
4280 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4281 						    param_id,
4282 						    arvif->dtim_period);
4283 
4284 		if (ret)
4285 			ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
4286 				    arvif->vdev_id, ret);
4287 		else
4288 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4289 				   "DTIM period: %d set for VDEV: %d\n",
4290 				   arvif->dtim_period, arvif->vdev_id);
4291 	}
4292 
4293 	if (changed & BSS_CHANGED_SSID &&
4294 	    vif->type == NL80211_IFTYPE_AP) {
4295 		ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4296 		if (vif->cfg.ssid_len)
4297 			memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4298 		ahvif->u.ap.hidden_ssid = info->hidden_ssid;
4299 	}
4300 
4301 	if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4302 		ether_addr_copy(arvif->bssid, info->bssid);
4303 
4304 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
4305 		if (info->enable_beacon) {
4306 			ret = ath12k_mac_set_he_txbf_conf(arvif);
4307 			if (ret)
4308 				ath12k_warn(ar->ab,
4309 					    "failed to set HE TXBF config for vdev: %d\n",
4310 					    arvif->vdev_id);
4311 
4312 			ret = ath12k_mac_set_eht_txbf_conf(arvif);
4313 			if (ret)
4314 				ath12k_warn(ar->ab,
4315 					    "failed to set EHT TXBF config for vdev: %d\n",
4316 					    arvif->vdev_id);
4317 		}
4318 		ath12k_control_beaconing(arvif, info);
4319 
4320 		if (arvif->is_up && info->he_support &&
4321 		    info->he_oper.params) {
4322 			/* TODO: Extend to support 1024 BA Bitmap size */
4323 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4324 							    WMI_VDEV_PARAM_BA_MODE,
4325 							    WMI_BA_MODE_BUFFER_SIZE_256);
4326 			if (ret)
4327 				ath12k_warn(ar->ab,
4328 					    "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
4329 					    arvif->vdev_id);
4330 
4331 			param_id = WMI_VDEV_PARAM_HEOPS_0_31;
4332 			param_value = info->he_oper.params;
4333 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4334 							    param_id, param_value);
4335 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4336 				   "he oper param: %x set for VDEV: %d\n",
4337 				   param_value, arvif->vdev_id);
4338 
4339 			if (ret)
4340 				ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
4341 					    param_value, arvif->vdev_id, ret);
4342 		}
4343 	}
4344 
4345 	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4346 		u32 cts_prot;
4347 
4348 		cts_prot = !!(info->use_cts_prot);
4349 		param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
4350 
4351 		if (arvif->is_started) {
4352 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4353 							    param_id, cts_prot);
4354 			if (ret)
4355 				ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
4356 					    arvif->vdev_id);
4357 			else
4358 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
4359 					   cts_prot, arvif->vdev_id);
4360 		} else {
4361 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
4362 		}
4363 	}
4364 
4365 	if (changed & BSS_CHANGED_ERP_SLOT) {
4366 		u32 slottime;
4367 
4368 		if (info->use_short_slot)
4369 			slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4370 
4371 		else
4372 			slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4373 
4374 		param_id = WMI_VDEV_PARAM_SLOT_TIME;
4375 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4376 						    param_id, slottime);
4377 		if (ret)
4378 			ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
4379 				    arvif->vdev_id);
4380 		else
4381 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4382 				   "Set slottime: %d for VDEV: %d\n",
4383 				   slottime, arvif->vdev_id);
4384 	}
4385 
4386 	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4387 		u32 preamble;
4388 
4389 		if (info->use_short_preamble)
4390 			preamble = WMI_VDEV_PREAMBLE_SHORT;
4391 		else
4392 			preamble = WMI_VDEV_PREAMBLE_LONG;
4393 
4394 		param_id = WMI_VDEV_PARAM_PREAMBLE;
4395 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4396 						    param_id, preamble);
4397 		if (ret)
4398 			ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
4399 				    arvif->vdev_id);
4400 		else
4401 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4402 				   "Set preamble: %d for VDEV: %d\n",
4403 				   preamble, arvif->vdev_id);
4404 	}
4405 
4406 	if (changed & BSS_CHANGED_ASSOC) {
4407 		if (vif->cfg.assoc)
4408 			ath12k_bss_assoc(ar, arvif, info);
4409 		else
4410 			ath12k_bss_disassoc(ar, arvif);
4411 	}
4412 
4413 	if (changed & BSS_CHANGED_TXPOWER) {
4414 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4415 			   arvif->vdev_id, info->txpower);
4416 
4417 		arvif->txpower = info->txpower;
4418 		ath12k_mac_txpower_recalc(ar);
4419 	}
4420 
4421 	if (changed & BSS_CHANGED_MCAST_RATE &&
4422 	    !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
4423 		band = def.chan->band;
4424 		mcast_rate = info->mcast_rate[band];
4425 
4426 		if (mcast_rate > 0) {
4427 			rateidx = mcast_rate - 1;
4428 		} else {
4429 			if (info->basic_rates)
4430 				rateidx = __ffs(info->basic_rates);
4431 			else
4432 				rateidx = 0;
4433 		}
4434 
4435 		if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP)
4436 			rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
4437 
4438 		bitrate = ath12k_legacy_rates[rateidx].bitrate;
4439 		hw_value = ath12k_legacy_rates[rateidx].hw_value;
4440 
4441 		if (ath12k_mac_bitrate_is_cck(bitrate))
4442 			preamble = WMI_RATE_PREAMBLE_CCK;
4443 		else
4444 			preamble = WMI_RATE_PREAMBLE_OFDM;
4445 
4446 		rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
4447 
4448 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4449 			   "mac vdev %d mcast_rate %x\n",
4450 			   arvif->vdev_id, rate);
4451 
4452 		vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
4453 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4454 						    vdev_param, rate);
4455 		if (ret)
4456 			ath12k_warn(ar->ab,
4457 				    "failed to set mcast rate on vdev %i: %d\n",
4458 				    arvif->vdev_id,  ret);
4459 
4460 		vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
4461 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4462 						    vdev_param, rate);
4463 		if (ret)
4464 			ath12k_warn(ar->ab,
4465 				    "failed to set bcast rate on vdev %i: %d\n",
4466 				    arvif->vdev_id,  ret);
4467 	}
4468 
4469 	if (changed & BSS_CHANGED_BASIC_RATES &&
4470 	    !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))
4471 		ath12k_recalculate_mgmt_rate(ar, arvif, &def);
4472 
4473 	if (changed & BSS_CHANGED_TWT) {
4474 		if (info->twt_requester || info->twt_responder)
4475 			ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
4476 		else
4477 			ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
4478 	}
4479 
4480 	if (changed & BSS_CHANGED_HE_OBSS_PD)
4481 		ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
4482 					     &info->he_obss_pd);
4483 
4484 	if (changed & BSS_CHANGED_HE_BSS_COLOR) {
4485 		if (vif->type == NL80211_IFTYPE_AP) {
4486 			ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4487 							    arvif->vdev_id,
4488 							    info->he_bss_color.color,
4489 							    ATH12K_BSS_COLOR_AP_PERIODS,
4490 							    info->he_bss_color.enabled);
4491 			if (ret)
4492 				ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4493 					    arvif->vdev_id,  ret);
4494 		} else if (vif->type == NL80211_IFTYPE_STATION) {
4495 			ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
4496 									  arvif->vdev_id,
4497 									  1);
4498 			if (ret)
4499 				ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
4500 					    arvif->vdev_id,  ret);
4501 			ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4502 							    arvif->vdev_id,
4503 							    0,
4504 							    ATH12K_BSS_COLOR_STA_PERIODS,
4505 							    1);
4506 			if (ret)
4507 				ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4508 					    arvif->vdev_id,  ret);
4509 		}
4510 	}
4511 
4512 	ath12k_mac_fils_discovery(arvif, info);
4513 
4514 	if (changed & BSS_CHANGED_PS &&
4515 	    ar->ab->hw_params->supports_sta_ps) {
4516 		ahvif->ps = vif_cfg->ps;
4517 		ath12k_mac_vif_setup_ps(arvif);
4518 	}
4519 }
4520 
ath12k_ahvif_get_link_cache(struct ath12k_vif * ahvif,u8 link_id)4521 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif,
4522 							    u8 link_id)
4523 {
4524 	if (!ahvif->cache[link_id]) {
4525 		ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL);
4526 		if (ahvif->cache[link_id])
4527 			INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list);
4528 	}
4529 
4530 	return ahvif->cache[link_id];
4531 }
4532 
ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache * cache)4533 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache)
4534 {
4535 	struct ath12k_key_conf *key_conf, *tmp;
4536 
4537 	if (!cache || list_empty(&cache->key_conf.list))
4538 		return;
4539 	list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
4540 		list_del(&key_conf->list);
4541 		kfree(key_conf);
4542 	}
4543 }
4544 
ath12k_ahvif_put_link_cache(struct ath12k_vif * ahvif,u8 link_id)4545 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id)
4546 {
4547 	if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
4548 		return;
4549 
4550 	ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]);
4551 	kfree(ahvif->cache[link_id]);
4552 	ahvif->cache[link_id] = NULL;
4553 }
4554 
ath12k_mac_op_link_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u64 changed)4555 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
4556 					    struct ieee80211_vif *vif,
4557 					    struct ieee80211_bss_conf *info,
4558 					    u64 changed)
4559 {
4560 	struct ath12k *ar;
4561 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4562 	struct ath12k_vif_cache *cache;
4563 	struct ath12k_link_vif *arvif;
4564 	u8 link_id = info->link_id;
4565 
4566 	lockdep_assert_wiphy(hw->wiphy);
4567 
4568 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4569 
4570 	/* if the vdev is not created on a certain radio,
4571 	 * cache the info to be updated later on vdev creation
4572 	 */
4573 
4574 	if (!arvif || !arvif->is_created) {
4575 		cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
4576 		if (!cache)
4577 			return;
4578 
4579 		cache->bss_conf_changed |= changed;
4580 
4581 		return;
4582 	}
4583 
4584 	ar = arvif->ar;
4585 
4586 	ath12k_mac_bss_info_changed(ar, arvif, info, changed);
4587 }
4588 
4589 static struct ath12k*
ath12k_mac_select_scan_device(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 center_freq)4590 ath12k_mac_select_scan_device(struct ieee80211_hw *hw,
4591 			      struct ieee80211_vif *vif,
4592 			      u32 center_freq)
4593 {
4594 	struct ath12k_hw *ah = hw->priv;
4595 	enum nl80211_band band;
4596 	struct ath12k *ar;
4597 	int i;
4598 
4599 	if (ah->num_radio == 1)
4600 		return ah->radio;
4601 
4602 	/* Currently mac80211 supports splitting scan requests into
4603 	 * multiple scan requests per band.
4604 	 * Loop through first channel and determine the scan radio
4605 	 * TODO: There could be 5 GHz low/high channels in that case
4606 	 * split the hw request and perform multiple scans
4607 	 */
4608 
4609 	if (center_freq < ATH12K_MIN_5GHZ_FREQ)
4610 		band = NL80211_BAND_2GHZ;
4611 	else if (center_freq < ATH12K_MIN_6GHZ_FREQ)
4612 		band = NL80211_BAND_5GHZ;
4613 	else
4614 		band = NL80211_BAND_6GHZ;
4615 
4616 	for_each_ar(ah, ar, i) {
4617 		if (ar->mac.sbands[band].channels &&
4618 		    center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
4619 		    center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
4620 			return ar;
4621 	}
4622 
4623 	return NULL;
4624 }
4625 
__ath12k_mac_scan_finish(struct ath12k * ar)4626 void __ath12k_mac_scan_finish(struct ath12k *ar)
4627 {
4628 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4629 
4630 	lockdep_assert_held(&ar->data_lock);
4631 
4632 	switch (ar->scan.state) {
4633 	case ATH12K_SCAN_IDLE:
4634 		break;
4635 	case ATH12K_SCAN_RUNNING:
4636 	case ATH12K_SCAN_ABORTING:
4637 		if (ar->scan.is_roc && ar->scan.roc_notify)
4638 			ieee80211_remain_on_channel_expired(hw);
4639 		fallthrough;
4640 	case ATH12K_SCAN_STARTING:
4641 		cancel_delayed_work(&ar->scan.timeout);
4642 		complete_all(&ar->scan.completed);
4643 		wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
4644 		break;
4645 	}
4646 }
4647 
ath12k_mac_scan_finish(struct ath12k * ar)4648 void ath12k_mac_scan_finish(struct ath12k *ar)
4649 {
4650 	spin_lock_bh(&ar->data_lock);
4651 	__ath12k_mac_scan_finish(ar);
4652 	spin_unlock_bh(&ar->data_lock);
4653 }
4654 
ath12k_scan_stop(struct ath12k * ar)4655 static int ath12k_scan_stop(struct ath12k *ar)
4656 {
4657 	struct ath12k_wmi_scan_cancel_arg arg = {
4658 		.req_type = WLAN_SCAN_CANCEL_SINGLE,
4659 		.scan_id = ATH12K_SCAN_ID,
4660 	};
4661 	int ret;
4662 
4663 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4664 
4665 	/* TODO: Fill other STOP Params */
4666 	arg.pdev_id = ar->pdev->pdev_id;
4667 
4668 	ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
4669 	if (ret) {
4670 		ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
4671 		goto out;
4672 	}
4673 
4674 	ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4675 	if (ret == 0) {
4676 		ath12k_warn(ar->ab,
4677 			    "failed to receive scan abort comple: timed out\n");
4678 		ret = -ETIMEDOUT;
4679 	} else if (ret > 0) {
4680 		ret = 0;
4681 	}
4682 
4683 out:
4684 	/* Scan state should be updated in scan completion worker but in
4685 	 * case firmware fails to deliver the event (for whatever reason)
4686 	 * it is desired to clean up scan state anyway. Firmware may have
4687 	 * just dropped the scan completion event delivery due to transport
4688 	 * pipe being overflown with data and/or it can recover on its own
4689 	 * before next scan request is submitted.
4690 	 */
4691 	spin_lock_bh(&ar->data_lock);
4692 	if (ret)
4693 		__ath12k_mac_scan_finish(ar);
4694 	spin_unlock_bh(&ar->data_lock);
4695 
4696 	return ret;
4697 }
4698 
ath12k_scan_abort(struct ath12k * ar)4699 static void ath12k_scan_abort(struct ath12k *ar)
4700 {
4701 	int ret;
4702 
4703 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4704 
4705 	spin_lock_bh(&ar->data_lock);
4706 
4707 	switch (ar->scan.state) {
4708 	case ATH12K_SCAN_IDLE:
4709 		/* This can happen if timeout worker kicked in and called
4710 		 * abortion while scan completion was being processed.
4711 		 */
4712 		break;
4713 	case ATH12K_SCAN_STARTING:
4714 	case ATH12K_SCAN_ABORTING:
4715 		ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
4716 			    ar->scan.state);
4717 		break;
4718 	case ATH12K_SCAN_RUNNING:
4719 		ar->scan.state = ATH12K_SCAN_ABORTING;
4720 		spin_unlock_bh(&ar->data_lock);
4721 
4722 		ret = ath12k_scan_stop(ar);
4723 		if (ret)
4724 			ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
4725 
4726 		spin_lock_bh(&ar->data_lock);
4727 		break;
4728 	}
4729 
4730 	spin_unlock_bh(&ar->data_lock);
4731 }
4732 
ath12k_scan_timeout_work(struct work_struct * work)4733 static void ath12k_scan_timeout_work(struct work_struct *work)
4734 {
4735 	struct ath12k *ar = container_of(work, struct ath12k,
4736 					 scan.timeout.work);
4737 
4738 	wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
4739 	ath12k_scan_abort(ar);
4740 	wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
4741 }
4742 
ath12k_mac_scan_send_complete(struct ath12k * ar,struct cfg80211_scan_info * info)4743 static void ath12k_mac_scan_send_complete(struct ath12k *ar,
4744 					  struct cfg80211_scan_info *info)
4745 {
4746 	struct ath12k_hw *ah = ar->ah;
4747 	struct ath12k *partner_ar;
4748 	int i;
4749 
4750 	lockdep_assert_wiphy(ah->hw->wiphy);
4751 
4752 	for_each_ar(ah, partner_ar, i)
4753 		if (partner_ar != ar &&
4754 		    partner_ar->scan.state == ATH12K_SCAN_RUNNING)
4755 			return;
4756 
4757 	ieee80211_scan_completed(ah->hw, info);
4758 }
4759 
ath12k_scan_vdev_clean_work(struct wiphy * wiphy,struct wiphy_work * work)4760 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work)
4761 {
4762 	struct ath12k *ar = container_of(work, struct ath12k,
4763 					 scan.vdev_clean_wk);
4764 	struct ath12k_hw *ah = ar->ah;
4765 	struct ath12k_link_vif *arvif;
4766 
4767 	lockdep_assert_wiphy(wiphy);
4768 
4769 	arvif = ar->scan.arvif;
4770 
4771 	/* The scan vdev has already been deleted. This can occur when a
4772 	 * new scan request is made on the same vif with a different
4773 	 * frequency, causing the scan arvif to move from one radio to
4774 	 * another. Or, scan was abrupted and via remove interface, the
4775 	 * arvif is already deleted. Alternatively, if the scan vdev is not
4776 	 * being used as an actual vdev, then do not delete it.
4777 	 */
4778 	if (!arvif || arvif->is_started)
4779 		goto work_complete;
4780 
4781 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)",
4782 		   arvif->link_id);
4783 
4784 	ath12k_mac_remove_link_interface(ah->hw, arvif);
4785 	ath12k_mac_unassign_link_vif(arvif);
4786 
4787 work_complete:
4788 	spin_lock_bh(&ar->data_lock);
4789 	ar->scan.arvif = NULL;
4790 	if (!ar->scan.is_roc) {
4791 		struct cfg80211_scan_info info = {
4792 			.aborted = ((ar->scan.state ==
4793 				    ATH12K_SCAN_ABORTING) ||
4794 				    (ar->scan.state ==
4795 				    ATH12K_SCAN_STARTING)),
4796 		};
4797 
4798 		ath12k_mac_scan_send_complete(ar, &info);
4799 	}
4800 
4801 	ar->scan.state = ATH12K_SCAN_IDLE;
4802 	ar->scan_channel = NULL;
4803 	ar->scan.roc_freq = 0;
4804 	spin_unlock_bh(&ar->data_lock);
4805 }
4806 
ath12k_start_scan(struct ath12k * ar,struct ath12k_wmi_scan_req_arg * arg)4807 static int ath12k_start_scan(struct ath12k *ar,
4808 			     struct ath12k_wmi_scan_req_arg *arg)
4809 {
4810 	int ret;
4811 
4812 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4813 
4814 	ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
4815 	if (ret)
4816 		return ret;
4817 
4818 	ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4819 	if (ret == 0) {
4820 		ret = ath12k_scan_stop(ar);
4821 		if (ret)
4822 			ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
4823 
4824 		return -ETIMEDOUT;
4825 	}
4826 
4827 	/* If we failed to start the scan, return error code at
4828 	 * this point.  This is probably due to some issue in the
4829 	 * firmware, but no need to wedge the driver due to that...
4830 	 */
4831 	spin_lock_bh(&ar->data_lock);
4832 	if (ar->scan.state == ATH12K_SCAN_IDLE) {
4833 		spin_unlock_bh(&ar->data_lock);
4834 		return -EINVAL;
4835 	}
4836 	spin_unlock_bh(&ar->data_lock);
4837 
4838 	return 0;
4839 }
4840 
ath12k_mac_get_fw_stats(struct ath12k * ar,struct ath12k_fw_stats_req_params * param)4841 int ath12k_mac_get_fw_stats(struct ath12k *ar,
4842 			    struct ath12k_fw_stats_req_params *param)
4843 {
4844 	struct ath12k_base *ab = ar->ab;
4845 	struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
4846 	unsigned long time_left;
4847 	int ret;
4848 
4849 	guard(mutex)(&ah->hw_mutex);
4850 
4851 	if (ah->state != ATH12K_HW_STATE_ON)
4852 		return -ENETDOWN;
4853 
4854 	ath12k_fw_stats_reset(ar);
4855 
4856 	reinit_completion(&ar->fw_stats_complete);
4857 	reinit_completion(&ar->fw_stats_done);
4858 
4859 	ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id,
4860 						param->vdev_id, param->pdev_id);
4861 	if (ret) {
4862 		ath12k_warn(ab, "failed to request fw stats: %d\n", ret);
4863 		return ret;
4864 	}
4865 
4866 	ath12k_dbg(ab, ATH12K_DBG_WMI,
4867 		   "get fw stat pdev id %d vdev id %d stats id 0x%x\n",
4868 		   param->pdev_id, param->vdev_id, param->stats_id);
4869 
4870 	time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
4871 	if (!time_left) {
4872 		ath12k_warn(ab, "time out while waiting for get fw stats\n");
4873 		return -ETIMEDOUT;
4874 	}
4875 
4876 	/* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back
4877 	 * when stats data buffer limit is reached. fw_stats_complete
4878 	 * is completed once host receives first event from firmware, but
4879 	 * still there could be more events following. Below is to wait
4880 	 * until firmware completes sending all the events.
4881 	 */
4882 	time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
4883 	if (!time_left) {
4884 		ath12k_warn(ab, "time out while waiting for fw stats done\n");
4885 		return -ETIMEDOUT;
4886 	}
4887 
4888 	return 0;
4889 }
4890 
ath12k_mac_op_get_txpower(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,int * dbm)4891 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw,
4892 				     struct ieee80211_vif *vif,
4893 				     unsigned int link_id,
4894 				     int *dbm)
4895 {
4896 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4897 	struct ath12k_fw_stats_req_params params = {};
4898 	struct ath12k_fw_stats_pdev *pdev;
4899 	struct ath12k_hw *ah = hw->priv;
4900 	struct ath12k_link_vif *arvif;
4901 	struct ath12k_base *ab;
4902 	struct ath12k *ar;
4903 	int ret;
4904 
4905 	/* Final Tx power is minimum of Target Power, CTL power, Regulatory
4906 	 * Power, PSD EIRP Power. We just know the Regulatory power from the
4907 	 * regulatory rules obtained. FW knows all these power and sets the min
4908 	 * of these. Hence, we request the FW pdev stats in which FW reports
4909 	 * the minimum of all vdev's channel Tx power.
4910 	 */
4911 	lockdep_assert_wiphy(hw->wiphy);
4912 
4913 	arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4914 	if (!arvif || !arvif->ar)
4915 		return -EINVAL;
4916 
4917 	ar = arvif->ar;
4918 	ab = ar->ab;
4919 	if (ah->state != ATH12K_HW_STATE_ON)
4920 		goto err_fallback;
4921 
4922 	if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags))
4923 		return -EAGAIN;
4924 
4925 	/* Limit the requests to Firmware for fetching the tx power */
4926 	if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID &&
4927 	    time_before(jiffies,
4928 			msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) +
4929 					 ar->last_tx_power_update))
4930 		goto send_tx_power;
4931 
4932 	params.pdev_id = ar->pdev->pdev_id;
4933 	params.vdev_id = arvif->vdev_id;
4934 	params.stats_id = WMI_REQUEST_PDEV_STAT;
4935 	ret = ath12k_mac_get_fw_stats(ar, &params);
4936 	if (ret) {
4937 		ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
4938 		goto err_fallback;
4939 	}
4940 
4941 	spin_lock_bh(&ar->data_lock);
4942 	pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
4943 					struct ath12k_fw_stats_pdev, list);
4944 	if (!pdev) {
4945 		spin_unlock_bh(&ar->data_lock);
4946 		goto err_fallback;
4947 	}
4948 
4949 	/* tx power reported by firmware is in units of 0.5 dBm */
4950 	ar->chan_tx_pwr = pdev->chan_tx_power / 2;
4951 	spin_unlock_bh(&ar->data_lock);
4952 	ar->last_tx_power_update = jiffies;
4953 
4954 send_tx_power:
4955 	*dbm = ar->chan_tx_pwr;
4956 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n",
4957 		   *dbm);
4958 	return 0;
4959 
4960 err_fallback:
4961 	/* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
4962 	*dbm = vif->bss_conf.txpower;
4963 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
4964 		   *dbm);
4965 	return 0;
4966 }
4967 
4968 static u8
ath12k_mac_find_link_id_by_ar(struct ath12k_vif * ahvif,struct ath12k * ar)4969 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar)
4970 {
4971 	struct ath12k_link_vif *arvif;
4972 	struct ath12k_hw *ah = ahvif->ah;
4973 	unsigned long links = ahvif->links_map;
4974 	unsigned long scan_links_map;
4975 	u8 link_id;
4976 
4977 	lockdep_assert_wiphy(ah->hw->wiphy);
4978 
4979 	for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) {
4980 		arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4981 
4982 		if (!arvif || !arvif->is_created)
4983 			continue;
4984 
4985 		if (ar == arvif->ar)
4986 			return link_id;
4987 	}
4988 
4989 	/* input ar is not assigned to any of the links of ML VIF, use next
4990 	 * available scan link for scan vdev creation. There are cases where
4991 	 * single scan req needs to be split in driver and initiate separate
4992 	 * scan requests to firmware based on device.
4993 	 */
4994 
4995 	 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will
4996 	  * choose an available link among scan links (i.e link id >= 15)
4997 	  */
4998 	scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
4999 	if (scan_links_map)
5000 		return __ffs(scan_links_map);
5001 
5002 	return ATH12K_FIRST_SCAN_LINK;
5003 }
5004 
ath12k_mac_initiate_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req,int n_channels,struct ieee80211_channel ** chan_list,struct ath12k * ar)5005 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw,
5006 				       struct ieee80211_vif *vif,
5007 				       struct ieee80211_scan_request *hw_req,
5008 				       int n_channels,
5009 				       struct ieee80211_channel **chan_list,
5010 				       struct ath12k *ar)
5011 {
5012 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5013 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5014 	struct ath12k_link_vif *arvif;
5015 	struct cfg80211_scan_request *req = &hw_req->req;
5016 	struct ath12k_wmi_scan_req_arg *arg = NULL;
5017 	u8 link_id;
5018 	int ret;
5019 	int i;
5020 	bool create = true;
5021 
5022 	lockdep_assert_wiphy(hw->wiphy);
5023 
5024 	arvif = &ahvif->deflink;
5025 
5026 	/* check if any of the links of ML VIF is already started on
5027 	 * radio(ar) corresponding to given scan frequency and use it,
5028 	 * if not use scan link (link id >= 15) for scan purpose.
5029 	 */
5030 	link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
5031 	/* All scan links are occupied. ideally this shouldn't happen as
5032 	 * mac80211 won't schedule scan for same band until ongoing scan is
5033 	 * completed, don't try to exceed max links just in case if it happens.
5034 	 */
5035 	if (link_id >= ATH12K_NUM_MAX_LINKS)
5036 		return -EBUSY;
5037 
5038 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5039 
5040 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan",
5041 		   arvif->link_id);
5042 
5043 	/* If the vif is already assigned to a specific vdev of an ar,
5044 	 * check whether its already started, vdev which is started
5045 	 * are not allowed to switch to a new radio.
5046 	 * If the vdev is not started, but was earlier created on a
5047 	 * different ar, delete that vdev and create a new one. We don't
5048 	 * delete at the scan stop as an optimization to avoid redundant
5049 	 * delete-create vdev's for the same ar, in case the request is
5050 	 * always on the same band for the vif
5051 	 */
5052 	if (arvif->is_created) {
5053 		if (WARN_ON(!arvif->ar))
5054 			return -EINVAL;
5055 
5056 		if (ar != arvif->ar && arvif->is_started)
5057 			return -EINVAL;
5058 
5059 		if (ar != arvif->ar) {
5060 			ath12k_mac_remove_link_interface(hw, arvif);
5061 			ath12k_mac_unassign_link_vif(arvif);
5062 		} else {
5063 			create = false;
5064 		}
5065 	}
5066 
5067 	if (create) {
5068 		/* Previous arvif would've been cleared in radio switch block
5069 		 * above, assign arvif again for create.
5070 		 */
5071 		arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5072 
5073 		ret = ath12k_mac_vdev_create(ar, arvif);
5074 		if (ret) {
5075 			ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
5076 			return -EINVAL;
5077 		}
5078 	}
5079 
5080 	spin_lock_bh(&ar->data_lock);
5081 	switch (ar->scan.state) {
5082 	case ATH12K_SCAN_IDLE:
5083 		reinit_completion(&ar->scan.started);
5084 		reinit_completion(&ar->scan.completed);
5085 		ar->scan.state = ATH12K_SCAN_STARTING;
5086 		ar->scan.is_roc = false;
5087 		ar->scan.arvif = arvif;
5088 		ret = 0;
5089 		break;
5090 	case ATH12K_SCAN_STARTING:
5091 	case ATH12K_SCAN_RUNNING:
5092 	case ATH12K_SCAN_ABORTING:
5093 		ret = -EBUSY;
5094 		break;
5095 	}
5096 	spin_unlock_bh(&ar->data_lock);
5097 
5098 	if (ret)
5099 		goto exit;
5100 
5101 	arg = kzalloc(sizeof(*arg), GFP_KERNEL);
5102 	if (!arg) {
5103 		ret = -ENOMEM;
5104 		goto exit;
5105 	}
5106 
5107 	ath12k_wmi_start_scan_init(ar, arg);
5108 	arg->vdev_id = arvif->vdev_id;
5109 	arg->scan_id = ATH12K_SCAN_ID;
5110 
5111 	if (req->ie_len) {
5112 		arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
5113 		if (!arg->extraie.ptr) {
5114 			ret = -ENOMEM;
5115 			goto exit;
5116 		}
5117 		arg->extraie.len = req->ie_len;
5118 	}
5119 
5120 	if (req->n_ssids) {
5121 		arg->num_ssids = req->n_ssids;
5122 		for (i = 0; i < arg->num_ssids; i++)
5123 			arg->ssid[i] = req->ssids[i];
5124 	} else {
5125 		arg->scan_f_passive = 1;
5126 	}
5127 
5128 	if (n_channels) {
5129 		arg->num_chan = n_channels;
5130 		arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
5131 					 GFP_KERNEL);
5132 		if (!arg->chan_list) {
5133 			ret = -ENOMEM;
5134 			goto exit;
5135 		}
5136 
5137 		for (i = 0; i < arg->num_chan; i++)
5138 			arg->chan_list[i] = chan_list[i]->center_freq;
5139 	}
5140 
5141 	ret = ath12k_start_scan(ar, arg);
5142 	if (ret) {
5143 		if (ret == -EBUSY)
5144 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5145 				   "scan engine is busy 11d state %d\n", ar->state_11d);
5146 		else
5147 			ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
5148 
5149 		spin_lock_bh(&ar->data_lock);
5150 		ar->scan.state = ATH12K_SCAN_IDLE;
5151 		spin_unlock_bh(&ar->data_lock);
5152 		goto exit;
5153 	}
5154 
5155 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started");
5156 
5157 	/* Add a margin to account for event/command processing */
5158 	ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
5159 				     msecs_to_jiffies(arg->max_scan_time +
5160 						      ATH12K_MAC_SCAN_TIMEOUT_MSECS));
5161 
5162 exit:
5163 	if (arg) {
5164 		kfree(arg->chan_list);
5165 		kfree(arg->extraie.ptr);
5166 		kfree(arg);
5167 	}
5168 
5169 	if (ar->state_11d == ATH12K_11D_PREPARING &&
5170 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5171 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
5172 		ath12k_mac_11d_scan_start(ar, arvif->vdev_id);
5173 
5174 	return ret;
5175 }
5176 
ath12k_mac_op_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req)5177 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
5178 				 struct ieee80211_vif *vif,
5179 				 struct ieee80211_scan_request *hw_req)
5180 {
5181 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5182 	struct ieee80211_channel **chan_list, *chan;
5183 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5184 	unsigned long links_map, link_id;
5185 	struct ath12k_link_vif *arvif;
5186 	struct ath12k *ar, *scan_ar;
5187 	int i, j, ret = 0;
5188 
5189 	lockdep_assert_wiphy(hw->wiphy);
5190 
5191 	chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL);
5192 	if (!chan_list)
5193 		return -ENOMEM;
5194 
5195 	/* There could be channels that belong to multiple underlying radio
5196 	 * in same scan request as mac80211 sees it as single band. In that
5197 	 * case split the hw_req based on frequency range and schedule scans to
5198 	 * corresponding radio.
5199 	 */
5200 	for_each_ar(ah, ar, i) {
5201 		int n_chans = 0;
5202 
5203 		for (j = 0; j < hw_req->req.n_channels; j++) {
5204 			chan = hw_req->req.channels[j];
5205 			scan_ar = ath12k_mac_select_scan_device(hw, vif,
5206 								chan->center_freq);
5207 			if (!scan_ar) {
5208 				ath12k_hw_warn(ah, "unable to select scan device for freq %d\n",
5209 					       chan->center_freq);
5210 				ret = -EINVAL;
5211 				goto abort;
5212 			}
5213 			if (ar != scan_ar)
5214 				continue;
5215 
5216 			chan_list[n_chans++] = chan;
5217 		}
5218 		if (n_chans) {
5219 			ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans,
5220 							  chan_list, ar);
5221 			if (ret)
5222 				goto abort;
5223 		}
5224 	}
5225 abort:
5226 	/* If any of the parallel scans initiated fails, abort all and
5227 	 * remove the scan interfaces created. Return complete scan
5228 	 * failure as mac80211 assumes this as single scan request.
5229 	 */
5230 	if (ret) {
5231 		ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret);
5232 		links_map = ahvif->links_map;
5233 		for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5234 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5235 			if (!arvif)
5236 				continue;
5237 
5238 			ar = arvif->ar;
5239 			if (ar->scan.arvif == arvif) {
5240 				wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
5241 				spin_lock_bh(&ar->data_lock);
5242 				ar->scan.arvif = NULL;
5243 				ar->scan.state = ATH12K_SCAN_IDLE;
5244 				ar->scan_channel = NULL;
5245 				ar->scan.roc_freq = 0;
5246 				spin_unlock_bh(&ar->data_lock);
5247 			}
5248 			if (link_id >= ATH12K_FIRST_SCAN_LINK) {
5249 				ath12k_mac_remove_link_interface(hw, arvif);
5250 				ath12k_mac_unassign_link_vif(arvif);
5251 			}
5252 		}
5253 	}
5254 	kfree(chan_list);
5255 	return ret;
5256 }
5257 
ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5258 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
5259 					 struct ieee80211_vif *vif)
5260 {
5261 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5262 	unsigned long link_id, links_map = ahvif->links_map;
5263 	struct ath12k_link_vif *arvif;
5264 	struct ath12k *ar;
5265 
5266 	lockdep_assert_wiphy(hw->wiphy);
5267 
5268 	for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5269 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5270 		if (!arvif || arvif->is_started)
5271 			continue;
5272 
5273 		ar = arvif->ar;
5274 
5275 		ath12k_scan_abort(ar);
5276 
5277 		cancel_delayed_work_sync(&ar->scan.timeout);
5278 	}
5279 }
5280 
ath12k_install_key(struct ath12k_link_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)5281 static int ath12k_install_key(struct ath12k_link_vif *arvif,
5282 			      struct ieee80211_key_conf *key,
5283 			      enum set_key_cmd cmd,
5284 			      const u8 *macaddr, u32 flags)
5285 {
5286 	int ret;
5287 	struct ath12k *ar = arvif->ar;
5288 	struct wmi_vdev_install_key_arg arg = {
5289 		.vdev_id = arvif->vdev_id,
5290 		.key_idx = key->keyidx,
5291 		.key_len = key->keylen,
5292 		.key_data = key->key,
5293 		.key_flags = flags,
5294 		.ieee80211_key_cipher = key->cipher,
5295 		.macaddr = macaddr,
5296 	};
5297 	struct ath12k_vif *ahvif = arvif->ahvif;
5298 
5299 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5300 
5301 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
5302 		return 0;
5303 
5304 	if (cmd == DISABLE_KEY) {
5305 		/* TODO: Check if FW expects  value other than NONE for del */
5306 		/* arg.key_cipher = WMI_CIPHER_NONE; */
5307 		arg.key_len = 0;
5308 		arg.key_data = NULL;
5309 		goto check_order;
5310 	}
5311 
5312 	switch (key->cipher) {
5313 	case WLAN_CIPHER_SUITE_CCMP:
5314 	case WLAN_CIPHER_SUITE_CCMP_256:
5315 		arg.key_cipher = WMI_CIPHER_AES_CCM;
5316 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5317 		break;
5318 	case WLAN_CIPHER_SUITE_TKIP:
5319 		arg.key_cipher = WMI_CIPHER_TKIP;
5320 		arg.key_txmic_len = 8;
5321 		arg.key_rxmic_len = 8;
5322 		break;
5323 	case WLAN_CIPHER_SUITE_GCMP:
5324 	case WLAN_CIPHER_SUITE_GCMP_256:
5325 		arg.key_cipher = WMI_CIPHER_AES_GCM;
5326 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5327 		break;
5328 	case WLAN_CIPHER_SUITE_AES_CMAC:
5329 		arg.key_cipher = WMI_CIPHER_AES_CMAC;
5330 		break;
5331 	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
5332 	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
5333 		arg.key_cipher = WMI_CIPHER_AES_GMAC;
5334 		break;
5335 	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
5336 		arg.key_cipher = WMI_CIPHER_AES_CMAC;
5337 		break;
5338 	default:
5339 		ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
5340 		return -EOPNOTSUPP;
5341 	}
5342 
5343 	if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
5344 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
5345 			      IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
5346 
5347 check_order:
5348 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5349 	    arg.key_flags == WMI_KEY_GROUP) {
5350 		if (cmd == SET_KEY) {
5351 			if (arvif->pairwise_key_done) {
5352 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5353 					   "vdev %u pairwise key done, go install group key\n",
5354 					   arg.vdev_id);
5355 				goto install;
5356 			} else {
5357 				/* WCN7850 firmware requires pairwise key to be installed
5358 				 * before group key. In case group key comes first, cache
5359 				 * it and return. Will revisit it once pairwise key gets
5360 				 * installed.
5361 				 */
5362 				arvif->group_key = arg;
5363 				arvif->group_key_valid = true;
5364 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5365 					   "vdev %u group key before pairwise key, cache and skip\n",
5366 					   arg.vdev_id);
5367 
5368 				ret = 0;
5369 				goto out;
5370 			}
5371 		} else {
5372 			arvif->group_key_valid = false;
5373 		}
5374 	}
5375 
5376 install:
5377 	reinit_completion(&ar->install_key_done);
5378 
5379 	ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
5380 	if (ret)
5381 		return ret;
5382 
5383 	if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
5384 		return -ETIMEDOUT;
5385 
5386 	if (ether_addr_equal(arg.macaddr, arvif->bssid))
5387 		ahvif->key_cipher = arg.ieee80211_key_cipher;
5388 
5389 	if (ar->install_key_status) {
5390 		ret = -EINVAL;
5391 		goto out;
5392 	}
5393 
5394 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5395 	    arg.key_flags == WMI_KEY_PAIRWISE) {
5396 		if (cmd == SET_KEY) {
5397 			arvif->pairwise_key_done = true;
5398 			if (arvif->group_key_valid) {
5399 				/* Install cached GTK */
5400 				arvif->group_key_valid = false;
5401 				arg = arvif->group_key;
5402 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5403 					   "vdev %u pairwise key done, group key ready, go install\n",
5404 					   arg.vdev_id);
5405 				goto install;
5406 			}
5407 		} else {
5408 			arvif->pairwise_key_done = false;
5409 		}
5410 	}
5411 
5412 out:
5413 	if (ret) {
5414 		/* In case of failure userspace may not do DISABLE_KEY
5415 		 * but triggers re-connection directly, so manually reset
5416 		 * status here.
5417 		 */
5418 		arvif->group_key_valid = false;
5419 		arvif->pairwise_key_done = false;
5420 	}
5421 
5422 	return ret;
5423 }
5424 
ath12k_clear_peer_keys(struct ath12k_link_vif * arvif,const u8 * addr)5425 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif,
5426 				  const u8 *addr)
5427 {
5428 	struct ath12k *ar = arvif->ar;
5429 	struct ath12k_base *ab = ar->ab;
5430 	struct ath12k_peer *peer;
5431 	int first_errno = 0;
5432 	int ret;
5433 	int i;
5434 	u32 flags = 0;
5435 
5436 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5437 
5438 	spin_lock_bh(&ab->base_lock);
5439 	peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
5440 	spin_unlock_bh(&ab->base_lock);
5441 
5442 	if (!peer)
5443 		return -ENOENT;
5444 
5445 	for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
5446 		if (!peer->keys[i])
5447 			continue;
5448 
5449 		/* key flags are not required to delete the key */
5450 		ret = ath12k_install_key(arvif, peer->keys[i],
5451 					 DISABLE_KEY, addr, flags);
5452 		if (ret < 0 && first_errno == 0)
5453 			first_errno = ret;
5454 
5455 		if (ret < 0)
5456 			ath12k_warn(ab, "failed to remove peer key %d: %d\n",
5457 				    i, ret);
5458 
5459 		spin_lock_bh(&ab->base_lock);
5460 		peer->keys[i] = NULL;
5461 		spin_unlock_bh(&ab->base_lock);
5462 	}
5463 
5464 	return first_errno;
5465 }
5466 
ath12k_mac_set_key(struct ath12k * ar,enum set_key_cmd cmd,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ieee80211_key_conf * key)5467 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
5468 			      struct ath12k_link_vif *arvif,
5469 			      struct ath12k_link_sta *arsta,
5470 			      struct ieee80211_key_conf *key)
5471 {
5472 	struct ieee80211_sta *sta = NULL;
5473 	struct ath12k_base *ab = ar->ab;
5474 	struct ath12k_peer *peer;
5475 	struct ath12k_sta *ahsta;
5476 	const u8 *peer_addr;
5477 	int ret;
5478 	u32 flags = 0;
5479 
5480 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5481 
5482 	if (arsta)
5483 		sta = ath12k_ahsta_to_sta(arsta->ahsta);
5484 
5485 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
5486 		return 1;
5487 
5488 	if (sta)
5489 		peer_addr = arsta->addr;
5490 	else
5491 		peer_addr = arvif->bssid;
5492 
5493 	key->hw_key_idx = key->keyidx;
5494 
5495 	/* the peer should not disappear in mid-way (unless FW goes awry) since
5496 	 * we already hold wiphy lock. we just make sure its there now.
5497 	 */
5498 	spin_lock_bh(&ab->base_lock);
5499 	peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5500 	spin_unlock_bh(&ab->base_lock);
5501 
5502 	if (!peer) {
5503 		if (cmd == SET_KEY) {
5504 			ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
5505 				    peer_addr);
5506 			return -EOPNOTSUPP;
5507 		}
5508 
5509 		/* if the peer doesn't exist there is no key to disable
5510 		 * anymore
5511 		 */
5512 		return 0;
5513 	}
5514 
5515 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5516 		flags = WMI_KEY_PAIRWISE;
5517 	else
5518 		flags = WMI_KEY_GROUP;
5519 
5520 	ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
5521 	if (ret) {
5522 		ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
5523 		return ret;
5524 	}
5525 
5526 	ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
5527 	if (ret) {
5528 		ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
5529 		return ret;
5530 	}
5531 
5532 	spin_lock_bh(&ab->base_lock);
5533 	peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5534 	if (peer && cmd == SET_KEY) {
5535 		peer->keys[key->keyidx] = key;
5536 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
5537 			peer->ucast_keyidx = key->keyidx;
5538 			peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
5539 		} else {
5540 			peer->mcast_keyidx = key->keyidx;
5541 			peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
5542 		}
5543 	} else if (peer && cmd == DISABLE_KEY) {
5544 		peer->keys[key->keyidx] = NULL;
5545 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5546 			peer->ucast_keyidx = 0;
5547 		else
5548 			peer->mcast_keyidx = 0;
5549 	} else if (!peer)
5550 		/* impossible unless FW goes crazy */
5551 		ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
5552 
5553 	if (sta) {
5554 		ahsta = ath12k_sta_to_ahsta(sta);
5555 
5556 		switch (key->cipher) {
5557 		case WLAN_CIPHER_SUITE_TKIP:
5558 		case WLAN_CIPHER_SUITE_CCMP:
5559 		case WLAN_CIPHER_SUITE_CCMP_256:
5560 		case WLAN_CIPHER_SUITE_GCMP:
5561 		case WLAN_CIPHER_SUITE_GCMP_256:
5562 			if (cmd == SET_KEY)
5563 				ahsta->pn_type = HAL_PN_TYPE_WPA;
5564 			else
5565 				ahsta->pn_type = HAL_PN_TYPE_NONE;
5566 			break;
5567 		default:
5568 			ahsta->pn_type = HAL_PN_TYPE_NONE;
5569 			break;
5570 		}
5571 	}
5572 
5573 	spin_unlock_bh(&ab->base_lock);
5574 
5575 	return 0;
5576 }
5577 
ath12k_mac_update_key_cache(struct ath12k_vif_cache * cache,enum set_key_cmd cmd,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5578 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache,
5579 				       enum set_key_cmd cmd,
5580 				       struct ieee80211_sta *sta,
5581 				       struct ieee80211_key_conf *key)
5582 {
5583 	struct ath12k_key_conf *key_conf, *tmp;
5584 
5585 	list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
5586 		if (key_conf->key != key)
5587 			continue;
5588 
5589 		/* If SET key entry is already present in cache, nothing to do,
5590 		 * just return
5591 		 */
5592 		if (cmd == SET_KEY)
5593 			return 0;
5594 
5595 		/* DEL key for an old SET key which driver hasn't flushed yet.
5596 		 */
5597 		list_del(&key_conf->list);
5598 		kfree(key_conf);
5599 	}
5600 
5601 	if (cmd == SET_KEY) {
5602 		key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL);
5603 
5604 		if (!key_conf)
5605 			return -ENOMEM;
5606 
5607 		key_conf->cmd = cmd;
5608 		key_conf->sta = sta;
5609 		key_conf->key = key;
5610 		list_add_tail(&key_conf->list,
5611 			      &cache->key_conf.list);
5612 	}
5613 
5614 	return 0;
5615 }
5616 
ath12k_mac_op_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5617 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5618 				 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5619 				 struct ieee80211_key_conf *key)
5620 {
5621 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5622 	struct ath12k_link_vif *arvif;
5623 	struct ath12k_link_sta *arsta = NULL;
5624 	struct ath12k_vif_cache *cache;
5625 	struct ath12k_sta *ahsta;
5626 	unsigned long links;
5627 	u8 link_id;
5628 	int ret;
5629 
5630 	lockdep_assert_wiphy(hw->wiphy);
5631 
5632 	/* IGTK needs to be done in host software */
5633 	if (key->keyidx == 4 || key->keyidx == 5)
5634 		return 1;
5635 
5636 	if (key->keyidx > WMI_MAX_KEY_INDEX)
5637 		return -ENOSPC;
5638 
5639 	if (sta) {
5640 		ahsta = ath12k_sta_to_ahsta(sta);
5641 
5642 		/* For an ML STA Pairwise key is same for all associated link Stations,
5643 		 * hence do set key for all link STAs which are active.
5644 		 */
5645 		if (sta->mlo) {
5646 			links = ahsta->links_map;
5647 			for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
5648 				arvif = wiphy_dereference(hw->wiphy,
5649 							  ahvif->link[link_id]);
5650 				arsta = wiphy_dereference(hw->wiphy,
5651 							  ahsta->link[link_id]);
5652 
5653 				if (WARN_ON(!arvif || !arsta))
5654 					/* arvif and arsta are expected to be valid when
5655 					 * STA is present.
5656 					 */
5657 					continue;
5658 
5659 				ret = ath12k_mac_set_key(arvif->ar, cmd, arvif,
5660 							 arsta, key);
5661 				if (ret)
5662 					break;
5663 			}
5664 
5665 			return 0;
5666 		}
5667 
5668 		arsta = &ahsta->deflink;
5669 		arvif = arsta->arvif;
5670 		if (WARN_ON(!arvif))
5671 			return -EINVAL;
5672 
5673 		ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key);
5674 		if (ret)
5675 			return ret;
5676 
5677 		return 0;
5678 	}
5679 
5680 	if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
5681 		link_id = key->link_id;
5682 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5683 	} else {
5684 		link_id = 0;
5685 		arvif = &ahvif->deflink;
5686 	}
5687 
5688 	if (!arvif || !arvif->is_created) {
5689 		cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
5690 		if (!cache)
5691 			return -ENOSPC;
5692 
5693 		ret = ath12k_mac_update_key_cache(cache, cmd, sta, key);
5694 		if (ret)
5695 			return ret;
5696 
5697 		return 0;
5698 	}
5699 
5700 	ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key);
5701 	if (ret)
5702 		return ret;
5703 
5704 	return 0;
5705 }
5706 
5707 static int
ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5708 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
5709 				      enum nl80211_band band,
5710 				      const struct cfg80211_bitrate_mask *mask)
5711 {
5712 	int num_rates = 0;
5713 	int i;
5714 
5715 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5716 		num_rates += hweight16(mask->control[band].vht_mcs[i]);
5717 
5718 	return num_rates;
5719 }
5720 
5721 static int
ath12k_mac_bitrate_mask_num_he_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5722 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar,
5723 				     enum nl80211_band band,
5724 				     const struct cfg80211_bitrate_mask *mask)
5725 {
5726 	int num_rates = 0;
5727 	int i;
5728 
5729 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
5730 		num_rates += hweight16(mask->control[band].he_mcs[i]);
5731 
5732 	return num_rates;
5733 }
5734 
5735 static int
ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)5736 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
5737 				   struct ath12k_link_sta *arsta,
5738 				   const struct cfg80211_bitrate_mask *mask,
5739 				   enum nl80211_band band)
5740 {
5741 	struct ath12k *ar = arvif->ar;
5742 	u8 vht_rate, nss;
5743 	u32 rate_code;
5744 	int ret, i;
5745 
5746 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5747 
5748 	nss = 0;
5749 
5750 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5751 		if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5752 			nss = i + 1;
5753 			vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
5754 		}
5755 	}
5756 
5757 	if (!nss) {
5758 		ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
5759 			    arsta->addr);
5760 		return -EINVAL;
5761 	}
5762 
5763 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5764 		   "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
5765 		   arsta->addr);
5766 
5767 	rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
5768 					WMI_RATE_PREAMBLE_VHT);
5769 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5770 					arvif->vdev_id,
5771 					WMI_PEER_PARAM_FIXED_RATE,
5772 					rate_code);
5773 	if (ret)
5774 		ath12k_warn(ar->ab,
5775 			    "failed to update STA %pM Fixed Rate %d: %d\n",
5776 			     arsta->addr, rate_code, ret);
5777 
5778 	return ret;
5779 }
5780 
5781 static int
ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)5782 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif,
5783 				  struct ath12k_link_sta *arsta,
5784 				  const struct cfg80211_bitrate_mask *mask,
5785 				  enum nl80211_band band)
5786 {
5787 	struct ath12k *ar = arvif->ar;
5788 	u8 he_rate, nss;
5789 	u32 rate_code;
5790 	int ret, i;
5791 	struct ath12k_sta *ahsta = arsta->ahsta;
5792 	struct ieee80211_sta *sta;
5793 
5794 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5795 
5796 	sta = ath12k_ahsta_to_sta(ahsta);
5797 	nss = 0;
5798 
5799 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
5800 		if (hweight16(mask->control[band].he_mcs[i]) == 1) {
5801 			nss = i + 1;
5802 			he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
5803 		}
5804 	}
5805 
5806 	if (!nss) {
5807 		ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM",
5808 			    arsta->addr);
5809 		return -EINVAL;
5810 	}
5811 
5812 	/* Avoid updating invalid nss as fixed rate*/
5813 	if (nss > sta->deflink.rx_nss)
5814 		return -EINVAL;
5815 
5816 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5817 		   "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates",
5818 		   arsta->addr);
5819 
5820 	rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1,
5821 					WMI_RATE_PREAMBLE_HE);
5822 
5823 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5824 					arvif->vdev_id,
5825 					WMI_PEER_PARAM_FIXED_RATE,
5826 					rate_code);
5827 	if (ret)
5828 		ath12k_warn(ar->ab,
5829 			    "failed to update STA %pM Fixed Rate %d: %d\n",
5830 			    arsta->addr, rate_code, ret);
5831 
5832 	return ret;
5833 }
5834 
ath12k_mac_station_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,bool reassoc)5835 static int ath12k_mac_station_assoc(struct ath12k *ar,
5836 				    struct ath12k_link_vif *arvif,
5837 				    struct ath12k_link_sta *arsta,
5838 				    bool reassoc)
5839 {
5840 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
5841 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5842 	struct ieee80211_link_sta *link_sta;
5843 	int ret;
5844 	struct cfg80211_chan_def def;
5845 	enum nl80211_band band;
5846 	struct cfg80211_bitrate_mask *mask;
5847 	u8 num_vht_rates, num_he_rates;
5848 	u8 link_id = arvif->link_id;
5849 
5850 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5851 
5852 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5853 		return -EPERM;
5854 
5855 	if (WARN_ON(!rcu_access_pointer(sta->link[link_id])))
5856 		return -EINVAL;
5857 
5858 	band = def.chan->band;
5859 	mask = &arvif->bitrate_mask;
5860 
5861 	struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
5862 		kzalloc(sizeof(*peer_arg), GFP_KERNEL);
5863 	if (!peer_arg)
5864 		return -ENOMEM;
5865 
5866 	ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc);
5867 
5868 	if (peer_arg->peer_nss < 1) {
5869 		ath12k_warn(ar->ab,
5870 			    "invalid peer NSS %d\n", peer_arg->peer_nss);
5871 		return -EINVAL;
5872 	}
5873 
5874 	peer_arg->is_assoc = true;
5875 	ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
5876 	if (ret) {
5877 		ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
5878 			    arsta->addr, arvif->vdev_id, ret);
5879 		return ret;
5880 	}
5881 
5882 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
5883 		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
5884 			    arsta->addr, arvif->vdev_id);
5885 		return -ETIMEDOUT;
5886 	}
5887 
5888 	num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
5889 	num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
5890 
5891 	/* If single VHT/HE rate is configured (by set_bitrate_mask()),
5892 	 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
5893 	 * fixed param.
5894 	 * Note that all other rates and NSS will be disabled for this peer.
5895 	 */
5896 	link_sta = ath12k_mac_get_link_sta(arsta);
5897 	if (!link_sta) {
5898 		ath12k_warn(ar->ab, "unable to access link sta in station assoc\n");
5899 		return -EINVAL;
5900 	}
5901 
5902 	spin_lock_bh(&ar->data_lock);
5903 	arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
5904 	arsta->bw_prev = link_sta->bandwidth;
5905 	spin_unlock_bh(&ar->data_lock);
5906 
5907 	if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
5908 		ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band);
5909 	} else if (link_sta->he_cap.has_he && num_he_rates == 1) {
5910 		ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
5911 		if (ret)
5912 			return ret;
5913 	}
5914 
5915 	/* Re-assoc is run only to update supported rates for given station. It
5916 	 * doesn't make much sense to reconfigure the peer completely.
5917 	 */
5918 	if (reassoc)
5919 		return 0;
5920 
5921 	ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr,
5922 				     &link_sta->ht_cap, &link_sta->he_6ghz_capa);
5923 	if (ret) {
5924 		ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
5925 			    arvif->vdev_id, ret);
5926 		return ret;
5927 	}
5928 
5929 	if (!sta->wme) {
5930 		arvif->num_legacy_stations++;
5931 		ret = ath12k_recalc_rtscts_prot(arvif);
5932 		if (ret)
5933 			return ret;
5934 	}
5935 
5936 	if (sta->wme && sta->uapsd_queues) {
5937 		ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta);
5938 		if (ret) {
5939 			ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
5940 				    arsta->addr, arvif->vdev_id, ret);
5941 			return ret;
5942 		}
5943 	}
5944 
5945 	return 0;
5946 }
5947 
ath12k_mac_station_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)5948 static int ath12k_mac_station_disassoc(struct ath12k *ar,
5949 				       struct ath12k_link_vif *arvif,
5950 				       struct ath12k_link_sta *arsta)
5951 {
5952 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5953 
5954 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5955 
5956 	if (!sta->wme) {
5957 		arvif->num_legacy_stations--;
5958 		return ath12k_recalc_rtscts_prot(arvif);
5959 	}
5960 
5961 	return 0;
5962 }
5963 
ath12k_sta_rc_update_wk(struct wiphy * wiphy,struct wiphy_work * wk)5964 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
5965 {
5966 	struct ieee80211_link_sta *link_sta;
5967 	struct ath12k *ar;
5968 	struct ath12k_link_vif *arvif;
5969 	struct ieee80211_sta *sta;
5970 	struct cfg80211_chan_def def;
5971 	enum nl80211_band band;
5972 	const u8 *ht_mcs_mask;
5973 	const u16 *vht_mcs_mask;
5974 	const u16 *he_mcs_mask;
5975 	u32 changed, bw, nss, mac_nss, smps, bw_prev;
5976 	int err, num_vht_rates, num_he_rates;
5977 	const struct cfg80211_bitrate_mask *mask;
5978 	enum wmi_phy_mode peer_phymode;
5979 	struct ath12k_link_sta *arsta;
5980 	struct ieee80211_vif *vif;
5981 
5982 	lockdep_assert_wiphy(wiphy);
5983 
5984 	arsta = container_of(wk, struct ath12k_link_sta, update_wk);
5985 	sta = ath12k_ahsta_to_sta(arsta->ahsta);
5986 	arvif = arsta->arvif;
5987 	vif = ath12k_ahvif_to_vif(arvif->ahvif);
5988 	ar = arvif->ar;
5989 
5990 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5991 		return;
5992 
5993 	band = def.chan->band;
5994 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5995 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5996 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
5997 
5998 	spin_lock_bh(&ar->data_lock);
5999 
6000 	changed = arsta->changed;
6001 	arsta->changed = 0;
6002 
6003 	bw = arsta->bw;
6004 	bw_prev = arsta->bw_prev;
6005 	nss = arsta->nss;
6006 	smps = arsta->smps;
6007 
6008 	spin_unlock_bh(&ar->data_lock);
6009 
6010 	nss = max_t(u32, 1, nss);
6011 	mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
6012 		       ath12k_mac_max_vht_nss(vht_mcs_mask),
6013 		       ath12k_mac_max_he_nss(he_mcs_mask));
6014 	nss = min(nss, mac_nss);
6015 
6016 	struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
6017 					kzalloc(sizeof(*peer_arg), GFP_KERNEL);
6018 	if (!peer_arg)
6019 		return;
6020 
6021 	if (changed & IEEE80211_RC_BW_CHANGED) {
6022 		ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg);
6023 		peer_phymode = peer_arg->peer_phymode;
6024 
6025 		if (bw > bw_prev) {
6026 			/* Phymode shows maximum supported channel width, if we
6027 			 * upgrade bandwidth then due to sanity check of firmware,
6028 			 * we have to send WMI_PEER_PHYMODE followed by
6029 			 * WMI_PEER_CHWIDTH
6030 			 */
6031 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
6032 				   arsta->addr, bw, bw_prev);
6033 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6034 							arvif->vdev_id, WMI_PEER_PHYMODE,
6035 							peer_phymode);
6036 			if (err) {
6037 				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6038 					    arsta->addr, peer_phymode, err);
6039 				return;
6040 			}
6041 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6042 							arvif->vdev_id, WMI_PEER_CHWIDTH,
6043 							bw);
6044 			if (err)
6045 				ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
6046 					    arsta->addr, bw, err);
6047 		} else {
6048 			/* When we downgrade bandwidth this will conflict with phymode
6049 			 * and cause to trigger firmware crash. In this case we send
6050 			 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
6051 			 */
6052 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
6053 				   arsta->addr, bw, bw_prev);
6054 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6055 							arvif->vdev_id, WMI_PEER_CHWIDTH,
6056 							bw);
6057 			if (err) {
6058 				ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
6059 					    arsta->addr, bw, err);
6060 				return;
6061 			}
6062 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6063 							arvif->vdev_id, WMI_PEER_PHYMODE,
6064 							peer_phymode);
6065 			if (err)
6066 				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6067 					    arsta->addr, peer_phymode, err);
6068 		}
6069 	}
6070 
6071 	if (changed & IEEE80211_RC_NSS_CHANGED) {
6072 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
6073 			   arsta->addr, nss);
6074 
6075 		err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6076 						WMI_PEER_NSS, nss);
6077 		if (err)
6078 			ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
6079 				    arsta->addr, nss, err);
6080 	}
6081 
6082 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
6083 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
6084 			   arsta->addr, smps);
6085 
6086 		err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6087 						WMI_PEER_MIMO_PS_STATE, smps);
6088 		if (err)
6089 			ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
6090 				    arsta->addr, smps, err);
6091 	}
6092 
6093 	if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6094 		mask = &arvif->bitrate_mask;
6095 		num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6096 								      mask);
6097 		num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band,
6098 								    mask);
6099 
6100 		/* Peer_assoc_prepare will reject vht rates in
6101 		 * bitrate_mask if its not available in range format and
6102 		 * sets vht tx_rateset as unsupported. So multiple VHT MCS
6103 		 * setting(eg. MCS 4,5,6) per peer is not supported here.
6104 		 * But, Single rate in VHT mask can be set as per-peer
6105 		 * fixed rate. But even if any HT rates are configured in
6106 		 * the bitrate mask, device will not switch to those rates
6107 		 * when per-peer Fixed rate is set.
6108 		 * TODO: Check RATEMASK_CMDID to support auto rates selection
6109 		 * across HT/VHT and for multiple VHT MCS support.
6110 		 */
6111 		link_sta = ath12k_mac_get_link_sta(arsta);
6112 		if (!link_sta) {
6113 			ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
6114 				    sta->addr, arsta->link_id);
6115 			return;
6116 		}
6117 
6118 		if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
6119 			ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
6120 							   band);
6121 		} else if (link_sta->he_cap.has_he && num_he_rates == 1) {
6122 			ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
6123 		} else {
6124 			/* If the peer is non-VHT/HE or no fixed VHT/HE rate
6125 			 * is provided in the new bitrate mask we set the
6126 			 * other rates using peer_assoc command. Also clear
6127 			 * the peer fixed rate settings as it has higher proprity
6128 			 * than peer assoc
6129 			 */
6130 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6131 							arvif->vdev_id,
6132 							WMI_PEER_PARAM_FIXED_RATE,
6133 							WMI_FIXED_RATE_NONE);
6134 			if (err)
6135 				ath12k_warn(ar->ab,
6136 					    "failed to disable peer fixed rate for STA %pM ret %d\n",
6137 					    arsta->addr, err);
6138 
6139 			ath12k_peer_assoc_prepare(ar, arvif, arsta,
6140 						  peer_arg, true);
6141 
6142 			peer_arg->is_assoc = false;
6143 			err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
6144 			if (err)
6145 				ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
6146 					    arsta->addr, arvif->vdev_id, err);
6147 
6148 			if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
6149 				ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
6150 					    arsta->addr, arvif->vdev_id);
6151 		}
6152 	}
6153 }
6154 
ath12k_mac_free_unassign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,u8 link_id)6155 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah,
6156 					      struct ath12k_sta *ahsta,
6157 					      u8 link_id)
6158 {
6159 	struct ath12k_link_sta *arsta;
6160 
6161 	lockdep_assert_wiphy(ah->hw->wiphy);
6162 
6163 	if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
6164 		return;
6165 
6166 	arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6167 	if (WARN_ON(!arsta))
6168 		return;
6169 
6170 	ahsta->links_map &= ~BIT(link_id);
6171 	rcu_assign_pointer(ahsta->link[link_id], NULL);
6172 	synchronize_rcu();
6173 
6174 	if (arsta == &ahsta->deflink) {
6175 		arsta->link_id = ATH12K_INVALID_LINK_ID;
6176 		arsta->ahsta = NULL;
6177 		arsta->arvif = NULL;
6178 		return;
6179 	}
6180 
6181 	kfree(arsta);
6182 }
6183 
ath12k_mac_inc_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6184 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif,
6185 				       struct ath12k_link_sta *arsta)
6186 {
6187 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6188 	struct ath12k *ar = arvif->ar;
6189 
6190 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6191 
6192 	if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6193 		return 0;
6194 
6195 	if (ar->num_stations >= ar->max_num_stations)
6196 		return -ENOBUFS;
6197 
6198 	ar->num_stations++;
6199 	arvif->num_stations++;
6200 
6201 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6202 		   "mac station %pM connected to vdev %u num_stations %u\n",
6203 		   arsta->addr, arvif->vdev_id, arvif->num_stations);
6204 
6205 	return 0;
6206 }
6207 
ath12k_mac_dec_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6208 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif,
6209 					struct ath12k_link_sta *arsta)
6210 {
6211 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6212 	struct ath12k *ar = arvif->ar;
6213 
6214 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6215 
6216 	if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6217 		return;
6218 
6219 	ar->num_stations--;
6220 
6221 	if (arvif->num_stations) {
6222 		arvif->num_stations--;
6223 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6224 			   "mac station %pM disconnected from vdev %u num_stations %u\n",
6225 			   arsta->addr, arvif->vdev_id, arvif->num_stations);
6226 	} else {
6227 		ath12k_warn(ar->ab,
6228 			    "mac station %pM disconnect for vdev %u without any connected station\n",
6229 			    arsta->addr, arvif->vdev_id);
6230 	}
6231 }
6232 
ath12k_mac_station_post_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6233 static void ath12k_mac_station_post_remove(struct ath12k *ar,
6234 					   struct ath12k_link_vif *arvif,
6235 					   struct ath12k_link_sta *arsta)
6236 {
6237 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6238 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6239 	struct ath12k_peer *peer;
6240 
6241 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6242 
6243 	ath12k_mac_dec_num_stations(arvif, arsta);
6244 
6245 	spin_lock_bh(&ar->ab->base_lock);
6246 
6247 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6248 	if (peer && peer->sta == sta) {
6249 		ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
6250 			    vif->addr, arvif->vdev_id);
6251 		peer->sta = NULL;
6252 		list_del(&peer->list);
6253 		kfree(peer);
6254 		ar->num_peers--;
6255 	}
6256 
6257 	spin_unlock_bh(&ar->ab->base_lock);
6258 
6259 	kfree(arsta->rx_stats);
6260 	arsta->rx_stats = NULL;
6261 }
6262 
ath12k_mac_station_unauthorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6263 static int ath12k_mac_station_unauthorize(struct ath12k *ar,
6264 					  struct ath12k_link_vif *arvif,
6265 					  struct ath12k_link_sta *arsta)
6266 {
6267 	struct ath12k_peer *peer;
6268 	int ret;
6269 
6270 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6271 
6272 	spin_lock_bh(&ar->ab->base_lock);
6273 
6274 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6275 	if (peer)
6276 		peer->is_authorized = false;
6277 
6278 	spin_unlock_bh(&ar->ab->base_lock);
6279 
6280 	/* Driver must clear the keys during the state change from
6281 	 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
6282 	 * returning from here, mac80211 is going to delete the keys
6283 	 * in __sta_info_destroy_part2(). This will ensure that the driver does
6284 	 * not retain stale key references after mac80211 deletes the keys.
6285 	 */
6286 	ret = ath12k_clear_peer_keys(arvif, arsta->addr);
6287 	if (ret) {
6288 		ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
6289 			    arvif->vdev_id, ret);
6290 		return ret;
6291 	}
6292 
6293 	return 0;
6294 }
6295 
ath12k_mac_station_authorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6296 static int ath12k_mac_station_authorize(struct ath12k *ar,
6297 					struct ath12k_link_vif *arvif,
6298 					struct ath12k_link_sta *arsta)
6299 {
6300 	struct ath12k_peer *peer;
6301 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6302 	int ret;
6303 
6304 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6305 
6306 	spin_lock_bh(&ar->ab->base_lock);
6307 
6308 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6309 	if (peer)
6310 		peer->is_authorized = true;
6311 
6312 	spin_unlock_bh(&ar->ab->base_lock);
6313 
6314 	if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
6315 		ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6316 						arvif->vdev_id,
6317 						WMI_PEER_AUTHORIZE,
6318 						1);
6319 		if (ret) {
6320 			ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
6321 				    arsta->addr, arvif->vdev_id, ret);
6322 			return ret;
6323 		}
6324 	}
6325 
6326 	return 0;
6327 }
6328 
ath12k_mac_station_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6329 static int ath12k_mac_station_remove(struct ath12k *ar,
6330 				     struct ath12k_link_vif *arvif,
6331 				     struct ath12k_link_sta *arsta)
6332 {
6333 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6334 	struct ath12k_vif *ahvif = arvif->ahvif;
6335 	int ret = 0;
6336 
6337 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6338 
6339 	wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk);
6340 
6341 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6342 		ath12k_bss_disassoc(ar, arvif);
6343 		ret = ath12k_mac_vdev_stop(arvif);
6344 		if (ret)
6345 			ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
6346 				    arvif->vdev_id, ret);
6347 	}
6348 
6349 	if (sta->mlo)
6350 		return ret;
6351 
6352 	ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr);
6353 
6354 	ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6355 	if (ret)
6356 		ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
6357 			    arsta->addr, arvif->vdev_id);
6358 	else
6359 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
6360 			   arsta->addr, arvif->vdev_id);
6361 
6362 	ath12k_mac_station_post_remove(ar, arvif, arsta);
6363 
6364 	if (sta->valid_links)
6365 		ath12k_mac_free_unassign_link_sta(ahvif->ah,
6366 						  arsta->ahsta, arsta->link_id);
6367 
6368 	return ret;
6369 }
6370 
ath12k_mac_station_add(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6371 static int ath12k_mac_station_add(struct ath12k *ar,
6372 				  struct ath12k_link_vif *arvif,
6373 				  struct ath12k_link_sta *arsta)
6374 {
6375 	struct ath12k_base *ab = ar->ab;
6376 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6377 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6378 	struct ath12k_wmi_peer_create_arg peer_param = {};
6379 	int ret;
6380 
6381 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6382 
6383 	ret = ath12k_mac_inc_num_stations(arvif, arsta);
6384 	if (ret) {
6385 		ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
6386 			    ar->max_num_stations);
6387 		goto exit;
6388 	}
6389 
6390 	if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) {
6391 		arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
6392 		if (!arsta->rx_stats) {
6393 			ret = -ENOMEM;
6394 			goto dec_num_station;
6395 		}
6396 	}
6397 
6398 	peer_param.vdev_id = arvif->vdev_id;
6399 	peer_param.peer_addr = arsta->addr;
6400 	peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6401 	peer_param.ml_enabled = sta->mlo;
6402 
6403 	ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
6404 	if (ret) {
6405 		ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
6406 			    arsta->addr, arvif->vdev_id);
6407 		goto free_peer;
6408 	}
6409 
6410 	ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
6411 		   arsta->addr, arvif->vdev_id);
6412 
6413 	if (ieee80211_vif_is_mesh(vif)) {
6414 		ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6415 						arvif->vdev_id,
6416 						WMI_PEER_USE_4ADDR, 1);
6417 		if (ret) {
6418 			ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
6419 				    arsta->addr, ret);
6420 			goto free_peer;
6421 		}
6422 	}
6423 
6424 	ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr);
6425 	if (ret) {
6426 		ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
6427 			    arsta->addr, arvif->vdev_id, ret);
6428 		goto free_peer;
6429 	}
6430 
6431 	if (ab->hw_params->vdev_start_delay &&
6432 	    !arvif->is_started &&
6433 	    arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) {
6434 		ret = ath12k_start_vdev_delay(ar, arvif);
6435 		if (ret) {
6436 			ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
6437 			goto free_peer;
6438 		}
6439 	}
6440 
6441 	ewma_avg_rssi_init(&arsta->avg_rssi);
6442 	return 0;
6443 
6444 free_peer:
6445 	ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6446 	kfree(arsta->rx_stats);
6447 	arsta->rx_stats = NULL;
6448 dec_num_station:
6449 	ath12k_mac_dec_num_stations(arvif, arsta);
6450 exit:
6451 	return ret;
6452 }
6453 
ath12k_mac_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_link_sta * arsta,struct ath12k_vif * ahvif,u8 link_id)6454 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
6455 				      struct ath12k_sta *ahsta,
6456 				      struct ath12k_link_sta *arsta,
6457 				      struct ath12k_vif *ahvif,
6458 				      u8 link_id)
6459 {
6460 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6461 	struct ieee80211_link_sta *link_sta;
6462 	struct ath12k_link_vif *arvif;
6463 
6464 	lockdep_assert_wiphy(ah->hw->wiphy);
6465 
6466 	if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
6467 		return -EINVAL;
6468 
6469 	arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6470 	if (!arvif)
6471 		return -EINVAL;
6472 
6473 	memset(arsta, 0, sizeof(*arsta));
6474 
6475 	link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]);
6476 	if (!link_sta)
6477 		return -EINVAL;
6478 
6479 	ether_addr_copy(arsta->addr, link_sta->addr);
6480 
6481 	/* logical index of the link sta in order of creation */
6482 	arsta->link_idx = ahsta->num_peer++;
6483 
6484 	arsta->link_id = link_id;
6485 	ahsta->links_map |= BIT(arsta->link_id);
6486 	arsta->arvif = arvif;
6487 	arsta->ahsta = ahsta;
6488 	ahsta->ahvif = ahvif;
6489 
6490 	wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);
6491 
6492 	rcu_assign_pointer(ahsta->link[link_id], arsta);
6493 
6494 	return 0;
6495 }
6496 
ath12k_mac_ml_station_remove(struct ath12k_vif * ahvif,struct ath12k_sta * ahsta)6497 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif,
6498 					 struct ath12k_sta *ahsta)
6499 {
6500 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6501 	struct ath12k_hw *ah = ahvif->ah;
6502 	struct ath12k_link_vif *arvif;
6503 	struct ath12k_link_sta *arsta;
6504 	unsigned long links;
6505 	struct ath12k *ar;
6506 	u8 link_id;
6507 
6508 	lockdep_assert_wiphy(ah->hw->wiphy);
6509 
6510 	ath12k_peer_mlo_link_peers_delete(ahvif, ahsta);
6511 
6512 	/* validate link station removal and clear arsta links */
6513 	links = ahsta->links_map;
6514 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6515 		arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6516 		arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6517 		if (!arvif || !arsta)
6518 			continue;
6519 
6520 		ar = arvif->ar;
6521 
6522 		ath12k_mac_station_post_remove(ar, arvif, arsta);
6523 
6524 		ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
6525 	}
6526 
6527 	ath12k_peer_ml_delete(ah, sta);
6528 }
6529 
ath12k_mac_handle_link_sta_state(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)6530 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
6531 					    struct ath12k_link_vif *arvif,
6532 					    struct ath12k_link_sta *arsta,
6533 					    enum ieee80211_sta_state old_state,
6534 					    enum ieee80211_sta_state new_state)
6535 {
6536 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6537 	struct ieee80211_bss_conf *link_conf;
6538 	struct ath12k *ar = arvif->ar;
6539 	struct ath12k_reg_info *reg_info;
6540 	struct ath12k_base *ab = ar->ab;
6541 	int ret = 0;
6542 
6543 	lockdep_assert_wiphy(hw->wiphy);
6544 
6545 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
6546 		   arsta->link_id, arsta->addr, old_state, new_state);
6547 
6548 	/* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
6549 	 * from driver
6550 	 */
6551 	if ((old_state == IEEE80211_STA_NONE &&
6552 	     new_state == IEEE80211_STA_NOTEXIST)) {
6553 		ret = ath12k_mac_station_remove(ar, arvif, arsta);
6554 		if (ret) {
6555 			ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n",
6556 				    arsta->addr, arvif->vdev_id);
6557 			goto exit;
6558 		}
6559 	}
6560 
6561 	/* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */
6562 	if (old_state == IEEE80211_STA_NOTEXIST &&
6563 	    new_state == IEEE80211_STA_NONE) {
6564 		ret = ath12k_mac_station_add(ar, arvif, arsta);
6565 		if (ret)
6566 			ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n",
6567 				    arsta->addr, arvif->vdev_id);
6568 
6569 	/* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
6570 	 * peer associated to AP/Mesh/ADHOC vif type.
6571 	 */
6572 	} else if (old_state == IEEE80211_STA_AUTH &&
6573 		   new_state == IEEE80211_STA_ASSOC &&
6574 		   (vif->type == NL80211_IFTYPE_AP ||
6575 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
6576 		    vif->type == NL80211_IFTYPE_ADHOC)) {
6577 		ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
6578 		if (ret)
6579 			ath12k_warn(ab, "Failed to associate station: %pM\n",
6580 				    arsta->addr);
6581 
6582 	/* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
6583 	 * authorized
6584 	 */
6585 	} else if (old_state == IEEE80211_STA_ASSOC &&
6586 		   new_state == IEEE80211_STA_AUTHORIZED) {
6587 		ret = ath12k_mac_station_authorize(ar, arvif, arsta);
6588 		if (ret) {
6589 			ath12k_warn(ab, "Failed to authorize station: %pM\n",
6590 				    arsta->addr);
6591 			goto exit;
6592 		}
6593 
6594 		if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
6595 		    arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6596 			link_conf = ath12k_mac_get_link_bss_conf(arvif);
6597 			reg_info = ab->reg_info[ar->pdev_idx];
6598 			ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n");
6599 			ath12k_hw_to_ah(hw)->regd_updated = false;
6600 			ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type,
6601 						    link_conf->power_type);
6602 		}
6603 
6604 	/* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
6605 	 * deauthorize it.
6606 	 */
6607 	} else if (old_state == IEEE80211_STA_AUTHORIZED &&
6608 		   new_state == IEEE80211_STA_ASSOC) {
6609 		ath12k_mac_station_unauthorize(ar, arvif, arsta);
6610 
6611 	/* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to
6612 	 * AP/mesh/ADHOC vif type.
6613 	 */
6614 	} else if (old_state == IEEE80211_STA_ASSOC &&
6615 		   new_state == IEEE80211_STA_AUTH &&
6616 		   (vif->type == NL80211_IFTYPE_AP ||
6617 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
6618 		    vif->type == NL80211_IFTYPE_ADHOC)) {
6619 		ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
6620 		if (ret)
6621 			ath12k_warn(ab, "Failed to disassociate station: %pM\n",
6622 				    arsta->addr);
6623 	}
6624 
6625 exit:
6626 	return ret;
6627 }
6628 
ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq,u8 mac_id)6629 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range,
6630 				      u32 freq, u8 mac_id)
6631 {
6632 	return (freq >= freq_range[mac_id].low_2ghz_freq &&
6633 		freq <= freq_range[mac_id].high_2ghz_freq) ||
6634 	       (freq >= freq_range[mac_id].low_5ghz_freq &&
6635 		freq <= freq_range[mac_id].high_5ghz_freq);
6636 }
6637 
6638 static bool
ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base * ab,struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq_link1,u32 freq_link2)6639 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab,
6640 					 struct ath12k_hw_mode_freq_range_arg *freq_range,
6641 					 u32 freq_link1, u32 freq_link2)
6642 {
6643 	u8 i;
6644 
6645 	for (i = 0; i < MAX_RADIOS; i++) {
6646 		if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) &&
6647 		    ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i))
6648 			return true;
6649 	}
6650 
6651 	return false;
6652 }
6653 
ath12k_mac_is_hw_dbs_capable(struct ath12k_base * ab)6654 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab)
6655 {
6656 	return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6657 			ab->wmi_ab.svc_map) &&
6658 	       ab->wmi_ab.hw_mode_info.support_dbs;
6659 }
6660 
ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6661 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab,
6662 					      u32 freq_link1, u32 freq_link2)
6663 {
6664 	struct ath12k_hw_mode_freq_range_arg *freq_range;
6665 
6666 	if (!ath12k_mac_is_hw_dbs_capable(ab))
6667 		return true;
6668 
6669 	freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS];
6670 	return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range,
6671 							freq_link1, freq_link2);
6672 }
6673 
ath12k_mac_is_hw_sbs_capable(struct ath12k_base * ab)6674 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab)
6675 {
6676 	return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6677 			ab->wmi_ab.svc_map) &&
6678 	       ab->wmi_ab.hw_mode_info.support_sbs;
6679 }
6680 
ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6681 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab,
6682 					      u32 freq_link1, u32 freq_link2)
6683 {
6684 	struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info;
6685 	struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share;
6686 	struct ath12k_hw_mode_freq_range_arg *sbs_low_share;
6687 	struct ath12k_hw_mode_freq_range_arg *sbs_range;
6688 
6689 	if (!ath12k_mac_is_hw_sbs_capable(ab))
6690 		return true;
6691 
6692 	if (ab->wmi_ab.sbs_lower_band_end_freq) {
6693 		sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE];
6694 		sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE];
6695 
6696 		return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share,
6697 								freq_link1, freq_link2) ||
6698 		       ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share,
6699 								freq_link1, freq_link2);
6700 	}
6701 
6702 	sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS];
6703 	return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range,
6704 							freq_link1, freq_link2);
6705 }
6706 
ath12k_mac_freqs_on_same_mac(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6707 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab,
6708 					 u32 freq_link1, u32 freq_link2)
6709 {
6710 	return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) &&
6711 	       ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2);
6712 }
6713 
ath12k_mac_mlo_sta_set_link_active(struct ath12k_base * ab,enum wmi_mlo_link_force_reason reason,enum wmi_mlo_link_force_mode mode,u8 * mlo_vdev_id_lst,u8 num_mlo_vdev,u8 * mlo_inactive_vdev_lst,u8 num_mlo_inactive_vdev)6714 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab,
6715 					      enum wmi_mlo_link_force_reason reason,
6716 					      enum wmi_mlo_link_force_mode mode,
6717 					      u8 *mlo_vdev_id_lst,
6718 					      u8 num_mlo_vdev,
6719 					      u8 *mlo_inactive_vdev_lst,
6720 					      u8 num_mlo_inactive_vdev)
6721 {
6722 	struct wmi_mlo_link_set_active_arg param = {};
6723 	u32 entry_idx, entry_offset, vdev_idx;
6724 	u8 vdev_id;
6725 
6726 	param.reason = reason;
6727 	param.force_mode = mode;
6728 
6729 	for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
6730 		vdev_id = mlo_vdev_id_lst[vdev_idx];
6731 		entry_idx = vdev_id / 32;
6732 		entry_offset = vdev_id % 32;
6733 		if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6734 			ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6735 				    entry_idx, num_mlo_vdev, vdev_id);
6736 			return -EINVAL;
6737 		}
6738 		param.vdev_bitmap[entry_idx] |= 1 << entry_offset;
6739 		/* update entry number if entry index changed */
6740 		if (param.num_vdev_bitmap < entry_idx + 1)
6741 			param.num_vdev_bitmap = entry_idx + 1;
6742 	}
6743 
6744 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6745 		   "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
6746 		   param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]);
6747 
6748 	if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) {
6749 		for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) {
6750 			vdev_id = mlo_inactive_vdev_lst[vdev_idx];
6751 			entry_idx = vdev_id / 32;
6752 			entry_offset = vdev_id % 32;
6753 			if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6754 				ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6755 					    entry_idx, num_mlo_inactive_vdev, vdev_id);
6756 				return -EINVAL;
6757 			}
6758 			param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset;
6759 			/* update entry number if entry index changed */
6760 			if (param.num_inactive_vdev_bitmap < entry_idx + 1)
6761 				param.num_inactive_vdev_bitmap = entry_idx + 1;
6762 		}
6763 
6764 		ath12k_dbg(ab, ATH12K_DBG_MAC,
6765 			   "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x",
6766 			   param.num_inactive_vdev_bitmap,
6767 			   param.inactive_vdev_bitmap[0],
6768 			   param.inactive_vdev_bitmap[1]);
6769 	}
6770 
6771 	if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM ||
6772 	    mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) {
6773 		param.num_link_entry = 1;
6774 		param.link_num[0].num_of_link = num_mlo_vdev - 1;
6775 	}
6776 
6777 	return ath12k_wmi_send_mlo_link_set_active_cmd(ab, &param);
6778 }
6779 
ath12k_mac_mlo_sta_update_link_active(struct ath12k_base * ab,struct ieee80211_hw * hw,struct ath12k_vif * ahvif)6780 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab,
6781 						 struct ieee80211_hw *hw,
6782 						 struct ath12k_vif *ahvif)
6783 {
6784 	u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6785 	u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6786 	unsigned long links = ahvif->links_map;
6787 	enum wmi_mlo_link_force_reason reason;
6788 	struct ieee80211_chanctx_conf *conf;
6789 	enum wmi_mlo_link_force_mode mode;
6790 	struct ieee80211_bss_conf *info;
6791 	struct ath12k_link_vif *arvif;
6792 	u8 num_mlo_vdev = 0;
6793 	u8 link_id;
6794 
6795 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6796 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
6797 		/* make sure vdev is created on this device */
6798 		if (!arvif || !arvif->is_created || arvif->ar->ab != ab)
6799 			continue;
6800 
6801 		info = ath12k_mac_get_link_bss_conf(arvif);
6802 		conf = wiphy_dereference(hw->wiphy, info->chanctx_conf);
6803 		mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq;
6804 
6805 		mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id;
6806 		num_mlo_vdev++;
6807 	}
6808 
6809 	/* It is not allowed to activate more links than a single device
6810 	 * supported. Something goes wrong if we reach here.
6811 	 */
6812 	if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6813 		WARN_ON_ONCE(1);
6814 		return -EINVAL;
6815 	}
6816 
6817 	/* if 2 links are established and both link channels fall on the
6818 	 * same hardware MAC, send command to firmware to deactivate one
6819 	 * of them.
6820 	 */
6821 	if (num_mlo_vdev == 2 &&
6822 	    ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0],
6823 					 mlo_freq_list[1])) {
6824 		mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM;
6825 		reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT;
6826 		return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode,
6827 							  mlo_vdev_id_lst, num_mlo_vdev,
6828 							  NULL, 0);
6829 	}
6830 
6831 	return 0;
6832 }
6833 
ath12k_mac_are_sbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6834 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6835 {
6836 	if (!ath12k_mac_is_hw_sbs_capable(ab))
6837 		return false;
6838 
6839 	if (ath12k_is_2ghz_channel_freq(freq_1) ||
6840 	    ath12k_is_2ghz_channel_freq(freq_2))
6841 		return false;
6842 
6843 	return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2);
6844 }
6845 
ath12k_mac_are_dbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6846 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6847 {
6848 	if (!ath12k_mac_is_hw_dbs_capable(ab))
6849 		return false;
6850 
6851 	return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2);
6852 }
6853 
ath12k_mac_select_links(struct ath12k_base * ab,struct ieee80211_vif * vif,struct ieee80211_hw * hw,u16 * selected_links)6854 static int ath12k_mac_select_links(struct ath12k_base *ab,
6855 				   struct ieee80211_vif *vif,
6856 				   struct ieee80211_hw *hw,
6857 				   u16 *selected_links)
6858 {
6859 	unsigned long useful_links = ieee80211_vif_usable_links(vif);
6860 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6861 	u8 num_useful_links = hweight_long(useful_links);
6862 	struct ieee80211_chanctx_conf *chanctx;
6863 	struct ath12k_link_vif *assoc_arvif;
6864 	u32 assoc_link_freq, partner_freq;
6865 	u16 sbs_links = 0, dbs_links = 0;
6866 	struct ieee80211_bss_conf *info;
6867 	struct ieee80211_channel *chan;
6868 	struct ieee80211_sta *sta;
6869 	struct ath12k_sta *ahsta;
6870 	u8 link_id;
6871 
6872 	/* activate all useful links if less than max supported */
6873 	if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6874 		*selected_links = useful_links;
6875 		return 0;
6876 	}
6877 
6878 	/* only in station mode we can get here, so it's safe
6879 	 * to use ap_addr
6880 	 */
6881 	rcu_read_lock();
6882 	sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
6883 	if (!sta) {
6884 		rcu_read_unlock();
6885 		ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr);
6886 		return -EINVAL;
6887 	}
6888 
6889 	ahsta = ath12k_sta_to_ahsta(sta);
6890 	assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]);
6891 	info = ath12k_mac_get_link_bss_conf(assoc_arvif);
6892 	chanctx = rcu_dereference(info->chanctx_conf);
6893 	assoc_link_freq = chanctx->def.chan->center_freq;
6894 	rcu_read_unlock();
6895 	ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n",
6896 		   assoc_arvif->link_id, assoc_link_freq);
6897 
6898 	/* assoc link is already activated and has to be kept active,
6899 	 * only need to select a partner link from others.
6900 	 */
6901 	useful_links &= ~BIT(assoc_arvif->link_id);
6902 	for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) {
6903 		info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
6904 		if (!info) {
6905 			ath12k_warn(ab, "failed to get link info for link: %u\n",
6906 				    link_id);
6907 			return -ENOLINK;
6908 		}
6909 
6910 		chan = info->chanreq.oper.chan;
6911 		if (!chan) {
6912 			ath12k_warn(ab, "failed to get chan for link: %u\n", link_id);
6913 			return -EINVAL;
6914 		}
6915 
6916 		partner_freq = chan->center_freq;
6917 		if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) {
6918 			sbs_links |= BIT(link_id);
6919 			ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n",
6920 				   link_id, partner_freq);
6921 			continue;
6922 		}
6923 
6924 		if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) {
6925 			dbs_links |= BIT(link_id);
6926 			ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n",
6927 				   link_id, partner_freq);
6928 			continue;
6929 		}
6930 
6931 		ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n",
6932 			   link_id, partner_freq);
6933 	}
6934 
6935 	/* choose the first candidate no matter how many is in the list */
6936 	if (sbs_links)
6937 		link_id = __ffs(sbs_links);
6938 	else if (dbs_links)
6939 		link_id = __ffs(dbs_links);
6940 	else
6941 		link_id = ffs(useful_links) - 1;
6942 
6943 	ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id);
6944 
6945 	*selected_links = BIT(assoc_arvif->link_id) | BIT(link_id);
6946 
6947 	return 0;
6948 }
6949 
ath12k_mac_op_sta_state(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)6950 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
6951 				   struct ieee80211_vif *vif,
6952 				   struct ieee80211_sta *sta,
6953 				   enum ieee80211_sta_state old_state,
6954 				   enum ieee80211_sta_state new_state)
6955 {
6956 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6957 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
6958 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6959 	struct ath12k_base *prev_ab = NULL, *ab;
6960 	struct ath12k_link_vif *arvif;
6961 	struct ath12k_link_sta *arsta;
6962 	unsigned long valid_links;
6963 	u16 selected_links = 0;
6964 	u8 link_id = 0, i;
6965 	struct ath12k *ar;
6966 	int ret;
6967 
6968 	lockdep_assert_wiphy(hw->wiphy);
6969 
6970 	if (ieee80211_vif_is_mld(vif) && sta->valid_links) {
6971 		WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1);
6972 		link_id = ffs(sta->valid_links) - 1;
6973 	}
6974 
6975 	/* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE:
6976 	 * New station add received. If this is a ML station then
6977 	 * ahsta->links_map will be zero and sta->valid_links will be 1.
6978 	 * Assign default link to the first link sta.
6979 	 */
6980 	if (old_state == IEEE80211_STA_NOTEXIST &&
6981 	    new_state == IEEE80211_STA_NONE) {
6982 		memset(ahsta, 0, sizeof(*ahsta));
6983 
6984 		arsta = &ahsta->deflink;
6985 
6986 		/* ML sta */
6987 		if (sta->mlo && !ahsta->links_map &&
6988 		    (hweight16(sta->valid_links) == 1)) {
6989 			ret = ath12k_peer_ml_create(ah, sta);
6990 			if (ret) {
6991 				ath12k_hw_warn(ah, "unable to create ML peer for sta %pM",
6992 					       sta->addr);
6993 				goto exit;
6994 			}
6995 		}
6996 
6997 		ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif,
6998 						 link_id);
6999 		if (ret) {
7000 			ath12k_hw_warn(ah, "unable assign link %d for sta %pM",
7001 				       link_id, sta->addr);
7002 			goto exit;
7003 		}
7004 
7005 		/* above arsta will get memset, hence do this after assign
7006 		 * link sta
7007 		 */
7008 		if (sta->mlo) {
7009 			/* For station mode, arvif->is_sta_assoc_link has been set when
7010 			 * vdev starts. Make sure the arvif/arsta pair have same setting
7011 			 */
7012 			if (vif->type == NL80211_IFTYPE_STATION &&
7013 			    !arsta->arvif->is_sta_assoc_link) {
7014 				ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n",
7015 					       link_id);
7016 				ret = -EINVAL;
7017 				goto exit;
7018 			}
7019 
7020 			arsta->is_assoc_link = true;
7021 			ahsta->assoc_link_id = link_id;
7022 		}
7023 	}
7024 
7025 	/* In the ML station scenario, activate all partner links once the
7026 	 * client is transitioning to the associated state.
7027 	 *
7028 	 * FIXME: Ideally, this activation should occur when the client
7029 	 * transitions to the authorized state. However, there are some
7030 	 * issues with handling this in the firmware. Until the firmware
7031 	 * can manage it properly, activate the links when the client is
7032 	 * about to move to the associated state.
7033 	 */
7034 	if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7035 	    old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) {
7036 		/* TODO: for now only do link selection for single device
7037 		 * MLO case. Other cases would be handled in the future.
7038 		 */
7039 		ab = ah->radio[0].ab;
7040 		if (ab->ag->num_devices == 1) {
7041 			ret = ath12k_mac_select_links(ab, vif, hw, &selected_links);
7042 			if (ret) {
7043 				ath12k_warn(ab,
7044 					    "failed to get selected links: %d\n", ret);
7045 				goto exit;
7046 			}
7047 		} else {
7048 			selected_links = ieee80211_vif_usable_links(vif);
7049 		}
7050 
7051 		ieee80211_set_active_links(vif, selected_links);
7052 	}
7053 
7054 	/* Handle all the other state transitions in generic way */
7055 	valid_links = ahsta->links_map;
7056 	for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7057 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7058 		arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7059 		/* some assumptions went wrong! */
7060 		if (WARN_ON(!arvif || !arsta))
7061 			continue;
7062 
7063 		/* vdev might be in deleted */
7064 		if (WARN_ON(!arvif->ar))
7065 			continue;
7066 
7067 		ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta,
7068 						       old_state, new_state);
7069 		if (ret) {
7070 			ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d",
7071 				       link_id, arsta->addr, old_state, new_state);
7072 			goto exit;
7073 		}
7074 	}
7075 
7076 	if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7077 	    old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) {
7078 		for_each_ar(ah, ar, i) {
7079 			ab = ar->ab;
7080 			if (prev_ab == ab)
7081 				continue;
7082 
7083 			ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif);
7084 			if (ret) {
7085 				ath12k_warn(ab,
7086 					    "failed to update link active state on connect %d\n",
7087 					    ret);
7088 				goto exit;
7089 			}
7090 
7091 			prev_ab = ab;
7092 		}
7093 	}
7094 	/* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST:
7095 	 * Remove the station from driver (handle ML sta here since that
7096 	 * needs special handling. Normal sta will be handled in generic
7097 	 * handler below
7098 	 */
7099 	if (old_state == IEEE80211_STA_NONE &&
7100 	    new_state == IEEE80211_STA_NOTEXIST && sta->mlo)
7101 		ath12k_mac_ml_station_remove(ahvif, ahsta);
7102 
7103 	ret = 0;
7104 
7105 exit:
7106 	/* update the state if everything went well */
7107 	if (!ret)
7108 		ahsta->state = new_state;
7109 
7110 	return ret;
7111 }
7112 
ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)7113 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
7114 				       struct ieee80211_vif *vif,
7115 				       struct ieee80211_sta *sta)
7116 {
7117 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7118 	struct ath12k *ar;
7119 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7120 	struct ath12k_link_vif *arvif;
7121 	struct ath12k_link_sta *arsta;
7122 	u8 link_id;
7123 	int ret;
7124 	s16 txpwr;
7125 
7126 	lockdep_assert_wiphy(hw->wiphy);
7127 
7128 	/* TODO: use link id from mac80211 once that's implemented */
7129 	link_id = 0;
7130 
7131 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7132 	arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7133 
7134 	if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
7135 		txpwr = 0;
7136 	} else {
7137 		txpwr = sta->deflink.txpwr.power;
7138 		if (!txpwr) {
7139 			ret = -EINVAL;
7140 			goto out;
7141 		}
7142 	}
7143 
7144 	if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) {
7145 		ret = -EINVAL;
7146 		goto out;
7147 	}
7148 
7149 	ar = arvif->ar;
7150 
7151 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
7152 					WMI_PEER_USE_FIXED_PWR, txpwr);
7153 	if (ret) {
7154 		ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
7155 			    ret);
7156 		goto out;
7157 	}
7158 
7159 out:
7160 	return ret;
7161 }
7162 
ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,u32 changed)7163 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
7164 					     struct ieee80211_vif *vif,
7165 					     struct ieee80211_link_sta *link_sta,
7166 					     u32 changed)
7167 {
7168 	struct ieee80211_sta *sta = link_sta->sta;
7169 	struct ath12k *ar;
7170 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7171 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7172 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7173 	struct ath12k_link_sta *arsta;
7174 	struct ath12k_link_vif *arvif;
7175 	struct ath12k_peer *peer;
7176 	u32 bw, smps;
7177 
7178 	rcu_read_lock();
7179 	arvif = rcu_dereference(ahvif->link[link_sta->link_id]);
7180 	if (!arvif) {
7181 		ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n",
7182 			       link_sta->link_id, sta->addr);
7183 		rcu_read_unlock();
7184 		return;
7185 	}
7186 
7187 	ar = arvif->ar;
7188 
7189 	arsta = rcu_dereference(ahsta->link[link_sta->link_id]);
7190 	if (!arsta) {
7191 		rcu_read_unlock();
7192 		ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n",
7193 			    link_sta->link_id, sta->addr);
7194 		return;
7195 	}
7196 	spin_lock_bh(&ar->ab->base_lock);
7197 
7198 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
7199 	if (!peer) {
7200 		spin_unlock_bh(&ar->ab->base_lock);
7201 		rcu_read_unlock();
7202 		ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
7203 			    arsta->addr, arvif->vdev_id);
7204 		return;
7205 	}
7206 
7207 	spin_unlock_bh(&ar->ab->base_lock);
7208 
7209 	if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
7210 		rcu_read_unlock();
7211 		return;
7212 	}
7213 
7214 	link_sta = rcu_dereference(sta->link[arsta->link_id]);
7215 	if (!link_sta) {
7216 		rcu_read_unlock();
7217 		ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n",
7218 			    sta->addr, arsta->link_id);
7219 		return;
7220 	}
7221 
7222 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7223 		   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7224 		   arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss,
7225 		   link_sta->smps_mode);
7226 
7227 	spin_lock_bh(&ar->data_lock);
7228 
7229 	if (changed & IEEE80211_RC_BW_CHANGED) {
7230 		bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
7231 		arsta->bw_prev = arsta->bw;
7232 		arsta->bw = bw;
7233 	}
7234 
7235 	if (changed & IEEE80211_RC_NSS_CHANGED)
7236 		arsta->nss = link_sta->rx_nss;
7237 
7238 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
7239 		smps = WMI_PEER_SMPS_PS_NONE;
7240 
7241 		switch (link_sta->smps_mode) {
7242 		case IEEE80211_SMPS_AUTOMATIC:
7243 		case IEEE80211_SMPS_OFF:
7244 			smps = WMI_PEER_SMPS_PS_NONE;
7245 			break;
7246 		case IEEE80211_SMPS_STATIC:
7247 			smps = WMI_PEER_SMPS_STATIC;
7248 			break;
7249 		case IEEE80211_SMPS_DYNAMIC:
7250 			smps = WMI_PEER_SMPS_DYNAMIC;
7251 			break;
7252 		default:
7253 			ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n",
7254 				    link_sta->smps_mode, arsta->addr, link_sta->link_id);
7255 			smps = WMI_PEER_SMPS_PS_NONE;
7256 			break;
7257 		}
7258 
7259 		arsta->smps = smps;
7260 	}
7261 
7262 	arsta->changed |= changed;
7263 
7264 	spin_unlock_bh(&ar->data_lock);
7265 
7266 	wiphy_work_queue(hw->wiphy, &arsta->update_wk);
7267 
7268 	rcu_read_unlock();
7269 }
7270 
ath12k_mac_alloc_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_vif * ahvif,u8 link_id)7271 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah,
7272 								struct ath12k_sta *ahsta,
7273 								struct ath12k_vif *ahvif,
7274 								u8 link_id)
7275 {
7276 	struct ath12k_link_sta *arsta;
7277 	int ret;
7278 
7279 	lockdep_assert_wiphy(ah->hw->wiphy);
7280 
7281 	if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7282 		return NULL;
7283 
7284 	arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
7285 	if (arsta)
7286 		return NULL;
7287 
7288 	arsta = kmalloc(sizeof(*arsta), GFP_KERNEL);
7289 	if (!arsta)
7290 		return NULL;
7291 
7292 	ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id);
7293 	if (ret) {
7294 		kfree(arsta);
7295 		return NULL;
7296 	}
7297 
7298 	return arsta;
7299 }
7300 
ath12k_mac_op_change_sta_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u16 old_links,u16 new_links)7301 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,
7302 					  struct ieee80211_vif *vif,
7303 					  struct ieee80211_sta *sta,
7304 					  u16 old_links, u16 new_links)
7305 {
7306 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7307 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7308 	struct ath12k_hw *ah = hw->priv;
7309 	struct ath12k_link_vif *arvif;
7310 	struct ath12k_link_sta *arsta;
7311 	unsigned long valid_links;
7312 	struct ath12k *ar;
7313 	u8 link_id;
7314 	int ret;
7315 
7316 	lockdep_assert_wiphy(hw->wiphy);
7317 
7318 	if (!sta->valid_links)
7319 		return -EINVAL;
7320 
7321 	/* Firmware does not support removal of one of link stas. All sta
7322 	 * would be removed during ML STA delete in sta_state(), hence link
7323 	 * sta removal is not handled here.
7324 	 */
7325 	if (new_links < old_links)
7326 		return 0;
7327 
7328 	if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) {
7329 		ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr);
7330 		return -EINVAL;
7331 	}
7332 
7333 	/* this op is expected only after initial sta insertion with default link */
7334 	if (WARN_ON(ahsta->links_map == 0))
7335 		return -EINVAL;
7336 
7337 	valid_links = new_links;
7338 	for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7339 		if (ahsta->links_map & BIT(link_id))
7340 			continue;
7341 
7342 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7343 		arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id);
7344 
7345 		if (!arvif || !arsta) {
7346 			ath12k_hw_warn(ah, "Failed to alloc/assign link sta");
7347 			continue;
7348 		}
7349 
7350 		ar = arvif->ar;
7351 		if (!ar)
7352 			continue;
7353 
7354 		ret = ath12k_mac_station_add(ar, arvif, arsta);
7355 		if (ret) {
7356 			ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
7357 				    arsta->addr, arvif->vdev_id);
7358 			ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
7359 			return ret;
7360 		}
7361 	}
7362 
7363 	return 0;
7364 }
7365 
ath12k_mac_op_can_activate_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 active_links)7366 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw,
7367 					     struct ieee80211_vif *vif,
7368 					     u16 active_links)
7369 {
7370 	/* TODO: Handle recovery case */
7371 
7372 	return true;
7373 }
7374 
ath12k_conf_tx_uapsd(struct ath12k_link_vif * arvif,u16 ac,bool enable)7375 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif,
7376 				u16 ac, bool enable)
7377 {
7378 	struct ath12k *ar = arvif->ar;
7379 	struct ath12k_vif *ahvif = arvif->ahvif;
7380 	u32 value;
7381 	int ret;
7382 
7383 	if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
7384 		return 0;
7385 
7386 	switch (ac) {
7387 	case IEEE80211_AC_VO:
7388 		value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7389 			WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7390 		break;
7391 	case IEEE80211_AC_VI:
7392 		value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7393 			WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7394 		break;
7395 	case IEEE80211_AC_BE:
7396 		value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7397 			WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7398 		break;
7399 	case IEEE80211_AC_BK:
7400 		value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7401 			WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7402 		break;
7403 	}
7404 
7405 	if (enable)
7406 		ahvif->u.sta.uapsd |= value;
7407 	else
7408 		ahvif->u.sta.uapsd &= ~value;
7409 
7410 	ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7411 					  WMI_STA_PS_PARAM_UAPSD,
7412 					  ahvif->u.sta.uapsd);
7413 	if (ret) {
7414 		ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
7415 		goto exit;
7416 	}
7417 
7418 	if (ahvif->u.sta.uapsd)
7419 		value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7420 	else
7421 		value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7422 
7423 	ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7424 					  WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7425 					  value);
7426 	if (ret)
7427 		ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
7428 
7429 exit:
7430 	return ret;
7431 }
7432 
ath12k_mac_conf_tx(struct ath12k_link_vif * arvif,u16 ac,const struct ieee80211_tx_queue_params * params)7433 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac,
7434 			      const struct ieee80211_tx_queue_params *params)
7435 {
7436 	struct wmi_wmm_params_arg *p = NULL;
7437 	struct ath12k *ar = arvif->ar;
7438 	struct ath12k_base *ab = ar->ab;
7439 	int ret;
7440 
7441 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
7442 
7443 	switch (ac) {
7444 	case IEEE80211_AC_VO:
7445 		p = &arvif->wmm_params.ac_vo;
7446 		break;
7447 	case IEEE80211_AC_VI:
7448 		p = &arvif->wmm_params.ac_vi;
7449 		break;
7450 	case IEEE80211_AC_BE:
7451 		p = &arvif->wmm_params.ac_be;
7452 		break;
7453 	case IEEE80211_AC_BK:
7454 		p = &arvif->wmm_params.ac_bk;
7455 		break;
7456 	}
7457 
7458 	if (WARN_ON(!p)) {
7459 		ret = -EINVAL;
7460 		goto exit;
7461 	}
7462 
7463 	p->cwmin = params->cw_min;
7464 	p->cwmax = params->cw_max;
7465 	p->aifs = params->aifs;
7466 	p->txop = params->txop;
7467 
7468 	ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
7469 					     &arvif->wmm_params);
7470 	if (ret) {
7471 		ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
7472 			    ar->pdev_idx, ret);
7473 		goto exit;
7474 	}
7475 
7476 	ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
7477 	if (ret)
7478 		ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
7479 			    ar->pdev_idx, ret);
7480 
7481 exit:
7482 	return ret;
7483 }
7484 
ath12k_mac_op_conf_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,u16 ac,const struct ieee80211_tx_queue_params * params)7485 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
7486 				 struct ieee80211_vif *vif,
7487 				 unsigned int link_id, u16 ac,
7488 				 const struct ieee80211_tx_queue_params *params)
7489 {
7490 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7491 	struct ath12k_link_vif *arvif;
7492 	struct ath12k_vif_cache *cache;
7493 	int ret;
7494 
7495 	lockdep_assert_wiphy(hw->wiphy);
7496 
7497 	if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7498 		return -EINVAL;
7499 
7500 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7501 	if (!arvif || !arvif->is_created) {
7502 		cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
7503 		if (!cache)
7504 			return -ENOSPC;
7505 
7506 		cache->tx_conf.changed = true;
7507 		cache->tx_conf.ac = ac;
7508 		cache->tx_conf.tx_queue_params = *params;
7509 
7510 		return 0;
7511 	}
7512 
7513 	ret = ath12k_mac_conf_tx(arvif, ac, params);
7514 
7515 	return ret;
7516 }
7517 
7518 static struct ieee80211_sta_ht_cap
ath12k_create_ht_cap(struct ath12k * ar,u32 ar_ht_cap,u32 rate_cap_rx_chainmask)7519 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
7520 {
7521 	int i;
7522 	struct ieee80211_sta_ht_cap ht_cap = {};
7523 	u32 ar_vht_cap = ar->pdev->cap.vht_cap;
7524 
7525 	if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
7526 		return ht_cap;
7527 
7528 	ht_cap.ht_supported = 1;
7529 	ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
7530 	ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
7531 	ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7532 	ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
7533 	ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
7534 
7535 	if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
7536 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
7537 
7538 	if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
7539 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
7540 
7541 	if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
7542 		u32 smps;
7543 
7544 		smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
7545 		smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
7546 
7547 		ht_cap.cap |= smps;
7548 	}
7549 
7550 	if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
7551 		ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
7552 
7553 	if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
7554 		u32 stbc;
7555 
7556 		stbc   = ar_ht_cap;
7557 		stbc  &= WMI_HT_CAP_RX_STBC;
7558 		stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
7559 		stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
7560 		stbc  &= IEEE80211_HT_CAP_RX_STBC;
7561 
7562 		ht_cap.cap |= stbc;
7563 	}
7564 
7565 	if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
7566 		ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
7567 
7568 	if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
7569 		ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
7570 
7571 	if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
7572 		ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
7573 
7574 	for (i = 0; i < ar->num_rx_chains; i++) {
7575 		if (rate_cap_rx_chainmask & BIT(i))
7576 			ht_cap.mcs.rx_mask[i] = 0xFF;
7577 	}
7578 
7579 	ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
7580 
7581 	return ht_cap;
7582 }
7583 
ath12k_mac_set_txbf_conf(struct ath12k_link_vif * arvif)7584 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif)
7585 {
7586 	u32 value = 0;
7587 	struct ath12k *ar = arvif->ar;
7588 	struct ath12k_vif *ahvif = arvif->ahvif;
7589 	int nsts;
7590 	int sound_dim;
7591 	u32 vht_cap = ar->pdev->cap.vht_cap;
7592 	u32 vdev_param = WMI_VDEV_PARAM_TXBF;
7593 
7594 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
7595 		nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
7596 		nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
7597 		value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
7598 	}
7599 
7600 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
7601 		sound_dim = vht_cap &
7602 			    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
7603 		sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
7604 		if (sound_dim > (ar->num_tx_chains - 1))
7605 			sound_dim = ar->num_tx_chains - 1;
7606 		value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
7607 	}
7608 
7609 	if (!value)
7610 		return 0;
7611 
7612 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
7613 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
7614 
7615 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
7616 		    ahvif->vdev_type == WMI_VDEV_TYPE_AP)
7617 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
7618 	}
7619 
7620 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
7621 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
7622 
7623 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
7624 		    ahvif->vdev_type == WMI_VDEV_TYPE_STA)
7625 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
7626 	}
7627 
7628 	return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7629 					     vdev_param, value);
7630 }
7631 
ath12k_set_vht_txbf_cap(struct ath12k * ar,u32 * vht_cap)7632 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
7633 {
7634 	bool subfer, subfee;
7635 	int sound_dim = 0;
7636 
7637 	subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
7638 	subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
7639 
7640 	if (ar->num_tx_chains < 2) {
7641 		*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
7642 		subfer = false;
7643 	}
7644 
7645 	/* If SU Beaformer is not set, then disable MU Beamformer Capability */
7646 	if (!subfer)
7647 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
7648 
7649 	/* If SU Beaformee is not set, then disable MU Beamformee Capability */
7650 	if (!subfee)
7651 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
7652 
7653 	sound_dim = u32_get_bits(*vht_cap,
7654 				 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7655 	*vht_cap = u32_replace_bits(*vht_cap, 0,
7656 				    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7657 
7658 	/* TODO: Need to check invalid STS and Sound_dim values set by FW? */
7659 
7660 	/* Enable Sounding Dimension Field only if SU BF is enabled */
7661 	if (subfer) {
7662 		if (sound_dim > (ar->num_tx_chains - 1))
7663 			sound_dim = ar->num_tx_chains - 1;
7664 
7665 		*vht_cap = u32_replace_bits(*vht_cap, sound_dim,
7666 					    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7667 	}
7668 
7669 	/* Use the STS advertised by FW unless SU Beamformee is not supported*/
7670 	if (!subfee)
7671 		*vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
7672 }
7673 
7674 static struct ieee80211_sta_vht_cap
ath12k_create_vht_cap(struct ath12k * ar,u32 rate_cap_tx_chainmask,u32 rate_cap_rx_chainmask)7675 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
7676 		      u32 rate_cap_rx_chainmask)
7677 {
7678 	struct ieee80211_sta_vht_cap vht_cap = {};
7679 	u16 txmcs_map, rxmcs_map;
7680 	int i;
7681 
7682 	vht_cap.vht_supported = 1;
7683 	vht_cap.cap = ar->pdev->cap.vht_cap;
7684 
7685 	ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
7686 
7687 	/* 80P80 is not supported */
7688 	vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
7689 
7690 	rxmcs_map = 0;
7691 	txmcs_map = 0;
7692 	for (i = 0; i < 8; i++) {
7693 		if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
7694 			txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7695 		else
7696 			txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7697 
7698 		if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
7699 			rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7700 		else
7701 			rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7702 	}
7703 
7704 	if (rate_cap_tx_chainmask <= 1)
7705 		vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
7706 
7707 	vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
7708 	vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
7709 
7710 	/* Check if the HW supports 1:1 NSS ratio and reset
7711 	 * EXT NSS BW Support field to 0 to indicate 1:1 ratio
7712 	 */
7713 	if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS)
7714 		vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK;
7715 
7716 	return vht_cap;
7717 }
7718 
ath12k_mac_setup_ht_vht_cap(struct ath12k * ar,struct ath12k_pdev_cap * cap,u32 * ht_cap_info)7719 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
7720 					struct ath12k_pdev_cap *cap,
7721 					u32 *ht_cap_info)
7722 {
7723 	struct ieee80211_supported_band *band;
7724 	u32 rate_cap_tx_chainmask;
7725 	u32 rate_cap_rx_chainmask;
7726 	u32 ht_cap;
7727 
7728 	rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
7729 	rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
7730 
7731 	if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
7732 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7733 		ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
7734 		if (ht_cap_info)
7735 			*ht_cap_info = ht_cap;
7736 		band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7737 						    rate_cap_rx_chainmask);
7738 	}
7739 
7740 	if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
7741 	    (ar->ab->hw_params->single_pdev_only ||
7742 	     !ar->supports_6ghz)) {
7743 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7744 		ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
7745 		if (ht_cap_info)
7746 			*ht_cap_info = ht_cap;
7747 		band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7748 						    rate_cap_rx_chainmask);
7749 		band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
7750 						      rate_cap_rx_chainmask);
7751 	}
7752 }
7753 
ath12k_check_chain_mask(struct ath12k * ar,u32 ant,bool is_tx_ant)7754 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
7755 {
7756 	/* TODO: Check the request chainmask against the supported
7757 	 * chainmask table which is advertised in extented_service_ready event
7758 	 */
7759 
7760 	return 0;
7761 }
7762 
ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,u8 * he_ppet)7763 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
7764 				  u8 *he_ppet)
7765 {
7766 	int nss, ru;
7767 	u8 bit = 7;
7768 
7769 	he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
7770 	he_ppet[0] |= (fw_ppet->ru_bit_mask <<
7771 		       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
7772 		      IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
7773 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
7774 		for (ru = 0; ru < 4; ru++) {
7775 			u8 val;
7776 			int i;
7777 
7778 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
7779 				continue;
7780 			val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
7781 			       0x3f;
7782 			val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
7783 			for (i = 5; i >= 0; i--) {
7784 				he_ppet[bit / 8] |=
7785 					((val >> i) & 0x1) << ((bit % 8));
7786 				bit++;
7787 			}
7788 		}
7789 	}
7790 }
7791 
7792 static void
ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem * he_cap_elem)7793 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
7794 {
7795 	u8 m;
7796 
7797 	m = IEEE80211_HE_MAC_CAP0_TWT_RES |
7798 	    IEEE80211_HE_MAC_CAP0_TWT_REQ;
7799 	he_cap_elem->mac_cap_info[0] &= ~m;
7800 
7801 	m = IEEE80211_HE_MAC_CAP2_TRS |
7802 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7803 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7804 	he_cap_elem->mac_cap_info[2] &= ~m;
7805 
7806 	m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
7807 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7808 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7809 	he_cap_elem->mac_cap_info[3] &= ~m;
7810 
7811 	m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
7812 	    IEEE80211_HE_MAC_CAP4_BQR;
7813 	he_cap_elem->mac_cap_info[4] &= ~m;
7814 
7815 	m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
7816 	    IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
7817 	    IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
7818 	    IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
7819 	he_cap_elem->mac_cap_info[5] &= ~m;
7820 
7821 	m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
7822 	    IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
7823 	he_cap_elem->phy_cap_info[2] &= ~m;
7824 
7825 	m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
7826 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
7827 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
7828 	he_cap_elem->phy_cap_info[3] &= ~m;
7829 
7830 	m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
7831 	he_cap_elem->phy_cap_info[4] &= ~m;
7832 
7833 	m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
7834 	he_cap_elem->phy_cap_info[5] &= ~m;
7835 
7836 	m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
7837 	    IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
7838 	    IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
7839 	    IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
7840 	he_cap_elem->phy_cap_info[6] &= ~m;
7841 
7842 	m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
7843 	    IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
7844 	    IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
7845 	    IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
7846 	he_cap_elem->phy_cap_info[7] &= ~m;
7847 
7848 	m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
7849 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
7850 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
7851 	    IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
7852 	he_cap_elem->phy_cap_info[8] &= ~m;
7853 
7854 	m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
7855 	    IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
7856 	    IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
7857 	    IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
7858 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
7859 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
7860 	he_cap_elem->phy_cap_info[9] &= ~m;
7861 }
7862 
ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap * pcap,struct ath12k_band_cap * bcap)7863 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
7864 					   struct ath12k_band_cap *bcap)
7865 {
7866 	u8 val;
7867 
7868 	bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
7869 	if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
7870 		bcap->he_6ghz_capa |=
7871 			u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
7872 					IEEE80211_HE_6GHZ_CAP_SM_PS);
7873 	else
7874 		bcap->he_6ghz_capa |=
7875 			u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
7876 					IEEE80211_HE_6GHZ_CAP_SM_PS);
7877 	val = u32_get_bits(pcap->vht_cap,
7878 			   IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
7879 	bcap->he_6ghz_capa |=
7880 		u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
7881 	val = u32_get_bits(pcap->vht_cap,
7882 			   IEEE80211_VHT_CAP_MAX_MPDU_MASK);
7883 	bcap->he_6ghz_capa |=
7884 		u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
7885 	if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
7886 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
7887 	if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
7888 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
7889 
7890 	return cpu_to_le16(bcap->he_6ghz_capa);
7891 }
7892 
ath12k_mac_set_hemcsmap(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sta_he_cap * he_cap)7893 static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
7894 				    struct ath12k_pdev_cap *cap,
7895 				    struct ieee80211_sta_he_cap *he_cap)
7896 {
7897 	struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
7898 	u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
7899 	u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains);
7900 	u16 txmcs_map_160 = 0, rxmcs_map_160 = 0;
7901 	u16 txmcs_map = 0, rxmcs_map = 0;
7902 	u32 i;
7903 
7904 	for (i = 0; i < 8; i++) {
7905 		if (i < ar->num_tx_chains &&
7906 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7907 			txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7908 		else
7909 			txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7910 
7911 		if (i < ar->num_rx_chains &&
7912 		    (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7913 			rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7914 		else
7915 			rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7916 
7917 		if (i < maxtxnss_160 &&
7918 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7919 			txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7920 		else
7921 			txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7922 
7923 		if (i < maxrxnss_160 &&
7924 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7925 			rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7926 		else
7927 			rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7928 	}
7929 
7930 	mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
7931 	mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
7932 	mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff);
7933 	mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff);
7934 }
7935 
ath12k_mac_copy_he_cap(struct ath12k * ar,struct ath12k_band_cap * band_cap,int iftype,u8 num_tx_chains,struct ieee80211_sta_he_cap * he_cap)7936 static void ath12k_mac_copy_he_cap(struct ath12k *ar,
7937 				   struct ath12k_band_cap *band_cap,
7938 				   int iftype, u8 num_tx_chains,
7939 				   struct ieee80211_sta_he_cap *he_cap)
7940 {
7941 	struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
7942 
7943 	he_cap->has_he = true;
7944 	memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
7945 	       sizeof(he_cap_elem->mac_cap_info));
7946 	memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
7947 	       sizeof(he_cap_elem->phy_cap_info));
7948 
7949 	he_cap_elem->mac_cap_info[1] &=
7950 		IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
7951 	he_cap_elem->phy_cap_info[0] &=
7952 		IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7953 		IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7954 		IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
7955 	/* 80PLUS80 is not supported */
7956 	he_cap_elem->phy_cap_info[0] &=
7957 		~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
7958 	he_cap_elem->phy_cap_info[5] &=
7959 		~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
7960 	he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
7961 
7962 	switch (iftype) {
7963 	case NL80211_IFTYPE_AP:
7964 		he_cap_elem->mac_cap_info[2] &=
7965 			~IEEE80211_HE_MAC_CAP2_BCAST_TWT;
7966 		he_cap_elem->phy_cap_info[3] &=
7967 			~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
7968 		he_cap_elem->phy_cap_info[9] |=
7969 			IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
7970 		break;
7971 	case NL80211_IFTYPE_STATION:
7972 		he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
7973 		he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
7974 		he_cap_elem->phy_cap_info[9] |=
7975 			IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
7976 		break;
7977 	case NL80211_IFTYPE_MESH_POINT:
7978 		ath12k_mac_filter_he_cap_mesh(he_cap_elem);
7979 		break;
7980 	}
7981 
7982 	ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
7983 	memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
7984 	if (he_cap_elem->phy_cap_info[6] &
7985 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
7986 		ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
7987 }
7988 
7989 static void
ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap * band_cap,struct ieee80211_eht_mcs_nss_supp * mcs_nss,const struct ieee80211_he_cap_elem * he_cap,const struct ieee80211_eht_cap_elem_fixed * eht_cap)7990 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
7991 			    struct ieee80211_eht_mcs_nss_supp *mcs_nss,
7992 			    const struct ieee80211_he_cap_elem *he_cap,
7993 			    const struct ieee80211_eht_cap_elem_fixed *eht_cap)
7994 {
7995 	if ((he_cap->phy_cap_info[0] &
7996 	     (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7997 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7998 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
7999 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
8000 		memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
8001 		       sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
8002 
8003 	if (he_cap->phy_cap_info[0] &
8004 	    (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8005 	     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
8006 		memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
8007 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8008 
8009 	if (he_cap->phy_cap_info[0] &
8010 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8011 		memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
8012 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8013 
8014 	if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
8015 		memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
8016 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8017 }
8018 
ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,struct ieee80211_sta_eht_cap * cap)8019 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
8020 					   struct ieee80211_sta_eht_cap *cap)
8021 {
8022 	u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
8023 	u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
8024 
8025 	u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
8026 			 IEEE80211_EHT_PPE_THRES_NSS_MASK);
8027 
8028 	u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
8029 			  IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8030 
8031 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
8032 		for (ru = 0;
8033 		     ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8034 		     ru++) {
8035 			u32 val = 0;
8036 
8037 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
8038 				continue;
8039 
8040 			u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
8041 						(ru * ppet_bit_len_per_ru),
8042 					  GENMASK(ppet_bit_len_per_ru - 1, 0));
8043 
8044 			for (i = 0; i < ppet_bit_len_per_ru; i++) {
8045 				cap->eht_ppe_thres[bit / 8] |=
8046 					(((val >> i) & 0x1) << ((bit % 8)));
8047 				bit++;
8048 			}
8049 		}
8050 	}
8051 }
8052 
8053 static void
ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed * eht_cap_elem)8054 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
8055 			       *eht_cap_elem)
8056 {
8057 	u8 m;
8058 
8059 	m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
8060 	eht_cap_elem->mac_cap_info[0] &= ~m;
8061 
8062 	m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
8063 	eht_cap_elem->phy_cap_info[0] &= ~m;
8064 
8065 	m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
8066 	    IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
8067 	    IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
8068 	    IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
8069 	eht_cap_elem->phy_cap_info[3] &= ~m;
8070 
8071 	m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
8072 	    IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
8073 	    IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
8074 	    IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
8075 	eht_cap_elem->phy_cap_info[4] &= ~m;
8076 
8077 	m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
8078 	    IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
8079 	    IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
8080 	    IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
8081 	eht_cap_elem->phy_cap_info[5] &= ~m;
8082 
8083 	m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
8084 	eht_cap_elem->phy_cap_info[6] &= ~m;
8085 
8086 	m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8087 	    IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8088 	    IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
8089 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8090 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8091 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
8092 	eht_cap_elem->phy_cap_info[7] &= ~m;
8093 }
8094 
ath12k_mac_copy_eht_cap(struct ath12k * ar,struct ath12k_band_cap * band_cap,struct ieee80211_he_cap_elem * he_cap_elem,int iftype,struct ieee80211_sta_eht_cap * eht_cap)8095 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
8096 				    struct ath12k_band_cap *band_cap,
8097 				    struct ieee80211_he_cap_elem *he_cap_elem,
8098 				    int iftype,
8099 				    struct ieee80211_sta_eht_cap *eht_cap)
8100 {
8101 	struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
8102 
8103 	memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
8104 
8105 	if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) ||
8106 	    ath12k_acpi_get_disable_11be(ar->ab))
8107 		return;
8108 
8109 	eht_cap->has_eht = true;
8110 	memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
8111 	       sizeof(eht_cap_elem->mac_cap_info));
8112 	memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
8113 	       sizeof(eht_cap_elem->phy_cap_info));
8114 
8115 	switch (iftype) {
8116 	case NL80211_IFTYPE_AP:
8117 		eht_cap_elem->phy_cap_info[0] &=
8118 			~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
8119 		eht_cap_elem->phy_cap_info[4] &=
8120 			~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
8121 		eht_cap_elem->phy_cap_info[5] &=
8122 			~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
8123 		break;
8124 	case NL80211_IFTYPE_STATION:
8125 		eht_cap_elem->phy_cap_info[7] &=
8126 			~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8127 			  IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8128 			  IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
8129 		eht_cap_elem->phy_cap_info[7] &=
8130 			~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8131 			  IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8132 			  IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
8133 		break;
8134 	case NL80211_IFTYPE_MESH_POINT:
8135 		ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
8136 		break;
8137 	default:
8138 		break;
8139 	}
8140 
8141 	ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
8142 				    he_cap_elem, eht_cap_elem);
8143 
8144 	if (eht_cap_elem->phy_cap_info[5] &
8145 	    IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
8146 		ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
8147 }
8148 
ath12k_mac_copy_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sband_iftype_data * data,int band)8149 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
8150 					     struct ath12k_pdev_cap *cap,
8151 					     struct ieee80211_sband_iftype_data *data,
8152 					     int band)
8153 {
8154 	struct ath12k_band_cap *band_cap = &cap->band[band];
8155 	int i, idx = 0;
8156 
8157 	for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
8158 		struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
8159 
8160 		switch (i) {
8161 		case NL80211_IFTYPE_STATION:
8162 		case NL80211_IFTYPE_AP:
8163 		case NL80211_IFTYPE_MESH_POINT:
8164 			break;
8165 
8166 		default:
8167 			continue;
8168 		}
8169 
8170 		data[idx].types_mask = BIT(i);
8171 
8172 		ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
8173 		if (band == NL80211_BAND_6GHZ) {
8174 			data[idx].he_6ghz_capa.capa =
8175 				ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
8176 		}
8177 		ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
8178 					&data[idx].eht_cap);
8179 		idx++;
8180 	}
8181 
8182 	return idx;
8183 }
8184 
ath12k_mac_setup_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap)8185 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
8186 					       struct ath12k_pdev_cap *cap)
8187 {
8188 	struct ieee80211_supported_band *sband;
8189 	enum nl80211_band band;
8190 	int count;
8191 
8192 	if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
8193 		band = NL80211_BAND_2GHZ;
8194 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8195 							  ar->mac.iftype[band],
8196 							  band);
8197 		sband = &ar->mac.sbands[band];
8198 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8199 						 count);
8200 	}
8201 
8202 	if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
8203 		band = NL80211_BAND_5GHZ;
8204 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8205 							  ar->mac.iftype[band],
8206 							  band);
8207 		sband = &ar->mac.sbands[band];
8208 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8209 						 count);
8210 	}
8211 
8212 	if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
8213 	    ar->supports_6ghz) {
8214 		band = NL80211_BAND_6GHZ;
8215 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8216 							  ar->mac.iftype[band],
8217 							  band);
8218 		sband = &ar->mac.sbands[band];
8219 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8220 						 count);
8221 	}
8222 }
8223 
__ath12k_set_antenna(struct ath12k * ar,u32 tx_ant,u32 rx_ant)8224 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
8225 {
8226 	struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
8227 	int ret;
8228 
8229 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8230 
8231 	if (ath12k_check_chain_mask(ar, tx_ant, true))
8232 		return -EINVAL;
8233 
8234 	if (ath12k_check_chain_mask(ar, rx_ant, false))
8235 		return -EINVAL;
8236 
8237 	/* Since we advertised the max cap of all radios combined during wiphy
8238 	 * registration, ensure we don't set the antenna config higher than the
8239 	 * limits
8240 	 */
8241 	tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask);
8242 	rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask);
8243 
8244 	ar->cfg_tx_chainmask = tx_ant;
8245 	ar->cfg_rx_chainmask = rx_ant;
8246 
8247 	if (ah->state != ATH12K_HW_STATE_ON &&
8248 	    ah->state != ATH12K_HW_STATE_RESTARTED)
8249 		return 0;
8250 
8251 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
8252 					tx_ant, ar->pdev->pdev_id);
8253 	if (ret) {
8254 		ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
8255 			    ret, tx_ant);
8256 		return ret;
8257 	}
8258 
8259 	ar->num_tx_chains = hweight32(tx_ant);
8260 
8261 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
8262 					rx_ant, ar->pdev->pdev_id);
8263 	if (ret) {
8264 		ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
8265 			    ret, rx_ant);
8266 		return ret;
8267 	}
8268 
8269 	ar->num_rx_chains = hweight32(rx_ant);
8270 
8271 	/* Reload HT/VHT/HE capability */
8272 	ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
8273 	ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
8274 
8275 	return 0;
8276 }
8277 
ath12k_mgmt_over_wmi_tx_drop(struct ath12k * ar,struct sk_buff * skb)8278 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
8279 {
8280 	int num_mgmt;
8281 
8282 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8283 
8284 	ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
8285 
8286 	num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
8287 
8288 	if (num_mgmt < 0)
8289 		WARN_ON_ONCE(1);
8290 
8291 	if (!num_mgmt)
8292 		wake_up(&ar->txmgmt_empty_waitq);
8293 }
8294 
ath12k_mac_tx_mgmt_pending_free(int buf_id,void * skb,void * ctx)8295 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
8296 {
8297 	struct sk_buff *msdu = skb;
8298 	struct ieee80211_tx_info *info;
8299 	struct ath12k *ar = ctx;
8300 	struct ath12k_base *ab = ar->ab;
8301 
8302 	spin_lock_bh(&ar->txmgmt_idr_lock);
8303 	idr_remove(&ar->txmgmt_idr, buf_id);
8304 	spin_unlock_bh(&ar->txmgmt_idr_lock);
8305 	dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
8306 			 DMA_TO_DEVICE);
8307 
8308 	info = IEEE80211_SKB_CB(msdu);
8309 	memset(&info->status, 0, sizeof(info->status));
8310 
8311 	ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8312 
8313 	return 0;
8314 }
8315 
ath12k_mac_vif_txmgmt_idr_remove(int buf_id,void * skb,void * ctx)8316 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
8317 {
8318 	struct ieee80211_vif *vif = ctx;
8319 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8320 	struct sk_buff *msdu = skb;
8321 	struct ath12k *ar = skb_cb->ar;
8322 	struct ath12k_base *ab = ar->ab;
8323 
8324 	if (skb_cb->vif == vif) {
8325 		spin_lock_bh(&ar->txmgmt_idr_lock);
8326 		idr_remove(&ar->txmgmt_idr, buf_id);
8327 		spin_unlock_bh(&ar->txmgmt_idr_lock);
8328 		dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
8329 				 DMA_TO_DEVICE);
8330 	}
8331 
8332 	return 0;
8333 }
8334 
ath12k_mac_mgmt_tx_wmi(struct ath12k * ar,struct ath12k_link_vif * arvif,struct sk_buff * skb)8335 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif,
8336 				  struct sk_buff *skb)
8337 {
8338 	struct ath12k_base *ab = ar->ab;
8339 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8340 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8341 	struct ieee80211_tx_info *info;
8342 	enum hal_encrypt_type enctype;
8343 	unsigned int mic_len;
8344 	dma_addr_t paddr;
8345 	int buf_id;
8346 	int ret;
8347 
8348 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8349 
8350 	skb_cb->ar = ar;
8351 	spin_lock_bh(&ar->txmgmt_idr_lock);
8352 	buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
8353 			   ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
8354 	spin_unlock_bh(&ar->txmgmt_idr_lock);
8355 	if (buf_id < 0)
8356 		return -ENOSPC;
8357 
8358 	info = IEEE80211_SKB_CB(skb);
8359 	if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8360 	    !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
8361 		if ((ieee80211_is_action(hdr->frame_control) ||
8362 		     ieee80211_is_deauth(hdr->frame_control) ||
8363 		     ieee80211_is_disassoc(hdr->frame_control)) &&
8364 		     ieee80211_has_protected(hdr->frame_control)) {
8365 			enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
8366 			mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype);
8367 			skb_put(skb, mic_len);
8368 		}
8369 	}
8370 
8371 	paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
8372 	if (dma_mapping_error(ab->dev, paddr)) {
8373 		ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
8374 		ret = -EIO;
8375 		goto err_free_idr;
8376 	}
8377 
8378 	skb_cb->paddr = paddr;
8379 
8380 	ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb);
8381 	if (ret) {
8382 		ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
8383 		goto err_unmap_buf;
8384 	}
8385 
8386 	return 0;
8387 
8388 err_unmap_buf:
8389 	dma_unmap_single(ab->dev, skb_cb->paddr,
8390 			 skb->len, DMA_TO_DEVICE);
8391 err_free_idr:
8392 	spin_lock_bh(&ar->txmgmt_idr_lock);
8393 	idr_remove(&ar->txmgmt_idr, buf_id);
8394 	spin_unlock_bh(&ar->txmgmt_idr_lock);
8395 
8396 	return ret;
8397 }
8398 
ath12k_mgmt_over_wmi_tx_purge(struct ath12k * ar)8399 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
8400 {
8401 	struct sk_buff *skb;
8402 
8403 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
8404 		ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8405 }
8406 
ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8407 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8408 						       struct sk_buff *skb)
8409 {
8410 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8411 	u8 category, *buf, iv_len, action_code, dialog_token;
8412 	struct ieee80211_bss_conf *link_conf;
8413 	struct ieee80211_chanctx_conf *conf;
8414 	int cur_tx_power, max_tx_power;
8415 	struct ath12k *ar = arvif->ar;
8416 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
8417 	struct wiphy *wiphy = hw->wiphy;
8418 	struct ath12k_skb_cb *skb_cb;
8419 	struct ieee80211_mgmt *mgmt;
8420 	unsigned int remaining_len;
8421 	bool has_protected;
8422 
8423 	lockdep_assert_wiphy(wiphy);
8424 
8425 	/* make sure category field is present */
8426 	if (skb->len < IEEE80211_MIN_ACTION_SIZE)
8427 		return -EINVAL;
8428 
8429 	remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE;
8430 	has_protected = ieee80211_has_protected(hdr->frame_control);
8431 
8432 	/* In case of SW crypto and hdr protected (PMF), packet will already be encrypted,
8433 	 * we can't put in data in this case
8434 	 */
8435 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8436 	    has_protected)
8437 		return 0;
8438 
8439 	mgmt = (struct ieee80211_mgmt *)hdr;
8440 	buf = (u8 *)&mgmt->u.action;
8441 
8442 	/* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that
8443 	 * many bytes if it is there
8444 	 */
8445 	if (has_protected) {
8446 		skb_cb = ATH12K_SKB_CB(skb);
8447 
8448 		switch (skb_cb->cipher) {
8449 		/* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in
8450 		 * key needs to be processed. See ath12k_install_key()
8451 		 */
8452 		case WLAN_CIPHER_SUITE_CCMP:
8453 		case WLAN_CIPHER_SUITE_CCMP_256:
8454 		case WLAN_CIPHER_SUITE_GCMP:
8455 		case WLAN_CIPHER_SUITE_GCMP_256:
8456 			iv_len = IEEE80211_CCMP_HDR_LEN;
8457 			break;
8458 		case WLAN_CIPHER_SUITE_TKIP:
8459 			iv_len = 0;
8460 			break;
8461 		default:
8462 			return -EINVAL;
8463 		}
8464 
8465 		if (remaining_len < iv_len)
8466 			return -EINVAL;
8467 
8468 		buf += iv_len;
8469 		remaining_len -= iv_len;
8470 	}
8471 
8472 	category = *buf++;
8473 	/* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence
8474 	 * no need to adjust remaining_len
8475 	 */
8476 
8477 	switch (category) {
8478 	case WLAN_CATEGORY_RADIO_MEASUREMENT:
8479 		/* need action code and dialog token */
8480 		if (remaining_len < 2)
8481 			return -EINVAL;
8482 
8483 		/* Packet Format:
8484 		 *	Action Code | Dialog Token | Variable Len (based on Action Code)
8485 		 */
8486 		action_code = *buf++;
8487 		dialog_token = *buf++;
8488 		remaining_len -= 2;
8489 
8490 		link_conf = ath12k_mac_get_link_bss_conf(arvif);
8491 		if (!link_conf) {
8492 			ath12k_warn(ar->ab,
8493 				    "failed to get bss link conf for vdev %d in RM handling\n",
8494 				    arvif->vdev_id);
8495 			return -EINVAL;
8496 		}
8497 
8498 		conf = wiphy_dereference(wiphy, link_conf->chanctx_conf);
8499 		if (!conf)
8500 			return -ENOENT;
8501 
8502 		cur_tx_power = link_conf->txpower;
8503 		max_tx_power = min(conf->def.chan->max_reg_power,
8504 				   (int)ar->max_tx_power / 2);
8505 
8506 		ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id,
8507 					  &cur_tx_power);
8508 
8509 		switch (action_code) {
8510 		case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST:
8511 			/* need variable fields to be present in len */
8512 			if (remaining_len < 2)
8513 				return -EINVAL;
8514 
8515 			/* Variable length format as defined in IEEE 802.11-2024,
8516 			 * Figure 9-1187-Link Measurement Request frame Action field
8517 			 * format.
8518 			 *	Transmit Power | Max Tx Power
8519 			 * We fill both of these.
8520 			 */
8521 			*buf++ = cur_tx_power;
8522 			*buf = max_tx_power;
8523 
8524 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8525 				   "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n",
8526 				   dialog_token, cur_tx_power, max_tx_power);
8527 			break;
8528 		case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT:
8529 			/* need variable fields to be present in len */
8530 			if (remaining_len < 3)
8531 				return -EINVAL;
8532 
8533 			/* Variable length format as defined in IEEE 802.11-2024,
8534 			 * Figure 9-1188-Link Measurement Report frame Action field format
8535 			 *	TPC Report | Variable Fields
8536 			 *
8537 			 * TPC Report Format:
8538 			 *	Element ID | Len | Tx Power | Link Margin
8539 			 *
8540 			 * We fill Tx power in the TPC Report (2nd index)
8541 			 */
8542 			buf[2] = cur_tx_power;
8543 
8544 			/* TODO: At present, Link margin data is not present so can't
8545 			 * really fill it now. Once it is available, it can be added
8546 			 * here
8547 			 */
8548 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8549 				   "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n",
8550 				   dialog_token, cur_tx_power);
8551 			break;
8552 		default:
8553 			return -EINVAL;
8554 		}
8555 		break;
8556 	default:
8557 		/* nothing to fill */
8558 		return 0;
8559 	}
8560 
8561 	return 0;
8562 }
8563 
ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8564 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8565 						struct sk_buff *skb)
8566 {
8567 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8568 
8569 	if (!ieee80211_is_action(hdr->frame_control))
8570 		return 0;
8571 
8572 	return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb);
8573 }
8574 
ath12k_mgmt_over_wmi_tx_work(struct wiphy * wiphy,struct wiphy_work * work)8575 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work)
8576 {
8577 	struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
8578 	struct ath12k_hw *ah = ar->ah;
8579 	struct ath12k_skb_cb *skb_cb;
8580 	struct ath12k_vif *ahvif;
8581 	struct ath12k_link_vif *arvif;
8582 	struct sk_buff *skb;
8583 	int ret;
8584 
8585 	lockdep_assert_wiphy(wiphy);
8586 
8587 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
8588 		skb_cb = ATH12K_SKB_CB(skb);
8589 		if (!skb_cb->vif) {
8590 			ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
8591 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8592 			continue;
8593 		}
8594 
8595 		ahvif = ath12k_vif_to_ahvif(skb_cb->vif);
8596 		if (!(ahvif->links_map & BIT(skb_cb->link_id))) {
8597 			ath12k_warn(ar->ab,
8598 				    "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n",
8599 				    skb_cb->link_id, ahvif->links_map);
8600 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8601 			continue;
8602 		}
8603 
8604 		arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]);
8605 		if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
8606 			/* Fill in the data which is required to be filled by the driver
8607 			 * For example: Max Tx power in Link Measurement Request/Report
8608 			 */
8609 			ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb);
8610 			if (ret) {
8611 				/* If we couldn't fill the data due to any reason,
8612 				 * let's not discard transmitting the packet.
8613 				 * For example: Software crypto and PMF case
8614 				 */
8615 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8616 					   "Failed to fill the required data for the mgmt packet err %d\n",
8617 					   ret);
8618 			}
8619 
8620 			ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
8621 			if (ret) {
8622 				ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
8623 					    arvif->vdev_id, ret);
8624 				ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8625 			}
8626 		} else {
8627 			ath12k_warn(ar->ab,
8628 				    "dropping mgmt frame for vdev %d link %u is_started %d\n",
8629 				    arvif->vdev_id,
8630 				    skb_cb->link_id,
8631 				    arvif->is_started);
8632 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8633 		}
8634 	}
8635 }
8636 
ath12k_mac_mgmt_tx(struct ath12k * ar,struct sk_buff * skb,bool is_prb_rsp)8637 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
8638 			      bool is_prb_rsp)
8639 {
8640 	struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
8641 
8642 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
8643 		return -ESHUTDOWN;
8644 
8645 	/* Drop probe response packets when the pending management tx
8646 	 * count has reached a certain threshold, so as to prioritize
8647 	 * other mgmt packets like auth and assoc to be sent on time
8648 	 * for establishing successful connections.
8649 	 */
8650 	if (is_prb_rsp &&
8651 	    atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
8652 		ath12k_warn(ar->ab,
8653 			    "dropping probe response as pending queue is almost full\n");
8654 		return -ENOSPC;
8655 	}
8656 
8657 	if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
8658 		ath12k_warn(ar->ab, "mgmt tx queue is full\n");
8659 		return -ENOSPC;
8660 	}
8661 
8662 	skb_queue_tail(q, skb);
8663 	atomic_inc(&ar->num_pending_mgmt_tx);
8664 	wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8665 
8666 	return 0;
8667 }
8668 
ath12k_mac_add_p2p_noa_ie(struct ath12k * ar,struct ieee80211_vif * vif,struct sk_buff * skb,bool is_prb_rsp)8669 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
8670 				      struct ieee80211_vif *vif,
8671 				      struct sk_buff *skb,
8672 				      bool is_prb_rsp)
8673 {
8674 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8675 
8676 	if (likely(!is_prb_rsp))
8677 		return;
8678 
8679 	spin_lock_bh(&ar->data_lock);
8680 
8681 	if (ahvif->u.ap.noa_data &&
8682 	    !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len,
8683 			      GFP_ATOMIC))
8684 		skb_put_data(skb, ahvif->u.ap.noa_data,
8685 			     ahvif->u.ap.noa_len);
8686 
8687 	spin_unlock_bh(&ar->data_lock);
8688 }
8689 
8690 /* Note: called under rcu_read_lock() */
ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif * vif,u8 link_id,struct sk_buff * skb,u32 info_flags)8691 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif,
8692 						    u8 link_id, struct sk_buff *skb,
8693 						    u32 info_flags)
8694 {
8695 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8696 	struct ieee80211_bss_conf *bss_conf;
8697 
8698 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8699 		return;
8700 
8701 	bss_conf = rcu_dereference(vif->link_conf[link_id]);
8702 	if (bss_conf)
8703 		ether_addr_copy(hdr->addr2, bss_conf->addr);
8704 }
8705 
8706 /* Note: called under rcu_read_lock() */
ath12k_mac_get_tx_link(struct ieee80211_sta * sta,struct ieee80211_vif * vif,u8 link,struct sk_buff * skb,u32 info_flags)8707 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
8708 				 u8 link, struct sk_buff *skb, u32 info_flags)
8709 {
8710 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8711 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8712 	struct ieee80211_link_sta *link_sta;
8713 	struct ieee80211_bss_conf *bss_conf;
8714 	struct ath12k_sta *ahsta;
8715 
8716 	/* Use the link id passed or the default vif link */
8717 	if (!sta) {
8718 		if (link != IEEE80211_LINK_UNSPECIFIED)
8719 			return link;
8720 
8721 		return ahvif->deflink.link_id;
8722 	}
8723 
8724 	ahsta = ath12k_sta_to_ahsta(sta);
8725 
8726 	/* Below translation ensures we pass proper A2 & A3 for non ML clients.
8727 	 * Also it assumes for now support only for MLO AP in this path
8728 	 */
8729 	if (!sta->mlo) {
8730 		link = ahsta->deflink.link_id;
8731 
8732 		if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8733 			return link;
8734 
8735 		bss_conf = rcu_dereference(vif->link_conf[link]);
8736 		if (bss_conf) {
8737 			ether_addr_copy(hdr->addr2, bss_conf->addr);
8738 			if (!ieee80211_has_tods(hdr->frame_control) &&
8739 			    !ieee80211_has_fromds(hdr->frame_control))
8740 				ether_addr_copy(hdr->addr3, bss_conf->addr);
8741 		}
8742 
8743 		return link;
8744 	}
8745 
8746 	/* enqueue eth enacap & data frames on primary link, FW does link
8747 	 * selection and address translation.
8748 	 */
8749 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
8750 	    ieee80211_is_data(hdr->frame_control))
8751 		return ahsta->assoc_link_id;
8752 
8753 	/* 802.11 frame cases */
8754 	if (link == IEEE80211_LINK_UNSPECIFIED)
8755 		link = ahsta->deflink.link_id;
8756 
8757 	if (!ieee80211_is_mgmt(hdr->frame_control))
8758 		return link;
8759 
8760 	/* Perform address conversion for ML STA Tx */
8761 	bss_conf = rcu_dereference(vif->link_conf[link]);
8762 	link_sta = rcu_dereference(sta->link[link]);
8763 
8764 	if (bss_conf && link_sta) {
8765 		ether_addr_copy(hdr->addr1, link_sta->addr);
8766 		ether_addr_copy(hdr->addr2, bss_conf->addr);
8767 
8768 		if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8769 			ether_addr_copy(hdr->addr3, bss_conf->bssid);
8770 		else if (vif->type == NL80211_IFTYPE_AP)
8771 			ether_addr_copy(hdr->addr3, bss_conf->addr);
8772 
8773 		return link;
8774 	}
8775 
8776 	if (bss_conf) {
8777 		/* In certain cases where a ML sta associated and added subset of
8778 		 * links on which the ML AP is active, but now sends some frame
8779 		 * (ex. Probe request) on a different link which is active in our
8780 		 * MLD but was not added during previous association, we can
8781 		 * still honor the Tx to that ML STA via the requested link.
8782 		 * The control would reach here in such case only when that link
8783 		 * address is same as the MLD address or in worst case clients
8784 		 * used MLD address at TA wrongly which would have helped
8785 		 * identify the ML sta object and pass it here.
8786 		 * If the link address of that STA is different from MLD address,
8787 		 * then the sta object would be NULL and control won't reach
8788 		 * here but return at the start of the function itself with !sta
8789 		 * check. Also this would not need any translation at hdr->addr1
8790 		 * from MLD to link address since the RA is the MLD address
8791 		 * (same as that link address ideally) already.
8792 		 */
8793 		ether_addr_copy(hdr->addr2, bss_conf->addr);
8794 
8795 		if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8796 			ether_addr_copy(hdr->addr3, bss_conf->bssid);
8797 		else if (vif->type == NL80211_IFTYPE_AP)
8798 			ether_addr_copy(hdr->addr3, bss_conf->addr);
8799 	}
8800 
8801 	return link;
8802 }
8803 
8804 /* Note: called under rcu_read_lock() */
ath12k_mac_op_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)8805 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
8806 			     struct ieee80211_tx_control *control,
8807 			     struct sk_buff *skb)
8808 {
8809 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8810 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
8811 	struct ieee80211_vif *vif = info->control.vif;
8812 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8813 	struct ath12k_link_vif *arvif = &ahvif->deflink;
8814 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8815 	struct ieee80211_key_conf *key = info->control.hw_key;
8816 	struct ieee80211_sta *sta = control->sta;
8817 	struct ath12k_link_vif *tmp_arvif;
8818 	u32 info_flags = info->flags;
8819 	struct sk_buff *msdu_copied;
8820 	struct ath12k *ar, *tmp_ar;
8821 	struct ath12k_peer *peer;
8822 	unsigned long links_map;
8823 	bool is_mcast = false;
8824 	bool is_dvlan = false;
8825 	struct ethhdr *eth;
8826 	bool is_prb_rsp;
8827 	u16 mcbc_gsn;
8828 	u8 link_id;
8829 	int ret;
8830 
8831 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8832 		ieee80211_free_txskb(hw, skb);
8833 		return;
8834 	}
8835 
8836 	link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
8837 	memset(skb_cb, 0, sizeof(*skb_cb));
8838 	skb_cb->vif = vif;
8839 
8840 	if (key) {
8841 		skb_cb->cipher = key->cipher;
8842 		skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8843 	}
8844 
8845 	/* handle only for MLO case, use deflink for non MLO case */
8846 	if (ieee80211_vif_is_mld(vif)) {
8847 		link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags);
8848 		if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
8849 			ieee80211_free_txskb(hw, skb);
8850 			return;
8851 		}
8852 	} else {
8853 		link_id = 0;
8854 	}
8855 
8856 	arvif = rcu_dereference(ahvif->link[link_id]);
8857 	if (!arvif || !arvif->ar) {
8858 		ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission",
8859 			    link_id);
8860 		ieee80211_free_txskb(hw, skb);
8861 		return;
8862 	}
8863 
8864 	ar = arvif->ar;
8865 	skb_cb->link_id = link_id;
8866 	is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
8867 
8868 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
8869 		eth = (struct ethhdr *)skb->data;
8870 		is_mcast = is_multicast_ether_addr(eth->h_dest);
8871 
8872 		skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
8873 	} else if (ieee80211_is_mgmt(hdr->frame_control)) {
8874 		if (sta && sta->mlo)
8875 			skb_cb->flags |= ATH12K_SKB_MLO_STA;
8876 
8877 		ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
8878 		if (ret) {
8879 			ath12k_warn(ar->ab, "failed to queue management frame %d\n",
8880 				    ret);
8881 			ieee80211_free_txskb(hw, skb);
8882 		}
8883 		return;
8884 	}
8885 
8886 	if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
8887 		is_mcast = is_multicast_ether_addr(hdr->addr1);
8888 
8889 	/* This is case only for P2P_GO */
8890 	if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
8891 		ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
8892 
8893 	/* Checking if it is a DVLAN frame */
8894 	if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8895 	    !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
8896 	    !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8897 	    ieee80211_has_protected(hdr->frame_control))
8898 		is_dvlan = true;
8899 
8900 	if (!vif->valid_links || !is_mcast || is_dvlan ||
8901 	    (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
8902 	    test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
8903 		ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast);
8904 		if (unlikely(ret)) {
8905 			ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
8906 			ieee80211_free_txskb(ar->ah->hw, skb);
8907 			return;
8908 		}
8909 	} else {
8910 		mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff;
8911 
8912 		links_map = ahvif->links_map;
8913 		for_each_set_bit(link_id, &links_map,
8914 				 IEEE80211_MLD_MAX_NUM_LINKS) {
8915 			tmp_arvif = rcu_dereference(ahvif->link[link_id]);
8916 			if (!tmp_arvif || !tmp_arvif->is_up)
8917 				continue;
8918 
8919 			tmp_ar = tmp_arvif->ar;
8920 			msdu_copied = skb_copy(skb, GFP_ATOMIC);
8921 			if (!msdu_copied) {
8922 				ath12k_err(ar->ab,
8923 					   "skb copy failure link_id 0x%X vdevid 0x%X\n",
8924 					   link_id, tmp_arvif->vdev_id);
8925 				continue;
8926 			}
8927 
8928 			ath12k_mlo_mcast_update_tx_link_address(vif, link_id,
8929 								msdu_copied,
8930 								info_flags);
8931 
8932 			skb_cb = ATH12K_SKB_CB(msdu_copied);
8933 			skb_cb->link_id = link_id;
8934 
8935 			/* For open mode, skip peer find logic */
8936 			if (unlikely(!ahvif->key_cipher))
8937 				goto skip_peer_find;
8938 
8939 			spin_lock_bh(&tmp_ar->ab->base_lock);
8940 			peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid);
8941 			if (!peer) {
8942 				spin_unlock_bh(&tmp_ar->ab->base_lock);
8943 				ath12k_warn(tmp_ar->ab,
8944 					    "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n",
8945 					    tmp_arvif->vdev_id, tmp_arvif->bssid,
8946 					    ahvif->links_map);
8947 				dev_kfree_skb_any(msdu_copied);
8948 				continue;
8949 			}
8950 
8951 			key = peer->keys[peer->mcast_keyidx];
8952 			if (key) {
8953 				skb_cb->cipher = key->cipher;
8954 				skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8955 
8956 				hdr = (struct ieee80211_hdr *)msdu_copied->data;
8957 				if (!ieee80211_has_protected(hdr->frame_control))
8958 					hdr->frame_control |=
8959 						cpu_to_le16(IEEE80211_FCTL_PROTECTED);
8960 			}
8961 			spin_unlock_bh(&tmp_ar->ab->base_lock);
8962 
8963 skip_peer_find:
8964 			ret = ath12k_dp_tx(tmp_ar, tmp_arvif,
8965 					   msdu_copied, true, mcbc_gsn, is_mcast);
8966 			if (unlikely(ret)) {
8967 				if (ret == -ENOMEM) {
8968 					/* Drops are expected during heavy multicast
8969 					 * frame flood. Print with debug log
8970 					 * level to avoid lot of console prints
8971 					 */
8972 					ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8973 						   "failed to transmit frame %d\n",
8974 						   ret);
8975 				} else {
8976 					ath12k_warn(ar->ab,
8977 						    "failed to transmit frame %d\n",
8978 						    ret);
8979 				}
8980 
8981 				dev_kfree_skb_any(msdu_copied);
8982 			}
8983 		}
8984 		ieee80211_free_txskb(ar->ah->hw, skb);
8985 	}
8986 }
8987 
ath12k_mac_drain_tx(struct ath12k * ar)8988 void ath12k_mac_drain_tx(struct ath12k *ar)
8989 {
8990 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8991 
8992 	/* make sure rcu-protected mac80211 tx path itself is drained */
8993 	synchronize_net();
8994 
8995 	wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8996 	ath12k_mgmt_over_wmi_tx_purge(ar);
8997 }
8998 
ath12k_mac_config_mon_status_default(struct ath12k * ar,bool enable)8999 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
9000 {
9001 	struct htt_rx_ring_tlv_filter tlv_filter = {};
9002 	struct ath12k_base *ab = ar->ab;
9003 	u32 ring_id, i;
9004 	int ret = 0;
9005 
9006 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9007 
9008 	if (!ab->hw_params->rxdma1_enable)
9009 		return ret;
9010 
9011 	if (enable) {
9012 		tlv_filter = ath12k_mac_mon_status_filter_default;
9013 
9014 		if (ath12k_debugfs_rx_filter(ar))
9015 			tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar);
9016 	} else {
9017 		tlv_filter.rxmon_disable = true;
9018 	}
9019 
9020 	for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) {
9021 		ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id;
9022 		ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id,
9023 						       ar->dp.mac_id + i,
9024 						       HAL_RXDMA_MONITOR_DST,
9025 						       DP_RXDMA_REFILL_RING_SIZE,
9026 						       &tlv_filter);
9027 		if (ret) {
9028 			ath12k_err(ab,
9029 				   "failed to setup filter for monitor buf %d\n",
9030 				   ret);
9031 		}
9032 	}
9033 
9034 	return ret;
9035 }
9036 
ath12k_mac_start(struct ath12k * ar)9037 static int ath12k_mac_start(struct ath12k *ar)
9038 {
9039 	struct ath12k_hw *ah = ar->ah;
9040 	struct ath12k_base *ab = ar->ab;
9041 	struct ath12k_pdev *pdev = ar->pdev;
9042 	int ret;
9043 
9044 	lockdep_assert_held(&ah->hw_mutex);
9045 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9046 
9047 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
9048 					1, pdev->pdev_id);
9049 
9050 	if (ret) {
9051 		ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret);
9052 		goto err;
9053 	}
9054 
9055 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
9056 					pdev->pdev_id);
9057 	if (ret) {
9058 		ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
9059 		goto err;
9060 	}
9061 
9062 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
9063 					0, pdev->pdev_id);
9064 	if (ret) {
9065 		ath12k_err(ab, "failed to set ac override for ARP: %d\n",
9066 			   ret);
9067 		goto err;
9068 	}
9069 
9070 	ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
9071 	if (ret) {
9072 		ath12k_err(ab, "failed to offload radar detection: %d\n",
9073 			   ret);
9074 		goto err;
9075 	}
9076 
9077 	ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
9078 						  HTT_PPDU_STATS_TAG_DEFAULT);
9079 	if (ret) {
9080 		ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
9081 		goto err;
9082 	}
9083 
9084 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
9085 					1, pdev->pdev_id);
9086 
9087 	if (ret) {
9088 		ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
9089 		goto err;
9090 	}
9091 
9092 	__ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
9093 
9094 	/* TODO: Do we need to enable ANI? */
9095 
9096 	ret = ath12k_reg_update_chan_list(ar, false);
9097 
9098 	/* The ar state alone can be turned off for non supported country
9099 	 * without returning the error value. As we need to update the channel
9100 	 * for the next ar.
9101 	 */
9102 	if (ret) {
9103 		if (ret == -EINVAL)
9104 			ret = 0;
9105 		goto err;
9106 	}
9107 
9108 	ar->num_started_vdevs = 0;
9109 	ar->num_created_vdevs = 0;
9110 	ar->num_peers = 0;
9111 	ar->allocated_vdev_map = 0;
9112 	ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
9113 
9114 	/* Configure monitor status ring with default rx_filter to get rx status
9115 	 * such as rssi, rx_duration.
9116 	 */
9117 	ret = ath12k_mac_config_mon_status_default(ar, true);
9118 	if (ret && (ret != -EOPNOTSUPP)) {
9119 		ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
9120 			   ret);
9121 		goto err;
9122 	}
9123 
9124 	if (ret == -EOPNOTSUPP)
9125 		ath12k_dbg(ab, ATH12K_DBG_MAC,
9126 			   "monitor status config is not yet supported");
9127 
9128 	/* Configure the hash seed for hash based reo dest ring selection */
9129 	ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
9130 
9131 	/* allow device to enter IMPS */
9132 	if (ab->hw_params->idle_ps) {
9133 		ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
9134 						1, pdev->pdev_id);
9135 		if (ret) {
9136 			ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
9137 			goto err;
9138 		}
9139 	}
9140 
9141 	rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
9142 			   &ab->pdevs[ar->pdev_idx]);
9143 
9144 	return 0;
9145 err:
9146 
9147 	return ret;
9148 }
9149 
ath12k_drain_tx(struct ath12k_hw * ah)9150 static void ath12k_drain_tx(struct ath12k_hw *ah)
9151 {
9152 	struct ath12k *ar;
9153 	int i;
9154 
9155 	lockdep_assert_wiphy(ah->hw->wiphy);
9156 
9157 	for_each_ar(ah, ar, i)
9158 		ath12k_mac_drain_tx(ar);
9159 }
9160 
ath12k_mac_op_start(struct ieee80211_hw * hw)9161 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
9162 {
9163 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9164 	struct ath12k *ar;
9165 	int ret, i;
9166 
9167 	if (ath12k_ftm_mode)
9168 		return -EPERM;
9169 
9170 	lockdep_assert_wiphy(hw->wiphy);
9171 
9172 	ath12k_drain_tx(ah);
9173 
9174 	guard(mutex)(&ah->hw_mutex);
9175 
9176 	switch (ah->state) {
9177 	case ATH12K_HW_STATE_OFF:
9178 		ah->state = ATH12K_HW_STATE_ON;
9179 		break;
9180 	case ATH12K_HW_STATE_RESTARTING:
9181 		ah->state = ATH12K_HW_STATE_RESTARTED;
9182 		break;
9183 	case ATH12K_HW_STATE_RESTARTED:
9184 	case ATH12K_HW_STATE_WEDGED:
9185 	case ATH12K_HW_STATE_ON:
9186 	case ATH12K_HW_STATE_TM:
9187 		ah->state = ATH12K_HW_STATE_OFF;
9188 
9189 		WARN_ON(1);
9190 		return -EINVAL;
9191 	}
9192 
9193 	for_each_ar(ah, ar, i) {
9194 		ret = ath12k_mac_start(ar);
9195 		if (ret) {
9196 			ah->state = ATH12K_HW_STATE_OFF;
9197 
9198 			ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n",
9199 				   ar->pdev_idx, ret);
9200 			goto fail_start;
9201 		}
9202 	}
9203 
9204 	return 0;
9205 
9206 fail_start:
9207 	for (; i > 0; i--) {
9208 		ar = ath12k_ah_to_ar(ah, i - 1);
9209 		ath12k_mac_stop(ar);
9210 	}
9211 
9212 	return ret;
9213 }
9214 
ath12k_mac_rfkill_config(struct ath12k * ar)9215 int ath12k_mac_rfkill_config(struct ath12k *ar)
9216 {
9217 	struct ath12k_base *ab = ar->ab;
9218 	u32 param;
9219 	int ret;
9220 
9221 	if (ab->hw_params->rfkill_pin == 0)
9222 		return -EOPNOTSUPP;
9223 
9224 	ath12k_dbg(ab, ATH12K_DBG_MAC,
9225 		   "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
9226 		   ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
9227 		   ab->hw_params->rfkill_on_level);
9228 
9229 	param = u32_encode_bits(ab->hw_params->rfkill_on_level,
9230 				WMI_RFKILL_CFG_RADIO_LEVEL) |
9231 		u32_encode_bits(ab->hw_params->rfkill_pin,
9232 				WMI_RFKILL_CFG_GPIO_PIN_NUM) |
9233 		u32_encode_bits(ab->hw_params->rfkill_cfg,
9234 				WMI_RFKILL_CFG_PIN_AS_GPIO);
9235 
9236 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
9237 					param, ar->pdev->pdev_id);
9238 	if (ret) {
9239 		ath12k_warn(ab,
9240 			    "failed to set rfkill config 0x%x: %d\n",
9241 			    param, ret);
9242 		return ret;
9243 	}
9244 
9245 	return 0;
9246 }
9247 
ath12k_mac_rfkill_enable_radio(struct ath12k * ar,bool enable)9248 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
9249 {
9250 	enum wmi_rfkill_enable_radio param;
9251 	int ret;
9252 
9253 	if (enable)
9254 		param = WMI_RFKILL_ENABLE_RADIO_ON;
9255 	else
9256 		param = WMI_RFKILL_ENABLE_RADIO_OFF;
9257 
9258 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
9259 		   ar->pdev_idx, param);
9260 
9261 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
9262 					param, ar->pdev->pdev_id);
9263 	if (ret) {
9264 		ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
9265 			    param, ret);
9266 		return ret;
9267 	}
9268 
9269 	return 0;
9270 }
9271 
ath12k_mac_stop(struct ath12k * ar)9272 static void ath12k_mac_stop(struct ath12k *ar)
9273 {
9274 	struct ath12k_hw *ah = ar->ah;
9275 	struct htt_ppdu_stats_info *ppdu_stats, *tmp;
9276 	struct ath12k_wmi_scan_chan_list_arg *arg;
9277 	int ret;
9278 
9279 	lockdep_assert_held(&ah->hw_mutex);
9280 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9281 
9282 	ret = ath12k_mac_config_mon_status_default(ar, false);
9283 	if (ret && (ret != -EOPNOTSUPP))
9284 		ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
9285 			   ret);
9286 
9287 	clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
9288 
9289 	cancel_delayed_work_sync(&ar->scan.timeout);
9290 	wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk);
9291 	cancel_work_sync(&ar->regd_channel_update_work);
9292 	cancel_work_sync(&ar->regd_update_work);
9293 	cancel_work_sync(&ar->ab->rfkill_work);
9294 	cancel_work_sync(&ar->ab->update_11d_work);
9295 	ar->state_11d = ATH12K_11D_IDLE;
9296 	complete(&ar->completed_11d_scan);
9297 
9298 	spin_lock_bh(&ar->data_lock);
9299 
9300 	list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
9301 		list_del(&ppdu_stats->list);
9302 		kfree(ppdu_stats);
9303 	}
9304 
9305 	while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue,
9306 					       struct ath12k_wmi_scan_chan_list_arg,
9307 					       list))) {
9308 		list_del(&arg->list);
9309 		kfree(arg);
9310 	}
9311 	spin_unlock_bh(&ar->data_lock);
9312 
9313 	rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
9314 
9315 	synchronize_rcu();
9316 
9317 	atomic_set(&ar->num_pending_mgmt_tx, 0);
9318 }
9319 
ath12k_mac_op_stop(struct ieee80211_hw * hw,bool suspend)9320 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend)
9321 {
9322 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9323 	struct ath12k *ar;
9324 	int i;
9325 
9326 	lockdep_assert_wiphy(hw->wiphy);
9327 
9328 	ath12k_drain_tx(ah);
9329 
9330 	mutex_lock(&ah->hw_mutex);
9331 
9332 	ah->state = ATH12K_HW_STATE_OFF;
9333 
9334 	for_each_ar(ah, ar, i)
9335 		ath12k_mac_stop(ar);
9336 
9337 	mutex_unlock(&ah->hw_mutex);
9338 }
9339 
9340 static u8
ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif * arvif)9341 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif)
9342 {
9343 	struct ath12k_base *ab = arvif->ar->ab;
9344 	u8 vdev_stats_id = 0;
9345 
9346 	do {
9347 		if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
9348 			vdev_stats_id++;
9349 			if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
9350 				vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
9351 				break;
9352 			}
9353 		} else {
9354 			ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
9355 			break;
9356 		}
9357 	} while (vdev_stats_id);
9358 
9359 	arvif->vdev_stats_id = vdev_stats_id;
9360 	return vdev_stats_id;
9361 }
9362 
ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif * arvif,u32 * flags,u32 * tx_vdev_id)9363 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif,
9364 					       u32 *flags, u32 *tx_vdev_id)
9365 {
9366 	struct ath12k_vif *ahvif = arvif->ahvif;
9367 	struct ieee80211_bss_conf *link_conf;
9368 	struct ath12k *ar = arvif->ar;
9369 	struct ath12k_link_vif *tx_arvif;
9370 
9371 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
9372 	if (!link_conf) {
9373 		ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n",
9374 			    ahvif->vif->addr, arvif->link_id);
9375 		return -ENOLINK;
9376 	}
9377 
9378 	tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
9379 	if (!tx_arvif)
9380 		return 0;
9381 
9382 	if (link_conf->nontransmitted) {
9383 		if (ath12k_ar_to_hw(ar)->wiphy !=
9384 		    ath12k_ar_to_hw(tx_arvif->ar)->wiphy)
9385 			return -EINVAL;
9386 
9387 		*flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP;
9388 		*tx_vdev_id = tx_arvif->vdev_id;
9389 	} else if (tx_arvif == arvif) {
9390 		*flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP;
9391 	} else {
9392 		return -EINVAL;
9393 	}
9394 
9395 	if (link_conf->ema_ap)
9396 		*flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE;
9397 
9398 	return 0;
9399 }
9400 
ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif * arvif,struct ath12k_wmi_vdev_create_arg * arg)9401 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif,
9402 					    struct ath12k_wmi_vdev_create_arg *arg)
9403 {
9404 	struct ath12k *ar = arvif->ar;
9405 	struct ath12k_pdev *pdev = ar->pdev;
9406 	struct ath12k_vif *ahvif = arvif->ahvif;
9407 	int ret;
9408 
9409 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9410 
9411 	arg->if_id = arvif->vdev_id;
9412 	arg->type = ahvif->vdev_type;
9413 	arg->subtype = ahvif->vdev_subtype;
9414 	arg->pdev_id = pdev->pdev_id;
9415 
9416 	arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
9417 	arg->mbssid_tx_vdev_id = 0;
9418 	if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
9419 		      ar->ab->wmi_ab.svc_map)) {
9420 		ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
9421 							  &arg->mbssid_flags,
9422 							  &arg->mbssid_tx_vdev_id);
9423 		if (ret)
9424 			return ret;
9425 	}
9426 
9427 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
9428 		arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
9429 		arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
9430 	}
9431 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
9432 		arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
9433 		arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
9434 	}
9435 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
9436 	    ar->supports_6ghz) {
9437 		arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
9438 		arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
9439 	}
9440 
9441 	arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
9442 
9443 	if (ath12k_mac_is_ml_arvif(arvif)) {
9444 		if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) {
9445 			ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d",
9446 				    ahvif->vif->valid_links);
9447 			return -EINVAL;
9448 		}
9449 
9450 		ether_addr_copy(arg->mld_addr, ahvif->vif->addr);
9451 	}
9452 
9453 	return 0;
9454 }
9455 
ath12k_mac_update_vif_offload(struct ath12k_link_vif * arvif)9456 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
9457 {
9458 	struct ath12k_vif *ahvif = arvif->ahvif;
9459 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9460 	struct ath12k *ar = arvif->ar;
9461 	struct ath12k_base *ab = ar->ab;
9462 	u32 param_id, param_value;
9463 	int ret;
9464 
9465 	param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
9466 	if (vif->type != NL80211_IFTYPE_STATION &&
9467 	    vif->type != NL80211_IFTYPE_AP)
9468 		vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
9469 					IEEE80211_OFFLOAD_DECAP_ENABLED);
9470 
9471 	if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
9472 		ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
9473 	else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9474 		ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
9475 	else
9476 		ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
9477 
9478 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9479 					    param_id, ahvif->tx_encap_type);
9480 	if (ret) {
9481 		ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
9482 			    arvif->vdev_id, ret);
9483 		vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
9484 	}
9485 
9486 	param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
9487 	if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
9488 		param_value = ATH12K_HW_TXRX_ETHERNET;
9489 	else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9490 		param_value = ATH12K_HW_TXRX_RAW;
9491 	else
9492 		param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
9493 
9494 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9495 					    param_id, param_value);
9496 	if (ret) {
9497 		ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
9498 			    arvif->vdev_id, ret);
9499 		vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
9500 	}
9501 }
9502 
ath12k_mac_op_update_vif_offload(struct ieee80211_hw * hw,struct ieee80211_vif * vif)9503 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
9504 					     struct ieee80211_vif *vif)
9505 {
9506 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9507 	struct ath12k_link_vif *arvif;
9508 	unsigned long links;
9509 	int link_id;
9510 
9511 	lockdep_assert_wiphy(hw->wiphy);
9512 
9513 	if (vif->valid_links) {
9514 		links = vif->valid_links;
9515 		for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
9516 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
9517 			if (!(arvif && arvif->ar))
9518 				continue;
9519 
9520 			ath12k_mac_update_vif_offload(arvif);
9521 		}
9522 
9523 		return;
9524 	}
9525 
9526 	ath12k_mac_update_vif_offload(&ahvif->deflink);
9527 }
9528 
ath12k_mac_vif_ap_active_any(struct ath12k_base * ab)9529 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab)
9530 {
9531 	struct ath12k *ar;
9532 	struct ath12k_pdev *pdev;
9533 	struct ath12k_link_vif *arvif;
9534 	int i;
9535 
9536 	for (i = 0; i < ab->num_radios; i++) {
9537 		pdev = &ab->pdevs[i];
9538 		ar = pdev->ar;
9539 		list_for_each_entry(arvif, &ar->arvifs, list) {
9540 			if (arvif->is_up &&
9541 			    arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP)
9542 				return true;
9543 		}
9544 	}
9545 	return false;
9546 }
9547 
ath12k_mac_11d_scan_start(struct ath12k * ar,u32 vdev_id)9548 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id)
9549 {
9550 	struct wmi_11d_scan_start_arg arg;
9551 	int ret;
9552 
9553 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9554 
9555 	if (ar->regdom_set_by_user)
9556 		goto fin;
9557 
9558 	if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID)
9559 		goto fin;
9560 
9561 	if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9562 		goto fin;
9563 
9564 	if (ath12k_mac_vif_ap_active_any(ar->ab))
9565 		goto fin;
9566 
9567 	arg.vdev_id = vdev_id;
9568 	arg.start_interval_msec = 0;
9569 	arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL;
9570 
9571 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
9572 		   "mac start 11d scan for vdev %d\n", vdev_id);
9573 
9574 	ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg);
9575 	if (ret) {
9576 		ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
9577 			    vdev_id, ret);
9578 	} else {
9579 		ar->vdev_id_11d_scan = vdev_id;
9580 		if (ar->state_11d == ATH12K_11D_PREPARING)
9581 			ar->state_11d = ATH12K_11D_RUNNING;
9582 	}
9583 
9584 fin:
9585 	if (ar->state_11d == ATH12K_11D_PREPARING) {
9586 		ar->state_11d = ATH12K_11D_IDLE;
9587 		complete(&ar->completed_11d_scan);
9588 	}
9589 }
9590 
ath12k_mac_11d_scan_stop(struct ath12k * ar)9591 void ath12k_mac_11d_scan_stop(struct ath12k *ar)
9592 {
9593 	int ret;
9594 	u32 vdev_id;
9595 
9596 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9597 
9598 	if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9599 		return;
9600 
9601 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n",
9602 		   ar->vdev_id_11d_scan);
9603 
9604 	if (ar->state_11d == ATH12K_11D_PREPARING) {
9605 		ar->state_11d = ATH12K_11D_IDLE;
9606 		complete(&ar->completed_11d_scan);
9607 	}
9608 
9609 	if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) {
9610 		vdev_id = ar->vdev_id_11d_scan;
9611 
9612 		ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
9613 		if (ret) {
9614 			ath12k_warn(ar->ab,
9615 				    "failed to stopt 11d scan vdev %d ret: %d\n",
9616 				    vdev_id, ret);
9617 		} else {
9618 			ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
9619 			ar->state_11d = ATH12K_11D_IDLE;
9620 			complete(&ar->completed_11d_scan);
9621 		}
9622 	}
9623 }
9624 
ath12k_mac_11d_scan_stop_all(struct ath12k_base * ab)9625 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab)
9626 {
9627 	struct ath12k *ar;
9628 	struct ath12k_pdev *pdev;
9629 	int i;
9630 
9631 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n");
9632 
9633 	for (i = 0; i < ab->num_radios; i++) {
9634 		pdev = &ab->pdevs[i];
9635 		ar = pdev->ar;
9636 
9637 		ath12k_mac_11d_scan_stop(ar);
9638 	}
9639 }
9640 
ath12k_mac_determine_vdev_type(struct ieee80211_vif * vif,struct ath12k_vif * ahvif)9641 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif,
9642 					   struct ath12k_vif *ahvif)
9643 {
9644 	ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
9645 
9646 	switch (vif->type) {
9647 	case NL80211_IFTYPE_UNSPECIFIED:
9648 	case NL80211_IFTYPE_STATION:
9649 		ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9650 
9651 		if (vif->p2p)
9652 			ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
9653 
9654 		break;
9655 	case NL80211_IFTYPE_MESH_POINT:
9656 		ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
9657 		fallthrough;
9658 	case NL80211_IFTYPE_AP:
9659 		ahvif->vdev_type = WMI_VDEV_TYPE_AP;
9660 
9661 		if (vif->p2p)
9662 			ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
9663 
9664 		break;
9665 	case NL80211_IFTYPE_MONITOR:
9666 		ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
9667 		break;
9668 	case NL80211_IFTYPE_P2P_DEVICE:
9669 		ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9670 		ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
9671 		break;
9672 	default:
9673 		WARN_ON(1);
9674 		break;
9675 	}
9676 }
9677 
ath12k_mac_vdev_create(struct ath12k * ar,struct ath12k_link_vif * arvif)9678 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
9679 {
9680 	struct ath12k_hw *ah = ar->ah;
9681 	struct ath12k_base *ab = ar->ab;
9682 	struct ieee80211_hw *hw = ah->hw;
9683 	struct ath12k_vif *ahvif = arvif->ahvif;
9684 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9685 	struct ath12k_wmi_vdev_create_arg vdev_arg = {};
9686 	struct ath12k_wmi_peer_create_arg peer_param = {};
9687 	struct ieee80211_bss_conf *link_conf = NULL;
9688 	u32 param_id, param_value;
9689 	u16 nss;
9690 	int i;
9691 	int ret, vdev_id;
9692 	u8 link_id;
9693 
9694 	lockdep_assert_wiphy(hw->wiphy);
9695 
9696 	/* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor
9697 	 * interface in each radio
9698 	 */
9699 	if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created)
9700 		return -EINVAL;
9701 
9702 	link_id = arvif->link_id;
9703 
9704 	if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
9705 		link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
9706 		if (!link_conf) {
9707 			ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n",
9708 				    vif->addr, arvif->link_id);
9709 			return -ENOLINK;
9710 		}
9711 	}
9712 
9713 	if (link_conf)
9714 		memcpy(arvif->bssid, link_conf->addr, ETH_ALEN);
9715 	else
9716 		memcpy(arvif->bssid, vif->addr, ETH_ALEN);
9717 
9718 	arvif->ar = ar;
9719 	vdev_id = __ffs64(ab->free_vdev_map);
9720 	arvif->vdev_id = vdev_id;
9721 	if (vif->type == NL80211_IFTYPE_MONITOR)
9722 		ar->monitor_vdev_id = vdev_id;
9723 
9724 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n",
9725 		   arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype,
9726 		   ab->free_vdev_map);
9727 
9728 	vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
9729 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
9730 		vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
9731 
9732 	ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
9733 	if (ret) {
9734 		ath12k_warn(ab, "failed to create vdev parameters %d: %d\n",
9735 			    arvif->vdev_id, ret);
9736 		goto err;
9737 	}
9738 
9739 	ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg);
9740 	if (ret) {
9741 		ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
9742 			    arvif->vdev_id, ret);
9743 		return ret;
9744 	}
9745 
9746 	ar->num_created_vdevs++;
9747 	arvif->is_created = true;
9748 	ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
9749 		   vif->addr, arvif->vdev_id);
9750 	ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
9751 	ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
9752 
9753 	spin_lock_bh(&ar->data_lock);
9754 	list_add(&arvif->list, &ar->arvifs);
9755 	spin_unlock_bh(&ar->data_lock);
9756 
9757 	ath12k_mac_update_vif_offload(arvif);
9758 
9759 	nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
9760 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9761 					    WMI_VDEV_PARAM_NSS, nss);
9762 	if (ret) {
9763 		ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
9764 			    arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
9765 		goto err_vdev_del;
9766 	}
9767 
9768 	switch (ahvif->vdev_type) {
9769 	case WMI_VDEV_TYPE_AP:
9770 		peer_param.vdev_id = arvif->vdev_id;
9771 		peer_param.peer_addr = arvif->bssid;
9772 		peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9773 		ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
9774 		if (ret) {
9775 			ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
9776 				    arvif->vdev_id, ret);
9777 			goto err_vdev_del;
9778 		}
9779 
9780 		ret = ath12k_mac_set_kickout(arvif);
9781 		if (ret) {
9782 			ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
9783 				    arvif->vdev_id, ret);
9784 			goto err_peer_del;
9785 		}
9786 		ath12k_mac_11d_scan_stop_all(ar->ab);
9787 		break;
9788 	case WMI_VDEV_TYPE_STA:
9789 		param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
9790 		param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
9791 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9792 						  param_id, param_value);
9793 		if (ret) {
9794 			ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
9795 				    arvif->vdev_id, ret);
9796 			goto err_peer_del;
9797 		}
9798 
9799 		param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
9800 		param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
9801 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9802 						  param_id, param_value);
9803 		if (ret) {
9804 			ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
9805 				    arvif->vdev_id, ret);
9806 			goto err_peer_del;
9807 		}
9808 
9809 		param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
9810 		param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
9811 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9812 						  param_id, param_value);
9813 		if (ret) {
9814 			ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
9815 				    arvif->vdev_id, ret);
9816 			goto err_peer_del;
9817 		}
9818 
9819 		ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
9820 		if (ret) {
9821 			ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
9822 				    arvif->vdev_id, ret);
9823 			goto err_peer_del;
9824 		}
9825 
9826 		if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
9827 		    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
9828 		    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
9829 			reinit_completion(&ar->completed_11d_scan);
9830 			ar->state_11d = ATH12K_11D_PREPARING;
9831 		}
9832 		break;
9833 	case WMI_VDEV_TYPE_MONITOR:
9834 		ar->monitor_vdev_created = true;
9835 		break;
9836 	default:
9837 		break;
9838 	}
9839 
9840 	if (link_conf)
9841 		arvif->txpower = link_conf->txpower;
9842 	else
9843 		arvif->txpower = NL80211_TX_POWER_AUTOMATIC;
9844 
9845 	ret = ath12k_mac_txpower_recalc(ar);
9846 	if (ret)
9847 		goto err_peer_del;
9848 
9849 	param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
9850 	param_value = hw->wiphy->rts_threshold;
9851 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9852 					    param_id, param_value);
9853 	if (ret) {
9854 		ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
9855 			    arvif->vdev_id, ret);
9856 	}
9857 
9858 	ath12k_dp_vdev_tx_attach(ar, arvif);
9859 
9860 	return ret;
9861 
9862 err_peer_del:
9863 	if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
9864 		reinit_completion(&ar->peer_delete_done);
9865 
9866 		ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid,
9867 						      arvif->vdev_id);
9868 		if (ret) {
9869 			ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
9870 				    arvif->vdev_id, arvif->bssid);
9871 			goto err;
9872 		}
9873 
9874 		ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
9875 						       arvif->bssid);
9876 		if (ret)
9877 			goto err_vdev_del;
9878 
9879 		ar->num_peers--;
9880 	}
9881 
9882 err_vdev_del:
9883 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
9884 		ar->monitor_vdev_id = -1;
9885 		ar->monitor_vdev_created = false;
9886 	}
9887 
9888 	ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
9889 	ar->num_created_vdevs--;
9890 	arvif->is_created = false;
9891 	arvif->ar = NULL;
9892 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
9893 	ab->free_vdev_map |= 1LL << arvif->vdev_id;
9894 	ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
9895 	spin_lock_bh(&ar->data_lock);
9896 	list_del(&arvif->list);
9897 	spin_unlock_bh(&ar->data_lock);
9898 
9899 err:
9900 	arvif->ar = NULL;
9901 	return ret;
9902 }
9903 
ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif * arvif)9904 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif)
9905 {
9906 	struct ath12k_key_conf *key_conf, *tmp;
9907 	struct ath12k_vif *ahvif = arvif->ahvif;
9908 	struct ath12k_hw *ah = ahvif->ah;
9909 	struct ath12k_sta *ahsta;
9910 	struct ath12k_link_sta *arsta;
9911 	struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9912 	int ret;
9913 
9914 	lockdep_assert_wiphy(ah->hw->wiphy);
9915 
9916 	list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
9917 		arsta = NULL;
9918 		if (key_conf->sta) {
9919 			ahsta = ath12k_sta_to_ahsta(key_conf->sta);
9920 			arsta = wiphy_dereference(ah->hw->wiphy,
9921 						  ahsta->link[arvif->link_id]);
9922 			if (!arsta)
9923 				goto free_cache;
9924 		}
9925 
9926 		ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd,
9927 					 arvif, arsta,
9928 					 key_conf->key);
9929 		if (ret)
9930 			ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n",
9931 				    arvif->vdev_id, ret);
9932 free_cache:
9933 		list_del(&key_conf->list);
9934 		kfree(key_conf);
9935 	}
9936 }
9937 
ath12k_mac_vif_cache_flush(struct ath12k * ar,struct ath12k_link_vif * arvif)9938 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif)
9939 {
9940 	struct ath12k_vif *ahvif = arvif->ahvif;
9941 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9942 	struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9943 	struct ath12k_base *ab = ar->ab;
9944 	struct ieee80211_bss_conf *link_conf;
9945 
9946 	int ret;
9947 
9948 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9949 
9950 	if (!cache)
9951 		return;
9952 
9953 	if (cache->tx_conf.changed) {
9954 		ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac,
9955 					 &cache->tx_conf.tx_queue_params);
9956 		if (ret)
9957 			ath12k_warn(ab,
9958 				    "unable to apply tx config parameters to vdev %d\n",
9959 				    ret);
9960 	}
9961 
9962 	if (cache->bss_conf_changed) {
9963 		link_conf = ath12k_mac_get_link_bss_conf(arvif);
9964 		if (!link_conf) {
9965 			ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n",
9966 				    vif->addr, arvif->link_id);
9967 			return;
9968 		}
9969 		ath12k_mac_bss_info_changed(ar, arvif, link_conf,
9970 					    cache->bss_conf_changed);
9971 	}
9972 
9973 	if (!list_empty(&cache->key_conf.list))
9974 		ath12k_mac_vif_flush_key_cache(arvif);
9975 
9976 	ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
9977 }
9978 
ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)9979 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
9980 						    struct ath12k_link_vif *arvif,
9981 						    struct ieee80211_chanctx_conf *ctx)
9982 {
9983 	struct ath12k_vif *ahvif = arvif->ahvif;
9984 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9985 	struct ath12k_link_vif *scan_arvif;
9986 	struct ath12k_hw *ah = hw->priv;
9987 	struct ath12k *ar;
9988 	struct ath12k_base *ab;
9989 	u8 link_id = arvif->link_id, scan_link_id;
9990 	unsigned long scan_link_map;
9991 	int ret;
9992 
9993 	lockdep_assert_wiphy(hw->wiphy);
9994 
9995 	if (ah->num_radio == 1)
9996 		ar = ah->radio;
9997 	else if (ctx)
9998 		ar = ath12k_get_ar_by_ctx(hw, ctx);
9999 	else
10000 		return NULL;
10001 
10002 	if (!ar)
10003 		return NULL;
10004 
10005 	/* cleanup the scan vdev if we are done scan on that ar
10006 	 * and now we want to create for actual usage.
10007 	 */
10008 	if (ieee80211_vif_is_mld(vif)) {
10009 		scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
10010 		for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) {
10011 			scan_arvif = wiphy_dereference(hw->wiphy,
10012 						       ahvif->link[scan_link_id]);
10013 			if (scan_arvif && scan_arvif->ar == ar) {
10014 				ar->scan.arvif = NULL;
10015 				ath12k_mac_remove_link_interface(hw, scan_arvif);
10016 				ath12k_mac_unassign_link_vif(scan_arvif);
10017 				break;
10018 			}
10019 		}
10020 	}
10021 
10022 	if (arvif->ar) {
10023 		/* This is not expected really */
10024 		if (WARN_ON(!arvif->is_created)) {
10025 			arvif->ar = NULL;
10026 			return NULL;
10027 		}
10028 
10029 		if (ah->num_radio == 1)
10030 			return arvif->ar;
10031 
10032 		/* This can happen as scan vdev gets created during multiple scans
10033 		 * across different radios before a vdev is brought up in
10034 		 * a certain radio.
10035 		 */
10036 		if (ar != arvif->ar) {
10037 			if (WARN_ON(arvif->is_started))
10038 				return NULL;
10039 
10040 			ath12k_mac_remove_link_interface(hw, arvif);
10041 			ath12k_mac_unassign_link_vif(arvif);
10042 		}
10043 	}
10044 
10045 	ab = ar->ab;
10046 
10047 	/* Assign arvif again here since previous radio switch block
10048 	 * would've unassigned and cleared it.
10049 	 */
10050 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
10051 	if (vif->type == NL80211_IFTYPE_AP &&
10052 	    ar->num_peers > (ar->max_num_peers - 1)) {
10053 		ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
10054 		goto unlock;
10055 	}
10056 
10057 	if (arvif->is_created)
10058 		goto flush;
10059 
10060 	if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
10061 		ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
10062 			    TARGET_NUM_VDEVS(ab));
10063 		goto unlock;
10064 	}
10065 
10066 	ret = ath12k_mac_vdev_create(ar, arvif);
10067 	if (ret) {
10068 		ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
10069 		goto unlock;
10070 	}
10071 
10072 flush:
10073 	/* If the vdev is created during channel assign and not during
10074 	 * add_interface(), Apply any parameters for the vdev which were received
10075 	 * after add_interface, corresponding to this vif.
10076 	 */
10077 	ath12k_mac_vif_cache_flush(ar, arvif);
10078 unlock:
10079 	return arvif->ar;
10080 }
10081 
ath12k_mac_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10082 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
10083 				       struct ieee80211_vif *vif)
10084 {
10085 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10086 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10087 	struct ath12k_reg_info *reg_info;
10088 	struct ath12k_link_vif *arvif;
10089 	struct ath12k_base *ab;
10090 	struct ath12k *ar;
10091 	int i;
10092 
10093 	lockdep_assert_wiphy(hw->wiphy);
10094 
10095 	memset(ahvif, 0, sizeof(*ahvif));
10096 
10097 	ahvif->ah = ah;
10098 	ahvif->vif = vif;
10099 	arvif = &ahvif->deflink;
10100 
10101 	ath12k_mac_init_arvif(ahvif, arvif, -1);
10102 
10103 	/* Allocate Default Queue now and reassign during actual vdev create */
10104 	vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE;
10105 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10106 		vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE;
10107 
10108 	vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
10109 
10110 	ath12k_mac_determine_vdev_type(vif, ahvif);
10111 
10112 	for_each_ar(ah, ar, i) {
10113 		if (!ath12k_wmi_supports_6ghz_cc_ext(ar))
10114 			continue;
10115 
10116 		ab = ar->ab;
10117 		reg_info = ab->reg_info[ar->pdev_idx];
10118 		ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n");
10119 		ah->regd_updated = false;
10120 		ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type,
10121 					    IEEE80211_REG_UNSET_AP);
10122 		break;
10123 	}
10124 
10125 	/* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver
10126 	 * will not know if this interface is an ML vif at this point.
10127 	 */
10128 	return 0;
10129 }
10130 
ath12k_mac_vif_unref(struct ath12k_dp * dp,struct ieee80211_vif * vif)10131 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
10132 {
10133 	struct ath12k_tx_desc_info *tx_desc_info;
10134 	struct ath12k_skb_cb *skb_cb;
10135 	struct sk_buff *skb;
10136 	int i;
10137 
10138 	for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
10139 		spin_lock_bh(&dp->tx_desc_lock[i]);
10140 
10141 		list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
10142 				    list) {
10143 			skb = tx_desc_info->skb;
10144 			if (!skb)
10145 				continue;
10146 
10147 			skb_cb = ATH12K_SKB_CB(skb);
10148 			if (skb_cb->vif == vif)
10149 				skb_cb->vif = NULL;
10150 		}
10151 
10152 		spin_unlock_bh(&dp->tx_desc_lock[i]);
10153 	}
10154 }
10155 
ath12k_mac_vdev_delete(struct ath12k * ar,struct ath12k_link_vif * arvif)10156 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
10157 {
10158 	struct ath12k_vif *ahvif = arvif->ahvif;
10159 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10160 	struct ath12k_base *ab = ar->ab;
10161 	unsigned long time_left;
10162 	int ret;
10163 
10164 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10165 
10166 	reinit_completion(&ar->vdev_delete_done);
10167 
10168 	ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10169 	if (ret) {
10170 		ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
10171 			    arvif->vdev_id, ret);
10172 		goto err_vdev_del;
10173 	}
10174 
10175 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
10176 						ATH12K_VDEV_DELETE_TIMEOUT_HZ);
10177 	if (time_left == 0) {
10178 		ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
10179 		goto err_vdev_del;
10180 	}
10181 
10182 	ab->free_vdev_map |= 1LL << arvif->vdev_id;
10183 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10184 	ar->num_created_vdevs--;
10185 
10186 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10187 		ar->monitor_vdev_id = -1;
10188 		ar->monitor_vdev_created = false;
10189 	}
10190 
10191 	ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
10192 		   vif->addr, arvif->vdev_id);
10193 
10194 err_vdev_del:
10195 	spin_lock_bh(&ar->data_lock);
10196 	list_del(&arvif->list);
10197 	spin_unlock_bh(&ar->data_lock);
10198 
10199 	ath12k_peer_cleanup(ar, arvif->vdev_id);
10200 	ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10201 
10202 	idr_for_each(&ar->txmgmt_idr,
10203 		     ath12k_mac_vif_txmgmt_idr_remove, vif);
10204 
10205 	ath12k_mac_vif_unref(&ab->dp, vif);
10206 	ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
10207 
10208 	/* Recalc txpower for remaining vdev */
10209 	ath12k_mac_txpower_recalc(ar);
10210 
10211 	/* TODO: recal traffic pause state based on the available vdevs */
10212 	arvif->is_created = false;
10213 	arvif->ar = NULL;
10214 
10215 	return ret;
10216 }
10217 
ath12k_mac_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10218 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
10219 					   struct ieee80211_vif *vif)
10220 {
10221 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10222 	struct ath12k_link_vif *arvif;
10223 	struct ath12k *ar;
10224 	u8 link_id;
10225 
10226 	lockdep_assert_wiphy(hw->wiphy);
10227 
10228 	for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) {
10229 		/* if we cached some config but never received assign chanctx,
10230 		 * free the allocated cache.
10231 		 */
10232 		ath12k_ahvif_put_link_cache(ahvif, link_id);
10233 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
10234 		if (!arvif || !arvif->is_created)
10235 			continue;
10236 
10237 		ar = arvif->ar;
10238 
10239 		/* Scan abortion is in progress since before this, cancel_hw_scan()
10240 		 * is expected to be executed. Since link is anyways going to be removed
10241 		 * now, just cancel the worker and send the scan aborted to user space
10242 		 */
10243 		if (ar->scan.arvif == arvif) {
10244 			wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
10245 
10246 			spin_lock_bh(&ar->data_lock);
10247 			ar->scan.arvif = NULL;
10248 			if (!ar->scan.is_roc) {
10249 				struct cfg80211_scan_info info = {
10250 					.aborted = true,
10251 				};
10252 
10253 				ath12k_mac_scan_send_complete(ar, &info);
10254 			}
10255 
10256 			ar->scan.state = ATH12K_SCAN_IDLE;
10257 			ar->scan_channel = NULL;
10258 			ar->scan.roc_freq = 0;
10259 			spin_unlock_bh(&ar->data_lock);
10260 		}
10261 
10262 		ath12k_mac_remove_link_interface(hw, arvif);
10263 		ath12k_mac_unassign_link_vif(arvif);
10264 	}
10265 }
10266 
10267 /* FIXME: Has to be verified. */
10268 #define SUPPORTED_FILTERS			\
10269 	(FIF_ALLMULTI |				\
10270 	FIF_CONTROL |				\
10271 	FIF_PSPOLL |				\
10272 	FIF_OTHER_BSS |				\
10273 	FIF_BCN_PRBRESP_PROMISC |		\
10274 	FIF_PROBE_REQ |				\
10275 	FIF_FCSFAIL)
10276 
ath12k_mac_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)10277 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
10278 					   unsigned int changed_flags,
10279 					   unsigned int *total_flags,
10280 					   u64 multicast)
10281 {
10282 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10283 	struct ath12k *ar;
10284 
10285 	lockdep_assert_wiphy(hw->wiphy);
10286 
10287 	ar = ath12k_ah_to_ar(ah, 0);
10288 
10289 	*total_flags &= SUPPORTED_FILTERS;
10290 	ar->filter_flags = *total_flags;
10291 }
10292 
ath12k_mac_op_get_antenna(struct ieee80211_hw * hw,int radio_idx,u32 * tx_ant,u32 * rx_ant)10293 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
10294 				     u32 *tx_ant, u32 *rx_ant)
10295 {
10296 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10297 	int antennas_rx = 0, antennas_tx = 0;
10298 	struct ath12k *ar;
10299 	int i;
10300 
10301 	lockdep_assert_wiphy(hw->wiphy);
10302 
10303 	for_each_ar(ah, ar, i) {
10304 		antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
10305 		antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
10306 	}
10307 
10308 	*tx_ant = antennas_tx;
10309 	*rx_ant = antennas_rx;
10310 
10311 	return 0;
10312 }
10313 
ath12k_mac_op_set_antenna(struct ieee80211_hw * hw,int radio_idx,u32 tx_ant,u32 rx_ant)10314 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
10315 				     u32 tx_ant, u32 rx_ant)
10316 {
10317 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10318 	struct ath12k *ar;
10319 	int ret = 0;
10320 	int i;
10321 
10322 	lockdep_assert_wiphy(hw->wiphy);
10323 
10324 	for_each_ar(ah, ar, i) {
10325 		ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
10326 		if (ret)
10327 			break;
10328 	}
10329 
10330 	return ret;
10331 }
10332 
ath12k_mac_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params,u8 link_id)10333 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw,
10334 				   struct ieee80211_vif *vif,
10335 				   struct ieee80211_ampdu_params *params,
10336 				   u8 link_id)
10337 {
10338 	struct ath12k *ar;
10339 	int ret = -EINVAL;
10340 
10341 	lockdep_assert_wiphy(hw->wiphy);
10342 
10343 	ar = ath12k_get_ar_by_vif(hw, vif, link_id);
10344 	if (!ar)
10345 		return -EINVAL;
10346 
10347 	switch (params->action) {
10348 	case IEEE80211_AMPDU_RX_START:
10349 		ret = ath12k_dp_rx_ampdu_start(ar, params, link_id);
10350 		break;
10351 	case IEEE80211_AMPDU_RX_STOP:
10352 		ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id);
10353 		break;
10354 	case IEEE80211_AMPDU_TX_START:
10355 	case IEEE80211_AMPDU_TX_STOP_CONT:
10356 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
10357 	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10358 	case IEEE80211_AMPDU_TX_OPERATIONAL:
10359 		/* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
10360 		 * Tx aggregation requests.
10361 		 */
10362 		ret = -EOPNOTSUPP;
10363 		break;
10364 	}
10365 
10366 	if (ret)
10367 		ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n",
10368 			    params->action, vif->addr, link_id, ret);
10369 
10370 	return ret;
10371 }
10372 
ath12k_mac_op_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)10373 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
10374 				      struct ieee80211_vif *vif,
10375 				      struct ieee80211_ampdu_params *params)
10376 {
10377 	struct ieee80211_sta *sta = params->sta;
10378 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
10379 	unsigned long links_map = ahsta->links_map;
10380 	int ret = -EINVAL;
10381 	u8 link_id;
10382 
10383 	lockdep_assert_wiphy(hw->wiphy);
10384 
10385 	if (WARN_ON(!links_map))
10386 		return ret;
10387 
10388 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10389 		ret = ath12k_mac_ampdu_action(hw, vif, params, link_id);
10390 		if (ret)
10391 			return ret;
10392 	}
10393 
10394 	return 0;
10395 }
10396 
ath12k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10397 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
10398 				     struct ieee80211_chanctx_conf *ctx)
10399 {
10400 	struct ath12k *ar;
10401 	struct ath12k_base *ab;
10402 
10403 	lockdep_assert_wiphy(hw->wiphy);
10404 
10405 	ar = ath12k_get_ar_by_ctx(hw, ctx);
10406 	if (!ar)
10407 		return -EINVAL;
10408 
10409 	ab = ar->ab;
10410 
10411 	ath12k_dbg(ab, ATH12K_DBG_MAC,
10412 		   "mac chanctx add freq %u width %d ptr %p\n",
10413 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
10414 
10415 	spin_lock_bh(&ar->data_lock);
10416 	/* TODO: In case of multiple channel context, populate rx_channel from
10417 	 * Rx PPDU desc information.
10418 	 */
10419 	ar->rx_channel = ctx->def.chan;
10420 	spin_unlock_bh(&ar->data_lock);
10421 	ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10422 
10423 	return 0;
10424 }
10425 
ath12k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10426 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
10427 					 struct ieee80211_chanctx_conf *ctx)
10428 {
10429 	struct ath12k *ar;
10430 	struct ath12k_base *ab;
10431 
10432 	lockdep_assert_wiphy(hw->wiphy);
10433 
10434 	ar = ath12k_get_ar_by_ctx(hw, ctx);
10435 	if (!ar)
10436 		return;
10437 
10438 	ab = ar->ab;
10439 
10440 	ath12k_dbg(ab, ATH12K_DBG_MAC,
10441 		   "mac chanctx remove freq %u width %d ptr %p\n",
10442 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
10443 
10444 	spin_lock_bh(&ar->data_lock);
10445 	/* TODO: In case of there is one more channel context left, populate
10446 	 * rx_channel with the channel of that remaining channel context.
10447 	 */
10448 	ar->rx_channel = NULL;
10449 	spin_unlock_bh(&ar->data_lock);
10450 	ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10451 }
10452 
10453 static enum wmi_phy_mode
ath12k_mac_check_down_grade_phy_mode(struct ath12k * ar,enum wmi_phy_mode mode,enum nl80211_band band,enum nl80211_iftype type)10454 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
10455 				     enum wmi_phy_mode mode,
10456 				     enum nl80211_band band,
10457 				     enum nl80211_iftype type)
10458 {
10459 	struct ieee80211_sta_eht_cap *eht_cap = NULL;
10460 	enum wmi_phy_mode down_mode;
10461 	int n = ar->mac.sbands[band].n_iftype_data;
10462 	int i;
10463 	struct ieee80211_sband_iftype_data *data;
10464 
10465 	if (mode < MODE_11BE_EHT20)
10466 		return mode;
10467 
10468 	data = ar->mac.iftype[band];
10469 	for (i = 0; i < n; i++) {
10470 		if (data[i].types_mask & BIT(type)) {
10471 			eht_cap = &data[i].eht_cap;
10472 			break;
10473 		}
10474 	}
10475 
10476 	if (eht_cap && eht_cap->has_eht)
10477 		return mode;
10478 
10479 	switch (mode) {
10480 	case MODE_11BE_EHT20:
10481 		down_mode = MODE_11AX_HE20;
10482 		break;
10483 	case MODE_11BE_EHT40:
10484 		down_mode = MODE_11AX_HE40;
10485 		break;
10486 	case MODE_11BE_EHT80:
10487 		down_mode = MODE_11AX_HE80;
10488 		break;
10489 	case MODE_11BE_EHT80_80:
10490 		down_mode = MODE_11AX_HE80_80;
10491 		break;
10492 	case MODE_11BE_EHT160:
10493 	case MODE_11BE_EHT160_160:
10494 	case MODE_11BE_EHT320:
10495 		down_mode = MODE_11AX_HE160;
10496 		break;
10497 	case MODE_11BE_EHT20_2G:
10498 		down_mode = MODE_11AX_HE20_2G;
10499 		break;
10500 	case MODE_11BE_EHT40_2G:
10501 		down_mode = MODE_11AX_HE40_2G;
10502 		break;
10503 	default:
10504 		down_mode = mode;
10505 		break;
10506 	}
10507 
10508 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10509 		   "mac vdev start phymode %s downgrade to %s\n",
10510 		   ath12k_mac_phymode_str(mode),
10511 		   ath12k_mac_phymode_str(down_mode));
10512 
10513 	return down_mode;
10514 }
10515 
10516 static void
ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif * arvif,struct wmi_ml_arg * ml_arg)10517 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif,
10518 			     struct wmi_ml_arg *ml_arg)
10519 {
10520 	struct ath12k_vif *ahvif = arvif->ahvif;
10521 	struct wmi_ml_partner_info *partner_info;
10522 	struct ieee80211_bss_conf *link_conf;
10523 	struct ath12k_link_vif *arvif_p;
10524 	unsigned long links;
10525 	u8 link_id;
10526 
10527 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10528 
10529 	if (!ath12k_mac_is_ml_arvif(arvif))
10530 		return;
10531 
10532 	if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS)
10533 		return;
10534 
10535 	ml_arg->enabled = true;
10536 
10537 	/* Driver always add a new link via VDEV START, FW takes
10538 	 * care of internally adding this link to existing
10539 	 * link vdevs which are advertised as partners below
10540 	 */
10541 	ml_arg->link_add = true;
10542 
10543 	ml_arg->assoc_link = arvif->is_sta_assoc_link;
10544 
10545 	partner_info = ml_arg->partner_info;
10546 
10547 	links = ahvif->links_map;
10548 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
10549 		arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10550 
10551 		if (WARN_ON(!arvif_p))
10552 			continue;
10553 
10554 		if (arvif == arvif_p)
10555 			continue;
10556 
10557 		if (!arvif_p->is_created)
10558 			continue;
10559 
10560 		link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10561 					      ahvif->vif->link_conf[arvif_p->link_id]);
10562 
10563 		if (!link_conf)
10564 			continue;
10565 
10566 		partner_info->vdev_id = arvif_p->vdev_id;
10567 		partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id;
10568 		ether_addr_copy(partner_info->addr, link_conf->addr);
10569 		ml_arg->num_partner_links++;
10570 		partner_info++;
10571 	}
10572 }
10573 
10574 static int
ath12k_mac_vdev_start_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx,bool restart)10575 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif,
10576 			      struct ieee80211_chanctx_conf *ctx,
10577 			      bool restart)
10578 {
10579 	struct ath12k *ar = arvif->ar;
10580 	struct ath12k_base *ab = ar->ab;
10581 	struct wmi_vdev_start_req_arg arg = {};
10582 	const struct cfg80211_chan_def *chandef = &ctx->def;
10583 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10584 	struct ath12k_vif *ahvif = arvif->ahvif;
10585 	struct ieee80211_bss_conf *link_conf;
10586 	unsigned int dfs_cac_time;
10587 	int ret;
10588 
10589 	lockdep_assert_wiphy(hw->wiphy);
10590 
10591 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
10592 	if (!link_conf) {
10593 		ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n",
10594 			    ahvif->vif->addr, arvif->link_id);
10595 		return -ENOLINK;
10596 	}
10597 
10598 	reinit_completion(&ar->vdev_setup_done);
10599 
10600 	arg.vdev_id = arvif->vdev_id;
10601 	arg.dtim_period = arvif->dtim_period;
10602 	arg.bcn_intval = arvif->beacon_interval;
10603 	arg.punct_bitmap = ~arvif->punct_bitmap;
10604 
10605 	arg.freq = chandef->chan->center_freq;
10606 	arg.band_center_freq1 = chandef->center_freq1;
10607 	arg.band_center_freq2 = chandef->center_freq2;
10608 	arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
10609 
10610 	arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
10611 							chandef->chan->band,
10612 							ahvif->vif->type);
10613 	arg.min_power = 0;
10614 	arg.max_power = chandef->chan->max_power;
10615 	arg.max_reg_power = chandef->chan->max_reg_power;
10616 	arg.max_antenna_gain = chandef->chan->max_antenna_gain;
10617 
10618 	arg.pref_tx_streams = ar->num_tx_chains;
10619 	arg.pref_rx_streams = ar->num_rx_chains;
10620 
10621 	arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
10622 	arg.mbssid_tx_vdev_id = 0;
10623 	if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
10624 		     ar->ab->wmi_ab.svc_map)) {
10625 		ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
10626 							  &arg.mbssid_flags,
10627 							  &arg.mbssid_tx_vdev_id);
10628 		if (ret)
10629 			return ret;
10630 	}
10631 
10632 	if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10633 		arg.ssid = ahvif->u.ap.ssid;
10634 		arg.ssid_len = ahvif->u.ap.ssid_len;
10635 		arg.hidden_ssid = ahvif->u.ap.hidden_ssid;
10636 
10637 		/* For now allow DFS for AP mode */
10638 		arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
10639 
10640 		arg.freq2_radar = ctx->radar_enabled;
10641 
10642 		arg.passive = arg.chan_radar;
10643 
10644 		spin_lock_bh(&ab->base_lock);
10645 		arg.regdomain = ar->ab->dfs_region;
10646 		spin_unlock_bh(&ab->base_lock);
10647 
10648 		/* TODO: Notify if secondary 80Mhz also needs radar detection */
10649 	}
10650 
10651 	arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
10652 
10653 	if (!restart)
10654 		ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml);
10655 
10656 	ath12k_dbg(ab, ATH12K_DBG_MAC,
10657 		   "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
10658 		   arg.vdev_id, arg.freq,
10659 		   ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
10660 
10661 	ret = ath12k_wmi_vdev_start(ar, &arg, restart);
10662 	if (ret) {
10663 		ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
10664 			    restart ? "restart" : "start", arg.vdev_id);
10665 		return ret;
10666 	}
10667 
10668 	ret = ath12k_mac_vdev_setup_sync(ar);
10669 	if (ret) {
10670 		ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
10671 			    arg.vdev_id, restart ? "restart" : "start", ret);
10672 		return ret;
10673 	}
10674 
10675 	/* TODO: For now we only set TPC power here. However when
10676 	 * channel changes, say CSA, it should be updated again.
10677 	 */
10678 	if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) {
10679 		ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx);
10680 		ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
10681 						   &arvif->reg_tpc_info);
10682 	}
10683 
10684 	ar->num_started_vdevs++;
10685 	ath12k_dbg(ab, ATH12K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
10686 		   ahvif->vif->addr, arvif->vdev_id);
10687 
10688 	/* Enable CAC Running Flag in the driver by checking all sub-channel's DFS
10689 	 * state as NL80211_DFS_USABLE which indicates CAC needs to be
10690 	 * done before channel usage. This flag is used to drop rx packets.
10691 	 * during CAC.
10692 	 */
10693 	/* TODO: Set the flag for other interface types as required */
10694 	if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
10695 	    cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) {
10696 		set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
10697 		dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef);
10698 
10699 		ath12k_dbg(ab, ATH12K_DBG_MAC,
10700 			   "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
10701 			   dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id);
10702 	}
10703 
10704 	ret = ath12k_mac_set_txbf_conf(arvif);
10705 	if (ret)
10706 		ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
10707 			    arvif->vdev_id, ret);
10708 
10709 	return 0;
10710 }
10711 
ath12k_mac_vdev_start(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10712 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif,
10713 				 struct ieee80211_chanctx_conf *ctx)
10714 {
10715 	return ath12k_mac_vdev_start_restart(arvif, ctx, false);
10716 }
10717 
ath12k_mac_vdev_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10718 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif,
10719 				   struct ieee80211_chanctx_conf *ctx)
10720 {
10721 	return ath12k_mac_vdev_start_restart(arvif, ctx, true);
10722 }
10723 
10724 struct ath12k_mac_change_chanctx_arg {
10725 	struct ieee80211_chanctx_conf *ctx;
10726 	struct ieee80211_vif_chanctx_switch *vifs;
10727 	int n_vifs;
10728 	int next_vif;
10729 	struct ath12k *ar;
10730 };
10731 
10732 static void
ath12k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10733 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
10734 				   struct ieee80211_vif *vif)
10735 {
10736 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10737 	struct ath12k_mac_change_chanctx_arg *arg = data;
10738 	struct ieee80211_bss_conf *link_conf;
10739 	struct ath12k_link_vif *arvif;
10740 	unsigned long links_map;
10741 	u8 link_id;
10742 
10743 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10744 
10745 	links_map = ahvif->links_map;
10746 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10747 		arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10748 		if (WARN_ON(!arvif))
10749 			continue;
10750 
10751 		if (!arvif->is_created || arvif->ar != arg->ar)
10752 			continue;
10753 
10754 		link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10755 					      vif->link_conf[link_id]);
10756 		if (WARN_ON(!link_conf))
10757 			continue;
10758 
10759 		if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx)
10760 			continue;
10761 
10762 		arg->n_vifs++;
10763 	}
10764 }
10765 
10766 static void
ath12k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10767 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
10768 				    struct ieee80211_vif *vif)
10769 {
10770 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10771 	struct ath12k_mac_change_chanctx_arg *arg = data;
10772 	struct ieee80211_bss_conf *link_conf;
10773 	struct ieee80211_chanctx_conf *ctx;
10774 	struct ath12k_link_vif *arvif;
10775 	unsigned long links_map;
10776 	u8 link_id;
10777 
10778 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10779 
10780 	links_map = ahvif->links_map;
10781 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10782 		arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10783 		if (WARN_ON(!arvif))
10784 			continue;
10785 
10786 		if (!arvif->is_created || arvif->ar != arg->ar)
10787 			continue;
10788 
10789 		link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10790 					      vif->link_conf[arvif->link_id]);
10791 		if (WARN_ON(!link_conf))
10792 			continue;
10793 
10794 		ctx = rcu_access_pointer(link_conf->chanctx_conf);
10795 		if (ctx != arg->ctx)
10796 			continue;
10797 
10798 		if (WARN_ON(arg->next_vif == arg->n_vifs))
10799 			return;
10800 
10801 		arg->vifs[arg->next_vif].vif = vif;
10802 		arg->vifs[arg->next_vif].old_ctx = ctx;
10803 		arg->vifs[arg->next_vif].new_ctx = ctx;
10804 		arg->vifs[arg->next_vif].link_conf = link_conf;
10805 		arg->next_vif++;
10806 	}
10807 }
10808 
ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)10809 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
10810 {
10811 	switch (width) {
10812 	case NL80211_CHAN_WIDTH_20:
10813 		return WMI_CHAN_WIDTH_20;
10814 	case NL80211_CHAN_WIDTH_40:
10815 		return WMI_CHAN_WIDTH_40;
10816 	case NL80211_CHAN_WIDTH_80:
10817 		return WMI_CHAN_WIDTH_80;
10818 	case NL80211_CHAN_WIDTH_160:
10819 		return WMI_CHAN_WIDTH_160;
10820 	case NL80211_CHAN_WIDTH_80P80:
10821 		return WMI_CHAN_WIDTH_80P80;
10822 	case NL80211_CHAN_WIDTH_5:
10823 		return WMI_CHAN_WIDTH_5;
10824 	case NL80211_CHAN_WIDTH_10:
10825 		return WMI_CHAN_WIDTH_10;
10826 	case NL80211_CHAN_WIDTH_320:
10827 		return WMI_CHAN_WIDTH_320;
10828 	default:
10829 		WARN_ON(1);
10830 		return WMI_CHAN_WIDTH_20;
10831 	}
10832 }
10833 
ath12k_mac_update_peer_puncturing_width(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def def)10834 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
10835 						   struct ath12k_link_vif *arvif,
10836 						   struct cfg80211_chan_def def)
10837 {
10838 	u32 param_id, param_value;
10839 	int ret;
10840 
10841 	if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
10842 		return 0;
10843 
10844 	param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
10845 	param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
10846 		u32_encode_bits((~def.punctured),
10847 				WMI_PEER_PUNCTURE_BITMAP);
10848 
10849 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10850 		   "punctured bitmap %02x width %d vdev %d\n",
10851 		   def.punctured, def.width, arvif->vdev_id);
10852 
10853 	ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
10854 					arvif->vdev_id, param_id,
10855 					param_value);
10856 
10857 	return ret;
10858 }
10859 
10860 static void
ath12k_mac_update_vif_chan(struct ath12k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)10861 ath12k_mac_update_vif_chan(struct ath12k *ar,
10862 			   struct ieee80211_vif_chanctx_switch *vifs,
10863 			   int n_vifs)
10864 {
10865 	struct ath12k_wmi_vdev_up_params params = {};
10866 	struct ath12k_link_vif *arvif;
10867 	struct ieee80211_bss_conf *link_conf;
10868 	struct ath12k_base *ab = ar->ab;
10869 	struct ieee80211_vif *vif;
10870 	struct ath12k_vif *ahvif;
10871 	u8 link_id;
10872 	int ret;
10873 	int i;
10874 	bool monitor_vif = false;
10875 
10876 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10877 
10878 	for (i = 0; i < n_vifs; i++) {
10879 		vif = vifs[i].vif;
10880 		ahvif = ath12k_vif_to_ahvif(vif);
10881 		link_conf = vifs[i].link_conf;
10882 		link_id = link_conf->link_id;
10883 		arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
10884 					  ahvif->link[link_id]);
10885 
10886 		if (vif->type == NL80211_IFTYPE_MONITOR) {
10887 			monitor_vif = true;
10888 			continue;
10889 		}
10890 
10891 		ath12k_dbg(ab, ATH12K_DBG_MAC,
10892 			   "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
10893 			   arvif->vdev_id,
10894 			   vifs[i].old_ctx->def.chan->center_freq,
10895 			   vifs[i].new_ctx->def.chan->center_freq,
10896 			   vifs[i].old_ctx->def.width,
10897 			   vifs[i].new_ctx->def.width);
10898 
10899 		if (WARN_ON(!arvif->is_started))
10900 			continue;
10901 
10902 		arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
10903 
10904 		/* Firmware expect vdev_restart only if vdev is up.
10905 		 * If vdev is down then it expect vdev_stop->vdev_start.
10906 		 */
10907 		if (arvif->is_up) {
10908 			ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
10909 			if (ret) {
10910 				ath12k_warn(ab, "failed to restart vdev %d: %d\n",
10911 					    arvif->vdev_id, ret);
10912 				continue;
10913 			}
10914 		} else {
10915 			ret = ath12k_mac_vdev_stop(arvif);
10916 			if (ret) {
10917 				ath12k_warn(ab, "failed to stop vdev %d: %d\n",
10918 					    arvif->vdev_id, ret);
10919 				continue;
10920 			}
10921 
10922 			ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
10923 			if (ret)
10924 				ath12k_warn(ab, "failed to start vdev %d: %d\n",
10925 					    arvif->vdev_id, ret);
10926 			continue;
10927 		}
10928 
10929 		ret = ath12k_mac_setup_bcn_tmpl(arvif);
10930 		if (ret)
10931 			ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
10932 				    ret);
10933 
10934 		memset(&params, 0, sizeof(params));
10935 		params.vdev_id = arvif->vdev_id;
10936 		params.aid = ahvif->aid;
10937 		params.bssid = arvif->bssid;
10938 		params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
10939 		if (params.tx_bssid) {
10940 			params.nontx_profile_idx = link_conf->bssid_index;
10941 			params.nontx_profile_cnt = 1 << link_conf->bssid_indicator;
10942 		}
10943 		ret = ath12k_wmi_vdev_up(arvif->ar, &params);
10944 		if (ret) {
10945 			ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
10946 				    arvif->vdev_id, ret);
10947 			continue;
10948 		}
10949 
10950 		ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
10951 							      vifs[i].new_ctx->def);
10952 		if (ret) {
10953 			ath12k_warn(ar->ab,
10954 				    "failed to update puncturing bitmap %02x and width %d: %d\n",
10955 				    vifs[i].new_ctx->def.punctured,
10956 				    vifs[i].new_ctx->def.width, ret);
10957 			continue;
10958 		}
10959 	}
10960 
10961 	/* Restart the internal monitor vdev on new channel */
10962 	if (!monitor_vif && ar->monitor_vdev_created) {
10963 		if (!ath12k_mac_monitor_stop(ar))
10964 			ath12k_mac_monitor_start(ar);
10965 	}
10966 }
10967 
10968 static void
ath12k_mac_update_active_vif_chan(struct ath12k * ar,struct ieee80211_chanctx_conf * ctx)10969 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
10970 				  struct ieee80211_chanctx_conf *ctx)
10971 {
10972 	struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
10973 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10974 
10975 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10976 
10977 	ieee80211_iterate_active_interfaces_atomic(hw,
10978 						   IEEE80211_IFACE_ITER_NORMAL,
10979 						   ath12k_mac_change_chanctx_cnt_iter,
10980 						   &arg);
10981 	if (arg.n_vifs == 0)
10982 		return;
10983 
10984 	arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
10985 	if (!arg.vifs)
10986 		return;
10987 
10988 	ieee80211_iterate_active_interfaces_atomic(hw,
10989 						   IEEE80211_IFACE_ITER_NORMAL,
10990 						   ath12k_mac_change_chanctx_fill_iter,
10991 						   &arg);
10992 
10993 	ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
10994 
10995 	kfree(arg.vifs);
10996 }
10997 
ath12k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)10998 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
10999 					 struct ieee80211_chanctx_conf *ctx,
11000 					 u32 changed)
11001 {
11002 	struct ath12k *ar;
11003 	struct ath12k_base *ab;
11004 
11005 	lockdep_assert_wiphy(hw->wiphy);
11006 
11007 	ar = ath12k_get_ar_by_ctx(hw, ctx);
11008 	if (!ar)
11009 		return;
11010 
11011 	ab = ar->ab;
11012 
11013 	ath12k_dbg(ab, ATH12K_DBG_MAC,
11014 		   "mac chanctx change freq %u width %d ptr %p changed %x\n",
11015 		   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
11016 
11017 	/* This shouldn't really happen because channel switching should use
11018 	 * switch_vif_chanctx().
11019 	 */
11020 	if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
11021 		return;
11022 
11023 	if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
11024 	    changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
11025 	    changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
11026 		ath12k_mac_update_active_vif_chan(ar, ctx);
11027 
11028 	/* TODO: Recalc radar detection */
11029 }
11030 
ath12k_start_vdev_delay(struct ath12k * ar,struct ath12k_link_vif * arvif)11031 static int ath12k_start_vdev_delay(struct ath12k *ar,
11032 				   struct ath12k_link_vif *arvif)
11033 {
11034 	struct ath12k_base *ab = ar->ab;
11035 	struct ath12k_vif *ahvif = arvif->ahvif;
11036 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
11037 	struct ieee80211_chanctx_conf *chanctx;
11038 	struct ieee80211_bss_conf *link_conf;
11039 	int ret;
11040 
11041 	if (WARN_ON(arvif->is_started))
11042 		return -EBUSY;
11043 
11044 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
11045 	if (!link_conf) {
11046 		ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id);
11047 		return -EINVAL;
11048 	}
11049 
11050 	chanctx	= wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy,
11051 				    link_conf->chanctx_conf);
11052 	ret = ath12k_mac_vdev_start(arvif, chanctx);
11053 	if (ret) {
11054 		ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11055 			    arvif->vdev_id, vif->addr,
11056 			    chanctx->def.chan->center_freq, ret);
11057 		return ret;
11058 	}
11059 
11060 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11061 		ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
11062 		if (ret) {
11063 			ath12k_warn(ab, "failed put monitor up: %d\n", ret);
11064 			return ret;
11065 		}
11066 	}
11067 
11068 	arvif->is_started = true;
11069 
11070 	/* TODO: Setup ps and cts/rts protection */
11071 	return 0;
11072 }
11073 
ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def * chan_def)11074 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
11075 {
11076 	if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
11077 		switch (chan_def->width) {
11078 		case NL80211_CHAN_WIDTH_20:
11079 			return 1;
11080 		case NL80211_CHAN_WIDTH_40:
11081 			return 2;
11082 		case NL80211_CHAN_WIDTH_80:
11083 			return 4;
11084 		case NL80211_CHAN_WIDTH_160:
11085 			return 8;
11086 		case NL80211_CHAN_WIDTH_320:
11087 			return 16;
11088 		default:
11089 			return 1;
11090 		}
11091 	} else {
11092 		switch (chan_def->width) {
11093 		case NL80211_CHAN_WIDTH_20:
11094 			return 1;
11095 		case NL80211_CHAN_WIDTH_40:
11096 			return 2;
11097 		case NL80211_CHAN_WIDTH_80:
11098 			return 3;
11099 		case NL80211_CHAN_WIDTH_160:
11100 			return 4;
11101 		case NL80211_CHAN_WIDTH_320:
11102 			return 5;
11103 		default:
11104 			return 1;
11105 		}
11106 	}
11107 }
11108 
ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def * chan_def)11109 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
11110 {
11111 	u16 diff_seq;
11112 
11113 	/* It is to get the lowest channel number's center frequency of the chan.
11114 	 * For example,
11115 	 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
11116 	 * with center frequency 5955, its diff is 5965 - 5955 = 10.
11117 	 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
11118 	 * with center frequency 5955, its diff is 5985 - 5955 = 30.
11119 	 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
11120 	 * with center frequency 5955, its diff is 6025 - 5955 = 70.
11121 	 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1
11122 	 * with center frequency 5955, its diff is 6105 - 5955 = 70.
11123 	 */
11124 	switch (chan_def->width) {
11125 	case NL80211_CHAN_WIDTH_320:
11126 		diff_seq = 150;
11127 		break;
11128 	case NL80211_CHAN_WIDTH_160:
11129 		diff_seq = 70;
11130 		break;
11131 	case NL80211_CHAN_WIDTH_80:
11132 		diff_seq = 30;
11133 		break;
11134 	case NL80211_CHAN_WIDTH_40:
11135 		diff_seq = 10;
11136 		break;
11137 	default:
11138 		diff_seq = 0;
11139 	}
11140 
11141 	return chan_def->center_freq1 - diff_seq;
11142 }
11143 
ath12k_mac_get_seg_freq(struct cfg80211_chan_def * chan_def,u16 start_seq,u8 seq)11144 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
11145 				   u16 start_seq, u8 seq)
11146 {
11147 	u16 seg_seq;
11148 
11149 	/* It is to get the center frequency of the specific bandwidth.
11150 	 * start_seq means the lowest channel number's center frequency.
11151 	 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz.
11152 	 * For example,
11153 	 * lowest channel is 1, its center frequency 5955,
11154 	 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
11155 	 * lowest channel is 1, its center frequency 5955,
11156 	 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
11157 	 * lowest channel is 1, its center frequency 5955,
11158 	 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
11159 	 * lowest channel is 1, its center frequency 5955,
11160 	 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
11161 	 */
11162 	seg_seq = 10 * (BIT(seq) - 1);
11163 	return seg_seq + start_seq;
11164 }
11165 
ath12k_mac_get_psd_channel(struct ath12k * ar,u16 step_freq,u16 * start_freq,u16 * center_freq,u8 i,struct ieee80211_channel ** temp_chan,s8 * tx_power)11166 static void ath12k_mac_get_psd_channel(struct ath12k *ar,
11167 				       u16 step_freq,
11168 				       u16 *start_freq,
11169 				       u16 *center_freq,
11170 				       u8 i,
11171 				       struct ieee80211_channel **temp_chan,
11172 				       s8 *tx_power)
11173 {
11174 	/* It is to get the center frequency for each 20 MHz.
11175 	 * For example, if the chan is 160 MHz and center frequency is 6025,
11176 	 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
11177 	 * channel number 1's center frequency is 5955, it is parameter start_freq.
11178 	 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
11179 	 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
11180 	 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
11181 	 * the gap is 20 for each channel, parameter step_freq means the gap.
11182 	 * after get the center frequency of each channel, it is easy to find the
11183 	 * struct ieee80211_channel of it and get the max_reg_power.
11184 	 */
11185 	*center_freq = *start_freq + i * step_freq;
11186 	*temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11187 	*tx_power = (*temp_chan)->max_reg_power;
11188 }
11189 
ath12k_mac_get_eirp_power(struct ath12k * ar,u16 * start_freq,u16 * center_freq,u8 i,struct ieee80211_channel ** temp_chan,struct cfg80211_chan_def * def,s8 * tx_power)11190 static void ath12k_mac_get_eirp_power(struct ath12k *ar,
11191 				      u16 *start_freq,
11192 				      u16 *center_freq,
11193 				      u8 i,
11194 				      struct ieee80211_channel **temp_chan,
11195 				      struct cfg80211_chan_def *def,
11196 				      s8 *tx_power)
11197 {
11198 	/* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
11199 	 * 160 MHz bandwidth, and then plus 10 to the center frequency,
11200 	 * it is the center frequency of a channel number.
11201 	 * For example, when configured channel number is 1.
11202 	 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
11203 	 * then it is channel number 5.
11204 	 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
11205 	 * then it is channel number 9.
11206 	 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
11207 	 * then it is channel number 17.
11208 	 * after get the center frequency of each channel, it is easy to find the
11209 	 * struct ieee80211_channel of it and get the max_reg_power.
11210 	 */
11211 	*center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i);
11212 
11213 	/* For the 20 MHz, its center frequency is same with same channel */
11214 	if (i != 0)
11215 		*center_freq += 10;
11216 
11217 	*temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11218 	*tx_power = (*temp_chan)->max_reg_power;
11219 }
11220 
ath12k_mac_fill_reg_tpc_info(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11221 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
11222 				  struct ath12k_link_vif *arvif,
11223 				  struct ieee80211_chanctx_conf *ctx)
11224 {
11225 	struct ath12k_base *ab = ar->ab;
11226 	struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
11227 	struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11228 	struct ieee80211_channel *chan, *temp_chan;
11229 	u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
11230 	bool is_psd_power = false, is_tpe_present = false;
11231 	s8 max_tx_power[ATH12K_NUM_PWR_LEVELS],
11232 		psd_power, tx_power, eirp_power;
11233 	struct ath12k_vif *ahvif = arvif->ahvif;
11234 	u16 start_freq, center_freq;
11235 	u8 reg_6ghz_power_mode;
11236 
11237 	chan = ctx->def.chan;
11238 	start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def);
11239 	pwr_reduction = bss_conf->pwr_reduction;
11240 
11241 	if (arvif->reg_tpc_info.num_pwr_levels) {
11242 		is_tpe_present = true;
11243 		num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
11244 	} else {
11245 		num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def);
11246 	}
11247 
11248 	for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
11249 		/* STA received TPE IE*/
11250 		if (is_tpe_present) {
11251 			/* local power is PSD power*/
11252 			if (chan->flags & IEEE80211_CHAN_PSD) {
11253 				/* Connecting AP is psd power */
11254 				if (reg_tpc_info->is_psd_power) {
11255 					is_psd_power = true;
11256 					ath12k_mac_get_psd_channel(ar, 20,
11257 								   &start_freq,
11258 								   &center_freq,
11259 								   pwr_lvl_idx,
11260 								   &temp_chan,
11261 								   &tx_power);
11262 					psd_power = temp_chan->psd;
11263 					eirp_power = tx_power;
11264 					max_tx_power[pwr_lvl_idx] =
11265 						min_t(s8,
11266 						      psd_power,
11267 						      reg_tpc_info->tpe[pwr_lvl_idx]);
11268 				/* Connecting AP is not psd power */
11269 				} else {
11270 					ath12k_mac_get_eirp_power(ar,
11271 								  &start_freq,
11272 								  &center_freq,
11273 								  pwr_lvl_idx,
11274 								  &temp_chan,
11275 								  &ctx->def,
11276 								  &tx_power);
11277 					psd_power = temp_chan->psd;
11278 					/* convert psd power to EIRP power based
11279 					 * on channel width
11280 					 */
11281 					tx_power =
11282 						min_t(s8, tx_power,
11283 						      psd_power + 13 + pwr_lvl_idx * 3);
11284 					max_tx_power[pwr_lvl_idx] =
11285 						min_t(s8,
11286 						      tx_power,
11287 						      reg_tpc_info->tpe[pwr_lvl_idx]);
11288 				}
11289 			/* local power is not PSD power */
11290 			} else {
11291 				/* Connecting AP is psd power */
11292 				if (reg_tpc_info->is_psd_power) {
11293 					is_psd_power = true;
11294 					ath12k_mac_get_psd_channel(ar, 20,
11295 								   &start_freq,
11296 								   &center_freq,
11297 								   pwr_lvl_idx,
11298 								   &temp_chan,
11299 								   &tx_power);
11300 					eirp_power = tx_power;
11301 					max_tx_power[pwr_lvl_idx] =
11302 						reg_tpc_info->tpe[pwr_lvl_idx];
11303 				/* Connecting AP is not psd power */
11304 				} else {
11305 					ath12k_mac_get_eirp_power(ar,
11306 								  &start_freq,
11307 								  &center_freq,
11308 								  pwr_lvl_idx,
11309 								  &temp_chan,
11310 								  &ctx->def,
11311 								  &tx_power);
11312 					max_tx_power[pwr_lvl_idx] =
11313 						min_t(s8,
11314 						      tx_power,
11315 						      reg_tpc_info->tpe[pwr_lvl_idx]);
11316 				}
11317 			}
11318 		/* STA not received TPE IE */
11319 		} else {
11320 			/* local power is PSD power*/
11321 			if (chan->flags & IEEE80211_CHAN_PSD) {
11322 				is_psd_power = true;
11323 				ath12k_mac_get_psd_channel(ar, 20,
11324 							   &start_freq,
11325 							   &center_freq,
11326 							   pwr_lvl_idx,
11327 							   &temp_chan,
11328 							   &tx_power);
11329 				psd_power = temp_chan->psd;
11330 				eirp_power = tx_power;
11331 				max_tx_power[pwr_lvl_idx] = psd_power;
11332 			} else {
11333 				ath12k_mac_get_eirp_power(ar,
11334 							  &start_freq,
11335 							  &center_freq,
11336 							  pwr_lvl_idx,
11337 							  &temp_chan,
11338 							  &ctx->def,
11339 							  &tx_power);
11340 				max_tx_power[pwr_lvl_idx] = tx_power;
11341 			}
11342 		}
11343 
11344 		if (is_psd_power) {
11345 			/* If AP local power constraint is present */
11346 			if (pwr_reduction)
11347 				eirp_power = eirp_power - pwr_reduction;
11348 
11349 			/* If firmware updated max tx power is non zero, then take
11350 			 * the min of firmware updated ap tx power
11351 			 * and max power derived from above mentioned parameters.
11352 			 */
11353 			ath12k_dbg(ab, ATH12K_DBG_MAC,
11354 				   "eirp power : %d firmware report power : %d\n",
11355 				   eirp_power, ar->max_allowed_tx_power);
11356 			/* Firmware reports lower max_allowed_tx_power during vdev
11357 			 * start response. In case of 6 GHz, firmware is not aware
11358 			 * of EIRP power unless driver sets EIRP power through WMI
11359 			 * TPC command. So radio which does not support idle power
11360 			 * save can set maximum calculated EIRP power directly to
11361 			 * firmware through TPC command without min comparison with
11362 			 * vdev start response's max_allowed_tx_power.
11363 			 */
11364 			if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11365 				eirp_power = min_t(s8,
11366 						   eirp_power,
11367 						   ar->max_allowed_tx_power);
11368 		} else {
11369 			/* If AP local power constraint is present */
11370 			if (pwr_reduction)
11371 				max_tx_power[pwr_lvl_idx] =
11372 					max_tx_power[pwr_lvl_idx] - pwr_reduction;
11373 			/* If firmware updated max tx power is non zero, then take
11374 			 * the min of firmware updated ap tx power
11375 			 * and max power derived from above mentioned parameters.
11376 			 */
11377 			if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11378 				max_tx_power[pwr_lvl_idx] =
11379 					min_t(s8,
11380 					      max_tx_power[pwr_lvl_idx],
11381 					      ar->max_allowed_tx_power);
11382 		}
11383 		reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
11384 		reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
11385 			max_tx_power[pwr_lvl_idx];
11386 	}
11387 
11388 	reg_tpc_info->num_pwr_levels = num_pwr_levels;
11389 	reg_tpc_info->is_psd_power = is_psd_power;
11390 	reg_tpc_info->eirp_power = eirp_power;
11391 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11392 		reg_6ghz_power_mode = bss_conf->power_type;
11393 	else
11394 		/* For now, LPI is the only supported AP power mode */
11395 		reg_6ghz_power_mode = IEEE80211_REG_LPI_AP;
11396 
11397 	reg_tpc_info->ap_power_type =
11398 		ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode);
11399 }
11400 
ath12k_mac_parse_tx_pwr_env(struct ath12k * ar,struct ath12k_link_vif * arvif)11401 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar,
11402 					struct ath12k_link_vif *arvif)
11403 {
11404 	struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11405 	struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info;
11406 	struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd;
11407 	struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd;
11408 	struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe;
11409 	enum wmi_reg_6g_client_type client_type;
11410 	struct ath12k_reg_info *reg_info;
11411 	struct ath12k_base *ab = ar->ab;
11412 	bool psd_valid, non_psd_valid;
11413 	int i;
11414 
11415 	reg_info = ab->reg_info[ar->pdev_idx];
11416 	client_type = reg_info->client_type;
11417 
11418 	local_psd = &tpe->psd_local[client_type];
11419 	reg_psd = &tpe->psd_reg_client[client_type];
11420 	local_non_psd = &tpe->max_local[client_type];
11421 	reg_non_psd = &tpe->max_reg_client[client_type];
11422 
11423 	psd_valid = local_psd->valid | reg_psd->valid;
11424 	non_psd_valid = local_non_psd->valid | reg_non_psd->valid;
11425 
11426 	if (!psd_valid && !non_psd_valid) {
11427 		ath12k_warn(ab,
11428 			    "no transmit power envelope match client power type %d\n",
11429 			    client_type);
11430 		return;
11431 	}
11432 
11433 	if (psd_valid) {
11434 		tpc_info->is_psd_power = true;
11435 
11436 		tpc_info->num_pwr_levels = max(local_psd->count,
11437 					       reg_psd->count);
11438 		if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS)
11439 			tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS;
11440 
11441 		for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11442 			tpc_info->tpe[i] = min(local_psd->power[i],
11443 					       reg_psd->power[i]) / 2;
11444 			ath12k_dbg(ab, ATH12K_DBG_MAC,
11445 				   "TPE PSD power[%d] : %d\n",
11446 				   i, tpc_info->tpe[i]);
11447 		}
11448 	} else {
11449 		tpc_info->is_psd_power = false;
11450 		tpc_info->eirp_power = 0;
11451 
11452 		tpc_info->num_pwr_levels = max(local_non_psd->count,
11453 					       reg_non_psd->count);
11454 		if (tpc_info->num_pwr_levels > ATH12K_NUM_PWR_LEVELS)
11455 			tpc_info->num_pwr_levels = ATH12K_NUM_PWR_LEVELS;
11456 
11457 		for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11458 			tpc_info->tpe[i] = min(local_non_psd->power[i],
11459 					       reg_non_psd->power[i]) / 2;
11460 			ath12k_dbg(ab, ATH12K_DBG_MAC,
11461 				   "non PSD power[%d] : %d\n",
11462 				   i, tpc_info->tpe[i]);
11463 		}
11464 	}
11465 }
11466 
11467 static int
ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf,struct ieee80211_chanctx_conf * ctx)11468 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
11469 				 struct ieee80211_vif *vif,
11470 				 struct ieee80211_bss_conf *link_conf,
11471 				 struct ieee80211_chanctx_conf *ctx)
11472 {
11473 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11474 	struct ath12k *ar;
11475 	struct ath12k_base *ab;
11476 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11477 	u8 link_id = link_conf->link_id;
11478 	struct ath12k_link_vif *arvif;
11479 	int ret;
11480 
11481 	lockdep_assert_wiphy(hw->wiphy);
11482 
11483 	/* For multi radio wiphy, the vdev was not created during add_interface
11484 	 * create now since we have a channel ctx now to assign to a specific ar/fw
11485 	 */
11486 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
11487 	if (!arvif) {
11488 		WARN_ON(1);
11489 		return -ENOMEM;
11490 	}
11491 
11492 	ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
11493 	if (!ar) {
11494 		ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started",
11495 			       vif->addr, link_id);
11496 		return -EINVAL;
11497 	}
11498 
11499 	ab = ar->ab;
11500 
11501 	ath12k_dbg(ab, ATH12K_DBG_MAC,
11502 		   "mac chanctx assign ptr %p vdev_id %i\n",
11503 		   ctx, arvif->vdev_id);
11504 
11505 	if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
11506 	    ctx->def.chan->band == NL80211_BAND_6GHZ &&
11507 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11508 		ath12k_mac_parse_tx_pwr_env(ar, arvif);
11509 
11510 	arvif->punct_bitmap = ctx->def.punctured;
11511 
11512 	/* for some targets bss peer must be created before vdev_start */
11513 	if (ab->hw_params->vdev_start_delay &&
11514 	    ahvif->vdev_type != WMI_VDEV_TYPE_AP &&
11515 	    ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
11516 	    !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
11517 		ret = 0;
11518 		goto out;
11519 	}
11520 
11521 	if (WARN_ON(arvif->is_started)) {
11522 		ret = -EBUSY;
11523 		goto out;
11524 	}
11525 
11526 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11527 		ret = ath12k_mac_monitor_start(ar);
11528 		if (ret) {
11529 			ath12k_mac_monitor_vdev_delete(ar);
11530 			goto out;
11531 		}
11532 
11533 		arvif->is_started = true;
11534 		goto out;
11535 	}
11536 
11537 	ret = ath12k_mac_vdev_start(arvif, ctx);
11538 	if (ret) {
11539 		ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11540 			    arvif->vdev_id, vif->addr,
11541 			    ctx->def.chan->center_freq, ret);
11542 		goto out;
11543 	}
11544 
11545 	arvif->is_started = true;
11546 
11547 	/* TODO: Setup ps and cts/rts protection */
11548 
11549 out:
11550 	return ret;
11551 }
11552 
11553 static void
ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf,struct ieee80211_chanctx_conf * ctx)11554 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
11555 				   struct ieee80211_vif *vif,
11556 				   struct ieee80211_bss_conf *link_conf,
11557 				   struct ieee80211_chanctx_conf *ctx)
11558 {
11559 	struct ath12k *ar;
11560 	struct ath12k_base *ab;
11561 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11562 	struct ath12k_link_vif *arvif;
11563 	u8 link_id = link_conf->link_id;
11564 	int ret;
11565 
11566 	lockdep_assert_wiphy(hw->wiphy);
11567 
11568 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11569 
11570 	/* The vif is expected to be attached to an ar's VDEV.
11571 	 * We leave the vif/vdev in this function as is
11572 	 * and not delete the vdev symmetric to assign_vif_chanctx()
11573 	 * the VDEV will be deleted and unassigned either during
11574 	 * remove_interface() or when there is a change in channel
11575 	 * that moves the vif to a new ar
11576 	 */
11577 	if (!arvif || !arvif->is_created)
11578 		return;
11579 
11580 	ar = arvif->ar;
11581 	ab = ar->ab;
11582 
11583 	ath12k_dbg(ab, ATH12K_DBG_MAC,
11584 		   "mac chanctx unassign ptr %p vdev_id %i\n",
11585 		   ctx, arvif->vdev_id);
11586 
11587 	WARN_ON(!arvif->is_started);
11588 
11589 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11590 		ret = ath12k_mac_monitor_stop(ar);
11591 		if (ret)
11592 			return;
11593 
11594 		arvif->is_started = false;
11595 	}
11596 
11597 	if (ahvif->vdev_type != WMI_VDEV_TYPE_STA &&
11598 	    ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
11599 		ath12k_bss_disassoc(ar, arvif);
11600 		ret = ath12k_mac_vdev_stop(arvif);
11601 		if (ret)
11602 			ath12k_warn(ab, "failed to stop vdev %i: %d\n",
11603 				    arvif->vdev_id, ret);
11604 	}
11605 	arvif->is_started = false;
11606 
11607 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
11608 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
11609 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
11610 	    ar->state_11d != ATH12K_11D_PREPARING) {
11611 		reinit_completion(&ar->completed_11d_scan);
11612 		ar->state_11d = ATH12K_11D_PREPARING;
11613 	}
11614 
11615 	if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) {
11616 		ath12k_scan_abort(ar);
11617 		ar->scan.arvif = NULL;
11618 	}
11619 }
11620 
11621 static int
ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode)11622 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
11623 				 struct ieee80211_vif_chanctx_switch *vifs,
11624 				 int n_vifs,
11625 				 enum ieee80211_chanctx_switch_mode mode)
11626 {
11627 	struct ath12k *ar;
11628 
11629 	lockdep_assert_wiphy(hw->wiphy);
11630 
11631 	ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx);
11632 	if (!ar)
11633 		return -EINVAL;
11634 
11635 	/* Switching channels across radio is not allowed */
11636 	if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
11637 		return -EINVAL;
11638 
11639 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11640 		   "mac chanctx switch n_vifs %d mode %d\n",
11641 		   n_vifs, mode);
11642 	ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
11643 
11644 	return 0;
11645 }
11646 
11647 static int
ath12k_set_vdev_param_to_all_vifs(struct ath12k * ar,int param,u32 value)11648 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
11649 {
11650 	struct ath12k_link_vif *arvif;
11651 	int ret = 0;
11652 
11653 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11654 
11655 	list_for_each_entry(arvif, &ar->arvifs, list) {
11656 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
11657 			   param, arvif->vdev_id, value);
11658 
11659 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11660 						    param, value);
11661 		if (ret) {
11662 			ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
11663 				    param, arvif->vdev_id, ret);
11664 			break;
11665 		}
11666 	}
11667 
11668 	return ret;
11669 }
11670 
11671 /* mac80211 stores device specific RTS/Fragmentation threshold value,
11672  * this is set interface specific to firmware from ath12k driver
11673  */
ath12k_mac_op_set_rts_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11674 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
11675 					   int radio_idx, u32 value)
11676 {
11677 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11678 	struct ath12k *ar;
11679 	int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD, ret = 0, i;
11680 
11681 	lockdep_assert_wiphy(hw->wiphy);
11682 
11683 	/* Currently we set the rts threshold value to all the vifs across
11684 	 * all radios of the single wiphy.
11685 	 * TODO Once support for vif specific RTS threshold in mac80211 is
11686 	 * available, ath12k can make use of it.
11687 	 */
11688 	for_each_ar(ah, ar, i) {
11689 		ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11690 		if (ret) {
11691 			ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d",
11692 				    ar->pdev->pdev_id);
11693 			break;
11694 		}
11695 	}
11696 
11697 	return ret;
11698 }
11699 
ath12k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11700 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
11701 					    int radio_idx, u32 value)
11702 {
11703 	/* Even though there's a WMI vdev param for fragmentation threshold no
11704 	 * known firmware actually implements it. Moreover it is not possible to
11705 	 * rely frame fragmentation to mac80211 because firmware clears the
11706 	 * "more fragments" bit in frame control making it impossible for remote
11707 	 * devices to reassemble frames.
11708 	 *
11709 	 * Hence implement a dummy callback just to say fragmentation isn't
11710 	 * supported. This effectively prevents mac80211 from doing frame
11711 	 * fragmentation in software.
11712 	 */
11713 
11714 	lockdep_assert_wiphy(hw->wiphy);
11715 
11716 	return -EOPNOTSUPP;
11717 }
11718 
ath12k_mac_flush(struct ath12k * ar)11719 static int ath12k_mac_flush(struct ath12k *ar)
11720 {
11721 	long time_left;
11722 	int ret = 0;
11723 
11724 	time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
11725 				       (atomic_read(&ar->dp.num_tx_pending) == 0),
11726 				       ATH12K_FLUSH_TIMEOUT);
11727 	if (time_left == 0) {
11728 		ath12k_warn(ar->ab,
11729 			    "failed to flush transmit queue, data pkts pending %d\n",
11730 			    atomic_read(&ar->dp.num_tx_pending));
11731 		ret = -ETIMEDOUT;
11732 	}
11733 
11734 	time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
11735 				       (atomic_read(&ar->num_pending_mgmt_tx) == 0),
11736 				       ATH12K_FLUSH_TIMEOUT);
11737 	if (time_left == 0) {
11738 		ath12k_warn(ar->ab,
11739 			    "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
11740 			    atomic_read(&ar->num_pending_mgmt_tx));
11741 		ret = -ETIMEDOUT;
11742 	}
11743 
11744 	return ret;
11745 }
11746 
ath12k_mac_wait_tx_complete(struct ath12k * ar)11747 int ath12k_mac_wait_tx_complete(struct ath12k *ar)
11748 {
11749 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11750 
11751 	ath12k_mac_drain_tx(ar);
11752 	return ath12k_mac_flush(ar);
11753 }
11754 
ath12k_mac_op_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)11755 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
11756 				u32 queues, bool drop)
11757 {
11758 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11759 	struct ath12k_link_vif *arvif;
11760 	struct ath12k_vif *ahvif;
11761 	unsigned long links;
11762 	struct ath12k *ar;
11763 	u8 link_id;
11764 	int i;
11765 
11766 	lockdep_assert_wiphy(hw->wiphy);
11767 
11768 	if (drop)
11769 		return;
11770 
11771 	/* vif can be NULL when flush() is considered for hw */
11772 	if (!vif) {
11773 		for_each_ar(ah, ar, i)
11774 			ath12k_mac_flush(ar);
11775 		return;
11776 	}
11777 
11778 	for_each_ar(ah, ar, i)
11779 		wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work);
11780 
11781 	ahvif = ath12k_vif_to_ahvif(vif);
11782 	links = ahvif->links_map;
11783 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
11784 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11785 		if (!(arvif && arvif->ar))
11786 			continue;
11787 
11788 		ath12k_mac_flush(arvif->ar);
11789 	}
11790 }
11791 
11792 static int
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11793 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
11794 				     enum nl80211_band band,
11795 				     const struct cfg80211_bitrate_mask *mask)
11796 {
11797 	int num_rates = 0;
11798 	int i;
11799 
11800 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
11801 		num_rates += hweight16(mask->control[band].ht_mcs[i]);
11802 
11803 	return num_rates;
11804 }
11805 
11806 static bool
ath12k_mac_has_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11807 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
11808 				  enum nl80211_band band,
11809 				  const struct cfg80211_bitrate_mask *mask)
11810 {
11811 	int num_rates = 0;
11812 
11813 	num_rates = hweight32(mask->control[band].legacy);
11814 
11815 	if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
11816 		return false;
11817 
11818 	if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
11819 		return false;
11820 
11821 	if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask))
11822 		return false;
11823 
11824 	return num_rates == 1;
11825 }
11826 
11827 static __le16
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap * he_cap)11828 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
11829 {
11830 	if (he_cap->he_cap_elem.phy_cap_info[0] &
11831 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
11832 		return he_cap->he_mcs_nss_supp.tx_mcs_160;
11833 
11834 	return he_cap->he_mcs_nss_supp.tx_mcs_80;
11835 }
11836 
11837 static bool
ath12k_mac_bitrate_mask_get_single_nss(struct ath12k * ar,struct ieee80211_vif * vif,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,int * nss)11838 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
11839 				       struct ieee80211_vif *vif,
11840 				       enum nl80211_band band,
11841 				       const struct cfg80211_bitrate_mask *mask,
11842 				       int *nss)
11843 {
11844 	struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
11845 	u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
11846 	const struct ieee80211_sta_he_cap *he_cap;
11847 	u16 he_mcs_map = 0;
11848 	u8 ht_nss_mask = 0;
11849 	u8 vht_nss_mask = 0;
11850 	u8 he_nss_mask = 0;
11851 	int i;
11852 
11853 	/* No need to consider legacy here. Basic rates are always present
11854 	 * in bitrate mask
11855 	 */
11856 
11857 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
11858 		if (mask->control[band].ht_mcs[i] == 0)
11859 			continue;
11860 		else if (mask->control[band].ht_mcs[i] ==
11861 			 sband->ht_cap.mcs.rx_mask[i])
11862 			ht_nss_mask |= BIT(i);
11863 		else
11864 			return false;
11865 	}
11866 
11867 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
11868 		if (mask->control[band].vht_mcs[i] == 0)
11869 			continue;
11870 		else if (mask->control[band].vht_mcs[i] ==
11871 			 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
11872 			vht_nss_mask |= BIT(i);
11873 		else
11874 			return false;
11875 	}
11876 
11877 	he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif);
11878 	if (!he_cap)
11879 		return false;
11880 
11881 	he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap));
11882 
11883 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
11884 		if (mask->control[band].he_mcs[i] == 0)
11885 			continue;
11886 
11887 		if (mask->control[band].he_mcs[i] ==
11888 		    ath12k_mac_get_max_he_mcs_map(he_mcs_map, i))
11889 			he_nss_mask |= BIT(i);
11890 		else
11891 			return false;
11892 	}
11893 
11894 	if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
11895 		return false;
11896 
11897 	if (ht_nss_mask == 0)
11898 		return false;
11899 
11900 	if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
11901 		return false;
11902 
11903 	*nss = fls(ht_nss_mask);
11904 
11905 	return true;
11906 }
11907 
11908 static int
ath12k_mac_get_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,u32 * rate,u8 * nss)11909 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
11910 				  enum nl80211_band band,
11911 				  const struct cfg80211_bitrate_mask *mask,
11912 				  u32 *rate, u8 *nss)
11913 {
11914 	int rate_idx;
11915 	u16 bitrate;
11916 	u8 preamble;
11917 	u8 hw_rate;
11918 
11919 	if (hweight32(mask->control[band].legacy) != 1)
11920 		return -EINVAL;
11921 
11922 	rate_idx = ffs(mask->control[band].legacy) - 1;
11923 
11924 	if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
11925 		rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
11926 
11927 	hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
11928 	bitrate = ath12k_legacy_rates[rate_idx].bitrate;
11929 
11930 	if (ath12k_mac_bitrate_is_cck(bitrate))
11931 		preamble = WMI_RATE_PREAMBLE_CCK;
11932 	else
11933 		preamble = WMI_RATE_PREAMBLE_OFDM;
11934 
11935 	*nss = 1;
11936 	*rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
11937 
11938 	return 0;
11939 }
11940 
11941 static int
ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif * arvif,u8 he_gi,u8 he_ltf)11942 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf)
11943 {
11944 	struct ath12k *ar = arvif->ar;
11945 	int ret;
11946 
11947 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11948 
11949 	/* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
11950 	if (he_gi && he_gi != 0xFF)
11951 		he_gi += 1;
11952 
11953 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11954 					    WMI_VDEV_PARAM_SGI, he_gi);
11955 	if (ret) {
11956 		ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n",
11957 			    he_gi, ret);
11958 		return ret;
11959 	}
11960 	/* start from 1 */
11961 	if (he_ltf != 0xFF)
11962 		he_ltf += 1;
11963 
11964 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11965 					    WMI_VDEV_PARAM_HE_LTF, he_ltf);
11966 	if (ret) {
11967 		ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n",
11968 			    he_ltf, ret);
11969 		return ret;
11970 	}
11971 	return 0;
11972 }
11973 
11974 static int
ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif * arvif,u16 he_gi,u8 he_ltf)11975 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf)
11976 {
11977 	struct ath12k *ar = arvif->ar;
11978 	int ret;
11979 	u32 he_ar_gi_ltf;
11980 
11981 	if (he_gi != 0xFF) {
11982 		switch (he_gi) {
11983 		case NL80211_RATE_INFO_HE_GI_0_8:
11984 			he_gi = WMI_AUTORATE_800NS_GI;
11985 			break;
11986 		case NL80211_RATE_INFO_HE_GI_1_6:
11987 			he_gi = WMI_AUTORATE_1600NS_GI;
11988 			break;
11989 		case NL80211_RATE_INFO_HE_GI_3_2:
11990 			he_gi = WMI_AUTORATE_3200NS_GI;
11991 			break;
11992 		default:
11993 			ath12k_warn(ar->ab, "Invalid GI\n");
11994 			return -EINVAL;
11995 		}
11996 	}
11997 
11998 	if (he_ltf != 0xFF) {
11999 		switch (he_ltf) {
12000 		case NL80211_RATE_INFO_HE_1XLTF:
12001 			he_ltf = WMI_HE_AUTORATE_LTF_1X;
12002 			break;
12003 		case NL80211_RATE_INFO_HE_2XLTF:
12004 			he_ltf = WMI_HE_AUTORATE_LTF_2X;
12005 			break;
12006 		case NL80211_RATE_INFO_HE_4XLTF:
12007 			he_ltf = WMI_HE_AUTORATE_LTF_4X;
12008 			break;
12009 		default:
12010 			ath12k_warn(ar->ab, "Invalid LTF\n");
12011 			return -EINVAL;
12012 		}
12013 	}
12014 
12015 	he_ar_gi_ltf = he_gi | he_ltf;
12016 
12017 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12018 					    WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
12019 					    he_ar_gi_ltf);
12020 	if (ret) {
12021 		ath12k_warn(ar->ab,
12022 			    "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n",
12023 			    he_gi, he_ltf, ret);
12024 		return ret;
12025 	}
12026 
12027 	return 0;
12028 }
12029 
ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)12030 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
12031 {
12032 	switch (gi) {
12033 	case NL80211_TXRATE_DEFAULT_GI:
12034 		return WMI_GI_400_NS;
12035 	case NL80211_TXRATE_FORCE_LGI:
12036 		return WMI_GI_800_NS;
12037 	default:
12038 		return WMI_GI_400_NS;
12039 	}
12040 }
12041 
ath12k_mac_set_rate_params(struct ath12k_link_vif * arvif,u32 rate,u8 nss,u8 sgi,u8 ldpc,u8 he_gi,u8 he_ltf,bool he_fixed_rate)12042 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
12043 				      u32 rate, u8 nss, u8 sgi, u8 ldpc,
12044 				      u8 he_gi, u8 he_ltf, bool he_fixed_rate)
12045 {
12046 	struct ieee80211_bss_conf *link_conf;
12047 	struct ath12k *ar = arvif->ar;
12048 	u32 vdev_param;
12049 	u32 param_value;
12050 	int ret;
12051 	bool he_support;
12052 
12053 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12054 
12055 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
12056 	if (!link_conf)
12057 		return -EINVAL;
12058 
12059 	he_support = link_conf->he_support;
12060 
12061 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12062 		   "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n",
12063 		   arvif->vdev_id, rate, nss, sgi, ldpc);
12064 
12065 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12066 		   "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
12067 		   he_ltf, he_fixed_rate);
12068 
12069 	if (!he_support) {
12070 		vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
12071 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12072 						    vdev_param, rate);
12073 		if (ret) {
12074 			ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
12075 				    rate, ret);
12076 			return ret;
12077 		}
12078 	}
12079 
12080 	vdev_param = WMI_VDEV_PARAM_NSS;
12081 
12082 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12083 					    vdev_param, nss);
12084 	if (ret) {
12085 		ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
12086 			    nss, ret);
12087 		return ret;
12088 	}
12089 
12090 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12091 					    WMI_VDEV_PARAM_LDPC, ldpc);
12092 	if (ret) {
12093 		ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
12094 			    ldpc, ret);
12095 		return ret;
12096 	}
12097 
12098 	if (he_support) {
12099 		if (he_fixed_rate)
12100 			ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf);
12101 		else
12102 			ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf);
12103 		if (ret)
12104 			return ret;
12105 	} else {
12106 		vdev_param = WMI_VDEV_PARAM_SGI;
12107 		param_value = ath12k_mac_nlgi_to_wmigi(sgi);
12108 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12109 						    vdev_param, param_value);
12110 		if (ret) {
12111 			ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
12112 				    sgi, ret);
12113 			return ret;
12114 		}
12115 	}
12116 
12117 	return 0;
12118 }
12119 
12120 static bool
ath12k_mac_vht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12121 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
12122 				 enum nl80211_band band,
12123 				 const struct cfg80211_bitrate_mask *mask)
12124 {
12125 	int i;
12126 	u16 vht_mcs;
12127 
12128 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
12129 		vht_mcs = mask->control[band].vht_mcs[i];
12130 
12131 		switch (vht_mcs) {
12132 		case 0:
12133 		case BIT(8) - 1:
12134 		case BIT(9) - 1:
12135 		case BIT(10) - 1:
12136 			break;
12137 		default:
12138 			return false;
12139 		}
12140 	}
12141 
12142 	return true;
12143 }
12144 
12145 static bool
ath12k_mac_he_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12146 ath12k_mac_he_mcs_range_present(struct ath12k *ar,
12147 				enum nl80211_band band,
12148 				const struct cfg80211_bitrate_mask *mask)
12149 {
12150 	int i;
12151 	u16 he_mcs;
12152 
12153 	for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
12154 		he_mcs = mask->control[band].he_mcs[i];
12155 
12156 		switch (he_mcs) {
12157 		case 0:
12158 		case BIT(8) - 1:
12159 		case BIT(10) - 1:
12160 		case BIT(12) - 1:
12161 			break;
12162 		default:
12163 			return false;
12164 		}
12165 	}
12166 
12167 	return true;
12168 }
12169 
ath12k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)12170 static void ath12k_mac_set_bitrate_mask_iter(void *data,
12171 					     struct ieee80211_sta *sta)
12172 {
12173 	struct ath12k_link_vif *arvif = data;
12174 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12175 	struct ath12k_link_sta *arsta;
12176 	struct ath12k *ar = arvif->ar;
12177 
12178 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12179 
12180 	arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12181 				  ahsta->link[arvif->link_id]);
12182 	if (!arsta || arsta->arvif != arvif)
12183 		return;
12184 
12185 	spin_lock_bh(&ar->data_lock);
12186 	arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
12187 	spin_unlock_bh(&ar->data_lock);
12188 
12189 	wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
12190 }
12191 
ath12k_mac_disable_peer_fixed_rate(void * data,struct ieee80211_sta * sta)12192 static void ath12k_mac_disable_peer_fixed_rate(void *data,
12193 					       struct ieee80211_sta *sta)
12194 {
12195 	struct ath12k_link_vif *arvif = data;
12196 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12197 	struct ath12k_link_sta *arsta;
12198 	struct ath12k *ar = arvif->ar;
12199 	int ret;
12200 
12201 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12202 
12203 	arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12204 				  ahsta->link[arvif->link_id]);
12205 
12206 	if (!arsta || arsta->arvif != arvif)
12207 		return;
12208 
12209 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
12210 					arvif->vdev_id,
12211 					WMI_PEER_PARAM_FIXED_RATE,
12212 					WMI_FIXED_RATE_NONE);
12213 	if (ret)
12214 		ath12k_warn(ar->ab,
12215 			    "failed to disable peer fixed rate for STA %pM ret %d\n",
12216 			    arsta->addr, ret);
12217 }
12218 
12219 static bool
ath12k_mac_validate_fixed_rate_settings(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,unsigned int link_id)12220 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band,
12221 					const struct cfg80211_bitrate_mask *mask,
12222 					unsigned int link_id)
12223 {
12224 	bool he_fixed_rate = false, vht_fixed_rate = false;
12225 	const u16 *vht_mcs_mask, *he_mcs_mask;
12226 	struct ieee80211_link_sta *link_sta;
12227 	struct ath12k_peer *peer, *tmp;
12228 	u8 vht_nss, he_nss;
12229 	int ret = true;
12230 
12231 	vht_mcs_mask = mask->control[band].vht_mcs;
12232 	he_mcs_mask = mask->control[band].he_mcs;
12233 
12234 	if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
12235 		vht_fixed_rate = true;
12236 
12237 	if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
12238 		he_fixed_rate = true;
12239 
12240 	if (!vht_fixed_rate && !he_fixed_rate)
12241 		return true;
12242 
12243 	vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
12244 	he_nss =  ath12k_mac_max_he_nss(he_mcs_mask);
12245 
12246 	rcu_read_lock();
12247 	spin_lock_bh(&ar->ab->base_lock);
12248 	list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
12249 		if (peer->sta) {
12250 			link_sta = rcu_dereference(peer->sta->link[link_id]);
12251 			if (!link_sta) {
12252 				ret = false;
12253 				goto exit;
12254 			}
12255 
12256 			if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
12257 					       link_sta->rx_nss < vht_nss)) {
12258 				ret = false;
12259 				goto exit;
12260 			}
12261 			if (he_fixed_rate && (!link_sta->he_cap.has_he ||
12262 					      link_sta->rx_nss < he_nss)) {
12263 				ret = false;
12264 				goto exit;
12265 			}
12266 		}
12267 	}
12268 exit:
12269 	spin_unlock_bh(&ar->ab->base_lock);
12270 	rcu_read_unlock();
12271 	return ret;
12272 }
12273 
12274 static int
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)12275 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
12276 			       struct ieee80211_vif *vif,
12277 			       const struct cfg80211_bitrate_mask *mask)
12278 {
12279 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12280 	struct ath12k_link_vif *arvif;
12281 	struct cfg80211_chan_def def;
12282 	struct ath12k *ar;
12283 	enum nl80211_band band;
12284 	const u8 *ht_mcs_mask;
12285 	const u16 *vht_mcs_mask;
12286 	const u16 *he_mcs_mask;
12287 	u8 he_ltf = 0;
12288 	u8 he_gi = 0;
12289 	u32 rate;
12290 	u8 nss, mac_nss;
12291 	u8 sgi;
12292 	u8 ldpc;
12293 	int single_nss;
12294 	int ret;
12295 	int num_rates;
12296 	bool he_fixed_rate = false;
12297 
12298 	lockdep_assert_wiphy(hw->wiphy);
12299 
12300 	arvif = &ahvif->deflink;
12301 
12302 	ar = arvif->ar;
12303 	if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
12304 		ret = -EPERM;
12305 		goto out;
12306 	}
12307 
12308 	band = def.chan->band;
12309 	ht_mcs_mask = mask->control[band].ht_mcs;
12310 	vht_mcs_mask = mask->control[band].vht_mcs;
12311 	he_mcs_mask = mask->control[band].he_mcs;
12312 	ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
12313 
12314 	sgi = mask->control[band].gi;
12315 	if (sgi == NL80211_TXRATE_FORCE_SGI) {
12316 		ret = -EINVAL;
12317 		goto out;
12318 	}
12319 
12320 	he_gi = mask->control[band].he_gi;
12321 	he_ltf = mask->control[band].he_ltf;
12322 
12323 	/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
12324 	 * requires passing at least one of used basic rates along with them.
12325 	 * Fixed rate setting across different preambles(legacy, HT, VHT) is
12326 	 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
12327 	 * suitable for setting single HT/VHT rates.
12328 	 * But, there could be a single basic rate passed from userspace which
12329 	 * can be done through the FIXED_RATE param.
12330 	 */
12331 	if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
12332 		ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
12333 							&nss);
12334 		if (ret) {
12335 			ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
12336 				    arvif->vdev_id, ret);
12337 			goto out;
12338 		}
12339 
12340 		ieee80211_iterate_stations_mtx(hw,
12341 					       ath12k_mac_disable_peer_fixed_rate,
12342 					       arvif);
12343 	} else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask,
12344 							  &single_nss)) {
12345 		rate = WMI_FIXED_RATE_NONE;
12346 		nss = single_nss;
12347 		arvif->bitrate_mask = *mask;
12348 
12349 		ieee80211_iterate_stations_atomic(hw,
12350 						  ath12k_mac_set_bitrate_mask_iter,
12351 						  arvif);
12352 	} else {
12353 		rate = WMI_FIXED_RATE_NONE;
12354 
12355 		if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
12356 							     mask, arvif->link_id))
12357 			ath12k_warn(ar->ab,
12358 				    "failed to update fixed rate settings due to mcs/nss incompatibility\n");
12359 
12360 		mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
12361 			       ath12k_mac_max_vht_nss(vht_mcs_mask),
12362 			       ath12k_mac_max_he_nss(he_mcs_mask));
12363 		nss = min_t(u32, ar->num_tx_chains, mac_nss);
12364 
12365 		/* If multiple rates across different preambles are given
12366 		 * we can reconfigure this info with all peers using PEER_ASSOC
12367 		 * command with the below exception cases.
12368 		 * - Single VHT Rate : peer_assoc command accommodates only MCS
12369 		 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
12370 		 * mandates passing basic rates along with HT/VHT rates, FW
12371 		 * doesn't allow switching from VHT to Legacy. Hence instead of
12372 		 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
12373 		 * we could set this VHT rate as peer fixed rate param, which
12374 		 * will override FIXED rate and FW rate control algorithm.
12375 		 * If single VHT rate is passed along with HT rates, we select
12376 		 * the VHT rate as fixed rate for vht peers.
12377 		 * - Multiple VHT Rates : When Multiple VHT rates are given,this
12378 		 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
12379 		 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
12380 		 * RATEMASK_CMDID can cover all use cases of setting rates
12381 		 * across multiple preambles and rates within same type.
12382 		 * But requires more validation of the command at this point.
12383 		 */
12384 
12385 		num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
12386 								  mask);
12387 
12388 		if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
12389 		    num_rates > 1) {
12390 			/* TODO: Handle multiple VHT MCS values setting using
12391 			 * RATEMASK CMD
12392 			 */
12393 			ath12k_warn(ar->ab,
12394 				    "Setting more than one MCS Value in bitrate mask not supported\n");
12395 			ret = -EINVAL;
12396 			goto out;
12397 		}
12398 
12399 		num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
12400 		if (num_rates == 1)
12401 			he_fixed_rate = true;
12402 
12403 		if (!ath12k_mac_he_mcs_range_present(ar, band, mask) &&
12404 		    num_rates > 1) {
12405 			ath12k_warn(ar->ab,
12406 				    "Setting more than one HE MCS Value in bitrate mask not supported\n");
12407 			ret = -EINVAL;
12408 			goto out;
12409 		}
12410 		ieee80211_iterate_stations_mtx(hw,
12411 					       ath12k_mac_disable_peer_fixed_rate,
12412 					       arvif);
12413 
12414 		arvif->bitrate_mask = *mask;
12415 		ieee80211_iterate_stations_mtx(hw,
12416 					       ath12k_mac_set_bitrate_mask_iter,
12417 					       arvif);
12418 	}
12419 
12420 	ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
12421 					 he_ltf, he_fixed_rate);
12422 	if (ret) {
12423 		ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
12424 			    arvif->vdev_id, ret);
12425 	}
12426 
12427 out:
12428 	return ret;
12429 }
12430 
12431 static void
ath12k_mac_op_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)12432 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
12433 				enum ieee80211_reconfig_type reconfig_type)
12434 {
12435 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12436 	struct ath12k *ar;
12437 	struct ath12k_base *ab;
12438 	struct ath12k_vif *ahvif;
12439 	struct ath12k_link_vif *arvif;
12440 	int recovery_count, i;
12441 
12442 	lockdep_assert_wiphy(hw->wiphy);
12443 
12444 	if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
12445 		return;
12446 
12447 	guard(mutex)(&ah->hw_mutex);
12448 
12449 	if (ah->state != ATH12K_HW_STATE_RESTARTED)
12450 		return;
12451 
12452 	ah->state = ATH12K_HW_STATE_ON;
12453 	ieee80211_wake_queues(hw);
12454 
12455 	for_each_ar(ah, ar, i) {
12456 		ab = ar->ab;
12457 
12458 		ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
12459 			    ar->pdev->pdev_id);
12460 
12461 		if (ar->ab->hw_params->current_cc_support &&
12462 		    ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
12463 			struct wmi_set_current_country_arg arg = {};
12464 
12465 			memcpy(&arg.alpha2, ar->alpha2, 2);
12466 			reinit_completion(&ar->regd_update_completed);
12467 			ath12k_wmi_send_set_current_country_cmd(ar, &arg);
12468 		}
12469 
12470 		if (ab->is_reset) {
12471 			recovery_count = atomic_inc_return(&ab->recovery_count);
12472 
12473 			ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
12474 				   recovery_count);
12475 
12476 			/* When there are multiple radios in an SOC,
12477 			 * the recovery has to be done for each radio
12478 			 */
12479 			if (recovery_count == ab->num_radios) {
12480 				atomic_dec(&ab->reset_count);
12481 				complete(&ab->reset_complete);
12482 				ab->is_reset = false;
12483 				atomic_set(&ab->fail_cont_count, 0);
12484 				ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
12485 			}
12486 		}
12487 
12488 		list_for_each_entry(arvif, &ar->arvifs, list) {
12489 			ahvif = arvif->ahvif;
12490 			ath12k_dbg(ab, ATH12K_DBG_BOOT,
12491 				   "reconfig cipher %d up %d vdev type %d\n",
12492 				   ahvif->key_cipher,
12493 				   arvif->is_up,
12494 				   ahvif->vdev_type);
12495 
12496 			/* After trigger disconnect, then upper layer will
12497 			 * trigger connect again, then the PN number of
12498 			 * upper layer will be reset to keep up with AP
12499 			 * side, hence PN number mismatch will not happen.
12500 			 */
12501 			if (arvif->is_up &&
12502 			    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12503 			    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
12504 				ieee80211_hw_restart_disconnect(ahvif->vif);
12505 
12506 				ath12k_dbg(ab, ATH12K_DBG_BOOT,
12507 					   "restart disconnect\n");
12508 			}
12509 		}
12510 	}
12511 }
12512 
12513 static void
ath12k_mac_update_bss_chan_survey(struct ath12k * ar,struct ieee80211_channel * channel)12514 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
12515 				  struct ieee80211_channel *channel)
12516 {
12517 	int ret;
12518 	enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
12519 
12520 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12521 
12522 	if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
12523 	    ar->rx_channel != channel)
12524 		return;
12525 
12526 	if (ar->scan.state != ATH12K_SCAN_IDLE) {
12527 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12528 			   "ignoring bss chan info req while scanning..\n");
12529 		return;
12530 	}
12531 
12532 	reinit_completion(&ar->bss_survey_done);
12533 
12534 	ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
12535 	if (ret) {
12536 		ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
12537 		return;
12538 	}
12539 
12540 	ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
12541 	if (ret == 0)
12542 		ath12k_warn(ar->ab, "bss channel survey timed out\n");
12543 }
12544 
ath12k_mac_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)12545 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
12546 				    struct survey_info *survey)
12547 {
12548 	struct ath12k *ar;
12549 	struct ieee80211_supported_band *sband;
12550 	struct survey_info *ar_survey;
12551 
12552 	lockdep_assert_wiphy(hw->wiphy);
12553 
12554 	if (idx >= ATH12K_NUM_CHANS)
12555 		return -ENOENT;
12556 
12557 	sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
12558 	if (sband && idx >= sband->n_channels) {
12559 		idx -= sband->n_channels;
12560 		sband = NULL;
12561 	}
12562 
12563 	if (!sband)
12564 		sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
12565 	if (sband && idx >= sband->n_channels) {
12566 		idx -= sband->n_channels;
12567 		sband = NULL;
12568 	}
12569 
12570 	if (!sband)
12571 		sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
12572 
12573 	if (!sband || idx >= sband->n_channels)
12574 		return -ENOENT;
12575 
12576 	ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
12577 	if (!ar) {
12578 		if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
12579 			memset(survey, 0, sizeof(*survey));
12580 			return 0;
12581 		}
12582 		return -ENOENT;
12583 	}
12584 
12585 	ar_survey = &ar->survey[idx];
12586 
12587 	ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
12588 
12589 	spin_lock_bh(&ar->data_lock);
12590 	memcpy(survey, ar_survey, sizeof(*survey));
12591 	spin_unlock_bh(&ar->data_lock);
12592 
12593 	survey->channel = &sband->channels[idx];
12594 
12595 	if (ar->rx_channel == survey->channel)
12596 		survey->filled |= SURVEY_INFO_IN_USE;
12597 
12598 	return 0;
12599 }
12600 
ath12k_mac_op_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)12601 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
12602 					 struct ieee80211_vif *vif,
12603 					 struct ieee80211_sta *sta,
12604 					 struct station_info *sinfo)
12605 {
12606 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12607 	struct ath12k_fw_stats_req_params params = {};
12608 	struct ath12k_link_sta *arsta;
12609 	s8 signal, noise_floor;
12610 	struct ath12k *ar;
12611 	bool db2dbm;
12612 
12613 	lockdep_assert_wiphy(hw->wiphy);
12614 
12615 	arsta = &ahsta->deflink;
12616 	ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12617 	if (!ar)
12618 		return;
12619 
12620 	db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12621 			  ar->ab->wmi_ab.svc_map);
12622 
12623 	sinfo->rx_duration = arsta->rx_duration;
12624 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12625 
12626 	sinfo->tx_duration = arsta->tx_duration;
12627 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12628 
12629 	if (arsta->txrate.legacy || arsta->txrate.nss) {
12630 		if (arsta->txrate.legacy) {
12631 			sinfo->txrate.legacy = arsta->txrate.legacy;
12632 		} else {
12633 			sinfo->txrate.mcs = arsta->txrate.mcs;
12634 			sinfo->txrate.nss = arsta->txrate.nss;
12635 			sinfo->txrate.bw = arsta->txrate.bw;
12636 			sinfo->txrate.he_gi = arsta->txrate.he_gi;
12637 			sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12638 			sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
12639 			sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12640 			sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc;
12641 		}
12642 		sinfo->txrate.flags = arsta->txrate.flags;
12643 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12644 	}
12645 
12646 	/* TODO: Use real NF instead of default one. */
12647 	signal = arsta->rssi_comb;
12648 
12649 	params.pdev_id = ar->pdev->pdev_id;
12650 	params.vdev_id = 0;
12651 	params.stats_id = WMI_REQUEST_VDEV_STAT;
12652 
12653 	if (!signal &&
12654 	    ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12655 	    !(ath12k_mac_get_fw_stats(ar, &params)))
12656 		signal = arsta->rssi_beacon;
12657 
12658 	spin_lock_bh(&ar->data_lock);
12659 	noise_floor = ath12k_pdev_get_noise_floor(ar);
12660 	spin_unlock_bh(&ar->data_lock);
12661 
12662 	if (signal) {
12663 		sinfo->signal = db2dbm ? signal : signal + noise_floor;
12664 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12665 	}
12666 
12667 	sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12668 
12669 	if (!db2dbm)
12670 		sinfo->signal_avg += noise_floor;
12671 
12672 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12673 
12674 	sinfo->tx_retries = arsta->tx_retry_count;
12675 	sinfo->tx_failed = arsta->tx_retry_failed;
12676 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12677 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12678 }
12679 
ath12k_mac_op_link_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,struct link_station_info * link_sinfo)12680 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
12681 					      struct ieee80211_vif *vif,
12682 					      struct ieee80211_link_sta *link_sta,
12683 					      struct link_station_info *link_sinfo)
12684 {
12685 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta);
12686 	struct ath12k_fw_stats_req_params params = {};
12687 	struct ath12k_link_sta *arsta;
12688 	struct ath12k *ar;
12689 	s8 signal;
12690 	bool db2dbm;
12691 
12692 	lockdep_assert_wiphy(hw->wiphy);
12693 
12694 	arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]);
12695 
12696 	if (!arsta)
12697 		return;
12698 
12699 	ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12700 	if (!ar)
12701 		return;
12702 
12703 	db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12704 			  ar->ab->wmi_ab.svc_map);
12705 
12706 	link_sinfo->rx_duration = arsta->rx_duration;
12707 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12708 
12709 	link_sinfo->tx_duration = arsta->tx_duration;
12710 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12711 
12712 	if (arsta->txrate.legacy || arsta->txrate.nss) {
12713 		if (arsta->txrate.legacy) {
12714 			link_sinfo->txrate.legacy = arsta->txrate.legacy;
12715 		} else {
12716 			link_sinfo->txrate.mcs = arsta->txrate.mcs;
12717 			link_sinfo->txrate.nss = arsta->txrate.nss;
12718 			link_sinfo->txrate.bw = arsta->txrate.bw;
12719 			link_sinfo->txrate.he_gi = arsta->txrate.he_gi;
12720 			link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12721 			link_sinfo->txrate.he_ru_alloc =
12722 				arsta->txrate.he_ru_alloc;
12723 			link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12724 			link_sinfo->txrate.eht_ru_alloc =
12725 				arsta->txrate.eht_ru_alloc;
12726 		}
12727 		link_sinfo->txrate.flags = arsta->txrate.flags;
12728 		link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12729 	}
12730 
12731 	/* TODO: Use real NF instead of default one. */
12732 	signal = arsta->rssi_comb;
12733 
12734 	params.pdev_id = ar->pdev->pdev_id;
12735 	params.vdev_id = 0;
12736 	params.stats_id = WMI_REQUEST_VDEV_STAT;
12737 
12738 	if (!signal &&
12739 	    ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12740 	    !(ath12k_mac_get_fw_stats(ar, &params)))
12741 		signal = arsta->rssi_beacon;
12742 
12743 	if (signal) {
12744 		link_sinfo->signal =
12745 			db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
12746 		link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12747 	}
12748 
12749 	link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12750 
12751 	if (!db2dbm)
12752 		link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
12753 
12754 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12755 
12756 	link_sinfo->tx_retries = arsta->tx_retry_count;
12757 	link_sinfo->tx_failed = arsta->tx_retry_failed;
12758 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12759 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12760 }
12761 
ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)12762 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
12763 						  struct ieee80211_vif *vif)
12764 {
12765 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12766 	struct ath12k *ar;
12767 
12768 	ar = ath12k_ah_to_ar(ah, 0);
12769 
12770 	lockdep_assert_wiphy(hw->wiphy);
12771 
12772 	spin_lock_bh(&ar->data_lock);
12773 	ar->scan.roc_notify = false;
12774 	spin_unlock_bh(&ar->data_lock);
12775 
12776 	ath12k_scan_abort(ar);
12777 
12778 	cancel_delayed_work_sync(&ar->scan.timeout);
12779 	wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
12780 
12781 	return 0;
12782 }
12783 
ath12k_mac_op_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel * chan,int duration,enum ieee80211_roc_type type)12784 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
12785 					   struct ieee80211_vif *vif,
12786 					   struct ieee80211_channel *chan,
12787 					   int duration,
12788 					   enum ieee80211_roc_type type)
12789 {
12790 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12791 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12792 	struct ath12k_link_vif *arvif;
12793 	struct ath12k *ar;
12794 	u32 scan_time_msec;
12795 	bool create = true;
12796 	u8 link_id;
12797 	int ret;
12798 
12799 	lockdep_assert_wiphy(hw->wiphy);
12800 
12801 	ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq);
12802 	if (!ar)
12803 		return -EINVAL;
12804 
12805 	/* check if any of the links of ML VIF is already started on
12806 	 * radio(ar) corresponding to given scan frequency and use it,
12807 	 * if not use deflink(link 0) for scan purpose.
12808 	 */
12809 
12810 	link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
12811 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12812 	/* If the vif is already assigned to a specific vdev of an ar,
12813 	 * check whether its already started, vdev which is started
12814 	 * are not allowed to switch to a new radio.
12815 	 * If the vdev is not started, but was earlier created on a
12816 	 * different ar, delete that vdev and create a new one. We don't
12817 	 * delete at the scan stop as an optimization to avoid redundant
12818 	 * delete-create vdev's for the same ar, in case the request is
12819 	 * always on the same band for the vif
12820 	 */
12821 	if (arvif->is_created) {
12822 		if (WARN_ON(!arvif->ar))
12823 			return -EINVAL;
12824 
12825 		if (ar != arvif->ar && arvif->is_started)
12826 			return -EBUSY;
12827 
12828 		if (ar != arvif->ar) {
12829 			ath12k_mac_remove_link_interface(hw, arvif);
12830 			ath12k_mac_unassign_link_vif(arvif);
12831 		} else {
12832 			create = false;
12833 		}
12834 	}
12835 
12836 	if (create) {
12837 		arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12838 
12839 		ret = ath12k_mac_vdev_create(ar, arvif);
12840 		if (ret) {
12841 			ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
12842 				    ret);
12843 			return ret;
12844 		}
12845 	}
12846 
12847 	spin_lock_bh(&ar->data_lock);
12848 
12849 	switch (ar->scan.state) {
12850 	case ATH12K_SCAN_IDLE:
12851 		reinit_completion(&ar->scan.started);
12852 		reinit_completion(&ar->scan.completed);
12853 		reinit_completion(&ar->scan.on_channel);
12854 		ar->scan.state = ATH12K_SCAN_STARTING;
12855 		ar->scan.is_roc = true;
12856 		ar->scan.arvif = arvif;
12857 		ar->scan.roc_freq = chan->center_freq;
12858 		ar->scan.roc_notify = true;
12859 		ret = 0;
12860 		break;
12861 	case ATH12K_SCAN_STARTING:
12862 	case ATH12K_SCAN_RUNNING:
12863 	case ATH12K_SCAN_ABORTING:
12864 		ret = -EBUSY;
12865 		break;
12866 	}
12867 
12868 	spin_unlock_bh(&ar->data_lock);
12869 
12870 	if (ret)
12871 		return ret;
12872 
12873 	scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
12874 
12875 	struct ath12k_wmi_scan_req_arg *arg __free(kfree) =
12876 					kzalloc(sizeof(*arg), GFP_KERNEL);
12877 	if (!arg)
12878 		return -ENOMEM;
12879 
12880 	ath12k_wmi_start_scan_init(ar, arg);
12881 	arg->num_chan = 1;
12882 
12883 	u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list),
12884 					       GFP_KERNEL);
12885 	if (!chan_list)
12886 		return -ENOMEM;
12887 
12888 	arg->chan_list = chan_list;
12889 	arg->vdev_id = arvif->vdev_id;
12890 	arg->scan_id = ATH12K_SCAN_ID;
12891 	arg->chan_list[0] = chan->center_freq;
12892 	arg->dwell_time_active = scan_time_msec;
12893 	arg->dwell_time_passive = scan_time_msec;
12894 	arg->max_scan_time = scan_time_msec;
12895 	arg->scan_f_passive = 1;
12896 	arg->burst_duration = duration;
12897 
12898 	ret = ath12k_start_scan(ar, arg);
12899 	if (ret) {
12900 		ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
12901 
12902 		spin_lock_bh(&ar->data_lock);
12903 		ar->scan.state = ATH12K_SCAN_IDLE;
12904 		spin_unlock_bh(&ar->data_lock);
12905 		return ret;
12906 	}
12907 
12908 	ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
12909 	if (ret == 0) {
12910 		ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
12911 		ret = ath12k_scan_stop(ar);
12912 		if (ret)
12913 			ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
12914 		return -ETIMEDOUT;
12915 	}
12916 
12917 	ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
12918 				     msecs_to_jiffies(duration));
12919 
12920 	return 0;
12921 }
12922 
ath12k_mac_op_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)12923 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
12924 					 struct ieee80211_vif *vif,
12925 					 struct cfg80211_gtk_rekey_data *data)
12926 {
12927 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12928 	struct ath12k_rekey_data *rekey_data;
12929 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12930 	struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
12931 	struct ath12k_link_vif *arvif;
12932 
12933 	lockdep_assert_wiphy(hw->wiphy);
12934 
12935 	arvif = &ahvif->deflink;
12936 	rekey_data = &arvif->rekey_data;
12937 
12938 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
12939 		   arvif->vdev_id);
12940 
12941 	memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
12942 	memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
12943 
12944 	/* The supplicant works on big-endian, the firmware expects it on
12945 	 * little endian.
12946 	 */
12947 	rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
12948 
12949 	arvif->rekey_data.enable_offload = true;
12950 
12951 	ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL,
12952 			rekey_data->kck, NL80211_KCK_LEN);
12953 	ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL,
12954 			rekey_data->kck, NL80211_KEK_LEN);
12955 	ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
12956 			&rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
12957 }
12958 
12959 static const struct ieee80211_ops ath12k_ops = {
12960 	.tx				= ath12k_mac_op_tx,
12961 	.wake_tx_queue			= ieee80211_handle_wake_tx_queue,
12962 	.start                          = ath12k_mac_op_start,
12963 	.stop                           = ath12k_mac_op_stop,
12964 	.reconfig_complete              = ath12k_mac_op_reconfig_complete,
12965 	.add_interface                  = ath12k_mac_op_add_interface,
12966 	.remove_interface		= ath12k_mac_op_remove_interface,
12967 	.update_vif_offload		= ath12k_mac_op_update_vif_offload,
12968 	.config                         = ath12k_mac_op_config,
12969 	.link_info_changed              = ath12k_mac_op_link_info_changed,
12970 	.vif_cfg_changed		= ath12k_mac_op_vif_cfg_changed,
12971 	.change_vif_links               = ath12k_mac_op_change_vif_links,
12972 	.configure_filter		= ath12k_mac_op_configure_filter,
12973 	.hw_scan                        = ath12k_mac_op_hw_scan,
12974 	.cancel_hw_scan                 = ath12k_mac_op_cancel_hw_scan,
12975 	.set_key                        = ath12k_mac_op_set_key,
12976 	.set_rekey_data	                = ath12k_mac_op_set_rekey_data,
12977 	.sta_state                      = ath12k_mac_op_sta_state,
12978 	.sta_set_txpwr			= ath12k_mac_op_sta_set_txpwr,
12979 	.link_sta_rc_update		= ath12k_mac_op_link_sta_rc_update,
12980 	.conf_tx                        = ath12k_mac_op_conf_tx,
12981 	.set_antenna			= ath12k_mac_op_set_antenna,
12982 	.get_antenna			= ath12k_mac_op_get_antenna,
12983 	.ampdu_action			= ath12k_mac_op_ampdu_action,
12984 	.add_chanctx			= ath12k_mac_op_add_chanctx,
12985 	.remove_chanctx			= ath12k_mac_op_remove_chanctx,
12986 	.change_chanctx			= ath12k_mac_op_change_chanctx,
12987 	.assign_vif_chanctx		= ath12k_mac_op_assign_vif_chanctx,
12988 	.unassign_vif_chanctx		= ath12k_mac_op_unassign_vif_chanctx,
12989 	.switch_vif_chanctx		= ath12k_mac_op_switch_vif_chanctx,
12990 	.get_txpower			= ath12k_mac_op_get_txpower,
12991 	.set_rts_threshold		= ath12k_mac_op_set_rts_threshold,
12992 	.set_frag_threshold		= ath12k_mac_op_set_frag_threshold,
12993 	.set_bitrate_mask		= ath12k_mac_op_set_bitrate_mask,
12994 	.get_survey			= ath12k_mac_op_get_survey,
12995 	.flush				= ath12k_mac_op_flush,
12996 	.sta_statistics			= ath12k_mac_op_sta_statistics,
12997 	.link_sta_statistics		= ath12k_mac_op_link_sta_statistics,
12998 	.remain_on_channel              = ath12k_mac_op_remain_on_channel,
12999 	.cancel_remain_on_channel       = ath12k_mac_op_cancel_remain_on_channel,
13000 	.change_sta_links               = ath12k_mac_op_change_sta_links,
13001 	.can_activate_links             = ath12k_mac_op_can_activate_links,
13002 #ifdef CONFIG_PM
13003 	.suspend			= ath12k_wow_op_suspend,
13004 	.resume				= ath12k_wow_op_resume,
13005 	.set_wakeup			= ath12k_wow_op_set_wakeup,
13006 #endif
13007 #ifdef CONFIG_ATH12K_DEBUGFS
13008 	.vif_add_debugfs                = ath12k_debugfs_op_vif_add,
13009 #endif
13010 	CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
13011 #ifdef CONFIG_ATH12K_DEBUGFS
13012 	.link_sta_add_debugfs           = ath12k_debugfs_link_sta_op_add,
13013 #endif
13014 };
13015 
ath12k_mac_update_freq_range(struct ath12k * ar,u32 freq_low,u32 freq_high)13016 void ath12k_mac_update_freq_range(struct ath12k *ar,
13017 				  u32 freq_low, u32 freq_high)
13018 {
13019 	if (!(freq_low && freq_high))
13020 		return;
13021 
13022 	if (ar->freq_range.start_freq || ar->freq_range.end_freq) {
13023 		ar->freq_range.start_freq = min(ar->freq_range.start_freq,
13024 						MHZ_TO_KHZ(freq_low));
13025 		ar->freq_range.end_freq = max(ar->freq_range.end_freq,
13026 					      MHZ_TO_KHZ(freq_high));
13027 	} else {
13028 		ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low);
13029 		ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high);
13030 	}
13031 
13032 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13033 		   "mac pdev %u freq limit updated. New range %u->%u MHz\n",
13034 		   ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq),
13035 		   KHZ_TO_MHZ(ar->freq_range.end_freq));
13036 }
13037 
ath12k_mac_update_ch_list(struct ath12k * ar,struct ieee80211_supported_band * band,u32 freq_low,u32 freq_high)13038 static void ath12k_mac_update_ch_list(struct ath12k *ar,
13039 				      struct ieee80211_supported_band *band,
13040 				      u32 freq_low, u32 freq_high)
13041 {
13042 	int i;
13043 
13044 	if (!(freq_low && freq_high))
13045 		return;
13046 
13047 	for (i = 0; i < band->n_channels; i++) {
13048 		if (band->channels[i].center_freq < freq_low ||
13049 		    band->channels[i].center_freq > freq_high)
13050 			band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
13051 	}
13052 }
13053 
ath12k_get_phy_id(struct ath12k * ar,u32 band)13054 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
13055 {
13056 	struct ath12k_pdev *pdev = ar->pdev;
13057 	struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
13058 
13059 	if (band == WMI_HOST_WLAN_2GHZ_CAP)
13060 		return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
13061 
13062 	if (band == WMI_HOST_WLAN_5GHZ_CAP)
13063 		return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
13064 
13065 	ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
13066 
13067 	return 0;
13068 }
13069 
ath12k_mac_update_band(struct ath12k * ar,struct ieee80211_supported_band * orig_band,struct ieee80211_supported_band * new_band)13070 static int ath12k_mac_update_band(struct ath12k *ar,
13071 				  struct ieee80211_supported_band *orig_band,
13072 				  struct ieee80211_supported_band *new_band)
13073 {
13074 	int i;
13075 
13076 	if (!orig_band || !new_band)
13077 		return -EINVAL;
13078 
13079 	if (orig_band->band != new_band->band)
13080 		return -EINVAL;
13081 
13082 	for (i = 0; i < new_band->n_channels; i++) {
13083 		if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
13084 			continue;
13085 		/* An enabled channel in new_band should not be already enabled
13086 		 * in the orig_band
13087 		 */
13088 		if (WARN_ON(!(orig_band->channels[i].flags &
13089 			      IEEE80211_CHAN_DISABLED)))
13090 			return -EINVAL;
13091 		orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
13092 	}
13093 	return 0;
13094 }
13095 
ath12k_mac_setup_channels_rates(struct ath12k * ar,u32 supported_bands,struct ieee80211_supported_band * bands[])13096 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
13097 					   u32 supported_bands,
13098 					   struct ieee80211_supported_band *bands[])
13099 {
13100 	struct ieee80211_supported_band *band;
13101 	struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
13102 	struct ath12k_base *ab = ar->ab;
13103 	u32 phy_id, freq_low, freq_high;
13104 	struct ath12k_hw *ah = ar->ah;
13105 	void *channels;
13106 	int ret;
13107 
13108 	BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
13109 		      ARRAY_SIZE(ath12k_5ghz_channels) +
13110 		      ARRAY_SIZE(ath12k_6ghz_channels)) !=
13111 		     ATH12K_NUM_CHANS);
13112 
13113 	reg_cap = &ab->hal_reg_cap[ar->pdev_idx];
13114 
13115 	if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
13116 		channels = kmemdup(ath12k_2ghz_channels,
13117 				   sizeof(ath12k_2ghz_channels),
13118 				   GFP_KERNEL);
13119 		if (!channels)
13120 			return -ENOMEM;
13121 
13122 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
13123 		band->band = NL80211_BAND_2GHZ;
13124 		band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
13125 		band->channels = channels;
13126 		band->n_bitrates = ath12k_g_rates_size;
13127 		band->bitrates = ath12k_g_rates;
13128 
13129 		if (ab->hw_params->single_pdev_only) {
13130 			phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
13131 			reg_cap = &ab->hal_reg_cap[phy_id];
13132 		}
13133 
13134 		freq_low = max(reg_cap->low_2ghz_chan,
13135 			       ab->reg_freq_2ghz.start_freq);
13136 		freq_high = min(reg_cap->high_2ghz_chan,
13137 				ab->reg_freq_2ghz.end_freq);
13138 
13139 		ath12k_mac_update_ch_list(ar, band,
13140 					  reg_cap->low_2ghz_chan,
13141 					  reg_cap->high_2ghz_chan);
13142 
13143 		ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13144 
13145 		if (!bands[NL80211_BAND_2GHZ]) {
13146 			bands[NL80211_BAND_2GHZ] = band;
13147 		} else {
13148 			/* Split mac in same band under same wiphy */
13149 			ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
13150 			if (ret) {
13151 				kfree(channels);
13152 				band->channels = NULL;
13153 				return ret;
13154 			}
13155 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
13156 				   ar->pdev->pdev_id,
13157 				   KHZ_TO_MHZ(ar->freq_range.start_freq),
13158 				   KHZ_TO_MHZ(ar->freq_range.end_freq));
13159 		}
13160 	}
13161 
13162 	if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
13163 		if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) {
13164 			channels = kmemdup(ath12k_6ghz_channels,
13165 					   sizeof(ath12k_6ghz_channels), GFP_KERNEL);
13166 			if (!channels) {
13167 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13168 				return -ENOMEM;
13169 			}
13170 
13171 			ar->supports_6ghz = true;
13172 			band = &ar->mac.sbands[NL80211_BAND_6GHZ];
13173 			band->band = NL80211_BAND_6GHZ;
13174 			band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
13175 			band->channels = channels;
13176 			band->n_bitrates = ath12k_a_rates_size;
13177 			band->bitrates = ath12k_a_rates;
13178 
13179 			freq_low = max(reg_cap->low_5ghz_chan,
13180 				       ab->reg_freq_6ghz.start_freq);
13181 			freq_high = min(reg_cap->high_5ghz_chan,
13182 					ab->reg_freq_6ghz.end_freq);
13183 
13184 			ath12k_mac_update_ch_list(ar, band,
13185 						  reg_cap->low_5ghz_chan,
13186 						  reg_cap->high_5ghz_chan);
13187 
13188 			ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13189 			ah->use_6ghz_regd = true;
13190 
13191 			if (!bands[NL80211_BAND_6GHZ]) {
13192 				bands[NL80211_BAND_6GHZ] = band;
13193 			} else {
13194 				/* Split mac in same band under same wiphy */
13195 				ret = ath12k_mac_update_band(ar,
13196 							     bands[NL80211_BAND_6GHZ],
13197 							     band);
13198 				if (ret) {
13199 					kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13200 					ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13201 					kfree(channels);
13202 					band->channels = NULL;
13203 					return ret;
13204 				}
13205 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
13206 					   ar->pdev->pdev_id,
13207 					   KHZ_TO_MHZ(ar->freq_range.start_freq),
13208 					   KHZ_TO_MHZ(ar->freq_range.end_freq));
13209 			}
13210 		}
13211 
13212 		if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
13213 			channels = kmemdup(ath12k_5ghz_channels,
13214 					   sizeof(ath12k_5ghz_channels),
13215 					   GFP_KERNEL);
13216 			if (!channels) {
13217 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13218 				kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13219 				return -ENOMEM;
13220 			}
13221 
13222 			band = &ar->mac.sbands[NL80211_BAND_5GHZ];
13223 			band->band = NL80211_BAND_5GHZ;
13224 			band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
13225 			band->channels = channels;
13226 			band->n_bitrates = ath12k_a_rates_size;
13227 			band->bitrates = ath12k_a_rates;
13228 
13229 			if (ab->hw_params->single_pdev_only) {
13230 				phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
13231 				reg_cap = &ab->hal_reg_cap[phy_id];
13232 			}
13233 
13234 			freq_low = max(reg_cap->low_5ghz_chan,
13235 				       ab->reg_freq_5ghz.start_freq);
13236 			freq_high = min(reg_cap->high_5ghz_chan,
13237 					ab->reg_freq_5ghz.end_freq);
13238 
13239 			ath12k_mac_update_ch_list(ar, band,
13240 						  reg_cap->low_5ghz_chan,
13241 						  reg_cap->high_5ghz_chan);
13242 
13243 			ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13244 
13245 			if (!bands[NL80211_BAND_5GHZ]) {
13246 				bands[NL80211_BAND_5GHZ] = band;
13247 			} else {
13248 				/* Split mac in same band under same wiphy */
13249 				ret = ath12k_mac_update_band(ar,
13250 							     bands[NL80211_BAND_5GHZ],
13251 							     band);
13252 				if (ret) {
13253 					kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13254 					ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13255 					kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13256 					ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13257 					kfree(channels);
13258 					band->channels = NULL;
13259 					return ret;
13260 				}
13261 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
13262 					   ar->pdev->pdev_id,
13263 					   KHZ_TO_MHZ(ar->freq_range.start_freq),
13264 					   KHZ_TO_MHZ(ar->freq_range.end_freq));
13265 			}
13266 		}
13267 	}
13268 
13269 	return 0;
13270 }
13271 
ath12k_mac_get_ifmodes(struct ath12k_hw * ah)13272 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
13273 {
13274 	struct ath12k *ar;
13275 	int i;
13276 	u16 interface_modes = U16_MAX;
13277 
13278 	for_each_ar(ah, ar, i)
13279 		interface_modes &= ar->ab->hw_params->interface_modes;
13280 
13281 	return interface_modes == U16_MAX ? 0 : interface_modes;
13282 }
13283 
ath12k_mac_is_iface_mode_enable(struct ath12k_hw * ah,enum nl80211_iftype type)13284 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
13285 					    enum nl80211_iftype type)
13286 {
13287 	struct ath12k *ar;
13288 	int i;
13289 	u16 interface_modes, mode = 0;
13290 	bool is_enable = false;
13291 
13292 	if (type == NL80211_IFTYPE_MESH_POINT) {
13293 		if (IS_ENABLED(CONFIG_MAC80211_MESH))
13294 			mode = BIT(type);
13295 	} else {
13296 		mode = BIT(type);
13297 	}
13298 
13299 	for_each_ar(ah, ar, i) {
13300 		interface_modes = ar->ab->hw_params->interface_modes;
13301 		if (interface_modes & mode) {
13302 			is_enable = true;
13303 			break;
13304 		}
13305 	}
13306 
13307 	return is_enable;
13308 }
13309 
13310 static int
ath12k_mac_setup_radio_iface_comb(struct ath12k * ar,struct ieee80211_iface_combination * comb)13311 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar,
13312 				  struct ieee80211_iface_combination *comb)
13313 {
13314 	u16 interface_modes = ar->ab->hw_params->interface_modes;
13315 	struct ieee80211_iface_limit *limits;
13316 	int n_limits, max_interfaces;
13317 	bool ap, mesh, p2p;
13318 
13319 	ap = interface_modes & BIT(NL80211_IFTYPE_AP);
13320 	p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
13321 
13322 	mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
13323 	       (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT));
13324 
13325 	if ((ap || mesh) && !p2p) {
13326 		n_limits = 2;
13327 		max_interfaces = 16;
13328 	} else if (p2p) {
13329 		n_limits = 3;
13330 		if (ap || mesh)
13331 			max_interfaces = 16;
13332 		else
13333 			max_interfaces = 3;
13334 	} else {
13335 		n_limits = 1;
13336 		max_interfaces = 1;
13337 	}
13338 
13339 	limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13340 	if (!limits)
13341 		return -ENOMEM;
13342 
13343 	limits[0].max = 1;
13344 	limits[0].types |= BIT(NL80211_IFTYPE_STATION);
13345 
13346 	if (ap || mesh || p2p)
13347 		limits[1].max = max_interfaces;
13348 
13349 	if (ap)
13350 		limits[1].types |= BIT(NL80211_IFTYPE_AP);
13351 
13352 	if (mesh)
13353 		limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
13354 
13355 	if (p2p) {
13356 		limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
13357 					BIT(NL80211_IFTYPE_P2P_GO);
13358 		limits[2].max = 1;
13359 		limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
13360 	}
13361 
13362 	comb[0].limits = limits;
13363 	comb[0].n_limits = n_limits;
13364 	comb[0].max_interfaces = max_interfaces;
13365 	comb[0].beacon_int_infra_match = true;
13366 	comb[0].beacon_int_min_gcd = 100;
13367 
13368 	comb[0].num_different_channels = 1;
13369 	comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
13370 				      BIT(NL80211_CHAN_WIDTH_20) |
13371 				      BIT(NL80211_CHAN_WIDTH_40) |
13372 				      BIT(NL80211_CHAN_WIDTH_80) |
13373 				      BIT(NL80211_CHAN_WIDTH_160);
13374 
13375 	return 0;
13376 }
13377 
13378 static int
ath12k_mac_setup_global_iface_comb(struct ath12k_hw * ah,struct wiphy_radio * radio,u8 n_radio,struct ieee80211_iface_combination * comb)13379 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah,
13380 				   struct wiphy_radio *radio,
13381 				   u8 n_radio,
13382 				   struct ieee80211_iface_combination *comb)
13383 {
13384 	const struct ieee80211_iface_combination *iter_comb;
13385 	struct ieee80211_iface_limit *limits;
13386 	int i, j, n_limits;
13387 	bool ap, mesh, p2p;
13388 
13389 	if (!n_radio)
13390 		return 0;
13391 
13392 	ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
13393 	p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
13394 	mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
13395 
13396 	if ((ap || mesh) && !p2p)
13397 		n_limits = 2;
13398 	else if (p2p)
13399 		n_limits = 3;
13400 	else
13401 		n_limits = 1;
13402 
13403 	limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13404 	if (!limits)
13405 		return -ENOMEM;
13406 
13407 	for (i = 0; i < n_radio; i++) {
13408 		iter_comb = radio[i].iface_combinations;
13409 		for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) {
13410 			limits[j].types |= iter_comb->limits[j].types;
13411 			limits[j].max += iter_comb->limits[j].max;
13412 		}
13413 
13414 		comb->max_interfaces += iter_comb->max_interfaces;
13415 		comb->num_different_channels += iter_comb->num_different_channels;
13416 		comb->radar_detect_widths |= iter_comb->radar_detect_widths;
13417 	}
13418 
13419 	comb->limits = limits;
13420 	comb->n_limits = n_limits;
13421 	comb->beacon_int_infra_match = true;
13422 	comb->beacon_int_min_gcd = 100;
13423 
13424 	return 0;
13425 }
13426 
13427 static
ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination * iface_comb)13428 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb)
13429 {
13430 	kfree(iface_comb[0].limits);
13431 	kfree(iface_comb);
13432 }
13433 
ath12k_mac_cleanup_iface_combinations(struct ath12k_hw * ah)13434 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah)
13435 {
13436 	struct wiphy *wiphy = ah->hw->wiphy;
13437 	const struct wiphy_radio *radio;
13438 	int i;
13439 
13440 	if (wiphy->n_radio > 0) {
13441 		radio = wiphy->radio;
13442 		for (i = 0; i < wiphy->n_radio; i++)
13443 			ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13444 
13445 		kfree(wiphy->radio);
13446 	}
13447 
13448 	ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations);
13449 }
13450 
ath12k_mac_setup_iface_combinations(struct ath12k_hw * ah)13451 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
13452 {
13453 	struct ieee80211_iface_combination *combinations, *comb;
13454 	struct wiphy *wiphy = ah->hw->wiphy;
13455 	struct wiphy_radio *radio;
13456 	int n_combinations = 1;
13457 	struct ath12k *ar;
13458 	int i, ret;
13459 
13460 	if (ah->num_radio == 1) {
13461 		ar = &ah->radio[0];
13462 
13463 		if (ar->ab->hw_params->single_pdev_only)
13464 			n_combinations = 2;
13465 
13466 		combinations = kcalloc(n_combinations, sizeof(*combinations),
13467 				       GFP_KERNEL);
13468 		if (!combinations)
13469 			return -ENOMEM;
13470 
13471 		ret = ath12k_mac_setup_radio_iface_comb(ar, combinations);
13472 		if (ret) {
13473 			ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d",
13474 				       ret);
13475 			goto err_free_combinations;
13476 		}
13477 
13478 		if (ar->ab->hw_params->single_pdev_only) {
13479 			comb = combinations + 1;
13480 			memcpy(comb, combinations, sizeof(*comb));
13481 			comb->num_different_channels = 2;
13482 			comb->radar_detect_widths = 0;
13483 		}
13484 
13485 		goto out;
13486 	}
13487 
13488 	combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL);
13489 	if (!combinations)
13490 		return -ENOMEM;
13491 
13492 	/* there are multiple radios */
13493 
13494 	radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL);
13495 	if (!radio) {
13496 		ret = -ENOMEM;
13497 		goto err_free_combinations;
13498 	}
13499 
13500 	for_each_ar(ah, ar, i) {
13501 		comb = kzalloc(sizeof(*comb), GFP_KERNEL);
13502 		if (!comb) {
13503 			ret = -ENOMEM;
13504 			goto err_free_radios;
13505 		}
13506 
13507 		ret = ath12k_mac_setup_radio_iface_comb(ar, comb);
13508 		if (ret) {
13509 			ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d",
13510 				       i, ret);
13511 			kfree(comb);
13512 			goto err_free_radios;
13513 		}
13514 
13515 		radio[i].freq_range = &ar->freq_range;
13516 		radio[i].n_freq_range = 1;
13517 
13518 		radio[i].iface_combinations = comb;
13519 		radio[i].n_iface_combinations = 1;
13520 	}
13521 
13522 	ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations);
13523 	if (ret) {
13524 		ath12k_hw_warn(ah, "failed to setup global interface combinations: %d",
13525 			       ret);
13526 		goto err_free_all_radios;
13527 	}
13528 
13529 	wiphy->radio = radio;
13530 	wiphy->n_radio = ah->num_radio;
13531 
13532 out:
13533 	wiphy->iface_combinations = combinations;
13534 	wiphy->n_iface_combinations = n_combinations;
13535 
13536 	return 0;
13537 
13538 err_free_all_radios:
13539 	i = ah->num_radio;
13540 
13541 err_free_radios:
13542 	while (i--)
13543 		ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13544 
13545 	kfree(radio);
13546 
13547 err_free_combinations:
13548 	kfree(combinations);
13549 
13550 	return ret;
13551 }
13552 
13553 static const u8 ath12k_if_types_ext_capa[] = {
13554 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13555 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13556 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13557 };
13558 
13559 static const u8 ath12k_if_types_ext_capa_sta[] = {
13560 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13561 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13562 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13563 	[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
13564 };
13565 
13566 static const u8 ath12k_if_types_ext_capa_ap[] = {
13567 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13568 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13569 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13570 	[9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
13571 	[10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
13572 };
13573 
13574 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
13575 	{
13576 		.extended_capabilities = ath12k_if_types_ext_capa,
13577 		.extended_capabilities_mask = ath12k_if_types_ext_capa,
13578 		.extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
13579 	}, {
13580 		.iftype = NL80211_IFTYPE_STATION,
13581 		.extended_capabilities = ath12k_if_types_ext_capa_sta,
13582 		.extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
13583 		.extended_capabilities_len =
13584 				sizeof(ath12k_if_types_ext_capa_sta),
13585 	}, {
13586 		.iftype = NL80211_IFTYPE_AP,
13587 		.extended_capabilities = ath12k_if_types_ext_capa_ap,
13588 		.extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
13589 		.extended_capabilities_len =
13590 				sizeof(ath12k_if_types_ext_capa_ap),
13591 		.eml_capabilities = 0,
13592 		.mld_capa_and_ops = 0,
13593 	},
13594 };
13595 
ath12k_mac_cleanup_unregister(struct ath12k * ar)13596 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
13597 {
13598 	idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
13599 	idr_destroy(&ar->txmgmt_idr);
13600 
13601 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13602 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
13603 	kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13604 }
13605 
ath12k_mac_hw_unregister(struct ath12k_hw * ah)13606 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
13607 {
13608 	struct ieee80211_hw *hw = ah->hw;
13609 	struct ath12k *ar;
13610 	int i;
13611 
13612 	for_each_ar(ah, ar, i) {
13613 		cancel_work_sync(&ar->regd_channel_update_work);
13614 		cancel_work_sync(&ar->regd_update_work);
13615 		ath12k_debugfs_unregister(ar);
13616 		ath12k_fw_stats_reset(ar);
13617 	}
13618 
13619 	ieee80211_unregister_hw(hw);
13620 
13621 	for_each_ar(ah, ar, i)
13622 		ath12k_mac_cleanup_unregister(ar);
13623 
13624 	ath12k_mac_cleanup_iface_combinations(ah);
13625 
13626 	SET_IEEE80211_DEV(hw, NULL);
13627 }
13628 
ath12k_mac_setup_register(struct ath12k * ar,u32 * ht_cap,struct ieee80211_supported_band * bands[])13629 static int ath12k_mac_setup_register(struct ath12k *ar,
13630 				     u32 *ht_cap,
13631 				     struct ieee80211_supported_band *bands[])
13632 {
13633 	struct ath12k_pdev_cap *cap = &ar->pdev->cap;
13634 	int ret;
13635 
13636 	init_waitqueue_head(&ar->txmgmt_empty_waitq);
13637 	idr_init(&ar->txmgmt_idr);
13638 	spin_lock_init(&ar->txmgmt_idr_lock);
13639 
13640 	ath12k_pdev_caps_update(ar);
13641 
13642 	ret = ath12k_mac_setup_channels_rates(ar,
13643 					      cap->supported_bands,
13644 					      bands);
13645 	if (ret)
13646 		return ret;
13647 
13648 	ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
13649 	ath12k_mac_setup_sband_iftype_data(ar, cap);
13650 
13651 	ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
13652 	ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
13653 
13654 	ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR;
13655 	ar->rssi_info.temp_offset = 0;
13656 	ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset;
13657 
13658 	return 0;
13659 }
13660 
ath12k_mac_hw_register(struct ath12k_hw * ah)13661 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
13662 {
13663 	struct ieee80211_hw *hw = ah->hw;
13664 	struct wiphy *wiphy = hw->wiphy;
13665 	struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
13666 	struct ath12k_base *ab = ar->ab;
13667 	struct ath12k_pdev *pdev;
13668 	struct ath12k_pdev_cap *cap;
13669 	static const u32 cipher_suites[] = {
13670 		WLAN_CIPHER_SUITE_TKIP,
13671 		WLAN_CIPHER_SUITE_CCMP,
13672 		WLAN_CIPHER_SUITE_AES_CMAC,
13673 		WLAN_CIPHER_SUITE_BIP_CMAC_256,
13674 		WLAN_CIPHER_SUITE_BIP_GMAC_128,
13675 		WLAN_CIPHER_SUITE_BIP_GMAC_256,
13676 		WLAN_CIPHER_SUITE_GCMP,
13677 		WLAN_CIPHER_SUITE_GCMP_256,
13678 		WLAN_CIPHER_SUITE_CCMP_256,
13679 	};
13680 	int ret, i, j;
13681 	u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0;
13682 	bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false;
13683 	u8 *mac_addr = NULL;
13684 	u8 mbssid_max_interfaces = 0;
13685 
13686 	wiphy->max_ap_assoc_sta = 0;
13687 
13688 	for_each_ar(ah, ar, i) {
13689 		u32 ht_cap_info = 0;
13690 
13691 		pdev = ar->pdev;
13692 		if (ar->ab->pdevs_macaddr_valid) {
13693 			ether_addr_copy(ar->mac_addr, pdev->mac_addr);
13694 		} else {
13695 			ether_addr_copy(ar->mac_addr, ar->ab->mac_addr);
13696 			ar->mac_addr[4] += ar->pdev_idx;
13697 		}
13698 
13699 		ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands);
13700 		if (ret)
13701 			goto err_cleanup_unregister;
13702 
13703 		/* 6 GHz does not support HT Cap, hence do not consider it */
13704 		if (!ar->supports_6ghz)
13705 			ht_cap &= ht_cap_info;
13706 
13707 		wiphy->max_ap_assoc_sta += ar->max_num_stations;
13708 
13709 		/* Advertise the max antenna support of all radios, driver can handle
13710 		 * per pdev specific antenna setting based on pdev cap when antenna
13711 		 * changes are made
13712 		 */
13713 		cap = &pdev->cap;
13714 
13715 		antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask);
13716 		antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask);
13717 
13718 		if (ar->supports_6ghz)
13719 			is_6ghz = true;
13720 
13721 		if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
13722 			is_raw_mode = true;
13723 
13724 		if (!ar->ab->hw_params->supports_monitor)
13725 			is_monitor_disable = true;
13726 
13727 		if (i == 0)
13728 			mac_addr = ar->mac_addr;
13729 		else
13730 			mac_addr = ab->mac_addr;
13731 
13732 		mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab);
13733 	}
13734 
13735 	wiphy->available_antennas_rx = antennas_rx;
13736 	wiphy->available_antennas_tx = antennas_tx;
13737 
13738 	SET_IEEE80211_PERM_ADDR(hw, mac_addr);
13739 	SET_IEEE80211_DEV(hw, ab->dev);
13740 
13741 	ret = ath12k_mac_setup_iface_combinations(ah);
13742 	if (ret) {
13743 		ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
13744 		goto err_complete_cleanup_unregister;
13745 	}
13746 
13747 	wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
13748 
13749 	if (ah->num_radio == 1 &&
13750 	    wiphy->bands[NL80211_BAND_2GHZ] &&
13751 	    wiphy->bands[NL80211_BAND_5GHZ] &&
13752 	    wiphy->bands[NL80211_BAND_6GHZ])
13753 		ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
13754 
13755 	ieee80211_hw_set(hw, SIGNAL_DBM);
13756 	ieee80211_hw_set(hw, SUPPORTS_PS);
13757 	ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
13758 	ieee80211_hw_set(hw, MFP_CAPABLE);
13759 	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
13760 	ieee80211_hw_set(hw, HAS_RATE_CONTROL);
13761 	ieee80211_hw_set(hw, AP_LINK_PS);
13762 	ieee80211_hw_set(hw, SPECTRUM_MGMT);
13763 	ieee80211_hw_set(hw, CONNECTION_MONITOR);
13764 	ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
13765 	ieee80211_hw_set(hw, CHANCTX_STA_CSA);
13766 	ieee80211_hw_set(hw, QUEUE_CONTROL);
13767 	ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
13768 	ieee80211_hw_set(hw, REPORTS_LOW_ACK);
13769 	ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
13770 
13771 	if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) {
13772 		ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
13773 		ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
13774 	}
13775 
13776 	if (cap->nss_ratio_enabled)
13777 		ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
13778 
13779 	if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
13780 		ieee80211_hw_set(hw, AMPDU_AGGREGATION);
13781 		ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
13782 		ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
13783 		ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
13784 		ieee80211_hw_set(hw, USES_RSS);
13785 	}
13786 
13787 	wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
13788 	wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
13789 
13790 	/* TODO: Check if HT capability advertised from firmware is different
13791 	 * for each band for a dual band capable radio. It will be tricky to
13792 	 * handle it when the ht capability different for each band.
13793 	 */
13794 	if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
13795 	    (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz))
13796 		wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
13797 
13798 	wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
13799 	wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
13800 
13801 	hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
13802 
13803 	wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
13804 	wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
13805 	wiphy->max_remain_on_channel_duration = 5000;
13806 
13807 	wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
13808 	wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
13809 				   NL80211_FEATURE_AP_SCAN;
13810 
13811 	wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
13812 
13813 	/* MLO is not yet supported so disable Wireless Extensions for now
13814 	 * to make sure ath12k users don't use it. This flag can be removed
13815 	 * once WIPHY_FLAG_SUPPORTS_MLO is enabled.
13816 	 */
13817 	wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
13818 
13819 	/* Copy over MLO related capabilities received from
13820 	 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set.
13821 	 */
13822 	if (ab->ag->mlo_capable) {
13823 		ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap;
13824 		ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap;
13825 		wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
13826 
13827 		ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX);
13828 	}
13829 
13830 	hw->queues = ATH12K_HW_MAX_QUEUES;
13831 	wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
13832 	hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
13833 	hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
13834 
13835 	hw->vif_data_size = sizeof(struct ath12k_vif);
13836 	hw->sta_data_size = sizeof(struct ath12k_sta);
13837 	hw->extra_tx_headroom = ab->hw_params->iova_mask;
13838 
13839 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
13840 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
13841 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
13842 
13843 	wiphy->cipher_suites = cipher_suites;
13844 	wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
13845 
13846 	wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
13847 	wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
13848 
13849 	wiphy->mbssid_max_interfaces = mbssid_max_interfaces;
13850 	wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
13851 	ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
13852 
13853 	if (is_6ghz) {
13854 		wiphy_ext_feature_set(wiphy,
13855 				      NL80211_EXT_FEATURE_FILS_DISCOVERY);
13856 		wiphy_ext_feature_set(wiphy,
13857 				      NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
13858 	}
13859 
13860 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
13861 	if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map))
13862 		wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
13863 
13864 	ath12k_reg_init(hw);
13865 
13866 	if (!is_raw_mode) {
13867 		hw->netdev_features = NETIF_F_HW_CSUM;
13868 		ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
13869 		ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
13870 	}
13871 
13872 	if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
13873 		wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
13874 		wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
13875 		wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
13876 		wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
13877 		wiphy->max_sched_scan_plan_interval =
13878 					WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
13879 		wiphy->max_sched_scan_plan_iterations =
13880 					WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
13881 		wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
13882 	}
13883 
13884 	ret = ath12k_wow_init(ar);
13885 	if (ret) {
13886 		ath12k_warn(ar->ab, "failed to init wow: %d\n", ret);
13887 		goto err_cleanup_if_combs;
13888 	}
13889 
13890 	/* Boot-time regulatory updates have already been processed.
13891 	 * Mark them as complete now, because after registration,
13892 	 * cfg80211 will notify us again if there are any pending hints.
13893 	 * We need to wait for those hints to be processed, so it's
13894 	 * important to mark the boot-time updates as complete before
13895 	 * proceeding with registration.
13896 	 */
13897 	for_each_ar(ah, ar, i)
13898 		complete_all(&ar->regd_update_completed);
13899 
13900 	ret = ieee80211_register_hw(hw);
13901 	if (ret) {
13902 		ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
13903 		goto err_cleanup_if_combs;
13904 	}
13905 
13906 	if (is_monitor_disable)
13907 		/* There's a race between calling ieee80211_register_hw()
13908 		 * and here where the monitor mode is enabled for a little
13909 		 * while. But that time is so short and in practise it make
13910 		 * a difference in real life.
13911 		 */
13912 		wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
13913 
13914 	for_each_ar(ah, ar, i) {
13915 		/* Apply the regd received during initialization */
13916 		ret = ath12k_regd_update(ar, true);
13917 		if (ret) {
13918 			ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
13919 			goto err_unregister_hw;
13920 		}
13921 
13922 		if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
13923 			struct wmi_set_current_country_arg current_cc = {};
13924 
13925 			memcpy(&current_cc.alpha2, ab->new_alpha2, 2);
13926 			memcpy(&ar->alpha2, ab->new_alpha2, 2);
13927 
13928 			reinit_completion(&ar->regd_update_completed);
13929 
13930 			ret = ath12k_wmi_send_set_current_country_cmd(ar, &current_cc);
13931 			if (ret)
13932 				ath12k_warn(ar->ab,
13933 					    "failed set cc code for mac register: %d\n",
13934 					    ret);
13935 		}
13936 
13937 		ath12k_fw_stats_init(ar);
13938 		ath12k_debugfs_register(ar);
13939 	}
13940 
13941 	return 0;
13942 
13943 err_unregister_hw:
13944 	for_each_ar(ah, ar, i)
13945 		ath12k_debugfs_unregister(ar);
13946 
13947 	ieee80211_unregister_hw(hw);
13948 
13949 err_cleanup_if_combs:
13950 	ath12k_mac_cleanup_iface_combinations(ah);
13951 
13952 err_complete_cleanup_unregister:
13953 	i = ah->num_radio;
13954 
13955 err_cleanup_unregister:
13956 	for (j = 0; j < i; j++) {
13957 		ar = ath12k_ah_to_ar(ah, j);
13958 		ath12k_mac_cleanup_unregister(ar);
13959 	}
13960 
13961 	SET_IEEE80211_DEV(hw, NULL);
13962 
13963 	return ret;
13964 }
13965 
ath12k_mac_setup(struct ath12k * ar)13966 static void ath12k_mac_setup(struct ath12k *ar)
13967 {
13968 	struct ath12k_base *ab = ar->ab;
13969 	struct ath12k_pdev *pdev = ar->pdev;
13970 	u8 pdev_idx = ar->pdev_idx;
13971 
13972 	ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
13973 
13974 	ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
13975 	/* FIXME: wmi[0] is already initialized during attach,
13976 	 * Should we do this again?
13977 	 */
13978 	ath12k_wmi_pdev_attach(ab, pdev_idx);
13979 
13980 	ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
13981 	ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
13982 	ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
13983 	ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
13984 	ar->scan.arvif = NULL;
13985 	ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
13986 
13987 	spin_lock_init(&ar->data_lock);
13988 	INIT_LIST_HEAD(&ar->arvifs);
13989 	INIT_LIST_HEAD(&ar->ppdu_stats_info);
13990 
13991 	init_completion(&ar->vdev_setup_done);
13992 	init_completion(&ar->vdev_delete_done);
13993 	init_completion(&ar->peer_assoc_done);
13994 	init_completion(&ar->peer_delete_done);
13995 	init_completion(&ar->install_key_done);
13996 	init_completion(&ar->bss_survey_done);
13997 	init_completion(&ar->scan.started);
13998 	init_completion(&ar->scan.completed);
13999 	init_completion(&ar->scan.on_channel);
14000 	init_completion(&ar->mlo_setup_done);
14001 	init_completion(&ar->completed_11d_scan);
14002 	init_completion(&ar->regd_update_completed);
14003 
14004 	INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
14005 	wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
14006 	INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work);
14007 	INIT_LIST_HEAD(&ar->regd_channel_update_queue);
14008 	INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
14009 
14010 	wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
14011 	skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
14012 
14013 	ar->monitor_vdev_id = -1;
14014 	ar->monitor_vdev_created = false;
14015 	ar->monitor_started = false;
14016 }
14017 
__ath12k_mac_mlo_setup(struct ath12k * ar)14018 static int __ath12k_mac_mlo_setup(struct ath12k *ar)
14019 {
14020 	u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {};
14021 	struct ath12k_base *partner_ab, *ab = ar->ab;
14022 	struct ath12k_hw_group *ag = ab->ag;
14023 	struct wmi_mlo_setup_arg mlo = {};
14024 	struct ath12k_pdev *pdev;
14025 	unsigned long time_left;
14026 	int i, j, ret;
14027 
14028 	lockdep_assert_held(&ag->mutex);
14029 
14030 	reinit_completion(&ar->mlo_setup_done);
14031 
14032 	for (i = 0; i < ag->num_devices; i++) {
14033 		partner_ab = ag->ab[i];
14034 
14035 		for (j = 0; j < partner_ab->num_radios; j++) {
14036 			pdev = &partner_ab->pdevs[j];
14037 
14038 			/* Avoid the self link */
14039 			if (ar == pdev->ar)
14040 				continue;
14041 
14042 			partner_link_id[num_link] = pdev->hw_link_id;
14043 			num_link++;
14044 
14045 			ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n",
14046 				   i, j, pdev->hw_link_id, num_link);
14047 		}
14048 	}
14049 
14050 	if (num_link == 0)
14051 		return 0;
14052 
14053 	mlo.group_id = cpu_to_le32(ag->id);
14054 	mlo.partner_link_id = partner_link_id;
14055 	mlo.num_partner_links = num_link;
14056 	ar->mlo_setup_status = 0;
14057 
14058 	ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link);
14059 
14060 	ret = ath12k_wmi_mlo_setup(ar, &mlo);
14061 	if (ret) {
14062 		ath12k_err(ab, "failed to send  setup MLO WMI command for pdev %d: %d\n",
14063 			   ar->pdev_idx, ret);
14064 		return ret;
14065 	}
14066 
14067 	time_left = wait_for_completion_timeout(&ar->mlo_setup_done,
14068 						WMI_MLO_CMD_TIMEOUT_HZ);
14069 
14070 	if (!time_left || ar->mlo_setup_status)
14071 		return ar->mlo_setup_status ? : -ETIMEDOUT;
14072 
14073 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx);
14074 
14075 	return 0;
14076 }
14077 
__ath12k_mac_mlo_teardown(struct ath12k * ar)14078 static int __ath12k_mac_mlo_teardown(struct ath12k *ar)
14079 {
14080 	struct ath12k_base *ab = ar->ab;
14081 	int ret;
14082 	u8 num_link;
14083 
14084 	if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
14085 		return 0;
14086 
14087 	num_link = ath12k_get_num_partner_link(ar);
14088 
14089 	if (num_link == 0)
14090 		return 0;
14091 
14092 	ret = ath12k_wmi_mlo_teardown(ar);
14093 	if (ret) {
14094 		ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n",
14095 			    ar->pdev_idx, ret);
14096 		return ret;
14097 	}
14098 
14099 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx);
14100 
14101 	return 0;
14102 }
14103 
ath12k_mac_mlo_setup(struct ath12k_hw_group * ag)14104 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag)
14105 {
14106 	struct ath12k_hw *ah;
14107 	struct ath12k *ar;
14108 	int ret;
14109 	int i, j;
14110 
14111 	for (i = 0; i < ag->num_hw; i++) {
14112 		ah = ag->ah[i];
14113 		if (!ah)
14114 			continue;
14115 
14116 		for_each_ar(ah, ar, j) {
14117 			ar = &ah->radio[j];
14118 			ret = __ath12k_mac_mlo_setup(ar);
14119 			if (ret) {
14120 				ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret);
14121 				goto err_setup;
14122 			}
14123 		}
14124 	}
14125 
14126 	return 0;
14127 
14128 err_setup:
14129 	for (i = i - 1; i >= 0; i--) {
14130 		ah = ag->ah[i];
14131 		if (!ah)
14132 			continue;
14133 
14134 		for (j = j - 1; j >= 0; j--) {
14135 			ar = &ah->radio[j];
14136 			if (!ar)
14137 				continue;
14138 
14139 			__ath12k_mac_mlo_teardown(ar);
14140 		}
14141 	}
14142 
14143 	return ret;
14144 }
14145 
ath12k_mac_mlo_teardown(struct ath12k_hw_group * ag)14146 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag)
14147 {
14148 	struct ath12k_hw *ah;
14149 	struct ath12k *ar;
14150 	int ret, i, j;
14151 
14152 	for (i = 0; i < ag->num_hw; i++) {
14153 		ah = ag->ah[i];
14154 		if (!ah)
14155 			continue;
14156 
14157 		for_each_ar(ah, ar, j) {
14158 			ar = &ah->radio[j];
14159 			ret = __ath12k_mac_mlo_teardown(ar);
14160 			if (ret) {
14161 				ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret);
14162 				break;
14163 			}
14164 		}
14165 	}
14166 }
14167 
ath12k_mac_register(struct ath12k_hw_group * ag)14168 int ath12k_mac_register(struct ath12k_hw_group *ag)
14169 {
14170 	struct ath12k_hw *ah;
14171 	int i;
14172 	int ret;
14173 
14174 	for (i = 0; i < ag->num_hw; i++) {
14175 		ah = ath12k_ag_to_ah(ag, i);
14176 
14177 		ret = ath12k_mac_hw_register(ah);
14178 		if (ret)
14179 			goto err;
14180 	}
14181 
14182 	return 0;
14183 
14184 err:
14185 	for (i = i - 1; i >= 0; i--) {
14186 		ah = ath12k_ag_to_ah(ag, i);
14187 		if (!ah)
14188 			continue;
14189 
14190 		ath12k_mac_hw_unregister(ah);
14191 	}
14192 
14193 	return ret;
14194 }
14195 
ath12k_mac_unregister(struct ath12k_hw_group * ag)14196 void ath12k_mac_unregister(struct ath12k_hw_group *ag)
14197 {
14198 	struct ath12k_hw *ah;
14199 	int i;
14200 
14201 	for (i = ag->num_hw - 1; i >= 0; i--) {
14202 		ah = ath12k_ag_to_ah(ag, i);
14203 		if (!ah)
14204 			continue;
14205 
14206 		ath12k_mac_hw_unregister(ah);
14207 	}
14208 }
14209 
ath12k_mac_hw_destroy(struct ath12k_hw * ah)14210 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
14211 {
14212 	ieee80211_free_hw(ah->hw);
14213 }
14214 
ath12k_mac_hw_allocate(struct ath12k_hw_group * ag,struct ath12k_pdev_map * pdev_map,u8 num_pdev_map)14215 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag,
14216 						struct ath12k_pdev_map *pdev_map,
14217 						u8 num_pdev_map)
14218 {
14219 	struct ieee80211_hw *hw;
14220 	struct ath12k *ar;
14221 	struct ath12k_base *ab;
14222 	struct ath12k_pdev *pdev;
14223 	struct ath12k_hw *ah;
14224 	int i;
14225 	u8 pdev_idx;
14226 
14227 	hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
14228 				&ath12k_ops);
14229 	if (!hw)
14230 		return NULL;
14231 
14232 	ah = ath12k_hw_to_ah(hw);
14233 	ah->hw = hw;
14234 	ah->num_radio = num_pdev_map;
14235 
14236 	mutex_init(&ah->hw_mutex);
14237 	INIT_LIST_HEAD(&ah->ml_peers);
14238 
14239 	for (i = 0; i < num_pdev_map; i++) {
14240 		ab = pdev_map[i].ab;
14241 		pdev_idx = pdev_map[i].pdev_idx;
14242 		pdev = &ab->pdevs[pdev_idx];
14243 
14244 		ar = ath12k_ah_to_ar(ah, i);
14245 		ar->ah = ah;
14246 		ar->ab = ab;
14247 		ar->hw_link_id = pdev->hw_link_id;
14248 		ar->pdev = pdev;
14249 		ar->pdev_idx = pdev_idx;
14250 		pdev->ar = ar;
14251 
14252 		ag->hw_links[ar->hw_link_id].device_id = ab->device_id;
14253 		ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx;
14254 
14255 		ath12k_mac_setup(ar);
14256 		ath12k_dp_pdev_pre_alloc(ar);
14257 	}
14258 
14259 	return ah;
14260 }
14261 
ath12k_mac_destroy(struct ath12k_hw_group * ag)14262 void ath12k_mac_destroy(struct ath12k_hw_group *ag)
14263 {
14264 	struct ath12k_pdev *pdev;
14265 	struct ath12k_base *ab = ag->ab[0];
14266 	int i, j;
14267 	struct ath12k_hw *ah;
14268 
14269 	for (i = 0; i < ag->num_devices; i++) {
14270 		ab = ag->ab[i];
14271 		if (!ab)
14272 			continue;
14273 
14274 		for (j = 0; j < ab->num_radios; j++) {
14275 			pdev = &ab->pdevs[j];
14276 			if (!pdev->ar)
14277 				continue;
14278 			pdev->ar = NULL;
14279 		}
14280 	}
14281 
14282 	for (i = 0; i < ag->num_hw; i++) {
14283 		ah = ath12k_ag_to_ah(ag, i);
14284 		if (!ah)
14285 			continue;
14286 
14287 		ath12k_mac_hw_destroy(ah);
14288 		ath12k_ag_set_ah(ag, i, NULL);
14289 	}
14290 }
14291 
ath12k_mac_set_device_defaults(struct ath12k_base * ab)14292 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab)
14293 {
14294 	int total_vdev;
14295 
14296 	/* Initialize channel counters frequency value in hertz */
14297 	ab->cc_freq_hz = 320000;
14298 	total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab);
14299 	ab->free_vdev_map = (1LL << total_vdev) - 1;
14300 }
14301 
ath12k_mac_allocate(struct ath12k_hw_group * ag)14302 int ath12k_mac_allocate(struct ath12k_hw_group *ag)
14303 {
14304 	struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO];
14305 	int mac_id, device_id, total_radio, num_hw;
14306 	struct ath12k_base *ab;
14307 	struct ath12k_hw *ah;
14308 	int ret, i, j;
14309 	u8 radio_per_hw;
14310 
14311 	total_radio = 0;
14312 	for (i = 0; i < ag->num_devices; i++) {
14313 		ab = ag->ab[i];
14314 		if (!ab)
14315 			continue;
14316 
14317 		ath12k_debugfs_pdev_create(ab);
14318 		ath12k_mac_set_device_defaults(ab);
14319 		total_radio += ab->num_radios;
14320 	}
14321 
14322 	if (!total_radio)
14323 		return -EINVAL;
14324 
14325 	if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO))
14326 		return -ENOSPC;
14327 
14328 	/* All pdev get combined and register as single wiphy based on
14329 	 * hardware group which participate in multi-link operation else
14330 	 * each pdev get register separately.
14331 	 */
14332 	if (ag->mlo_capable)
14333 		radio_per_hw = total_radio;
14334 	else
14335 		radio_per_hw = 1;
14336 
14337 	num_hw = total_radio / radio_per_hw;
14338 
14339 	ag->num_hw = 0;
14340 	device_id = 0;
14341 	mac_id = 0;
14342 	for (i = 0; i < num_hw; i++) {
14343 		for (j = 0; j < radio_per_hw; j++) {
14344 			if (device_id >= ag->num_devices || !ag->ab[device_id]) {
14345 				ret = -ENOSPC;
14346 				goto err;
14347 			}
14348 
14349 			ab = ag->ab[device_id];
14350 			pdev_map[j].ab = ab;
14351 			pdev_map[j].pdev_idx = mac_id;
14352 			mac_id++;
14353 
14354 			/* If mac_id falls beyond the current device MACs then
14355 			 * move to next device
14356 			 */
14357 			if (mac_id >= ab->num_radios) {
14358 				mac_id = 0;
14359 				device_id++;
14360 			}
14361 		}
14362 
14363 		ab = pdev_map->ab;
14364 
14365 		ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw);
14366 		if (!ah) {
14367 			ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
14368 				    i);
14369 			ret = -ENOMEM;
14370 			goto err;
14371 		}
14372 
14373 		ah->dev = ab->dev;
14374 
14375 		ag->ah[i] = ah;
14376 		ag->num_hw++;
14377 	}
14378 
14379 	return 0;
14380 
14381 err:
14382 	for (i = i - 1; i >= 0; i--) {
14383 		ah = ath12k_ag_to_ah(ag, i);
14384 		if (!ah)
14385 			continue;
14386 
14387 		ath12k_mac_hw_destroy(ah);
14388 		ath12k_ag_set_ah(ag, i, NULL);
14389 	}
14390 
14391 	return ret;
14392 }
14393 
ath12k_mac_vif_set_keepalive(struct ath12k_link_vif * arvif,enum wmi_sta_keepalive_method method,u32 interval)14394 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif,
14395 				 enum wmi_sta_keepalive_method method,
14396 				 u32 interval)
14397 {
14398 	struct wmi_sta_keepalive_arg arg = {};
14399 	struct ath12k *ar = arvif->ar;
14400 	int ret;
14401 
14402 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
14403 
14404 	if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
14405 		return 0;
14406 
14407 	if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
14408 		return 0;
14409 
14410 	arg.vdev_id = arvif->vdev_id;
14411 	arg.enabled = 1;
14412 	arg.method = method;
14413 	arg.interval = interval;
14414 
14415 	ret = ath12k_wmi_sta_keepalive(ar, &arg);
14416 	if (ret) {
14417 		ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
14418 			    arvif->vdev_id, ret);
14419 		return ret;
14420 	}
14421 
14422 	return 0;
14423 }
14424