xref: /linux/drivers/net/wireless/ath/ath11k/mac.c (revision ea518afc992032f7570c0a89ac9240b387dc0faf)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-2023 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 #include <linux/bitfield.h>
11 #include <linux/inetdevice.h>
12 #include <net/if_inet6.h>
13 #include <net/ipv6.h>
14 
15 #include "mac.h"
16 #include "core.h"
17 #include "debug.h"
18 #include "wmi.h"
19 #include "hw.h"
20 #include "dp_tx.h"
21 #include "dp_rx.h"
22 #include "testmode.h"
23 #include "peer.h"
24 #include "debugfs_sta.h"
25 #include "hif.h"
26 #include "wow.h"
27 
28 #define CHAN2G(_channel, _freq, _flags) { \
29 	.band                   = NL80211_BAND_2GHZ, \
30 	.hw_value               = (_channel), \
31 	.center_freq            = (_freq), \
32 	.flags                  = (_flags), \
33 	.max_antenna_gain       = 0, \
34 	.max_power              = 30, \
35 }
36 
37 #define CHAN5G(_channel, _freq, _flags) { \
38 	.band                   = NL80211_BAND_5GHZ, \
39 	.hw_value               = (_channel), \
40 	.center_freq            = (_freq), \
41 	.flags                  = (_flags), \
42 	.max_antenna_gain       = 0, \
43 	.max_power              = 30, \
44 }
45 
46 #define CHAN6G(_channel, _freq, _flags) { \
47 	.band                   = NL80211_BAND_6GHZ, \
48 	.hw_value               = (_channel), \
49 	.center_freq            = (_freq), \
50 	.flags                  = (_flags), \
51 	.max_antenna_gain       = 0, \
52 	.max_power              = 30, \
53 }
54 
55 static const struct ieee80211_channel ath11k_2ghz_channels[] = {
56 	CHAN2G(1, 2412, 0),
57 	CHAN2G(2, 2417, 0),
58 	CHAN2G(3, 2422, 0),
59 	CHAN2G(4, 2427, 0),
60 	CHAN2G(5, 2432, 0),
61 	CHAN2G(6, 2437, 0),
62 	CHAN2G(7, 2442, 0),
63 	CHAN2G(8, 2447, 0),
64 	CHAN2G(9, 2452, 0),
65 	CHAN2G(10, 2457, 0),
66 	CHAN2G(11, 2462, 0),
67 	CHAN2G(12, 2467, 0),
68 	CHAN2G(13, 2472, 0),
69 	CHAN2G(14, 2484, 0),
70 };
71 
72 static const struct ieee80211_channel ath11k_5ghz_channels[] = {
73 	CHAN5G(36, 5180, 0),
74 	CHAN5G(40, 5200, 0),
75 	CHAN5G(44, 5220, 0),
76 	CHAN5G(48, 5240, 0),
77 	CHAN5G(52, 5260, 0),
78 	CHAN5G(56, 5280, 0),
79 	CHAN5G(60, 5300, 0),
80 	CHAN5G(64, 5320, 0),
81 	CHAN5G(100, 5500, 0),
82 	CHAN5G(104, 5520, 0),
83 	CHAN5G(108, 5540, 0),
84 	CHAN5G(112, 5560, 0),
85 	CHAN5G(116, 5580, 0),
86 	CHAN5G(120, 5600, 0),
87 	CHAN5G(124, 5620, 0),
88 	CHAN5G(128, 5640, 0),
89 	CHAN5G(132, 5660, 0),
90 	CHAN5G(136, 5680, 0),
91 	CHAN5G(140, 5700, 0),
92 	CHAN5G(144, 5720, 0),
93 	CHAN5G(149, 5745, 0),
94 	CHAN5G(153, 5765, 0),
95 	CHAN5G(157, 5785, 0),
96 	CHAN5G(161, 5805, 0),
97 	CHAN5G(165, 5825, 0),
98 	CHAN5G(169, 5845, 0),
99 	CHAN5G(173, 5865, 0),
100 	CHAN5G(177, 5885, 0),
101 };
102 
103 static const struct ieee80211_channel ath11k_6ghz_channels[] = {
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 	/* new addition in IEEE Std 802.11ax-2021 */
165 	CHAN6G(2, 5935, 0),
166 };
167 
168 static struct ieee80211_rate ath11k_legacy_rates[] = {
169 	{ .bitrate = 10,
170 	  .hw_value = ATH11K_HW_RATE_CCK_LP_1M },
171 	{ .bitrate = 20,
172 	  .hw_value = ATH11K_HW_RATE_CCK_LP_2M,
173 	  .hw_value_short = ATH11K_HW_RATE_CCK_SP_2M,
174 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
175 	{ .bitrate = 55,
176 	  .hw_value = ATH11K_HW_RATE_CCK_LP_5_5M,
177 	  .hw_value_short = ATH11K_HW_RATE_CCK_SP_5_5M,
178 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
179 	{ .bitrate = 110,
180 	  .hw_value = ATH11K_HW_RATE_CCK_LP_11M,
181 	  .hw_value_short = ATH11K_HW_RATE_CCK_SP_11M,
182 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
183 
184 	{ .bitrate = 60, .hw_value = ATH11K_HW_RATE_OFDM_6M },
185 	{ .bitrate = 90, .hw_value = ATH11K_HW_RATE_OFDM_9M },
186 	{ .bitrate = 120, .hw_value = ATH11K_HW_RATE_OFDM_12M },
187 	{ .bitrate = 180, .hw_value = ATH11K_HW_RATE_OFDM_18M },
188 	{ .bitrate = 240, .hw_value = ATH11K_HW_RATE_OFDM_24M },
189 	{ .bitrate = 360, .hw_value = ATH11K_HW_RATE_OFDM_36M },
190 	{ .bitrate = 480, .hw_value = ATH11K_HW_RATE_OFDM_48M },
191 	{ .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
192 };
193 
194 static const int
195 ath11k_phymodes[NUM_NL80211_BANDS][ATH11K_CHAN_WIDTH_NUM] = {
196 	[NL80211_BAND_2GHZ] = {
197 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
198 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
199 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
200 			[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
201 			[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
202 			[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
203 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
204 			[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
205 	},
206 	[NL80211_BAND_5GHZ] = {
207 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
208 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
209 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
210 			[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
211 			[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
212 			[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
213 			[NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
214 			[NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
215 	},
216 	[NL80211_BAND_6GHZ] = {
217 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
218 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
219 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
220 			[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
221 			[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
222 			[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
223 			[NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
224 			[NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
225 	},
226 
227 };
228 
229 const struct htt_rx_ring_tlv_filter ath11k_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 	.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
234 	.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
235 	.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
236 	.pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
237 			     HTT_RX_FP_CTRL_FILTER_FLASG3
238 };
239 
240 #define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
241 #define ath11k_g_rates ath11k_legacy_rates
242 #define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
243 #define ath11k_a_rates (ath11k_legacy_rates + 4)
244 #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
245 
246 #define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD		200 /* in msecs */
247 
248 /* Overhead due to the processing of channel switch events from FW */
249 #define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD	10 /* in msecs */
250 
251 static const u32 ath11k_smps_map[] = {
252 	[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
253 	[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
254 	[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
255 	[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
256 };
257 
258 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
259 				   struct ieee80211_vif *vif);
260 
261 enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy)
262 {
263 	enum nl80211_he_ru_alloc ret;
264 
265 	switch (ru_phy) {
266 	case RU_26:
267 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
268 		break;
269 	case RU_52:
270 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
271 		break;
272 	case RU_106:
273 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
274 		break;
275 	case RU_242:
276 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
277 		break;
278 	case RU_484:
279 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
280 		break;
281 	case RU_996:
282 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
283 		break;
284 	default:
285 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
286 		break;
287 	}
288 
289 	return ret;
290 }
291 
292 enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones)
293 {
294 	enum nl80211_he_ru_alloc ret;
295 
296 	switch (ru_tones) {
297 	case 26:
298 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
299 		break;
300 	case 52:
301 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_52;
302 		break;
303 	case 106:
304 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_106;
305 		break;
306 	case 242:
307 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_242;
308 		break;
309 	case 484:
310 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_484;
311 		break;
312 	case 996:
313 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_996;
314 		break;
315 	case (996 * 2):
316 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_2x996;
317 		break;
318 	default:
319 		ret = NL80211_RATE_INFO_HE_RU_ALLOC_26;
320 		break;
321 	}
322 
323 	return ret;
324 }
325 
326 enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi)
327 {
328 	enum nl80211_he_gi ret;
329 
330 	switch (sgi) {
331 	case RX_MSDU_START_SGI_0_8_US:
332 		ret = NL80211_RATE_INFO_HE_GI_0_8;
333 		break;
334 	case RX_MSDU_START_SGI_1_6_US:
335 		ret = NL80211_RATE_INFO_HE_GI_1_6;
336 		break;
337 	case RX_MSDU_START_SGI_3_2_US:
338 		ret = NL80211_RATE_INFO_HE_GI_3_2;
339 		break;
340 	default:
341 		ret = NL80211_RATE_INFO_HE_GI_0_8;
342 		break;
343 	}
344 
345 	return ret;
346 }
347 
348 u8 ath11k_mac_bw_to_mac80211_bw(u8 bw)
349 {
350 	u8 ret = 0;
351 
352 	switch (bw) {
353 	case ATH11K_BW_20:
354 		ret = RATE_INFO_BW_20;
355 		break;
356 	case ATH11K_BW_40:
357 		ret = RATE_INFO_BW_40;
358 		break;
359 	case ATH11K_BW_80:
360 		ret = RATE_INFO_BW_80;
361 		break;
362 	case ATH11K_BW_160:
363 		ret = RATE_INFO_BW_160;
364 		break;
365 	}
366 
367 	return ret;
368 }
369 
370 enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw)
371 {
372 	switch (bw) {
373 	case RATE_INFO_BW_20:
374 		return ATH11K_BW_20;
375 	case RATE_INFO_BW_40:
376 		return ATH11K_BW_40;
377 	case RATE_INFO_BW_80:
378 		return ATH11K_BW_80;
379 	case RATE_INFO_BW_160:
380 		return ATH11K_BW_160;
381 	default:
382 		return ATH11K_BW_20;
383 	}
384 }
385 
386 int ath11k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
387 					  u16 *rate)
388 {
389 	/* As default, it is OFDM rates */
390 	int i = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
391 	int max_rates_idx = ath11k_g_rates_size;
392 
393 	if (preamble == WMI_RATE_PREAMBLE_CCK) {
394 		hw_rc &= ~ATH11k_HW_RATECODE_CCK_SHORT_PREAM_MASK;
395 		i = 0;
396 		max_rates_idx = ATH11K_MAC_FIRST_OFDM_RATE_IDX;
397 	}
398 
399 	while (i < max_rates_idx) {
400 		if (hw_rc == ath11k_legacy_rates[i].hw_value) {
401 			*rateidx = i;
402 			*rate = ath11k_legacy_rates[i].bitrate;
403 			return 0;
404 		}
405 		i++;
406 	}
407 
408 	return -EINVAL;
409 }
410 
411 static int get_num_chains(u32 mask)
412 {
413 	int num_chains = 0;
414 
415 	while (mask) {
416 		if (mask & BIT(0))
417 			num_chains++;
418 		mask >>= 1;
419 	}
420 
421 	return num_chains;
422 }
423 
424 u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
425 			     u32 bitrate)
426 {
427 	int i;
428 
429 	for (i = 0; i < sband->n_bitrates; i++)
430 		if (sband->bitrates[i].bitrate == bitrate)
431 			return i;
432 
433 	return 0;
434 }
435 
436 static u32
437 ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask)
438 {
439 	int nss;
440 
441 	for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
442 		if (ht_mcs_mask[nss])
443 			return nss + 1;
444 
445 	return 1;
446 }
447 
448 static u32
449 ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask)
450 {
451 	int nss;
452 
453 	for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
454 		if (vht_mcs_mask[nss])
455 			return nss + 1;
456 
457 	return 1;
458 }
459 
460 static u32
461 ath11k_mac_max_he_nss(const u16 *he_mcs_mask)
462 {
463 	int nss;
464 
465 	for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
466 		if (he_mcs_mask[nss])
467 			return nss + 1;
468 
469 	return 1;
470 }
471 
472 static u8 ath11k_parse_mpdudensity(u8 mpdudensity)
473 {
474 /* 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
475  *   0 for no restriction
476  *   1 for 1/4 us
477  *   2 for 1/2 us
478  *   3 for 1 us
479  *   4 for 2 us
480  *   5 for 4 us
481  *   6 for 8 us
482  *   7 for 16 us
483  */
484 	switch (mpdudensity) {
485 	case 0:
486 		return 0;
487 	case 1:
488 	case 2:
489 	case 3:
490 	/* Our lower layer calculations limit our precision to
491 	 * 1 microsecond
492 	 */
493 		return 1;
494 	case 4:
495 		return 2;
496 	case 5:
497 		return 4;
498 	case 6:
499 		return 8;
500 	case 7:
501 		return 16;
502 	default:
503 		return 0;
504 	}
505 }
506 
507 static int ath11k_mac_vif_chan(struct ieee80211_vif *vif,
508 			       struct cfg80211_chan_def *def)
509 {
510 	struct ieee80211_chanctx_conf *conf;
511 
512 	rcu_read_lock();
513 	conf = rcu_dereference(vif->bss_conf.chanctx_conf);
514 	if (!conf) {
515 		rcu_read_unlock();
516 		return -ENOENT;
517 	}
518 
519 	*def = conf->def;
520 	rcu_read_unlock();
521 
522 	return 0;
523 }
524 
525 static bool ath11k_mac_bitrate_is_cck(int bitrate)
526 {
527 	switch (bitrate) {
528 	case 10:
529 	case 20:
530 	case 55:
531 	case 110:
532 		return true;
533 	}
534 
535 	return false;
536 }
537 
538 u8 ath11k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
539 			     u8 hw_rate, bool cck)
540 {
541 	const struct ieee80211_rate *rate;
542 	int i;
543 
544 	for (i = 0; i < sband->n_bitrates; i++) {
545 		rate = &sband->bitrates[i];
546 
547 		if (ath11k_mac_bitrate_is_cck(rate->bitrate) != cck)
548 			continue;
549 
550 		if (rate->hw_value == hw_rate)
551 			return i;
552 		else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
553 			 rate->hw_value_short == hw_rate)
554 			return i;
555 	}
556 
557 	return 0;
558 }
559 
560 static u8 ath11k_mac_bitrate_to_rate(int bitrate)
561 {
562 	return DIV_ROUND_UP(bitrate, 5) |
563 	       (ath11k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
564 }
565 
566 static void ath11k_get_arvif_iter(void *data, u8 *mac,
567 				  struct ieee80211_vif *vif)
568 {
569 	struct ath11k_vif_iter *arvif_iter = data;
570 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
571 
572 	if (arvif->vdev_id == arvif_iter->vdev_id)
573 		arvif_iter->arvif = arvif;
574 }
575 
576 struct ath11k_vif *ath11k_mac_get_arvif(struct ath11k *ar, u32 vdev_id)
577 {
578 	struct ath11k_vif_iter arvif_iter;
579 	u32 flags;
580 
581 	memset(&arvif_iter, 0, sizeof(struct ath11k_vif_iter));
582 	arvif_iter.vdev_id = vdev_id;
583 
584 	flags = IEEE80211_IFACE_ITER_RESUME_ALL;
585 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
586 						   flags,
587 						   ath11k_get_arvif_iter,
588 						   &arvif_iter);
589 	if (!arvif_iter.arvif) {
590 		ath11k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
591 		return NULL;
592 	}
593 
594 	return arvif_iter.arvif;
595 }
596 
597 struct ath11k_vif *ath11k_mac_get_arvif_by_vdev_id(struct ath11k_base *ab,
598 						   u32 vdev_id)
599 {
600 	int i;
601 	struct ath11k_pdev *pdev;
602 	struct ath11k_vif *arvif;
603 
604 	for (i = 0; i < ab->num_radios; i++) {
605 		pdev = rcu_dereference(ab->pdevs_active[i]);
606 		if (pdev && pdev->ar &&
607 		    (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
608 			arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id);
609 			if (arvif)
610 				return arvif;
611 		}
612 	}
613 
614 	return NULL;
615 }
616 
617 struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id)
618 {
619 	int i;
620 	struct ath11k_pdev *pdev;
621 
622 	for (i = 0; i < ab->num_radios; i++) {
623 		pdev = rcu_dereference(ab->pdevs_active[i]);
624 		if (pdev && pdev->ar) {
625 			if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
626 				return pdev->ar;
627 		}
628 	}
629 
630 	return NULL;
631 }
632 
633 struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id)
634 {
635 	int i;
636 	struct ath11k_pdev *pdev;
637 
638 	if (ab->hw_params.single_pdev_only) {
639 		pdev = rcu_dereference(ab->pdevs_active[0]);
640 		return pdev ? pdev->ar : NULL;
641 	}
642 
643 	if (WARN_ON(pdev_id > ab->num_radios))
644 		return NULL;
645 
646 	for (i = 0; i < ab->num_radios; i++) {
647 		if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM)
648 			pdev = &ab->pdevs[i];
649 		else
650 			pdev = rcu_dereference(ab->pdevs_active[i]);
651 
652 		if (pdev && pdev->pdev_id == pdev_id)
653 			return (pdev->ar ? pdev->ar : NULL);
654 	}
655 
656 	return NULL;
657 }
658 
659 struct ath11k_vif *ath11k_mac_get_vif_up(struct ath11k_base *ab)
660 {
661 	struct ath11k *ar;
662 	struct ath11k_pdev *pdev;
663 	struct ath11k_vif *arvif;
664 	int i;
665 
666 	for (i = 0; i < ab->num_radios; i++) {
667 		pdev = &ab->pdevs[i];
668 		ar = pdev->ar;
669 		list_for_each_entry(arvif, &ar->arvifs, list) {
670 			if (arvif->is_up)
671 				return arvif;
672 		}
673 	}
674 
675 	return NULL;
676 }
677 
678 static bool ath11k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
679 {
680 	return (((band1 == NL80211_BAND_2GHZ) && (band2 & WMI_HOST_WLAN_2G_CAP)) ||
681 		(((band1 == NL80211_BAND_5GHZ) || (band1 == NL80211_BAND_6GHZ)) &&
682 		   (band2 & WMI_HOST_WLAN_5G_CAP)));
683 }
684 
685 u8 ath11k_mac_get_target_pdev_id_from_vif(struct ath11k_vif *arvif)
686 {
687 	struct ath11k *ar = arvif->ar;
688 	struct ath11k_base *ab = ar->ab;
689 	struct ieee80211_vif *vif = arvif->vif;
690 	struct cfg80211_chan_def def;
691 	enum nl80211_band band;
692 	u8 pdev_id = ab->target_pdev_ids[0].pdev_id;
693 	int i;
694 
695 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
696 		return pdev_id;
697 
698 	band = def.chan->band;
699 
700 	for (i = 0; i < ab->target_pdev_count; i++) {
701 		if (ath11k_mac_band_match(band, ab->target_pdev_ids[i].supported_bands))
702 			return ab->target_pdev_ids[i].pdev_id;
703 	}
704 
705 	return pdev_id;
706 }
707 
708 u8 ath11k_mac_get_target_pdev_id(struct ath11k *ar)
709 {
710 	struct ath11k_vif *arvif;
711 
712 	arvif = ath11k_mac_get_vif_up(ar->ab);
713 
714 	if (arvif)
715 		return ath11k_mac_get_target_pdev_id_from_vif(arvif);
716 	else
717 		return ar->ab->target_pdev_ids[0].pdev_id;
718 }
719 
720 static void ath11k_pdev_caps_update(struct ath11k *ar)
721 {
722 	struct ath11k_base *ab = ar->ab;
723 
724 	ar->max_tx_power = ab->target_caps.hw_max_tx_power;
725 
726 	/* FIXME Set min_tx_power to ab->target_caps.hw_min_tx_power.
727 	 * But since the received value in svcrdy is same as hw_max_tx_power,
728 	 * we can set ar->min_tx_power to 0 currently until
729 	 * this is fixed in firmware
730 	 */
731 	ar->min_tx_power = 0;
732 
733 	ar->txpower_limit_2g = ar->max_tx_power;
734 	ar->txpower_limit_5g = ar->max_tx_power;
735 	ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
736 }
737 
738 static int ath11k_mac_txpower_recalc(struct ath11k *ar)
739 {
740 	struct ath11k_pdev *pdev = ar->pdev;
741 	struct ath11k_vif *arvif;
742 	int ret, txpower = -1;
743 	u32 param;
744 
745 	lockdep_assert_held(&ar->conf_mutex);
746 
747 	list_for_each_entry(arvif, &ar->arvifs, list) {
748 		if (arvif->txpower <= 0)
749 			continue;
750 
751 		if (txpower == -1)
752 			txpower = arvif->txpower;
753 		else
754 			txpower = min(txpower, arvif->txpower);
755 	}
756 
757 	if (txpower == -1)
758 		return 0;
759 
760 	/* txpwr is set as 2 units per dBm in FW*/
761 	txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
762 			ar->max_tx_power) * 2;
763 
764 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower to set in hw %d\n",
765 		   txpower / 2);
766 
767 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
768 	    ar->txpower_limit_2g != txpower) {
769 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
770 		ret = ath11k_wmi_pdev_set_param(ar, param,
771 						txpower, ar->pdev->pdev_id);
772 		if (ret)
773 			goto fail;
774 		ar->txpower_limit_2g = txpower;
775 	}
776 
777 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
778 	    ar->txpower_limit_5g != txpower) {
779 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
780 		ret = ath11k_wmi_pdev_set_param(ar, param,
781 						txpower, ar->pdev->pdev_id);
782 		if (ret)
783 			goto fail;
784 		ar->txpower_limit_5g = txpower;
785 	}
786 
787 	return 0;
788 
789 fail:
790 	ath11k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
791 		    txpower / 2, param, ret);
792 	return ret;
793 }
794 
795 static int ath11k_recalc_rtscts_prot(struct ath11k_vif *arvif)
796 {
797 	struct ath11k *ar = arvif->ar;
798 	u32 vdev_param, rts_cts = 0;
799 	int ret;
800 
801 	lockdep_assert_held(&ar->conf_mutex);
802 
803 	vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
804 
805 	/* Enable RTS/CTS protection for sw retries (when legacy stations
806 	 * are in BSS) or by default only for second rate series.
807 	 * TODO: Check if we need to enable CTS 2 Self in any case
808 	 */
809 	rts_cts = WMI_USE_RTS_CTS;
810 
811 	if (arvif->num_legacy_stations > 0)
812 		rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
813 	else
814 		rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
815 
816 	/* Need not send duplicate param value to firmware */
817 	if (arvif->rtscts_prot_mode == rts_cts)
818 		return 0;
819 
820 	arvif->rtscts_prot_mode = rts_cts;
821 
822 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d recalc rts/cts prot %d\n",
823 		   arvif->vdev_id, rts_cts);
824 
825 	ret =  ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
826 					     vdev_param, rts_cts);
827 	if (ret)
828 		ath11k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
829 			    arvif->vdev_id, ret);
830 
831 	return ret;
832 }
833 
834 static int ath11k_mac_set_kickout(struct ath11k_vif *arvif)
835 {
836 	struct ath11k *ar = arvif->ar;
837 	u32 param;
838 	int ret;
839 
840 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
841 					ATH11K_KICKOUT_THRESHOLD,
842 					ar->pdev->pdev_id);
843 	if (ret) {
844 		ath11k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
845 			    arvif->vdev_id, ret);
846 		return ret;
847 	}
848 
849 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
850 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
851 					    ATH11K_KEEPALIVE_MIN_IDLE);
852 	if (ret) {
853 		ath11k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
854 			    arvif->vdev_id, ret);
855 		return ret;
856 	}
857 
858 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
859 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
860 					    ATH11K_KEEPALIVE_MAX_IDLE);
861 	if (ret) {
862 		ath11k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
863 			    arvif->vdev_id, ret);
864 		return ret;
865 	}
866 
867 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
868 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
869 					    ATH11K_KEEPALIVE_MAX_UNRESPONSIVE);
870 	if (ret) {
871 		ath11k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
872 			    arvif->vdev_id, ret);
873 		return ret;
874 	}
875 
876 	return 0;
877 }
878 
879 void ath11k_mac_peer_cleanup_all(struct ath11k *ar)
880 {
881 	struct ath11k_peer *peer, *tmp;
882 	struct ath11k_base *ab = ar->ab;
883 
884 	lockdep_assert_held(&ar->conf_mutex);
885 
886 	mutex_lock(&ab->tbl_mtx_lock);
887 	spin_lock_bh(&ab->base_lock);
888 	list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
889 		ath11k_peer_rx_tid_cleanup(ar, peer);
890 		ath11k_peer_rhash_delete(ab, peer);
891 		list_del(&peer->list);
892 		kfree(peer);
893 	}
894 	spin_unlock_bh(&ab->base_lock);
895 	mutex_unlock(&ab->tbl_mtx_lock);
896 
897 	ar->num_peers = 0;
898 	ar->num_stations = 0;
899 }
900 
901 static inline int ath11k_mac_vdev_setup_sync(struct ath11k *ar)
902 {
903 	lockdep_assert_held(&ar->conf_mutex);
904 
905 	if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
906 		return -ESHUTDOWN;
907 
908 	if (!wait_for_completion_timeout(&ar->vdev_setup_done,
909 					 ATH11K_VDEV_SETUP_TIMEOUT_HZ))
910 		return -ETIMEDOUT;
911 
912 	return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
913 }
914 
915 static void
916 ath11k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
917 				struct ieee80211_chanctx_conf *conf,
918 				void *data)
919 {
920 	struct cfg80211_chan_def **def = data;
921 
922 	*def = &conf->def;
923 }
924 
925 static int ath11k_mac_monitor_vdev_start(struct ath11k *ar, int vdev_id,
926 					 struct cfg80211_chan_def *chandef)
927 {
928 	struct ieee80211_channel *channel;
929 	struct wmi_vdev_start_req_arg arg = {};
930 	int ret;
931 
932 	lockdep_assert_held(&ar->conf_mutex);
933 
934 	channel = chandef->chan;
935 
936 	arg.vdev_id = vdev_id;
937 	arg.channel.freq = channel->center_freq;
938 	arg.channel.band_center_freq1 = chandef->center_freq1;
939 	arg.channel.band_center_freq2 = chandef->center_freq2;
940 
941 	arg.channel.mode = ath11k_phymodes[chandef->chan->band][chandef->width];
942 	arg.channel.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
943 
944 	arg.channel.min_power = 0;
945 	arg.channel.max_power = channel->max_power;
946 	arg.channel.max_reg_power = channel->max_reg_power;
947 	arg.channel.max_antenna_gain = channel->max_antenna_gain;
948 
949 	arg.pref_tx_streams = ar->num_tx_chains;
950 	arg.pref_rx_streams = ar->num_rx_chains;
951 
952 	arg.channel.passive = !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
953 
954 	reinit_completion(&ar->vdev_setup_done);
955 	reinit_completion(&ar->vdev_delete_done);
956 
957 	ret = ath11k_wmi_vdev_start(ar, &arg, false);
958 	if (ret) {
959 		ath11k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
960 			    vdev_id, ret);
961 		return ret;
962 	}
963 
964 	ret = ath11k_mac_vdev_setup_sync(ar);
965 	if (ret) {
966 		ath11k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
967 			    vdev_id, ret);
968 		return ret;
969 	}
970 
971 	ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0);
972 	if (ret) {
973 		ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
974 			    vdev_id, ret);
975 		goto vdev_stop;
976 	}
977 
978 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i started\n",
979 		   vdev_id);
980 
981 	return 0;
982 
983 vdev_stop:
984 	reinit_completion(&ar->vdev_setup_done);
985 
986 	ret = ath11k_wmi_vdev_stop(ar, vdev_id);
987 	if (ret) {
988 		ath11k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
989 			    vdev_id, ret);
990 		return ret;
991 	}
992 
993 	ret = ath11k_mac_vdev_setup_sync(ar);
994 	if (ret) {
995 		ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i stop: %d\n",
996 			    vdev_id, ret);
997 		return ret;
998 	}
999 
1000 	return -EIO;
1001 }
1002 
1003 static int ath11k_mac_monitor_vdev_stop(struct ath11k *ar)
1004 {
1005 	int ret;
1006 
1007 	lockdep_assert_held(&ar->conf_mutex);
1008 
1009 	reinit_completion(&ar->vdev_setup_done);
1010 
1011 	ret = ath11k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1012 	if (ret) {
1013 		ath11k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1014 			    ar->monitor_vdev_id, ret);
1015 		return ret;
1016 	}
1017 
1018 	ret = ath11k_mac_vdev_setup_sync(ar);
1019 	if (ret) {
1020 		ath11k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1021 			    ar->monitor_vdev_id, ret);
1022 		return ret;
1023 	}
1024 
1025 	ret = ath11k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1026 	if (ret) {
1027 		ath11k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1028 			    ar->monitor_vdev_id, ret);
1029 		return ret;
1030 	}
1031 
1032 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %i stopped\n",
1033 		   ar->monitor_vdev_id);
1034 
1035 	return 0;
1036 }
1037 
1038 static int ath11k_mac_monitor_vdev_create(struct ath11k *ar)
1039 {
1040 	struct ath11k_pdev *pdev = ar->pdev;
1041 	struct vdev_create_params param = {};
1042 	int bit, ret;
1043 	u8 tmp_addr[6] = {0};
1044 	u16 nss;
1045 
1046 	lockdep_assert_held(&ar->conf_mutex);
1047 
1048 	if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1049 		return 0;
1050 
1051 	if (ar->ab->free_vdev_map == 0) {
1052 		ath11k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
1053 		return -ENOMEM;
1054 	}
1055 
1056 	bit = __ffs64(ar->ab->free_vdev_map);
1057 
1058 	ar->monitor_vdev_id = bit;
1059 
1060 	param.if_id = ar->monitor_vdev_id;
1061 	param.type = WMI_VDEV_TYPE_MONITOR;
1062 	param.subtype = WMI_VDEV_SUBTYPE_NONE;
1063 	param.pdev_id = pdev->pdev_id;
1064 
1065 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
1066 		param.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
1067 		param.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
1068 	}
1069 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
1070 		param.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
1071 		param.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
1072 	}
1073 
1074 	ret = ath11k_wmi_vdev_create(ar, tmp_addr, &param);
1075 	if (ret) {
1076 		ath11k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
1077 			    ar->monitor_vdev_id, ret);
1078 		ar->monitor_vdev_id = -1;
1079 		return ret;
1080 	}
1081 
1082 	nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
1083 	ret = ath11k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
1084 					    WMI_VDEV_PARAM_NSS, nss);
1085 	if (ret) {
1086 		ath11k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
1087 			    ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
1088 		goto err_vdev_del;
1089 	}
1090 
1091 	ret = ath11k_mac_txpower_recalc(ar);
1092 	if (ret) {
1093 		ath11k_warn(ar->ab, "failed to recalc txpower for monitor vdev %d: %d\n",
1094 			    ar->monitor_vdev_id, ret);
1095 		goto err_vdev_del;
1096 	}
1097 
1098 	ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
1099 	ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1100 	ar->num_created_vdevs++;
1101 	set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1102 
1103 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d created\n",
1104 		   ar->monitor_vdev_id);
1105 
1106 	return 0;
1107 
1108 err_vdev_del:
1109 	ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1110 	ar->monitor_vdev_id = -1;
1111 	return ret;
1112 }
1113 
1114 static int ath11k_mac_monitor_vdev_delete(struct ath11k *ar)
1115 {
1116 	int ret;
1117 	unsigned long time_left;
1118 
1119 	lockdep_assert_held(&ar->conf_mutex);
1120 
1121 	if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags))
1122 		return 0;
1123 
1124 	reinit_completion(&ar->vdev_delete_done);
1125 
1126 	ret = ath11k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1127 	if (ret) {
1128 		ath11k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1129 			    ar->monitor_vdev_id, ret);
1130 		return ret;
1131 	}
1132 
1133 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1134 						ATH11K_VDEV_DELETE_TIMEOUT_HZ);
1135 	if (time_left == 0) {
1136 		ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1137 	} else {
1138 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor vdev %d deleted\n",
1139 			   ar->monitor_vdev_id);
1140 
1141 		ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1142 		ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1143 		ar->num_created_vdevs--;
1144 		ar->monitor_vdev_id = -1;
1145 		clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
1146 	}
1147 
1148 	return ret;
1149 }
1150 
1151 static int ath11k_mac_monitor_start(struct ath11k *ar)
1152 {
1153 	struct cfg80211_chan_def *chandef = NULL;
1154 	int ret;
1155 
1156 	lockdep_assert_held(&ar->conf_mutex);
1157 
1158 	if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1159 		return 0;
1160 
1161 	ieee80211_iter_chan_contexts_atomic(ar->hw,
1162 					    ath11k_mac_get_any_chandef_iter,
1163 					    &chandef);
1164 	if (!chandef)
1165 		return 0;
1166 
1167 	ret = ath11k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1168 	if (ret) {
1169 		ath11k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1170 		ath11k_mac_monitor_vdev_delete(ar);
1171 		return ret;
1172 	}
1173 
1174 	set_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1175 
1176 	ar->num_started_vdevs++;
1177 	ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1178 	if (ret) {
1179 		ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during start: %d",
1180 			    ret);
1181 		return ret;
1182 	}
1183 
1184 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor started\n");
1185 
1186 	return 0;
1187 }
1188 
1189 static int ath11k_mac_monitor_stop(struct ath11k *ar)
1190 {
1191 	int ret;
1192 
1193 	lockdep_assert_held(&ar->conf_mutex);
1194 
1195 	if (!test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags))
1196 		return 0;
1197 
1198 	ret = ath11k_mac_monitor_vdev_stop(ar);
1199 	if (ret) {
1200 		ath11k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1201 		return ret;
1202 	}
1203 
1204 	clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
1205 	ar->num_started_vdevs--;
1206 
1207 	ret = ath11k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1208 	if (ret) {
1209 		ath11k_warn(ar->ab, "failed to configure htt monitor mode ring during stop: %d",
1210 			    ret);
1211 		return ret;
1212 	}
1213 
1214 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "monitor stopped ret %d\n", ret);
1215 
1216 	return 0;
1217 }
1218 
1219 static int ath11k_mac_vif_setup_ps(struct ath11k_vif *arvif)
1220 {
1221 	struct ath11k *ar = arvif->ar;
1222 	struct ieee80211_vif *vif = arvif->vif;
1223 	struct ieee80211_conf *conf = &ar->hw->conf;
1224 	enum wmi_sta_powersave_param param;
1225 	enum wmi_sta_ps_mode psmode;
1226 	int ret;
1227 	int timeout;
1228 	bool enable_ps;
1229 
1230 	lockdep_assert_held(&arvif->ar->conf_mutex);
1231 
1232 	if (arvif->vif->type != NL80211_IFTYPE_STATION)
1233 		return 0;
1234 
1235 	enable_ps = arvif->ps;
1236 
1237 	if (!arvif->is_started) {
1238 		/* mac80211 can update vif powersave state while disconnected.
1239 		 * Firmware doesn't behave nicely and consumes more power than
1240 		 * necessary if PS is disabled on a non-started vdev. Hence
1241 		 * force-enable PS for non-running vdevs.
1242 		 */
1243 		psmode = WMI_STA_PS_MODE_ENABLED;
1244 	} else if (enable_ps) {
1245 		psmode = WMI_STA_PS_MODE_ENABLED;
1246 		param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1247 
1248 		timeout = conf->dynamic_ps_timeout;
1249 		if (timeout == 0) {
1250 			/* firmware doesn't like 0 */
1251 			timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
1252 		}
1253 
1254 		ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
1255 						  timeout);
1256 		if (ret) {
1257 			ath11k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
1258 				    arvif->vdev_id, ret);
1259 			return ret;
1260 		}
1261 	} else {
1262 		psmode = WMI_STA_PS_MODE_DISABLED;
1263 	}
1264 
1265 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d psmode %s\n",
1266 		   arvif->vdev_id, psmode ? "enable" : "disable");
1267 
1268 	ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
1269 	if (ret) {
1270 		ath11k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
1271 			    psmode, arvif->vdev_id, ret);
1272 		return ret;
1273 	}
1274 
1275 	return 0;
1276 }
1277 
1278 static int ath11k_mac_config_ps(struct ath11k *ar)
1279 {
1280 	struct ath11k_vif *arvif;
1281 	int ret = 0;
1282 
1283 	lockdep_assert_held(&ar->conf_mutex);
1284 
1285 	list_for_each_entry(arvif, &ar->arvifs, list) {
1286 		ret = ath11k_mac_vif_setup_ps(arvif);
1287 		if (ret) {
1288 			ath11k_warn(ar->ab, "failed to setup powersave: %d\n", ret);
1289 			break;
1290 		}
1291 	}
1292 
1293 	return ret;
1294 }
1295 
1296 static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1297 {
1298 	struct ath11k *ar = hw->priv;
1299 	struct ieee80211_conf *conf = &hw->conf;
1300 	int ret = 0;
1301 
1302 	mutex_lock(&ar->conf_mutex);
1303 
1304 	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1305 		if (conf->flags & IEEE80211_CONF_MONITOR) {
1306 			set_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1307 
1308 			if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1309 				     &ar->monitor_flags))
1310 				goto out;
1311 
1312 			ret = ath11k_mac_monitor_vdev_create(ar);
1313 			if (ret) {
1314 				ath11k_warn(ar->ab, "failed to create monitor vdev: %d",
1315 					    ret);
1316 				goto out;
1317 			}
1318 
1319 			ret = ath11k_mac_monitor_start(ar);
1320 			if (ret) {
1321 				ath11k_warn(ar->ab, "failed to start monitor: %d",
1322 					    ret);
1323 				goto err_mon_del;
1324 			}
1325 		} else {
1326 			clear_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags);
1327 
1328 			if (!test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED,
1329 				      &ar->monitor_flags))
1330 				goto out;
1331 
1332 			ret = ath11k_mac_monitor_stop(ar);
1333 			if (ret) {
1334 				ath11k_warn(ar->ab, "failed to stop monitor: %d",
1335 					    ret);
1336 				goto out;
1337 			}
1338 
1339 			ret = ath11k_mac_monitor_vdev_delete(ar);
1340 			if (ret) {
1341 				ath11k_warn(ar->ab, "failed to delete monitor vdev: %d",
1342 					    ret);
1343 				goto out;
1344 			}
1345 		}
1346 	}
1347 
1348 out:
1349 	mutex_unlock(&ar->conf_mutex);
1350 	return ret;
1351 
1352 err_mon_del:
1353 	ath11k_mac_monitor_vdev_delete(ar);
1354 	mutex_unlock(&ar->conf_mutex);
1355 	return ret;
1356 }
1357 
1358 static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif,
1359 					     bool tx_arvif_rsnie_present,
1360 					     const u8 *profile, u8 profile_len)
1361 {
1362 	if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) {
1363 		arvif->rsnie_present = true;
1364 	} else if (tx_arvif_rsnie_present) {
1365 		int i;
1366 		u8 nie_len;
1367 		const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE,
1368 						     profile, profile_len);
1369 		if (!nie)
1370 			return;
1371 
1372 		nie_len = nie[1];
1373 		nie += 2;
1374 		for (i = 0; i < nie_len; i++) {
1375 			if (nie[i] == WLAN_EID_RSN) {
1376 				arvif->rsnie_present = false;
1377 				break;
1378 			}
1379 		}
1380 	}
1381 }
1382 
1383 static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif,
1384 					    struct ath11k_vif *arvif,
1385 					    struct sk_buff *bcn)
1386 {
1387 	struct ieee80211_mgmt *mgmt;
1388 	const u8 *ies, *profile, *next_profile;
1389 	int ies_len;
1390 
1391 	ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1392 	mgmt = (struct ieee80211_mgmt *)bcn->data;
1393 	ies += sizeof(mgmt->u.beacon);
1394 	ies_len = skb_tail_pointer(bcn) - ies;
1395 
1396 	ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len);
1397 	arvif->rsnie_present = tx_arvif->rsnie_present;
1398 
1399 	while (ies) {
1400 		u8 mbssid_len;
1401 
1402 		ies_len -= (2 + ies[1]);
1403 		mbssid_len = ies[1] - 1;
1404 		profile = &ies[3];
1405 
1406 		while (mbssid_len) {
1407 			u8 profile_len;
1408 
1409 			profile_len = profile[1];
1410 			next_profile = profile + (2 + profile_len);
1411 			mbssid_len -= (2 + profile_len);
1412 
1413 			profile += 2;
1414 			profile_len -= (2 + profile[1]);
1415 			profile += (2 + profile[1]); /* nontx capabilities */
1416 			profile_len -= (2 + profile[1]);
1417 			profile += (2 + profile[1]); /* SSID */
1418 			if (profile[2] == arvif->vif->bss_conf.bssid_index) {
1419 				profile_len -= 5;
1420 				profile = profile + 5;
1421 				ath11k_mac_setup_nontx_vif_rsnie(arvif,
1422 								 tx_arvif->rsnie_present,
1423 								 profile,
1424 								 profile_len);
1425 				return true;
1426 			}
1427 			profile = next_profile;
1428 		}
1429 		ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile,
1430 				       ies_len);
1431 	}
1432 
1433 	return false;
1434 }
1435 
1436 static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
1437 				      struct sk_buff *bcn)
1438 {
1439 	struct ieee80211_mgmt *mgmt;
1440 	u8 *ies;
1441 
1442 	ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1443 	mgmt = (struct ieee80211_mgmt *)bcn->data;
1444 	ies += sizeof(mgmt->u.beacon);
1445 
1446 	if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1447 		arvif->rsnie_present = true;
1448 	else
1449 		arvif->rsnie_present = false;
1450 
1451 	if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1452 				    WLAN_OUI_TYPE_MICROSOFT_WPA,
1453 				    ies, (skb_tail_pointer(bcn) - ies)))
1454 		arvif->wpaie_present = true;
1455 	else
1456 		arvif->wpaie_present = false;
1457 }
1458 
1459 static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif)
1460 {
1461 	struct ath11k_vif *tx_arvif;
1462 	struct ieee80211_ema_beacons *beacons;
1463 	int ret = 0;
1464 	bool nontx_vif_params_set = false;
1465 	u32 params = 0;
1466 	u8 i = 0;
1467 
1468 	tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1469 
1470 	beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw,
1471 							 tx_arvif->vif, 0);
1472 	if (!beacons || !beacons->cnt) {
1473 		ath11k_warn(arvif->ar->ab,
1474 			    "failed to get ema beacon templates from mac80211\n");
1475 		return -EPERM;
1476 	}
1477 
1478 	if (tx_arvif == arvif)
1479 		ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb);
1480 	else
1481 		arvif->wpaie_present = tx_arvif->wpaie_present;
1482 
1483 	for (i = 0; i < beacons->cnt; i++) {
1484 		if (tx_arvif != arvif && !nontx_vif_params_set)
1485 			nontx_vif_params_set =
1486 				ath11k_mac_set_nontx_vif_params(tx_arvif, arvif,
1487 								beacons->bcn[i].skb);
1488 
1489 		params = beacons->cnt;
1490 		params |= (i << WMI_EMA_TMPL_IDX_SHIFT);
1491 		params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT);
1492 		params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT);
1493 
1494 		ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id,
1495 					  &beacons->bcn[i].offs,
1496 					  beacons->bcn[i].skb, params);
1497 		if (ret) {
1498 			ath11k_warn(tx_arvif->ar->ab,
1499 				    "failed to set ema beacon template id %i error %d\n",
1500 				    i, ret);
1501 			break;
1502 		}
1503 	}
1504 
1505 	ieee80211_beacon_free_ema_list(beacons);
1506 
1507 	if (tx_arvif != arvif && !nontx_vif_params_set)
1508 		return -EINVAL; /* Profile not found in the beacons */
1509 
1510 	return ret;
1511 }
1512 
1513 static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
1514 {
1515 	struct ath11k *ar = arvif->ar;
1516 	struct ath11k_base *ab = ar->ab;
1517 	struct ath11k_vif *tx_arvif = arvif;
1518 	struct ieee80211_hw *hw = ar->hw;
1519 	struct ieee80211_vif *vif = arvif->vif;
1520 	struct ieee80211_mutable_offsets offs = {};
1521 	struct sk_buff *bcn;
1522 	int ret;
1523 
1524 	if (vif->mbssid_tx_vif) {
1525 		tx_arvif = ath11k_vif_to_arvif(vif->mbssid_tx_vif);
1526 		if (tx_arvif != arvif) {
1527 			ar = tx_arvif->ar;
1528 			ab = ar->ab;
1529 			hw = ar->hw;
1530 			vif = tx_arvif->vif;
1531 		}
1532 	}
1533 
1534 	bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1535 	if (!bcn) {
1536 		ath11k_warn(ab, "failed to get beacon template from mac80211\n");
1537 		return -EPERM;
1538 	}
1539 
1540 	if (tx_arvif == arvif)
1541 		ath11k_mac_set_vif_params(tx_arvif, bcn);
1542 	else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn))
1543 		return -EINVAL;
1544 
1545 	ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0);
1546 	kfree_skb(bcn);
1547 
1548 	if (ret)
1549 		ath11k_warn(ab, "failed to submit beacon template command: %d\n",
1550 			    ret);
1551 
1552 	return ret;
1553 }
1554 
1555 static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
1556 {
1557 	struct ieee80211_vif *vif = arvif->vif;
1558 
1559 	if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1560 		return 0;
1561 
1562 	/* Target does not expect beacon templates for the already up
1563 	 * non-transmitting interfaces, and results in a crash if sent.
1564 	 */
1565 	if (vif->mbssid_tx_vif &&
1566 	    arvif != ath11k_vif_to_arvif(vif->mbssid_tx_vif) && arvif->is_up)
1567 		return 0;
1568 
1569 	if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif)
1570 		return ath11k_mac_setup_bcn_tmpl_ema(arvif);
1571 
1572 	return ath11k_mac_setup_bcn_tmpl_mbssid(arvif);
1573 }
1574 
1575 void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif)
1576 {
1577 	struct ieee80211_vif *vif = arvif->vif;
1578 
1579 	if (!vif->bss_conf.color_change_active && !arvif->bcca_zero_sent)
1580 		return;
1581 
1582 	if (vif->bss_conf.color_change_active &&
1583 	    ieee80211_beacon_cntdwn_is_complete(vif)) {
1584 		arvif->bcca_zero_sent = true;
1585 		ieee80211_color_change_finish(vif);
1586 		return;
1587 	}
1588 
1589 	arvif->bcca_zero_sent = false;
1590 
1591 	if (vif->bss_conf.color_change_active)
1592 		ieee80211_beacon_update_cntdwn(vif);
1593 	ath11k_mac_setup_bcn_tmpl(arvif);
1594 }
1595 
1596 static void ath11k_control_beaconing(struct ath11k_vif *arvif,
1597 				     struct ieee80211_bss_conf *info)
1598 {
1599 	struct ath11k *ar = arvif->ar;
1600 	struct ath11k_vif *tx_arvif = NULL;
1601 	int ret = 0;
1602 
1603 	lockdep_assert_held(&arvif->ar->conf_mutex);
1604 
1605 	if (!info->enable_beacon) {
1606 		ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
1607 		if (ret)
1608 			ath11k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1609 				    arvif->vdev_id, ret);
1610 
1611 		arvif->is_up = false;
1612 		return;
1613 	}
1614 
1615 	/* Install the beacon template to the FW */
1616 	ret = ath11k_mac_setup_bcn_tmpl(arvif);
1617 	if (ret) {
1618 		ath11k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1619 			    ret);
1620 		return;
1621 	}
1622 
1623 	arvif->tx_seq_no = 0x1000;
1624 
1625 	arvif->aid = 0;
1626 
1627 	ether_addr_copy(arvif->bssid, info->bssid);
1628 
1629 	if (arvif->vif->mbssid_tx_vif)
1630 		tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
1631 
1632 	ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1633 				 arvif->bssid,
1634 				 tx_arvif ? tx_arvif->bssid : NULL,
1635 				 info->bssid_index,
1636 				 1 << info->bssid_indicator);
1637 	if (ret) {
1638 		ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1639 			    arvif->vdev_id, ret);
1640 		return;
1641 	}
1642 
1643 	arvif->is_up = true;
1644 
1645 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %d up\n", arvif->vdev_id);
1646 }
1647 
1648 static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
1649 					  struct ieee80211_vif *vif)
1650 {
1651 	struct sk_buff *skb = data;
1652 	struct ieee80211_mgmt *mgmt = (void *)skb->data;
1653 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1654 
1655 	if (vif->type != NL80211_IFTYPE_STATION)
1656 		return;
1657 
1658 	if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1659 		return;
1660 
1661 	cancel_delayed_work(&arvif->connection_loss_work);
1662 }
1663 
1664 void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb)
1665 {
1666 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
1667 						   IEEE80211_IFACE_ITER_NORMAL,
1668 						   ath11k_mac_handle_beacon_iter,
1669 						   skb);
1670 }
1671 
1672 static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
1673 					       struct ieee80211_vif *vif)
1674 {
1675 	u32 *vdev_id = data;
1676 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1677 	struct ath11k *ar = arvif->ar;
1678 	struct ieee80211_hw *hw = ar->hw;
1679 
1680 	if (arvif->vdev_id != *vdev_id)
1681 		return;
1682 
1683 	if (!arvif->is_up)
1684 		return;
1685 
1686 	ieee80211_beacon_loss(vif);
1687 
1688 	/* Firmware doesn't report beacon loss events repeatedly. If AP probe
1689 	 * (done by mac80211) succeeds but beacons do not resume then it
1690 	 * doesn't make sense to continue operation. Queue connection loss work
1691 	 * which can be cancelled when beacon is received.
1692 	 */
1693 	ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1694 				     ATH11K_CONNECTION_LOSS_HZ);
1695 }
1696 
1697 void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id)
1698 {
1699 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
1700 						   IEEE80211_IFACE_ITER_NORMAL,
1701 						   ath11k_mac_handle_beacon_miss_iter,
1702 						   &vdev_id);
1703 }
1704 
1705 static void ath11k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1706 {
1707 	struct ath11k_vif *arvif = container_of(work, struct ath11k_vif,
1708 						connection_loss_work.work);
1709 	struct ieee80211_vif *vif = arvif->vif;
1710 
1711 	if (!arvif->is_up)
1712 		return;
1713 
1714 	ieee80211_connection_loss(vif);
1715 }
1716 
1717 static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
1718 				      struct ieee80211_vif *vif,
1719 				      struct ieee80211_sta *sta,
1720 				      struct peer_assoc_params *arg)
1721 {
1722 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1723 	u32 aid;
1724 
1725 	lockdep_assert_held(&ar->conf_mutex);
1726 
1727 	if (vif->type == NL80211_IFTYPE_STATION)
1728 		aid = vif->cfg.aid;
1729 	else
1730 		aid = sta->aid;
1731 
1732 	ether_addr_copy(arg->peer_mac, sta->addr);
1733 	arg->vdev_id = arvif->vdev_id;
1734 	arg->peer_associd = aid;
1735 	arg->auth_flag = true;
1736 	/* TODO: STA WAR in ath10k for listen interval required? */
1737 	arg->peer_listen_intval = ar->hw->conf.listen_interval;
1738 	arg->peer_nss = 1;
1739 	arg->peer_caps = vif->bss_conf.assoc_capability;
1740 }
1741 
1742 static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
1743 				       struct ieee80211_vif *vif,
1744 				       struct ieee80211_sta *sta,
1745 				       struct peer_assoc_params *arg)
1746 {
1747 	struct ieee80211_bss_conf *info = &vif->bss_conf;
1748 	struct cfg80211_chan_def def;
1749 	struct cfg80211_bss *bss;
1750 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1751 	const u8 *rsnie = NULL;
1752 	const u8 *wpaie = NULL;
1753 
1754 	lockdep_assert_held(&ar->conf_mutex);
1755 
1756 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1757 		return;
1758 
1759 	bss = cfg80211_get_bss(ar->hw->wiphy, def.chan, info->bssid, NULL, 0,
1760 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1761 
1762 	if (arvif->rsnie_present || arvif->wpaie_present) {
1763 		arg->need_ptk_4_way = true;
1764 		if (arvif->wpaie_present)
1765 			arg->need_gtk_2_way = true;
1766 	} else if (bss) {
1767 		const struct cfg80211_bss_ies *ies;
1768 
1769 		rcu_read_lock();
1770 		rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1771 
1772 		ies = rcu_dereference(bss->ies);
1773 
1774 		wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1775 						WLAN_OUI_TYPE_MICROSOFT_WPA,
1776 						ies->data,
1777 						ies->len);
1778 		rcu_read_unlock();
1779 		cfg80211_put_bss(ar->hw->wiphy, bss);
1780 	}
1781 
1782 	/* FIXME: base on RSN IE/WPA IE is a correct idea? */
1783 	if (rsnie || wpaie) {
1784 		ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1785 			   "%s: rsn ie found\n", __func__);
1786 		arg->need_ptk_4_way = true;
1787 	}
1788 
1789 	if (wpaie) {
1790 		ath11k_dbg(ar->ab, ATH11K_DBG_WMI,
1791 			   "%s: wpa ie found\n", __func__);
1792 		arg->need_gtk_2_way = true;
1793 	}
1794 
1795 	if (sta->mfp) {
1796 		/* TODO: Need to check if FW supports PMF? */
1797 		arg->is_pmf_enabled = true;
1798 	}
1799 
1800 	/* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1801 }
1802 
1803 static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
1804 				      struct ieee80211_vif *vif,
1805 				      struct ieee80211_sta *sta,
1806 				      struct peer_assoc_params *arg)
1807 {
1808 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1809 	struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1810 	struct cfg80211_chan_def def;
1811 	const struct ieee80211_supported_band *sband;
1812 	const struct ieee80211_rate *rates;
1813 	enum nl80211_band band;
1814 	u32 ratemask;
1815 	u8 rate;
1816 	int i;
1817 
1818 	lockdep_assert_held(&ar->conf_mutex);
1819 
1820 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1821 		return;
1822 
1823 	band = def.chan->band;
1824 	sband = ar->hw->wiphy->bands[band];
1825 	ratemask = sta->deflink.supp_rates[band];
1826 	ratemask &= arvif->bitrate_mask.control[band].legacy;
1827 	rates = sband->bitrates;
1828 
1829 	rateset->num_rates = 0;
1830 
1831 	for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1832 		if (!(ratemask & 1))
1833 			continue;
1834 
1835 		rate = ath11k_mac_bitrate_to_rate(rates->bitrate);
1836 		rateset->rates[rateset->num_rates] = rate;
1837 		rateset->num_rates++;
1838 	}
1839 }
1840 
1841 static bool
1842 ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1843 {
1844 	int nss;
1845 
1846 	for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1847 		if (ht_mcs_mask[nss])
1848 			return false;
1849 
1850 	return true;
1851 }
1852 
1853 static bool
1854 ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1855 {
1856 	int nss;
1857 
1858 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1859 		if (vht_mcs_mask[nss])
1860 			return false;
1861 
1862 	return true;
1863 }
1864 
1865 static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
1866 				   struct ieee80211_vif *vif,
1867 				   struct ieee80211_sta *sta,
1868 				   struct peer_assoc_params *arg)
1869 {
1870 	const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1871 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
1872 	struct cfg80211_chan_def def;
1873 	enum nl80211_band band;
1874 	const u8 *ht_mcs_mask;
1875 	int i, n;
1876 	u8 max_nss;
1877 	u32 stbc;
1878 
1879 	lockdep_assert_held(&ar->conf_mutex);
1880 
1881 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
1882 		return;
1883 
1884 	if (!ht_cap->ht_supported)
1885 		return;
1886 
1887 	band = def.chan->band;
1888 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1889 
1890 	if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask))
1891 		return;
1892 
1893 	arg->ht_flag = true;
1894 
1895 	arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1896 				    ht_cap->ampdu_factor)) - 1;
1897 
1898 	arg->peer_mpdu_density =
1899 		ath11k_parse_mpdudensity(ht_cap->ampdu_density);
1900 
1901 	arg->peer_ht_caps = ht_cap->cap;
1902 	arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1903 
1904 	if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1905 		arg->ldpc_flag = true;
1906 
1907 	if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1908 		arg->bw_40 = true;
1909 		arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1910 	}
1911 
1912 	/* As firmware handles this two flags (IEEE80211_HT_CAP_SGI_20
1913 	 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, we reset
1914 	 * both flags if guard interval is Default GI
1915 	 */
1916 	if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
1917 		arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
1918 				IEEE80211_HT_CAP_SGI_40);
1919 
1920 	if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1921 		if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1922 		    IEEE80211_HT_CAP_SGI_40))
1923 			arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1924 	}
1925 
1926 	if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1927 		arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1928 		arg->stbc_flag = true;
1929 	}
1930 
1931 	if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1932 		stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1933 		stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1934 		stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1935 		arg->peer_rate_caps |= stbc;
1936 		arg->stbc_flag = true;
1937 	}
1938 
1939 	if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1940 		arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1941 	else if (ht_cap->mcs.rx_mask[1])
1942 		arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1943 
1944 	for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1945 		if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1946 		    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1947 			max_nss = (i / 8) + 1;
1948 			arg->peer_ht_rates.rates[n++] = i;
1949 		}
1950 
1951 	/* This is a workaround for HT-enabled STAs which break the spec
1952 	 * and have no HT capabilities RX mask (no HT RX MCS map).
1953 	 *
1954 	 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1955 	 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1956 	 *
1957 	 * Firmware asserts if such situation occurs.
1958 	 */
1959 	if (n == 0) {
1960 		arg->peer_ht_rates.num_rates = 8;
1961 		for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1962 			arg->peer_ht_rates.rates[i] = i;
1963 	} else {
1964 		arg->peer_ht_rates.num_rates = n;
1965 		arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1966 	}
1967 
1968 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "ht peer %pM mcs cnt %d nss %d\n",
1969 		   arg->peer_mac,
1970 		   arg->peer_ht_rates.num_rates,
1971 		   arg->peer_nss);
1972 }
1973 
1974 static int ath11k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1975 {
1976 	switch ((mcs_map >> (2 * nss)) & 0x3) {
1977 	case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1978 	case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1979 	case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1980 	}
1981 	return 0;
1982 }
1983 
1984 static u16
1985 ath11k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1986 			      const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1987 {
1988 	int idx_limit;
1989 	int nss;
1990 	u16 mcs_map;
1991 	u16 mcs;
1992 
1993 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1994 		mcs_map = ath11k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1995 			  vht_mcs_limit[nss];
1996 
1997 		if (mcs_map)
1998 			idx_limit = fls(mcs_map) - 1;
1999 		else
2000 			idx_limit = -1;
2001 
2002 		switch (idx_limit) {
2003 		case 0:
2004 		case 1:
2005 		case 2:
2006 		case 3:
2007 		case 4:
2008 		case 5:
2009 		case 6:
2010 		case 7:
2011 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2012 			break;
2013 		case 8:
2014 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2015 			break;
2016 		case 9:
2017 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2018 			break;
2019 		default:
2020 			WARN_ON(1);
2021 			fallthrough;
2022 		case -1:
2023 			mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2024 			break;
2025 		}
2026 
2027 		tx_mcs_set &= ~(0x3 << (nss * 2));
2028 		tx_mcs_set |= mcs << (nss * 2);
2029 	}
2030 
2031 	return tx_mcs_set;
2032 }
2033 
2034 static u8 ath11k_get_nss_160mhz(struct ath11k *ar,
2035 				u8 max_nss)
2036 {
2037 	u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2038 	u8 max_sup_nss = 0;
2039 
2040 	switch (nss_ratio_info) {
2041 	case WMI_NSS_RATIO_1BY2_NSS:
2042 		max_sup_nss = max_nss >> 1;
2043 		break;
2044 	case WMI_NSS_RATIO_3BY4_NSS:
2045 		ath11k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2046 		break;
2047 	case WMI_NSS_RATIO_1_NSS:
2048 		max_sup_nss = max_nss;
2049 		break;
2050 	case WMI_NSS_RATIO_2_NSS:
2051 		ath11k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2052 		break;
2053 	default:
2054 		ath11k_warn(ar->ab, "invalid nss ratio received from firmware: %d\n",
2055 			    nss_ratio_info);
2056 		break;
2057 	}
2058 
2059 	return max_sup_nss;
2060 }
2061 
2062 static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
2063 				    struct ieee80211_vif *vif,
2064 				    struct ieee80211_sta *sta,
2065 				    struct peer_assoc_params *arg)
2066 {
2067 	const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
2068 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2069 	struct cfg80211_chan_def def;
2070 	enum nl80211_band band;
2071 	u16 *vht_mcs_mask;
2072 	u8 ampdu_factor;
2073 	u8 max_nss, vht_mcs;
2074 	int i, vht_nss, nss_idx;
2075 	bool user_rate_valid = true;
2076 	u32 rx_nss, tx_nss, nss_160;
2077 
2078 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2079 		return;
2080 
2081 	if (!vht_cap->vht_supported)
2082 		return;
2083 
2084 	band = def.chan->band;
2085 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2086 
2087 	if (ath11k_peer_assoc_h_vht_masked(vht_mcs_mask))
2088 		return;
2089 
2090 	arg->vht_flag = true;
2091 
2092 	/* TODO: similar flags required? */
2093 	arg->vht_capable = true;
2094 
2095 	if (def.chan->band == NL80211_BAND_2GHZ)
2096 		arg->vht_ng_flag = true;
2097 
2098 	arg->peer_vht_caps = vht_cap->cap;
2099 
2100 	ampdu_factor = (vht_cap->cap &
2101 			IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2102 		       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2103 
2104 	/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2105 	 * zero in VHT IE. Using it would result in degraded throughput.
2106 	 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2107 	 * it if VHT max_mpdu is smaller.
2108 	 */
2109 	arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2110 				 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2111 					ampdu_factor)) - 1);
2112 
2113 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2114 		arg->bw_80 = true;
2115 
2116 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2117 		arg->bw_160 = true;
2118 
2119 	vht_nss =  ath11k_mac_max_vht_nss(vht_mcs_mask);
2120 
2121 	if (vht_nss > sta->deflink.rx_nss) {
2122 		user_rate_valid = false;
2123 		for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2124 			if (vht_mcs_mask[nss_idx]) {
2125 				user_rate_valid = true;
2126 				break;
2127 			}
2128 		}
2129 	}
2130 
2131 	if (!user_rate_valid) {
2132 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting vht range mcs value to peer supported nss %d for peer %pM\n",
2133 			   sta->deflink.rx_nss, sta->addr);
2134 		vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2135 	}
2136 
2137 	/* Calculate peer NSS capability from VHT capabilities if STA
2138 	 * supports VHT.
2139 	 */
2140 	for (i = 0, max_nss = 0; i < NL80211_VHT_NSS_MAX; i++) {
2141 		vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2142 			  (2 * i) & 3;
2143 
2144 		if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2145 		    vht_mcs_mask[i])
2146 			max_nss = i + 1;
2147 	}
2148 	arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2149 	arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2150 	arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2151 	arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2152 	arg->tx_mcs_set = ath11k_peer_assoc_h_vht_limit(
2153 		__le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map), vht_mcs_mask);
2154 
2155 	/* In IPQ8074 platform, VHT mcs rate 10 and 11 is enabled by default.
2156 	 * VHT mcs rate 10 and 11 is not suppoerted in 11ac standard.
2157 	 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2158 	 */
2159 	arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2160 	arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2161 
2162 	if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2163 			IEEE80211_VHT_MCS_NOT_SUPPORTED)
2164 		arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2165 
2166 	/* TODO:  Check */
2167 	arg->tx_max_mcs_nss = 0xFF;
2168 
2169 	if (arg->peer_phymode == MODE_11AC_VHT160 ||
2170 	    arg->peer_phymode == MODE_11AC_VHT80_80) {
2171 		tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2172 		rx_nss = min(arg->peer_nss, tx_nss);
2173 		arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2174 
2175 		if (!rx_nss) {
2176 			ath11k_warn(ar->ab, "invalid max_nss\n");
2177 			return;
2178 		}
2179 
2180 		if (arg->peer_phymode == MODE_11AC_VHT160)
2181 			nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2182 		else
2183 			nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2184 
2185 		arg->peer_bw_rxnss_override |= nss_160;
2186 	}
2187 
2188 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2189 		   "vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2190 		   sta->addr, arg->peer_max_mpdu, arg->peer_flags,
2191 		   arg->peer_bw_rxnss_override);
2192 }
2193 
2194 static int ath11k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2195 {
2196 	switch ((mcs_map >> (2 * nss)) & 0x3) {
2197 	case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2198 	case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2199 	case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2200 	}
2201 	return 0;
2202 }
2203 
2204 static u16 ath11k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2205 					const u16 he_mcs_limit[NL80211_HE_NSS_MAX])
2206 {
2207 	int idx_limit;
2208 	int nss;
2209 	u16 mcs_map;
2210 	u16 mcs;
2211 
2212 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2213 		mcs_map = ath11k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2214 			he_mcs_limit[nss];
2215 
2216 		if (mcs_map)
2217 			idx_limit = fls(mcs_map) - 1;
2218 		else
2219 			idx_limit = -1;
2220 
2221 		switch (idx_limit) {
2222 		case 0 ... 7:
2223 			mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2224 			break;
2225 		case 8:
2226 		case 9:
2227 			mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2228 			break;
2229 		case 10:
2230 		case 11:
2231 			mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2232 			break;
2233 		default:
2234 			WARN_ON(1);
2235 			fallthrough;
2236 		case -1:
2237 			mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2238 			break;
2239 		}
2240 
2241 		tx_mcs_set &= ~(0x3 << (nss * 2));
2242 		tx_mcs_set |= mcs << (nss * 2);
2243 	}
2244 
2245 	return tx_mcs_set;
2246 }
2247 
2248 static bool
2249 ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask)
2250 {
2251 	int nss;
2252 
2253 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2254 		if (he_mcs_mask[nss])
2255 			return false;
2256 
2257 	return true;
2258 }
2259 
2260 static void ath11k_peer_assoc_h_he(struct ath11k *ar,
2261 				   struct ieee80211_vif *vif,
2262 				   struct ieee80211_sta *sta,
2263 				   struct peer_assoc_params *arg)
2264 {
2265 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2266 	struct cfg80211_chan_def def;
2267 	const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2268 	enum nl80211_band band;
2269 	u16 he_mcs_mask[NL80211_HE_NSS_MAX];
2270 	u8 max_nss, he_mcs;
2271 	u16 he_tx_mcs = 0, v = 0;
2272 	int i, he_nss, nss_idx;
2273 	bool user_rate_valid = true;
2274 	u32 rx_nss, tx_nss, nss_160;
2275 	u8 ampdu_factor, rx_mcs_80, rx_mcs_160;
2276 	u16 mcs_160_map, mcs_80_map;
2277 	bool support_160;
2278 
2279 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2280 		return;
2281 
2282 	if (!he_cap->has_he)
2283 		return;
2284 
2285 	band = def.chan->band;
2286 	memcpy(he_mcs_mask, arvif->bitrate_mask.control[band].he_mcs,
2287 	       sizeof(he_mcs_mask));
2288 
2289 	if (ath11k_peer_assoc_h_he_masked(he_mcs_mask))
2290 		return;
2291 
2292 	arg->he_flag = true;
2293 	support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2294 		  IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2295 
2296 	/* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2297 	mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2298 	mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2299 
2300 	if (support_160) {
2301 		for (i = 7; i >= 0; i--) {
2302 			u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2303 
2304 			if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2305 				rx_mcs_160 = i + 1;
2306 				break;
2307 			}
2308 		}
2309 	}
2310 
2311 	for (i = 7; i >= 0; i--) {
2312 		u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2313 
2314 		if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) {
2315 			rx_mcs_80 = i + 1;
2316 			break;
2317 		}
2318 	}
2319 
2320 	if (support_160)
2321 		max_nss = min(rx_mcs_80, rx_mcs_160);
2322 	else
2323 		max_nss = rx_mcs_80;
2324 
2325 	arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2326 
2327 	memcpy_and_pad(&arg->peer_he_cap_macinfo,
2328 		       sizeof(arg->peer_he_cap_macinfo),
2329 		       he_cap->he_cap_elem.mac_cap_info,
2330 		       sizeof(he_cap->he_cap_elem.mac_cap_info),
2331 		       0);
2332 	memcpy_and_pad(&arg->peer_he_cap_phyinfo,
2333 		       sizeof(arg->peer_he_cap_phyinfo),
2334 		       he_cap->he_cap_elem.phy_cap_info,
2335 		       sizeof(he_cap->he_cap_elem.phy_cap_info),
2336 		       0);
2337 	arg->peer_he_ops = vif->bss_conf.he_oper.params;
2338 
2339 	/* the top most byte is used to indicate BSS color info */
2340 	arg->peer_he_ops &= 0xffffff;
2341 
2342 	/* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension
2343 	 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing
2344 	 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present).
2345 	 *
2346 	 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps,
2347 	 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2348 	 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2349 	 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2350 	 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2351 	 * length.
2352 	 */
2353 	ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2354 				   IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2355 
2356 	if (ampdu_factor) {
2357 		if (sta->deflink.vht_cap.vht_supported)
2358 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2359 						    ampdu_factor)) - 1;
2360 		else if (sta->deflink.ht_cap.ht_supported)
2361 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2362 						    ampdu_factor)) - 1;
2363 	}
2364 
2365 	if (he_cap->he_cap_elem.phy_cap_info[6] &
2366 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2367 		int bit = 7;
2368 		int nss, ru;
2369 
2370 		arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2371 					  IEEE80211_PPE_THRES_NSS_MASK;
2372 		arg->peer_ppet.ru_bit_mask =
2373 			(he_cap->ppe_thres[0] &
2374 			 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2375 			IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2376 
2377 		for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2378 			for (ru = 0; ru < 4; ru++) {
2379 				u32 val = 0;
2380 				int i;
2381 
2382 				if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2383 					continue;
2384 				for (i = 0; i < 6; i++) {
2385 					val >>= 1;
2386 					val |= ((he_cap->ppe_thres[bit / 8] >>
2387 						 (bit % 8)) & 0x1) << 5;
2388 					bit++;
2389 				}
2390 				arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2391 								val << (ru * 6);
2392 			}
2393 		}
2394 	}
2395 
2396 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2397 		arg->twt_responder = true;
2398 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2399 		arg->twt_requester = true;
2400 
2401 	he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
2402 
2403 	if (he_nss > sta->deflink.rx_nss) {
2404 		user_rate_valid = false;
2405 		for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
2406 			if (he_mcs_mask[nss_idx]) {
2407 				user_rate_valid = true;
2408 				break;
2409 			}
2410 		}
2411 	}
2412 
2413 	if (!user_rate_valid) {
2414 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting he range mcs value to peer supported nss %d for peer %pM\n",
2415 			   sta->deflink.rx_nss, sta->addr);
2416 		he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
2417 	}
2418 
2419 	switch (sta->deflink.bandwidth) {
2420 	case IEEE80211_STA_RX_BW_160:
2421 		if (he_cap->he_cap_elem.phy_cap_info[0] &
2422 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2423 			v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
2424 			v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2425 			arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2426 
2427 			v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
2428 			arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
2429 
2430 			arg->peer_he_mcs_count++;
2431 			he_tx_mcs = v;
2432 		}
2433 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2434 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2435 
2436 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
2437 		v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2438 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2439 
2440 		arg->peer_he_mcs_count++;
2441 		if (!he_tx_mcs)
2442 			he_tx_mcs = v;
2443 		fallthrough;
2444 
2445 	default:
2446 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2447 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2448 
2449 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2450 		v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask);
2451 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2452 
2453 		arg->peer_he_mcs_count++;
2454 		if (!he_tx_mcs)
2455 			he_tx_mcs = v;
2456 		break;
2457 	}
2458 
2459 	/* Calculate peer NSS capability from HE capabilities if STA
2460 	 * supports HE.
2461 	 */
2462 	for (i = 0, max_nss = 0; i < NL80211_HE_NSS_MAX; i++) {
2463 		he_mcs = he_tx_mcs >> (2 * i) & 3;
2464 
2465 		/* In case of fixed rates, MCS Range in he_tx_mcs might have
2466 		 * unsupported range, with he_mcs_mask set, so check either of them
2467 		 * to find nss.
2468 		 */
2469 		if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2470 		    he_mcs_mask[i])
2471 			max_nss = i + 1;
2472 	}
2473 	arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
2474 
2475 	if (arg->peer_phymode == MODE_11AX_HE160 ||
2476 	    arg->peer_phymode == MODE_11AX_HE80_80) {
2477 		tx_nss = ath11k_get_nss_160mhz(ar, max_nss);
2478 		rx_nss = min(arg->peer_nss, tx_nss);
2479 		arg->peer_bw_rxnss_override = ATH11K_BW_NSS_MAP_ENABLE;
2480 
2481 		if (!rx_nss) {
2482 			ath11k_warn(ar->ab, "invalid max_nss\n");
2483 			return;
2484 		}
2485 
2486 		if (arg->peer_phymode == MODE_11AX_HE160)
2487 			nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_160MHZ, rx_nss - 1);
2488 		else
2489 			nss_160 = FIELD_PREP(ATH11K_PEER_RX_NSS_80_80MHZ, rx_nss - 1);
2490 
2491 		arg->peer_bw_rxnss_override |= nss_160;
2492 	}
2493 
2494 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
2495 		   "he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2496 		   sta->addr, arg->peer_nss,
2497 		   arg->peer_he_mcs_count,
2498 		   arg->peer_bw_rxnss_override);
2499 }
2500 
2501 static void ath11k_peer_assoc_h_he_6ghz(struct ath11k *ar,
2502 					struct ieee80211_vif *vif,
2503 					struct ieee80211_sta *sta,
2504 					struct peer_assoc_params *arg)
2505 {
2506 	const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2507 	struct cfg80211_chan_def def;
2508 	enum nl80211_band band;
2509 	u8  ampdu_factor;
2510 
2511 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2512 		return;
2513 
2514 	band = def.chan->band;
2515 
2516 	if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
2517 		return;
2518 
2519 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2520 		arg->bw_40 = true;
2521 
2522 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2523 		arg->bw_80 = true;
2524 
2525 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
2526 		arg->bw_160 = true;
2527 
2528 	arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
2529 	arg->peer_mpdu_density =
2530 		ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
2531 						   arg->peer_he_caps_6ghz));
2532 
2533 	/* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2534 	 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2535 	 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2536 	 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2537 	 * Band Capabilities element in the 6 GHz band.
2538 	 *
2539 	 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2540 	 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2541 	 */
2542 	ampdu_factor = FIELD_GET(IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK,
2543 				 he_cap->he_cap_elem.mac_cap_info[3]) +
2544 			FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
2545 				  arg->peer_he_caps_6ghz);
2546 
2547 	arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2548 				     ampdu_factor)) - 1;
2549 }
2550 
2551 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
2552 				     struct peer_assoc_params *arg)
2553 {
2554 	const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
2555 	int smps;
2556 
2557 	if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
2558 		return;
2559 
2560 	if (ht_cap->ht_supported) {
2561 		smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2562 		smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2563 	} else {
2564 		smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
2565 				     IEEE80211_HE_6GHZ_CAP_SM_PS);
2566 	}
2567 
2568 	switch (smps) {
2569 	case WLAN_HT_CAP_SM_PS_STATIC:
2570 		arg->static_mimops_flag = true;
2571 		break;
2572 	case WLAN_HT_CAP_SM_PS_DYNAMIC:
2573 		arg->dynamic_mimops_flag = true;
2574 		break;
2575 	case WLAN_HT_CAP_SM_PS_DISABLED:
2576 		arg->spatial_mux_flag = true;
2577 		break;
2578 	default:
2579 		break;
2580 	}
2581 }
2582 
2583 static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
2584 				    struct ieee80211_vif *vif,
2585 				    struct ieee80211_sta *sta,
2586 				    struct peer_assoc_params *arg)
2587 {
2588 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2589 
2590 	switch (arvif->vdev_type) {
2591 	case WMI_VDEV_TYPE_AP:
2592 		if (sta->wme) {
2593 			/* TODO: Check WME vs QoS */
2594 			arg->is_wme_set = true;
2595 			arg->qos_flag = true;
2596 		}
2597 
2598 		if (sta->wme && sta->uapsd_queues) {
2599 			/* TODO: Check WME vs QoS */
2600 			arg->is_wme_set = true;
2601 			arg->apsd_flag = true;
2602 			arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2603 		}
2604 		break;
2605 	case WMI_VDEV_TYPE_STA:
2606 		if (sta->wme) {
2607 			arg->is_wme_set = true;
2608 			arg->qos_flag = true;
2609 		}
2610 		break;
2611 	default:
2612 		break;
2613 	}
2614 
2615 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM qos %d\n",
2616 		   sta->addr, arg->qos_flag);
2617 }
2618 
2619 static int ath11k_peer_assoc_qos_ap(struct ath11k *ar,
2620 				    struct ath11k_vif *arvif,
2621 				    struct ieee80211_sta *sta)
2622 {
2623 	struct ap_ps_params params;
2624 	u32 max_sp;
2625 	u32 uapsd;
2626 	int ret;
2627 
2628 	lockdep_assert_held(&ar->conf_mutex);
2629 
2630 	params.vdev_id = arvif->vdev_id;
2631 
2632 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "uapsd_queues 0x%x max_sp %d\n",
2633 		   sta->uapsd_queues, sta->max_sp);
2634 
2635 	uapsd = 0;
2636 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2637 		uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2638 			 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2639 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2640 		uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2641 			 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2642 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2643 		uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2644 			 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2645 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2646 		uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2647 			 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2648 
2649 	max_sp = 0;
2650 	if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2651 		max_sp = sta->max_sp;
2652 
2653 	params.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2654 	params.value = uapsd;
2655 	ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2656 	if (ret)
2657 		goto err;
2658 
2659 	params.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2660 	params.value = max_sp;
2661 	ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2662 	if (ret)
2663 		goto err;
2664 
2665 	/* TODO revisit during testing */
2666 	params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2667 	params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2668 	ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2669 	if (ret)
2670 		goto err;
2671 
2672 	params.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2673 	params.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2674 	ret = ath11k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &params);
2675 	if (ret)
2676 		goto err;
2677 
2678 	return 0;
2679 
2680 err:
2681 	ath11k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2682 		    params.param, arvif->vdev_id, ret);
2683 	return ret;
2684 }
2685 
2686 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2687 {
2688 	return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2689 	       ATH11K_MAC_FIRST_OFDM_RATE_IDX;
2690 }
2691 
2692 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
2693 						    struct ieee80211_sta *sta)
2694 {
2695 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2696 		switch (sta->deflink.vht_cap.cap &
2697 			IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2698 		case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2699 			return MODE_11AC_VHT160;
2700 		case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2701 			return MODE_11AC_VHT80_80;
2702 		default:
2703 			/* not sure if this is a valid case? */
2704 			return MODE_11AC_VHT160;
2705 		}
2706 	}
2707 
2708 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2709 		return MODE_11AC_VHT80;
2710 
2711 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2712 		return MODE_11AC_VHT40;
2713 
2714 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2715 		return MODE_11AC_VHT20;
2716 
2717 	return MODE_UNKNOWN;
2718 }
2719 
2720 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
2721 						   struct ieee80211_sta *sta)
2722 {
2723 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2724 		if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2725 		     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2726 			return MODE_11AX_HE160;
2727 		else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2728 			 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2729 			return MODE_11AX_HE80_80;
2730 		/* not sure if this is a valid case? */
2731 		return MODE_11AX_HE160;
2732 	}
2733 
2734 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2735 		return MODE_11AX_HE80;
2736 
2737 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2738 		return MODE_11AX_HE40;
2739 
2740 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2741 		return MODE_11AX_HE20;
2742 
2743 	return MODE_UNKNOWN;
2744 }
2745 
2746 static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
2747 					struct ieee80211_vif *vif,
2748 					struct ieee80211_sta *sta,
2749 					struct peer_assoc_params *arg)
2750 {
2751 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2752 	struct cfg80211_chan_def def;
2753 	enum nl80211_band band;
2754 	const u8 *ht_mcs_mask;
2755 	const u16 *vht_mcs_mask;
2756 	const u16 *he_mcs_mask;
2757 	enum wmi_phy_mode phymode = MODE_UNKNOWN;
2758 
2759 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2760 		return;
2761 
2762 	band = def.chan->band;
2763 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2764 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2765 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2766 
2767 	switch (band) {
2768 	case NL80211_BAND_2GHZ:
2769 		if (sta->deflink.he_cap.has_he &&
2770 		    !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2771 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2772 				phymode = MODE_11AX_HE80_2G;
2773 			else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2774 				phymode = MODE_11AX_HE40_2G;
2775 			else
2776 				phymode = MODE_11AX_HE20_2G;
2777 		} else if (sta->deflink.vht_cap.vht_supported &&
2778 			   !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2779 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2780 				phymode = MODE_11AC_VHT40;
2781 			else
2782 				phymode = MODE_11AC_VHT20;
2783 		} else if (sta->deflink.ht_cap.ht_supported &&
2784 			   !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2785 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2786 				phymode = MODE_11NG_HT40;
2787 			else
2788 				phymode = MODE_11NG_HT20;
2789 		} else if (ath11k_mac_sta_has_ofdm_only(sta)) {
2790 			phymode = MODE_11G;
2791 		} else {
2792 			phymode = MODE_11B;
2793 		}
2794 		break;
2795 	case NL80211_BAND_5GHZ:
2796 	case NL80211_BAND_6GHZ:
2797 		/* Check HE first */
2798 		if (sta->deflink.he_cap.has_he &&
2799 		    !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
2800 			phymode = ath11k_mac_get_phymode_he(ar, sta);
2801 		} else if (sta->deflink.vht_cap.vht_supported &&
2802 			   !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2803 			phymode = ath11k_mac_get_phymode_vht(ar, sta);
2804 		} else if (sta->deflink.ht_cap.ht_supported &&
2805 			   !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2806 			if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2807 				phymode = MODE_11NA_HT40;
2808 			else
2809 				phymode = MODE_11NA_HT20;
2810 		} else {
2811 			phymode = MODE_11A;
2812 		}
2813 		break;
2814 	default:
2815 		break;
2816 	}
2817 
2818 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "peer %pM phymode %s\n",
2819 		   sta->addr, ath11k_wmi_phymode_str(phymode));
2820 
2821 	arg->peer_phymode = phymode;
2822 	WARN_ON(phymode == MODE_UNKNOWN);
2823 }
2824 
2825 static void ath11k_peer_assoc_prepare(struct ath11k *ar,
2826 				      struct ieee80211_vif *vif,
2827 				      struct ieee80211_sta *sta,
2828 				      struct peer_assoc_params *arg,
2829 				      bool reassoc)
2830 {
2831 	struct ath11k_sta *arsta;
2832 
2833 	lockdep_assert_held(&ar->conf_mutex);
2834 
2835 	arsta = ath11k_sta_to_arsta(sta);
2836 
2837 	memset(arg, 0, sizeof(*arg));
2838 
2839 	reinit_completion(&ar->peer_assoc_done);
2840 
2841 	arg->peer_new_assoc = !reassoc;
2842 	ath11k_peer_assoc_h_basic(ar, vif, sta, arg);
2843 	ath11k_peer_assoc_h_crypto(ar, vif, sta, arg);
2844 	ath11k_peer_assoc_h_rates(ar, vif, sta, arg);
2845 	ath11k_peer_assoc_h_phymode(ar, vif, sta, arg);
2846 	ath11k_peer_assoc_h_ht(ar, vif, sta, arg);
2847 	ath11k_peer_assoc_h_vht(ar, vif, sta, arg);
2848 	ath11k_peer_assoc_h_he(ar, vif, sta, arg);
2849 	ath11k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
2850 	ath11k_peer_assoc_h_qos(ar, vif, sta, arg);
2851 	ath11k_peer_assoc_h_smps(sta, arg);
2852 
2853 	arsta->peer_nss = arg->peer_nss;
2854 
2855 	/* TODO: amsdu_disable req? */
2856 }
2857 
2858 static int ath11k_setup_peer_smps(struct ath11k *ar, struct ath11k_vif *arvif,
2859 				  const u8 *addr,
2860 				  const struct ieee80211_sta_ht_cap *ht_cap,
2861 				  u16 he_6ghz_capa)
2862 {
2863 	int smps;
2864 
2865 	if (!ht_cap->ht_supported && !he_6ghz_capa)
2866 		return 0;
2867 
2868 	if (ht_cap->ht_supported) {
2869 		smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2870 		smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2871 	} else {
2872 		smps = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS, he_6ghz_capa);
2873 	}
2874 
2875 	if (smps >= ARRAY_SIZE(ath11k_smps_map))
2876 		return -EINVAL;
2877 
2878 	return ath11k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2879 					 WMI_PEER_MIMO_PS_STATE,
2880 					 ath11k_smps_map[smps]);
2881 }
2882 
2883 static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif)
2884 {
2885 	struct ath11k *ar = arvif->ar;
2886 	u32 param, value;
2887 	int ret;
2888 
2889 	if (!arvif->vif->bss_conf.he_support)
2890 		return true;
2891 
2892 	param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2893 	value = 0;
2894 	if (arvif->vif->bss_conf.he_su_beamformer) {
2895 		value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2896 		if (arvif->vif->bss_conf.he_mu_beamformer &&
2897 		    arvif->vdev_type == WMI_VDEV_TYPE_AP)
2898 			value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE);
2899 	}
2900 
2901 	if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
2902 		value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2903 			 FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2904 
2905 		if (arvif->vif->bss_conf.he_full_ul_mumimo)
2906 			value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE);
2907 
2908 		if (arvif->vif->bss_conf.he_su_beamformee)
2909 			value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2910 	}
2911 
2912 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
2913 	if (ret) {
2914 		ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
2915 			    arvif->vdev_id, ret);
2916 		return false;
2917 	}
2918 
2919 	param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
2920 	value =	FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) |
2921 		FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE,
2922 			   HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE);
2923 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2924 					    param, value);
2925 	if (ret) {
2926 		ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
2927 			    arvif->vdev_id, ret);
2928 		return false;
2929 	}
2930 	return true;
2931 }
2932 
2933 static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar,
2934 					      struct ieee80211_vif *vif,
2935 					      struct ieee80211_sta_he_cap *he_cap)
2936 {
2937 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
2938 	struct ieee80211_he_cap_elem he_cap_elem = {0};
2939 	struct ieee80211_sta_he_cap *cap_band = NULL;
2940 	struct cfg80211_chan_def def;
2941 	u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
2942 	u32 hemode = 0;
2943 	int ret;
2944 
2945 	if (!vif->bss_conf.he_support)
2946 		return true;
2947 
2948 	if (vif->type != NL80211_IFTYPE_STATION)
2949 		return false;
2950 
2951 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
2952 		return false;
2953 
2954 	if (def.chan->band == NL80211_BAND_2GHZ)
2955 		cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
2956 	else
2957 		cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
2958 
2959 	memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
2960 
2961 	if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
2962 		if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2963 			hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2964 		if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
2965 			hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE);
2966 	}
2967 
2968 	if (vif->type != NL80211_IFTYPE_MESH_POINT) {
2969 		hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) |
2970 			  FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE);
2971 
2972 		if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
2973 			if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
2974 				hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO,
2975 						     HE_UL_MUMIMO_ENABLE);
2976 
2977 		if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode))
2978 			hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE);
2979 
2980 		if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode))
2981 			hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE);
2982 	}
2983 
2984 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode);
2985 	if (ret) {
2986 		ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
2987 			    hemode, ret);
2988 		return false;
2989 	}
2990 
2991 	return true;
2992 }
2993 
2994 static void ath11k_bss_assoc(struct ieee80211_hw *hw,
2995 			     struct ieee80211_vif *vif,
2996 			     struct ieee80211_bss_conf *bss_conf)
2997 {
2998 	struct ath11k *ar = hw->priv;
2999 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3000 	struct peer_assoc_params peer_arg;
3001 	struct ieee80211_sta *ap_sta;
3002 	struct ath11k_peer *peer;
3003 	bool is_auth = false;
3004 	struct ieee80211_sta_he_cap  he_cap;
3005 	int ret;
3006 
3007 	lockdep_assert_held(&ar->conf_mutex);
3008 
3009 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i assoc bssid %pM aid %d\n",
3010 		   arvif->vdev_id, arvif->bssid, arvif->aid);
3011 
3012 	rcu_read_lock();
3013 
3014 	ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
3015 	if (!ap_sta) {
3016 		ath11k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3017 			    bss_conf->bssid, arvif->vdev_id);
3018 		rcu_read_unlock();
3019 		return;
3020 	}
3021 
3022 	/* he_cap here is updated at assoc success for sta mode only */
3023 	he_cap  = ap_sta->deflink.he_cap;
3024 
3025 	ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
3026 
3027 	rcu_read_unlock();
3028 
3029 	peer_arg.is_assoc = true;
3030 	ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3031 	if (ret) {
3032 		ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3033 			    bss_conf->bssid, arvif->vdev_id, ret);
3034 		return;
3035 	}
3036 
3037 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3038 		ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3039 			    bss_conf->bssid, arvif->vdev_id);
3040 		return;
3041 	}
3042 
3043 	ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3044 				     &ap_sta->deflink.ht_cap,
3045 				     le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
3046 	if (ret) {
3047 		ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3048 			    arvif->vdev_id, ret);
3049 		return;
3050 	}
3051 
3052 	if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) {
3053 		ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n",
3054 			    arvif->vdev_id, bss_conf->bssid);
3055 		return;
3056 	}
3057 
3058 	WARN_ON(arvif->is_up);
3059 
3060 	arvif->aid = vif->cfg.aid;
3061 	ether_addr_copy(arvif->bssid, bss_conf->bssid);
3062 
3063 	ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid,
3064 				 NULL, 0, 0);
3065 	if (ret) {
3066 		ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3067 			    arvif->vdev_id, ret);
3068 		return;
3069 	}
3070 
3071 	arvif->is_up = true;
3072 	arvif->rekey_data.enable_offload = false;
3073 
3074 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3075 		   "vdev %d up (associated) bssid %pM aid %d\n",
3076 		   arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3077 
3078 	spin_lock_bh(&ar->ab->base_lock);
3079 
3080 	peer = ath11k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3081 	if (peer && peer->is_authorized)
3082 		is_auth = true;
3083 
3084 	spin_unlock_bh(&ar->ab->base_lock);
3085 
3086 	if (is_auth) {
3087 		ret = ath11k_wmi_set_peer_param(ar, arvif->bssid,
3088 						arvif->vdev_id,
3089 						WMI_PEER_AUTHORIZE,
3090 						1);
3091 		if (ret)
3092 			ath11k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3093 	}
3094 
3095 	ret = ath11k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3096 					   &bss_conf->he_obss_pd);
3097 	if (ret)
3098 		ath11k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3099 			    arvif->vdev_id, ret);
3100 
3101 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3102 					    WMI_VDEV_PARAM_DTIM_POLICY,
3103 					    WMI_DTIM_POLICY_STICK);
3104 	if (ret)
3105 		ath11k_warn(ar->ab, "failed to set vdev %d dtim policy: %d\n",
3106 			    arvif->vdev_id, ret);
3107 
3108 	ath11k_mac_11d_scan_stop_all(ar->ab);
3109 }
3110 
3111 static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
3112 				struct ieee80211_vif *vif)
3113 {
3114 	struct ath11k *ar = hw->priv;
3115 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3116 	int ret;
3117 
3118 	lockdep_assert_held(&ar->conf_mutex);
3119 
3120 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %i disassoc bssid %pM\n",
3121 		   arvif->vdev_id, arvif->bssid);
3122 
3123 	ret = ath11k_wmi_vdev_down(ar, arvif->vdev_id);
3124 	if (ret)
3125 		ath11k_warn(ar->ab, "failed to down vdev %i: %d\n",
3126 			    arvif->vdev_id, ret);
3127 
3128 	arvif->is_up = false;
3129 
3130 	memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3131 
3132 	cancel_delayed_work_sync(&arvif->connection_loss_work);
3133 }
3134 
3135 static u32 ath11k_mac_get_rate_hw_value(int bitrate)
3136 {
3137 	u32 preamble;
3138 	u16 hw_value;
3139 	int rate;
3140 	size_t i;
3141 
3142 	if (ath11k_mac_bitrate_is_cck(bitrate))
3143 		preamble = WMI_RATE_PREAMBLE_CCK;
3144 	else
3145 		preamble = WMI_RATE_PREAMBLE_OFDM;
3146 
3147 	for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
3148 		if (ath11k_legacy_rates[i].bitrate != bitrate)
3149 			continue;
3150 
3151 		hw_value = ath11k_legacy_rates[i].hw_value;
3152 		rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3153 
3154 		return rate;
3155 	}
3156 
3157 	return -EINVAL;
3158 }
3159 
3160 static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
3161 					 struct ieee80211_vif *vif,
3162 					 struct cfg80211_chan_def *def)
3163 {
3164 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3165 	const struct ieee80211_supported_band *sband;
3166 	u8 basic_rate_idx;
3167 	int hw_rate_code;
3168 	u32 vdev_param;
3169 	u16 bitrate;
3170 	int ret;
3171 
3172 	lockdep_assert_held(&ar->conf_mutex);
3173 
3174 	sband = ar->hw->wiphy->bands[def->chan->band];
3175 	basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
3176 	bitrate = sband->bitrates[basic_rate_idx].bitrate;
3177 
3178 	hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
3179 	if (hw_rate_code < 0) {
3180 		ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3181 		return;
3182 	}
3183 
3184 	vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3185 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3186 					    hw_rate_code);
3187 	if (ret)
3188 		ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3189 
3190 	/* For WCN6855, firmware will clear this param when vdev starts, hence
3191 	 * cache it here so that we can reconfigure it once vdev starts.
3192 	 */
3193 	ar->hw_rate_code = hw_rate_code;
3194 
3195 	vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3196 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3197 					    hw_rate_code);
3198 	if (ret)
3199 		ath11k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3200 }
3201 
3202 static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
3203 				     struct ieee80211_bss_conf *info)
3204 {
3205 	struct ath11k *ar = arvif->ar;
3206 	struct sk_buff *tmpl;
3207 	int ret;
3208 	u32 interval;
3209 	bool unsol_bcast_probe_resp_enabled = false;
3210 
3211 	if (info->fils_discovery.max_interval) {
3212 		interval = info->fils_discovery.max_interval;
3213 
3214 		tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
3215 		if (tmpl)
3216 			ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
3217 							     tmpl);
3218 	} else if (info->unsol_bcast_probe_resp_interval) {
3219 		unsol_bcast_probe_resp_enabled = 1;
3220 		interval = info->unsol_bcast_probe_resp_interval;
3221 
3222 		tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
3223 								 arvif->vif);
3224 		if (tmpl)
3225 			ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
3226 							 tmpl);
3227 	} else { /* Disable */
3228 		return ath11k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
3229 	}
3230 
3231 	if (!tmpl) {
3232 		ath11k_warn(ar->ab,
3233 			    "mac vdev %i failed to retrieve %s template\n",
3234 			    arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
3235 			    "unsolicited broadcast probe response" :
3236 			    "FILS discovery"));
3237 		return -EPERM;
3238 	}
3239 	kfree_skb(tmpl);
3240 
3241 	if (!ret)
3242 		ret = ath11k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
3243 						unsol_bcast_probe_resp_enabled);
3244 
3245 	return ret;
3246 }
3247 
3248 static int ath11k_mac_config_obss_pd(struct ath11k *ar,
3249 				     struct ieee80211_he_obss_pd *he_obss_pd)
3250 {
3251 	u32 bitmap[2], param_id, param_val, pdev_id;
3252 	int ret;
3253 	s8 non_srg_th = 0, srg_th = 0;
3254 
3255 	pdev_id = ar->pdev->pdev_id;
3256 
3257 	/* Set and enable SRG/non-SRG OBSS PD Threshold */
3258 	param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
3259 	if (test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
3260 		ret = ath11k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
3261 		if (ret)
3262 			ath11k_warn(ar->ab,
3263 				    "failed to set obss_pd_threshold for pdev: %u\n",
3264 				    pdev_id);
3265 		return ret;
3266 	}
3267 
3268 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3269 		   "obss pd sr_ctrl %x non_srg_thres %u srg_max %u\n",
3270 		   he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
3271 		   he_obss_pd->max_offset);
3272 
3273 	param_val = 0;
3274 
3275 	if (he_obss_pd->sr_ctrl &
3276 	    IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
3277 		non_srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD;
3278 	} else {
3279 		if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
3280 			non_srg_th = (ATH11K_OBSS_PD_MAX_THRESHOLD +
3281 				      he_obss_pd->non_srg_max_offset);
3282 		else
3283 			non_srg_th = ATH11K_OBSS_PD_NON_SRG_MAX_THRESHOLD;
3284 
3285 		param_val |= ATH11K_OBSS_PD_NON_SRG_EN;
3286 	}
3287 
3288 	if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
3289 		srg_th = ATH11K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
3290 		param_val |= ATH11K_OBSS_PD_SRG_EN;
3291 	}
3292 
3293 	if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3294 		     ar->ab->wmi_ab.svc_map)) {
3295 		param_val |= ATH11K_OBSS_PD_THRESHOLD_IN_DBM;
3296 		param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
3297 	} else {
3298 		non_srg_th -= ATH11K_DEFAULT_NOISE_FLOOR;
3299 		/* SRG not supported and threshold in dB */
3300 		param_val &= ~(ATH11K_OBSS_PD_SRG_EN |
3301 			       ATH11K_OBSS_PD_THRESHOLD_IN_DBM);
3302 	}
3303 
3304 	param_val |= (non_srg_th & GENMASK(7, 0));
3305 	ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3306 	if (ret) {
3307 		ath11k_warn(ar->ab,
3308 			    "failed to set obss_pd_threshold for pdev: %u\n",
3309 			    pdev_id);
3310 		return ret;
3311 	}
3312 
3313 	/* Enable OBSS PD for all access category */
3314 	param_id  = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
3315 	param_val = 0xf;
3316 	ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3317 	if (ret) {
3318 		ath11k_warn(ar->ab,
3319 			    "failed to set obss_pd_per_ac for pdev: %u\n",
3320 			    pdev_id);
3321 		return ret;
3322 	}
3323 
3324 	/* Set SR Prohibit */
3325 	param_id  = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
3326 	param_val = !!(he_obss_pd->sr_ctrl &
3327 		       IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
3328 	ret = ath11k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
3329 	if (ret) {
3330 		ath11k_warn(ar->ab, "failed to set sr_prohibit for pdev: %u\n",
3331 			    pdev_id);
3332 		return ret;
3333 	}
3334 
3335 	if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
3336 		      ar->ab->wmi_ab.svc_map))
3337 		return 0;
3338 
3339 	/* Set SRG BSS Color Bitmap */
3340 	memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
3341 	ret = ath11k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
3342 	if (ret) {
3343 		ath11k_warn(ar->ab,
3344 			    "failed to set bss_color_bitmap for pdev: %u\n",
3345 			    pdev_id);
3346 		return ret;
3347 	}
3348 
3349 	/* Set SRG Partial BSSID Bitmap */
3350 	memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
3351 	ret = ath11k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
3352 	if (ret) {
3353 		ath11k_warn(ar->ab,
3354 			    "failed to set partial_bssid_bitmap for pdev: %u\n",
3355 			    pdev_id);
3356 		return ret;
3357 	}
3358 
3359 	memset(bitmap, 0xff, sizeof(bitmap));
3360 
3361 	/* Enable all BSS Colors for SRG */
3362 	ret = ath11k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
3363 	if (ret) {
3364 		ath11k_warn(ar->ab,
3365 			    "failed to set srg_color_en_bitmap pdev: %u\n",
3366 			    pdev_id);
3367 		return ret;
3368 	}
3369 
3370 	/* Enable all partial BSSID mask for SRG */
3371 	ret = ath11k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
3372 	if (ret) {
3373 		ath11k_warn(ar->ab,
3374 			    "failed to set srg_bssid_en_bitmap pdev: %u\n",
3375 			    pdev_id);
3376 		return ret;
3377 	}
3378 
3379 	/* Enable all BSS Colors for non-SRG */
3380 	ret = ath11k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
3381 	if (ret) {
3382 		ath11k_warn(ar->ab,
3383 			    "failed to set non_srg_color_en_bitmap pdev: %u\n",
3384 			    pdev_id);
3385 		return ret;
3386 	}
3387 
3388 	/* Enable all partial BSSID mask for non-SRG */
3389 	ret = ath11k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
3390 	if (ret) {
3391 		ath11k_warn(ar->ab,
3392 			    "failed to set non_srg_bssid_en_bitmap pdev: %u\n",
3393 			    pdev_id);
3394 		return ret;
3395 	}
3396 
3397 	return 0;
3398 }
3399 
3400 static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
3401 					   struct ieee80211_vif *vif,
3402 					   struct ieee80211_bss_conf *info,
3403 					   u64 changed)
3404 {
3405 	struct ath11k *ar = hw->priv;
3406 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3407 	struct cfg80211_chan_def def;
3408 	u32 param_id, param_value;
3409 	enum nl80211_band band;
3410 	u32 vdev_param;
3411 	int mcast_rate;
3412 	u32 preamble;
3413 	u16 hw_value;
3414 	u16 bitrate;
3415 	int ret = 0;
3416 	u8 rateidx;
3417 	u32 rate, param;
3418 	u32 ipv4_cnt;
3419 
3420 	mutex_lock(&ar->conf_mutex);
3421 
3422 	if (changed & BSS_CHANGED_BEACON_INT) {
3423 		arvif->beacon_interval = info->beacon_int;
3424 
3425 		param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
3426 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3427 						    param_id,
3428 						    arvif->beacon_interval);
3429 		if (ret)
3430 			ath11k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
3431 				    arvif->vdev_id);
3432 		else
3433 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3434 				   "Beacon interval: %d set for VDEV: %d\n",
3435 				   arvif->beacon_interval, arvif->vdev_id);
3436 	}
3437 
3438 	if (changed & BSS_CHANGED_BEACON) {
3439 		param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
3440 		param_value = WMI_BEACON_STAGGERED_MODE;
3441 		ret = ath11k_wmi_pdev_set_param(ar, param_id,
3442 						param_value, ar->pdev->pdev_id);
3443 		if (ret)
3444 			ath11k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
3445 				    arvif->vdev_id);
3446 		else
3447 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3448 				   "Set staggered beacon mode for VDEV: %d\n",
3449 				   arvif->vdev_id);
3450 
3451 		if (!arvif->do_not_send_tmpl || !arvif->bcca_zero_sent) {
3452 			ret = ath11k_mac_setup_bcn_tmpl(arvif);
3453 			if (ret)
3454 				ath11k_warn(ar->ab, "failed to update bcn template: %d\n",
3455 					    ret);
3456 		}
3457 
3458 		if (arvif->bcca_zero_sent)
3459 			arvif->do_not_send_tmpl = true;
3460 		else
3461 			arvif->do_not_send_tmpl = false;
3462 
3463 		if (vif->bss_conf.he_support) {
3464 			ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3465 							    WMI_VDEV_PARAM_BA_MODE,
3466 							    WMI_BA_MODE_BUFFER_SIZE_256);
3467 			if (ret)
3468 				ath11k_warn(ar->ab,
3469 					    "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
3470 					    arvif->vdev_id);
3471 			else
3472 				ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3473 					   "Set BA BUFFER SIZE 256 for VDEV: %d\n",
3474 					   arvif->vdev_id);
3475 		}
3476 	}
3477 
3478 	if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
3479 		arvif->dtim_period = info->dtim_period;
3480 
3481 		param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
3482 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3483 						    param_id,
3484 						    arvif->dtim_period);
3485 
3486 		if (ret)
3487 			ath11k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
3488 				    arvif->vdev_id, ret);
3489 		else
3490 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3491 				   "DTIM period: %d set for VDEV: %d\n",
3492 				   arvif->dtim_period, arvif->vdev_id);
3493 	}
3494 
3495 	if (changed & BSS_CHANGED_SSID &&
3496 	    vif->type == NL80211_IFTYPE_AP) {
3497 		arvif->u.ap.ssid_len = vif->cfg.ssid_len;
3498 		if (vif->cfg.ssid_len)
3499 			memcpy(arvif->u.ap.ssid, vif->cfg.ssid,
3500 			       vif->cfg.ssid_len);
3501 		arvif->u.ap.hidden_ssid = info->hidden_ssid;
3502 	}
3503 
3504 	if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
3505 		ether_addr_copy(arvif->bssid, info->bssid);
3506 
3507 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
3508 		if (info->enable_beacon)
3509 			ath11k_mac_set_he_txbf_conf(arvif);
3510 		ath11k_control_beaconing(arvif, info);
3511 
3512 		if (arvif->is_up && vif->bss_conf.he_support &&
3513 		    vif->bss_conf.he_oper.params) {
3514 			param_id = WMI_VDEV_PARAM_HEOPS_0_31;
3515 			param_value = vif->bss_conf.he_oper.params;
3516 			ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3517 							    param_id, param_value);
3518 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3519 				   "he oper param: %x set for VDEV: %d\n",
3520 				   param_value, arvif->vdev_id);
3521 
3522 			if (ret)
3523 				ath11k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
3524 					    param_value, arvif->vdev_id, ret);
3525 		}
3526 	}
3527 
3528 	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3529 		u32 cts_prot;
3530 
3531 		cts_prot = !!(info->use_cts_prot);
3532 		param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
3533 
3534 		if (arvif->is_started) {
3535 			ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3536 							    param_id, cts_prot);
3537 			if (ret)
3538 				ath11k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
3539 					    arvif->vdev_id);
3540 			else
3541 				ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
3542 					   cts_prot, arvif->vdev_id);
3543 		} else {
3544 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
3545 		}
3546 	}
3547 
3548 	if (changed & BSS_CHANGED_ERP_SLOT) {
3549 		u32 slottime;
3550 
3551 		if (info->use_short_slot)
3552 			slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3553 
3554 		else
3555 			slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
3556 
3557 		param_id = WMI_VDEV_PARAM_SLOT_TIME;
3558 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3559 						    param_id, slottime);
3560 		if (ret)
3561 			ath11k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
3562 				    arvif->vdev_id);
3563 		else
3564 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3565 				   "Set slottime: %d for VDEV: %d\n",
3566 				   slottime, arvif->vdev_id);
3567 	}
3568 
3569 	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3570 		u32 preamble;
3571 
3572 		if (info->use_short_preamble)
3573 			preamble = WMI_VDEV_PREAMBLE_SHORT;
3574 		else
3575 			preamble = WMI_VDEV_PREAMBLE_LONG;
3576 
3577 		param_id = WMI_VDEV_PARAM_PREAMBLE;
3578 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3579 						    param_id, preamble);
3580 		if (ret)
3581 			ath11k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
3582 				    arvif->vdev_id);
3583 		else
3584 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3585 				   "Set preamble: %d for VDEV: %d\n",
3586 				   preamble, arvif->vdev_id);
3587 	}
3588 
3589 	if (changed & BSS_CHANGED_ASSOC) {
3590 		if (vif->cfg.assoc)
3591 			ath11k_bss_assoc(hw, vif, info);
3592 		else
3593 			ath11k_bss_disassoc(hw, vif);
3594 	}
3595 
3596 	if (changed & BSS_CHANGED_TXPOWER) {
3597 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev_id %i txpower %d\n",
3598 			   arvif->vdev_id, info->txpower);
3599 
3600 		arvif->txpower = info->txpower;
3601 		ath11k_mac_txpower_recalc(ar);
3602 	}
3603 
3604 	if (changed & BSS_CHANGED_PS &&
3605 	    ar->ab->hw_params.supports_sta_ps) {
3606 		arvif->ps = vif->cfg.ps;
3607 
3608 		ret = ath11k_mac_config_ps(ar);
3609 		if (ret)
3610 			ath11k_warn(ar->ab, "failed to setup ps on vdev %i: %d\n",
3611 				    arvif->vdev_id, ret);
3612 	}
3613 
3614 	if (changed & BSS_CHANGED_MCAST_RATE &&
3615 	    !ath11k_mac_vif_chan(arvif->vif, &def)) {
3616 		band = def.chan->band;
3617 		mcast_rate = vif->bss_conf.mcast_rate[band];
3618 
3619 		if (mcast_rate > 0)
3620 			rateidx = mcast_rate - 1;
3621 		else
3622 			rateidx = ffs(vif->bss_conf.basic_rates) - 1;
3623 
3624 		if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
3625 			rateidx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
3626 
3627 		bitrate = ath11k_legacy_rates[rateidx].bitrate;
3628 		hw_value = ath11k_legacy_rates[rateidx].hw_value;
3629 
3630 		if (ath11k_mac_bitrate_is_cck(bitrate))
3631 			preamble = WMI_RATE_PREAMBLE_CCK;
3632 		else
3633 			preamble = WMI_RATE_PREAMBLE_OFDM;
3634 
3635 		rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
3636 
3637 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3638 			   "vdev %d mcast_rate %x\n",
3639 			   arvif->vdev_id, rate);
3640 
3641 		vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
3642 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3643 						    vdev_param, rate);
3644 		if (ret)
3645 			ath11k_warn(ar->ab,
3646 				    "failed to set mcast rate on vdev %i: %d\n",
3647 				    arvif->vdev_id,  ret);
3648 
3649 		vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
3650 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3651 						    vdev_param, rate);
3652 		if (ret)
3653 			ath11k_warn(ar->ab,
3654 				    "failed to set bcast rate on vdev %i: %d\n",
3655 				    arvif->vdev_id,  ret);
3656 	}
3657 
3658 	if (changed & BSS_CHANGED_BASIC_RATES &&
3659 	    !ath11k_mac_vif_chan(arvif->vif, &def))
3660 		ath11k_recalculate_mgmt_rate(ar, vif, &def);
3661 
3662 	if (changed & BSS_CHANGED_TWT) {
3663 		struct wmi_twt_enable_params twt_params = {0};
3664 
3665 		if (info->twt_requester || info->twt_responder) {
3666 			ath11k_wmi_fill_default_twt_params(&twt_params);
3667 			ath11k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id,
3668 						       &twt_params);
3669 		} else {
3670 			ath11k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
3671 		}
3672 	}
3673 
3674 	if (changed & BSS_CHANGED_HE_OBSS_PD)
3675 		ath11k_mac_config_obss_pd(ar, &info->he_obss_pd);
3676 
3677 	if (changed & BSS_CHANGED_HE_BSS_COLOR) {
3678 		if (vif->type == NL80211_IFTYPE_AP) {
3679 			ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3680 				ar, arvif->vdev_id, info->he_bss_color.color,
3681 				ATH11K_BSS_COLOR_COLLISION_DETECTION_AP_PERIOD_MS,
3682 				info->he_bss_color.enabled);
3683 			if (ret)
3684 				ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3685 					    arvif->vdev_id,  ret);
3686 
3687 			param_id = WMI_VDEV_PARAM_BSS_COLOR;
3688 			if (info->he_bss_color.enabled)
3689 				param_value = info->he_bss_color.color <<
3690 						IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET;
3691 			else
3692 				param_value = IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED;
3693 
3694 			ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3695 							    param_id,
3696 							    param_value);
3697 			if (ret)
3698 				ath11k_warn(ar->ab,
3699 					    "failed to set bss color param on vdev %i: %d\n",
3700 					    arvif->vdev_id,  ret);
3701 
3702 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
3703 				   "bss color param 0x%x set on vdev %i\n",
3704 				   param_value, arvif->vdev_id);
3705 		} else if (vif->type == NL80211_IFTYPE_STATION) {
3706 			ret = ath11k_wmi_send_bss_color_change_enable_cmd(ar,
3707 									  arvif->vdev_id,
3708 									  1);
3709 			if (ret)
3710 				ath11k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
3711 					    arvif->vdev_id,  ret);
3712 			ret = ath11k_wmi_send_obss_color_collision_cfg_cmd(
3713 				ar, arvif->vdev_id, 0,
3714 				ATH11K_BSS_COLOR_COLLISION_DETECTION_STA_PERIOD_MS, 1);
3715 			if (ret)
3716 				ath11k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
3717 					    arvif->vdev_id,  ret);
3718 		}
3719 	}
3720 
3721 	if (changed & BSS_CHANGED_FTM_RESPONDER &&
3722 	    arvif->ftm_responder != info->ftm_responder &&
3723 	    test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) &&
3724 	    (vif->type == NL80211_IFTYPE_AP ||
3725 	     vif->type == NL80211_IFTYPE_MESH_POINT)) {
3726 		arvif->ftm_responder = info->ftm_responder;
3727 		param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE;
3728 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
3729 						    arvif->ftm_responder);
3730 		if (ret)
3731 			ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n",
3732 				    arvif->vdev_id, ret);
3733 	}
3734 
3735 	if (changed & BSS_CHANGED_FILS_DISCOVERY ||
3736 	    changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
3737 		ath11k_mac_fils_discovery(arvif, info);
3738 
3739 	if (changed & BSS_CHANGED_ARP_FILTER) {
3740 		ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
3741 		memcpy(arvif->arp_ns_offload.ipv4_addr,
3742 		       vif->cfg.arp_addr_list,
3743 		       ipv4_cnt * sizeof(u32));
3744 		memcpy(arvif->arp_ns_offload.mac_addr, vif->addr, ETH_ALEN);
3745 		arvif->arp_ns_offload.ipv4_count = ipv4_cnt;
3746 
3747 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "arp_addr_cnt %d vif->addr %pM, offload_addr %pI4\n",
3748 			   vif->cfg.arp_addr_cnt,
3749 			   vif->addr, arvif->arp_ns_offload.ipv4_addr);
3750 	}
3751 
3752 	mutex_unlock(&ar->conf_mutex);
3753 }
3754 
3755 void __ath11k_mac_scan_finish(struct ath11k *ar)
3756 {
3757 	lockdep_assert_held(&ar->data_lock);
3758 
3759 	switch (ar->scan.state) {
3760 	case ATH11K_SCAN_IDLE:
3761 		break;
3762 	case ATH11K_SCAN_RUNNING:
3763 	case ATH11K_SCAN_ABORTING:
3764 		if (ar->scan.is_roc && ar->scan.roc_notify)
3765 			ieee80211_remain_on_channel_expired(ar->hw);
3766 		fallthrough;
3767 	case ATH11K_SCAN_STARTING:
3768 		if (!ar->scan.is_roc) {
3769 			struct cfg80211_scan_info info = {
3770 				.aborted = ((ar->scan.state ==
3771 					    ATH11K_SCAN_ABORTING) ||
3772 					    (ar->scan.state ==
3773 					    ATH11K_SCAN_STARTING)),
3774 			};
3775 
3776 			ieee80211_scan_completed(ar->hw, &info);
3777 		}
3778 
3779 		ar->scan.state = ATH11K_SCAN_IDLE;
3780 		ar->scan_channel = NULL;
3781 		ar->scan.roc_freq = 0;
3782 		cancel_delayed_work(&ar->scan.timeout);
3783 		complete_all(&ar->scan.completed);
3784 		break;
3785 	}
3786 }
3787 
3788 void ath11k_mac_scan_finish(struct ath11k *ar)
3789 {
3790 	spin_lock_bh(&ar->data_lock);
3791 	__ath11k_mac_scan_finish(ar);
3792 	spin_unlock_bh(&ar->data_lock);
3793 }
3794 
3795 static int ath11k_scan_stop(struct ath11k *ar)
3796 {
3797 	struct scan_cancel_param arg = {
3798 		.req_type = WLAN_SCAN_CANCEL_SINGLE,
3799 		.scan_id = ATH11K_SCAN_ID,
3800 	};
3801 	int ret;
3802 
3803 	lockdep_assert_held(&ar->conf_mutex);
3804 
3805 	/* TODO: Fill other STOP Params */
3806 	arg.pdev_id = ar->pdev->pdev_id;
3807 
3808 	ret = ath11k_wmi_send_scan_stop_cmd(ar, &arg);
3809 	if (ret) {
3810 		ath11k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3811 		goto out;
3812 	}
3813 
3814 	ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3815 	if (ret == 0) {
3816 		ath11k_warn(ar->ab,
3817 			    "failed to receive scan abort comple: timed out\n");
3818 		ret = -ETIMEDOUT;
3819 	} else if (ret > 0) {
3820 		ret = 0;
3821 	}
3822 
3823 out:
3824 	/* Scan state should be updated upon scan completion but in case
3825 	 * firmware fails to deliver the event (for whatever reason) it is
3826 	 * desired to clean up scan state anyway. Firmware may have just
3827 	 * dropped the scan completion event delivery due to transport pipe
3828 	 * being overflown with data and/or it can recover on its own before
3829 	 * next scan request is submitted.
3830 	 */
3831 	spin_lock_bh(&ar->data_lock);
3832 	if (ar->scan.state != ATH11K_SCAN_IDLE)
3833 		__ath11k_mac_scan_finish(ar);
3834 	spin_unlock_bh(&ar->data_lock);
3835 
3836 	return ret;
3837 }
3838 
3839 static void ath11k_scan_abort(struct ath11k *ar)
3840 {
3841 	int ret;
3842 
3843 	lockdep_assert_held(&ar->conf_mutex);
3844 
3845 	spin_lock_bh(&ar->data_lock);
3846 
3847 	switch (ar->scan.state) {
3848 	case ATH11K_SCAN_IDLE:
3849 		/* This can happen if timeout worker kicked in and called
3850 		 * abortion while scan completion was being processed.
3851 		 */
3852 		break;
3853 	case ATH11K_SCAN_STARTING:
3854 	case ATH11K_SCAN_ABORTING:
3855 		ath11k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3856 			    ar->scan.state);
3857 		break;
3858 	case ATH11K_SCAN_RUNNING:
3859 		ar->scan.state = ATH11K_SCAN_ABORTING;
3860 		spin_unlock_bh(&ar->data_lock);
3861 
3862 		ret = ath11k_scan_stop(ar);
3863 		if (ret)
3864 			ath11k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3865 
3866 		spin_lock_bh(&ar->data_lock);
3867 		break;
3868 	}
3869 
3870 	spin_unlock_bh(&ar->data_lock);
3871 }
3872 
3873 static void ath11k_scan_timeout_work(struct work_struct *work)
3874 {
3875 	struct ath11k *ar = container_of(work, struct ath11k,
3876 					 scan.timeout.work);
3877 
3878 	mutex_lock(&ar->conf_mutex);
3879 	ath11k_scan_abort(ar);
3880 	mutex_unlock(&ar->conf_mutex);
3881 }
3882 
3883 static int ath11k_start_scan(struct ath11k *ar,
3884 			     struct scan_req_params *arg)
3885 {
3886 	int ret;
3887 	unsigned long timeout = 1 * HZ;
3888 
3889 	lockdep_assert_held(&ar->conf_mutex);
3890 
3891 	if (ath11k_spectral_get_mode(ar) == ATH11K_SPECTRAL_BACKGROUND)
3892 		ath11k_spectral_reset_buffer(ar);
3893 
3894 	ret = ath11k_wmi_send_scan_start_cmd(ar, arg);
3895 	if (ret)
3896 		return ret;
3897 
3898 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map)) {
3899 		timeout = 5 * HZ;
3900 
3901 		if (ar->supports_6ghz)
3902 			timeout += 5 * HZ;
3903 	}
3904 
3905 	ret = wait_for_completion_timeout(&ar->scan.started, timeout);
3906 	if (ret == 0) {
3907 		ret = ath11k_scan_stop(ar);
3908 		if (ret)
3909 			ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3910 
3911 		return -ETIMEDOUT;
3912 	}
3913 
3914 	/* If we failed to start the scan, return error code at
3915 	 * this point.  This is probably due to some issue in the
3916 	 * firmware, but no need to wedge the driver due to that...
3917 	 */
3918 	spin_lock_bh(&ar->data_lock);
3919 	if (ar->scan.state == ATH11K_SCAN_IDLE) {
3920 		spin_unlock_bh(&ar->data_lock);
3921 		return -EINVAL;
3922 	}
3923 	spin_unlock_bh(&ar->data_lock);
3924 
3925 	return 0;
3926 }
3927 
3928 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
3929 				 struct ieee80211_vif *vif,
3930 				 struct ieee80211_scan_request *hw_req)
3931 {
3932 	struct ath11k *ar = hw->priv;
3933 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
3934 	struct cfg80211_scan_request *req = &hw_req->req;
3935 	struct scan_req_params *arg = NULL;
3936 	int ret = 0;
3937 	int i;
3938 	u32 scan_timeout;
3939 
3940 	/* Firmwares advertising the support of triggering 11D algorithm
3941 	 * on the scan results of a regular scan expects driver to send
3942 	 * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID.
3943 	 * With this feature, separate 11D scan can be avoided since
3944 	 * regdomain can be determined with the scan results of the
3945 	 * regular scan.
3946 	 */
3947 	if (ar->state_11d == ATH11K_11D_PREPARING &&
3948 	    test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN,
3949 		     ar->ab->wmi_ab.svc_map))
3950 		ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
3951 
3952 	mutex_lock(&ar->conf_mutex);
3953 
3954 	spin_lock_bh(&ar->data_lock);
3955 	switch (ar->scan.state) {
3956 	case ATH11K_SCAN_IDLE:
3957 		reinit_completion(&ar->scan.started);
3958 		reinit_completion(&ar->scan.completed);
3959 		ar->scan.state = ATH11K_SCAN_STARTING;
3960 		ar->scan.is_roc = false;
3961 		ar->scan.vdev_id = arvif->vdev_id;
3962 		ret = 0;
3963 		break;
3964 	case ATH11K_SCAN_STARTING:
3965 	case ATH11K_SCAN_RUNNING:
3966 	case ATH11K_SCAN_ABORTING:
3967 		ret = -EBUSY;
3968 		break;
3969 	}
3970 	spin_unlock_bh(&ar->data_lock);
3971 
3972 	if (ret)
3973 		goto exit;
3974 
3975 	arg = kzalloc(sizeof(*arg), GFP_KERNEL);
3976 
3977 	if (!arg) {
3978 		ret = -ENOMEM;
3979 		goto exit;
3980 	}
3981 
3982 	ath11k_wmi_start_scan_init(ar, arg);
3983 	arg->vdev_id = arvif->vdev_id;
3984 	arg->scan_id = ATH11K_SCAN_ID;
3985 
3986 	if (req->ie_len) {
3987 		arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3988 		if (!arg->extraie.ptr) {
3989 			ret = -ENOMEM;
3990 			goto exit;
3991 		}
3992 		arg->extraie.len = req->ie_len;
3993 	}
3994 
3995 	if (req->n_ssids) {
3996 		arg->num_ssids = req->n_ssids;
3997 		for (i = 0; i < arg->num_ssids; i++) {
3998 			arg->ssid[i].length  = req->ssids[i].ssid_len;
3999 			memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid,
4000 			       req->ssids[i].ssid_len);
4001 		}
4002 	} else {
4003 		arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE;
4004 	}
4005 
4006 	if (req->n_channels) {
4007 		arg->num_chan = req->n_channels;
4008 		arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
4009 					 GFP_KERNEL);
4010 
4011 		if (!arg->chan_list) {
4012 			ret = -ENOMEM;
4013 			goto exit;
4014 		}
4015 
4016 		for (i = 0; i < arg->num_chan; i++) {
4017 			if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
4018 				     ar->ab->wmi_ab.svc_map)) {
4019 				arg->chan_list[i] =
4020 					u32_encode_bits(req->channels[i]->center_freq,
4021 							WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
4022 
4023 				/* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
4024 				 * flags, then scan all PSC channels in 6 GHz band and
4025 				 * those non-PSC channels where RNR IE is found during
4026 				 * the legacy 2.4/5 GHz scan.
4027 				 * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
4028 				 * then all channels in 6 GHz will be scanned.
4029 				 */
4030 				if (req->channels[i]->band == NL80211_BAND_6GHZ &&
4031 				    req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
4032 				    !cfg80211_channel_is_psc(req->channels[i]))
4033 					arg->chan_list[i] |=
4034 						WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
4035 			} else {
4036 				arg->chan_list[i] = req->channels[i]->center_freq;
4037 			}
4038 		}
4039 	}
4040 
4041 	if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
4042 		arg->scan_f_add_spoofed_mac_in_probe = 1;
4043 		ether_addr_copy(arg->mac_addr.addr, req->mac_addr);
4044 		ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask);
4045 	}
4046 
4047 	/* if duration is set, default dwell times will be overwritten */
4048 	if (req->duration) {
4049 		arg->dwell_time_active = req->duration;
4050 		arg->dwell_time_active_2g = req->duration;
4051 		arg->dwell_time_active_6g = req->duration;
4052 		arg->dwell_time_passive = req->duration;
4053 		arg->dwell_time_passive_6g = req->duration;
4054 		arg->burst_duration = req->duration;
4055 
4056 		scan_timeout = min_t(u32, arg->max_rest_time *
4057 				(arg->num_chan - 1) + (req->duration +
4058 				ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
4059 				arg->num_chan, arg->max_scan_time);
4060 	} else {
4061 		scan_timeout = arg->max_scan_time;
4062 	}
4063 
4064 	/* Add a margin to account for event/command processing */
4065 	scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
4066 
4067 	ret = ath11k_start_scan(ar, arg);
4068 	if (ret) {
4069 		ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
4070 		spin_lock_bh(&ar->data_lock);
4071 		ar->scan.state = ATH11K_SCAN_IDLE;
4072 		spin_unlock_bh(&ar->data_lock);
4073 	}
4074 
4075 	ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
4076 				     msecs_to_jiffies(scan_timeout));
4077 
4078 exit:
4079 	if (arg) {
4080 		kfree(arg->chan_list);
4081 		kfree(arg->extraie.ptr);
4082 		kfree(arg);
4083 	}
4084 
4085 	mutex_unlock(&ar->conf_mutex);
4086 
4087 	if (ar->state_11d == ATH11K_11D_PREPARING)
4088 		ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
4089 
4090 	return ret;
4091 }
4092 
4093 static void ath11k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
4094 					 struct ieee80211_vif *vif)
4095 {
4096 	struct ath11k *ar = hw->priv;
4097 
4098 	mutex_lock(&ar->conf_mutex);
4099 	ath11k_scan_abort(ar);
4100 	mutex_unlock(&ar->conf_mutex);
4101 
4102 	cancel_delayed_work_sync(&ar->scan.timeout);
4103 }
4104 
4105 static int ath11k_install_key(struct ath11k_vif *arvif,
4106 			      struct ieee80211_key_conf *key,
4107 			      enum set_key_cmd cmd,
4108 			      const u8 *macaddr, u32 flags)
4109 {
4110 	int ret;
4111 	struct ath11k *ar = arvif->ar;
4112 	struct wmi_vdev_install_key_arg arg = {
4113 		.vdev_id = arvif->vdev_id,
4114 		.key_idx = key->keyidx,
4115 		.key_len = key->keylen,
4116 		.key_data = key->key,
4117 		.key_flags = flags,
4118 		.macaddr = macaddr,
4119 	};
4120 
4121 	lockdep_assert_held(&arvif->ar->conf_mutex);
4122 
4123 	reinit_completion(&ar->install_key_done);
4124 
4125 	if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4126 		return 0;
4127 
4128 	if (cmd == DISABLE_KEY) {
4129 		arg.key_cipher = WMI_CIPHER_NONE;
4130 		arg.key_data = NULL;
4131 		goto install;
4132 	}
4133 
4134 	switch (key->cipher) {
4135 	case WLAN_CIPHER_SUITE_CCMP:
4136 		arg.key_cipher = WMI_CIPHER_AES_CCM;
4137 		/* TODO: Re-check if flag is valid */
4138 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
4139 		break;
4140 	case WLAN_CIPHER_SUITE_TKIP:
4141 		arg.key_cipher = WMI_CIPHER_TKIP;
4142 		arg.key_txmic_len = 8;
4143 		arg.key_rxmic_len = 8;
4144 		break;
4145 	case WLAN_CIPHER_SUITE_CCMP_256:
4146 		arg.key_cipher = WMI_CIPHER_AES_CCM;
4147 		break;
4148 	case WLAN_CIPHER_SUITE_GCMP:
4149 	case WLAN_CIPHER_SUITE_GCMP_256:
4150 		arg.key_cipher = WMI_CIPHER_AES_GCM;
4151 		break;
4152 	default:
4153 		ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
4154 		return -EOPNOTSUPP;
4155 	}
4156 
4157 	if (test_bit(ATH11K_FLAG_RAW_MODE, &ar->ab->dev_flags))
4158 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
4159 			      IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
4160 
4161 install:
4162 	ret = ath11k_wmi_vdev_install_key(arvif->ar, &arg);
4163 
4164 	if (ret)
4165 		return ret;
4166 
4167 	if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
4168 		return -ETIMEDOUT;
4169 
4170 	return ar->install_key_status ? -EINVAL : 0;
4171 }
4172 
4173 static int ath11k_clear_peer_keys(struct ath11k_vif *arvif,
4174 				  const u8 *addr)
4175 {
4176 	struct ath11k *ar = arvif->ar;
4177 	struct ath11k_base *ab = ar->ab;
4178 	struct ath11k_peer *peer;
4179 	int first_errno = 0;
4180 	int ret;
4181 	int i;
4182 	u32 flags = 0;
4183 
4184 	lockdep_assert_held(&ar->conf_mutex);
4185 
4186 	spin_lock_bh(&ab->base_lock);
4187 	peer = ath11k_peer_find(ab, arvif->vdev_id, addr);
4188 	spin_unlock_bh(&ab->base_lock);
4189 
4190 	if (!peer)
4191 		return -ENOENT;
4192 
4193 	for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
4194 		if (!peer->keys[i])
4195 			continue;
4196 
4197 		/* key flags are not required to delete the key */
4198 		ret = ath11k_install_key(arvif, peer->keys[i],
4199 					 DISABLE_KEY, addr, flags);
4200 		if (ret < 0 && first_errno == 0)
4201 			first_errno = ret;
4202 
4203 		if (ret < 0)
4204 			ath11k_warn(ab, "failed to remove peer key %d: %d\n",
4205 				    i, ret);
4206 
4207 		spin_lock_bh(&ab->base_lock);
4208 		peer->keys[i] = NULL;
4209 		spin_unlock_bh(&ab->base_lock);
4210 	}
4211 
4212 	return first_errno;
4213 }
4214 
4215 static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4216 				 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4217 				 struct ieee80211_key_conf *key)
4218 {
4219 	struct ath11k *ar = hw->priv;
4220 	struct ath11k_base *ab = ar->ab;
4221 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4222 	struct ath11k_peer *peer;
4223 	struct ath11k_sta *arsta;
4224 	const u8 *peer_addr;
4225 	int ret = 0;
4226 	u32 flags = 0;
4227 
4228 	/* BIP needs to be done in software */
4229 	if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
4230 	    key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
4231 	    key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
4232 	    key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
4233 		return 1;
4234 
4235 	if (test_bit(ATH11K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
4236 		return 1;
4237 
4238 	if (key->keyidx > WMI_MAX_KEY_INDEX)
4239 		return -ENOSPC;
4240 
4241 	mutex_lock(&ar->conf_mutex);
4242 
4243 	if (sta)
4244 		peer_addr = sta->addr;
4245 	else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
4246 		peer_addr = vif->bss_conf.bssid;
4247 	else
4248 		peer_addr = vif->addr;
4249 
4250 	key->hw_key_idx = key->keyidx;
4251 
4252 	/* the peer should not disappear in mid-way (unless FW goes awry) since
4253 	 * we already hold conf_mutex. we just make sure its there now.
4254 	 */
4255 	spin_lock_bh(&ab->base_lock);
4256 	peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4257 
4258 	/* flush the fragments cache during key (re)install to
4259 	 * ensure all frags in the new frag list belong to the same key.
4260 	 */
4261 	if (peer && sta && cmd == SET_KEY)
4262 		ath11k_peer_frags_flush(ar, peer);
4263 	spin_unlock_bh(&ab->base_lock);
4264 
4265 	if (!peer) {
4266 		if (cmd == SET_KEY) {
4267 			ath11k_warn(ab, "cannot install key for non-existent peer %pM\n",
4268 				    peer_addr);
4269 			ret = -EOPNOTSUPP;
4270 			goto exit;
4271 		} else {
4272 			/* if the peer doesn't exist there is no key to disable
4273 			 * anymore
4274 			 */
4275 			goto exit;
4276 		}
4277 	}
4278 
4279 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4280 		flags |= WMI_KEY_PAIRWISE;
4281 	else
4282 		flags |= WMI_KEY_GROUP;
4283 
4284 	ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
4285 	if (ret) {
4286 		ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
4287 		goto exit;
4288 	}
4289 
4290 	ret = ath11k_dp_peer_rx_pn_replay_config(arvif, peer_addr, cmd, key);
4291 	if (ret) {
4292 		ath11k_warn(ab, "failed to offload PN replay detection %d\n", ret);
4293 		goto exit;
4294 	}
4295 
4296 	spin_lock_bh(&ab->base_lock);
4297 	peer = ath11k_peer_find(ab, arvif->vdev_id, peer_addr);
4298 	if (peer && cmd == SET_KEY) {
4299 		peer->keys[key->keyidx] = key;
4300 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4301 			peer->ucast_keyidx = key->keyidx;
4302 			peer->sec_type = ath11k_dp_tx_get_encrypt_type(key->cipher);
4303 		} else {
4304 			peer->mcast_keyidx = key->keyidx;
4305 			peer->sec_type_grp = ath11k_dp_tx_get_encrypt_type(key->cipher);
4306 		}
4307 	} else if (peer && cmd == DISABLE_KEY) {
4308 		peer->keys[key->keyidx] = NULL;
4309 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
4310 			peer->ucast_keyidx = 0;
4311 		else
4312 			peer->mcast_keyidx = 0;
4313 	} else if (!peer)
4314 		/* impossible unless FW goes crazy */
4315 		ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
4316 
4317 	if (sta) {
4318 		arsta = ath11k_sta_to_arsta(sta);
4319 
4320 		switch (key->cipher) {
4321 		case WLAN_CIPHER_SUITE_TKIP:
4322 		case WLAN_CIPHER_SUITE_CCMP:
4323 		case WLAN_CIPHER_SUITE_CCMP_256:
4324 		case WLAN_CIPHER_SUITE_GCMP:
4325 		case WLAN_CIPHER_SUITE_GCMP_256:
4326 			if (cmd == SET_KEY)
4327 				arsta->pn_type = HAL_PN_TYPE_WPA;
4328 			else
4329 				arsta->pn_type = HAL_PN_TYPE_NONE;
4330 			break;
4331 		default:
4332 			arsta->pn_type = HAL_PN_TYPE_NONE;
4333 			break;
4334 		}
4335 	}
4336 
4337 	spin_unlock_bh(&ab->base_lock);
4338 
4339 exit:
4340 	mutex_unlock(&ar->conf_mutex);
4341 	return ret;
4342 }
4343 
4344 static int
4345 ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar,
4346 				     enum nl80211_band band,
4347 				     const struct cfg80211_bitrate_mask *mask)
4348 {
4349 	int num_rates = 0;
4350 	int i;
4351 
4352 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
4353 		num_rates += hweight8(mask->control[band].ht_mcs[i]);
4354 
4355 	return num_rates;
4356 }
4357 
4358 static int
4359 ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar,
4360 				      enum nl80211_band band,
4361 				      const struct cfg80211_bitrate_mask *mask)
4362 {
4363 	int num_rates = 0;
4364 	int i;
4365 
4366 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
4367 		num_rates += hweight16(mask->control[band].vht_mcs[i]);
4368 
4369 	return num_rates;
4370 }
4371 
4372 static int
4373 ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
4374 				     enum nl80211_band band,
4375 				     const struct cfg80211_bitrate_mask *mask)
4376 {
4377 	int num_rates = 0;
4378 	int i;
4379 
4380 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
4381 		num_rates += hweight16(mask->control[band].he_mcs[i]);
4382 
4383 	return num_rates;
4384 }
4385 
4386 static int
4387 ath11k_mac_set_peer_vht_fixed_rate(struct ath11k_vif *arvif,
4388 				   struct ieee80211_sta *sta,
4389 				   const struct cfg80211_bitrate_mask *mask,
4390 				   enum nl80211_band band)
4391 {
4392 	struct ath11k *ar = arvif->ar;
4393 	u8 vht_rate, nss;
4394 	u32 rate_code;
4395 	int ret, i;
4396 
4397 	lockdep_assert_held(&ar->conf_mutex);
4398 
4399 	nss = 0;
4400 
4401 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
4402 		if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
4403 			nss = i + 1;
4404 			vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
4405 		}
4406 	}
4407 
4408 	if (!nss) {
4409 		ath11k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
4410 			    sta->addr);
4411 		return -EINVAL;
4412 	}
4413 
4414 	/* Avoid updating invalid nss as fixed rate*/
4415 	if (nss > sta->deflink.rx_nss)
4416 		return -EINVAL;
4417 
4418 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4419 		   "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
4420 		   sta->addr);
4421 
4422 	rate_code = ATH11K_HW_RATE_CODE(vht_rate, nss - 1,
4423 					WMI_RATE_PREAMBLE_VHT);
4424 	ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4425 					arvif->vdev_id,
4426 					WMI_PEER_PARAM_FIXED_RATE,
4427 					rate_code);
4428 	if (ret)
4429 		ath11k_warn(ar->ab,
4430 			    "failed to update STA %pM Fixed Rate %d: %d\n",
4431 			     sta->addr, rate_code, ret);
4432 
4433 	return ret;
4434 }
4435 
4436 static int
4437 ath11k_mac_set_peer_he_fixed_rate(struct ath11k_vif *arvif,
4438 				  struct ieee80211_sta *sta,
4439 				  const struct cfg80211_bitrate_mask *mask,
4440 				  enum nl80211_band band)
4441 {
4442 	struct ath11k *ar = arvif->ar;
4443 	u8 he_rate, nss;
4444 	u32 rate_code;
4445 	int ret, i;
4446 
4447 	lockdep_assert_held(&ar->conf_mutex);
4448 
4449 	nss = 0;
4450 
4451 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
4452 		if (hweight16(mask->control[band].he_mcs[i]) == 1) {
4453 			nss = i + 1;
4454 			he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
4455 		}
4456 	}
4457 
4458 	if (!nss) {
4459 		ath11k_warn(ar->ab, "No single he fixed rate found to set for %pM",
4460 			    sta->addr);
4461 		return -EINVAL;
4462 	}
4463 
4464 	/* Avoid updating invalid nss as fixed rate */
4465 	if (nss > sta->deflink.rx_nss)
4466 		return -EINVAL;
4467 
4468 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4469 		   "setting fixed he rate for peer %pM, device will not switch to any other selected rates",
4470 		   sta->addr);
4471 
4472 	rate_code = ATH11K_HW_RATE_CODE(he_rate, nss - 1,
4473 					WMI_RATE_PREAMBLE_HE);
4474 
4475 	ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4476 					arvif->vdev_id,
4477 					WMI_PEER_PARAM_FIXED_RATE,
4478 					rate_code);
4479 	if (ret)
4480 		ath11k_warn(ar->ab,
4481 			    "failed to update sta %pM fixed rate %d: %d\n",
4482 			    sta->addr, rate_code, ret);
4483 
4484 	return ret;
4485 }
4486 
4487 static int
4488 ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif,
4489 				  struct ieee80211_sta *sta,
4490 				  const struct cfg80211_bitrate_mask *mask,
4491 				  enum nl80211_band band)
4492 {
4493 	struct ath11k *ar = arvif->ar;
4494 	u8 ht_rate, nss = 0;
4495 	u32 rate_code;
4496 	int ret, i;
4497 
4498 	lockdep_assert_held(&ar->conf_mutex);
4499 
4500 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
4501 		if (hweight8(mask->control[band].ht_mcs[i]) == 1) {
4502 			nss = i + 1;
4503 			ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1;
4504 		}
4505 	}
4506 
4507 	if (!nss) {
4508 		ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM",
4509 			    sta->addr);
4510 		return -EINVAL;
4511 	}
4512 
4513 	/* Avoid updating invalid nss as fixed rate*/
4514 	if (nss > sta->deflink.rx_nss)
4515 		return -EINVAL;
4516 
4517 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4518 		   "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates",
4519 		   sta->addr);
4520 
4521 	rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1,
4522 					WMI_RATE_PREAMBLE_HT);
4523 	ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4524 					arvif->vdev_id,
4525 					WMI_PEER_PARAM_FIXED_RATE,
4526 					rate_code);
4527 	if (ret)
4528 		ath11k_warn(ar->ab,
4529 			    "failed to update STA %pM HT Fixed Rate %d: %d\n",
4530 			    sta->addr, rate_code, ret);
4531 
4532 	return ret;
4533 }
4534 
4535 static int ath11k_station_assoc(struct ath11k *ar,
4536 				struct ieee80211_vif *vif,
4537 				struct ieee80211_sta *sta,
4538 				bool reassoc)
4539 {
4540 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4541 	struct peer_assoc_params peer_arg;
4542 	int ret = 0;
4543 	struct cfg80211_chan_def def;
4544 	enum nl80211_band band;
4545 	struct cfg80211_bitrate_mask *mask;
4546 	u8 num_ht_rates, num_vht_rates, num_he_rates;
4547 
4548 	lockdep_assert_held(&ar->conf_mutex);
4549 
4550 	if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
4551 		return -EPERM;
4552 
4553 	band = def.chan->band;
4554 	mask = &arvif->bitrate_mask;
4555 
4556 	ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
4557 
4558 	peer_arg.is_assoc = true;
4559 	ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4560 	if (ret) {
4561 		ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4562 			    sta->addr, arvif->vdev_id, ret);
4563 		return ret;
4564 	}
4565 
4566 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
4567 		ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4568 			    sta->addr, arvif->vdev_id);
4569 		return -ETIMEDOUT;
4570 	}
4571 
4572 	num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
4573 	num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask);
4574 	num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask);
4575 
4576 	/* If single VHT/HE rate is configured (by set_bitrate_mask()),
4577 	 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
4578 	 * fixed param.
4579 	 * Note that all other rates and NSS will be disabled for this peer.
4580 	 */
4581 	if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4582 		ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4583 							 band);
4584 		if (ret)
4585 			return ret;
4586 	} else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4587 		ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4588 							band);
4589 		if (ret)
4590 			return ret;
4591 	} else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4592 		ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4593 							band);
4594 		if (ret)
4595 			return ret;
4596 	}
4597 
4598 	/* Re-assoc is run only to update supported rates for given station. It
4599 	 * doesn't make much sense to reconfigure the peer completely.
4600 	 */
4601 	if (reassoc)
4602 		return 0;
4603 
4604 	ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
4605 				     &sta->deflink.ht_cap,
4606 				     le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
4607 	if (ret) {
4608 		ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
4609 			    arvif->vdev_id, ret);
4610 		return ret;
4611 	}
4612 
4613 	if (!sta->wme) {
4614 		arvif->num_legacy_stations++;
4615 		ret = ath11k_recalc_rtscts_prot(arvif);
4616 		if (ret)
4617 			return ret;
4618 	}
4619 
4620 	if (sta->wme && sta->uapsd_queues) {
4621 		ret = ath11k_peer_assoc_qos_ap(ar, arvif, sta);
4622 		if (ret) {
4623 			ath11k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
4624 				    sta->addr, arvif->vdev_id, ret);
4625 			return ret;
4626 		}
4627 	}
4628 
4629 	return 0;
4630 }
4631 
4632 static int ath11k_station_disassoc(struct ath11k *ar,
4633 				   struct ieee80211_vif *vif,
4634 				   struct ieee80211_sta *sta)
4635 {
4636 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4637 	int ret = 0;
4638 
4639 	lockdep_assert_held(&ar->conf_mutex);
4640 
4641 	if (!sta->wme) {
4642 		arvif->num_legacy_stations--;
4643 		ret = ath11k_recalc_rtscts_prot(arvif);
4644 		if (ret)
4645 			return ret;
4646 	}
4647 
4648 	ret = ath11k_clear_peer_keys(arvif, sta->addr);
4649 	if (ret) {
4650 		ath11k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
4651 			    arvif->vdev_id, ret);
4652 		return ret;
4653 	}
4654 	return 0;
4655 }
4656 
4657 static u32 ath11k_mac_max_nss(const u8 *ht_mcs_mask, const u16 *vht_mcs_mask,
4658 			      const u16 *he_mcs_mask)
4659 {
4660 	return max3(ath11k_mac_max_ht_nss(ht_mcs_mask),
4661 		    ath11k_mac_max_vht_nss(vht_mcs_mask),
4662 		    ath11k_mac_max_he_nss(he_mcs_mask));
4663 }
4664 
4665 static void ath11k_sta_rc_update_wk(struct work_struct *wk)
4666 {
4667 	struct ath11k *ar;
4668 	struct ath11k_vif *arvif;
4669 	struct ath11k_sta *arsta;
4670 	struct ieee80211_sta *sta;
4671 	struct cfg80211_chan_def def;
4672 	enum nl80211_band band;
4673 	const u8 *ht_mcs_mask;
4674 	const u16 *vht_mcs_mask;
4675 	const u16 *he_mcs_mask;
4676 	u32 changed, bw, nss, smps, bw_prev;
4677 	int err, num_ht_rates, num_vht_rates, num_he_rates;
4678 	const struct cfg80211_bitrate_mask *mask;
4679 	struct peer_assoc_params peer_arg;
4680 	enum wmi_phy_mode peer_phymode;
4681 
4682 	arsta = container_of(wk, struct ath11k_sta, update_wk);
4683 	sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4684 	arvif = arsta->arvif;
4685 	ar = arvif->ar;
4686 
4687 	if (WARN_ON(ath11k_mac_vif_chan(arvif->vif, &def)))
4688 		return;
4689 
4690 	band = def.chan->band;
4691 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
4692 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
4693 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
4694 
4695 	spin_lock_bh(&ar->data_lock);
4696 
4697 	changed = arsta->changed;
4698 	arsta->changed = 0;
4699 
4700 	bw = arsta->bw;
4701 	bw_prev = arsta->bw_prev;
4702 	nss = arsta->nss;
4703 	smps = arsta->smps;
4704 
4705 	spin_unlock_bh(&ar->data_lock);
4706 
4707 	mutex_lock(&ar->conf_mutex);
4708 
4709 	nss = max_t(u32, 1, nss);
4710 	nss = min(nss, ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
4711 
4712 	if (changed & IEEE80211_RC_BW_CHANGED) {
4713 		/* Get the peer phymode */
4714 		ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
4715 		peer_phymode = peer_arg.peer_phymode;
4716 
4717 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM peer bw %d phymode %d\n",
4718 			   sta->addr, bw, peer_phymode);
4719 
4720 		if (bw > bw_prev) {
4721 			/* BW is upgraded. In this case we send WMI_PEER_PHYMODE
4722 			 * followed by WMI_PEER_CHWIDTH
4723 			 */
4724 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW upgrade for sta %pM new BW %d, old BW %d\n",
4725 				   sta->addr, bw, bw_prev);
4726 
4727 			err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4728 							WMI_PEER_PHYMODE, peer_phymode);
4729 
4730 			if (err) {
4731 				ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4732 					    sta->addr, peer_phymode, err);
4733 				goto err_rc_bw_changed;
4734 			}
4735 
4736 			err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4737 							WMI_PEER_CHWIDTH, bw);
4738 
4739 			if (err)
4740 				ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4741 					    sta->addr, bw, err);
4742 		} else {
4743 			/* BW is downgraded. In this case we send WMI_PEER_CHWIDTH
4744 			 * followed by WMI_PEER_PHYMODE
4745 			 */
4746 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "BW downgrade for sta %pM new BW %d,old BW %d\n",
4747 				   sta->addr, bw, bw_prev);
4748 
4749 			err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4750 							WMI_PEER_CHWIDTH, bw);
4751 
4752 			if (err) {
4753 				ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",
4754 					    sta->addr, bw, err);
4755 				goto err_rc_bw_changed;
4756 			}
4757 
4758 			err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4759 							WMI_PEER_PHYMODE, peer_phymode);
4760 
4761 			if (err)
4762 				ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",
4763 					    sta->addr, peer_phymode, err);
4764 		}
4765 	}
4766 
4767 	if (changed & IEEE80211_RC_NSS_CHANGED) {
4768 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM nss %d\n",
4769 			   sta->addr, nss);
4770 
4771 		err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4772 						WMI_PEER_NSS, nss);
4773 		if (err)
4774 			ath11k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
4775 				    sta->addr, nss, err);
4776 	}
4777 
4778 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
4779 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "update sta %pM smps %d\n",
4780 			   sta->addr, smps);
4781 
4782 		err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4783 						WMI_PEER_MIMO_PS_STATE, smps);
4784 		if (err)
4785 			ath11k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
4786 				    sta->addr, smps, err);
4787 	}
4788 
4789 	if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4790 		mask = &arvif->bitrate_mask;
4791 		num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band,
4792 								    mask);
4793 		num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
4794 								      mask);
4795 		num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
4796 								    mask);
4797 
4798 		/* Peer_assoc_prepare will reject vht rates in
4799 		 * bitrate_mask if its not available in range format and
4800 		 * sets vht tx_rateset as unsupported. So multiple VHT MCS
4801 		 * setting(eg. MCS 4,5,6) per peer is not supported here.
4802 		 * But, Single rate in VHT mask can be set as per-peer
4803 		 * fixed rate. But even if any HT rates are configured in
4804 		 * the bitrate mask, device will not switch to those rates
4805 		 * when per-peer Fixed rate is set.
4806 		 * TODO: Check RATEMASK_CMDID to support auto rates selection
4807 		 * across HT/VHT and for multiple VHT MCS support.
4808 		 */
4809 		if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
4810 			ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
4811 							   band);
4812 		} else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
4813 			ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
4814 							  band);
4815 		} else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) {
4816 			ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask,
4817 							  band);
4818 		} else {
4819 			/* If the peer is non-VHT/HE or no fixed VHT/HE rate
4820 			 * is provided in the new bitrate mask we set the
4821 			 * other rates using peer_assoc command. Also clear
4822 			 * the peer fixed rate settings as it has higher proprity
4823 			 * than peer assoc
4824 			 */
4825 			err = ath11k_wmi_set_peer_param(ar, sta->addr,
4826 							arvif->vdev_id,
4827 							WMI_PEER_PARAM_FIXED_RATE,
4828 							WMI_FIXED_RATE_NONE);
4829 			if (err)
4830 				ath11k_warn(ar->ab,
4831 					    "failed to disable peer fixed rate for sta %pM: %d\n",
4832 					    sta->addr, err);
4833 
4834 			ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
4835 						  &peer_arg, true);
4836 
4837 			peer_arg.is_assoc = false;
4838 			err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
4839 			if (err)
4840 				ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
4841 					    sta->addr, arvif->vdev_id, err);
4842 
4843 			if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
4844 				ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
4845 					    sta->addr, arvif->vdev_id);
4846 		}
4847 	}
4848 
4849 err_rc_bw_changed:
4850 	mutex_unlock(&ar->conf_mutex);
4851 }
4852 
4853 static void ath11k_sta_set_4addr_wk(struct work_struct *wk)
4854 {
4855 	struct ath11k *ar;
4856 	struct ath11k_vif *arvif;
4857 	struct ath11k_sta *arsta;
4858 	struct ieee80211_sta *sta;
4859 	int ret = 0;
4860 
4861 	arsta = container_of(wk, struct ath11k_sta, set_4addr_wk);
4862 	sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
4863 	arvif = arsta->arvif;
4864 	ar = arvif->ar;
4865 
4866 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
4867 		   "setting USE_4ADDR for peer %pM\n", sta->addr);
4868 
4869 	ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4870 					arvif->vdev_id,
4871 					WMI_PEER_USE_4ADDR, 1);
4872 
4873 	if (ret)
4874 		ath11k_warn(ar->ab, "failed to set peer %pM 4addr capability: %d\n",
4875 			    sta->addr, ret);
4876 }
4877 
4878 static int ath11k_mac_inc_num_stations(struct ath11k_vif *arvif,
4879 				       struct ieee80211_sta *sta)
4880 {
4881 	struct ath11k *ar = arvif->ar;
4882 
4883 	lockdep_assert_held(&ar->conf_mutex);
4884 
4885 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4886 		return 0;
4887 
4888 	if (ar->num_stations >= ar->max_num_stations)
4889 		return -ENOBUFS;
4890 
4891 	ar->num_stations++;
4892 
4893 	return 0;
4894 }
4895 
4896 static void ath11k_mac_dec_num_stations(struct ath11k_vif *arvif,
4897 					struct ieee80211_sta *sta)
4898 {
4899 	struct ath11k *ar = arvif->ar;
4900 
4901 	lockdep_assert_held(&ar->conf_mutex);
4902 
4903 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
4904 		return;
4905 
4906 	ar->num_stations--;
4907 }
4908 
4909 static int ath11k_mac_station_add(struct ath11k *ar,
4910 				  struct ieee80211_vif *vif,
4911 				  struct ieee80211_sta *sta)
4912 {
4913 	struct ath11k_base *ab = ar->ab;
4914 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
4915 	struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
4916 	struct peer_create_params peer_param;
4917 	int ret;
4918 
4919 	lockdep_assert_held(&ar->conf_mutex);
4920 
4921 	ret = ath11k_mac_inc_num_stations(arvif, sta);
4922 	if (ret) {
4923 		ath11k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
4924 			    ar->max_num_stations);
4925 		goto exit;
4926 	}
4927 
4928 	arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
4929 	if (!arsta->rx_stats) {
4930 		ret = -ENOMEM;
4931 		goto dec_num_station;
4932 	}
4933 
4934 	peer_param.vdev_id = arvif->vdev_id;
4935 	peer_param.peer_addr = sta->addr;
4936 	peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
4937 
4938 	ret = ath11k_peer_create(ar, arvif, sta, &peer_param);
4939 	if (ret) {
4940 		ath11k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
4941 			    sta->addr, arvif->vdev_id);
4942 		goto free_rx_stats;
4943 	}
4944 
4945 	ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
4946 		   sta->addr, arvif->vdev_id);
4947 
4948 	if (ath11k_debugfs_is_extd_tx_stats_enabled(ar)) {
4949 		arsta->tx_stats = kzalloc(sizeof(*arsta->tx_stats), GFP_KERNEL);
4950 		if (!arsta->tx_stats) {
4951 			ret = -ENOMEM;
4952 			goto free_peer;
4953 		}
4954 	}
4955 
4956 	if (ieee80211_vif_is_mesh(vif)) {
4957 		ath11k_dbg(ab, ATH11K_DBG_MAC,
4958 			   "setting USE_4ADDR for mesh STA %pM\n", sta->addr);
4959 		ret = ath11k_wmi_set_peer_param(ar, sta->addr,
4960 						arvif->vdev_id,
4961 						WMI_PEER_USE_4ADDR, 1);
4962 		if (ret) {
4963 			ath11k_warn(ab, "failed to set mesh STA %pM 4addr capability: %d\n",
4964 				    sta->addr, ret);
4965 			goto free_tx_stats;
4966 		}
4967 	}
4968 
4969 	ret = ath11k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
4970 	if (ret) {
4971 		ath11k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
4972 			    sta->addr, arvif->vdev_id, ret);
4973 		goto free_tx_stats;
4974 	}
4975 
4976 	if (ab->hw_params.vdev_start_delay &&
4977 	    !arvif->is_started &&
4978 	    arvif->vdev_type != WMI_VDEV_TYPE_AP) {
4979 		ret = ath11k_start_vdev_delay(ar->hw, vif);
4980 		if (ret) {
4981 			ath11k_warn(ab, "failed to delay vdev start: %d\n", ret);
4982 			goto free_tx_stats;
4983 		}
4984 	}
4985 
4986 	ewma_avg_rssi_init(&arsta->avg_rssi);
4987 	return 0;
4988 
4989 free_tx_stats:
4990 	kfree(arsta->tx_stats);
4991 	arsta->tx_stats = NULL;
4992 free_peer:
4993 	ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
4994 free_rx_stats:
4995 	kfree(arsta->rx_stats);
4996 	arsta->rx_stats = NULL;
4997 dec_num_station:
4998 	ath11k_mac_dec_num_stations(arvif, sta);
4999 exit:
5000 	return ret;
5001 }
5002 
5003 static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,
5004 					      struct ieee80211_sta *sta)
5005 {
5006 	u32 bw = WMI_PEER_CHWIDTH_20MHZ;
5007 
5008 	switch (sta->deflink.bandwidth) {
5009 	case IEEE80211_STA_RX_BW_20:
5010 		bw = WMI_PEER_CHWIDTH_20MHZ;
5011 		break;
5012 	case IEEE80211_STA_RX_BW_40:
5013 		bw = WMI_PEER_CHWIDTH_40MHZ;
5014 		break;
5015 	case IEEE80211_STA_RX_BW_80:
5016 		bw = WMI_PEER_CHWIDTH_80MHZ;
5017 		break;
5018 	case IEEE80211_STA_RX_BW_160:
5019 		bw = WMI_PEER_CHWIDTH_160MHZ;
5020 		break;
5021 	default:
5022 		ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n",
5023 			    sta->deflink.bandwidth, sta->addr);
5024 		bw = WMI_PEER_CHWIDTH_20MHZ;
5025 		break;
5026 	}
5027 
5028 	return bw;
5029 }
5030 
5031 static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
5032 				   struct ieee80211_vif *vif,
5033 				   struct ieee80211_sta *sta,
5034 				   enum ieee80211_sta_state old_state,
5035 				   enum ieee80211_sta_state new_state)
5036 {
5037 	struct ath11k *ar = hw->priv;
5038 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5039 	struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5040 	struct ath11k_peer *peer;
5041 	int ret = 0;
5042 
5043 	/* cancel must be done outside the mutex to avoid deadlock */
5044 	if ((old_state == IEEE80211_STA_NONE &&
5045 	     new_state == IEEE80211_STA_NOTEXIST)) {
5046 		cancel_work_sync(&arsta->update_wk);
5047 		cancel_work_sync(&arsta->set_4addr_wk);
5048 	}
5049 
5050 	mutex_lock(&ar->conf_mutex);
5051 
5052 	if (old_state == IEEE80211_STA_NOTEXIST &&
5053 	    new_state == IEEE80211_STA_NONE) {
5054 		memset(arsta, 0, sizeof(*arsta));
5055 		arsta->arvif = arvif;
5056 		arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
5057 		INIT_WORK(&arsta->update_wk, ath11k_sta_rc_update_wk);
5058 		INIT_WORK(&arsta->set_4addr_wk, ath11k_sta_set_4addr_wk);
5059 
5060 		ret = ath11k_mac_station_add(ar, vif, sta);
5061 		if (ret)
5062 			ath11k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
5063 				    sta->addr, arvif->vdev_id);
5064 	} else if ((old_state == IEEE80211_STA_NONE &&
5065 		    new_state == IEEE80211_STA_NOTEXIST)) {
5066 		bool skip_peer_delete = ar->ab->hw_params.vdev_start_delay &&
5067 			vif->type == NL80211_IFTYPE_STATION;
5068 
5069 		ath11k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
5070 
5071 		if (!skip_peer_delete) {
5072 			ret = ath11k_peer_delete(ar, arvif->vdev_id, sta->addr);
5073 			if (ret)
5074 				ath11k_warn(ar->ab,
5075 					    "Failed to delete peer: %pM for VDEV: %d\n",
5076 					    sta->addr, arvif->vdev_id);
5077 			else
5078 				ath11k_dbg(ar->ab,
5079 					   ATH11K_DBG_MAC,
5080 					   "Removed peer: %pM for VDEV: %d\n",
5081 					   sta->addr, arvif->vdev_id);
5082 		}
5083 
5084 		ath11k_mac_dec_num_stations(arvif, sta);
5085 		mutex_lock(&ar->ab->tbl_mtx_lock);
5086 		spin_lock_bh(&ar->ab->base_lock);
5087 		peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5088 		if (skip_peer_delete && peer) {
5089 			peer->sta = NULL;
5090 		} else if (peer && peer->sta == sta) {
5091 			ath11k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
5092 				    vif->addr, arvif->vdev_id);
5093 			ath11k_peer_rhash_delete(ar->ab, peer);
5094 			peer->sta = NULL;
5095 			list_del(&peer->list);
5096 			kfree(peer);
5097 			ar->num_peers--;
5098 		}
5099 		spin_unlock_bh(&ar->ab->base_lock);
5100 		mutex_unlock(&ar->ab->tbl_mtx_lock);
5101 
5102 		kfree(arsta->tx_stats);
5103 		arsta->tx_stats = NULL;
5104 
5105 		kfree(arsta->rx_stats);
5106 		arsta->rx_stats = NULL;
5107 	} else if (old_state == IEEE80211_STA_AUTH &&
5108 		   new_state == IEEE80211_STA_ASSOC &&
5109 		   (vif->type == NL80211_IFTYPE_AP ||
5110 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
5111 		    vif->type == NL80211_IFTYPE_ADHOC)) {
5112 		ret = ath11k_station_assoc(ar, vif, sta, false);
5113 		if (ret)
5114 			ath11k_warn(ar->ab, "Failed to associate station: %pM\n",
5115 				    sta->addr);
5116 
5117 		spin_lock_bh(&ar->data_lock);
5118 		/* Set arsta bw and prev bw */
5119 		arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5120 		arsta->bw_prev = arsta->bw;
5121 		spin_unlock_bh(&ar->data_lock);
5122 	} else if (old_state == IEEE80211_STA_ASSOC &&
5123 		   new_state == IEEE80211_STA_AUTHORIZED) {
5124 		spin_lock_bh(&ar->ab->base_lock);
5125 
5126 		peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5127 		if (peer)
5128 			peer->is_authorized = true;
5129 
5130 		spin_unlock_bh(&ar->ab->base_lock);
5131 
5132 		if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
5133 			ret = ath11k_wmi_set_peer_param(ar, sta->addr,
5134 							arvif->vdev_id,
5135 							WMI_PEER_AUTHORIZE,
5136 							1);
5137 			if (ret)
5138 				ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
5139 					    sta->addr, arvif->vdev_id, ret);
5140 		}
5141 	} else if (old_state == IEEE80211_STA_AUTHORIZED &&
5142 		   new_state == IEEE80211_STA_ASSOC) {
5143 		spin_lock_bh(&ar->ab->base_lock);
5144 
5145 		peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5146 		if (peer)
5147 			peer->is_authorized = false;
5148 
5149 		spin_unlock_bh(&ar->ab->base_lock);
5150 	} else if (old_state == IEEE80211_STA_ASSOC &&
5151 		   new_state == IEEE80211_STA_AUTH &&
5152 		   (vif->type == NL80211_IFTYPE_AP ||
5153 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
5154 		    vif->type == NL80211_IFTYPE_ADHOC)) {
5155 		ret = ath11k_station_disassoc(ar, vif, sta);
5156 		if (ret)
5157 			ath11k_warn(ar->ab, "Failed to disassociate station: %pM\n",
5158 				    sta->addr);
5159 	}
5160 
5161 	mutex_unlock(&ar->conf_mutex);
5162 	return ret;
5163 }
5164 
5165 static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
5166 				       struct ieee80211_vif *vif,
5167 				       struct ieee80211_sta *sta)
5168 {
5169 	struct ath11k *ar = hw->priv;
5170 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5171 	int ret = 0;
5172 	s16 txpwr;
5173 
5174 	if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
5175 		txpwr = 0;
5176 	} else {
5177 		txpwr = sta->deflink.txpwr.power;
5178 		if (!txpwr)
5179 			return -EINVAL;
5180 	}
5181 
5182 	if (txpwr > ATH11K_TX_POWER_MAX_VAL || txpwr < ATH11K_TX_POWER_MIN_VAL)
5183 		return -EINVAL;
5184 
5185 	mutex_lock(&ar->conf_mutex);
5186 
5187 	ret = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
5188 					WMI_PEER_USE_FIXED_PWR, txpwr);
5189 	if (ret) {
5190 		ath11k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
5191 			    ret);
5192 		goto out;
5193 	}
5194 
5195 out:
5196 	mutex_unlock(&ar->conf_mutex);
5197 	return ret;
5198 }
5199 
5200 static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
5201 					struct ieee80211_vif *vif,
5202 					struct ieee80211_sta *sta, bool enabled)
5203 {
5204 	struct ath11k *ar = hw->priv;
5205 	struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5206 
5207 	if (enabled && !arsta->use_4addr_set) {
5208 		ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
5209 		arsta->use_4addr_set = true;
5210 	}
5211 }
5212 
5213 static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
5214 					struct ieee80211_vif *vif,
5215 					struct ieee80211_sta *sta,
5216 					u32 changed)
5217 {
5218 	struct ath11k *ar = hw->priv;
5219 	struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
5220 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5221 	struct ath11k_peer *peer;
5222 	u32 bw, smps;
5223 
5224 	spin_lock_bh(&ar->ab->base_lock);
5225 
5226 	peer = ath11k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
5227 	if (!peer) {
5228 		spin_unlock_bh(&ar->ab->base_lock);
5229 		ath11k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
5230 			    sta->addr, arvif->vdev_id);
5231 		return;
5232 	}
5233 
5234 	spin_unlock_bh(&ar->ab->base_lock);
5235 
5236 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
5237 		   "sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
5238 		   sta->addr, changed, sta->deflink.bandwidth,
5239 		   sta->deflink.rx_nss,
5240 		   sta->deflink.smps_mode);
5241 
5242 	spin_lock_bh(&ar->data_lock);
5243 
5244 	if (changed & IEEE80211_RC_BW_CHANGED) {
5245 		bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
5246 		arsta->bw_prev = arsta->bw;
5247 		arsta->bw = bw;
5248 	}
5249 
5250 	if (changed & IEEE80211_RC_NSS_CHANGED)
5251 		arsta->nss = sta->deflink.rx_nss;
5252 
5253 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
5254 		smps = WMI_PEER_SMPS_PS_NONE;
5255 
5256 		switch (sta->deflink.smps_mode) {
5257 		case IEEE80211_SMPS_AUTOMATIC:
5258 		case IEEE80211_SMPS_OFF:
5259 			smps = WMI_PEER_SMPS_PS_NONE;
5260 			break;
5261 		case IEEE80211_SMPS_STATIC:
5262 			smps = WMI_PEER_SMPS_STATIC;
5263 			break;
5264 		case IEEE80211_SMPS_DYNAMIC:
5265 			smps = WMI_PEER_SMPS_DYNAMIC;
5266 			break;
5267 		default:
5268 			ath11k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
5269 				    sta->deflink.smps_mode, sta->addr);
5270 			smps = WMI_PEER_SMPS_PS_NONE;
5271 			break;
5272 		}
5273 
5274 		arsta->smps = smps;
5275 	}
5276 
5277 	arsta->changed |= changed;
5278 
5279 	spin_unlock_bh(&ar->data_lock);
5280 
5281 	ieee80211_queue_work(hw, &arsta->update_wk);
5282 }
5283 
5284 static int ath11k_conf_tx_uapsd(struct ath11k *ar, struct ieee80211_vif *vif,
5285 				u16 ac, bool enable)
5286 {
5287 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5288 	u32 value = 0;
5289 	int ret = 0;
5290 
5291 	if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
5292 		return 0;
5293 
5294 	switch (ac) {
5295 	case IEEE80211_AC_VO:
5296 		value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
5297 			WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
5298 		break;
5299 	case IEEE80211_AC_VI:
5300 		value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
5301 			WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
5302 		break;
5303 	case IEEE80211_AC_BE:
5304 		value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
5305 			WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
5306 		break;
5307 	case IEEE80211_AC_BK:
5308 		value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
5309 			WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
5310 		break;
5311 	}
5312 
5313 	if (enable)
5314 		arvif->u.sta.uapsd |= value;
5315 	else
5316 		arvif->u.sta.uapsd &= ~value;
5317 
5318 	ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5319 					  WMI_STA_PS_PARAM_UAPSD,
5320 					  arvif->u.sta.uapsd);
5321 	if (ret) {
5322 		ath11k_warn(ar->ab, "could not set uapsd params %d\n", ret);
5323 		goto exit;
5324 	}
5325 
5326 	if (arvif->u.sta.uapsd)
5327 		value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
5328 	else
5329 		value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5330 
5331 	ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5332 					  WMI_STA_PS_PARAM_RX_WAKE_POLICY,
5333 					  value);
5334 	if (ret)
5335 		ath11k_warn(ar->ab, "could not set rx wake param %d\n", ret);
5336 
5337 exit:
5338 	return ret;
5339 }
5340 
5341 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
5342 				 struct ieee80211_vif *vif,
5343 				 unsigned int link_id, u16 ac,
5344 				 const struct ieee80211_tx_queue_params *params)
5345 {
5346 	struct ath11k *ar = hw->priv;
5347 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
5348 	struct wmi_wmm_params_arg *p = NULL;
5349 	int ret;
5350 
5351 	mutex_lock(&ar->conf_mutex);
5352 
5353 	switch (ac) {
5354 	case IEEE80211_AC_VO:
5355 		p = &arvif->wmm_params.ac_vo;
5356 		break;
5357 	case IEEE80211_AC_VI:
5358 		p = &arvif->wmm_params.ac_vi;
5359 		break;
5360 	case IEEE80211_AC_BE:
5361 		p = &arvif->wmm_params.ac_be;
5362 		break;
5363 	case IEEE80211_AC_BK:
5364 		p = &arvif->wmm_params.ac_bk;
5365 		break;
5366 	}
5367 
5368 	if (WARN_ON(!p)) {
5369 		ret = -EINVAL;
5370 		goto exit;
5371 	}
5372 
5373 	p->cwmin = params->cw_min;
5374 	p->cwmax = params->cw_max;
5375 	p->aifs = params->aifs;
5376 	p->txop = params->txop;
5377 
5378 	ret = ath11k_wmi_send_wmm_update_cmd_tlv(ar, arvif->vdev_id,
5379 						 &arvif->wmm_params);
5380 	if (ret) {
5381 		ath11k_warn(ar->ab, "failed to set wmm params: %d\n", ret);
5382 		goto exit;
5383 	}
5384 
5385 	ret = ath11k_conf_tx_uapsd(ar, vif, ac, params->uapsd);
5386 
5387 	if (ret)
5388 		ath11k_warn(ar->ab, "failed to set sta uapsd: %d\n", ret);
5389 
5390 exit:
5391 	mutex_unlock(&ar->conf_mutex);
5392 	return ret;
5393 }
5394 
5395 static struct ieee80211_sta_ht_cap
5396 ath11k_create_ht_cap(struct ath11k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
5397 {
5398 	int i;
5399 	struct ieee80211_sta_ht_cap ht_cap = {0};
5400 	u32 ar_vht_cap = ar->pdev->cap.vht_cap;
5401 
5402 	if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
5403 		return ht_cap;
5404 
5405 	ht_cap.ht_supported = 1;
5406 	ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
5407 	ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
5408 	ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
5409 	ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
5410 	ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
5411 
5412 	if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
5413 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
5414 
5415 	if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
5416 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
5417 
5418 	if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
5419 		u32 smps;
5420 
5421 		smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
5422 		smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
5423 
5424 		ht_cap.cap |= smps;
5425 	}
5426 
5427 	if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
5428 		ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
5429 
5430 	if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
5431 		u32 stbc;
5432 
5433 		stbc   = ar_ht_cap;
5434 		stbc  &= WMI_HT_CAP_RX_STBC;
5435 		stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
5436 		stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
5437 		stbc  &= IEEE80211_HT_CAP_RX_STBC;
5438 
5439 		ht_cap.cap |= stbc;
5440 	}
5441 
5442 	if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
5443 		ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
5444 
5445 	if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
5446 		ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
5447 
5448 	if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
5449 		ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
5450 
5451 	for (i = 0; i < ar->num_rx_chains; i++) {
5452 		if (rate_cap_rx_chainmask & BIT(i))
5453 			ht_cap.mcs.rx_mask[i] = 0xFF;
5454 	}
5455 
5456 	ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
5457 
5458 	return ht_cap;
5459 }
5460 
5461 static int ath11k_mac_set_txbf_conf(struct ath11k_vif *arvif)
5462 {
5463 	u32 value = 0;
5464 	struct ath11k *ar = arvif->ar;
5465 	int nsts;
5466 	int sound_dim;
5467 	u32 vht_cap = ar->pdev->cap.vht_cap;
5468 	u32 vdev_param = WMI_VDEV_PARAM_TXBF;
5469 
5470 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
5471 		nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5472 		nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5473 		if (nsts > (ar->num_rx_chains - 1))
5474 			nsts = ar->num_rx_chains - 1;
5475 		value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
5476 	}
5477 
5478 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
5479 		sound_dim = vht_cap &
5480 			    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5481 		sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5482 		if (sound_dim > (ar->num_tx_chains - 1))
5483 			sound_dim = ar->num_tx_chains - 1;
5484 		value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
5485 	}
5486 
5487 	if (!value)
5488 		return 0;
5489 
5490 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
5491 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
5492 
5493 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
5494 		    arvif->vdev_type == WMI_VDEV_TYPE_AP)
5495 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
5496 	}
5497 
5498 	/* TODO: SUBFEE not validated in HK, disable here until validated? */
5499 
5500 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
5501 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
5502 
5503 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
5504 		    arvif->vdev_type == WMI_VDEV_TYPE_STA)
5505 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
5506 	}
5507 
5508 	return ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5509 					     vdev_param, value);
5510 }
5511 
5512 static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
5513 {
5514 	bool subfer, subfee;
5515 	int sound_dim = 0, nsts = 0;
5516 
5517 	subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
5518 	subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
5519 
5520 	if (ar->num_tx_chains < 2) {
5521 		*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
5522 		subfer = false;
5523 	}
5524 
5525 	if (ar->num_rx_chains < 2) {
5526 		*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
5527 		subfee = false;
5528 	}
5529 
5530 	/* If SU Beaformer is not set, then disable MU Beamformer Capability */
5531 	if (!subfer)
5532 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
5533 
5534 	/* If SU Beaformee is not set, then disable MU Beamformee Capability */
5535 	if (!subfee)
5536 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
5537 
5538 	sound_dim = (*vht_cap & IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
5539 	sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5540 	*vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5541 
5542 	nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
5543 	nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5544 	*vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5545 
5546 	/* Enable Sounding Dimension Field only if SU BF is enabled */
5547 	if (subfer) {
5548 		if (sound_dim > (ar->num_tx_chains - 1))
5549 			sound_dim = ar->num_tx_chains - 1;
5550 
5551 		sound_dim <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
5552 		sound_dim &=  IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
5553 		*vht_cap |= sound_dim;
5554 	}
5555 
5556 	/* Enable Beamformee STS Field only if SU BF is enabled */
5557 	if (subfee) {
5558 		if (nsts > (ar->num_rx_chains - 1))
5559 			nsts = ar->num_rx_chains - 1;
5560 
5561 		nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
5562 		nsts &=  IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
5563 		*vht_cap |= nsts;
5564 	}
5565 }
5566 
5567 static struct ieee80211_sta_vht_cap
5568 ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
5569 		      u32 rate_cap_rx_chainmask)
5570 {
5571 	struct ieee80211_sta_vht_cap vht_cap = {0};
5572 	u16 txmcs_map, rxmcs_map;
5573 	int i;
5574 
5575 	vht_cap.vht_supported = 1;
5576 	vht_cap.cap = ar->pdev->cap.vht_cap;
5577 
5578 	if (ar->pdev->cap.nss_ratio_enabled)
5579 		vht_cap.vht_mcs.tx_highest |=
5580 			cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
5581 
5582 	ath11k_set_vht_txbf_cap(ar, &vht_cap.cap);
5583 
5584 	rxmcs_map = 0;
5585 	txmcs_map = 0;
5586 	for (i = 0; i < 8; i++) {
5587 		if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
5588 			txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5589 		else
5590 			txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5591 
5592 		if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
5593 			rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
5594 		else
5595 			rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
5596 	}
5597 
5598 	if (rate_cap_tx_chainmask <= 1)
5599 		vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
5600 
5601 	vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
5602 	vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
5603 
5604 	return vht_cap;
5605 }
5606 
5607 static void ath11k_mac_setup_ht_vht_cap(struct ath11k *ar,
5608 					struct ath11k_pdev_cap *cap,
5609 					u32 *ht_cap_info)
5610 {
5611 	struct ieee80211_supported_band *band;
5612 	u32 rate_cap_tx_chainmask;
5613 	u32 rate_cap_rx_chainmask;
5614 	u32 ht_cap;
5615 
5616 	rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
5617 	rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
5618 
5619 	if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5620 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5621 		ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
5622 		if (ht_cap_info)
5623 			*ht_cap_info = ht_cap;
5624 		band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5625 						    rate_cap_rx_chainmask);
5626 	}
5627 
5628 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5629 	    (ar->ab->hw_params.single_pdev_only ||
5630 	     !ar->supports_6ghz)) {
5631 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5632 		ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
5633 		if (ht_cap_info)
5634 			*ht_cap_info = ht_cap;
5635 		band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
5636 						    rate_cap_rx_chainmask);
5637 		band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
5638 						      rate_cap_rx_chainmask);
5639 	}
5640 }
5641 
5642 static int ath11k_check_chain_mask(struct ath11k *ar, u32 ant, bool is_tx_ant)
5643 {
5644 	/* TODO: Check the request chainmask against the supported
5645 	 * chainmask table which is advertised in extented_service_ready event
5646 	 */
5647 
5648 	return 0;
5649 }
5650 
5651 static void ath11k_gen_ppe_thresh(struct ath11k_ppe_threshold *fw_ppet,
5652 				  u8 *he_ppet)
5653 {
5654 	int nss, ru;
5655 	u8 bit = 7;
5656 
5657 	he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
5658 	he_ppet[0] |= (fw_ppet->ru_bit_mask <<
5659 		       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
5660 		      IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
5661 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
5662 		for (ru = 0; ru < 4; ru++) {
5663 			u8 val;
5664 			int i;
5665 
5666 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
5667 				continue;
5668 			val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
5669 			       0x3f;
5670 			val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
5671 			for (i = 5; i >= 0; i--) {
5672 				he_ppet[bit / 8] |=
5673 					((val >> i) & 0x1) << ((bit % 8));
5674 				bit++;
5675 			}
5676 		}
5677 	}
5678 }
5679 
5680 static void
5681 ath11k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
5682 {
5683 	u8 m;
5684 
5685 	m = IEEE80211_HE_MAC_CAP0_TWT_RES |
5686 	    IEEE80211_HE_MAC_CAP0_TWT_REQ;
5687 	he_cap_elem->mac_cap_info[0] &= ~m;
5688 
5689 	m = IEEE80211_HE_MAC_CAP2_TRS |
5690 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5691 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5692 	he_cap_elem->mac_cap_info[2] &= ~m;
5693 
5694 	m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
5695 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
5696 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
5697 	he_cap_elem->mac_cap_info[3] &= ~m;
5698 
5699 	m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
5700 	    IEEE80211_HE_MAC_CAP4_BQR;
5701 	he_cap_elem->mac_cap_info[4] &= ~m;
5702 
5703 	m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
5704 	    IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
5705 	    IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
5706 	    IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
5707 	he_cap_elem->mac_cap_info[5] &= ~m;
5708 
5709 	m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
5710 	    IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
5711 	he_cap_elem->phy_cap_info[2] &= ~m;
5712 
5713 	m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
5714 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
5715 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
5716 	he_cap_elem->phy_cap_info[3] &= ~m;
5717 
5718 	m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
5719 	he_cap_elem->phy_cap_info[4] &= ~m;
5720 
5721 	m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
5722 	he_cap_elem->phy_cap_info[5] &= ~m;
5723 
5724 	m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
5725 	    IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
5726 	    IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
5727 	    IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
5728 	he_cap_elem->phy_cap_info[6] &= ~m;
5729 
5730 	m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
5731 	    IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
5732 	    IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
5733 	    IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
5734 	he_cap_elem->phy_cap_info[7] &= ~m;
5735 
5736 	m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
5737 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
5738 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
5739 	    IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
5740 	he_cap_elem->phy_cap_info[8] &= ~m;
5741 
5742 	m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
5743 	    IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
5744 	    IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
5745 	    IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
5746 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
5747 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
5748 	he_cap_elem->phy_cap_info[9] &= ~m;
5749 }
5750 
5751 static __le16 ath11k_mac_setup_he_6ghz_cap(struct ath11k_pdev_cap *pcap,
5752 					   struct ath11k_band_cap *bcap)
5753 {
5754 	u8 val;
5755 
5756 	bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
5757 	if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
5758 		bcap->he_6ghz_capa |=
5759 			FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5760 				   WLAN_HT_CAP_SM_PS_DYNAMIC);
5761 	else
5762 		bcap->he_6ghz_capa |=
5763 			FIELD_PREP(IEEE80211_HE_6GHZ_CAP_SM_PS,
5764 				   WLAN_HT_CAP_SM_PS_DISABLED);
5765 	val = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
5766 			pcap->vht_cap);
5767 	bcap->he_6ghz_capa |=
5768 		FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP, val);
5769 	val = FIELD_GET(IEEE80211_VHT_CAP_MAX_MPDU_MASK, pcap->vht_cap);
5770 	bcap->he_6ghz_capa |=
5771 		FIELD_PREP(IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN, val);
5772 	if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
5773 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
5774 	if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
5775 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
5776 
5777 	return cpu_to_le16(bcap->he_6ghz_capa);
5778 }
5779 
5780 static void ath11k_mac_set_hemcsmap(struct ath11k *ar,
5781 				    struct ath11k_pdev_cap *cap,
5782 				    struct ieee80211_sta_he_cap *he_cap,
5783 				    int band)
5784 {
5785 	u16 txmcs_map, rxmcs_map;
5786 	u32 i;
5787 
5788 	rxmcs_map = 0;
5789 	txmcs_map = 0;
5790 	for (i = 0; i < 8; i++) {
5791 		if (i < ar->num_tx_chains &&
5792 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5793 			txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5794 		else
5795 			txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5796 
5797 		if (i < ar->num_rx_chains &&
5798 		    (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
5799 			rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
5800 		else
5801 			rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
5802 	}
5803 	he_cap->he_mcs_nss_supp.rx_mcs_80 =
5804 		cpu_to_le16(rxmcs_map & 0xffff);
5805 	he_cap->he_mcs_nss_supp.tx_mcs_80 =
5806 		cpu_to_le16(txmcs_map & 0xffff);
5807 	he_cap->he_mcs_nss_supp.rx_mcs_160 =
5808 		cpu_to_le16(rxmcs_map & 0xffff);
5809 	he_cap->he_mcs_nss_supp.tx_mcs_160 =
5810 		cpu_to_le16(txmcs_map & 0xffff);
5811 	he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
5812 		cpu_to_le16(rxmcs_map & 0xffff);
5813 	he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
5814 		cpu_to_le16(txmcs_map & 0xffff);
5815 }
5816 
5817 static int ath11k_mac_copy_he_cap(struct ath11k *ar,
5818 				  struct ath11k_pdev_cap *cap,
5819 				  struct ieee80211_sband_iftype_data *data,
5820 				  int band)
5821 {
5822 	int i, idx = 0;
5823 
5824 	for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
5825 		struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
5826 		struct ath11k_band_cap *band_cap = &cap->band[band];
5827 		struct ieee80211_he_cap_elem *he_cap_elem =
5828 				&he_cap->he_cap_elem;
5829 
5830 		switch (i) {
5831 		case NL80211_IFTYPE_STATION:
5832 		case NL80211_IFTYPE_AP:
5833 		case NL80211_IFTYPE_MESH_POINT:
5834 			break;
5835 
5836 		default:
5837 			continue;
5838 		}
5839 
5840 		data[idx].types_mask = BIT(i);
5841 		he_cap->has_he = true;
5842 		memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
5843 		       sizeof(he_cap_elem->mac_cap_info));
5844 		memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
5845 		       sizeof(he_cap_elem->phy_cap_info));
5846 
5847 		he_cap_elem->mac_cap_info[1] &=
5848 			IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
5849 
5850 		he_cap_elem->phy_cap_info[5] &=
5851 			~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
5852 		he_cap_elem->phy_cap_info[5] |= ar->num_tx_chains - 1;
5853 
5854 		switch (i) {
5855 		case NL80211_IFTYPE_AP:
5856 			he_cap_elem->phy_cap_info[3] &=
5857 				~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
5858 			he_cap_elem->phy_cap_info[9] |=
5859 				IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
5860 			break;
5861 		case NL80211_IFTYPE_STATION:
5862 			he_cap_elem->mac_cap_info[0] &=
5863 				~IEEE80211_HE_MAC_CAP0_TWT_RES;
5864 			he_cap_elem->mac_cap_info[0] |=
5865 				IEEE80211_HE_MAC_CAP0_TWT_REQ;
5866 			he_cap_elem->phy_cap_info[9] |=
5867 				IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
5868 			break;
5869 		case NL80211_IFTYPE_MESH_POINT:
5870 			ath11k_mac_filter_he_cap_mesh(he_cap_elem);
5871 			break;
5872 		}
5873 
5874 		ath11k_mac_set_hemcsmap(ar, cap, he_cap, band);
5875 
5876 		memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
5877 		if (he_cap_elem->phy_cap_info[6] &
5878 		    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
5879 			ath11k_gen_ppe_thresh(&band_cap->he_ppet,
5880 					      he_cap->ppe_thres);
5881 
5882 		if (band == NL80211_BAND_6GHZ) {
5883 			data[idx].he_6ghz_capa.capa =
5884 				ath11k_mac_setup_he_6ghz_cap(cap, band_cap);
5885 		}
5886 		idx++;
5887 	}
5888 
5889 	return idx;
5890 }
5891 
5892 static void ath11k_mac_setup_he_cap(struct ath11k *ar,
5893 				    struct ath11k_pdev_cap *cap)
5894 {
5895 	struct ieee80211_supported_band *band;
5896 	int count;
5897 
5898 	if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
5899 		count = ath11k_mac_copy_he_cap(ar, cap,
5900 					       ar->mac.iftype[NL80211_BAND_2GHZ],
5901 					       NL80211_BAND_2GHZ);
5902 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
5903 		_ieee80211_set_sband_iftype_data(band,
5904 						 ar->mac.iftype[NL80211_BAND_2GHZ],
5905 						 count);
5906 	}
5907 
5908 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
5909 		count = ath11k_mac_copy_he_cap(ar, cap,
5910 					       ar->mac.iftype[NL80211_BAND_5GHZ],
5911 					       NL80211_BAND_5GHZ);
5912 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
5913 		_ieee80211_set_sband_iftype_data(band,
5914 						 ar->mac.iftype[NL80211_BAND_5GHZ],
5915 						 count);
5916 	}
5917 
5918 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
5919 	    ar->supports_6ghz) {
5920 		count = ath11k_mac_copy_he_cap(ar, cap,
5921 					       ar->mac.iftype[NL80211_BAND_6GHZ],
5922 					       NL80211_BAND_6GHZ);
5923 		band = &ar->mac.sbands[NL80211_BAND_6GHZ];
5924 		_ieee80211_set_sband_iftype_data(band,
5925 						 ar->mac.iftype[NL80211_BAND_6GHZ],
5926 						 count);
5927 	}
5928 }
5929 
5930 static int __ath11k_set_antenna(struct ath11k *ar, u32 tx_ant, u32 rx_ant)
5931 {
5932 	int ret;
5933 
5934 	lockdep_assert_held(&ar->conf_mutex);
5935 
5936 	if (ath11k_check_chain_mask(ar, tx_ant, true))
5937 		return -EINVAL;
5938 
5939 	if (ath11k_check_chain_mask(ar, rx_ant, false))
5940 		return -EINVAL;
5941 
5942 	ar->cfg_tx_chainmask = tx_ant;
5943 	ar->cfg_rx_chainmask = rx_ant;
5944 
5945 	if (ar->state != ATH11K_STATE_ON &&
5946 	    ar->state != ATH11K_STATE_RESTARTED)
5947 		return 0;
5948 
5949 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5950 					tx_ant, ar->pdev->pdev_id);
5951 	if (ret) {
5952 		ath11k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5953 			    ret, tx_ant);
5954 		return ret;
5955 	}
5956 
5957 	ar->num_tx_chains = get_num_chains(tx_ant);
5958 
5959 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5960 					rx_ant, ar->pdev->pdev_id);
5961 	if (ret) {
5962 		ath11k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5963 			    ret, rx_ant);
5964 		return ret;
5965 	}
5966 
5967 	ar->num_rx_chains = get_num_chains(rx_ant);
5968 
5969 	/* Reload HT/VHT/HE capability */
5970 	ath11k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5971 	ath11k_mac_setup_he_cap(ar, &ar->pdev->cap);
5972 
5973 	return 0;
5974 }
5975 
5976 static void ath11k_mgmt_over_wmi_tx_drop(struct ath11k *ar, struct sk_buff *skb)
5977 {
5978 	int num_mgmt;
5979 
5980 	ieee80211_free_txskb(ar->hw, skb);
5981 
5982 	num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5983 
5984 	if (num_mgmt < 0)
5985 		WARN_ON_ONCE(1);
5986 
5987 	if (!num_mgmt)
5988 		wake_up(&ar->txmgmt_empty_waitq);
5989 }
5990 
5991 static void ath11k_mac_tx_mgmt_free(struct ath11k *ar, int buf_id)
5992 {
5993 	struct sk_buff *msdu;
5994 	struct ieee80211_tx_info *info;
5995 
5996 	spin_lock_bh(&ar->txmgmt_idr_lock);
5997 	msdu = idr_remove(&ar->txmgmt_idr, buf_id);
5998 	spin_unlock_bh(&ar->txmgmt_idr_lock);
5999 
6000 	if (!msdu)
6001 		return;
6002 
6003 	dma_unmap_single(ar->ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
6004 			 DMA_TO_DEVICE);
6005 
6006 	info = IEEE80211_SKB_CB(msdu);
6007 	memset(&info->status, 0, sizeof(info->status));
6008 
6009 	ath11k_mgmt_over_wmi_tx_drop(ar, msdu);
6010 }
6011 
6012 int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
6013 {
6014 	struct ath11k *ar = ctx;
6015 
6016 	ath11k_mac_tx_mgmt_free(ar, buf_id);
6017 
6018 	return 0;
6019 }
6020 
6021 static int ath11k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
6022 {
6023 	struct ieee80211_vif *vif = ctx;
6024 	struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
6025 	struct ath11k *ar = skb_cb->ar;
6026 
6027 	if (skb_cb->vif == vif)
6028 		ath11k_mac_tx_mgmt_free(ar, buf_id);
6029 
6030 	return 0;
6031 }
6032 
6033 static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
6034 				  struct sk_buff *skb)
6035 {
6036 	struct ath11k_base *ab = ar->ab;
6037 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
6038 	struct ieee80211_tx_info *info;
6039 	dma_addr_t paddr;
6040 	int buf_id;
6041 	int ret;
6042 
6043 	ATH11K_SKB_CB(skb)->ar = ar;
6044 
6045 	spin_lock_bh(&ar->txmgmt_idr_lock);
6046 	buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
6047 			   ATH11K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
6048 	spin_unlock_bh(&ar->txmgmt_idr_lock);
6049 
6050 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
6051 		   "tx mgmt frame, buf id %d\n", buf_id);
6052 
6053 	if (buf_id < 0)
6054 		return -ENOSPC;
6055 
6056 	info = IEEE80211_SKB_CB(skb);
6057 	if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
6058 		if ((ieee80211_is_action(hdr->frame_control) ||
6059 		     ieee80211_is_deauth(hdr->frame_control) ||
6060 		     ieee80211_is_disassoc(hdr->frame_control)) &&
6061 		     ieee80211_has_protected(hdr->frame_control)) {
6062 			skb_put(skb, IEEE80211_CCMP_MIC_LEN);
6063 		}
6064 	}
6065 
6066 	paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
6067 	if (dma_mapping_error(ab->dev, paddr)) {
6068 		ath11k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
6069 		ret = -EIO;
6070 		goto err_free_idr;
6071 	}
6072 
6073 	ATH11K_SKB_CB(skb)->paddr = paddr;
6074 
6075 	ret = ath11k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
6076 	if (ret) {
6077 		ath11k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
6078 		goto err_unmap_buf;
6079 	}
6080 
6081 	return 0;
6082 
6083 err_unmap_buf:
6084 	dma_unmap_single(ab->dev, ATH11K_SKB_CB(skb)->paddr,
6085 			 skb->len, DMA_TO_DEVICE);
6086 err_free_idr:
6087 	spin_lock_bh(&ar->txmgmt_idr_lock);
6088 	idr_remove(&ar->txmgmt_idr, buf_id);
6089 	spin_unlock_bh(&ar->txmgmt_idr_lock);
6090 
6091 	return ret;
6092 }
6093 
6094 static void ath11k_mgmt_over_wmi_tx_purge(struct ath11k *ar)
6095 {
6096 	struct sk_buff *skb;
6097 
6098 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
6099 		ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6100 }
6101 
6102 static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work)
6103 {
6104 	struct ath11k *ar = container_of(work, struct ath11k, wmi_mgmt_tx_work);
6105 	struct ath11k_skb_cb *skb_cb;
6106 	struct ath11k_vif *arvif;
6107 	struct sk_buff *skb;
6108 	int ret;
6109 
6110 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
6111 		skb_cb = ATH11K_SKB_CB(skb);
6112 		if (!skb_cb->vif) {
6113 			ath11k_warn(ar->ab, "no vif found for mgmt frame\n");
6114 			ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6115 			continue;
6116 		}
6117 
6118 		arvif = ath11k_vif_to_arvif(skb_cb->vif);
6119 		mutex_lock(&ar->conf_mutex);
6120 		if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
6121 			ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb);
6122 			if (ret) {
6123 				ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
6124 					    arvif->vdev_id, ret);
6125 				ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6126 			} else {
6127 				ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
6128 					   "tx mgmt frame, vdev_id %d\n",
6129 					   arvif->vdev_id);
6130 			}
6131 		} else {
6132 			ath11k_warn(ar->ab,
6133 				    "dropping mgmt frame for vdev %d, is_started %d\n",
6134 				    arvif->vdev_id,
6135 				    arvif->is_started);
6136 			ath11k_mgmt_over_wmi_tx_drop(ar, skb);
6137 		}
6138 		mutex_unlock(&ar->conf_mutex);
6139 	}
6140 }
6141 
6142 static int ath11k_mac_mgmt_tx(struct ath11k *ar, struct sk_buff *skb,
6143 			      bool is_prb_rsp)
6144 {
6145 	struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
6146 
6147 	if (test_bit(ATH11K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
6148 		return -ESHUTDOWN;
6149 
6150 	/* Drop probe response packets when the pending management tx
6151 	 * count has reached a certain threshold, so as to prioritize
6152 	 * other mgmt packets like auth and assoc to be sent on time
6153 	 * for establishing successful connections.
6154 	 */
6155 	if (is_prb_rsp &&
6156 	    atomic_read(&ar->num_pending_mgmt_tx) > ATH11K_PRB_RSP_DROP_THRESHOLD) {
6157 		ath11k_warn(ar->ab,
6158 			    "dropping probe response as pending queue is almost full\n");
6159 		return -ENOSPC;
6160 	}
6161 
6162 	if (skb_queue_len_lockless(q) >= ATH11K_TX_MGMT_NUM_PENDING_MAX) {
6163 		ath11k_warn(ar->ab, "mgmt tx queue is full\n");
6164 		return -ENOSPC;
6165 	}
6166 
6167 	skb_queue_tail(q, skb);
6168 	atomic_inc(&ar->num_pending_mgmt_tx);
6169 	queue_work(ar->ab->workqueue_aux, &ar->wmi_mgmt_tx_work);
6170 
6171 	return 0;
6172 }
6173 
6174 static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
6175 			     struct ieee80211_tx_control *control,
6176 			     struct sk_buff *skb)
6177 {
6178 	struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6179 	struct ath11k *ar = hw->priv;
6180 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
6181 	struct ieee80211_vif *vif = info->control.vif;
6182 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6183 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
6184 	struct ieee80211_key_conf *key = info->control.hw_key;
6185 	struct ath11k_sta *arsta = NULL;
6186 	u32 info_flags = info->flags;
6187 	bool is_prb_rsp;
6188 	int ret;
6189 
6190 	memset(skb_cb, 0, sizeof(*skb_cb));
6191 	skb_cb->vif = vif;
6192 
6193 	if (key) {
6194 		skb_cb->cipher = key->cipher;
6195 		skb_cb->flags |= ATH11K_SKB_CIPHER_SET;
6196 	}
6197 
6198 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
6199 		skb_cb->flags |= ATH11K_SKB_HW_80211_ENCAP;
6200 	} else if (ieee80211_is_mgmt(hdr->frame_control)) {
6201 		is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
6202 		ret = ath11k_mac_mgmt_tx(ar, skb, is_prb_rsp);
6203 		if (ret) {
6204 			ath11k_warn(ar->ab, "failed to queue management frame %d\n",
6205 				    ret);
6206 			ieee80211_free_txskb(ar->hw, skb);
6207 		}
6208 		return;
6209 	}
6210 
6211 	if (control->sta)
6212 		arsta = ath11k_sta_to_arsta(control->sta);
6213 
6214 	ret = ath11k_dp_tx(ar, arvif, arsta, skb);
6215 	if (unlikely(ret)) {
6216 		ath11k_warn(ar->ab, "failed to transmit frame %d\n", ret);
6217 		ieee80211_free_txskb(ar->hw, skb);
6218 	}
6219 }
6220 
6221 void ath11k_mac_drain_tx(struct ath11k *ar)
6222 {
6223 	/* make sure rcu-protected mac80211 tx path itself is drained */
6224 	synchronize_net();
6225 
6226 	cancel_work_sync(&ar->wmi_mgmt_tx_work);
6227 	ath11k_mgmt_over_wmi_tx_purge(ar);
6228 }
6229 
6230 static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable)
6231 {
6232 	struct htt_rx_ring_tlv_filter tlv_filter = {0};
6233 	struct ath11k_base *ab = ar->ab;
6234 	int i, ret = 0;
6235 	u32 ring_id;
6236 
6237 	if (enable) {
6238 		tlv_filter = ath11k_mac_mon_status_filter_default;
6239 		if (ath11k_debugfs_rx_filter(ar))
6240 			tlv_filter.rx_filter = ath11k_debugfs_rx_filter(ar);
6241 	}
6242 
6243 	for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) {
6244 		ring_id = ar->dp.rx_mon_status_refill_ring[i].refill_buf_ring.ring_id;
6245 		ret = ath11k_dp_tx_htt_rx_filter_setup(ar->ab, ring_id,
6246 						       ar->dp.mac_id + i,
6247 						       HAL_RXDMA_MONITOR_STATUS,
6248 						       DP_RX_BUFFER_SIZE,
6249 						       &tlv_filter);
6250 	}
6251 
6252 	if (enable && !ar->ab->hw_params.rxdma1_enable)
6253 		mod_timer(&ar->ab->mon_reap_timer, jiffies +
6254 			  msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL));
6255 
6256 	return ret;
6257 }
6258 
6259 static void ath11k_mac_wait_reconfigure(struct ath11k_base *ab)
6260 {
6261 	int recovery_start_count;
6262 
6263 	if (!ab->is_reset)
6264 		return;
6265 
6266 	recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
6267 	ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
6268 
6269 	if (recovery_start_count == ab->num_radios) {
6270 		complete(&ab->recovery_start);
6271 		ath11k_dbg(ab, ATH11K_DBG_MAC, "recovery started success\n");
6272 	}
6273 
6274 	ath11k_dbg(ab, ATH11K_DBG_MAC, "waiting reconfigure...\n");
6275 
6276 	wait_for_completion_timeout(&ab->reconfigure_complete,
6277 				    ATH11K_RECONFIGURE_TIMEOUT_HZ);
6278 }
6279 
6280 static int ath11k_mac_op_start(struct ieee80211_hw *hw)
6281 {
6282 	struct ath11k *ar = hw->priv;
6283 	struct ath11k_base *ab = ar->ab;
6284 	struct ath11k_pdev *pdev = ar->pdev;
6285 	int ret;
6286 
6287 	if (ath11k_ftm_mode) {
6288 		ath11k_warn(ab, "mac operations not supported in factory test mode\n");
6289 		return -EOPNOTSUPP;
6290 	}
6291 
6292 	ath11k_mac_drain_tx(ar);
6293 	mutex_lock(&ar->conf_mutex);
6294 
6295 	switch (ar->state) {
6296 	case ATH11K_STATE_OFF:
6297 		ar->state = ATH11K_STATE_ON;
6298 		break;
6299 	case ATH11K_STATE_RESTARTING:
6300 		ar->state = ATH11K_STATE_RESTARTED;
6301 		ath11k_mac_wait_reconfigure(ab);
6302 		break;
6303 	case ATH11K_STATE_RESTARTED:
6304 	case ATH11K_STATE_WEDGED:
6305 	case ATH11K_STATE_ON:
6306 	case ATH11K_STATE_FTM:
6307 		WARN_ON(1);
6308 		ret = -EINVAL;
6309 		goto err;
6310 	}
6311 
6312 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
6313 					1, pdev->pdev_id);
6314 
6315 	if (ret) {
6316 		ath11k_err(ar->ab, "failed to enable PMF QOS: (%d\n", ret);
6317 		goto err;
6318 	}
6319 
6320 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
6321 					pdev->pdev_id);
6322 	if (ret) {
6323 		ath11k_err(ar->ab, "failed to enable dynamic bw: %d\n", ret);
6324 		goto err;
6325 	}
6326 
6327 	if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
6328 		ret = ath11k_wmi_scan_prob_req_oui(ar, ar->mac_addr);
6329 		if (ret) {
6330 			ath11k_err(ab, "failed to set prob req oui: %i\n", ret);
6331 			goto err;
6332 		}
6333 	}
6334 
6335 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
6336 					0, pdev->pdev_id);
6337 	if (ret) {
6338 		ath11k_err(ab, "failed to set ac override for ARP: %d\n",
6339 			   ret);
6340 		goto err;
6341 	}
6342 
6343 	ret = ath11k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
6344 	if (ret) {
6345 		ath11k_err(ab, "failed to offload radar detection: %d\n",
6346 			   ret);
6347 		goto err;
6348 	}
6349 
6350 	ret = ath11k_dp_tx_htt_h2t_ppdu_stats_req(ar,
6351 						  HTT_PPDU_STATS_TAG_DEFAULT);
6352 	if (ret) {
6353 		ath11k_err(ab, "failed to req ppdu stats: %d\n", ret);
6354 		goto err;
6355 	}
6356 
6357 	ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
6358 					1, pdev->pdev_id);
6359 
6360 	if (ret) {
6361 		ath11k_err(ar->ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
6362 		goto err;
6363 	}
6364 
6365 	__ath11k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
6366 
6367 	/* TODO: Do we need to enable ANI? */
6368 
6369 	ath11k_reg_update_chan_list(ar, false);
6370 
6371 	ar->num_started_vdevs = 0;
6372 	ar->num_created_vdevs = 0;
6373 	ar->num_peers = 0;
6374 	ar->allocated_vdev_map = 0;
6375 
6376 	/* Configure monitor status ring with default rx_filter to get rx status
6377 	 * such as rssi, rx_duration.
6378 	 */
6379 	ret = ath11k_mac_config_mon_status_default(ar, true);
6380 	if (ret) {
6381 		ath11k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
6382 			   ret);
6383 		goto err;
6384 	}
6385 
6386 	/* Configure the hash seed for hash based reo dest ring selection */
6387 	ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
6388 
6389 	/* allow device to enter IMPS */
6390 	if (ab->hw_params.idle_ps) {
6391 		ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
6392 						1, pdev->pdev_id);
6393 		if (ret) {
6394 			ath11k_err(ab, "failed to enable idle ps: %d\n", ret);
6395 			goto err;
6396 		}
6397 	}
6398 
6399 	mutex_unlock(&ar->conf_mutex);
6400 
6401 	rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
6402 			   &ab->pdevs[ar->pdev_idx]);
6403 
6404 	return 0;
6405 
6406 err:
6407 	ar->state = ATH11K_STATE_OFF;
6408 	mutex_unlock(&ar->conf_mutex);
6409 
6410 	return ret;
6411 }
6412 
6413 static void ath11k_mac_op_stop(struct ieee80211_hw *hw)
6414 {
6415 	struct ath11k *ar = hw->priv;
6416 	struct htt_ppdu_stats_info *ppdu_stats, *tmp;
6417 	int ret;
6418 
6419 	ath11k_mac_drain_tx(ar);
6420 
6421 	mutex_lock(&ar->conf_mutex);
6422 	ret = ath11k_mac_config_mon_status_default(ar, false);
6423 	if (ret)
6424 		ath11k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
6425 			   ret);
6426 
6427 	clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
6428 	ar->state = ATH11K_STATE_OFF;
6429 	mutex_unlock(&ar->conf_mutex);
6430 
6431 	cancel_delayed_work_sync(&ar->scan.timeout);
6432 	cancel_work_sync(&ar->regd_update_work);
6433 	cancel_work_sync(&ar->ab->update_11d_work);
6434 
6435 	if (ar->state_11d == ATH11K_11D_PREPARING) {
6436 		ar->state_11d = ATH11K_11D_IDLE;
6437 		complete(&ar->completed_11d_scan);
6438 	}
6439 
6440 	spin_lock_bh(&ar->data_lock);
6441 	list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
6442 		list_del(&ppdu_stats->list);
6443 		kfree(ppdu_stats);
6444 	}
6445 	spin_unlock_bh(&ar->data_lock);
6446 
6447 	rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
6448 
6449 	synchronize_rcu();
6450 
6451 	atomic_set(&ar->num_pending_mgmt_tx, 0);
6452 }
6453 
6454 static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif,
6455 					       u32 *flags, u32 *tx_vdev_id)
6456 {
6457 	struct ath11k *ar = arvif->ar;
6458 	struct ath11k_vif *tx_arvif;
6459 	struct ieee80211_vif *tx_vif;
6460 
6461 	*tx_vdev_id = 0;
6462 	tx_vif = arvif->vif->mbssid_tx_vif;
6463 	if (!tx_vif) {
6464 		*flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP;
6465 		return 0;
6466 	}
6467 
6468 	tx_arvif = ath11k_vif_to_arvif(tx_vif);
6469 
6470 	if (arvif->vif->bss_conf.nontransmitted) {
6471 		if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy)
6472 			return -EINVAL;
6473 
6474 		*flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP;
6475 		*tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id;
6476 	} else if (tx_arvif == arvif) {
6477 		*flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP;
6478 	} else {
6479 		return -EINVAL;
6480 	}
6481 
6482 	if (arvif->vif->bss_conf.ema_ap)
6483 		*flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE;
6484 
6485 	return 0;
6486 }
6487 
6488 static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif,
6489 					       struct vdev_create_params *params)
6490 {
6491 	struct ath11k *ar = arvif->ar;
6492 	struct ath11k_pdev *pdev = ar->pdev;
6493 	int ret;
6494 
6495 	params->if_id = arvif->vdev_id;
6496 	params->type = arvif->vdev_type;
6497 	params->subtype = arvif->vdev_subtype;
6498 	params->pdev_id = pdev->pdev_id;
6499 	params->mbssid_flags = 0;
6500 	params->mbssid_tx_vdev_id = 0;
6501 
6502 	if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
6503 		      ar->ab->wmi_ab.svc_map)) {
6504 		ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
6505 							  &params->mbssid_flags,
6506 							  &params->mbssid_tx_vdev_id);
6507 		if (ret)
6508 			return ret;
6509 	}
6510 
6511 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
6512 		params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
6513 		params->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
6514 	}
6515 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
6516 		params->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
6517 		params->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
6518 	}
6519 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
6520 	    ar->supports_6ghz) {
6521 		params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
6522 		params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
6523 	}
6524 	return 0;
6525 }
6526 
6527 static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
6528 					     struct ieee80211_vif *vif)
6529 {
6530 	struct ath11k *ar = hw->priv;
6531 	struct ath11k_base *ab = ar->ab;
6532 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6533 	u32 param_id, param_value;
6534 	int ret;
6535 
6536 	param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
6537 	if (ath11k_frame_mode != ATH11K_HW_TXRX_ETHERNET ||
6538 	    (vif->type != NL80211_IFTYPE_STATION &&
6539 	     vif->type != NL80211_IFTYPE_AP))
6540 		vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
6541 					IEEE80211_OFFLOAD_DECAP_ENABLED);
6542 
6543 	if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
6544 		param_value = ATH11K_HW_TXRX_ETHERNET;
6545 	else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6546 		param_value = ATH11K_HW_TXRX_RAW;
6547 	else
6548 		param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6549 
6550 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6551 					    param_id, param_value);
6552 	if (ret) {
6553 		ath11k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
6554 			    arvif->vdev_id, ret);
6555 		vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
6556 	}
6557 
6558 	param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
6559 	if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
6560 		param_value = ATH11K_HW_TXRX_ETHERNET;
6561 	else if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
6562 		param_value = ATH11K_HW_TXRX_RAW;
6563 	else
6564 		param_value = ATH11K_HW_TXRX_NATIVE_WIFI;
6565 
6566 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6567 					    param_id, param_value);
6568 	if (ret) {
6569 		ath11k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
6570 			    arvif->vdev_id, ret);
6571 		vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
6572 	}
6573 }
6574 
6575 static bool ath11k_mac_vif_ap_active_any(struct ath11k_base *ab)
6576 {
6577 	struct ath11k *ar;
6578 	struct ath11k_pdev *pdev;
6579 	struct ath11k_vif *arvif;
6580 	int i;
6581 
6582 	for (i = 0; i < ab->num_radios; i++) {
6583 		pdev = &ab->pdevs[i];
6584 		ar = pdev->ar;
6585 		list_for_each_entry(arvif, &ar->arvifs, list) {
6586 			if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
6587 				return true;
6588 		}
6589 	}
6590 	return false;
6591 }
6592 
6593 void ath11k_mac_11d_scan_start(struct ath11k *ar, u32 vdev_id)
6594 {
6595 	struct wmi_11d_scan_start_params param;
6596 	int ret;
6597 
6598 	mutex_lock(&ar->ab->vdev_id_11d_lock);
6599 
6600 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev id for 11d scan %d\n",
6601 		   ar->vdev_id_11d_scan);
6602 
6603 	if (ar->regdom_set_by_user)
6604 		goto fin;
6605 
6606 	if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID)
6607 		goto fin;
6608 
6609 	if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6610 		goto fin;
6611 
6612 	if (ath11k_mac_vif_ap_active_any(ar->ab))
6613 		goto fin;
6614 
6615 	param.vdev_id = vdev_id;
6616 	param.start_interval_msec = 0;
6617 	param.scan_period_msec = ATH11K_SCAN_11D_INTERVAL;
6618 
6619 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "start 11d scan\n");
6620 
6621 	ret = ath11k_wmi_send_11d_scan_start_cmd(ar, &param);
6622 	if (ret) {
6623 		ath11k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
6624 			    vdev_id, ret);
6625 	} else {
6626 		ar->vdev_id_11d_scan = vdev_id;
6627 		if (ar->state_11d == ATH11K_11D_PREPARING)
6628 			ar->state_11d = ATH11K_11D_RUNNING;
6629 	}
6630 
6631 fin:
6632 	if (ar->state_11d == ATH11K_11D_PREPARING) {
6633 		ar->state_11d = ATH11K_11D_IDLE;
6634 		complete(&ar->completed_11d_scan);
6635 	}
6636 
6637 	mutex_unlock(&ar->ab->vdev_id_11d_lock);
6638 }
6639 
6640 void ath11k_mac_11d_scan_stop(struct ath11k *ar)
6641 {
6642 	int ret;
6643 	u32 vdev_id;
6644 
6645 	if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
6646 		return;
6647 
6648 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d scan\n");
6649 
6650 	mutex_lock(&ar->ab->vdev_id_11d_lock);
6651 
6652 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "stop 11d vdev id %d\n",
6653 		   ar->vdev_id_11d_scan);
6654 
6655 	if (ar->state_11d == ATH11K_11D_PREPARING) {
6656 		ar->state_11d = ATH11K_11D_IDLE;
6657 		complete(&ar->completed_11d_scan);
6658 	}
6659 
6660 	if (ar->vdev_id_11d_scan != ATH11K_11D_INVALID_VDEV_ID) {
6661 		vdev_id = ar->vdev_id_11d_scan;
6662 
6663 		ret = ath11k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
6664 		if (ret) {
6665 			ath11k_warn(ar->ab,
6666 				    "failed to stopt 11d scan vdev %d ret: %d\n",
6667 				    vdev_id, ret);
6668 		} else {
6669 			ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
6670 			ar->state_11d = ATH11K_11D_IDLE;
6671 			complete(&ar->completed_11d_scan);
6672 		}
6673 	}
6674 	mutex_unlock(&ar->ab->vdev_id_11d_lock);
6675 }
6676 
6677 void ath11k_mac_11d_scan_stop_all(struct ath11k_base *ab)
6678 {
6679 	struct ath11k *ar;
6680 	struct ath11k_pdev *pdev;
6681 	int i;
6682 
6683 	ath11k_dbg(ab, ATH11K_DBG_MAC, "stop soc 11d scan\n");
6684 
6685 	for (i = 0; i < ab->num_radios; i++) {
6686 		pdev = &ab->pdevs[i];
6687 		ar = pdev->ar;
6688 
6689 		ath11k_mac_11d_scan_stop(ar);
6690 	}
6691 }
6692 
6693 static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif)
6694 {
6695 	unsigned long time_left;
6696 	struct ieee80211_vif *vif = arvif->vif;
6697 	int ret = 0;
6698 
6699 	lockdep_assert_held(&ar->conf_mutex);
6700 
6701 	reinit_completion(&ar->vdev_delete_done);
6702 
6703 	ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);
6704 	if (ret) {
6705 		ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n",
6706 			    arvif->vdev_id, ret);
6707 		return ret;
6708 	}
6709 
6710 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6711 						ATH11K_VDEV_DELETE_TIMEOUT_HZ);
6712 	if (time_left == 0) {
6713 		ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
6714 		return -ETIMEDOUT;
6715 	}
6716 
6717 	ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6718 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6719 	ar->num_created_vdevs--;
6720 
6721 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6722 		   vif->addr, arvif->vdev_id);
6723 
6724 	return ret;
6725 }
6726 
6727 static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
6728 				       struct ieee80211_vif *vif)
6729 {
6730 	struct ath11k *ar = hw->priv;
6731 	struct ath11k_base *ab = ar->ab;
6732 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6733 	struct vdev_create_params vdev_param = {0};
6734 	struct peer_create_params peer_param;
6735 	u32 param_id, param_value;
6736 	u16 nss;
6737 	int i;
6738 	int ret, fbret;
6739 	int bit;
6740 
6741 	vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
6742 
6743 	mutex_lock(&ar->conf_mutex);
6744 
6745 	if (vif->type == NL80211_IFTYPE_AP &&
6746 	    ar->num_peers > (ar->max_num_peers - 1)) {
6747 		ath11k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
6748 		ret = -ENOBUFS;
6749 		goto err;
6750 	}
6751 
6752 	if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
6753 		ath11k_warn(ab, "failed to create vdev %u, reached max vdev limit %d\n",
6754 			    ar->num_created_vdevs, TARGET_NUM_VDEVS(ab));
6755 		ret = -EBUSY;
6756 		goto err;
6757 	}
6758 
6759 	memset(arvif, 0, sizeof(*arvif));
6760 
6761 	arvif->ar = ar;
6762 	arvif->vif = vif;
6763 
6764 	INIT_LIST_HEAD(&arvif->list);
6765 	INIT_DELAYED_WORK(&arvif->connection_loss_work,
6766 			  ath11k_mac_vif_sta_connection_loss_work);
6767 
6768 	for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
6769 		arvif->bitrate_mask.control[i].legacy = 0xffffffff;
6770 		arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
6771 		memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
6772 		       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
6773 		memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
6774 		       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
6775 		memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
6776 		       sizeof(arvif->bitrate_mask.control[i].he_mcs));
6777 	}
6778 
6779 	bit = __ffs64(ab->free_vdev_map);
6780 
6781 	arvif->vdev_id = bit;
6782 	arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
6783 
6784 	switch (vif->type) {
6785 	case NL80211_IFTYPE_UNSPECIFIED:
6786 	case NL80211_IFTYPE_STATION:
6787 		arvif->vdev_type = WMI_VDEV_TYPE_STA;
6788 		break;
6789 	case NL80211_IFTYPE_MESH_POINT:
6790 		arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
6791 		fallthrough;
6792 	case NL80211_IFTYPE_AP:
6793 		arvif->vdev_type = WMI_VDEV_TYPE_AP;
6794 		break;
6795 	case NL80211_IFTYPE_MONITOR:
6796 		arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
6797 		ar->monitor_vdev_id = bit;
6798 		break;
6799 	default:
6800 		WARN_ON(1);
6801 		break;
6802 	}
6803 
6804 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "add interface id %d type %d subtype %d map %llx\n",
6805 		   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
6806 		   ab->free_vdev_map);
6807 
6808 	vif->cab_queue = arvif->vdev_id % (ATH11K_HW_MAX_QUEUES - 1);
6809 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
6810 		vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1);
6811 
6812 	ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param);
6813 	if (ret) {
6814 		ath11k_warn(ab, "failed to create vdev parameters %d: %d\n",
6815 			    arvif->vdev_id, ret);
6816 		goto err;
6817 	}
6818 
6819 	ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param);
6820 	if (ret) {
6821 		ath11k_warn(ab, "failed to create WMI vdev %d: %d\n",
6822 			    arvif->vdev_id, ret);
6823 		goto err;
6824 	}
6825 
6826 	ar->num_created_vdevs++;
6827 	ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
6828 		   vif->addr, arvif->vdev_id);
6829 	ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
6830 	ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
6831 
6832 	spin_lock_bh(&ar->data_lock);
6833 	list_add(&arvif->list, &ar->arvifs);
6834 	spin_unlock_bh(&ar->data_lock);
6835 
6836 	ath11k_mac_op_update_vif_offload(hw, vif);
6837 
6838 	nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
6839 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6840 					    WMI_VDEV_PARAM_NSS, nss);
6841 	if (ret) {
6842 		ath11k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
6843 			    arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
6844 		goto err_vdev_del;
6845 	}
6846 
6847 	switch (arvif->vdev_type) {
6848 	case WMI_VDEV_TYPE_AP:
6849 		peer_param.vdev_id = arvif->vdev_id;
6850 		peer_param.peer_addr = vif->addr;
6851 		peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6852 		ret = ath11k_peer_create(ar, arvif, NULL, &peer_param);
6853 		if (ret) {
6854 			ath11k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
6855 				    arvif->vdev_id, ret);
6856 			goto err_vdev_del;
6857 		}
6858 
6859 		ret = ath11k_mac_set_kickout(arvif);
6860 		if (ret) {
6861 			ath11k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
6862 				    arvif->vdev_id, ret);
6863 			goto err_peer_del;
6864 		}
6865 
6866 		ath11k_mac_11d_scan_stop_all(ar->ab);
6867 		break;
6868 	case WMI_VDEV_TYPE_STA:
6869 		param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
6870 		param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
6871 		ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6872 						  param_id, param_value);
6873 		if (ret) {
6874 			ath11k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
6875 				    arvif->vdev_id, ret);
6876 			goto err_peer_del;
6877 		}
6878 
6879 		param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
6880 		param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
6881 		ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6882 						  param_id, param_value);
6883 		if (ret) {
6884 			ath11k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
6885 				    arvif->vdev_id, ret);
6886 			goto err_peer_del;
6887 		}
6888 
6889 		param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
6890 		param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
6891 		ret = ath11k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
6892 						  param_id, param_value);
6893 		if (ret) {
6894 			ath11k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
6895 				    arvif->vdev_id, ret);
6896 			goto err_peer_del;
6897 		}
6898 
6899 		ret = ath11k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id,
6900 						  WMI_STA_PS_MODE_DISABLED);
6901 		if (ret) {
6902 			ath11k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
6903 				    arvif->vdev_id, ret);
6904 			goto err_peer_del;
6905 		}
6906 
6907 		if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map)) {
6908 			reinit_completion(&ar->completed_11d_scan);
6909 			ar->state_11d = ATH11K_11D_PREPARING;
6910 		}
6911 		break;
6912 	case WMI_VDEV_TYPE_MONITOR:
6913 		set_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
6914 		break;
6915 	default:
6916 		break;
6917 	}
6918 
6919 	arvif->txpower = vif->bss_conf.txpower;
6920 	ret = ath11k_mac_txpower_recalc(ar);
6921 	if (ret)
6922 		goto err_peer_del;
6923 
6924 	param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
6925 	param_value = ar->hw->wiphy->rts_threshold;
6926 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6927 					    param_id, param_value);
6928 	if (ret) {
6929 		ath11k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
6930 			    arvif->vdev_id, ret);
6931 	}
6932 
6933 	ath11k_dp_vdev_tx_attach(ar, arvif);
6934 
6935 	if (vif->type != NL80211_IFTYPE_MONITOR &&
6936 	    test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {
6937 		ret = ath11k_mac_monitor_vdev_create(ar);
6938 		if (ret)
6939 			ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",
6940 				    ret);
6941 	}
6942 
6943 	mutex_unlock(&ar->conf_mutex);
6944 
6945 	return 0;
6946 
6947 err_peer_del:
6948 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6949 		fbret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
6950 		if (fbret) {
6951 			ath11k_warn(ar->ab, "fallback fail to delete peer addr %pM vdev_id %d ret %d\n",
6952 				    vif->addr, arvif->vdev_id, fbret);
6953 			goto err;
6954 		}
6955 	}
6956 
6957 err_vdev_del:
6958 	ath11k_mac_vdev_delete(ar, arvif);
6959 	spin_lock_bh(&ar->data_lock);
6960 	list_del(&arvif->list);
6961 	spin_unlock_bh(&ar->data_lock);
6962 
6963 err:
6964 	mutex_unlock(&ar->conf_mutex);
6965 
6966 	return ret;
6967 }
6968 
6969 static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
6970 {
6971 	struct ieee80211_vif *vif = ctx;
6972 	struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
6973 
6974 	if (skb_cb->vif == vif)
6975 		skb_cb->vif = NULL;
6976 
6977 	return 0;
6978 }
6979 
6980 static void ath11k_mac_op_remove_interface(struct ieee80211_hw *hw,
6981 					   struct ieee80211_vif *vif)
6982 {
6983 	struct ath11k *ar = hw->priv;
6984 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
6985 	struct ath11k_base *ab = ar->ab;
6986 	int ret;
6987 	int i;
6988 
6989 	cancel_delayed_work_sync(&arvif->connection_loss_work);
6990 
6991 	mutex_lock(&ar->conf_mutex);
6992 
6993 	ath11k_dbg(ab, ATH11K_DBG_MAC, "remove interface (vdev %d)\n",
6994 		   arvif->vdev_id);
6995 
6996 	ret = ath11k_spectral_vif_stop(arvif);
6997 	if (ret)
6998 		ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n",
6999 			    arvif->vdev_id, ret);
7000 
7001 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7002 		ath11k_mac_11d_scan_stop(ar);
7003 
7004 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7005 		ret = ath11k_peer_delete(ar, arvif->vdev_id, vif->addr);
7006 		if (ret)
7007 			ath11k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
7008 				    arvif->vdev_id, ret);
7009 	}
7010 
7011 	ret = ath11k_mac_vdev_delete(ar, arvif);
7012 	if (ret) {
7013 		ath11k_warn(ab, "failed to delete vdev %d: %d\n",
7014 			    arvif->vdev_id, ret);
7015 		goto err_vdev_del;
7016 	}
7017 
7018 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7019 		clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
7020 		ar->monitor_vdev_id = -1;
7021 	} else if (test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags) &&
7022 		   !test_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags)) {
7023 		ret = ath11k_mac_monitor_vdev_delete(ar);
7024 		if (ret)
7025 			/* continue even if there's an error */
7026 			ath11k_warn(ar->ab, "failed to delete vdev monitor during remove interface: %d",
7027 				    ret);
7028 	}
7029 
7030 err_vdev_del:
7031 	spin_lock_bh(&ar->data_lock);
7032 	list_del(&arvif->list);
7033 	spin_unlock_bh(&ar->data_lock);
7034 
7035 	ath11k_peer_cleanup(ar, arvif->vdev_id);
7036 
7037 	idr_for_each(&ar->txmgmt_idr,
7038 		     ath11k_mac_vif_txmgmt_idr_remove, vif);
7039 
7040 	for (i = 0; i < ab->hw_params.max_tx_ring; i++) {
7041 		spin_lock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
7042 		idr_for_each(&ab->dp.tx_ring[i].txbuf_idr,
7043 			     ath11k_mac_vif_unref, vif);
7044 		spin_unlock_bh(&ab->dp.tx_ring[i].tx_idr_lock);
7045 	}
7046 
7047 	/* Recalc txpower for remaining vdev */
7048 	ath11k_mac_txpower_recalc(ar);
7049 
7050 	/* TODO: recal traffic pause state based on the available vdevs */
7051 
7052 	mutex_unlock(&ar->conf_mutex);
7053 }
7054 
7055 /* FIXME: Has to be verified. */
7056 #define SUPPORTED_FILTERS			\
7057 	(FIF_ALLMULTI |				\
7058 	FIF_CONTROL |				\
7059 	FIF_PSPOLL |				\
7060 	FIF_OTHER_BSS |				\
7061 	FIF_BCN_PRBRESP_PROMISC |		\
7062 	FIF_PROBE_REQ |				\
7063 	FIF_FCSFAIL)
7064 
7065 static void ath11k_mac_op_configure_filter(struct ieee80211_hw *hw,
7066 					   unsigned int changed_flags,
7067 					   unsigned int *total_flags,
7068 					   u64 multicast)
7069 {
7070 	struct ath11k *ar = hw->priv;
7071 
7072 	mutex_lock(&ar->conf_mutex);
7073 
7074 	*total_flags &= SUPPORTED_FILTERS;
7075 	ar->filter_flags = *total_flags;
7076 
7077 	mutex_unlock(&ar->conf_mutex);
7078 }
7079 
7080 static int ath11k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
7081 {
7082 	struct ath11k *ar = hw->priv;
7083 
7084 	mutex_lock(&ar->conf_mutex);
7085 
7086 	*tx_ant = ar->cfg_tx_chainmask;
7087 	*rx_ant = ar->cfg_rx_chainmask;
7088 
7089 	mutex_unlock(&ar->conf_mutex);
7090 
7091 	return 0;
7092 }
7093 
7094 static int ath11k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
7095 {
7096 	struct ath11k *ar = hw->priv;
7097 	int ret;
7098 
7099 	mutex_lock(&ar->conf_mutex);
7100 	ret = __ath11k_set_antenna(ar, tx_ant, rx_ant);
7101 	mutex_unlock(&ar->conf_mutex);
7102 
7103 	return ret;
7104 }
7105 
7106 static int ath11k_mac_op_ampdu_action(struct ieee80211_hw *hw,
7107 				      struct ieee80211_vif *vif,
7108 				      struct ieee80211_ampdu_params *params)
7109 {
7110 	struct ath11k *ar = hw->priv;
7111 	int ret = -EINVAL;
7112 
7113 	mutex_lock(&ar->conf_mutex);
7114 
7115 	switch (params->action) {
7116 	case IEEE80211_AMPDU_RX_START:
7117 		ret = ath11k_dp_rx_ampdu_start(ar, params);
7118 		break;
7119 	case IEEE80211_AMPDU_RX_STOP:
7120 		ret = ath11k_dp_rx_ampdu_stop(ar, params);
7121 		break;
7122 	case IEEE80211_AMPDU_TX_START:
7123 	case IEEE80211_AMPDU_TX_STOP_CONT:
7124 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
7125 	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
7126 	case IEEE80211_AMPDU_TX_OPERATIONAL:
7127 		/* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
7128 		 * Tx aggregation requests.
7129 		 */
7130 		ret = -EOPNOTSUPP;
7131 		break;
7132 	}
7133 
7134 	mutex_unlock(&ar->conf_mutex);
7135 
7136 	return ret;
7137 }
7138 
7139 static int ath11k_mac_op_add_chanctx(struct ieee80211_hw *hw,
7140 				     struct ieee80211_chanctx_conf *ctx)
7141 {
7142 	struct ath11k *ar = hw->priv;
7143 	struct ath11k_base *ab = ar->ab;
7144 
7145 	ath11k_dbg(ab, ATH11K_DBG_MAC,
7146 		   "chanctx add freq %u width %d ptr %p\n",
7147 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
7148 
7149 	mutex_lock(&ar->conf_mutex);
7150 
7151 	spin_lock_bh(&ar->data_lock);
7152 	/* TODO: In case of multiple channel context, populate rx_channel from
7153 	 * Rx PPDU desc information.
7154 	 */
7155 	ar->rx_channel = ctx->def.chan;
7156 	spin_unlock_bh(&ar->data_lock);
7157 
7158 	mutex_unlock(&ar->conf_mutex);
7159 
7160 	return 0;
7161 }
7162 
7163 static void ath11k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
7164 					 struct ieee80211_chanctx_conf *ctx)
7165 {
7166 	struct ath11k *ar = hw->priv;
7167 	struct ath11k_base *ab = ar->ab;
7168 
7169 	ath11k_dbg(ab, ATH11K_DBG_MAC,
7170 		   "chanctx remove freq %u width %d ptr %p\n",
7171 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
7172 
7173 	mutex_lock(&ar->conf_mutex);
7174 
7175 	spin_lock_bh(&ar->data_lock);
7176 	/* TODO: In case of there is one more channel context left, populate
7177 	 * rx_channel with the channel of that remaining channel context.
7178 	 */
7179 	ar->rx_channel = NULL;
7180 	spin_unlock_bh(&ar->data_lock);
7181 
7182 	mutex_unlock(&ar->conf_mutex);
7183 }
7184 
7185 static int
7186 ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
7187 			      struct ieee80211_chanctx_conf *ctx,
7188 			      bool restart)
7189 {
7190 	struct ath11k *ar = arvif->ar;
7191 	struct ath11k_base *ab = ar->ab;
7192 	struct wmi_vdev_start_req_arg arg = {};
7193 	const struct cfg80211_chan_def *chandef = &ctx->def;
7194 	int ret = 0;
7195 	unsigned int dfs_cac_time;
7196 
7197 	lockdep_assert_held(&ar->conf_mutex);
7198 
7199 	reinit_completion(&ar->vdev_setup_done);
7200 
7201 	arg.vdev_id = arvif->vdev_id;
7202 	arg.dtim_period = arvif->dtim_period;
7203 	arg.bcn_intval = arvif->beacon_interval;
7204 
7205 	arg.channel.freq = chandef->chan->center_freq;
7206 	arg.channel.band_center_freq1 = chandef->center_freq1;
7207 	arg.channel.band_center_freq2 = chandef->center_freq2;
7208 	arg.channel.mode =
7209 		ath11k_phymodes[chandef->chan->band][chandef->width];
7210 
7211 	arg.channel.min_power = 0;
7212 	arg.channel.max_power = chandef->chan->max_power;
7213 	arg.channel.max_reg_power = chandef->chan->max_reg_power;
7214 	arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
7215 
7216 	arg.pref_tx_streams = ar->num_tx_chains;
7217 	arg.pref_rx_streams = ar->num_rx_chains;
7218 
7219 	arg.mbssid_flags = 0;
7220 	arg.mbssid_tx_vdev_id = 0;
7221 	if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
7222 		     ar->ab->wmi_ab.svc_map)) {
7223 		ret = ath11k_mac_setup_vdev_params_mbssid(arvif,
7224 							  &arg.mbssid_flags,
7225 							  &arg.mbssid_tx_vdev_id);
7226 		if (ret)
7227 			return ret;
7228 	}
7229 
7230 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
7231 		arg.ssid = arvif->u.ap.ssid;
7232 		arg.ssid_len = arvif->u.ap.ssid_len;
7233 		arg.hidden_ssid = arvif->u.ap.hidden_ssid;
7234 
7235 		/* For now allow DFS for AP mode */
7236 		arg.channel.chan_radar =
7237 			!!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
7238 
7239 		arg.channel.freq2_radar = ctx->radar_enabled;
7240 
7241 		arg.channel.passive = arg.channel.chan_radar;
7242 
7243 		spin_lock_bh(&ab->base_lock);
7244 		arg.regdomain = ar->ab->dfs_region;
7245 		spin_unlock_bh(&ab->base_lock);
7246 	}
7247 
7248 	arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
7249 
7250 	ath11k_dbg(ab, ATH11K_DBG_MAC,
7251 		   "vdev %d start center_freq %d phymode %s\n",
7252 		   arg.vdev_id, arg.channel.freq,
7253 		   ath11k_wmi_phymode_str(arg.channel.mode));
7254 
7255 	ret = ath11k_wmi_vdev_start(ar, &arg, restart);
7256 	if (ret) {
7257 		ath11k_warn(ar->ab, "failed to %s WMI vdev %i\n",
7258 			    restart ? "restart" : "start", arg.vdev_id);
7259 		return ret;
7260 	}
7261 
7262 	ret = ath11k_mac_vdev_setup_sync(ar);
7263 	if (ret) {
7264 		ath11k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
7265 			    arg.vdev_id, restart ? "restart" : "start", ret);
7266 		return ret;
7267 	}
7268 
7269 	if (!restart)
7270 		ar->num_started_vdevs++;
7271 
7272 	ath11k_dbg(ab, ATH11K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
7273 		   arvif->vif->addr, arvif->vdev_id);
7274 
7275 	/* Enable CAC Flag in the driver by checking the all sub-channel's DFS
7276 	 * state as NL80211_DFS_USABLE which indicates CAC needs to be
7277 	 * done before channel usage. This flags is used to drop rx packets.
7278 	 * during CAC.
7279 	 */
7280 	/* TODO Set the flag for other interface types as required */
7281 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
7282 	    cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
7283 		set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7284 		dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
7285 							     chandef);
7286 		ath11k_dbg(ab, ATH11K_DBG_MAC,
7287 			   "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
7288 			   dfs_cac_time, arg.channel.freq, chandef->center_freq1,
7289 			   arg.vdev_id);
7290 	}
7291 
7292 	ret = ath11k_mac_set_txbf_conf(arvif);
7293 	if (ret)
7294 		ath11k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
7295 			    arvif->vdev_id, ret);
7296 
7297 	return 0;
7298 }
7299 
7300 static int ath11k_mac_vdev_stop(struct ath11k_vif *arvif)
7301 {
7302 	struct ath11k *ar = arvif->ar;
7303 	int ret;
7304 
7305 	lockdep_assert_held(&ar->conf_mutex);
7306 
7307 	reinit_completion(&ar->vdev_setup_done);
7308 
7309 	ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id);
7310 	if (ret) {
7311 		ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
7312 			    arvif->vdev_id, ret);
7313 		goto err;
7314 	}
7315 
7316 	ret = ath11k_mac_vdev_setup_sync(ar);
7317 	if (ret) {
7318 		ath11k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
7319 			    arvif->vdev_id, ret);
7320 		goto err;
7321 	}
7322 
7323 	WARN_ON(ar->num_started_vdevs == 0);
7324 
7325 	ar->num_started_vdevs--;
7326 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
7327 		   arvif->vif->addr, arvif->vdev_id);
7328 
7329 	if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
7330 		clear_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
7331 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "CAC Stopped for vdev %d\n",
7332 			   arvif->vdev_id);
7333 	}
7334 
7335 	return 0;
7336 err:
7337 	return ret;
7338 }
7339 
7340 static int ath11k_mac_vdev_start(struct ath11k_vif *arvif,
7341 				 struct ieee80211_chanctx_conf *ctx)
7342 {
7343 	return ath11k_mac_vdev_start_restart(arvif, ctx, false);
7344 }
7345 
7346 static int ath11k_mac_vdev_restart(struct ath11k_vif *arvif,
7347 				   struct ieee80211_chanctx_conf *ctx)
7348 {
7349 	return ath11k_mac_vdev_start_restart(arvif, ctx, true);
7350 }
7351 
7352 struct ath11k_mac_change_chanctx_arg {
7353 	struct ieee80211_chanctx_conf *ctx;
7354 	struct ieee80211_vif_chanctx_switch *vifs;
7355 	int n_vifs;
7356 	int next_vif;
7357 };
7358 
7359 static void
7360 ath11k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
7361 				   struct ieee80211_vif *vif)
7362 {
7363 	struct ath11k_mac_change_chanctx_arg *arg = data;
7364 
7365 	if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
7366 		return;
7367 
7368 	arg->n_vifs++;
7369 }
7370 
7371 static void
7372 ath11k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
7373 				    struct ieee80211_vif *vif)
7374 {
7375 	struct ath11k_mac_change_chanctx_arg *arg = data;
7376 	struct ieee80211_chanctx_conf *ctx;
7377 
7378 	ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
7379 	if (ctx != arg->ctx)
7380 		return;
7381 
7382 	if (WARN_ON(arg->next_vif == arg->n_vifs))
7383 		return;
7384 
7385 	arg->vifs[arg->next_vif].vif = vif;
7386 	arg->vifs[arg->next_vif].old_ctx = ctx;
7387 	arg->vifs[arg->next_vif].new_ctx = ctx;
7388 	arg->next_vif++;
7389 }
7390 
7391 static void
7392 ath11k_mac_update_vif_chan(struct ath11k *ar,
7393 			   struct ieee80211_vif_chanctx_switch *vifs,
7394 			   int n_vifs)
7395 {
7396 	struct ath11k_base *ab = ar->ab;
7397 	struct ath11k_vif *arvif, *tx_arvif = NULL;
7398 	struct ieee80211_vif *mbssid_tx_vif;
7399 	int ret;
7400 	int i;
7401 	bool monitor_vif = false;
7402 
7403 	lockdep_assert_held(&ar->conf_mutex);
7404 
7405 	/* Associated channel resources of all relevant vdevs
7406 	 * should be available for the channel switch now.
7407 	 */
7408 
7409 	/* TODO: Update ar->rx_channel */
7410 
7411 	for (i = 0; i < n_vifs; i++) {
7412 		arvif = ath11k_vif_to_arvif(vifs[i].vif);
7413 
7414 		if (WARN_ON(!arvif->is_started))
7415 			continue;
7416 
7417 		/* change_chanctx can be called even before vdev_up from
7418 		 * ieee80211_start_ap->ieee80211_vif_use_channel->
7419 		 * ieee80211_recalc_radar_chanctx.
7420 		 *
7421 		 * Firmware expect vdev_restart only if vdev is up.
7422 		 * If vdev is down then it expect vdev_stop->vdev_start.
7423 		 */
7424 		if (arvif->is_up) {
7425 			ret = ath11k_mac_vdev_restart(arvif, vifs[i].new_ctx);
7426 			if (ret) {
7427 				ath11k_warn(ab, "failed to restart vdev %d: %d\n",
7428 					    arvif->vdev_id, ret);
7429 				continue;
7430 			}
7431 		} else {
7432 			ret = ath11k_mac_vdev_stop(arvif);
7433 			if (ret) {
7434 				ath11k_warn(ab, "failed to stop vdev %d: %d\n",
7435 					    arvif->vdev_id, ret);
7436 				continue;
7437 			}
7438 
7439 			ret = ath11k_mac_vdev_start(arvif, vifs[i].new_ctx);
7440 			if (ret)
7441 				ath11k_warn(ab, "failed to start vdev %d: %d\n",
7442 					    arvif->vdev_id, ret);
7443 
7444 			continue;
7445 		}
7446 
7447 		ret = ath11k_mac_setup_bcn_tmpl(arvif);
7448 		if (ret)
7449 			ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
7450 				    ret);
7451 
7452 		mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
7453 		if (mbssid_tx_vif)
7454 			tx_arvif = ath11k_vif_to_arvif(mbssid_tx_vif);
7455 
7456 		ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
7457 					 arvif->bssid,
7458 					 tx_arvif ? tx_arvif->bssid : NULL,
7459 					 arvif->vif->bss_conf.bssid_index,
7460 					 1 << arvif->vif->bss_conf.bssid_indicator);
7461 		if (ret) {
7462 			ath11k_warn(ab, "failed to bring vdev up %d: %d\n",
7463 				    arvif->vdev_id, ret);
7464 			continue;
7465 		}
7466 	}
7467 
7468 	/* Restart the internal monitor vdev on new channel */
7469 	if (!monitor_vif &&
7470 	    test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7471 		ret = ath11k_mac_monitor_stop(ar);
7472 		if (ret) {
7473 			ath11k_warn(ar->ab, "failed to stop monitor during vif channel update: %d",
7474 				    ret);
7475 			return;
7476 		}
7477 
7478 		ret = ath11k_mac_monitor_start(ar);
7479 		if (ret) {
7480 			ath11k_warn(ar->ab, "failed to start monitor during vif channel update: %d",
7481 				    ret);
7482 			return;
7483 		}
7484 	}
7485 }
7486 
7487 static void
7488 ath11k_mac_update_active_vif_chan(struct ath11k *ar,
7489 				  struct ieee80211_chanctx_conf *ctx)
7490 {
7491 	struct ath11k_mac_change_chanctx_arg arg = { .ctx = ctx };
7492 
7493 	lockdep_assert_held(&ar->conf_mutex);
7494 
7495 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
7496 						   IEEE80211_IFACE_ITER_NORMAL,
7497 						   ath11k_mac_change_chanctx_cnt_iter,
7498 						   &arg);
7499 	if (arg.n_vifs == 0)
7500 		return;
7501 
7502 	arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
7503 	if (!arg.vifs)
7504 		return;
7505 
7506 	ieee80211_iterate_active_interfaces_atomic(ar->hw,
7507 						   IEEE80211_IFACE_ITER_NORMAL,
7508 						   ath11k_mac_change_chanctx_fill_iter,
7509 						   &arg);
7510 
7511 	ath11k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
7512 
7513 	kfree(arg.vifs);
7514 }
7515 
7516 static void ath11k_mac_op_change_chanctx(struct ieee80211_hw *hw,
7517 					 struct ieee80211_chanctx_conf *ctx,
7518 					 u32 changed)
7519 {
7520 	struct ath11k *ar = hw->priv;
7521 	struct ath11k_base *ab = ar->ab;
7522 
7523 	mutex_lock(&ar->conf_mutex);
7524 
7525 	ath11k_dbg(ab, ATH11K_DBG_MAC,
7526 		   "chanctx change freq %u width %d ptr %p changed %x\n",
7527 		   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
7528 
7529 	/* This shouldn't really happen because channel switching should use
7530 	 * switch_vif_chanctx().
7531 	 */
7532 	if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
7533 		goto unlock;
7534 
7535 	if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
7536 	    changed & IEEE80211_CHANCTX_CHANGE_RADAR)
7537 		ath11k_mac_update_active_vif_chan(ar, ctx);
7538 
7539 	/* TODO: Recalc radar detection */
7540 
7541 unlock:
7542 	mutex_unlock(&ar->conf_mutex);
7543 }
7544 
7545 static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
7546 				   struct ieee80211_vif *vif)
7547 {
7548 	struct ath11k *ar = hw->priv;
7549 	struct ath11k_base *ab = ar->ab;
7550 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7551 	int ret;
7552 
7553 	if (WARN_ON(arvif->is_started))
7554 		return -EBUSY;
7555 
7556 	ret = ath11k_mac_vdev_start(arvif, &arvif->chanctx);
7557 	if (ret) {
7558 		ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7559 			    arvif->vdev_id, vif->addr,
7560 			    arvif->chanctx.def.chan->center_freq, ret);
7561 		return ret;
7562 	}
7563 
7564 	/* Reconfigure hardware rate code since it is cleared by firmware.
7565 	 */
7566 	if (ar->hw_rate_code > 0) {
7567 		u32 vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
7568 
7569 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
7570 						    ar->hw_rate_code);
7571 		if (ret) {
7572 			ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
7573 			return ret;
7574 		}
7575 	}
7576 
7577 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7578 		ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr,
7579 					 NULL, 0, 0);
7580 		if (ret) {
7581 			ath11k_warn(ab, "failed put monitor up: %d\n", ret);
7582 			return ret;
7583 		}
7584 	}
7585 
7586 	arvif->is_started = true;
7587 
7588 	/* TODO: Setup ps and cts/rts protection */
7589 	return 0;
7590 }
7591 
7592 static int
7593 ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
7594 				 struct ieee80211_vif *vif,
7595 				 struct ieee80211_bss_conf *link_conf,
7596 				 struct ieee80211_chanctx_conf *ctx)
7597 {
7598 	struct ath11k *ar = hw->priv;
7599 	struct ath11k_base *ab = ar->ab;
7600 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7601 	int ret;
7602 	struct peer_create_params param;
7603 
7604 	mutex_lock(&ar->conf_mutex);
7605 
7606 	ath11k_dbg(ab, ATH11K_DBG_MAC,
7607 		   "chanctx assign ptr %p vdev_id %i\n",
7608 		   ctx, arvif->vdev_id);
7609 
7610 	/* for QCA6390 bss peer must be created before vdev_start */
7611 	if (ab->hw_params.vdev_start_delay &&
7612 	    arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7613 	    arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7614 	    !ath11k_peer_find_by_vdev_id(ab, arvif->vdev_id)) {
7615 		memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
7616 		ret = 0;
7617 		goto out;
7618 	}
7619 
7620 	if (WARN_ON(arvif->is_started)) {
7621 		ret = -EBUSY;
7622 		goto out;
7623 	}
7624 
7625 	if (ab->hw_params.vdev_start_delay &&
7626 	    arvif->vdev_type != WMI_VDEV_TYPE_AP &&
7627 	    arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
7628 		param.vdev_id = arvif->vdev_id;
7629 		param.peer_type = WMI_PEER_TYPE_DEFAULT;
7630 		param.peer_addr = ar->mac_addr;
7631 
7632 		ret = ath11k_peer_create(ar, arvif, NULL, &param);
7633 		if (ret) {
7634 			ath11k_warn(ab, "failed to create peer after vdev start delay: %d",
7635 				    ret);
7636 			goto out;
7637 		}
7638 	}
7639 
7640 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7641 		ret = ath11k_mac_monitor_start(ar);
7642 		if (ret) {
7643 			ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7644 				    ret);
7645 			goto out;
7646 		}
7647 
7648 		arvif->is_started = true;
7649 		goto out;
7650 	}
7651 
7652 	ret = ath11k_mac_vdev_start(arvif, ctx);
7653 	if (ret) {
7654 		ath11k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
7655 			    arvif->vdev_id, vif->addr,
7656 			    ctx->def.chan->center_freq, ret);
7657 		goto out;
7658 	}
7659 
7660 	arvif->is_started = true;
7661 
7662 	if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7663 	    test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7664 		ret = ath11k_mac_monitor_start(ar);
7665 		if (ret) {
7666 			ath11k_warn(ar->ab, "failed to start monitor during vif channel context assignment: %d",
7667 				    ret);
7668 			goto out;
7669 		}
7670 	}
7671 
7672 	/* TODO: Setup ps and cts/rts protection */
7673 
7674 	ret = 0;
7675 
7676 out:
7677 	mutex_unlock(&ar->conf_mutex);
7678 
7679 	return ret;
7680 }
7681 
7682 static void
7683 ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
7684 				   struct ieee80211_vif *vif,
7685 				   struct ieee80211_bss_conf *link_conf,
7686 				   struct ieee80211_chanctx_conf *ctx)
7687 {
7688 	struct ath11k *ar = hw->priv;
7689 	struct ath11k_base *ab = ar->ab;
7690 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
7691 	struct ath11k_peer *peer;
7692 	int ret;
7693 
7694 	mutex_lock(&ar->conf_mutex);
7695 
7696 	ath11k_dbg(ab, ATH11K_DBG_MAC,
7697 		   "chanctx unassign ptr %p vdev_id %i\n",
7698 		   ctx, arvif->vdev_id);
7699 
7700 	WARN_ON(!arvif->is_started);
7701 
7702 	if (ab->hw_params.vdev_start_delay &&
7703 	    arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7704 		spin_lock_bh(&ab->base_lock);
7705 		peer = ath11k_peer_find_by_addr(ab, ar->mac_addr);
7706 		spin_unlock_bh(&ab->base_lock);
7707 		if (peer)
7708 			ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
7709 	}
7710 
7711 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
7712 		ret = ath11k_mac_monitor_stop(ar);
7713 		if (ret) {
7714 			ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7715 				    ret);
7716 			mutex_unlock(&ar->conf_mutex);
7717 			return;
7718 		}
7719 
7720 		arvif->is_started = false;
7721 		mutex_unlock(&ar->conf_mutex);
7722 		return;
7723 	}
7724 
7725 	ret = ath11k_mac_vdev_stop(arvif);
7726 	if (ret)
7727 		ath11k_warn(ab, "failed to stop vdev %i: %d\n",
7728 			    arvif->vdev_id, ret);
7729 
7730 	arvif->is_started = false;
7731 
7732 	if (ab->hw_params.vdev_start_delay &&
7733 	    arvif->vdev_type == WMI_VDEV_TYPE_STA) {
7734 		ret = ath11k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
7735 		if (ret)
7736 			ath11k_warn(ar->ab,
7737 				    "failed to delete peer %pM for vdev %d: %d\n",
7738 				    arvif->bssid, arvif->vdev_id, ret);
7739 		else
7740 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7741 				   "removed peer %pM  vdev %d after vdev stop\n",
7742 				   arvif->bssid, arvif->vdev_id);
7743 	}
7744 
7745 	if (ab->hw_params.vdev_start_delay &&
7746 	    arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
7747 		ath11k_wmi_vdev_down(ar, arvif->vdev_id);
7748 
7749 	if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
7750 	    ar->num_started_vdevs == 1 &&
7751 	    test_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags)) {
7752 		ret = ath11k_mac_monitor_stop(ar);
7753 		if (ret)
7754 			/* continue even if there's an error */
7755 			ath11k_warn(ar->ab, "failed to stop monitor during vif channel context unassignment: %d",
7756 				    ret);
7757 	}
7758 
7759 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
7760 		ath11k_mac_11d_scan_start(ar, arvif->vdev_id);
7761 
7762 	mutex_unlock(&ar->conf_mutex);
7763 }
7764 
7765 static int
7766 ath11k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
7767 				 struct ieee80211_vif_chanctx_switch *vifs,
7768 				 int n_vifs,
7769 				 enum ieee80211_chanctx_switch_mode mode)
7770 {
7771 	struct ath11k *ar = hw->priv;
7772 
7773 	mutex_lock(&ar->conf_mutex);
7774 
7775 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
7776 		   "chanctx switch n_vifs %d mode %d\n",
7777 		   n_vifs, mode);
7778 	ath11k_mac_update_vif_chan(ar, vifs, n_vifs);
7779 
7780 	mutex_unlock(&ar->conf_mutex);
7781 
7782 	return 0;
7783 }
7784 
7785 static int
7786 ath11k_set_vdev_param_to_all_vifs(struct ath11k *ar, int param, u32 value)
7787 {
7788 	struct ath11k_vif *arvif;
7789 	int ret = 0;
7790 
7791 	mutex_lock(&ar->conf_mutex);
7792 	list_for_each_entry(arvif, &ar->arvifs, list) {
7793 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
7794 			   param, arvif->vdev_id, value);
7795 
7796 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7797 						    param, value);
7798 		if (ret) {
7799 			ath11k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
7800 				    param, arvif->vdev_id, ret);
7801 			break;
7802 		}
7803 	}
7804 	mutex_unlock(&ar->conf_mutex);
7805 	return ret;
7806 }
7807 
7808 /* mac80211 stores device specific RTS/Fragmentation threshold value,
7809  * this is set interface specific to firmware from ath11k driver
7810  */
7811 static int ath11k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
7812 {
7813 	struct ath11k *ar = hw->priv;
7814 	int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
7815 
7816 	return ath11k_set_vdev_param_to_all_vifs(ar, param_id, value);
7817 }
7818 
7819 static int ath11k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
7820 {
7821 	/* Even though there's a WMI vdev param for fragmentation threshold no
7822 	 * known firmware actually implements it. Moreover it is not possible to
7823 	 * rely frame fragmentation to mac80211 because firmware clears the
7824 	 * "more fragments" bit in frame control making it impossible for remote
7825 	 * devices to reassemble frames.
7826 	 *
7827 	 * Hence implement a dummy callback just to say fragmentation isn't
7828 	 * supported. This effectively prevents mac80211 from doing frame
7829 	 * fragmentation in software.
7830 	 */
7831 	return -EOPNOTSUPP;
7832 }
7833 
7834 static int ath11k_mac_flush_tx_complete(struct ath11k *ar)
7835 {
7836 	long time_left;
7837 	int ret = 0;
7838 
7839 	time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
7840 				       (atomic_read(&ar->dp.num_tx_pending) == 0),
7841 				       ATH11K_FLUSH_TIMEOUT);
7842 	if (time_left == 0) {
7843 		ath11k_warn(ar->ab, "failed to flush transmit queue, data pkts pending %d\n",
7844 			    atomic_read(&ar->dp.num_tx_pending));
7845 		ret = -ETIMEDOUT;
7846 	}
7847 
7848 	time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
7849 				       (atomic_read(&ar->num_pending_mgmt_tx) == 0),
7850 				       ATH11K_FLUSH_TIMEOUT);
7851 	if (time_left == 0) {
7852 		ath11k_warn(ar->ab, "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
7853 			    atomic_read(&ar->num_pending_mgmt_tx));
7854 		ret = -ETIMEDOUT;
7855 	}
7856 
7857 	return ret;
7858 }
7859 
7860 int ath11k_mac_wait_tx_complete(struct ath11k *ar)
7861 {
7862 	ath11k_mac_drain_tx(ar);
7863 	return ath11k_mac_flush_tx_complete(ar);
7864 }
7865 
7866 static void ath11k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
7867 				u32 queues, bool drop)
7868 {
7869 	struct ath11k *ar = hw->priv;
7870 
7871 	if (drop)
7872 		return;
7873 
7874 	ath11k_mac_flush_tx_complete(ar);
7875 }
7876 
7877 static bool
7878 ath11k_mac_has_single_legacy_rate(struct ath11k *ar,
7879 				  enum nl80211_band band,
7880 				  const struct cfg80211_bitrate_mask *mask)
7881 {
7882 	int num_rates = 0;
7883 
7884 	num_rates = hweight32(mask->control[band].legacy);
7885 
7886 	if (ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
7887 		return false;
7888 
7889 	if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
7890 		return false;
7891 
7892 	if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask))
7893 		return false;
7894 
7895 	return num_rates == 1;
7896 }
7897 
7898 static __le16
7899 ath11k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
7900 {
7901 	if (he_cap->he_cap_elem.phy_cap_info[0] &
7902 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
7903 		return he_cap->he_mcs_nss_supp.tx_mcs_80p80;
7904 
7905 	if (he_cap->he_cap_elem.phy_cap_info[0] &
7906 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
7907 		return he_cap->he_mcs_nss_supp.tx_mcs_160;
7908 
7909 	return he_cap->he_mcs_nss_supp.tx_mcs_80;
7910 }
7911 
7912 static bool
7913 ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
7914 				       struct ath11k_vif *arvif,
7915 				       enum nl80211_band band,
7916 				       const struct cfg80211_bitrate_mask *mask,
7917 				       int *nss)
7918 {
7919 	struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
7920 	u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
7921 	const struct ieee80211_sta_he_cap *he_cap;
7922 	u16 he_mcs_map = 0;
7923 	u8 ht_nss_mask = 0;
7924 	u8 vht_nss_mask = 0;
7925 	u8 he_nss_mask = 0;
7926 	int i;
7927 
7928 	/* No need to consider legacy here. Basic rates are always present
7929 	 * in bitrate mask
7930 	 */
7931 
7932 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
7933 		if (mask->control[band].ht_mcs[i] == 0)
7934 			continue;
7935 		else if (mask->control[band].ht_mcs[i] ==
7936 			 sband->ht_cap.mcs.rx_mask[i])
7937 			ht_nss_mask |= BIT(i);
7938 		else
7939 			return false;
7940 	}
7941 
7942 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7943 		if (mask->control[band].vht_mcs[i] == 0)
7944 			continue;
7945 		else if (mask->control[band].vht_mcs[i] ==
7946 			 ath11k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7947 			vht_nss_mask |= BIT(i);
7948 		else
7949 			return false;
7950 	}
7951 
7952 	he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
7953 	if (!he_cap)
7954 		return false;
7955 
7956 	he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
7957 
7958 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
7959 		if (mask->control[band].he_mcs[i] == 0)
7960 			continue;
7961 
7962 		if (mask->control[band].he_mcs[i] ==
7963 		    ath11k_mac_get_max_he_mcs_map(he_mcs_map, i))
7964 			he_nss_mask |= BIT(i);
7965 		else
7966 			return false;
7967 	}
7968 
7969 	if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
7970 		return false;
7971 
7972 	if (ht_nss_mask == 0)
7973 		return false;
7974 
7975 	if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7976 		return false;
7977 
7978 	*nss = fls(ht_nss_mask);
7979 
7980 	return true;
7981 }
7982 
7983 static int
7984 ath11k_mac_get_single_legacy_rate(struct ath11k *ar,
7985 				  enum nl80211_band band,
7986 				  const struct cfg80211_bitrate_mask *mask,
7987 				  u32 *rate, u8 *nss)
7988 {
7989 	int rate_idx;
7990 	u16 bitrate;
7991 	u8 preamble;
7992 	u8 hw_rate;
7993 
7994 	if (hweight32(mask->control[band].legacy) != 1)
7995 		return -EINVAL;
7996 
7997 	rate_idx = ffs(mask->control[band].legacy) - 1;
7998 
7999 	if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
8000 		rate_idx += ATH11K_MAC_FIRST_OFDM_RATE_IDX;
8001 
8002 	hw_rate = ath11k_legacy_rates[rate_idx].hw_value;
8003 	bitrate = ath11k_legacy_rates[rate_idx].bitrate;
8004 
8005 	if (ath11k_mac_bitrate_is_cck(bitrate))
8006 		preamble = WMI_RATE_PREAMBLE_CCK;
8007 	else
8008 		preamble = WMI_RATE_PREAMBLE_OFDM;
8009 
8010 	*nss = 1;
8011 	*rate = ATH11K_HW_RATE_CODE(hw_rate, 0, preamble);
8012 
8013 	return 0;
8014 }
8015 
8016 static int
8017 ath11k_mac_set_fixed_rate_gi_ltf(struct ath11k_vif *arvif, u8 he_gi, u8 he_ltf)
8018 {
8019 	struct ath11k *ar = arvif->ar;
8020 	int ret;
8021 
8022 	/* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
8023 	if (he_gi && he_gi != 0xFF)
8024 		he_gi += 1;
8025 
8026 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8027 					    WMI_VDEV_PARAM_SGI, he_gi);
8028 	if (ret) {
8029 		ath11k_warn(ar->ab, "failed to set he gi %d: %d\n",
8030 			    he_gi, ret);
8031 		return ret;
8032 	}
8033 	/* start from 1 */
8034 	if (he_ltf != 0xFF)
8035 		he_ltf += 1;
8036 
8037 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8038 					    WMI_VDEV_PARAM_HE_LTF, he_ltf);
8039 	if (ret) {
8040 		ath11k_warn(ar->ab, "failed to set he ltf %d: %d\n",
8041 			    he_ltf, ret);
8042 		return ret;
8043 	}
8044 
8045 	return 0;
8046 }
8047 
8048 static int
8049 ath11k_mac_set_auto_rate_gi_ltf(struct ath11k_vif *arvif, u16 he_gi, u8 he_ltf)
8050 {
8051 	struct ath11k *ar = arvif->ar;
8052 	int ret;
8053 	u32 he_ar_gi_ltf;
8054 
8055 	if (he_gi != 0xFF) {
8056 		switch (he_gi) {
8057 		case NL80211_RATE_INFO_HE_GI_0_8:
8058 			he_gi = WMI_AUTORATE_800NS_GI;
8059 			break;
8060 		case NL80211_RATE_INFO_HE_GI_1_6:
8061 			he_gi = WMI_AUTORATE_1600NS_GI;
8062 			break;
8063 		case NL80211_RATE_INFO_HE_GI_3_2:
8064 			he_gi = WMI_AUTORATE_3200NS_GI;
8065 			break;
8066 		default:
8067 			ath11k_warn(ar->ab, "invalid he gi: %d\n", he_gi);
8068 			return -EINVAL;
8069 		}
8070 	}
8071 
8072 	if (he_ltf != 0xFF) {
8073 		switch (he_ltf) {
8074 		case NL80211_RATE_INFO_HE_1XLTF:
8075 			he_ltf = WMI_HE_AUTORATE_LTF_1X;
8076 			break;
8077 		case NL80211_RATE_INFO_HE_2XLTF:
8078 			he_ltf = WMI_HE_AUTORATE_LTF_2X;
8079 			break;
8080 		case NL80211_RATE_INFO_HE_4XLTF:
8081 			he_ltf = WMI_HE_AUTORATE_LTF_4X;
8082 			break;
8083 		default:
8084 			ath11k_warn(ar->ab, "invalid he ltf: %d\n", he_ltf);
8085 			return -EINVAL;
8086 		}
8087 	}
8088 
8089 	he_ar_gi_ltf = he_gi | he_ltf;
8090 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8091 					    WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
8092 					    he_ar_gi_ltf);
8093 	if (ret) {
8094 		ath11k_warn(ar->ab,
8095 			    "failed to set he autorate gi %u ltf %u: %d\n",
8096 			    he_gi, he_ltf, ret);
8097 		return ret;
8098 	}
8099 
8100 	return 0;
8101 }
8102 
8103 static int ath11k_mac_set_rate_params(struct ath11k_vif *arvif,
8104 				      u32 rate, u8 nss, u8 sgi, u8 ldpc,
8105 				      u8 he_gi, u8 he_ltf, bool he_fixed_rate)
8106 {
8107 	struct ath11k *ar = arvif->ar;
8108 	u32 vdev_param;
8109 	int ret;
8110 
8111 	lockdep_assert_held(&ar->conf_mutex);
8112 
8113 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8114 		   "set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n",
8115 		   arvif->vdev_id, rate, nss, sgi, ldpc, he_gi,
8116 		   he_ltf, he_fixed_rate);
8117 
8118 	if (!arvif->vif->bss_conf.he_support) {
8119 		vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
8120 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8121 						    vdev_param, rate);
8122 		if (ret) {
8123 			ath11k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
8124 				    rate, ret);
8125 			return ret;
8126 		}
8127 	}
8128 
8129 	vdev_param = WMI_VDEV_PARAM_NSS;
8130 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8131 					    vdev_param, nss);
8132 	if (ret) {
8133 		ath11k_warn(ar->ab, "failed to set nss param %d: %d\n",
8134 			    nss, ret);
8135 		return ret;
8136 	}
8137 
8138 	vdev_param = WMI_VDEV_PARAM_LDPC;
8139 	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8140 					    vdev_param, ldpc);
8141 	if (ret) {
8142 		ath11k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
8143 			    ldpc, ret);
8144 		return ret;
8145 	}
8146 
8147 	if (arvif->vif->bss_conf.he_support) {
8148 		if (he_fixed_rate) {
8149 			ret = ath11k_mac_set_fixed_rate_gi_ltf(arvif, he_gi,
8150 							       he_ltf);
8151 			if (ret) {
8152 				ath11k_warn(ar->ab, "failed to set fixed rate gi ltf: %d\n",
8153 					    ret);
8154 				return ret;
8155 			}
8156 		} else {
8157 			ret = ath11k_mac_set_auto_rate_gi_ltf(arvif, he_gi,
8158 							      he_ltf);
8159 			if (ret) {
8160 				ath11k_warn(ar->ab, "failed to set auto rate gi ltf: %d\n",
8161 					    ret);
8162 				return ret;
8163 			}
8164 		}
8165 	} else {
8166 		vdev_param = WMI_VDEV_PARAM_SGI;
8167 		ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
8168 						    vdev_param, sgi);
8169 		if (ret) {
8170 			ath11k_warn(ar->ab, "failed to set sgi param %d: %d\n",
8171 				    sgi, ret);
8172 			return ret;
8173 		}
8174 	}
8175 
8176 	return 0;
8177 }
8178 
8179 static bool
8180 ath11k_mac_vht_mcs_range_present(struct ath11k *ar,
8181 				 enum nl80211_band band,
8182 				 const struct cfg80211_bitrate_mask *mask)
8183 {
8184 	int i;
8185 	u16 vht_mcs;
8186 
8187 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
8188 		vht_mcs = mask->control[band].vht_mcs[i];
8189 
8190 		switch (vht_mcs) {
8191 		case 0:
8192 		case BIT(8) - 1:
8193 		case BIT(9) - 1:
8194 		case BIT(10) - 1:
8195 			break;
8196 		default:
8197 			return false;
8198 		}
8199 	}
8200 
8201 	return true;
8202 }
8203 
8204 static bool
8205 ath11k_mac_he_mcs_range_present(struct ath11k *ar,
8206 				enum nl80211_band band,
8207 				const struct cfg80211_bitrate_mask *mask)
8208 {
8209 	int i;
8210 	u16 he_mcs;
8211 
8212 	for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
8213 		he_mcs = mask->control[band].he_mcs[i];
8214 
8215 		switch (he_mcs) {
8216 		case 0:
8217 		case BIT(8) - 1:
8218 		case BIT(10) - 1:
8219 		case BIT(12) - 1:
8220 			break;
8221 		default:
8222 			return false;
8223 		}
8224 	}
8225 
8226 	return true;
8227 }
8228 
8229 static void ath11k_mac_set_bitrate_mask_iter(void *data,
8230 					     struct ieee80211_sta *sta)
8231 {
8232 	struct ath11k_vif *arvif = data;
8233 	struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8234 	struct ath11k *ar = arvif->ar;
8235 
8236 	spin_lock_bh(&ar->data_lock);
8237 	arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
8238 	spin_unlock_bh(&ar->data_lock);
8239 
8240 	ieee80211_queue_work(ar->hw, &arsta->update_wk);
8241 }
8242 
8243 static void ath11k_mac_disable_peer_fixed_rate(void *data,
8244 					       struct ieee80211_sta *sta)
8245 {
8246 	struct ath11k_vif *arvif = data;
8247 	struct ath11k *ar = arvif->ar;
8248 	int ret;
8249 
8250 	ret = ath11k_wmi_set_peer_param(ar, sta->addr,
8251 					arvif->vdev_id,
8252 					WMI_PEER_PARAM_FIXED_RATE,
8253 					WMI_FIXED_RATE_NONE);
8254 	if (ret)
8255 		ath11k_warn(ar->ab,
8256 			    "failed to disable peer fixed rate for STA %pM ret %d\n",
8257 			    sta->addr, ret);
8258 }
8259 
8260 static bool
8261 ath11k_mac_validate_vht_he_fixed_rate_settings(struct ath11k *ar, enum nl80211_band band,
8262 					       const struct cfg80211_bitrate_mask *mask)
8263 {
8264 	bool he_fixed_rate = false, vht_fixed_rate = false;
8265 	struct ath11k_peer *peer;
8266 	const u16 *vht_mcs_mask, *he_mcs_mask;
8267 	struct ieee80211_link_sta *deflink;
8268 	u8 vht_nss, he_nss;
8269 	bool ret = true;
8270 
8271 	vht_mcs_mask = mask->control[band].vht_mcs;
8272 	he_mcs_mask = mask->control[band].he_mcs;
8273 
8274 	if (ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
8275 		vht_fixed_rate = true;
8276 
8277 	if (ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
8278 		he_fixed_rate = true;
8279 
8280 	if (!vht_fixed_rate && !he_fixed_rate)
8281 		return true;
8282 
8283 	vht_nss = ath11k_mac_max_vht_nss(vht_mcs_mask);
8284 	he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
8285 
8286 	rcu_read_lock();
8287 	spin_lock_bh(&ar->ab->base_lock);
8288 	list_for_each_entry(peer, &ar->ab->peers, list) {
8289 		if (peer->sta) {
8290 			deflink = &peer->sta->deflink;
8291 
8292 			if (vht_fixed_rate && (!deflink->vht_cap.vht_supported ||
8293 					       deflink->rx_nss < vht_nss)) {
8294 				ret = false;
8295 				goto out;
8296 			}
8297 
8298 			if (he_fixed_rate && (!deflink->he_cap.has_he ||
8299 					      deflink->rx_nss < he_nss)) {
8300 				ret = false;
8301 				goto out;
8302 			}
8303 		}
8304 	}
8305 
8306 out:
8307 	spin_unlock_bh(&ar->ab->base_lock);
8308 	rcu_read_unlock();
8309 	return ret;
8310 }
8311 
8312 static int
8313 ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
8314 			       struct ieee80211_vif *vif,
8315 			       const struct cfg80211_bitrate_mask *mask)
8316 {
8317 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8318 	struct cfg80211_chan_def def;
8319 	struct ath11k_pdev_cap *cap;
8320 	struct ath11k *ar = arvif->ar;
8321 	enum nl80211_band band;
8322 	const u8 *ht_mcs_mask;
8323 	const u16 *vht_mcs_mask;
8324 	const u16 *he_mcs_mask;
8325 	u8 he_ltf = 0;
8326 	u8 he_gi = 0;
8327 	u32 rate;
8328 	u8 nss;
8329 	u8 sgi;
8330 	u8 ldpc;
8331 	int single_nss;
8332 	int ret;
8333 	int num_rates;
8334 	bool he_fixed_rate = false;
8335 
8336 	if (ath11k_mac_vif_chan(vif, &def))
8337 		return -EPERM;
8338 
8339 	band = def.chan->band;
8340 	cap = &ar->pdev->cap;
8341 	ht_mcs_mask = mask->control[band].ht_mcs;
8342 	vht_mcs_mask = mask->control[band].vht_mcs;
8343 	he_mcs_mask = mask->control[band].he_mcs;
8344 	ldpc = !!(cap->band[band].ht_cap_info & WMI_HT_CAP_TX_LDPC);
8345 
8346 	sgi = mask->control[band].gi;
8347 	if (sgi == NL80211_TXRATE_FORCE_LGI)
8348 		return -EINVAL;
8349 
8350 	he_gi = mask->control[band].he_gi;
8351 	he_ltf = mask->control[band].he_ltf;
8352 
8353 	/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
8354 	 * requires passing at least one of used basic rates along with them.
8355 	 * Fixed rate setting across different preambles(legacy, HT, VHT) is
8356 	 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
8357 	 * suitable for setting single HT/VHT rates.
8358 	 * But, there could be a single basic rate passed from userspace which
8359 	 * can be done through the FIXED_RATE param.
8360 	 */
8361 	if (ath11k_mac_has_single_legacy_rate(ar, band, mask)) {
8362 		ret = ath11k_mac_get_single_legacy_rate(ar, band, mask, &rate,
8363 							&nss);
8364 		if (ret) {
8365 			ath11k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
8366 				    arvif->vdev_id, ret);
8367 			return ret;
8368 		}
8369 		ieee80211_iterate_stations_atomic(ar->hw,
8370 						  ath11k_mac_disable_peer_fixed_rate,
8371 						  arvif);
8372 	} else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
8373 							  &single_nss)) {
8374 		rate = WMI_FIXED_RATE_NONE;
8375 		nss = single_nss;
8376 		mutex_lock(&ar->conf_mutex);
8377 		arvif->bitrate_mask = *mask;
8378 		ieee80211_iterate_stations_atomic(ar->hw,
8379 						  ath11k_mac_set_bitrate_mask_iter,
8380 						  arvif);
8381 		mutex_unlock(&ar->conf_mutex);
8382 	} else {
8383 		rate = WMI_FIXED_RATE_NONE;
8384 
8385 		if (!ath11k_mac_validate_vht_he_fixed_rate_settings(ar, band, mask))
8386 			ath11k_warn(ar->ab,
8387 				    "could not update fixed rate settings to all peers due to mcs/nss incompatibility\n");
8388 		nss = min_t(u32, ar->num_tx_chains,
8389 			    ath11k_mac_max_nss(ht_mcs_mask, vht_mcs_mask, he_mcs_mask));
8390 
8391 		/* If multiple rates across different preambles are given
8392 		 * we can reconfigure this info with all peers using PEER_ASSOC
8393 		 * command with the below exception cases.
8394 		 * - Single VHT Rate : peer_assoc command accommodates only MCS
8395 		 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
8396 		 * mandates passing basic rates along with HT/VHT rates, FW
8397 		 * doesn't allow switching from VHT to Legacy. Hence instead of
8398 		 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
8399 		 * we could set this VHT rate as peer fixed rate param, which
8400 		 * will override FIXED rate and FW rate control algorithm.
8401 		 * If single VHT rate is passed along with HT rates, we select
8402 		 * the VHT rate as fixed rate for vht peers.
8403 		 * - Multiple VHT Rates : When Multiple VHT rates are given,this
8404 		 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
8405 		 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
8406 		 * RATEMASK_CMDID can cover all use cases of setting rates
8407 		 * across multiple preambles and rates within same type.
8408 		 * But requires more validation of the command at this point.
8409 		 */
8410 
8411 		num_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
8412 								  mask);
8413 
8414 		if (!ath11k_mac_vht_mcs_range_present(ar, band, mask) &&
8415 		    num_rates > 1) {
8416 			/* TODO: Handle multiple VHT MCS values setting using
8417 			 * RATEMASK CMD
8418 			 */
8419 			ath11k_warn(ar->ab,
8420 				    "setting %d mcs values in bitrate mask not supported\n",
8421 				num_rates);
8422 			return -EINVAL;
8423 		}
8424 
8425 		num_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band,
8426 								 mask);
8427 		if (num_rates == 1)
8428 			he_fixed_rate = true;
8429 
8430 		if (!ath11k_mac_he_mcs_range_present(ar, band, mask) &&
8431 		    num_rates > 1) {
8432 			ath11k_warn(ar->ab,
8433 				    "Setting more than one HE MCS Value in bitrate mask not supported\n");
8434 			return -EINVAL;
8435 		}
8436 
8437 		mutex_lock(&ar->conf_mutex);
8438 		ieee80211_iterate_stations_atomic(ar->hw,
8439 						  ath11k_mac_disable_peer_fixed_rate,
8440 						  arvif);
8441 
8442 		arvif->bitrate_mask = *mask;
8443 		ieee80211_iterate_stations_atomic(ar->hw,
8444 						  ath11k_mac_set_bitrate_mask_iter,
8445 						  arvif);
8446 
8447 		mutex_unlock(&ar->conf_mutex);
8448 	}
8449 
8450 	mutex_lock(&ar->conf_mutex);
8451 
8452 	ret = ath11k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
8453 					 he_ltf, he_fixed_rate);
8454 	if (ret) {
8455 		ath11k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
8456 			    arvif->vdev_id, ret);
8457 	}
8458 
8459 	mutex_unlock(&ar->conf_mutex);
8460 
8461 	return ret;
8462 }
8463 
8464 static void
8465 ath11k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
8466 				enum ieee80211_reconfig_type reconfig_type)
8467 {
8468 	struct ath11k *ar = hw->priv;
8469 	struct ath11k_base *ab = ar->ab;
8470 	int recovery_count;
8471 	struct ath11k_vif *arvif;
8472 
8473 	if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
8474 		return;
8475 
8476 	mutex_lock(&ar->conf_mutex);
8477 
8478 	if (ar->state == ATH11K_STATE_RESTARTED) {
8479 		ath11k_warn(ar->ab, "pdev %d successfully recovered\n",
8480 			    ar->pdev->pdev_id);
8481 		ar->state = ATH11K_STATE_ON;
8482 		ieee80211_wake_queues(ar->hw);
8483 
8484 		if (ar->ab->hw_params.current_cc_support &&
8485 		    ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
8486 			struct wmi_set_current_country_params set_current_param = {};
8487 
8488 			memcpy(&set_current_param.alpha2, ar->alpha2, 2);
8489 			ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
8490 		}
8491 
8492 		if (ab->is_reset) {
8493 			recovery_count = atomic_inc_return(&ab->recovery_count);
8494 			ath11k_dbg(ab, ATH11K_DBG_BOOT,
8495 				   "recovery count %d\n", recovery_count);
8496 			/* When there are multiple radios in an SOC,
8497 			 * the recovery has to be done for each radio
8498 			 */
8499 			if (recovery_count == ab->num_radios) {
8500 				atomic_dec(&ab->reset_count);
8501 				complete(&ab->reset_complete);
8502 				ab->is_reset = false;
8503 				atomic_set(&ab->fail_cont_count, 0);
8504 				ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n");
8505 			}
8506 		}
8507 		if (ar->ab->hw_params.support_fw_mac_sequence) {
8508 			list_for_each_entry(arvif, &ar->arvifs, list) {
8509 				if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
8510 					ieee80211_hw_restart_disconnect(arvif->vif);
8511 			}
8512 		}
8513 	}
8514 
8515 	mutex_unlock(&ar->conf_mutex);
8516 }
8517 
8518 static void
8519 ath11k_mac_update_bss_chan_survey(struct ath11k *ar,
8520 				  struct ieee80211_channel *channel)
8521 {
8522 	int ret;
8523 	enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
8524 
8525 	lockdep_assert_held(&ar->conf_mutex);
8526 
8527 	if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
8528 	    ar->rx_channel != channel)
8529 		return;
8530 
8531 	if (ar->scan.state != ATH11K_SCAN_IDLE) {
8532 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8533 			   "ignoring bss chan info req while scanning..\n");
8534 		return;
8535 	}
8536 
8537 	reinit_completion(&ar->bss_survey_done);
8538 
8539 	ret = ath11k_wmi_pdev_bss_chan_info_request(ar, type);
8540 	if (ret) {
8541 		ath11k_warn(ar->ab, "failed to send pdev bss chan info request\n");
8542 		return;
8543 	}
8544 
8545 	ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
8546 	if (ret == 0)
8547 		ath11k_warn(ar->ab, "bss channel survey timed out\n");
8548 }
8549 
8550 static int ath11k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
8551 				    struct survey_info *survey)
8552 {
8553 	struct ath11k *ar = hw->priv;
8554 	struct ieee80211_supported_band *sband;
8555 	struct survey_info *ar_survey;
8556 	int ret = 0;
8557 
8558 	if (idx >= ATH11K_NUM_CHANS)
8559 		return -ENOENT;
8560 
8561 	ar_survey = &ar->survey[idx];
8562 
8563 	mutex_lock(&ar->conf_mutex);
8564 
8565 	sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
8566 	if (sband && idx >= sband->n_channels) {
8567 		idx -= sband->n_channels;
8568 		sband = NULL;
8569 	}
8570 
8571 	if (!sband)
8572 		sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
8573 	if (sband && idx >= sband->n_channels) {
8574 		idx -= sband->n_channels;
8575 		sband = NULL;
8576 	}
8577 
8578 	if (!sband)
8579 		sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
8580 	if (!sband || idx >= sband->n_channels) {
8581 		ret = -ENOENT;
8582 		goto exit;
8583 	}
8584 
8585 	ath11k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
8586 
8587 	spin_lock_bh(&ar->data_lock);
8588 	memcpy(survey, ar_survey, sizeof(*survey));
8589 	spin_unlock_bh(&ar->data_lock);
8590 
8591 	survey->channel = &sband->channels[idx];
8592 
8593 	if (ar->rx_channel == survey->channel)
8594 		survey->filled |= SURVEY_INFO_IN_USE;
8595 
8596 exit:
8597 	mutex_unlock(&ar->conf_mutex);
8598 	return ret;
8599 }
8600 
8601 static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
8602 				      struct ath11k_sta *arsta,
8603 				      char *pre,
8604 				      bool clear)
8605 {
8606 	struct ath11k *ar = arsta->arvif->ar;
8607 	int i;
8608 	s8 rssi;
8609 
8610 	for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
8611 		sinfo->chains &= ~BIT(i);
8612 		rssi = arsta->chain_signal[i];
8613 		if (clear)
8614 			arsta->chain_signal[i] = ATH11K_INVALID_RSSI_FULL;
8615 
8616 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8617 			   "sta statistics %s rssi[%d] %d\n", pre, i, rssi);
8618 
8619 		if (rssi != ATH11K_DEFAULT_NOISE_FLOOR &&
8620 		    rssi != ATH11K_INVALID_RSSI_FULL &&
8621 		    rssi != ATH11K_INVALID_RSSI_EMPTY &&
8622 		    rssi != 0) {
8623 			sinfo->chain_signal[i] = rssi;
8624 			sinfo->chains |= BIT(i);
8625 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
8626 		}
8627 	}
8628 }
8629 
8630 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
8631 					 struct ieee80211_vif *vif,
8632 					 struct ieee80211_sta *sta,
8633 					 struct station_info *sinfo)
8634 {
8635 	struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
8636 	struct ath11k *ar = arsta->arvif->ar;
8637 	s8 signal;
8638 	bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
8639 			       ar->ab->wmi_ab.svc_map);
8640 
8641 	sinfo->rx_duration = arsta->rx_duration;
8642 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
8643 
8644 	sinfo->tx_duration = arsta->tx_duration;
8645 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
8646 
8647 	if (arsta->txrate.legacy || arsta->txrate.nss) {
8648 		if (arsta->txrate.legacy) {
8649 			sinfo->txrate.legacy = arsta->txrate.legacy;
8650 		} else {
8651 			sinfo->txrate.mcs = arsta->txrate.mcs;
8652 			sinfo->txrate.nss = arsta->txrate.nss;
8653 			sinfo->txrate.bw = arsta->txrate.bw;
8654 			sinfo->txrate.he_gi = arsta->txrate.he_gi;
8655 			sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
8656 			sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
8657 		}
8658 		sinfo->txrate.flags = arsta->txrate.flags;
8659 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
8660 	}
8661 
8662 	ath11k_mac_put_chain_rssi(sinfo, arsta, "ppdu", false);
8663 
8664 	if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
8665 	    arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8666 	    ar->ab->hw_params.supports_rssi_stats &&
8667 	    !ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8668 					 WMI_REQUEST_RSSI_PER_CHAIN_STAT)) {
8669 		ath11k_mac_put_chain_rssi(sinfo, arsta, "fw stats", true);
8670 	}
8671 
8672 	signal = arsta->rssi_comb;
8673 	if (!signal &&
8674 	    arsta->arvif->vdev_type == WMI_VDEV_TYPE_STA &&
8675 	    ar->ab->hw_params.supports_rssi_stats &&
8676 	    !(ath11k_debugfs_get_fw_stats(ar, ar->pdev->pdev_id, 0,
8677 					WMI_REQUEST_VDEV_STAT)))
8678 		signal = arsta->rssi_beacon;
8679 
8680 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
8681 		   "sta statistics db2dbm %u rssi comb %d rssi beacon %d\n",
8682 		   db2dbm, arsta->rssi_comb, arsta->rssi_beacon);
8683 
8684 	if (signal) {
8685 		sinfo->signal = db2dbm ? signal : signal + ATH11K_DEFAULT_NOISE_FLOOR;
8686 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
8687 	}
8688 
8689 	sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi) +
8690 		ATH11K_DEFAULT_NOISE_FLOOR;
8691 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
8692 }
8693 
8694 #if IS_ENABLED(CONFIG_IPV6)
8695 static void ath11k_generate_ns_mc_addr(struct ath11k *ar,
8696 				       struct ath11k_arp_ns_offload *offload)
8697 {
8698 	int i;
8699 
8700 	for (i = 0; i < offload->ipv6_count; i++) {
8701 		offload->self_ipv6_addr[i][0] = 0xff;
8702 		offload->self_ipv6_addr[i][1] = 0x02;
8703 		offload->self_ipv6_addr[i][11] = 0x01;
8704 		offload->self_ipv6_addr[i][12] = 0xff;
8705 		offload->self_ipv6_addr[i][13] =
8706 					offload->ipv6_addr[i][13];
8707 		offload->self_ipv6_addr[i][14] =
8708 					offload->ipv6_addr[i][14];
8709 		offload->self_ipv6_addr[i][15] =
8710 					offload->ipv6_addr[i][15];
8711 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "NS solicited addr %pI6\n",
8712 			   offload->self_ipv6_addr[i]);
8713 	}
8714 }
8715 
8716 static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw,
8717 				       struct ieee80211_vif *vif,
8718 				       struct inet6_dev *idev)
8719 {
8720 	struct ath11k *ar = hw->priv;
8721 	struct ath11k_arp_ns_offload *offload;
8722 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8723 	struct inet6_ifaddr *ifa6;
8724 	struct ifacaddr6 *ifaca6;
8725 	struct list_head *p;
8726 	u32 count, scope;
8727 
8728 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "op ipv6 changed\n");
8729 
8730 	offload = &arvif->arp_ns_offload;
8731 	count = 0;
8732 
8733 	read_lock_bh(&idev->lock);
8734 
8735 	memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr));
8736 	memset(offload->self_ipv6_addr, 0, sizeof(offload->self_ipv6_addr));
8737 	memcpy(offload->mac_addr, vif->addr, ETH_ALEN);
8738 
8739 	/* get unicast address */
8740 	list_for_each(p, &idev->addr_list) {
8741 		if (count >= ATH11K_IPV6_MAX_COUNT)
8742 			goto generate;
8743 
8744 		ifa6 = list_entry(p, struct inet6_ifaddr, if_list);
8745 		if (ifa6->flags & IFA_F_DADFAILED)
8746 			continue;
8747 		scope = ipv6_addr_src_scope(&ifa6->addr);
8748 		if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8749 		    scope == IPV6_ADDR_SCOPE_GLOBAL) {
8750 			memcpy(offload->ipv6_addr[count], &ifa6->addr.s6_addr,
8751 			       sizeof(ifa6->addr.s6_addr));
8752 			offload->ipv6_type[count] = ATH11K_IPV6_UC_TYPE;
8753 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 uc %pI6 scope %d\n",
8754 				   count, offload->ipv6_addr[count],
8755 				   scope);
8756 			count++;
8757 		} else {
8758 			ath11k_warn(ar->ab, "Unsupported ipv6 scope: %d\n", scope);
8759 		}
8760 	}
8761 
8762 	/* get anycast address */
8763 	for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) {
8764 		if (count >= ATH11K_IPV6_MAX_COUNT)
8765 			goto generate;
8766 
8767 		scope = ipv6_addr_src_scope(&ifaca6->aca_addr);
8768 		if (scope == IPV6_ADDR_SCOPE_LINKLOCAL ||
8769 		    scope == IPV6_ADDR_SCOPE_GLOBAL) {
8770 			memcpy(offload->ipv6_addr[count], &ifaca6->aca_addr,
8771 			       sizeof(ifaca6->aca_addr));
8772 			offload->ipv6_type[count] = ATH11K_IPV6_AC_TYPE;
8773 			ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "count %d ipv6 ac %pI6 scope %d\n",
8774 				   count, offload->ipv6_addr[count],
8775 				   scope);
8776 			count++;
8777 		} else {
8778 			ath11k_warn(ar->ab, "Unsupported ipv scope: %d\n", scope);
8779 		}
8780 	}
8781 
8782 generate:
8783 	offload->ipv6_count = count;
8784 	read_unlock_bh(&idev->lock);
8785 
8786 	/* generate ns multicast address */
8787 	ath11k_generate_ns_mc_addr(ar, offload);
8788 }
8789 #endif
8790 
8791 static void ath11k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
8792 					 struct ieee80211_vif *vif,
8793 					 struct cfg80211_gtk_rekey_data *data)
8794 {
8795 	struct ath11k *ar = hw->priv;
8796 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8797 	struct ath11k_rekey_data *rekey_data = &arvif->rekey_data;
8798 
8799 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "set rekey data vdev %d\n",
8800 		   arvif->vdev_id);
8801 
8802 	mutex_lock(&ar->conf_mutex);
8803 
8804 	memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
8805 	memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
8806 
8807 	/* The supplicant works on big-endian, the firmware expects it on
8808 	 * little endian.
8809 	 */
8810 	rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
8811 
8812 	arvif->rekey_data.enable_offload = true;
8813 
8814 	ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kck", NULL,
8815 			rekey_data->kck, NL80211_KCK_LEN);
8816 	ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "kek", NULL,
8817 			rekey_data->kck, NL80211_KEK_LEN);
8818 	ath11k_dbg_dump(ar->ab, ATH11K_DBG_MAC, "replay ctr", NULL,
8819 			&rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
8820 
8821 	mutex_unlock(&ar->conf_mutex);
8822 }
8823 
8824 static int ath11k_mac_op_set_bios_sar_specs(struct ieee80211_hw *hw,
8825 					    const struct cfg80211_sar_specs *sar)
8826 {
8827 	struct ath11k *ar = hw->priv;
8828 	const struct cfg80211_sar_sub_specs *sspec;
8829 	int ret, index;
8830 	u8 *sar_tbl;
8831 	u32 i;
8832 
8833 	if (!sar || sar->type != NL80211_SAR_TYPE_POWER ||
8834 	    sar->num_sub_specs == 0)
8835 		return -EINVAL;
8836 
8837 	mutex_lock(&ar->conf_mutex);
8838 
8839 	if (!test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) ||
8840 	    !ar->ab->hw_params.bios_sar_capa) {
8841 		ret = -EOPNOTSUPP;
8842 		goto exit;
8843 	}
8844 
8845 	ret = ath11k_wmi_pdev_set_bios_geo_table_param(ar);
8846 	if (ret) {
8847 		ath11k_warn(ar->ab, "failed to set geo table: %d\n", ret);
8848 		goto exit;
8849 	}
8850 
8851 	sar_tbl = kzalloc(BIOS_SAR_TABLE_LEN, GFP_KERNEL);
8852 	if (!sar_tbl) {
8853 		ret = -ENOMEM;
8854 		goto exit;
8855 	}
8856 
8857 	sspec = sar->sub_specs;
8858 	for (i = 0; i < sar->num_sub_specs; i++) {
8859 		if (sspec->freq_range_index >= (BIOS_SAR_TABLE_LEN >> 1)) {
8860 			ath11k_warn(ar->ab, "Ignore bad frequency index %u, max allowed %u\n",
8861 				    sspec->freq_range_index, BIOS_SAR_TABLE_LEN >> 1);
8862 			continue;
8863 		}
8864 
8865 		/* chain0 and chain1 share same power setting */
8866 		sar_tbl[sspec->freq_range_index] = sspec->power;
8867 		index = sspec->freq_range_index + (BIOS_SAR_TABLE_LEN >> 1);
8868 		sar_tbl[index] = sspec->power;
8869 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "sar tbl[%d] = %d\n",
8870 			   sspec->freq_range_index, sar_tbl[sspec->freq_range_index]);
8871 		sspec++;
8872 	}
8873 
8874 	ret = ath11k_wmi_pdev_set_bios_sar_table_param(ar, sar_tbl);
8875 	if (ret)
8876 		ath11k_warn(ar->ab, "failed to set sar power: %d", ret);
8877 
8878 	kfree(sar_tbl);
8879 exit:
8880 	mutex_unlock(&ar->conf_mutex);
8881 
8882 	return ret;
8883 }
8884 
8885 static int ath11k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
8886 						  struct ieee80211_vif *vif)
8887 {
8888 	struct ath11k *ar = hw->priv;
8889 
8890 	mutex_lock(&ar->conf_mutex);
8891 
8892 	spin_lock_bh(&ar->data_lock);
8893 	ar->scan.roc_notify = false;
8894 	spin_unlock_bh(&ar->data_lock);
8895 
8896 	ath11k_scan_abort(ar);
8897 
8898 	mutex_unlock(&ar->conf_mutex);
8899 
8900 	cancel_delayed_work_sync(&ar->scan.timeout);
8901 
8902 	return 0;
8903 }
8904 
8905 static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
8906 					   struct ieee80211_vif *vif,
8907 					   struct ieee80211_channel *chan,
8908 					   int duration,
8909 					   enum ieee80211_roc_type type)
8910 {
8911 	struct ath11k *ar = hw->priv;
8912 	struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
8913 	struct scan_req_params *arg;
8914 	int ret;
8915 	u32 scan_time_msec;
8916 
8917 	mutex_lock(&ar->conf_mutex);
8918 
8919 	spin_lock_bh(&ar->data_lock);
8920 	switch (ar->scan.state) {
8921 	case ATH11K_SCAN_IDLE:
8922 		reinit_completion(&ar->scan.started);
8923 		reinit_completion(&ar->scan.completed);
8924 		reinit_completion(&ar->scan.on_channel);
8925 		ar->scan.state = ATH11K_SCAN_STARTING;
8926 		ar->scan.is_roc = true;
8927 		ar->scan.vdev_id = arvif->vdev_id;
8928 		ar->scan.roc_freq = chan->center_freq;
8929 		ar->scan.roc_notify = true;
8930 		ret = 0;
8931 		break;
8932 	case ATH11K_SCAN_STARTING:
8933 	case ATH11K_SCAN_RUNNING:
8934 	case ATH11K_SCAN_ABORTING:
8935 		ret = -EBUSY;
8936 		break;
8937 	}
8938 	spin_unlock_bh(&ar->data_lock);
8939 
8940 	if (ret)
8941 		goto exit;
8942 
8943 	scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
8944 
8945 	arg = kzalloc(sizeof(*arg), GFP_KERNEL);
8946 	if (!arg) {
8947 		ret = -ENOMEM;
8948 		goto exit;
8949 	}
8950 	ath11k_wmi_start_scan_init(ar, arg);
8951 	arg->num_chan = 1;
8952 	arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
8953 				 GFP_KERNEL);
8954 	if (!arg->chan_list) {
8955 		ret = -ENOMEM;
8956 		goto free_arg;
8957 	}
8958 
8959 	arg->vdev_id = arvif->vdev_id;
8960 	arg->scan_id = ATH11K_SCAN_ID;
8961 	arg->chan_list[0] = chan->center_freq;
8962 	arg->dwell_time_active = scan_time_msec;
8963 	arg->dwell_time_passive = scan_time_msec;
8964 	arg->max_scan_time = scan_time_msec;
8965 	arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE;
8966 	arg->scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
8967 	arg->burst_duration = duration;
8968 
8969 	ret = ath11k_start_scan(ar, arg);
8970 	if (ret) {
8971 		ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
8972 
8973 		spin_lock_bh(&ar->data_lock);
8974 		ar->scan.state = ATH11K_SCAN_IDLE;
8975 		spin_unlock_bh(&ar->data_lock);
8976 		goto free_chan_list;
8977 	}
8978 
8979 	ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
8980 	if (ret == 0) {
8981 		ath11k_warn(ar->ab, "failed to switch to channel for roc scan\n");
8982 		ret = ath11k_scan_stop(ar);
8983 		if (ret)
8984 			ath11k_warn(ar->ab, "failed to stop scan: %d\n", ret);
8985 		ret = -ETIMEDOUT;
8986 		goto free_chan_list;
8987 	}
8988 
8989 	ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
8990 				     msecs_to_jiffies(duration));
8991 
8992 	ret = 0;
8993 
8994 free_chan_list:
8995 	kfree(arg->chan_list);
8996 free_arg:
8997 	kfree(arg);
8998 exit:
8999 	mutex_unlock(&ar->conf_mutex);
9000 	return ret;
9001 }
9002 
9003 static int ath11k_fw_stats_request(struct ath11k *ar,
9004 				   struct stats_request_params *req_param)
9005 {
9006 	struct ath11k_base *ab = ar->ab;
9007 	unsigned long time_left;
9008 	int ret;
9009 
9010 	lockdep_assert_held(&ar->conf_mutex);
9011 
9012 	spin_lock_bh(&ar->data_lock);
9013 	ar->fw_stats_done = false;
9014 	ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
9015 	spin_unlock_bh(&ar->data_lock);
9016 
9017 	reinit_completion(&ar->fw_stats_complete);
9018 
9019 	ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
9020 	if (ret) {
9021 		ath11k_warn(ab, "could not request fw stats (%d)\n",
9022 			    ret);
9023 		return ret;
9024 	}
9025 
9026 	time_left = wait_for_completion_timeout(&ar->fw_stats_complete,
9027 						1 * HZ);
9028 
9029 	if (!time_left)
9030 		return -ETIMEDOUT;
9031 
9032 	return 0;
9033 }
9034 
9035 static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
9036 				     struct ieee80211_vif *vif,
9037 				     int *dbm)
9038 {
9039 	struct ath11k *ar = hw->priv;
9040 	struct ath11k_base *ab = ar->ab;
9041 	struct stats_request_params req_param = {0};
9042 	struct ath11k_fw_stats_pdev *pdev;
9043 	int ret;
9044 
9045 	/* Final Tx power is minimum of Target Power, CTL power, Regulatory
9046 	 * Power, PSD EIRP Power. We just know the Regulatory power from the
9047 	 * regulatory rules obtained. FW knows all these power and sets the min
9048 	 * of these. Hence, we request the FW pdev stats in which FW reports
9049 	 * the minimum of all vdev's channel Tx power.
9050 	 */
9051 	mutex_lock(&ar->conf_mutex);
9052 
9053 	if (ar->state != ATH11K_STATE_ON)
9054 		goto err_fallback;
9055 
9056 	/* Firmware doesn't provide Tx power during CAC hence no need to fetch
9057 	 * the stats.
9058 	 */
9059 	if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
9060 		mutex_unlock(&ar->conf_mutex);
9061 		return -EAGAIN;
9062 	}
9063 
9064 	req_param.pdev_id = ar->pdev->pdev_id;
9065 	req_param.stats_id = WMI_REQUEST_PDEV_STAT;
9066 
9067 	ret = ath11k_fw_stats_request(ar, &req_param);
9068 	if (ret) {
9069 		ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
9070 		goto err_fallback;
9071 	}
9072 
9073 	spin_lock_bh(&ar->data_lock);
9074 	pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
9075 					struct ath11k_fw_stats_pdev, list);
9076 	if (!pdev) {
9077 		spin_unlock_bh(&ar->data_lock);
9078 		goto err_fallback;
9079 	}
9080 
9081 	/* tx power is set as 2 units per dBm in FW. */
9082 	*dbm = pdev->chan_tx_power / 2;
9083 
9084 	spin_unlock_bh(&ar->data_lock);
9085 	mutex_unlock(&ar->conf_mutex);
9086 
9087 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
9088 		   pdev->chan_tx_power, *dbm);
9089 	return 0;
9090 
9091 err_fallback:
9092 	mutex_unlock(&ar->conf_mutex);
9093 	/* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
9094 	*dbm = vif->bss_conf.txpower;
9095 	ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
9096 		   *dbm);
9097 	return 0;
9098 }
9099 
9100 static const struct ieee80211_ops ath11k_ops = {
9101 	.tx				= ath11k_mac_op_tx,
9102 	.wake_tx_queue			= ieee80211_handle_wake_tx_queue,
9103 	.start                          = ath11k_mac_op_start,
9104 	.stop                           = ath11k_mac_op_stop,
9105 	.reconfig_complete              = ath11k_mac_op_reconfig_complete,
9106 	.add_interface                  = ath11k_mac_op_add_interface,
9107 	.remove_interface		= ath11k_mac_op_remove_interface,
9108 	.update_vif_offload		= ath11k_mac_op_update_vif_offload,
9109 	.config                         = ath11k_mac_op_config,
9110 	.bss_info_changed               = ath11k_mac_op_bss_info_changed,
9111 	.configure_filter		= ath11k_mac_op_configure_filter,
9112 	.hw_scan                        = ath11k_mac_op_hw_scan,
9113 	.cancel_hw_scan                 = ath11k_mac_op_cancel_hw_scan,
9114 	.set_key                        = ath11k_mac_op_set_key,
9115 	.set_rekey_data	                = ath11k_mac_op_set_rekey_data,
9116 	.sta_state                      = ath11k_mac_op_sta_state,
9117 	.sta_set_4addr                  = ath11k_mac_op_sta_set_4addr,
9118 	.sta_set_txpwr			= ath11k_mac_op_sta_set_txpwr,
9119 	.sta_rc_update			= ath11k_mac_op_sta_rc_update,
9120 	.conf_tx                        = ath11k_mac_op_conf_tx,
9121 	.set_antenna			= ath11k_mac_op_set_antenna,
9122 	.get_antenna			= ath11k_mac_op_get_antenna,
9123 	.ampdu_action			= ath11k_mac_op_ampdu_action,
9124 	.add_chanctx			= ath11k_mac_op_add_chanctx,
9125 	.remove_chanctx			= ath11k_mac_op_remove_chanctx,
9126 	.change_chanctx			= ath11k_mac_op_change_chanctx,
9127 	.assign_vif_chanctx		= ath11k_mac_op_assign_vif_chanctx,
9128 	.unassign_vif_chanctx		= ath11k_mac_op_unassign_vif_chanctx,
9129 	.switch_vif_chanctx		= ath11k_mac_op_switch_vif_chanctx,
9130 	.set_rts_threshold		= ath11k_mac_op_set_rts_threshold,
9131 	.set_frag_threshold		= ath11k_mac_op_set_frag_threshold,
9132 	.set_bitrate_mask		= ath11k_mac_op_set_bitrate_mask,
9133 	.get_survey			= ath11k_mac_op_get_survey,
9134 	.flush				= ath11k_mac_op_flush,
9135 	.sta_statistics			= ath11k_mac_op_sta_statistics,
9136 	CFG80211_TESTMODE_CMD(ath11k_tm_cmd)
9137 
9138 #ifdef CONFIG_PM
9139 	.suspend			= ath11k_wow_op_suspend,
9140 	.resume				= ath11k_wow_op_resume,
9141 	.set_wakeup			= ath11k_wow_op_set_wakeup,
9142 #endif
9143 
9144 #ifdef CONFIG_ATH11K_DEBUGFS
9145 	.vif_add_debugfs		= ath11k_debugfs_op_vif_add,
9146 	.sta_add_debugfs		= ath11k_debugfs_sta_op_add,
9147 #endif
9148 
9149 #if IS_ENABLED(CONFIG_IPV6)
9150 	.ipv6_addr_change = ath11k_mac_op_ipv6_changed,
9151 #endif
9152 	.get_txpower                    = ath11k_mac_op_get_txpower,
9153 
9154 	.set_sar_specs			= ath11k_mac_op_set_bios_sar_specs,
9155 	.remain_on_channel		= ath11k_mac_op_remain_on_channel,
9156 	.cancel_remain_on_channel	= ath11k_mac_op_cancel_remain_on_channel,
9157 };
9158 
9159 static void ath11k_mac_update_ch_list(struct ath11k *ar,
9160 				      struct ieee80211_supported_band *band,
9161 				      u32 freq_low, u32 freq_high)
9162 {
9163 	int i;
9164 
9165 	if (!(freq_low && freq_high))
9166 		return;
9167 
9168 	for (i = 0; i < band->n_channels; i++) {
9169 		if (band->channels[i].center_freq < freq_low ||
9170 		    band->channels[i].center_freq > freq_high)
9171 			band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
9172 	}
9173 }
9174 
9175 static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
9176 {
9177 	struct ath11k_pdev *pdev = ar->pdev;
9178 	struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
9179 
9180 	if (band == WMI_HOST_WLAN_2G_CAP)
9181 		return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
9182 
9183 	if (band == WMI_HOST_WLAN_5G_CAP)
9184 		return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
9185 
9186 	ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
9187 
9188 	return 0;
9189 }
9190 
9191 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
9192 					   u32 supported_bands)
9193 {
9194 	struct ieee80211_supported_band *band;
9195 	struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
9196 	void *channels;
9197 	u32 phy_id;
9198 
9199 	BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
9200 		      ARRAY_SIZE(ath11k_5ghz_channels) +
9201 		      ARRAY_SIZE(ath11k_6ghz_channels)) !=
9202 		     ATH11K_NUM_CHANS);
9203 
9204 	reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
9205 	temp_reg_cap = reg_cap;
9206 
9207 	if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
9208 		channels = kmemdup(ath11k_2ghz_channels,
9209 				   sizeof(ath11k_2ghz_channels),
9210 				   GFP_KERNEL);
9211 		if (!channels)
9212 			return -ENOMEM;
9213 
9214 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
9215 		band->band = NL80211_BAND_2GHZ;
9216 		band->n_channels = ARRAY_SIZE(ath11k_2ghz_channels);
9217 		band->channels = channels;
9218 		band->n_bitrates = ath11k_g_rates_size;
9219 		band->bitrates = ath11k_g_rates;
9220 		ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
9221 
9222 		if (ar->ab->hw_params.single_pdev_only) {
9223 			phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
9224 			temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9225 		}
9226 		ath11k_mac_update_ch_list(ar, band,
9227 					  temp_reg_cap->low_2ghz_chan,
9228 					  temp_reg_cap->high_2ghz_chan);
9229 	}
9230 
9231 	if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
9232 		if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) {
9233 			channels = kmemdup(ath11k_6ghz_channels,
9234 					   sizeof(ath11k_6ghz_channels), GFP_KERNEL);
9235 			if (!channels) {
9236 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9237 				return -ENOMEM;
9238 			}
9239 
9240 			ar->supports_6ghz = true;
9241 			band = &ar->mac.sbands[NL80211_BAND_6GHZ];
9242 			band->band = NL80211_BAND_6GHZ;
9243 			band->n_channels = ARRAY_SIZE(ath11k_6ghz_channels);
9244 			band->channels = channels;
9245 			band->n_bitrates = ath11k_a_rates_size;
9246 			band->bitrates = ath11k_a_rates;
9247 			ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
9248 
9249 			if (ar->ab->hw_params.single_pdev_only) {
9250 				phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9251 				temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9252 			}
9253 
9254 			ath11k_mac_update_ch_list(ar, band,
9255 						  temp_reg_cap->low_5ghz_chan,
9256 						  temp_reg_cap->high_5ghz_chan);
9257 		}
9258 
9259 		if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
9260 			channels = kmemdup(ath11k_5ghz_channels,
9261 					   sizeof(ath11k_5ghz_channels),
9262 					   GFP_KERNEL);
9263 			if (!channels) {
9264 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9265 				kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9266 				return -ENOMEM;
9267 			}
9268 
9269 			band = &ar->mac.sbands[NL80211_BAND_5GHZ];
9270 			band->band = NL80211_BAND_5GHZ;
9271 			band->n_channels = ARRAY_SIZE(ath11k_5ghz_channels);
9272 			band->channels = channels;
9273 			band->n_bitrates = ath11k_a_rates_size;
9274 			band->bitrates = ath11k_a_rates;
9275 			ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
9276 
9277 			if (ar->ab->hw_params.single_pdev_only) {
9278 				phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
9279 				temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
9280 			}
9281 
9282 			ath11k_mac_update_ch_list(ar, band,
9283 						  temp_reg_cap->low_5ghz_chan,
9284 						  temp_reg_cap->high_5ghz_chan);
9285 		}
9286 	}
9287 
9288 	return 0;
9289 }
9290 
9291 static int ath11k_mac_setup_iface_combinations(struct ath11k *ar)
9292 {
9293 	struct ath11k_base *ab = ar->ab;
9294 	struct ieee80211_iface_combination *combinations;
9295 	struct ieee80211_iface_limit *limits;
9296 	int n_limits;
9297 
9298 	combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
9299 	if (!combinations)
9300 		return -ENOMEM;
9301 
9302 	n_limits = 2;
9303 
9304 	limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
9305 	if (!limits) {
9306 		kfree(combinations);
9307 		return -ENOMEM;
9308 	}
9309 
9310 	limits[0].max = 1;
9311 	limits[0].types |= BIT(NL80211_IFTYPE_STATION);
9312 
9313 	limits[1].max = 16;
9314 	limits[1].types |= BIT(NL80211_IFTYPE_AP);
9315 
9316 	if (IS_ENABLED(CONFIG_MAC80211_MESH) &&
9317 	    ab->hw_params.interface_modes & BIT(NL80211_IFTYPE_MESH_POINT))
9318 		limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
9319 
9320 	combinations[0].limits = limits;
9321 	combinations[0].n_limits = n_limits;
9322 	combinations[0].max_interfaces = 16;
9323 	combinations[0].num_different_channels = 1;
9324 	combinations[0].beacon_int_infra_match = true;
9325 	combinations[0].beacon_int_min_gcd = 100;
9326 	combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
9327 						BIT(NL80211_CHAN_WIDTH_20) |
9328 						BIT(NL80211_CHAN_WIDTH_40) |
9329 						BIT(NL80211_CHAN_WIDTH_80) |
9330 						BIT(NL80211_CHAN_WIDTH_80P80) |
9331 						BIT(NL80211_CHAN_WIDTH_160);
9332 
9333 	ar->hw->wiphy->iface_combinations = combinations;
9334 	ar->hw->wiphy->n_iface_combinations = 1;
9335 
9336 	return 0;
9337 }
9338 
9339 static const u8 ath11k_if_types_ext_capa[] = {
9340 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9341 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9342 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9343 };
9344 
9345 static const u8 ath11k_if_types_ext_capa_sta[] = {
9346 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9347 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9348 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9349 	[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
9350 };
9351 
9352 static const u8 ath11k_if_types_ext_capa_ap[] = {
9353 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
9354 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
9355 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
9356 	[9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
9357 	[10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
9358 };
9359 
9360 static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
9361 	{
9362 		.extended_capabilities = ath11k_if_types_ext_capa,
9363 		.extended_capabilities_mask = ath11k_if_types_ext_capa,
9364 		.extended_capabilities_len = sizeof(ath11k_if_types_ext_capa),
9365 	}, {
9366 		.iftype = NL80211_IFTYPE_STATION,
9367 		.extended_capabilities = ath11k_if_types_ext_capa_sta,
9368 		.extended_capabilities_mask = ath11k_if_types_ext_capa_sta,
9369 		.extended_capabilities_len =
9370 				sizeof(ath11k_if_types_ext_capa_sta),
9371 	}, {
9372 		.iftype = NL80211_IFTYPE_AP,
9373 		.extended_capabilities = ath11k_if_types_ext_capa_ap,
9374 		.extended_capabilities_mask = ath11k_if_types_ext_capa_ap,
9375 		.extended_capabilities_len =
9376 				sizeof(ath11k_if_types_ext_capa_ap),
9377 	},
9378 };
9379 
9380 static void __ath11k_mac_unregister(struct ath11k *ar)
9381 {
9382 	cancel_work_sync(&ar->regd_update_work);
9383 
9384 	ieee80211_unregister_hw(ar->hw);
9385 
9386 	idr_for_each(&ar->txmgmt_idr, ath11k_mac_tx_mgmt_pending_free, ar);
9387 	idr_destroy(&ar->txmgmt_idr);
9388 
9389 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9390 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9391 	kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9392 
9393 	kfree(ar->hw->wiphy->iface_combinations[0].limits);
9394 	kfree(ar->hw->wiphy->iface_combinations);
9395 
9396 	SET_IEEE80211_DEV(ar->hw, NULL);
9397 }
9398 
9399 void ath11k_mac_unregister(struct ath11k_base *ab)
9400 {
9401 	struct ath11k *ar;
9402 	struct ath11k_pdev *pdev;
9403 	int i;
9404 
9405 	for (i = 0; i < ab->num_radios; i++) {
9406 		pdev = &ab->pdevs[i];
9407 		ar = pdev->ar;
9408 		if (!ar)
9409 			continue;
9410 
9411 		__ath11k_mac_unregister(ar);
9412 	}
9413 
9414 	ath11k_peer_rhash_tbl_destroy(ab);
9415 }
9416 
9417 static int __ath11k_mac_register(struct ath11k *ar)
9418 {
9419 	struct ath11k_base *ab = ar->ab;
9420 	struct ath11k_pdev_cap *cap = &ar->pdev->cap;
9421 	static const u32 cipher_suites[] = {
9422 		WLAN_CIPHER_SUITE_TKIP,
9423 		WLAN_CIPHER_SUITE_CCMP,
9424 		WLAN_CIPHER_SUITE_AES_CMAC,
9425 		WLAN_CIPHER_SUITE_BIP_CMAC_256,
9426 		WLAN_CIPHER_SUITE_BIP_GMAC_128,
9427 		WLAN_CIPHER_SUITE_BIP_GMAC_256,
9428 		WLAN_CIPHER_SUITE_GCMP,
9429 		WLAN_CIPHER_SUITE_GCMP_256,
9430 		WLAN_CIPHER_SUITE_CCMP_256,
9431 	};
9432 	int ret;
9433 	u32 ht_cap = 0;
9434 
9435 	ath11k_pdev_caps_update(ar);
9436 
9437 	SET_IEEE80211_PERM_ADDR(ar->hw, ar->mac_addr);
9438 
9439 	SET_IEEE80211_DEV(ar->hw, ab->dev);
9440 
9441 	ret = ath11k_mac_setup_channels_rates(ar,
9442 					      cap->supported_bands);
9443 	if (ret)
9444 		goto err;
9445 
9446 	ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
9447 	ath11k_mac_setup_he_cap(ar, cap);
9448 
9449 	ret = ath11k_mac_setup_iface_combinations(ar);
9450 	if (ret) {
9451 		ath11k_err(ar->ab, "failed to setup interface combinations: %d\n", ret);
9452 		goto err_free_channels;
9453 	}
9454 
9455 	ar->hw->wiphy->available_antennas_rx = cap->rx_chain_mask;
9456 	ar->hw->wiphy->available_antennas_tx = cap->tx_chain_mask;
9457 
9458 	ar->hw->wiphy->interface_modes = ab->hw_params.interface_modes;
9459 
9460 	if (ab->hw_params.single_pdev_only && ar->supports_6ghz)
9461 		ieee80211_hw_set(ar->hw, SINGLE_SCAN_ON_ALL_BANDS);
9462 
9463 	if (ab->hw_params.supports_multi_bssid) {
9464 		ieee80211_hw_set(ar->hw, SUPPORTS_MULTI_BSSID);
9465 		ieee80211_hw_set(ar->hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
9466 	}
9467 
9468 	ieee80211_hw_set(ar->hw, SIGNAL_DBM);
9469 	ieee80211_hw_set(ar->hw, SUPPORTS_PS);
9470 	ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
9471 	ieee80211_hw_set(ar->hw, MFP_CAPABLE);
9472 	ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
9473 	ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
9474 	ieee80211_hw_set(ar->hw, AP_LINK_PS);
9475 	ieee80211_hw_set(ar->hw, SPECTRUM_MGMT);
9476 	ieee80211_hw_set(ar->hw, CONNECTION_MONITOR);
9477 	ieee80211_hw_set(ar->hw, SUPPORTS_PER_STA_GTK);
9478 	ieee80211_hw_set(ar->hw, WANT_MONITOR_VIF);
9479 	ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
9480 	ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
9481 	ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
9482 	ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
9483 
9484 	if (ath11k_frame_mode == ATH11K_HW_TXRX_ETHERNET) {
9485 		ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
9486 		ieee80211_hw_set(ar->hw, SUPPORTS_RX_DECAP_OFFLOAD);
9487 	}
9488 
9489 	if (cap->nss_ratio_enabled)
9490 		ieee80211_hw_set(ar->hw, SUPPORTS_VHT_EXT_NSS_BW);
9491 
9492 	if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
9493 		ieee80211_hw_set(ar->hw, AMPDU_AGGREGATION);
9494 		ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
9495 		ieee80211_hw_set(ar->hw, SUPPORTS_REORDERING_BUFFER);
9496 		ieee80211_hw_set(ar->hw, SUPPORTS_AMSDU_IN_AMPDU);
9497 		ieee80211_hw_set(ar->hw, USES_RSS);
9498 	}
9499 
9500 	ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
9501 	ar->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
9502 
9503 	/* TODO: Check if HT capability advertised from firmware is different
9504 	 * for each band for a dual band capable radio. It will be tricky to
9505 	 * handle it when the ht capability different for each band.
9506 	 */
9507 	if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
9508 	    (ar->supports_6ghz && ab->hw_params.supports_dynamic_smps_6ghz))
9509 		ar->hw->wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
9510 
9511 	ar->hw->wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
9512 	ar->hw->wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
9513 
9514 	ar->hw->max_listen_interval = ATH11K_MAX_HW_LISTEN_INTERVAL;
9515 
9516 	ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
9517 	ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
9518 	ar->hw->wiphy->max_remain_on_channel_duration = 5000;
9519 
9520 	ar->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
9521 	ar->hw->wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
9522 				   NL80211_FEATURE_AP_SCAN;
9523 
9524 	ar->max_num_stations = TARGET_NUM_STATIONS(ab);
9525 	ar->max_num_peers = TARGET_NUM_PEERS_PDEV(ab);
9526 
9527 	ar->hw->wiphy->max_ap_assoc_sta = ar->max_num_stations;
9528 
9529 	if (test_bit(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi->wmi_ab->svc_map)) {
9530 		ar->hw->wiphy->features |=
9531 			NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
9532 	}
9533 
9534 	if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
9535 		ar->hw->wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
9536 		ar->hw->wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
9537 		ar->hw->wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
9538 		ar->hw->wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
9539 		ar->hw->wiphy->max_sched_scan_plan_interval =
9540 			WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
9541 		ar->hw->wiphy->max_sched_scan_plan_iterations =
9542 			WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
9543 		ar->hw->wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
9544 	}
9545 
9546 	ret = ath11k_wow_init(ar);
9547 	if (ret) {
9548 		ath11k_warn(ar->ab, "failed to init wow: %d\n", ret);
9549 		goto err_free_if_combs;
9550 	}
9551 
9552 	if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI,
9553 		     ar->ab->wmi_ab.svc_map))
9554 		wiphy_ext_feature_set(ar->hw->wiphy,
9555 				      NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
9556 
9557 	ar->hw->queues = ATH11K_HW_MAX_QUEUES;
9558 	ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN;
9559 	ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1;
9560 	ar->hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
9561 
9562 	ar->hw->vif_data_size = sizeof(struct ath11k_vif);
9563 	ar->hw->sta_data_size = sizeof(struct ath11k_sta);
9564 
9565 	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
9566 	wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
9567 	if (test_bit(WMI_TLV_SERVICE_BSS_COLOR_OFFLOAD,
9568 		     ar->ab->wmi_ab.svc_map)) {
9569 		wiphy_ext_feature_set(ar->hw->wiphy,
9570 				      NL80211_EXT_FEATURE_BSS_COLOR);
9571 		ieee80211_hw_set(ar->hw, DETECTS_COLOR_COLLISION);
9572 	}
9573 
9574 	ar->hw->wiphy->cipher_suites = cipher_suites;
9575 	ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
9576 
9577 	ar->hw->wiphy->iftype_ext_capab = ath11k_iftypes_ext_capa;
9578 	ar->hw->wiphy->num_iftype_ext_capab =
9579 		ARRAY_SIZE(ath11k_iftypes_ext_capa);
9580 
9581 	if (ar->supports_6ghz) {
9582 		wiphy_ext_feature_set(ar->hw->wiphy,
9583 				      NL80211_EXT_FEATURE_FILS_DISCOVERY);
9584 		wiphy_ext_feature_set(ar->hw->wiphy,
9585 				      NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
9586 	}
9587 
9588 	wiphy_ext_feature_set(ar->hw->wiphy,
9589 			      NL80211_EXT_FEATURE_SET_SCAN_DWELL);
9590 
9591 	if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map))
9592 		wiphy_ext_feature_set(ar->hw->wiphy,
9593 				      NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
9594 
9595 	ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab);
9596 	ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
9597 
9598 	ath11k_reg_init(ar);
9599 
9600 	if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
9601 		ar->hw->netdev_features = NETIF_F_HW_CSUM;
9602 		ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL);
9603 		ieee80211_hw_set(ar->hw, SUPPORT_FAST_XMIT);
9604 	}
9605 
9606 	if (test_bit(WMI_TLV_SERVICE_BIOS_SAR_SUPPORT, ar->ab->wmi_ab.svc_map) &&
9607 	    ab->hw_params.bios_sar_capa)
9608 		ar->hw->wiphy->sar_capa = ab->hw_params.bios_sar_capa;
9609 
9610 	ret = ieee80211_register_hw(ar->hw);
9611 	if (ret) {
9612 		ath11k_err(ar->ab, "ieee80211 registration failed: %d\n", ret);
9613 		goto err_free_if_combs;
9614 	}
9615 
9616 	if (!ab->hw_params.supports_monitor)
9617 		/* There's a race between calling ieee80211_register_hw()
9618 		 * and here where the monitor mode is enabled for a little
9619 		 * while. But that time is so short and in practise it make
9620 		 * a difference in real life.
9621 		 */
9622 		ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
9623 
9624 	/* Apply the regd received during initialization */
9625 	ret = ath11k_regd_update(ar);
9626 	if (ret) {
9627 		ath11k_err(ar->ab, "ath11k regd update failed: %d\n", ret);
9628 		goto err_unregister_hw;
9629 	}
9630 
9631 	if (ab->hw_params.current_cc_support && ab->new_alpha2[0]) {
9632 		struct wmi_set_current_country_params set_current_param = {};
9633 
9634 		memcpy(&set_current_param.alpha2, ab->new_alpha2, 2);
9635 		memcpy(&ar->alpha2, ab->new_alpha2, 2);
9636 		ret = ath11k_wmi_send_set_current_country_cmd(ar, &set_current_param);
9637 		if (ret)
9638 			ath11k_warn(ar->ab,
9639 				    "failed set cc code for mac register: %d\n", ret);
9640 	}
9641 
9642 	ret = ath11k_debugfs_register(ar);
9643 	if (ret) {
9644 		ath11k_err(ar->ab, "debugfs registration failed: %d\n", ret);
9645 		goto err_unregister_hw;
9646 	}
9647 
9648 	return 0;
9649 
9650 err_unregister_hw:
9651 	ieee80211_unregister_hw(ar->hw);
9652 
9653 err_free_if_combs:
9654 	kfree(ar->hw->wiphy->iface_combinations[0].limits);
9655 	kfree(ar->hw->wiphy->iface_combinations);
9656 
9657 err_free_channels:
9658 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
9659 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
9660 	kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
9661 
9662 err:
9663 	SET_IEEE80211_DEV(ar->hw, NULL);
9664 	return ret;
9665 }
9666 
9667 int ath11k_mac_register(struct ath11k_base *ab)
9668 {
9669 	struct ath11k *ar;
9670 	struct ath11k_pdev *pdev;
9671 	int i;
9672 	int ret;
9673 	u8 mac_addr[ETH_ALEN] = {0};
9674 
9675 	if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9676 		return 0;
9677 
9678 	/* Initialize channel counters frequency value in hertz */
9679 	ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
9680 	ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
9681 
9682 	ret = ath11k_peer_rhash_tbl_init(ab);
9683 	if (ret)
9684 		return ret;
9685 
9686 	device_get_mac_address(ab->dev, mac_addr);
9687 
9688 	for (i = 0; i < ab->num_radios; i++) {
9689 		pdev = &ab->pdevs[i];
9690 		ar = pdev->ar;
9691 		if (ab->pdevs_macaddr_valid) {
9692 			ether_addr_copy(ar->mac_addr, pdev->mac_addr);
9693 		} else {
9694 			if (is_zero_ether_addr(mac_addr))
9695 				ether_addr_copy(ar->mac_addr, ab->mac_addr);
9696 			else
9697 				ether_addr_copy(ar->mac_addr, mac_addr);
9698 			ar->mac_addr[4] += i;
9699 		}
9700 
9701 		idr_init(&ar->txmgmt_idr);
9702 		spin_lock_init(&ar->txmgmt_idr_lock);
9703 
9704 		ret = __ath11k_mac_register(ar);
9705 		if (ret)
9706 			goto err_cleanup;
9707 
9708 		init_waitqueue_head(&ar->txmgmt_empty_waitq);
9709 	}
9710 
9711 	return 0;
9712 
9713 err_cleanup:
9714 	for (i = i - 1; i >= 0; i--) {
9715 		pdev = &ab->pdevs[i];
9716 		ar = pdev->ar;
9717 		__ath11k_mac_unregister(ar);
9718 	}
9719 
9720 	ath11k_peer_rhash_tbl_destroy(ab);
9721 
9722 	return ret;
9723 }
9724 
9725 int ath11k_mac_allocate(struct ath11k_base *ab)
9726 {
9727 	struct ieee80211_hw *hw;
9728 	struct ath11k *ar;
9729 	struct ath11k_pdev *pdev;
9730 	int ret;
9731 	int i;
9732 
9733 	if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
9734 		return 0;
9735 
9736 	for (i = 0; i < ab->num_radios; i++) {
9737 		pdev = &ab->pdevs[i];
9738 		hw = ieee80211_alloc_hw(sizeof(struct ath11k), &ath11k_ops);
9739 		if (!hw) {
9740 			ath11k_warn(ab, "failed to allocate mac80211 hw device\n");
9741 			ret = -ENOMEM;
9742 			goto err_free_mac;
9743 		}
9744 
9745 		ar = hw->priv;
9746 		ar->hw = hw;
9747 		ar->ab = ab;
9748 		ar->pdev = pdev;
9749 		ar->pdev_idx = i;
9750 		ar->lmac_id = ath11k_hw_get_mac_from_pdev_id(&ab->hw_params, i);
9751 
9752 		ar->wmi = &ab->wmi_ab.wmi[i];
9753 		/* FIXME wmi[0] is already initialized during attach,
9754 		 * Should we do this again?
9755 		 */
9756 		ath11k_wmi_pdev_attach(ab, i);
9757 
9758 		ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
9759 		ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
9760 		ar->num_tx_chains = get_num_chains(pdev->cap.tx_chain_mask);
9761 		ar->num_rx_chains = get_num_chains(pdev->cap.rx_chain_mask);
9762 
9763 		pdev->ar = ar;
9764 		spin_lock_init(&ar->data_lock);
9765 		INIT_LIST_HEAD(&ar->arvifs);
9766 		INIT_LIST_HEAD(&ar->ppdu_stats_info);
9767 		mutex_init(&ar->conf_mutex);
9768 		init_completion(&ar->vdev_setup_done);
9769 		init_completion(&ar->vdev_delete_done);
9770 		init_completion(&ar->peer_assoc_done);
9771 		init_completion(&ar->peer_delete_done);
9772 		init_completion(&ar->install_key_done);
9773 		init_completion(&ar->bss_survey_done);
9774 		init_completion(&ar->scan.started);
9775 		init_completion(&ar->scan.completed);
9776 		init_completion(&ar->scan.on_channel);
9777 		init_completion(&ar->thermal.wmi_sync);
9778 
9779 		INIT_DELAYED_WORK(&ar->scan.timeout, ath11k_scan_timeout_work);
9780 		INIT_WORK(&ar->regd_update_work, ath11k_regd_update_work);
9781 
9782 		INIT_WORK(&ar->wmi_mgmt_tx_work, ath11k_mgmt_over_wmi_tx_work);
9783 		skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
9784 
9785 		clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags);
9786 
9787 		ar->monitor_vdev_id = -1;
9788 		clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);
9789 		ar->vdev_id_11d_scan = ATH11K_11D_INVALID_VDEV_ID;
9790 		init_completion(&ar->completed_11d_scan);
9791 
9792 		ath11k_fw_stats_init(ar);
9793 	}
9794 
9795 	return 0;
9796 
9797 err_free_mac:
9798 	ath11k_mac_destroy(ab);
9799 
9800 	return ret;
9801 }
9802 
9803 void ath11k_mac_destroy(struct ath11k_base *ab)
9804 {
9805 	struct ath11k *ar;
9806 	struct ath11k_pdev *pdev;
9807 	int i;
9808 
9809 	for (i = 0; i < ab->num_radios; i++) {
9810 		pdev = &ab->pdevs[i];
9811 		ar = pdev->ar;
9812 		if (!ar)
9813 			continue;
9814 
9815 		ath11k_fw_stats_free(&ar->fw_stats);
9816 		ieee80211_free_hw(ar->hw);
9817 		pdev->ar = NULL;
9818 	}
9819 }
9820 
9821 int ath11k_mac_vif_set_keepalive(struct ath11k_vif *arvif,
9822 				 enum wmi_sta_keepalive_method method,
9823 				 u32 interval)
9824 {
9825 	struct ath11k *ar = arvif->ar;
9826 	struct wmi_sta_keepalive_arg arg = {};
9827 	int ret;
9828 
9829 	lockdep_assert_held(&ar->conf_mutex);
9830 
9831 	if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
9832 		return 0;
9833 
9834 	if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
9835 		return 0;
9836 
9837 	arg.vdev_id = arvif->vdev_id;
9838 	arg.enabled = 1;
9839 	arg.method = method;
9840 	arg.interval = interval;
9841 
9842 	ret = ath11k_wmi_sta_keepalive(ar, &arg);
9843 	if (ret) {
9844 		ath11k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
9845 			    arvif->vdev_id, ret);
9846 		return ret;
9847 	}
9848 
9849 	return 0;
9850 }
9851