xref: /linux/drivers/net/wireless/ath/ath12k/mac.c (revision cde5e1b4a90486b4ac731ee43e4e0152cc16887b)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5  */
6 
7 #include <net/mac80211.h>
8 #include <linux/etherdevice.h>
9 #include "mac.h"
10 #include "core.h"
11 #include "debug.h"
12 #include "wmi.h"
13 #include "hw.h"
14 #include "dp_tx.h"
15 #include "dp_rx.h"
16 #include "peer.h"
17 
18 #define CHAN2G(_channel, _freq, _flags) { \
19 	.band                   = NL80211_BAND_2GHZ, \
20 	.hw_value               = (_channel), \
21 	.center_freq            = (_freq), \
22 	.flags                  = (_flags), \
23 	.max_antenna_gain       = 0, \
24 	.max_power              = 30, \
25 }
26 
27 #define CHAN5G(_channel, _freq, _flags) { \
28 	.band                   = NL80211_BAND_5GHZ, \
29 	.hw_value               = (_channel), \
30 	.center_freq            = (_freq), \
31 	.flags                  = (_flags), \
32 	.max_antenna_gain       = 0, \
33 	.max_power              = 30, \
34 }
35 
36 #define CHAN6G(_channel, _freq, _flags) { \
37 	.band                   = NL80211_BAND_6GHZ, \
38 	.hw_value               = (_channel), \
39 	.center_freq            = (_freq), \
40 	.flags                  = (_flags), \
41 	.max_antenna_gain       = 0, \
42 	.max_power              = 30, \
43 }
44 
45 static const struct ieee80211_channel ath12k_2ghz_channels[] = {
46 	CHAN2G(1, 2412, 0),
47 	CHAN2G(2, 2417, 0),
48 	CHAN2G(3, 2422, 0),
49 	CHAN2G(4, 2427, 0),
50 	CHAN2G(5, 2432, 0),
51 	CHAN2G(6, 2437, 0),
52 	CHAN2G(7, 2442, 0),
53 	CHAN2G(8, 2447, 0),
54 	CHAN2G(9, 2452, 0),
55 	CHAN2G(10, 2457, 0),
56 	CHAN2G(11, 2462, 0),
57 	CHAN2G(12, 2467, 0),
58 	CHAN2G(13, 2472, 0),
59 	CHAN2G(14, 2484, 0),
60 };
61 
62 static const struct ieee80211_channel ath12k_5ghz_channels[] = {
63 	CHAN5G(36, 5180, 0),
64 	CHAN5G(40, 5200, 0),
65 	CHAN5G(44, 5220, 0),
66 	CHAN5G(48, 5240, 0),
67 	CHAN5G(52, 5260, 0),
68 	CHAN5G(56, 5280, 0),
69 	CHAN5G(60, 5300, 0),
70 	CHAN5G(64, 5320, 0),
71 	CHAN5G(100, 5500, 0),
72 	CHAN5G(104, 5520, 0),
73 	CHAN5G(108, 5540, 0),
74 	CHAN5G(112, 5560, 0),
75 	CHAN5G(116, 5580, 0),
76 	CHAN5G(120, 5600, 0),
77 	CHAN5G(124, 5620, 0),
78 	CHAN5G(128, 5640, 0),
79 	CHAN5G(132, 5660, 0),
80 	CHAN5G(136, 5680, 0),
81 	CHAN5G(140, 5700, 0),
82 	CHAN5G(144, 5720, 0),
83 	CHAN5G(149, 5745, 0),
84 	CHAN5G(153, 5765, 0),
85 	CHAN5G(157, 5785, 0),
86 	CHAN5G(161, 5805, 0),
87 	CHAN5G(165, 5825, 0),
88 	CHAN5G(169, 5845, 0),
89 	CHAN5G(173, 5865, 0),
90 };
91 
92 static const struct ieee80211_channel ath12k_6ghz_channels[] = {
93 	CHAN6G(1, 5955, 0),
94 	CHAN6G(5, 5975, 0),
95 	CHAN6G(9, 5995, 0),
96 	CHAN6G(13, 6015, 0),
97 	CHAN6G(17, 6035, 0),
98 	CHAN6G(21, 6055, 0),
99 	CHAN6G(25, 6075, 0),
100 	CHAN6G(29, 6095, 0),
101 	CHAN6G(33, 6115, 0),
102 	CHAN6G(37, 6135, 0),
103 	CHAN6G(41, 6155, 0),
104 	CHAN6G(45, 6175, 0),
105 	CHAN6G(49, 6195, 0),
106 	CHAN6G(53, 6215, 0),
107 	CHAN6G(57, 6235, 0),
108 	CHAN6G(61, 6255, 0),
109 	CHAN6G(65, 6275, 0),
110 	CHAN6G(69, 6295, 0),
111 	CHAN6G(73, 6315, 0),
112 	CHAN6G(77, 6335, 0),
113 	CHAN6G(81, 6355, 0),
114 	CHAN6G(85, 6375, 0),
115 	CHAN6G(89, 6395, 0),
116 	CHAN6G(93, 6415, 0),
117 	CHAN6G(97, 6435, 0),
118 	CHAN6G(101, 6455, 0),
119 	CHAN6G(105, 6475, 0),
120 	CHAN6G(109, 6495, 0),
121 	CHAN6G(113, 6515, 0),
122 	CHAN6G(117, 6535, 0),
123 	CHAN6G(121, 6555, 0),
124 	CHAN6G(125, 6575, 0),
125 	CHAN6G(129, 6595, 0),
126 	CHAN6G(133, 6615, 0),
127 	CHAN6G(137, 6635, 0),
128 	CHAN6G(141, 6655, 0),
129 	CHAN6G(145, 6675, 0),
130 	CHAN6G(149, 6695, 0),
131 	CHAN6G(153, 6715, 0),
132 	CHAN6G(157, 6735, 0),
133 	CHAN6G(161, 6755, 0),
134 	CHAN6G(165, 6775, 0),
135 	CHAN6G(169, 6795, 0),
136 	CHAN6G(173, 6815, 0),
137 	CHAN6G(177, 6835, 0),
138 	CHAN6G(181, 6855, 0),
139 	CHAN6G(185, 6875, 0),
140 	CHAN6G(189, 6895, 0),
141 	CHAN6G(193, 6915, 0),
142 	CHAN6G(197, 6935, 0),
143 	CHAN6G(201, 6955, 0),
144 	CHAN6G(205, 6975, 0),
145 	CHAN6G(209, 6995, 0),
146 	CHAN6G(213, 7015, 0),
147 	CHAN6G(217, 7035, 0),
148 	CHAN6G(221, 7055, 0),
149 	CHAN6G(225, 7075, 0),
150 	CHAN6G(229, 7095, 0),
151 	CHAN6G(233, 7115, 0),
152 };
153 
154 static struct ieee80211_rate ath12k_legacy_rates[] = {
155 	{ .bitrate = 10,
156 	  .hw_value = ATH12K_HW_RATE_CCK_LP_1M },
157 	{ .bitrate = 20,
158 	  .hw_value = ATH12K_HW_RATE_CCK_LP_2M,
159 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
160 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
161 	{ .bitrate = 55,
162 	  .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
163 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
164 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
165 	{ .bitrate = 110,
166 	  .hw_value = ATH12K_HW_RATE_CCK_LP_11M,
167 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
168 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
169 
170 	{ .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
171 	{ .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
172 	{ .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
173 	{ .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
174 	{ .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
175 	{ .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
176 	{ .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
177 	{ .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
178 };
179 
180 static const int
181 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
182 	[NL80211_BAND_2GHZ] = {
183 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
184 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
185 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
186 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
187 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
188 			[NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
189 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
190 			[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
191 			[NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
192 	},
193 	[NL80211_BAND_5GHZ] = {
194 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
197 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
198 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
199 			[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
200 			[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
201 			[NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
202 			[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
203 	},
204 	[NL80211_BAND_6GHZ] = {
205 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
208 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
209 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
210 			[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
211 			[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
212 			[NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
213 			[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
214 	},
215 
216 };
217 
218 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
219 	.rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
220 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
221 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE,
222 	.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
223 	.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
224 	.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
225 	.pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
226 			     HTT_RX_FP_CTRL_FILTER_FLASG3
227 };
228 
229 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
230 #define ath12k_g_rates ath12k_legacy_rates
231 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
232 #define ath12k_a_rates (ath12k_legacy_rates + 4)
233 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
234 
235 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
236 
237 static const u32 ath12k_smps_map[] = {
238 	[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
239 	[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
240 	[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
241 	[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
242 };
243 
244 static int ath12k_start_vdev_delay(struct ath12k *ar,
245 				   struct ath12k_vif *arvif);
246 
247 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
248 {
249 	switch (mode) {
250 	case MODE_11A:
251 		return "11a";
252 	case MODE_11G:
253 		return "11g";
254 	case MODE_11B:
255 		return "11b";
256 	case MODE_11GONLY:
257 		return "11gonly";
258 	case MODE_11NA_HT20:
259 		return "11na-ht20";
260 	case MODE_11NG_HT20:
261 		return "11ng-ht20";
262 	case MODE_11NA_HT40:
263 		return "11na-ht40";
264 	case MODE_11NG_HT40:
265 		return "11ng-ht40";
266 	case MODE_11AC_VHT20:
267 		return "11ac-vht20";
268 	case MODE_11AC_VHT40:
269 		return "11ac-vht40";
270 	case MODE_11AC_VHT80:
271 		return "11ac-vht80";
272 	case MODE_11AC_VHT160:
273 		return "11ac-vht160";
274 	case MODE_11AC_VHT80_80:
275 		return "11ac-vht80+80";
276 	case MODE_11AC_VHT20_2G:
277 		return "11ac-vht20-2g";
278 	case MODE_11AC_VHT40_2G:
279 		return "11ac-vht40-2g";
280 	case MODE_11AC_VHT80_2G:
281 		return "11ac-vht80-2g";
282 	case MODE_11AX_HE20:
283 		return "11ax-he20";
284 	case MODE_11AX_HE40:
285 		return "11ax-he40";
286 	case MODE_11AX_HE80:
287 		return "11ax-he80";
288 	case MODE_11AX_HE80_80:
289 		return "11ax-he80+80";
290 	case MODE_11AX_HE160:
291 		return "11ax-he160";
292 	case MODE_11AX_HE20_2G:
293 		return "11ax-he20-2g";
294 	case MODE_11AX_HE40_2G:
295 		return "11ax-he40-2g";
296 	case MODE_11AX_HE80_2G:
297 		return "11ax-he80-2g";
298 	case MODE_11BE_EHT20:
299 		return "11be-eht20";
300 	case MODE_11BE_EHT40:
301 		return "11be-eht40";
302 	case MODE_11BE_EHT80:
303 		return "11be-eht80";
304 	case MODE_11BE_EHT80_80:
305 		return "11be-eht80+80";
306 	case MODE_11BE_EHT160:
307 		return "11be-eht160";
308 	case MODE_11BE_EHT160_160:
309 		return "11be-eht160+160";
310 	case MODE_11BE_EHT320:
311 		return "11be-eht320";
312 	case MODE_11BE_EHT20_2G:
313 		return "11be-eht20-2g";
314 	case MODE_11BE_EHT40_2G:
315 		return "11be-eht40-2g";
316 	case MODE_UNKNOWN:
317 		/* skip */
318 		break;
319 
320 		/* no default handler to allow compiler to check that the
321 		 * enum is fully handled
322 		 */
323 	}
324 
325 	return "<unknown>";
326 }
327 
328 enum rate_info_bw
329 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
330 {
331 	u8 ret = RATE_INFO_BW_20;
332 
333 	switch (bw) {
334 	case ATH12K_BW_20:
335 		ret = RATE_INFO_BW_20;
336 		break;
337 	case ATH12K_BW_40:
338 		ret = RATE_INFO_BW_40;
339 		break;
340 	case ATH12K_BW_80:
341 		ret = RATE_INFO_BW_80;
342 		break;
343 	case ATH12K_BW_160:
344 		ret = RATE_INFO_BW_160;
345 		break;
346 	case ATH12K_BW_320:
347 		ret = RATE_INFO_BW_320;
348 		break;
349 	}
350 
351 	return ret;
352 }
353 
354 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
355 {
356 	switch (bw) {
357 	case RATE_INFO_BW_20:
358 		return ATH12K_BW_20;
359 	case RATE_INFO_BW_40:
360 		return ATH12K_BW_40;
361 	case RATE_INFO_BW_80:
362 		return ATH12K_BW_80;
363 	case RATE_INFO_BW_160:
364 		return ATH12K_BW_160;
365 	case RATE_INFO_BW_320:
366 		return ATH12K_BW_320;
367 	default:
368 		return ATH12K_BW_20;
369 	}
370 }
371 
372 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
373 					  u16 *rate)
374 {
375 	/* As default, it is OFDM rates */
376 	int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
377 	int max_rates_idx = ath12k_g_rates_size;
378 
379 	if (preamble == WMI_RATE_PREAMBLE_CCK) {
380 		hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
381 		i = 0;
382 		max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
383 	}
384 
385 	while (i < max_rates_idx) {
386 		if (hw_rc == ath12k_legacy_rates[i].hw_value) {
387 			*rateidx = i;
388 			*rate = ath12k_legacy_rates[i].bitrate;
389 			return 0;
390 		}
391 		i++;
392 	}
393 
394 	return -EINVAL;
395 }
396 
397 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
398 			     u32 bitrate)
399 {
400 	int i;
401 
402 	for (i = 0; i < sband->n_bitrates; i++)
403 		if (sband->bitrates[i].bitrate == bitrate)
404 			return i;
405 
406 	return 0;
407 }
408 
409 static u32
410 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
411 {
412 	int nss;
413 
414 	for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
415 		if (ht_mcs_mask[nss])
416 			return nss + 1;
417 
418 	return 1;
419 }
420 
421 static u32
422 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
423 {
424 	int nss;
425 
426 	for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
427 		if (vht_mcs_mask[nss])
428 			return nss + 1;
429 
430 	return 1;
431 }
432 
433 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
434 {
435 /*  From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
436  *   0 for no restriction
437  *   1 for 1/4 us
438  *   2 for 1/2 us
439  *   3 for 1 us
440  *   4 for 2 us
441  *   5 for 4 us
442  *   6 for 8 us
443  *   7 for 16 us
444  */
445 	switch (mpdudensity) {
446 	case 0:
447 		return 0;
448 	case 1:
449 	case 2:
450 	case 3:
451 	/* Our lower layer calculations limit our precision to
452 	 * 1 microsecond
453 	 */
454 		return 1;
455 	case 4:
456 		return 2;
457 	case 5:
458 		return 4;
459 	case 6:
460 		return 8;
461 	case 7:
462 		return 16;
463 	default:
464 		return 0;
465 	}
466 }
467 
468 static int ath12k_mac_vif_chan(struct ieee80211_vif *vif,
469 			       struct cfg80211_chan_def *def)
470 {
471 	struct ieee80211_chanctx_conf *conf;
472 
473 	rcu_read_lock();
474 	conf = rcu_dereference(vif->bss_conf.chanctx_conf);
475 	if (!conf) {
476 		rcu_read_unlock();
477 		return -ENOENT;
478 	}
479 
480 	*def = conf->def;
481 	rcu_read_unlock();
482 
483 	return 0;
484 }
485 
486 static bool ath12k_mac_bitrate_is_cck(int bitrate)
487 {
488 	switch (bitrate) {
489 	case 10:
490 	case 20:
491 	case 55:
492 	case 110:
493 		return true;
494 	}
495 
496 	return false;
497 }
498 
499 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
500 			     u8 hw_rate, bool cck)
501 {
502 	const struct ieee80211_rate *rate;
503 	int i;
504 
505 	for (i = 0; i < sband->n_bitrates; i++) {
506 		rate = &sband->bitrates[i];
507 
508 		if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
509 			continue;
510 
511 		if (rate->hw_value == hw_rate)
512 			return i;
513 		else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
514 			 rate->hw_value_short == hw_rate)
515 			return i;
516 	}
517 
518 	return 0;
519 }
520 
521 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
522 {
523 	return DIV_ROUND_UP(bitrate, 5) |
524 	       (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
525 }
526 
527 static void ath12k_get_arvif_iter(void *data, u8 *mac,
528 				  struct ieee80211_vif *vif)
529 {
530 	struct ath12k_vif_iter *arvif_iter = data;
531 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
532 
533 	if (arvif->vdev_id == arvif_iter->vdev_id)
534 		arvif_iter->arvif = arvif;
535 }
536 
537 struct ath12k_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
538 {
539 	struct ath12k_vif_iter arvif_iter = {};
540 	u32 flags;
541 
542 	arvif_iter.vdev_id = vdev_id;
543 
544 	flags = IEEE80211_IFACE_ITER_RESUME_ALL;
545 	ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
546 						   flags,
547 						   ath12k_get_arvif_iter,
548 						   &arvif_iter);
549 	if (!arvif_iter.arvif) {
550 		ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
551 		return NULL;
552 	}
553 
554 	return arvif_iter.arvif;
555 }
556 
557 struct ath12k_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
558 						   u32 vdev_id)
559 {
560 	int i;
561 	struct ath12k_pdev *pdev;
562 	struct ath12k_vif *arvif;
563 
564 	for (i = 0; i < ab->num_radios; i++) {
565 		pdev = rcu_dereference(ab->pdevs_active[i]);
566 		if (pdev && pdev->ar &&
567 		    (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
568 			arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
569 			if (arvif)
570 				return arvif;
571 		}
572 	}
573 
574 	return NULL;
575 }
576 
577 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
578 {
579 	int i;
580 	struct ath12k_pdev *pdev;
581 
582 	for (i = 0; i < ab->num_radios; i++) {
583 		pdev = rcu_dereference(ab->pdevs_active[i]);
584 		if (pdev && pdev->ar) {
585 			if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
586 				return pdev->ar;
587 		}
588 	}
589 
590 	return NULL;
591 }
592 
593 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
594 {
595 	int i;
596 	struct ath12k_pdev *pdev;
597 
598 	if (ab->hw_params->single_pdev_only) {
599 		pdev = rcu_dereference(ab->pdevs_active[0]);
600 		return pdev ? pdev->ar : NULL;
601 	}
602 
603 	if (WARN_ON(pdev_id > ab->num_radios))
604 		return NULL;
605 
606 	for (i = 0; i < ab->num_radios; i++) {
607 		pdev = rcu_dereference(ab->pdevs_active[i]);
608 
609 		if (pdev && pdev->pdev_id == pdev_id)
610 			return (pdev->ar ? pdev->ar : NULL);
611 	}
612 
613 	return NULL;
614 }
615 
616 static void ath12k_pdev_caps_update(struct ath12k *ar)
617 {
618 	struct ath12k_base *ab = ar->ab;
619 
620 	ar->max_tx_power = ab->target_caps.hw_max_tx_power;
621 
622 	/* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
623 	 * But since the received value in svcrdy is same as hw_max_tx_power,
624 	 * we can set ar->min_tx_power to 0 currently until
625 	 * this is fixed in firmware
626 	 */
627 	ar->min_tx_power = 0;
628 
629 	ar->txpower_limit_2g = ar->max_tx_power;
630 	ar->txpower_limit_5g = ar->max_tx_power;
631 	ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
632 }
633 
634 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
635 {
636 	struct ath12k_pdev *pdev = ar->pdev;
637 	struct ath12k_vif *arvif;
638 	int ret, txpower = -1;
639 	u32 param;
640 
641 	lockdep_assert_held(&ar->conf_mutex);
642 
643 	list_for_each_entry(arvif, &ar->arvifs, list) {
644 		if (arvif->txpower <= 0)
645 			continue;
646 
647 		if (txpower == -1)
648 			txpower = arvif->txpower;
649 		else
650 			txpower = min(txpower, arvif->txpower);
651 	}
652 
653 	if (txpower == -1)
654 		return 0;
655 
656 	/* txpwr is set as 2 units per dBm in FW*/
657 	txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
658 			ar->max_tx_power) * 2;
659 
660 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
661 		   txpower / 2);
662 
663 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) &&
664 	    ar->txpower_limit_2g != txpower) {
665 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
666 		ret = ath12k_wmi_pdev_set_param(ar, param,
667 						txpower, ar->pdev->pdev_id);
668 		if (ret)
669 			goto fail;
670 		ar->txpower_limit_2g = txpower;
671 	}
672 
673 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) &&
674 	    ar->txpower_limit_5g != txpower) {
675 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
676 		ret = ath12k_wmi_pdev_set_param(ar, param,
677 						txpower, ar->pdev->pdev_id);
678 		if (ret)
679 			goto fail;
680 		ar->txpower_limit_5g = txpower;
681 	}
682 
683 	return 0;
684 
685 fail:
686 	ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
687 		    txpower / 2, param, ret);
688 	return ret;
689 }
690 
691 static int ath12k_recalc_rtscts_prot(struct ath12k_vif *arvif)
692 {
693 	struct ath12k *ar = arvif->ar;
694 	u32 vdev_param, rts_cts;
695 	int ret;
696 
697 	lockdep_assert_held(&ar->conf_mutex);
698 
699 	vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
700 
701 	/* Enable RTS/CTS protection for sw retries (when legacy stations
702 	 * are in BSS) or by default only for second rate series.
703 	 * TODO: Check if we need to enable CTS 2 Self in any case
704 	 */
705 	rts_cts = WMI_USE_RTS_CTS;
706 
707 	if (arvif->num_legacy_stations > 0)
708 		rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
709 	else
710 		rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
711 
712 	/* Need not send duplicate param value to firmware */
713 	if (arvif->rtscts_prot_mode == rts_cts)
714 		return 0;
715 
716 	arvif->rtscts_prot_mode = rts_cts;
717 
718 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
719 		   arvif->vdev_id, rts_cts);
720 
721 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
722 					    vdev_param, rts_cts);
723 	if (ret)
724 		ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
725 			    arvif->vdev_id, ret);
726 
727 	return ret;
728 }
729 
730 static int ath12k_mac_set_kickout(struct ath12k_vif *arvif)
731 {
732 	struct ath12k *ar = arvif->ar;
733 	u32 param;
734 	int ret;
735 
736 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
737 					ATH12K_KICKOUT_THRESHOLD,
738 					ar->pdev->pdev_id);
739 	if (ret) {
740 		ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
741 			    arvif->vdev_id, ret);
742 		return ret;
743 	}
744 
745 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
746 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
747 					    ATH12K_KEEPALIVE_MIN_IDLE);
748 	if (ret) {
749 		ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
750 			    arvif->vdev_id, ret);
751 		return ret;
752 	}
753 
754 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
755 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
756 					    ATH12K_KEEPALIVE_MAX_IDLE);
757 	if (ret) {
758 		ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
759 			    arvif->vdev_id, ret);
760 		return ret;
761 	}
762 
763 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
764 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
765 					    ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
766 	if (ret) {
767 		ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
768 			    arvif->vdev_id, ret);
769 		return ret;
770 	}
771 
772 	return 0;
773 }
774 
775 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
776 {
777 	struct ath12k_peer *peer, *tmp;
778 	struct ath12k_base *ab = ar->ab;
779 
780 	lockdep_assert_held(&ar->conf_mutex);
781 
782 	spin_lock_bh(&ab->base_lock);
783 	list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
784 		ath12k_dp_rx_peer_tid_cleanup(ar, peer);
785 		list_del(&peer->list);
786 		kfree(peer);
787 	}
788 	spin_unlock_bh(&ab->base_lock);
789 
790 	ar->num_peers = 0;
791 	ar->num_stations = 0;
792 }
793 
794 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
795 {
796 	lockdep_assert_held(&ar->conf_mutex);
797 
798 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
799 		return -ESHUTDOWN;
800 
801 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
802 		   ATH12K_VDEV_SETUP_TIMEOUT_HZ);
803 
804 	if (!wait_for_completion_timeout(&ar->vdev_setup_done,
805 					 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
806 		return -ETIMEDOUT;
807 
808 	return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
809 }
810 
811 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
812 {
813 	int ret;
814 
815 	ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
816 	if (ret) {
817 		ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
818 			    vdev_id, ret);
819 		return ret;
820 	}
821 
822 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
823 		   vdev_id);
824 	return 0;
825 }
826 
827 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
828 					 struct cfg80211_chan_def *chandef)
829 {
830 	struct ieee80211_channel *channel;
831 	struct wmi_vdev_start_req_arg arg = {};
832 	int ret;
833 
834 	lockdep_assert_held(&ar->conf_mutex);
835 
836 	channel = chandef->chan;
837 	arg.vdev_id = vdev_id;
838 	arg.freq = channel->center_freq;
839 	arg.band_center_freq1 = chandef->center_freq1;
840 	arg.band_center_freq2 = chandef->center_freq2;
841 	arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
842 	arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
843 
844 	arg.min_power = 0;
845 	arg.max_power = channel->max_power;
846 	arg.max_reg_power = channel->max_reg_power;
847 	arg.max_antenna_gain = channel->max_antenna_gain;
848 
849 	arg.pref_tx_streams = ar->num_tx_chains;
850 	arg.pref_rx_streams = ar->num_rx_chains;
851 	arg.punct_bitmap = 0xFFFFFFFF;
852 
853 	arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
854 
855 	reinit_completion(&ar->vdev_setup_done);
856 	reinit_completion(&ar->vdev_delete_done);
857 
858 	ret = ath12k_wmi_vdev_start(ar, &arg, false);
859 	if (ret) {
860 		ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
861 			    vdev_id, ret);
862 		return ret;
863 	}
864 
865 	ret = ath12k_mac_vdev_setup_sync(ar);
866 	if (ret) {
867 		ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
868 			    vdev_id, ret);
869 		return ret;
870 	}
871 
872 	ret = ath12k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr);
873 	if (ret) {
874 		ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
875 			    vdev_id, ret);
876 		goto vdev_stop;
877 	}
878 
879 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
880 		   vdev_id);
881 	return 0;
882 
883 vdev_stop:
884 	ret = ath12k_wmi_vdev_stop(ar, vdev_id);
885 	if (ret)
886 		ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
887 			    vdev_id, ret);
888 	return ret;
889 }
890 
891 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
892 {
893 	int ret;
894 
895 	lockdep_assert_held(&ar->conf_mutex);
896 
897 	reinit_completion(&ar->vdev_setup_done);
898 
899 	ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
900 	if (ret)
901 		ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
902 			    ar->monitor_vdev_id, ret);
903 
904 	ret = ath12k_mac_vdev_setup_sync(ar);
905 	if (ret)
906 		ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
907 			    ar->monitor_vdev_id, ret);
908 
909 	ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
910 	if (ret)
911 		ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
912 			    ar->monitor_vdev_id, ret);
913 
914 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
915 		   ar->monitor_vdev_id);
916 	return ret;
917 }
918 
919 static int ath12k_mac_monitor_vdev_create(struct ath12k *ar)
920 {
921 	struct ath12k_pdev *pdev = ar->pdev;
922 	struct ath12k_wmi_vdev_create_arg arg = {};
923 	int bit, ret;
924 	u8 tmp_addr[6];
925 	u16 nss;
926 
927 	lockdep_assert_held(&ar->conf_mutex);
928 
929 	if (ar->monitor_vdev_created)
930 		return 0;
931 
932 	if (ar->ab->free_vdev_map == 0) {
933 		ath12k_warn(ar->ab, "failed to find free vdev id for monitor vdev\n");
934 		return -ENOMEM;
935 	}
936 
937 	bit = __ffs64(ar->ab->free_vdev_map);
938 
939 	ar->monitor_vdev_id = bit;
940 
941 	arg.if_id = ar->monitor_vdev_id;
942 	arg.type = WMI_VDEV_TYPE_MONITOR;
943 	arg.subtype = WMI_VDEV_SUBTYPE_NONE;
944 	arg.pdev_id = pdev->pdev_id;
945 	arg.if_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
946 
947 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
948 		arg.chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
949 		arg.chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
950 	}
951 
952 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
953 		arg.chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
954 		arg.chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
955 	}
956 
957 	ret = ath12k_wmi_vdev_create(ar, tmp_addr, &arg);
958 	if (ret) {
959 		ath12k_warn(ar->ab, "failed to request monitor vdev %i creation: %d\n",
960 			    ar->monitor_vdev_id, ret);
961 		ar->monitor_vdev_id = -1;
962 		return ret;
963 	}
964 
965 	nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
966 	ret = ath12k_wmi_vdev_set_param_cmd(ar, ar->monitor_vdev_id,
967 					    WMI_VDEV_PARAM_NSS, nss);
968 	if (ret) {
969 		ath12k_warn(ar->ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
970 			    ar->monitor_vdev_id, ar->cfg_tx_chainmask, nss, ret);
971 		return ret;
972 	}
973 
974 	ret = ath12k_mac_txpower_recalc(ar);
975 	if (ret)
976 		return ret;
977 
978 	ar->allocated_vdev_map |= 1LL << ar->monitor_vdev_id;
979 	ar->ab->free_vdev_map &= ~(1LL << ar->monitor_vdev_id);
980 	ar->num_created_vdevs++;
981 	ar->monitor_vdev_created = true;
982 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d created\n",
983 		   ar->monitor_vdev_id);
984 
985 	return 0;
986 }
987 
988 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
989 {
990 	int ret;
991 	unsigned long time_left;
992 
993 	lockdep_assert_held(&ar->conf_mutex);
994 
995 	if (!ar->monitor_vdev_created)
996 		return 0;
997 
998 	reinit_completion(&ar->vdev_delete_done);
999 
1000 	ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1001 	if (ret) {
1002 		ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1003 			    ar->monitor_vdev_id, ret);
1004 		return ret;
1005 	}
1006 
1007 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1008 						ATH12K_VDEV_DELETE_TIMEOUT_HZ);
1009 	if (time_left == 0) {
1010 		ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1011 	} else {
1012 		ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1013 		ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1014 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
1015 			   ar->monitor_vdev_id);
1016 		ar->num_created_vdevs--;
1017 		ar->monitor_vdev_id = -1;
1018 		ar->monitor_vdev_created = false;
1019 	}
1020 
1021 	return ret;
1022 }
1023 
1024 static void
1025 ath12k_mac_get_any_chandef_iter(struct ieee80211_hw *hw,
1026 				struct ieee80211_chanctx_conf *conf,
1027 				void *data)
1028 {
1029 	struct cfg80211_chan_def **def = data;
1030 
1031 	*def = &conf->def;
1032 }
1033 
1034 static int ath12k_mac_monitor_start(struct ath12k *ar)
1035 {
1036 	struct cfg80211_chan_def *chandef = NULL;
1037 	int ret;
1038 
1039 	lockdep_assert_held(&ar->conf_mutex);
1040 
1041 	if (ar->monitor_started)
1042 		return 0;
1043 
1044 	ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar),
1045 					    ath12k_mac_get_any_chandef_iter,
1046 					    &chandef);
1047 	if (!chandef)
1048 		return 0;
1049 
1050 	ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id, chandef);
1051 	if (ret) {
1052 		ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1053 		ath12k_mac_monitor_vdev_delete(ar);
1054 		return ret;
1055 	}
1056 
1057 	ar->monitor_started = true;
1058 	ar->num_started_vdevs++;
1059 	ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1060 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started ret %d\n", ret);
1061 
1062 	return ret;
1063 }
1064 
1065 static int ath12k_mac_monitor_stop(struct ath12k *ar)
1066 {
1067 	int ret;
1068 
1069 	lockdep_assert_held(&ar->conf_mutex);
1070 
1071 	if (!ar->monitor_started)
1072 		return 0;
1073 
1074 	ret = ath12k_mac_monitor_vdev_stop(ar);
1075 	if (ret) {
1076 		ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1077 		return ret;
1078 	}
1079 
1080 	ar->monitor_started = false;
1081 	ar->num_started_vdevs--;
1082 	ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1083 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1084 	return ret;
1085 }
1086 
1087 static int ath12k_mac_vdev_stop(struct ath12k_vif *arvif)
1088 {
1089 	struct ath12k *ar = arvif->ar;
1090 	int ret;
1091 
1092 	lockdep_assert_held(&ar->conf_mutex);
1093 
1094 	reinit_completion(&ar->vdev_setup_done);
1095 
1096 	ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
1097 	if (ret) {
1098 		ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
1099 			    arvif->vdev_id, ret);
1100 		goto err;
1101 	}
1102 
1103 	ret = ath12k_mac_vdev_setup_sync(ar);
1104 	if (ret) {
1105 		ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
1106 			    arvif->vdev_id, ret);
1107 		goto err;
1108 	}
1109 
1110 	WARN_ON(ar->num_started_vdevs == 0);
1111 
1112 	ar->num_started_vdevs--;
1113 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
1114 		   arvif->vif->addr, arvif->vdev_id);
1115 
1116 	if (test_bit(ATH12K_CAC_RUNNING, &ar->dev_flags)) {
1117 		clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
1118 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
1119 			   arvif->vdev_id);
1120 	}
1121 
1122 	return 0;
1123 err:
1124 	return ret;
1125 }
1126 
1127 static int ath12k_mac_config(struct ath12k *ar, u32 changed)
1128 {
1129 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1130 	struct ieee80211_conf *conf = &hw->conf;
1131 	int ret = 0;
1132 
1133 	mutex_lock(&ar->conf_mutex);
1134 
1135 	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
1136 		ar->monitor_conf_enabled = conf->flags & IEEE80211_CONF_MONITOR;
1137 		if (ar->monitor_conf_enabled) {
1138 			if (ar->monitor_vdev_created)
1139 				goto exit;
1140 			ret = ath12k_mac_monitor_vdev_create(ar);
1141 			if (ret)
1142 				goto exit;
1143 			ret = ath12k_mac_monitor_start(ar);
1144 			if (ret)
1145 				goto err_mon_del;
1146 		} else {
1147 			if (!ar->monitor_vdev_created)
1148 				goto exit;
1149 			ret = ath12k_mac_monitor_stop(ar);
1150 			if (ret)
1151 				goto exit;
1152 			ath12k_mac_monitor_vdev_delete(ar);
1153 		}
1154 	}
1155 
1156 exit:
1157 	mutex_unlock(&ar->conf_mutex);
1158 	return ret;
1159 
1160 err_mon_del:
1161 	ath12k_mac_monitor_vdev_delete(ar);
1162 	mutex_unlock(&ar->conf_mutex);
1163 	return ret;
1164 }
1165 
1166 static int ath12k_mac_op_config(struct ieee80211_hw *hw, u32 changed)
1167 {
1168 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
1169 	struct ath12k *ar;
1170 	int ret;
1171 
1172 	ar = ath12k_ah_to_ar(ah);
1173 
1174 	ret = ath12k_mac_config(ar, changed);
1175 	if (ret)
1176 		ath12k_warn(ar->ab, "failed to update config pdev idx %d: %d\n",
1177 			    ar->pdev_idx, ret);
1178 
1179 	return ret;
1180 }
1181 
1182 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_vif *arvif,
1183 				       struct sk_buff *bcn)
1184 {
1185 	struct ath12k *ar = arvif->ar;
1186 	struct ieee80211_mgmt *mgmt;
1187 	const u8 *p2p_ie;
1188 	int ret;
1189 
1190 	mgmt = (void *)bcn->data;
1191 	p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1192 					 mgmt->u.beacon.variable,
1193 					 bcn->len - (mgmt->u.beacon.variable -
1194 						     bcn->data));
1195 	if (!p2p_ie) {
1196 		ath12k_warn(ar->ab, "no P2P ie found in beacon\n");
1197 		return -ENOENT;
1198 	}
1199 
1200 	ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1201 	if (ret) {
1202 		ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n",
1203 			    arvif->vdev_id, ret);
1204 		return ret;
1205 	}
1206 
1207 	return 0;
1208 }
1209 
1210 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1211 				       u8 oui_type, size_t ie_offset)
1212 {
1213 	const u8 *next, *end;
1214 	size_t len;
1215 	u8 *ie;
1216 
1217 	if (WARN_ON(skb->len < ie_offset))
1218 		return -EINVAL;
1219 
1220 	ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1221 					   skb->data + ie_offset,
1222 					   skb->len - ie_offset);
1223 	if (!ie)
1224 		return -ENOENT;
1225 
1226 	len = ie[1] + 2;
1227 	end = skb->data + skb->len;
1228 	next = ie + len;
1229 
1230 	if (WARN_ON(next > end))
1231 		return -EINVAL;
1232 
1233 	memmove(ie, next, end - next);
1234 	skb_trim(skb, skb->len - len);
1235 
1236 	return 0;
1237 }
1238 
1239 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_vif *arvif)
1240 {
1241 	struct ath12k *ar = arvif->ar;
1242 	struct ath12k_base *ab = ar->ab;
1243 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1244 	struct ieee80211_vif *vif = arvif->vif;
1245 	struct ieee80211_mutable_offsets offs = {};
1246 	struct sk_buff *bcn;
1247 	struct ieee80211_mgmt *mgmt;
1248 	u8 *ies;
1249 	int ret;
1250 
1251 	if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
1252 		return 0;
1253 
1254 	bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0);
1255 	if (!bcn) {
1256 		ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1257 		return -EPERM;
1258 	}
1259 
1260 	ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn);
1261 	ies += sizeof(mgmt->u.beacon);
1262 
1263 	if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies)))
1264 		arvif->rsnie_present = true;
1265 
1266 	if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1267 				    WLAN_OUI_TYPE_MICROSOFT_WPA,
1268 				    ies, (skb_tail_pointer(bcn) - ies)))
1269 		arvif->wpaie_present = true;
1270 
1271 	if (arvif->vif->type == NL80211_IFTYPE_AP && arvif->vif->p2p) {
1272 		ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn);
1273 		if (ret) {
1274 			ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n",
1275 				    ret);
1276 			goto free_bcn_skb;
1277 		}
1278 
1279 		/* P2P IE is inserted by firmware automatically (as
1280 		 * configured above) so remove it from the base beacon
1281 		 * template to avoid duplicate P2P IEs in beacon frames.
1282 		 */
1283 		ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA,
1284 						  WLAN_OUI_TYPE_WFA_P2P,
1285 						  offsetof(struct ieee80211_mgmt,
1286 							   u.beacon.variable));
1287 		if (ret) {
1288 			ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n",
1289 				    ret);
1290 			goto free_bcn_skb;
1291 		}
1292 	}
1293 
1294 	ret = ath12k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn);
1295 
1296 	if (ret)
1297 		ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1298 			    ret);
1299 
1300 free_bcn_skb:
1301 	kfree_skb(bcn);
1302 	return ret;
1303 }
1304 
1305 static void ath12k_control_beaconing(struct ath12k_vif *arvif,
1306 				     struct ieee80211_bss_conf *info)
1307 {
1308 	struct ath12k *ar = arvif->ar;
1309 	int ret;
1310 
1311 	lockdep_assert_held(&arvif->ar->conf_mutex);
1312 
1313 	if (!info->enable_beacon) {
1314 		ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1315 		if (ret)
1316 			ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1317 				    arvif->vdev_id, ret);
1318 
1319 		arvif->is_up = false;
1320 		return;
1321 	}
1322 
1323 	/* Install the beacon template to the FW */
1324 	ret = ath12k_mac_setup_bcn_tmpl(arvif);
1325 	if (ret) {
1326 		ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1327 			    ret);
1328 		return;
1329 	}
1330 
1331 	arvif->aid = 0;
1332 
1333 	ether_addr_copy(arvif->bssid, info->bssid);
1334 
1335 	ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
1336 				 arvif->bssid);
1337 	if (ret) {
1338 		ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1339 			    arvif->vdev_id, ret);
1340 		return;
1341 	}
1342 
1343 	arvif->is_up = true;
1344 
1345 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1346 }
1347 
1348 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1349 				      struct ieee80211_vif *vif,
1350 				      struct ieee80211_sta *sta,
1351 				      struct ath12k_wmi_peer_assoc_arg *arg)
1352 {
1353 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1354 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1355 	u32 aid;
1356 
1357 	lockdep_assert_held(&ar->conf_mutex);
1358 
1359 	if (vif->type == NL80211_IFTYPE_STATION)
1360 		aid = vif->cfg.aid;
1361 	else
1362 		aid = sta->aid;
1363 
1364 	ether_addr_copy(arg->peer_mac, sta->addr);
1365 	arg->vdev_id = arvif->vdev_id;
1366 	arg->peer_associd = aid;
1367 	arg->auth_flag = true;
1368 	/* TODO: STA WAR in ath10k for listen interval required? */
1369 	arg->peer_listen_intval = hw->conf.listen_interval;
1370 	arg->peer_nss = 1;
1371 	arg->peer_caps = vif->bss_conf.assoc_capability;
1372 }
1373 
1374 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1375 				       struct ieee80211_vif *vif,
1376 				       struct ieee80211_sta *sta,
1377 				       struct ath12k_wmi_peer_assoc_arg *arg)
1378 {
1379 	struct ieee80211_bss_conf *info = &vif->bss_conf;
1380 	struct cfg80211_chan_def def;
1381 	struct cfg80211_bss *bss;
1382 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1383 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1384 	const u8 *rsnie = NULL;
1385 	const u8 *wpaie = NULL;
1386 
1387 	lockdep_assert_held(&ar->conf_mutex);
1388 
1389 	if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1390 		return;
1391 
1392 	bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1393 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1394 
1395 	if (arvif->rsnie_present || arvif->wpaie_present) {
1396 		arg->need_ptk_4_way = true;
1397 		if (arvif->wpaie_present)
1398 			arg->need_gtk_2_way = true;
1399 	} else if (bss) {
1400 		const struct cfg80211_bss_ies *ies;
1401 
1402 		rcu_read_lock();
1403 		rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1404 
1405 		ies = rcu_dereference(bss->ies);
1406 
1407 		wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1408 						WLAN_OUI_TYPE_MICROSOFT_WPA,
1409 						ies->data,
1410 						ies->len);
1411 		rcu_read_unlock();
1412 		cfg80211_put_bss(hw->wiphy, bss);
1413 	}
1414 
1415 	/* FIXME: base on RSN IE/WPA IE is a correct idea? */
1416 	if (rsnie || wpaie) {
1417 		ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1418 			   "%s: rsn ie found\n", __func__);
1419 		arg->need_ptk_4_way = true;
1420 	}
1421 
1422 	if (wpaie) {
1423 		ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1424 			   "%s: wpa ie found\n", __func__);
1425 		arg->need_gtk_2_way = true;
1426 	}
1427 
1428 	if (sta->mfp) {
1429 		/* TODO: Need to check if FW supports PMF? */
1430 		arg->is_pmf_enabled = true;
1431 	}
1432 
1433 	/* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1434 }
1435 
1436 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1437 				      struct ieee80211_vif *vif,
1438 				      struct ieee80211_sta *sta,
1439 				      struct ath12k_wmi_peer_assoc_arg *arg)
1440 {
1441 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1442 	struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1443 	struct cfg80211_chan_def def;
1444 	const struct ieee80211_supported_band *sband;
1445 	const struct ieee80211_rate *rates;
1446 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1447 	enum nl80211_band band;
1448 	u32 ratemask;
1449 	u8 rate;
1450 	int i;
1451 
1452 	lockdep_assert_held(&ar->conf_mutex);
1453 
1454 	if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1455 		return;
1456 
1457 	band = def.chan->band;
1458 	sband = hw->wiphy->bands[band];
1459 	ratemask = sta->deflink.supp_rates[band];
1460 	ratemask &= arvif->bitrate_mask.control[band].legacy;
1461 	rates = sband->bitrates;
1462 
1463 	rateset->num_rates = 0;
1464 
1465 	for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
1466 		if (!(ratemask & 1))
1467 			continue;
1468 
1469 		rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
1470 		rateset->rates[rateset->num_rates] = rate;
1471 		rateset->num_rates++;
1472 	}
1473 }
1474 
1475 static bool
1476 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
1477 {
1478 	int nss;
1479 
1480 	for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
1481 		if (ht_mcs_mask[nss])
1482 			return false;
1483 
1484 	return true;
1485 }
1486 
1487 static bool
1488 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
1489 {
1490 	int nss;
1491 
1492 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
1493 		if (vht_mcs_mask[nss])
1494 			return false;
1495 
1496 	return true;
1497 }
1498 
1499 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
1500 				   struct ieee80211_vif *vif,
1501 				   struct ieee80211_sta *sta,
1502 				   struct ath12k_wmi_peer_assoc_arg *arg)
1503 {
1504 	const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1505 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1506 	struct cfg80211_chan_def def;
1507 	enum nl80211_band band;
1508 	const u8 *ht_mcs_mask;
1509 	int i, n;
1510 	u8 max_nss;
1511 	u32 stbc;
1512 
1513 	lockdep_assert_held(&ar->conf_mutex);
1514 
1515 	if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1516 		return;
1517 
1518 	if (!ht_cap->ht_supported)
1519 		return;
1520 
1521 	band = def.chan->band;
1522 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
1523 
1524 	if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
1525 		return;
1526 
1527 	arg->ht_flag = true;
1528 
1529 	arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1530 				    ht_cap->ampdu_factor)) - 1;
1531 
1532 	arg->peer_mpdu_density =
1533 		ath12k_parse_mpdudensity(ht_cap->ampdu_density);
1534 
1535 	arg->peer_ht_caps = ht_cap->cap;
1536 	arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
1537 
1538 	if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
1539 		arg->ldpc_flag = true;
1540 
1541 	if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
1542 		arg->bw_40 = true;
1543 		arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
1544 	}
1545 
1546 	if (arvif->bitrate_mask.control[band].gi != NL80211_TXRATE_FORCE_LGI) {
1547 		if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
1548 		    IEEE80211_HT_CAP_SGI_40))
1549 			arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
1550 	}
1551 
1552 	if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
1553 		arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
1554 		arg->stbc_flag = true;
1555 	}
1556 
1557 	if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1558 		stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1559 		stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1560 		stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
1561 		arg->peer_rate_caps |= stbc;
1562 		arg->stbc_flag = true;
1563 	}
1564 
1565 	if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
1566 		arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
1567 	else if (ht_cap->mcs.rx_mask[1])
1568 		arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
1569 
1570 	for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
1571 		if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
1572 		    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
1573 			max_nss = (i / 8) + 1;
1574 			arg->peer_ht_rates.rates[n++] = i;
1575 		}
1576 
1577 	/* This is a workaround for HT-enabled STAs which break the spec
1578 	 * and have no HT capabilities RX mask (no HT RX MCS map).
1579 	 *
1580 	 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
1581 	 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
1582 	 *
1583 	 * Firmware asserts if such situation occurs.
1584 	 */
1585 	if (n == 0) {
1586 		arg->peer_ht_rates.num_rates = 8;
1587 		for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
1588 			arg->peer_ht_rates.rates[i] = i;
1589 	} else {
1590 		arg->peer_ht_rates.num_rates = n;
1591 		arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1592 	}
1593 
1594 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
1595 		   arg->peer_mac,
1596 		   arg->peer_ht_rates.num_rates,
1597 		   arg->peer_nss);
1598 }
1599 
1600 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
1601 {
1602 	switch ((mcs_map >> (2 * nss)) & 0x3) {
1603 	case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
1604 	case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
1605 	case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
1606 	}
1607 	return 0;
1608 }
1609 
1610 static u16
1611 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
1612 			      const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
1613 {
1614 	int idx_limit;
1615 	int nss;
1616 	u16 mcs_map;
1617 	u16 mcs;
1618 
1619 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
1620 		mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
1621 			  vht_mcs_limit[nss];
1622 
1623 		if (mcs_map)
1624 			idx_limit = fls(mcs_map) - 1;
1625 		else
1626 			idx_limit = -1;
1627 
1628 		switch (idx_limit) {
1629 		case 0:
1630 		case 1:
1631 		case 2:
1632 		case 3:
1633 		case 4:
1634 		case 5:
1635 		case 6:
1636 		case 7:
1637 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
1638 			break;
1639 		case 8:
1640 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
1641 			break;
1642 		case 9:
1643 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
1644 			break;
1645 		default:
1646 			WARN_ON(1);
1647 			fallthrough;
1648 		case -1:
1649 			mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
1650 			break;
1651 		}
1652 
1653 		tx_mcs_set &= ~(0x3 << (nss * 2));
1654 		tx_mcs_set |= mcs << (nss * 2);
1655 	}
1656 
1657 	return tx_mcs_set;
1658 }
1659 
1660 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
1661 				    struct ieee80211_vif *vif,
1662 				    struct ieee80211_sta *sta,
1663 				    struct ath12k_wmi_peer_assoc_arg *arg)
1664 {
1665 	const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
1666 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1667 	struct cfg80211_chan_def def;
1668 	enum nl80211_band band;
1669 	const u16 *vht_mcs_mask;
1670 	u16 tx_mcs_map;
1671 	u8 ampdu_factor;
1672 	u8 max_nss, vht_mcs;
1673 	int i;
1674 
1675 	if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
1676 		return;
1677 
1678 	if (!vht_cap->vht_supported)
1679 		return;
1680 
1681 	band = def.chan->band;
1682 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
1683 
1684 	if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
1685 		return;
1686 
1687 	arg->vht_flag = true;
1688 
1689 	/* TODO: similar flags required? */
1690 	arg->vht_capable = true;
1691 
1692 	if (def.chan->band == NL80211_BAND_2GHZ)
1693 		arg->vht_ng_flag = true;
1694 
1695 	arg->peer_vht_caps = vht_cap->cap;
1696 
1697 	ampdu_factor = (vht_cap->cap &
1698 			IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1699 		       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
1700 
1701 	/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
1702 	 * zero in VHT IE. Using it would result in degraded throughput.
1703 	 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
1704 	 * it if VHT max_mpdu is smaller.
1705 	 */
1706 	arg->peer_max_mpdu = max(arg->peer_max_mpdu,
1707 				 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
1708 					ampdu_factor)) - 1);
1709 
1710 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
1711 		arg->bw_80 = true;
1712 
1713 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
1714 		arg->bw_160 = true;
1715 
1716 	/* Calculate peer NSS capability from VHT capabilities if STA
1717 	 * supports VHT.
1718 	 */
1719 	for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
1720 		vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
1721 			  (2 * i) & 3;
1722 
1723 		if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
1724 		    vht_mcs_mask[i])
1725 			max_nss = i + 1;
1726 	}
1727 	arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1728 	arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
1729 	arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
1730 	arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
1731 
1732 	tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
1733 	arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
1734 
1735 	/* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
1736 	 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
1737 	 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
1738 	 */
1739 	arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
1740 	arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
1741 
1742 	if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
1743 			IEEE80211_VHT_MCS_NOT_SUPPORTED)
1744 		arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
1745 
1746 	/* TODO:  Check */
1747 	arg->tx_max_mcs_nss = 0xFF;
1748 
1749 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
1750 		   sta->addr, arg->peer_max_mpdu, arg->peer_flags);
1751 
1752 	/* TODO: rxnss_override */
1753 }
1754 
1755 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
1756 				   struct ieee80211_vif *vif,
1757 				   struct ieee80211_sta *sta,
1758 				   struct ath12k_wmi_peer_assoc_arg *arg)
1759 {
1760 	const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
1761 	int i;
1762 	u8 ampdu_factor, rx_mcs_80, rx_mcs_160, max_nss;
1763 	u16 mcs_160_map, mcs_80_map;
1764 	bool support_160;
1765 	u16 v;
1766 
1767 	if (!he_cap->has_he)
1768 		return;
1769 
1770 	arg->he_flag = true;
1771 
1772 	support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
1773 		  IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
1774 
1775 	/* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
1776 	mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1777 	mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1778 
1779 	if (support_160) {
1780 		for (i = 7; i >= 0; i--) {
1781 			u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
1782 
1783 			if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1784 				rx_mcs_160 = i + 1;
1785 				break;
1786 			}
1787 		}
1788 	}
1789 
1790 	for (i = 7; i >= 0; i--) {
1791 		u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
1792 
1793 		if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
1794 			rx_mcs_80 = i + 1;
1795 			break;
1796 		}
1797 	}
1798 
1799 	if (support_160)
1800 		max_nss = min(rx_mcs_80, rx_mcs_160);
1801 	else
1802 		max_nss = rx_mcs_80;
1803 
1804 	arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
1805 
1806 	memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
1807 	       sizeof(he_cap->he_cap_elem.mac_cap_info));
1808 	memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
1809 	       sizeof(he_cap->he_cap_elem.phy_cap_info));
1810 	arg->peer_he_ops = vif->bss_conf.he_oper.params;
1811 
1812 	/* the top most byte is used to indicate BSS color info */
1813 	arg->peer_he_ops &= 0xffffff;
1814 
1815 	/* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
1816 	 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
1817 	 * as calculated while parsing VHT caps(if VHT caps is present)
1818 	 * or HT caps (if VHT caps is not present).
1819 	 *
1820 	 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
1821 	 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
1822 	 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
1823 	 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
1824 	 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
1825 	 * length.
1826 	 */
1827 	ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] &
1828 			IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >>
1829 			IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK;
1830 
1831 	if (ampdu_factor) {
1832 		if (sta->deflink.vht_cap.vht_supported)
1833 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
1834 						    ampdu_factor)) - 1;
1835 		else if (sta->deflink.ht_cap.ht_supported)
1836 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
1837 						    ampdu_factor)) - 1;
1838 	}
1839 
1840 	if (he_cap->he_cap_elem.phy_cap_info[6] &
1841 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
1842 		int bit = 7;
1843 		int nss, ru;
1844 
1845 		arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
1846 					  IEEE80211_PPE_THRES_NSS_MASK;
1847 		arg->peer_ppet.ru_bit_mask =
1848 			(he_cap->ppe_thres[0] &
1849 			 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
1850 			IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
1851 
1852 		for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
1853 			for (ru = 0; ru < 4; ru++) {
1854 				u32 val = 0;
1855 				int i;
1856 
1857 				if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
1858 					continue;
1859 				for (i = 0; i < 6; i++) {
1860 					val >>= 1;
1861 					val |= ((he_cap->ppe_thres[bit / 8] >>
1862 						 (bit % 8)) & 0x1) << 5;
1863 					bit++;
1864 				}
1865 				arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
1866 								val << (ru * 6);
1867 			}
1868 		}
1869 	}
1870 
1871 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
1872 		arg->twt_responder = true;
1873 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
1874 		arg->twt_requester = true;
1875 
1876 	switch (sta->deflink.bandwidth) {
1877 	case IEEE80211_STA_RX_BW_160:
1878 		if (he_cap->he_cap_elem.phy_cap_info[0] &
1879 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
1880 			v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80);
1881 			arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1882 
1883 			v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80);
1884 			arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v;
1885 
1886 			arg->peer_he_mcs_count++;
1887 		}
1888 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
1889 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1890 
1891 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160);
1892 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
1893 
1894 		arg->peer_he_mcs_count++;
1895 		fallthrough;
1896 
1897 	default:
1898 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
1899 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1900 
1901 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
1902 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
1903 
1904 		arg->peer_he_mcs_count++;
1905 		break;
1906 	}
1907 }
1908 
1909 static void ath12k_peer_assoc_h_smps(struct ieee80211_sta *sta,
1910 				     struct ath12k_wmi_peer_assoc_arg *arg)
1911 {
1912 	const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
1913 	int smps;
1914 
1915 	if (!ht_cap->ht_supported)
1916 		return;
1917 
1918 	smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
1919 	smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
1920 
1921 	switch (smps) {
1922 	case WLAN_HT_CAP_SM_PS_STATIC:
1923 		arg->static_mimops_flag = true;
1924 		break;
1925 	case WLAN_HT_CAP_SM_PS_DYNAMIC:
1926 		arg->dynamic_mimops_flag = true;
1927 		break;
1928 	case WLAN_HT_CAP_SM_PS_DISABLED:
1929 		arg->spatial_mux_flag = true;
1930 		break;
1931 	default:
1932 		break;
1933 	}
1934 }
1935 
1936 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
1937 				    struct ieee80211_vif *vif,
1938 				    struct ieee80211_sta *sta,
1939 				    struct ath12k_wmi_peer_assoc_arg *arg)
1940 {
1941 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
1942 
1943 	switch (arvif->vdev_type) {
1944 	case WMI_VDEV_TYPE_AP:
1945 		if (sta->wme) {
1946 			/* TODO: Check WME vs QoS */
1947 			arg->is_wme_set = true;
1948 			arg->qos_flag = true;
1949 		}
1950 
1951 		if (sta->wme && sta->uapsd_queues) {
1952 			/* TODO: Check WME vs QoS */
1953 			arg->is_wme_set = true;
1954 			arg->apsd_flag = true;
1955 			arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
1956 		}
1957 		break;
1958 	case WMI_VDEV_TYPE_STA:
1959 		if (sta->wme) {
1960 			arg->is_wme_set = true;
1961 			arg->qos_flag = true;
1962 		}
1963 		break;
1964 	default:
1965 		break;
1966 	}
1967 
1968 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
1969 		   sta->addr, arg->qos_flag);
1970 }
1971 
1972 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
1973 				    struct ath12k_vif *arvif,
1974 				    struct ieee80211_sta *sta)
1975 {
1976 	struct ath12k_wmi_ap_ps_arg arg;
1977 	u32 max_sp;
1978 	u32 uapsd;
1979 	int ret;
1980 
1981 	lockdep_assert_held(&ar->conf_mutex);
1982 
1983 	arg.vdev_id = arvif->vdev_id;
1984 
1985 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
1986 		   sta->uapsd_queues, sta->max_sp);
1987 
1988 	uapsd = 0;
1989 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1990 		uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
1991 			 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
1992 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1993 		uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
1994 			 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
1995 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1996 		uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
1997 			 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
1998 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1999 		uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2000 			 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2001 
2002 	max_sp = 0;
2003 	if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2004 		max_sp = sta->max_sp;
2005 
2006 	arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2007 	arg.value = uapsd;
2008 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2009 	if (ret)
2010 		goto err;
2011 
2012 	arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2013 	arg.value = max_sp;
2014 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2015 	if (ret)
2016 		goto err;
2017 
2018 	/* TODO: revisit during testing */
2019 	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2020 	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2021 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2022 	if (ret)
2023 		goto err;
2024 
2025 	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2026 	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2027 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
2028 	if (ret)
2029 		goto err;
2030 
2031 	return 0;
2032 
2033 err:
2034 	ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2035 		    arg.param, arvif->vdev_id, ret);
2036 	return ret;
2037 }
2038 
2039 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
2040 {
2041 	return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
2042 	       ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2043 }
2044 
2045 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2046 						    struct ieee80211_sta *sta)
2047 {
2048 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2049 		switch (sta->deflink.vht_cap.cap &
2050 			IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
2051 		case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
2052 			return MODE_11AC_VHT160;
2053 		case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
2054 			return MODE_11AC_VHT80_80;
2055 		default:
2056 			/* not sure if this is a valid case? */
2057 			return MODE_11AC_VHT160;
2058 		}
2059 	}
2060 
2061 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2062 		return MODE_11AC_VHT80;
2063 
2064 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2065 		return MODE_11AC_VHT40;
2066 
2067 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2068 		return MODE_11AC_VHT20;
2069 
2070 	return MODE_UNKNOWN;
2071 }
2072 
2073 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2074 						   struct ieee80211_sta *sta)
2075 {
2076 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2077 		if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2078 		     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2079 			return MODE_11AX_HE160;
2080 		else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2081 		     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2082 			return MODE_11AX_HE80_80;
2083 		/* not sure if this is a valid case? */
2084 		return MODE_11AX_HE160;
2085 	}
2086 
2087 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2088 		return MODE_11AX_HE80;
2089 
2090 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2091 		return MODE_11AX_HE40;
2092 
2093 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2094 		return MODE_11AX_HE20;
2095 
2096 	return MODE_UNKNOWN;
2097 }
2098 
2099 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
2100 						    struct ieee80211_sta *sta)
2101 {
2102 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_320)
2103 		if (sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[0] &
2104 		    IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2105 			return MODE_11BE_EHT320;
2106 
2107 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
2108 		if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2109 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2110 			return MODE_11BE_EHT160;
2111 
2112 		if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
2113 			 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2114 			return MODE_11BE_EHT80_80;
2115 
2116 		ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
2117 			    sta->deflink.he_cap.he_cap_elem.phy_cap_info[0]);
2118 
2119 		return MODE_11BE_EHT160;
2120 	}
2121 
2122 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2123 		return MODE_11BE_EHT80;
2124 
2125 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2126 		return MODE_11BE_EHT40;
2127 
2128 	if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
2129 		return MODE_11BE_EHT20;
2130 
2131 	return MODE_UNKNOWN;
2132 }
2133 
2134 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
2135 					struct ieee80211_vif *vif,
2136 					struct ieee80211_sta *sta,
2137 					struct ath12k_wmi_peer_assoc_arg *arg)
2138 {
2139 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2140 	struct cfg80211_chan_def def;
2141 	enum nl80211_band band;
2142 	const u8 *ht_mcs_mask;
2143 	const u16 *vht_mcs_mask;
2144 	enum wmi_phy_mode phymode = MODE_UNKNOWN;
2145 
2146 	if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
2147 		return;
2148 
2149 	band = def.chan->band;
2150 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2151 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2152 
2153 	switch (band) {
2154 	case NL80211_BAND_2GHZ:
2155 		if (sta->deflink.eht_cap.has_eht) {
2156 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2157 				phymode = MODE_11BE_EHT40_2G;
2158 			else
2159 				phymode = MODE_11BE_EHT20_2G;
2160 		} else if (sta->deflink.he_cap.has_he) {
2161 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
2162 				phymode = MODE_11AX_HE80_2G;
2163 			else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2164 				phymode = MODE_11AX_HE40_2G;
2165 			else
2166 				phymode = MODE_11AX_HE20_2G;
2167 		} else if (sta->deflink.vht_cap.vht_supported &&
2168 		    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2169 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2170 				phymode = MODE_11AC_VHT40;
2171 			else
2172 				phymode = MODE_11AC_VHT20;
2173 		} else if (sta->deflink.ht_cap.ht_supported &&
2174 			   !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2175 			if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
2176 				phymode = MODE_11NG_HT40;
2177 			else
2178 				phymode = MODE_11NG_HT20;
2179 		} else if (ath12k_mac_sta_has_ofdm_only(sta)) {
2180 			phymode = MODE_11G;
2181 		} else {
2182 			phymode = MODE_11B;
2183 		}
2184 		break;
2185 	case NL80211_BAND_5GHZ:
2186 	case NL80211_BAND_6GHZ:
2187 		/* Check EHT first */
2188 		if (sta->deflink.eht_cap.has_eht) {
2189 			phymode = ath12k_mac_get_phymode_eht(ar, sta);
2190 		} else if (sta->deflink.he_cap.has_he) {
2191 			phymode = ath12k_mac_get_phymode_he(ar, sta);
2192 		} else if (sta->deflink.vht_cap.vht_supported &&
2193 		    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
2194 			phymode = ath12k_mac_get_phymode_vht(ar, sta);
2195 		} else if (sta->deflink.ht_cap.ht_supported &&
2196 			   !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
2197 			if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
2198 				phymode = MODE_11NA_HT40;
2199 			else
2200 				phymode = MODE_11NA_HT20;
2201 		} else {
2202 			phymode = MODE_11A;
2203 		}
2204 		break;
2205 	default:
2206 		break;
2207 	}
2208 
2209 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
2210 		   sta->addr, ath12k_mac_phymode_str(phymode));
2211 
2212 	arg->peer_phymode = phymode;
2213 	WARN_ON(phymode == MODE_UNKNOWN);
2214 }
2215 
2216 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
2217 				   u8 rx_tx_mcs11, u8 rx_tx_mcs13,
2218 				   u32 *rx_mcs, u32 *tx_mcs)
2219 {
2220 	*rx_mcs = 0;
2221 	u32p_replace_bits(rx_mcs,
2222 			  u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
2223 			  WMI_EHT_MCS_NSS_0_7);
2224 	u32p_replace_bits(rx_mcs,
2225 			  u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
2226 			  WMI_EHT_MCS_NSS_8_9);
2227 	u32p_replace_bits(rx_mcs,
2228 			  u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
2229 			  WMI_EHT_MCS_NSS_10_11);
2230 	u32p_replace_bits(rx_mcs,
2231 			  u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
2232 			  WMI_EHT_MCS_NSS_12_13);
2233 
2234 	*tx_mcs = 0;
2235 	u32p_replace_bits(tx_mcs,
2236 			  u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
2237 			  WMI_EHT_MCS_NSS_0_7);
2238 	u32p_replace_bits(tx_mcs,
2239 			  u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
2240 			  WMI_EHT_MCS_NSS_8_9);
2241 	u32p_replace_bits(tx_mcs,
2242 			  u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
2243 			  WMI_EHT_MCS_NSS_10_11);
2244 	u32p_replace_bits(tx_mcs,
2245 			  u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
2246 			  WMI_EHT_MCS_NSS_12_13);
2247 }
2248 
2249 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
2250 					     struct ath12k_wmi_ppe_threshold_arg *ppet)
2251 {
2252 	u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
2253 	u8 nss, ru, i;
2254 	u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
2255 
2256 	ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
2257 	ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
2258 					 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2259 
2260 	for (nss = 0; nss <= ppet->numss_m1; nss++) {
2261 		for (ru = 0;
2262 		     ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2263 		     ru++) {
2264 			if ((ppet->ru_bit_mask & BIT(ru)) == 0)
2265 				continue;
2266 
2267 			val = 0;
2268 			for (i = 0; i < ppet_bit_len_per_ru; i++) {
2269 				val |= (((ppe_thres[bit_pos / 8] >>
2270 					  (bit_pos % 8)) & 0x1) << i);
2271 				bit_pos++;
2272 			}
2273 			ppet->ppet16_ppet8_ru3_ru0[nss] |=
2274 					(val << (ru * ppet_bit_len_per_ru));
2275 		}
2276 	}
2277 }
2278 
2279 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
2280 				    struct ieee80211_vif *vif,
2281 				    struct ieee80211_sta *sta,
2282 				    struct ath12k_wmi_peer_assoc_arg *arg)
2283 {
2284 	const struct ieee80211_sta_eht_cap *eht_cap = &sta->deflink.eht_cap;
2285 	const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
2286 	const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
2287 	const struct ieee80211_eht_mcs_nss_supp_bw *bw;
2288 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2289 	u32 *rx_mcs, *tx_mcs;
2290 
2291 	if (!sta->deflink.he_cap.has_he || !eht_cap->has_eht)
2292 		return;
2293 
2294 	arg->eht_flag = true;
2295 
2296 	if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
2297 	     IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
2298 	    eht_cap->eht_ppe_thres[0] != 0)
2299 		ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
2300 						 &arg->peer_eht_ppet);
2301 
2302 	memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
2303 	       sizeof(eht_cap->eht_cap_elem.mac_cap_info));
2304 	memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
2305 	       sizeof(eht_cap->eht_cap_elem.phy_cap_info));
2306 
2307 	rx_mcs = arg->peer_eht_rx_mcs_set;
2308 	tx_mcs = arg->peer_eht_tx_mcs_set;
2309 
2310 	switch (sta->deflink.bandwidth) {
2311 	case IEEE80211_STA_RX_BW_320:
2312 		bw = &eht_cap->eht_mcs_nss_supp.bw._320;
2313 		ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2314 				       bw->rx_tx_mcs9_max_nss,
2315 				       bw->rx_tx_mcs11_max_nss,
2316 				       bw->rx_tx_mcs13_max_nss,
2317 				       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
2318 				       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
2319 		arg->peer_eht_mcs_count++;
2320 		fallthrough;
2321 	case IEEE80211_STA_RX_BW_160:
2322 		bw = &eht_cap->eht_mcs_nss_supp.bw._160;
2323 		ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2324 				       bw->rx_tx_mcs9_max_nss,
2325 				       bw->rx_tx_mcs11_max_nss,
2326 				       bw->rx_tx_mcs13_max_nss,
2327 				       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
2328 				       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
2329 		arg->peer_eht_mcs_count++;
2330 		fallthrough;
2331 	default:
2332 		if ((he_cap->he_cap_elem.phy_cap_info[0] &
2333 		     (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
2334 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
2335 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
2336 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
2337 			bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
2338 
2339 			ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
2340 					       bw_20->rx_tx_mcs9_max_nss,
2341 					       bw_20->rx_tx_mcs11_max_nss,
2342 					       bw_20->rx_tx_mcs13_max_nss,
2343 					       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
2344 					       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
2345 		} else {
2346 			bw = &eht_cap->eht_mcs_nss_supp.bw._80;
2347 			ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
2348 					       bw->rx_tx_mcs9_max_nss,
2349 					       bw->rx_tx_mcs11_max_nss,
2350 					       bw->rx_tx_mcs13_max_nss,
2351 					       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
2352 					       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
2353 		}
2354 
2355 		arg->peer_eht_mcs_count++;
2356 		break;
2357 	}
2358 
2359 	arg->punct_bitmap = ~arvif->punct_bitmap;
2360 }
2361 
2362 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
2363 				      struct ieee80211_vif *vif,
2364 				      struct ieee80211_sta *sta,
2365 				      struct ath12k_wmi_peer_assoc_arg *arg,
2366 				      bool reassoc)
2367 {
2368 	lockdep_assert_held(&ar->conf_mutex);
2369 
2370 	memset(arg, 0, sizeof(*arg));
2371 
2372 	reinit_completion(&ar->peer_assoc_done);
2373 
2374 	arg->peer_new_assoc = !reassoc;
2375 	ath12k_peer_assoc_h_basic(ar, vif, sta, arg);
2376 	ath12k_peer_assoc_h_crypto(ar, vif, sta, arg);
2377 	ath12k_peer_assoc_h_rates(ar, vif, sta, arg);
2378 	ath12k_peer_assoc_h_ht(ar, vif, sta, arg);
2379 	ath12k_peer_assoc_h_vht(ar, vif, sta, arg);
2380 	ath12k_peer_assoc_h_he(ar, vif, sta, arg);
2381 	ath12k_peer_assoc_h_eht(ar, vif, sta, arg);
2382 	ath12k_peer_assoc_h_qos(ar, vif, sta, arg);
2383 	ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
2384 	ath12k_peer_assoc_h_smps(sta, arg);
2385 
2386 	/* TODO: amsdu_disable req? */
2387 }
2388 
2389 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_vif *arvif,
2390 				  const u8 *addr,
2391 				  const struct ieee80211_sta_ht_cap *ht_cap)
2392 {
2393 	int smps;
2394 
2395 	if (!ht_cap->ht_supported)
2396 		return 0;
2397 
2398 	smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
2399 	smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
2400 
2401 	if (smps >= ARRAY_SIZE(ath12k_smps_map))
2402 		return -EINVAL;
2403 
2404 	return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
2405 					 WMI_PEER_MIMO_PS_STATE,
2406 					 ath12k_smps_map[smps]);
2407 }
2408 
2409 static void ath12k_bss_assoc(struct ath12k *ar,
2410 			     struct ath12k_vif *arvif,
2411 			     struct ieee80211_bss_conf *bss_conf)
2412 {
2413 	struct ieee80211_vif *vif = arvif->vif;
2414 	struct ath12k_wmi_peer_assoc_arg peer_arg;
2415 	struct ieee80211_sta *ap_sta;
2416 	struct ath12k_peer *peer;
2417 	bool is_auth = false;
2418 	int ret;
2419 
2420 	lockdep_assert_held(&ar->conf_mutex);
2421 
2422 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i assoc bssid %pM aid %d\n",
2423 		   arvif->vdev_id, arvif->bssid, arvif->aid);
2424 
2425 	rcu_read_lock();
2426 
2427 	ap_sta = ieee80211_find_sta(vif, bss_conf->bssid);
2428 	if (!ap_sta) {
2429 		ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
2430 			    bss_conf->bssid, arvif->vdev_id);
2431 		rcu_read_unlock();
2432 		return;
2433 	}
2434 
2435 	ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
2436 
2437 	rcu_read_unlock();
2438 
2439 	ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
2440 	if (ret) {
2441 		ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
2442 			    bss_conf->bssid, arvif->vdev_id, ret);
2443 		return;
2444 	}
2445 
2446 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
2447 		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
2448 			    bss_conf->bssid, arvif->vdev_id);
2449 		return;
2450 	}
2451 
2452 	ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
2453 				     &ap_sta->deflink.ht_cap);
2454 	if (ret) {
2455 		ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
2456 			    arvif->vdev_id, ret);
2457 		return;
2458 	}
2459 
2460 	WARN_ON(arvif->is_up);
2461 
2462 	arvif->aid = vif->cfg.aid;
2463 	ether_addr_copy(arvif->bssid, bss_conf->bssid);
2464 
2465 	ret = ath12k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
2466 	if (ret) {
2467 		ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
2468 			    arvif->vdev_id, ret);
2469 		return;
2470 	}
2471 
2472 	arvif->is_up = true;
2473 
2474 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2475 		   "mac vdev %d up (associated) bssid %pM aid %d\n",
2476 		   arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
2477 
2478 	spin_lock_bh(&ar->ab->base_lock);
2479 
2480 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
2481 	if (peer && peer->is_authorized)
2482 		is_auth = true;
2483 
2484 	spin_unlock_bh(&ar->ab->base_lock);
2485 
2486 	/* Authorize BSS Peer */
2487 	if (is_auth) {
2488 		ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
2489 						arvif->vdev_id,
2490 						WMI_PEER_AUTHORIZE,
2491 						1);
2492 		if (ret)
2493 			ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
2494 	}
2495 
2496 	ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2497 					   &bss_conf->he_obss_pd);
2498 	if (ret)
2499 		ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
2500 			    arvif->vdev_id, ret);
2501 }
2502 
2503 static void ath12k_bss_disassoc(struct ath12k *ar,
2504 				struct ath12k_vif *arvif)
2505 {
2506 	int ret;
2507 
2508 	lockdep_assert_held(&ar->conf_mutex);
2509 
2510 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
2511 		   arvif->vdev_id, arvif->bssid);
2512 
2513 	ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
2514 	if (ret)
2515 		ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
2516 			    arvif->vdev_id, ret);
2517 
2518 	arvif->is_up = false;
2519 
2520 	/* TODO: cancel connection_loss_work */
2521 }
2522 
2523 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
2524 {
2525 	u32 preamble;
2526 	u16 hw_value;
2527 	int rate;
2528 	size_t i;
2529 
2530 	if (ath12k_mac_bitrate_is_cck(bitrate))
2531 		preamble = WMI_RATE_PREAMBLE_CCK;
2532 	else
2533 		preamble = WMI_RATE_PREAMBLE_OFDM;
2534 
2535 	for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
2536 		if (ath12k_legacy_rates[i].bitrate != bitrate)
2537 			continue;
2538 
2539 		hw_value = ath12k_legacy_rates[i].hw_value;
2540 		rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2541 
2542 		return rate;
2543 	}
2544 
2545 	return -EINVAL;
2546 }
2547 
2548 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
2549 					 struct ieee80211_vif *vif,
2550 					 struct cfg80211_chan_def *def)
2551 {
2552 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2553 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2554 	const struct ieee80211_supported_band *sband;
2555 	u8 basic_rate_idx;
2556 	int hw_rate_code;
2557 	u32 vdev_param;
2558 	u16 bitrate;
2559 	int ret;
2560 
2561 	lockdep_assert_held(&ar->conf_mutex);
2562 
2563 	sband = hw->wiphy->bands[def->chan->band];
2564 	basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
2565 	bitrate = sband->bitrates[basic_rate_idx].bitrate;
2566 
2567 	hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
2568 	if (hw_rate_code < 0) {
2569 		ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
2570 		return;
2571 	}
2572 
2573 	vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
2574 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2575 					    hw_rate_code);
2576 	if (ret)
2577 		ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
2578 
2579 	vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
2580 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
2581 					    hw_rate_code);
2582 	if (ret)
2583 		ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
2584 }
2585 
2586 static int ath12k_mac_fils_discovery(struct ath12k_vif *arvif,
2587 				     struct ieee80211_bss_conf *info)
2588 {
2589 	struct ath12k *ar = arvif->ar;
2590 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2591 	struct sk_buff *tmpl;
2592 	int ret;
2593 	u32 interval;
2594 	bool unsol_bcast_probe_resp_enabled = false;
2595 
2596 	if (info->fils_discovery.max_interval) {
2597 		interval = info->fils_discovery.max_interval;
2598 
2599 		tmpl = ieee80211_get_fils_discovery_tmpl(hw, arvif->vif);
2600 		if (tmpl)
2601 			ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
2602 							     tmpl);
2603 	} else if (info->unsol_bcast_probe_resp_interval) {
2604 		unsol_bcast_probe_resp_enabled = 1;
2605 		interval = info->unsol_bcast_probe_resp_interval;
2606 
2607 		tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw,
2608 								 arvif->vif);
2609 		if (tmpl)
2610 			ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
2611 							 tmpl);
2612 	} else { /* Disable */
2613 		return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
2614 	}
2615 
2616 	if (!tmpl) {
2617 		ath12k_warn(ar->ab,
2618 			    "mac vdev %i failed to retrieve %s template\n",
2619 			    arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
2620 			    "unsolicited broadcast probe response" :
2621 			    "FILS discovery"));
2622 		return -EPERM;
2623 	}
2624 	kfree_skb(tmpl);
2625 
2626 	if (!ret)
2627 		ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
2628 						unsol_bcast_probe_resp_enabled);
2629 
2630 	return ret;
2631 }
2632 
2633 static void ath12k_mac_vif_setup_ps(struct ath12k_vif *arvif)
2634 {
2635 	struct ath12k *ar = arvif->ar;
2636 	struct ieee80211_vif *vif = arvif->vif;
2637 	struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
2638 	enum wmi_sta_powersave_param param;
2639 	enum wmi_sta_ps_mode psmode;
2640 	int ret;
2641 	int timeout;
2642 	bool enable_ps;
2643 
2644 	lockdep_assert_held(&ar->conf_mutex);
2645 
2646 	if (vif->type != NL80211_IFTYPE_STATION)
2647 		return;
2648 
2649 	enable_ps = arvif->ps;
2650 	if (enable_ps) {
2651 		psmode = WMI_STA_PS_MODE_ENABLED;
2652 		param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
2653 
2654 		timeout = conf->dynamic_ps_timeout;
2655 		if (timeout == 0) {
2656 			/* firmware doesn't like 0 */
2657 			timeout = ieee80211_tu_to_usec(vif->bss_conf.beacon_int) / 1000;
2658 		}
2659 
2660 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
2661 						  timeout);
2662 		if (ret) {
2663 			ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
2664 				    arvif->vdev_id, ret);
2665 			return;
2666 		}
2667 	} else {
2668 		psmode = WMI_STA_PS_MODE_DISABLED;
2669 	}
2670 
2671 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
2672 		   arvif->vdev_id, psmode ? "enable" : "disable");
2673 
2674 	ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
2675 	if (ret)
2676 		ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
2677 			    psmode, arvif->vdev_id, ret);
2678 }
2679 
2680 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
2681 					struct ath12k_vif *arvif,
2682 					struct ieee80211_bss_conf *info,
2683 					u64 changed)
2684 {
2685 	struct ieee80211_vif *vif = arvif->vif;
2686 	struct ieee80211_vif_cfg *vif_cfg = &vif->cfg;
2687 	struct cfg80211_chan_def def;
2688 	u32 param_id, param_value;
2689 	enum nl80211_band band;
2690 	u32 vdev_param;
2691 	int mcast_rate;
2692 	u32 preamble;
2693 	u16 hw_value;
2694 	u16 bitrate;
2695 	int ret;
2696 	u8 rateidx;
2697 	u32 rate;
2698 
2699 	lockdep_assert_held(&ar->conf_mutex);
2700 
2701 	if (changed & BSS_CHANGED_BEACON_INT) {
2702 		arvif->beacon_interval = info->beacon_int;
2703 
2704 		param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
2705 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2706 						    param_id,
2707 						    arvif->beacon_interval);
2708 		if (ret)
2709 			ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
2710 				    arvif->vdev_id);
2711 		else
2712 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2713 				   "Beacon interval: %d set for VDEV: %d\n",
2714 				   arvif->beacon_interval, arvif->vdev_id);
2715 	}
2716 
2717 	if (changed & BSS_CHANGED_BEACON) {
2718 		param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
2719 		param_value = WMI_BEACON_BURST_MODE;
2720 		ret = ath12k_wmi_pdev_set_param(ar, param_id,
2721 						param_value, ar->pdev->pdev_id);
2722 		if (ret)
2723 			ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
2724 				    arvif->vdev_id);
2725 		else
2726 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2727 				   "Set burst beacon mode for VDEV: %d\n",
2728 				   arvif->vdev_id);
2729 
2730 		ret = ath12k_mac_setup_bcn_tmpl(arvif);
2731 		if (ret)
2732 			ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
2733 				    ret);
2734 	}
2735 
2736 	if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
2737 		arvif->dtim_period = info->dtim_period;
2738 
2739 		param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
2740 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2741 						    param_id,
2742 						    arvif->dtim_period);
2743 
2744 		if (ret)
2745 			ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
2746 				    arvif->vdev_id, ret);
2747 		else
2748 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2749 				   "DTIM period: %d set for VDEV: %d\n",
2750 				   arvif->dtim_period, arvif->vdev_id);
2751 	}
2752 
2753 	if (changed & BSS_CHANGED_SSID &&
2754 	    vif->type == NL80211_IFTYPE_AP) {
2755 		arvif->u.ap.ssid_len = vif->cfg.ssid_len;
2756 		if (vif->cfg.ssid_len)
2757 			memcpy(arvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
2758 		arvif->u.ap.hidden_ssid = info->hidden_ssid;
2759 	}
2760 
2761 	if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
2762 		ether_addr_copy(arvif->bssid, info->bssid);
2763 
2764 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
2765 		ath12k_control_beaconing(arvif, info);
2766 
2767 		if (arvif->is_up && vif->bss_conf.he_support &&
2768 		    vif->bss_conf.he_oper.params) {
2769 			/* TODO: Extend to support 1024 BA Bitmap size */
2770 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2771 							    WMI_VDEV_PARAM_BA_MODE,
2772 							    WMI_BA_MODE_BUFFER_SIZE_256);
2773 			if (ret)
2774 				ath12k_warn(ar->ab,
2775 					    "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
2776 					    arvif->vdev_id);
2777 
2778 			param_id = WMI_VDEV_PARAM_HEOPS_0_31;
2779 			param_value = vif->bss_conf.he_oper.params;
2780 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2781 							    param_id, param_value);
2782 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2783 				   "he oper param: %x set for VDEV: %d\n",
2784 				   param_value, arvif->vdev_id);
2785 
2786 			if (ret)
2787 				ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
2788 					    param_value, arvif->vdev_id, ret);
2789 		}
2790 	}
2791 
2792 	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2793 		u32 cts_prot;
2794 
2795 		cts_prot = !!(info->use_cts_prot);
2796 		param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
2797 
2798 		if (arvif->is_started) {
2799 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2800 							    param_id, cts_prot);
2801 			if (ret)
2802 				ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
2803 					    arvif->vdev_id);
2804 			else
2805 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
2806 					   cts_prot, arvif->vdev_id);
2807 		} else {
2808 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
2809 		}
2810 	}
2811 
2812 	if (changed & BSS_CHANGED_ERP_SLOT) {
2813 		u32 slottime;
2814 
2815 		if (info->use_short_slot)
2816 			slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
2817 
2818 		else
2819 			slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
2820 
2821 		param_id = WMI_VDEV_PARAM_SLOT_TIME;
2822 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2823 						    param_id, slottime);
2824 		if (ret)
2825 			ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
2826 				    arvif->vdev_id);
2827 		else
2828 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2829 				   "Set slottime: %d for VDEV: %d\n",
2830 				   slottime, arvif->vdev_id);
2831 	}
2832 
2833 	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2834 		u32 preamble;
2835 
2836 		if (info->use_short_preamble)
2837 			preamble = WMI_VDEV_PREAMBLE_SHORT;
2838 		else
2839 			preamble = WMI_VDEV_PREAMBLE_LONG;
2840 
2841 		param_id = WMI_VDEV_PARAM_PREAMBLE;
2842 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2843 						    param_id, preamble);
2844 		if (ret)
2845 			ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
2846 				    arvif->vdev_id);
2847 		else
2848 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2849 				   "Set preamble: %d for VDEV: %d\n",
2850 				   preamble, arvif->vdev_id);
2851 	}
2852 
2853 	if (changed & BSS_CHANGED_ASSOC) {
2854 		if (vif->cfg.assoc)
2855 			ath12k_bss_assoc(ar, arvif, info);
2856 		else
2857 			ath12k_bss_disassoc(ar, arvif);
2858 	}
2859 
2860 	if (changed & BSS_CHANGED_TXPOWER) {
2861 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
2862 			   arvif->vdev_id, info->txpower);
2863 
2864 		arvif->txpower = info->txpower;
2865 		ath12k_mac_txpower_recalc(ar);
2866 	}
2867 
2868 	if (changed & BSS_CHANGED_MCAST_RATE &&
2869 	    !ath12k_mac_vif_chan(arvif->vif, &def)) {
2870 		band = def.chan->band;
2871 		mcast_rate = vif->bss_conf.mcast_rate[band];
2872 
2873 		if (mcast_rate > 0)
2874 			rateidx = mcast_rate - 1;
2875 		else
2876 			rateidx = ffs(vif->bss_conf.basic_rates) - 1;
2877 
2878 		if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP)
2879 			rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2880 
2881 		bitrate = ath12k_legacy_rates[rateidx].bitrate;
2882 		hw_value = ath12k_legacy_rates[rateidx].hw_value;
2883 
2884 		if (ath12k_mac_bitrate_is_cck(bitrate))
2885 			preamble = WMI_RATE_PREAMBLE_CCK;
2886 		else
2887 			preamble = WMI_RATE_PREAMBLE_OFDM;
2888 
2889 		rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
2890 
2891 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2892 			   "mac vdev %d mcast_rate %x\n",
2893 			   arvif->vdev_id, rate);
2894 
2895 		vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
2896 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2897 						    vdev_param, rate);
2898 		if (ret)
2899 			ath12k_warn(ar->ab,
2900 				    "failed to set mcast rate on vdev %i: %d\n",
2901 				    arvif->vdev_id,  ret);
2902 
2903 		vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
2904 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
2905 						    vdev_param, rate);
2906 		if (ret)
2907 			ath12k_warn(ar->ab,
2908 				    "failed to set bcast rate on vdev %i: %d\n",
2909 				    arvif->vdev_id,  ret);
2910 	}
2911 
2912 	if (changed & BSS_CHANGED_BASIC_RATES &&
2913 	    !ath12k_mac_vif_chan(arvif->vif, &def))
2914 		ath12k_recalculate_mgmt_rate(ar, vif, &def);
2915 
2916 	if (changed & BSS_CHANGED_TWT) {
2917 		if (info->twt_requester || info->twt_responder)
2918 			ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
2919 		else
2920 			ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
2921 	}
2922 
2923 	if (changed & BSS_CHANGED_HE_OBSS_PD)
2924 		ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
2925 					     &info->he_obss_pd);
2926 
2927 	if (changed & BSS_CHANGED_HE_BSS_COLOR) {
2928 		if (vif->type == NL80211_IFTYPE_AP) {
2929 			ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2930 							    arvif->vdev_id,
2931 							    info->he_bss_color.color,
2932 							    ATH12K_BSS_COLOR_AP_PERIODS,
2933 							    info->he_bss_color.enabled);
2934 			if (ret)
2935 				ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2936 					    arvif->vdev_id,  ret);
2937 		} else if (vif->type == NL80211_IFTYPE_STATION) {
2938 			ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
2939 									  arvif->vdev_id,
2940 									  1);
2941 			if (ret)
2942 				ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
2943 					    arvif->vdev_id,  ret);
2944 			ret = ath12k_wmi_obss_color_cfg_cmd(ar,
2945 							    arvif->vdev_id,
2946 							    0,
2947 							    ATH12K_BSS_COLOR_STA_PERIODS,
2948 							    1);
2949 			if (ret)
2950 				ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
2951 					    arvif->vdev_id,  ret);
2952 		}
2953 	}
2954 
2955 	ath12k_mac_fils_discovery(arvif, info);
2956 
2957 	if (changed & BSS_CHANGED_PS &&
2958 	    ar->ab->hw_params->supports_sta_ps) {
2959 		arvif->ps = vif_cfg->ps;
2960 		ath12k_mac_vif_setup_ps(arvif);
2961 	}
2962 }
2963 
2964 static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
2965 					   struct ieee80211_vif *vif,
2966 					   struct ieee80211_bss_conf *info,
2967 					   u64 changed)
2968 {
2969 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
2970 	struct ath12k *ar;
2971 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
2972 
2973 	ar = ath12k_ah_to_ar(ah);
2974 
2975 	mutex_lock(&ar->conf_mutex);
2976 
2977 	ath12k_mac_bss_info_changed(ar, arvif, info, changed);
2978 
2979 	mutex_unlock(&ar->conf_mutex);
2980 }
2981 
2982 void __ath12k_mac_scan_finish(struct ath12k *ar)
2983 {
2984 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
2985 
2986 	lockdep_assert_held(&ar->data_lock);
2987 
2988 	switch (ar->scan.state) {
2989 	case ATH12K_SCAN_IDLE:
2990 		break;
2991 	case ATH12K_SCAN_RUNNING:
2992 	case ATH12K_SCAN_ABORTING:
2993 		if (ar->scan.is_roc && ar->scan.roc_notify)
2994 			ieee80211_remain_on_channel_expired(hw);
2995 		fallthrough;
2996 	case ATH12K_SCAN_STARTING:
2997 		if (!ar->scan.is_roc) {
2998 			struct cfg80211_scan_info info = {
2999 				.aborted = ((ar->scan.state ==
3000 					    ATH12K_SCAN_ABORTING) ||
3001 					    (ar->scan.state ==
3002 					    ATH12K_SCAN_STARTING)),
3003 			};
3004 
3005 			ieee80211_scan_completed(hw, &info);
3006 		}
3007 
3008 		ar->scan.state = ATH12K_SCAN_IDLE;
3009 		ar->scan_channel = NULL;
3010 		ar->scan.roc_freq = 0;
3011 		cancel_delayed_work(&ar->scan.timeout);
3012 		complete(&ar->scan.completed);
3013 		break;
3014 	}
3015 }
3016 
3017 void ath12k_mac_scan_finish(struct ath12k *ar)
3018 {
3019 	spin_lock_bh(&ar->data_lock);
3020 	__ath12k_mac_scan_finish(ar);
3021 	spin_unlock_bh(&ar->data_lock);
3022 }
3023 
3024 static int ath12k_scan_stop(struct ath12k *ar)
3025 {
3026 	struct ath12k_wmi_scan_cancel_arg arg = {
3027 		.req_type = WLAN_SCAN_CANCEL_SINGLE,
3028 		.scan_id = ATH12K_SCAN_ID,
3029 	};
3030 	int ret;
3031 
3032 	lockdep_assert_held(&ar->conf_mutex);
3033 
3034 	/* TODO: Fill other STOP Params */
3035 	arg.pdev_id = ar->pdev->pdev_id;
3036 
3037 	ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
3038 	if (ret) {
3039 		ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
3040 		goto out;
3041 	}
3042 
3043 	ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
3044 	if (ret == 0) {
3045 		ath12k_warn(ar->ab,
3046 			    "failed to receive scan abort comple: timed out\n");
3047 		ret = -ETIMEDOUT;
3048 	} else if (ret > 0) {
3049 		ret = 0;
3050 	}
3051 
3052 out:
3053 	/* Scan state should be updated upon scan completion but in case
3054 	 * firmware fails to deliver the event (for whatever reason) it is
3055 	 * desired to clean up scan state anyway. Firmware may have just
3056 	 * dropped the scan completion event delivery due to transport pipe
3057 	 * being overflown with data and/or it can recover on its own before
3058 	 * next scan request is submitted.
3059 	 */
3060 	spin_lock_bh(&ar->data_lock);
3061 	if (ar->scan.state != ATH12K_SCAN_IDLE)
3062 		__ath12k_mac_scan_finish(ar);
3063 	spin_unlock_bh(&ar->data_lock);
3064 
3065 	return ret;
3066 }
3067 
3068 static void ath12k_scan_abort(struct ath12k *ar)
3069 {
3070 	int ret;
3071 
3072 	lockdep_assert_held(&ar->conf_mutex);
3073 
3074 	spin_lock_bh(&ar->data_lock);
3075 
3076 	switch (ar->scan.state) {
3077 	case ATH12K_SCAN_IDLE:
3078 		/* This can happen if timeout worker kicked in and called
3079 		 * abortion while scan completion was being processed.
3080 		 */
3081 		break;
3082 	case ATH12K_SCAN_STARTING:
3083 	case ATH12K_SCAN_ABORTING:
3084 		ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
3085 			    ar->scan.state);
3086 		break;
3087 	case ATH12K_SCAN_RUNNING:
3088 		ar->scan.state = ATH12K_SCAN_ABORTING;
3089 		spin_unlock_bh(&ar->data_lock);
3090 
3091 		ret = ath12k_scan_stop(ar);
3092 		if (ret)
3093 			ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
3094 
3095 		spin_lock_bh(&ar->data_lock);
3096 		break;
3097 	}
3098 
3099 	spin_unlock_bh(&ar->data_lock);
3100 }
3101 
3102 static void ath12k_scan_timeout_work(struct work_struct *work)
3103 {
3104 	struct ath12k *ar = container_of(work, struct ath12k,
3105 					 scan.timeout.work);
3106 
3107 	mutex_lock(&ar->conf_mutex);
3108 	ath12k_scan_abort(ar);
3109 	mutex_unlock(&ar->conf_mutex);
3110 }
3111 
3112 static int ath12k_start_scan(struct ath12k *ar,
3113 			     struct ath12k_wmi_scan_req_arg *arg)
3114 {
3115 	int ret;
3116 
3117 	lockdep_assert_held(&ar->conf_mutex);
3118 
3119 	ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
3120 	if (ret)
3121 		return ret;
3122 
3123 	ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
3124 	if (ret == 0) {
3125 		ret = ath12k_scan_stop(ar);
3126 		if (ret)
3127 			ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
3128 
3129 		return -ETIMEDOUT;
3130 	}
3131 
3132 	/* If we failed to start the scan, return error code at
3133 	 * this point.  This is probably due to some issue in the
3134 	 * firmware, but no need to wedge the driver due to that...
3135 	 */
3136 	spin_lock_bh(&ar->data_lock);
3137 	if (ar->scan.state == ATH12K_SCAN_IDLE) {
3138 		spin_unlock_bh(&ar->data_lock);
3139 		return -EINVAL;
3140 	}
3141 	spin_unlock_bh(&ar->data_lock);
3142 
3143 	return 0;
3144 }
3145 
3146 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
3147 				 struct ieee80211_vif *vif,
3148 				 struct ieee80211_scan_request *hw_req)
3149 {
3150 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3151 	struct ath12k *ar;
3152 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3153 	struct cfg80211_scan_request *req = &hw_req->req;
3154 	struct ath12k_wmi_scan_req_arg arg = {};
3155 	int ret;
3156 	int i;
3157 
3158 	ar = ath12k_ah_to_ar(ah);
3159 
3160 	mutex_lock(&ar->conf_mutex);
3161 
3162 	spin_lock_bh(&ar->data_lock);
3163 	switch (ar->scan.state) {
3164 	case ATH12K_SCAN_IDLE:
3165 		reinit_completion(&ar->scan.started);
3166 		reinit_completion(&ar->scan.completed);
3167 		ar->scan.state = ATH12K_SCAN_STARTING;
3168 		ar->scan.is_roc = false;
3169 		ar->scan.vdev_id = arvif->vdev_id;
3170 		ret = 0;
3171 		break;
3172 	case ATH12K_SCAN_STARTING:
3173 	case ATH12K_SCAN_RUNNING:
3174 	case ATH12K_SCAN_ABORTING:
3175 		ret = -EBUSY;
3176 		break;
3177 	}
3178 	spin_unlock_bh(&ar->data_lock);
3179 
3180 	if (ret)
3181 		goto exit;
3182 
3183 	ath12k_wmi_start_scan_init(ar, &arg);
3184 	arg.vdev_id = arvif->vdev_id;
3185 	arg.scan_id = ATH12K_SCAN_ID;
3186 
3187 	if (req->ie_len) {
3188 		arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
3189 		if (!arg.extraie.ptr) {
3190 			ret = -ENOMEM;
3191 			goto exit;
3192 		}
3193 		arg.extraie.len = req->ie_len;
3194 	}
3195 
3196 	if (req->n_ssids) {
3197 		arg.num_ssids = req->n_ssids;
3198 		for (i = 0; i < arg.num_ssids; i++)
3199 			arg.ssid[i] = req->ssids[i];
3200 	} else {
3201 		arg.scan_f_passive = 1;
3202 	}
3203 
3204 	if (req->n_channels) {
3205 		arg.num_chan = req->n_channels;
3206 		arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
3207 					GFP_KERNEL);
3208 
3209 		if (!arg.chan_list) {
3210 			ret = -ENOMEM;
3211 			goto exit;
3212 		}
3213 
3214 		for (i = 0; i < arg.num_chan; i++)
3215 			arg.chan_list[i] = req->channels[i]->center_freq;
3216 	}
3217 
3218 	ret = ath12k_start_scan(ar, &arg);
3219 	if (ret) {
3220 		ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
3221 		spin_lock_bh(&ar->data_lock);
3222 		ar->scan.state = ATH12K_SCAN_IDLE;
3223 		spin_unlock_bh(&ar->data_lock);
3224 	}
3225 
3226 	/* Add a margin to account for event/command processing */
3227 	ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
3228 				     msecs_to_jiffies(arg.max_scan_time +
3229 						      ATH12K_MAC_SCAN_TIMEOUT_MSECS));
3230 
3231 exit:
3232 	kfree(arg.chan_list);
3233 
3234 	if (req->ie_len)
3235 		kfree(arg.extraie.ptr);
3236 
3237 	mutex_unlock(&ar->conf_mutex);
3238 
3239 	return ret;
3240 }
3241 
3242 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
3243 					 struct ieee80211_vif *vif)
3244 {
3245 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3246 	struct ath12k *ar;
3247 
3248 	ar = ath12k_ah_to_ar(ah);
3249 
3250 	mutex_lock(&ar->conf_mutex);
3251 	ath12k_scan_abort(ar);
3252 	mutex_unlock(&ar->conf_mutex);
3253 
3254 	cancel_delayed_work_sync(&ar->scan.timeout);
3255 }
3256 
3257 static int ath12k_install_key(struct ath12k_vif *arvif,
3258 			      struct ieee80211_key_conf *key,
3259 			      enum set_key_cmd cmd,
3260 			      const u8 *macaddr, u32 flags)
3261 {
3262 	int ret;
3263 	struct ath12k *ar = arvif->ar;
3264 	struct wmi_vdev_install_key_arg arg = {
3265 		.vdev_id = arvif->vdev_id,
3266 		.key_idx = key->keyidx,
3267 		.key_len = key->keylen,
3268 		.key_data = key->key,
3269 		.key_flags = flags,
3270 		.macaddr = macaddr,
3271 	};
3272 
3273 	lockdep_assert_held(&arvif->ar->conf_mutex);
3274 
3275 	reinit_completion(&ar->install_key_done);
3276 
3277 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3278 		return 0;
3279 
3280 	if (cmd == DISABLE_KEY) {
3281 		/* TODO: Check if FW expects  value other than NONE for del */
3282 		/* arg.key_cipher = WMI_CIPHER_NONE; */
3283 		arg.key_len = 0;
3284 		arg.key_data = NULL;
3285 		goto install;
3286 	}
3287 
3288 	switch (key->cipher) {
3289 	case WLAN_CIPHER_SUITE_CCMP:
3290 		arg.key_cipher = WMI_CIPHER_AES_CCM;
3291 		/* TODO: Re-check if flag is valid */
3292 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
3293 		break;
3294 	case WLAN_CIPHER_SUITE_TKIP:
3295 		arg.key_cipher = WMI_CIPHER_TKIP;
3296 		arg.key_txmic_len = 8;
3297 		arg.key_rxmic_len = 8;
3298 		break;
3299 	case WLAN_CIPHER_SUITE_CCMP_256:
3300 		arg.key_cipher = WMI_CIPHER_AES_CCM;
3301 		break;
3302 	case WLAN_CIPHER_SUITE_GCMP:
3303 	case WLAN_CIPHER_SUITE_GCMP_256:
3304 		arg.key_cipher = WMI_CIPHER_AES_GCM;
3305 		break;
3306 	default:
3307 		ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
3308 		return -EOPNOTSUPP;
3309 	}
3310 
3311 	if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
3312 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
3313 			      IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
3314 
3315 install:
3316 	ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
3317 
3318 	if (ret)
3319 		return ret;
3320 
3321 	if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
3322 		return -ETIMEDOUT;
3323 
3324 	if (ether_addr_equal(macaddr, arvif->vif->addr))
3325 		arvif->key_cipher = key->cipher;
3326 
3327 	return ar->install_key_status ? -EINVAL : 0;
3328 }
3329 
3330 static int ath12k_clear_peer_keys(struct ath12k_vif *arvif,
3331 				  const u8 *addr)
3332 {
3333 	struct ath12k *ar = arvif->ar;
3334 	struct ath12k_base *ab = ar->ab;
3335 	struct ath12k_peer *peer;
3336 	int first_errno = 0;
3337 	int ret;
3338 	int i;
3339 	u32 flags = 0;
3340 
3341 	lockdep_assert_held(&ar->conf_mutex);
3342 
3343 	spin_lock_bh(&ab->base_lock);
3344 	peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
3345 	spin_unlock_bh(&ab->base_lock);
3346 
3347 	if (!peer)
3348 		return -ENOENT;
3349 
3350 	for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
3351 		if (!peer->keys[i])
3352 			continue;
3353 
3354 		/* key flags are not required to delete the key */
3355 		ret = ath12k_install_key(arvif, peer->keys[i],
3356 					 DISABLE_KEY, addr, flags);
3357 		if (ret < 0 && first_errno == 0)
3358 			first_errno = ret;
3359 
3360 		if (ret < 0)
3361 			ath12k_warn(ab, "failed to remove peer key %d: %d\n",
3362 				    i, ret);
3363 
3364 		spin_lock_bh(&ab->base_lock);
3365 		peer->keys[i] = NULL;
3366 		spin_unlock_bh(&ab->base_lock);
3367 	}
3368 
3369 	return first_errno;
3370 }
3371 
3372 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3373 				 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
3374 				 struct ieee80211_key_conf *key)
3375 {
3376 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3377 	struct ath12k *ar;
3378 	struct ath12k_base *ab;
3379 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3380 	struct ath12k_peer *peer;
3381 	struct ath12k_sta *arsta;
3382 	const u8 *peer_addr;
3383 	int ret = 0;
3384 	u32 flags = 0;
3385 
3386 	/* BIP needs to be done in software */
3387 	if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
3388 	    key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
3389 	    key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
3390 	    key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
3391 		return 1;
3392 
3393 	ar = ath12k_ah_to_ar(ah);
3394 	ab = ar->ab;
3395 
3396 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
3397 		return 1;
3398 
3399 	if (key->keyidx > WMI_MAX_KEY_INDEX)
3400 		return -ENOSPC;
3401 
3402 	mutex_lock(&ar->conf_mutex);
3403 
3404 	if (sta)
3405 		peer_addr = sta->addr;
3406 	else if (arvif->vdev_type == WMI_VDEV_TYPE_STA)
3407 		peer_addr = vif->bss_conf.bssid;
3408 	else
3409 		peer_addr = vif->addr;
3410 
3411 	key->hw_key_idx = key->keyidx;
3412 
3413 	/* the peer should not disappear in mid-way (unless FW goes awry) since
3414 	 * we already hold conf_mutex. we just make sure its there now.
3415 	 */
3416 	spin_lock_bh(&ab->base_lock);
3417 	peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3418 	spin_unlock_bh(&ab->base_lock);
3419 
3420 	if (!peer) {
3421 		if (cmd == SET_KEY) {
3422 			ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
3423 				    peer_addr);
3424 			ret = -EOPNOTSUPP;
3425 			goto exit;
3426 		} else {
3427 			/* if the peer doesn't exist there is no key to disable
3428 			 * anymore
3429 			 */
3430 			goto exit;
3431 		}
3432 	}
3433 
3434 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3435 		flags |= WMI_KEY_PAIRWISE;
3436 	else
3437 		flags |= WMI_KEY_GROUP;
3438 
3439 	ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
3440 	if (ret) {
3441 		ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
3442 		goto exit;
3443 	}
3444 
3445 	ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
3446 	if (ret) {
3447 		ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
3448 		goto exit;
3449 	}
3450 
3451 	spin_lock_bh(&ab->base_lock);
3452 	peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
3453 	if (peer && cmd == SET_KEY) {
3454 		peer->keys[key->keyidx] = key;
3455 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
3456 			peer->ucast_keyidx = key->keyidx;
3457 			peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
3458 		} else {
3459 			peer->mcast_keyidx = key->keyidx;
3460 			peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
3461 		}
3462 	} else if (peer && cmd == DISABLE_KEY) {
3463 		peer->keys[key->keyidx] = NULL;
3464 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3465 			peer->ucast_keyidx = 0;
3466 		else
3467 			peer->mcast_keyidx = 0;
3468 	} else if (!peer)
3469 		/* impossible unless FW goes crazy */
3470 		ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
3471 
3472 	if (sta) {
3473 		arsta = ath12k_sta_to_arsta(sta);
3474 
3475 		switch (key->cipher) {
3476 		case WLAN_CIPHER_SUITE_TKIP:
3477 		case WLAN_CIPHER_SUITE_CCMP:
3478 		case WLAN_CIPHER_SUITE_CCMP_256:
3479 		case WLAN_CIPHER_SUITE_GCMP:
3480 		case WLAN_CIPHER_SUITE_GCMP_256:
3481 			if (cmd == SET_KEY)
3482 				arsta->pn_type = HAL_PN_TYPE_WPA;
3483 			else
3484 				arsta->pn_type = HAL_PN_TYPE_NONE;
3485 			break;
3486 		default:
3487 			arsta->pn_type = HAL_PN_TYPE_NONE;
3488 			break;
3489 		}
3490 	}
3491 
3492 	spin_unlock_bh(&ab->base_lock);
3493 
3494 exit:
3495 	mutex_unlock(&ar->conf_mutex);
3496 	return ret;
3497 }
3498 
3499 static int
3500 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
3501 				      enum nl80211_band band,
3502 				      const struct cfg80211_bitrate_mask *mask)
3503 {
3504 	int num_rates = 0;
3505 	int i;
3506 
3507 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
3508 		num_rates += hweight16(mask->control[band].vht_mcs[i]);
3509 
3510 	return num_rates;
3511 }
3512 
3513 static int
3514 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
3515 				   struct ieee80211_sta *sta,
3516 				   const struct cfg80211_bitrate_mask *mask,
3517 				   enum nl80211_band band)
3518 {
3519 	struct ath12k *ar = arvif->ar;
3520 	u8 vht_rate, nss;
3521 	u32 rate_code;
3522 	int ret, i;
3523 
3524 	lockdep_assert_held(&ar->conf_mutex);
3525 
3526 	nss = 0;
3527 
3528 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
3529 		if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
3530 			nss = i + 1;
3531 			vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3532 		}
3533 	}
3534 
3535 	if (!nss) {
3536 		ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
3537 			    sta->addr);
3538 		return -EINVAL;
3539 	}
3540 
3541 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3542 		   "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
3543 		   sta->addr);
3544 
3545 	rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
3546 					WMI_RATE_PREAMBLE_VHT);
3547 	ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3548 					arvif->vdev_id,
3549 					WMI_PEER_PARAM_FIXED_RATE,
3550 					rate_code);
3551 	if (ret)
3552 		ath12k_warn(ar->ab,
3553 			    "failed to update STA %pM Fixed Rate %d: %d\n",
3554 			     sta->addr, rate_code, ret);
3555 
3556 	return ret;
3557 }
3558 
3559 static int ath12k_station_assoc(struct ath12k *ar,
3560 				struct ieee80211_vif *vif,
3561 				struct ieee80211_sta *sta,
3562 				bool reassoc)
3563 {
3564 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3565 	struct ath12k_wmi_peer_assoc_arg peer_arg;
3566 	int ret;
3567 	struct cfg80211_chan_def def;
3568 	enum nl80211_band band;
3569 	struct cfg80211_bitrate_mask *mask;
3570 	u8 num_vht_rates;
3571 
3572 	lockdep_assert_held(&ar->conf_mutex);
3573 
3574 	if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
3575 		return -EPERM;
3576 
3577 	band = def.chan->band;
3578 	mask = &arvif->bitrate_mask;
3579 
3580 	ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
3581 
3582 	ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3583 	if (ret) {
3584 		ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3585 			    sta->addr, arvif->vdev_id, ret);
3586 		return ret;
3587 	}
3588 
3589 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3590 		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3591 			    sta->addr, arvif->vdev_id);
3592 		return -ETIMEDOUT;
3593 	}
3594 
3595 	num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
3596 
3597 	/* If single VHT rate is configured (by set_bitrate_mask()),
3598 	 * peer_assoc will disable VHT. This is now enabled by a peer specific
3599 	 * fixed param.
3600 	 * Note that all other rates and NSS will be disabled for this peer.
3601 	 */
3602 	if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3603 		ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3604 							 band);
3605 		if (ret)
3606 			return ret;
3607 	}
3608 
3609 	/* Re-assoc is run only to update supported rates for given station. It
3610 	 * doesn't make much sense to reconfigure the peer completely.
3611 	 */
3612 	if (reassoc)
3613 		return 0;
3614 
3615 	ret = ath12k_setup_peer_smps(ar, arvif, sta->addr,
3616 				     &sta->deflink.ht_cap);
3617 	if (ret) {
3618 		ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3619 			    arvif->vdev_id, ret);
3620 		return ret;
3621 	}
3622 
3623 	if (!sta->wme) {
3624 		arvif->num_legacy_stations++;
3625 		ret = ath12k_recalc_rtscts_prot(arvif);
3626 		if (ret)
3627 			return ret;
3628 	}
3629 
3630 	if (sta->wme && sta->uapsd_queues) {
3631 		ret = ath12k_peer_assoc_qos_ap(ar, arvif, sta);
3632 		if (ret) {
3633 			ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
3634 				    sta->addr, arvif->vdev_id, ret);
3635 			return ret;
3636 		}
3637 	}
3638 
3639 	return 0;
3640 }
3641 
3642 static int ath12k_station_disassoc(struct ath12k *ar,
3643 				   struct ieee80211_vif *vif,
3644 				   struct ieee80211_sta *sta)
3645 {
3646 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3647 	int ret;
3648 
3649 	lockdep_assert_held(&ar->conf_mutex);
3650 
3651 	if (!sta->wme) {
3652 		arvif->num_legacy_stations--;
3653 		ret = ath12k_recalc_rtscts_prot(arvif);
3654 		if (ret)
3655 			return ret;
3656 	}
3657 
3658 	ret = ath12k_clear_peer_keys(arvif, sta->addr);
3659 	if (ret) {
3660 		ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
3661 			    arvif->vdev_id, ret);
3662 		return ret;
3663 	}
3664 	return 0;
3665 }
3666 
3667 static void ath12k_sta_rc_update_wk(struct work_struct *wk)
3668 {
3669 	struct ath12k *ar;
3670 	struct ath12k_vif *arvif;
3671 	struct ath12k_sta *arsta;
3672 	struct ieee80211_sta *sta;
3673 	struct cfg80211_chan_def def;
3674 	enum nl80211_band band;
3675 	const u8 *ht_mcs_mask;
3676 	const u16 *vht_mcs_mask;
3677 	u32 changed, bw, nss, smps, bw_prev;
3678 	int err, num_vht_rates;
3679 	const struct cfg80211_bitrate_mask *mask;
3680 	struct ath12k_wmi_peer_assoc_arg peer_arg;
3681 	enum wmi_phy_mode peer_phymode;
3682 
3683 	arsta = container_of(wk, struct ath12k_sta, update_wk);
3684 	sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
3685 	arvif = arsta->arvif;
3686 	ar = arvif->ar;
3687 
3688 	if (WARN_ON(ath12k_mac_vif_chan(arvif->vif, &def)))
3689 		return;
3690 
3691 	band = def.chan->band;
3692 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3693 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3694 
3695 	spin_lock_bh(&ar->data_lock);
3696 
3697 	changed = arsta->changed;
3698 	arsta->changed = 0;
3699 
3700 	bw = arsta->bw;
3701 	bw_prev = arsta->bw_prev;
3702 	nss = arsta->nss;
3703 	smps = arsta->smps;
3704 
3705 	spin_unlock_bh(&ar->data_lock);
3706 
3707 	mutex_lock(&ar->conf_mutex);
3708 
3709 	nss = max_t(u32, 1, nss);
3710 	nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
3711 			   ath12k_mac_max_vht_nss(vht_mcs_mask)));
3712 
3713 	if (changed & IEEE80211_RC_BW_CHANGED) {
3714 		ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
3715 		peer_phymode = peer_arg.peer_phymode;
3716 
3717 		if (bw > bw_prev) {
3718 			/* Phymode shows maximum supported channel width, if we
3719 			 * upgrade bandwidth then due to sanity check of firmware,
3720 			 * we have to send WMI_PEER_PHYMODE followed by
3721 			 * WMI_PEER_CHWIDTH
3722 			 */
3723 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
3724 				   sta->addr, bw, bw_prev);
3725 			err = ath12k_wmi_set_peer_param(ar, sta->addr,
3726 							arvif->vdev_id, WMI_PEER_PHYMODE,
3727 							peer_phymode);
3728 			if (err) {
3729 				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3730 					    sta->addr, peer_phymode, err);
3731 				goto err_rc_bw_changed;
3732 			}
3733 			err = ath12k_wmi_set_peer_param(ar, sta->addr,
3734 							arvif->vdev_id, WMI_PEER_CHWIDTH,
3735 							bw);
3736 			if (err)
3737 				ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
3738 					    sta->addr, bw, err);
3739 		} else {
3740 			/* When we downgrade bandwidth this will conflict with phymode
3741 			 * and cause to trigger firmware crash. In this case we send
3742 			 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
3743 			 */
3744 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
3745 				   sta->addr, bw, bw_prev);
3746 			err = ath12k_wmi_set_peer_param(ar, sta->addr,
3747 							arvif->vdev_id, WMI_PEER_CHWIDTH,
3748 							bw);
3749 			if (err) {
3750 				ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
3751 					    sta->addr, bw, err);
3752 				goto err_rc_bw_changed;
3753 			}
3754 			err = ath12k_wmi_set_peer_param(ar, sta->addr,
3755 							arvif->vdev_id, WMI_PEER_PHYMODE,
3756 							peer_phymode);
3757 			if (err)
3758 				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
3759 					    sta->addr, peer_phymode, err);
3760 		}
3761 	}
3762 
3763 	if (changed & IEEE80211_RC_NSS_CHANGED) {
3764 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
3765 			   sta->addr, nss);
3766 
3767 		err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3768 						WMI_PEER_NSS, nss);
3769 		if (err)
3770 			ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
3771 				    sta->addr, nss, err);
3772 	}
3773 
3774 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
3775 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
3776 			   sta->addr, smps);
3777 
3778 		err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
3779 						WMI_PEER_MIMO_PS_STATE, smps);
3780 		if (err)
3781 			ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
3782 				    sta->addr, smps, err);
3783 	}
3784 
3785 	if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3786 		mask = &arvif->bitrate_mask;
3787 		num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
3788 								      mask);
3789 
3790 		/* Peer_assoc_prepare will reject vht rates in
3791 		 * bitrate_mask if its not available in range format and
3792 		 * sets vht tx_rateset as unsupported. So multiple VHT MCS
3793 		 * setting(eg. MCS 4,5,6) per peer is not supported here.
3794 		 * But, Single rate in VHT mask can be set as per-peer
3795 		 * fixed rate. But even if any HT rates are configured in
3796 		 * the bitrate mask, device will not switch to those rates
3797 		 * when per-peer Fixed rate is set.
3798 		 * TODO: Check RATEMASK_CMDID to support auto rates selection
3799 		 * across HT/VHT and for multiple VHT MCS support.
3800 		 */
3801 		if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
3802 			ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
3803 							   band);
3804 		} else {
3805 			/* If the peer is non-VHT or no fixed VHT rate
3806 			 * is provided in the new bitrate mask we set the
3807 			 * other rates using peer_assoc command.
3808 			 */
3809 			ath12k_peer_assoc_prepare(ar, arvif->vif, sta,
3810 						  &peer_arg, true);
3811 
3812 			err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
3813 			if (err)
3814 				ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
3815 					    sta->addr, arvif->vdev_id, err);
3816 
3817 			if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
3818 				ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3819 					    sta->addr, arvif->vdev_id);
3820 		}
3821 	}
3822 err_rc_bw_changed:
3823 	mutex_unlock(&ar->conf_mutex);
3824 }
3825 
3826 static int ath12k_mac_inc_num_stations(struct ath12k_vif *arvif,
3827 				       struct ieee80211_sta *sta)
3828 {
3829 	struct ath12k *ar = arvif->ar;
3830 
3831 	lockdep_assert_held(&ar->conf_mutex);
3832 
3833 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3834 		return 0;
3835 
3836 	if (ar->num_stations >= ar->max_num_stations)
3837 		return -ENOBUFS;
3838 
3839 	ar->num_stations++;
3840 
3841 	return 0;
3842 }
3843 
3844 static void ath12k_mac_dec_num_stations(struct ath12k_vif *arvif,
3845 					struct ieee80211_sta *sta)
3846 {
3847 	struct ath12k *ar = arvif->ar;
3848 
3849 	lockdep_assert_held(&ar->conf_mutex);
3850 
3851 	if (arvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
3852 		return;
3853 
3854 	ar->num_stations--;
3855 }
3856 
3857 static int ath12k_mac_station_add(struct ath12k *ar,
3858 				  struct ieee80211_vif *vif,
3859 				  struct ieee80211_sta *sta)
3860 {
3861 	struct ath12k_base *ab = ar->ab;
3862 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3863 	struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
3864 	struct ath12k_wmi_peer_create_arg peer_param;
3865 	int ret;
3866 
3867 	lockdep_assert_held(&ar->conf_mutex);
3868 
3869 	ret = ath12k_mac_inc_num_stations(arvif, sta);
3870 	if (ret) {
3871 		ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
3872 			    ar->max_num_stations);
3873 		goto exit;
3874 	}
3875 
3876 	arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
3877 	if (!arsta->rx_stats) {
3878 		ret = -ENOMEM;
3879 		goto dec_num_station;
3880 	}
3881 
3882 	peer_param.vdev_id = arvif->vdev_id;
3883 	peer_param.peer_addr = sta->addr;
3884 	peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
3885 
3886 	ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
3887 	if (ret) {
3888 		ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
3889 			    sta->addr, arvif->vdev_id);
3890 		goto free_peer;
3891 	}
3892 
3893 	ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
3894 		   sta->addr, arvif->vdev_id);
3895 
3896 	if (ieee80211_vif_is_mesh(vif)) {
3897 		ret = ath12k_wmi_set_peer_param(ar, sta->addr,
3898 						arvif->vdev_id,
3899 						WMI_PEER_USE_4ADDR, 1);
3900 		if (ret) {
3901 			ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
3902 				    sta->addr, ret);
3903 			goto free_peer;
3904 		}
3905 	}
3906 
3907 	ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
3908 	if (ret) {
3909 		ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
3910 			    sta->addr, arvif->vdev_id, ret);
3911 		goto free_peer;
3912 	}
3913 
3914 	if (ab->hw_params->vdev_start_delay &&
3915 	    !arvif->is_started &&
3916 	    arvif->vdev_type != WMI_VDEV_TYPE_AP) {
3917 		ret = ath12k_start_vdev_delay(ar, arvif);
3918 		if (ret) {
3919 			ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
3920 			goto free_peer;
3921 		}
3922 	}
3923 
3924 	return 0;
3925 
3926 free_peer:
3927 	ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
3928 dec_num_station:
3929 	ath12k_mac_dec_num_stations(arvif, sta);
3930 exit:
3931 	return ret;
3932 }
3933 
3934 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3935 					      struct ieee80211_sta *sta)
3936 {
3937 	u32 bw = WMI_PEER_CHWIDTH_20MHZ;
3938 
3939 	switch (sta->deflink.bandwidth) {
3940 	case IEEE80211_STA_RX_BW_20:
3941 		bw = WMI_PEER_CHWIDTH_20MHZ;
3942 		break;
3943 	case IEEE80211_STA_RX_BW_40:
3944 		bw = WMI_PEER_CHWIDTH_40MHZ;
3945 		break;
3946 	case IEEE80211_STA_RX_BW_80:
3947 		bw = WMI_PEER_CHWIDTH_80MHZ;
3948 		break;
3949 	case IEEE80211_STA_RX_BW_160:
3950 		bw = WMI_PEER_CHWIDTH_160MHZ;
3951 		break;
3952 	case IEEE80211_STA_RX_BW_320:
3953 		bw = WMI_PEER_CHWIDTH_320MHZ;
3954 		break;
3955 	default:
3956 		ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
3957 			    sta->deflink.bandwidth, sta->addr);
3958 		bw = WMI_PEER_CHWIDTH_20MHZ;
3959 		break;
3960 	}
3961 
3962 	return bw;
3963 }
3964 
3965 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
3966 				   struct ieee80211_vif *vif,
3967 				   struct ieee80211_sta *sta,
3968 				   enum ieee80211_sta_state old_state,
3969 				   enum ieee80211_sta_state new_state)
3970 {
3971 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3972 	struct ath12k *ar;
3973 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
3974 	struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
3975 	struct ath12k_peer *peer;
3976 	int ret = 0;
3977 
3978 	/* cancel must be done outside the mutex to avoid deadlock */
3979 	if ((old_state == IEEE80211_STA_NONE &&
3980 	     new_state == IEEE80211_STA_NOTEXIST))
3981 		cancel_work_sync(&arsta->update_wk);
3982 
3983 	ar = ath12k_ah_to_ar(ah);
3984 
3985 	mutex_lock(&ar->conf_mutex);
3986 
3987 	if (old_state == IEEE80211_STA_NOTEXIST &&
3988 	    new_state == IEEE80211_STA_NONE) {
3989 		memset(arsta, 0, sizeof(*arsta));
3990 		arsta->arvif = arvif;
3991 		INIT_WORK(&arsta->update_wk, ath12k_sta_rc_update_wk);
3992 
3993 		ret = ath12k_mac_station_add(ar, vif, sta);
3994 		if (ret)
3995 			ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
3996 				    sta->addr, arvif->vdev_id);
3997 	} else if ((old_state == IEEE80211_STA_NONE &&
3998 		    new_state == IEEE80211_STA_NOTEXIST)) {
3999 		if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
4000 			ath12k_bss_disassoc(ar, arvif);
4001 			ret = ath12k_mac_vdev_stop(arvif);
4002 			if (ret)
4003 				ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
4004 					    arvif->vdev_id, ret);
4005 		}
4006 		ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
4007 
4008 		ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
4009 		if (ret)
4010 			ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
4011 				    sta->addr, arvif->vdev_id);
4012 		else
4013 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
4014 				   sta->addr, arvif->vdev_id);
4015 
4016 		ath12k_mac_dec_num_stations(arvif, sta);
4017 		spin_lock_bh(&ar->ab->base_lock);
4018 		peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4019 		if (peer && peer->sta == sta) {
4020 			ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
4021 				    vif->addr, arvif->vdev_id);
4022 			peer->sta = NULL;
4023 			list_del(&peer->list);
4024 			kfree(peer);
4025 			ar->num_peers--;
4026 		}
4027 		spin_unlock_bh(&ar->ab->base_lock);
4028 
4029 		kfree(arsta->rx_stats);
4030 		arsta->rx_stats = NULL;
4031 	} else if (old_state == IEEE80211_STA_AUTH &&
4032 		   new_state == IEEE80211_STA_ASSOC &&
4033 		   (vif->type == NL80211_IFTYPE_AP ||
4034 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
4035 		    vif->type == NL80211_IFTYPE_ADHOC)) {
4036 		ret = ath12k_station_assoc(ar, vif, sta, false);
4037 		if (ret)
4038 			ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
4039 				    sta->addr);
4040 
4041 		spin_lock_bh(&ar->data_lock);
4042 
4043 		arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
4044 		arsta->bw_prev = sta->deflink.bandwidth;
4045 
4046 		spin_unlock_bh(&ar->data_lock);
4047 	} else if (old_state == IEEE80211_STA_ASSOC &&
4048 		   new_state == IEEE80211_STA_AUTHORIZED) {
4049 		spin_lock_bh(&ar->ab->base_lock);
4050 
4051 		peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4052 		if (peer)
4053 			peer->is_authorized = true;
4054 
4055 		spin_unlock_bh(&ar->ab->base_lock);
4056 
4057 		if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
4058 			ret = ath12k_wmi_set_peer_param(ar, sta->addr,
4059 							arvif->vdev_id,
4060 							WMI_PEER_AUTHORIZE,
4061 							1);
4062 			if (ret)
4063 				ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
4064 					    sta->addr, arvif->vdev_id, ret);
4065 		}
4066 	} else if (old_state == IEEE80211_STA_AUTHORIZED &&
4067 		   new_state == IEEE80211_STA_ASSOC) {
4068 		spin_lock_bh(&ar->ab->base_lock);
4069 
4070 		peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4071 		if (peer)
4072 			peer->is_authorized = false;
4073 
4074 		spin_unlock_bh(&ar->ab->base_lock);
4075 	} else if (old_state == IEEE80211_STA_ASSOC &&
4076 		   new_state == IEEE80211_STA_AUTH &&
4077 		   (vif->type == NL80211_IFTYPE_AP ||
4078 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
4079 		    vif->type == NL80211_IFTYPE_ADHOC)) {
4080 		ret = ath12k_station_disassoc(ar, vif, sta);
4081 		if (ret)
4082 			ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
4083 				    sta->addr);
4084 	}
4085 
4086 	mutex_unlock(&ar->conf_mutex);
4087 
4088 	return ret;
4089 }
4090 
4091 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
4092 				       struct ieee80211_vif *vif,
4093 				       struct ieee80211_sta *sta)
4094 {
4095 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4096 	struct ath12k *ar;
4097 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4098 	int ret;
4099 	s16 txpwr;
4100 
4101 	if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
4102 		txpwr = 0;
4103 	} else {
4104 		txpwr = sta->deflink.txpwr.power;
4105 		if (!txpwr)
4106 			return -EINVAL;
4107 	}
4108 
4109 	if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL)
4110 		return -EINVAL;
4111 
4112 	ar = ath12k_ah_to_ar(ah);
4113 
4114 	mutex_lock(&ar->conf_mutex);
4115 
4116 	ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
4117 					WMI_PEER_USE_FIXED_PWR, txpwr);
4118 	if (ret) {
4119 		ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
4120 			    ret);
4121 		goto out;
4122 	}
4123 
4124 out:
4125 	mutex_unlock(&ar->conf_mutex);
4126 	return ret;
4127 }
4128 
4129 static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
4130 					struct ieee80211_vif *vif,
4131 					struct ieee80211_sta *sta,
4132 					u32 changed)
4133 {
4134 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4135 	struct ath12k *ar;
4136 	struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
4137 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4138 	struct ath12k_peer *peer;
4139 	u32 bw, smps;
4140 
4141 	ar = ath12k_ah_to_ar(ah);
4142 
4143 	spin_lock_bh(&ar->ab->base_lock);
4144 
4145 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
4146 	if (!peer) {
4147 		spin_unlock_bh(&ar->ab->base_lock);
4148 		ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
4149 			    sta->addr, arvif->vdev_id);
4150 		return;
4151 	}
4152 
4153 	spin_unlock_bh(&ar->ab->base_lock);
4154 
4155 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4156 		   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
4157 		   sta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
4158 		   sta->deflink.smps_mode);
4159 
4160 	spin_lock_bh(&ar->data_lock);
4161 
4162 	if (changed & IEEE80211_RC_BW_CHANGED) {
4163 		bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
4164 		arsta->bw_prev = arsta->bw;
4165 		arsta->bw = bw;
4166 	}
4167 
4168 	if (changed & IEEE80211_RC_NSS_CHANGED)
4169 		arsta->nss = sta->deflink.rx_nss;
4170 
4171 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
4172 		smps = WMI_PEER_SMPS_PS_NONE;
4173 
4174 		switch (sta->deflink.smps_mode) {
4175 		case IEEE80211_SMPS_AUTOMATIC:
4176 		case IEEE80211_SMPS_OFF:
4177 			smps = WMI_PEER_SMPS_PS_NONE;
4178 			break;
4179 		case IEEE80211_SMPS_STATIC:
4180 			smps = WMI_PEER_SMPS_STATIC;
4181 			break;
4182 		case IEEE80211_SMPS_DYNAMIC:
4183 			smps = WMI_PEER_SMPS_DYNAMIC;
4184 			break;
4185 		default:
4186 			ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
4187 				    sta->deflink.smps_mode, sta->addr);
4188 			smps = WMI_PEER_SMPS_PS_NONE;
4189 			break;
4190 		}
4191 
4192 		arsta->smps = smps;
4193 	}
4194 
4195 	arsta->changed |= changed;
4196 
4197 	spin_unlock_bh(&ar->data_lock);
4198 
4199 	ieee80211_queue_work(hw, &arsta->update_wk);
4200 }
4201 
4202 static int ath12k_conf_tx_uapsd(struct ath12k_vif *arvif,
4203 				u16 ac, bool enable)
4204 {
4205 	struct ath12k *ar = arvif->ar;
4206 	u32 value;
4207 	int ret;
4208 
4209 	if (arvif->vdev_type != WMI_VDEV_TYPE_STA)
4210 		return 0;
4211 
4212 	switch (ac) {
4213 	case IEEE80211_AC_VO:
4214 		value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
4215 			WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
4216 		break;
4217 	case IEEE80211_AC_VI:
4218 		value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
4219 			WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
4220 		break;
4221 	case IEEE80211_AC_BE:
4222 		value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
4223 			WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
4224 		break;
4225 	case IEEE80211_AC_BK:
4226 		value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
4227 			WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
4228 		break;
4229 	}
4230 
4231 	if (enable)
4232 		arvif->u.sta.uapsd |= value;
4233 	else
4234 		arvif->u.sta.uapsd &= ~value;
4235 
4236 	ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4237 					  WMI_STA_PS_PARAM_UAPSD,
4238 					  arvif->u.sta.uapsd);
4239 	if (ret) {
4240 		ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
4241 		goto exit;
4242 	}
4243 
4244 	if (arvif->u.sta.uapsd)
4245 		value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
4246 	else
4247 		value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
4248 
4249 	ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
4250 					  WMI_STA_PS_PARAM_RX_WAKE_POLICY,
4251 					  value);
4252 	if (ret)
4253 		ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
4254 
4255 exit:
4256 	return ret;
4257 }
4258 
4259 static int ath12k_mac_conf_tx(struct ath12k_vif *arvif,
4260 			      unsigned int link_id, u16 ac,
4261 			      const struct ieee80211_tx_queue_params *params)
4262 {
4263 	struct wmi_wmm_params_arg *p = NULL;
4264 	struct ath12k *ar = arvif->ar;
4265 	struct ath12k_base *ab = ar->ab;
4266 	int ret;
4267 
4268 	lockdep_assert_held(&ar->conf_mutex);
4269 
4270 	switch (ac) {
4271 	case IEEE80211_AC_VO:
4272 		p = &arvif->wmm_params.ac_vo;
4273 		break;
4274 	case IEEE80211_AC_VI:
4275 		p = &arvif->wmm_params.ac_vi;
4276 		break;
4277 	case IEEE80211_AC_BE:
4278 		p = &arvif->wmm_params.ac_be;
4279 		break;
4280 	case IEEE80211_AC_BK:
4281 		p = &arvif->wmm_params.ac_bk;
4282 		break;
4283 	}
4284 
4285 	if (WARN_ON(!p)) {
4286 		ret = -EINVAL;
4287 		goto exit;
4288 	}
4289 
4290 	p->cwmin = params->cw_min;
4291 	p->cwmax = params->cw_max;
4292 	p->aifs = params->aifs;
4293 	p->txop = params->txop;
4294 
4295 	ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
4296 					     &arvif->wmm_params);
4297 	if (ret) {
4298 		ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
4299 			    ar->pdev_idx, ret);
4300 		goto exit;
4301 	}
4302 
4303 	ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
4304 	if (ret)
4305 		ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
4306 			    ar->pdev_idx, ret);
4307 
4308 exit:
4309 	return ret;
4310 }
4311 
4312 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
4313 				 struct ieee80211_vif *vif,
4314 				 unsigned int link_id, u16 ac,
4315 				 const struct ieee80211_tx_queue_params *params)
4316 {
4317 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
4318 	struct ath12k *ar;
4319 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
4320 	int ret;
4321 
4322 	ar = ath12k_ah_to_ar(ah);
4323 
4324 	mutex_lock(&ar->conf_mutex);
4325 	ret = ath12k_mac_conf_tx(arvif, link_id, ac, params);
4326 	mutex_unlock(&ar->conf_mutex);
4327 
4328 	return ret;
4329 }
4330 
4331 static struct ieee80211_sta_ht_cap
4332 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
4333 {
4334 	int i;
4335 	struct ieee80211_sta_ht_cap ht_cap = {0};
4336 	u32 ar_vht_cap = ar->pdev->cap.vht_cap;
4337 
4338 	if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
4339 		return ht_cap;
4340 
4341 	ht_cap.ht_supported = 1;
4342 	ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4343 	ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
4344 	ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
4345 	ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
4346 	ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
4347 
4348 	if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
4349 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
4350 
4351 	if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
4352 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
4353 
4354 	if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
4355 		u32 smps;
4356 
4357 		smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
4358 		smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
4359 
4360 		ht_cap.cap |= smps;
4361 	}
4362 
4363 	if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
4364 		ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
4365 
4366 	if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
4367 		u32 stbc;
4368 
4369 		stbc   = ar_ht_cap;
4370 		stbc  &= WMI_HT_CAP_RX_STBC;
4371 		stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
4372 		stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
4373 		stbc  &= IEEE80211_HT_CAP_RX_STBC;
4374 
4375 		ht_cap.cap |= stbc;
4376 	}
4377 
4378 	if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
4379 		ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
4380 
4381 	if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
4382 		ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
4383 
4384 	if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
4385 		ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
4386 
4387 	for (i = 0; i < ar->num_rx_chains; i++) {
4388 		if (rate_cap_rx_chainmask & BIT(i))
4389 			ht_cap.mcs.rx_mask[i] = 0xFF;
4390 	}
4391 
4392 	ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
4393 
4394 	return ht_cap;
4395 }
4396 
4397 static int ath12k_mac_set_txbf_conf(struct ath12k_vif *arvif)
4398 {
4399 	u32 value = 0;
4400 	struct ath12k *ar = arvif->ar;
4401 	int nsts;
4402 	int sound_dim;
4403 	u32 vht_cap = ar->pdev->cap.vht_cap;
4404 	u32 vdev_param = WMI_VDEV_PARAM_TXBF;
4405 
4406 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
4407 		nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
4408 		nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
4409 		value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
4410 	}
4411 
4412 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
4413 		sound_dim = vht_cap &
4414 			    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
4415 		sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
4416 		if (sound_dim > (ar->num_tx_chains - 1))
4417 			sound_dim = ar->num_tx_chains - 1;
4418 		value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
4419 	}
4420 
4421 	if (!value)
4422 		return 0;
4423 
4424 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
4425 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
4426 
4427 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
4428 		    arvif->vdev_type == WMI_VDEV_TYPE_AP)
4429 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
4430 	}
4431 
4432 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
4433 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
4434 
4435 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
4436 		    arvif->vdev_type == WMI_VDEV_TYPE_STA)
4437 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
4438 	}
4439 
4440 	return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4441 					     vdev_param, value);
4442 }
4443 
4444 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
4445 {
4446 	bool subfer, subfee;
4447 	int sound_dim = 0;
4448 
4449 	subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
4450 	subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
4451 
4452 	if (ar->num_tx_chains < 2) {
4453 		*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
4454 		subfer = false;
4455 	}
4456 
4457 	/* If SU Beaformer is not set, then disable MU Beamformer Capability */
4458 	if (!subfer)
4459 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
4460 
4461 	/* If SU Beaformee is not set, then disable MU Beamformee Capability */
4462 	if (!subfee)
4463 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
4464 
4465 	sound_dim = u32_get_bits(*vht_cap,
4466 				 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4467 	*vht_cap = u32_replace_bits(*vht_cap, 0,
4468 				    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4469 
4470 	/* TODO: Need to check invalid STS and Sound_dim values set by FW? */
4471 
4472 	/* Enable Sounding Dimension Field only if SU BF is enabled */
4473 	if (subfer) {
4474 		if (sound_dim > (ar->num_tx_chains - 1))
4475 			sound_dim = ar->num_tx_chains - 1;
4476 
4477 		*vht_cap = u32_replace_bits(*vht_cap, sound_dim,
4478 					    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
4479 	}
4480 
4481 	/* Use the STS advertised by FW unless SU Beamformee is not supported*/
4482 	if (!subfee)
4483 		*vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
4484 }
4485 
4486 static struct ieee80211_sta_vht_cap
4487 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
4488 		      u32 rate_cap_rx_chainmask)
4489 {
4490 	struct ieee80211_sta_vht_cap vht_cap = {0};
4491 	u16 txmcs_map, rxmcs_map;
4492 	int i;
4493 
4494 	vht_cap.vht_supported = 1;
4495 	vht_cap.cap = ar->pdev->cap.vht_cap;
4496 
4497 	ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
4498 
4499 	/* TODO: Enable back VHT160 mode once association issues are fixed */
4500 	/* Disabling VHT160 and VHT80+80 modes */
4501 	vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
4502 	vht_cap.cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
4503 
4504 	rxmcs_map = 0;
4505 	txmcs_map = 0;
4506 	for (i = 0; i < 8; i++) {
4507 		if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
4508 			txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4509 		else
4510 			txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4511 
4512 		if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
4513 			rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
4514 		else
4515 			rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
4516 	}
4517 
4518 	if (rate_cap_tx_chainmask <= 1)
4519 		vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
4520 
4521 	vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
4522 	vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
4523 
4524 	return vht_cap;
4525 }
4526 
4527 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
4528 					struct ath12k_pdev_cap *cap,
4529 					u32 *ht_cap_info)
4530 {
4531 	struct ieee80211_supported_band *band;
4532 	u32 rate_cap_tx_chainmask;
4533 	u32 rate_cap_rx_chainmask;
4534 	u32 ht_cap;
4535 
4536 	rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
4537 	rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
4538 
4539 	if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4540 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
4541 		ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
4542 		if (ht_cap_info)
4543 			*ht_cap_info = ht_cap;
4544 		band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4545 						    rate_cap_rx_chainmask);
4546 	}
4547 
4548 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4549 	    (ar->ab->hw_params->single_pdev_only ||
4550 	     !ar->supports_6ghz)) {
4551 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
4552 		ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
4553 		if (ht_cap_info)
4554 			*ht_cap_info = ht_cap;
4555 		band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
4556 						    rate_cap_rx_chainmask);
4557 		band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
4558 						      rate_cap_rx_chainmask);
4559 	}
4560 }
4561 
4562 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
4563 {
4564 	/* TODO: Check the request chainmask against the supported
4565 	 * chainmask table which is advertised in extented_service_ready event
4566 	 */
4567 
4568 	return 0;
4569 }
4570 
4571 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4572 				  u8 *he_ppet)
4573 {
4574 	int nss, ru;
4575 	u8 bit = 7;
4576 
4577 	he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
4578 	he_ppet[0] |= (fw_ppet->ru_bit_mask <<
4579 		       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
4580 		      IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
4581 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4582 		for (ru = 0; ru < 4; ru++) {
4583 			u8 val;
4584 			int i;
4585 
4586 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4587 				continue;
4588 			val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
4589 			       0x3f;
4590 			val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
4591 			for (i = 5; i >= 0; i--) {
4592 				he_ppet[bit / 8] |=
4593 					((val >> i) & 0x1) << ((bit % 8));
4594 				bit++;
4595 			}
4596 		}
4597 	}
4598 }
4599 
4600 static void
4601 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
4602 {
4603 	u8 m;
4604 
4605 	m = IEEE80211_HE_MAC_CAP0_TWT_RES |
4606 	    IEEE80211_HE_MAC_CAP0_TWT_REQ;
4607 	he_cap_elem->mac_cap_info[0] &= ~m;
4608 
4609 	m = IEEE80211_HE_MAC_CAP2_TRS |
4610 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4611 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4612 	he_cap_elem->mac_cap_info[2] &= ~m;
4613 
4614 	m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
4615 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
4616 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
4617 	he_cap_elem->mac_cap_info[3] &= ~m;
4618 
4619 	m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
4620 	    IEEE80211_HE_MAC_CAP4_BQR;
4621 	he_cap_elem->mac_cap_info[4] &= ~m;
4622 
4623 	m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
4624 	    IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
4625 	    IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
4626 	    IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
4627 	he_cap_elem->mac_cap_info[5] &= ~m;
4628 
4629 	m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
4630 	    IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
4631 	he_cap_elem->phy_cap_info[2] &= ~m;
4632 
4633 	m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
4634 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
4635 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
4636 	he_cap_elem->phy_cap_info[3] &= ~m;
4637 
4638 	m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
4639 	he_cap_elem->phy_cap_info[4] &= ~m;
4640 
4641 	m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
4642 	he_cap_elem->phy_cap_info[5] &= ~m;
4643 
4644 	m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
4645 	    IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
4646 	    IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
4647 	    IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
4648 	he_cap_elem->phy_cap_info[6] &= ~m;
4649 
4650 	m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
4651 	    IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
4652 	    IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
4653 	    IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
4654 	he_cap_elem->phy_cap_info[7] &= ~m;
4655 
4656 	m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
4657 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
4658 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
4659 	    IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
4660 	he_cap_elem->phy_cap_info[8] &= ~m;
4661 
4662 	m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
4663 	    IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
4664 	    IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
4665 	    IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
4666 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
4667 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
4668 	he_cap_elem->phy_cap_info[9] &= ~m;
4669 }
4670 
4671 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
4672 					   struct ath12k_band_cap *bcap)
4673 {
4674 	u8 val;
4675 
4676 	bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
4677 	if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
4678 		bcap->he_6ghz_capa |=
4679 			u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
4680 					IEEE80211_HE_6GHZ_CAP_SM_PS);
4681 	else
4682 		bcap->he_6ghz_capa |=
4683 			u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
4684 					IEEE80211_HE_6GHZ_CAP_SM_PS);
4685 	val = u32_get_bits(pcap->vht_cap,
4686 			   IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
4687 	bcap->he_6ghz_capa |=
4688 		u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
4689 	val = u32_get_bits(pcap->vht_cap,
4690 			   IEEE80211_VHT_CAP_MAX_MPDU_MASK);
4691 	bcap->he_6ghz_capa |=
4692 		u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
4693 	if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
4694 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
4695 	if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
4696 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
4697 
4698 	return cpu_to_le16(bcap->he_6ghz_capa);
4699 }
4700 
4701 static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
4702 				   int iftype, u8 num_tx_chains,
4703 				   struct ieee80211_sta_he_cap *he_cap)
4704 {
4705 	struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
4706 	struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
4707 
4708 	he_cap->has_he = true;
4709 	memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
4710 	       sizeof(he_cap_elem->mac_cap_info));
4711 	memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
4712 	       sizeof(he_cap_elem->phy_cap_info));
4713 
4714 	he_cap_elem->mac_cap_info[1] &=
4715 		IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
4716 
4717 	he_cap_elem->phy_cap_info[5] &=
4718 		~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
4719 	he_cap_elem->phy_cap_info[5] &=
4720 		~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK;
4721 	he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
4722 
4723 	switch (iftype) {
4724 	case NL80211_IFTYPE_AP:
4725 		he_cap_elem->phy_cap_info[3] &=
4726 			~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
4727 		he_cap_elem->phy_cap_info[9] |=
4728 			IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
4729 		break;
4730 	case NL80211_IFTYPE_STATION:
4731 		he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
4732 		he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
4733 		he_cap_elem->phy_cap_info[9] |=
4734 			IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
4735 		break;
4736 	case NL80211_IFTYPE_MESH_POINT:
4737 		ath12k_mac_filter_he_cap_mesh(he_cap_elem);
4738 		break;
4739 	}
4740 
4741 	mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4742 	mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
4743 	mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4744 	mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4745 	mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4746 	mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
4747 
4748 	memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
4749 	if (he_cap_elem->phy_cap_info[6] &
4750 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
4751 		ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
4752 }
4753 
4754 static void
4755 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
4756 			    struct ieee80211_eht_mcs_nss_supp *mcs_nss,
4757 			    const struct ieee80211_he_cap_elem *he_cap,
4758 			    const struct ieee80211_eht_cap_elem_fixed *eht_cap)
4759 {
4760 	if ((he_cap->phy_cap_info[0] &
4761 	     (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4762 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
4763 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
4764 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
4765 		memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
4766 		       sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
4767 
4768 	if (he_cap->phy_cap_info[0] &
4769 	    (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
4770 	     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
4771 		memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
4772 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4773 
4774 	if (he_cap->phy_cap_info[0] &
4775 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
4776 		memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
4777 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4778 
4779 	if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
4780 		memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
4781 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
4782 }
4783 
4784 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
4785 					   struct ieee80211_sta_eht_cap *cap)
4786 {
4787 	u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
4788 	u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
4789 
4790 	u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
4791 			 IEEE80211_EHT_PPE_THRES_NSS_MASK);
4792 
4793 	u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
4794 			  IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4795 
4796 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
4797 		for (ru = 0;
4798 		     ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
4799 		     ru++) {
4800 			u32 val = 0;
4801 
4802 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
4803 				continue;
4804 
4805 			u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
4806 						(ru * ppet_bit_len_per_ru),
4807 					  GENMASK(ppet_bit_len_per_ru - 1, 0));
4808 
4809 			for (i = 0; i < ppet_bit_len_per_ru; i++) {
4810 				cap->eht_ppe_thres[bit / 8] |=
4811 					(((val >> i) & 0x1) << ((bit % 8)));
4812 				bit++;
4813 			}
4814 		}
4815 	}
4816 }
4817 
4818 static void
4819 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
4820 			       *eht_cap_elem)
4821 {
4822 	u8 m;
4823 
4824 	m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
4825 	eht_cap_elem->mac_cap_info[0] &= ~m;
4826 
4827 	m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
4828 	eht_cap_elem->phy_cap_info[0] &= ~m;
4829 
4830 	m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
4831 	    IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
4832 	    IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
4833 	    IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
4834 	eht_cap_elem->phy_cap_info[3] &= ~m;
4835 
4836 	m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
4837 	    IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
4838 	    IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
4839 	    IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
4840 	eht_cap_elem->phy_cap_info[4] &= ~m;
4841 
4842 	m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
4843 	    IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
4844 	    IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
4845 	    IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
4846 	eht_cap_elem->phy_cap_info[5] &= ~m;
4847 
4848 	m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
4849 	eht_cap_elem->phy_cap_info[6] &= ~m;
4850 
4851 	m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4852 	    IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4853 	    IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
4854 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4855 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4856 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
4857 	eht_cap_elem->phy_cap_info[7] &= ~m;
4858 }
4859 
4860 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
4861 				    struct ath12k_band_cap *band_cap,
4862 				    struct ieee80211_he_cap_elem *he_cap_elem,
4863 				    int iftype,
4864 				    struct ieee80211_sta_eht_cap *eht_cap)
4865 {
4866 	struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
4867 
4868 	memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
4869 
4870 	if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)))
4871 		return;
4872 
4873 	eht_cap->has_eht = true;
4874 	memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
4875 	       sizeof(eht_cap_elem->mac_cap_info));
4876 	memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
4877 	       sizeof(eht_cap_elem->phy_cap_info));
4878 
4879 	switch (iftype) {
4880 	case NL80211_IFTYPE_AP:
4881 		eht_cap_elem->phy_cap_info[0] &=
4882 			~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
4883 		eht_cap_elem->phy_cap_info[4] &=
4884 			~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
4885 		eht_cap_elem->phy_cap_info[5] &=
4886 			~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
4887 		break;
4888 	case NL80211_IFTYPE_STATION:
4889 		eht_cap_elem->phy_cap_info[7] &=
4890 			~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
4891 			  IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
4892 			  IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
4893 		eht_cap_elem->phy_cap_info[7] &=
4894 			~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
4895 			  IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
4896 			  IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
4897 		break;
4898 	case NL80211_IFTYPE_MESH_POINT:
4899 		ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
4900 		break;
4901 	default:
4902 		break;
4903 	}
4904 
4905 	ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
4906 				    he_cap_elem, eht_cap_elem);
4907 
4908 	if (eht_cap_elem->phy_cap_info[5] &
4909 	    IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
4910 		ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
4911 }
4912 
4913 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
4914 					     struct ath12k_pdev_cap *cap,
4915 					     struct ieee80211_sband_iftype_data *data,
4916 					     int band)
4917 {
4918 	struct ath12k_band_cap *band_cap = &cap->band[band];
4919 	int i, idx = 0;
4920 
4921 	for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
4922 		struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
4923 
4924 		switch (i) {
4925 		case NL80211_IFTYPE_STATION:
4926 		case NL80211_IFTYPE_AP:
4927 		case NL80211_IFTYPE_MESH_POINT:
4928 			break;
4929 
4930 		default:
4931 			continue;
4932 		}
4933 
4934 		data[idx].types_mask = BIT(i);
4935 
4936 		ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap);
4937 		if (band == NL80211_BAND_6GHZ) {
4938 			data[idx].he_6ghz_capa.capa =
4939 				ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
4940 		}
4941 		ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
4942 					&data[idx].eht_cap);
4943 		idx++;
4944 	}
4945 
4946 	return idx;
4947 }
4948 
4949 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
4950 					       struct ath12k_pdev_cap *cap)
4951 {
4952 	struct ieee80211_supported_band *sband;
4953 	enum nl80211_band band;
4954 	int count;
4955 
4956 	if (cap->supported_bands & WMI_HOST_WLAN_2G_CAP) {
4957 		band = NL80211_BAND_2GHZ;
4958 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4959 							  ar->mac.iftype[band],
4960 							  band);
4961 		sband = &ar->mac.sbands[band];
4962 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4963 						 count);
4964 	}
4965 
4966 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
4967 		band = NL80211_BAND_5GHZ;
4968 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4969 							  ar->mac.iftype[band],
4970 							  band);
4971 		sband = &ar->mac.sbands[band];
4972 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4973 						 count);
4974 	}
4975 
4976 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
4977 	    ar->supports_6ghz) {
4978 		band = NL80211_BAND_6GHZ;
4979 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
4980 							  ar->mac.iftype[band],
4981 							  band);
4982 		sband = &ar->mac.sbands[band];
4983 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
4984 						 count);
4985 	}
4986 }
4987 
4988 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
4989 {
4990 	int ret;
4991 
4992 	lockdep_assert_held(&ar->conf_mutex);
4993 
4994 	if (ath12k_check_chain_mask(ar, tx_ant, true))
4995 		return -EINVAL;
4996 
4997 	if (ath12k_check_chain_mask(ar, rx_ant, false))
4998 		return -EINVAL;
4999 
5000 	ar->cfg_tx_chainmask = tx_ant;
5001 	ar->cfg_rx_chainmask = rx_ant;
5002 
5003 	if (ar->state != ATH12K_STATE_ON &&
5004 	    ar->state != ATH12K_STATE_RESTARTED)
5005 		return 0;
5006 
5007 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
5008 					tx_ant, ar->pdev->pdev_id);
5009 	if (ret) {
5010 		ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
5011 			    ret, tx_ant);
5012 		return ret;
5013 	}
5014 
5015 	ar->num_tx_chains = hweight32(tx_ant);
5016 
5017 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
5018 					rx_ant, ar->pdev->pdev_id);
5019 	if (ret) {
5020 		ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
5021 			    ret, rx_ant);
5022 		return ret;
5023 	}
5024 
5025 	ar->num_rx_chains = hweight32(rx_ant);
5026 
5027 	/* Reload HT/VHT/HE capability */
5028 	ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
5029 	ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
5030 
5031 	return 0;
5032 }
5033 
5034 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
5035 {
5036 	int num_mgmt;
5037 
5038 	ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
5039 
5040 	num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
5041 
5042 	if (num_mgmt < 0)
5043 		WARN_ON_ONCE(1);
5044 
5045 	if (!num_mgmt)
5046 		wake_up(&ar->txmgmt_empty_waitq);
5047 }
5048 
5049 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
5050 {
5051 	struct sk_buff *msdu = skb;
5052 	struct ieee80211_tx_info *info;
5053 	struct ath12k *ar = ctx;
5054 	struct ath12k_base *ab = ar->ab;
5055 
5056 	spin_lock_bh(&ar->txmgmt_idr_lock);
5057 	idr_remove(&ar->txmgmt_idr, buf_id);
5058 	spin_unlock_bh(&ar->txmgmt_idr_lock);
5059 	dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
5060 			 DMA_TO_DEVICE);
5061 
5062 	info = IEEE80211_SKB_CB(msdu);
5063 	memset(&info->status, 0, sizeof(info->status));
5064 
5065 	ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5066 
5067 	return 0;
5068 }
5069 
5070 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
5071 {
5072 	struct ieee80211_vif *vif = ctx;
5073 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
5074 	struct sk_buff *msdu = skb;
5075 	struct ath12k *ar = skb_cb->ar;
5076 	struct ath12k_base *ab = ar->ab;
5077 
5078 	if (skb_cb->vif == vif) {
5079 		spin_lock_bh(&ar->txmgmt_idr_lock);
5080 		idr_remove(&ar->txmgmt_idr, buf_id);
5081 		spin_unlock_bh(&ar->txmgmt_idr_lock);
5082 		dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
5083 				 DMA_TO_DEVICE);
5084 	}
5085 
5086 	return 0;
5087 }
5088 
5089 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_vif *arvif,
5090 				  struct sk_buff *skb)
5091 {
5092 	struct ath12k_base *ab = ar->ab;
5093 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5094 	struct ieee80211_tx_info *info;
5095 	dma_addr_t paddr;
5096 	int buf_id;
5097 	int ret;
5098 
5099 	ATH12K_SKB_CB(skb)->ar = ar;
5100 	spin_lock_bh(&ar->txmgmt_idr_lock);
5101 	buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
5102 			   ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
5103 	spin_unlock_bh(&ar->txmgmt_idr_lock);
5104 	if (buf_id < 0)
5105 		return -ENOSPC;
5106 
5107 	info = IEEE80211_SKB_CB(skb);
5108 	if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
5109 		if ((ieee80211_is_action(hdr->frame_control) ||
5110 		     ieee80211_is_deauth(hdr->frame_control) ||
5111 		     ieee80211_is_disassoc(hdr->frame_control)) &&
5112 		     ieee80211_has_protected(hdr->frame_control)) {
5113 			skb_put(skb, IEEE80211_CCMP_MIC_LEN);
5114 		}
5115 	}
5116 
5117 	paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
5118 	if (dma_mapping_error(ab->dev, paddr)) {
5119 		ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
5120 		ret = -EIO;
5121 		goto err_free_idr;
5122 	}
5123 
5124 	ATH12K_SKB_CB(skb)->paddr = paddr;
5125 
5126 	ret = ath12k_wmi_mgmt_send(ar, arvif->vdev_id, buf_id, skb);
5127 	if (ret) {
5128 		ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
5129 		goto err_unmap_buf;
5130 	}
5131 
5132 	return 0;
5133 
5134 err_unmap_buf:
5135 	dma_unmap_single(ab->dev, ATH12K_SKB_CB(skb)->paddr,
5136 			 skb->len, DMA_TO_DEVICE);
5137 err_free_idr:
5138 	spin_lock_bh(&ar->txmgmt_idr_lock);
5139 	idr_remove(&ar->txmgmt_idr, buf_id);
5140 	spin_unlock_bh(&ar->txmgmt_idr_lock);
5141 
5142 	return ret;
5143 }
5144 
5145 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
5146 {
5147 	struct sk_buff *skb;
5148 
5149 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
5150 		ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5151 }
5152 
5153 static void ath12k_mgmt_over_wmi_tx_work(struct work_struct *work)
5154 {
5155 	struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
5156 	struct ath12k_skb_cb *skb_cb;
5157 	struct ath12k_vif *arvif;
5158 	struct sk_buff *skb;
5159 	int ret;
5160 
5161 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
5162 		skb_cb = ATH12K_SKB_CB(skb);
5163 		if (!skb_cb->vif) {
5164 			ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
5165 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5166 			continue;
5167 		}
5168 
5169 		arvif = ath12k_vif_to_arvif(skb_cb->vif);
5170 
5171 		if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
5172 			ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
5173 			if (ret) {
5174 				ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
5175 					    arvif->vdev_id, ret);
5176 				ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5177 			}
5178 		} else {
5179 			ath12k_warn(ar->ab,
5180 				    "dropping mgmt frame for vdev %d, is_started %d\n",
5181 				    arvif->vdev_id,
5182 				    arvif->is_started);
5183 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
5184 		}
5185 	}
5186 }
5187 
5188 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
5189 			      bool is_prb_rsp)
5190 {
5191 	struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
5192 
5193 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
5194 		return -ESHUTDOWN;
5195 
5196 	/* Drop probe response packets when the pending management tx
5197 	 * count has reached a certain threshold, so as to prioritize
5198 	 * other mgmt packets like auth and assoc to be sent on time
5199 	 * for establishing successful connections.
5200 	 */
5201 	if (is_prb_rsp &&
5202 	    atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
5203 		ath12k_warn(ar->ab,
5204 			    "dropping probe response as pending queue is almost full\n");
5205 		return -ENOSPC;
5206 	}
5207 
5208 	if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
5209 		ath12k_warn(ar->ab, "mgmt tx queue is full\n");
5210 		return -ENOSPC;
5211 	}
5212 
5213 	skb_queue_tail(q, skb);
5214 	atomic_inc(&ar->num_pending_mgmt_tx);
5215 	ieee80211_queue_work(ath12k_ar_to_hw(ar), &ar->wmi_mgmt_tx_work);
5216 
5217 	return 0;
5218 }
5219 
5220 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
5221 				      struct ieee80211_vif *vif,
5222 				      struct sk_buff *skb,
5223 				      bool is_prb_rsp)
5224 {
5225 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5226 
5227 	if (likely(!is_prb_rsp))
5228 		return;
5229 
5230 	spin_lock_bh(&ar->data_lock);
5231 
5232 	if (arvif->u.ap.noa_data &&
5233 	    !pskb_expand_head(skb, 0, arvif->u.ap.noa_len,
5234 			      GFP_ATOMIC))
5235 		skb_put_data(skb, arvif->u.ap.noa_data,
5236 			     arvif->u.ap.noa_len);
5237 
5238 	spin_unlock_bh(&ar->data_lock);
5239 }
5240 
5241 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
5242 			     struct ieee80211_tx_control *control,
5243 			     struct sk_buff *skb)
5244 {
5245 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
5246 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
5247 	struct ieee80211_vif *vif = info->control.vif;
5248 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5249 	struct ath12k *ar = arvif->ar;
5250 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
5251 	struct ieee80211_key_conf *key = info->control.hw_key;
5252 	u32 info_flags = info->flags;
5253 	bool is_prb_rsp;
5254 	int ret;
5255 
5256 	memset(skb_cb, 0, sizeof(*skb_cb));
5257 	skb_cb->vif = vif;
5258 
5259 	if (key) {
5260 		skb_cb->cipher = key->cipher;
5261 		skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
5262 	}
5263 
5264 	is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
5265 
5266 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
5267 		skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
5268 	} else if (ieee80211_is_mgmt(hdr->frame_control)) {
5269 		ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
5270 		if (ret) {
5271 			ath12k_warn(ar->ab, "failed to queue management frame %d\n",
5272 				    ret);
5273 			ieee80211_free_txskb(hw, skb);
5274 		}
5275 		return;
5276 	}
5277 
5278 	/* This is case only for P2P_GO */
5279 	if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
5280 		ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
5281 
5282 	ret = ath12k_dp_tx(ar, arvif, skb);
5283 	if (ret) {
5284 		ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
5285 		ieee80211_free_txskb(hw, skb);
5286 	}
5287 }
5288 
5289 void ath12k_mac_drain_tx(struct ath12k *ar)
5290 {
5291 	/* make sure rcu-protected mac80211 tx path itself is drained */
5292 	synchronize_net();
5293 
5294 	cancel_work_sync(&ar->wmi_mgmt_tx_work);
5295 	ath12k_mgmt_over_wmi_tx_purge(ar);
5296 }
5297 
5298 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
5299 {
5300 	return -EOPNOTSUPP;
5301 	/* TODO: Need to support new monitor mode */
5302 }
5303 
5304 static void ath12k_mac_wait_reconfigure(struct ath12k_base *ab)
5305 {
5306 	int recovery_start_count;
5307 
5308 	if (!ab->is_reset)
5309 		return;
5310 
5311 	recovery_start_count = atomic_inc_return(&ab->recovery_start_count);
5312 
5313 	ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery start count %d\n", recovery_start_count);
5314 
5315 	if (recovery_start_count == ab->num_radios) {
5316 		complete(&ab->recovery_start);
5317 		ath12k_dbg(ab, ATH12K_DBG_MAC, "recovery started success\n");
5318 	}
5319 
5320 	ath12k_dbg(ab, ATH12K_DBG_MAC, "waiting reconfigure...\n");
5321 
5322 	wait_for_completion_timeout(&ab->reconfigure_complete,
5323 				    ATH12K_RECONFIGURE_TIMEOUT_HZ);
5324 }
5325 
5326 static int ath12k_mac_start(struct ath12k *ar)
5327 {
5328 	struct ath12k_base *ab = ar->ab;
5329 	struct ath12k_pdev *pdev = ar->pdev;
5330 	int ret;
5331 
5332 	mutex_lock(&ar->conf_mutex);
5333 
5334 	switch (ar->state) {
5335 	case ATH12K_STATE_OFF:
5336 		ar->state = ATH12K_STATE_ON;
5337 		break;
5338 	case ATH12K_STATE_RESTARTING:
5339 		ar->state = ATH12K_STATE_RESTARTED;
5340 		ath12k_mac_wait_reconfigure(ab);
5341 		break;
5342 	case ATH12K_STATE_RESTARTED:
5343 	case ATH12K_STATE_WEDGED:
5344 	case ATH12K_STATE_ON:
5345 		WARN_ON(1);
5346 		ret = -EINVAL;
5347 		goto err;
5348 	}
5349 
5350 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
5351 					1, pdev->pdev_id);
5352 
5353 	if (ret) {
5354 		ath12k_err(ab, "failed to enable PMF QOS: (%d\n", ret);
5355 		goto err;
5356 	}
5357 
5358 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
5359 					pdev->pdev_id);
5360 	if (ret) {
5361 		ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
5362 		goto err;
5363 	}
5364 
5365 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
5366 					0, pdev->pdev_id);
5367 	if (ret) {
5368 		ath12k_err(ab, "failed to set ac override for ARP: %d\n",
5369 			   ret);
5370 		goto err;
5371 	}
5372 
5373 	ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
5374 	if (ret) {
5375 		ath12k_err(ab, "failed to offload radar detection: %d\n",
5376 			   ret);
5377 		goto err;
5378 	}
5379 
5380 	ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
5381 						  HTT_PPDU_STATS_TAG_DEFAULT);
5382 	if (ret) {
5383 		ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
5384 		goto err;
5385 	}
5386 
5387 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
5388 					1, pdev->pdev_id);
5389 
5390 	if (ret) {
5391 		ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
5392 		goto err;
5393 	}
5394 
5395 	__ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
5396 
5397 	/* TODO: Do we need to enable ANI? */
5398 
5399 	ath12k_reg_update_chan_list(ar);
5400 
5401 	ar->num_started_vdevs = 0;
5402 	ar->num_created_vdevs = 0;
5403 	ar->num_peers = 0;
5404 	ar->allocated_vdev_map = 0;
5405 
5406 	/* Configure monitor status ring with default rx_filter to get rx status
5407 	 * such as rssi, rx_duration.
5408 	 */
5409 	ret = ath12k_mac_config_mon_status_default(ar, true);
5410 	if (ret && (ret != -EOPNOTSUPP)) {
5411 		ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
5412 			   ret);
5413 		goto err;
5414 	}
5415 
5416 	if (ret == -EOPNOTSUPP)
5417 		ath12k_dbg(ab, ATH12K_DBG_MAC,
5418 			   "monitor status config is not yet supported");
5419 
5420 	/* Configure the hash seed for hash based reo dest ring selection */
5421 	ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
5422 
5423 	/* allow device to enter IMPS */
5424 	if (ab->hw_params->idle_ps) {
5425 		ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
5426 						1, pdev->pdev_id);
5427 		if (ret) {
5428 			ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
5429 			goto err;
5430 		}
5431 	}
5432 
5433 	mutex_unlock(&ar->conf_mutex);
5434 
5435 	rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
5436 			   &ab->pdevs[ar->pdev_idx]);
5437 
5438 	return 0;
5439 err:
5440 	ar->state = ATH12K_STATE_OFF;
5441 	mutex_unlock(&ar->conf_mutex);
5442 
5443 	return ret;
5444 }
5445 
5446 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
5447 {
5448 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5449 	struct ath12k *ar = ath12k_ah_to_ar(ah);
5450 	struct ath12k_base *ab = ar->ab;
5451 	int ret;
5452 
5453 	ath12k_mac_drain_tx(ar);
5454 
5455 	ret = ath12k_mac_start(ar);
5456 	if (ret) {
5457 		ath12k_err(ab, "fail to start mac operations in pdev idx %d ret %d\n",
5458 			   ar->pdev_idx, ret);
5459 		return ret;
5460 	}
5461 
5462 	return 0;
5463 }
5464 
5465 int ath12k_mac_rfkill_config(struct ath12k *ar)
5466 {
5467 	struct ath12k_base *ab = ar->ab;
5468 	u32 param;
5469 	int ret;
5470 
5471 	if (ab->hw_params->rfkill_pin == 0)
5472 		return -EOPNOTSUPP;
5473 
5474 	ath12k_dbg(ab, ATH12K_DBG_MAC,
5475 		   "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
5476 		   ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
5477 		   ab->hw_params->rfkill_on_level);
5478 
5479 	param = u32_encode_bits(ab->hw_params->rfkill_on_level,
5480 				WMI_RFKILL_CFG_RADIO_LEVEL) |
5481 		u32_encode_bits(ab->hw_params->rfkill_pin,
5482 				WMI_RFKILL_CFG_GPIO_PIN_NUM) |
5483 		u32_encode_bits(ab->hw_params->rfkill_cfg,
5484 				WMI_RFKILL_CFG_PIN_AS_GPIO);
5485 
5486 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
5487 					param, ar->pdev->pdev_id);
5488 	if (ret) {
5489 		ath12k_warn(ab,
5490 			    "failed to set rfkill config 0x%x: %d\n",
5491 			    param, ret);
5492 		return ret;
5493 	}
5494 
5495 	return 0;
5496 }
5497 
5498 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
5499 {
5500 	enum wmi_rfkill_enable_radio param;
5501 	int ret;
5502 
5503 	if (enable)
5504 		param = WMI_RFKILL_ENABLE_RADIO_ON;
5505 	else
5506 		param = WMI_RFKILL_ENABLE_RADIO_OFF;
5507 
5508 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
5509 		   ar->pdev_idx, param);
5510 
5511 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
5512 					param, ar->pdev->pdev_id);
5513 	if (ret) {
5514 		ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
5515 			    param, ret);
5516 		return ret;
5517 	}
5518 
5519 	return 0;
5520 }
5521 
5522 static void ath12k_mac_stop(struct ath12k *ar)
5523 {
5524 	struct htt_ppdu_stats_info *ppdu_stats, *tmp;
5525 	int ret;
5526 
5527 	mutex_lock(&ar->conf_mutex);
5528 	ret = ath12k_mac_config_mon_status_default(ar, false);
5529 	if (ret && (ret != -EOPNOTSUPP))
5530 		ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
5531 			   ret);
5532 
5533 	clear_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
5534 	ar->state = ATH12K_STATE_OFF;
5535 	mutex_unlock(&ar->conf_mutex);
5536 
5537 	cancel_delayed_work_sync(&ar->scan.timeout);
5538 	cancel_work_sync(&ar->regd_update_work);
5539 	cancel_work_sync(&ar->ab->rfkill_work);
5540 
5541 	spin_lock_bh(&ar->data_lock);
5542 	list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
5543 		list_del(&ppdu_stats->list);
5544 		kfree(ppdu_stats);
5545 	}
5546 	spin_unlock_bh(&ar->data_lock);
5547 
5548 	rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
5549 
5550 	synchronize_rcu();
5551 
5552 	atomic_set(&ar->num_pending_mgmt_tx, 0);
5553 }
5554 
5555 static void ath12k_mac_op_stop(struct ieee80211_hw *hw)
5556 {
5557 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5558 	struct ath12k *ar = ath12k_ah_to_ar(ah);
5559 
5560 	ath12k_mac_drain_tx(ar);
5561 
5562 	ath12k_mac_stop(ar);
5563 }
5564 
5565 static u8
5566 ath12k_mac_get_vdev_stats_id(struct ath12k_vif *arvif)
5567 {
5568 	struct ath12k_base *ab = arvif->ar->ab;
5569 	u8 vdev_stats_id = 0;
5570 
5571 	do {
5572 		if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
5573 			vdev_stats_id++;
5574 			if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
5575 				vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
5576 				break;
5577 			}
5578 		} else {
5579 			ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
5580 			break;
5581 		}
5582 	} while (vdev_stats_id);
5583 
5584 	arvif->vdev_stats_id = vdev_stats_id;
5585 	return vdev_stats_id;
5586 }
5587 
5588 static void ath12k_mac_setup_vdev_create_arg(struct ath12k_vif *arvif,
5589 					     struct ath12k_wmi_vdev_create_arg *arg)
5590 {
5591 	struct ath12k *ar = arvif->ar;
5592 	struct ath12k_pdev *pdev = ar->pdev;
5593 
5594 	arg->if_id = arvif->vdev_id;
5595 	arg->type = arvif->vdev_type;
5596 	arg->subtype = arvif->vdev_subtype;
5597 	arg->pdev_id = pdev->pdev_id;
5598 
5599 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) {
5600 		arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
5601 		arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
5602 	}
5603 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP) {
5604 		arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
5605 		arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
5606 	}
5607 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5G_CAP &&
5608 	    ar->supports_6ghz) {
5609 		arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
5610 		arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
5611 	}
5612 
5613 	arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
5614 }
5615 
5616 static u32
5617 ath12k_mac_prepare_he_mode(struct ath12k_pdev *pdev, u32 viftype)
5618 {
5619 	struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
5620 	struct ath12k_band_cap *cap_band = NULL;
5621 	u32 *hecap_phy_ptr = NULL;
5622 	u32 hemode;
5623 
5624 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP)
5625 		cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
5626 	else
5627 		cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
5628 
5629 	hecap_phy_ptr = &cap_band->he_cap_phy_info[0];
5630 
5631 	hemode = u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE) |
5632 		 u32_encode_bits(HECAP_PHY_SUBFMR_GET(hecap_phy_ptr),
5633 				 HE_MODE_SU_TX_BFER) |
5634 		 u32_encode_bits(HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr),
5635 				 HE_MODE_UL_MUMIMO);
5636 
5637 	/* TODO: WDS and other modes */
5638 	if (viftype == NL80211_IFTYPE_AP) {
5639 		hemode |= u32_encode_bits(HECAP_PHY_MUBFMR_GET(hecap_phy_ptr),
5640 					  HE_MODE_MU_TX_BFER) |
5641 			  u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
5642 			  u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
5643 	} else {
5644 		hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
5645 	}
5646 
5647 	return hemode;
5648 }
5649 
5650 static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
5651 					  struct ath12k_vif *arvif)
5652 {
5653 	u32 param_id, param_value;
5654 	struct ath12k_base *ab = ar->ab;
5655 	int ret;
5656 
5657 	param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
5658 	param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
5659 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5660 					    param_id, param_value);
5661 	if (ret) {
5662 		ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n",
5663 			    arvif->vdev_id, ret, param_value);
5664 		return ret;
5665 	}
5666 	param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
5667 	param_value =
5668 		u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
5669 		u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
5670 				HE_TRIG_NONTRIG_SOUNDING_MODE);
5671 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5672 					    param_id, param_value);
5673 	if (ret) {
5674 		ath12k_warn(ab, "failed to set vdev %d HE MU mode: %d\n",
5675 			    arvif->vdev_id, ret);
5676 		return ret;
5677 	}
5678 	return ret;
5679 }
5680 
5681 static void ath12k_mac_update_vif_offload(struct ath12k_vif *arvif)
5682 {
5683 	struct ieee80211_vif *vif = arvif->vif;
5684 	struct ath12k *ar = arvif->ar;
5685 	struct ath12k_base *ab = ar->ab;
5686 	u32 param_id, param_value;
5687 	int ret;
5688 
5689 	param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
5690 	if (vif->type != NL80211_IFTYPE_STATION &&
5691 	    vif->type != NL80211_IFTYPE_AP)
5692 		vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
5693 					IEEE80211_OFFLOAD_DECAP_ENABLED);
5694 
5695 	if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
5696 		arvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
5697 	else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5698 		arvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
5699 	else
5700 		arvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
5701 
5702 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5703 					    param_id, arvif->tx_encap_type);
5704 	if (ret) {
5705 		ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
5706 			    arvif->vdev_id, ret);
5707 		vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
5708 	}
5709 
5710 	param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
5711 	if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
5712 		param_value = ATH12K_HW_TXRX_ETHERNET;
5713 	else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
5714 		param_value = ATH12K_HW_TXRX_RAW;
5715 	else
5716 		param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
5717 
5718 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5719 					    param_id, param_value);
5720 	if (ret) {
5721 		ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
5722 			    arvif->vdev_id, ret);
5723 		vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
5724 	}
5725 }
5726 
5727 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
5728 					     struct ieee80211_vif *vif)
5729 {
5730 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5731 
5732 	ath12k_mac_update_vif_offload(arvif);
5733 }
5734 
5735 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
5736 				       struct ieee80211_vif *vif)
5737 {
5738 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5739 	struct ath12k *ar;
5740 	struct ath12k_base *ab;
5741 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
5742 	struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
5743 	struct ath12k_wmi_peer_create_arg peer_param;
5744 	u32 param_id, param_value;
5745 	u16 nss;
5746 	int i;
5747 	int ret;
5748 	int bit;
5749 
5750 	vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
5751 
5752 	ar = ath12k_ah_to_ar(ah);
5753 	ab = ar->ab;
5754 
5755 	mutex_lock(&ar->conf_mutex);
5756 
5757 	if (vif->type == NL80211_IFTYPE_AP &&
5758 	    ar->num_peers > (ar->max_num_peers - 1)) {
5759 		ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
5760 		ret = -ENOBUFS;
5761 		goto err;
5762 	}
5763 
5764 	if (ar->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) {
5765 		ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
5766 			    TARGET_NUM_VDEVS);
5767 		ret = -EBUSY;
5768 		goto err;
5769 	}
5770 
5771 	memset(arvif, 0, sizeof(*arvif));
5772 
5773 	arvif->ar = ar;
5774 	arvif->vif = vif;
5775 
5776 	INIT_LIST_HEAD(&arvif->list);
5777 
5778 	/* Should we initialize any worker to handle connection loss indication
5779 	 * from firmware in sta mode?
5780 	 */
5781 
5782 	for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
5783 		arvif->bitrate_mask.control[i].legacy = 0xffffffff;
5784 		memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
5785 		       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
5786 		memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
5787 		       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
5788 	}
5789 
5790 	bit = __ffs64(ab->free_vdev_map);
5791 
5792 	arvif->vdev_id = bit;
5793 	arvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
5794 
5795 	switch (vif->type) {
5796 	case NL80211_IFTYPE_UNSPECIFIED:
5797 	case NL80211_IFTYPE_STATION:
5798 		arvif->vdev_type = WMI_VDEV_TYPE_STA;
5799 
5800 		if (vif->p2p)
5801 			arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
5802 
5803 		break;
5804 	case NL80211_IFTYPE_MESH_POINT:
5805 		arvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
5806 		fallthrough;
5807 	case NL80211_IFTYPE_AP:
5808 		arvif->vdev_type = WMI_VDEV_TYPE_AP;
5809 
5810 		if (vif->p2p)
5811 			arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
5812 
5813 		break;
5814 	case NL80211_IFTYPE_MONITOR:
5815 		arvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
5816 		ar->monitor_vdev_id = bit;
5817 		break;
5818 	case NL80211_IFTYPE_P2P_DEVICE:
5819 		arvif->vdev_type = WMI_VDEV_TYPE_STA;
5820 		arvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
5821 		break;
5822 	default:
5823 		WARN_ON(1);
5824 		break;
5825 	}
5826 
5827 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac add interface id %d type %d subtype %d map %llx\n",
5828 		   arvif->vdev_id, arvif->vdev_type, arvif->vdev_subtype,
5829 		   ab->free_vdev_map);
5830 
5831 	vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
5832 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
5833 		vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
5834 
5835 	ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
5836 
5837 	ret = ath12k_wmi_vdev_create(ar, vif->addr, &vdev_arg);
5838 	if (ret) {
5839 		ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
5840 			    arvif->vdev_id, ret);
5841 		goto err;
5842 	}
5843 
5844 	ar->num_created_vdevs++;
5845 	ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
5846 		   vif->addr, arvif->vdev_id);
5847 	ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
5848 	ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
5849 
5850 	spin_lock_bh(&ar->data_lock);
5851 	list_add(&arvif->list, &ar->arvifs);
5852 	spin_unlock_bh(&ar->data_lock);
5853 
5854 	ath12k_mac_update_vif_offload(arvif);
5855 
5856 	nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
5857 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5858 					    WMI_VDEV_PARAM_NSS, nss);
5859 	if (ret) {
5860 		ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
5861 			    arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
5862 		goto err_vdev_del;
5863 	}
5864 
5865 	switch (arvif->vdev_type) {
5866 	case WMI_VDEV_TYPE_AP:
5867 		peer_param.vdev_id = arvif->vdev_id;
5868 		peer_param.peer_addr = vif->addr;
5869 		peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
5870 		ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
5871 		if (ret) {
5872 			ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
5873 				    arvif->vdev_id, ret);
5874 			goto err_vdev_del;
5875 		}
5876 
5877 		ret = ath12k_mac_set_kickout(arvif);
5878 		if (ret) {
5879 			ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
5880 				    arvif->vdev_id, ret);
5881 			goto err_peer_del;
5882 		}
5883 		break;
5884 	case WMI_VDEV_TYPE_STA:
5885 		param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
5886 		param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
5887 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5888 						  param_id, param_value);
5889 		if (ret) {
5890 			ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
5891 				    arvif->vdev_id, ret);
5892 			goto err_peer_del;
5893 		}
5894 
5895 		param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
5896 		param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
5897 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5898 						  param_id, param_value);
5899 		if (ret) {
5900 			ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
5901 				    arvif->vdev_id, ret);
5902 			goto err_peer_del;
5903 		}
5904 
5905 		param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
5906 		param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
5907 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
5908 						  param_id, param_value);
5909 		if (ret) {
5910 			ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
5911 				    arvif->vdev_id, ret);
5912 			goto err_peer_del;
5913 		}
5914 
5915 		ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
5916 		if (ret) {
5917 			ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
5918 				    arvif->vdev_id, ret);
5919 			goto err_peer_del;
5920 		}
5921 		break;
5922 	default:
5923 		break;
5924 	}
5925 
5926 	arvif->txpower = vif->bss_conf.txpower;
5927 	ret = ath12k_mac_txpower_recalc(ar);
5928 	if (ret)
5929 		goto err_peer_del;
5930 
5931 	param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
5932 	param_value = hw->wiphy->rts_threshold;
5933 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
5934 					    param_id, param_value);
5935 	if (ret) {
5936 		ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
5937 			    arvif->vdev_id, ret);
5938 	}
5939 
5940 	ath12k_dp_vdev_tx_attach(ar, arvif);
5941 
5942 	if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled)
5943 		ath12k_mac_monitor_vdev_create(ar);
5944 
5945 	mutex_unlock(&ar->conf_mutex);
5946 
5947 	return ret;
5948 
5949 err_peer_del:
5950 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
5951 		reinit_completion(&ar->peer_delete_done);
5952 
5953 		ret = ath12k_wmi_send_peer_delete_cmd(ar, vif->addr,
5954 						      arvif->vdev_id);
5955 		if (ret) {
5956 			ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
5957 				    arvif->vdev_id, vif->addr);
5958 			goto err;
5959 		}
5960 
5961 		ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
5962 						       vif->addr);
5963 		if (ret)
5964 			goto err;
5965 
5966 		ar->num_peers--;
5967 	}
5968 
5969 err_vdev_del:
5970 	ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
5971 	ar->num_created_vdevs--;
5972 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
5973 	ab->free_vdev_map |= 1LL << arvif->vdev_id;
5974 	ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
5975 	spin_lock_bh(&ar->data_lock);
5976 	list_del(&arvif->list);
5977 	spin_unlock_bh(&ar->data_lock);
5978 
5979 err:
5980 	mutex_unlock(&ar->conf_mutex);
5981 
5982 	return ret;
5983 }
5984 
5985 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
5986 {
5987 	struct ath12k_tx_desc_info *tx_desc_info;
5988 	struct ath12k_skb_cb *skb_cb;
5989 	struct sk_buff *skb;
5990 	int i;
5991 
5992 	for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
5993 		spin_lock_bh(&dp->tx_desc_lock[i]);
5994 
5995 		list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
5996 				    list) {
5997 			skb = tx_desc_info->skb;
5998 			if (!skb)
5999 				continue;
6000 
6001 			skb_cb = ATH12K_SKB_CB(skb);
6002 			if (skb_cb->vif == vif)
6003 				skb_cb->vif = NULL;
6004 		}
6005 
6006 		spin_unlock_bh(&dp->tx_desc_lock[i]);
6007 	}
6008 }
6009 
6010 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
6011 					   struct ieee80211_vif *vif)
6012 {
6013 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6014 	struct ath12k *ar;
6015 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6016 	struct ath12k_base *ab;
6017 	unsigned long time_left;
6018 	int ret;
6019 
6020 	ar = ath12k_ah_to_ar(ah);
6021 	ab = ar->ab;
6022 
6023 	mutex_lock(&ar->conf_mutex);
6024 
6025 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
6026 		   arvif->vdev_id);
6027 
6028 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6029 		ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr);
6030 		if (ret)
6031 			ath12k_warn(ab, "failed to submit AP self-peer removal on vdev %d: %d\n",
6032 				    arvif->vdev_id, ret);
6033 	}
6034 
6035 	reinit_completion(&ar->vdev_delete_done);
6036 
6037 	ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
6038 	if (ret) {
6039 		ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
6040 			    arvif->vdev_id, ret);
6041 		goto err_vdev_del;
6042 	}
6043 
6044 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
6045 						ATH12K_VDEV_DELETE_TIMEOUT_HZ);
6046 	if (time_left == 0) {
6047 		ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
6048 		goto err_vdev_del;
6049 	}
6050 
6051 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6052 		ar->monitor_vdev_id = -1;
6053 		ar->monitor_vdev_created = false;
6054 	} else if (ar->monitor_vdev_created && !ar->monitor_started) {
6055 		ret = ath12k_mac_monitor_vdev_delete(ar);
6056 	}
6057 
6058 	ab->free_vdev_map |= 1LL << (arvif->vdev_id);
6059 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
6060 	ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
6061 	ar->num_created_vdevs--;
6062 
6063 	ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
6064 		   vif->addr, arvif->vdev_id);
6065 
6066 err_vdev_del:
6067 	spin_lock_bh(&ar->data_lock);
6068 	list_del(&arvif->list);
6069 	spin_unlock_bh(&ar->data_lock);
6070 
6071 	ath12k_peer_cleanup(ar, arvif->vdev_id);
6072 
6073 	idr_for_each(&ar->txmgmt_idr,
6074 		     ath12k_mac_vif_txmgmt_idr_remove, vif);
6075 
6076 	ath12k_mac_vif_unref(&ab->dp, vif);
6077 	ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
6078 
6079 	/* Recalc txpower for remaining vdev */
6080 	ath12k_mac_txpower_recalc(ar);
6081 	clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6082 
6083 	/* TODO: recal traffic pause state based on the available vdevs */
6084 
6085 	mutex_unlock(&ar->conf_mutex);
6086 }
6087 
6088 /* FIXME: Has to be verified. */
6089 #define SUPPORTED_FILTERS			\
6090 	(FIF_ALLMULTI |				\
6091 	FIF_CONTROL |				\
6092 	FIF_PSPOLL |				\
6093 	FIF_OTHER_BSS |				\
6094 	FIF_BCN_PRBRESP_PROMISC |		\
6095 	FIF_PROBE_REQ |				\
6096 	FIF_FCSFAIL)
6097 
6098 static void ath12k_mac_configure_filter(struct ath12k *ar,
6099 					unsigned int total_flags)
6100 {
6101 	bool reset_flag;
6102 	int ret;
6103 
6104 	lockdep_assert_held(&ar->conf_mutex);
6105 
6106 	ar->filter_flags = total_flags;
6107 
6108 	/* For monitor mode */
6109 	reset_flag = !(ar->filter_flags & FIF_BCN_PRBRESP_PROMISC);
6110 
6111 	ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, reset_flag);
6112 	if (!ret) {
6113 		if (!reset_flag)
6114 			set_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6115 		else
6116 			clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
6117 	} else {
6118 		ath12k_warn(ar->ab,
6119 			    "fail to set monitor filter: %d\n", ret);
6120 	}
6121 
6122 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6123 		   "total_flags:0x%x, reset_flag:%d\n",
6124 		   total_flags, reset_flag);
6125 }
6126 
6127 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
6128 					   unsigned int changed_flags,
6129 					   unsigned int *total_flags,
6130 					   u64 multicast)
6131 {
6132 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6133 	struct ath12k *ar;
6134 
6135 	ar = ath12k_ah_to_ar(ah);
6136 
6137 	mutex_lock(&ar->conf_mutex);
6138 
6139 	*total_flags &= SUPPORTED_FILTERS;
6140 	ath12k_mac_configure_filter(ar, *total_flags);
6141 
6142 	mutex_unlock(&ar->conf_mutex);
6143 }
6144 
6145 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
6146 {
6147 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6148 	struct ath12k *ar;
6149 
6150 	ar = ath12k_ah_to_ar(ah);
6151 
6152 	mutex_lock(&ar->conf_mutex);
6153 
6154 	*tx_ant = ar->cfg_tx_chainmask;
6155 	*rx_ant = ar->cfg_rx_chainmask;
6156 
6157 	mutex_unlock(&ar->conf_mutex);
6158 
6159 	return 0;
6160 }
6161 
6162 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
6163 {
6164 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6165 	struct ath12k *ar;
6166 	int ret;
6167 
6168 	ar = ath12k_ah_to_ar(ah);
6169 
6170 	mutex_lock(&ar->conf_mutex);
6171 	ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
6172 	mutex_unlock(&ar->conf_mutex);
6173 
6174 	return ret;
6175 }
6176 
6177 static int ath12k_mac_ampdu_action(struct ath12k_vif *arvif,
6178 				   struct ieee80211_ampdu_params *params)
6179 {
6180 	struct ath12k *ar = arvif->ar;
6181 	int ret = -EINVAL;
6182 
6183 	lockdep_assert_held(&ar->conf_mutex);
6184 
6185 	switch (params->action) {
6186 	case IEEE80211_AMPDU_RX_START:
6187 		ret = ath12k_dp_rx_ampdu_start(ar, params);
6188 		break;
6189 	case IEEE80211_AMPDU_RX_STOP:
6190 		ret = ath12k_dp_rx_ampdu_stop(ar, params);
6191 		break;
6192 	case IEEE80211_AMPDU_TX_START:
6193 	case IEEE80211_AMPDU_TX_STOP_CONT:
6194 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
6195 	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
6196 	case IEEE80211_AMPDU_TX_OPERATIONAL:
6197 		/* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
6198 		 * Tx aggregation requests.
6199 		 */
6200 		ret = -EOPNOTSUPP;
6201 		break;
6202 	}
6203 
6204 	return ret;
6205 }
6206 
6207 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
6208 				      struct ieee80211_vif *vif,
6209 				      struct ieee80211_ampdu_params *params)
6210 {
6211 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6212 	struct ath12k *ar;
6213 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6214 	int ret = -EINVAL;
6215 
6216 	ar = ath12k_ah_to_ar(ah);
6217 
6218 	mutex_lock(&ar->conf_mutex);
6219 	ret = ath12k_mac_ampdu_action(arvif, params);
6220 	mutex_unlock(&ar->conf_mutex);
6221 
6222 	if (ret)
6223 		ath12k_warn(ar->ab, "pdev idx %d unable to perform ampdu action %d ret %d\n",
6224 			    ar->pdev_idx, params->action, ret);
6225 
6226 	return ret;
6227 }
6228 
6229 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
6230 				     struct ieee80211_chanctx_conf *ctx)
6231 {
6232 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6233 	struct ath12k *ar;
6234 	struct ath12k_base *ab;
6235 
6236 	ar = ath12k_ah_to_ar(ah);
6237 	ab = ar->ab;
6238 
6239 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6240 		   "mac chanctx add freq %u width %d ptr %pK\n",
6241 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
6242 
6243 	mutex_lock(&ar->conf_mutex);
6244 
6245 	spin_lock_bh(&ar->data_lock);
6246 	/* TODO: In case of multiple channel context, populate rx_channel from
6247 	 * Rx PPDU desc information.
6248 	 */
6249 	ar->rx_channel = ctx->def.chan;
6250 	spin_unlock_bh(&ar->data_lock);
6251 
6252 	mutex_unlock(&ar->conf_mutex);
6253 
6254 	return 0;
6255 }
6256 
6257 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
6258 					 struct ieee80211_chanctx_conf *ctx)
6259 {
6260 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6261 	struct ath12k *ar;
6262 	struct ath12k_base *ab;
6263 
6264 	ar = ath12k_ah_to_ar(ah);
6265 	ab = ar->ab;
6266 
6267 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6268 		   "mac chanctx remove freq %u width %d ptr %pK\n",
6269 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
6270 
6271 	mutex_lock(&ar->conf_mutex);
6272 
6273 	spin_lock_bh(&ar->data_lock);
6274 	/* TODO: In case of there is one more channel context left, populate
6275 	 * rx_channel with the channel of that remaining channel context.
6276 	 */
6277 	ar->rx_channel = NULL;
6278 	spin_unlock_bh(&ar->data_lock);
6279 
6280 	mutex_unlock(&ar->conf_mutex);
6281 }
6282 
6283 static enum wmi_phy_mode
6284 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
6285 				     enum wmi_phy_mode mode,
6286 				     enum nl80211_band band,
6287 				     enum nl80211_iftype type)
6288 {
6289 	struct ieee80211_sta_eht_cap *eht_cap;
6290 	enum wmi_phy_mode down_mode;
6291 
6292 	if (mode < MODE_11BE_EHT20)
6293 		return mode;
6294 
6295 	eht_cap = &ar->mac.iftype[band][type].eht_cap;
6296 	if (eht_cap->has_eht)
6297 		return mode;
6298 
6299 	switch (mode) {
6300 	case MODE_11BE_EHT20:
6301 		down_mode = MODE_11AX_HE20;
6302 		break;
6303 	case MODE_11BE_EHT40:
6304 		down_mode = MODE_11AX_HE40;
6305 		break;
6306 	case MODE_11BE_EHT80:
6307 		down_mode = MODE_11AX_HE80;
6308 		break;
6309 	case MODE_11BE_EHT80_80:
6310 		down_mode = MODE_11AX_HE80_80;
6311 		break;
6312 	case MODE_11BE_EHT160:
6313 	case MODE_11BE_EHT160_160:
6314 	case MODE_11BE_EHT320:
6315 		down_mode = MODE_11AX_HE160;
6316 		break;
6317 	case MODE_11BE_EHT20_2G:
6318 		down_mode = MODE_11AX_HE20_2G;
6319 		break;
6320 	case MODE_11BE_EHT40_2G:
6321 		down_mode = MODE_11AX_HE40_2G;
6322 		break;
6323 	default:
6324 		down_mode = mode;
6325 		break;
6326 	}
6327 
6328 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6329 		   "mac vdev start phymode %s downgrade to %s\n",
6330 		   ath12k_mac_phymode_str(mode),
6331 		   ath12k_mac_phymode_str(down_mode));
6332 
6333 	return down_mode;
6334 }
6335 
6336 static int
6337 ath12k_mac_vdev_start_restart(struct ath12k_vif *arvif,
6338 			      struct ieee80211_chanctx_conf *ctx,
6339 			      bool restart)
6340 {
6341 	struct ath12k *ar = arvif->ar;
6342 	struct ath12k_base *ab = ar->ab;
6343 	struct wmi_vdev_start_req_arg arg = {};
6344 	const struct cfg80211_chan_def *chandef = &ctx->def;
6345 	int he_support = arvif->vif->bss_conf.he_support;
6346 	int ret;
6347 
6348 	lockdep_assert_held(&ar->conf_mutex);
6349 
6350 	reinit_completion(&ar->vdev_setup_done);
6351 
6352 	arg.vdev_id = arvif->vdev_id;
6353 	arg.dtim_period = arvif->dtim_period;
6354 	arg.bcn_intval = arvif->beacon_interval;
6355 	arg.punct_bitmap = ~arvif->punct_bitmap;
6356 
6357 	arg.freq = chandef->chan->center_freq;
6358 	arg.band_center_freq1 = chandef->center_freq1;
6359 	arg.band_center_freq2 = chandef->center_freq2;
6360 	arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
6361 
6362 	arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
6363 							chandef->chan->band,
6364 							arvif->vif->type);
6365 	arg.min_power = 0;
6366 	arg.max_power = chandef->chan->max_power * 2;
6367 	arg.max_reg_power = chandef->chan->max_reg_power * 2;
6368 	arg.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
6369 
6370 	arg.pref_tx_streams = ar->num_tx_chains;
6371 	arg.pref_rx_streams = ar->num_rx_chains;
6372 
6373 	/* Fill the MBSSID flags to indicate AP is non MBSSID by default
6374 	 * Corresponding flags would be updated with MBSSID support.
6375 	 */
6376 	arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
6377 
6378 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
6379 		arg.ssid = arvif->u.ap.ssid;
6380 		arg.ssid_len = arvif->u.ap.ssid_len;
6381 		arg.hidden_ssid = arvif->u.ap.hidden_ssid;
6382 
6383 		/* For now allow DFS for AP mode */
6384 		arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
6385 
6386 		arg.freq2_radar = ctx->radar_enabled;
6387 
6388 		arg.passive = arg.chan_radar;
6389 
6390 		spin_lock_bh(&ab->base_lock);
6391 		arg.regdomain = ar->ab->dfs_region;
6392 		spin_unlock_bh(&ab->base_lock);
6393 
6394 		/* TODO: Notify if secondary 80Mhz also needs radar detection */
6395 		if (he_support) {
6396 			ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
6397 			if (ret) {
6398 				ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
6399 					    arg.vdev_id);
6400 				return ret;
6401 			}
6402 		}
6403 	}
6404 
6405 	arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
6406 
6407 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6408 		   "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
6409 		   arg.vdev_id, arg.freq,
6410 		   ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
6411 
6412 	ret = ath12k_wmi_vdev_start(ar, &arg, restart);
6413 	if (ret) {
6414 		ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
6415 			    restart ? "restart" : "start", arg.vdev_id);
6416 		return ret;
6417 	}
6418 
6419 	ret = ath12k_mac_vdev_setup_sync(ar);
6420 	if (ret) {
6421 		ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
6422 			    arg.vdev_id, restart ? "restart" : "start", ret);
6423 		return ret;
6424 	}
6425 
6426 	ar->num_started_vdevs++;
6427 	ath12k_dbg(ab, ATH12K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
6428 		   arvif->vif->addr, arvif->vdev_id);
6429 
6430 	/* Enable CAC Flag in the driver by checking the channel DFS cac time,
6431 	 * i.e dfs_cac_ms value which will be valid only for radar channels
6432 	 * and state as NL80211_DFS_USABLE which indicates CAC needs to be
6433 	 * done before channel usage. This flags is used to drop rx packets.
6434 	 * during CAC.
6435 	 */
6436 	/* TODO: Set the flag for other interface types as required */
6437 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
6438 	    chandef->chan->dfs_cac_ms &&
6439 	    chandef->chan->dfs_state == NL80211_DFS_USABLE) {
6440 		set_bit(ATH12K_CAC_RUNNING, &ar->dev_flags);
6441 		ath12k_dbg(ab, ATH12K_DBG_MAC,
6442 			   "CAC Started in chan_freq %d for vdev %d\n",
6443 			   arg.freq, arg.vdev_id);
6444 	}
6445 
6446 	ret = ath12k_mac_set_txbf_conf(arvif);
6447 	if (ret)
6448 		ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
6449 			    arvif->vdev_id, ret);
6450 
6451 	return 0;
6452 }
6453 
6454 static int ath12k_mac_vdev_start(struct ath12k_vif *arvif,
6455 				 struct ieee80211_chanctx_conf *ctx)
6456 {
6457 	return ath12k_mac_vdev_start_restart(arvif, ctx, false);
6458 }
6459 
6460 static int ath12k_mac_vdev_restart(struct ath12k_vif *arvif,
6461 				   struct ieee80211_chanctx_conf *ctx)
6462 {
6463 	return ath12k_mac_vdev_start_restart(arvif, ctx, true);
6464 }
6465 
6466 struct ath12k_mac_change_chanctx_arg {
6467 	struct ieee80211_chanctx_conf *ctx;
6468 	struct ieee80211_vif_chanctx_switch *vifs;
6469 	int n_vifs;
6470 	int next_vif;
6471 };
6472 
6473 static void
6474 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
6475 				   struct ieee80211_vif *vif)
6476 {
6477 	struct ath12k_mac_change_chanctx_arg *arg = data;
6478 
6479 	if (rcu_access_pointer(vif->bss_conf.chanctx_conf) != arg->ctx)
6480 		return;
6481 
6482 	arg->n_vifs++;
6483 }
6484 
6485 static void
6486 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
6487 				    struct ieee80211_vif *vif)
6488 {
6489 	struct ath12k_mac_change_chanctx_arg *arg = data;
6490 	struct ieee80211_chanctx_conf *ctx;
6491 
6492 	ctx = rcu_access_pointer(vif->bss_conf.chanctx_conf);
6493 	if (ctx != arg->ctx)
6494 		return;
6495 
6496 	if (WARN_ON(arg->next_vif == arg->n_vifs))
6497 		return;
6498 
6499 	arg->vifs[arg->next_vif].vif = vif;
6500 	arg->vifs[arg->next_vif].old_ctx = ctx;
6501 	arg->vifs[arg->next_vif].new_ctx = ctx;
6502 	arg->next_vif++;
6503 }
6504 
6505 static void
6506 ath12k_mac_update_vif_chan(struct ath12k *ar,
6507 			   struct ieee80211_vif_chanctx_switch *vifs,
6508 			   int n_vifs)
6509 {
6510 	struct ath12k_base *ab = ar->ab;
6511 	struct ath12k_vif *arvif;
6512 	int ret;
6513 	int i;
6514 	bool monitor_vif = false;
6515 
6516 	lockdep_assert_held(&ar->conf_mutex);
6517 
6518 	for (i = 0; i < n_vifs; i++) {
6519 		arvif = ath12k_vif_to_arvif(vifs[i].vif);
6520 
6521 		if (vifs[i].vif->type == NL80211_IFTYPE_MONITOR)
6522 			monitor_vif = true;
6523 
6524 		ath12k_dbg(ab, ATH12K_DBG_MAC,
6525 			   "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
6526 			   arvif->vdev_id,
6527 			   vifs[i].old_ctx->def.chan->center_freq,
6528 			   vifs[i].new_ctx->def.chan->center_freq,
6529 			   vifs[i].old_ctx->def.width,
6530 			   vifs[i].new_ctx->def.width);
6531 
6532 		if (WARN_ON(!arvif->is_started))
6533 			continue;
6534 
6535 		if (WARN_ON(!arvif->is_up))
6536 			continue;
6537 
6538 		ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6539 		if (ret) {
6540 			ath12k_warn(ab, "failed to down vdev %d: %d\n",
6541 				    arvif->vdev_id, ret);
6542 			continue;
6543 		}
6544 	}
6545 
6546 	/* All relevant vdevs are downed and associated channel resources
6547 	 * should be available for the channel switch now.
6548 	 */
6549 
6550 	/* TODO: Update ar->rx_channel */
6551 
6552 	for (i = 0; i < n_vifs; i++) {
6553 		arvif = ath12k_vif_to_arvif(vifs[i].vif);
6554 
6555 		if (WARN_ON(!arvif->is_started))
6556 			continue;
6557 
6558 		arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
6559 
6560 		/* Firmware expect vdev_restart only if vdev is up.
6561 		 * If vdev is down then it expect vdev_stop->vdev_start.
6562 		 */
6563 		if (arvif->is_up) {
6564 			ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
6565 			if (ret) {
6566 				ath12k_warn(ab, "failed to restart vdev %d: %d\n",
6567 					    arvif->vdev_id, ret);
6568 				continue;
6569 			}
6570 		} else {
6571 			ret = ath12k_mac_vdev_stop(arvif);
6572 			if (ret) {
6573 				ath12k_warn(ab, "failed to stop vdev %d: %d\n",
6574 					    arvif->vdev_id, ret);
6575 				continue;
6576 			}
6577 
6578 			ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
6579 			if (ret)
6580 				ath12k_warn(ab, "failed to start vdev %d: %d\n",
6581 					    arvif->vdev_id, ret);
6582 			continue;
6583 		}
6584 
6585 		ret = ath12k_mac_setup_bcn_tmpl(arvif);
6586 		if (ret)
6587 			ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
6588 				    ret);
6589 
6590 		ret = ath12k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
6591 					 arvif->bssid);
6592 		if (ret) {
6593 			ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
6594 				    arvif->vdev_id, ret);
6595 			continue;
6596 		}
6597 	}
6598 
6599 	/* Restart the internal monitor vdev on new channel */
6600 	if (!monitor_vif && ar->monitor_vdev_created) {
6601 		if (!ath12k_mac_monitor_stop(ar))
6602 			ath12k_mac_monitor_start(ar);
6603 	}
6604 }
6605 
6606 static void
6607 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
6608 				  struct ieee80211_chanctx_conf *ctx)
6609 {
6610 	struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx };
6611 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
6612 
6613 	lockdep_assert_held(&ar->conf_mutex);
6614 
6615 	ieee80211_iterate_active_interfaces_atomic(hw,
6616 						   IEEE80211_IFACE_ITER_NORMAL,
6617 						   ath12k_mac_change_chanctx_cnt_iter,
6618 						   &arg);
6619 	if (arg.n_vifs == 0)
6620 		return;
6621 
6622 	arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
6623 	if (!arg.vifs)
6624 		return;
6625 
6626 	ieee80211_iterate_active_interfaces_atomic(hw,
6627 						   IEEE80211_IFACE_ITER_NORMAL,
6628 						   ath12k_mac_change_chanctx_fill_iter,
6629 						   &arg);
6630 
6631 	ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
6632 
6633 	kfree(arg.vifs);
6634 }
6635 
6636 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
6637 					 struct ieee80211_chanctx_conf *ctx,
6638 					 u32 changed)
6639 {
6640 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6641 	struct ath12k *ar;
6642 	struct ath12k_base *ab;
6643 
6644 	ar = ath12k_ah_to_ar(ah);
6645 	ab = ar->ab;
6646 
6647 	mutex_lock(&ar->conf_mutex);
6648 
6649 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6650 		   "mac chanctx change freq %u width %d ptr %pK changed %x\n",
6651 		   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
6652 
6653 	/* This shouldn't really happen because channel switching should use
6654 	 * switch_vif_chanctx().
6655 	 */
6656 	if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
6657 		goto unlock;
6658 
6659 	if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
6660 	    changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
6661 	    changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
6662 		ath12k_mac_update_active_vif_chan(ar, ctx);
6663 
6664 	/* TODO: Recalc radar detection */
6665 
6666 unlock:
6667 	mutex_unlock(&ar->conf_mutex);
6668 }
6669 
6670 static int ath12k_start_vdev_delay(struct ath12k *ar,
6671 				   struct ath12k_vif *arvif)
6672 {
6673 	struct ath12k_base *ab = ar->ab;
6674 	struct ieee80211_vif *vif = arvif->vif;
6675 	int ret;
6676 
6677 	if (WARN_ON(arvif->is_started))
6678 		return -EBUSY;
6679 
6680 	ret = ath12k_mac_vdev_start(arvif, &arvif->chanctx);
6681 	if (ret) {
6682 		ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6683 			    arvif->vdev_id, vif->addr,
6684 			    arvif->chanctx.def.chan->center_freq, ret);
6685 		return ret;
6686 	}
6687 
6688 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6689 		ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
6690 		if (ret) {
6691 			ath12k_warn(ab, "failed put monitor up: %d\n", ret);
6692 			return ret;
6693 		}
6694 	}
6695 
6696 	arvif->is_started = true;
6697 
6698 	/* TODO: Setup ps and cts/rts protection */
6699 	return 0;
6700 }
6701 
6702 static int
6703 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
6704 				 struct ieee80211_vif *vif,
6705 				 struct ieee80211_bss_conf *link_conf,
6706 				 struct ieee80211_chanctx_conf *ctx)
6707 {
6708 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6709 	struct ath12k *ar;
6710 	struct ath12k_base *ab;
6711 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6712 	int ret;
6713 	struct ath12k_wmi_peer_create_arg param;
6714 
6715 	ar = ath12k_ah_to_ar(ah);
6716 	ab = ar->ab;
6717 
6718 	mutex_lock(&ar->conf_mutex);
6719 
6720 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6721 		   "mac chanctx assign ptr %pK vdev_id %i\n",
6722 		   ctx, arvif->vdev_id);
6723 
6724 	arvif->punct_bitmap = ctx->def.punctured;
6725 
6726 	/* for some targets bss peer must be created before vdev_start */
6727 	if (ab->hw_params->vdev_start_delay &&
6728 	    arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6729 	    arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
6730 	    !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
6731 		memcpy(&arvif->chanctx, ctx, sizeof(*ctx));
6732 		ret = 0;
6733 		goto out;
6734 	}
6735 
6736 	if (WARN_ON(arvif->is_started)) {
6737 		ret = -EBUSY;
6738 		goto out;
6739 	}
6740 
6741 	if (ab->hw_params->vdev_start_delay &&
6742 	    arvif->vdev_type != WMI_VDEV_TYPE_AP &&
6743 	    arvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
6744 		param.vdev_id = arvif->vdev_id;
6745 		param.peer_type = WMI_PEER_TYPE_DEFAULT;
6746 		param.peer_addr = ar->mac_addr;
6747 
6748 		ret = ath12k_peer_create(ar, arvif, NULL, &param);
6749 		if (ret) {
6750 			ath12k_warn(ab, "failed to create peer after vdev start delay: %d",
6751 				    ret);
6752 			goto out;
6753 		}
6754 	}
6755 
6756 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6757 		ret = ath12k_mac_monitor_start(ar);
6758 		if (ret)
6759 			goto out;
6760 		arvif->is_started = true;
6761 		goto out;
6762 	}
6763 
6764 	ret = ath12k_mac_vdev_start(arvif, ctx);
6765 	if (ret) {
6766 		ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
6767 			    arvif->vdev_id, vif->addr,
6768 			    ctx->def.chan->center_freq, ret);
6769 		goto out;
6770 	}
6771 
6772 	if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created)
6773 		ath12k_mac_monitor_start(ar);
6774 
6775 	arvif->is_started = true;
6776 
6777 	/* TODO: Setup ps and cts/rts protection */
6778 
6779 out:
6780 	mutex_unlock(&ar->conf_mutex);
6781 
6782 	return ret;
6783 }
6784 
6785 static void
6786 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
6787 				   struct ieee80211_vif *vif,
6788 				   struct ieee80211_bss_conf *link_conf,
6789 				   struct ieee80211_chanctx_conf *ctx)
6790 {
6791 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6792 	struct ath12k *ar;
6793 	struct ath12k_base *ab;
6794 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
6795 	int ret;
6796 
6797 	ar = ath12k_ah_to_ar(ah);
6798 	ab = ar->ab;
6799 
6800 	mutex_lock(&ar->conf_mutex);
6801 
6802 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6803 		   "mac chanctx unassign ptr %pK vdev_id %i\n",
6804 		   ctx, arvif->vdev_id);
6805 
6806 	WARN_ON(!arvif->is_started);
6807 
6808 	if (ab->hw_params->vdev_start_delay &&
6809 	    arvif->vdev_type == WMI_VDEV_TYPE_MONITOR &&
6810 	    ath12k_peer_find_by_addr(ab, ar->mac_addr))
6811 		ath12k_peer_delete(ar, arvif->vdev_id, ar->mac_addr);
6812 
6813 	if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
6814 		ret = ath12k_mac_monitor_stop(ar);
6815 		if (ret) {
6816 			mutex_unlock(&ar->conf_mutex);
6817 			return;
6818 		}
6819 
6820 		arvif->is_started = false;
6821 	}
6822 
6823 	if (arvif->vdev_type != WMI_VDEV_TYPE_STA) {
6824 		ath12k_bss_disassoc(ar, arvif);
6825 		ret = ath12k_mac_vdev_stop(arvif);
6826 		if (ret)
6827 			ath12k_warn(ab, "failed to stop vdev %i: %d\n",
6828 				    arvif->vdev_id, ret);
6829 	}
6830 	arvif->is_started = false;
6831 
6832 	if (ab->hw_params->vdev_start_delay &&
6833 	    arvif->vdev_type == WMI_VDEV_TYPE_MONITOR)
6834 		ath12k_wmi_vdev_down(ar, arvif->vdev_id);
6835 
6836 	if (arvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
6837 	    ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
6838 		ath12k_mac_monitor_stop(ar);
6839 
6840 	mutex_unlock(&ar->conf_mutex);
6841 }
6842 
6843 static int
6844 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
6845 				 struct ieee80211_vif_chanctx_switch *vifs,
6846 				 int n_vifs,
6847 				 enum ieee80211_chanctx_switch_mode mode)
6848 {
6849 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6850 	struct ath12k *ar;
6851 
6852 	ar = ath12k_ah_to_ar(ah);
6853 
6854 	mutex_lock(&ar->conf_mutex);
6855 
6856 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6857 		   "mac chanctx switch n_vifs %d mode %d\n",
6858 		   n_vifs, mode);
6859 	ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
6860 
6861 	mutex_unlock(&ar->conf_mutex);
6862 
6863 	return 0;
6864 }
6865 
6866 static int
6867 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
6868 {
6869 	struct ath12k_vif *arvif;
6870 	int ret = 0;
6871 
6872 	mutex_lock(&ar->conf_mutex);
6873 	list_for_each_entry(arvif, &ar->arvifs, list) {
6874 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
6875 			   param, arvif->vdev_id, value);
6876 
6877 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
6878 						    param, value);
6879 		if (ret) {
6880 			ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
6881 				    param, arvif->vdev_id, ret);
6882 			break;
6883 		}
6884 	}
6885 	mutex_unlock(&ar->conf_mutex);
6886 	return ret;
6887 }
6888 
6889 /* mac80211 stores device specific RTS/Fragmentation threshold value,
6890  * this is set interface specific to firmware from ath12k driver
6891  */
6892 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
6893 {
6894 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6895 	struct ath12k *ar;
6896 	int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD, ret;
6897 
6898 	ar = ath12k_ah_to_ar(ah);
6899 
6900 	ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
6901 
6902 	return ret;
6903 }
6904 
6905 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
6906 {
6907 	/* Even though there's a WMI vdev param for fragmentation threshold no
6908 	 * known firmware actually implements it. Moreover it is not possible to
6909 	 * rely frame fragmentation to mac80211 because firmware clears the
6910 	 * "more fragments" bit in frame control making it impossible for remote
6911 	 * devices to reassemble frames.
6912 	 *
6913 	 * Hence implement a dummy callback just to say fragmentation isn't
6914 	 * supported. This effectively prevents mac80211 from doing frame
6915 	 * fragmentation in software.
6916 	 */
6917 	return -EOPNOTSUPP;
6918 }
6919 
6920 static void ath12k_mac_flush(struct ath12k *ar)
6921 {
6922 	long time_left;
6923 
6924 	time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
6925 				       (atomic_read(&ar->dp.num_tx_pending) == 0),
6926 				       ATH12K_FLUSH_TIMEOUT);
6927 	if (time_left == 0)
6928 		ath12k_warn(ar->ab, "failed to flush transmit queue %ld\n", time_left);
6929 
6930 	time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
6931 				       (atomic_read(&ar->num_pending_mgmt_tx) == 0),
6932 				       ATH12K_FLUSH_TIMEOUT);
6933 	if (time_left == 0)
6934 		ath12k_warn(ar->ab, "failed to flush mgmt transmit queue %ld\n",
6935 			    time_left);
6936 }
6937 
6938 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
6939 				u32 queues, bool drop)
6940 {
6941 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6942 	struct ath12k *ar = ath12k_ah_to_ar(ah);
6943 
6944 	if (drop)
6945 		return;
6946 
6947 	ath12k_mac_flush(ar);
6948 }
6949 
6950 static int
6951 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
6952 				     enum nl80211_band band,
6953 				     const struct cfg80211_bitrate_mask *mask)
6954 {
6955 	int num_rates = 0;
6956 	int i;
6957 
6958 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
6959 		num_rates += hweight16(mask->control[band].ht_mcs[i]);
6960 
6961 	return num_rates;
6962 }
6963 
6964 static bool
6965 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
6966 				  enum nl80211_band band,
6967 				  const struct cfg80211_bitrate_mask *mask)
6968 {
6969 	int num_rates = 0;
6970 
6971 	num_rates = hweight32(mask->control[band].legacy);
6972 
6973 	if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
6974 		return false;
6975 
6976 	if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
6977 		return false;
6978 
6979 	return num_rates == 1;
6980 }
6981 
6982 static bool
6983 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
6984 				       enum nl80211_band band,
6985 				       const struct cfg80211_bitrate_mask *mask,
6986 				       int *nss)
6987 {
6988 	struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
6989 	u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
6990 	u8 ht_nss_mask = 0;
6991 	u8 vht_nss_mask = 0;
6992 	int i;
6993 
6994 	/* No need to consider legacy here. Basic rates are always present
6995 	 * in bitrate mask
6996 	 */
6997 
6998 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
6999 		if (mask->control[band].ht_mcs[i] == 0)
7000 			continue;
7001 		else if (mask->control[band].ht_mcs[i] ==
7002 			 sband->ht_cap.mcs.rx_mask[i])
7003 			ht_nss_mask |= BIT(i);
7004 		else
7005 			return false;
7006 	}
7007 
7008 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
7009 		if (mask->control[band].vht_mcs[i] == 0)
7010 			continue;
7011 		else if (mask->control[band].vht_mcs[i] ==
7012 			 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
7013 			vht_nss_mask |= BIT(i);
7014 		else
7015 			return false;
7016 	}
7017 
7018 	if (ht_nss_mask != vht_nss_mask)
7019 		return false;
7020 
7021 	if (ht_nss_mask == 0)
7022 		return false;
7023 
7024 	if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
7025 		return false;
7026 
7027 	*nss = fls(ht_nss_mask);
7028 
7029 	return true;
7030 }
7031 
7032 static int
7033 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
7034 				  enum nl80211_band band,
7035 				  const struct cfg80211_bitrate_mask *mask,
7036 				  u32 *rate, u8 *nss)
7037 {
7038 	int rate_idx;
7039 	u16 bitrate;
7040 	u8 preamble;
7041 	u8 hw_rate;
7042 
7043 	if (hweight32(mask->control[band].legacy) != 1)
7044 		return -EINVAL;
7045 
7046 	rate_idx = ffs(mask->control[band].legacy) - 1;
7047 
7048 	if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
7049 		rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
7050 
7051 	hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
7052 	bitrate = ath12k_legacy_rates[rate_idx].bitrate;
7053 
7054 	if (ath12k_mac_bitrate_is_cck(bitrate))
7055 		preamble = WMI_RATE_PREAMBLE_CCK;
7056 	else
7057 		preamble = WMI_RATE_PREAMBLE_OFDM;
7058 
7059 	*nss = 1;
7060 	*rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
7061 
7062 	return 0;
7063 }
7064 
7065 static int ath12k_mac_set_fixed_rate_params(struct ath12k_vif *arvif,
7066 					    u32 rate, u8 nss, u8 sgi, u8 ldpc)
7067 {
7068 	struct ath12k *ar = arvif->ar;
7069 	u32 vdev_param;
7070 	int ret;
7071 
7072 	lockdep_assert_held(&ar->conf_mutex);
7073 
7074 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev %i rate 0x%02x nss %u sgi %u\n",
7075 		   arvif->vdev_id, rate, nss, sgi);
7076 
7077 	vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
7078 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7079 					    vdev_param, rate);
7080 	if (ret) {
7081 		ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
7082 			    rate, ret);
7083 		return ret;
7084 	}
7085 
7086 	vdev_param = WMI_VDEV_PARAM_NSS;
7087 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7088 					    vdev_param, nss);
7089 	if (ret) {
7090 		ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
7091 			    nss, ret);
7092 		return ret;
7093 	}
7094 
7095 	vdev_param = WMI_VDEV_PARAM_SGI;
7096 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7097 					    vdev_param, sgi);
7098 	if (ret) {
7099 		ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
7100 			    sgi, ret);
7101 		return ret;
7102 	}
7103 
7104 	vdev_param = WMI_VDEV_PARAM_LDPC;
7105 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7106 					    vdev_param, ldpc);
7107 	if (ret) {
7108 		ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
7109 			    ldpc, ret);
7110 		return ret;
7111 	}
7112 
7113 	return 0;
7114 }
7115 
7116 static bool
7117 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
7118 				 enum nl80211_band band,
7119 				 const struct cfg80211_bitrate_mask *mask)
7120 {
7121 	int i;
7122 	u16 vht_mcs;
7123 
7124 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
7125 		vht_mcs = mask->control[band].vht_mcs[i];
7126 
7127 		switch (vht_mcs) {
7128 		case 0:
7129 		case BIT(8) - 1:
7130 		case BIT(9) - 1:
7131 		case BIT(10) - 1:
7132 			break;
7133 		default:
7134 			return false;
7135 		}
7136 	}
7137 
7138 	return true;
7139 }
7140 
7141 static void ath12k_mac_set_bitrate_mask_iter(void *data,
7142 					     struct ieee80211_sta *sta)
7143 {
7144 	struct ath12k_vif *arvif = data;
7145 	struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
7146 	struct ath12k *ar = arvif->ar;
7147 
7148 	spin_lock_bh(&ar->data_lock);
7149 	arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
7150 	spin_unlock_bh(&ar->data_lock);
7151 
7152 	ieee80211_queue_work(ath12k_ar_to_hw(ar), &arsta->update_wk);
7153 }
7154 
7155 static void ath12k_mac_disable_peer_fixed_rate(void *data,
7156 					       struct ieee80211_sta *sta)
7157 {
7158 	struct ath12k_vif *arvif = data;
7159 	struct ath12k *ar = arvif->ar;
7160 	int ret;
7161 
7162 	ret = ath12k_wmi_set_peer_param(ar, sta->addr,
7163 					arvif->vdev_id,
7164 					WMI_PEER_PARAM_FIXED_RATE,
7165 					WMI_FIXED_RATE_NONE);
7166 	if (ret)
7167 		ath12k_warn(ar->ab,
7168 			    "failed to disable peer fixed rate for STA %pM ret %d\n",
7169 			    sta->addr, ret);
7170 }
7171 
7172 static int
7173 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
7174 			       struct ieee80211_vif *vif,
7175 			       const struct cfg80211_bitrate_mask *mask)
7176 {
7177 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
7178 	struct cfg80211_chan_def def;
7179 	struct ath12k *ar = arvif->ar;
7180 	enum nl80211_band band;
7181 	const u8 *ht_mcs_mask;
7182 	const u16 *vht_mcs_mask;
7183 	u32 rate;
7184 	u8 nss;
7185 	u8 sgi;
7186 	u8 ldpc;
7187 	int single_nss;
7188 	int ret;
7189 	int num_rates;
7190 
7191 	if (ath12k_mac_vif_chan(vif, &def))
7192 		return -EPERM;
7193 
7194 	band = def.chan->band;
7195 	ht_mcs_mask = mask->control[band].ht_mcs;
7196 	vht_mcs_mask = mask->control[band].vht_mcs;
7197 	ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
7198 
7199 	sgi = mask->control[band].gi;
7200 	if (sgi == NL80211_TXRATE_FORCE_LGI) {
7201 		ret = -EINVAL;
7202 		goto out;
7203 	}
7204 
7205 	/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
7206 	 * requires passing at least one of used basic rates along with them.
7207 	 * Fixed rate setting across different preambles(legacy, HT, VHT) is
7208 	 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
7209 	 * suitable for setting single HT/VHT rates.
7210 	 * But, there could be a single basic rate passed from userspace which
7211 	 * can be done through the FIXED_RATE param.
7212 	 */
7213 	if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
7214 		ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
7215 							&nss);
7216 		if (ret) {
7217 			ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
7218 				    arvif->vdev_id, ret);
7219 			goto out;
7220 		}
7221 		ieee80211_iterate_stations_atomic(hw,
7222 						  ath12k_mac_disable_peer_fixed_rate,
7223 						  arvif);
7224 	} else if (ath12k_mac_bitrate_mask_get_single_nss(ar, band, mask,
7225 							  &single_nss)) {
7226 		rate = WMI_FIXED_RATE_NONE;
7227 		nss = single_nss;
7228 	} else {
7229 		rate = WMI_FIXED_RATE_NONE;
7230 		nss = min_t(u32, ar->num_tx_chains,
7231 			    max(ath12k_mac_max_ht_nss(ht_mcs_mask),
7232 				ath12k_mac_max_vht_nss(vht_mcs_mask)));
7233 
7234 		/* If multiple rates across different preambles are given
7235 		 * we can reconfigure this info with all peers using PEER_ASSOC
7236 		 * command with the below exception cases.
7237 		 * - Single VHT Rate : peer_assoc command accommodates only MCS
7238 		 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
7239 		 * mandates passing basic rates along with HT/VHT rates, FW
7240 		 * doesn't allow switching from VHT to Legacy. Hence instead of
7241 		 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
7242 		 * we could set this VHT rate as peer fixed rate param, which
7243 		 * will override FIXED rate and FW rate control algorithm.
7244 		 * If single VHT rate is passed along with HT rates, we select
7245 		 * the VHT rate as fixed rate for vht peers.
7246 		 * - Multiple VHT Rates : When Multiple VHT rates are given,this
7247 		 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
7248 		 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
7249 		 * RATEMASK_CMDID can cover all use cases of setting rates
7250 		 * across multiple preambles and rates within same type.
7251 		 * But requires more validation of the command at this point.
7252 		 */
7253 
7254 		num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
7255 								  mask);
7256 
7257 		if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
7258 		    num_rates > 1) {
7259 			/* TODO: Handle multiple VHT MCS values setting using
7260 			 * RATEMASK CMD
7261 			 */
7262 			ath12k_warn(ar->ab,
7263 				    "Setting more than one MCS Value in bitrate mask not supported\n");
7264 			ret = -EINVAL;
7265 			goto out;
7266 		}
7267 
7268 		ieee80211_iterate_stations_atomic(hw,
7269 						  ath12k_mac_disable_peer_fixed_rate,
7270 						  arvif);
7271 
7272 		mutex_lock(&ar->conf_mutex);
7273 
7274 		arvif->bitrate_mask = *mask;
7275 		ieee80211_iterate_stations_atomic(hw,
7276 						  ath12k_mac_set_bitrate_mask_iter,
7277 						  arvif);
7278 
7279 		mutex_unlock(&ar->conf_mutex);
7280 	}
7281 
7282 	mutex_lock(&ar->conf_mutex);
7283 
7284 	ret = ath12k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
7285 	if (ret) {
7286 		ath12k_warn(ar->ab, "failed to set fixed rate params on vdev %i: %d\n",
7287 			    arvif->vdev_id, ret);
7288 	}
7289 
7290 	mutex_unlock(&ar->conf_mutex);
7291 
7292 out:
7293 	return ret;
7294 }
7295 
7296 static void
7297 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
7298 				enum ieee80211_reconfig_type reconfig_type)
7299 {
7300 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7301 	struct ath12k *ar;
7302 	struct ath12k_base *ab;
7303 	struct ath12k_vif *arvif;
7304 	int recovery_count;
7305 
7306 	if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
7307 		return;
7308 
7309 	ar = ath12k_ah_to_ar(ah);
7310 	ab = ar->ab;
7311 
7312 	mutex_lock(&ar->conf_mutex);
7313 
7314 	if (ar->state == ATH12K_STATE_RESTARTED) {
7315 		ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
7316 			    ar->pdev->pdev_id);
7317 		ar->state = ATH12K_STATE_ON;
7318 		ieee80211_wake_queues(hw);
7319 
7320 		if (ab->is_reset) {
7321 			recovery_count = atomic_inc_return(&ab->recovery_count);
7322 			ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
7323 				   recovery_count);
7324 			/* When there are multiple radios in an SOC,
7325 			 * the recovery has to be done for each radio
7326 			 */
7327 			if (recovery_count == ab->num_radios) {
7328 				atomic_dec(&ab->reset_count);
7329 				complete(&ab->reset_complete);
7330 				ab->is_reset = false;
7331 				atomic_set(&ab->fail_cont_count, 0);
7332 				ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
7333 			}
7334 		}
7335 
7336 		list_for_each_entry(arvif, &ar->arvifs, list) {
7337 			ath12k_dbg(ab, ATH12K_DBG_BOOT,
7338 				   "reconfig cipher %d up %d vdev type %d\n",
7339 				   arvif->key_cipher,
7340 				   arvif->is_up,
7341 				   arvif->vdev_type);
7342 			/* After trigger disconnect, then upper layer will
7343 			 * trigger connect again, then the PN number of
7344 			 * upper layer will be reset to keep up with AP
7345 			 * side, hence PN number mismatch will not happen.
7346 			 */
7347 			if (arvif->is_up &&
7348 			    arvif->vdev_type == WMI_VDEV_TYPE_STA &&
7349 			    arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
7350 				ieee80211_hw_restart_disconnect(arvif->vif);
7351 				ath12k_dbg(ab, ATH12K_DBG_BOOT,
7352 					   "restart disconnect\n");
7353 			}
7354 		}
7355 	}
7356 
7357 	mutex_unlock(&ar->conf_mutex);
7358 }
7359 
7360 static void
7361 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
7362 				  struct ieee80211_channel *channel)
7363 {
7364 	int ret;
7365 	enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
7366 
7367 	lockdep_assert_held(&ar->conf_mutex);
7368 
7369 	if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
7370 	    ar->rx_channel != channel)
7371 		return;
7372 
7373 	if (ar->scan.state != ATH12K_SCAN_IDLE) {
7374 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7375 			   "ignoring bss chan info req while scanning..\n");
7376 		return;
7377 	}
7378 
7379 	reinit_completion(&ar->bss_survey_done);
7380 
7381 	ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
7382 	if (ret) {
7383 		ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
7384 		return;
7385 	}
7386 
7387 	ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
7388 	if (ret == 0)
7389 		ath12k_warn(ar->ab, "bss channel survey timed out\n");
7390 }
7391 
7392 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
7393 				    struct survey_info *survey)
7394 {
7395 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7396 	struct ath12k *ar;
7397 	struct ieee80211_supported_band *sband;
7398 	struct survey_info *ar_survey;
7399 	int ret = 0;
7400 
7401 	if (idx >= ATH12K_NUM_CHANS)
7402 		return -ENOENT;
7403 
7404 	ar = ath12k_ah_to_ar(ah);
7405 
7406 	ar_survey = &ar->survey[idx];
7407 
7408 	mutex_lock(&ar->conf_mutex);
7409 
7410 	sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
7411 	if (sband && idx >= sband->n_channels) {
7412 		idx -= sband->n_channels;
7413 		sband = NULL;
7414 	}
7415 
7416 	if (!sband)
7417 		sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
7418 
7419 	if (!sband || idx >= sband->n_channels) {
7420 		ret = -ENOENT;
7421 		goto exit;
7422 	}
7423 
7424 	ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
7425 
7426 	spin_lock_bh(&ar->data_lock);
7427 	memcpy(survey, ar_survey, sizeof(*survey));
7428 	spin_unlock_bh(&ar->data_lock);
7429 
7430 	survey->channel = &sband->channels[idx];
7431 
7432 	if (ar->rx_channel == survey->channel)
7433 		survey->filled |= SURVEY_INFO_IN_USE;
7434 
7435 exit:
7436 	mutex_unlock(&ar->conf_mutex);
7437 
7438 	return ret;
7439 }
7440 
7441 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
7442 					 struct ieee80211_vif *vif,
7443 					 struct ieee80211_sta *sta,
7444 					 struct station_info *sinfo)
7445 {
7446 	struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
7447 
7448 	sinfo->rx_duration = arsta->rx_duration;
7449 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
7450 
7451 	sinfo->tx_duration = arsta->tx_duration;
7452 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
7453 
7454 	if (!arsta->txrate.legacy && !arsta->txrate.nss)
7455 		return;
7456 
7457 	if (arsta->txrate.legacy) {
7458 		sinfo->txrate.legacy = arsta->txrate.legacy;
7459 	} else {
7460 		sinfo->txrate.mcs = arsta->txrate.mcs;
7461 		sinfo->txrate.nss = arsta->txrate.nss;
7462 		sinfo->txrate.bw = arsta->txrate.bw;
7463 		sinfo->txrate.he_gi = arsta->txrate.he_gi;
7464 		sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
7465 		sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
7466 	}
7467 	sinfo->txrate.flags = arsta->txrate.flags;
7468 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
7469 
7470 	/* TODO: Use real NF instead of default one. */
7471 	sinfo->signal = arsta->rssi_comb + ATH12K_DEFAULT_NOISE_FLOOR;
7472 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
7473 }
7474 
7475 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
7476 						  struct ieee80211_vif *vif)
7477 {
7478 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7479 	struct ath12k *ar;
7480 
7481 	ar = ath12k_ah_to_ar(ah);
7482 
7483 	mutex_lock(&ar->conf_mutex);
7484 
7485 	spin_lock_bh(&ar->data_lock);
7486 	ar->scan.roc_notify = false;
7487 	spin_unlock_bh(&ar->data_lock);
7488 
7489 	ath12k_scan_abort(ar);
7490 
7491 	mutex_unlock(&ar->conf_mutex);
7492 
7493 	cancel_delayed_work_sync(&ar->scan.timeout);
7494 
7495 	return 0;
7496 }
7497 
7498 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
7499 					   struct ieee80211_vif *vif,
7500 					   struct ieee80211_channel *chan,
7501 					   int duration,
7502 					   enum ieee80211_roc_type type)
7503 {
7504 	struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
7505 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7506 	struct ath12k_wmi_scan_req_arg arg;
7507 	struct ath12k *ar;
7508 	u32 scan_time_msec;
7509 	int ret;
7510 
7511 	ar = ath12k_ah_to_ar(ah);
7512 
7513 	mutex_lock(&ar->conf_mutex);
7514 	spin_lock_bh(&ar->data_lock);
7515 
7516 	switch (ar->scan.state) {
7517 	case ATH12K_SCAN_IDLE:
7518 		reinit_completion(&ar->scan.started);
7519 		reinit_completion(&ar->scan.completed);
7520 		reinit_completion(&ar->scan.on_channel);
7521 		ar->scan.state = ATH12K_SCAN_STARTING;
7522 		ar->scan.is_roc = true;
7523 		ar->scan.vdev_id = arvif->vdev_id;
7524 		ar->scan.roc_freq = chan->center_freq;
7525 		ar->scan.roc_notify = true;
7526 		ret = 0;
7527 		break;
7528 	case ATH12K_SCAN_STARTING:
7529 	case ATH12K_SCAN_RUNNING:
7530 	case ATH12K_SCAN_ABORTING:
7531 		ret = -EBUSY;
7532 		break;
7533 	}
7534 
7535 	spin_unlock_bh(&ar->data_lock);
7536 
7537 	if (ret)
7538 		goto exit;
7539 
7540 	scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
7541 
7542 	memset(&arg, 0, sizeof(arg));
7543 	ath12k_wmi_start_scan_init(ar, &arg);
7544 	arg.num_chan = 1;
7545 	arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
7546 				GFP_KERNEL);
7547 	if (!arg.chan_list) {
7548 		ret = -ENOMEM;
7549 		goto exit;
7550 	}
7551 
7552 	arg.vdev_id = arvif->vdev_id;
7553 	arg.scan_id = ATH12K_SCAN_ID;
7554 	arg.chan_list[0] = chan->center_freq;
7555 	arg.dwell_time_active = scan_time_msec;
7556 	arg.dwell_time_passive = scan_time_msec;
7557 	arg.max_scan_time = scan_time_msec;
7558 	arg.scan_f_passive = 1;
7559 	arg.burst_duration = duration;
7560 
7561 	ret = ath12k_start_scan(ar, &arg);
7562 	if (ret) {
7563 		ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
7564 
7565 		spin_lock_bh(&ar->data_lock);
7566 		ar->scan.state = ATH12K_SCAN_IDLE;
7567 		spin_unlock_bh(&ar->data_lock);
7568 		goto free_chan_list;
7569 	}
7570 
7571 	ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
7572 	if (ret == 0) {
7573 		ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
7574 		ret = ath12k_scan_stop(ar);
7575 		if (ret)
7576 			ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
7577 		ret = -ETIMEDOUT;
7578 		goto free_chan_list;
7579 	}
7580 
7581 	ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
7582 				     msecs_to_jiffies(duration));
7583 
7584 	ret = 0;
7585 
7586 free_chan_list:
7587 	kfree(arg.chan_list);
7588 exit:
7589 	mutex_unlock(&ar->conf_mutex);
7590 
7591 	return ret;
7592 }
7593 
7594 static const struct ieee80211_ops ath12k_ops = {
7595 	.tx				= ath12k_mac_op_tx,
7596 	.wake_tx_queue			= ieee80211_handle_wake_tx_queue,
7597 	.start                          = ath12k_mac_op_start,
7598 	.stop                           = ath12k_mac_op_stop,
7599 	.reconfig_complete              = ath12k_mac_op_reconfig_complete,
7600 	.add_interface                  = ath12k_mac_op_add_interface,
7601 	.remove_interface		= ath12k_mac_op_remove_interface,
7602 	.update_vif_offload		= ath12k_mac_op_update_vif_offload,
7603 	.config                         = ath12k_mac_op_config,
7604 	.bss_info_changed               = ath12k_mac_op_bss_info_changed,
7605 	.configure_filter		= ath12k_mac_op_configure_filter,
7606 	.hw_scan                        = ath12k_mac_op_hw_scan,
7607 	.cancel_hw_scan                 = ath12k_mac_op_cancel_hw_scan,
7608 	.set_key                        = ath12k_mac_op_set_key,
7609 	.sta_state                      = ath12k_mac_op_sta_state,
7610 	.sta_set_txpwr			= ath12k_mac_op_sta_set_txpwr,
7611 	.sta_rc_update			= ath12k_mac_op_sta_rc_update,
7612 	.conf_tx                        = ath12k_mac_op_conf_tx,
7613 	.set_antenna			= ath12k_mac_op_set_antenna,
7614 	.get_antenna			= ath12k_mac_op_get_antenna,
7615 	.ampdu_action			= ath12k_mac_op_ampdu_action,
7616 	.add_chanctx			= ath12k_mac_op_add_chanctx,
7617 	.remove_chanctx			= ath12k_mac_op_remove_chanctx,
7618 	.change_chanctx			= ath12k_mac_op_change_chanctx,
7619 	.assign_vif_chanctx		= ath12k_mac_op_assign_vif_chanctx,
7620 	.unassign_vif_chanctx		= ath12k_mac_op_unassign_vif_chanctx,
7621 	.switch_vif_chanctx		= ath12k_mac_op_switch_vif_chanctx,
7622 	.set_rts_threshold		= ath12k_mac_op_set_rts_threshold,
7623 	.set_frag_threshold		= ath12k_mac_op_set_frag_threshold,
7624 	.set_bitrate_mask		= ath12k_mac_op_set_bitrate_mask,
7625 	.get_survey			= ath12k_mac_op_get_survey,
7626 	.flush				= ath12k_mac_op_flush,
7627 	.sta_statistics			= ath12k_mac_op_sta_statistics,
7628 	.remain_on_channel              = ath12k_mac_op_remain_on_channel,
7629 	.cancel_remain_on_channel       = ath12k_mac_op_cancel_remain_on_channel,
7630 };
7631 
7632 static void ath12k_mac_update_ch_list(struct ath12k *ar,
7633 				      struct ieee80211_supported_band *band,
7634 				      u32 freq_low, u32 freq_high)
7635 {
7636 	int i;
7637 
7638 	if (!(freq_low && freq_high))
7639 		return;
7640 
7641 	for (i = 0; i < band->n_channels; i++) {
7642 		if (band->channels[i].center_freq < freq_low ||
7643 		    band->channels[i].center_freq > freq_high)
7644 			band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
7645 	}
7646 }
7647 
7648 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
7649 {
7650 	struct ath12k_pdev *pdev = ar->pdev;
7651 	struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
7652 
7653 	if (band == WMI_HOST_WLAN_2G_CAP)
7654 		return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
7655 
7656 	if (band == WMI_HOST_WLAN_5G_CAP)
7657 		return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
7658 
7659 	ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
7660 
7661 	return 0;
7662 }
7663 
7664 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
7665 					   u32 supported_bands,
7666 					   struct ieee80211_supported_band *bands[])
7667 {
7668 	struct ieee80211_supported_band *band;
7669 	struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
7670 	void *channels;
7671 	u32 phy_id;
7672 
7673 	BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
7674 		      ARRAY_SIZE(ath12k_5ghz_channels) +
7675 		      ARRAY_SIZE(ath12k_6ghz_channels)) !=
7676 		     ATH12K_NUM_CHANS);
7677 
7678 	reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
7679 
7680 	if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
7681 		channels = kmemdup(ath12k_2ghz_channels,
7682 				   sizeof(ath12k_2ghz_channels),
7683 				   GFP_KERNEL);
7684 		if (!channels)
7685 			return -ENOMEM;
7686 
7687 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7688 		band->band = NL80211_BAND_2GHZ;
7689 		band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
7690 		band->channels = channels;
7691 		band->n_bitrates = ath12k_g_rates_size;
7692 		band->bitrates = ath12k_g_rates;
7693 		bands[NL80211_BAND_2GHZ] = band;
7694 
7695 		if (ar->ab->hw_params->single_pdev_only) {
7696 			phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
7697 			reg_cap = &ar->ab->hal_reg_cap[phy_id];
7698 		}
7699 		ath12k_mac_update_ch_list(ar, band,
7700 					  reg_cap->low_2ghz_chan,
7701 					  reg_cap->high_2ghz_chan);
7702 	}
7703 
7704 	if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
7705 		if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6G_FREQ) {
7706 			channels = kmemdup(ath12k_6ghz_channels,
7707 					   sizeof(ath12k_6ghz_channels), GFP_KERNEL);
7708 			if (!channels) {
7709 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7710 				return -ENOMEM;
7711 			}
7712 
7713 			ar->supports_6ghz = true;
7714 			band = &ar->mac.sbands[NL80211_BAND_6GHZ];
7715 			band->band = NL80211_BAND_6GHZ;
7716 			band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
7717 			band->channels = channels;
7718 			band->n_bitrates = ath12k_a_rates_size;
7719 			band->bitrates = ath12k_a_rates;
7720 			bands[NL80211_BAND_6GHZ] = band;
7721 			ath12k_mac_update_ch_list(ar, band,
7722 						  reg_cap->low_5ghz_chan,
7723 						  reg_cap->high_5ghz_chan);
7724 		}
7725 
7726 		if (reg_cap->low_5ghz_chan < ATH12K_MIN_6G_FREQ) {
7727 			channels = kmemdup(ath12k_5ghz_channels,
7728 					   sizeof(ath12k_5ghz_channels),
7729 					   GFP_KERNEL);
7730 			if (!channels) {
7731 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7732 				kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7733 				return -ENOMEM;
7734 			}
7735 
7736 			band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7737 			band->band = NL80211_BAND_5GHZ;
7738 			band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
7739 			band->channels = channels;
7740 			band->n_bitrates = ath12k_a_rates_size;
7741 			band->bitrates = ath12k_a_rates;
7742 			bands[NL80211_BAND_5GHZ] = band;
7743 
7744 			if (ar->ab->hw_params->single_pdev_only) {
7745 				phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
7746 				reg_cap = &ar->ab->hal_reg_cap[phy_id];
7747 			}
7748 
7749 			ath12k_mac_update_ch_list(ar, band,
7750 						  reg_cap->low_5ghz_chan,
7751 						  reg_cap->high_5ghz_chan);
7752 		}
7753 	}
7754 
7755 	return 0;
7756 }
7757 
7758 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
7759 {
7760 	struct ath12k *ar = ath12k_ah_to_ar(ah);
7761 	u16 interface_modes = U16_MAX;
7762 
7763 	interface_modes &= ar->ab->hw_params->interface_modes;
7764 
7765 	return interface_modes == U16_MAX ? 0 : interface_modes;
7766 }
7767 
7768 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
7769 					    enum nl80211_iftype type)
7770 {
7771 	struct ath12k *ar = ath12k_ah_to_ar(ah);
7772 	u16 interface_modes, mode;
7773 	bool is_enable = true;
7774 
7775 	mode = BIT(type);
7776 
7777 	interface_modes = ar->ab->hw_params->interface_modes;
7778 	if (!(interface_modes & mode))
7779 		is_enable = false;
7780 
7781 	return is_enable;
7782 }
7783 
7784 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
7785 {
7786 	struct wiphy *wiphy = ah->hw->wiphy;
7787 	struct ieee80211_iface_combination *combinations;
7788 	struct ieee80211_iface_limit *limits;
7789 	int n_limits, max_interfaces;
7790 	bool ap, mesh, p2p;
7791 
7792 	ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
7793 	p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
7794 
7795 	mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
7796 		ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
7797 
7798 	combinations = kzalloc(sizeof(*combinations), GFP_KERNEL);
7799 	if (!combinations)
7800 		return -ENOMEM;
7801 
7802 	if ((ap || mesh) && !p2p) {
7803 		n_limits = 2;
7804 		max_interfaces = 16;
7805 	} else if (p2p) {
7806 		n_limits = 3;
7807 		if (ap || mesh)
7808 			max_interfaces = 16;
7809 		else
7810 			max_interfaces = 3;
7811 	} else {
7812 		n_limits = 1;
7813 		max_interfaces = 1;
7814 	}
7815 
7816 	limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
7817 	if (!limits) {
7818 		kfree(combinations);
7819 		return -ENOMEM;
7820 	}
7821 
7822 	limits[0].max = 1;
7823 	limits[0].types |= BIT(NL80211_IFTYPE_STATION);
7824 
7825 	if (ap || mesh || p2p)
7826 		limits[1].max = max_interfaces;
7827 
7828 	if (ap)
7829 		limits[1].types |= BIT(NL80211_IFTYPE_AP);
7830 
7831 	if (mesh)
7832 		limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
7833 
7834 	if (p2p) {
7835 		limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
7836 				   BIT(NL80211_IFTYPE_P2P_GO);
7837 		limits[2].max = 1;
7838 		limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
7839 	}
7840 
7841 	combinations[0].limits = limits;
7842 	combinations[0].n_limits = n_limits;
7843 	combinations[0].max_interfaces = max_interfaces;
7844 	combinations[0].num_different_channels = 1;
7845 	combinations[0].beacon_int_infra_match = true;
7846 	combinations[0].beacon_int_min_gcd = 100;
7847 	combinations[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
7848 						BIT(NL80211_CHAN_WIDTH_20) |
7849 						BIT(NL80211_CHAN_WIDTH_40) |
7850 						BIT(NL80211_CHAN_WIDTH_80);
7851 
7852 	wiphy->iface_combinations = combinations;
7853 	wiphy->n_iface_combinations = 1;
7854 
7855 	return 0;
7856 }
7857 
7858 static const u8 ath12k_if_types_ext_capa[] = {
7859 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7860 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7861 };
7862 
7863 static const u8 ath12k_if_types_ext_capa_sta[] = {
7864 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7865 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7866 	[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
7867 };
7868 
7869 static const u8 ath12k_if_types_ext_capa_ap[] = {
7870 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
7871 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
7872 	[9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
7873 };
7874 
7875 static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
7876 	{
7877 		.extended_capabilities = ath12k_if_types_ext_capa,
7878 		.extended_capabilities_mask = ath12k_if_types_ext_capa,
7879 		.extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
7880 	}, {
7881 		.iftype = NL80211_IFTYPE_STATION,
7882 		.extended_capabilities = ath12k_if_types_ext_capa_sta,
7883 		.extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
7884 		.extended_capabilities_len =
7885 				sizeof(ath12k_if_types_ext_capa_sta),
7886 	}, {
7887 		.iftype = NL80211_IFTYPE_AP,
7888 		.extended_capabilities = ath12k_if_types_ext_capa_ap,
7889 		.extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
7890 		.extended_capabilities_len =
7891 				sizeof(ath12k_if_types_ext_capa_ap),
7892 	},
7893 };
7894 
7895 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
7896 {
7897 	idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
7898 	idr_destroy(&ar->txmgmt_idr);
7899 
7900 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
7901 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
7902 	kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
7903 }
7904 
7905 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
7906 {
7907 	struct ieee80211_hw *hw = ah->hw;
7908 	struct wiphy *wiphy = hw->wiphy;
7909 	struct ath12k *ar = ath12k_ah_to_ar(ah);
7910 
7911 	cancel_work_sync(&ar->regd_update_work);
7912 
7913 	ieee80211_unregister_hw(hw);
7914 
7915 	ath12k_mac_cleanup_unregister(ar);
7916 
7917 	kfree(wiphy->iface_combinations[0].limits);
7918 	kfree(wiphy->iface_combinations);
7919 
7920 	SET_IEEE80211_DEV(hw, NULL);
7921 }
7922 
7923 static int ath12k_mac_setup_register(struct ath12k *ar,
7924 				     u32 *ht_cap,
7925 				     struct ieee80211_supported_band *bands[])
7926 {
7927 	struct ath12k_pdev_cap *cap = &ar->pdev->cap;
7928 	int ret;
7929 
7930 	init_waitqueue_head(&ar->txmgmt_empty_waitq);
7931 	idr_init(&ar->txmgmt_idr);
7932 	spin_lock_init(&ar->txmgmt_idr_lock);
7933 
7934 	ath12k_pdev_caps_update(ar);
7935 
7936 	ret = ath12k_mac_setup_channels_rates(ar,
7937 					      cap->supported_bands,
7938 					      bands);
7939 	if (ret)
7940 		return ret;
7941 
7942 	ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
7943 	ath12k_mac_setup_sband_iftype_data(ar, cap);
7944 
7945 	ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
7946 	ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
7947 
7948 	return 0;
7949 }
7950 
7951 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
7952 {
7953 	struct ieee80211_hw *hw = ah->hw;
7954 	struct wiphy *wiphy = hw->wiphy;
7955 	struct ath12k *ar = ath12k_ah_to_ar(ah);
7956 	struct ath12k_base *ab = ar->ab;
7957 	struct ath12k_pdev *pdev;
7958 	struct ath12k_pdev_cap *cap;
7959 	static const u32 cipher_suites[] = {
7960 		WLAN_CIPHER_SUITE_TKIP,
7961 		WLAN_CIPHER_SUITE_CCMP,
7962 		WLAN_CIPHER_SUITE_AES_CMAC,
7963 		WLAN_CIPHER_SUITE_BIP_CMAC_256,
7964 		WLAN_CIPHER_SUITE_BIP_GMAC_128,
7965 		WLAN_CIPHER_SUITE_BIP_GMAC_256,
7966 		WLAN_CIPHER_SUITE_GCMP,
7967 		WLAN_CIPHER_SUITE_GCMP_256,
7968 		WLAN_CIPHER_SUITE_CCMP_256,
7969 	};
7970 	int ret;
7971 	u32 ht_cap = 0;
7972 
7973 	pdev = ar->pdev;
7974 
7975 	if (ab->pdevs_macaddr_valid)
7976 		ether_addr_copy(ar->mac_addr, pdev->mac_addr);
7977 	else
7978 		ether_addr_copy(ar->mac_addr, ab->mac_addr);
7979 
7980 	ret = ath12k_mac_setup_register(ar, &ht_cap, hw->wiphy->bands);
7981 	if (ret)
7982 		goto out;
7983 
7984 	wiphy->max_ap_assoc_sta = ar->max_num_stations;
7985 
7986 	cap = &pdev->cap;
7987 
7988 	wiphy->available_antennas_rx = cap->rx_chain_mask;
7989 	wiphy->available_antennas_tx = cap->tx_chain_mask;
7990 
7991 	SET_IEEE80211_PERM_ADDR(hw, ar->mac_addr);
7992 	SET_IEEE80211_DEV(hw, ab->dev);
7993 
7994 	ret = ath12k_mac_setup_iface_combinations(ah);
7995 	if (ret) {
7996 		ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
7997 		goto err_cleanup_unregister;
7998 	}
7999 
8000 	wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
8001 
8002 	if (wiphy->bands[NL80211_BAND_2GHZ] &&
8003 	    wiphy->bands[NL80211_BAND_5GHZ] &&
8004 	    wiphy->bands[NL80211_BAND_6GHZ])
8005 		ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
8006 
8007 	ieee80211_hw_set(hw, SIGNAL_DBM);
8008 	ieee80211_hw_set(hw, SUPPORTS_PS);
8009 	ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
8010 	ieee80211_hw_set(hw, MFP_CAPABLE);
8011 	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
8012 	ieee80211_hw_set(hw, HAS_RATE_CONTROL);
8013 	ieee80211_hw_set(hw, AP_LINK_PS);
8014 	ieee80211_hw_set(hw, SPECTRUM_MGMT);
8015 	ieee80211_hw_set(hw, CONNECTION_MONITOR);
8016 	ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
8017 	ieee80211_hw_set(hw, CHANCTX_STA_CSA);
8018 	ieee80211_hw_set(hw, QUEUE_CONTROL);
8019 	ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
8020 	ieee80211_hw_set(hw, REPORTS_LOW_ACK);
8021 
8022 	if (ht_cap & WMI_HT_CAP_ENABLED) {
8023 		ieee80211_hw_set(hw, AMPDU_AGGREGATION);
8024 		ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
8025 		ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
8026 		ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
8027 		ieee80211_hw_set(hw, USES_RSS);
8028 	}
8029 
8030 	wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
8031 	wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
8032 
8033 	/* TODO: Check if HT capability advertised from firmware is different
8034 	 * for each band for a dual band capable radio. It will be tricky to
8035 	 * handle it when the ht capability different for each band.
8036 	 */
8037 	if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS)
8038 		wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
8039 
8040 	wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
8041 	wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
8042 
8043 	hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
8044 
8045 	wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
8046 	wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
8047 	wiphy->max_remain_on_channel_duration = 5000;
8048 
8049 	wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
8050 	wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
8051 				   NL80211_FEATURE_AP_SCAN;
8052 
8053 	hw->queues = ATH12K_HW_MAX_QUEUES;
8054 	wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
8055 	hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
8056 	hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
8057 
8058 	hw->vif_data_size = sizeof(struct ath12k_vif);
8059 	hw->sta_data_size = sizeof(struct ath12k_sta);
8060 
8061 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
8062 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
8063 
8064 	wiphy->cipher_suites = cipher_suites;
8065 	wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
8066 
8067 	wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
8068 	wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
8069 
8070 	if (ar->supports_6ghz) {
8071 		wiphy_ext_feature_set(wiphy,
8072 				      NL80211_EXT_FEATURE_FILS_DISCOVERY);
8073 		wiphy_ext_feature_set(wiphy,
8074 				      NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
8075 	}
8076 
8077 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
8078 
8079 	ath12k_reg_init(hw);
8080 
8081 	if (!test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags)) {
8082 		hw->netdev_features = NETIF_F_HW_CSUM;
8083 		ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
8084 		ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
8085 	}
8086 
8087 	ret = ieee80211_register_hw(hw);
8088 	if (ret) {
8089 		ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
8090 		goto err_free_if_combs;
8091 	}
8092 
8093 	if (!ab->hw_params->supports_monitor)
8094 		/* There's a race between calling ieee80211_register_hw()
8095 		 * and here where the monitor mode is enabled for a little
8096 		 * while. But that time is so short and in practise it make
8097 		 * a difference in real life.
8098 		 */
8099 		wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
8100 
8101 	/* Apply the regd received during initialization */
8102 	ret = ath12k_regd_update(ar, true);
8103 	if (ret) {
8104 		ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
8105 		goto err_unregister_hw;
8106 	}
8107 
8108 	return 0;
8109 
8110 err_unregister_hw:
8111 	ieee80211_unregister_hw(hw);
8112 
8113 err_free_if_combs:
8114 	kfree(wiphy->iface_combinations[0].limits);
8115 	kfree(wiphy->iface_combinations);
8116 
8117 err_cleanup_unregister:
8118 	ath12k_mac_cleanup_unregister(ar);
8119 
8120 out:
8121 	SET_IEEE80211_DEV(hw, NULL);
8122 
8123 	return ret;
8124 }
8125 
8126 static void ath12k_mac_setup(struct ath12k *ar)
8127 {
8128 	struct ath12k_base *ab = ar->ab;
8129 	struct ath12k_pdev *pdev = ar->pdev;
8130 	u8 pdev_idx = ar->pdev_idx;
8131 
8132 	ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
8133 
8134 	ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
8135 	/* FIXME: wmi[0] is already initialized during attach,
8136 	 * Should we do this again?
8137 	 */
8138 	ath12k_wmi_pdev_attach(ab, pdev_idx);
8139 
8140 	ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
8141 	ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
8142 	ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
8143 	ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
8144 
8145 	spin_lock_init(&ar->data_lock);
8146 	INIT_LIST_HEAD(&ar->arvifs);
8147 	INIT_LIST_HEAD(&ar->ppdu_stats_info);
8148 	mutex_init(&ar->conf_mutex);
8149 	init_completion(&ar->vdev_setup_done);
8150 	init_completion(&ar->vdev_delete_done);
8151 	init_completion(&ar->peer_assoc_done);
8152 	init_completion(&ar->peer_delete_done);
8153 	init_completion(&ar->install_key_done);
8154 	init_completion(&ar->bss_survey_done);
8155 	init_completion(&ar->scan.started);
8156 	init_completion(&ar->scan.completed);
8157 	init_completion(&ar->scan.on_channel);
8158 
8159 	INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
8160 	INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
8161 
8162 	INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
8163 	skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
8164 	clear_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags);
8165 }
8166 
8167 int ath12k_mac_register(struct ath12k_base *ab)
8168 {
8169 	struct ath12k_hw *ah;
8170 	int i;
8171 	int ret;
8172 
8173 	if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
8174 		return 0;
8175 
8176 	/* Initialize channel counters frequency value in hertz */
8177 	ab->cc_freq_hz = 320000;
8178 	ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
8179 
8180 	for (i = 0; i < ab->num_hw; i++) {
8181 		ah = ab->ah[i];
8182 
8183 		ret = ath12k_mac_hw_register(ah);
8184 		if (ret)
8185 			goto err;
8186 	}
8187 
8188 	return 0;
8189 
8190 err:
8191 	for (i = i - 1; i >= 0; i--) {
8192 		ah = ab->ah[i];
8193 		if (!ah)
8194 			continue;
8195 
8196 		ath12k_mac_hw_unregister(ah);
8197 	}
8198 
8199 	return ret;
8200 }
8201 
8202 void ath12k_mac_unregister(struct ath12k_base *ab)
8203 {
8204 	struct ath12k_hw *ah;
8205 	int i;
8206 
8207 	for (i = ab->num_hw - 1; i >= 0; i--) {
8208 		ah = ab->ah[i];
8209 		if (!ah)
8210 			continue;
8211 
8212 		ath12k_mac_hw_unregister(ah);
8213 	}
8214 }
8215 
8216 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
8217 {
8218 	ieee80211_free_hw(ah->hw);
8219 }
8220 
8221 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_base *ab,
8222 						struct ath12k_pdev_map *pdev_map,
8223 						u8 num_pdev_map)
8224 {
8225 	struct ieee80211_hw *hw;
8226 	struct ath12k *ar;
8227 	struct ath12k_pdev *pdev;
8228 	struct ath12k_hw *ah;
8229 	int i;
8230 	u8 pdev_idx;
8231 
8232 	hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
8233 				&ath12k_ops);
8234 	if (!hw)
8235 		return NULL;
8236 
8237 	ah = ath12k_hw_to_ah(hw);
8238 	ah->hw = hw;
8239 	ah->num_radio = num_pdev_map;
8240 
8241 	for (i = 0; i < num_pdev_map; i++) {
8242 		ab = pdev_map[i].ab;
8243 		pdev_idx = pdev_map[i].pdev_idx;
8244 		pdev = &ab->pdevs[pdev_idx];
8245 
8246 		ar = ath12k_ah_to_ar(ah);
8247 		ar->ah = ah;
8248 		ar->ab = ab;
8249 		ar->hw_link_id = i;
8250 		ar->pdev = pdev;
8251 		ar->pdev_idx = pdev_idx;
8252 		pdev->ar = ar;
8253 
8254 		ath12k_mac_setup(ar);
8255 	}
8256 
8257 	return ah;
8258 }
8259 
8260 void ath12k_mac_destroy(struct ath12k_base *ab)
8261 {
8262 	struct ath12k_pdev *pdev;
8263 	int i;
8264 
8265 	for (i = 0; i < ab->num_radios; i++) {
8266 		pdev = &ab->pdevs[i];
8267 		if (!pdev->ar)
8268 			continue;
8269 
8270 		pdev->ar = NULL;
8271 	}
8272 
8273 	for (i = 0; i < ab->num_hw; i++) {
8274 		if (!ab->ah[i])
8275 			continue;
8276 
8277 		ath12k_mac_hw_destroy(ab->ah[i]);
8278 		ab->ah[i] = NULL;
8279 	}
8280 }
8281 
8282 int ath12k_mac_allocate(struct ath12k_base *ab)
8283 {
8284 	struct ath12k_hw *ah;
8285 	struct ath12k_pdev_map pdev_map[MAX_RADIOS];
8286 	int ret, i, j;
8287 	u8 radio_per_hw;
8288 
8289 	if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))
8290 		return 0;
8291 
8292 	ab->num_hw = ab->num_radios;
8293 	radio_per_hw = 1;
8294 
8295 	for (i = 0; i < ab->num_hw; i++) {
8296 		for (j = 0; j < radio_per_hw; j++) {
8297 			pdev_map[j].ab = ab;
8298 			pdev_map[j].pdev_idx = (i * radio_per_hw) + j;
8299 		}
8300 
8301 		ah = ath12k_mac_hw_allocate(ab, pdev_map, radio_per_hw);
8302 		if (!ah) {
8303 			ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
8304 				    i);
8305 			ret = -ENOMEM;
8306 			goto err;
8307 		}
8308 
8309 		ab->ah[i] = ah;
8310 	}
8311 
8312 	ath12k_dp_pdev_pre_alloc(ab);
8313 
8314 	return 0;
8315 
8316 err:
8317 	for (i = i - 1; i >= 0; i--) {
8318 		if (!ab->ah[i])
8319 			continue;
8320 
8321 		ath12k_mac_hw_destroy(ab->ah[i]);
8322 		ab->ah[i] = NULL;
8323 	}
8324 
8325 	return ret;
8326 }
8327