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