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