xref: /linux/drivers/net/wireless/ath/ath12k/mac.c (revision 72c181399b01bb4836d1fabaa9f5f6438c82178e)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5  */
6 
7 #include <net/mac80211.h>
8 #include <net/cfg80211.h>
9 #include <linux/etherdevice.h>
10 
11 #include "mac.h"
12 #include "core.h"
13 #include "debug.h"
14 #include "wmi.h"
15 #include "hw.h"
16 #include "dp_tx.h"
17 #include "dp_rx.h"
18 #include "testmode.h"
19 #include "peer.h"
20 #include "debugfs.h"
21 #include "hif.h"
22 #include "wow.h"
23 #include "debugfs_sta.h"
24 
25 #define CHAN2G(_channel, _freq, _flags) { \
26 	.band                   = NL80211_BAND_2GHZ, \
27 	.hw_value               = (_channel), \
28 	.center_freq            = (_freq), \
29 	.flags                  = (_flags), \
30 	.max_antenna_gain       = 0, \
31 	.max_power              = 30, \
32 }
33 
34 #define CHAN5G(_channel, _freq, _flags) { \
35 	.band                   = NL80211_BAND_5GHZ, \
36 	.hw_value               = (_channel), \
37 	.center_freq            = (_freq), \
38 	.flags                  = (_flags), \
39 	.max_antenna_gain       = 0, \
40 	.max_power              = 30, \
41 }
42 
43 #define CHAN6G(_channel, _freq, _flags) { \
44 	.band                   = NL80211_BAND_6GHZ, \
45 	.hw_value               = (_channel), \
46 	.center_freq            = (_freq), \
47 	.flags                  = (_flags), \
48 	.max_antenna_gain       = 0, \
49 	.max_power              = 30, \
50 }
51 
52 static const struct ieee80211_channel ath12k_2ghz_channels[] = {
53 	CHAN2G(1, 2412, 0),
54 	CHAN2G(2, 2417, 0),
55 	CHAN2G(3, 2422, 0),
56 	CHAN2G(4, 2427, 0),
57 	CHAN2G(5, 2432, 0),
58 	CHAN2G(6, 2437, 0),
59 	CHAN2G(7, 2442, 0),
60 	CHAN2G(8, 2447, 0),
61 	CHAN2G(9, 2452, 0),
62 	CHAN2G(10, 2457, 0),
63 	CHAN2G(11, 2462, 0),
64 	CHAN2G(12, 2467, 0),
65 	CHAN2G(13, 2472, 0),
66 	CHAN2G(14, 2484, 0),
67 };
68 
69 static const struct ieee80211_channel ath12k_5ghz_channels[] = {
70 	CHAN5G(36, 5180, 0),
71 	CHAN5G(40, 5200, 0),
72 	CHAN5G(44, 5220, 0),
73 	CHAN5G(48, 5240, 0),
74 	CHAN5G(52, 5260, 0),
75 	CHAN5G(56, 5280, 0),
76 	CHAN5G(60, 5300, 0),
77 	CHAN5G(64, 5320, 0),
78 	CHAN5G(100, 5500, 0),
79 	CHAN5G(104, 5520, 0),
80 	CHAN5G(108, 5540, 0),
81 	CHAN5G(112, 5560, 0),
82 	CHAN5G(116, 5580, 0),
83 	CHAN5G(120, 5600, 0),
84 	CHAN5G(124, 5620, 0),
85 	CHAN5G(128, 5640, 0),
86 	CHAN5G(132, 5660, 0),
87 	CHAN5G(136, 5680, 0),
88 	CHAN5G(140, 5700, 0),
89 	CHAN5G(144, 5720, 0),
90 	CHAN5G(149, 5745, 0),
91 	CHAN5G(153, 5765, 0),
92 	CHAN5G(157, 5785, 0),
93 	CHAN5G(161, 5805, 0),
94 	CHAN5G(165, 5825, 0),
95 	CHAN5G(169, 5845, 0),
96 	CHAN5G(173, 5865, 0),
97 };
98 
99 static const struct ieee80211_channel ath12k_6ghz_channels[] = {
100 	/* Operating Class 136 */
101 	CHAN6G(2, 5935, 0),
102 
103 	/* Operating Classes 131-135 */
104 	CHAN6G(1, 5955, 0),
105 	CHAN6G(5, 5975, 0),
106 	CHAN6G(9, 5995, 0),
107 	CHAN6G(13, 6015, 0),
108 	CHAN6G(17, 6035, 0),
109 	CHAN6G(21, 6055, 0),
110 	CHAN6G(25, 6075, 0),
111 	CHAN6G(29, 6095, 0),
112 	CHAN6G(33, 6115, 0),
113 	CHAN6G(37, 6135, 0),
114 	CHAN6G(41, 6155, 0),
115 	CHAN6G(45, 6175, 0),
116 	CHAN6G(49, 6195, 0),
117 	CHAN6G(53, 6215, 0),
118 	CHAN6G(57, 6235, 0),
119 	CHAN6G(61, 6255, 0),
120 	CHAN6G(65, 6275, 0),
121 	CHAN6G(69, 6295, 0),
122 	CHAN6G(73, 6315, 0),
123 	CHAN6G(77, 6335, 0),
124 	CHAN6G(81, 6355, 0),
125 	CHAN6G(85, 6375, 0),
126 	CHAN6G(89, 6395, 0),
127 	CHAN6G(93, 6415, 0),
128 	CHAN6G(97, 6435, 0),
129 	CHAN6G(101, 6455, 0),
130 	CHAN6G(105, 6475, 0),
131 	CHAN6G(109, 6495, 0),
132 	CHAN6G(113, 6515, 0),
133 	CHAN6G(117, 6535, 0),
134 	CHAN6G(121, 6555, 0),
135 	CHAN6G(125, 6575, 0),
136 	CHAN6G(129, 6595, 0),
137 	CHAN6G(133, 6615, 0),
138 	CHAN6G(137, 6635, 0),
139 	CHAN6G(141, 6655, 0),
140 	CHAN6G(145, 6675, 0),
141 	CHAN6G(149, 6695, 0),
142 	CHAN6G(153, 6715, 0),
143 	CHAN6G(157, 6735, 0),
144 	CHAN6G(161, 6755, 0),
145 	CHAN6G(165, 6775, 0),
146 	CHAN6G(169, 6795, 0),
147 	CHAN6G(173, 6815, 0),
148 	CHAN6G(177, 6835, 0),
149 	CHAN6G(181, 6855, 0),
150 	CHAN6G(185, 6875, 0),
151 	CHAN6G(189, 6895, 0),
152 	CHAN6G(193, 6915, 0),
153 	CHAN6G(197, 6935, 0),
154 	CHAN6G(201, 6955, 0),
155 	CHAN6G(205, 6975, 0),
156 	CHAN6G(209, 6995, 0),
157 	CHAN6G(213, 7015, 0),
158 	CHAN6G(217, 7035, 0),
159 	CHAN6G(221, 7055, 0),
160 	CHAN6G(225, 7075, 0),
161 	CHAN6G(229, 7095, 0),
162 	CHAN6G(233, 7115, 0),
163 };
164 
165 static struct ieee80211_rate ath12k_legacy_rates[] = {
166 	{ .bitrate = 10,
167 	  .hw_value = ATH12K_HW_RATE_CCK_LP_1M },
168 	{ .bitrate = 20,
169 	  .hw_value = ATH12K_HW_RATE_CCK_LP_2M,
170 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_2M,
171 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
172 	{ .bitrate = 55,
173 	  .hw_value = ATH12K_HW_RATE_CCK_LP_5_5M,
174 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_5_5M,
175 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
176 	{ .bitrate = 110,
177 	  .hw_value = ATH12K_HW_RATE_CCK_LP_11M,
178 	  .hw_value_short = ATH12K_HW_RATE_CCK_SP_11M,
179 	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
180 
181 	{ .bitrate = 60, .hw_value = ATH12K_HW_RATE_OFDM_6M },
182 	{ .bitrate = 90, .hw_value = ATH12K_HW_RATE_OFDM_9M },
183 	{ .bitrate = 120, .hw_value = ATH12K_HW_RATE_OFDM_12M },
184 	{ .bitrate = 180, .hw_value = ATH12K_HW_RATE_OFDM_18M },
185 	{ .bitrate = 240, .hw_value = ATH12K_HW_RATE_OFDM_24M },
186 	{ .bitrate = 360, .hw_value = ATH12K_HW_RATE_OFDM_36M },
187 	{ .bitrate = 480, .hw_value = ATH12K_HW_RATE_OFDM_48M },
188 	{ .bitrate = 540, .hw_value = ATH12K_HW_RATE_OFDM_54M },
189 };
190 
191 static const int
192 ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
193 	[NL80211_BAND_2GHZ] = {
194 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
195 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
196 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
197 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
198 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
199 			[NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
200 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
201 			[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
202 			[NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
203 	},
204 	[NL80211_BAND_5GHZ] = {
205 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
206 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
207 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
208 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
209 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
210 			[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
211 			[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
212 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
213 			[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
214 	},
215 	[NL80211_BAND_6GHZ] = {
216 			[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
217 			[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
218 			[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
219 			[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
220 			[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
221 			[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
222 			[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
223 			[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
224 			[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
225 	},
226 
227 };
228 
229 const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default = {
230 	.rx_filter = HTT_RX_FILTER_TLV_FLAGS_MPDU_START |
231 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_END |
232 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE |
233 		     HTT_RX_FILTER_TLV_FLAGS_PPDU_START_USER_INFO,
234 	.pkt_filter_flags0 = HTT_RX_FP_MGMT_FILTER_FLAGS0,
235 	.pkt_filter_flags1 = HTT_RX_FP_MGMT_FILTER_FLAGS1,
236 	.pkt_filter_flags2 = HTT_RX_FP_CTRL_FILTER_FLASG2,
237 	.pkt_filter_flags3 = HTT_RX_FP_DATA_FILTER_FLASG3 |
238 			     HTT_RX_FP_CTRL_FILTER_FLASG3
239 };
240 
241 #define ATH12K_MAC_FIRST_OFDM_RATE_IDX 4
242 #define ath12k_g_rates ath12k_legacy_rates
243 #define ath12k_g_rates_size (ARRAY_SIZE(ath12k_legacy_rates))
244 #define ath12k_a_rates (ath12k_legacy_rates + 4)
245 #define ath12k_a_rates_size (ARRAY_SIZE(ath12k_legacy_rates) - 4)
246 
247 #define ATH12K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
248 
249 static const u32 ath12k_smps_map[] = {
250 	[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
251 	[WLAN_HT_CAP_SM_PS_DYNAMIC] = WMI_PEER_SMPS_DYNAMIC,
252 	[WLAN_HT_CAP_SM_PS_INVALID] = WMI_PEER_SMPS_PS_NONE,
253 	[WLAN_HT_CAP_SM_PS_DISABLED] = WMI_PEER_SMPS_PS_NONE,
254 };
255 
256 static int ath12k_start_vdev_delay(struct ath12k *ar,
257 				   struct ath12k_link_vif *arvif);
258 static void ath12k_mac_stop(struct ath12k *ar);
259 static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif);
260 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif);
261 
ath12k_mac_phymode_str(enum wmi_phy_mode mode)262 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
263 {
264 	switch (mode) {
265 	case MODE_11A:
266 		return "11a";
267 	case MODE_11G:
268 		return "11g";
269 	case MODE_11B:
270 		return "11b";
271 	case MODE_11GONLY:
272 		return "11gonly";
273 	case MODE_11NA_HT20:
274 		return "11na-ht20";
275 	case MODE_11NG_HT20:
276 		return "11ng-ht20";
277 	case MODE_11NA_HT40:
278 		return "11na-ht40";
279 	case MODE_11NG_HT40:
280 		return "11ng-ht40";
281 	case MODE_11AC_VHT20:
282 		return "11ac-vht20";
283 	case MODE_11AC_VHT40:
284 		return "11ac-vht40";
285 	case MODE_11AC_VHT80:
286 		return "11ac-vht80";
287 	case MODE_11AC_VHT160:
288 		return "11ac-vht160";
289 	case MODE_11AC_VHT80_80:
290 		return "11ac-vht80+80";
291 	case MODE_11AC_VHT20_2G:
292 		return "11ac-vht20-2g";
293 	case MODE_11AC_VHT40_2G:
294 		return "11ac-vht40-2g";
295 	case MODE_11AC_VHT80_2G:
296 		return "11ac-vht80-2g";
297 	case MODE_11AX_HE20:
298 		return "11ax-he20";
299 	case MODE_11AX_HE40:
300 		return "11ax-he40";
301 	case MODE_11AX_HE80:
302 		return "11ax-he80";
303 	case MODE_11AX_HE80_80:
304 		return "11ax-he80+80";
305 	case MODE_11AX_HE160:
306 		return "11ax-he160";
307 	case MODE_11AX_HE20_2G:
308 		return "11ax-he20-2g";
309 	case MODE_11AX_HE40_2G:
310 		return "11ax-he40-2g";
311 	case MODE_11AX_HE80_2G:
312 		return "11ax-he80-2g";
313 	case MODE_11BE_EHT20:
314 		return "11be-eht20";
315 	case MODE_11BE_EHT40:
316 		return "11be-eht40";
317 	case MODE_11BE_EHT80:
318 		return "11be-eht80";
319 	case MODE_11BE_EHT80_80:
320 		return "11be-eht80+80";
321 	case MODE_11BE_EHT160:
322 		return "11be-eht160";
323 	case MODE_11BE_EHT160_160:
324 		return "11be-eht160+160";
325 	case MODE_11BE_EHT320:
326 		return "11be-eht320";
327 	case MODE_11BE_EHT20_2G:
328 		return "11be-eht20-2g";
329 	case MODE_11BE_EHT40_2G:
330 		return "11be-eht40-2g";
331 	case MODE_UNKNOWN:
332 		/* skip */
333 		break;
334 
335 		/* no default handler to allow compiler to check that the
336 		 * enum is fully handled
337 		 */
338 	}
339 
340 	return "<unknown>";
341 }
342 
ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)343 u16 ath12k_mac_he_convert_tones_to_ru_tones(u16 tones)
344 {
345 	switch (tones) {
346 	case 26:
347 		return RU_26;
348 	case 52:
349 		return RU_52;
350 	case 106:
351 		return RU_106;
352 	case 242:
353 		return RU_242;
354 	case 484:
355 		return RU_484;
356 	case 996:
357 		return RU_996;
358 	case (996 * 2):
359 		return RU_2X996;
360 	default:
361 		return RU_26;
362 	}
363 }
364 
ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)365 enum nl80211_eht_gi ath12k_mac_eht_gi_to_nl80211_eht_gi(u8 sgi)
366 {
367 	switch (sgi) {
368 	case RX_MSDU_START_SGI_0_8_US:
369 		return NL80211_RATE_INFO_EHT_GI_0_8;
370 	case RX_MSDU_START_SGI_1_6_US:
371 		return NL80211_RATE_INFO_EHT_GI_1_6;
372 	case RX_MSDU_START_SGI_3_2_US:
373 		return NL80211_RATE_INFO_EHT_GI_3_2;
374 	default:
375 		return NL80211_RATE_INFO_EHT_GI_0_8;
376 	}
377 }
378 
ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)379 enum nl80211_eht_ru_alloc ath12k_mac_eht_ru_tones_to_nl80211_eht_ru_alloc(u16 ru_tones)
380 {
381 	switch (ru_tones) {
382 	case 26:
383 		return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
384 	case 52:
385 		return NL80211_RATE_INFO_EHT_RU_ALLOC_52;
386 	case (52 + 26):
387 		return NL80211_RATE_INFO_EHT_RU_ALLOC_52P26;
388 	case 106:
389 		return NL80211_RATE_INFO_EHT_RU_ALLOC_106;
390 	case (106 + 26):
391 		return NL80211_RATE_INFO_EHT_RU_ALLOC_106P26;
392 	case 242:
393 		return NL80211_RATE_INFO_EHT_RU_ALLOC_242;
394 	case 484:
395 		return NL80211_RATE_INFO_EHT_RU_ALLOC_484;
396 	case (484 + 242):
397 		return NL80211_RATE_INFO_EHT_RU_ALLOC_484P242;
398 	case 996:
399 		return NL80211_RATE_INFO_EHT_RU_ALLOC_996;
400 	case (996 + 484):
401 		return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484;
402 	case (996 + 484 + 242):
403 		return NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242;
404 	case (2 * 996):
405 		return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996;
406 	case (2 * 996 + 484):
407 		return NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484;
408 	case (3 * 996):
409 		return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996;
410 	case (3 * 996 + 484):
411 		return NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484;
412 	case (4 * 996):
413 		return NL80211_RATE_INFO_EHT_RU_ALLOC_4x996;
414 	default:
415 		return NL80211_RATE_INFO_EHT_RU_ALLOC_26;
416 	}
417 }
418 
419 enum rate_info_bw
ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)420 ath12k_mac_bw_to_mac80211_bw(enum ath12k_supported_bw bw)
421 {
422 	u8 ret = RATE_INFO_BW_20;
423 
424 	switch (bw) {
425 	case ATH12K_BW_20:
426 		ret = RATE_INFO_BW_20;
427 		break;
428 	case ATH12K_BW_40:
429 		ret = RATE_INFO_BW_40;
430 		break;
431 	case ATH12K_BW_80:
432 		ret = RATE_INFO_BW_80;
433 		break;
434 	case ATH12K_BW_160:
435 		ret = RATE_INFO_BW_160;
436 		break;
437 	case ATH12K_BW_320:
438 		ret = RATE_INFO_BW_320;
439 		break;
440 	}
441 
442 	return ret;
443 }
444 
ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)445 enum ath12k_supported_bw ath12k_mac_mac80211_bw_to_ath12k_bw(enum rate_info_bw bw)
446 {
447 	switch (bw) {
448 	case RATE_INFO_BW_20:
449 		return ATH12K_BW_20;
450 	case RATE_INFO_BW_40:
451 		return ATH12K_BW_40;
452 	case RATE_INFO_BW_80:
453 		return ATH12K_BW_80;
454 	case RATE_INFO_BW_160:
455 		return ATH12K_BW_160;
456 	case RATE_INFO_BW_320:
457 		return ATH12K_BW_320;
458 	default:
459 		return ATH12K_BW_20;
460 	}
461 }
462 
ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc,u8 preamble,u8 * rateidx,u16 * rate)463 int ath12k_mac_hw_ratecode_to_legacy_rate(u8 hw_rc, u8 preamble, u8 *rateidx,
464 					  u16 *rate)
465 {
466 	/* As default, it is OFDM rates */
467 	int i = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
468 	int max_rates_idx = ath12k_g_rates_size;
469 
470 	if (preamble == WMI_RATE_PREAMBLE_CCK) {
471 		hw_rc &= ~ATH12K_HW_RATECODE_CCK_SHORT_PREAM_MASK;
472 		i = 0;
473 		max_rates_idx = ATH12K_MAC_FIRST_OFDM_RATE_IDX;
474 	}
475 
476 	while (i < max_rates_idx) {
477 		if (hw_rc == ath12k_legacy_rates[i].hw_value) {
478 			*rateidx = i;
479 			*rate = ath12k_legacy_rates[i].bitrate;
480 			return 0;
481 		}
482 		i++;
483 	}
484 
485 	return -EINVAL;
486 }
487 
ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band * sband,u32 bitrate)488 u8 ath12k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
489 			     u32 bitrate)
490 {
491 	int i;
492 
493 	for (i = 0; i < sband->n_bitrates; i++)
494 		if (sband->bitrates[i].bitrate == bitrate)
495 			return i;
496 
497 	return 0;
498 }
499 
500 static u32
ath12k_mac_max_ht_nss(const u8 * ht_mcs_mask)501 ath12k_mac_max_ht_nss(const u8 *ht_mcs_mask)
502 {
503 	int nss;
504 
505 	for (nss = IEEE80211_HT_MCS_MASK_LEN - 1; nss >= 0; nss--)
506 		if (ht_mcs_mask[nss])
507 			return nss + 1;
508 
509 	return 1;
510 }
511 
512 static u32
ath12k_mac_max_vht_nss(const u16 * vht_mcs_mask)513 ath12k_mac_max_vht_nss(const u16 *vht_mcs_mask)
514 {
515 	int nss;
516 
517 	for (nss = NL80211_VHT_NSS_MAX - 1; nss >= 0; nss--)
518 		if (vht_mcs_mask[nss])
519 			return nss + 1;
520 
521 	return 1;
522 }
523 
524 static u32
ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])525 ath12k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
526 {
527 	int nss;
528 
529 	for (nss = NL80211_HE_NSS_MAX - 1; nss >= 0; nss--)
530 		if (he_mcs_mask[nss])
531 			return nss + 1;
532 
533 	return 1;
534 }
535 
ath12k_parse_mpdudensity(u8 mpdudensity)536 static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
537 {
538 /*  From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start Spacing":
539  *   0 for no restriction
540  *   1 for 1/4 us
541  *   2 for 1/2 us
542  *   3 for 1 us
543  *   4 for 2 us
544  *   5 for 4 us
545  *   6 for 8 us
546  *   7 for 16 us
547  */
548 	switch (mpdudensity) {
549 	case 0:
550 		return 0;
551 	case 1:
552 	case 2:
553 	case 3:
554 	/* Our lower layer calculations limit our precision to
555 	 * 1 microsecond
556 	 */
557 		return 1;
558 	case 4:
559 		return 2;
560 	case 5:
561 		return 4;
562 	case 6:
563 		return 8;
564 	case 7:
565 		return 16;
566 	default:
567 		return 0;
568 	}
569 }
570 
ath12k_mac_vif_link_chan(struct ieee80211_vif * vif,u8 link_id,struct cfg80211_chan_def * def)571 static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id,
572 				    struct cfg80211_chan_def *def)
573 {
574 	struct ieee80211_bss_conf *link_conf;
575 	struct ieee80211_chanctx_conf *conf;
576 
577 	rcu_read_lock();
578 	link_conf = rcu_dereference(vif->link_conf[link_id]);
579 
580 	if (!link_conf) {
581 		rcu_read_unlock();
582 		return -ENOLINK;
583 	}
584 
585 	conf = rcu_dereference(link_conf->chanctx_conf);
586 	if (!conf) {
587 		rcu_read_unlock();
588 		return -ENOENT;
589 	}
590 	*def = conf->def;
591 	rcu_read_unlock();
592 
593 	return 0;
594 }
595 
596 static struct ath12k_link_vif *
ath12k_mac_get_tx_arvif(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * link_conf)597 ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif,
598 			struct ieee80211_bss_conf *link_conf)
599 {
600 	struct ieee80211_bss_conf *tx_bss_conf;
601 	struct ath12k *ar = arvif->ar;
602 	struct ath12k_vif *tx_ahvif;
603 
604 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
605 
606 	tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
607 					link_conf->tx_bss_conf);
608 	if (tx_bss_conf) {
609 		tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif);
610 		return wiphy_dereference(tx_ahvif->ah->hw->wiphy,
611 					 tx_ahvif->link[tx_bss_conf->link_id]);
612 	}
613 
614 	return NULL;
615 }
616 
ath12k_mac_get_tx_bssid(struct ath12k_link_vif * arvif)617 static const u8 *ath12k_mac_get_tx_bssid(struct ath12k_link_vif *arvif)
618 {
619 	struct ieee80211_bss_conf *link_conf;
620 	struct ath12k_link_vif *tx_arvif;
621 	struct ath12k *ar = arvif->ar;
622 
623 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
624 
625 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
626 	if (!link_conf) {
627 		ath12k_warn(ar->ab,
628 			    "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
629 			    arvif->link_id);
630 		return NULL;
631 	}
632 	if (link_conf->vif->type == NL80211_IFTYPE_STATION) {
633 		if (link_conf->nontransmitted)
634 			return link_conf->transmitter_bssid;
635 	} else {
636 		tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
637 		if (tx_arvif)
638 			return tx_arvif->bssid;
639 	}
640 
641 	return NULL;
642 }
643 
644 struct ieee80211_bss_conf *
ath12k_mac_get_link_bss_conf(struct ath12k_link_vif * arvif)645 ath12k_mac_get_link_bss_conf(struct ath12k_link_vif *arvif)
646 {
647 	struct ieee80211_vif *vif = arvif->ahvif->vif;
648 	struct ieee80211_bss_conf *link_conf;
649 	struct ath12k *ar = arvif->ar;
650 
651 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
652 
653 	if (arvif->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
654 		return NULL;
655 
656 	link_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
657 				      vif->link_conf[arvif->link_id]);
658 
659 	return link_conf;
660 }
661 
ath12k_mac_get_link_sta(struct ath12k_link_sta * arsta)662 static struct ieee80211_link_sta *ath12k_mac_get_link_sta(struct ath12k_link_sta *arsta)
663 {
664 	struct ath12k_sta *ahsta = arsta->ahsta;
665 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
666 	struct ieee80211_link_sta *link_sta;
667 
668 	lockdep_assert_wiphy(ahsta->ahvif->ah->hw->wiphy);
669 
670 	if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
671 		return NULL;
672 
673 	link_sta = wiphy_dereference(ahsta->ahvif->ah->hw->wiphy,
674 				     sta->link[arsta->link_id]);
675 
676 	return link_sta;
677 }
678 
ath12k_mac_bitrate_is_cck(int bitrate)679 static bool ath12k_mac_bitrate_is_cck(int bitrate)
680 {
681 	switch (bitrate) {
682 	case 10:
683 	case 20:
684 	case 55:
685 	case 110:
686 		return true;
687 	}
688 
689 	return false;
690 }
691 
ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band * sband,u8 hw_rate,bool cck)692 u8 ath12k_mac_hw_rate_to_idx(const struct ieee80211_supported_band *sband,
693 			     u8 hw_rate, bool cck)
694 {
695 	const struct ieee80211_rate *rate;
696 	int i;
697 
698 	for (i = 0; i < sband->n_bitrates; i++) {
699 		rate = &sband->bitrates[i];
700 
701 		if (ath12k_mac_bitrate_is_cck(rate->bitrate) != cck)
702 			continue;
703 
704 		if (rate->hw_value == hw_rate)
705 			return i;
706 		else if (rate->flags & IEEE80211_RATE_SHORT_PREAMBLE &&
707 			 rate->hw_value_short == hw_rate)
708 			return i;
709 	}
710 
711 	return 0;
712 }
713 
ath12k_mac_bitrate_to_rate(int bitrate)714 static u8 ath12k_mac_bitrate_to_rate(int bitrate)
715 {
716 	return DIV_ROUND_UP(bitrate, 5) |
717 	       (ath12k_mac_bitrate_is_cck(bitrate) ? BIT(7) : 0);
718 }
719 
ath12k_get_arvif_iter(void * data,u8 * mac,struct ieee80211_vif * vif)720 static void ath12k_get_arvif_iter(void *data, u8 *mac,
721 				  struct ieee80211_vif *vif)
722 {
723 	struct ath12k_vif_iter *arvif_iter = data;
724 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
725 	unsigned long links_map = ahvif->links_map;
726 	struct ath12k_link_vif *arvif;
727 	u8 link_id;
728 
729 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
730 		arvif = rcu_dereference(ahvif->link[link_id]);
731 
732 		if (WARN_ON(!arvif))
733 			continue;
734 
735 		if (!arvif->is_created)
736 			continue;
737 
738 		if (arvif->vdev_id == arvif_iter->vdev_id &&
739 		    arvif->ar == arvif_iter->ar) {
740 			arvif_iter->arvif = arvif;
741 			break;
742 		}
743 	}
744 }
745 
ath12k_mac_get_arvif(struct ath12k * ar,u32 vdev_id)746 struct ath12k_link_vif *ath12k_mac_get_arvif(struct ath12k *ar, u32 vdev_id)
747 {
748 	struct ath12k_vif_iter arvif_iter = {};
749 	u32 flags;
750 
751 	/* To use the arvif returned, caller must have held rcu read lock.
752 	 */
753 	WARN_ON(!rcu_read_lock_any_held());
754 	arvif_iter.vdev_id = vdev_id;
755 	arvif_iter.ar = ar;
756 
757 	flags = IEEE80211_IFACE_ITER_RESUME_ALL;
758 	ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
759 						   flags,
760 						   ath12k_get_arvif_iter,
761 						   &arvif_iter);
762 	if (!arvif_iter.arvif) {
763 		ath12k_warn(ar->ab, "No VIF found for vdev %d\n", vdev_id);
764 		return NULL;
765 	}
766 
767 	return arvif_iter.arvif;
768 }
769 
ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)770 struct ath12k_link_vif *ath12k_mac_get_arvif_by_vdev_id(struct ath12k_base *ab,
771 							u32 vdev_id)
772 {
773 	int i;
774 	struct ath12k_pdev *pdev;
775 	struct ath12k_link_vif *arvif;
776 
777 	for (i = 0; i < ab->num_radios; i++) {
778 		pdev = rcu_dereference(ab->pdevs_active[i]);
779 		if (pdev && pdev->ar &&
780 		    (pdev->ar->allocated_vdev_map & (1LL << vdev_id))) {
781 			arvif = ath12k_mac_get_arvif(pdev->ar, vdev_id);
782 			if (arvif)
783 				return arvif;
784 		}
785 	}
786 
787 	return NULL;
788 }
789 
ath12k_mac_get_ar_by_vdev_id(struct ath12k_base * ab,u32 vdev_id)790 struct ath12k *ath12k_mac_get_ar_by_vdev_id(struct ath12k_base *ab, u32 vdev_id)
791 {
792 	int i;
793 	struct ath12k_pdev *pdev;
794 
795 	for (i = 0; i < ab->num_radios; i++) {
796 		pdev = rcu_dereference(ab->pdevs_active[i]);
797 		if (pdev && pdev->ar) {
798 			if (pdev->ar->allocated_vdev_map & (1LL << vdev_id))
799 				return pdev->ar;
800 		}
801 	}
802 
803 	return NULL;
804 }
805 
ath12k_mac_get_ar_by_pdev_id(struct ath12k_base * ab,u32 pdev_id)806 struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
807 {
808 	int i;
809 	struct ath12k_pdev *pdev;
810 
811 	if (ab->hw_params->single_pdev_only) {
812 		pdev = rcu_dereference(ab->pdevs_active[0]);
813 		return pdev ? pdev->ar : NULL;
814 	}
815 
816 	if (WARN_ON(pdev_id > ab->num_radios))
817 		return NULL;
818 
819 	for (i = 0; i < ab->num_radios; i++) {
820 		if (ab->fw_mode == ATH12K_FIRMWARE_MODE_FTM)
821 			pdev = &ab->pdevs[i];
822 		else
823 			pdev = rcu_dereference(ab->pdevs_active[i]);
824 
825 		if (pdev && pdev->pdev_id == pdev_id)
826 			return (pdev->ar ? pdev->ar : NULL);
827 	}
828 
829 	return NULL;
830 }
831 
ath12k_mac_is_ml_arvif(struct ath12k_link_vif * arvif)832 static bool ath12k_mac_is_ml_arvif(struct ath12k_link_vif *arvif)
833 {
834 	struct ath12k_vif *ahvif = arvif->ahvif;
835 
836 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
837 
838 	if (ahvif->vif->valid_links & BIT(arvif->link_id))
839 		return true;
840 
841 	return false;
842 }
843 
ath12k_mac_get_ar_by_chan(struct ieee80211_hw * hw,struct ieee80211_channel * channel)844 static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw,
845 						struct ieee80211_channel *channel)
846 {
847 	struct ath12k_hw *ah = hw->priv;
848 	struct ath12k *ar;
849 	int i;
850 
851 	ar = ah->radio;
852 
853 	if (ah->num_radio == 1)
854 		return ar;
855 
856 	for_each_ar(ah, ar, i) {
857 		if (channel->center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
858 		    channel->center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
859 			return ar;
860 	}
861 	return NULL;
862 }
863 
ath12k_get_ar_by_ctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)864 static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw,
865 					   struct ieee80211_chanctx_conf *ctx)
866 {
867 	if (!ctx)
868 		return NULL;
869 
870 	return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan);
871 }
872 
ath12k_get_ar_by_vif(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u8 link_id)873 struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw,
874 				    struct ieee80211_vif *vif,
875 				    u8 link_id)
876 {
877 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
878 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
879 	struct ath12k_link_vif *arvif;
880 
881 	lockdep_assert_wiphy(hw->wiphy);
882 
883 	/* If there is one pdev within ah, then we return
884 	 * ar directly.
885 	 */
886 	if (ah->num_radio == 1)
887 		return ah->radio;
888 
889 	if (!(ahvif->links_map & BIT(link_id)))
890 		return NULL;
891 
892 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
893 	if (arvif && arvif->is_created)
894 		return arvif->ar;
895 
896 	return NULL;
897 }
898 
ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * conf,void * data)899 void ath12k_mac_get_any_chanctx_conf_iter(struct ieee80211_hw *hw,
900 					  struct ieee80211_chanctx_conf *conf,
901 					  void *data)
902 {
903 	struct ath12k_mac_get_any_chanctx_conf_arg *arg = data;
904 	struct ath12k *ctx_ar = ath12k_get_ar_by_ctx(hw, conf);
905 
906 	if (ctx_ar == arg->ar)
907 		arg->chanctx_conf = conf;
908 }
909 
ath12k_mac_get_vif_up(struct ath12k * ar)910 static struct ath12k_link_vif *ath12k_mac_get_vif_up(struct ath12k *ar)
911 {
912 	struct ath12k_link_vif *arvif;
913 
914 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
915 
916 	list_for_each_entry(arvif, &ar->arvifs, list) {
917 		if (arvif->is_up)
918 			return arvif;
919 	}
920 
921 	return NULL;
922 }
923 
ath12k_mac_band_match(enum nl80211_band band1,enum WMI_HOST_WLAN_BAND band2)924 static bool ath12k_mac_band_match(enum nl80211_band band1, enum WMI_HOST_WLAN_BAND band2)
925 {
926 	switch (band1) {
927 	case NL80211_BAND_2GHZ:
928 		if (band2 & WMI_HOST_WLAN_2GHZ_CAP)
929 			return true;
930 		break;
931 	case NL80211_BAND_5GHZ:
932 	case NL80211_BAND_6GHZ:
933 		if (band2 & WMI_HOST_WLAN_5GHZ_CAP)
934 			return true;
935 		break;
936 	default:
937 		return false;
938 	}
939 
940 	return false;
941 }
942 
ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif * arvif)943 static u8 ath12k_mac_get_target_pdev_id_from_vif(struct ath12k_link_vif *arvif)
944 {
945 	struct ath12k *ar = arvif->ar;
946 	struct ath12k_base *ab = ar->ab;
947 	struct ieee80211_vif *vif = arvif->ahvif->vif;
948 	struct cfg80211_chan_def def;
949 	enum nl80211_band band;
950 	u8 pdev_id = ab->fw_pdev[0].pdev_id;
951 	int i;
952 
953 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
954 		return pdev_id;
955 
956 	band = def.chan->band;
957 
958 	for (i = 0; i < ab->fw_pdev_count; i++) {
959 		if (ath12k_mac_band_match(band, ab->fw_pdev[i].supported_bands))
960 			return ab->fw_pdev[i].pdev_id;
961 	}
962 
963 	return pdev_id;
964 }
965 
ath12k_mac_get_target_pdev_id(struct ath12k * ar)966 u8 ath12k_mac_get_target_pdev_id(struct ath12k *ar)
967 {
968 	struct ath12k_link_vif *arvif;
969 	struct ath12k_base *ab = ar->ab;
970 
971 	if (!ab->hw_params->single_pdev_only)
972 		return ar->pdev->pdev_id;
973 
974 	arvif = ath12k_mac_get_vif_up(ar);
975 
976 	/* fw_pdev array has pdev ids derived from phy capability
977 	 * service ready event (pdev_and_hw_link_ids).
978 	 * If no vif is active, return default first index.
979 	 */
980 	if (!arvif)
981 		return ar->ab->fw_pdev[0].pdev_id;
982 
983 	/* If active vif is found, return the pdev id matching chandef band */
984 	return ath12k_mac_get_target_pdev_id_from_vif(arvif);
985 }
986 
ath12k_pdev_caps_update(struct ath12k * ar)987 static void ath12k_pdev_caps_update(struct ath12k *ar)
988 {
989 	struct ath12k_base *ab = ar->ab;
990 
991 	ar->max_tx_power = ab->target_caps.hw_max_tx_power;
992 
993 	/* FIXME: Set min_tx_power to ab->target_caps.hw_min_tx_power.
994 	 * But since the received value in svcrdy is same as hw_max_tx_power,
995 	 * we can set ar->min_tx_power to 0 currently until
996 	 * this is fixed in firmware
997 	 */
998 	ar->min_tx_power = 0;
999 
1000 	ar->txpower_limit_2g = ar->max_tx_power;
1001 	ar->txpower_limit_5g = ar->max_tx_power;
1002 	ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
1003 }
1004 
ath12k_mac_txpower_recalc(struct ath12k * ar)1005 static int ath12k_mac_txpower_recalc(struct ath12k *ar)
1006 {
1007 	struct ath12k_pdev *pdev = ar->pdev;
1008 	struct ath12k_link_vif *arvif;
1009 	int ret, txpower = -1;
1010 	u32 param;
1011 
1012 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1013 
1014 	list_for_each_entry(arvif, &ar->arvifs, list) {
1015 		if (arvif->txpower <= 0)
1016 			continue;
1017 
1018 		if (txpower == -1)
1019 			txpower = arvif->txpower;
1020 		else
1021 			txpower = min(txpower, arvif->txpower);
1022 	}
1023 
1024 	if (txpower == -1)
1025 		return 0;
1026 
1027 	/* txpwr is set as 2 units per dBm in FW*/
1028 	txpower = min_t(u32, max_t(u32, ar->min_tx_power, txpower),
1029 			ar->max_tx_power) * 2;
1030 
1031 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower to set in hw %d\n",
1032 		   txpower / 2);
1033 
1034 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) &&
1035 	    ar->txpower_limit_2g != txpower) {
1036 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT2G;
1037 		ret = ath12k_wmi_pdev_set_param(ar, param,
1038 						txpower, ar->pdev->pdev_id);
1039 		if (ret)
1040 			goto fail;
1041 		ar->txpower_limit_2g = txpower;
1042 	}
1043 
1044 	if ((pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) &&
1045 	    ar->txpower_limit_5g != txpower) {
1046 		param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
1047 		ret = ath12k_wmi_pdev_set_param(ar, param,
1048 						txpower, ar->pdev->pdev_id);
1049 		if (ret)
1050 			goto fail;
1051 		ar->txpower_limit_5g = txpower;
1052 	}
1053 
1054 	return 0;
1055 
1056 fail:
1057 	ath12k_warn(ar->ab, "failed to recalc txpower limit %d using pdev param %d: %d\n",
1058 		    txpower / 2, param, ret);
1059 	return ret;
1060 }
1061 
ath12k_recalc_rtscts_prot(struct ath12k_link_vif * arvif)1062 static int ath12k_recalc_rtscts_prot(struct ath12k_link_vif *arvif)
1063 {
1064 	struct ath12k *ar = arvif->ar;
1065 	u32 vdev_param, rts_cts;
1066 	int ret;
1067 
1068 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1069 
1070 	vdev_param = WMI_VDEV_PARAM_ENABLE_RTSCTS;
1071 
1072 	/* Enable RTS/CTS protection for sw retries (when legacy stations
1073 	 * are in BSS) or by default only for second rate series.
1074 	 * TODO: Check if we need to enable CTS 2 Self in any case
1075 	 */
1076 	rts_cts = WMI_USE_RTS_CTS;
1077 
1078 	if (arvif->num_legacy_stations > 0)
1079 		rts_cts |= WMI_RTSCTS_ACROSS_SW_RETRIES << 4;
1080 	else
1081 		rts_cts |= WMI_RTSCTS_FOR_SECOND_RATESERIES << 4;
1082 
1083 	/* Need not send duplicate param value to firmware */
1084 	if (arvif->rtscts_prot_mode == rts_cts)
1085 		return 0;
1086 
1087 	arvif->rtscts_prot_mode = rts_cts;
1088 
1089 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d recalc rts/cts prot %d\n",
1090 		   arvif->vdev_id, rts_cts);
1091 
1092 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
1093 					    vdev_param, rts_cts);
1094 	if (ret)
1095 		ath12k_warn(ar->ab, "failed to recalculate rts/cts prot for vdev %d: %d\n",
1096 			    arvif->vdev_id, ret);
1097 
1098 	return ret;
1099 }
1100 
ath12k_mac_set_kickout(struct ath12k_link_vif * arvif)1101 static int ath12k_mac_set_kickout(struct ath12k_link_vif *arvif)
1102 {
1103 	struct ath12k *ar = arvif->ar;
1104 	u32 param;
1105 	int ret;
1106 
1107 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_STA_KICKOUT_TH,
1108 					ATH12K_KICKOUT_THRESHOLD,
1109 					ar->pdev->pdev_id);
1110 	if (ret) {
1111 		ath12k_warn(ar->ab, "failed to set kickout threshold on vdev %i: %d\n",
1112 			    arvif->vdev_id, ret);
1113 		return ret;
1114 	}
1115 
1116 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS;
1117 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1118 					    ATH12K_KEEPALIVE_MIN_IDLE);
1119 	if (ret) {
1120 		ath12k_warn(ar->ab, "failed to set keepalive minimum idle time on vdev %i: %d\n",
1121 			    arvif->vdev_id, ret);
1122 		return ret;
1123 	}
1124 
1125 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS;
1126 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1127 					    ATH12K_KEEPALIVE_MAX_IDLE);
1128 	if (ret) {
1129 		ath12k_warn(ar->ab, "failed to set keepalive maximum idle time on vdev %i: %d\n",
1130 			    arvif->vdev_id, ret);
1131 		return ret;
1132 	}
1133 
1134 	param = WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS;
1135 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
1136 					    ATH12K_KEEPALIVE_MAX_UNRESPONSIVE);
1137 	if (ret) {
1138 		ath12k_warn(ar->ab, "failed to set keepalive maximum unresponsive time on vdev %i: %d\n",
1139 			    arvif->vdev_id, ret);
1140 		return ret;
1141 	}
1142 
1143 	return 0;
1144 }
1145 
ath12k_mac_peer_cleanup_all(struct ath12k * ar)1146 void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
1147 {
1148 	struct ath12k_peer *peer, *tmp;
1149 	struct ath12k_base *ab = ar->ab;
1150 
1151 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1152 
1153 	spin_lock_bh(&ab->base_lock);
1154 	list_for_each_entry_safe(peer, tmp, &ab->peers, list) {
1155 		/* Skip Rx TID cleanup for self peer */
1156 		if (peer->sta)
1157 			ath12k_dp_rx_peer_tid_cleanup(ar, peer);
1158 
1159 		list_del(&peer->list);
1160 		kfree(peer);
1161 	}
1162 	spin_unlock_bh(&ab->base_lock);
1163 
1164 	ar->num_peers = 0;
1165 	ar->num_stations = 0;
1166 }
1167 
ath12k_mac_vdev_setup_sync(struct ath12k * ar)1168 static int ath12k_mac_vdev_setup_sync(struct ath12k *ar)
1169 {
1170 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1171 
1172 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
1173 		return -ESHUTDOWN;
1174 
1175 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev setup timeout %d\n",
1176 		   ATH12K_VDEV_SETUP_TIMEOUT_HZ);
1177 
1178 	if (!wait_for_completion_timeout(&ar->vdev_setup_done,
1179 					 ATH12K_VDEV_SETUP_TIMEOUT_HZ))
1180 		return -ETIMEDOUT;
1181 
1182 	return ar->last_wmi_vdev_start_status ? -EINVAL : 0;
1183 }
1184 
ath12k_monitor_vdev_up(struct ath12k * ar,int vdev_id)1185 static int ath12k_monitor_vdev_up(struct ath12k *ar, int vdev_id)
1186 {
1187 	struct ath12k_wmi_vdev_up_params params = {};
1188 	int ret;
1189 
1190 	params.vdev_id = vdev_id;
1191 	params.bssid = ar->mac_addr;
1192 	ret = ath12k_wmi_vdev_up(ar, &params);
1193 	if (ret) {
1194 		ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
1195 			    vdev_id, ret);
1196 		return ret;
1197 	}
1198 
1199 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
1200 		   vdev_id);
1201 	return 0;
1202 }
1203 
ath12k_mac_monitor_vdev_start(struct ath12k * ar,int vdev_id,struct cfg80211_chan_def * chandef)1204 static int ath12k_mac_monitor_vdev_start(struct ath12k *ar, int vdev_id,
1205 					 struct cfg80211_chan_def *chandef)
1206 {
1207 	struct ieee80211_channel *channel;
1208 	struct wmi_vdev_start_req_arg arg = {};
1209 	struct ath12k_wmi_vdev_up_params params = {};
1210 	int ret;
1211 
1212 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1213 
1214 	channel = chandef->chan;
1215 	arg.vdev_id = vdev_id;
1216 	arg.freq = channel->center_freq;
1217 	arg.band_center_freq1 = chandef->center_freq1;
1218 	arg.band_center_freq2 = chandef->center_freq2;
1219 	arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
1220 	arg.chan_radar = !!(channel->flags & IEEE80211_CHAN_RADAR);
1221 
1222 	arg.min_power = 0;
1223 	arg.max_power = channel->max_power;
1224 	arg.max_reg_power = channel->max_reg_power;
1225 	arg.max_antenna_gain = channel->max_antenna_gain;
1226 
1227 	arg.pref_tx_streams = ar->num_tx_chains;
1228 	arg.pref_rx_streams = ar->num_rx_chains;
1229 	arg.punct_bitmap = 0xFFFFFFFF;
1230 
1231 	arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
1232 
1233 	reinit_completion(&ar->vdev_setup_done);
1234 	reinit_completion(&ar->vdev_delete_done);
1235 
1236 	ret = ath12k_wmi_vdev_start(ar, &arg, false);
1237 	if (ret) {
1238 		ath12k_warn(ar->ab, "failed to request monitor vdev %i start: %d\n",
1239 			    vdev_id, ret);
1240 		return ret;
1241 	}
1242 
1243 	ret = ath12k_mac_vdev_setup_sync(ar);
1244 	if (ret) {
1245 		ath12k_warn(ar->ab, "failed to synchronize setup for monitor vdev %i start: %d\n",
1246 			    vdev_id, ret);
1247 		return ret;
1248 	}
1249 
1250 	params.vdev_id = vdev_id;
1251 	params.bssid = ar->mac_addr;
1252 	ret = ath12k_wmi_vdev_up(ar, &params);
1253 	if (ret) {
1254 		ath12k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n",
1255 			    vdev_id, ret);
1256 		goto vdev_stop;
1257 	}
1258 
1259 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i started\n",
1260 		   vdev_id);
1261 	return 0;
1262 
1263 vdev_stop:
1264 	ret = ath12k_wmi_vdev_stop(ar, vdev_id);
1265 	if (ret)
1266 		ath12k_warn(ar->ab, "failed to stop monitor vdev %i after start failure: %d\n",
1267 			    vdev_id, ret);
1268 	return ret;
1269 }
1270 
ath12k_mac_monitor_vdev_stop(struct ath12k * ar)1271 static int ath12k_mac_monitor_vdev_stop(struct ath12k *ar)
1272 {
1273 	int ret;
1274 
1275 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1276 
1277 	reinit_completion(&ar->vdev_setup_done);
1278 
1279 	ret = ath12k_wmi_vdev_stop(ar, ar->monitor_vdev_id);
1280 	if (ret)
1281 		ath12k_warn(ar->ab, "failed to request monitor vdev %i stop: %d\n",
1282 			    ar->monitor_vdev_id, ret);
1283 
1284 	ret = ath12k_mac_vdev_setup_sync(ar);
1285 	if (ret)
1286 		ath12k_warn(ar->ab, "failed to synchronize monitor vdev %i stop: %d\n",
1287 			    ar->monitor_vdev_id, ret);
1288 
1289 	ret = ath12k_wmi_vdev_down(ar, ar->monitor_vdev_id);
1290 	if (ret)
1291 		ath12k_warn(ar->ab, "failed to put down monitor vdev %i: %d\n",
1292 			    ar->monitor_vdev_id, ret);
1293 
1294 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %i stopped\n",
1295 		   ar->monitor_vdev_id);
1296 	return ret;
1297 }
1298 
ath12k_mac_monitor_vdev_delete(struct ath12k * ar)1299 static int ath12k_mac_monitor_vdev_delete(struct ath12k *ar)
1300 {
1301 	int ret;
1302 	unsigned long time_left;
1303 
1304 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1305 
1306 	if (!ar->monitor_vdev_created)
1307 		return 0;
1308 
1309 	reinit_completion(&ar->vdev_delete_done);
1310 
1311 	ret = ath12k_wmi_vdev_delete(ar, ar->monitor_vdev_id);
1312 	if (ret) {
1313 		ath12k_warn(ar->ab, "failed to request wmi monitor vdev %i removal: %d\n",
1314 			    ar->monitor_vdev_id, ret);
1315 		return ret;
1316 	}
1317 
1318 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
1319 						ATH12K_VDEV_DELETE_TIMEOUT_HZ);
1320 	if (time_left == 0) {
1321 		ath12k_warn(ar->ab, "Timeout in receiving vdev delete response\n");
1322 	} else {
1323 		ar->allocated_vdev_map &= ~(1LL << ar->monitor_vdev_id);
1324 		ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id);
1325 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor vdev %d deleted\n",
1326 			   ar->monitor_vdev_id);
1327 		ar->num_created_vdevs--;
1328 		ar->monitor_vdev_id = -1;
1329 		ar->monitor_vdev_created = false;
1330 	}
1331 
1332 	return ret;
1333 }
1334 
ath12k_mac_monitor_start(struct ath12k * ar)1335 static int ath12k_mac_monitor_start(struct ath12k *ar)
1336 {
1337 	struct ath12k_mac_get_any_chanctx_conf_arg arg;
1338 	int ret;
1339 
1340 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1341 
1342 	if (ar->monitor_started)
1343 		return 0;
1344 
1345 	arg.ar = ar;
1346 	arg.chanctx_conf = NULL;
1347 	ieee80211_iter_chan_contexts_atomic(ath12k_ar_to_hw(ar),
1348 					    ath12k_mac_get_any_chanctx_conf_iter,
1349 					    &arg);
1350 	if (!arg.chanctx_conf)
1351 		return 0;
1352 
1353 	ret = ath12k_mac_monitor_vdev_start(ar, ar->monitor_vdev_id,
1354 					    &arg.chanctx_conf->def);
1355 	if (ret) {
1356 		ath12k_warn(ar->ab, "failed to start monitor vdev: %d\n", ret);
1357 		return ret;
1358 	}
1359 
1360 	ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, false);
1361 	if (ret) {
1362 		ath12k_warn(ar->ab, "fail to set monitor filter: %d\n", ret);
1363 		return ret;
1364 	}
1365 
1366 	ar->monitor_started = true;
1367 	ar->num_started_vdevs++;
1368 
1369 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor started\n");
1370 
1371 	return 0;
1372 }
1373 
ath12k_mac_monitor_stop(struct ath12k * ar)1374 static int ath12k_mac_monitor_stop(struct ath12k *ar)
1375 {
1376 	int ret;
1377 
1378 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1379 
1380 	if (!ar->monitor_started)
1381 		return 0;
1382 
1383 	ret = ath12k_mac_monitor_vdev_stop(ar);
1384 	if (ret) {
1385 		ath12k_warn(ar->ab, "failed to stop monitor vdev: %d\n", ret);
1386 		return ret;
1387 	}
1388 
1389 	ar->monitor_started = false;
1390 	ar->num_started_vdevs--;
1391 	ret = ath12k_dp_tx_htt_monitor_mode_ring_config(ar, true);
1392 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac monitor stopped ret %d\n", ret);
1393 	return ret;
1394 }
1395 
ath12k_mac_vdev_stop(struct ath12k_link_vif * arvif)1396 int ath12k_mac_vdev_stop(struct ath12k_link_vif *arvif)
1397 {
1398 	struct ath12k_vif *ahvif = arvif->ahvif;
1399 	struct ath12k *ar = arvif->ar;
1400 	int ret;
1401 
1402 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
1403 
1404 	reinit_completion(&ar->vdev_setup_done);
1405 
1406 	ret = ath12k_wmi_vdev_stop(ar, arvif->vdev_id);
1407 	if (ret) {
1408 		ath12k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n",
1409 			    arvif->vdev_id, ret);
1410 		goto err;
1411 	}
1412 
1413 	ret = ath12k_mac_vdev_setup_sync(ar);
1414 	if (ret) {
1415 		ath12k_warn(ar->ab, "failed to synchronize setup for vdev %i: %d\n",
1416 			    arvif->vdev_id, ret);
1417 		goto err;
1418 	}
1419 
1420 	WARN_ON(ar->num_started_vdevs == 0);
1421 
1422 	ar->num_started_vdevs--;
1423 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "vdev %pM stopped, vdev_id %d\n",
1424 		   ahvif->vif->addr, arvif->vdev_id);
1425 
1426 	if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags)) {
1427 		clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
1428 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "CAC Stopped for vdev %d\n",
1429 			   arvif->vdev_id);
1430 	}
1431 
1432 	return 0;
1433 err:
1434 	return ret;
1435 }
1436 
ath12k_mac_op_config(struct ieee80211_hw * hw,int radio_idx,u32 changed)1437 static int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed)
1438 {
1439 	return 0;
1440 }
1441 
ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif * arvif,struct sk_buff * bcn)1442 static int ath12k_mac_setup_bcn_p2p_ie(struct ath12k_link_vif *arvif,
1443 				       struct sk_buff *bcn)
1444 {
1445 	struct ath12k *ar = arvif->ar;
1446 	struct ieee80211_mgmt *mgmt;
1447 	const u8 *p2p_ie;
1448 	int ret;
1449 
1450 	mgmt = (void *)bcn->data;
1451 	p2p_ie = cfg80211_find_vendor_ie(WLAN_OUI_WFA, WLAN_OUI_TYPE_WFA_P2P,
1452 					 mgmt->u.beacon.variable,
1453 					 bcn->len - (mgmt->u.beacon.variable -
1454 						     bcn->data));
1455 	if (!p2p_ie) {
1456 		ath12k_warn(ar->ab, "no P2P ie found in beacon\n");
1457 		return -ENOENT;
1458 	}
1459 
1460 	ret = ath12k_wmi_p2p_go_bcn_ie(ar, arvif->vdev_id, p2p_ie);
1461 	if (ret) {
1462 		ath12k_warn(ar->ab, "failed to submit P2P GO bcn ie for vdev %i: %d\n",
1463 			    arvif->vdev_id, ret);
1464 		return ret;
1465 	}
1466 
1467 	return 0;
1468 }
1469 
ath12k_mac_remove_vendor_ie(struct sk_buff * skb,unsigned int oui,u8 oui_type,size_t ie_offset)1470 static int ath12k_mac_remove_vendor_ie(struct sk_buff *skb, unsigned int oui,
1471 				       u8 oui_type, size_t ie_offset)
1472 {
1473 	const u8 *next, *end;
1474 	size_t len;
1475 	u8 *ie;
1476 
1477 	if (WARN_ON(skb->len < ie_offset))
1478 		return -EINVAL;
1479 
1480 	ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
1481 					   skb->data + ie_offset,
1482 					   skb->len - ie_offset);
1483 	if (!ie)
1484 		return -ENOENT;
1485 
1486 	len = ie[1] + 2;
1487 	end = skb->data + skb->len;
1488 	next = ie + len;
1489 
1490 	if (WARN_ON(next > end))
1491 		return -EINVAL;
1492 
1493 	memmove(ie, next, end - next);
1494 	skb_trim(skb, skb->len - len);
1495 
1496 	return 0;
1497 }
1498 
ath12k_mac_set_arvif_ies(struct ath12k_link_vif * arvif,struct ath12k_link_vif * tx_arvif,struct sk_buff * bcn,u8 bssid_index,bool * nontx_profile_found)1499 static void ath12k_mac_set_arvif_ies(struct ath12k_link_vif *arvif,
1500 				     struct ath12k_link_vif *tx_arvif,
1501 				     struct sk_buff *bcn,
1502 				     u8 bssid_index, bool *nontx_profile_found)
1503 {
1504 	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)bcn->data;
1505 	const struct element *elem, *nontx, *index, *nie, *ext_cap_ie;
1506 	const u8 *start, *tail;
1507 	u16 rem_len;
1508 	u8 i;
1509 
1510 	start = bcn->data + ieee80211_get_hdrlen_from_skb(bcn) + sizeof(mgmt->u.beacon);
1511 	tail = skb_tail_pointer(bcn);
1512 	rem_len = tail - start;
1513 
1514 	arvif->rsnie_present = false;
1515 	arvif->wpaie_present = false;
1516 
1517 	if (cfg80211_find_ie(WLAN_EID_RSN, start, rem_len))
1518 		arvif->rsnie_present = true;
1519 	if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, WLAN_OUI_TYPE_MICROSOFT_WPA,
1520 				    start, rem_len))
1521 		arvif->wpaie_present = true;
1522 
1523 	ext_cap_ie = cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY, start, rem_len);
1524 	if (ext_cap_ie && ext_cap_ie->datalen >= 11 &&
1525 	    (ext_cap_ie->data[10] & WLAN_EXT_CAPA11_BCN_PROTECT))
1526 		tx_arvif->beacon_prot = true;
1527 
1528 	/* Return from here for the transmitted profile */
1529 	if (!bssid_index)
1530 		return;
1531 
1532 	/* Initial rsnie_present for the nontransmitted profile is set to be same as that
1533 	 * of the transmitted profile. It will be changed if security configurations are
1534 	 * different.
1535 	 */
1536 	*nontx_profile_found = false;
1537 	for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, rem_len) {
1538 		/* Fixed minimum MBSSID element length with at least one
1539 		 * nontransmitted BSSID profile is 12 bytes as given below;
1540 		 * 1 (max BSSID indicator) +
1541 		 * 2 (Nontransmitted BSSID profile: Subelement ID + length) +
1542 		 * 4 (Nontransmitted BSSID Capabilities: tag + length + info)
1543 		 * 2 (Nontransmitted BSSID SSID: tag + length)
1544 		 * 3 (Nontransmitted BSSID Index: tag + length + BSSID index
1545 		 */
1546 		if (elem->datalen < 12 || elem->data[0] < 1)
1547 			continue; /* Max BSSID indicator must be >=1 */
1548 
1549 		for_each_element(nontx, elem->data + 1, elem->datalen - 1) {
1550 			start = nontx->data;
1551 
1552 			if (nontx->id != 0 || nontx->datalen < 4)
1553 				continue; /* Invalid nontransmitted profile */
1554 
1555 			if (nontx->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
1556 			    nontx->data[1] != 2) {
1557 				continue; /* Missing nontransmitted BSS capabilities */
1558 			}
1559 
1560 			if (nontx->data[4] != WLAN_EID_SSID)
1561 				continue; /* Missing SSID for nontransmitted BSS */
1562 
1563 			index = cfg80211_find_elem(WLAN_EID_MULTI_BSSID_IDX,
1564 						   start, nontx->datalen);
1565 			if (!index || index->datalen < 1 || index->data[0] == 0)
1566 				continue; /* Invalid MBSSID Index element */
1567 
1568 			if (index->data[0] == bssid_index) {
1569 				*nontx_profile_found = true;
1570 
1571 				/* Check if nontx BSS has beacon protection enabled */
1572 				if (!tx_arvif->beacon_prot) {
1573 					ext_cap_ie =
1574 					    cfg80211_find_elem(WLAN_EID_EXT_CAPABILITY,
1575 							       nontx->data,
1576 							       nontx->datalen);
1577 					if (ext_cap_ie && ext_cap_ie->datalen >= 11 &&
1578 					    (ext_cap_ie->data[10] &
1579 					     WLAN_EXT_CAPA11_BCN_PROTECT))
1580 						tx_arvif->beacon_prot = true;
1581 				}
1582 
1583 				if (cfg80211_find_ie(WLAN_EID_RSN,
1584 						     nontx->data,
1585 						     nontx->datalen)) {
1586 					arvif->rsnie_present = true;
1587 					return;
1588 				} else if (!arvif->rsnie_present) {
1589 					return; /* Both tx and nontx BSS are open */
1590 				}
1591 
1592 				nie = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
1593 							     nontx->data,
1594 							     nontx->datalen);
1595 				if (!nie || nie->datalen < 2)
1596 					return; /* Invalid non-inheritance element */
1597 
1598 				for (i = 1; i < nie->datalen - 1; i++) {
1599 					if (nie->data[i] == WLAN_EID_RSN) {
1600 						arvif->rsnie_present = false;
1601 						break;
1602 					}
1603 				}
1604 
1605 				return;
1606 			}
1607 		}
1608 	}
1609 }
1610 
ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif * arvif,struct ath12k_link_vif * tx_arvif,u8 bssid_index)1611 static int ath12k_mac_setup_bcn_tmpl_ema(struct ath12k_link_vif *arvif,
1612 					 struct ath12k_link_vif *tx_arvif,
1613 					 u8 bssid_index)
1614 {
1615 	struct ath12k_wmi_bcn_tmpl_ema_arg ema_args;
1616 	struct ieee80211_ema_beacons *beacons;
1617 	bool nontx_profile_found = false;
1618 	int ret = 0;
1619 	u8 i;
1620 
1621 	beacons = ieee80211_beacon_get_template_ema_list(ath12k_ar_to_hw(tx_arvif->ar),
1622 							 tx_arvif->ahvif->vif,
1623 							 tx_arvif->link_id);
1624 	if (!beacons || !beacons->cnt) {
1625 		ath12k_warn(arvif->ar->ab,
1626 			    "failed to get ema beacon templates from mac80211\n");
1627 		return -EPERM;
1628 	}
1629 
1630 	if (tx_arvif == arvif)
1631 		ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[0].skb, 0, NULL);
1632 
1633 	for (i = 0; i < beacons->cnt; i++) {
1634 		if (tx_arvif != arvif && !nontx_profile_found)
1635 			ath12k_mac_set_arvif_ies(arvif, tx_arvif, beacons->bcn[i].skb,
1636 						 bssid_index,
1637 						 &nontx_profile_found);
1638 
1639 		ema_args.bcn_cnt = beacons->cnt;
1640 		ema_args.bcn_index = i;
1641 		ret = ath12k_wmi_bcn_tmpl(tx_arvif, &beacons->bcn[i].offs,
1642 					  beacons->bcn[i].skb, &ema_args);
1643 		if (ret) {
1644 			ath12k_warn(tx_arvif->ar->ab,
1645 				    "failed to set ema beacon template id %i error %d\n",
1646 				    i, ret);
1647 			break;
1648 		}
1649 	}
1650 
1651 	if (tx_arvif != arvif && !nontx_profile_found)
1652 		ath12k_warn(arvif->ar->ab,
1653 			    "nontransmitted bssid index %u not found in beacon template\n",
1654 			    bssid_index);
1655 
1656 	ieee80211_beacon_free_ema_list(beacons);
1657 	return ret;
1658 }
1659 
ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif * arvif)1660 static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif)
1661 {
1662 	struct ath12k_vif *ahvif = arvif->ahvif;
1663 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
1664 	struct ieee80211_bss_conf *link_conf;
1665 	struct ath12k_link_vif *tx_arvif;
1666 	struct ath12k *ar = arvif->ar;
1667 	struct ath12k_base *ab = ar->ab;
1668 	struct ieee80211_mutable_offsets offs = {};
1669 	bool nontx_profile_found = false;
1670 	struct sk_buff *bcn;
1671 	int ret;
1672 
1673 	if (ahvif->vdev_type != WMI_VDEV_TYPE_AP)
1674 		return 0;
1675 
1676 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
1677 	if (!link_conf) {
1678 		ath12k_warn(ar->ab, "unable to access bss link conf to set bcn tmpl for vif %pM link %u\n",
1679 			    vif->addr, arvif->link_id);
1680 		return -ENOLINK;
1681 	}
1682 
1683 	tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
1684 	if (tx_arvif) {
1685 		if (tx_arvif != arvif && arvif->is_up)
1686 			return 0;
1687 
1688 		if (link_conf->ema_ap)
1689 			return ath12k_mac_setup_bcn_tmpl_ema(arvif, tx_arvif,
1690 							     link_conf->bssid_index);
1691 	} else {
1692 		tx_arvif = arvif;
1693 	}
1694 
1695 	bcn = ieee80211_beacon_get_template(ath12k_ar_to_hw(tx_arvif->ar),
1696 					    tx_arvif->ahvif->vif,
1697 					    &offs, tx_arvif->link_id);
1698 	if (!bcn) {
1699 		ath12k_warn(ab, "failed to get beacon template from mac80211\n");
1700 		return -EPERM;
1701 	}
1702 
1703 	if (tx_arvif == arvif) {
1704 		ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn, 0, NULL);
1705 	} else {
1706 		ath12k_mac_set_arvif_ies(arvif, tx_arvif, bcn,
1707 					 link_conf->bssid_index,
1708 					 &nontx_profile_found);
1709 		if (!nontx_profile_found)
1710 			ath12k_warn(ab,
1711 				    "nontransmitted profile not found in beacon template\n");
1712 	}
1713 
1714 	if (ahvif->vif->type == NL80211_IFTYPE_AP && ahvif->vif->p2p) {
1715 		ret = ath12k_mac_setup_bcn_p2p_ie(arvif, bcn);
1716 		if (ret) {
1717 			ath12k_warn(ab, "failed to setup P2P GO bcn ie: %d\n",
1718 				    ret);
1719 			goto free_bcn_skb;
1720 		}
1721 
1722 		/* P2P IE is inserted by firmware automatically (as
1723 		 * configured above) so remove it from the base beacon
1724 		 * template to avoid duplicate P2P IEs in beacon frames.
1725 		 */
1726 		ret = ath12k_mac_remove_vendor_ie(bcn, WLAN_OUI_WFA,
1727 						  WLAN_OUI_TYPE_WFA_P2P,
1728 						  offsetof(struct ieee80211_mgmt,
1729 							   u.beacon.variable));
1730 		if (ret) {
1731 			ath12k_warn(ab, "failed to remove P2P vendor ie: %d\n",
1732 				    ret);
1733 			goto free_bcn_skb;
1734 		}
1735 	}
1736 
1737 	ret = ath12k_wmi_bcn_tmpl(arvif, &offs, bcn, NULL);
1738 
1739 	if (ret)
1740 		ath12k_warn(ab, "failed to submit beacon template command: %d\n",
1741 			    ret);
1742 
1743 free_bcn_skb:
1744 	kfree_skb(bcn);
1745 	return ret;
1746 }
1747 
ath12k_control_beaconing(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)1748 static void ath12k_control_beaconing(struct ath12k_link_vif *arvif,
1749 				     struct ieee80211_bss_conf *info)
1750 {
1751 	struct ath12k_wmi_vdev_up_params params = {};
1752 	struct ath12k_vif *ahvif = arvif->ahvif;
1753 	struct ath12k *ar = arvif->ar;
1754 	int ret;
1755 
1756 	lockdep_assert_wiphy(ath12k_ar_to_hw(arvif->ar)->wiphy);
1757 
1758 	if (!info->enable_beacon) {
1759 		ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
1760 		if (ret)
1761 			ath12k_warn(ar->ab, "failed to down vdev_id %i: %d\n",
1762 				    arvif->vdev_id, ret);
1763 
1764 		arvif->is_up = false;
1765 		return;
1766 	}
1767 
1768 	/* Install the beacon template to the FW */
1769 	ret = ath12k_mac_setup_bcn_tmpl(arvif);
1770 	if (ret) {
1771 		ath12k_warn(ar->ab, "failed to update bcn tmpl during vdev up: %d\n",
1772 			    ret);
1773 		return;
1774 	}
1775 
1776 	ahvif->aid = 0;
1777 
1778 	ether_addr_copy(arvif->bssid, info->addr);
1779 
1780 	params.vdev_id = arvif->vdev_id;
1781 	params.aid = ahvif->aid;
1782 	params.bssid = arvif->bssid;
1783 	params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
1784 	if (params.tx_bssid) {
1785 		params.nontx_profile_idx = info->bssid_index;
1786 		params.nontx_profile_cnt = 1 << info->bssid_indicator;
1787 	}
1788 	ret = ath12k_wmi_vdev_up(arvif->ar, &params);
1789 	if (ret) {
1790 		ath12k_warn(ar->ab, "failed to bring up vdev %d: %i\n",
1791 			    arvif->vdev_id, ret);
1792 		return;
1793 	}
1794 
1795 	arvif->is_up = true;
1796 
1797 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d up\n", arvif->vdev_id);
1798 }
1799 
ath12k_mac_handle_beacon_iter(void * data,u8 * mac,struct ieee80211_vif * vif)1800 static void ath12k_mac_handle_beacon_iter(void *data, u8 *mac,
1801 					  struct ieee80211_vif *vif)
1802 {
1803 	struct sk_buff *skb = data;
1804 	struct ieee80211_mgmt *mgmt = (void *)skb->data;
1805 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
1806 	struct ath12k_link_vif *arvif = &ahvif->deflink;
1807 
1808 	if (vif->type != NL80211_IFTYPE_STATION || !arvif->is_created)
1809 		return;
1810 
1811 	if (!ether_addr_equal(mgmt->bssid, vif->bss_conf.bssid))
1812 		return;
1813 
1814 	cancel_delayed_work(&arvif->connection_loss_work);
1815 }
1816 
ath12k_mac_handle_beacon(struct ath12k * ar,struct sk_buff * skb)1817 void ath12k_mac_handle_beacon(struct ath12k *ar, struct sk_buff *skb)
1818 {
1819 	ieee80211_iterate_active_interfaces_atomic(ath12k_ar_to_hw(ar),
1820 						   IEEE80211_IFACE_ITER_NORMAL,
1821 						   ath12k_mac_handle_beacon_iter,
1822 						   skb);
1823 }
1824 
ath12k_mac_handle_beacon_miss(struct ath12k * ar,struct ath12k_link_vif * arvif)1825 void ath12k_mac_handle_beacon_miss(struct ath12k *ar,
1826 				   struct ath12k_link_vif *arvif)
1827 {
1828 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1829 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1830 
1831 	if (!(arvif->is_created && arvif->is_up))
1832 		return;
1833 
1834 	ieee80211_beacon_loss(vif);
1835 
1836 	/* Firmware doesn't report beacon loss events repeatedly. If AP probe
1837 	 * (done by mac80211) succeeds but beacons do not resume then it
1838 	 * doesn't make sense to continue operation. Queue connection loss work
1839 	 * which can be cancelled when beacon is received.
1840 	 */
1841 	ieee80211_queue_delayed_work(hw, &arvif->connection_loss_work,
1842 				     ATH12K_CONNECTION_LOSS_HZ);
1843 }
1844 
ath12k_mac_vif_sta_connection_loss_work(struct work_struct * work)1845 static void ath12k_mac_vif_sta_connection_loss_work(struct work_struct *work)
1846 {
1847 	struct ath12k_link_vif *arvif = container_of(work, struct ath12k_link_vif,
1848 						     connection_loss_work.work);
1849 	struct ieee80211_vif *vif = arvif->ahvif->vif;
1850 
1851 	if (!arvif->is_up)
1852 		return;
1853 
1854 	ieee80211_connection_loss(vif);
1855 }
1856 
ath12k_peer_assoc_h_basic(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1857 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
1858 				      struct ath12k_link_vif *arvif,
1859 				      struct ath12k_link_sta *arsta,
1860 				      struct ath12k_wmi_peer_assoc_arg *arg)
1861 {
1862 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1863 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1864 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1865 	struct ieee80211_bss_conf *bss_conf;
1866 	u32 aid;
1867 
1868 	lockdep_assert_wiphy(hw->wiphy);
1869 
1870 	if (vif->type == NL80211_IFTYPE_STATION)
1871 		aid = vif->cfg.aid;
1872 	else
1873 		aid = sta->aid;
1874 
1875 	ether_addr_copy(arg->peer_mac, arsta->addr);
1876 	arg->vdev_id = arvif->vdev_id;
1877 	arg->peer_associd = aid;
1878 	arg->auth_flag = true;
1879 	/* TODO: STA WAR in ath10k for listen interval required? */
1880 	arg->peer_listen_intval = hw->conf.listen_interval;
1881 	arg->peer_nss = 1;
1882 
1883 	bss_conf = ath12k_mac_get_link_bss_conf(arvif);
1884 	if (!bss_conf) {
1885 		ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc for vif %pM link %u\n",
1886 			    vif->addr, arvif->link_id);
1887 		return;
1888 	}
1889 
1890 	arg->peer_caps = bss_conf->assoc_capability;
1891 }
1892 
ath12k_peer_assoc_h_crypto(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1893 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
1894 				       struct ath12k_link_vif *arvif,
1895 				       struct ath12k_link_sta *arsta,
1896 				       struct ath12k_wmi_peer_assoc_arg *arg)
1897 {
1898 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1899 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1900 	struct ieee80211_bss_conf *info;
1901 	struct cfg80211_chan_def def;
1902 	struct cfg80211_bss *bss;
1903 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1904 	const u8 *rsnie = NULL;
1905 	const u8 *wpaie = NULL;
1906 
1907 	lockdep_assert_wiphy(hw->wiphy);
1908 
1909 	info = ath12k_mac_get_link_bss_conf(arvif);
1910 	if (!info) {
1911 		ath12k_warn(ar->ab, "unable to access bss link conf for peer assoc crypto for vif %pM link %u\n",
1912 			    vif->addr, arvif->link_id);
1913 		return;
1914 	}
1915 
1916 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1917 		return;
1918 
1919 	bss = cfg80211_get_bss(hw->wiphy, def.chan, info->bssid, NULL, 0,
1920 			       IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1921 
1922 	if (arvif->rsnie_present || arvif->wpaie_present) {
1923 		arg->need_ptk_4_way = true;
1924 		if (arvif->wpaie_present)
1925 			arg->need_gtk_2_way = true;
1926 	} else if (bss) {
1927 		const struct cfg80211_bss_ies *ies;
1928 
1929 		rcu_read_lock();
1930 		rsnie = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
1931 
1932 		ies = rcu_dereference(bss->ies);
1933 
1934 		wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1935 						WLAN_OUI_TYPE_MICROSOFT_WPA,
1936 						ies->data,
1937 						ies->len);
1938 		rcu_read_unlock();
1939 		cfg80211_put_bss(hw->wiphy, bss);
1940 	}
1941 
1942 	/* FIXME: base on RSN IE/WPA IE is a correct idea? */
1943 	if (rsnie || wpaie) {
1944 		ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1945 			   "%s: rsn ie found\n", __func__);
1946 		arg->need_ptk_4_way = true;
1947 	}
1948 
1949 	if (wpaie) {
1950 		ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
1951 			   "%s: wpa ie found\n", __func__);
1952 		arg->need_gtk_2_way = true;
1953 	}
1954 
1955 	if (sta->mfp) {
1956 		/* TODO: Need to check if FW supports PMF? */
1957 		arg->is_pmf_enabled = true;
1958 	}
1959 
1960 	/* TODO: safe_mode_enabled (bypass 4-way handshake) flag req? */
1961 }
1962 
ath12k_peer_assoc_h_rates(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)1963 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
1964 				      struct ath12k_link_vif *arvif,
1965 				      struct ath12k_link_sta *arsta,
1966 				      struct ath12k_wmi_peer_assoc_arg *arg)
1967 {
1968 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
1969 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
1970 	struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
1971 	struct ieee80211_link_sta *link_sta;
1972 	struct cfg80211_chan_def def;
1973 	const struct ieee80211_supported_band *sband;
1974 	const struct ieee80211_rate *rates;
1975 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
1976 	enum nl80211_band band;
1977 	u32 ratemask;
1978 	u8 rate;
1979 	int i;
1980 
1981 	lockdep_assert_wiphy(hw->wiphy);
1982 
1983 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
1984 		return;
1985 
1986 	link_sta = ath12k_mac_get_link_sta(arsta);
1987 	if (!link_sta) {
1988 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc rates for sta %pM link %u\n",
1989 			    sta->addr, arsta->link_id);
1990 		return;
1991 	}
1992 
1993 	band = def.chan->band;
1994 	sband = hw->wiphy->bands[band];
1995 	ratemask = link_sta->supp_rates[band];
1996 	ratemask &= arvif->bitrate_mask.control[band].legacy;
1997 	rates = sband->bitrates;
1998 
1999 	rateset->num_rates = 0;
2000 
2001 	for (i = 0; i < 32; i++, ratemask >>= 1, rates++) {
2002 		if (!(ratemask & 1))
2003 			continue;
2004 
2005 		rate = ath12k_mac_bitrate_to_rate(rates->bitrate);
2006 		rateset->rates[rateset->num_rates] = rate;
2007 		rateset->num_rates++;
2008 	}
2009 }
2010 
2011 static bool
ath12k_peer_assoc_h_ht_masked(const u8 * ht_mcs_mask)2012 ath12k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask)
2013 {
2014 	int nss;
2015 
2016 	for (nss = 0; nss < IEEE80211_HT_MCS_MASK_LEN; nss++)
2017 		if (ht_mcs_mask[nss])
2018 			return false;
2019 
2020 	return true;
2021 }
2022 
2023 static bool
ath12k_peer_assoc_h_vht_masked(const u16 * vht_mcs_mask)2024 ath12k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask)
2025 {
2026 	int nss;
2027 
2028 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++)
2029 		if (vht_mcs_mask[nss])
2030 			return false;
2031 
2032 	return true;
2033 }
2034 
ath12k_peer_assoc_h_ht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2035 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
2036 				   struct ath12k_link_vif *arvif,
2037 				   struct ath12k_link_sta *arsta,
2038 				   struct ath12k_wmi_peer_assoc_arg *arg)
2039 {
2040 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2041 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2042 	const struct ieee80211_sta_ht_cap *ht_cap;
2043 	struct ieee80211_link_sta *link_sta;
2044 	struct cfg80211_chan_def def;
2045 	enum nl80211_band band;
2046 	const u8 *ht_mcs_mask;
2047 	int i, n;
2048 	u8 max_nss;
2049 	u32 stbc;
2050 
2051 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2052 
2053 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2054 		return;
2055 
2056 	link_sta = ath12k_mac_get_link_sta(arsta);
2057 	if (!link_sta) {
2058 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc ht for sta %pM link %u\n",
2059 			    sta->addr, arsta->link_id);
2060 		return;
2061 	}
2062 
2063 	ht_cap = &link_sta->ht_cap;
2064 	if (!ht_cap->ht_supported)
2065 		return;
2066 
2067 	band = def.chan->band;
2068 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
2069 
2070 	if (ath12k_peer_assoc_h_ht_masked(ht_mcs_mask))
2071 		return;
2072 
2073 	arg->ht_flag = true;
2074 
2075 	arg->peer_max_mpdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2076 				    ht_cap->ampdu_factor)) - 1;
2077 
2078 	arg->peer_mpdu_density =
2079 		ath12k_parse_mpdudensity(ht_cap->ampdu_density);
2080 
2081 	arg->peer_ht_caps = ht_cap->cap;
2082 	arg->peer_rate_caps |= WMI_HOST_RC_HT_FLAG;
2083 
2084 	if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
2085 		arg->ldpc_flag = true;
2086 
2087 	if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
2088 		arg->bw_40 = true;
2089 		arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
2090 	}
2091 
2092 	/* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20
2093 	 * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both
2094 	 * flags if guard interval is to force Long GI
2095 	 */
2096 	if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_FORCE_LGI) {
2097 		arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40);
2098 	} else {
2099 		/* Enable SGI flag if either SGI_20 or SGI_40 is supported */
2100 		if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40))
2101 			arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
2102 	}
2103 
2104 	if (ht_cap->cap & IEEE80211_HT_CAP_TX_STBC) {
2105 		arg->peer_rate_caps |= WMI_HOST_RC_TX_STBC_FLAG;
2106 		arg->stbc_flag = true;
2107 	}
2108 
2109 	if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
2110 		stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
2111 		stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
2112 		stbc = stbc << WMI_HOST_RC_RX_STBC_FLAG_S;
2113 		arg->peer_rate_caps |= stbc;
2114 		arg->stbc_flag = true;
2115 	}
2116 
2117 	if (ht_cap->mcs.rx_mask[1] && ht_cap->mcs.rx_mask[2])
2118 		arg->peer_rate_caps |= WMI_HOST_RC_TS_FLAG;
2119 	else if (ht_cap->mcs.rx_mask[1])
2120 		arg->peer_rate_caps |= WMI_HOST_RC_DS_FLAG;
2121 
2122 	for (i = 0, n = 0, max_nss = 0; i < IEEE80211_HT_MCS_MASK_LEN * 8; i++)
2123 		if ((ht_cap->mcs.rx_mask[i / 8] & BIT(i % 8)) &&
2124 		    (ht_mcs_mask[i / 8] & BIT(i % 8))) {
2125 			max_nss = (i / 8) + 1;
2126 			arg->peer_ht_rates.rates[n++] = i;
2127 		}
2128 
2129 	/* This is a workaround for HT-enabled STAs which break the spec
2130 	 * and have no HT capabilities RX mask (no HT RX MCS map).
2131 	 *
2132 	 * As per spec, in section 20.3.5 Modulation and coding scheme (MCS),
2133 	 * MCS 0 through 7 are mandatory in 20MHz with 800 ns GI at all STAs.
2134 	 *
2135 	 * Firmware asserts if such situation occurs.
2136 	 */
2137 	if (n == 0) {
2138 		arg->peer_ht_rates.num_rates = 8;
2139 		for (i = 0; i < arg->peer_ht_rates.num_rates; i++)
2140 			arg->peer_ht_rates.rates[i] = i;
2141 	} else {
2142 		arg->peer_ht_rates.num_rates = n;
2143 		arg->peer_nss = min(link_sta->rx_nss, max_nss);
2144 	}
2145 
2146 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
2147 		   arg->peer_mac,
2148 		   arg->peer_ht_rates.num_rates,
2149 		   arg->peer_nss);
2150 }
2151 
ath12k_mac_get_max_vht_mcs_map(u16 mcs_map,int nss)2152 static int ath12k_mac_get_max_vht_mcs_map(u16 mcs_map, int nss)
2153 {
2154 	switch ((mcs_map >> (2 * nss)) & 0x3) {
2155 	case IEEE80211_VHT_MCS_SUPPORT_0_7: return BIT(8) - 1;
2156 	case IEEE80211_VHT_MCS_SUPPORT_0_8: return BIT(9) - 1;
2157 	case IEEE80211_VHT_MCS_SUPPORT_0_9: return BIT(10) - 1;
2158 	}
2159 	return 0;
2160 }
2161 
2162 static u16
ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])2163 ath12k_peer_assoc_h_vht_limit(u16 tx_mcs_set,
2164 			      const u16 vht_mcs_limit[NL80211_VHT_NSS_MAX])
2165 {
2166 	int idx_limit;
2167 	int nss;
2168 	u16 mcs_map;
2169 	u16 mcs;
2170 
2171 	for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) {
2172 		mcs_map = ath12k_mac_get_max_vht_mcs_map(tx_mcs_set, nss) &
2173 			  vht_mcs_limit[nss];
2174 
2175 		if (mcs_map)
2176 			idx_limit = fls(mcs_map) - 1;
2177 		else
2178 			idx_limit = -1;
2179 
2180 		switch (idx_limit) {
2181 		case 0:
2182 		case 1:
2183 		case 2:
2184 		case 3:
2185 		case 4:
2186 		case 5:
2187 		case 6:
2188 		case 7:
2189 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_7;
2190 			break;
2191 		case 8:
2192 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_8;
2193 			break;
2194 		case 9:
2195 			mcs = IEEE80211_VHT_MCS_SUPPORT_0_9;
2196 			break;
2197 		default:
2198 			WARN_ON(1);
2199 			fallthrough;
2200 		case -1:
2201 			mcs = IEEE80211_VHT_MCS_NOT_SUPPORTED;
2202 			break;
2203 		}
2204 
2205 		tx_mcs_set &= ~(0x3 << (nss * 2));
2206 		tx_mcs_set |= mcs << (nss * 2);
2207 	}
2208 
2209 	return tx_mcs_set;
2210 }
2211 
ath12k_get_nss_160mhz(struct ath12k * ar,u8 max_nss)2212 static u8 ath12k_get_nss_160mhz(struct ath12k *ar,
2213 				u8 max_nss)
2214 {
2215 	u8 nss_ratio_info = ar->pdev->cap.nss_ratio_info;
2216 	u8 max_sup_nss = 0;
2217 
2218 	switch (nss_ratio_info) {
2219 	case WMI_NSS_RATIO_1BY2_NSS:
2220 		max_sup_nss = max_nss >> 1;
2221 		break;
2222 	case WMI_NSS_RATIO_3BY4_NSS:
2223 		ath12k_warn(ar->ab, "WMI_NSS_RATIO_3BY4_NSS not supported\n");
2224 		break;
2225 	case WMI_NSS_RATIO_1_NSS:
2226 		max_sup_nss = max_nss;
2227 		break;
2228 	case WMI_NSS_RATIO_2_NSS:
2229 		ath12k_warn(ar->ab, "WMI_NSS_RATIO_2_NSS not supported\n");
2230 		break;
2231 	default:
2232 		ath12k_warn(ar->ab, "invalid nss ratio received from fw: %d\n",
2233 			    nss_ratio_info);
2234 		break;
2235 	}
2236 
2237 	return max_sup_nss;
2238 }
2239 
ath12k_peer_assoc_h_vht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2240 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
2241 				    struct ath12k_link_vif *arvif,
2242 				    struct ath12k_link_sta *arsta,
2243 				    struct ath12k_wmi_peer_assoc_arg *arg)
2244 {
2245 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2246 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2247 	const struct ieee80211_sta_vht_cap *vht_cap;
2248 	struct ieee80211_link_sta *link_sta;
2249 	struct cfg80211_chan_def def;
2250 	enum nl80211_band band;
2251 	u16 *vht_mcs_mask;
2252 	u16 tx_mcs_map;
2253 	u8 ampdu_factor;
2254 	u8 max_nss, vht_mcs;
2255 	int i, vht_nss, nss_idx;
2256 	bool user_rate_valid = true;
2257 	u32 rx_nss, tx_nss, nss_160;
2258 
2259 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2260 
2261 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2262 		return;
2263 
2264 	link_sta = ath12k_mac_get_link_sta(arsta);
2265 	if (!link_sta) {
2266 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc vht for sta %pM link %u\n",
2267 			    sta->addr, arsta->link_id);
2268 		return;
2269 	}
2270 
2271 	vht_cap = &link_sta->vht_cap;
2272 	if (!vht_cap->vht_supported)
2273 		return;
2274 
2275 	band = def.chan->band;
2276 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
2277 
2278 	if (ath12k_peer_assoc_h_vht_masked(vht_mcs_mask))
2279 		return;
2280 
2281 	arg->vht_flag = true;
2282 
2283 	/* TODO: similar flags required? */
2284 	arg->vht_capable = true;
2285 
2286 	if (def.chan->band == NL80211_BAND_2GHZ)
2287 		arg->vht_ng_flag = true;
2288 
2289 	arg->peer_vht_caps = vht_cap->cap;
2290 
2291 	ampdu_factor = (vht_cap->cap &
2292 			IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
2293 		       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
2294 
2295 	/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
2296 	 * zero in VHT IE. Using it would result in degraded throughput.
2297 	 * arg->peer_max_mpdu at this point contains HT max_mpdu so keep
2298 	 * it if VHT max_mpdu is smaller.
2299 	 */
2300 	arg->peer_max_mpdu = max(arg->peer_max_mpdu,
2301 				 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
2302 					ampdu_factor)) - 1);
2303 
2304 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2305 		arg->bw_80 = true;
2306 
2307 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2308 		arg->bw_160 = true;
2309 
2310 	vht_nss =  ath12k_mac_max_vht_nss(vht_mcs_mask);
2311 
2312 	if (vht_nss > link_sta->rx_nss) {
2313 		user_rate_valid = false;
2314 		for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2315 			if (vht_mcs_mask[nss_idx]) {
2316 				user_rate_valid = true;
2317 				break;
2318 			}
2319 		}
2320 	}
2321 
2322 	if (!user_rate_valid) {
2323 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2324 			   "Setting vht range MCS value to peer supported nss:%d for peer %pM\n",
2325 			   link_sta->rx_nss, arsta->addr);
2326 		vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
2327 	}
2328 
2329 	/* Calculate peer NSS capability from VHT capabilities if STA
2330 	 * supports VHT.
2331 	 */
2332 	for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
2333 		vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
2334 			  (2 * i) & 3;
2335 
2336 		if (vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED &&
2337 		    vht_mcs_mask[i])
2338 			max_nss = i + 1;
2339 	}
2340 	arg->peer_nss = min(link_sta->rx_nss, max_nss);
2341 	arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
2342 	arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
2343 	arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
2344 
2345 	tx_mcs_map = __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
2346 	arg->tx_mcs_set = ath12k_peer_assoc_h_vht_limit(tx_mcs_map, vht_mcs_mask);
2347 
2348 	/* In QCN9274 platform, VHT MCS rate 10 and 11 is enabled by default.
2349 	 * VHT MCS rate 10 and 11 is not supported in 11ac standard.
2350 	 * so explicitly disable the VHT MCS rate 10 and 11 in 11ac mode.
2351 	 */
2352 	arg->tx_mcs_set &= ~IEEE80211_VHT_MCS_SUPPORT_0_11_MASK;
2353 	arg->tx_mcs_set |= IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11;
2354 
2355 	if ((arg->tx_mcs_set & IEEE80211_VHT_MCS_NOT_SUPPORTED) ==
2356 			IEEE80211_VHT_MCS_NOT_SUPPORTED)
2357 		arg->peer_vht_caps &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
2358 
2359 	/* TODO:  Check */
2360 	arg->tx_max_mcs_nss = 0xFF;
2361 
2362 	if (arg->peer_phymode == MODE_11AC_VHT160) {
2363 		tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
2364 		rx_nss = min(arg->peer_nss, tx_nss);
2365 		arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2366 
2367 		if (!rx_nss) {
2368 			ath12k_warn(ar->ab, "invalid max_nss\n");
2369 			return;
2370 		}
2371 
2372 		nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2373 		arg->peer_bw_rxnss_override |= nss_160;
2374 	}
2375 
2376 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2377 		   "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
2378 		   arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
2379 		   arg->peer_bw_rxnss_override);
2380 }
2381 
ath12k_mac_get_max_he_mcs_map(u16 mcs_map,int nss)2382 static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
2383 {
2384 	switch ((mcs_map >> (2 * nss)) & 0x3) {
2385 	case IEEE80211_HE_MCS_SUPPORT_0_7: return BIT(8) - 1;
2386 	case IEEE80211_HE_MCS_SUPPORT_0_9: return BIT(10) - 1;
2387 	case IEEE80211_HE_MCS_SUPPORT_0_11: return BIT(12) - 1;
2388 	}
2389 	return 0;
2390 }
2391 
ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,const u16 * he_mcs_limit)2392 static u16 ath12k_peer_assoc_h_he_limit(u16 tx_mcs_set,
2393 					const u16 *he_mcs_limit)
2394 {
2395 	int idx_limit;
2396 	int nss;
2397 	u16 mcs_map;
2398 	u16 mcs;
2399 
2400 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) {
2401 		mcs_map = ath12k_mac_get_max_he_mcs_map(tx_mcs_set, nss) &
2402 			he_mcs_limit[nss];
2403 
2404 		if (mcs_map)
2405 			idx_limit = fls(mcs_map) - 1;
2406 		else
2407 			idx_limit = -1;
2408 
2409 		switch (idx_limit) {
2410 		case 0 ... 7:
2411 			mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
2412 			break;
2413 		case 8:
2414 		case 9:
2415 			mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
2416 			break;
2417 		case 10:
2418 		case 11:
2419 			mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
2420 			break;
2421 		default:
2422 			WARN_ON(1);
2423 			fallthrough;
2424 		case -1:
2425 			mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
2426 			break;
2427 		}
2428 
2429 		tx_mcs_set &= ~(0x3 << (nss * 2));
2430 		tx_mcs_set |= mcs << (nss * 2);
2431 	}
2432 
2433 	return tx_mcs_set;
2434 }
2435 
2436 static bool
ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])2437 ath12k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX])
2438 {
2439 	int nss;
2440 
2441 	for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++)
2442 		if (he_mcs_mask[nss])
2443 			return false;
2444 
2445 	return true;
2446 }
2447 
ath12k_peer_assoc_h_he(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2448 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
2449 				   struct ath12k_link_vif *arvif,
2450 				   struct ath12k_link_sta *arsta,
2451 				   struct ath12k_wmi_peer_assoc_arg *arg)
2452 {
2453 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2454 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2455 	const struct ieee80211_sta_he_cap *he_cap;
2456 	struct ieee80211_bss_conf *link_conf;
2457 	struct ieee80211_link_sta *link_sta;
2458 	struct cfg80211_chan_def def;
2459 	int i;
2460 	u8 ampdu_factor, max_nss;
2461 	u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2462 	u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
2463 	u16 mcs_160_map, mcs_80_map;
2464 	u8 link_id = arvif->link_id;
2465 	bool support_160;
2466 	enum nl80211_band band;
2467 	u16 *he_mcs_mask;
2468 	u8 he_mcs;
2469 	u16 he_tx_mcs = 0, v = 0;
2470 	int he_nss, nss_idx;
2471 	bool user_rate_valid = true;
2472 	u32 rx_nss, tx_nss, nss_160;
2473 
2474 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
2475 		return;
2476 
2477 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
2478 	if (!link_conf) {
2479 		ath12k_warn(ar->ab, "unable to access bss link conf in peer assoc he for vif %pM link %u",
2480 			    vif->addr, link_id);
2481 		return;
2482 	}
2483 
2484 	link_sta = ath12k_mac_get_link_sta(arsta);
2485 	if (!link_sta) {
2486 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2487 			    sta->addr, arsta->link_id);
2488 		return;
2489 	}
2490 
2491 	he_cap = &link_sta->he_cap;
2492 	if (!he_cap->has_he)
2493 		return;
2494 
2495 	band = def.chan->band;
2496 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
2497 
2498 	if (ath12k_peer_assoc_h_he_masked(he_mcs_mask))
2499 		return;
2500 
2501 	arg->he_flag = true;
2502 
2503 	support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
2504 		  IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G);
2505 
2506 	/* Supported HE-MCS and NSS Set of peer he_cap is intersection with self he_cp */
2507 	mcs_160_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2508 	mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2509 
2510 	if (support_160) {
2511 		for (i = 7; i >= 0; i--) {
2512 			u8 mcs_160 = (mcs_160_map >> (2 * i)) & 3;
2513 
2514 			if (mcs_160 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2515 				rx_mcs_160 = i + 1;
2516 				break;
2517 			}
2518 		}
2519 	}
2520 
2521 	for (i = 7; i >= 0; i--) {
2522 		u8 mcs_80 = (mcs_80_map >> (2 * i)) & 3;
2523 
2524 		if (mcs_80 != IEEE80211_HE_MCS_NOT_SUPPORTED) {
2525 			rx_mcs_80 = i + 1;
2526 			break;
2527 		}
2528 	}
2529 
2530 	if (support_160)
2531 		max_nss = min(rx_mcs_80, rx_mcs_160);
2532 	else
2533 		max_nss = rx_mcs_80;
2534 
2535 	arg->peer_nss = min(link_sta->rx_nss, max_nss);
2536 
2537 	memcpy(&arg->peer_he_cap_macinfo, he_cap->he_cap_elem.mac_cap_info,
2538 	       sizeof(he_cap->he_cap_elem.mac_cap_info));
2539 	memcpy(&arg->peer_he_cap_phyinfo, he_cap->he_cap_elem.phy_cap_info,
2540 	       sizeof(he_cap->he_cap_elem.phy_cap_info));
2541 	arg->peer_he_ops = link_conf->he_oper.params;
2542 
2543 	/* the top most byte is used to indicate BSS color info */
2544 	arg->peer_he_ops &= 0xffffff;
2545 
2546 	/* As per section 26.6.1 IEEE Std 802.11ax‐2022, if the Max AMPDU
2547 	 * Exponent Extension in HE cap is zero, use the arg->peer_max_mpdu
2548 	 * as calculated while parsing VHT caps(if VHT caps is present)
2549 	 * or HT caps (if VHT caps is not present).
2550 	 *
2551 	 * For non-zero value of Max AMPDU Exponent Extension in HE MAC caps,
2552 	 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use
2553 	 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length.
2554 	 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc
2555 	 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu
2556 	 * length.
2557 	 */
2558 	ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2559 				   IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
2560 
2561 	if (ampdu_factor) {
2562 		if (link_sta->vht_cap.vht_supported)
2563 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
2564 						    ampdu_factor)) - 1;
2565 		else if (link_sta->ht_cap.ht_supported)
2566 			arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
2567 						    ampdu_factor)) - 1;
2568 	}
2569 
2570 	if (he_cap->he_cap_elem.phy_cap_info[6] &
2571 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2572 		int bit = 7;
2573 		int nss, ru;
2574 
2575 		arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] &
2576 					  IEEE80211_PPE_THRES_NSS_MASK;
2577 		arg->peer_ppet.ru_bit_mask =
2578 			(he_cap->ppe_thres[0] &
2579 			 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >>
2580 			IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS;
2581 
2582 		for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) {
2583 			for (ru = 0; ru < 4; ru++) {
2584 				u32 val = 0;
2585 				int i;
2586 
2587 				if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0)
2588 					continue;
2589 				for (i = 0; i < 6; i++) {
2590 					val >>= 1;
2591 					val |= ((he_cap->ppe_thres[bit / 8] >>
2592 						 (bit % 8)) & 0x1) << 5;
2593 					bit++;
2594 				}
2595 				arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |=
2596 								val << (ru * 6);
2597 			}
2598 		}
2599 	}
2600 
2601 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES)
2602 		arg->twt_responder = true;
2603 	if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ)
2604 		arg->twt_requester = true;
2605 
2606 	he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
2607 
2608 	if (he_nss > link_sta->rx_nss) {
2609 		user_rate_valid = false;
2610 		for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
2611 			if (he_mcs_mask[nss_idx]) {
2612 				user_rate_valid = true;
2613 				break;
2614 			}
2615 		}
2616 	}
2617 
2618 	if (!user_rate_valid) {
2619 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2620 			   "Setting he range MCS value to peer supported nss:%d for peer %pM\n",
2621 			   link_sta->rx_nss, arsta->addr);
2622 		he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
2623 	}
2624 
2625 	switch (link_sta->bandwidth) {
2626 	case IEEE80211_STA_RX_BW_160:
2627 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
2628 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2629 
2630 		v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2631 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;
2632 
2633 		arg->peer_he_mcs_count++;
2634 		if (!he_tx_mcs)
2635 			he_tx_mcs = v;
2636 		fallthrough;
2637 
2638 	default:
2639 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
2640 		arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2641 
2642 		v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
2643 		v = ath12k_peer_assoc_h_he_limit(v, he_mcs_mask);
2644 		arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;
2645 
2646 		arg->peer_he_mcs_count++;
2647 		if (!he_tx_mcs)
2648 			he_tx_mcs = v;
2649 		break;
2650 	}
2651 
2652 	/* Calculate peer NSS capability from HE capabilities if STA
2653 	 * supports HE.
2654 	 */
2655 	for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) {
2656 		he_mcs = he_tx_mcs >> (2 * i) & 3;
2657 
2658 		/* In case of fixed rates, MCS Range in he_tx_mcs might have
2659 		 * unsupported range, with he_mcs_mask set, so check either of them
2660 		 * to find nss.
2661 		 */
2662 		if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED ||
2663 		    he_mcs_mask[i])
2664 			max_nss = i + 1;
2665 	}
2666 
2667 	max_nss = min(max_nss, ar->num_tx_chains);
2668 	arg->peer_nss = min(link_sta->rx_nss, max_nss);
2669 
2670 	if (arg->peer_phymode == MODE_11AX_HE160) {
2671 		tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
2672 		rx_nss = min(arg->peer_nss, tx_nss);
2673 
2674 		arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
2675 		arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
2676 
2677 		if (!rx_nss) {
2678 			ath12k_warn(ar->ab, "invalid max_nss\n");
2679 			return;
2680 		}
2681 
2682 		nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
2683 		arg->peer_bw_rxnss_override |= nss_160;
2684 	}
2685 
2686 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
2687 		   "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
2688 		   arsta->addr, arg->peer_nss,
2689 		   arg->peer_he_mcs_count,
2690 		   arg->peer_bw_rxnss_override);
2691 }
2692 
ath12k_peer_assoc_h_he_6ghz(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2693 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
2694 					struct ath12k_link_vif *arvif,
2695 					struct ath12k_link_sta *arsta,
2696 					struct ath12k_wmi_peer_assoc_arg *arg)
2697 {
2698 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
2699 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2700 	const struct ieee80211_sta_he_cap *he_cap;
2701 	struct ieee80211_link_sta *link_sta;
2702 	struct cfg80211_chan_def def;
2703 	enum nl80211_band band;
2704 	u8 ampdu_factor, mpdu_density;
2705 
2706 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
2707 		return;
2708 
2709 	band = def.chan->band;
2710 
2711 	link_sta = ath12k_mac_get_link_sta(arsta);
2712 	if (!link_sta) {
2713 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he 6ghz for sta %pM link %u\n",
2714 			    sta->addr, arsta->link_id);
2715 		return;
2716 	}
2717 
2718 	he_cap = &link_sta->he_cap;
2719 
2720 	if (!arg->he_flag || band != NL80211_BAND_6GHZ || !link_sta->he_6ghz_capa.capa)
2721 		return;
2722 
2723 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2724 		arg->bw_40 = true;
2725 
2726 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2727 		arg->bw_80 = true;
2728 
2729 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
2730 		arg->bw_160 = true;
2731 
2732 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2733 		arg->bw_320 = true;
2734 
2735 	arg->peer_he_caps_6ghz = le16_to_cpu(link_sta->he_6ghz_capa.capa);
2736 
2737 	mpdu_density = u32_get_bits(arg->peer_he_caps_6ghz,
2738 				    IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
2739 	arg->peer_mpdu_density = ath12k_parse_mpdudensity(mpdu_density);
2740 
2741 	/* From IEEE Std 802.11ax-2021 - Section 10.12.2: An HE STA shall be capable of
2742 	 * receiving A-MPDU where the A-MPDU pre-EOF padding length is up to the value
2743 	 * indicated by the Maximum A-MPDU Length Exponent Extension field in the HE
2744 	 * Capabilities element and the Maximum A-MPDU Length Exponent field in HE 6 GHz
2745 	 * Band Capabilities element in the 6 GHz band.
2746 	 *
2747 	 * Here, we are extracting the Max A-MPDU Exponent Extension from HE caps and
2748 	 * factor is the Maximum A-MPDU Length Exponent from HE 6 GHZ Band capability.
2749 	 */
2750 	ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3],
2751 				   IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) +
2752 			u32_get_bits(arg->peer_he_caps_6ghz,
2753 				     IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
2754 
2755 	arg->peer_max_mpdu = (1u << (IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR +
2756 				     ampdu_factor)) - 1;
2757 }
2758 
ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa,int * smps)2759 static int ath12k_get_smps_from_capa(const struct ieee80211_sta_ht_cap *ht_cap,
2760 				     const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
2761 				     int *smps)
2762 {
2763 	if (ht_cap->ht_supported)
2764 		*smps = u16_get_bits(ht_cap->cap, IEEE80211_HT_CAP_SM_PS);
2765 	else
2766 		*smps = le16_get_bits(he_6ghz_capa->capa,
2767 				      IEEE80211_HE_6GHZ_CAP_SM_PS);
2768 
2769 	if (*smps >= ARRAY_SIZE(ath12k_smps_map))
2770 		return -EINVAL;
2771 
2772 	return 0;
2773 }
2774 
ath12k_peer_assoc_h_smps(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2775 static void ath12k_peer_assoc_h_smps(struct ath12k_link_sta *arsta,
2776 				     struct ath12k_wmi_peer_assoc_arg *arg)
2777 {
2778 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2779 	const struct ieee80211_he_6ghz_capa *he_6ghz_capa;
2780 	struct ath12k_link_vif *arvif = arsta->arvif;
2781 	const struct ieee80211_sta_ht_cap *ht_cap;
2782 	struct ieee80211_link_sta *link_sta;
2783 	struct ath12k *ar = arvif->ar;
2784 	int smps;
2785 
2786 	link_sta = ath12k_mac_get_link_sta(arsta);
2787 	if (!link_sta) {
2788 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
2789 			    sta->addr, arsta->link_id);
2790 		return;
2791 	}
2792 
2793 	he_6ghz_capa = &link_sta->he_6ghz_capa;
2794 	ht_cap = &link_sta->ht_cap;
2795 
2796 	if (!ht_cap->ht_supported && !he_6ghz_capa->capa)
2797 		return;
2798 
2799 	if (ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps))
2800 		return;
2801 
2802 	switch (smps) {
2803 	case WLAN_HT_CAP_SM_PS_STATIC:
2804 		arg->static_mimops_flag = true;
2805 		break;
2806 	case WLAN_HT_CAP_SM_PS_DYNAMIC:
2807 		arg->dynamic_mimops_flag = true;
2808 		break;
2809 	case WLAN_HT_CAP_SM_PS_DISABLED:
2810 		arg->spatial_mux_flag = true;
2811 		break;
2812 	default:
2813 		break;
2814 	}
2815 }
2816 
ath12k_peer_assoc_h_qos(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)2817 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
2818 				    struct ath12k_link_vif *arvif,
2819 				    struct ath12k_link_sta *arsta,
2820 				    struct ath12k_wmi_peer_assoc_arg *arg)
2821 {
2822 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2823 
2824 	switch (arvif->ahvif->vdev_type) {
2825 	case WMI_VDEV_TYPE_AP:
2826 		if (sta->wme) {
2827 			/* TODO: Check WME vs QoS */
2828 			arg->is_wme_set = true;
2829 			arg->qos_flag = true;
2830 		}
2831 
2832 		if (sta->wme && sta->uapsd_queues) {
2833 			/* TODO: Check WME vs QoS */
2834 			arg->is_wme_set = true;
2835 			arg->apsd_flag = true;
2836 			arg->peer_rate_caps |= WMI_HOST_RC_UAPSD_FLAG;
2837 		}
2838 		break;
2839 	case WMI_VDEV_TYPE_STA:
2840 		if (sta->wme) {
2841 			arg->is_wme_set = true;
2842 			arg->qos_flag = true;
2843 		}
2844 		break;
2845 	default:
2846 		break;
2847 	}
2848 
2849 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
2850 		   arsta->addr, arg->qos_flag);
2851 }
2852 
ath12k_peer_assoc_qos_ap(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)2853 static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
2854 				    struct ath12k_link_vif *arvif,
2855 				    struct ath12k_link_sta *arsta)
2856 {
2857 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
2858 	struct ath12k_wmi_ap_ps_arg arg;
2859 	u32 max_sp;
2860 	u32 uapsd;
2861 	int ret;
2862 
2863 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
2864 
2865 	arg.vdev_id = arvif->vdev_id;
2866 
2867 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac uapsd_queues 0x%x max_sp %d\n",
2868 		   sta->uapsd_queues, sta->max_sp);
2869 
2870 	uapsd = 0;
2871 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
2872 		uapsd |= WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
2873 			 WMI_AP_PS_UAPSD_AC3_TRIGGER_EN;
2874 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
2875 		uapsd |= WMI_AP_PS_UAPSD_AC2_DELIVERY_EN |
2876 			 WMI_AP_PS_UAPSD_AC2_TRIGGER_EN;
2877 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
2878 		uapsd |= WMI_AP_PS_UAPSD_AC1_DELIVERY_EN |
2879 			 WMI_AP_PS_UAPSD_AC1_TRIGGER_EN;
2880 	if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
2881 		uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
2882 			 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
2883 
2884 	max_sp = 0;
2885 	if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
2886 		max_sp = sta->max_sp;
2887 
2888 	arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
2889 	arg.value = uapsd;
2890 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2891 	if (ret)
2892 		goto err;
2893 
2894 	arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
2895 	arg.value = max_sp;
2896 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2897 	if (ret)
2898 		goto err;
2899 
2900 	/* TODO: revisit during testing */
2901 	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
2902 	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2903 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2904 	if (ret)
2905 		goto err;
2906 
2907 	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
2908 	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
2909 	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
2910 	if (ret)
2911 		goto err;
2912 
2913 	return 0;
2914 
2915 err:
2916 	ath12k_warn(ar->ab, "failed to set ap ps peer param %d for vdev %i: %d\n",
2917 		    arg.param, arvif->vdev_id, ret);
2918 	return ret;
2919 }
2920 
ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta * sta)2921 static bool ath12k_mac_sta_has_ofdm_only(struct ieee80211_link_sta *sta)
2922 {
2923 	return sta->supp_rates[NL80211_BAND_2GHZ] >>
2924 	       ATH12K_MAC_FIRST_OFDM_RATE_IDX;
2925 }
2926 
ath12k_mac_get_phymode_vht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2927 static enum wmi_phy_mode ath12k_mac_get_phymode_vht(struct ath12k *ar,
2928 						    struct ieee80211_link_sta *link_sta)
2929 {
2930 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2931 		if (link_sta->vht_cap.cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2932 		    IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
2933 			return MODE_11AC_VHT160;
2934 
2935 		/* Allow STA to connect even if it does not explicitly advertise 160 MHz
2936 		 * support
2937 		 */
2938 		return MODE_11AC_VHT160;
2939 	}
2940 
2941 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2942 		return MODE_11AC_VHT80;
2943 
2944 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2945 		return MODE_11AC_VHT40;
2946 
2947 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2948 		return MODE_11AC_VHT20;
2949 
2950 	return MODE_UNKNOWN;
2951 }
2952 
ath12k_mac_get_phymode_he(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2953 static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
2954 						   struct ieee80211_link_sta *link_sta)
2955 {
2956 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2957 		if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2958 		     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2959 			return MODE_11AX_HE160;
2960 
2961 		return MODE_UNKNOWN;
2962 	}
2963 
2964 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2965 		return MODE_11AX_HE80;
2966 
2967 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2968 		return MODE_11AX_HE40;
2969 
2970 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
2971 		return MODE_11AX_HE20;
2972 
2973 	return MODE_UNKNOWN;
2974 }
2975 
ath12k_mac_get_phymode_eht(struct ath12k * ar,struct ieee80211_link_sta * link_sta)2976 static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
2977 						    struct ieee80211_link_sta *link_sta)
2978 {
2979 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_320)
2980 		if (link_sta->eht_cap.eht_cap_elem.phy_cap_info[0] &
2981 		    IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2982 			return MODE_11BE_EHT320;
2983 
2984 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
2985 		if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
2986 		    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2987 			return MODE_11BE_EHT160;
2988 
2989 		ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
2990 			    link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
2991 
2992 		return MODE_UNKNOWN;
2993 	}
2994 
2995 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
2996 		return MODE_11BE_EHT80;
2997 
2998 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
2999 		return MODE_11BE_EHT40;
3000 
3001 	if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20)
3002 		return MODE_11BE_EHT20;
3003 
3004 	return MODE_UNKNOWN;
3005 }
3006 
ath12k_peer_assoc_h_phymode(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3007 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
3008 					struct ath12k_link_vif *arvif,
3009 					struct ath12k_link_sta *arsta,
3010 					struct ath12k_wmi_peer_assoc_arg *arg)
3011 {
3012 	struct ieee80211_link_sta *link_sta;
3013 	struct cfg80211_chan_def def;
3014 	enum nl80211_band band;
3015 	const u8 *ht_mcs_mask;
3016 	const u16 *vht_mcs_mask;
3017 	const u16 *he_mcs_mask;
3018 	enum wmi_phy_mode phymode = MODE_UNKNOWN;
3019 
3020 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3021 
3022 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3023 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3024 
3025 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
3026 		return;
3027 
3028 	band = def.chan->band;
3029 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
3030 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
3031 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
3032 
3033 	link_sta = ath12k_mac_get_link_sta(arsta);
3034 	if (!link_sta) {
3035 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
3036 			    sta->addr, arsta->link_id);
3037 		return;
3038 	}
3039 
3040 	switch (band) {
3041 	case NL80211_BAND_2GHZ:
3042 		if (link_sta->eht_cap.has_eht) {
3043 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3044 				phymode = MODE_11BE_EHT40_2G;
3045 			else
3046 				phymode = MODE_11BE_EHT20_2G;
3047 		} else if (link_sta->he_cap.has_he &&
3048 			   !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3049 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
3050 				phymode = MODE_11AX_HE80_2G;
3051 			else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3052 				phymode = MODE_11AX_HE40_2G;
3053 			else
3054 				phymode = MODE_11AX_HE20_2G;
3055 		} else if (link_sta->vht_cap.vht_supported &&
3056 		    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3057 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3058 				phymode = MODE_11AC_VHT40;
3059 			else
3060 				phymode = MODE_11AC_VHT20;
3061 		} else if (link_sta->ht_cap.ht_supported &&
3062 			   !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3063 			if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
3064 				phymode = MODE_11NG_HT40;
3065 			else
3066 				phymode = MODE_11NG_HT20;
3067 		} else if (ath12k_mac_sta_has_ofdm_only(link_sta)) {
3068 			phymode = MODE_11G;
3069 		} else {
3070 			phymode = MODE_11B;
3071 		}
3072 		break;
3073 	case NL80211_BAND_5GHZ:
3074 	case NL80211_BAND_6GHZ:
3075 		/* Check EHT first */
3076 		if (link_sta->eht_cap.has_eht) {
3077 			phymode = ath12k_mac_get_phymode_eht(ar, link_sta);
3078 		} else if (link_sta->he_cap.has_he &&
3079 			   !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
3080 			phymode = ath12k_mac_get_phymode_he(ar, link_sta);
3081 		} else if (link_sta->vht_cap.vht_supported &&
3082 		    !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
3083 			phymode = ath12k_mac_get_phymode_vht(ar, link_sta);
3084 		} else if (link_sta->ht_cap.ht_supported &&
3085 			   !ath12k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
3086 			if (link_sta->bandwidth >= IEEE80211_STA_RX_BW_40)
3087 				phymode = MODE_11NA_HT40;
3088 			else
3089 				phymode = MODE_11NA_HT20;
3090 		} else {
3091 			phymode = MODE_11A;
3092 		}
3093 		break;
3094 	default:
3095 		break;
3096 	}
3097 
3098 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
3099 		   arsta->addr, ath12k_mac_phymode_str(phymode));
3100 
3101 	arg->peer_phymode = phymode;
3102 	WARN_ON(phymode == MODE_UNKNOWN);
3103 }
3104 
ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7,u8 rx_tx_mcs9,u8 rx_tx_mcs11,u8 rx_tx_mcs13,u32 * rx_mcs,u32 * tx_mcs)3105 static void ath12k_mac_set_eht_mcs(u8 rx_tx_mcs7, u8 rx_tx_mcs9,
3106 				   u8 rx_tx_mcs11, u8 rx_tx_mcs13,
3107 				   u32 *rx_mcs, u32 *tx_mcs)
3108 {
3109 	*rx_mcs = 0;
3110 	u32p_replace_bits(rx_mcs,
3111 			  u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_RX),
3112 			  WMI_EHT_MCS_NSS_0_7);
3113 	u32p_replace_bits(rx_mcs,
3114 			  u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_RX),
3115 			  WMI_EHT_MCS_NSS_8_9);
3116 	u32p_replace_bits(rx_mcs,
3117 			  u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_RX),
3118 			  WMI_EHT_MCS_NSS_10_11);
3119 	u32p_replace_bits(rx_mcs,
3120 			  u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_RX),
3121 			  WMI_EHT_MCS_NSS_12_13);
3122 
3123 	*tx_mcs = 0;
3124 	u32p_replace_bits(tx_mcs,
3125 			  u8_get_bits(rx_tx_mcs7, IEEE80211_EHT_MCS_NSS_TX),
3126 			  WMI_EHT_MCS_NSS_0_7);
3127 	u32p_replace_bits(tx_mcs,
3128 			  u8_get_bits(rx_tx_mcs9, IEEE80211_EHT_MCS_NSS_TX),
3129 			  WMI_EHT_MCS_NSS_8_9);
3130 	u32p_replace_bits(tx_mcs,
3131 			  u8_get_bits(rx_tx_mcs11, IEEE80211_EHT_MCS_NSS_TX),
3132 			  WMI_EHT_MCS_NSS_10_11);
3133 	u32p_replace_bits(tx_mcs,
3134 			  u8_get_bits(rx_tx_mcs13, IEEE80211_EHT_MCS_NSS_TX),
3135 			  WMI_EHT_MCS_NSS_12_13);
3136 }
3137 
ath12k_mac_set_eht_ppe_threshold(const u8 * ppe_thres,struct ath12k_wmi_ppe_threshold_arg * ppet)3138 static void ath12k_mac_set_eht_ppe_threshold(const u8 *ppe_thres,
3139 					     struct ath12k_wmi_ppe_threshold_arg *ppet)
3140 {
3141 	u32 bit_pos = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE, val;
3142 	u8 nss, ru, i;
3143 	u8 ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
3144 
3145 	ppet->numss_m1 = u8_get_bits(ppe_thres[0], IEEE80211_EHT_PPE_THRES_NSS_MASK);
3146 	ppet->ru_bit_mask = u16_get_bits(get_unaligned_le16(ppe_thres),
3147 					 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3148 
3149 	for (nss = 0; nss <= ppet->numss_m1; nss++) {
3150 		for (ru = 0;
3151 		     ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
3152 		     ru++) {
3153 			if ((ppet->ru_bit_mask & BIT(ru)) == 0)
3154 				continue;
3155 
3156 			val = 0;
3157 			for (i = 0; i < ppet_bit_len_per_ru; i++) {
3158 				val |= (((ppe_thres[bit_pos / 8] >>
3159 					  (bit_pos % 8)) & 0x1) << i);
3160 				bit_pos++;
3161 			}
3162 			ppet->ppet16_ppet8_ru3_ru0[nss] |=
3163 					(val << (ru * ppet_bit_len_per_ru));
3164 		}
3165 	}
3166 }
3167 
ath12k_peer_assoc_h_eht(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3168 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
3169 				    struct ath12k_link_vif *arvif,
3170 				    struct ath12k_link_sta *arsta,
3171 				    struct ath12k_wmi_peer_assoc_arg *arg)
3172 {
3173 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3174 	const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
3175 	const struct ieee80211_eht_mcs_nss_supp_bw *bw;
3176 	const struct ieee80211_sta_eht_cap *eht_cap;
3177 	const struct ieee80211_sta_he_cap *he_cap;
3178 	struct ieee80211_link_sta *link_sta;
3179 	struct ieee80211_bss_conf *link_conf;
3180 	u32 *rx_mcs, *tx_mcs;
3181 
3182 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3183 
3184 	link_sta = ath12k_mac_get_link_sta(arsta);
3185 	if (!link_sta) {
3186 		ath12k_warn(ar->ab, "unable to access link sta in peer assoc eht for sta %pM link %u\n",
3187 			    sta->addr, arsta->link_id);
3188 		return;
3189 	}
3190 
3191 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3192 	if (!link_conf) {
3193 		ath12k_warn(ar->ab, "unable to access link_conf in peer assoc eht set\n");
3194 		return;
3195 	}
3196 
3197 	eht_cap = &link_sta->eht_cap;
3198 	he_cap = &link_sta->he_cap;
3199 	if (!he_cap->has_he || !eht_cap->has_eht)
3200 		return;
3201 
3202 	arg->eht_flag = true;
3203 
3204 	if ((eht_cap->eht_cap_elem.phy_cap_info[5] &
3205 	     IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) &&
3206 	    eht_cap->eht_ppe_thres[0] != 0)
3207 		ath12k_mac_set_eht_ppe_threshold(eht_cap->eht_ppe_thres,
3208 						 &arg->peer_eht_ppet);
3209 
3210 	memcpy(arg->peer_eht_cap_mac, eht_cap->eht_cap_elem.mac_cap_info,
3211 	       sizeof(eht_cap->eht_cap_elem.mac_cap_info));
3212 	memcpy(arg->peer_eht_cap_phy, eht_cap->eht_cap_elem.phy_cap_info,
3213 	       sizeof(eht_cap->eht_cap_elem.phy_cap_info));
3214 
3215 	rx_mcs = arg->peer_eht_rx_mcs_set;
3216 	tx_mcs = arg->peer_eht_tx_mcs_set;
3217 
3218 	switch (link_sta->bandwidth) {
3219 	case IEEE80211_STA_RX_BW_320:
3220 		bw = &eht_cap->eht_mcs_nss_supp.bw._320;
3221 		ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3222 				       bw->rx_tx_mcs9_max_nss,
3223 				       bw->rx_tx_mcs11_max_nss,
3224 				       bw->rx_tx_mcs13_max_nss,
3225 				       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320],
3226 				       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_320]);
3227 		arg->peer_eht_mcs_count++;
3228 		fallthrough;
3229 	case IEEE80211_STA_RX_BW_160:
3230 		bw = &eht_cap->eht_mcs_nss_supp.bw._160;
3231 		ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3232 				       bw->rx_tx_mcs9_max_nss,
3233 				       bw->rx_tx_mcs11_max_nss,
3234 				       bw->rx_tx_mcs13_max_nss,
3235 				       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160],
3236 				       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_160]);
3237 		arg->peer_eht_mcs_count++;
3238 		fallthrough;
3239 	default:
3240 		if ((he_cap->he_cap_elem.phy_cap_info[0] &
3241 		     (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
3242 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3243 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
3244 		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0) {
3245 			bw_20 = &eht_cap->eht_mcs_nss_supp.only_20mhz;
3246 
3247 			ath12k_mac_set_eht_mcs(bw_20->rx_tx_mcs7_max_nss,
3248 					       bw_20->rx_tx_mcs9_max_nss,
3249 					       bw_20->rx_tx_mcs11_max_nss,
3250 					       bw_20->rx_tx_mcs13_max_nss,
3251 					       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3252 					       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3253 		} else {
3254 			bw = &eht_cap->eht_mcs_nss_supp.bw._80;
3255 			ath12k_mac_set_eht_mcs(bw->rx_tx_mcs9_max_nss,
3256 					       bw->rx_tx_mcs9_max_nss,
3257 					       bw->rx_tx_mcs11_max_nss,
3258 					       bw->rx_tx_mcs13_max_nss,
3259 					       &rx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80],
3260 					       &tx_mcs[WMI_EHTCAP_TXRX_MCS_NSS_IDX_80]);
3261 		}
3262 
3263 		arg->peer_eht_mcs_count++;
3264 		break;
3265 	}
3266 
3267 	arg->punct_bitmap = ~arvif->punct_bitmap;
3268 	arg->eht_disable_mcs15 = link_conf->eht_disable_mcs15;
3269 }
3270 
ath12k_peer_assoc_h_mlo(struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg)3271 static void ath12k_peer_assoc_h_mlo(struct ath12k_link_sta *arsta,
3272 				    struct ath12k_wmi_peer_assoc_arg *arg)
3273 {
3274 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
3275 	struct peer_assoc_mlo_params *ml = &arg->ml;
3276 	struct ath12k_sta *ahsta = arsta->ahsta;
3277 	struct ath12k_link_sta *arsta_p;
3278 	struct ath12k_link_vif *arvif;
3279 	unsigned long links;
3280 	u8 link_id;
3281 	int i;
3282 
3283 	if (!sta->mlo || ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID)
3284 		return;
3285 
3286 	ml->enabled = true;
3287 	ml->assoc_link = arsta->is_assoc_link;
3288 
3289 	/* For now considering the primary umac based on assoc link */
3290 	ml->primary_umac = arsta->is_assoc_link;
3291 	ml->peer_id_valid = true;
3292 	ml->logical_link_idx_valid = true;
3293 
3294 	ether_addr_copy(ml->mld_addr, sta->addr);
3295 	ml->logical_link_idx = arsta->link_idx;
3296 	ml->ml_peer_id = ahsta->ml_peer_id;
3297 	ml->ieee_link_id = arsta->link_id;
3298 	ml->num_partner_links = 0;
3299 	ml->eml_cap = sta->eml_cap;
3300 	links = ahsta->links_map;
3301 
3302 	rcu_read_lock();
3303 
3304 	i = 0;
3305 
3306 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
3307 		if (i >= ATH12K_WMI_MLO_MAX_LINKS)
3308 			break;
3309 
3310 		arsta_p = rcu_dereference(ahsta->link[link_id]);
3311 		arvif = rcu_dereference(ahsta->ahvif->link[link_id]);
3312 
3313 		if (arsta_p == arsta)
3314 			continue;
3315 
3316 		if (!arvif->is_started)
3317 			continue;
3318 
3319 		ml->partner_info[i].vdev_id = arvif->vdev_id;
3320 		ml->partner_info[i].hw_link_id = arvif->ar->pdev->hw_link_id;
3321 		ml->partner_info[i].assoc_link = arsta_p->is_assoc_link;
3322 		ml->partner_info[i].primary_umac = arsta_p->is_assoc_link;
3323 		ml->partner_info[i].logical_link_idx_valid = true;
3324 		ml->partner_info[i].logical_link_idx = arsta_p->link_idx;
3325 		ml->num_partner_links++;
3326 
3327 		i++;
3328 	}
3329 
3330 	rcu_read_unlock();
3331 }
3332 
ath12k_peer_assoc_prepare(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ath12k_wmi_peer_assoc_arg * arg,bool reassoc)3333 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
3334 				      struct ath12k_link_vif *arvif,
3335 				      struct ath12k_link_sta *arsta,
3336 				      struct ath12k_wmi_peer_assoc_arg *arg,
3337 				      bool reassoc)
3338 {
3339 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3340 
3341 	memset(arg, 0, sizeof(*arg));
3342 
3343 	reinit_completion(&ar->peer_assoc_done);
3344 
3345 	arg->peer_new_assoc = !reassoc;
3346 	ath12k_peer_assoc_h_basic(ar, arvif, arsta, arg);
3347 	ath12k_peer_assoc_h_crypto(ar, arvif, arsta, arg);
3348 	ath12k_peer_assoc_h_rates(ar, arvif, arsta, arg);
3349 	ath12k_peer_assoc_h_ht(ar, arvif, arsta, arg);
3350 	ath12k_peer_assoc_h_vht(ar, arvif, arsta, arg);
3351 	ath12k_peer_assoc_h_he(ar, arvif, arsta, arg);
3352 	ath12k_peer_assoc_h_he_6ghz(ar, arvif, arsta, arg);
3353 	ath12k_peer_assoc_h_eht(ar, arvif, arsta, arg);
3354 	ath12k_peer_assoc_h_qos(ar, arvif, arsta, arg);
3355 	ath12k_peer_assoc_h_phymode(ar, arvif, arsta, arg);
3356 	ath12k_peer_assoc_h_smps(arsta, arg);
3357 	ath12k_peer_assoc_h_mlo(arsta, arg);
3358 
3359 	arsta->peer_nss = arg->peer_nss;
3360 	/* TODO: amsdu_disable req? */
3361 }
3362 
ath12k_setup_peer_smps(struct ath12k * ar,struct ath12k_link_vif * arvif,const u8 * addr,const struct ieee80211_sta_ht_cap * ht_cap,const struct ieee80211_he_6ghz_capa * he_6ghz_capa)3363 static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arvif,
3364 				  const u8 *addr,
3365 				  const struct ieee80211_sta_ht_cap *ht_cap,
3366 				  const struct ieee80211_he_6ghz_capa *he_6ghz_capa)
3367 {
3368 	int smps, ret = 0;
3369 
3370 	if (!ht_cap->ht_supported && !he_6ghz_capa)
3371 		return 0;
3372 
3373 	ret = ath12k_get_smps_from_capa(ht_cap, he_6ghz_capa, &smps);
3374 	if (ret < 0)
3375 		return ret;
3376 
3377 	return ath12k_wmi_set_peer_param(ar, addr, arvif->vdev_id,
3378 					 WMI_PEER_MIMO_PS_STATE,
3379 					 ath12k_smps_map[smps]);
3380 }
3381 
ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif * arvif)3382 static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
3383 {
3384 	struct ath12k_vif *ahvif = arvif->ahvif;
3385 	struct ath12k *ar = arvif->ar;
3386 	u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
3387 	u32 value = 0;
3388 	int ret;
3389 	struct ieee80211_bss_conf *link_conf;
3390 
3391 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3392 	if (!link_conf) {
3393 		ath12k_warn(ar->ab, "unable to access bss link conf in txbf conf\n");
3394 		return -EINVAL;
3395 	}
3396 
3397 	if (!link_conf->he_support)
3398 		return 0;
3399 
3400 	if (link_conf->he_su_beamformer) {
3401 		value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3402 		if (link_conf->he_mu_beamformer &&
3403 		    ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3404 			value |= u32_encode_bits(HE_MU_BFER_ENABLE, HE_MODE_MU_TX_BFER);
3405 	}
3406 
3407 	if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3408 		value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3409 			 u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3410 
3411 		if (link_conf->he_full_ul_mumimo)
3412 			value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, HE_MODE_UL_MUMIMO);
3413 
3414 		if (link_conf->he_su_beamformee)
3415 			value |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3416 	}
3417 
3418 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3419 	if (ret) {
3420 		ath12k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n",
3421 			    arvif->vdev_id, ret);
3422 		return ret;
3423 	}
3424 
3425 	param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE;
3426 	value =	u32_encode_bits(HE_VHT_SOUNDING_MODE_ENABLE, HE_VHT_SOUNDING_MODE) |
3427 		u32_encode_bits(HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE,
3428 				HE_TRIG_NONTRIG_SOUNDING_MODE);
3429 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3430 					    param, value);
3431 	if (ret) {
3432 		ath12k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n",
3433 			    arvif->vdev_id, ret);
3434 		return ret;
3435 	}
3436 
3437 	return 0;
3438 }
3439 
ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_sta_he_cap * he_cap,int * hemode)3440 static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
3441 					     struct ath12k_link_vif *arvif,
3442 					     struct ieee80211_sta_he_cap *he_cap,
3443 					     int *hemode)
3444 {
3445 	struct ieee80211_vif *vif = arvif->ahvif->vif;
3446 	struct ieee80211_he_cap_elem he_cap_elem = {};
3447 	struct ieee80211_sta_he_cap *cap_band;
3448 	struct cfg80211_chan_def def;
3449 	u8 link_id = arvif->link_id;
3450 	struct ieee80211_bss_conf *link_conf;
3451 
3452 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3453 	if (!link_conf) {
3454 		ath12k_warn(ar->ab, "unable to access bss link conf in recalc txbf conf\n");
3455 		return -EINVAL;
3456 	}
3457 
3458 	if (!link_conf->he_support)
3459 		return 0;
3460 
3461 	if (vif->type != NL80211_IFTYPE_STATION)
3462 		return -EINVAL;
3463 
3464 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
3465 		return -EINVAL;
3466 
3467 	if (def.chan->band == NL80211_BAND_2GHZ)
3468 		cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap;
3469 	else
3470 		cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap;
3471 
3472 	memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem));
3473 
3474 	*hemode = 0;
3475 	if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) {
3476 		if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3477 			*hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3478 		if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info))
3479 			*hemode |= u32_encode_bits(HE_MU_BFEE_ENABLE, HE_MODE_MU_TX_BFEE);
3480 	}
3481 
3482 	if (vif->type != NL80211_IFTYPE_MESH_POINT) {
3483 		*hemode |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, HE_MODE_DL_OFDMA) |
3484 			  u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
3485 
3486 		if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info))
3487 			if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info))
3488 				*hemode |= u32_encode_bits(HE_UL_MUMIMO_ENABLE,
3489 							  HE_MODE_UL_MUMIMO);
3490 
3491 		if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFEE))
3492 			*hemode |= u32_encode_bits(HE_SU_BFEE_ENABLE, HE_MODE_SU_TX_BFEE);
3493 
3494 		if (u32_get_bits(*hemode, HE_MODE_MU_TX_BFER))
3495 			*hemode |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
3496 	}
3497 
3498 	return 0;
3499 }
3500 
ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif * arvif)3501 static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
3502 {
3503 	struct ath12k_vif *ahvif = arvif->ahvif;
3504 	struct ath12k *ar = arvif->ar;
3505 	u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
3506 	u32 value = 0;
3507 	int ret;
3508 	struct ieee80211_bss_conf *link_conf;
3509 
3510 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
3511 	if (!link_conf) {
3512 		ath12k_warn(ar->ab, "unable to access bss link conf in eht txbf conf\n");
3513 		return -ENOENT;
3514 	}
3515 
3516 	if (!link_conf->eht_support)
3517 		return 0;
3518 
3519 	if (link_conf->eht_su_beamformer) {
3520 		value |= u32_encode_bits(EHT_SU_BFER_ENABLE, EHT_MODE_SU_TX_BFER);
3521 		if (link_conf->eht_mu_beamformer &&
3522 		    ahvif->vdev_type == WMI_VDEV_TYPE_AP)
3523 			value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
3524 						 EHT_MODE_MU_TX_BFER) |
3525 				 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
3526 						 EHT_MODE_DL_OFDMA_MUMIMO) |
3527 				 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE,
3528 						 EHT_MODE_UL_OFDMA_MUMIMO);
3529 	}
3530 
3531 	if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
3532 		value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, EHT_MODE_DL_OFDMA) |
3533 			 u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
3534 
3535 		if (link_conf->eht_80mhz_full_bw_ul_mumimo)
3536 			value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, EHT_MODE_MUMIMO);
3537 
3538 		if (link_conf->eht_su_beamformee)
3539 			value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
3540 						 EHT_MODE_SU_TX_BFEE);
3541 	}
3542 
3543 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value);
3544 	if (ret) {
3545 		ath12k_warn(ar->ab, "failed to set vdev %d EHT MU mode: %d\n",
3546 			    arvif->vdev_id, ret);
3547 		return ret;
3548 	}
3549 
3550 	return 0;
3551 }
3552 
ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k * ar,struct ieee80211_link_sta * link_sta)3553 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
3554 					      struct ieee80211_link_sta *link_sta)
3555 {
3556 	u32 bw;
3557 
3558 	switch (link_sta->bandwidth) {
3559 	case IEEE80211_STA_RX_BW_20:
3560 		bw = WMI_PEER_CHWIDTH_20MHZ;
3561 		break;
3562 	case IEEE80211_STA_RX_BW_40:
3563 		bw = WMI_PEER_CHWIDTH_40MHZ;
3564 		break;
3565 	case IEEE80211_STA_RX_BW_80:
3566 		bw = WMI_PEER_CHWIDTH_80MHZ;
3567 		break;
3568 	case IEEE80211_STA_RX_BW_160:
3569 		bw = WMI_PEER_CHWIDTH_160MHZ;
3570 		break;
3571 	case IEEE80211_STA_RX_BW_320:
3572 		bw = WMI_PEER_CHWIDTH_320MHZ;
3573 		break;
3574 	default:
3575 		ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n",
3576 			    link_sta->bandwidth, link_sta->addr);
3577 		bw = WMI_PEER_CHWIDTH_20MHZ;
3578 		break;
3579 	}
3580 
3581 	return bw;
3582 }
3583 
ath12k_bss_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * bss_conf)3584 static void ath12k_bss_assoc(struct ath12k *ar,
3585 			     struct ath12k_link_vif *arvif,
3586 			     struct ieee80211_bss_conf *bss_conf)
3587 {
3588 	struct ath12k_vif *ahvif = arvif->ahvif;
3589 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
3590 	struct ath12k_wmi_vdev_up_params params = {};
3591 	struct ieee80211_link_sta *link_sta;
3592 	u8 link_id = bss_conf->link_id;
3593 	struct ath12k_link_sta *arsta;
3594 	struct ieee80211_sta *ap_sta;
3595 	struct ath12k_sta *ahsta;
3596 	struct ath12k_peer *peer;
3597 	bool is_auth = false;
3598 	u32 hemode = 0;
3599 	int ret;
3600 
3601 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3602 
3603 	struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
3604 					kzalloc(sizeof(*peer_arg), GFP_KERNEL);
3605 	if (!peer_arg)
3606 		return;
3607 
3608 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3609 		   "mac vdev %i link id %u assoc bssid %pM aid %d\n",
3610 		   arvif->vdev_id, link_id, arvif->bssid, ahvif->aid);
3611 
3612 	rcu_read_lock();
3613 
3614 	/* During ML connection, cfg.ap_addr has the MLD address. For
3615 	 * non-ML connection, it has the BSSID.
3616 	 */
3617 	ap_sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
3618 	if (!ap_sta) {
3619 		ath12k_warn(ar->ab, "failed to find station entry for bss %pM vdev %i\n",
3620 			    vif->cfg.ap_addr, arvif->vdev_id);
3621 		rcu_read_unlock();
3622 		return;
3623 	}
3624 
3625 	ahsta = ath12k_sta_to_ahsta(ap_sta);
3626 
3627 	arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
3628 				  ahsta->link[link_id]);
3629 	if (WARN_ON(!arsta)) {
3630 		rcu_read_unlock();
3631 		return;
3632 	}
3633 
3634 	link_sta = ath12k_mac_get_link_sta(arsta);
3635 	if (WARN_ON(!link_sta)) {
3636 		rcu_read_unlock();
3637 		return;
3638 	}
3639 
3640 	ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);
3641 
3642 	/* link_sta->he_cap must be protected by rcu_read_lock */
3643 	ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, &link_sta->he_cap, &hemode);
3644 	if (ret) {
3645 		ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM: %d\n",
3646 			    arvif->vdev_id, bss_conf->bssid, ret);
3647 		rcu_read_unlock();
3648 		return;
3649 	}
3650 
3651 	rcu_read_unlock();
3652 
3653 	/* keep this before ath12k_wmi_send_peer_assoc_cmd() */
3654 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
3655 					    WMI_VDEV_PARAM_SET_HEMU_MODE, hemode);
3656 	if (ret) {
3657 		ath12k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n",
3658 			    hemode, ret);
3659 		return;
3660 	}
3661 
3662 	peer_arg->is_assoc = true;
3663 	ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
3664 	if (ret) {
3665 		ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
3666 			    bss_conf->bssid, arvif->vdev_id, ret);
3667 		return;
3668 	}
3669 
3670 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
3671 		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
3672 			    bss_conf->bssid, arvif->vdev_id);
3673 		return;
3674 	}
3675 
3676 	ret = ath12k_setup_peer_smps(ar, arvif, bss_conf->bssid,
3677 				     &link_sta->ht_cap, &link_sta->he_6ghz_capa);
3678 	if (ret) {
3679 		ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
3680 			    arvif->vdev_id, ret);
3681 		return;
3682 	}
3683 
3684 	WARN_ON(arvif->is_up);
3685 
3686 	ahvif->aid = vif->cfg.aid;
3687 	ether_addr_copy(arvif->bssid, bss_conf->bssid);
3688 
3689 	params.vdev_id = arvif->vdev_id;
3690 	params.aid = ahvif->aid;
3691 	params.bssid = arvif->bssid;
3692 	params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
3693 	if (params.tx_bssid) {
3694 		params.nontx_profile_idx = bss_conf->bssid_index;
3695 		params.nontx_profile_cnt = 1 << bss_conf->bssid_indicator;
3696 	}
3697 	ret = ath12k_wmi_vdev_up(ar, &params);
3698 	if (ret) {
3699 		ath12k_warn(ar->ab, "failed to set vdev %d up: %d\n",
3700 			    arvif->vdev_id, ret);
3701 		return;
3702 	}
3703 
3704 	arvif->is_up = true;
3705 	arvif->rekey_data.enable_offload = false;
3706 
3707 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
3708 		   "mac vdev %d up (associated) bssid %pM aid %d\n",
3709 		   arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
3710 
3711 	spin_lock_bh(&ar->ab->base_lock);
3712 
3713 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arvif->bssid);
3714 	if (peer && peer->is_authorized)
3715 		is_auth = true;
3716 
3717 	spin_unlock_bh(&ar->ab->base_lock);
3718 
3719 	/* Authorize BSS Peer */
3720 	if (is_auth) {
3721 		ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
3722 						arvif->vdev_id,
3723 						WMI_PEER_AUTHORIZE,
3724 						1);
3725 		if (ret)
3726 			ath12k_warn(ar->ab, "Unable to authorize BSS peer: %d\n", ret);
3727 	}
3728 
3729 	ret = ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
3730 					   &bss_conf->he_obss_pd);
3731 	if (ret)
3732 		ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD parameters: %d\n",
3733 			    arvif->vdev_id, ret);
3734 
3735 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3736 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3737 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3738 		ath12k_mac_11d_scan_stop_all(ar->ab);
3739 }
3740 
ath12k_bss_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif)3741 static void ath12k_bss_disassoc(struct ath12k *ar,
3742 				struct ath12k_link_vif *arvif)
3743 {
3744 	int ret;
3745 
3746 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
3747 
3748 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %i disassoc bssid %pM\n",
3749 		   arvif->vdev_id, arvif->bssid);
3750 
3751 	ret = ath12k_wmi_vdev_down(ar, arvif->vdev_id);
3752 	if (ret)
3753 		ath12k_warn(ar->ab, "failed to down vdev %i: %d\n",
3754 			    arvif->vdev_id, ret);
3755 
3756 	arvif->is_up = false;
3757 
3758 	memset(&arvif->rekey_data, 0, sizeof(arvif->rekey_data));
3759 
3760 	cancel_delayed_work(&arvif->connection_loss_work);
3761 }
3762 
ath12k_mac_get_rate_hw_value(int bitrate)3763 static u32 ath12k_mac_get_rate_hw_value(int bitrate)
3764 {
3765 	u32 preamble;
3766 	u16 hw_value;
3767 	int rate;
3768 	size_t i;
3769 
3770 	if (ath12k_mac_bitrate_is_cck(bitrate))
3771 		preamble = WMI_RATE_PREAMBLE_CCK;
3772 	else
3773 		preamble = WMI_RATE_PREAMBLE_OFDM;
3774 
3775 	for (i = 0; i < ARRAY_SIZE(ath12k_legacy_rates); i++) {
3776 		if (ath12k_legacy_rates[i].bitrate != bitrate)
3777 			continue;
3778 
3779 		hw_value = ath12k_legacy_rates[i].hw_value;
3780 		rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
3781 
3782 		return rate;
3783 	}
3784 
3785 	return -EINVAL;
3786 }
3787 
ath12k_recalculate_mgmt_rate(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def * def)3788 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
3789 					 struct ath12k_link_vif *arvif,
3790 					 struct cfg80211_chan_def *def)
3791 {
3792 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
3793 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
3794 	const struct ieee80211_supported_band *sband;
3795 	struct ieee80211_bss_conf *bss_conf;
3796 	u8 basic_rate_idx;
3797 	int hw_rate_code;
3798 	u32 vdev_param;
3799 	u16 bitrate;
3800 	int ret;
3801 
3802 	lockdep_assert_wiphy(hw->wiphy);
3803 
3804 	bss_conf = ath12k_mac_get_link_bss_conf(arvif);
3805 	if (!bss_conf) {
3806 		ath12k_warn(ar->ab, "unable to access bss link conf in mgmt rate calc for vif %pM link %u\n",
3807 			    vif->addr, arvif->link_id);
3808 		return;
3809 	}
3810 
3811 	sband = hw->wiphy->bands[def->chan->band];
3812 	if (bss_conf->basic_rates)
3813 		basic_rate_idx = __ffs(bss_conf->basic_rates);
3814 	else
3815 		basic_rate_idx = 0;
3816 	bitrate = sband->bitrates[basic_rate_idx].bitrate;
3817 
3818 	hw_rate_code = ath12k_mac_get_rate_hw_value(bitrate);
3819 	if (hw_rate_code < 0) {
3820 		ath12k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
3821 		return;
3822 	}
3823 
3824 	vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
3825 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3826 					    hw_rate_code);
3827 	if (ret)
3828 		ath12k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
3829 
3830 	vdev_param = WMI_VDEV_PARAM_BEACON_RATE;
3831 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
3832 					    hw_rate_code);
3833 	if (ret)
3834 		ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
3835 }
3836 
ath12k_mac_init_arvif(struct ath12k_vif * ahvif,struct ath12k_link_vif * arvif,int link_id)3837 static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
3838 				  struct ath12k_link_vif *arvif, int link_id)
3839 {
3840 	struct ath12k_hw *ah = ahvif->ah;
3841 	u8 _link_id;
3842 	int i;
3843 
3844 	lockdep_assert_wiphy(ah->hw->wiphy);
3845 
3846 	if (WARN_ON(!arvif))
3847 		return;
3848 
3849 	if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
3850 		return;
3851 
3852 	if (link_id < 0)
3853 		_link_id = 0;
3854 	else
3855 		_link_id = link_id;
3856 
3857 	arvif->ahvif = ahvif;
3858 	arvif->link_id = _link_id;
3859 
3860 	/* Protects the datapath stats update on a per link basis */
3861 	spin_lock_init(&arvif->link_stats_lock);
3862 
3863 	INIT_LIST_HEAD(&arvif->list);
3864 	INIT_DELAYED_WORK(&arvif->connection_loss_work,
3865 			  ath12k_mac_vif_sta_connection_loss_work);
3866 
3867 	arvif->num_stations = 0;
3868 
3869 	for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
3870 		arvif->bitrate_mask.control[i].legacy = 0xffffffff;
3871 		arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
3872 		memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
3873 		       sizeof(arvif->bitrate_mask.control[i].ht_mcs));
3874 		memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
3875 		       sizeof(arvif->bitrate_mask.control[i].vht_mcs));
3876 		memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
3877 		       sizeof(arvif->bitrate_mask.control[i].he_mcs));
3878 	}
3879 
3880 	/* Handle MLO related assignments */
3881 	if (link_id >= 0) {
3882 		rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
3883 		ahvif->links_map |= BIT(_link_id);
3884 	}
3885 
3886 	ath12k_generic_dbg(ATH12K_DBG_MAC,
3887 			   "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
3888 			   _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
3889 			   ahvif->links_map);
3890 }
3891 
ath12k_mac_remove_link_interface(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif)3892 static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
3893 					     struct ath12k_link_vif *arvif)
3894 {
3895 	struct ath12k_vif *ahvif = arvif->ahvif;
3896 	struct ath12k_hw *ah = hw->priv;
3897 	struct ath12k *ar = arvif->ar;
3898 	int ret;
3899 
3900 	lockdep_assert_wiphy(ah->hw->wiphy);
3901 
3902 	cancel_delayed_work_sync(&arvif->connection_loss_work);
3903 
3904 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
3905 		   arvif->vdev_id, arvif->link_id);
3906 
3907 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
3908 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
3909 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
3910 		ath12k_mac_11d_scan_stop(ar);
3911 
3912 	if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
3913 		ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
3914 		if (ret)
3915 			ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
3916 				    arvif->vdev_id, arvif->link_id, ret);
3917 	}
3918 	ath12k_mac_vdev_delete(ar, arvif);
3919 }
3920 
ath12k_mac_assign_link_vif(struct ath12k_hw * ah,struct ieee80211_vif * vif,u8 link_id)3921 static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
3922 							  struct ieee80211_vif *vif,
3923 							  u8 link_id)
3924 {
3925 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3926 	struct ath12k_link_vif *arvif;
3927 
3928 	lockdep_assert_wiphy(ah->hw->wiphy);
3929 
3930 	arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
3931 	if (arvif)
3932 		return arvif;
3933 
3934 	/* If this is the first link arvif being created for an ML VIF
3935 	 * use the preallocated deflink memory except for scan arvifs
3936 	 */
3937 	if (!ahvif->links_map && link_id < ATH12K_FIRST_SCAN_LINK) {
3938 		arvif = &ahvif->deflink;
3939 
3940 		if (vif->type == NL80211_IFTYPE_STATION)
3941 			arvif->is_sta_assoc_link = true;
3942 	} else {
3943 		arvif = kzalloc(sizeof(*arvif), GFP_KERNEL);
3944 		if (!arvif)
3945 			return NULL;
3946 	}
3947 
3948 	ath12k_mac_init_arvif(ahvif, arvif, link_id);
3949 
3950 	return arvif;
3951 }
3952 
ath12k_mac_unassign_link_vif(struct ath12k_link_vif * arvif)3953 static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
3954 {
3955 	struct ath12k_vif *ahvif = arvif->ahvif;
3956 	struct ath12k_hw *ah = ahvif->ah;
3957 
3958 	lockdep_assert_wiphy(ah->hw->wiphy);
3959 
3960 	rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
3961 	synchronize_rcu();
3962 	ahvif->links_map &= ~BIT(arvif->link_id);
3963 
3964 	if (arvif != &ahvif->deflink)
3965 		kfree(arvif);
3966 	else
3967 		memset(arvif, 0, sizeof(*arvif));
3968 }
3969 
3970 static int
ath12k_mac_op_change_vif_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 old_links,u16 new_links,struct ieee80211_bss_conf * ol[IEEE80211_MLD_MAX_NUM_LINKS])3971 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw,
3972 			       struct ieee80211_vif *vif,
3973 			       u16 old_links, u16 new_links,
3974 			       struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS])
3975 {
3976 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
3977 	unsigned long to_remove = old_links & ~new_links;
3978 	unsigned long to_add = ~old_links & new_links;
3979 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
3980 	struct ath12k_link_vif *arvif;
3981 	u8 link_id;
3982 
3983 	lockdep_assert_wiphy(hw->wiphy);
3984 
3985 	ath12k_generic_dbg(ATH12K_DBG_MAC,
3986 			   "mac vif link changed for MLD %pM old_links 0x%x new_links 0x%x\n",
3987 			   vif->addr, old_links, new_links);
3988 
3989 	for_each_set_bit(link_id, &to_add, IEEE80211_MLD_MAX_NUM_LINKS) {
3990 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
3991 		/* mac80211 wants to add link but driver already has the
3992 		 * link. This should not happen ideally.
3993 		 */
3994 		if (WARN_ON(arvif))
3995 			return -EINVAL;
3996 
3997 		arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
3998 		if (WARN_ON(!arvif))
3999 			return -EINVAL;
4000 	}
4001 
4002 	for_each_set_bit(link_id, &to_remove, IEEE80211_MLD_MAX_NUM_LINKS) {
4003 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4004 		if (WARN_ON(!arvif))
4005 			return -EINVAL;
4006 
4007 		if (!arvif->is_created)
4008 			continue;
4009 
4010 		if (WARN_ON(!arvif->ar))
4011 			return -EINVAL;
4012 
4013 		ath12k_mac_remove_link_interface(hw, arvif);
4014 		ath12k_mac_unassign_link_vif(arvif);
4015 	}
4016 
4017 	return 0;
4018 }
4019 
ath12k_mac_fils_discovery(struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info)4020 static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
4021 				     struct ieee80211_bss_conf *info)
4022 {
4023 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
4024 	struct ath12k *ar = arvif->ar;
4025 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4026 	struct sk_buff *tmpl;
4027 	int ret;
4028 	u32 interval;
4029 	bool unsol_bcast_probe_resp_enabled = false;
4030 
4031 	if (info->fils_discovery.max_interval) {
4032 		interval = info->fils_discovery.max_interval;
4033 
4034 		tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif);
4035 		if (tmpl)
4036 			ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
4037 							     tmpl);
4038 	} else if (info->unsol_bcast_probe_resp_interval) {
4039 		unsol_bcast_probe_resp_enabled = 1;
4040 		interval = info->unsol_bcast_probe_resp_interval;
4041 
4042 		tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
4043 		if (tmpl)
4044 			ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
4045 							 tmpl);
4046 	} else { /* Disable */
4047 		return ath12k_wmi_fils_discovery(ar, arvif->vdev_id, 0, false);
4048 	}
4049 
4050 	if (!tmpl) {
4051 		ath12k_warn(ar->ab,
4052 			    "mac vdev %i failed to retrieve %s template\n",
4053 			    arvif->vdev_id, (unsol_bcast_probe_resp_enabled ?
4054 			    "unsolicited broadcast probe response" :
4055 			    "FILS discovery"));
4056 		return -EPERM;
4057 	}
4058 	kfree_skb(tmpl);
4059 
4060 	if (!ret)
4061 		ret = ath12k_wmi_fils_discovery(ar, arvif->vdev_id, interval,
4062 						unsol_bcast_probe_resp_enabled);
4063 
4064 	return ret;
4065 }
4066 
ath12k_mac_vif_setup_ps(struct ath12k_link_vif * arvif)4067 static void ath12k_mac_vif_setup_ps(struct ath12k_link_vif *arvif)
4068 {
4069 	struct ath12k *ar = arvif->ar;
4070 	struct ieee80211_vif *vif = arvif->ahvif->vif;
4071 	struct ieee80211_conf *conf = &ath12k_ar_to_hw(ar)->conf;
4072 	enum wmi_sta_powersave_param param;
4073 	struct ieee80211_bss_conf *info;
4074 	enum wmi_sta_ps_mode psmode;
4075 	int ret;
4076 	int timeout;
4077 	bool enable_ps;
4078 
4079 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4080 
4081 	if (vif->type != NL80211_IFTYPE_STATION)
4082 		return;
4083 
4084 	enable_ps = arvif->ahvif->ps;
4085 	if (enable_ps) {
4086 		psmode = WMI_STA_PS_MODE_ENABLED;
4087 		param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
4088 
4089 		timeout = conf->dynamic_ps_timeout;
4090 		if (timeout == 0) {
4091 			info = ath12k_mac_get_link_bss_conf(arvif);
4092 			if (!info) {
4093 				ath12k_warn(ar->ab, "unable to access bss link conf in setup ps for vif %pM link %u\n",
4094 					    vif->addr, arvif->link_id);
4095 				return;
4096 			}
4097 
4098 			/* firmware doesn't like 0 */
4099 			timeout = ieee80211_tu_to_usec(info->beacon_int) / 1000;
4100 		}
4101 
4102 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id, param,
4103 						  timeout);
4104 		if (ret) {
4105 			ath12k_warn(ar->ab, "failed to set inactivity time for vdev %d: %i\n",
4106 				    arvif->vdev_id, ret);
4107 			return;
4108 		}
4109 	} else {
4110 		psmode = WMI_STA_PS_MODE_DISABLED;
4111 	}
4112 
4113 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev %d psmode %s\n",
4114 		   arvif->vdev_id, psmode ? "enable" : "disable");
4115 
4116 	ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, psmode);
4117 	if (ret)
4118 		ath12k_warn(ar->ab, "failed to set sta power save mode %d for vdev %d: %d\n",
4119 			    psmode, arvif->vdev_id, ret);
4120 }
4121 
ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u64 changed)4122 static void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw,
4123 					  struct ieee80211_vif *vif,
4124 					  u64 changed)
4125 {
4126 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4127 	unsigned long links = ahvif->links_map;
4128 	struct ieee80211_vif_cfg *vif_cfg;
4129 	struct ieee80211_bss_conf *info;
4130 	struct ath12k_link_vif *arvif;
4131 	struct ieee80211_sta *sta;
4132 	struct ath12k_sta *ahsta;
4133 	struct ath12k *ar;
4134 	u8 link_id;
4135 
4136 	lockdep_assert_wiphy(hw->wiphy);
4137 
4138 	if (changed & BSS_CHANGED_SSID && vif->type == NL80211_IFTYPE_AP) {
4139 		ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4140 		if (vif->cfg.ssid_len)
4141 			memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4142 	}
4143 
4144 	if (changed & BSS_CHANGED_ASSOC) {
4145 		if (vif->cfg.assoc) {
4146 			/* only in station mode we can get here, so it's safe
4147 			 * to use ap_addr
4148 			 */
4149 			rcu_read_lock();
4150 			sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
4151 			if (!sta) {
4152 				rcu_read_unlock();
4153 				WARN_ONCE(1, "failed to find sta with addr %pM\n",
4154 					  vif->cfg.ap_addr);
4155 				return;
4156 			}
4157 
4158 			ahsta = ath12k_sta_to_ahsta(sta);
4159 			arvif = wiphy_dereference(hw->wiphy,
4160 						  ahvif->link[ahsta->assoc_link_id]);
4161 			rcu_read_unlock();
4162 
4163 			ar = arvif->ar;
4164 			/* there is no reason for which an assoc link's
4165 			 * bss info does not exist
4166 			 */
4167 			info = ath12k_mac_get_link_bss_conf(arvif);
4168 			ath12k_bss_assoc(ar, arvif, info);
4169 
4170 			/* exclude assoc link as it is done above */
4171 			links &= ~BIT(ahsta->assoc_link_id);
4172 		}
4173 
4174 		for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4175 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4176 			if (!arvif || !arvif->ar)
4177 				continue;
4178 
4179 			ar = arvif->ar;
4180 
4181 			if (vif->cfg.assoc) {
4182 				info = ath12k_mac_get_link_bss_conf(arvif);
4183 				if (!info)
4184 					continue;
4185 
4186 				ath12k_bss_assoc(ar, arvif, info);
4187 			} else {
4188 				ath12k_bss_disassoc(ar, arvif);
4189 			}
4190 		}
4191 	}
4192 
4193 	if (changed & BSS_CHANGED_PS) {
4194 		links = ahvif->links_map;
4195 		vif_cfg = &vif->cfg;
4196 
4197 		for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
4198 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4199 			if (!arvif || !arvif->ar)
4200 				continue;
4201 
4202 			ar = arvif->ar;
4203 
4204 			if (ar->ab->hw_params->supports_sta_ps) {
4205 				ahvif->ps = vif_cfg->ps;
4206 				ath12k_mac_vif_setup_ps(arvif);
4207 			}
4208 		}
4209 	}
4210 }
4211 
ath12k_mac_supports_tpc(struct ath12k * ar,struct ath12k_vif * ahvif,const struct cfg80211_chan_def * chandef)4212 static bool ath12k_mac_supports_tpc(struct ath12k *ar, struct ath12k_vif *ahvif,
4213 				    const struct cfg80211_chan_def *chandef)
4214 {
4215 	return ath12k_wmi_supports_6ghz_cc_ext(ar) &&
4216 		test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT, ar->ab->wmi_ab.svc_map) &&
4217 		(ahvif->vdev_type == WMI_VDEV_TYPE_STA  ||
4218 		 ahvif->vdev_type == WMI_VDEV_TYPE_AP) &&
4219 		ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
4220 		chandef->chan &&
4221 		chandef->chan->band == NL80211_BAND_6GHZ;
4222 }
4223 
ath12k_mac_bss_info_changed(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_bss_conf * info,u64 changed)4224 static void ath12k_mac_bss_info_changed(struct ath12k *ar,
4225 					struct ath12k_link_vif *arvif,
4226 					struct ieee80211_bss_conf *info,
4227 					u64 changed)
4228 {
4229 	struct ath12k_vif *ahvif = arvif->ahvif;
4230 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
4231 	struct cfg80211_chan_def def;
4232 	u32 param_id, param_value;
4233 	enum nl80211_band band;
4234 	u32 vdev_param;
4235 	int mcast_rate;
4236 	u32 preamble;
4237 	u16 hw_value;
4238 	u16 bitrate;
4239 	int ret;
4240 	u8 rateidx;
4241 	u32 rate;
4242 
4243 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4244 
4245 	if (changed & BSS_CHANGED_BEACON_INT) {
4246 		arvif->beacon_interval = info->beacon_int;
4247 
4248 		param_id = WMI_VDEV_PARAM_BEACON_INTERVAL;
4249 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4250 						    param_id,
4251 						    arvif->beacon_interval);
4252 		if (ret)
4253 			ath12k_warn(ar->ab, "Failed to set beacon interval for VDEV: %d\n",
4254 				    arvif->vdev_id);
4255 		else
4256 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4257 				   "Beacon interval: %d set for VDEV: %d\n",
4258 				   arvif->beacon_interval, arvif->vdev_id);
4259 	}
4260 
4261 	if (changed & BSS_CHANGED_BEACON) {
4262 		param_id = WMI_PDEV_PARAM_BEACON_TX_MODE;
4263 		param_value = WMI_BEACON_BURST_MODE;
4264 		ret = ath12k_wmi_pdev_set_param(ar, param_id,
4265 						param_value, ar->pdev->pdev_id);
4266 		if (ret)
4267 			ath12k_warn(ar->ab, "Failed to set beacon mode for VDEV: %d\n",
4268 				    arvif->vdev_id);
4269 		else
4270 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4271 				   "Set burst beacon mode for VDEV: %d\n",
4272 				   arvif->vdev_id);
4273 
4274 		ret = ath12k_mac_setup_bcn_tmpl(arvif);
4275 		if (ret)
4276 			ath12k_warn(ar->ab, "failed to update bcn template: %d\n",
4277 				    ret);
4278 	}
4279 
4280 	if (changed & (BSS_CHANGED_BEACON_INFO | BSS_CHANGED_BEACON)) {
4281 		arvif->dtim_period = info->dtim_period;
4282 
4283 		param_id = WMI_VDEV_PARAM_DTIM_PERIOD;
4284 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4285 						    param_id,
4286 						    arvif->dtim_period);
4287 
4288 		if (ret)
4289 			ath12k_warn(ar->ab, "Failed to set dtim period for VDEV %d: %i\n",
4290 				    arvif->vdev_id, ret);
4291 		else
4292 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4293 				   "DTIM period: %d set for VDEV: %d\n",
4294 				   arvif->dtim_period, arvif->vdev_id);
4295 	}
4296 
4297 	if (changed & BSS_CHANGED_SSID &&
4298 	    vif->type == NL80211_IFTYPE_AP) {
4299 		ahvif->u.ap.ssid_len = vif->cfg.ssid_len;
4300 		if (vif->cfg.ssid_len)
4301 			memcpy(ahvif->u.ap.ssid, vif->cfg.ssid, vif->cfg.ssid_len);
4302 		ahvif->u.ap.hidden_ssid = info->hidden_ssid;
4303 	}
4304 
4305 	if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
4306 		ether_addr_copy(arvif->bssid, info->bssid);
4307 
4308 	if (changed & BSS_CHANGED_BEACON_ENABLED) {
4309 		if (info->enable_beacon) {
4310 			ret = ath12k_mac_set_he_txbf_conf(arvif);
4311 			if (ret)
4312 				ath12k_warn(ar->ab,
4313 					    "failed to set HE TXBF config for vdev: %d\n",
4314 					    arvif->vdev_id);
4315 
4316 			ret = ath12k_mac_set_eht_txbf_conf(arvif);
4317 			if (ret)
4318 				ath12k_warn(ar->ab,
4319 					    "failed to set EHT TXBF config for vdev: %d\n",
4320 					    arvif->vdev_id);
4321 		}
4322 		ath12k_control_beaconing(arvif, info);
4323 
4324 		if (arvif->is_up && info->he_support &&
4325 		    info->he_oper.params) {
4326 			/* TODO: Extend to support 1024 BA Bitmap size */
4327 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4328 							    WMI_VDEV_PARAM_BA_MODE,
4329 							    WMI_BA_MODE_BUFFER_SIZE_256);
4330 			if (ret)
4331 				ath12k_warn(ar->ab,
4332 					    "failed to set BA BUFFER SIZE 256 for vdev: %d\n",
4333 					    arvif->vdev_id);
4334 
4335 			param_id = WMI_VDEV_PARAM_HEOPS_0_31;
4336 			param_value = info->he_oper.params;
4337 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4338 							    param_id, param_value);
4339 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4340 				   "he oper param: %x set for VDEV: %d\n",
4341 				   param_value, arvif->vdev_id);
4342 
4343 			if (ret)
4344 				ath12k_warn(ar->ab, "Failed to set he oper params %x for VDEV %d: %i\n",
4345 					    param_value, arvif->vdev_id, ret);
4346 		}
4347 	}
4348 
4349 	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4350 		u32 cts_prot;
4351 
4352 		cts_prot = !!(info->use_cts_prot);
4353 		param_id = WMI_VDEV_PARAM_PROTECTION_MODE;
4354 
4355 		if (arvif->is_started) {
4356 			ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4357 							    param_id, cts_prot);
4358 			if (ret)
4359 				ath12k_warn(ar->ab, "Failed to set CTS prot for VDEV: %d\n",
4360 					    arvif->vdev_id);
4361 			else
4362 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Set CTS prot: %d for VDEV: %d\n",
4363 					   cts_prot, arvif->vdev_id);
4364 		} else {
4365 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "defer protection mode setup, vdev is not ready yet\n");
4366 		}
4367 	}
4368 
4369 	if (changed & BSS_CHANGED_ERP_SLOT) {
4370 		u32 slottime;
4371 
4372 		if (info->use_short_slot)
4373 			slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
4374 
4375 		else
4376 			slottime = WMI_VDEV_SLOT_TIME_LONG; /* 20us */
4377 
4378 		param_id = WMI_VDEV_PARAM_SLOT_TIME;
4379 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4380 						    param_id, slottime);
4381 		if (ret)
4382 			ath12k_warn(ar->ab, "Failed to set erp slot for VDEV: %d\n",
4383 				    arvif->vdev_id);
4384 		else
4385 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4386 				   "Set slottime: %d for VDEV: %d\n",
4387 				   slottime, arvif->vdev_id);
4388 	}
4389 
4390 	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4391 		u32 preamble;
4392 
4393 		if (info->use_short_preamble)
4394 			preamble = WMI_VDEV_PREAMBLE_SHORT;
4395 		else
4396 			preamble = WMI_VDEV_PREAMBLE_LONG;
4397 
4398 		param_id = WMI_VDEV_PARAM_PREAMBLE;
4399 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4400 						    param_id, preamble);
4401 		if (ret)
4402 			ath12k_warn(ar->ab, "Failed to set preamble for VDEV: %d\n",
4403 				    arvif->vdev_id);
4404 		else
4405 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4406 				   "Set preamble: %d for VDEV: %d\n",
4407 				   preamble, arvif->vdev_id);
4408 	}
4409 
4410 	if (changed & BSS_CHANGED_ASSOC) {
4411 		if (vif->cfg.assoc)
4412 			ath12k_bss_assoc(ar, arvif, info);
4413 		else
4414 			ath12k_bss_disassoc(ar, arvif);
4415 	}
4416 
4417 	if (changed & BSS_CHANGED_TXPOWER) {
4418 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev_id %i txpower %d\n",
4419 			   arvif->vdev_id, info->txpower);
4420 
4421 		arvif->txpower = info->txpower;
4422 		ath12k_mac_txpower_recalc(ar);
4423 	}
4424 
4425 	if (changed & BSS_CHANGED_MCAST_RATE &&
4426 	    !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
4427 		band = def.chan->band;
4428 		mcast_rate = info->mcast_rate[band];
4429 
4430 		if (mcast_rate > 0) {
4431 			rateidx = mcast_rate - 1;
4432 		} else {
4433 			if (info->basic_rates)
4434 				rateidx = __ffs(info->basic_rates);
4435 			else
4436 				rateidx = 0;
4437 		}
4438 
4439 		if (ar->pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP)
4440 			rateidx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
4441 
4442 		bitrate = ath12k_legacy_rates[rateidx].bitrate;
4443 		hw_value = ath12k_legacy_rates[rateidx].hw_value;
4444 
4445 		if (ath12k_mac_bitrate_is_cck(bitrate))
4446 			preamble = WMI_RATE_PREAMBLE_CCK;
4447 		else
4448 			preamble = WMI_RATE_PREAMBLE_OFDM;
4449 
4450 		rate = ATH12K_HW_RATE_CODE(hw_value, 0, preamble);
4451 
4452 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
4453 			   "mac vdev %d mcast_rate %x\n",
4454 			   arvif->vdev_id, rate);
4455 
4456 		vdev_param = WMI_VDEV_PARAM_MCAST_DATA_RATE;
4457 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4458 						    vdev_param, rate);
4459 		if (ret)
4460 			ath12k_warn(ar->ab,
4461 				    "failed to set mcast rate on vdev %i: %d\n",
4462 				    arvif->vdev_id,  ret);
4463 
4464 		vdev_param = WMI_VDEV_PARAM_BCAST_DATA_RATE;
4465 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
4466 						    vdev_param, rate);
4467 		if (ret)
4468 			ath12k_warn(ar->ab,
4469 				    "failed to set bcast rate on vdev %i: %d\n",
4470 				    arvif->vdev_id,  ret);
4471 	}
4472 
4473 	if (changed & BSS_CHANGED_BASIC_RATES &&
4474 	    !ath12k_mac_vif_link_chan(vif, arvif->link_id, &def))
4475 		ath12k_recalculate_mgmt_rate(ar, arvif, &def);
4476 
4477 	if (changed & BSS_CHANGED_TWT) {
4478 		if (info->twt_requester || info->twt_responder)
4479 			ath12k_wmi_send_twt_enable_cmd(ar, ar->pdev->pdev_id);
4480 		else
4481 			ath12k_wmi_send_twt_disable_cmd(ar, ar->pdev->pdev_id);
4482 	}
4483 
4484 	if (changed & BSS_CHANGED_HE_OBSS_PD)
4485 		ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
4486 					     &info->he_obss_pd);
4487 
4488 	if (changed & BSS_CHANGED_HE_BSS_COLOR) {
4489 		if (vif->type == NL80211_IFTYPE_AP) {
4490 			ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4491 							    arvif->vdev_id,
4492 							    info->he_bss_color.color,
4493 							    ATH12K_BSS_COLOR_AP_PERIODS,
4494 							    info->he_bss_color.enabled);
4495 			if (ret)
4496 				ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4497 					    arvif->vdev_id,  ret);
4498 		} else if (vif->type == NL80211_IFTYPE_STATION) {
4499 			ret = ath12k_wmi_send_bss_color_change_enable_cmd(ar,
4500 									  arvif->vdev_id,
4501 									  1);
4502 			if (ret)
4503 				ath12k_warn(ar->ab, "failed to enable bss color change on vdev %i: %d\n",
4504 					    arvif->vdev_id,  ret);
4505 			ret = ath12k_wmi_obss_color_cfg_cmd(ar,
4506 							    arvif->vdev_id,
4507 							    0,
4508 							    ATH12K_BSS_COLOR_STA_PERIODS,
4509 							    1);
4510 			if (ret)
4511 				ath12k_warn(ar->ab, "failed to set bss color collision on vdev %i: %d\n",
4512 					    arvif->vdev_id,  ret);
4513 		}
4514 	}
4515 
4516 	ath12k_mac_fils_discovery(arvif, info);
4517 }
4518 
ath12k_ahvif_get_link_cache(struct ath12k_vif * ahvif,u8 link_id)4519 static struct ath12k_vif_cache *ath12k_ahvif_get_link_cache(struct ath12k_vif *ahvif,
4520 							    u8 link_id)
4521 {
4522 	if (!ahvif->cache[link_id]) {
4523 		ahvif->cache[link_id] = kzalloc(sizeof(*ahvif->cache[0]), GFP_KERNEL);
4524 		if (ahvif->cache[link_id])
4525 			INIT_LIST_HEAD(&ahvif->cache[link_id]->key_conf.list);
4526 	}
4527 
4528 	return ahvif->cache[link_id];
4529 }
4530 
ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache * cache)4531 static void ath12k_ahvif_put_link_key_cache(struct ath12k_vif_cache *cache)
4532 {
4533 	struct ath12k_key_conf *key_conf, *tmp;
4534 
4535 	if (!cache || list_empty(&cache->key_conf.list))
4536 		return;
4537 	list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
4538 		list_del(&key_conf->list);
4539 		kfree(key_conf);
4540 	}
4541 }
4542 
ath12k_ahvif_put_link_cache(struct ath12k_vif * ahvif,u8 link_id)4543 static void ath12k_ahvif_put_link_cache(struct ath12k_vif *ahvif, u8 link_id)
4544 {
4545 	if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
4546 		return;
4547 
4548 	ath12k_ahvif_put_link_key_cache(ahvif->cache[link_id]);
4549 	kfree(ahvif->cache[link_id]);
4550 	ahvif->cache[link_id] = NULL;
4551 }
4552 
ath12k_mac_op_link_info_changed(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * info,u64 changed)4553 static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
4554 					    struct ieee80211_vif *vif,
4555 					    struct ieee80211_bss_conf *info,
4556 					    u64 changed)
4557 {
4558 	struct ath12k *ar;
4559 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4560 	struct ath12k_vif_cache *cache;
4561 	struct ath12k_link_vif *arvif;
4562 	u8 link_id = info->link_id;
4563 
4564 	lockdep_assert_wiphy(hw->wiphy);
4565 
4566 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
4567 
4568 	/* if the vdev is not created on a certain radio,
4569 	 * cache the info to be updated later on vdev creation
4570 	 */
4571 
4572 	if (!arvif || !arvif->is_created) {
4573 		cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
4574 		if (!cache)
4575 			return;
4576 
4577 		cache->bss_conf_changed |= changed;
4578 
4579 		return;
4580 	}
4581 
4582 	ar = arvif->ar;
4583 
4584 	ath12k_mac_bss_info_changed(ar, arvif, info, changed);
4585 }
4586 
4587 static struct ath12k*
ath12k_mac_select_scan_device(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 center_freq)4588 ath12k_mac_select_scan_device(struct ieee80211_hw *hw,
4589 			      struct ieee80211_vif *vif,
4590 			      u32 center_freq)
4591 {
4592 	struct ath12k_hw *ah = hw->priv;
4593 	enum nl80211_band band;
4594 	struct ath12k *ar;
4595 	int i;
4596 
4597 	if (ah->num_radio == 1)
4598 		return ah->radio;
4599 
4600 	/* Currently mac80211 supports splitting scan requests into
4601 	 * multiple scan requests per band.
4602 	 * Loop through first channel and determine the scan radio
4603 	 * TODO: There could be 5 GHz low/high channels in that case
4604 	 * split the hw request and perform multiple scans
4605 	 */
4606 
4607 	if (center_freq < ATH12K_MIN_5GHZ_FREQ)
4608 		band = NL80211_BAND_2GHZ;
4609 	else if (center_freq < ATH12K_MIN_6GHZ_FREQ)
4610 		band = NL80211_BAND_5GHZ;
4611 	else
4612 		band = NL80211_BAND_6GHZ;
4613 
4614 	for_each_ar(ah, ar, i) {
4615 		if (ar->mac.sbands[band].channels &&
4616 		    center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
4617 		    center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
4618 			return ar;
4619 	}
4620 
4621 	return NULL;
4622 }
4623 
__ath12k_mac_scan_finish(struct ath12k * ar)4624 void __ath12k_mac_scan_finish(struct ath12k *ar)
4625 {
4626 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
4627 
4628 	lockdep_assert_held(&ar->data_lock);
4629 
4630 	switch (ar->scan.state) {
4631 	case ATH12K_SCAN_IDLE:
4632 		break;
4633 	case ATH12K_SCAN_RUNNING:
4634 	case ATH12K_SCAN_ABORTING:
4635 		if (ar->scan.is_roc && ar->scan.roc_notify)
4636 			ieee80211_remain_on_channel_expired(hw);
4637 		fallthrough;
4638 	case ATH12K_SCAN_STARTING:
4639 		cancel_delayed_work(&ar->scan.timeout);
4640 		complete_all(&ar->scan.completed);
4641 		wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
4642 		break;
4643 	}
4644 }
4645 
ath12k_mac_scan_finish(struct ath12k * ar)4646 void ath12k_mac_scan_finish(struct ath12k *ar)
4647 {
4648 	spin_lock_bh(&ar->data_lock);
4649 	__ath12k_mac_scan_finish(ar);
4650 	spin_unlock_bh(&ar->data_lock);
4651 }
4652 
ath12k_scan_stop(struct ath12k * ar)4653 static int ath12k_scan_stop(struct ath12k *ar)
4654 {
4655 	struct ath12k_wmi_scan_cancel_arg arg = {
4656 		.req_type = WLAN_SCAN_CANCEL_SINGLE,
4657 		.scan_id = ATH12K_SCAN_ID,
4658 	};
4659 	int ret;
4660 
4661 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4662 
4663 	/* TODO: Fill other STOP Params */
4664 	arg.pdev_id = ar->pdev->pdev_id;
4665 
4666 	ret = ath12k_wmi_send_scan_stop_cmd(ar, &arg);
4667 	if (ret) {
4668 		ath12k_warn(ar->ab, "failed to stop wmi scan: %d\n", ret);
4669 		goto out;
4670 	}
4671 
4672 	ret = wait_for_completion_timeout(&ar->scan.completed, 3 * HZ);
4673 	if (ret == 0) {
4674 		ath12k_warn(ar->ab,
4675 			    "failed to receive scan abort comple: timed out\n");
4676 		ret = -ETIMEDOUT;
4677 	} else if (ret > 0) {
4678 		ret = 0;
4679 	}
4680 
4681 out:
4682 	/* Scan state should be updated in scan completion worker but in
4683 	 * case firmware fails to deliver the event (for whatever reason)
4684 	 * it is desired to clean up scan state anyway. Firmware may have
4685 	 * just dropped the scan completion event delivery due to transport
4686 	 * pipe being overflown with data and/or it can recover on its own
4687 	 * before next scan request is submitted.
4688 	 */
4689 	spin_lock_bh(&ar->data_lock);
4690 	if (ret)
4691 		__ath12k_mac_scan_finish(ar);
4692 	spin_unlock_bh(&ar->data_lock);
4693 
4694 	return ret;
4695 }
4696 
ath12k_scan_abort(struct ath12k * ar)4697 static void ath12k_scan_abort(struct ath12k *ar)
4698 {
4699 	int ret;
4700 
4701 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4702 
4703 	spin_lock_bh(&ar->data_lock);
4704 
4705 	switch (ar->scan.state) {
4706 	case ATH12K_SCAN_IDLE:
4707 		/* This can happen if timeout worker kicked in and called
4708 		 * abortion while scan completion was being processed.
4709 		 */
4710 		break;
4711 	case ATH12K_SCAN_STARTING:
4712 	case ATH12K_SCAN_ABORTING:
4713 		ath12k_warn(ar->ab, "refusing scan abortion due to invalid scan state: %d\n",
4714 			    ar->scan.state);
4715 		break;
4716 	case ATH12K_SCAN_RUNNING:
4717 		ar->scan.state = ATH12K_SCAN_ABORTING;
4718 		spin_unlock_bh(&ar->data_lock);
4719 
4720 		ret = ath12k_scan_stop(ar);
4721 		if (ret)
4722 			ath12k_warn(ar->ab, "failed to abort scan: %d\n", ret);
4723 
4724 		spin_lock_bh(&ar->data_lock);
4725 		break;
4726 	}
4727 
4728 	spin_unlock_bh(&ar->data_lock);
4729 }
4730 
ath12k_scan_timeout_work(struct work_struct * work)4731 static void ath12k_scan_timeout_work(struct work_struct *work)
4732 {
4733 	struct ath12k *ar = container_of(work, struct ath12k,
4734 					 scan.timeout.work);
4735 
4736 	wiphy_lock(ath12k_ar_to_hw(ar)->wiphy);
4737 	ath12k_scan_abort(ar);
4738 	wiphy_unlock(ath12k_ar_to_hw(ar)->wiphy);
4739 }
4740 
ath12k_mac_scan_send_complete(struct ath12k * ar,struct cfg80211_scan_info * info)4741 static void ath12k_mac_scan_send_complete(struct ath12k *ar,
4742 					  struct cfg80211_scan_info *info)
4743 {
4744 	struct ath12k_hw *ah = ar->ah;
4745 	struct ath12k *partner_ar;
4746 	int i;
4747 
4748 	lockdep_assert_wiphy(ah->hw->wiphy);
4749 
4750 	for_each_ar(ah, partner_ar, i)
4751 		if (partner_ar != ar &&
4752 		    partner_ar->scan.state == ATH12K_SCAN_RUNNING)
4753 			return;
4754 
4755 	ieee80211_scan_completed(ah->hw, info);
4756 }
4757 
ath12k_scan_vdev_clean_work(struct wiphy * wiphy,struct wiphy_work * work)4758 static void ath12k_scan_vdev_clean_work(struct wiphy *wiphy, struct wiphy_work *work)
4759 {
4760 	struct ath12k *ar = container_of(work, struct ath12k,
4761 					 scan.vdev_clean_wk);
4762 	struct ath12k_hw *ah = ar->ah;
4763 	struct ath12k_link_vif *arvif;
4764 
4765 	lockdep_assert_wiphy(wiphy);
4766 
4767 	arvif = ar->scan.arvif;
4768 
4769 	/* The scan vdev has already been deleted. This can occur when a
4770 	 * new scan request is made on the same vif with a different
4771 	 * frequency, causing the scan arvif to move from one radio to
4772 	 * another. Or, scan was abrupted and via remove interface, the
4773 	 * arvif is already deleted. Alternatively, if the scan vdev is not
4774 	 * being used as an actual vdev, then do not delete it.
4775 	 */
4776 	if (!arvif || arvif->is_started)
4777 		goto work_complete;
4778 
4779 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac clean scan vdev (link id %u)",
4780 		   arvif->link_id);
4781 
4782 	ath12k_mac_remove_link_interface(ah->hw, arvif);
4783 	ath12k_mac_unassign_link_vif(arvif);
4784 
4785 work_complete:
4786 	spin_lock_bh(&ar->data_lock);
4787 	ar->scan.arvif = NULL;
4788 	if (!ar->scan.is_roc) {
4789 		struct cfg80211_scan_info info = {
4790 			.aborted = ((ar->scan.state ==
4791 				    ATH12K_SCAN_ABORTING) ||
4792 				    (ar->scan.state ==
4793 				    ATH12K_SCAN_STARTING)),
4794 		};
4795 
4796 		ath12k_mac_scan_send_complete(ar, &info);
4797 	}
4798 
4799 	ar->scan.state = ATH12K_SCAN_IDLE;
4800 	ar->scan_channel = NULL;
4801 	ar->scan.roc_freq = 0;
4802 	spin_unlock_bh(&ar->data_lock);
4803 }
4804 
ath12k_start_scan(struct ath12k * ar,struct ath12k_wmi_scan_req_arg * arg)4805 static int ath12k_start_scan(struct ath12k *ar,
4806 			     struct ath12k_wmi_scan_req_arg *arg)
4807 {
4808 	int ret;
4809 
4810 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
4811 
4812 	ret = ath12k_wmi_send_scan_start_cmd(ar, arg);
4813 	if (ret)
4814 		return ret;
4815 
4816 	ret = wait_for_completion_timeout(&ar->scan.started, 1 * HZ);
4817 	if (ret == 0) {
4818 		ret = ath12k_scan_stop(ar);
4819 		if (ret)
4820 			ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
4821 
4822 		return -ETIMEDOUT;
4823 	}
4824 
4825 	/* If we failed to start the scan, return error code at
4826 	 * this point.  This is probably due to some issue in the
4827 	 * firmware, but no need to wedge the driver due to that...
4828 	 */
4829 	spin_lock_bh(&ar->data_lock);
4830 	if (ar->scan.state == ATH12K_SCAN_IDLE) {
4831 		spin_unlock_bh(&ar->data_lock);
4832 		return -EINVAL;
4833 	}
4834 	spin_unlock_bh(&ar->data_lock);
4835 
4836 	return 0;
4837 }
4838 
ath12k_mac_get_fw_stats(struct ath12k * ar,struct ath12k_fw_stats_req_params * param)4839 int ath12k_mac_get_fw_stats(struct ath12k *ar,
4840 			    struct ath12k_fw_stats_req_params *param)
4841 {
4842 	struct ath12k_base *ab = ar->ab;
4843 	struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
4844 	unsigned long time_left;
4845 	int ret;
4846 
4847 	guard(mutex)(&ah->hw_mutex);
4848 
4849 	if (ah->state != ATH12K_HW_STATE_ON)
4850 		return -ENETDOWN;
4851 
4852 	ath12k_fw_stats_reset(ar);
4853 
4854 	reinit_completion(&ar->fw_stats_complete);
4855 	reinit_completion(&ar->fw_stats_done);
4856 
4857 	ret = ath12k_wmi_send_stats_request_cmd(ar, param->stats_id,
4858 						param->vdev_id, param->pdev_id);
4859 	if (ret) {
4860 		ath12k_warn(ab, "failed to request fw stats: %d\n", ret);
4861 		return ret;
4862 	}
4863 
4864 	ath12k_dbg(ab, ATH12K_DBG_WMI,
4865 		   "get fw stat pdev id %d vdev id %d stats id 0x%x\n",
4866 		   param->pdev_id, param->vdev_id, param->stats_id);
4867 
4868 	time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
4869 	if (!time_left) {
4870 		ath12k_warn(ab, "time out while waiting for get fw stats\n");
4871 		return -ETIMEDOUT;
4872 	}
4873 
4874 	/* Firmware sends WMI_UPDATE_STATS_EVENTID back-to-back
4875 	 * when stats data buffer limit is reached. fw_stats_complete
4876 	 * is completed once host receives first event from firmware, but
4877 	 * still there could be more events following. Below is to wait
4878 	 * until firmware completes sending all the events.
4879 	 */
4880 	time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
4881 	if (!time_left) {
4882 		ath12k_warn(ab, "time out while waiting for fw stats done\n");
4883 		return -ETIMEDOUT;
4884 	}
4885 
4886 	return 0;
4887 }
4888 
ath12k_mac_op_get_txpower(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,int * dbm)4889 static int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw,
4890 				     struct ieee80211_vif *vif,
4891 				     unsigned int link_id,
4892 				     int *dbm)
4893 {
4894 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
4895 	struct ath12k_fw_stats_req_params params = {};
4896 	struct ath12k_fw_stats_pdev *pdev;
4897 	struct ath12k_hw *ah = hw->priv;
4898 	struct ath12k_link_vif *arvif;
4899 	struct ath12k_base *ab;
4900 	struct ath12k *ar;
4901 	int ret;
4902 
4903 	/* Final Tx power is minimum of Target Power, CTL power, Regulatory
4904 	 * Power, PSD EIRP Power. We just know the Regulatory power from the
4905 	 * regulatory rules obtained. FW knows all these power and sets the min
4906 	 * of these. Hence, we request the FW pdev stats in which FW reports
4907 	 * the minimum of all vdev's channel Tx power.
4908 	 */
4909 	lockdep_assert_wiphy(hw->wiphy);
4910 
4911 	arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4912 	if (!arvif || !arvif->ar)
4913 		return -EINVAL;
4914 
4915 	ar = arvif->ar;
4916 	ab = ar->ab;
4917 	if (ah->state != ATH12K_HW_STATE_ON)
4918 		goto err_fallback;
4919 
4920 	if (test_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags))
4921 		return -EAGAIN;
4922 
4923 	/* Limit the requests to Firmware for fetching the tx power */
4924 	if (ar->chan_tx_pwr != ATH12K_PDEV_TX_POWER_INVALID &&
4925 	    time_before(jiffies,
4926 			msecs_to_jiffies(ATH12K_PDEV_TX_POWER_REFRESH_TIME_MSECS) +
4927 					 ar->last_tx_power_update))
4928 		goto send_tx_power;
4929 
4930 	params.pdev_id = ar->pdev->pdev_id;
4931 	params.vdev_id = arvif->vdev_id;
4932 	params.stats_id = WMI_REQUEST_PDEV_STAT;
4933 	ret = ath12k_mac_get_fw_stats(ar, &params);
4934 	if (ret) {
4935 		ath12k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
4936 		goto err_fallback;
4937 	}
4938 
4939 	spin_lock_bh(&ar->data_lock);
4940 	pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
4941 					struct ath12k_fw_stats_pdev, list);
4942 	if (!pdev) {
4943 		spin_unlock_bh(&ar->data_lock);
4944 		goto err_fallback;
4945 	}
4946 
4947 	/* tx power reported by firmware is in units of 0.5 dBm */
4948 	ar->chan_tx_pwr = pdev->chan_tx_power / 2;
4949 	spin_unlock_bh(&ar->data_lock);
4950 	ar->last_tx_power_update = jiffies;
4951 
4952 send_tx_power:
4953 	*dbm = ar->chan_tx_pwr;
4954 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower fetched from firmware %d dBm\n",
4955 		   *dbm);
4956 	return 0;
4957 
4958 err_fallback:
4959 	/* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
4960 	*dbm = vif->bss_conf.txpower;
4961 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
4962 		   *dbm);
4963 	return 0;
4964 }
4965 
4966 static u8
ath12k_mac_find_link_id_by_ar(struct ath12k_vif * ahvif,struct ath12k * ar)4967 ath12k_mac_find_link_id_by_ar(struct ath12k_vif *ahvif, struct ath12k *ar)
4968 {
4969 	struct ath12k_link_vif *arvif;
4970 	struct ath12k_hw *ah = ahvif->ah;
4971 	unsigned long links = ahvif->links_map;
4972 	unsigned long scan_links_map;
4973 	u8 link_id;
4974 
4975 	lockdep_assert_wiphy(ah->hw->wiphy);
4976 
4977 	for_each_set_bit(link_id, &links, ATH12K_NUM_MAX_LINKS) {
4978 		arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
4979 
4980 		if (!arvif || !arvif->is_created)
4981 			continue;
4982 
4983 		if (ar == arvif->ar)
4984 			return link_id;
4985 	}
4986 
4987 	/* input ar is not assigned to any of the links of ML VIF, use next
4988 	 * available scan link for scan vdev creation. There are cases where
4989 	 * single scan req needs to be split in driver and initiate separate
4990 	 * scan requests to firmware based on device.
4991 	 */
4992 
4993 	 /* Unset all non-scan links (0-14) of scan_links_map so that ffs() will
4994 	  * choose an available link among scan links (i.e link id >= 15)
4995 	  */
4996 	scan_links_map = ~ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
4997 	if (scan_links_map)
4998 		return __ffs(scan_links_map);
4999 
5000 	return ATH12K_FIRST_SCAN_LINK;
5001 }
5002 
ath12k_mac_initiate_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req,int n_channels,struct ieee80211_channel ** chan_list,struct ath12k * ar)5003 static int ath12k_mac_initiate_hw_scan(struct ieee80211_hw *hw,
5004 				       struct ieee80211_vif *vif,
5005 				       struct ieee80211_scan_request *hw_req,
5006 				       int n_channels,
5007 				       struct ieee80211_channel **chan_list,
5008 				       struct ath12k *ar)
5009 {
5010 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5011 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5012 	struct ath12k_link_vif *arvif;
5013 	struct cfg80211_scan_request *req = &hw_req->req;
5014 	struct ath12k_wmi_scan_req_arg *arg = NULL;
5015 	u8 link_id;
5016 	int ret;
5017 	int i;
5018 	bool create = true;
5019 
5020 	lockdep_assert_wiphy(hw->wiphy);
5021 
5022 	arvif = &ahvif->deflink;
5023 
5024 	/* check if any of the links of ML VIF is already started on
5025 	 * radio(ar) corresponding to given scan frequency and use it,
5026 	 * if not use scan link (link id >= 15) for scan purpose.
5027 	 */
5028 	link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
5029 	/* All scan links are occupied. ideally this shouldn't happen as
5030 	 * mac80211 won't schedule scan for same band until ongoing scan is
5031 	 * completed, don't try to exceed max links just in case if it happens.
5032 	 */
5033 	if (link_id >= ATH12K_NUM_MAX_LINKS)
5034 		return -EBUSY;
5035 
5036 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5037 
5038 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac link ID %d selected for scan",
5039 		   arvif->link_id);
5040 
5041 	/* If the vif is already assigned to a specific vdev of an ar,
5042 	 * check whether its already started, vdev which is started
5043 	 * are not allowed to switch to a new radio.
5044 	 * If the vdev is not started, but was earlier created on a
5045 	 * different ar, delete that vdev and create a new one. We don't
5046 	 * delete at the scan stop as an optimization to avoid redundant
5047 	 * delete-create vdev's for the same ar, in case the request is
5048 	 * always on the same band for the vif
5049 	 */
5050 	if (arvif->is_created) {
5051 		if (WARN_ON(!arvif->ar))
5052 			return -EINVAL;
5053 
5054 		if (ar != arvif->ar && arvif->is_started)
5055 			return -EINVAL;
5056 
5057 		if (ar != arvif->ar) {
5058 			ath12k_mac_remove_link_interface(hw, arvif);
5059 			ath12k_mac_unassign_link_vif(arvif);
5060 		} else {
5061 			create = false;
5062 		}
5063 	}
5064 
5065 	if (create) {
5066 		/* Previous arvif would've been cleared in radio switch block
5067 		 * above, assign arvif again for create.
5068 		 */
5069 		arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
5070 
5071 		ret = ath12k_mac_vdev_create(ar, arvif);
5072 		if (ret) {
5073 			ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
5074 			return -EINVAL;
5075 		}
5076 	}
5077 
5078 	spin_lock_bh(&ar->data_lock);
5079 	switch (ar->scan.state) {
5080 	case ATH12K_SCAN_IDLE:
5081 		reinit_completion(&ar->scan.started);
5082 		reinit_completion(&ar->scan.completed);
5083 		ar->scan.state = ATH12K_SCAN_STARTING;
5084 		ar->scan.is_roc = false;
5085 		ar->scan.arvif = arvif;
5086 		ret = 0;
5087 		break;
5088 	case ATH12K_SCAN_STARTING:
5089 	case ATH12K_SCAN_RUNNING:
5090 	case ATH12K_SCAN_ABORTING:
5091 		ret = -EBUSY;
5092 		break;
5093 	}
5094 	spin_unlock_bh(&ar->data_lock);
5095 
5096 	if (ret)
5097 		goto exit;
5098 
5099 	arg = kzalloc(sizeof(*arg), GFP_KERNEL);
5100 	if (!arg) {
5101 		ret = -ENOMEM;
5102 		goto exit;
5103 	}
5104 
5105 	ath12k_wmi_start_scan_init(ar, arg);
5106 	arg->vdev_id = arvif->vdev_id;
5107 	arg->scan_id = ATH12K_SCAN_ID;
5108 
5109 	if (req->ie_len) {
5110 		arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL);
5111 		if (!arg->extraie.ptr) {
5112 			ret = -ENOMEM;
5113 			goto exit;
5114 		}
5115 		arg->extraie.len = req->ie_len;
5116 	}
5117 
5118 	if (req->n_ssids) {
5119 		arg->num_ssids = req->n_ssids;
5120 		for (i = 0; i < arg->num_ssids; i++)
5121 			arg->ssid[i] = req->ssids[i];
5122 	} else {
5123 		arg->scan_f_passive = 1;
5124 	}
5125 
5126 	if (n_channels) {
5127 		arg->num_chan = n_channels;
5128 		arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
5129 					 GFP_KERNEL);
5130 		if (!arg->chan_list) {
5131 			ret = -ENOMEM;
5132 			goto exit;
5133 		}
5134 
5135 		for (i = 0; i < arg->num_chan; i++)
5136 			arg->chan_list[i] = chan_list[i]->center_freq;
5137 	}
5138 
5139 	ret = ath12k_start_scan(ar, arg);
5140 	if (ret) {
5141 		if (ret == -EBUSY)
5142 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5143 				   "scan engine is busy 11d state %d\n", ar->state_11d);
5144 		else
5145 			ath12k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
5146 
5147 		spin_lock_bh(&ar->data_lock);
5148 		ar->scan.state = ATH12K_SCAN_IDLE;
5149 		spin_unlock_bh(&ar->data_lock);
5150 		goto exit;
5151 	}
5152 
5153 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac scan started");
5154 
5155 	/* Add a margin to account for event/command processing */
5156 	ieee80211_queue_delayed_work(ath12k_ar_to_hw(ar), &ar->scan.timeout,
5157 				     msecs_to_jiffies(arg->max_scan_time +
5158 						      ATH12K_MAC_SCAN_TIMEOUT_MSECS));
5159 
5160 exit:
5161 	if (arg) {
5162 		kfree(arg->chan_list);
5163 		kfree(arg->extraie.ptr);
5164 		kfree(arg);
5165 	}
5166 
5167 	if (ar->state_11d == ATH12K_11D_PREPARING &&
5168 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5169 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
5170 		ath12k_mac_11d_scan_start(ar, arvif->vdev_id);
5171 
5172 	return ret;
5173 }
5174 
ath12k_mac_op_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_scan_request * hw_req)5175 static int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
5176 				 struct ieee80211_vif *vif,
5177 				 struct ieee80211_scan_request *hw_req)
5178 {
5179 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5180 	struct ieee80211_channel **chan_list, *chan;
5181 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
5182 	unsigned long links_map, link_id;
5183 	struct ath12k_link_vif *arvif;
5184 	struct ath12k *ar, *scan_ar;
5185 	int i, j, ret = 0;
5186 
5187 	lockdep_assert_wiphy(hw->wiphy);
5188 
5189 	chan_list = kcalloc(hw_req->req.n_channels, sizeof(*chan_list), GFP_KERNEL);
5190 	if (!chan_list)
5191 		return -ENOMEM;
5192 
5193 	/* There could be channels that belong to multiple underlying radio
5194 	 * in same scan request as mac80211 sees it as single band. In that
5195 	 * case split the hw_req based on frequency range and schedule scans to
5196 	 * corresponding radio.
5197 	 */
5198 	for_each_ar(ah, ar, i) {
5199 		int n_chans = 0;
5200 
5201 		for (j = 0; j < hw_req->req.n_channels; j++) {
5202 			chan = hw_req->req.channels[j];
5203 			scan_ar = ath12k_mac_select_scan_device(hw, vif,
5204 								chan->center_freq);
5205 			if (!scan_ar) {
5206 				ath12k_hw_warn(ah, "unable to select scan device for freq %d\n",
5207 					       chan->center_freq);
5208 				ret = -EINVAL;
5209 				goto abort;
5210 			}
5211 			if (ar != scan_ar)
5212 				continue;
5213 
5214 			chan_list[n_chans++] = chan;
5215 		}
5216 		if (n_chans) {
5217 			ret = ath12k_mac_initiate_hw_scan(hw, vif, hw_req, n_chans,
5218 							  chan_list, ar);
5219 			if (ret)
5220 				goto abort;
5221 		}
5222 	}
5223 abort:
5224 	/* If any of the parallel scans initiated fails, abort all and
5225 	 * remove the scan interfaces created. Return complete scan
5226 	 * failure as mac80211 assumes this as single scan request.
5227 	 */
5228 	if (ret) {
5229 		ath12k_hw_warn(ah, "Scan failed %d , cleanup all scan vdevs\n", ret);
5230 		links_map = ahvif->links_map;
5231 		for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5232 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5233 			if (!arvif)
5234 				continue;
5235 
5236 			ar = arvif->ar;
5237 			if (ar->scan.arvif == arvif) {
5238 				wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
5239 				spin_lock_bh(&ar->data_lock);
5240 				ar->scan.arvif = NULL;
5241 				ar->scan.state = ATH12K_SCAN_IDLE;
5242 				ar->scan_channel = NULL;
5243 				ar->scan.roc_freq = 0;
5244 				spin_unlock_bh(&ar->data_lock);
5245 			}
5246 			if (link_id >= ATH12K_FIRST_SCAN_LINK) {
5247 				ath12k_mac_remove_link_interface(hw, arvif);
5248 				ath12k_mac_unassign_link_vif(arvif);
5249 			}
5250 		}
5251 	}
5252 	kfree(chan_list);
5253 	return ret;
5254 }
5255 
ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw * hw,struct ieee80211_vif * vif)5256 static void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
5257 					 struct ieee80211_vif *vif)
5258 {
5259 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5260 	unsigned long link_id, links_map = ahvif->links_map;
5261 	struct ath12k_link_vif *arvif;
5262 	struct ath12k *ar;
5263 
5264 	lockdep_assert_wiphy(hw->wiphy);
5265 
5266 	for_each_set_bit(link_id, &links_map, ATH12K_NUM_MAX_LINKS) {
5267 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5268 		if (!arvif || arvif->is_started)
5269 			continue;
5270 
5271 		ar = arvif->ar;
5272 
5273 		ath12k_scan_abort(ar);
5274 
5275 		cancel_delayed_work_sync(&ar->scan.timeout);
5276 	}
5277 }
5278 
ath12k_install_key(struct ath12k_link_vif * arvif,struct ieee80211_key_conf * key,enum set_key_cmd cmd,const u8 * macaddr,u32 flags)5279 static int ath12k_install_key(struct ath12k_link_vif *arvif,
5280 			      struct ieee80211_key_conf *key,
5281 			      enum set_key_cmd cmd,
5282 			      const u8 *macaddr, u32 flags)
5283 {
5284 	int ret;
5285 	struct ath12k *ar = arvif->ar;
5286 	struct wmi_vdev_install_key_arg arg = {
5287 		.vdev_id = arvif->vdev_id,
5288 		.key_idx = key->keyidx,
5289 		.key_len = key->keylen,
5290 		.key_data = key->key,
5291 		.key_flags = flags,
5292 		.ieee80211_key_cipher = key->cipher,
5293 		.macaddr = macaddr,
5294 	};
5295 	struct ath12k_vif *ahvif = arvif->ahvif;
5296 
5297 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5298 
5299 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
5300 		return 0;
5301 
5302 	if (cmd == DISABLE_KEY) {
5303 		/* TODO: Check if FW expects  value other than NONE for del */
5304 		/* arg.key_cipher = WMI_CIPHER_NONE; */
5305 		arg.key_len = 0;
5306 		arg.key_data = NULL;
5307 		goto check_order;
5308 	}
5309 
5310 	switch (key->cipher) {
5311 	case WLAN_CIPHER_SUITE_CCMP:
5312 	case WLAN_CIPHER_SUITE_CCMP_256:
5313 		arg.key_cipher = WMI_CIPHER_AES_CCM;
5314 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5315 		break;
5316 	case WLAN_CIPHER_SUITE_TKIP:
5317 		arg.key_cipher = WMI_CIPHER_TKIP;
5318 		arg.key_txmic_len = 8;
5319 		arg.key_rxmic_len = 8;
5320 		break;
5321 	case WLAN_CIPHER_SUITE_GCMP:
5322 	case WLAN_CIPHER_SUITE_GCMP_256:
5323 		arg.key_cipher = WMI_CIPHER_AES_GCM;
5324 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
5325 		break;
5326 	case WLAN_CIPHER_SUITE_AES_CMAC:
5327 		arg.key_cipher = WMI_CIPHER_AES_CMAC;
5328 		break;
5329 	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
5330 	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
5331 		arg.key_cipher = WMI_CIPHER_AES_GMAC;
5332 		break;
5333 	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
5334 		arg.key_cipher = WMI_CIPHER_AES_CMAC;
5335 		break;
5336 	default:
5337 		ath12k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
5338 		return -EOPNOTSUPP;
5339 	}
5340 
5341 	if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
5342 		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV |
5343 			      IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
5344 
5345 check_order:
5346 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5347 	    arg.key_flags == WMI_KEY_GROUP) {
5348 		if (cmd == SET_KEY) {
5349 			if (arvif->pairwise_key_done) {
5350 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5351 					   "vdev %u pairwise key done, go install group key\n",
5352 					   arg.vdev_id);
5353 				goto install;
5354 			} else {
5355 				/* WCN7850 firmware requires pairwise key to be installed
5356 				 * before group key. In case group key comes first, cache
5357 				 * it and return. Will revisit it once pairwise key gets
5358 				 * installed.
5359 				 */
5360 				arvif->group_key = arg;
5361 				arvif->group_key_valid = true;
5362 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5363 					   "vdev %u group key before pairwise key, cache and skip\n",
5364 					   arg.vdev_id);
5365 
5366 				ret = 0;
5367 				goto out;
5368 			}
5369 		} else {
5370 			arvif->group_key_valid = false;
5371 		}
5372 	}
5373 
5374 install:
5375 	reinit_completion(&ar->install_key_done);
5376 
5377 	ret = ath12k_wmi_vdev_install_key(arvif->ar, &arg);
5378 	if (ret)
5379 		return ret;
5380 
5381 	if (!wait_for_completion_timeout(&ar->install_key_done, 1 * HZ))
5382 		return -ETIMEDOUT;
5383 
5384 	if (ether_addr_equal(arg.macaddr, arvif->bssid))
5385 		ahvif->key_cipher = arg.ieee80211_key_cipher;
5386 
5387 	if (ar->install_key_status) {
5388 		ret = -EINVAL;
5389 		goto out;
5390 	}
5391 
5392 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
5393 	    arg.key_flags == WMI_KEY_PAIRWISE) {
5394 		if (cmd == SET_KEY) {
5395 			arvif->pairwise_key_done = true;
5396 			if (arvif->group_key_valid) {
5397 				/* Install cached GTK */
5398 				arvif->group_key_valid = false;
5399 				arg = arvif->group_key;
5400 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5401 					   "vdev %u pairwise key done, group key ready, go install\n",
5402 					   arg.vdev_id);
5403 				goto install;
5404 			}
5405 		} else {
5406 			arvif->pairwise_key_done = false;
5407 		}
5408 	}
5409 
5410 out:
5411 	if (ret) {
5412 		/* In case of failure userspace may not do DISABLE_KEY
5413 		 * but triggers re-connection directly, so manually reset
5414 		 * status here.
5415 		 */
5416 		arvif->group_key_valid = false;
5417 		arvif->pairwise_key_done = false;
5418 	}
5419 
5420 	return ret;
5421 }
5422 
ath12k_clear_peer_keys(struct ath12k_link_vif * arvif,const u8 * addr)5423 static int ath12k_clear_peer_keys(struct ath12k_link_vif *arvif,
5424 				  const u8 *addr)
5425 {
5426 	struct ath12k *ar = arvif->ar;
5427 	struct ath12k_base *ab = ar->ab;
5428 	struct ath12k_peer *peer;
5429 	int first_errno = 0;
5430 	int ret;
5431 	int i;
5432 	u32 flags = 0;
5433 
5434 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5435 
5436 	spin_lock_bh(&ab->base_lock);
5437 	peer = ath12k_peer_find(ab, arvif->vdev_id, addr);
5438 	spin_unlock_bh(&ab->base_lock);
5439 
5440 	if (!peer)
5441 		return -ENOENT;
5442 
5443 	for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
5444 		if (!peer->keys[i])
5445 			continue;
5446 
5447 		/* key flags are not required to delete the key */
5448 		ret = ath12k_install_key(arvif, peer->keys[i],
5449 					 DISABLE_KEY, addr, flags);
5450 		if (ret < 0 && first_errno == 0)
5451 			first_errno = ret;
5452 
5453 		if (ret < 0)
5454 			ath12k_warn(ab, "failed to remove peer key %d: %d\n",
5455 				    i, ret);
5456 
5457 		spin_lock_bh(&ab->base_lock);
5458 		peer->keys[i] = NULL;
5459 		spin_unlock_bh(&ab->base_lock);
5460 	}
5461 
5462 	return first_errno;
5463 }
5464 
ath12k_mac_set_key(struct ath12k * ar,enum set_key_cmd cmd,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,struct ieee80211_key_conf * key)5465 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
5466 			      struct ath12k_link_vif *arvif,
5467 			      struct ath12k_link_sta *arsta,
5468 			      struct ieee80211_key_conf *key)
5469 {
5470 	struct ieee80211_sta *sta = NULL;
5471 	struct ath12k_base *ab = ar->ab;
5472 	struct ath12k_peer *peer;
5473 	struct ath12k_sta *ahsta;
5474 	const u8 *peer_addr;
5475 	int ret;
5476 	u32 flags = 0;
5477 
5478 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5479 
5480 	if (arsta)
5481 		sta = ath12k_ahsta_to_sta(arsta->ahsta);
5482 
5483 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
5484 		return 1;
5485 
5486 	if (sta)
5487 		peer_addr = arsta->addr;
5488 	else
5489 		peer_addr = arvif->bssid;
5490 
5491 	key->hw_key_idx = key->keyidx;
5492 
5493 	/* the peer should not disappear in mid-way (unless FW goes awry) since
5494 	 * we already hold wiphy lock. we just make sure its there now.
5495 	 */
5496 	spin_lock_bh(&ab->base_lock);
5497 	peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5498 	spin_unlock_bh(&ab->base_lock);
5499 
5500 	if (!peer) {
5501 		if (cmd == SET_KEY) {
5502 			ath12k_warn(ab, "cannot install key for non-existent peer %pM\n",
5503 				    peer_addr);
5504 			return -EOPNOTSUPP;
5505 		}
5506 
5507 		/* if the peer doesn't exist there is no key to disable
5508 		 * anymore
5509 		 */
5510 		return 0;
5511 	}
5512 
5513 	if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5514 		flags = WMI_KEY_PAIRWISE;
5515 	else
5516 		flags = WMI_KEY_GROUP;
5517 
5518 	ret = ath12k_install_key(arvif, key, cmd, peer_addr, flags);
5519 	if (ret) {
5520 		ath12k_warn(ab, "ath12k_install_key failed (%d)\n", ret);
5521 		return ret;
5522 	}
5523 
5524 	ret = ath12k_dp_rx_peer_pn_replay_config(arvif, peer_addr, cmd, key);
5525 	if (ret) {
5526 		ath12k_warn(ab, "failed to offload PN replay detection %d\n", ret);
5527 		return ret;
5528 	}
5529 
5530 	spin_lock_bh(&ab->base_lock);
5531 	peer = ath12k_peer_find(ab, arvif->vdev_id, peer_addr);
5532 	if (peer && cmd == SET_KEY) {
5533 		peer->keys[key->keyidx] = key;
5534 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
5535 			peer->ucast_keyidx = key->keyidx;
5536 			peer->sec_type = ath12k_dp_tx_get_encrypt_type(key->cipher);
5537 		} else {
5538 			peer->mcast_keyidx = key->keyidx;
5539 			peer->sec_type_grp = ath12k_dp_tx_get_encrypt_type(key->cipher);
5540 		}
5541 	} else if (peer && cmd == DISABLE_KEY) {
5542 		peer->keys[key->keyidx] = NULL;
5543 		if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
5544 			peer->ucast_keyidx = 0;
5545 		else
5546 			peer->mcast_keyidx = 0;
5547 	} else if (!peer)
5548 		/* impossible unless FW goes crazy */
5549 		ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
5550 
5551 	if (sta) {
5552 		ahsta = ath12k_sta_to_ahsta(sta);
5553 
5554 		switch (key->cipher) {
5555 		case WLAN_CIPHER_SUITE_TKIP:
5556 		case WLAN_CIPHER_SUITE_CCMP:
5557 		case WLAN_CIPHER_SUITE_CCMP_256:
5558 		case WLAN_CIPHER_SUITE_GCMP:
5559 		case WLAN_CIPHER_SUITE_GCMP_256:
5560 			if (cmd == SET_KEY)
5561 				ahsta->pn_type = HAL_PN_TYPE_WPA;
5562 			else
5563 				ahsta->pn_type = HAL_PN_TYPE_NONE;
5564 			break;
5565 		default:
5566 			ahsta->pn_type = HAL_PN_TYPE_NONE;
5567 			break;
5568 		}
5569 	}
5570 
5571 	spin_unlock_bh(&ab->base_lock);
5572 
5573 	return 0;
5574 }
5575 
ath12k_mac_update_key_cache(struct ath12k_vif_cache * cache,enum set_key_cmd cmd,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5576 static int ath12k_mac_update_key_cache(struct ath12k_vif_cache *cache,
5577 				       enum set_key_cmd cmd,
5578 				       struct ieee80211_sta *sta,
5579 				       struct ieee80211_key_conf *key)
5580 {
5581 	struct ath12k_key_conf *key_conf, *tmp;
5582 
5583 	list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
5584 		if (key_conf->key != key)
5585 			continue;
5586 
5587 		/* If SET key entry is already present in cache, nothing to do,
5588 		 * just return
5589 		 */
5590 		if (cmd == SET_KEY)
5591 			return 0;
5592 
5593 		/* DEL key for an old SET key which driver hasn't flushed yet.
5594 		 */
5595 		list_del(&key_conf->list);
5596 		kfree(key_conf);
5597 	}
5598 
5599 	if (cmd == SET_KEY) {
5600 		key_conf = kzalloc(sizeof(*key_conf), GFP_KERNEL);
5601 
5602 		if (!key_conf)
5603 			return -ENOMEM;
5604 
5605 		key_conf->cmd = cmd;
5606 		key_conf->sta = sta;
5607 		key_conf->key = key;
5608 		list_add_tail(&key_conf->list,
5609 			      &cache->key_conf.list);
5610 	}
5611 
5612 	return 0;
5613 }
5614 
ath12k_mac_op_set_key(struct ieee80211_hw * hw,enum set_key_cmd cmd,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct ieee80211_key_conf * key)5615 static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
5616 				 struct ieee80211_vif *vif, struct ieee80211_sta *sta,
5617 				 struct ieee80211_key_conf *key)
5618 {
5619 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
5620 	struct ath12k_link_vif *arvif;
5621 	struct ath12k_link_sta *arsta = NULL;
5622 	struct ath12k_vif_cache *cache;
5623 	struct ath12k_sta *ahsta;
5624 	unsigned long links;
5625 	u8 link_id;
5626 	int ret;
5627 
5628 	lockdep_assert_wiphy(hw->wiphy);
5629 
5630 	/* IGTK needs to be done in host software */
5631 	if (key->keyidx == 4 || key->keyidx == 5)
5632 		return 1;
5633 
5634 	if (key->keyidx > WMI_MAX_KEY_INDEX)
5635 		return -ENOSPC;
5636 
5637 	if (sta) {
5638 		ahsta = ath12k_sta_to_ahsta(sta);
5639 
5640 		/* For an ML STA Pairwise key is same for all associated link Stations,
5641 		 * hence do set key for all link STAs which are active.
5642 		 */
5643 		if (sta->mlo) {
5644 			links = ahsta->links_map;
5645 			for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
5646 				arvif = wiphy_dereference(hw->wiphy,
5647 							  ahvif->link[link_id]);
5648 				arsta = wiphy_dereference(hw->wiphy,
5649 							  ahsta->link[link_id]);
5650 
5651 				if (WARN_ON(!arvif || !arsta))
5652 					/* arvif and arsta are expected to be valid when
5653 					 * STA is present.
5654 					 */
5655 					continue;
5656 
5657 				ret = ath12k_mac_set_key(arvif->ar, cmd, arvif,
5658 							 arsta, key);
5659 				if (ret)
5660 					break;
5661 			}
5662 
5663 			return 0;
5664 		}
5665 
5666 		arsta = &ahsta->deflink;
5667 		arvif = arsta->arvif;
5668 		if (WARN_ON(!arvif))
5669 			return -EINVAL;
5670 
5671 		ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, arsta, key);
5672 		if (ret)
5673 			return ret;
5674 
5675 		return 0;
5676 	}
5677 
5678 	if (key->link_id >= 0 && key->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
5679 		link_id = key->link_id;
5680 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
5681 	} else {
5682 		link_id = 0;
5683 		arvif = &ahvif->deflink;
5684 	}
5685 
5686 	if (!arvif || !arvif->is_created) {
5687 		cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
5688 		if (!cache)
5689 			return -ENOSPC;
5690 
5691 		ret = ath12k_mac_update_key_cache(cache, cmd, sta, key);
5692 		if (ret)
5693 			return ret;
5694 
5695 		return 0;
5696 	}
5697 
5698 	ret = ath12k_mac_set_key(arvif->ar, cmd, arvif, NULL, key);
5699 	if (ret)
5700 		return ret;
5701 
5702 	return 0;
5703 }
5704 
5705 static int
ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5706 ath12k_mac_bitrate_mask_num_vht_rates(struct ath12k *ar,
5707 				      enum nl80211_band band,
5708 				      const struct cfg80211_bitrate_mask *mask)
5709 {
5710 	int num_rates = 0;
5711 	int i;
5712 
5713 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++)
5714 		num_rates += hweight16(mask->control[band].vht_mcs[i]);
5715 
5716 	return num_rates;
5717 }
5718 
5719 static int
ath12k_mac_bitrate_mask_num_he_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)5720 ath12k_mac_bitrate_mask_num_he_rates(struct ath12k *ar,
5721 				     enum nl80211_band band,
5722 				     const struct cfg80211_bitrate_mask *mask)
5723 {
5724 	int num_rates = 0;
5725 	int i;
5726 
5727 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++)
5728 		num_rates += hweight16(mask->control[band].he_mcs[i]);
5729 
5730 	return num_rates;
5731 }
5732 
5733 static int
ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)5734 ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
5735 				   struct ath12k_link_sta *arsta,
5736 				   const struct cfg80211_bitrate_mask *mask,
5737 				   enum nl80211_band band)
5738 {
5739 	struct ath12k *ar = arvif->ar;
5740 	u8 vht_rate, nss;
5741 	u32 rate_code;
5742 	int ret, i;
5743 
5744 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5745 
5746 	nss = 0;
5747 
5748 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
5749 		if (hweight16(mask->control[band].vht_mcs[i]) == 1) {
5750 			nss = i + 1;
5751 			vht_rate = ffs(mask->control[band].vht_mcs[i]) - 1;
5752 		}
5753 	}
5754 
5755 	if (!nss) {
5756 		ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
5757 			    arsta->addr);
5758 		return -EINVAL;
5759 	}
5760 
5761 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5762 		   "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
5763 		   arsta->addr);
5764 
5765 	rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
5766 					WMI_RATE_PREAMBLE_VHT);
5767 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5768 					arvif->vdev_id,
5769 					WMI_PEER_PARAM_FIXED_RATE,
5770 					rate_code);
5771 	if (ret)
5772 		ath12k_warn(ar->ab,
5773 			    "failed to update STA %pM Fixed Rate %d: %d\n",
5774 			     arsta->addr, rate_code, ret);
5775 
5776 	return ret;
5777 }
5778 
5779 static int
ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,const struct cfg80211_bitrate_mask * mask,enum nl80211_band band)5780 ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif,
5781 				  struct ath12k_link_sta *arsta,
5782 				  const struct cfg80211_bitrate_mask *mask,
5783 				  enum nl80211_band band)
5784 {
5785 	struct ath12k *ar = arvif->ar;
5786 	u8 he_rate, nss;
5787 	u32 rate_code;
5788 	int ret, i;
5789 	struct ath12k_sta *ahsta = arsta->ahsta;
5790 	struct ieee80211_sta *sta;
5791 
5792 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5793 
5794 	sta = ath12k_ahsta_to_sta(ahsta);
5795 	nss = 0;
5796 
5797 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
5798 		if (hweight16(mask->control[band].he_mcs[i]) == 1) {
5799 			nss = i + 1;
5800 			he_rate = ffs(mask->control[band].he_mcs[i]) - 1;
5801 		}
5802 	}
5803 
5804 	if (!nss) {
5805 		ath12k_warn(ar->ab, "No single HE Fixed rate found to set for %pM",
5806 			    arsta->addr);
5807 		return -EINVAL;
5808 	}
5809 
5810 	/* Avoid updating invalid nss as fixed rate*/
5811 	if (nss > sta->deflink.rx_nss)
5812 		return -EINVAL;
5813 
5814 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
5815 		   "Setting Fixed HE Rate for peer %pM. Device will not switch to any other selected rates",
5816 		   arsta->addr);
5817 
5818 	rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1,
5819 					WMI_RATE_PREAMBLE_HE);
5820 
5821 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
5822 					arvif->vdev_id,
5823 					WMI_PEER_PARAM_FIXED_RATE,
5824 					rate_code);
5825 	if (ret)
5826 		ath12k_warn(ar->ab,
5827 			    "failed to update STA %pM Fixed Rate %d: %d\n",
5828 			    arsta->addr, rate_code, ret);
5829 
5830 	return ret;
5831 }
5832 
ath12k_mac_station_assoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,bool reassoc)5833 static int ath12k_mac_station_assoc(struct ath12k *ar,
5834 				    struct ath12k_link_vif *arvif,
5835 				    struct ath12k_link_sta *arsta,
5836 				    bool reassoc)
5837 {
5838 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
5839 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5840 	struct ieee80211_link_sta *link_sta;
5841 	int ret;
5842 	struct cfg80211_chan_def def;
5843 	enum nl80211_band band;
5844 	struct cfg80211_bitrate_mask *mask;
5845 	u8 num_vht_rates, num_he_rates;
5846 	u8 link_id = arvif->link_id;
5847 
5848 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5849 
5850 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5851 		return -EPERM;
5852 
5853 	if (WARN_ON(!rcu_access_pointer(sta->link[link_id])))
5854 		return -EINVAL;
5855 
5856 	band = def.chan->band;
5857 	mask = &arvif->bitrate_mask;
5858 
5859 	struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
5860 		kzalloc(sizeof(*peer_arg), GFP_KERNEL);
5861 	if (!peer_arg)
5862 		return -ENOMEM;
5863 
5864 	ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, reassoc);
5865 
5866 	if (peer_arg->peer_nss < 1) {
5867 		ath12k_warn(ar->ab,
5868 			    "invalid peer NSS %d\n", peer_arg->peer_nss);
5869 		return -EINVAL;
5870 	}
5871 
5872 	peer_arg->is_assoc = true;
5873 	ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
5874 	if (ret) {
5875 		ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
5876 			    arsta->addr, arvif->vdev_id, ret);
5877 		return ret;
5878 	}
5879 
5880 	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
5881 		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
5882 			    arsta->addr, arvif->vdev_id);
5883 		return -ETIMEDOUT;
5884 	}
5885 
5886 	num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask);
5887 	num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
5888 
5889 	/* If single VHT/HE rate is configured (by set_bitrate_mask()),
5890 	 * peer_assoc will disable VHT/HE. This is now enabled by a peer specific
5891 	 * fixed param.
5892 	 * Note that all other rates and NSS will be disabled for this peer.
5893 	 */
5894 	link_sta = ath12k_mac_get_link_sta(arsta);
5895 	if (!link_sta) {
5896 		ath12k_warn(ar->ab, "unable to access link sta in station assoc\n");
5897 		return -EINVAL;
5898 	}
5899 
5900 	spin_lock_bh(&ar->data_lock);
5901 	arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
5902 	arsta->bw_prev = link_sta->bandwidth;
5903 	spin_unlock_bh(&ar->data_lock);
5904 
5905 	if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
5906 		ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, band);
5907 	} else if (link_sta->he_cap.has_he && num_he_rates == 1) {
5908 		ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
5909 		if (ret)
5910 			return ret;
5911 	}
5912 
5913 	/* Re-assoc is run only to update supported rates for given station. It
5914 	 * doesn't make much sense to reconfigure the peer completely.
5915 	 */
5916 	if (reassoc)
5917 		return 0;
5918 
5919 	ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr,
5920 				     &link_sta->ht_cap, &link_sta->he_6ghz_capa);
5921 	if (ret) {
5922 		ath12k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
5923 			    arvif->vdev_id, ret);
5924 		return ret;
5925 	}
5926 
5927 	if (!sta->wme) {
5928 		arvif->num_legacy_stations++;
5929 		ret = ath12k_recalc_rtscts_prot(arvif);
5930 		if (ret)
5931 			return ret;
5932 	}
5933 
5934 	if (sta->wme && sta->uapsd_queues) {
5935 		ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta);
5936 		if (ret) {
5937 			ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
5938 				    arsta->addr, arvif->vdev_id, ret);
5939 			return ret;
5940 		}
5941 	}
5942 
5943 	return 0;
5944 }
5945 
ath12k_mac_station_disassoc(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)5946 static int ath12k_mac_station_disassoc(struct ath12k *ar,
5947 				       struct ath12k_link_vif *arvif,
5948 				       struct ath12k_link_sta *arsta)
5949 {
5950 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
5951 
5952 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
5953 
5954 	if (!sta->wme) {
5955 		arvif->num_legacy_stations--;
5956 		return ath12k_recalc_rtscts_prot(arvif);
5957 	}
5958 
5959 	return 0;
5960 }
5961 
ath12k_sta_rc_update_wk(struct wiphy * wiphy,struct wiphy_work * wk)5962 static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
5963 {
5964 	struct ieee80211_link_sta *link_sta;
5965 	struct ath12k *ar;
5966 	struct ath12k_link_vif *arvif;
5967 	struct ieee80211_sta *sta;
5968 	struct cfg80211_chan_def def;
5969 	enum nl80211_band band;
5970 	const u8 *ht_mcs_mask;
5971 	const u16 *vht_mcs_mask;
5972 	const u16 *he_mcs_mask;
5973 	u32 changed, bw, nss, mac_nss, smps, bw_prev;
5974 	int err, num_vht_rates, num_he_rates;
5975 	const struct cfg80211_bitrate_mask *mask;
5976 	enum wmi_phy_mode peer_phymode;
5977 	struct ath12k_link_sta *arsta;
5978 	struct ieee80211_vif *vif;
5979 
5980 	lockdep_assert_wiphy(wiphy);
5981 
5982 	arsta = container_of(wk, struct ath12k_link_sta, update_wk);
5983 	sta = ath12k_ahsta_to_sta(arsta->ahsta);
5984 	arvif = arsta->arvif;
5985 	vif = ath12k_ahvif_to_vif(arvif->ahvif);
5986 	ar = arvif->ar;
5987 
5988 	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
5989 		return;
5990 
5991 	band = def.chan->band;
5992 	ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
5993 	vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
5994 	he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;
5995 
5996 	spin_lock_bh(&ar->data_lock);
5997 
5998 	changed = arsta->changed;
5999 	arsta->changed = 0;
6000 
6001 	bw = arsta->bw;
6002 	bw_prev = arsta->bw_prev;
6003 	nss = arsta->nss;
6004 	smps = arsta->smps;
6005 
6006 	spin_unlock_bh(&ar->data_lock);
6007 
6008 	nss = max_t(u32, 1, nss);
6009 	mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
6010 		       ath12k_mac_max_vht_nss(vht_mcs_mask),
6011 		       ath12k_mac_max_he_nss(he_mcs_mask));
6012 	nss = min(nss, mac_nss);
6013 
6014 	struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
6015 					kzalloc(sizeof(*peer_arg), GFP_KERNEL);
6016 	if (!peer_arg)
6017 		return;
6018 
6019 	if (changed & IEEE80211_RC_BW_CHANGED) {
6020 		ath12k_peer_assoc_h_phymode(ar, arvif, arsta, peer_arg);
6021 		peer_phymode = peer_arg->peer_phymode;
6022 
6023 		if (bw > bw_prev) {
6024 			/* Phymode shows maximum supported channel width, if we
6025 			 * upgrade bandwidth then due to sanity check of firmware,
6026 			 * we have to send WMI_PEER_PHYMODE followed by
6027 			 * WMI_PEER_CHWIDTH
6028 			 */
6029 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
6030 				   arsta->addr, bw, bw_prev);
6031 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6032 							arvif->vdev_id, WMI_PEER_PHYMODE,
6033 							peer_phymode);
6034 			if (err) {
6035 				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6036 					    arsta->addr, peer_phymode, err);
6037 				return;
6038 			}
6039 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6040 							arvif->vdev_id, WMI_PEER_CHWIDTH,
6041 							bw);
6042 			if (err)
6043 				ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
6044 					    arsta->addr, bw, err);
6045 		} else {
6046 			/* When we downgrade bandwidth this will conflict with phymode
6047 			 * and cause to trigger firmware crash. In this case we send
6048 			 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
6049 			 */
6050 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
6051 				   arsta->addr, bw, bw_prev);
6052 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6053 							arvif->vdev_id, WMI_PEER_CHWIDTH,
6054 							bw);
6055 			if (err) {
6056 				ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
6057 					    arsta->addr, bw, err);
6058 				return;
6059 			}
6060 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6061 							arvif->vdev_id, WMI_PEER_PHYMODE,
6062 							peer_phymode);
6063 			if (err)
6064 				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
6065 					    arsta->addr, peer_phymode, err);
6066 		}
6067 	}
6068 
6069 	if (changed & IEEE80211_RC_NSS_CHANGED) {
6070 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
6071 			   arsta->addr, nss);
6072 
6073 		err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6074 						WMI_PEER_NSS, nss);
6075 		if (err)
6076 			ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
6077 				    arsta->addr, nss, err);
6078 	}
6079 
6080 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
6081 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
6082 			   arsta->addr, smps);
6083 
6084 		err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
6085 						WMI_PEER_MIMO_PS_STATE, smps);
6086 		if (err)
6087 			ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
6088 				    arsta->addr, smps, err);
6089 	}
6090 
6091 	if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
6092 		mask = &arvif->bitrate_mask;
6093 		num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
6094 								      mask);
6095 		num_he_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band,
6096 								    mask);
6097 
6098 		/* Peer_assoc_prepare will reject vht rates in
6099 		 * bitrate_mask if its not available in range format and
6100 		 * sets vht tx_rateset as unsupported. So multiple VHT MCS
6101 		 * setting(eg. MCS 4,5,6) per peer is not supported here.
6102 		 * But, Single rate in VHT mask can be set as per-peer
6103 		 * fixed rate. But even if any HT rates are configured in
6104 		 * the bitrate mask, device will not switch to those rates
6105 		 * when per-peer Fixed rate is set.
6106 		 * TODO: Check RATEMASK_CMDID to support auto rates selection
6107 		 * across HT/VHT and for multiple VHT MCS support.
6108 		 */
6109 		link_sta = ath12k_mac_get_link_sta(arsta);
6110 		if (!link_sta) {
6111 			ath12k_warn(ar->ab, "unable to access link sta in peer assoc he for sta %pM link %u\n",
6112 				    sta->addr, arsta->link_id);
6113 			return;
6114 		}
6115 
6116 		if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
6117 			ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
6118 							   band);
6119 		} else if (link_sta->he_cap.has_he && num_he_rates == 1) {
6120 			ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
6121 		} else {
6122 			/* If the peer is non-VHT/HE or no fixed VHT/HE rate
6123 			 * is provided in the new bitrate mask we set the
6124 			 * other rates using peer_assoc command. Also clear
6125 			 * the peer fixed rate settings as it has higher proprity
6126 			 * than peer assoc
6127 			 */
6128 			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
6129 							arvif->vdev_id,
6130 							WMI_PEER_PARAM_FIXED_RATE,
6131 							WMI_FIXED_RATE_NONE);
6132 			if (err)
6133 				ath12k_warn(ar->ab,
6134 					    "failed to disable peer fixed rate for STA %pM ret %d\n",
6135 					    arsta->addr, err);
6136 
6137 			ath12k_peer_assoc_prepare(ar, arvif, arsta,
6138 						  peer_arg, true);
6139 
6140 			peer_arg->is_assoc = false;
6141 			err = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
6142 			if (err)
6143 				ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
6144 					    arsta->addr, arvif->vdev_id, err);
6145 
6146 			if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
6147 				ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
6148 					    arsta->addr, arvif->vdev_id);
6149 		}
6150 	}
6151 }
6152 
ath12k_mac_free_unassign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,u8 link_id)6153 static void ath12k_mac_free_unassign_link_sta(struct ath12k_hw *ah,
6154 					      struct ath12k_sta *ahsta,
6155 					      u8 link_id)
6156 {
6157 	struct ath12k_link_sta *arsta;
6158 
6159 	lockdep_assert_wiphy(ah->hw->wiphy);
6160 
6161 	if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
6162 		return;
6163 
6164 	arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6165 	if (WARN_ON(!arsta))
6166 		return;
6167 
6168 	ahsta->links_map &= ~BIT(link_id);
6169 	rcu_assign_pointer(ahsta->link[link_id], NULL);
6170 	synchronize_rcu();
6171 
6172 	if (arsta == &ahsta->deflink) {
6173 		arsta->link_id = ATH12K_INVALID_LINK_ID;
6174 		arsta->ahsta = NULL;
6175 		arsta->arvif = NULL;
6176 		return;
6177 	}
6178 
6179 	kfree(arsta);
6180 }
6181 
ath12k_mac_inc_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6182 static int ath12k_mac_inc_num_stations(struct ath12k_link_vif *arvif,
6183 				       struct ath12k_link_sta *arsta)
6184 {
6185 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6186 	struct ath12k *ar = arvif->ar;
6187 
6188 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6189 
6190 	if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6191 		return 0;
6192 
6193 	if (ar->num_stations >= ar->max_num_stations)
6194 		return -ENOBUFS;
6195 
6196 	ar->num_stations++;
6197 	arvif->num_stations++;
6198 
6199 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6200 		   "mac station %pM connected to vdev %u num_stations %u\n",
6201 		   arsta->addr, arvif->vdev_id, arvif->num_stations);
6202 
6203 	return 0;
6204 }
6205 
ath12k_mac_dec_num_stations(struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6206 static void ath12k_mac_dec_num_stations(struct ath12k_link_vif *arvif,
6207 					struct ath12k_link_sta *arsta)
6208 {
6209 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6210 	struct ath12k *ar = arvif->ar;
6211 
6212 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6213 
6214 	if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA && !sta->tdls)
6215 		return;
6216 
6217 	ar->num_stations--;
6218 
6219 	if (arvif->num_stations) {
6220 		arvif->num_stations--;
6221 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
6222 			   "mac station %pM disconnected from vdev %u num_stations %u\n",
6223 			   arsta->addr, arvif->vdev_id, arvif->num_stations);
6224 	} else {
6225 		ath12k_warn(ar->ab,
6226 			    "mac station %pM disconnect for vdev %u without any connected station\n",
6227 			    arsta->addr, arvif->vdev_id);
6228 	}
6229 }
6230 
ath12k_mac_station_post_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6231 static void ath12k_mac_station_post_remove(struct ath12k *ar,
6232 					   struct ath12k_link_vif *arvif,
6233 					   struct ath12k_link_sta *arsta)
6234 {
6235 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6236 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6237 	struct ath12k_peer *peer;
6238 
6239 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6240 
6241 	ath12k_mac_dec_num_stations(arvif, arsta);
6242 
6243 	spin_lock_bh(&ar->ab->base_lock);
6244 
6245 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6246 	if (peer && peer->sta == sta) {
6247 		ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
6248 			    vif->addr, arvif->vdev_id);
6249 		peer->sta = NULL;
6250 		list_del(&peer->list);
6251 		kfree(peer);
6252 		ar->num_peers--;
6253 	}
6254 
6255 	spin_unlock_bh(&ar->ab->base_lock);
6256 
6257 	kfree(arsta->rx_stats);
6258 	arsta->rx_stats = NULL;
6259 }
6260 
ath12k_mac_station_unauthorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6261 static int ath12k_mac_station_unauthorize(struct ath12k *ar,
6262 					  struct ath12k_link_vif *arvif,
6263 					  struct ath12k_link_sta *arsta)
6264 {
6265 	struct ath12k_peer *peer;
6266 	int ret;
6267 
6268 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6269 
6270 	spin_lock_bh(&ar->ab->base_lock);
6271 
6272 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6273 	if (peer)
6274 		peer->is_authorized = false;
6275 
6276 	spin_unlock_bh(&ar->ab->base_lock);
6277 
6278 	/* Driver must clear the keys during the state change from
6279 	 * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
6280 	 * returning from here, mac80211 is going to delete the keys
6281 	 * in __sta_info_destroy_part2(). This will ensure that the driver does
6282 	 * not retain stale key references after mac80211 deletes the keys.
6283 	 */
6284 	ret = ath12k_clear_peer_keys(arvif, arsta->addr);
6285 	if (ret) {
6286 		ath12k_warn(ar->ab, "failed to clear all peer keys for vdev %i: %d\n",
6287 			    arvif->vdev_id, ret);
6288 		return ret;
6289 	}
6290 
6291 	return 0;
6292 }
6293 
ath12k_mac_station_authorize(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6294 static int ath12k_mac_station_authorize(struct ath12k *ar,
6295 					struct ath12k_link_vif *arvif,
6296 					struct ath12k_link_sta *arsta)
6297 {
6298 	struct ath12k_peer *peer;
6299 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6300 	int ret;
6301 
6302 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6303 
6304 	spin_lock_bh(&ar->ab->base_lock);
6305 
6306 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
6307 	if (peer)
6308 		peer->is_authorized = true;
6309 
6310 	spin_unlock_bh(&ar->ab->base_lock);
6311 
6312 	if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
6313 		ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6314 						arvif->vdev_id,
6315 						WMI_PEER_AUTHORIZE,
6316 						1);
6317 		if (ret) {
6318 			ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
6319 				    arsta->addr, arvif->vdev_id, ret);
6320 			return ret;
6321 		}
6322 	}
6323 
6324 	return 0;
6325 }
6326 
ath12k_mac_station_remove(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6327 static int ath12k_mac_station_remove(struct ath12k *ar,
6328 				     struct ath12k_link_vif *arvif,
6329 				     struct ath12k_link_sta *arsta)
6330 {
6331 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6332 	struct ath12k_vif *ahvif = arvif->ahvif;
6333 	int ret = 0;
6334 
6335 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6336 
6337 	wiphy_work_cancel(ar->ah->hw->wiphy, &arsta->update_wk);
6338 
6339 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6340 		ath12k_bss_disassoc(ar, arvif);
6341 		ret = ath12k_mac_vdev_stop(arvif);
6342 		if (ret)
6343 			ath12k_warn(ar->ab, "failed to stop vdev %i: %d\n",
6344 				    arvif->vdev_id, ret);
6345 	}
6346 
6347 	if (sta->mlo)
6348 		return ret;
6349 
6350 	ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr);
6351 
6352 	ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6353 	if (ret)
6354 		ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
6355 			    arsta->addr, arvif->vdev_id);
6356 	else
6357 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
6358 			   arsta->addr, arvif->vdev_id);
6359 
6360 	ath12k_mac_station_post_remove(ar, arvif, arsta);
6361 
6362 	if (sta->valid_links)
6363 		ath12k_mac_free_unassign_link_sta(ahvif->ah,
6364 						  arsta->ahsta, arsta->link_id);
6365 
6366 	return ret;
6367 }
6368 
ath12k_mac_station_add(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta)6369 static int ath12k_mac_station_add(struct ath12k *ar,
6370 				  struct ath12k_link_vif *arvif,
6371 				  struct ath12k_link_sta *arsta)
6372 {
6373 	struct ath12k_base *ab = ar->ab;
6374 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6375 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
6376 	struct ath12k_wmi_peer_create_arg peer_param = {};
6377 	int ret;
6378 
6379 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
6380 
6381 	ret = ath12k_mac_inc_num_stations(arvif, arsta);
6382 	if (ret) {
6383 		ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
6384 			    ar->max_num_stations);
6385 		goto exit;
6386 	}
6387 
6388 	if (ath12k_debugfs_is_extd_rx_stats_enabled(ar) && !arsta->rx_stats) {
6389 		arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
6390 		if (!arsta->rx_stats) {
6391 			ret = -ENOMEM;
6392 			goto dec_num_station;
6393 		}
6394 	}
6395 
6396 	peer_param.vdev_id = arvif->vdev_id;
6397 	peer_param.peer_addr = arsta->addr;
6398 	peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
6399 	peer_param.ml_enabled = sta->mlo;
6400 
6401 	ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
6402 	if (ret) {
6403 		ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
6404 			    arsta->addr, arvif->vdev_id);
6405 		goto free_peer;
6406 	}
6407 
6408 	ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
6409 		   arsta->addr, arvif->vdev_id);
6410 
6411 	if (ieee80211_vif_is_mesh(vif)) {
6412 		ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
6413 						arvif->vdev_id,
6414 						WMI_PEER_USE_4ADDR, 1);
6415 		if (ret) {
6416 			ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
6417 				    arsta->addr, ret);
6418 			goto free_peer;
6419 		}
6420 	}
6421 
6422 	ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr);
6423 	if (ret) {
6424 		ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
6425 			    arsta->addr, arvif->vdev_id, ret);
6426 		goto free_peer;
6427 	}
6428 
6429 	if (ab->hw_params->vdev_start_delay &&
6430 	    !arvif->is_started &&
6431 	    arvif->ahvif->vdev_type != WMI_VDEV_TYPE_AP) {
6432 		ret = ath12k_start_vdev_delay(ar, arvif);
6433 		if (ret) {
6434 			ath12k_warn(ab, "failed to delay vdev start: %d\n", ret);
6435 			goto free_peer;
6436 		}
6437 	}
6438 
6439 	ewma_avg_rssi_init(&arsta->avg_rssi);
6440 	return 0;
6441 
6442 free_peer:
6443 	ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
6444 	kfree(arsta->rx_stats);
6445 	arsta->rx_stats = NULL;
6446 dec_num_station:
6447 	ath12k_mac_dec_num_stations(arvif, arsta);
6448 exit:
6449 	return ret;
6450 }
6451 
ath12k_mac_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_link_sta * arsta,struct ath12k_vif * ahvif,u8 link_id)6452 static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
6453 				      struct ath12k_sta *ahsta,
6454 				      struct ath12k_link_sta *arsta,
6455 				      struct ath12k_vif *ahvif,
6456 				      u8 link_id)
6457 {
6458 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6459 	struct ieee80211_link_sta *link_sta;
6460 	struct ath12k_link_vif *arvif;
6461 
6462 	lockdep_assert_wiphy(ah->hw->wiphy);
6463 
6464 	if (!arsta || link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
6465 		return -EINVAL;
6466 
6467 	arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6468 	if (!arvif)
6469 		return -EINVAL;
6470 
6471 	memset(arsta, 0, sizeof(*arsta));
6472 
6473 	link_sta = wiphy_dereference(ah->hw->wiphy, sta->link[link_id]);
6474 	if (!link_sta)
6475 		return -EINVAL;
6476 
6477 	ether_addr_copy(arsta->addr, link_sta->addr);
6478 
6479 	/* logical index of the link sta in order of creation */
6480 	arsta->link_idx = ahsta->num_peer++;
6481 
6482 	arsta->link_id = link_id;
6483 	ahsta->links_map |= BIT(arsta->link_id);
6484 	arsta->arvif = arvif;
6485 	arsta->ahsta = ahsta;
6486 	ahsta->ahvif = ahvif;
6487 
6488 	wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);
6489 
6490 	rcu_assign_pointer(ahsta->link[link_id], arsta);
6491 
6492 	return 0;
6493 }
6494 
ath12k_mac_ml_station_remove(struct ath12k_vif * ahvif,struct ath12k_sta * ahsta)6495 static void ath12k_mac_ml_station_remove(struct ath12k_vif *ahvif,
6496 					 struct ath12k_sta *ahsta)
6497 {
6498 	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(ahsta);
6499 	struct ath12k_hw *ah = ahvif->ah;
6500 	struct ath12k_link_vif *arvif;
6501 	struct ath12k_link_sta *arsta;
6502 	unsigned long links;
6503 	struct ath12k *ar;
6504 	u8 link_id;
6505 
6506 	lockdep_assert_wiphy(ah->hw->wiphy);
6507 
6508 	ath12k_peer_mlo_link_peers_delete(ahvif, ahsta);
6509 
6510 	/* validate link station removal and clear arsta links */
6511 	links = ahsta->links_map;
6512 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6513 		arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
6514 		arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
6515 		if (!arvif || !arsta)
6516 			continue;
6517 
6518 		ar = arvif->ar;
6519 
6520 		ath12k_mac_station_post_remove(ar, arvif, arsta);
6521 
6522 		ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
6523 	}
6524 
6525 	ath12k_peer_ml_delete(ah, sta);
6526 }
6527 
ath12k_mac_handle_link_sta_state(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ath12k_link_sta * arsta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)6528 static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
6529 					    struct ath12k_link_vif *arvif,
6530 					    struct ath12k_link_sta *arsta,
6531 					    enum ieee80211_sta_state old_state,
6532 					    enum ieee80211_sta_state new_state)
6533 {
6534 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
6535 	struct ieee80211_bss_conf *link_conf;
6536 	struct ath12k *ar = arvif->ar;
6537 	struct ath12k_reg_info *reg_info;
6538 	struct ath12k_base *ab = ar->ab;
6539 	int ret = 0;
6540 
6541 	lockdep_assert_wiphy(hw->wiphy);
6542 
6543 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
6544 		   arsta->link_id, arsta->addr, old_state, new_state);
6545 
6546 	/* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
6547 	 * from driver
6548 	 */
6549 	if ((old_state == IEEE80211_STA_NONE &&
6550 	     new_state == IEEE80211_STA_NOTEXIST)) {
6551 		ret = ath12k_mac_station_remove(ar, arvif, arsta);
6552 		if (ret) {
6553 			ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n",
6554 				    arsta->addr, arvif->vdev_id);
6555 			goto exit;
6556 		}
6557 	}
6558 
6559 	/* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE: Add new station to driver */
6560 	if (old_state == IEEE80211_STA_NOTEXIST &&
6561 	    new_state == IEEE80211_STA_NONE) {
6562 		ret = ath12k_mac_station_add(ar, arvif, arsta);
6563 		if (ret)
6564 			ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n",
6565 				    arsta->addr, arvif->vdev_id);
6566 
6567 	/* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
6568 	 * peer associated to AP/Mesh/ADHOC vif type.
6569 	 */
6570 	} else if (old_state == IEEE80211_STA_AUTH &&
6571 		   new_state == IEEE80211_STA_ASSOC &&
6572 		   (vif->type == NL80211_IFTYPE_AP ||
6573 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
6574 		    vif->type == NL80211_IFTYPE_ADHOC)) {
6575 		ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
6576 		if (ret)
6577 			ath12k_warn(ab, "Failed to associate station: %pM\n",
6578 				    arsta->addr);
6579 
6580 	/* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
6581 	 * authorized
6582 	 */
6583 	} else if (old_state == IEEE80211_STA_ASSOC &&
6584 		   new_state == IEEE80211_STA_AUTHORIZED) {
6585 		ret = ath12k_mac_station_authorize(ar, arvif, arsta);
6586 		if (ret) {
6587 			ath12k_warn(ab, "Failed to authorize station: %pM\n",
6588 				    arsta->addr);
6589 			goto exit;
6590 		}
6591 
6592 		if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
6593 		    arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
6594 			link_conf = ath12k_mac_get_link_bss_conf(arvif);
6595 			reg_info = ab->reg_info[ar->pdev_idx];
6596 			ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n");
6597 			ath12k_hw_to_ah(hw)->regd_updated = false;
6598 			ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type,
6599 						    link_conf->power_type);
6600 		}
6601 
6602 	/* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
6603 	 * deauthorize it.
6604 	 */
6605 	} else if (old_state == IEEE80211_STA_AUTHORIZED &&
6606 		   new_state == IEEE80211_STA_ASSOC) {
6607 		ath12k_mac_station_unauthorize(ar, arvif, arsta);
6608 
6609 	/* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTH: disassoc peer connected to
6610 	 * AP/mesh/ADHOC vif type.
6611 	 */
6612 	} else if (old_state == IEEE80211_STA_ASSOC &&
6613 		   new_state == IEEE80211_STA_AUTH &&
6614 		   (vif->type == NL80211_IFTYPE_AP ||
6615 		    vif->type == NL80211_IFTYPE_MESH_POINT ||
6616 		    vif->type == NL80211_IFTYPE_ADHOC)) {
6617 		ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
6618 		if (ret)
6619 			ath12k_warn(ab, "Failed to disassociate station: %pM\n",
6620 				    arsta->addr);
6621 	}
6622 
6623 exit:
6624 	return ret;
6625 }
6626 
ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq,u8 mac_id)6627 static bool ath12k_mac_is_freq_on_mac(struct ath12k_hw_mode_freq_range_arg *freq_range,
6628 				      u32 freq, u8 mac_id)
6629 {
6630 	return (freq >= freq_range[mac_id].low_2ghz_freq &&
6631 		freq <= freq_range[mac_id].high_2ghz_freq) ||
6632 	       (freq >= freq_range[mac_id].low_5ghz_freq &&
6633 		freq <= freq_range[mac_id].high_5ghz_freq);
6634 }
6635 
6636 static bool
ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base * ab,struct ath12k_hw_mode_freq_range_arg * freq_range,u32 freq_link1,u32 freq_link2)6637 ath12k_mac_2_freq_same_mac_in_freq_range(struct ath12k_base *ab,
6638 					 struct ath12k_hw_mode_freq_range_arg *freq_range,
6639 					 u32 freq_link1, u32 freq_link2)
6640 {
6641 	u8 i;
6642 
6643 	for (i = 0; i < MAX_RADIOS; i++) {
6644 		if (ath12k_mac_is_freq_on_mac(freq_range, freq_link1, i) &&
6645 		    ath12k_mac_is_freq_on_mac(freq_range, freq_link2, i))
6646 			return true;
6647 	}
6648 
6649 	return false;
6650 }
6651 
ath12k_mac_is_hw_dbs_capable(struct ath12k_base * ab)6652 static bool ath12k_mac_is_hw_dbs_capable(struct ath12k_base *ab)
6653 {
6654 	return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6655 			ab->wmi_ab.svc_map) &&
6656 	       ab->wmi_ab.hw_mode_info.support_dbs;
6657 }
6658 
ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6659 static bool ath12k_mac_2_freq_same_mac_in_dbs(struct ath12k_base *ab,
6660 					      u32 freq_link1, u32 freq_link2)
6661 {
6662 	struct ath12k_hw_mode_freq_range_arg *freq_range;
6663 
6664 	if (!ath12k_mac_is_hw_dbs_capable(ab))
6665 		return true;
6666 
6667 	freq_range = ab->wmi_ab.hw_mode_info.freq_range_caps[ATH12K_HW_MODE_DBS];
6668 	return ath12k_mac_2_freq_same_mac_in_freq_range(ab, freq_range,
6669 							freq_link1, freq_link2);
6670 }
6671 
ath12k_mac_is_hw_sbs_capable(struct ath12k_base * ab)6672 static bool ath12k_mac_is_hw_sbs_capable(struct ath12k_base *ab)
6673 {
6674 	return test_bit(WMI_TLV_SERVICE_DUAL_BAND_SIMULTANEOUS_SUPPORT,
6675 			ab->wmi_ab.svc_map) &&
6676 	       ab->wmi_ab.hw_mode_info.support_sbs;
6677 }
6678 
ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6679 static bool ath12k_mac_2_freq_same_mac_in_sbs(struct ath12k_base *ab,
6680 					      u32 freq_link1, u32 freq_link2)
6681 {
6682 	struct ath12k_hw_mode_info *info = &ab->wmi_ab.hw_mode_info;
6683 	struct ath12k_hw_mode_freq_range_arg *sbs_uppr_share;
6684 	struct ath12k_hw_mode_freq_range_arg *sbs_low_share;
6685 	struct ath12k_hw_mode_freq_range_arg *sbs_range;
6686 
6687 	if (!ath12k_mac_is_hw_sbs_capable(ab))
6688 		return true;
6689 
6690 	if (ab->wmi_ab.sbs_lower_band_end_freq) {
6691 		sbs_uppr_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_UPPER_SHARE];
6692 		sbs_low_share = info->freq_range_caps[ATH12K_HW_MODE_SBS_LOWER_SHARE];
6693 
6694 		return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_low_share,
6695 								freq_link1, freq_link2) ||
6696 		       ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_uppr_share,
6697 								freq_link1, freq_link2);
6698 	}
6699 
6700 	sbs_range = info->freq_range_caps[ATH12K_HW_MODE_SBS];
6701 	return ath12k_mac_2_freq_same_mac_in_freq_range(ab, sbs_range,
6702 							freq_link1, freq_link2);
6703 }
6704 
ath12k_mac_freqs_on_same_mac(struct ath12k_base * ab,u32 freq_link1,u32 freq_link2)6705 static bool ath12k_mac_freqs_on_same_mac(struct ath12k_base *ab,
6706 					 u32 freq_link1, u32 freq_link2)
6707 {
6708 	return ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_link1, freq_link2) &&
6709 	       ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_link1, freq_link2);
6710 }
6711 
ath12k_mac_mlo_sta_set_link_active(struct ath12k_base * ab,enum wmi_mlo_link_force_reason reason,enum wmi_mlo_link_force_mode mode,u8 * mlo_vdev_id_lst,u8 num_mlo_vdev,u8 * mlo_inactive_vdev_lst,u8 num_mlo_inactive_vdev)6712 static int ath12k_mac_mlo_sta_set_link_active(struct ath12k_base *ab,
6713 					      enum wmi_mlo_link_force_reason reason,
6714 					      enum wmi_mlo_link_force_mode mode,
6715 					      u8 *mlo_vdev_id_lst,
6716 					      u8 num_mlo_vdev,
6717 					      u8 *mlo_inactive_vdev_lst,
6718 					      u8 num_mlo_inactive_vdev)
6719 {
6720 	struct wmi_mlo_link_set_active_arg param = {};
6721 	u32 entry_idx, entry_offset, vdev_idx;
6722 	u8 vdev_id;
6723 
6724 	param.reason = reason;
6725 	param.force_mode = mode;
6726 
6727 	for (vdev_idx = 0; vdev_idx < num_mlo_vdev; vdev_idx++) {
6728 		vdev_id = mlo_vdev_id_lst[vdev_idx];
6729 		entry_idx = vdev_id / 32;
6730 		entry_offset = vdev_id % 32;
6731 		if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6732 			ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6733 				    entry_idx, num_mlo_vdev, vdev_id);
6734 			return -EINVAL;
6735 		}
6736 		param.vdev_bitmap[entry_idx] |= 1 << entry_offset;
6737 		/* update entry number if entry index changed */
6738 		if (param.num_vdev_bitmap < entry_idx + 1)
6739 			param.num_vdev_bitmap = entry_idx + 1;
6740 	}
6741 
6742 	ath12k_dbg(ab, ATH12K_DBG_MAC,
6743 		   "num_vdev_bitmap %d vdev_bitmap[0] = 0x%x, vdev_bitmap[1] = 0x%x",
6744 		   param.num_vdev_bitmap, param.vdev_bitmap[0], param.vdev_bitmap[1]);
6745 
6746 	if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE) {
6747 		for (vdev_idx = 0; vdev_idx < num_mlo_inactive_vdev; vdev_idx++) {
6748 			vdev_id = mlo_inactive_vdev_lst[vdev_idx];
6749 			entry_idx = vdev_id / 32;
6750 			entry_offset = vdev_id % 32;
6751 			if (entry_idx >= WMI_MLO_LINK_NUM_SZ) {
6752 				ath12k_warn(ab, "Invalid entry_idx %d num_mlo_vdev %d vdev %d",
6753 					    entry_idx, num_mlo_inactive_vdev, vdev_id);
6754 				return -EINVAL;
6755 			}
6756 			param.inactive_vdev_bitmap[entry_idx] |= 1 << entry_offset;
6757 			/* update entry number if entry index changed */
6758 			if (param.num_inactive_vdev_bitmap < entry_idx + 1)
6759 				param.num_inactive_vdev_bitmap = entry_idx + 1;
6760 		}
6761 
6762 		ath12k_dbg(ab, ATH12K_DBG_MAC,
6763 			   "num_vdev_bitmap %d inactive_vdev_bitmap[0] = 0x%x, inactive_vdev_bitmap[1] = 0x%x",
6764 			   param.num_inactive_vdev_bitmap,
6765 			   param.inactive_vdev_bitmap[0],
6766 			   param.inactive_vdev_bitmap[1]);
6767 	}
6768 
6769 	if (mode == WMI_MLO_LINK_FORCE_MODE_ACTIVE_LINK_NUM ||
6770 	    mode == WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM) {
6771 		param.num_link_entry = 1;
6772 		param.link_num[0].num_of_link = num_mlo_vdev - 1;
6773 	}
6774 
6775 	return ath12k_wmi_send_mlo_link_set_active_cmd(ab, &param);
6776 }
6777 
ath12k_mac_mlo_sta_update_link_active(struct ath12k_base * ab,struct ieee80211_hw * hw,struct ath12k_vif * ahvif)6778 static int ath12k_mac_mlo_sta_update_link_active(struct ath12k_base *ab,
6779 						 struct ieee80211_hw *hw,
6780 						 struct ath12k_vif *ahvif)
6781 {
6782 	u8 mlo_vdev_id_lst[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6783 	u32 mlo_freq_list[IEEE80211_MLD_MAX_NUM_LINKS] = {};
6784 	unsigned long links = ahvif->links_map;
6785 	enum wmi_mlo_link_force_reason reason;
6786 	struct ieee80211_chanctx_conf *conf;
6787 	enum wmi_mlo_link_force_mode mode;
6788 	struct ieee80211_bss_conf *info;
6789 	struct ath12k_link_vif *arvif;
6790 	u8 num_mlo_vdev = 0;
6791 	u8 link_id;
6792 
6793 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
6794 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
6795 		/* make sure vdev is created on this device */
6796 		if (!arvif || !arvif->is_created || arvif->ar->ab != ab)
6797 			continue;
6798 
6799 		info = ath12k_mac_get_link_bss_conf(arvif);
6800 		conf = wiphy_dereference(hw->wiphy, info->chanctx_conf);
6801 		mlo_freq_list[num_mlo_vdev] = conf->def.chan->center_freq;
6802 
6803 		mlo_vdev_id_lst[num_mlo_vdev] = arvif->vdev_id;
6804 		num_mlo_vdev++;
6805 	}
6806 
6807 	/* It is not allowed to activate more links than a single device
6808 	 * supported. Something goes wrong if we reach here.
6809 	 */
6810 	if (num_mlo_vdev > ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6811 		WARN_ON_ONCE(1);
6812 		return -EINVAL;
6813 	}
6814 
6815 	/* if 2 links are established and both link channels fall on the
6816 	 * same hardware MAC, send command to firmware to deactivate one
6817 	 * of them.
6818 	 */
6819 	if (num_mlo_vdev == 2 &&
6820 	    ath12k_mac_freqs_on_same_mac(ab, mlo_freq_list[0],
6821 					 mlo_freq_list[1])) {
6822 		mode = WMI_MLO_LINK_FORCE_MODE_INACTIVE_LINK_NUM;
6823 		reason = WMI_MLO_LINK_FORCE_REASON_NEW_CONNECT;
6824 		return ath12k_mac_mlo_sta_set_link_active(ab, reason, mode,
6825 							  mlo_vdev_id_lst, num_mlo_vdev,
6826 							  NULL, 0);
6827 	}
6828 
6829 	return 0;
6830 }
6831 
ath12k_mac_are_sbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6832 static bool ath12k_mac_are_sbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6833 {
6834 	if (!ath12k_mac_is_hw_sbs_capable(ab))
6835 		return false;
6836 
6837 	if (ath12k_is_2ghz_channel_freq(freq_1) ||
6838 	    ath12k_is_2ghz_channel_freq(freq_2))
6839 		return false;
6840 
6841 	return !ath12k_mac_2_freq_same_mac_in_sbs(ab, freq_1, freq_2);
6842 }
6843 
ath12k_mac_are_dbs_chan(struct ath12k_base * ab,u32 freq_1,u32 freq_2)6844 static bool ath12k_mac_are_dbs_chan(struct ath12k_base *ab, u32 freq_1, u32 freq_2)
6845 {
6846 	if (!ath12k_mac_is_hw_dbs_capable(ab))
6847 		return false;
6848 
6849 	return !ath12k_mac_2_freq_same_mac_in_dbs(ab, freq_1, freq_2);
6850 }
6851 
ath12k_mac_select_links(struct ath12k_base * ab,struct ieee80211_vif * vif,struct ieee80211_hw * hw,u16 * selected_links)6852 static int ath12k_mac_select_links(struct ath12k_base *ab,
6853 				   struct ieee80211_vif *vif,
6854 				   struct ieee80211_hw *hw,
6855 				   u16 *selected_links)
6856 {
6857 	unsigned long useful_links = ieee80211_vif_usable_links(vif);
6858 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6859 	u8 num_useful_links = hweight_long(useful_links);
6860 	struct ieee80211_chanctx_conf *chanctx;
6861 	struct ath12k_link_vif *assoc_arvif;
6862 	u32 assoc_link_freq, partner_freq;
6863 	u16 sbs_links = 0, dbs_links = 0;
6864 	struct ieee80211_bss_conf *info;
6865 	struct ieee80211_channel *chan;
6866 	struct ieee80211_sta *sta;
6867 	struct ath12k_sta *ahsta;
6868 	u8 link_id;
6869 
6870 	/* activate all useful links if less than max supported */
6871 	if (num_useful_links <= ATH12K_NUM_MAX_ACTIVE_LINKS_PER_DEVICE) {
6872 		*selected_links = useful_links;
6873 		return 0;
6874 	}
6875 
6876 	/* only in station mode we can get here, so it's safe
6877 	 * to use ap_addr
6878 	 */
6879 	rcu_read_lock();
6880 	sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
6881 	if (!sta) {
6882 		rcu_read_unlock();
6883 		ath12k_warn(ab, "failed to find sta with addr %pM\n", vif->cfg.ap_addr);
6884 		return -EINVAL;
6885 	}
6886 
6887 	ahsta = ath12k_sta_to_ahsta(sta);
6888 	assoc_arvif = wiphy_dereference(hw->wiphy, ahvif->link[ahsta->assoc_link_id]);
6889 	info = ath12k_mac_get_link_bss_conf(assoc_arvif);
6890 	chanctx = rcu_dereference(info->chanctx_conf);
6891 	assoc_link_freq = chanctx->def.chan->center_freq;
6892 	rcu_read_unlock();
6893 	ath12k_dbg(ab, ATH12K_DBG_MAC, "assoc link %u freq %u\n",
6894 		   assoc_arvif->link_id, assoc_link_freq);
6895 
6896 	/* assoc link is already activated and has to be kept active,
6897 	 * only need to select a partner link from others.
6898 	 */
6899 	useful_links &= ~BIT(assoc_arvif->link_id);
6900 	for_each_set_bit(link_id, &useful_links, IEEE80211_MLD_MAX_NUM_LINKS) {
6901 		info = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
6902 		if (!info) {
6903 			ath12k_warn(ab, "failed to get link info for link: %u\n",
6904 				    link_id);
6905 			return -ENOLINK;
6906 		}
6907 
6908 		chan = info->chanreq.oper.chan;
6909 		if (!chan) {
6910 			ath12k_warn(ab, "failed to get chan for link: %u\n", link_id);
6911 			return -EINVAL;
6912 		}
6913 
6914 		partner_freq = chan->center_freq;
6915 		if (ath12k_mac_are_sbs_chan(ab, assoc_link_freq, partner_freq)) {
6916 			sbs_links |= BIT(link_id);
6917 			ath12k_dbg(ab, ATH12K_DBG_MAC, "new SBS link %u freq %u\n",
6918 				   link_id, partner_freq);
6919 			continue;
6920 		}
6921 
6922 		if (ath12k_mac_are_dbs_chan(ab, assoc_link_freq, partner_freq)) {
6923 			dbs_links |= BIT(link_id);
6924 			ath12k_dbg(ab, ATH12K_DBG_MAC, "new DBS link %u freq %u\n",
6925 				   link_id, partner_freq);
6926 			continue;
6927 		}
6928 
6929 		ath12k_dbg(ab, ATH12K_DBG_MAC, "non DBS/SBS link %u freq %u\n",
6930 			   link_id, partner_freq);
6931 	}
6932 
6933 	/* choose the first candidate no matter how many is in the list */
6934 	if (sbs_links)
6935 		link_id = __ffs(sbs_links);
6936 	else if (dbs_links)
6937 		link_id = __ffs(dbs_links);
6938 	else
6939 		link_id = ffs(useful_links) - 1;
6940 
6941 	ath12k_dbg(ab, ATH12K_DBG_MAC, "select partner link %u\n", link_id);
6942 
6943 	*selected_links = BIT(assoc_arvif->link_id) | BIT(link_id);
6944 
6945 	return 0;
6946 }
6947 
ath12k_mac_op_sta_state(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,enum ieee80211_sta_state old_state,enum ieee80211_sta_state new_state)6948 static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
6949 				   struct ieee80211_vif *vif,
6950 				   struct ieee80211_sta *sta,
6951 				   enum ieee80211_sta_state old_state,
6952 				   enum ieee80211_sta_state new_state)
6953 {
6954 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
6955 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
6956 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
6957 	struct ath12k_base *prev_ab = NULL, *ab;
6958 	struct ath12k_link_vif *arvif;
6959 	struct ath12k_link_sta *arsta;
6960 	unsigned long valid_links;
6961 	u16 selected_links = 0;
6962 	u8 link_id = 0, i;
6963 	struct ath12k *ar;
6964 	int ret;
6965 
6966 	lockdep_assert_wiphy(hw->wiphy);
6967 
6968 	if (ieee80211_vif_is_mld(vif) && sta->valid_links) {
6969 		WARN_ON(!sta->mlo && hweight16(sta->valid_links) != 1);
6970 		link_id = ffs(sta->valid_links) - 1;
6971 	}
6972 
6973 	/* IEEE80211_STA_NOTEXIST -> IEEE80211_STA_NONE:
6974 	 * New station add received. If this is a ML station then
6975 	 * ahsta->links_map will be zero and sta->valid_links will be 1.
6976 	 * Assign default link to the first link sta.
6977 	 */
6978 	if (old_state == IEEE80211_STA_NOTEXIST &&
6979 	    new_state == IEEE80211_STA_NONE) {
6980 		memset(ahsta, 0, sizeof(*ahsta));
6981 
6982 		arsta = &ahsta->deflink;
6983 
6984 		/* ML sta */
6985 		if (sta->mlo && !ahsta->links_map &&
6986 		    (hweight16(sta->valid_links) == 1)) {
6987 			ret = ath12k_peer_ml_create(ah, sta);
6988 			if (ret) {
6989 				ath12k_hw_warn(ah, "unable to create ML peer for sta %pM",
6990 					       sta->addr);
6991 				goto exit;
6992 			}
6993 		}
6994 
6995 		ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif,
6996 						 link_id);
6997 		if (ret) {
6998 			ath12k_hw_warn(ah, "unable assign link %d for sta %pM",
6999 				       link_id, sta->addr);
7000 			goto exit;
7001 		}
7002 
7003 		/* above arsta will get memset, hence do this after assign
7004 		 * link sta
7005 		 */
7006 		if (sta->mlo) {
7007 			/* For station mode, arvif->is_sta_assoc_link has been set when
7008 			 * vdev starts. Make sure the arvif/arsta pair have same setting
7009 			 */
7010 			if (vif->type == NL80211_IFTYPE_STATION &&
7011 			    !arsta->arvif->is_sta_assoc_link) {
7012 				ath12k_hw_warn(ah, "failed to verify assoc link setting with link id %u\n",
7013 					       link_id);
7014 				ret = -EINVAL;
7015 				goto exit;
7016 			}
7017 
7018 			arsta->is_assoc_link = true;
7019 			ahsta->assoc_link_id = link_id;
7020 		}
7021 	}
7022 
7023 	/* In the ML station scenario, activate all partner links once the
7024 	 * client is transitioning to the associated state.
7025 	 *
7026 	 * FIXME: Ideally, this activation should occur when the client
7027 	 * transitions to the authorized state. However, there are some
7028 	 * issues with handling this in the firmware. Until the firmware
7029 	 * can manage it properly, activate the links when the client is
7030 	 * about to move to the associated state.
7031 	 */
7032 	if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7033 	    old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) {
7034 		/* TODO: for now only do link selection for single device
7035 		 * MLO case. Other cases would be handled in the future.
7036 		 */
7037 		ab = ah->radio[0].ab;
7038 		if (ab->ag->num_devices == 1) {
7039 			ret = ath12k_mac_select_links(ab, vif, hw, &selected_links);
7040 			if (ret) {
7041 				ath12k_warn(ab,
7042 					    "failed to get selected links: %d\n", ret);
7043 				goto exit;
7044 			}
7045 		} else {
7046 			selected_links = ieee80211_vif_usable_links(vif);
7047 		}
7048 
7049 		ieee80211_set_active_links(vif, selected_links);
7050 	}
7051 
7052 	/* Handle all the other state transitions in generic way */
7053 	valid_links = ahsta->links_map;
7054 	for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7055 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7056 		arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7057 		/* some assumptions went wrong! */
7058 		if (WARN_ON(!arvif || !arsta))
7059 			continue;
7060 
7061 		/* vdev might be in deleted */
7062 		if (WARN_ON(!arvif->ar))
7063 			continue;
7064 
7065 		ret = ath12k_mac_handle_link_sta_state(hw, arvif, arsta,
7066 						       old_state, new_state);
7067 		if (ret) {
7068 			ath12k_hw_warn(ah, "unable to move link sta %d of sta %pM from state %d to %d",
7069 				       link_id, arsta->addr, old_state, new_state);
7070 			goto exit;
7071 		}
7072 	}
7073 
7074 	if (ieee80211_vif_is_mld(vif) && vif->type == NL80211_IFTYPE_STATION &&
7075 	    old_state == IEEE80211_STA_ASSOC && new_state == IEEE80211_STA_AUTHORIZED) {
7076 		for_each_ar(ah, ar, i) {
7077 			ab = ar->ab;
7078 			if (prev_ab == ab)
7079 				continue;
7080 
7081 			ret = ath12k_mac_mlo_sta_update_link_active(ab, hw, ahvif);
7082 			if (ret) {
7083 				ath12k_warn(ab,
7084 					    "failed to update link active state on connect %d\n",
7085 					    ret);
7086 				goto exit;
7087 			}
7088 
7089 			prev_ab = ab;
7090 		}
7091 	}
7092 	/* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST:
7093 	 * Remove the station from driver (handle ML sta here since that
7094 	 * needs special handling. Normal sta will be handled in generic
7095 	 * handler below
7096 	 */
7097 	if (old_state == IEEE80211_STA_NONE &&
7098 	    new_state == IEEE80211_STA_NOTEXIST && sta->mlo)
7099 		ath12k_mac_ml_station_remove(ahvif, ahsta);
7100 
7101 	ret = 0;
7102 
7103 exit:
7104 	/* update the state if everything went well */
7105 	if (!ret)
7106 		ahsta->state = new_state;
7107 
7108 	return ret;
7109 }
7110 
ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta)7111 static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
7112 				       struct ieee80211_vif *vif,
7113 				       struct ieee80211_sta *sta)
7114 {
7115 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7116 	struct ath12k *ar;
7117 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7118 	struct ath12k_link_vif *arvif;
7119 	struct ath12k_link_sta *arsta;
7120 	u8 link_id;
7121 	int ret;
7122 	s16 txpwr;
7123 
7124 	lockdep_assert_wiphy(hw->wiphy);
7125 
7126 	/* TODO: use link id from mac80211 once that's implemented */
7127 	link_id = 0;
7128 
7129 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7130 	arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);
7131 
7132 	if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
7133 		txpwr = 0;
7134 	} else {
7135 		txpwr = sta->deflink.txpwr.power;
7136 		if (!txpwr) {
7137 			ret = -EINVAL;
7138 			goto out;
7139 		}
7140 	}
7141 
7142 	if (txpwr > ATH12K_TX_POWER_MAX_VAL || txpwr < ATH12K_TX_POWER_MIN_VAL) {
7143 		ret = -EINVAL;
7144 		goto out;
7145 	}
7146 
7147 	ar = arvif->ar;
7148 
7149 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
7150 					WMI_PEER_USE_FIXED_PWR, txpwr);
7151 	if (ret) {
7152 		ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
7153 			    ret);
7154 		goto out;
7155 	}
7156 
7157 out:
7158 	return ret;
7159 }
7160 
ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,u32 changed)7161 static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
7162 					     struct ieee80211_vif *vif,
7163 					     struct ieee80211_link_sta *link_sta,
7164 					     u32 changed)
7165 {
7166 	struct ieee80211_sta *sta = link_sta->sta;
7167 	struct ath12k *ar;
7168 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7169 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7170 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
7171 	struct ath12k_link_sta *arsta;
7172 	struct ath12k_link_vif *arvif;
7173 	struct ath12k_peer *peer;
7174 	u32 bw, smps;
7175 
7176 	rcu_read_lock();
7177 	arvif = rcu_dereference(ahvif->link[link_sta->link_id]);
7178 	if (!arvif) {
7179 		ath12k_hw_warn(ah, "mac sta rc update failed to fetch link vif on link id %u for peer %pM\n",
7180 			       link_sta->link_id, sta->addr);
7181 		rcu_read_unlock();
7182 		return;
7183 	}
7184 
7185 	ar = arvif->ar;
7186 
7187 	arsta = rcu_dereference(ahsta->link[link_sta->link_id]);
7188 	if (!arsta) {
7189 		rcu_read_unlock();
7190 		ath12k_warn(ar->ab, "mac sta rc update failed to fetch link sta on link id %u for peer %pM\n",
7191 			    link_sta->link_id, sta->addr);
7192 		return;
7193 	}
7194 	spin_lock_bh(&ar->ab->base_lock);
7195 
7196 	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
7197 	if (!peer) {
7198 		spin_unlock_bh(&ar->ab->base_lock);
7199 		rcu_read_unlock();
7200 		ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
7201 			    arsta->addr, arvif->vdev_id);
7202 		return;
7203 	}
7204 
7205 	spin_unlock_bh(&ar->ab->base_lock);
7206 
7207 	if (arsta->link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
7208 		rcu_read_unlock();
7209 		return;
7210 	}
7211 
7212 	link_sta = rcu_dereference(sta->link[arsta->link_id]);
7213 	if (!link_sta) {
7214 		rcu_read_unlock();
7215 		ath12k_warn(ar->ab, "unable to access link sta in rc update for sta %pM link %u\n",
7216 			    sta->addr, arsta->link_id);
7217 		return;
7218 	}
7219 
7220 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
7221 		   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
7222 		   arsta->addr, changed, link_sta->bandwidth, link_sta->rx_nss,
7223 		   link_sta->smps_mode);
7224 
7225 	spin_lock_bh(&ar->data_lock);
7226 
7227 	if (changed & IEEE80211_RC_BW_CHANGED) {
7228 		bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
7229 		arsta->bw_prev = arsta->bw;
7230 		arsta->bw = bw;
7231 	}
7232 
7233 	if (changed & IEEE80211_RC_NSS_CHANGED)
7234 		arsta->nss = link_sta->rx_nss;
7235 
7236 	if (changed & IEEE80211_RC_SMPS_CHANGED) {
7237 		smps = WMI_PEER_SMPS_PS_NONE;
7238 
7239 		switch (link_sta->smps_mode) {
7240 		case IEEE80211_SMPS_AUTOMATIC:
7241 		case IEEE80211_SMPS_OFF:
7242 			smps = WMI_PEER_SMPS_PS_NONE;
7243 			break;
7244 		case IEEE80211_SMPS_STATIC:
7245 			smps = WMI_PEER_SMPS_STATIC;
7246 			break;
7247 		case IEEE80211_SMPS_DYNAMIC:
7248 			smps = WMI_PEER_SMPS_DYNAMIC;
7249 			break;
7250 		default:
7251 			ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM link %u\n",
7252 				    link_sta->smps_mode, arsta->addr, link_sta->link_id);
7253 			smps = WMI_PEER_SMPS_PS_NONE;
7254 			break;
7255 		}
7256 
7257 		arsta->smps = smps;
7258 	}
7259 
7260 	arsta->changed |= changed;
7261 
7262 	spin_unlock_bh(&ar->data_lock);
7263 
7264 	wiphy_work_queue(hw->wiphy, &arsta->update_wk);
7265 
7266 	rcu_read_unlock();
7267 }
7268 
ath12k_mac_alloc_assign_link_sta(struct ath12k_hw * ah,struct ath12k_sta * ahsta,struct ath12k_vif * ahvif,u8 link_id)7269 static struct ath12k_link_sta *ath12k_mac_alloc_assign_link_sta(struct ath12k_hw *ah,
7270 								struct ath12k_sta *ahsta,
7271 								struct ath12k_vif *ahvif,
7272 								u8 link_id)
7273 {
7274 	struct ath12k_link_sta *arsta;
7275 	int ret;
7276 
7277 	lockdep_assert_wiphy(ah->hw->wiphy);
7278 
7279 	if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7280 		return NULL;
7281 
7282 	arsta = wiphy_dereference(ah->hw->wiphy, ahsta->link[link_id]);
7283 	if (arsta)
7284 		return NULL;
7285 
7286 	arsta = kmalloc(sizeof(*arsta), GFP_KERNEL);
7287 	if (!arsta)
7288 		return NULL;
7289 
7290 	ret = ath12k_mac_assign_link_sta(ah, ahsta, arsta, ahvif, link_id);
7291 	if (ret) {
7292 		kfree(arsta);
7293 		return NULL;
7294 	}
7295 
7296 	return arsta;
7297 }
7298 
ath12k_mac_op_change_sta_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,u16 old_links,u16 new_links)7299 static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,
7300 					  struct ieee80211_vif *vif,
7301 					  struct ieee80211_sta *sta,
7302 					  u16 old_links, u16 new_links)
7303 {
7304 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7305 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
7306 	struct ath12k_hw *ah = hw->priv;
7307 	struct ath12k_link_vif *arvif;
7308 	struct ath12k_link_sta *arsta;
7309 	unsigned long valid_links;
7310 	struct ath12k *ar;
7311 	u8 link_id;
7312 	int ret;
7313 
7314 	lockdep_assert_wiphy(hw->wiphy);
7315 
7316 	if (!sta->valid_links)
7317 		return -EINVAL;
7318 
7319 	/* Firmware does not support removal of one of link stas. All sta
7320 	 * would be removed during ML STA delete in sta_state(), hence link
7321 	 * sta removal is not handled here.
7322 	 */
7323 	if (new_links < old_links)
7324 		return 0;
7325 
7326 	if (ahsta->ml_peer_id == ATH12K_MLO_PEER_ID_INVALID) {
7327 		ath12k_hw_warn(ah, "unable to add link for ml sta %pM", sta->addr);
7328 		return -EINVAL;
7329 	}
7330 
7331 	/* this op is expected only after initial sta insertion with default link */
7332 	if (WARN_ON(ahsta->links_map == 0))
7333 		return -EINVAL;
7334 
7335 	valid_links = new_links;
7336 	for_each_set_bit(link_id, &valid_links, IEEE80211_MLD_MAX_NUM_LINKS) {
7337 		if (ahsta->links_map & BIT(link_id))
7338 			continue;
7339 
7340 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7341 		arsta = ath12k_mac_alloc_assign_link_sta(ah, ahsta, ahvif, link_id);
7342 
7343 		if (!arvif || !arsta) {
7344 			ath12k_hw_warn(ah, "Failed to alloc/assign link sta");
7345 			continue;
7346 		}
7347 
7348 		ar = arvif->ar;
7349 		if (!ar)
7350 			continue;
7351 
7352 		ret = ath12k_mac_station_add(ar, arvif, arsta);
7353 		if (ret) {
7354 			ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
7355 				    arsta->addr, arvif->vdev_id);
7356 			ath12k_mac_free_unassign_link_sta(ah, ahsta, link_id);
7357 			return ret;
7358 		}
7359 	}
7360 
7361 	return 0;
7362 }
7363 
ath12k_mac_op_can_activate_links(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u16 active_links)7364 static bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw,
7365 					     struct ieee80211_vif *vif,
7366 					     u16 active_links)
7367 {
7368 	/* TODO: Handle recovery case */
7369 
7370 	return true;
7371 }
7372 
ath12k_conf_tx_uapsd(struct ath12k_link_vif * arvif,u16 ac,bool enable)7373 static int ath12k_conf_tx_uapsd(struct ath12k_link_vif *arvif,
7374 				u16 ac, bool enable)
7375 {
7376 	struct ath12k *ar = arvif->ar;
7377 	struct ath12k_vif *ahvif = arvif->ahvif;
7378 	u32 value;
7379 	int ret;
7380 
7381 	if (ahvif->vdev_type != WMI_VDEV_TYPE_STA)
7382 		return 0;
7383 
7384 	switch (ac) {
7385 	case IEEE80211_AC_VO:
7386 		value = WMI_STA_PS_UAPSD_AC3_DELIVERY_EN |
7387 			WMI_STA_PS_UAPSD_AC3_TRIGGER_EN;
7388 		break;
7389 	case IEEE80211_AC_VI:
7390 		value = WMI_STA_PS_UAPSD_AC2_DELIVERY_EN |
7391 			WMI_STA_PS_UAPSD_AC2_TRIGGER_EN;
7392 		break;
7393 	case IEEE80211_AC_BE:
7394 		value = WMI_STA_PS_UAPSD_AC1_DELIVERY_EN |
7395 			WMI_STA_PS_UAPSD_AC1_TRIGGER_EN;
7396 		break;
7397 	case IEEE80211_AC_BK:
7398 		value = WMI_STA_PS_UAPSD_AC0_DELIVERY_EN |
7399 			WMI_STA_PS_UAPSD_AC0_TRIGGER_EN;
7400 		break;
7401 	}
7402 
7403 	if (enable)
7404 		ahvif->u.sta.uapsd |= value;
7405 	else
7406 		ahvif->u.sta.uapsd &= ~value;
7407 
7408 	ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7409 					  WMI_STA_PS_PARAM_UAPSD,
7410 					  ahvif->u.sta.uapsd);
7411 	if (ret) {
7412 		ath12k_warn(ar->ab, "could not set uapsd params %d\n", ret);
7413 		goto exit;
7414 	}
7415 
7416 	if (ahvif->u.sta.uapsd)
7417 		value = WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD;
7418 	else
7419 		value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
7420 
7421 	ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
7422 					  WMI_STA_PS_PARAM_RX_WAKE_POLICY,
7423 					  value);
7424 	if (ret)
7425 		ath12k_warn(ar->ab, "could not set rx wake param %d\n", ret);
7426 
7427 exit:
7428 	return ret;
7429 }
7430 
ath12k_mac_conf_tx(struct ath12k_link_vif * arvif,u16 ac,const struct ieee80211_tx_queue_params * params)7431 static int ath12k_mac_conf_tx(struct ath12k_link_vif *arvif, u16 ac,
7432 			      const struct ieee80211_tx_queue_params *params)
7433 {
7434 	struct wmi_wmm_params_arg *p = NULL;
7435 	struct ath12k *ar = arvif->ar;
7436 	struct ath12k_base *ab = ar->ab;
7437 	int ret;
7438 
7439 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
7440 
7441 	switch (ac) {
7442 	case IEEE80211_AC_VO:
7443 		p = &arvif->wmm_params.ac_vo;
7444 		break;
7445 	case IEEE80211_AC_VI:
7446 		p = &arvif->wmm_params.ac_vi;
7447 		break;
7448 	case IEEE80211_AC_BE:
7449 		p = &arvif->wmm_params.ac_be;
7450 		break;
7451 	case IEEE80211_AC_BK:
7452 		p = &arvif->wmm_params.ac_bk;
7453 		break;
7454 	}
7455 
7456 	if (WARN_ON(!p)) {
7457 		ret = -EINVAL;
7458 		goto exit;
7459 	}
7460 
7461 	p->cwmin = params->cw_min;
7462 	p->cwmax = params->cw_max;
7463 	p->aifs = params->aifs;
7464 	p->txop = params->txop;
7465 
7466 	ret = ath12k_wmi_send_wmm_update_cmd(ar, arvif->vdev_id,
7467 					     &arvif->wmm_params);
7468 	if (ret) {
7469 		ath12k_warn(ab, "pdev idx %d failed to set wmm params: %d\n",
7470 			    ar->pdev_idx, ret);
7471 		goto exit;
7472 	}
7473 
7474 	ret = ath12k_conf_tx_uapsd(arvif, ac, params->uapsd);
7475 	if (ret)
7476 		ath12k_warn(ab, "pdev idx %d failed to set sta uapsd: %d\n",
7477 			    ar->pdev_idx, ret);
7478 
7479 exit:
7480 	return ret;
7481 }
7482 
ath12k_mac_op_conf_tx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,unsigned int link_id,u16 ac,const struct ieee80211_tx_queue_params * params)7483 static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
7484 				 struct ieee80211_vif *vif,
7485 				 unsigned int link_id, u16 ac,
7486 				 const struct ieee80211_tx_queue_params *params)
7487 {
7488 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
7489 	struct ath12k_link_vif *arvif;
7490 	struct ath12k_vif_cache *cache;
7491 	int ret;
7492 
7493 	lockdep_assert_wiphy(hw->wiphy);
7494 
7495 	if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
7496 		return -EINVAL;
7497 
7498 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
7499 	if (!arvif || !arvif->is_created) {
7500 		cache = ath12k_ahvif_get_link_cache(ahvif, link_id);
7501 		if (!cache)
7502 			return -ENOSPC;
7503 
7504 		cache->tx_conf.changed = true;
7505 		cache->tx_conf.ac = ac;
7506 		cache->tx_conf.tx_queue_params = *params;
7507 
7508 		return 0;
7509 	}
7510 
7511 	ret = ath12k_mac_conf_tx(arvif, ac, params);
7512 
7513 	return ret;
7514 }
7515 
7516 static struct ieee80211_sta_ht_cap
ath12k_create_ht_cap(struct ath12k * ar,u32 ar_ht_cap,u32 rate_cap_rx_chainmask)7517 ath12k_create_ht_cap(struct ath12k *ar, u32 ar_ht_cap, u32 rate_cap_rx_chainmask)
7518 {
7519 	int i;
7520 	struct ieee80211_sta_ht_cap ht_cap = {};
7521 	u32 ar_vht_cap = ar->pdev->cap.vht_cap;
7522 
7523 	if (!(ar_ht_cap & WMI_HT_CAP_ENABLED))
7524 		return ht_cap;
7525 
7526 	ht_cap.ht_supported = 1;
7527 	ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
7528 	ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
7529 	ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7530 	ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
7531 	ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
7532 
7533 	if (ar_ht_cap & WMI_HT_CAP_HT20_SGI)
7534 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
7535 
7536 	if (ar_ht_cap & WMI_HT_CAP_HT40_SGI)
7537 		ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
7538 
7539 	if (ar_ht_cap & WMI_HT_CAP_DYNAMIC_SMPS) {
7540 		u32 smps;
7541 
7542 		smps   = WLAN_HT_CAP_SM_PS_DYNAMIC;
7543 		smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
7544 
7545 		ht_cap.cap |= smps;
7546 	}
7547 
7548 	if (ar_ht_cap & WMI_HT_CAP_TX_STBC)
7549 		ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
7550 
7551 	if (ar_ht_cap & WMI_HT_CAP_RX_STBC) {
7552 		u32 stbc;
7553 
7554 		stbc   = ar_ht_cap;
7555 		stbc  &= WMI_HT_CAP_RX_STBC;
7556 		stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
7557 		stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
7558 		stbc  &= IEEE80211_HT_CAP_RX_STBC;
7559 
7560 		ht_cap.cap |= stbc;
7561 	}
7562 
7563 	if (ar_ht_cap & WMI_HT_CAP_RX_LDPC)
7564 		ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
7565 
7566 	if (ar_ht_cap & WMI_HT_CAP_L_SIG_TXOP_PROT)
7567 		ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
7568 
7569 	if (ar_vht_cap & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
7570 		ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
7571 
7572 	for (i = 0; i < ar->num_rx_chains; i++) {
7573 		if (rate_cap_rx_chainmask & BIT(i))
7574 			ht_cap.mcs.rx_mask[i] = 0xFF;
7575 	}
7576 
7577 	ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
7578 
7579 	return ht_cap;
7580 }
7581 
ath12k_mac_set_txbf_conf(struct ath12k_link_vif * arvif)7582 static int ath12k_mac_set_txbf_conf(struct ath12k_link_vif *arvif)
7583 {
7584 	u32 value = 0;
7585 	struct ath12k *ar = arvif->ar;
7586 	struct ath12k_vif *ahvif = arvif->ahvif;
7587 	int nsts;
7588 	int sound_dim;
7589 	u32 vht_cap = ar->pdev->cap.vht_cap;
7590 	u32 vdev_param = WMI_VDEV_PARAM_TXBF;
7591 
7592 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
7593 		nsts = vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
7594 		nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
7595 		value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
7596 	}
7597 
7598 	if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
7599 		sound_dim = vht_cap &
7600 			    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
7601 		sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
7602 		if (sound_dim > (ar->num_tx_chains - 1))
7603 			sound_dim = ar->num_tx_chains - 1;
7604 		value |= SM(sound_dim, WMI_BF_SOUND_DIM_OFFSET);
7605 	}
7606 
7607 	if (!value)
7608 		return 0;
7609 
7610 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) {
7611 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
7612 
7613 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) &&
7614 		    ahvif->vdev_type == WMI_VDEV_TYPE_AP)
7615 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
7616 	}
7617 
7618 	if (vht_cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE) {
7619 		value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
7620 
7621 		if ((vht_cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
7622 		    ahvif->vdev_type == WMI_VDEV_TYPE_STA)
7623 			value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
7624 	}
7625 
7626 	return ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
7627 					     vdev_param, value);
7628 }
7629 
ath12k_set_vht_txbf_cap(struct ath12k * ar,u32 * vht_cap)7630 static void ath12k_set_vht_txbf_cap(struct ath12k *ar, u32 *vht_cap)
7631 {
7632 	bool subfer, subfee;
7633 	int sound_dim = 0;
7634 
7635 	subfer = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
7636 	subfee = !!(*vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
7637 
7638 	if (ar->num_tx_chains < 2) {
7639 		*vht_cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
7640 		subfer = false;
7641 	}
7642 
7643 	/* If SU Beaformer is not set, then disable MU Beamformer Capability */
7644 	if (!subfer)
7645 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
7646 
7647 	/* If SU Beaformee is not set, then disable MU Beamformee Capability */
7648 	if (!subfee)
7649 		*vht_cap &= ~(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
7650 
7651 	sound_dim = u32_get_bits(*vht_cap,
7652 				 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7653 	*vht_cap = u32_replace_bits(*vht_cap, 0,
7654 				    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7655 
7656 	/* TODO: Need to check invalid STS and Sound_dim values set by FW? */
7657 
7658 	/* Enable Sounding Dimension Field only if SU BF is enabled */
7659 	if (subfer) {
7660 		if (sound_dim > (ar->num_tx_chains - 1))
7661 			sound_dim = ar->num_tx_chains - 1;
7662 
7663 		*vht_cap = u32_replace_bits(*vht_cap, sound_dim,
7664 					    IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
7665 	}
7666 
7667 	/* Use the STS advertised by FW unless SU Beamformee is not supported*/
7668 	if (!subfee)
7669 		*vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
7670 }
7671 
7672 static struct ieee80211_sta_vht_cap
ath12k_create_vht_cap(struct ath12k * ar,u32 rate_cap_tx_chainmask,u32 rate_cap_rx_chainmask)7673 ath12k_create_vht_cap(struct ath12k *ar, u32 rate_cap_tx_chainmask,
7674 		      u32 rate_cap_rx_chainmask)
7675 {
7676 	struct ieee80211_sta_vht_cap vht_cap = {};
7677 	u16 txmcs_map, rxmcs_map;
7678 	int i;
7679 
7680 	vht_cap.vht_supported = 1;
7681 	vht_cap.cap = ar->pdev->cap.vht_cap;
7682 
7683 	ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);
7684 
7685 	/* 80P80 is not supported */
7686 	vht_cap.cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
7687 
7688 	rxmcs_map = 0;
7689 	txmcs_map = 0;
7690 	for (i = 0; i < 8; i++) {
7691 		if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
7692 			txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7693 		else
7694 			txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7695 
7696 		if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
7697 			rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
7698 		else
7699 			rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
7700 	}
7701 
7702 	if (rate_cap_tx_chainmask <= 1)
7703 		vht_cap.cap &= ~IEEE80211_VHT_CAP_TXSTBC;
7704 
7705 	vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
7706 	vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
7707 
7708 	/* Check if the HW supports 1:1 NSS ratio and reset
7709 	 * EXT NSS BW Support field to 0 to indicate 1:1 ratio
7710 	 */
7711 	if (ar->pdev->cap.nss_ratio_info == WMI_NSS_RATIO_1_NSS)
7712 		vht_cap.cap &= ~IEEE80211_VHT_CAP_EXT_NSS_BW_MASK;
7713 
7714 	return vht_cap;
7715 }
7716 
ath12k_mac_setup_ht_vht_cap(struct ath12k * ar,struct ath12k_pdev_cap * cap,u32 * ht_cap_info)7717 static void ath12k_mac_setup_ht_vht_cap(struct ath12k *ar,
7718 					struct ath12k_pdev_cap *cap,
7719 					u32 *ht_cap_info)
7720 {
7721 	struct ieee80211_supported_band *band;
7722 	u32 rate_cap_tx_chainmask;
7723 	u32 rate_cap_rx_chainmask;
7724 	u32 ht_cap;
7725 
7726 	rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
7727 	rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
7728 
7729 	if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
7730 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
7731 		ht_cap = cap->band[NL80211_BAND_2GHZ].ht_cap_info;
7732 		if (ht_cap_info)
7733 			*ht_cap_info = ht_cap;
7734 		band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7735 						    rate_cap_rx_chainmask);
7736 	}
7737 
7738 	if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
7739 	    (ar->ab->hw_params->single_pdev_only ||
7740 	     !ar->supports_6ghz)) {
7741 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
7742 		ht_cap = cap->band[NL80211_BAND_5GHZ].ht_cap_info;
7743 		if (ht_cap_info)
7744 			*ht_cap_info = ht_cap;
7745 		band->ht_cap = ath12k_create_ht_cap(ar, ht_cap,
7746 						    rate_cap_rx_chainmask);
7747 		band->vht_cap = ath12k_create_vht_cap(ar, rate_cap_tx_chainmask,
7748 						      rate_cap_rx_chainmask);
7749 	}
7750 }
7751 
ath12k_check_chain_mask(struct ath12k * ar,u32 ant,bool is_tx_ant)7752 static int ath12k_check_chain_mask(struct ath12k *ar, u32 ant, bool is_tx_ant)
7753 {
7754 	/* TODO: Check the request chainmask against the supported
7755 	 * chainmask table which is advertised in extented_service_ready event
7756 	 */
7757 
7758 	return 0;
7759 }
7760 
ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,u8 * he_ppet)7761 static void ath12k_gen_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
7762 				  u8 *he_ppet)
7763 {
7764 	int nss, ru;
7765 	u8 bit = 7;
7766 
7767 	he_ppet[0] = fw_ppet->numss_m1 & IEEE80211_PPE_THRES_NSS_MASK;
7768 	he_ppet[0] |= (fw_ppet->ru_bit_mask <<
7769 		       IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS) &
7770 		      IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK;
7771 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
7772 		for (ru = 0; ru < 4; ru++) {
7773 			u8 val;
7774 			int i;
7775 
7776 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
7777 				continue;
7778 			val = (fw_ppet->ppet16_ppet8_ru3_ru0[nss] >> (ru * 6)) &
7779 			       0x3f;
7780 			val = ((val >> 3) & 0x7) | ((val & 0x7) << 3);
7781 			for (i = 5; i >= 0; i--) {
7782 				he_ppet[bit / 8] |=
7783 					((val >> i) & 0x1) << ((bit % 8));
7784 				bit++;
7785 			}
7786 		}
7787 	}
7788 }
7789 
7790 static void
ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem * he_cap_elem)7791 ath12k_mac_filter_he_cap_mesh(struct ieee80211_he_cap_elem *he_cap_elem)
7792 {
7793 	u8 m;
7794 
7795 	m = IEEE80211_HE_MAC_CAP0_TWT_RES |
7796 	    IEEE80211_HE_MAC_CAP0_TWT_REQ;
7797 	he_cap_elem->mac_cap_info[0] &= ~m;
7798 
7799 	m = IEEE80211_HE_MAC_CAP2_TRS |
7800 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7801 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7802 	he_cap_elem->mac_cap_info[2] &= ~m;
7803 
7804 	m = IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED |
7805 	    IEEE80211_HE_MAC_CAP2_BCAST_TWT |
7806 	    IEEE80211_HE_MAC_CAP2_MU_CASCADING;
7807 	he_cap_elem->mac_cap_info[3] &= ~m;
7808 
7809 	m = IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG |
7810 	    IEEE80211_HE_MAC_CAP4_BQR;
7811 	he_cap_elem->mac_cap_info[4] &= ~m;
7812 
7813 	m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION |
7814 	    IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
7815 	    IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
7816 	    IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
7817 	he_cap_elem->mac_cap_info[5] &= ~m;
7818 
7819 	m = IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
7820 	    IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
7821 	he_cap_elem->phy_cap_info[2] &= ~m;
7822 
7823 	m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU |
7824 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
7825 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
7826 	he_cap_elem->phy_cap_info[3] &= ~m;
7827 
7828 	m = IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
7829 	he_cap_elem->phy_cap_info[4] &= ~m;
7830 
7831 	m = IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK;
7832 	he_cap_elem->phy_cap_info[5] &= ~m;
7833 
7834 	m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
7835 	    IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
7836 	    IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
7837 	    IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO;
7838 	he_cap_elem->phy_cap_info[6] &= ~m;
7839 
7840 	m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR |
7841 	    IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
7842 	    IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ |
7843 	    IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
7844 	he_cap_elem->phy_cap_info[7] &= ~m;
7845 
7846 	m = IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
7847 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
7848 	    IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
7849 	    IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU;
7850 	he_cap_elem->phy_cap_info[8] &= ~m;
7851 
7852 	m = IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
7853 	    IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
7854 	    IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
7855 	    IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
7856 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
7857 	    IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
7858 	he_cap_elem->phy_cap_info[9] &= ~m;
7859 }
7860 
ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap * pcap,struct ath12k_band_cap * bcap)7861 static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
7862 					   struct ath12k_band_cap *bcap)
7863 {
7864 	u8 val;
7865 
7866 	bcap->he_6ghz_capa = IEEE80211_HT_MPDU_DENSITY_NONE;
7867 	if (bcap->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS)
7868 		bcap->he_6ghz_capa |=
7869 			u32_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
7870 					IEEE80211_HE_6GHZ_CAP_SM_PS);
7871 	else
7872 		bcap->he_6ghz_capa |=
7873 			u32_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
7874 					IEEE80211_HE_6GHZ_CAP_SM_PS);
7875 	val = u32_get_bits(pcap->vht_cap,
7876 			   IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
7877 	bcap->he_6ghz_capa |=
7878 		u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
7879 	val = u32_get_bits(pcap->vht_cap,
7880 			   IEEE80211_VHT_CAP_MAX_MPDU_MASK);
7881 	bcap->he_6ghz_capa |=
7882 		u32_encode_bits(val, IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
7883 	if (pcap->vht_cap & IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN)
7884 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
7885 	if (pcap->vht_cap & IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN)
7886 		bcap->he_6ghz_capa |= IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS;
7887 
7888 	return cpu_to_le16(bcap->he_6ghz_capa);
7889 }
7890 
ath12k_mac_set_hemcsmap(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sta_he_cap * he_cap)7891 static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
7892 				    struct ath12k_pdev_cap *cap,
7893 				    struct ieee80211_sta_he_cap *he_cap)
7894 {
7895 	struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
7896 	u8 maxtxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
7897 	u8 maxrxnss_160 = ath12k_get_nss_160mhz(ar, ar->num_rx_chains);
7898 	u16 txmcs_map_160 = 0, rxmcs_map_160 = 0;
7899 	u16 txmcs_map = 0, rxmcs_map = 0;
7900 	u32 i;
7901 
7902 	for (i = 0; i < 8; i++) {
7903 		if (i < ar->num_tx_chains &&
7904 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7905 			txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7906 		else
7907 			txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7908 
7909 		if (i < ar->num_rx_chains &&
7910 		    (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7911 			rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7912 		else
7913 			rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7914 
7915 		if (i < maxtxnss_160 &&
7916 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7917 			txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7918 		else
7919 			txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7920 
7921 		if (i < maxrxnss_160 &&
7922 		    (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
7923 			rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
7924 		else
7925 			rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
7926 	}
7927 
7928 	mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
7929 	mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
7930 	mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map_160 & 0xffff);
7931 	mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map_160 & 0xffff);
7932 }
7933 
ath12k_mac_copy_he_cap(struct ath12k * ar,struct ath12k_band_cap * band_cap,int iftype,u8 num_tx_chains,struct ieee80211_sta_he_cap * he_cap)7934 static void ath12k_mac_copy_he_cap(struct ath12k *ar,
7935 				   struct ath12k_band_cap *band_cap,
7936 				   int iftype, u8 num_tx_chains,
7937 				   struct ieee80211_sta_he_cap *he_cap)
7938 {
7939 	struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
7940 
7941 	he_cap->has_he = true;
7942 	memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
7943 	       sizeof(he_cap_elem->mac_cap_info));
7944 	memcpy(he_cap_elem->phy_cap_info, band_cap->he_cap_phy_info,
7945 	       sizeof(he_cap_elem->phy_cap_info));
7946 
7947 	he_cap_elem->mac_cap_info[1] &=
7948 		IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
7949 	he_cap_elem->phy_cap_info[0] &=
7950 		IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7951 		IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7952 		IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
7953 	/* 80PLUS80 is not supported */
7954 	he_cap_elem->phy_cap_info[0] &=
7955 		~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
7956 	he_cap_elem->phy_cap_info[5] &=
7957 		~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK;
7958 	he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;
7959 
7960 	switch (iftype) {
7961 	case NL80211_IFTYPE_AP:
7962 		he_cap_elem->mac_cap_info[2] &=
7963 			~IEEE80211_HE_MAC_CAP2_BCAST_TWT;
7964 		he_cap_elem->phy_cap_info[3] &=
7965 			~IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK;
7966 		he_cap_elem->phy_cap_info[9] |=
7967 			IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
7968 		break;
7969 	case NL80211_IFTYPE_STATION:
7970 		he_cap_elem->mac_cap_info[0] &= ~IEEE80211_HE_MAC_CAP0_TWT_RES;
7971 		he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_REQ;
7972 		he_cap_elem->phy_cap_info[9] |=
7973 			IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
7974 		break;
7975 	case NL80211_IFTYPE_MESH_POINT:
7976 		ath12k_mac_filter_he_cap_mesh(he_cap_elem);
7977 		break;
7978 	}
7979 
7980 	ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
7981 	memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
7982 	if (he_cap_elem->phy_cap_info[6] &
7983 	    IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
7984 		ath12k_gen_ppe_thresh(&band_cap->he_ppet, he_cap->ppe_thres);
7985 }
7986 
7987 static void
ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap * band_cap,struct ieee80211_eht_mcs_nss_supp * mcs_nss,const struct ieee80211_he_cap_elem * he_cap,const struct ieee80211_eht_cap_elem_fixed * eht_cap)7988 ath12k_mac_copy_eht_mcs_nss(struct ath12k_band_cap *band_cap,
7989 			    struct ieee80211_eht_mcs_nss_supp *mcs_nss,
7990 			    const struct ieee80211_he_cap_elem *he_cap,
7991 			    const struct ieee80211_eht_cap_elem_fixed *eht_cap)
7992 {
7993 	if ((he_cap->phy_cap_info[0] &
7994 	     (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
7995 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
7996 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
7997 	      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)) == 0)
7998 		memcpy(&mcs_nss->only_20mhz, &band_cap->eht_mcs_20_only,
7999 		       sizeof(struct ieee80211_eht_mcs_nss_supp_20mhz_only));
8000 
8001 	if (he_cap->phy_cap_info[0] &
8002 	    (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
8003 	     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G))
8004 		memcpy(&mcs_nss->bw._80, &band_cap->eht_mcs_80,
8005 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8006 
8007 	if (he_cap->phy_cap_info[0] &
8008 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
8009 		memcpy(&mcs_nss->bw._160, &band_cap->eht_mcs_160,
8010 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8011 
8012 	if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
8013 		memcpy(&mcs_nss->bw._320, &band_cap->eht_mcs_320,
8014 		       sizeof(struct ieee80211_eht_mcs_nss_supp_bw));
8015 }
8016 
ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg * fw_ppet,struct ieee80211_sta_eht_cap * cap)8017 static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *fw_ppet,
8018 					   struct ieee80211_sta_eht_cap *cap)
8019 {
8020 	u16 bit = IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
8021 	u8 i, nss, ru, ppet_bit_len_per_ru = IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2;
8022 
8023 	u8p_replace_bits(&cap->eht_ppe_thres[0], fw_ppet->numss_m1,
8024 			 IEEE80211_EHT_PPE_THRES_NSS_MASK);
8025 
8026 	u16p_replace_bits((u16 *)&cap->eht_ppe_thres[0], fw_ppet->ru_bit_mask,
8027 			  IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8028 
8029 	for (nss = 0; nss <= fw_ppet->numss_m1; nss++) {
8030 		for (ru = 0;
8031 		     ru < hweight16(IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
8032 		     ru++) {
8033 			u32 val = 0;
8034 
8035 			if ((fw_ppet->ru_bit_mask & BIT(ru)) == 0)
8036 				continue;
8037 
8038 			u32p_replace_bits(&val, fw_ppet->ppet16_ppet8_ru3_ru0[nss] >>
8039 						(ru * ppet_bit_len_per_ru),
8040 					  GENMASK(ppet_bit_len_per_ru - 1, 0));
8041 
8042 			for (i = 0; i < ppet_bit_len_per_ru; i++) {
8043 				cap->eht_ppe_thres[bit / 8] |=
8044 					(((val >> i) & 0x1) << ((bit % 8)));
8045 				bit++;
8046 			}
8047 		}
8048 	}
8049 }
8050 
8051 static void
ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed * eht_cap_elem)8052 ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
8053 			       *eht_cap_elem)
8054 {
8055 	u8 m;
8056 
8057 	m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
8058 	eht_cap_elem->mac_cap_info[0] &= ~m;
8059 
8060 	m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
8061 	eht_cap_elem->phy_cap_info[0] &= ~m;
8062 
8063 	m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
8064 	    IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
8065 	    IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
8066 	    IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
8067 	eht_cap_elem->phy_cap_info[3] &= ~m;
8068 
8069 	m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
8070 	    IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
8071 	    IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
8072 	    IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
8073 	eht_cap_elem->phy_cap_info[4] &= ~m;
8074 
8075 	m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
8076 	    IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
8077 	    IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
8078 	    IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
8079 	eht_cap_elem->phy_cap_info[5] &= ~m;
8080 
8081 	m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
8082 	eht_cap_elem->phy_cap_info[6] &= ~m;
8083 
8084 	m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8085 	    IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8086 	    IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
8087 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8088 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8089 	    IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
8090 	eht_cap_elem->phy_cap_info[7] &= ~m;
8091 }
8092 
ath12k_mac_copy_eht_cap(struct ath12k * ar,struct ath12k_band_cap * band_cap,struct ieee80211_he_cap_elem * he_cap_elem,int iftype,struct ieee80211_sta_eht_cap * eht_cap)8093 static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
8094 				    struct ath12k_band_cap *band_cap,
8095 				    struct ieee80211_he_cap_elem *he_cap_elem,
8096 				    int iftype,
8097 				    struct ieee80211_sta_eht_cap *eht_cap)
8098 {
8099 	struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
8100 
8101 	memset(eht_cap, 0, sizeof(struct ieee80211_sta_eht_cap));
8102 
8103 	if (!(test_bit(WMI_TLV_SERVICE_11BE, ar->ab->wmi_ab.svc_map)) ||
8104 	    ath12k_acpi_get_disable_11be(ar->ab))
8105 		return;
8106 
8107 	eht_cap->has_eht = true;
8108 	memcpy(eht_cap_elem->mac_cap_info, band_cap->eht_cap_mac_info,
8109 	       sizeof(eht_cap_elem->mac_cap_info));
8110 	memcpy(eht_cap_elem->phy_cap_info, band_cap->eht_cap_phy_info,
8111 	       sizeof(eht_cap_elem->phy_cap_info));
8112 
8113 	switch (iftype) {
8114 	case NL80211_IFTYPE_AP:
8115 		eht_cap_elem->phy_cap_info[0] &=
8116 			~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ;
8117 		eht_cap_elem->phy_cap_info[4] &=
8118 			~IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO;
8119 		eht_cap_elem->phy_cap_info[5] &=
8120 			~IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP;
8121 		break;
8122 	case NL80211_IFTYPE_STATION:
8123 		eht_cap_elem->phy_cap_info[7] &=
8124 			~(IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
8125 			  IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
8126 			  IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ);
8127 		eht_cap_elem->phy_cap_info[7] &=
8128 			~(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
8129 			  IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
8130 			  IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
8131 		break;
8132 	case NL80211_IFTYPE_MESH_POINT:
8133 		ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
8134 		break;
8135 	default:
8136 		break;
8137 	}
8138 
8139 	ath12k_mac_copy_eht_mcs_nss(band_cap, &eht_cap->eht_mcs_nss_supp,
8140 				    he_cap_elem, eht_cap_elem);
8141 
8142 	if (eht_cap_elem->phy_cap_info[5] &
8143 	    IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT)
8144 		ath12k_mac_copy_eht_ppe_thresh(&band_cap->eht_ppet, eht_cap);
8145 }
8146 
ath12k_mac_copy_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap,struct ieee80211_sband_iftype_data * data,int band)8147 static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
8148 					     struct ath12k_pdev_cap *cap,
8149 					     struct ieee80211_sband_iftype_data *data,
8150 					     int band)
8151 {
8152 	struct ath12k_band_cap *band_cap = &cap->band[band];
8153 	int i, idx = 0;
8154 
8155 	for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
8156 		struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
8157 
8158 		switch (i) {
8159 		case NL80211_IFTYPE_STATION:
8160 		case NL80211_IFTYPE_AP:
8161 		case NL80211_IFTYPE_MESH_POINT:
8162 			break;
8163 
8164 		default:
8165 			continue;
8166 		}
8167 
8168 		data[idx].types_mask = BIT(i);
8169 
8170 		ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
8171 		if (band == NL80211_BAND_6GHZ) {
8172 			data[idx].he_6ghz_capa.capa =
8173 				ath12k_mac_setup_he_6ghz_cap(cap, band_cap);
8174 		}
8175 		ath12k_mac_copy_eht_cap(ar, band_cap, &he_cap->he_cap_elem, i,
8176 					&data[idx].eht_cap);
8177 		idx++;
8178 	}
8179 
8180 	return idx;
8181 }
8182 
ath12k_mac_setup_sband_iftype_data(struct ath12k * ar,struct ath12k_pdev_cap * cap)8183 static void ath12k_mac_setup_sband_iftype_data(struct ath12k *ar,
8184 					       struct ath12k_pdev_cap *cap)
8185 {
8186 	struct ieee80211_supported_band *sband;
8187 	enum nl80211_band band;
8188 	int count;
8189 
8190 	if (cap->supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
8191 		band = NL80211_BAND_2GHZ;
8192 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8193 							  ar->mac.iftype[band],
8194 							  band);
8195 		sband = &ar->mac.sbands[band];
8196 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8197 						 count);
8198 	}
8199 
8200 	if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
8201 		band = NL80211_BAND_5GHZ;
8202 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8203 							  ar->mac.iftype[band],
8204 							  band);
8205 		sband = &ar->mac.sbands[band];
8206 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8207 						 count);
8208 	}
8209 
8210 	if (cap->supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
8211 	    ar->supports_6ghz) {
8212 		band = NL80211_BAND_6GHZ;
8213 		count = ath12k_mac_copy_sband_iftype_data(ar, cap,
8214 							  ar->mac.iftype[band],
8215 							  band);
8216 		sband = &ar->mac.sbands[band];
8217 		_ieee80211_set_sband_iftype_data(sband, ar->mac.iftype[band],
8218 						 count);
8219 	}
8220 }
8221 
__ath12k_set_antenna(struct ath12k * ar,u32 tx_ant,u32 rx_ant)8222 static int __ath12k_set_antenna(struct ath12k *ar, u32 tx_ant, u32 rx_ant)
8223 {
8224 	struct ath12k_hw *ah = ath12k_ar_to_ah(ar);
8225 	int ret;
8226 
8227 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8228 
8229 	if (ath12k_check_chain_mask(ar, tx_ant, true))
8230 		return -EINVAL;
8231 
8232 	if (ath12k_check_chain_mask(ar, rx_ant, false))
8233 		return -EINVAL;
8234 
8235 	/* Since we advertised the max cap of all radios combined during wiphy
8236 	 * registration, ensure we don't set the antenna config higher than the
8237 	 * limits
8238 	 */
8239 	tx_ant = min_t(u32, tx_ant, ar->pdev->cap.tx_chain_mask);
8240 	rx_ant = min_t(u32, rx_ant, ar->pdev->cap.rx_chain_mask);
8241 
8242 	ar->cfg_tx_chainmask = tx_ant;
8243 	ar->cfg_rx_chainmask = rx_ant;
8244 
8245 	if (ah->state != ATH12K_HW_STATE_ON &&
8246 	    ah->state != ATH12K_HW_STATE_RESTARTED)
8247 		return 0;
8248 
8249 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_TX_CHAIN_MASK,
8250 					tx_ant, ar->pdev->pdev_id);
8251 	if (ret) {
8252 		ath12k_warn(ar->ab, "failed to set tx-chainmask: %d, req 0x%x\n",
8253 			    ret, tx_ant);
8254 		return ret;
8255 	}
8256 
8257 	ar->num_tx_chains = hweight32(tx_ant);
8258 
8259 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RX_CHAIN_MASK,
8260 					rx_ant, ar->pdev->pdev_id);
8261 	if (ret) {
8262 		ath12k_warn(ar->ab, "failed to set rx-chainmask: %d, req 0x%x\n",
8263 			    ret, rx_ant);
8264 		return ret;
8265 	}
8266 
8267 	ar->num_rx_chains = hweight32(rx_ant);
8268 
8269 	/* Reload HT/VHT/HE capability */
8270 	ath12k_mac_setup_ht_vht_cap(ar, &ar->pdev->cap, NULL);
8271 	ath12k_mac_setup_sband_iftype_data(ar, &ar->pdev->cap);
8272 
8273 	return 0;
8274 }
8275 
ath12k_mgmt_over_wmi_tx_drop(struct ath12k * ar,struct sk_buff * skb)8276 static void ath12k_mgmt_over_wmi_tx_drop(struct ath12k *ar, struct sk_buff *skb)
8277 {
8278 	int num_mgmt;
8279 
8280 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8281 
8282 	ieee80211_free_txskb(ath12k_ar_to_hw(ar), skb);
8283 
8284 	num_mgmt = atomic_dec_if_positive(&ar->num_pending_mgmt_tx);
8285 
8286 	if (num_mgmt < 0)
8287 		WARN_ON_ONCE(1);
8288 
8289 	if (!num_mgmt)
8290 		wake_up(&ar->txmgmt_empty_waitq);
8291 }
8292 
ath12k_mac_tx_mgmt_pending_free(int buf_id,void * skb,void * ctx)8293 int ath12k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx)
8294 {
8295 	struct sk_buff *msdu = skb;
8296 	struct ieee80211_tx_info *info;
8297 	struct ath12k *ar = ctx;
8298 	struct ath12k_base *ab = ar->ab;
8299 
8300 	spin_lock_bh(&ar->txmgmt_idr_lock);
8301 	idr_remove(&ar->txmgmt_idr, buf_id);
8302 	spin_unlock_bh(&ar->txmgmt_idr_lock);
8303 	dma_unmap_single(ab->dev, ATH12K_SKB_CB(msdu)->paddr, msdu->len,
8304 			 DMA_TO_DEVICE);
8305 
8306 	info = IEEE80211_SKB_CB(msdu);
8307 	memset(&info->status, 0, sizeof(info->status));
8308 
8309 	ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8310 
8311 	return 0;
8312 }
8313 
ath12k_mac_vif_txmgmt_idr_remove(int buf_id,void * skb,void * ctx)8314 static int ath12k_mac_vif_txmgmt_idr_remove(int buf_id, void *skb, void *ctx)
8315 {
8316 	struct ieee80211_vif *vif = ctx;
8317 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8318 	struct sk_buff *msdu = skb;
8319 	struct ath12k *ar = skb_cb->ar;
8320 	struct ath12k_base *ab = ar->ab;
8321 
8322 	if (skb_cb->vif == vif) {
8323 		spin_lock_bh(&ar->txmgmt_idr_lock);
8324 		idr_remove(&ar->txmgmt_idr, buf_id);
8325 		spin_unlock_bh(&ar->txmgmt_idr_lock);
8326 		dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len,
8327 				 DMA_TO_DEVICE);
8328 	}
8329 
8330 	return 0;
8331 }
8332 
ath12k_mac_mgmt_tx_wmi(struct ath12k * ar,struct ath12k_link_vif * arvif,struct sk_buff * skb)8333 static int ath12k_mac_mgmt_tx_wmi(struct ath12k *ar, struct ath12k_link_vif *arvif,
8334 				  struct sk_buff *skb)
8335 {
8336 	struct ath12k_base *ab = ar->ab;
8337 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8338 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8339 	struct ieee80211_tx_info *info;
8340 	enum hal_encrypt_type enctype;
8341 	unsigned int mic_len;
8342 	dma_addr_t paddr;
8343 	int buf_id;
8344 	int ret;
8345 
8346 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8347 
8348 	skb_cb->ar = ar;
8349 	spin_lock_bh(&ar->txmgmt_idr_lock);
8350 	buf_id = idr_alloc(&ar->txmgmt_idr, skb, 0,
8351 			   ATH12K_TX_MGMT_NUM_PENDING_MAX, GFP_ATOMIC);
8352 	spin_unlock_bh(&ar->txmgmt_idr_lock);
8353 	if (buf_id < 0)
8354 		return -ENOSPC;
8355 
8356 	info = IEEE80211_SKB_CB(skb);
8357 	if ((skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8358 	    !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
8359 		if ((ieee80211_is_action(hdr->frame_control) ||
8360 		     ieee80211_is_deauth(hdr->frame_control) ||
8361 		     ieee80211_is_disassoc(hdr->frame_control)) &&
8362 		     ieee80211_has_protected(hdr->frame_control)) {
8363 			enctype = ath12k_dp_tx_get_encrypt_type(skb_cb->cipher);
8364 			mic_len = ath12k_dp_rx_crypto_mic_len(ar, enctype);
8365 			skb_put(skb, mic_len);
8366 		}
8367 	}
8368 
8369 	paddr = dma_map_single(ab->dev, skb->data, skb->len, DMA_TO_DEVICE);
8370 	if (dma_mapping_error(ab->dev, paddr)) {
8371 		ath12k_warn(ab, "failed to DMA map mgmt Tx buffer\n");
8372 		ret = -EIO;
8373 		goto err_free_idr;
8374 	}
8375 
8376 	skb_cb->paddr = paddr;
8377 
8378 	ret = ath12k_wmi_mgmt_send(arvif, buf_id, skb);
8379 	if (ret) {
8380 		ath12k_warn(ar->ab, "failed to send mgmt frame: %d\n", ret);
8381 		goto err_unmap_buf;
8382 	}
8383 
8384 	return 0;
8385 
8386 err_unmap_buf:
8387 	dma_unmap_single(ab->dev, skb_cb->paddr,
8388 			 skb->len, DMA_TO_DEVICE);
8389 err_free_idr:
8390 	spin_lock_bh(&ar->txmgmt_idr_lock);
8391 	idr_remove(&ar->txmgmt_idr, buf_id);
8392 	spin_unlock_bh(&ar->txmgmt_idr_lock);
8393 
8394 	return ret;
8395 }
8396 
ath12k_mgmt_over_wmi_tx_purge(struct ath12k * ar)8397 static void ath12k_mgmt_over_wmi_tx_purge(struct ath12k *ar)
8398 {
8399 	struct sk_buff *skb;
8400 
8401 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL)
8402 		ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8403 }
8404 
ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8405 static int ath12k_mac_mgmt_action_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8406 						       struct sk_buff *skb)
8407 {
8408 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8409 	u8 category, *buf, iv_len, action_code, dialog_token;
8410 	struct ieee80211_bss_conf *link_conf;
8411 	struct ieee80211_chanctx_conf *conf;
8412 	int cur_tx_power, max_tx_power;
8413 	struct ath12k *ar = arvif->ar;
8414 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
8415 	struct wiphy *wiphy = hw->wiphy;
8416 	struct ath12k_skb_cb *skb_cb;
8417 	struct ieee80211_mgmt *mgmt;
8418 	unsigned int remaining_len;
8419 	bool has_protected;
8420 
8421 	lockdep_assert_wiphy(wiphy);
8422 
8423 	/* make sure category field is present */
8424 	if (skb->len < IEEE80211_MIN_ACTION_SIZE)
8425 		return -EINVAL;
8426 
8427 	remaining_len = skb->len - IEEE80211_MIN_ACTION_SIZE;
8428 	has_protected = ieee80211_has_protected(hdr->frame_control);
8429 
8430 	/* In case of SW crypto and hdr protected (PMF), packet will already be encrypted,
8431 	 * we can't put in data in this case
8432 	 */
8433 	if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8434 	    has_protected)
8435 		return 0;
8436 
8437 	mgmt = (struct ieee80211_mgmt *)hdr;
8438 	buf = (u8 *)&mgmt->u.action;
8439 
8440 	/* FCTL_PROTECTED frame might have extra space added for HDR_LEN. Offset that
8441 	 * many bytes if it is there
8442 	 */
8443 	if (has_protected) {
8444 		skb_cb = ATH12K_SKB_CB(skb);
8445 
8446 		switch (skb_cb->cipher) {
8447 		/* Cipher suite having flag %IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set in
8448 		 * key needs to be processed. See ath12k_install_key()
8449 		 */
8450 		case WLAN_CIPHER_SUITE_CCMP:
8451 		case WLAN_CIPHER_SUITE_CCMP_256:
8452 		case WLAN_CIPHER_SUITE_GCMP:
8453 		case WLAN_CIPHER_SUITE_GCMP_256:
8454 			iv_len = IEEE80211_CCMP_HDR_LEN;
8455 			break;
8456 		case WLAN_CIPHER_SUITE_TKIP:
8457 			iv_len = 0;
8458 			break;
8459 		default:
8460 			return -EINVAL;
8461 		}
8462 
8463 		if (remaining_len < iv_len)
8464 			return -EINVAL;
8465 
8466 		buf += iv_len;
8467 		remaining_len -= iv_len;
8468 	}
8469 
8470 	category = *buf++;
8471 	/* category code is already taken care in %IEEE80211_MIN_ACTION_SIZE hence
8472 	 * no need to adjust remaining_len
8473 	 */
8474 
8475 	switch (category) {
8476 	case WLAN_CATEGORY_RADIO_MEASUREMENT:
8477 		/* need action code and dialog token */
8478 		if (remaining_len < 2)
8479 			return -EINVAL;
8480 
8481 		/* Packet Format:
8482 		 *	Action Code | Dialog Token | Variable Len (based on Action Code)
8483 		 */
8484 		action_code = *buf++;
8485 		dialog_token = *buf++;
8486 		remaining_len -= 2;
8487 
8488 		link_conf = ath12k_mac_get_link_bss_conf(arvif);
8489 		if (!link_conf) {
8490 			ath12k_warn(ar->ab,
8491 				    "failed to get bss link conf for vdev %d in RM handling\n",
8492 				    arvif->vdev_id);
8493 			return -EINVAL;
8494 		}
8495 
8496 		conf = wiphy_dereference(wiphy, link_conf->chanctx_conf);
8497 		if (!conf)
8498 			return -ENOENT;
8499 
8500 		cur_tx_power = link_conf->txpower;
8501 		max_tx_power = min(conf->def.chan->max_reg_power,
8502 				   (int)ar->max_tx_power / 2);
8503 
8504 		ath12k_mac_op_get_txpower(hw, arvif->ahvif->vif, arvif->link_id,
8505 					  &cur_tx_power);
8506 
8507 		switch (action_code) {
8508 		case WLAN_RM_ACTION_LINK_MEASUREMENT_REQUEST:
8509 			/* need variable fields to be present in len */
8510 			if (remaining_len < 2)
8511 				return -EINVAL;
8512 
8513 			/* Variable length format as defined in IEEE 802.11-2024,
8514 			 * Figure 9-1187-Link Measurement Request frame Action field
8515 			 * format.
8516 			 *	Transmit Power | Max Tx Power
8517 			 * We fill both of these.
8518 			 */
8519 			*buf++ = cur_tx_power;
8520 			*buf = max_tx_power;
8521 
8522 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8523 				   "RRM: Link Measurement Req dialog_token %u cur_tx_power %d max_tx_power %d\n",
8524 				   dialog_token, cur_tx_power, max_tx_power);
8525 			break;
8526 		case WLAN_RM_ACTION_LINK_MEASUREMENT_REPORT:
8527 			/* need variable fields to be present in len */
8528 			if (remaining_len < 3)
8529 				return -EINVAL;
8530 
8531 			/* Variable length format as defined in IEEE 802.11-2024,
8532 			 * Figure 9-1188-Link Measurement Report frame Action field format
8533 			 *	TPC Report | Variable Fields
8534 			 *
8535 			 * TPC Report Format:
8536 			 *	Element ID | Len | Tx Power | Link Margin
8537 			 *
8538 			 * We fill Tx power in the TPC Report (2nd index)
8539 			 */
8540 			buf[2] = cur_tx_power;
8541 
8542 			/* TODO: At present, Link margin data is not present so can't
8543 			 * really fill it now. Once it is available, it can be added
8544 			 * here
8545 			 */
8546 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8547 				   "RRM: Link Measurement Report dialog_token %u cur_tx_power %d\n",
8548 				   dialog_token, cur_tx_power);
8549 			break;
8550 		default:
8551 			return -EINVAL;
8552 		}
8553 		break;
8554 	default:
8555 		/* nothing to fill */
8556 		return 0;
8557 	}
8558 
8559 	return 0;
8560 }
8561 
ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif * arvif,struct sk_buff * skb)8562 static int ath12k_mac_mgmt_frame_fill_elem_data(struct ath12k_link_vif *arvif,
8563 						struct sk_buff *skb)
8564 {
8565 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8566 
8567 	if (!ieee80211_is_action(hdr->frame_control))
8568 		return 0;
8569 
8570 	return ath12k_mac_mgmt_action_frame_fill_elem_data(arvif, skb);
8571 }
8572 
ath12k_mgmt_over_wmi_tx_work(struct wiphy * wiphy,struct wiphy_work * work)8573 static void ath12k_mgmt_over_wmi_tx_work(struct wiphy *wiphy, struct wiphy_work *work)
8574 {
8575 	struct ath12k *ar = container_of(work, struct ath12k, wmi_mgmt_tx_work);
8576 	struct ath12k_hw *ah = ar->ah;
8577 	struct ath12k_skb_cb *skb_cb;
8578 	struct ath12k_vif *ahvif;
8579 	struct ath12k_link_vif *arvif;
8580 	struct sk_buff *skb;
8581 	int ret;
8582 
8583 	lockdep_assert_wiphy(wiphy);
8584 
8585 	while ((skb = skb_dequeue(&ar->wmi_mgmt_tx_queue)) != NULL) {
8586 		skb_cb = ATH12K_SKB_CB(skb);
8587 		if (!skb_cb->vif) {
8588 			ath12k_warn(ar->ab, "no vif found for mgmt frame\n");
8589 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8590 			continue;
8591 		}
8592 
8593 		ahvif = ath12k_vif_to_ahvif(skb_cb->vif);
8594 		if (!(ahvif->links_map & BIT(skb_cb->link_id))) {
8595 			ath12k_warn(ar->ab,
8596 				    "invalid linkid %u in mgmt over wmi tx with linkmap 0x%x\n",
8597 				    skb_cb->link_id, ahvif->links_map);
8598 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8599 			continue;
8600 		}
8601 
8602 		arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[skb_cb->link_id]);
8603 		if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) {
8604 			/* Fill in the data which is required to be filled by the driver
8605 			 * For example: Max Tx power in Link Measurement Request/Report
8606 			 */
8607 			ret = ath12k_mac_mgmt_frame_fill_elem_data(arvif, skb);
8608 			if (ret) {
8609 				/* If we couldn't fill the data due to any reason,
8610 				 * let's not discard transmitting the packet.
8611 				 * For example: Software crypto and PMF case
8612 				 */
8613 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8614 					   "Failed to fill the required data for the mgmt packet err %d\n",
8615 					   ret);
8616 			}
8617 
8618 			ret = ath12k_mac_mgmt_tx_wmi(ar, arvif, skb);
8619 			if (ret) {
8620 				ath12k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n",
8621 					    arvif->vdev_id, ret);
8622 				ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8623 			}
8624 		} else {
8625 			ath12k_warn(ar->ab,
8626 				    "dropping mgmt frame for vdev %d link %u is_started %d\n",
8627 				    arvif->vdev_id,
8628 				    skb_cb->link_id,
8629 				    arvif->is_started);
8630 			ath12k_mgmt_over_wmi_tx_drop(ar, skb);
8631 		}
8632 	}
8633 }
8634 
ath12k_mac_mgmt_tx(struct ath12k * ar,struct sk_buff * skb,bool is_prb_rsp)8635 static int ath12k_mac_mgmt_tx(struct ath12k *ar, struct sk_buff *skb,
8636 			      bool is_prb_rsp)
8637 {
8638 	struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue;
8639 
8640 	if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
8641 		return -ESHUTDOWN;
8642 
8643 	/* Drop probe response packets when the pending management tx
8644 	 * count has reached a certain threshold, so as to prioritize
8645 	 * other mgmt packets like auth and assoc to be sent on time
8646 	 * for establishing successful connections.
8647 	 */
8648 	if (is_prb_rsp &&
8649 	    atomic_read(&ar->num_pending_mgmt_tx) > ATH12K_PRB_RSP_DROP_THRESHOLD) {
8650 		ath12k_warn(ar->ab,
8651 			    "dropping probe response as pending queue is almost full\n");
8652 		return -ENOSPC;
8653 	}
8654 
8655 	if (skb_queue_len_lockless(q) >= ATH12K_TX_MGMT_NUM_PENDING_MAX) {
8656 		ath12k_warn(ar->ab, "mgmt tx queue is full\n");
8657 		return -ENOSPC;
8658 	}
8659 
8660 	skb_queue_tail(q, skb);
8661 	atomic_inc(&ar->num_pending_mgmt_tx);
8662 	wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8663 
8664 	return 0;
8665 }
8666 
ath12k_mac_add_p2p_noa_ie(struct ath12k * ar,struct ieee80211_vif * vif,struct sk_buff * skb,bool is_prb_rsp)8667 static void ath12k_mac_add_p2p_noa_ie(struct ath12k *ar,
8668 				      struct ieee80211_vif *vif,
8669 				      struct sk_buff *skb,
8670 				      bool is_prb_rsp)
8671 {
8672 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8673 
8674 	if (likely(!is_prb_rsp))
8675 		return;
8676 
8677 	spin_lock_bh(&ar->data_lock);
8678 
8679 	if (ahvif->u.ap.noa_data &&
8680 	    !pskb_expand_head(skb, 0, ahvif->u.ap.noa_len,
8681 			      GFP_ATOMIC))
8682 		skb_put_data(skb, ahvif->u.ap.noa_data,
8683 			     ahvif->u.ap.noa_len);
8684 
8685 	spin_unlock_bh(&ar->data_lock);
8686 }
8687 
8688 /* Note: called under rcu_read_lock() */
ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif * vif,u8 link_id,struct sk_buff * skb,u32 info_flags)8689 static void ath12k_mlo_mcast_update_tx_link_address(struct ieee80211_vif *vif,
8690 						    u8 link_id, struct sk_buff *skb,
8691 						    u32 info_flags)
8692 {
8693 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8694 	struct ieee80211_bss_conf *bss_conf;
8695 
8696 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8697 		return;
8698 
8699 	bss_conf = rcu_dereference(vif->link_conf[link_id]);
8700 	if (bss_conf)
8701 		ether_addr_copy(hdr->addr2, bss_conf->addr);
8702 }
8703 
8704 /* Note: called under rcu_read_lock() */
ath12k_mac_get_tx_link(struct ieee80211_sta * sta,struct ieee80211_vif * vif,u8 link,struct sk_buff * skb,u32 info_flags)8705 static u8 ath12k_mac_get_tx_link(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
8706 				 u8 link, struct sk_buff *skb, u32 info_flags)
8707 {
8708 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8709 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8710 	struct ieee80211_link_sta *link_sta;
8711 	struct ieee80211_bss_conf *bss_conf;
8712 	struct ath12k_sta *ahsta;
8713 
8714 	/* Use the link id passed or the default vif link */
8715 	if (!sta) {
8716 		if (link != IEEE80211_LINK_UNSPECIFIED)
8717 			return link;
8718 
8719 		return ahvif->deflink.link_id;
8720 	}
8721 
8722 	ahsta = ath12k_sta_to_ahsta(sta);
8723 
8724 	/* Below translation ensures we pass proper A2 & A3 for non ML clients.
8725 	 * Also it assumes for now support only for MLO AP in this path
8726 	 */
8727 	if (!sta->mlo) {
8728 		link = ahsta->deflink.link_id;
8729 
8730 		if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
8731 			return link;
8732 
8733 		bss_conf = rcu_dereference(vif->link_conf[link]);
8734 		if (bss_conf) {
8735 			ether_addr_copy(hdr->addr2, bss_conf->addr);
8736 			if (!ieee80211_has_tods(hdr->frame_control) &&
8737 			    !ieee80211_has_fromds(hdr->frame_control))
8738 				ether_addr_copy(hdr->addr3, bss_conf->addr);
8739 		}
8740 
8741 		return link;
8742 	}
8743 
8744 	/* enqueue eth enacap & data frames on primary link, FW does link
8745 	 * selection and address translation.
8746 	 */
8747 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
8748 	    ieee80211_is_data(hdr->frame_control))
8749 		return ahsta->assoc_link_id;
8750 
8751 	/* 802.11 frame cases */
8752 	if (link == IEEE80211_LINK_UNSPECIFIED)
8753 		link = ahsta->deflink.link_id;
8754 
8755 	if (!ieee80211_is_mgmt(hdr->frame_control))
8756 		return link;
8757 
8758 	/* Perform address conversion for ML STA Tx */
8759 	bss_conf = rcu_dereference(vif->link_conf[link]);
8760 	link_sta = rcu_dereference(sta->link[link]);
8761 
8762 	if (bss_conf && link_sta) {
8763 		ether_addr_copy(hdr->addr1, link_sta->addr);
8764 		ether_addr_copy(hdr->addr2, bss_conf->addr);
8765 
8766 		if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8767 			ether_addr_copy(hdr->addr3, bss_conf->bssid);
8768 		else if (vif->type == NL80211_IFTYPE_AP)
8769 			ether_addr_copy(hdr->addr3, bss_conf->addr);
8770 
8771 		return link;
8772 	}
8773 
8774 	if (bss_conf) {
8775 		/* In certain cases where a ML sta associated and added subset of
8776 		 * links on which the ML AP is active, but now sends some frame
8777 		 * (ex. Probe request) on a different link which is active in our
8778 		 * MLD but was not added during previous association, we can
8779 		 * still honor the Tx to that ML STA via the requested link.
8780 		 * The control would reach here in such case only when that link
8781 		 * address is same as the MLD address or in worst case clients
8782 		 * used MLD address at TA wrongly which would have helped
8783 		 * identify the ML sta object and pass it here.
8784 		 * If the link address of that STA is different from MLD address,
8785 		 * then the sta object would be NULL and control won't reach
8786 		 * here but return at the start of the function itself with !sta
8787 		 * check. Also this would not need any translation at hdr->addr1
8788 		 * from MLD to link address since the RA is the MLD address
8789 		 * (same as that link address ideally) already.
8790 		 */
8791 		ether_addr_copy(hdr->addr2, bss_conf->addr);
8792 
8793 		if (vif->type == NL80211_IFTYPE_STATION && bss_conf->bssid)
8794 			ether_addr_copy(hdr->addr3, bss_conf->bssid);
8795 		else if (vif->type == NL80211_IFTYPE_AP)
8796 			ether_addr_copy(hdr->addr3, bss_conf->addr);
8797 	}
8798 
8799 	return link;
8800 }
8801 
8802 /* Note: called under rcu_read_lock() */
ath12k_mac_op_tx(struct ieee80211_hw * hw,struct ieee80211_tx_control * control,struct sk_buff * skb)8803 static void ath12k_mac_op_tx(struct ieee80211_hw *hw,
8804 			     struct ieee80211_tx_control *control,
8805 			     struct sk_buff *skb)
8806 {
8807 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
8808 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
8809 	struct ieee80211_vif *vif = info->control.vif;
8810 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
8811 	struct ath12k_link_vif *arvif = &ahvif->deflink;
8812 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
8813 	struct ieee80211_key_conf *key = info->control.hw_key;
8814 	struct ieee80211_sta *sta = control->sta;
8815 	struct ath12k_link_vif *tmp_arvif;
8816 	u32 info_flags = info->flags;
8817 	struct sk_buff *msdu_copied;
8818 	struct ath12k *ar, *tmp_ar;
8819 	struct ath12k_peer *peer;
8820 	unsigned long links_map;
8821 	bool is_mcast = false;
8822 	bool is_dvlan = false;
8823 	struct ethhdr *eth;
8824 	bool is_prb_rsp;
8825 	u16 mcbc_gsn;
8826 	u8 link_id;
8827 	int ret;
8828 
8829 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
8830 		ieee80211_free_txskb(hw, skb);
8831 		return;
8832 	}
8833 
8834 	link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
8835 	memset(skb_cb, 0, sizeof(*skb_cb));
8836 	skb_cb->vif = vif;
8837 
8838 	if (key) {
8839 		skb_cb->cipher = key->cipher;
8840 		skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8841 	}
8842 
8843 	/* handle only for MLO case, use deflink for non MLO case */
8844 	if (ieee80211_vif_is_mld(vif)) {
8845 		link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags);
8846 		if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
8847 			ieee80211_free_txskb(hw, skb);
8848 			return;
8849 		}
8850 	} else {
8851 		link_id = 0;
8852 	}
8853 
8854 	arvif = rcu_dereference(ahvif->link[link_id]);
8855 	if (!arvif || !arvif->ar) {
8856 		ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission",
8857 			    link_id);
8858 		ieee80211_free_txskb(hw, skb);
8859 		return;
8860 	}
8861 
8862 	ar = arvif->ar;
8863 	skb_cb->link_id = link_id;
8864 	is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
8865 
8866 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
8867 		eth = (struct ethhdr *)skb->data;
8868 		is_mcast = is_multicast_ether_addr(eth->h_dest);
8869 
8870 		skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
8871 	} else if (ieee80211_is_mgmt(hdr->frame_control)) {
8872 		if (sta && sta->mlo)
8873 			skb_cb->flags |= ATH12K_SKB_MLO_STA;
8874 
8875 		ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
8876 		if (ret) {
8877 			ath12k_warn(ar->ab, "failed to queue management frame %d\n",
8878 				    ret);
8879 			ieee80211_free_txskb(hw, skb);
8880 		}
8881 		return;
8882 	}
8883 
8884 	if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
8885 		is_mcast = is_multicast_ether_addr(hdr->addr1);
8886 
8887 	/* This is case only for P2P_GO */
8888 	if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
8889 		ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
8890 
8891 	/* Checking if it is a DVLAN frame */
8892 	if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
8893 	    !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
8894 	    !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
8895 	    ieee80211_has_protected(hdr->frame_control))
8896 		is_dvlan = true;
8897 
8898 	if (!vif->valid_links || !is_mcast || is_dvlan ||
8899 	    (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
8900 	    test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
8901 		ret = ath12k_dp_tx(ar, arvif, skb, false, 0, is_mcast);
8902 		if (unlikely(ret)) {
8903 			ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
8904 			ieee80211_free_txskb(ar->ah->hw, skb);
8905 			return;
8906 		}
8907 	} else {
8908 		mcbc_gsn = atomic_inc_return(&ahvif->mcbc_gsn) & 0xfff;
8909 
8910 		links_map = ahvif->links_map;
8911 		for_each_set_bit(link_id, &links_map,
8912 				 IEEE80211_MLD_MAX_NUM_LINKS) {
8913 			tmp_arvif = rcu_dereference(ahvif->link[link_id]);
8914 			if (!tmp_arvif || !tmp_arvif->is_up)
8915 				continue;
8916 
8917 			tmp_ar = tmp_arvif->ar;
8918 			msdu_copied = skb_copy(skb, GFP_ATOMIC);
8919 			if (!msdu_copied) {
8920 				ath12k_err(ar->ab,
8921 					   "skb copy failure link_id 0x%X vdevid 0x%X\n",
8922 					   link_id, tmp_arvif->vdev_id);
8923 				continue;
8924 			}
8925 
8926 			ath12k_mlo_mcast_update_tx_link_address(vif, link_id,
8927 								msdu_copied,
8928 								info_flags);
8929 
8930 			skb_cb = ATH12K_SKB_CB(msdu_copied);
8931 			skb_cb->link_id = link_id;
8932 
8933 			/* For open mode, skip peer find logic */
8934 			if (unlikely(!ahvif->key_cipher))
8935 				goto skip_peer_find;
8936 
8937 			spin_lock_bh(&tmp_ar->ab->base_lock);
8938 			peer = ath12k_peer_find_by_addr(tmp_ar->ab, tmp_arvif->bssid);
8939 			if (!peer) {
8940 				spin_unlock_bh(&tmp_ar->ab->base_lock);
8941 				ath12k_warn(tmp_ar->ab,
8942 					    "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n",
8943 					    tmp_arvif->vdev_id, tmp_arvif->bssid,
8944 					    ahvif->links_map);
8945 				dev_kfree_skb_any(msdu_copied);
8946 				continue;
8947 			}
8948 
8949 			key = peer->keys[peer->mcast_keyidx];
8950 			if (key) {
8951 				skb_cb->cipher = key->cipher;
8952 				skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
8953 
8954 				hdr = (struct ieee80211_hdr *)msdu_copied->data;
8955 				if (!ieee80211_has_protected(hdr->frame_control))
8956 					hdr->frame_control |=
8957 						cpu_to_le16(IEEE80211_FCTL_PROTECTED);
8958 			}
8959 			spin_unlock_bh(&tmp_ar->ab->base_lock);
8960 
8961 skip_peer_find:
8962 			ret = ath12k_dp_tx(tmp_ar, tmp_arvif,
8963 					   msdu_copied, true, mcbc_gsn, is_mcast);
8964 			if (unlikely(ret)) {
8965 				if (ret == -ENOMEM) {
8966 					/* Drops are expected during heavy multicast
8967 					 * frame flood. Print with debug log
8968 					 * level to avoid lot of console prints
8969 					 */
8970 					ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
8971 						   "failed to transmit frame %d\n",
8972 						   ret);
8973 				} else {
8974 					ath12k_warn(ar->ab,
8975 						    "failed to transmit frame %d\n",
8976 						    ret);
8977 				}
8978 
8979 				dev_kfree_skb_any(msdu_copied);
8980 			}
8981 		}
8982 		ieee80211_free_txskb(ar->ah->hw, skb);
8983 	}
8984 }
8985 
ath12k_mac_drain_tx(struct ath12k * ar)8986 void ath12k_mac_drain_tx(struct ath12k *ar)
8987 {
8988 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
8989 
8990 	/* make sure rcu-protected mac80211 tx path itself is drained */
8991 	synchronize_net();
8992 
8993 	wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->wmi_mgmt_tx_work);
8994 	ath12k_mgmt_over_wmi_tx_purge(ar);
8995 }
8996 
ath12k_mac_config_mon_status_default(struct ath12k * ar,bool enable)8997 static int ath12k_mac_config_mon_status_default(struct ath12k *ar, bool enable)
8998 {
8999 	struct htt_rx_ring_tlv_filter tlv_filter = {};
9000 	struct ath12k_base *ab = ar->ab;
9001 	u32 ring_id, i;
9002 	int ret = 0;
9003 
9004 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9005 
9006 	if (!ab->hw_params->rxdma1_enable)
9007 		return ret;
9008 
9009 	if (enable) {
9010 		tlv_filter = ath12k_mac_mon_status_filter_default;
9011 
9012 		if (ath12k_debugfs_rx_filter(ar))
9013 			tlv_filter.rx_filter = ath12k_debugfs_rx_filter(ar);
9014 	} else {
9015 		tlv_filter.rxmon_disable = true;
9016 	}
9017 
9018 	for (i = 0; i < ab->hw_params->num_rxdma_per_pdev; i++) {
9019 		ring_id = ar->dp.rxdma_mon_dst_ring[i].ring_id;
9020 		ret = ath12k_dp_tx_htt_rx_filter_setup(ab, ring_id,
9021 						       ar->dp.mac_id + i,
9022 						       HAL_RXDMA_MONITOR_DST,
9023 						       DP_RXDMA_REFILL_RING_SIZE,
9024 						       &tlv_filter);
9025 		if (ret) {
9026 			ath12k_err(ab,
9027 				   "failed to setup filter for monitor buf %d\n",
9028 				   ret);
9029 		}
9030 	}
9031 
9032 	return ret;
9033 }
9034 
ath12k_mac_start(struct ath12k * ar)9035 static int ath12k_mac_start(struct ath12k *ar)
9036 {
9037 	struct ath12k_hw *ah = ar->ah;
9038 	struct ath12k_base *ab = ar->ab;
9039 	struct ath12k_pdev *pdev = ar->pdev;
9040 	int ret;
9041 
9042 	lockdep_assert_held(&ah->hw_mutex);
9043 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9044 
9045 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_PMF_QOS,
9046 					1, pdev->pdev_id);
9047 
9048 	if (ret) {
9049 		ath12k_err(ab, "failed to enable PMF QOS: %d\n", ret);
9050 		goto err;
9051 	}
9052 
9053 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_DYNAMIC_BW, 1,
9054 					pdev->pdev_id);
9055 	if (ret) {
9056 		ath12k_err(ab, "failed to enable dynamic bw: %d\n", ret);
9057 		goto err;
9058 	}
9059 
9060 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
9061 					0, pdev->pdev_id);
9062 	if (ret) {
9063 		ath12k_err(ab, "failed to set ac override for ARP: %d\n",
9064 			   ret);
9065 		goto err;
9066 	}
9067 
9068 	ret = ath12k_wmi_send_dfs_phyerr_offload_enable_cmd(ar, pdev->pdev_id);
9069 	if (ret) {
9070 		ath12k_err(ab, "failed to offload radar detection: %d\n",
9071 			   ret);
9072 		goto err;
9073 	}
9074 
9075 	ret = ath12k_dp_tx_htt_h2t_ppdu_stats_req(ar,
9076 						  HTT_PPDU_STATS_TAG_DEFAULT);
9077 	if (ret) {
9078 		ath12k_err(ab, "failed to req ppdu stats: %d\n", ret);
9079 		goto err;
9080 	}
9081 
9082 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
9083 					1, pdev->pdev_id);
9084 
9085 	if (ret) {
9086 		ath12k_err(ab, "failed to enable MESH MCAST ENABLE: (%d\n", ret);
9087 		goto err;
9088 	}
9089 
9090 	__ath12k_set_antenna(ar, ar->cfg_tx_chainmask, ar->cfg_rx_chainmask);
9091 
9092 	/* TODO: Do we need to enable ANI? */
9093 
9094 	ret = ath12k_reg_update_chan_list(ar, false);
9095 
9096 	/* The ar state alone can be turned off for non supported country
9097 	 * without returning the error value. As we need to update the channel
9098 	 * for the next ar.
9099 	 */
9100 	if (ret) {
9101 		if (ret == -EINVAL)
9102 			ret = 0;
9103 		goto err;
9104 	}
9105 
9106 	ar->num_started_vdevs = 0;
9107 	ar->num_created_vdevs = 0;
9108 	ar->num_peers = 0;
9109 	ar->allocated_vdev_map = 0;
9110 	ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
9111 
9112 	/* Configure monitor status ring with default rx_filter to get rx status
9113 	 * such as rssi, rx_duration.
9114 	 */
9115 	ret = ath12k_mac_config_mon_status_default(ar, true);
9116 	if (ret && (ret != -EOPNOTSUPP)) {
9117 		ath12k_err(ab, "failed to configure monitor status ring with default rx_filter: (%d)\n",
9118 			   ret);
9119 		goto err;
9120 	}
9121 
9122 	if (ret == -EOPNOTSUPP)
9123 		ath12k_dbg(ab, ATH12K_DBG_MAC,
9124 			   "monitor status config is not yet supported");
9125 
9126 	/* Configure the hash seed for hash based reo dest ring selection */
9127 	ath12k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id);
9128 
9129 	/* allow device to enter IMPS */
9130 	if (ab->hw_params->idle_ps) {
9131 		ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG,
9132 						1, pdev->pdev_id);
9133 		if (ret) {
9134 			ath12k_err(ab, "failed to enable idle ps: %d\n", ret);
9135 			goto err;
9136 		}
9137 	}
9138 
9139 	rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx],
9140 			   &ab->pdevs[ar->pdev_idx]);
9141 
9142 	return 0;
9143 err:
9144 
9145 	return ret;
9146 }
9147 
ath12k_drain_tx(struct ath12k_hw * ah)9148 static void ath12k_drain_tx(struct ath12k_hw *ah)
9149 {
9150 	struct ath12k *ar;
9151 	int i;
9152 
9153 	lockdep_assert_wiphy(ah->hw->wiphy);
9154 
9155 	for_each_ar(ah, ar, i)
9156 		ath12k_mac_drain_tx(ar);
9157 }
9158 
ath12k_mac_op_start(struct ieee80211_hw * hw)9159 static int ath12k_mac_op_start(struct ieee80211_hw *hw)
9160 {
9161 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9162 	struct ath12k *ar;
9163 	int ret, i;
9164 
9165 	if (ath12k_ftm_mode)
9166 		return -EPERM;
9167 
9168 	lockdep_assert_wiphy(hw->wiphy);
9169 
9170 	ath12k_drain_tx(ah);
9171 
9172 	guard(mutex)(&ah->hw_mutex);
9173 
9174 	switch (ah->state) {
9175 	case ATH12K_HW_STATE_OFF:
9176 		ah->state = ATH12K_HW_STATE_ON;
9177 		break;
9178 	case ATH12K_HW_STATE_RESTARTING:
9179 		ah->state = ATH12K_HW_STATE_RESTARTED;
9180 		break;
9181 	case ATH12K_HW_STATE_RESTARTED:
9182 	case ATH12K_HW_STATE_WEDGED:
9183 	case ATH12K_HW_STATE_ON:
9184 	case ATH12K_HW_STATE_TM:
9185 		ah->state = ATH12K_HW_STATE_OFF;
9186 
9187 		WARN_ON(1);
9188 		return -EINVAL;
9189 	}
9190 
9191 	for_each_ar(ah, ar, i) {
9192 		ret = ath12k_mac_start(ar);
9193 		if (ret) {
9194 			ah->state = ATH12K_HW_STATE_OFF;
9195 
9196 			ath12k_err(ar->ab, "fail to start mac operations in pdev idx %d ret %d\n",
9197 				   ar->pdev_idx, ret);
9198 			goto fail_start;
9199 		}
9200 	}
9201 
9202 	return 0;
9203 
9204 fail_start:
9205 	for (; i > 0; i--) {
9206 		ar = ath12k_ah_to_ar(ah, i - 1);
9207 		ath12k_mac_stop(ar);
9208 	}
9209 
9210 	return ret;
9211 }
9212 
ath12k_mac_rfkill_config(struct ath12k * ar)9213 int ath12k_mac_rfkill_config(struct ath12k *ar)
9214 {
9215 	struct ath12k_base *ab = ar->ab;
9216 	u32 param;
9217 	int ret;
9218 
9219 	if (ab->hw_params->rfkill_pin == 0)
9220 		return -EOPNOTSUPP;
9221 
9222 	ath12k_dbg(ab, ATH12K_DBG_MAC,
9223 		   "mac rfkill_pin %d rfkill_cfg %d rfkill_on_level %d",
9224 		   ab->hw_params->rfkill_pin, ab->hw_params->rfkill_cfg,
9225 		   ab->hw_params->rfkill_on_level);
9226 
9227 	param = u32_encode_bits(ab->hw_params->rfkill_on_level,
9228 				WMI_RFKILL_CFG_RADIO_LEVEL) |
9229 		u32_encode_bits(ab->hw_params->rfkill_pin,
9230 				WMI_RFKILL_CFG_GPIO_PIN_NUM) |
9231 		u32_encode_bits(ab->hw_params->rfkill_cfg,
9232 				WMI_RFKILL_CFG_PIN_AS_GPIO);
9233 
9234 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_HW_RFKILL_CONFIG,
9235 					param, ar->pdev->pdev_id);
9236 	if (ret) {
9237 		ath12k_warn(ab,
9238 			    "failed to set rfkill config 0x%x: %d\n",
9239 			    param, ret);
9240 		return ret;
9241 	}
9242 
9243 	return 0;
9244 }
9245 
ath12k_mac_rfkill_enable_radio(struct ath12k * ar,bool enable)9246 int ath12k_mac_rfkill_enable_radio(struct ath12k *ar, bool enable)
9247 {
9248 	enum wmi_rfkill_enable_radio param;
9249 	int ret;
9250 
9251 	if (enable)
9252 		param = WMI_RFKILL_ENABLE_RADIO_ON;
9253 	else
9254 		param = WMI_RFKILL_ENABLE_RADIO_OFF;
9255 
9256 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac %d rfkill enable %d",
9257 		   ar->pdev_idx, param);
9258 
9259 	ret = ath12k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_RFKILL_ENABLE,
9260 					param, ar->pdev->pdev_id);
9261 	if (ret) {
9262 		ath12k_warn(ar->ab, "failed to set rfkill enable param %d: %d\n",
9263 			    param, ret);
9264 		return ret;
9265 	}
9266 
9267 	return 0;
9268 }
9269 
ath12k_mac_stop(struct ath12k * ar)9270 static void ath12k_mac_stop(struct ath12k *ar)
9271 {
9272 	struct ath12k_hw *ah = ar->ah;
9273 	struct htt_ppdu_stats_info *ppdu_stats, *tmp;
9274 	struct ath12k_wmi_scan_chan_list_arg *arg;
9275 	int ret;
9276 
9277 	lockdep_assert_held(&ah->hw_mutex);
9278 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9279 
9280 	ret = ath12k_mac_config_mon_status_default(ar, false);
9281 	if (ret && (ret != -EOPNOTSUPP))
9282 		ath12k_err(ar->ab, "failed to clear rx_filter for monitor status ring: (%d)\n",
9283 			   ret);
9284 
9285 	clear_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
9286 
9287 	cancel_delayed_work_sync(&ar->scan.timeout);
9288 	wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, &ar->scan.vdev_clean_wk);
9289 	cancel_work_sync(&ar->regd_channel_update_work);
9290 	cancel_work_sync(&ar->regd_update_work);
9291 	cancel_work_sync(&ar->ab->rfkill_work);
9292 	cancel_work_sync(&ar->ab->update_11d_work);
9293 	ar->state_11d = ATH12K_11D_IDLE;
9294 	complete(&ar->completed_11d_scan);
9295 
9296 	spin_lock_bh(&ar->data_lock);
9297 
9298 	list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, list) {
9299 		list_del(&ppdu_stats->list);
9300 		kfree(ppdu_stats);
9301 	}
9302 
9303 	while ((arg = list_first_entry_or_null(&ar->regd_channel_update_queue,
9304 					       struct ath12k_wmi_scan_chan_list_arg,
9305 					       list))) {
9306 		list_del(&arg->list);
9307 		kfree(arg);
9308 	}
9309 	spin_unlock_bh(&ar->data_lock);
9310 
9311 	rcu_assign_pointer(ar->ab->pdevs_active[ar->pdev_idx], NULL);
9312 
9313 	synchronize_rcu();
9314 
9315 	atomic_set(&ar->num_pending_mgmt_tx, 0);
9316 }
9317 
ath12k_mac_op_stop(struct ieee80211_hw * hw,bool suspend)9318 static void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend)
9319 {
9320 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
9321 	struct ath12k *ar;
9322 	int i;
9323 
9324 	lockdep_assert_wiphy(hw->wiphy);
9325 
9326 	ath12k_drain_tx(ah);
9327 
9328 	mutex_lock(&ah->hw_mutex);
9329 
9330 	ah->state = ATH12K_HW_STATE_OFF;
9331 
9332 	for_each_ar(ah, ar, i)
9333 		ath12k_mac_stop(ar);
9334 
9335 	mutex_unlock(&ah->hw_mutex);
9336 }
9337 
9338 static u8
ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif * arvif)9339 ath12k_mac_get_vdev_stats_id(struct ath12k_link_vif *arvif)
9340 {
9341 	struct ath12k_base *ab = arvif->ar->ab;
9342 	u8 vdev_stats_id = 0;
9343 
9344 	do {
9345 		if (ab->free_vdev_stats_id_map & (1LL << vdev_stats_id)) {
9346 			vdev_stats_id++;
9347 			if (vdev_stats_id >= ATH12K_MAX_VDEV_STATS_ID) {
9348 				vdev_stats_id = ATH12K_INVAL_VDEV_STATS_ID;
9349 				break;
9350 			}
9351 		} else {
9352 			ab->free_vdev_stats_id_map |= (1LL << vdev_stats_id);
9353 			break;
9354 		}
9355 	} while (vdev_stats_id);
9356 
9357 	arvif->vdev_stats_id = vdev_stats_id;
9358 	return vdev_stats_id;
9359 }
9360 
ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif * arvif,u32 * flags,u32 * tx_vdev_id)9361 static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif,
9362 					       u32 *flags, u32 *tx_vdev_id)
9363 {
9364 	struct ath12k_vif *ahvif = arvif->ahvif;
9365 	struct ieee80211_bss_conf *link_conf;
9366 	struct ath12k *ar = arvif->ar;
9367 	struct ath12k_link_vif *tx_arvif;
9368 
9369 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
9370 	if (!link_conf) {
9371 		ath12k_warn(ar->ab, "unable to access bss link conf in set mbssid params for vif %pM link %u\n",
9372 			    ahvif->vif->addr, arvif->link_id);
9373 		return -ENOLINK;
9374 	}
9375 
9376 	tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
9377 	if (!tx_arvif)
9378 		return 0;
9379 
9380 	if (link_conf->nontransmitted) {
9381 		if (ath12k_ar_to_hw(ar)->wiphy !=
9382 		    ath12k_ar_to_hw(tx_arvif->ar)->wiphy)
9383 			return -EINVAL;
9384 
9385 		*flags = WMI_VDEV_MBSSID_FLAGS_NON_TRANSMIT_AP;
9386 		*tx_vdev_id = tx_arvif->vdev_id;
9387 	} else if (tx_arvif == arvif) {
9388 		*flags = WMI_VDEV_MBSSID_FLAGS_TRANSMIT_AP;
9389 	} else {
9390 		return -EINVAL;
9391 	}
9392 
9393 	if (link_conf->ema_ap)
9394 		*flags |= WMI_VDEV_MBSSID_FLAGS_EMA_MODE;
9395 
9396 	return 0;
9397 }
9398 
ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif * arvif,struct ath12k_wmi_vdev_create_arg * arg)9399 static int ath12k_mac_setup_vdev_create_arg(struct ath12k_link_vif *arvif,
9400 					    struct ath12k_wmi_vdev_create_arg *arg)
9401 {
9402 	struct ath12k *ar = arvif->ar;
9403 	struct ath12k_pdev *pdev = ar->pdev;
9404 	struct ath12k_vif *ahvif = arvif->ahvif;
9405 	int ret;
9406 
9407 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9408 
9409 	arg->if_id = arvif->vdev_id;
9410 	arg->type = ahvif->vdev_type;
9411 	arg->subtype = ahvif->vdev_subtype;
9412 	arg->pdev_id = pdev->pdev_id;
9413 
9414 	arg->mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
9415 	arg->mbssid_tx_vdev_id = 0;
9416 	if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
9417 		      ar->ab->wmi_ab.svc_map)) {
9418 		ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
9419 							  &arg->mbssid_flags,
9420 							  &arg->mbssid_tx_vdev_id);
9421 		if (ret)
9422 			return ret;
9423 	}
9424 
9425 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
9426 		arg->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains;
9427 		arg->chains[NL80211_BAND_2GHZ].rx = ar->num_rx_chains;
9428 	}
9429 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
9430 		arg->chains[NL80211_BAND_5GHZ].tx = ar->num_tx_chains;
9431 		arg->chains[NL80211_BAND_5GHZ].rx = ar->num_rx_chains;
9432 	}
9433 	if (pdev->cap.supported_bands & WMI_HOST_WLAN_5GHZ_CAP &&
9434 	    ar->supports_6ghz) {
9435 		arg->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains;
9436 		arg->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains;
9437 	}
9438 
9439 	arg->if_stats_id = ath12k_mac_get_vdev_stats_id(arvif);
9440 
9441 	if (ath12k_mac_is_ml_arvif(arvif)) {
9442 		if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS) {
9443 			ath12k_warn(ar->ab, "too many MLO links during setting up vdev: %d",
9444 				    ahvif->vif->valid_links);
9445 			return -EINVAL;
9446 		}
9447 
9448 		ether_addr_copy(arg->mld_addr, ahvif->vif->addr);
9449 	}
9450 
9451 	return 0;
9452 }
9453 
ath12k_mac_update_vif_offload(struct ath12k_link_vif * arvif)9454 static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
9455 {
9456 	struct ath12k_vif *ahvif = arvif->ahvif;
9457 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9458 	struct ath12k *ar = arvif->ar;
9459 	struct ath12k_base *ab = ar->ab;
9460 	u32 param_id, param_value;
9461 	int ret;
9462 
9463 	param_id = WMI_VDEV_PARAM_TX_ENCAP_TYPE;
9464 	if (vif->type != NL80211_IFTYPE_STATION &&
9465 	    vif->type != NL80211_IFTYPE_AP)
9466 		vif->offload_flags &= ~(IEEE80211_OFFLOAD_ENCAP_ENABLED |
9467 					IEEE80211_OFFLOAD_DECAP_ENABLED);
9468 
9469 	if (vif->offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
9470 		ahvif->tx_encap_type = ATH12K_HW_TXRX_ETHERNET;
9471 	else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9472 		ahvif->tx_encap_type = ATH12K_HW_TXRX_RAW;
9473 	else
9474 		ahvif->tx_encap_type = ATH12K_HW_TXRX_NATIVE_WIFI;
9475 
9476 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9477 					    param_id, ahvif->tx_encap_type);
9478 	if (ret) {
9479 		ath12k_warn(ab, "failed to set vdev %d tx encap mode: %d\n",
9480 			    arvif->vdev_id, ret);
9481 		vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
9482 	}
9483 
9484 	param_id = WMI_VDEV_PARAM_RX_DECAP_TYPE;
9485 	if (vif->offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED)
9486 		param_value = ATH12K_HW_TXRX_ETHERNET;
9487 	else if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
9488 		param_value = ATH12K_HW_TXRX_RAW;
9489 	else
9490 		param_value = ATH12K_HW_TXRX_NATIVE_WIFI;
9491 
9492 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9493 					    param_id, param_value);
9494 	if (ret) {
9495 		ath12k_warn(ab, "failed to set vdev %d rx decap mode: %d\n",
9496 			    arvif->vdev_id, ret);
9497 		vif->offload_flags &= ~IEEE80211_OFFLOAD_DECAP_ENABLED;
9498 	}
9499 }
9500 
ath12k_mac_op_update_vif_offload(struct ieee80211_hw * hw,struct ieee80211_vif * vif)9501 static void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
9502 					     struct ieee80211_vif *vif)
9503 {
9504 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
9505 	struct ath12k_link_vif *arvif;
9506 	unsigned long links;
9507 	int link_id;
9508 
9509 	lockdep_assert_wiphy(hw->wiphy);
9510 
9511 	if (vif->valid_links) {
9512 		links = vif->valid_links;
9513 		for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
9514 			arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
9515 			if (!(arvif && arvif->ar))
9516 				continue;
9517 
9518 			ath12k_mac_update_vif_offload(arvif);
9519 		}
9520 
9521 		return;
9522 	}
9523 
9524 	ath12k_mac_update_vif_offload(&ahvif->deflink);
9525 }
9526 
ath12k_mac_vif_ap_active_any(struct ath12k_base * ab)9527 static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab)
9528 {
9529 	struct ath12k *ar;
9530 	struct ath12k_pdev *pdev;
9531 	struct ath12k_link_vif *arvif;
9532 	int i;
9533 
9534 	for (i = 0; i < ab->num_radios; i++) {
9535 		pdev = &ab->pdevs[i];
9536 		ar = pdev->ar;
9537 		list_for_each_entry(arvif, &ar->arvifs, list) {
9538 			if (arvif->is_up &&
9539 			    arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP)
9540 				return true;
9541 		}
9542 	}
9543 	return false;
9544 }
9545 
ath12k_mac_11d_scan_start(struct ath12k * ar,u32 vdev_id)9546 void ath12k_mac_11d_scan_start(struct ath12k *ar, u32 vdev_id)
9547 {
9548 	struct wmi_11d_scan_start_arg arg;
9549 	int ret;
9550 
9551 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9552 
9553 	if (ar->regdom_set_by_user)
9554 		goto fin;
9555 
9556 	if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID)
9557 		goto fin;
9558 
9559 	if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9560 		goto fin;
9561 
9562 	if (ath12k_mac_vif_ap_active_any(ar->ab))
9563 		goto fin;
9564 
9565 	arg.vdev_id = vdev_id;
9566 	arg.start_interval_msec = 0;
9567 	arg.scan_period_msec = ATH12K_SCAN_11D_INTERVAL;
9568 
9569 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
9570 		   "mac start 11d scan for vdev %d\n", vdev_id);
9571 
9572 	ret = ath12k_wmi_send_11d_scan_start_cmd(ar, &arg);
9573 	if (ret) {
9574 		ath12k_warn(ar->ab, "failed to start 11d scan vdev %d ret: %d\n",
9575 			    vdev_id, ret);
9576 	} else {
9577 		ar->vdev_id_11d_scan = vdev_id;
9578 		if (ar->state_11d == ATH12K_11D_PREPARING)
9579 			ar->state_11d = ATH12K_11D_RUNNING;
9580 	}
9581 
9582 fin:
9583 	if (ar->state_11d == ATH12K_11D_PREPARING) {
9584 		ar->state_11d = ATH12K_11D_IDLE;
9585 		complete(&ar->completed_11d_scan);
9586 	}
9587 }
9588 
ath12k_mac_11d_scan_stop(struct ath12k * ar)9589 void ath12k_mac_11d_scan_stop(struct ath12k *ar)
9590 {
9591 	int ret;
9592 	u32 vdev_id;
9593 
9594 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9595 
9596 	if (!test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map))
9597 		return;
9598 
9599 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac stop 11d for vdev %d\n",
9600 		   ar->vdev_id_11d_scan);
9601 
9602 	if (ar->state_11d == ATH12K_11D_PREPARING) {
9603 		ar->state_11d = ATH12K_11D_IDLE;
9604 		complete(&ar->completed_11d_scan);
9605 	}
9606 
9607 	if (ar->vdev_id_11d_scan != ATH12K_11D_INVALID_VDEV_ID) {
9608 		vdev_id = ar->vdev_id_11d_scan;
9609 
9610 		ret = ath12k_wmi_send_11d_scan_stop_cmd(ar, vdev_id);
9611 		if (ret) {
9612 			ath12k_warn(ar->ab,
9613 				    "failed to stopt 11d scan vdev %d ret: %d\n",
9614 				    vdev_id, ret);
9615 		} else {
9616 			ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
9617 			ar->state_11d = ATH12K_11D_IDLE;
9618 			complete(&ar->completed_11d_scan);
9619 		}
9620 	}
9621 }
9622 
ath12k_mac_11d_scan_stop_all(struct ath12k_base * ab)9623 void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab)
9624 {
9625 	struct ath12k *ar;
9626 	struct ath12k_pdev *pdev;
9627 	int i;
9628 
9629 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mac stop soc 11d scan\n");
9630 
9631 	for (i = 0; i < ab->num_radios; i++) {
9632 		pdev = &ab->pdevs[i];
9633 		ar = pdev->ar;
9634 
9635 		ath12k_mac_11d_scan_stop(ar);
9636 	}
9637 }
9638 
ath12k_mac_determine_vdev_type(struct ieee80211_vif * vif,struct ath12k_vif * ahvif)9639 static void ath12k_mac_determine_vdev_type(struct ieee80211_vif *vif,
9640 					   struct ath12k_vif *ahvif)
9641 {
9642 	ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_NONE;
9643 
9644 	switch (vif->type) {
9645 	case NL80211_IFTYPE_UNSPECIFIED:
9646 	case NL80211_IFTYPE_STATION:
9647 		ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9648 
9649 		if (vif->p2p)
9650 			ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_CLIENT;
9651 
9652 		break;
9653 	case NL80211_IFTYPE_MESH_POINT:
9654 		ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_MESH_11S;
9655 		fallthrough;
9656 	case NL80211_IFTYPE_AP:
9657 		ahvif->vdev_type = WMI_VDEV_TYPE_AP;
9658 
9659 		if (vif->p2p)
9660 			ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_GO;
9661 
9662 		break;
9663 	case NL80211_IFTYPE_MONITOR:
9664 		ahvif->vdev_type = WMI_VDEV_TYPE_MONITOR;
9665 		break;
9666 	case NL80211_IFTYPE_P2P_DEVICE:
9667 		ahvif->vdev_type = WMI_VDEV_TYPE_STA;
9668 		ahvif->vdev_subtype = WMI_VDEV_SUBTYPE_P2P_DEVICE;
9669 		break;
9670 	default:
9671 		WARN_ON(1);
9672 		break;
9673 	}
9674 }
9675 
ath12k_mac_vdev_create(struct ath12k * ar,struct ath12k_link_vif * arvif)9676 int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
9677 {
9678 	struct ath12k_hw *ah = ar->ah;
9679 	struct ath12k_base *ab = ar->ab;
9680 	struct ieee80211_hw *hw = ah->hw;
9681 	struct ath12k_vif *ahvif = arvif->ahvif;
9682 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9683 	struct ath12k_wmi_vdev_create_arg vdev_arg = {};
9684 	struct ath12k_wmi_peer_create_arg peer_param = {};
9685 	struct ieee80211_bss_conf *link_conf = NULL;
9686 	u32 param_id, param_value;
9687 	u16 nss;
9688 	int i;
9689 	int ret, vdev_id;
9690 	u8 link_id;
9691 
9692 	lockdep_assert_wiphy(hw->wiphy);
9693 
9694 	/* In NO_VIRTUAL_MONITOR, its necessary to restrict only one monitor
9695 	 * interface in each radio
9696 	 */
9697 	if (vif->type == NL80211_IFTYPE_MONITOR && ar->monitor_vdev_created)
9698 		return -EINVAL;
9699 
9700 	link_id = arvif->link_id;
9701 
9702 	if (link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
9703 		link_conf = wiphy_dereference(hw->wiphy, vif->link_conf[link_id]);
9704 		if (!link_conf) {
9705 			ath12k_warn(ar->ab, "unable to access bss link conf in vdev create for vif %pM link %u\n",
9706 				    vif->addr, arvif->link_id);
9707 			return -ENOLINK;
9708 		}
9709 	}
9710 
9711 	if (link_conf)
9712 		memcpy(arvif->bssid, link_conf->addr, ETH_ALEN);
9713 	else
9714 		memcpy(arvif->bssid, vif->addr, ETH_ALEN);
9715 
9716 	arvif->ar = ar;
9717 	vdev_id = __ffs64(ab->free_vdev_map);
9718 	arvif->vdev_id = vdev_id;
9719 	if (vif->type == NL80211_IFTYPE_MONITOR)
9720 		ar->monitor_vdev_id = vdev_id;
9721 
9722 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vdev create id %d type %d subtype %d map %llx\n",
9723 		   arvif->vdev_id, ahvif->vdev_type, ahvif->vdev_subtype,
9724 		   ab->free_vdev_map);
9725 
9726 	vif->cab_queue = arvif->vdev_id % (ATH12K_HW_MAX_QUEUES - 1);
9727 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
9728 		vif->hw_queue[i] = i % (ATH12K_HW_MAX_QUEUES - 1);
9729 
9730 	ret = ath12k_mac_setup_vdev_create_arg(arvif, &vdev_arg);
9731 	if (ret) {
9732 		ath12k_warn(ab, "failed to create vdev parameters %d: %d\n",
9733 			    arvif->vdev_id, ret);
9734 		goto err;
9735 	}
9736 
9737 	ret = ath12k_wmi_vdev_create(ar, arvif->bssid, &vdev_arg);
9738 	if (ret) {
9739 		ath12k_warn(ab, "failed to create WMI vdev %d: %d\n",
9740 			    arvif->vdev_id, ret);
9741 		return ret;
9742 	}
9743 
9744 	ar->num_created_vdevs++;
9745 	arvif->is_created = true;
9746 	ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM created, vdev_id %d\n",
9747 		   vif->addr, arvif->vdev_id);
9748 	ar->allocated_vdev_map |= 1LL << arvif->vdev_id;
9749 	ab->free_vdev_map &= ~(1LL << arvif->vdev_id);
9750 
9751 	spin_lock_bh(&ar->data_lock);
9752 	list_add(&arvif->list, &ar->arvifs);
9753 	spin_unlock_bh(&ar->data_lock);
9754 
9755 	ath12k_mac_update_vif_offload(arvif);
9756 
9757 	nss = hweight32(ar->cfg_tx_chainmask) ? : 1;
9758 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9759 					    WMI_VDEV_PARAM_NSS, nss);
9760 	if (ret) {
9761 		ath12k_warn(ab, "failed to set vdev %d chainmask 0x%x, nss %d :%d\n",
9762 			    arvif->vdev_id, ar->cfg_tx_chainmask, nss, ret);
9763 		goto err_vdev_del;
9764 	}
9765 
9766 	switch (ahvif->vdev_type) {
9767 	case WMI_VDEV_TYPE_AP:
9768 		peer_param.vdev_id = arvif->vdev_id;
9769 		peer_param.peer_addr = arvif->bssid;
9770 		peer_param.peer_type = WMI_PEER_TYPE_DEFAULT;
9771 		ret = ath12k_peer_create(ar, arvif, NULL, &peer_param);
9772 		if (ret) {
9773 			ath12k_warn(ab, "failed to vdev %d create peer for AP: %d\n",
9774 				    arvif->vdev_id, ret);
9775 			goto err_vdev_del;
9776 		}
9777 
9778 		ret = ath12k_mac_set_kickout(arvif);
9779 		if (ret) {
9780 			ath12k_warn(ar->ab, "failed to set vdev %i kickout parameters: %d\n",
9781 				    arvif->vdev_id, ret);
9782 			goto err_peer_del;
9783 		}
9784 		ath12k_mac_11d_scan_stop_all(ar->ab);
9785 		break;
9786 	case WMI_VDEV_TYPE_STA:
9787 		param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
9788 		param_value = WMI_STA_PS_RX_WAKE_POLICY_WAKE;
9789 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9790 						  param_id, param_value);
9791 		if (ret) {
9792 			ath12k_warn(ar->ab, "failed to set vdev %d RX wake policy: %d\n",
9793 				    arvif->vdev_id, ret);
9794 			goto err_peer_del;
9795 		}
9796 
9797 		param_id = WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD;
9798 		param_value = WMI_STA_PS_TX_WAKE_THRESHOLD_ALWAYS;
9799 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9800 						  param_id, param_value);
9801 		if (ret) {
9802 			ath12k_warn(ar->ab, "failed to set vdev %d TX wake threshold: %d\n",
9803 				    arvif->vdev_id, ret);
9804 			goto err_peer_del;
9805 		}
9806 
9807 		param_id = WMI_STA_PS_PARAM_PSPOLL_COUNT;
9808 		param_value = WMI_STA_PS_PSPOLL_COUNT_NO_MAX;
9809 		ret = ath12k_wmi_set_sta_ps_param(ar, arvif->vdev_id,
9810 						  param_id, param_value);
9811 		if (ret) {
9812 			ath12k_warn(ar->ab, "failed to set vdev %d pspoll count: %d\n",
9813 				    arvif->vdev_id, ret);
9814 			goto err_peer_del;
9815 		}
9816 
9817 		ret = ath12k_wmi_pdev_set_ps_mode(ar, arvif->vdev_id, false);
9818 		if (ret) {
9819 			ath12k_warn(ar->ab, "failed to disable vdev %d ps mode: %d\n",
9820 				    arvif->vdev_id, ret);
9821 			goto err_peer_del;
9822 		}
9823 
9824 		if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
9825 		    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
9826 		    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
9827 			reinit_completion(&ar->completed_11d_scan);
9828 			ar->state_11d = ATH12K_11D_PREPARING;
9829 		}
9830 		break;
9831 	case WMI_VDEV_TYPE_MONITOR:
9832 		ar->monitor_vdev_created = true;
9833 		break;
9834 	default:
9835 		break;
9836 	}
9837 
9838 	if (link_conf)
9839 		arvif->txpower = link_conf->txpower;
9840 	else
9841 		arvif->txpower = NL80211_TX_POWER_AUTOMATIC;
9842 
9843 	ret = ath12k_mac_txpower_recalc(ar);
9844 	if (ret)
9845 		goto err_peer_del;
9846 
9847 	param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
9848 	param_value = hw->wiphy->rts_threshold;
9849 	ar->rts_threshold = param_value;
9850 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
9851 					    param_id, param_value);
9852 	if (ret) {
9853 		ath12k_warn(ar->ab, "failed to set rts threshold for vdev %d: %d\n",
9854 			    arvif->vdev_id, ret);
9855 	}
9856 
9857 	ath12k_dp_vdev_tx_attach(ar, arvif);
9858 
9859 	return ret;
9860 
9861 err_peer_del:
9862 	if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
9863 		reinit_completion(&ar->peer_delete_done);
9864 
9865 		ret = ath12k_wmi_send_peer_delete_cmd(ar, arvif->bssid,
9866 						      arvif->vdev_id);
9867 		if (ret) {
9868 			ath12k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
9869 				    arvif->vdev_id, arvif->bssid);
9870 			goto err;
9871 		}
9872 
9873 		ret = ath12k_wait_for_peer_delete_done(ar, arvif->vdev_id,
9874 						       arvif->bssid);
9875 		if (ret)
9876 			goto err_vdev_del;
9877 
9878 		ar->num_peers--;
9879 	}
9880 
9881 err_vdev_del:
9882 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
9883 		ar->monitor_vdev_id = -1;
9884 		ar->monitor_vdev_created = false;
9885 	}
9886 
9887 	ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
9888 	ar->num_created_vdevs--;
9889 	arvif->is_created = false;
9890 	arvif->ar = NULL;
9891 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
9892 	ab->free_vdev_map |= 1LL << arvif->vdev_id;
9893 	ab->free_vdev_stats_id_map &= ~(1LL << arvif->vdev_stats_id);
9894 	spin_lock_bh(&ar->data_lock);
9895 	list_del(&arvif->list);
9896 	spin_unlock_bh(&ar->data_lock);
9897 
9898 err:
9899 	arvif->ar = NULL;
9900 	return ret;
9901 }
9902 
ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif * arvif)9903 static void ath12k_mac_vif_flush_key_cache(struct ath12k_link_vif *arvif)
9904 {
9905 	struct ath12k_key_conf *key_conf, *tmp;
9906 	struct ath12k_vif *ahvif = arvif->ahvif;
9907 	struct ath12k_hw *ah = ahvif->ah;
9908 	struct ath12k_sta *ahsta;
9909 	struct ath12k_link_sta *arsta;
9910 	struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9911 	int ret;
9912 
9913 	lockdep_assert_wiphy(ah->hw->wiphy);
9914 
9915 	list_for_each_entry_safe(key_conf, tmp, &cache->key_conf.list, list) {
9916 		arsta = NULL;
9917 		if (key_conf->sta) {
9918 			ahsta = ath12k_sta_to_ahsta(key_conf->sta);
9919 			arsta = wiphy_dereference(ah->hw->wiphy,
9920 						  ahsta->link[arvif->link_id]);
9921 			if (!arsta)
9922 				goto free_cache;
9923 		}
9924 
9925 		ret = ath12k_mac_set_key(arvif->ar, key_conf->cmd,
9926 					 arvif, arsta,
9927 					 key_conf->key);
9928 		if (ret)
9929 			ath12k_warn(arvif->ar->ab, "unable to apply set key param to vdev %d ret %d\n",
9930 				    arvif->vdev_id, ret);
9931 free_cache:
9932 		list_del(&key_conf->list);
9933 		kfree(key_conf);
9934 	}
9935 }
9936 
ath12k_mac_vif_cache_flush(struct ath12k * ar,struct ath12k_link_vif * arvif)9937 static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ath12k_link_vif *arvif)
9938 {
9939 	struct ath12k_vif *ahvif = arvif->ahvif;
9940 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9941 	struct ath12k_vif_cache *cache = ahvif->cache[arvif->link_id];
9942 	struct ath12k_base *ab = ar->ab;
9943 	struct ieee80211_bss_conf *link_conf;
9944 
9945 	int ret;
9946 
9947 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
9948 
9949 	if (!cache)
9950 		return;
9951 
9952 	if (cache->tx_conf.changed) {
9953 		ret = ath12k_mac_conf_tx(arvif, cache->tx_conf.ac,
9954 					 &cache->tx_conf.tx_queue_params);
9955 		if (ret)
9956 			ath12k_warn(ab,
9957 				    "unable to apply tx config parameters to vdev %d\n",
9958 				    ret);
9959 	}
9960 
9961 	if (cache->bss_conf_changed) {
9962 		link_conf = ath12k_mac_get_link_bss_conf(arvif);
9963 		if (!link_conf) {
9964 			ath12k_warn(ar->ab, "unable to access bss link conf in cache flush for vif %pM link %u\n",
9965 				    vif->addr, arvif->link_id);
9966 			return;
9967 		}
9968 		ath12k_mac_bss_info_changed(ar, arvif, link_conf,
9969 					    cache->bss_conf_changed);
9970 	}
9971 
9972 	if (!list_empty(&cache->key_conf.list))
9973 		ath12k_mac_vif_flush_key_cache(arvif);
9974 
9975 	ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
9976 }
9977 
ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw * hw,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)9978 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
9979 						    struct ath12k_link_vif *arvif,
9980 						    struct ieee80211_chanctx_conf *ctx)
9981 {
9982 	struct ath12k_vif *ahvif = arvif->ahvif;
9983 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
9984 	struct ath12k_link_vif *scan_arvif;
9985 	struct ath12k_hw *ah = hw->priv;
9986 	struct ath12k *ar;
9987 	struct ath12k_base *ab;
9988 	u8 link_id = arvif->link_id, scan_link_id;
9989 	unsigned long scan_link_map;
9990 	int ret;
9991 
9992 	lockdep_assert_wiphy(hw->wiphy);
9993 
9994 	if (ah->num_radio == 1)
9995 		ar = ah->radio;
9996 	else if (ctx)
9997 		ar = ath12k_get_ar_by_ctx(hw, ctx);
9998 	else
9999 		return NULL;
10000 
10001 	if (!ar)
10002 		return NULL;
10003 
10004 	/* cleanup the scan vdev if we are done scan on that ar
10005 	 * and now we want to create for actual usage.
10006 	 */
10007 	if (ieee80211_vif_is_mld(vif)) {
10008 		scan_link_map = ahvif->links_map & ATH12K_SCAN_LINKS_MASK;
10009 		for_each_set_bit(scan_link_id, &scan_link_map, ATH12K_NUM_MAX_LINKS) {
10010 			scan_arvif = wiphy_dereference(hw->wiphy,
10011 						       ahvif->link[scan_link_id]);
10012 			if (scan_arvif && scan_arvif->ar == ar) {
10013 				ar->scan.arvif = NULL;
10014 				ath12k_mac_remove_link_interface(hw, scan_arvif);
10015 				ath12k_mac_unassign_link_vif(scan_arvif);
10016 				break;
10017 			}
10018 		}
10019 	}
10020 
10021 	if (arvif->ar) {
10022 		/* This is not expected really */
10023 		if (WARN_ON(!arvif->is_created)) {
10024 			arvif->ar = NULL;
10025 			return NULL;
10026 		}
10027 
10028 		if (ah->num_radio == 1)
10029 			return arvif->ar;
10030 
10031 		/* This can happen as scan vdev gets created during multiple scans
10032 		 * across different radios before a vdev is brought up in
10033 		 * a certain radio.
10034 		 */
10035 		if (ar != arvif->ar) {
10036 			if (WARN_ON(arvif->is_started))
10037 				return NULL;
10038 
10039 			ath12k_mac_remove_link_interface(hw, arvif);
10040 			ath12k_mac_unassign_link_vif(arvif);
10041 		}
10042 	}
10043 
10044 	ab = ar->ab;
10045 
10046 	/* Assign arvif again here since previous radio switch block
10047 	 * would've unassigned and cleared it.
10048 	 */
10049 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
10050 	if (vif->type == NL80211_IFTYPE_AP &&
10051 	    ar->num_peers > (ar->max_num_peers - 1)) {
10052 		ath12k_warn(ab, "failed to create vdev due to insufficient peer entry resource in firmware\n");
10053 		goto unlock;
10054 	}
10055 
10056 	if (arvif->is_created)
10057 		goto flush;
10058 
10059 	if (ar->num_created_vdevs > (TARGET_NUM_VDEVS(ab) - 1)) {
10060 		ath12k_warn(ab, "failed to create vdev, reached max vdev limit %d\n",
10061 			    TARGET_NUM_VDEVS(ab));
10062 		goto unlock;
10063 	}
10064 
10065 	ret = ath12k_mac_vdev_create(ar, arvif);
10066 	if (ret) {
10067 		ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
10068 		goto unlock;
10069 	}
10070 
10071 flush:
10072 	/* If the vdev is created during channel assign and not during
10073 	 * add_interface(), Apply any parameters for the vdev which were received
10074 	 * after add_interface, corresponding to this vif.
10075 	 */
10076 	ath12k_mac_vif_cache_flush(ar, arvif);
10077 unlock:
10078 	return arvif->ar;
10079 }
10080 
ath12k_mac_op_add_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10081 static int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
10082 				       struct ieee80211_vif *vif)
10083 {
10084 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10085 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10086 	struct ath12k_reg_info *reg_info;
10087 	struct ath12k_link_vif *arvif;
10088 	struct ath12k_base *ab;
10089 	struct ath12k *ar;
10090 	int i;
10091 
10092 	lockdep_assert_wiphy(hw->wiphy);
10093 
10094 	memset(ahvif, 0, sizeof(*ahvif));
10095 
10096 	ahvif->ah = ah;
10097 	ahvif->vif = vif;
10098 	arvif = &ahvif->deflink;
10099 
10100 	ath12k_mac_init_arvif(ahvif, arvif, -1);
10101 
10102 	/* Allocate Default Queue now and reassign during actual vdev create */
10103 	vif->cab_queue = ATH12K_HW_DEFAULT_QUEUE;
10104 	for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++)
10105 		vif->hw_queue[i] = ATH12K_HW_DEFAULT_QUEUE;
10106 
10107 	vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
10108 
10109 	ath12k_mac_determine_vdev_type(vif, ahvif);
10110 
10111 	for_each_ar(ah, ar, i) {
10112 		if (!ath12k_wmi_supports_6ghz_cc_ext(ar))
10113 			continue;
10114 
10115 		ab = ar->ab;
10116 		reg_info = ab->reg_info[ar->pdev_idx];
10117 		ath12k_dbg(ab, ATH12K_DBG_MAC, "interface added to change reg rules\n");
10118 		ah->regd_updated = false;
10119 		ath12k_reg_handle_chan_list(ab, reg_info, ahvif->vdev_type,
10120 					    IEEE80211_REG_UNSET_AP);
10121 		break;
10122 	}
10123 
10124 	/* Defer vdev creation until assign_chanctx or hw_scan is initiated as driver
10125 	 * will not know if this interface is an ML vif at this point.
10126 	 */
10127 	return 0;
10128 }
10129 
ath12k_mac_vif_unref(struct ath12k_dp * dp,struct ieee80211_vif * vif)10130 static void ath12k_mac_vif_unref(struct ath12k_dp *dp, struct ieee80211_vif *vif)
10131 {
10132 	struct ath12k_tx_desc_info *tx_desc_info;
10133 	struct ath12k_skb_cb *skb_cb;
10134 	struct sk_buff *skb;
10135 	int i;
10136 
10137 	for (i = 0; i < ATH12K_HW_MAX_QUEUES; i++) {
10138 		spin_lock_bh(&dp->tx_desc_lock[i]);
10139 
10140 		list_for_each_entry(tx_desc_info, &dp->tx_desc_used_list[i],
10141 				    list) {
10142 			skb = tx_desc_info->skb;
10143 			if (!skb)
10144 				continue;
10145 
10146 			skb_cb = ATH12K_SKB_CB(skb);
10147 			if (skb_cb->vif == vif)
10148 				skb_cb->vif = NULL;
10149 		}
10150 
10151 		spin_unlock_bh(&dp->tx_desc_lock[i]);
10152 	}
10153 }
10154 
ath12k_mac_vdev_delete(struct ath12k * ar,struct ath12k_link_vif * arvif)10155 static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
10156 {
10157 	struct ath12k_vif *ahvif = arvif->ahvif;
10158 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
10159 	struct ath12k_base *ab = ar->ab;
10160 	unsigned long time_left;
10161 	int ret;
10162 
10163 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10164 
10165 	reinit_completion(&ar->vdev_delete_done);
10166 
10167 	ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
10168 	if (ret) {
10169 		ath12k_warn(ab, "failed to delete WMI vdev %d: %d\n",
10170 			    arvif->vdev_id, ret);
10171 		goto err_vdev_del;
10172 	}
10173 
10174 	time_left = wait_for_completion_timeout(&ar->vdev_delete_done,
10175 						ATH12K_VDEV_DELETE_TIMEOUT_HZ);
10176 	if (time_left == 0) {
10177 		ath12k_warn(ab, "Timeout in receiving vdev delete response\n");
10178 		goto err_vdev_del;
10179 	}
10180 
10181 	ab->free_vdev_map |= 1LL << arvif->vdev_id;
10182 	ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
10183 	ar->num_created_vdevs--;
10184 
10185 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
10186 		ar->monitor_vdev_id = -1;
10187 		ar->monitor_vdev_created = false;
10188 	}
10189 
10190 	ath12k_dbg(ab, ATH12K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",
10191 		   vif->addr, arvif->vdev_id);
10192 
10193 err_vdev_del:
10194 	spin_lock_bh(&ar->data_lock);
10195 	list_del(&arvif->list);
10196 	spin_unlock_bh(&ar->data_lock);
10197 
10198 	ath12k_peer_cleanup(ar, arvif->vdev_id);
10199 	ath12k_ahvif_put_link_cache(ahvif, arvif->link_id);
10200 
10201 	idr_for_each(&ar->txmgmt_idr,
10202 		     ath12k_mac_vif_txmgmt_idr_remove, vif);
10203 
10204 	ath12k_mac_vif_unref(&ab->dp, vif);
10205 	ath12k_dp_tx_put_bank_profile(&ab->dp, arvif->bank_id);
10206 
10207 	/* Recalc txpower for remaining vdev */
10208 	ath12k_mac_txpower_recalc(ar);
10209 
10210 	/* TODO: recal traffic pause state based on the available vdevs */
10211 	arvif->is_created = false;
10212 	arvif->ar = NULL;
10213 
10214 	return ret;
10215 }
10216 
ath12k_mac_op_remove_interface(struct ieee80211_hw * hw,struct ieee80211_vif * vif)10217 static void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
10218 					   struct ieee80211_vif *vif)
10219 {
10220 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10221 	struct ath12k_link_vif *arvif;
10222 	struct ath12k *ar;
10223 	u8 link_id;
10224 
10225 	lockdep_assert_wiphy(hw->wiphy);
10226 
10227 	for (link_id = 0; link_id < ATH12K_NUM_MAX_LINKS; link_id++) {
10228 		/* if we cached some config but never received assign chanctx,
10229 		 * free the allocated cache.
10230 		 */
10231 		ath12k_ahvif_put_link_cache(ahvif, link_id);
10232 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
10233 		if (!arvif || !arvif->is_created)
10234 			continue;
10235 
10236 		ar = arvif->ar;
10237 
10238 		/* Scan abortion is in progress since before this, cancel_hw_scan()
10239 		 * is expected to be executed. Since link is anyways going to be removed
10240 		 * now, just cancel the worker and send the scan aborted to user space
10241 		 */
10242 		if (ar->scan.arvif == arvif) {
10243 			wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
10244 
10245 			spin_lock_bh(&ar->data_lock);
10246 			ar->scan.arvif = NULL;
10247 			if (!ar->scan.is_roc) {
10248 				struct cfg80211_scan_info info = {
10249 					.aborted = true,
10250 				};
10251 
10252 				ath12k_mac_scan_send_complete(ar, &info);
10253 			}
10254 
10255 			ar->scan.state = ATH12K_SCAN_IDLE;
10256 			ar->scan_channel = NULL;
10257 			ar->scan.roc_freq = 0;
10258 			spin_unlock_bh(&ar->data_lock);
10259 		}
10260 
10261 		ath12k_mac_remove_link_interface(hw, arvif);
10262 		ath12k_mac_unassign_link_vif(arvif);
10263 	}
10264 }
10265 
10266 /* FIXME: Has to be verified. */
10267 #define SUPPORTED_FILTERS			\
10268 	(FIF_ALLMULTI |				\
10269 	FIF_CONTROL |				\
10270 	FIF_PSPOLL |				\
10271 	FIF_OTHER_BSS |				\
10272 	FIF_BCN_PRBRESP_PROMISC |		\
10273 	FIF_PROBE_REQ |				\
10274 	FIF_FCSFAIL)
10275 
ath12k_mac_op_configure_filter(struct ieee80211_hw * hw,unsigned int changed_flags,unsigned int * total_flags,u64 multicast)10276 static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
10277 					   unsigned int changed_flags,
10278 					   unsigned int *total_flags,
10279 					   u64 multicast)
10280 {
10281 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10282 	struct ath12k *ar;
10283 
10284 	lockdep_assert_wiphy(hw->wiphy);
10285 
10286 	ar = ath12k_ah_to_ar(ah, 0);
10287 
10288 	*total_flags &= SUPPORTED_FILTERS;
10289 	ar->filter_flags = *total_flags;
10290 }
10291 
ath12k_mac_op_get_antenna(struct ieee80211_hw * hw,int radio_idx,u32 * tx_ant,u32 * rx_ant)10292 static int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
10293 				     u32 *tx_ant, u32 *rx_ant)
10294 {
10295 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10296 	int antennas_rx = 0, antennas_tx = 0;
10297 	struct ath12k *ar;
10298 	int i;
10299 
10300 	lockdep_assert_wiphy(hw->wiphy);
10301 
10302 	for_each_ar(ah, ar, i) {
10303 		antennas_rx = max_t(u32, antennas_rx, ar->cfg_rx_chainmask);
10304 		antennas_tx = max_t(u32, antennas_tx, ar->cfg_tx_chainmask);
10305 	}
10306 
10307 	*tx_ant = antennas_tx;
10308 	*rx_ant = antennas_rx;
10309 
10310 	return 0;
10311 }
10312 
ath12k_mac_op_set_antenna(struct ieee80211_hw * hw,int radio_idx,u32 tx_ant,u32 rx_ant)10313 static int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
10314 				     u32 tx_ant, u32 rx_ant)
10315 {
10316 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
10317 	struct ath12k *ar;
10318 	int ret = 0;
10319 	int i;
10320 
10321 	lockdep_assert_wiphy(hw->wiphy);
10322 
10323 	for_each_ar(ah, ar, i) {
10324 		ret = __ath12k_set_antenna(ar, tx_ant, rx_ant);
10325 		if (ret)
10326 			break;
10327 	}
10328 
10329 	return ret;
10330 }
10331 
ath12k_mac_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params,u8 link_id)10332 static int ath12k_mac_ampdu_action(struct ieee80211_hw *hw,
10333 				   struct ieee80211_vif *vif,
10334 				   struct ieee80211_ampdu_params *params,
10335 				   u8 link_id)
10336 {
10337 	struct ath12k *ar;
10338 	int ret = -EINVAL;
10339 
10340 	lockdep_assert_wiphy(hw->wiphy);
10341 
10342 	ar = ath12k_get_ar_by_vif(hw, vif, link_id);
10343 	if (!ar)
10344 		return -EINVAL;
10345 
10346 	switch (params->action) {
10347 	case IEEE80211_AMPDU_RX_START:
10348 		ret = ath12k_dp_rx_ampdu_start(ar, params, link_id);
10349 		break;
10350 	case IEEE80211_AMPDU_RX_STOP:
10351 		ret = ath12k_dp_rx_ampdu_stop(ar, params, link_id);
10352 		break;
10353 	case IEEE80211_AMPDU_TX_START:
10354 	case IEEE80211_AMPDU_TX_STOP_CONT:
10355 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
10356 	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10357 	case IEEE80211_AMPDU_TX_OPERATIONAL:
10358 		/* Tx A-MPDU aggregation offloaded to hw/fw so deny mac80211
10359 		 * Tx aggregation requests.
10360 		 */
10361 		ret = -EOPNOTSUPP;
10362 		break;
10363 	}
10364 
10365 	if (ret)
10366 		ath12k_warn(ar->ab, "unable to perform ampdu action %d for vif %pM link %u ret %d\n",
10367 			    params->action, vif->addr, link_id, ret);
10368 
10369 	return ret;
10370 }
10371 
ath12k_mac_op_ampdu_action(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_ampdu_params * params)10372 static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
10373 				      struct ieee80211_vif *vif,
10374 				      struct ieee80211_ampdu_params *params)
10375 {
10376 	struct ieee80211_sta *sta = params->sta;
10377 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
10378 	unsigned long links_map = ahsta->links_map;
10379 	int ret = -EINVAL;
10380 	u8 link_id;
10381 
10382 	lockdep_assert_wiphy(hw->wiphy);
10383 
10384 	if (WARN_ON(!links_map))
10385 		return ret;
10386 
10387 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10388 		ret = ath12k_mac_ampdu_action(hw, vif, params, link_id);
10389 		if (ret)
10390 			return ret;
10391 	}
10392 
10393 	return 0;
10394 }
10395 
ath12k_mac_op_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10396 static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
10397 				     struct ieee80211_chanctx_conf *ctx)
10398 {
10399 	struct ath12k *ar;
10400 	struct ath12k_base *ab;
10401 
10402 	lockdep_assert_wiphy(hw->wiphy);
10403 
10404 	ar = ath12k_get_ar_by_ctx(hw, ctx);
10405 	if (!ar)
10406 		return -EINVAL;
10407 
10408 	ab = ar->ab;
10409 
10410 	ath12k_dbg(ab, ATH12K_DBG_MAC,
10411 		   "mac chanctx add freq %u width %d ptr %p\n",
10412 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
10413 
10414 	spin_lock_bh(&ar->data_lock);
10415 	/* TODO: In case of multiple channel context, populate rx_channel from
10416 	 * Rx PPDU desc information.
10417 	 */
10418 	ar->rx_channel = ctx->def.chan;
10419 	spin_unlock_bh(&ar->data_lock);
10420 	ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10421 
10422 	return 0;
10423 }
10424 
ath12k_mac_op_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx)10425 static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
10426 					 struct ieee80211_chanctx_conf *ctx)
10427 {
10428 	struct ath12k *ar;
10429 	struct ath12k_base *ab;
10430 
10431 	lockdep_assert_wiphy(hw->wiphy);
10432 
10433 	ar = ath12k_get_ar_by_ctx(hw, ctx);
10434 	if (!ar)
10435 		return;
10436 
10437 	ab = ar->ab;
10438 
10439 	ath12k_dbg(ab, ATH12K_DBG_MAC,
10440 		   "mac chanctx remove freq %u width %d ptr %p\n",
10441 		   ctx->def.chan->center_freq, ctx->def.width, ctx);
10442 
10443 	spin_lock_bh(&ar->data_lock);
10444 	/* TODO: In case of there is one more channel context left, populate
10445 	 * rx_channel with the channel of that remaining channel context.
10446 	 */
10447 	ar->rx_channel = NULL;
10448 	spin_unlock_bh(&ar->data_lock);
10449 	ar->chan_tx_pwr = ATH12K_PDEV_TX_POWER_INVALID;
10450 }
10451 
10452 static enum wmi_phy_mode
ath12k_mac_check_down_grade_phy_mode(struct ath12k * ar,enum wmi_phy_mode mode,enum nl80211_band band,enum nl80211_iftype type)10453 ath12k_mac_check_down_grade_phy_mode(struct ath12k *ar,
10454 				     enum wmi_phy_mode mode,
10455 				     enum nl80211_band band,
10456 				     enum nl80211_iftype type)
10457 {
10458 	struct ieee80211_sta_eht_cap *eht_cap = NULL;
10459 	enum wmi_phy_mode down_mode;
10460 	int n = ar->mac.sbands[band].n_iftype_data;
10461 	int i;
10462 	struct ieee80211_sband_iftype_data *data;
10463 
10464 	if (mode < MODE_11BE_EHT20)
10465 		return mode;
10466 
10467 	data = ar->mac.iftype[band];
10468 	for (i = 0; i < n; i++) {
10469 		if (data[i].types_mask & BIT(type)) {
10470 			eht_cap = &data[i].eht_cap;
10471 			break;
10472 		}
10473 	}
10474 
10475 	if (eht_cap && eht_cap->has_eht)
10476 		return mode;
10477 
10478 	switch (mode) {
10479 	case MODE_11BE_EHT20:
10480 		down_mode = MODE_11AX_HE20;
10481 		break;
10482 	case MODE_11BE_EHT40:
10483 		down_mode = MODE_11AX_HE40;
10484 		break;
10485 	case MODE_11BE_EHT80:
10486 		down_mode = MODE_11AX_HE80;
10487 		break;
10488 	case MODE_11BE_EHT80_80:
10489 		down_mode = MODE_11AX_HE80_80;
10490 		break;
10491 	case MODE_11BE_EHT160:
10492 	case MODE_11BE_EHT160_160:
10493 	case MODE_11BE_EHT320:
10494 		down_mode = MODE_11AX_HE160;
10495 		break;
10496 	case MODE_11BE_EHT20_2G:
10497 		down_mode = MODE_11AX_HE20_2G;
10498 		break;
10499 	case MODE_11BE_EHT40_2G:
10500 		down_mode = MODE_11AX_HE40_2G;
10501 		break;
10502 	default:
10503 		down_mode = mode;
10504 		break;
10505 	}
10506 
10507 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10508 		   "mac vdev start phymode %s downgrade to %s\n",
10509 		   ath12k_mac_phymode_str(mode),
10510 		   ath12k_mac_phymode_str(down_mode));
10511 
10512 	return down_mode;
10513 }
10514 
10515 static void
ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif * arvif,struct wmi_ml_arg * ml_arg)10516 ath12k_mac_mlo_get_vdev_args(struct ath12k_link_vif *arvif,
10517 			     struct wmi_ml_arg *ml_arg)
10518 {
10519 	struct ath12k_vif *ahvif = arvif->ahvif;
10520 	struct wmi_ml_partner_info *partner_info;
10521 	struct ieee80211_bss_conf *link_conf;
10522 	struct ath12k_link_vif *arvif_p;
10523 	unsigned long links;
10524 	u8 link_id;
10525 
10526 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10527 
10528 	if (!ath12k_mac_is_ml_arvif(arvif))
10529 		return;
10530 
10531 	if (hweight16(ahvif->vif->valid_links) > ATH12K_WMI_MLO_MAX_LINKS)
10532 		return;
10533 
10534 	ml_arg->enabled = true;
10535 
10536 	/* Driver always add a new link via VDEV START, FW takes
10537 	 * care of internally adding this link to existing
10538 	 * link vdevs which are advertised as partners below
10539 	 */
10540 	ml_arg->link_add = true;
10541 
10542 	ml_arg->assoc_link = arvif->is_sta_assoc_link;
10543 
10544 	partner_info = ml_arg->partner_info;
10545 
10546 	links = ahvif->links_map;
10547 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
10548 		arvif_p = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10549 
10550 		if (WARN_ON(!arvif_p))
10551 			continue;
10552 
10553 		if (arvif == arvif_p)
10554 			continue;
10555 
10556 		if (!arvif_p->is_created)
10557 			continue;
10558 
10559 		link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10560 					      ahvif->vif->link_conf[arvif_p->link_id]);
10561 
10562 		if (!link_conf)
10563 			continue;
10564 
10565 		partner_info->vdev_id = arvif_p->vdev_id;
10566 		partner_info->hw_link_id = arvif_p->ar->pdev->hw_link_id;
10567 		ether_addr_copy(partner_info->addr, link_conf->addr);
10568 		ml_arg->num_partner_links++;
10569 		partner_info++;
10570 	}
10571 }
10572 
10573 static int
ath12k_mac_vdev_start_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx,bool restart)10574 ath12k_mac_vdev_start_restart(struct ath12k_link_vif *arvif,
10575 			      struct ieee80211_chanctx_conf *ctx,
10576 			      bool restart)
10577 {
10578 	struct ath12k *ar = arvif->ar;
10579 	struct ath12k_base *ab = ar->ab;
10580 	struct wmi_vdev_start_req_arg arg = {};
10581 	const struct cfg80211_chan_def *chandef = &ctx->def;
10582 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10583 	struct ath12k_vif *ahvif = arvif->ahvif;
10584 	struct ieee80211_bss_conf *link_conf;
10585 	unsigned int dfs_cac_time;
10586 	int ret;
10587 
10588 	lockdep_assert_wiphy(hw->wiphy);
10589 
10590 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
10591 	if (!link_conf) {
10592 		ath12k_warn(ar->ab, "unable to access bss link conf in vdev start for vif %pM link %u\n",
10593 			    ahvif->vif->addr, arvif->link_id);
10594 		return -ENOLINK;
10595 	}
10596 
10597 	reinit_completion(&ar->vdev_setup_done);
10598 
10599 	arg.vdev_id = arvif->vdev_id;
10600 	arg.dtim_period = arvif->dtim_period;
10601 	arg.bcn_intval = arvif->beacon_interval;
10602 	arg.punct_bitmap = ~arvif->punct_bitmap;
10603 
10604 	arg.freq = chandef->chan->center_freq;
10605 	arg.band_center_freq1 = chandef->center_freq1;
10606 	arg.band_center_freq2 = chandef->center_freq2;
10607 	arg.mode = ath12k_phymodes[chandef->chan->band][chandef->width];
10608 
10609 	arg.mode = ath12k_mac_check_down_grade_phy_mode(ar, arg.mode,
10610 							chandef->chan->band,
10611 							ahvif->vif->type);
10612 	arg.min_power = 0;
10613 	arg.max_power = chandef->chan->max_power;
10614 	arg.max_reg_power = chandef->chan->max_reg_power;
10615 	arg.max_antenna_gain = chandef->chan->max_antenna_gain;
10616 
10617 	arg.pref_tx_streams = ar->num_tx_chains;
10618 	arg.pref_rx_streams = ar->num_rx_chains;
10619 
10620 	arg.mbssid_flags = WMI_VDEV_MBSSID_FLAGS_NON_MBSSID_AP;
10621 	arg.mbssid_tx_vdev_id = 0;
10622 	if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT,
10623 		     ar->ab->wmi_ab.svc_map)) {
10624 		ret = ath12k_mac_setup_vdev_params_mbssid(arvif,
10625 							  &arg.mbssid_flags,
10626 							  &arg.mbssid_tx_vdev_id);
10627 		if (ret)
10628 			return ret;
10629 	}
10630 
10631 	if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
10632 		arg.ssid = ahvif->u.ap.ssid;
10633 		arg.ssid_len = ahvif->u.ap.ssid_len;
10634 		arg.hidden_ssid = ahvif->u.ap.hidden_ssid;
10635 
10636 		/* For now allow DFS for AP mode */
10637 		arg.chan_radar = !!(chandef->chan->flags & IEEE80211_CHAN_RADAR);
10638 
10639 		arg.freq2_radar = ctx->radar_enabled;
10640 
10641 		arg.passive = arg.chan_radar;
10642 
10643 		spin_lock_bh(&ab->base_lock);
10644 		arg.regdomain = ar->ab->dfs_region;
10645 		spin_unlock_bh(&ab->base_lock);
10646 
10647 		/* TODO: Notify if secondary 80Mhz also needs radar detection */
10648 	}
10649 
10650 	arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
10651 
10652 	if (!restart)
10653 		ath12k_mac_mlo_get_vdev_args(arvif, &arg.ml);
10654 
10655 	ath12k_dbg(ab, ATH12K_DBG_MAC,
10656 		   "mac vdev %d start center_freq %d phymode %s punct_bitmap 0x%x\n",
10657 		   arg.vdev_id, arg.freq,
10658 		   ath12k_mac_phymode_str(arg.mode), arg.punct_bitmap);
10659 
10660 	ret = ath12k_wmi_vdev_start(ar, &arg, restart);
10661 	if (ret) {
10662 		ath12k_warn(ar->ab, "failed to %s WMI vdev %i\n",
10663 			    restart ? "restart" : "start", arg.vdev_id);
10664 		return ret;
10665 	}
10666 
10667 	ret = ath12k_mac_vdev_setup_sync(ar);
10668 	if (ret) {
10669 		ath12k_warn(ab, "failed to synchronize setup for vdev %i %s: %d\n",
10670 			    arg.vdev_id, restart ? "restart" : "start", ret);
10671 		return ret;
10672 	}
10673 
10674 	/* TODO: For now we only set TPC power here. However when
10675 	 * channel changes, say CSA, it should be updated again.
10676 	 */
10677 	if (ath12k_mac_supports_tpc(ar, ahvif, chandef)) {
10678 		ath12k_mac_fill_reg_tpc_info(ar, arvif, ctx);
10679 		ath12k_wmi_send_vdev_set_tpc_power(ar, arvif->vdev_id,
10680 						   &arvif->reg_tpc_info);
10681 	}
10682 
10683 	ar->num_started_vdevs++;
10684 	ath12k_dbg(ab, ATH12K_DBG_MAC,  "vdev %pM started, vdev_id %d\n",
10685 		   ahvif->vif->addr, arvif->vdev_id);
10686 
10687 	/* Enable CAC Running Flag in the driver by checking all sub-channel's DFS
10688 	 * state as NL80211_DFS_USABLE which indicates CAC needs to be
10689 	 * done before channel usage. This flag is used to drop rx packets.
10690 	 * during CAC.
10691 	 */
10692 	/* TODO: Set the flag for other interface types as required */
10693 	if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
10694 	    cfg80211_chandef_dfs_usable(hw->wiphy, chandef)) {
10695 		set_bit(ATH12K_FLAG_CAC_RUNNING, &ar->dev_flags);
10696 		dfs_cac_time = cfg80211_chandef_dfs_cac_time(hw->wiphy, chandef);
10697 
10698 		ath12k_dbg(ab, ATH12K_DBG_MAC,
10699 			   "CAC started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
10700 			   dfs_cac_time, arg.freq, arg.band_center_freq1, arg.vdev_id);
10701 	}
10702 
10703 	ret = ath12k_mac_set_txbf_conf(arvif);
10704 	if (ret)
10705 		ath12k_warn(ab, "failed to set txbf conf for vdev %d: %d\n",
10706 			    arvif->vdev_id, ret);
10707 
10708 	return 0;
10709 }
10710 
ath12k_mac_vdev_start(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10711 static int ath12k_mac_vdev_start(struct ath12k_link_vif *arvif,
10712 				 struct ieee80211_chanctx_conf *ctx)
10713 {
10714 	return ath12k_mac_vdev_start_restart(arvif, ctx, false);
10715 }
10716 
ath12k_mac_vdev_restart(struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)10717 static int ath12k_mac_vdev_restart(struct ath12k_link_vif *arvif,
10718 				   struct ieee80211_chanctx_conf *ctx)
10719 {
10720 	return ath12k_mac_vdev_start_restart(arvif, ctx, true);
10721 }
10722 
10723 struct ath12k_mac_change_chanctx_arg {
10724 	struct ieee80211_chanctx_conf *ctx;
10725 	struct ieee80211_vif_chanctx_switch *vifs;
10726 	int n_vifs;
10727 	int next_vif;
10728 	struct ath12k *ar;
10729 };
10730 
10731 static void
ath12k_mac_change_chanctx_cnt_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10732 ath12k_mac_change_chanctx_cnt_iter(void *data, u8 *mac,
10733 				   struct ieee80211_vif *vif)
10734 {
10735 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10736 	struct ath12k_mac_change_chanctx_arg *arg = data;
10737 	struct ieee80211_bss_conf *link_conf;
10738 	struct ath12k_link_vif *arvif;
10739 	unsigned long links_map;
10740 	u8 link_id;
10741 
10742 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10743 
10744 	links_map = ahvif->links_map;
10745 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10746 		arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10747 		if (WARN_ON(!arvif))
10748 			continue;
10749 
10750 		if (!arvif->is_created || arvif->ar != arg->ar)
10751 			continue;
10752 
10753 		link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10754 					      vif->link_conf[link_id]);
10755 		if (WARN_ON(!link_conf))
10756 			continue;
10757 
10758 		if (rcu_access_pointer(link_conf->chanctx_conf) != arg->ctx)
10759 			continue;
10760 
10761 		arg->n_vifs++;
10762 	}
10763 }
10764 
10765 static void
ath12k_mac_change_chanctx_fill_iter(void * data,u8 * mac,struct ieee80211_vif * vif)10766 ath12k_mac_change_chanctx_fill_iter(void *data, u8 *mac,
10767 				    struct ieee80211_vif *vif)
10768 {
10769 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
10770 	struct ath12k_mac_change_chanctx_arg *arg = data;
10771 	struct ieee80211_bss_conf *link_conf;
10772 	struct ieee80211_chanctx_conf *ctx;
10773 	struct ath12k_link_vif *arvif;
10774 	unsigned long links_map;
10775 	u8 link_id;
10776 
10777 	lockdep_assert_wiphy(ahvif->ah->hw->wiphy);
10778 
10779 	links_map = ahvif->links_map;
10780 	for_each_set_bit(link_id, &links_map, IEEE80211_MLD_MAX_NUM_LINKS) {
10781 		arvif = wiphy_dereference(ahvif->ah->hw->wiphy, ahvif->link[link_id]);
10782 		if (WARN_ON(!arvif))
10783 			continue;
10784 
10785 		if (!arvif->is_created || arvif->ar != arg->ar)
10786 			continue;
10787 
10788 		link_conf = wiphy_dereference(ahvif->ah->hw->wiphy,
10789 					      vif->link_conf[arvif->link_id]);
10790 		if (WARN_ON(!link_conf))
10791 			continue;
10792 
10793 		ctx = rcu_access_pointer(link_conf->chanctx_conf);
10794 		if (ctx != arg->ctx)
10795 			continue;
10796 
10797 		if (WARN_ON(arg->next_vif == arg->n_vifs))
10798 			return;
10799 
10800 		arg->vifs[arg->next_vif].vif = vif;
10801 		arg->vifs[arg->next_vif].old_ctx = ctx;
10802 		arg->vifs[arg->next_vif].new_ctx = ctx;
10803 		arg->vifs[arg->next_vif].link_conf = link_conf;
10804 		arg->next_vif++;
10805 	}
10806 }
10807 
ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)10808 static u32 ath12k_mac_nlwidth_to_wmiwidth(enum nl80211_chan_width width)
10809 {
10810 	switch (width) {
10811 	case NL80211_CHAN_WIDTH_20:
10812 		return WMI_CHAN_WIDTH_20;
10813 	case NL80211_CHAN_WIDTH_40:
10814 		return WMI_CHAN_WIDTH_40;
10815 	case NL80211_CHAN_WIDTH_80:
10816 		return WMI_CHAN_WIDTH_80;
10817 	case NL80211_CHAN_WIDTH_160:
10818 		return WMI_CHAN_WIDTH_160;
10819 	case NL80211_CHAN_WIDTH_80P80:
10820 		return WMI_CHAN_WIDTH_80P80;
10821 	case NL80211_CHAN_WIDTH_5:
10822 		return WMI_CHAN_WIDTH_5;
10823 	case NL80211_CHAN_WIDTH_10:
10824 		return WMI_CHAN_WIDTH_10;
10825 	case NL80211_CHAN_WIDTH_320:
10826 		return WMI_CHAN_WIDTH_320;
10827 	default:
10828 		WARN_ON(1);
10829 		return WMI_CHAN_WIDTH_20;
10830 	}
10831 }
10832 
ath12k_mac_update_peer_puncturing_width(struct ath12k * ar,struct ath12k_link_vif * arvif,struct cfg80211_chan_def def)10833 static int ath12k_mac_update_peer_puncturing_width(struct ath12k *ar,
10834 						   struct ath12k_link_vif *arvif,
10835 						   struct cfg80211_chan_def def)
10836 {
10837 	u32 param_id, param_value;
10838 	int ret;
10839 
10840 	if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
10841 		return 0;
10842 
10843 	param_id = WMI_PEER_CHWIDTH_PUNCTURE_20MHZ_BITMAP;
10844 	param_value = ath12k_mac_nlwidth_to_wmiwidth(def.width) |
10845 		u32_encode_bits((~def.punctured),
10846 				WMI_PEER_PUNCTURE_BITMAP);
10847 
10848 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
10849 		   "punctured bitmap %02x width %d vdev %d\n",
10850 		   def.punctured, def.width, arvif->vdev_id);
10851 
10852 	ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
10853 					arvif->vdev_id, param_id,
10854 					param_value);
10855 
10856 	return ret;
10857 }
10858 
10859 static void
ath12k_mac_update_vif_chan(struct ath12k * ar,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs)10860 ath12k_mac_update_vif_chan(struct ath12k *ar,
10861 			   struct ieee80211_vif_chanctx_switch *vifs,
10862 			   int n_vifs)
10863 {
10864 	struct ath12k_wmi_vdev_up_params params = {};
10865 	struct ath12k_link_vif *arvif;
10866 	struct ieee80211_bss_conf *link_conf;
10867 	struct ath12k_base *ab = ar->ab;
10868 	struct ieee80211_vif *vif;
10869 	struct ath12k_vif *ahvif;
10870 	u8 link_id;
10871 	int ret;
10872 	int i;
10873 	bool monitor_vif = false;
10874 
10875 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10876 
10877 	for (i = 0; i < n_vifs; i++) {
10878 		vif = vifs[i].vif;
10879 		ahvif = ath12k_vif_to_ahvif(vif);
10880 		link_conf = vifs[i].link_conf;
10881 		link_id = link_conf->link_id;
10882 		arvif = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
10883 					  ahvif->link[link_id]);
10884 
10885 		if (vif->type == NL80211_IFTYPE_MONITOR) {
10886 			monitor_vif = true;
10887 			continue;
10888 		}
10889 
10890 		ath12k_dbg(ab, ATH12K_DBG_MAC,
10891 			   "mac chanctx switch vdev_id %i freq %u->%u width %d->%d\n",
10892 			   arvif->vdev_id,
10893 			   vifs[i].old_ctx->def.chan->center_freq,
10894 			   vifs[i].new_ctx->def.chan->center_freq,
10895 			   vifs[i].old_ctx->def.width,
10896 			   vifs[i].new_ctx->def.width);
10897 
10898 		if (WARN_ON(!arvif->is_started))
10899 			continue;
10900 
10901 		arvif->punct_bitmap = vifs[i].new_ctx->def.punctured;
10902 
10903 		/* Firmware expect vdev_restart only if vdev is up.
10904 		 * If vdev is down then it expect vdev_stop->vdev_start.
10905 		 */
10906 		if (arvif->is_up) {
10907 			ret = ath12k_mac_vdev_restart(arvif, vifs[i].new_ctx);
10908 			if (ret) {
10909 				ath12k_warn(ab, "failed to restart vdev %d: %d\n",
10910 					    arvif->vdev_id, ret);
10911 				continue;
10912 			}
10913 		} else {
10914 			ret = ath12k_mac_vdev_stop(arvif);
10915 			if (ret) {
10916 				ath12k_warn(ab, "failed to stop vdev %d: %d\n",
10917 					    arvif->vdev_id, ret);
10918 				continue;
10919 			}
10920 
10921 			ret = ath12k_mac_vdev_start(arvif, vifs[i].new_ctx);
10922 			if (ret)
10923 				ath12k_warn(ab, "failed to start vdev %d: %d\n",
10924 					    arvif->vdev_id, ret);
10925 			continue;
10926 		}
10927 
10928 		ret = ath12k_mac_setup_bcn_tmpl(arvif);
10929 		if (ret)
10930 			ath12k_warn(ab, "failed to update bcn tmpl during csa: %d\n",
10931 				    ret);
10932 
10933 		memset(&params, 0, sizeof(params));
10934 		params.vdev_id = arvif->vdev_id;
10935 		params.aid = ahvif->aid;
10936 		params.bssid = arvif->bssid;
10937 		params.tx_bssid = ath12k_mac_get_tx_bssid(arvif);
10938 		if (params.tx_bssid) {
10939 			params.nontx_profile_idx = link_conf->bssid_index;
10940 			params.nontx_profile_cnt = 1 << link_conf->bssid_indicator;
10941 		}
10942 		ret = ath12k_wmi_vdev_up(arvif->ar, &params);
10943 		if (ret) {
10944 			ath12k_warn(ab, "failed to bring vdev up %d: %d\n",
10945 				    arvif->vdev_id, ret);
10946 			continue;
10947 		}
10948 
10949 		ret = ath12k_mac_update_peer_puncturing_width(arvif->ar, arvif,
10950 							      vifs[i].new_ctx->def);
10951 		if (ret) {
10952 			ath12k_warn(ar->ab,
10953 				    "failed to update puncturing bitmap %02x and width %d: %d\n",
10954 				    vifs[i].new_ctx->def.punctured,
10955 				    vifs[i].new_ctx->def.width, ret);
10956 			continue;
10957 		}
10958 	}
10959 
10960 	/* Restart the internal monitor vdev on new channel */
10961 	if (!monitor_vif && ar->monitor_vdev_created) {
10962 		if (!ath12k_mac_monitor_stop(ar))
10963 			ath12k_mac_monitor_start(ar);
10964 	}
10965 }
10966 
10967 static void
ath12k_mac_update_active_vif_chan(struct ath12k * ar,struct ieee80211_chanctx_conf * ctx)10968 ath12k_mac_update_active_vif_chan(struct ath12k *ar,
10969 				  struct ieee80211_chanctx_conf *ctx)
10970 {
10971 	struct ath12k_mac_change_chanctx_arg arg = { .ctx = ctx, .ar = ar };
10972 	struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
10973 
10974 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
10975 
10976 	ieee80211_iterate_active_interfaces_atomic(hw,
10977 						   IEEE80211_IFACE_ITER_NORMAL,
10978 						   ath12k_mac_change_chanctx_cnt_iter,
10979 						   &arg);
10980 	if (arg.n_vifs == 0)
10981 		return;
10982 
10983 	arg.vifs = kcalloc(arg.n_vifs, sizeof(arg.vifs[0]), GFP_KERNEL);
10984 	if (!arg.vifs)
10985 		return;
10986 
10987 	ieee80211_iterate_active_interfaces_atomic(hw,
10988 						   IEEE80211_IFACE_ITER_NORMAL,
10989 						   ath12k_mac_change_chanctx_fill_iter,
10990 						   &arg);
10991 
10992 	ath12k_mac_update_vif_chan(ar, arg.vifs, arg.n_vifs);
10993 
10994 	kfree(arg.vifs);
10995 }
10996 
ath12k_mac_op_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * ctx,u32 changed)10997 static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
10998 					 struct ieee80211_chanctx_conf *ctx,
10999 					 u32 changed)
11000 {
11001 	struct ath12k *ar;
11002 	struct ath12k_base *ab;
11003 
11004 	lockdep_assert_wiphy(hw->wiphy);
11005 
11006 	ar = ath12k_get_ar_by_ctx(hw, ctx);
11007 	if (!ar)
11008 		return;
11009 
11010 	ab = ar->ab;
11011 
11012 	ath12k_dbg(ab, ATH12K_DBG_MAC,
11013 		   "mac chanctx change freq %u width %d ptr %p changed %x\n",
11014 		   ctx->def.chan->center_freq, ctx->def.width, ctx, changed);
11015 
11016 	/* This shouldn't really happen because channel switching should use
11017 	 * switch_vif_chanctx().
11018 	 */
11019 	if (WARN_ON(changed & IEEE80211_CHANCTX_CHANGE_CHANNEL))
11020 		return;
11021 
11022 	if (changed & IEEE80211_CHANCTX_CHANGE_WIDTH ||
11023 	    changed & IEEE80211_CHANCTX_CHANGE_RADAR ||
11024 	    changed & IEEE80211_CHANCTX_CHANGE_PUNCTURING)
11025 		ath12k_mac_update_active_vif_chan(ar, ctx);
11026 
11027 	/* TODO: Recalc radar detection */
11028 }
11029 
ath12k_start_vdev_delay(struct ath12k * ar,struct ath12k_link_vif * arvif)11030 static int ath12k_start_vdev_delay(struct ath12k *ar,
11031 				   struct ath12k_link_vif *arvif)
11032 {
11033 	struct ath12k_base *ab = ar->ab;
11034 	struct ath12k_vif *ahvif = arvif->ahvif;
11035 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
11036 	struct ieee80211_chanctx_conf *chanctx;
11037 	struct ieee80211_bss_conf *link_conf;
11038 	int ret;
11039 
11040 	if (WARN_ON(arvif->is_started))
11041 		return -EBUSY;
11042 
11043 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
11044 	if (!link_conf) {
11045 		ath12k_warn(ab, "failed to get link conf for vdev %u\n", arvif->vdev_id);
11046 		return -EINVAL;
11047 	}
11048 
11049 	chanctx	= wiphy_dereference(ath12k_ar_to_hw(arvif->ar)->wiphy,
11050 				    link_conf->chanctx_conf);
11051 	ret = ath12k_mac_vdev_start(arvif, chanctx);
11052 	if (ret) {
11053 		ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11054 			    arvif->vdev_id, vif->addr,
11055 			    chanctx->def.chan->center_freq, ret);
11056 		return ret;
11057 	}
11058 
11059 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11060 		ret = ath12k_monitor_vdev_up(ar, arvif->vdev_id);
11061 		if (ret) {
11062 			ath12k_warn(ab, "failed put monitor up: %d\n", ret);
11063 			return ret;
11064 		}
11065 	}
11066 
11067 	arvif->is_started = true;
11068 
11069 	/* TODO: Setup ps and cts/rts protection */
11070 	return 0;
11071 }
11072 
ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def * chan_def)11073 static u8 ath12k_mac_get_num_pwr_levels(struct cfg80211_chan_def *chan_def)
11074 {
11075 	if (chan_def->chan->flags & IEEE80211_CHAN_PSD) {
11076 		switch (chan_def->width) {
11077 		case NL80211_CHAN_WIDTH_20:
11078 			return 1;
11079 		case NL80211_CHAN_WIDTH_40:
11080 			return 2;
11081 		case NL80211_CHAN_WIDTH_80:
11082 			return 4;
11083 		case NL80211_CHAN_WIDTH_160:
11084 			return 8;
11085 		case NL80211_CHAN_WIDTH_320:
11086 			return 16;
11087 		default:
11088 			return 1;
11089 		}
11090 	} else {
11091 		switch (chan_def->width) {
11092 		case NL80211_CHAN_WIDTH_20:
11093 			return 1;
11094 		case NL80211_CHAN_WIDTH_40:
11095 			return 2;
11096 		case NL80211_CHAN_WIDTH_80:
11097 			return 3;
11098 		case NL80211_CHAN_WIDTH_160:
11099 			return 4;
11100 		case NL80211_CHAN_WIDTH_320:
11101 			return 5;
11102 		default:
11103 			return 1;
11104 		}
11105 	}
11106 }
11107 
ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def * chan_def)11108 static u16 ath12k_mac_get_6ghz_start_frequency(struct cfg80211_chan_def *chan_def)
11109 {
11110 	u16 diff_seq;
11111 
11112 	/* It is to get the lowest channel number's center frequency of the chan.
11113 	 * For example,
11114 	 * bandwidth=40 MHz, center frequency is 5965, lowest channel is 1
11115 	 * with center frequency 5955, its diff is 5965 - 5955 = 10.
11116 	 * bandwidth=80 MHz, center frequency is 5985, lowest channel is 1
11117 	 * with center frequency 5955, its diff is 5985 - 5955 = 30.
11118 	 * bandwidth=160 MHz, center frequency is 6025, lowest channel is 1
11119 	 * with center frequency 5955, its diff is 6025 - 5955 = 70.
11120 	 * bandwidth=320 MHz, center frequency is 6105, lowest channel is 1
11121 	 * with center frequency 5955, its diff is 6105 - 5955 = 70.
11122 	 */
11123 	switch (chan_def->width) {
11124 	case NL80211_CHAN_WIDTH_320:
11125 		diff_seq = 150;
11126 		break;
11127 	case NL80211_CHAN_WIDTH_160:
11128 		diff_seq = 70;
11129 		break;
11130 	case NL80211_CHAN_WIDTH_80:
11131 		diff_seq = 30;
11132 		break;
11133 	case NL80211_CHAN_WIDTH_40:
11134 		diff_seq = 10;
11135 		break;
11136 	default:
11137 		diff_seq = 0;
11138 	}
11139 
11140 	return chan_def->center_freq1 - diff_seq;
11141 }
11142 
ath12k_mac_get_seg_freq(struct cfg80211_chan_def * chan_def,u16 start_seq,u8 seq)11143 static u16 ath12k_mac_get_seg_freq(struct cfg80211_chan_def *chan_def,
11144 				   u16 start_seq, u8 seq)
11145 {
11146 	u16 seg_seq;
11147 
11148 	/* It is to get the center frequency of the specific bandwidth.
11149 	 * start_seq means the lowest channel number's center frequency.
11150 	 * seq 0/1/2/3 means 20 MHz/40 MHz/80 MHz/160 MHz.
11151 	 * For example,
11152 	 * lowest channel is 1, its center frequency 5955,
11153 	 * center frequency is 5955 when bandwidth=20 MHz, its diff is 5955 - 5955 = 0.
11154 	 * lowest channel is 1, its center frequency 5955,
11155 	 * center frequency is 5965 when bandwidth=40 MHz, its diff is 5965 - 5955 = 10.
11156 	 * lowest channel is 1, its center frequency 5955,
11157 	 * center frequency is 5985 when bandwidth=80 MHz, its diff is 5985 - 5955 = 30.
11158 	 * lowest channel is 1, its center frequency 5955,
11159 	 * center frequency is 6025 when bandwidth=160 MHz, its diff is 6025 - 5955 = 70.
11160 	 */
11161 	seg_seq = 10 * (BIT(seq) - 1);
11162 	return seg_seq + start_seq;
11163 }
11164 
ath12k_mac_get_psd_channel(struct ath12k * ar,u16 step_freq,u16 * start_freq,u16 * center_freq,u8 i,struct ieee80211_channel ** temp_chan,s8 * tx_power)11165 static void ath12k_mac_get_psd_channel(struct ath12k *ar,
11166 				       u16 step_freq,
11167 				       u16 *start_freq,
11168 				       u16 *center_freq,
11169 				       u8 i,
11170 				       struct ieee80211_channel **temp_chan,
11171 				       s8 *tx_power)
11172 {
11173 	/* It is to get the center frequency for each 20 MHz.
11174 	 * For example, if the chan is 160 MHz and center frequency is 6025,
11175 	 * then it include 8 channels, they are 1/5/9/13/17/21/25/29,
11176 	 * channel number 1's center frequency is 5955, it is parameter start_freq.
11177 	 * parameter i is the step of the 8 channels. i is 0~7 for the 8 channels.
11178 	 * the channel 1/5/9/13/17/21/25/29 maps i=0/1/2/3/4/5/6/7,
11179 	 * and maps its center frequency is 5955/5975/5995/6015/6035/6055/6075/6095,
11180 	 * the gap is 20 for each channel, parameter step_freq means the gap.
11181 	 * after get the center frequency of each channel, it is easy to find the
11182 	 * struct ieee80211_channel of it and get the max_reg_power.
11183 	 */
11184 	*center_freq = *start_freq + i * step_freq;
11185 	*temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11186 	*tx_power = (*temp_chan)->max_reg_power;
11187 }
11188 
ath12k_mac_get_eirp_power(struct ath12k * ar,u16 * start_freq,u16 * center_freq,u8 i,struct ieee80211_channel ** temp_chan,struct cfg80211_chan_def * def,s8 * tx_power)11189 static void ath12k_mac_get_eirp_power(struct ath12k *ar,
11190 				      u16 *start_freq,
11191 				      u16 *center_freq,
11192 				      u8 i,
11193 				      struct ieee80211_channel **temp_chan,
11194 				      struct cfg80211_chan_def *def,
11195 				      s8 *tx_power)
11196 {
11197 	/* It is to get the center frequency for 20 MHz/40 MHz/80 MHz/
11198 	 * 160 MHz bandwidth, and then plus 10 to the center frequency,
11199 	 * it is the center frequency of a channel number.
11200 	 * For example, when configured channel number is 1.
11201 	 * center frequency is 5965 when bandwidth=40 MHz, after plus 10, it is 5975,
11202 	 * then it is channel number 5.
11203 	 * center frequency is 5985 when bandwidth=80 MHz, after plus 10, it is 5995,
11204 	 * then it is channel number 9.
11205 	 * center frequency is 6025 when bandwidth=160 MHz, after plus 10, it is 6035,
11206 	 * then it is channel number 17.
11207 	 * after get the center frequency of each channel, it is easy to find the
11208 	 * struct ieee80211_channel of it and get the max_reg_power.
11209 	 */
11210 	*center_freq = ath12k_mac_get_seg_freq(def, *start_freq, i);
11211 
11212 	/* For the 20 MHz, its center frequency is same with same channel */
11213 	if (i != 0)
11214 		*center_freq += 10;
11215 
11216 	*temp_chan = ieee80211_get_channel(ar->ah->hw->wiphy, *center_freq);
11217 	*tx_power = (*temp_chan)->max_reg_power;
11218 }
11219 
ath12k_mac_fill_reg_tpc_info(struct ath12k * ar,struct ath12k_link_vif * arvif,struct ieee80211_chanctx_conf * ctx)11220 void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
11221 				  struct ath12k_link_vif *arvif,
11222 				  struct ieee80211_chanctx_conf *ctx)
11223 {
11224 	struct ath12k_base *ab = ar->ab;
11225 	struct ath12k_reg_tpc_power_info *reg_tpc_info = &arvif->reg_tpc_info;
11226 	struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11227 	struct ieee80211_channel *chan, *temp_chan;
11228 	u8 pwr_lvl_idx, num_pwr_levels, pwr_reduction;
11229 	bool is_psd_power = false, is_tpe_present = false;
11230 	s8 max_tx_power[ATH12K_NUM_PWR_LEVELS], psd_power, tx_power;
11231 	s8 eirp_power = 0;
11232 	struct ath12k_vif *ahvif = arvif->ahvif;
11233 	u16 start_freq, center_freq;
11234 	u8 reg_6ghz_power_mode;
11235 
11236 	chan = ctx->def.chan;
11237 	start_freq = ath12k_mac_get_6ghz_start_frequency(&ctx->def);
11238 	pwr_reduction = bss_conf->pwr_reduction;
11239 
11240 	if (arvif->reg_tpc_info.num_pwr_levels) {
11241 		is_tpe_present = true;
11242 		num_pwr_levels = arvif->reg_tpc_info.num_pwr_levels;
11243 	} else {
11244 		num_pwr_levels = ath12k_mac_get_num_pwr_levels(&ctx->def);
11245 	}
11246 
11247 	for (pwr_lvl_idx = 0; pwr_lvl_idx < num_pwr_levels; pwr_lvl_idx++) {
11248 		/* STA received TPE IE*/
11249 		if (is_tpe_present) {
11250 			/* local power is PSD power*/
11251 			if (chan->flags & IEEE80211_CHAN_PSD) {
11252 				/* Connecting AP is psd power */
11253 				if (reg_tpc_info->is_psd_power) {
11254 					is_psd_power = true;
11255 					ath12k_mac_get_psd_channel(ar, 20,
11256 								   &start_freq,
11257 								   &center_freq,
11258 								   pwr_lvl_idx,
11259 								   &temp_chan,
11260 								   &tx_power);
11261 					psd_power = temp_chan->psd;
11262 					eirp_power = tx_power;
11263 					max_tx_power[pwr_lvl_idx] =
11264 						min_t(s8,
11265 						      psd_power,
11266 						      reg_tpc_info->tpe[pwr_lvl_idx]);
11267 				/* Connecting AP is not psd power */
11268 				} else {
11269 					ath12k_mac_get_eirp_power(ar,
11270 								  &start_freq,
11271 								  &center_freq,
11272 								  pwr_lvl_idx,
11273 								  &temp_chan,
11274 								  &ctx->def,
11275 								  &tx_power);
11276 					psd_power = temp_chan->psd;
11277 					/* convert psd power to EIRP power based
11278 					 * on channel width
11279 					 */
11280 					tx_power =
11281 						min_t(s8, tx_power,
11282 						      psd_power + 13 + pwr_lvl_idx * 3);
11283 					max_tx_power[pwr_lvl_idx] =
11284 						min_t(s8,
11285 						      tx_power,
11286 						      reg_tpc_info->tpe[pwr_lvl_idx]);
11287 				}
11288 			/* local power is not PSD power */
11289 			} else {
11290 				/* Connecting AP is psd power */
11291 				if (reg_tpc_info->is_psd_power) {
11292 					is_psd_power = true;
11293 					ath12k_mac_get_psd_channel(ar, 20,
11294 								   &start_freq,
11295 								   &center_freq,
11296 								   pwr_lvl_idx,
11297 								   &temp_chan,
11298 								   &tx_power);
11299 					eirp_power = tx_power;
11300 					max_tx_power[pwr_lvl_idx] =
11301 						reg_tpc_info->tpe[pwr_lvl_idx];
11302 				/* Connecting AP is not psd power */
11303 				} else {
11304 					ath12k_mac_get_eirp_power(ar,
11305 								  &start_freq,
11306 								  &center_freq,
11307 								  pwr_lvl_idx,
11308 								  &temp_chan,
11309 								  &ctx->def,
11310 								  &tx_power);
11311 					max_tx_power[pwr_lvl_idx] =
11312 						min_t(s8,
11313 						      tx_power,
11314 						      reg_tpc_info->tpe[pwr_lvl_idx]);
11315 				}
11316 			}
11317 		/* STA not received TPE IE */
11318 		} else {
11319 			/* local power is PSD power*/
11320 			if (chan->flags & IEEE80211_CHAN_PSD) {
11321 				is_psd_power = true;
11322 				ath12k_mac_get_psd_channel(ar, 20,
11323 							   &start_freq,
11324 							   &center_freq,
11325 							   pwr_lvl_idx,
11326 							   &temp_chan,
11327 							   &tx_power);
11328 				psd_power = temp_chan->psd;
11329 				eirp_power = tx_power;
11330 				max_tx_power[pwr_lvl_idx] = psd_power;
11331 			} else {
11332 				ath12k_mac_get_eirp_power(ar,
11333 							  &start_freq,
11334 							  &center_freq,
11335 							  pwr_lvl_idx,
11336 							  &temp_chan,
11337 							  &ctx->def,
11338 							  &tx_power);
11339 				max_tx_power[pwr_lvl_idx] = tx_power;
11340 			}
11341 		}
11342 
11343 		if (is_psd_power) {
11344 			/* If AP local power constraint is present */
11345 			if (pwr_reduction)
11346 				eirp_power = eirp_power - pwr_reduction;
11347 
11348 			/* If firmware updated max tx power is non zero, then take
11349 			 * the min of firmware updated ap tx power
11350 			 * and max power derived from above mentioned parameters.
11351 			 */
11352 			ath12k_dbg(ab, ATH12K_DBG_MAC,
11353 				   "eirp power : %d firmware report power : %d\n",
11354 				   eirp_power, ar->max_allowed_tx_power);
11355 			/* Firmware reports lower max_allowed_tx_power during vdev
11356 			 * start response. In case of 6 GHz, firmware is not aware
11357 			 * of EIRP power unless driver sets EIRP power through WMI
11358 			 * TPC command. So radio which does not support idle power
11359 			 * save can set maximum calculated EIRP power directly to
11360 			 * firmware through TPC command without min comparison with
11361 			 * vdev start response's max_allowed_tx_power.
11362 			 */
11363 			if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11364 				eirp_power = min_t(s8,
11365 						   eirp_power,
11366 						   ar->max_allowed_tx_power);
11367 		} else {
11368 			/* If AP local power constraint is present */
11369 			if (pwr_reduction)
11370 				max_tx_power[pwr_lvl_idx] =
11371 					max_tx_power[pwr_lvl_idx] - pwr_reduction;
11372 			/* If firmware updated max tx power is non zero, then take
11373 			 * the min of firmware updated ap tx power
11374 			 * and max power derived from above mentioned parameters.
11375 			 */
11376 			if (ar->max_allowed_tx_power && ab->hw_params->idle_ps)
11377 				max_tx_power[pwr_lvl_idx] =
11378 					min_t(s8,
11379 					      max_tx_power[pwr_lvl_idx],
11380 					      ar->max_allowed_tx_power);
11381 		}
11382 		reg_tpc_info->chan_power_info[pwr_lvl_idx].chan_cfreq = center_freq;
11383 		reg_tpc_info->chan_power_info[pwr_lvl_idx].tx_power =
11384 			max_tx_power[pwr_lvl_idx];
11385 	}
11386 
11387 	reg_tpc_info->num_pwr_levels = num_pwr_levels;
11388 	reg_tpc_info->is_psd_power = is_psd_power;
11389 	reg_tpc_info->eirp_power = eirp_power;
11390 	if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11391 		reg_6ghz_power_mode = bss_conf->power_type;
11392 	else
11393 		/* For now, LPI is the only supported AP power mode */
11394 		reg_6ghz_power_mode = IEEE80211_REG_LPI_AP;
11395 
11396 	reg_tpc_info->ap_power_type =
11397 		ath12k_reg_ap_pwr_convert(reg_6ghz_power_mode);
11398 }
11399 
ath12k_mac_parse_tx_pwr_env(struct ath12k * ar,struct ath12k_link_vif * arvif)11400 static void ath12k_mac_parse_tx_pwr_env(struct ath12k *ar,
11401 					struct ath12k_link_vif *arvif)
11402 {
11403 	struct ieee80211_bss_conf *bss_conf = ath12k_mac_get_link_bss_conf(arvif);
11404 	struct ath12k_reg_tpc_power_info *tpc_info = &arvif->reg_tpc_info;
11405 	struct ieee80211_parsed_tpe_eirp *local_non_psd, *reg_non_psd;
11406 	struct ieee80211_parsed_tpe_psd *local_psd, *reg_psd;
11407 	struct ieee80211_parsed_tpe *tpe = &bss_conf->tpe;
11408 	enum wmi_reg_6g_client_type client_type;
11409 	struct ath12k_reg_info *reg_info;
11410 	struct ath12k_base *ab = ar->ab;
11411 	bool psd_valid, non_psd_valid;
11412 	int i;
11413 
11414 	reg_info = ab->reg_info[ar->pdev_idx];
11415 	client_type = reg_info->client_type;
11416 
11417 	local_psd = &tpe->psd_local[client_type];
11418 	reg_psd = &tpe->psd_reg_client[client_type];
11419 	local_non_psd = &tpe->max_local[client_type];
11420 	reg_non_psd = &tpe->max_reg_client[client_type];
11421 
11422 	psd_valid = local_psd->valid | reg_psd->valid;
11423 	non_psd_valid = local_non_psd->valid | reg_non_psd->valid;
11424 
11425 	if (!psd_valid && !non_psd_valid) {
11426 		ath12k_warn(ab,
11427 			    "no transmit power envelope match client power type %d\n",
11428 			    client_type);
11429 		return;
11430 	}
11431 
11432 	if (psd_valid) {
11433 		tpc_info->is_psd_power = true;
11434 
11435 		tpc_info->num_pwr_levels = max(local_psd->count,
11436 					       reg_psd->count);
11437 		tpc_info->num_pwr_levels =
11438 				min3(tpc_info->num_pwr_levels,
11439 				     IEEE80211_TPE_PSD_ENTRIES_320MHZ,
11440 				     ATH12K_NUM_PWR_LEVELS);
11441 
11442 		for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11443 			tpc_info->tpe[i] = min(local_psd->power[i],
11444 					       reg_psd->power[i]) / 2;
11445 			ath12k_dbg(ab, ATH12K_DBG_MAC,
11446 				   "TPE PSD power[%d] : %d\n",
11447 				   i, tpc_info->tpe[i]);
11448 		}
11449 	} else {
11450 		tpc_info->is_psd_power = false;
11451 		tpc_info->eirp_power = 0;
11452 
11453 		tpc_info->num_pwr_levels = max(local_non_psd->count,
11454 					       reg_non_psd->count);
11455 		tpc_info->num_pwr_levels =
11456 				min3(tpc_info->num_pwr_levels,
11457 				     IEEE80211_TPE_EIRP_ENTRIES_320MHZ,
11458 				     ATH12K_NUM_PWR_LEVELS);
11459 
11460 		for (i = 0; i < tpc_info->num_pwr_levels; i++) {
11461 			tpc_info->tpe[i] = min(local_non_psd->power[i],
11462 					       reg_non_psd->power[i]) / 2;
11463 			ath12k_dbg(ab, ATH12K_DBG_MAC,
11464 				   "non PSD power[%d] : %d\n",
11465 				   i, tpc_info->tpe[i]);
11466 		}
11467 	}
11468 }
11469 
11470 static int
ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf,struct ieee80211_chanctx_conf * ctx)11471 ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
11472 				 struct ieee80211_vif *vif,
11473 				 struct ieee80211_bss_conf *link_conf,
11474 				 struct ieee80211_chanctx_conf *ctx)
11475 {
11476 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11477 	struct ath12k *ar;
11478 	struct ath12k_base *ab;
11479 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11480 	u8 link_id = link_conf->link_id;
11481 	struct ath12k_link_vif *arvif;
11482 	int ret;
11483 
11484 	lockdep_assert_wiphy(hw->wiphy);
11485 
11486 	/* For multi radio wiphy, the vdev was not created during add_interface
11487 	 * create now since we have a channel ctx now to assign to a specific ar/fw
11488 	 */
11489 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
11490 	if (!arvif) {
11491 		WARN_ON(1);
11492 		return -ENOMEM;
11493 	}
11494 
11495 	ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
11496 	if (!ar) {
11497 		ath12k_hw_warn(ah, "failed to assign chanctx for vif %pM link id %u link vif is already started",
11498 			       vif->addr, link_id);
11499 		return -EINVAL;
11500 	}
11501 
11502 	ab = ar->ab;
11503 
11504 	ath12k_dbg(ab, ATH12K_DBG_MAC,
11505 		   "mac chanctx assign ptr %p vdev_id %i\n",
11506 		   ctx, arvif->vdev_id);
11507 
11508 	if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
11509 	    ctx->def.chan->band == NL80211_BAND_6GHZ &&
11510 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA)
11511 		ath12k_mac_parse_tx_pwr_env(ar, arvif);
11512 
11513 	arvif->punct_bitmap = ctx->def.punctured;
11514 
11515 	/* for some targets bss peer must be created before vdev_start */
11516 	if (ab->hw_params->vdev_start_delay &&
11517 	    ahvif->vdev_type != WMI_VDEV_TYPE_AP &&
11518 	    ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR &&
11519 	    !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {
11520 		ret = 0;
11521 		goto out;
11522 	}
11523 
11524 	if (WARN_ON(arvif->is_started)) {
11525 		ret = -EBUSY;
11526 		goto out;
11527 	}
11528 
11529 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11530 		ret = ath12k_mac_monitor_start(ar);
11531 		if (ret) {
11532 			ath12k_mac_monitor_vdev_delete(ar);
11533 			goto out;
11534 		}
11535 
11536 		arvif->is_started = true;
11537 		goto out;
11538 	}
11539 
11540 	ret = ath12k_mac_vdev_start(arvif, ctx);
11541 	if (ret) {
11542 		ath12k_warn(ab, "failed to start vdev %i addr %pM on freq %d: %d\n",
11543 			    arvif->vdev_id, vif->addr,
11544 			    ctx->def.chan->center_freq, ret);
11545 		goto out;
11546 	}
11547 
11548 	arvif->is_started = true;
11549 
11550 	/* TODO: Setup ps and cts/rts protection */
11551 
11552 out:
11553 	return ret;
11554 }
11555 
11556 static void
ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_bss_conf * link_conf,struct ieee80211_chanctx_conf * ctx)11557 ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
11558 				   struct ieee80211_vif *vif,
11559 				   struct ieee80211_bss_conf *link_conf,
11560 				   struct ieee80211_chanctx_conf *ctx)
11561 {
11562 	struct ath12k *ar;
11563 	struct ath12k_base *ab;
11564 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
11565 	struct ath12k_link_vif *arvif;
11566 	u8 link_id = link_conf->link_id;
11567 	int ret;
11568 
11569 	lockdep_assert_wiphy(hw->wiphy);
11570 
11571 	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11572 
11573 	/* The vif is expected to be attached to an ar's VDEV.
11574 	 * We leave the vif/vdev in this function as is
11575 	 * and not delete the vdev symmetric to assign_vif_chanctx()
11576 	 * the VDEV will be deleted and unassigned either during
11577 	 * remove_interface() or when there is a change in channel
11578 	 * that moves the vif to a new ar
11579 	 */
11580 	if (!arvif || !arvif->is_created)
11581 		return;
11582 
11583 	ar = arvif->ar;
11584 	ab = ar->ab;
11585 
11586 	ath12k_dbg(ab, ATH12K_DBG_MAC,
11587 		   "mac chanctx unassign ptr %p vdev_id %i\n",
11588 		   ctx, arvif->vdev_id);
11589 
11590 	WARN_ON(!arvif->is_started);
11591 
11592 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
11593 		ret = ath12k_mac_monitor_stop(ar);
11594 		if (ret)
11595 			return;
11596 
11597 		arvif->is_started = false;
11598 	}
11599 
11600 	if (ahvif->vdev_type != WMI_VDEV_TYPE_STA &&
11601 	    ahvif->vdev_type != WMI_VDEV_TYPE_MONITOR) {
11602 		ath12k_bss_disassoc(ar, arvif);
11603 		ret = ath12k_mac_vdev_stop(arvif);
11604 		if (ret)
11605 			ath12k_warn(ab, "failed to stop vdev %i: %d\n",
11606 				    arvif->vdev_id, ret);
11607 	}
11608 	arvif->is_started = false;
11609 
11610 	if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
11611 	    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
11612 	    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
11613 	    ar->state_11d != ATH12K_11D_PREPARING) {
11614 		reinit_completion(&ar->completed_11d_scan);
11615 		ar->state_11d = ATH12K_11D_PREPARING;
11616 	}
11617 
11618 	if (ar->scan.arvif == arvif && ar->scan.state == ATH12K_SCAN_RUNNING) {
11619 		ath12k_scan_abort(ar);
11620 		ar->scan.arvif = NULL;
11621 	}
11622 }
11623 
11624 static int
ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode)11625 ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
11626 				 struct ieee80211_vif_chanctx_switch *vifs,
11627 				 int n_vifs,
11628 				 enum ieee80211_chanctx_switch_mode mode)
11629 {
11630 	struct ath12k *ar;
11631 
11632 	lockdep_assert_wiphy(hw->wiphy);
11633 
11634 	ar = ath12k_get_ar_by_ctx(hw, vifs->old_ctx);
11635 	if (!ar)
11636 		return -EINVAL;
11637 
11638 	/* Switching channels across radio is not allowed */
11639 	if (ar != ath12k_get_ar_by_ctx(hw, vifs->new_ctx))
11640 		return -EINVAL;
11641 
11642 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
11643 		   "mac chanctx switch n_vifs %d mode %d\n",
11644 		   n_vifs, mode);
11645 	ath12k_mac_update_vif_chan(ar, vifs, n_vifs);
11646 
11647 	return 0;
11648 }
11649 
11650 static int
ath12k_set_vdev_param_to_all_vifs(struct ath12k * ar,int param,u32 value)11651 ath12k_set_vdev_param_to_all_vifs(struct ath12k *ar, int param, u32 value)
11652 {
11653 	struct ath12k_link_vif *arvif;
11654 	int ret = 0;
11655 
11656 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11657 
11658 	list_for_each_entry(arvif, &ar->arvifs, list) {
11659 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "setting mac vdev %d param %d value %d\n",
11660 			   param, arvif->vdev_id, value);
11661 
11662 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11663 						    param, value);
11664 		if (ret) {
11665 			ath12k_warn(ar->ab, "failed to set param %d for vdev %d: %d\n",
11666 				    param, arvif->vdev_id, ret);
11667 			break;
11668 		}
11669 	}
11670 
11671 	return ret;
11672 }
11673 
11674 /* mac80211 stores device specific RTS/Fragmentation threshold value,
11675  * this is set interface specific to firmware from ath12k driver
11676  */
ath12k_mac_op_set_rts_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11677 static int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
11678 					   int radio_idx, u32 value)
11679 {
11680 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11681 	struct wiphy *wiphy = hw->wiphy;
11682 	struct ath12k *ar;
11683 	int param_id = WMI_VDEV_PARAM_RTS_THRESHOLD;
11684 	int ret = 0, ret_err, i;
11685 
11686 	lockdep_assert_wiphy(hw->wiphy);
11687 
11688 	if (radio_idx >= wiphy->n_radio || radio_idx < -1)
11689 		return -EINVAL;
11690 
11691 	if (radio_idx != -1) {
11692 		/* Update RTS threshold in specified radio */
11693 		ar = ath12k_ah_to_ar(ah, radio_idx);
11694 		ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11695 		if (ret) {
11696 			ath12k_warn(ar->ab,
11697 				    "failed to set RTS config for all vdevs of pdev %d",
11698 				    ar->pdev->pdev_id);
11699 			return ret;
11700 		}
11701 
11702 		ar->rts_threshold = value;
11703 		return 0;
11704 	}
11705 
11706 	/* Radio_index passed is -1, so set RTS threshold for all radios. */
11707 	for_each_ar(ah, ar, i) {
11708 		ret = ath12k_set_vdev_param_to_all_vifs(ar, param_id, value);
11709 		if (ret) {
11710 			ath12k_warn(ar->ab, "failed to set RTS config for all vdevs of pdev %d",
11711 				    ar->pdev->pdev_id);
11712 			break;
11713 		}
11714 	}
11715 	if (!ret) {
11716 		/* Setting new RTS threshold for vdevs of all radios passed, so update
11717 		 * the RTS threshold value for all radios
11718 		 */
11719 		for_each_ar(ah, ar, i)
11720 			ar->rts_threshold = value;
11721 		return 0;
11722 	}
11723 
11724 	/* RTS threshold config failed, revert to the previous RTS threshold */
11725 	for (i = i - 1; i >= 0; i--) {
11726 		ar = ath12k_ah_to_ar(ah, i);
11727 		ret_err = ath12k_set_vdev_param_to_all_vifs(ar, param_id,
11728 							    ar->rts_threshold);
11729 		if (ret_err)
11730 			ath12k_warn(ar->ab,
11731 				    "failed to restore RTS threshold for all vdevs of pdev %d",
11732 				    ar->pdev->pdev_id);
11733 	}
11734 
11735 	return ret;
11736 }
11737 
ath12k_mac_op_set_frag_threshold(struct ieee80211_hw * hw,int radio_idx,u32 value)11738 static int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
11739 					    int radio_idx, u32 value)
11740 {
11741 	/* Even though there's a WMI vdev param for fragmentation threshold no
11742 	 * known firmware actually implements it. Moreover it is not possible to
11743 	 * rely frame fragmentation to mac80211 because firmware clears the
11744 	 * "more fragments" bit in frame control making it impossible for remote
11745 	 * devices to reassemble frames.
11746 	 *
11747 	 * Hence implement a dummy callback just to say fragmentation isn't
11748 	 * supported. This effectively prevents mac80211 from doing frame
11749 	 * fragmentation in software.
11750 	 */
11751 
11752 	lockdep_assert_wiphy(hw->wiphy);
11753 
11754 	return -EOPNOTSUPP;
11755 }
11756 
ath12k_mac_flush(struct ath12k * ar)11757 static int ath12k_mac_flush(struct ath12k *ar)
11758 {
11759 	long time_left;
11760 	int ret = 0;
11761 
11762 	time_left = wait_event_timeout(ar->dp.tx_empty_waitq,
11763 				       (atomic_read(&ar->dp.num_tx_pending) == 0),
11764 				       ATH12K_FLUSH_TIMEOUT);
11765 	if (time_left == 0) {
11766 		ath12k_warn(ar->ab,
11767 			    "failed to flush transmit queue, data pkts pending %d\n",
11768 			    atomic_read(&ar->dp.num_tx_pending));
11769 		ret = -ETIMEDOUT;
11770 	}
11771 
11772 	time_left = wait_event_timeout(ar->txmgmt_empty_waitq,
11773 				       (atomic_read(&ar->num_pending_mgmt_tx) == 0),
11774 				       ATH12K_FLUSH_TIMEOUT);
11775 	if (time_left == 0) {
11776 		ath12k_warn(ar->ab,
11777 			    "failed to flush mgmt transmit queue, mgmt pkts pending %d\n",
11778 			    atomic_read(&ar->num_pending_mgmt_tx));
11779 		ret = -ETIMEDOUT;
11780 	}
11781 
11782 	return ret;
11783 }
11784 
ath12k_mac_wait_tx_complete(struct ath12k * ar)11785 int ath12k_mac_wait_tx_complete(struct ath12k *ar)
11786 {
11787 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11788 
11789 	ath12k_mac_drain_tx(ar);
11790 	return ath12k_mac_flush(ar);
11791 }
11792 
ath12k_mac_op_flush(struct ieee80211_hw * hw,struct ieee80211_vif * vif,u32 queues,bool drop)11793 static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
11794 				u32 queues, bool drop)
11795 {
11796 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
11797 	struct ath12k_link_vif *arvif;
11798 	struct ath12k_vif *ahvif;
11799 	unsigned long links;
11800 	struct ath12k *ar;
11801 	u8 link_id;
11802 	int i;
11803 
11804 	lockdep_assert_wiphy(hw->wiphy);
11805 
11806 	if (drop)
11807 		return;
11808 
11809 	/* vif can be NULL when flush() is considered for hw */
11810 	if (!vif) {
11811 		for_each_ar(ah, ar, i)
11812 			ath12k_mac_flush(ar);
11813 		return;
11814 	}
11815 
11816 	for_each_ar(ah, ar, i)
11817 		wiphy_work_flush(hw->wiphy, &ar->wmi_mgmt_tx_work);
11818 
11819 	ahvif = ath12k_vif_to_ahvif(vif);
11820 	links = ahvif->links_map;
11821 	for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
11822 		arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
11823 		if (!(arvif && arvif->ar))
11824 			continue;
11825 
11826 		ath12k_mac_flush(arvif->ar);
11827 	}
11828 }
11829 
11830 static int
ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11831 ath12k_mac_bitrate_mask_num_ht_rates(struct ath12k *ar,
11832 				     enum nl80211_band band,
11833 				     const struct cfg80211_bitrate_mask *mask)
11834 {
11835 	int num_rates = 0;
11836 	int i;
11837 
11838 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++)
11839 		num_rates += hweight16(mask->control[band].ht_mcs[i]);
11840 
11841 	return num_rates;
11842 }
11843 
11844 static bool
ath12k_mac_has_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)11845 ath12k_mac_has_single_legacy_rate(struct ath12k *ar,
11846 				  enum nl80211_band band,
11847 				  const struct cfg80211_bitrate_mask *mask)
11848 {
11849 	int num_rates = 0;
11850 
11851 	num_rates = hweight32(mask->control[band].legacy);
11852 
11853 	if (ath12k_mac_bitrate_mask_num_ht_rates(ar, band, mask))
11854 		return false;
11855 
11856 	if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
11857 		return false;
11858 
11859 	if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask))
11860 		return false;
11861 
11862 	return num_rates == 1;
11863 }
11864 
11865 static __le16
ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap * he_cap)11866 ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
11867 {
11868 	if (he_cap->he_cap_elem.phy_cap_info[0] &
11869 	    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
11870 		return he_cap->he_mcs_nss_supp.tx_mcs_160;
11871 
11872 	return he_cap->he_mcs_nss_supp.tx_mcs_80;
11873 }
11874 
11875 static bool
ath12k_mac_bitrate_mask_get_single_nss(struct ath12k * ar,struct ieee80211_vif * vif,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,int * nss)11876 ath12k_mac_bitrate_mask_get_single_nss(struct ath12k *ar,
11877 				       struct ieee80211_vif *vif,
11878 				       enum nl80211_band band,
11879 				       const struct cfg80211_bitrate_mask *mask,
11880 				       int *nss)
11881 {
11882 	struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
11883 	u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
11884 	const struct ieee80211_sta_he_cap *he_cap;
11885 	u16 he_mcs_map = 0;
11886 	u8 ht_nss_mask = 0;
11887 	u8 vht_nss_mask = 0;
11888 	u8 he_nss_mask = 0;
11889 	int i;
11890 
11891 	/* No need to consider legacy here. Basic rates are always present
11892 	 * in bitrate mask
11893 	 */
11894 
11895 	for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) {
11896 		if (mask->control[band].ht_mcs[i] == 0)
11897 			continue;
11898 		else if (mask->control[band].ht_mcs[i] ==
11899 			 sband->ht_cap.mcs.rx_mask[i])
11900 			ht_nss_mask |= BIT(i);
11901 		else
11902 			return false;
11903 	}
11904 
11905 	for (i = 0; i < ARRAY_SIZE(mask->control[band].vht_mcs); i++) {
11906 		if (mask->control[band].vht_mcs[i] == 0)
11907 			continue;
11908 		else if (mask->control[band].vht_mcs[i] ==
11909 			 ath12k_mac_get_max_vht_mcs_map(vht_mcs_map, i))
11910 			vht_nss_mask |= BIT(i);
11911 		else
11912 			return false;
11913 	}
11914 
11915 	he_cap = ieee80211_get_he_iftype_cap_vif(sband, vif);
11916 	if (!he_cap)
11917 		return false;
11918 
11919 	he_mcs_map = le16_to_cpu(ath12k_mac_get_tx_mcs_map(he_cap));
11920 
11921 	for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
11922 		if (mask->control[band].he_mcs[i] == 0)
11923 			continue;
11924 
11925 		if (mask->control[band].he_mcs[i] ==
11926 		    ath12k_mac_get_max_he_mcs_map(he_mcs_map, i))
11927 			he_nss_mask |= BIT(i);
11928 		else
11929 			return false;
11930 	}
11931 
11932 	if (ht_nss_mask != vht_nss_mask || ht_nss_mask != he_nss_mask)
11933 		return false;
11934 
11935 	if (ht_nss_mask == 0)
11936 		return false;
11937 
11938 	if (BIT(fls(ht_nss_mask)) - 1 != ht_nss_mask)
11939 		return false;
11940 
11941 	*nss = fls(ht_nss_mask);
11942 
11943 	return true;
11944 }
11945 
11946 static int
ath12k_mac_get_single_legacy_rate(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,u32 * rate,u8 * nss)11947 ath12k_mac_get_single_legacy_rate(struct ath12k *ar,
11948 				  enum nl80211_band band,
11949 				  const struct cfg80211_bitrate_mask *mask,
11950 				  u32 *rate, u8 *nss)
11951 {
11952 	int rate_idx;
11953 	u16 bitrate;
11954 	u8 preamble;
11955 	u8 hw_rate;
11956 
11957 	if (hweight32(mask->control[band].legacy) != 1)
11958 		return -EINVAL;
11959 
11960 	rate_idx = ffs(mask->control[band].legacy) - 1;
11961 
11962 	if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ)
11963 		rate_idx += ATH12K_MAC_FIRST_OFDM_RATE_IDX;
11964 
11965 	hw_rate = ath12k_legacy_rates[rate_idx].hw_value;
11966 	bitrate = ath12k_legacy_rates[rate_idx].bitrate;
11967 
11968 	if (ath12k_mac_bitrate_is_cck(bitrate))
11969 		preamble = WMI_RATE_PREAMBLE_CCK;
11970 	else
11971 		preamble = WMI_RATE_PREAMBLE_OFDM;
11972 
11973 	*nss = 1;
11974 	*rate = ATH12K_HW_RATE_CODE(hw_rate, 0, preamble);
11975 
11976 	return 0;
11977 }
11978 
11979 static int
ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif * arvif,u8 he_gi,u8 he_ltf)11980 ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 he_gi, u8 he_ltf)
11981 {
11982 	struct ath12k *ar = arvif->ar;
11983 	int ret;
11984 
11985 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
11986 
11987 	/* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
11988 	if (he_gi && he_gi != 0xFF)
11989 		he_gi += 1;
11990 
11991 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
11992 					    WMI_VDEV_PARAM_SGI, he_gi);
11993 	if (ret) {
11994 		ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n",
11995 			    he_gi, ret);
11996 		return ret;
11997 	}
11998 	/* start from 1 */
11999 	if (he_ltf != 0xFF)
12000 		he_ltf += 1;
12001 
12002 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12003 					    WMI_VDEV_PARAM_HE_LTF, he_ltf);
12004 	if (ret) {
12005 		ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n",
12006 			    he_ltf, ret);
12007 		return ret;
12008 	}
12009 	return 0;
12010 }
12011 
12012 static int
ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif * arvif,u16 he_gi,u8 he_ltf)12013 ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 he_gi, u8 he_ltf)
12014 {
12015 	struct ath12k *ar = arvif->ar;
12016 	int ret;
12017 	u32 he_ar_gi_ltf;
12018 
12019 	if (he_gi != 0xFF) {
12020 		switch (he_gi) {
12021 		case NL80211_RATE_INFO_HE_GI_0_8:
12022 			he_gi = WMI_AUTORATE_800NS_GI;
12023 			break;
12024 		case NL80211_RATE_INFO_HE_GI_1_6:
12025 			he_gi = WMI_AUTORATE_1600NS_GI;
12026 			break;
12027 		case NL80211_RATE_INFO_HE_GI_3_2:
12028 			he_gi = WMI_AUTORATE_3200NS_GI;
12029 			break;
12030 		default:
12031 			ath12k_warn(ar->ab, "Invalid GI\n");
12032 			return -EINVAL;
12033 		}
12034 	}
12035 
12036 	if (he_ltf != 0xFF) {
12037 		switch (he_ltf) {
12038 		case NL80211_RATE_INFO_HE_1XLTF:
12039 			he_ltf = WMI_HE_AUTORATE_LTF_1X;
12040 			break;
12041 		case NL80211_RATE_INFO_HE_2XLTF:
12042 			he_ltf = WMI_HE_AUTORATE_LTF_2X;
12043 			break;
12044 		case NL80211_RATE_INFO_HE_4XLTF:
12045 			he_ltf = WMI_HE_AUTORATE_LTF_4X;
12046 			break;
12047 		default:
12048 			ath12k_warn(ar->ab, "Invalid LTF\n");
12049 			return -EINVAL;
12050 		}
12051 	}
12052 
12053 	he_ar_gi_ltf = he_gi | he_ltf;
12054 
12055 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12056 					    WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
12057 					    he_ar_gi_ltf);
12058 	if (ret) {
12059 		ath12k_warn(ar->ab,
12060 			    "failed to set HE autorate GI:%u, LTF:%u params, error:%d\n",
12061 			    he_gi, he_ltf, ret);
12062 		return ret;
12063 	}
12064 
12065 	return 0;
12066 }
12067 
ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)12068 static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
12069 {
12070 	switch (gi) {
12071 	case NL80211_TXRATE_DEFAULT_GI:
12072 		return WMI_GI_400_NS;
12073 	case NL80211_TXRATE_FORCE_LGI:
12074 		return WMI_GI_800_NS;
12075 	default:
12076 		return WMI_GI_400_NS;
12077 	}
12078 }
12079 
ath12k_mac_set_rate_params(struct ath12k_link_vif * arvif,u32 rate,u8 nss,u8 sgi,u8 ldpc,u8 he_gi,u8 he_ltf,bool he_fixed_rate)12080 static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
12081 				      u32 rate, u8 nss, u8 sgi, u8 ldpc,
12082 				      u8 he_gi, u8 he_ltf, bool he_fixed_rate)
12083 {
12084 	struct ieee80211_bss_conf *link_conf;
12085 	struct ath12k *ar = arvif->ar;
12086 	u32 vdev_param;
12087 	u32 param_value;
12088 	int ret;
12089 	bool he_support;
12090 
12091 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12092 
12093 	link_conf = ath12k_mac_get_link_bss_conf(arvif);
12094 	if (!link_conf)
12095 		return -EINVAL;
12096 
12097 	he_support = link_conf->he_support;
12098 
12099 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12100 		   "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 0x%02x ldpc 0x%02x\n",
12101 		   arvif->vdev_id, rate, nss, sgi, ldpc);
12102 
12103 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12104 		   "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
12105 		   he_ltf, he_fixed_rate);
12106 
12107 	if (!he_support) {
12108 		vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
12109 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12110 						    vdev_param, rate);
12111 		if (ret) {
12112 			ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
12113 				    rate, ret);
12114 			return ret;
12115 		}
12116 	}
12117 
12118 	vdev_param = WMI_VDEV_PARAM_NSS;
12119 
12120 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12121 					    vdev_param, nss);
12122 	if (ret) {
12123 		ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
12124 			    nss, ret);
12125 		return ret;
12126 	}
12127 
12128 	ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12129 					    WMI_VDEV_PARAM_LDPC, ldpc);
12130 	if (ret) {
12131 		ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
12132 			    ldpc, ret);
12133 		return ret;
12134 	}
12135 
12136 	if (he_support) {
12137 		if (he_fixed_rate)
12138 			ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf);
12139 		else
12140 			ret = ath12k_mac_set_auto_rate_gi_ltf(arvif, he_gi, he_ltf);
12141 		if (ret)
12142 			return ret;
12143 	} else {
12144 		vdev_param = WMI_VDEV_PARAM_SGI;
12145 		param_value = ath12k_mac_nlgi_to_wmigi(sgi);
12146 		ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
12147 						    vdev_param, param_value);
12148 		if (ret) {
12149 			ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
12150 				    sgi, ret);
12151 			return ret;
12152 		}
12153 	}
12154 
12155 	return 0;
12156 }
12157 
12158 static bool
ath12k_mac_vht_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12159 ath12k_mac_vht_mcs_range_present(struct ath12k *ar,
12160 				 enum nl80211_band band,
12161 				 const struct cfg80211_bitrate_mask *mask)
12162 {
12163 	int i;
12164 	u16 vht_mcs;
12165 
12166 	for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
12167 		vht_mcs = mask->control[band].vht_mcs[i];
12168 
12169 		switch (vht_mcs) {
12170 		case 0:
12171 		case BIT(8) - 1:
12172 		case BIT(9) - 1:
12173 		case BIT(10) - 1:
12174 			break;
12175 		default:
12176 			return false;
12177 		}
12178 	}
12179 
12180 	return true;
12181 }
12182 
12183 static bool
ath12k_mac_he_mcs_range_present(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask)12184 ath12k_mac_he_mcs_range_present(struct ath12k *ar,
12185 				enum nl80211_band band,
12186 				const struct cfg80211_bitrate_mask *mask)
12187 {
12188 	int i;
12189 	u16 he_mcs;
12190 
12191 	for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
12192 		he_mcs = mask->control[band].he_mcs[i];
12193 
12194 		switch (he_mcs) {
12195 		case 0:
12196 		case BIT(8) - 1:
12197 		case BIT(10) - 1:
12198 		case BIT(12) - 1:
12199 			break;
12200 		default:
12201 			return false;
12202 		}
12203 	}
12204 
12205 	return true;
12206 }
12207 
ath12k_mac_set_bitrate_mask_iter(void * data,struct ieee80211_sta * sta)12208 static void ath12k_mac_set_bitrate_mask_iter(void *data,
12209 					     struct ieee80211_sta *sta)
12210 {
12211 	struct ath12k_link_vif *arvif = data;
12212 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12213 	struct ath12k_link_sta *arsta;
12214 	struct ath12k *ar = arvif->ar;
12215 
12216 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12217 
12218 	arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12219 				  ahsta->link[arvif->link_id]);
12220 	if (!arsta || arsta->arvif != arvif)
12221 		return;
12222 
12223 	spin_lock_bh(&ar->data_lock);
12224 	arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
12225 	spin_unlock_bh(&ar->data_lock);
12226 
12227 	wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
12228 }
12229 
ath12k_mac_disable_peer_fixed_rate(void * data,struct ieee80211_sta * sta)12230 static void ath12k_mac_disable_peer_fixed_rate(void *data,
12231 					       struct ieee80211_sta *sta)
12232 {
12233 	struct ath12k_link_vif *arvif = data;
12234 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12235 	struct ath12k_link_sta *arsta;
12236 	struct ath12k *ar = arvif->ar;
12237 	int ret;
12238 
12239 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12240 
12241 	arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
12242 				  ahsta->link[arvif->link_id]);
12243 
12244 	if (!arsta || arsta->arvif != arvif)
12245 		return;
12246 
12247 	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
12248 					arvif->vdev_id,
12249 					WMI_PEER_PARAM_FIXED_RATE,
12250 					WMI_FIXED_RATE_NONE);
12251 	if (ret)
12252 		ath12k_warn(ar->ab,
12253 			    "failed to disable peer fixed rate for STA %pM ret %d\n",
12254 			    arsta->addr, ret);
12255 }
12256 
12257 static bool
ath12k_mac_validate_fixed_rate_settings(struct ath12k * ar,enum nl80211_band band,const struct cfg80211_bitrate_mask * mask,unsigned int link_id)12258 ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band band,
12259 					const struct cfg80211_bitrate_mask *mask,
12260 					unsigned int link_id)
12261 {
12262 	bool he_fixed_rate = false, vht_fixed_rate = false;
12263 	const u16 *vht_mcs_mask, *he_mcs_mask;
12264 	struct ieee80211_link_sta *link_sta;
12265 	struct ath12k_peer *peer, *tmp;
12266 	u8 vht_nss, he_nss;
12267 	int ret = true;
12268 
12269 	vht_mcs_mask = mask->control[band].vht_mcs;
12270 	he_mcs_mask = mask->control[band].he_mcs;
12271 
12272 	if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask) == 1)
12273 		vht_fixed_rate = true;
12274 
12275 	if (ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask) == 1)
12276 		he_fixed_rate = true;
12277 
12278 	if (!vht_fixed_rate && !he_fixed_rate)
12279 		return true;
12280 
12281 	vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
12282 	he_nss =  ath12k_mac_max_he_nss(he_mcs_mask);
12283 
12284 	rcu_read_lock();
12285 	spin_lock_bh(&ar->ab->base_lock);
12286 	list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
12287 		if (peer->sta) {
12288 			link_sta = rcu_dereference(peer->sta->link[link_id]);
12289 			if (!link_sta) {
12290 				ret = false;
12291 				goto exit;
12292 			}
12293 
12294 			if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
12295 					       link_sta->rx_nss < vht_nss)) {
12296 				ret = false;
12297 				goto exit;
12298 			}
12299 			if (he_fixed_rate && (!link_sta->he_cap.has_he ||
12300 					      link_sta->rx_nss < he_nss)) {
12301 				ret = false;
12302 				goto exit;
12303 			}
12304 		}
12305 	}
12306 exit:
12307 	spin_unlock_bh(&ar->ab->base_lock);
12308 	rcu_read_unlock();
12309 	return ret;
12310 }
12311 
12312 static int
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw * hw,struct ieee80211_vif * vif,const struct cfg80211_bitrate_mask * mask)12313 ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
12314 			       struct ieee80211_vif *vif,
12315 			       const struct cfg80211_bitrate_mask *mask)
12316 {
12317 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12318 	struct ath12k_link_vif *arvif;
12319 	struct cfg80211_chan_def def;
12320 	struct ath12k *ar;
12321 	enum nl80211_band band;
12322 	const u8 *ht_mcs_mask;
12323 	const u16 *vht_mcs_mask;
12324 	const u16 *he_mcs_mask;
12325 	u8 he_ltf = 0;
12326 	u8 he_gi = 0;
12327 	u32 rate;
12328 	u8 nss, mac_nss;
12329 	u8 sgi;
12330 	u8 ldpc;
12331 	int single_nss;
12332 	int ret;
12333 	int num_rates;
12334 	bool he_fixed_rate = false;
12335 
12336 	lockdep_assert_wiphy(hw->wiphy);
12337 
12338 	arvif = &ahvif->deflink;
12339 
12340 	ar = arvif->ar;
12341 	if (ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)) {
12342 		ret = -EPERM;
12343 		goto out;
12344 	}
12345 
12346 	band = def.chan->band;
12347 	ht_mcs_mask = mask->control[band].ht_mcs;
12348 	vht_mcs_mask = mask->control[band].vht_mcs;
12349 	he_mcs_mask = mask->control[band].he_mcs;
12350 	ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);
12351 
12352 	sgi = mask->control[band].gi;
12353 	if (sgi == NL80211_TXRATE_FORCE_SGI) {
12354 		ret = -EINVAL;
12355 		goto out;
12356 	}
12357 
12358 	he_gi = mask->control[band].he_gi;
12359 	he_ltf = mask->control[band].he_ltf;
12360 
12361 	/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it
12362 	 * requires passing at least one of used basic rates along with them.
12363 	 * Fixed rate setting across different preambles(legacy, HT, VHT) is
12364 	 * not supported by the FW. Hence use of FIXED_RATE vdev param is not
12365 	 * suitable for setting single HT/VHT rates.
12366 	 * But, there could be a single basic rate passed from userspace which
12367 	 * can be done through the FIXED_RATE param.
12368 	 */
12369 	if (ath12k_mac_has_single_legacy_rate(ar, band, mask)) {
12370 		ret = ath12k_mac_get_single_legacy_rate(ar, band, mask, &rate,
12371 							&nss);
12372 		if (ret) {
12373 			ath12k_warn(ar->ab, "failed to get single legacy rate for vdev %i: %d\n",
12374 				    arvif->vdev_id, ret);
12375 			goto out;
12376 		}
12377 
12378 		ieee80211_iterate_stations_mtx(hw,
12379 					       ath12k_mac_disable_peer_fixed_rate,
12380 					       arvif);
12381 	} else if (ath12k_mac_bitrate_mask_get_single_nss(ar, vif, band, mask,
12382 							  &single_nss)) {
12383 		rate = WMI_FIXED_RATE_NONE;
12384 		nss = single_nss;
12385 		arvif->bitrate_mask = *mask;
12386 
12387 		ieee80211_iterate_stations_atomic(hw,
12388 						  ath12k_mac_set_bitrate_mask_iter,
12389 						  arvif);
12390 	} else {
12391 		rate = WMI_FIXED_RATE_NONE;
12392 
12393 		if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
12394 							     mask, arvif->link_id))
12395 			ath12k_warn(ar->ab,
12396 				    "failed to update fixed rate settings due to mcs/nss incompatibility\n");
12397 
12398 		mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
12399 			       ath12k_mac_max_vht_nss(vht_mcs_mask),
12400 			       ath12k_mac_max_he_nss(he_mcs_mask));
12401 		nss = min_t(u32, ar->num_tx_chains, mac_nss);
12402 
12403 		/* If multiple rates across different preambles are given
12404 		 * we can reconfigure this info with all peers using PEER_ASSOC
12405 		 * command with the below exception cases.
12406 		 * - Single VHT Rate : peer_assoc command accommodates only MCS
12407 		 * range values i.e 0-7, 0-8, 0-9 for VHT. Though mac80211
12408 		 * mandates passing basic rates along with HT/VHT rates, FW
12409 		 * doesn't allow switching from VHT to Legacy. Hence instead of
12410 		 * setting legacy and VHT rates using RATEMASK_CMD vdev cmd,
12411 		 * we could set this VHT rate as peer fixed rate param, which
12412 		 * will override FIXED rate and FW rate control algorithm.
12413 		 * If single VHT rate is passed along with HT rates, we select
12414 		 * the VHT rate as fixed rate for vht peers.
12415 		 * - Multiple VHT Rates : When Multiple VHT rates are given,this
12416 		 * can be set using RATEMASK CMD which uses FW rate-ctl alg.
12417 		 * TODO: Setting multiple VHT MCS and replacing peer_assoc with
12418 		 * RATEMASK_CMDID can cover all use cases of setting rates
12419 		 * across multiple preambles and rates within same type.
12420 		 * But requires more validation of the command at this point.
12421 		 */
12422 
12423 		num_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
12424 								  mask);
12425 
12426 		if (!ath12k_mac_vht_mcs_range_present(ar, band, mask) &&
12427 		    num_rates > 1) {
12428 			/* TODO: Handle multiple VHT MCS values setting using
12429 			 * RATEMASK CMD
12430 			 */
12431 			ath12k_warn(ar->ab,
12432 				    "Setting more than one MCS Value in bitrate mask not supported\n");
12433 			ret = -EINVAL;
12434 			goto out;
12435 		}
12436 
12437 		num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
12438 		if (num_rates == 1)
12439 			he_fixed_rate = true;
12440 
12441 		if (!ath12k_mac_he_mcs_range_present(ar, band, mask) &&
12442 		    num_rates > 1) {
12443 			ath12k_warn(ar->ab,
12444 				    "Setting more than one HE MCS Value in bitrate mask not supported\n");
12445 			ret = -EINVAL;
12446 			goto out;
12447 		}
12448 		ieee80211_iterate_stations_mtx(hw,
12449 					       ath12k_mac_disable_peer_fixed_rate,
12450 					       arvif);
12451 
12452 		arvif->bitrate_mask = *mask;
12453 		ieee80211_iterate_stations_mtx(hw,
12454 					       ath12k_mac_set_bitrate_mask_iter,
12455 					       arvif);
12456 	}
12457 
12458 	ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
12459 					 he_ltf, he_fixed_rate);
12460 	if (ret) {
12461 		ath12k_warn(ar->ab, "failed to set rate params on vdev %i: %d\n",
12462 			    arvif->vdev_id, ret);
12463 	}
12464 
12465 out:
12466 	return ret;
12467 }
12468 
12469 static void
ath12k_mac_op_reconfig_complete(struct ieee80211_hw * hw,enum ieee80211_reconfig_type reconfig_type)12470 ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
12471 				enum ieee80211_reconfig_type reconfig_type)
12472 {
12473 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12474 	struct ath12k *ar;
12475 	struct ath12k_base *ab;
12476 	struct ath12k_vif *ahvif;
12477 	struct ath12k_link_vif *arvif;
12478 	int recovery_count, i;
12479 
12480 	lockdep_assert_wiphy(hw->wiphy);
12481 
12482 	if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
12483 		return;
12484 
12485 	guard(mutex)(&ah->hw_mutex);
12486 
12487 	if (ah->state != ATH12K_HW_STATE_RESTARTED)
12488 		return;
12489 
12490 	ah->state = ATH12K_HW_STATE_ON;
12491 	ieee80211_wake_queues(hw);
12492 
12493 	for_each_ar(ah, ar, i) {
12494 		ab = ar->ab;
12495 
12496 		ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
12497 			    ar->pdev->pdev_id);
12498 
12499 		if (ar->ab->hw_params->current_cc_support &&
12500 		    ar->alpha2[0] != 0 && ar->alpha2[1] != 0) {
12501 			struct wmi_set_current_country_arg arg = {};
12502 
12503 			memcpy(&arg.alpha2, ar->alpha2, 2);
12504 			reinit_completion(&ar->regd_update_completed);
12505 			ath12k_wmi_send_set_current_country_cmd(ar, &arg);
12506 		}
12507 
12508 		if (ab->is_reset) {
12509 			recovery_count = atomic_inc_return(&ab->recovery_count);
12510 
12511 			ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n",
12512 				   recovery_count);
12513 
12514 			/* When there are multiple radios in an SOC,
12515 			 * the recovery has to be done for each radio
12516 			 */
12517 			if (recovery_count == ab->num_radios) {
12518 				atomic_dec(&ab->reset_count);
12519 				complete(&ab->reset_complete);
12520 				ab->is_reset = false;
12521 				atomic_set(&ab->fail_cont_count, 0);
12522 				ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset success\n");
12523 			}
12524 		}
12525 
12526 		list_for_each_entry(arvif, &ar->arvifs, list) {
12527 			ahvif = arvif->ahvif;
12528 			ath12k_dbg(ab, ATH12K_DBG_BOOT,
12529 				   "reconfig cipher %d up %d vdev type %d\n",
12530 				   ahvif->key_cipher,
12531 				   arvif->is_up,
12532 				   ahvif->vdev_type);
12533 
12534 			/* After trigger disconnect, then upper layer will
12535 			 * trigger connect again, then the PN number of
12536 			 * upper layer will be reset to keep up with AP
12537 			 * side, hence PN number mismatch will not happen.
12538 			 */
12539 			if (arvif->is_up &&
12540 			    ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12541 			    ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
12542 				ieee80211_hw_restart_disconnect(ahvif->vif);
12543 
12544 				ath12k_dbg(ab, ATH12K_DBG_BOOT,
12545 					   "restart disconnect\n");
12546 			}
12547 		}
12548 	}
12549 }
12550 
12551 static void
ath12k_mac_update_bss_chan_survey(struct ath12k * ar,struct ieee80211_channel * channel)12552 ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
12553 				  struct ieee80211_channel *channel)
12554 {
12555 	int ret;
12556 	enum wmi_bss_chan_info_req_type type = WMI_BSS_SURVEY_REQ_TYPE_READ;
12557 
12558 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
12559 
12560 	if (!test_bit(WMI_TLV_SERVICE_BSS_CHANNEL_INFO_64, ar->ab->wmi_ab.svc_map) ||
12561 	    ar->rx_channel != channel)
12562 		return;
12563 
12564 	if (ar->scan.state != ATH12K_SCAN_IDLE) {
12565 		ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
12566 			   "ignoring bss chan info req while scanning..\n");
12567 		return;
12568 	}
12569 
12570 	reinit_completion(&ar->bss_survey_done);
12571 
12572 	ret = ath12k_wmi_pdev_bss_chan_info_request(ar, type);
12573 	if (ret) {
12574 		ath12k_warn(ar->ab, "failed to send pdev bss chan info request\n");
12575 		return;
12576 	}
12577 
12578 	ret = wait_for_completion_timeout(&ar->bss_survey_done, 3 * HZ);
12579 	if (ret == 0)
12580 		ath12k_warn(ar->ab, "bss channel survey timed out\n");
12581 }
12582 
ath12k_mac_op_get_survey(struct ieee80211_hw * hw,int idx,struct survey_info * survey)12583 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
12584 				    struct survey_info *survey)
12585 {
12586 	struct ath12k *ar;
12587 	struct ieee80211_supported_band *sband;
12588 	struct survey_info *ar_survey;
12589 
12590 	lockdep_assert_wiphy(hw->wiphy);
12591 
12592 	if (idx >= ATH12K_NUM_CHANS)
12593 		return -ENOENT;
12594 
12595 	sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
12596 	if (sband && idx >= sband->n_channels) {
12597 		idx -= sband->n_channels;
12598 		sband = NULL;
12599 	}
12600 
12601 	if (!sband)
12602 		sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
12603 	if (sband && idx >= sband->n_channels) {
12604 		idx -= sband->n_channels;
12605 		sband = NULL;
12606 	}
12607 
12608 	if (!sband)
12609 		sband = hw->wiphy->bands[NL80211_BAND_6GHZ];
12610 
12611 	if (!sband || idx >= sband->n_channels)
12612 		return -ENOENT;
12613 
12614 	ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
12615 	if (!ar) {
12616 		if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
12617 			memset(survey, 0, sizeof(*survey));
12618 			return 0;
12619 		}
12620 		return -ENOENT;
12621 	}
12622 
12623 	ar_survey = &ar->survey[idx];
12624 
12625 	ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
12626 
12627 	spin_lock_bh(&ar->data_lock);
12628 	memcpy(survey, ar_survey, sizeof(*survey));
12629 	spin_unlock_bh(&ar->data_lock);
12630 
12631 	survey->channel = &sband->channels[idx];
12632 
12633 	if (ar->rx_channel == survey->channel)
12634 		survey->filled |= SURVEY_INFO_IN_USE;
12635 
12636 	return 0;
12637 }
12638 
ath12k_mac_put_chain_rssi(struct station_info * sinfo,struct ath12k_link_sta * arsta)12639 static void ath12k_mac_put_chain_rssi(struct station_info *sinfo,
12640 				      struct ath12k_link_sta *arsta)
12641 {
12642 	s8 rssi;
12643 	int i;
12644 
12645 	for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
12646 		sinfo->chains &= ~BIT(i);
12647 		rssi = arsta->chain_signal[i];
12648 
12649 		if (rssi != ATH12K_DEFAULT_NOISE_FLOOR &&
12650 		    rssi != ATH12K_INVALID_RSSI_FULL &&
12651 		    rssi != ATH12K_INVALID_RSSI_EMPTY &&
12652 		    rssi != 0) {
12653 			sinfo->chain_signal[i] = rssi;
12654 			sinfo->chains |= BIT(i);
12655 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
12656 		}
12657 	}
12658 }
12659 
ath12k_mac_op_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct station_info * sinfo)12660 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
12661 					 struct ieee80211_vif *vif,
12662 					 struct ieee80211_sta *sta,
12663 					 struct station_info *sinfo)
12664 {
12665 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
12666 	struct ath12k_fw_stats_req_params params = {};
12667 	struct ath12k_link_sta *arsta;
12668 	s8 signal, noise_floor;
12669 	struct ath12k *ar;
12670 	bool db2dbm;
12671 
12672 	lockdep_assert_wiphy(hw->wiphy);
12673 
12674 	arsta = &ahsta->deflink;
12675 	ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12676 	if (!ar)
12677 		return;
12678 
12679 	db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12680 			  ar->ab->wmi_ab.svc_map);
12681 
12682 	sinfo->rx_duration = arsta->rx_duration;
12683 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12684 
12685 	sinfo->tx_duration = arsta->tx_duration;
12686 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12687 
12688 	if (arsta->txrate.legacy || arsta->txrate.nss) {
12689 		if (arsta->txrate.legacy) {
12690 			sinfo->txrate.legacy = arsta->txrate.legacy;
12691 		} else {
12692 			sinfo->txrate.mcs = arsta->txrate.mcs;
12693 			sinfo->txrate.nss = arsta->txrate.nss;
12694 			sinfo->txrate.bw = arsta->txrate.bw;
12695 			sinfo->txrate.he_gi = arsta->txrate.he_gi;
12696 			sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12697 			sinfo->txrate.he_ru_alloc = arsta->txrate.he_ru_alloc;
12698 			sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12699 			sinfo->txrate.eht_ru_alloc = arsta->txrate.eht_ru_alloc;
12700 		}
12701 		sinfo->txrate.flags = arsta->txrate.flags;
12702 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12703 	}
12704 
12705 	/* TODO: Use real NF instead of default one. */
12706 	signal = arsta->rssi_comb;
12707 
12708 	params.pdev_id = ar->pdev->pdev_id;
12709 	params.vdev_id = 0;
12710 	params.stats_id = WMI_REQUEST_VDEV_STAT;
12711 
12712 	if (!signal &&
12713 	    ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12714 	    !(ath12k_mac_get_fw_stats(ar, &params)))
12715 		signal = arsta->rssi_beacon;
12716 
12717 	params.stats_id = WMI_REQUEST_RSSI_PER_CHAIN_STAT;
12718 	if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) &&
12719 	    ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12720 	    !(ath12k_mac_get_fw_stats(ar, &params)))
12721 		ath12k_mac_put_chain_rssi(sinfo, arsta);
12722 
12723 	spin_lock_bh(&ar->data_lock);
12724 	noise_floor = ath12k_pdev_get_noise_floor(ar);
12725 	spin_unlock_bh(&ar->data_lock);
12726 
12727 	if (signal) {
12728 		sinfo->signal = db2dbm ? signal : signal + noise_floor;
12729 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12730 	}
12731 
12732 	sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12733 
12734 	if (!db2dbm)
12735 		sinfo->signal_avg += noise_floor;
12736 
12737 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12738 
12739 	sinfo->tx_retries = arsta->tx_retry_count;
12740 	sinfo->tx_failed = arsta->tx_retry_failed;
12741 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12742 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12743 }
12744 
ath12k_mac_op_link_sta_statistics(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_link_sta * link_sta,struct link_station_info * link_sinfo)12745 static void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
12746 					      struct ieee80211_vif *vif,
12747 					      struct ieee80211_link_sta *link_sta,
12748 					      struct link_station_info *link_sinfo)
12749 {
12750 	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(link_sta->sta);
12751 	struct ath12k_fw_stats_req_params params = {};
12752 	struct ath12k_link_sta *arsta;
12753 	struct ath12k *ar;
12754 	s8 signal;
12755 	bool db2dbm;
12756 
12757 	lockdep_assert_wiphy(hw->wiphy);
12758 
12759 	arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_sta->link_id]);
12760 
12761 	if (!arsta)
12762 		return;
12763 
12764 	ar = ath12k_get_ar_by_vif(hw, vif, arsta->link_id);
12765 	if (!ar)
12766 		return;
12767 
12768 	db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
12769 			  ar->ab->wmi_ab.svc_map);
12770 
12771 	link_sinfo->rx_duration = arsta->rx_duration;
12772 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
12773 
12774 	link_sinfo->tx_duration = arsta->tx_duration;
12775 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
12776 
12777 	if (arsta->txrate.legacy || arsta->txrate.nss) {
12778 		if (arsta->txrate.legacy) {
12779 			link_sinfo->txrate.legacy = arsta->txrate.legacy;
12780 		} else {
12781 			link_sinfo->txrate.mcs = arsta->txrate.mcs;
12782 			link_sinfo->txrate.nss = arsta->txrate.nss;
12783 			link_sinfo->txrate.bw = arsta->txrate.bw;
12784 			link_sinfo->txrate.he_gi = arsta->txrate.he_gi;
12785 			link_sinfo->txrate.he_dcm = arsta->txrate.he_dcm;
12786 			link_sinfo->txrate.he_ru_alloc =
12787 				arsta->txrate.he_ru_alloc;
12788 			link_sinfo->txrate.eht_gi = arsta->txrate.eht_gi;
12789 			link_sinfo->txrate.eht_ru_alloc =
12790 				arsta->txrate.eht_ru_alloc;
12791 		}
12792 		link_sinfo->txrate.flags = arsta->txrate.flags;
12793 		link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
12794 	}
12795 
12796 	/* TODO: Use real NF instead of default one. */
12797 	signal = arsta->rssi_comb;
12798 
12799 	params.pdev_id = ar->pdev->pdev_id;
12800 	params.vdev_id = 0;
12801 	params.stats_id = WMI_REQUEST_VDEV_STAT;
12802 
12803 	if (!signal &&
12804 	    ahsta->ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
12805 	    !(ath12k_mac_get_fw_stats(ar, &params)))
12806 		signal = arsta->rssi_beacon;
12807 
12808 	if (signal) {
12809 		link_sinfo->signal =
12810 			db2dbm ? signal : signal + ATH12K_DEFAULT_NOISE_FLOOR;
12811 		link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
12812 	}
12813 
12814 	link_sinfo->signal_avg = ewma_avg_rssi_read(&arsta->avg_rssi);
12815 
12816 	if (!db2dbm)
12817 		link_sinfo->signal_avg += ATH12K_DEFAULT_NOISE_FLOOR;
12818 
12819 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
12820 
12821 	link_sinfo->tx_retries = arsta->tx_retry_count;
12822 	link_sinfo->tx_failed = arsta->tx_retry_failed;
12823 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
12824 	link_sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
12825 }
12826 
ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif)12827 static int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
12828 						  struct ieee80211_vif *vif)
12829 {
12830 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12831 	struct ath12k *ar;
12832 
12833 	ar = ath12k_ah_to_ar(ah, 0);
12834 
12835 	lockdep_assert_wiphy(hw->wiphy);
12836 
12837 	spin_lock_bh(&ar->data_lock);
12838 	ar->scan.roc_notify = false;
12839 	spin_unlock_bh(&ar->data_lock);
12840 
12841 	ath12k_scan_abort(ar);
12842 
12843 	cancel_delayed_work_sync(&ar->scan.timeout);
12844 	wiphy_work_cancel(hw->wiphy, &ar->scan.vdev_clean_wk);
12845 
12846 	return 0;
12847 }
12848 
ath12k_mac_op_remain_on_channel(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_channel * chan,int duration,enum ieee80211_roc_type type)12849 static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
12850 					   struct ieee80211_vif *vif,
12851 					   struct ieee80211_channel *chan,
12852 					   int duration,
12853 					   enum ieee80211_roc_type type)
12854 {
12855 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12856 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12857 	struct ath12k_link_vif *arvif;
12858 	struct ath12k *ar;
12859 	u32 scan_time_msec;
12860 	bool create = true;
12861 	u8 link_id;
12862 	int ret;
12863 
12864 	lockdep_assert_wiphy(hw->wiphy);
12865 
12866 	ar = ath12k_mac_select_scan_device(hw, vif, chan->center_freq);
12867 	if (!ar)
12868 		return -EINVAL;
12869 
12870 	/* check if any of the links of ML VIF is already started on
12871 	 * radio(ar) corresponding to given scan frequency and use it,
12872 	 * if not use deflink(link 0) for scan purpose.
12873 	 */
12874 
12875 	link_id = ath12k_mac_find_link_id_by_ar(ahvif, ar);
12876 	arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12877 	/* If the vif is already assigned to a specific vdev of an ar,
12878 	 * check whether its already started, vdev which is started
12879 	 * are not allowed to switch to a new radio.
12880 	 * If the vdev is not started, but was earlier created on a
12881 	 * different ar, delete that vdev and create a new one. We don't
12882 	 * delete at the scan stop as an optimization to avoid redundant
12883 	 * delete-create vdev's for the same ar, in case the request is
12884 	 * always on the same band for the vif
12885 	 */
12886 	if (arvif->is_created) {
12887 		if (WARN_ON(!arvif->ar))
12888 			return -EINVAL;
12889 
12890 		if (ar != arvif->ar && arvif->is_started)
12891 			return -EBUSY;
12892 
12893 		if (ar != arvif->ar) {
12894 			ath12k_mac_remove_link_interface(hw, arvif);
12895 			ath12k_mac_unassign_link_vif(arvif);
12896 		} else {
12897 			create = false;
12898 		}
12899 	}
12900 
12901 	if (create) {
12902 		arvif = ath12k_mac_assign_link_vif(ah, vif, link_id);
12903 
12904 		ret = ath12k_mac_vdev_create(ar, arvif);
12905 		if (ret) {
12906 			ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
12907 				    ret);
12908 			return ret;
12909 		}
12910 	}
12911 
12912 	spin_lock_bh(&ar->data_lock);
12913 
12914 	switch (ar->scan.state) {
12915 	case ATH12K_SCAN_IDLE:
12916 		reinit_completion(&ar->scan.started);
12917 		reinit_completion(&ar->scan.completed);
12918 		reinit_completion(&ar->scan.on_channel);
12919 		ar->scan.state = ATH12K_SCAN_STARTING;
12920 		ar->scan.is_roc = true;
12921 		ar->scan.arvif = arvif;
12922 		ar->scan.roc_freq = chan->center_freq;
12923 		ar->scan.roc_notify = true;
12924 		ret = 0;
12925 		break;
12926 	case ATH12K_SCAN_STARTING:
12927 	case ATH12K_SCAN_RUNNING:
12928 	case ATH12K_SCAN_ABORTING:
12929 		ret = -EBUSY;
12930 		break;
12931 	}
12932 
12933 	spin_unlock_bh(&ar->data_lock);
12934 
12935 	if (ret)
12936 		return ret;
12937 
12938 	scan_time_msec = hw->wiphy->max_remain_on_channel_duration * 2;
12939 
12940 	struct ath12k_wmi_scan_req_arg *arg __free(kfree) =
12941 					kzalloc(sizeof(*arg), GFP_KERNEL);
12942 	if (!arg)
12943 		return -ENOMEM;
12944 
12945 	ath12k_wmi_start_scan_init(ar, arg);
12946 	arg->num_chan = 1;
12947 
12948 	u32 *chan_list __free(kfree) = kcalloc(arg->num_chan, sizeof(*chan_list),
12949 					       GFP_KERNEL);
12950 	if (!chan_list)
12951 		return -ENOMEM;
12952 
12953 	arg->chan_list = chan_list;
12954 	arg->vdev_id = arvif->vdev_id;
12955 	arg->scan_id = ATH12K_SCAN_ID;
12956 	arg->chan_list[0] = chan->center_freq;
12957 	arg->dwell_time_active = scan_time_msec;
12958 	arg->dwell_time_passive = scan_time_msec;
12959 	arg->max_scan_time = scan_time_msec;
12960 	arg->scan_f_passive = 1;
12961 	arg->burst_duration = duration;
12962 
12963 	ret = ath12k_start_scan(ar, arg);
12964 	if (ret) {
12965 		ath12k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
12966 
12967 		spin_lock_bh(&ar->data_lock);
12968 		ar->scan.state = ATH12K_SCAN_IDLE;
12969 		spin_unlock_bh(&ar->data_lock);
12970 		return ret;
12971 	}
12972 
12973 	ret = wait_for_completion_timeout(&ar->scan.on_channel, 3 * HZ);
12974 	if (ret == 0) {
12975 		ath12k_warn(ar->ab, "failed to switch to channel for roc scan\n");
12976 		ret = ath12k_scan_stop(ar);
12977 		if (ret)
12978 			ath12k_warn(ar->ab, "failed to stop scan: %d\n", ret);
12979 		return -ETIMEDOUT;
12980 	}
12981 
12982 	ieee80211_queue_delayed_work(hw, &ar->scan.timeout,
12983 				     msecs_to_jiffies(duration));
12984 
12985 	return 0;
12986 }
12987 
ath12k_mac_op_set_rekey_data(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct cfg80211_gtk_rekey_data * data)12988 static void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
12989 					 struct ieee80211_vif *vif,
12990 					 struct cfg80211_gtk_rekey_data *data)
12991 {
12992 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
12993 	struct ath12k_rekey_data *rekey_data;
12994 	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
12995 	struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
12996 	struct ath12k_link_vif *arvif;
12997 
12998 	lockdep_assert_wiphy(hw->wiphy);
12999 
13000 	arvif = &ahvif->deflink;
13001 	rekey_data = &arvif->rekey_data;
13002 
13003 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set rekey data vdev %d\n",
13004 		   arvif->vdev_id);
13005 
13006 	memcpy(rekey_data->kck, data->kck, NL80211_KCK_LEN);
13007 	memcpy(rekey_data->kek, data->kek, NL80211_KEK_LEN);
13008 
13009 	/* The supplicant works on big-endian, the firmware expects it on
13010 	 * little endian.
13011 	 */
13012 	rekey_data->replay_ctr = get_unaligned_be64(data->replay_ctr);
13013 
13014 	arvif->rekey_data.enable_offload = true;
13015 
13016 	ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kck", NULL,
13017 			rekey_data->kck, NL80211_KCK_LEN);
13018 	ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "kek", NULL,
13019 			rekey_data->kck, NL80211_KEK_LEN);
13020 	ath12k_dbg_dump(ar->ab, ATH12K_DBG_MAC, "replay ctr", NULL,
13021 			&rekey_data->replay_ctr, sizeof(rekey_data->replay_ctr));
13022 }
13023 
13024 static const struct ieee80211_ops ath12k_ops = {
13025 	.tx				= ath12k_mac_op_tx,
13026 	.wake_tx_queue			= ieee80211_handle_wake_tx_queue,
13027 	.start                          = ath12k_mac_op_start,
13028 	.stop                           = ath12k_mac_op_stop,
13029 	.reconfig_complete              = ath12k_mac_op_reconfig_complete,
13030 	.add_interface                  = ath12k_mac_op_add_interface,
13031 	.remove_interface		= ath12k_mac_op_remove_interface,
13032 	.update_vif_offload		= ath12k_mac_op_update_vif_offload,
13033 	.config                         = ath12k_mac_op_config,
13034 	.link_info_changed              = ath12k_mac_op_link_info_changed,
13035 	.vif_cfg_changed		= ath12k_mac_op_vif_cfg_changed,
13036 	.change_vif_links               = ath12k_mac_op_change_vif_links,
13037 	.configure_filter		= ath12k_mac_op_configure_filter,
13038 	.hw_scan                        = ath12k_mac_op_hw_scan,
13039 	.cancel_hw_scan                 = ath12k_mac_op_cancel_hw_scan,
13040 	.set_key                        = ath12k_mac_op_set_key,
13041 	.set_rekey_data	                = ath12k_mac_op_set_rekey_data,
13042 	.sta_state                      = ath12k_mac_op_sta_state,
13043 	.sta_set_txpwr			= ath12k_mac_op_sta_set_txpwr,
13044 	.link_sta_rc_update		= ath12k_mac_op_link_sta_rc_update,
13045 	.conf_tx                        = ath12k_mac_op_conf_tx,
13046 	.set_antenna			= ath12k_mac_op_set_antenna,
13047 	.get_antenna			= ath12k_mac_op_get_antenna,
13048 	.ampdu_action			= ath12k_mac_op_ampdu_action,
13049 	.add_chanctx			= ath12k_mac_op_add_chanctx,
13050 	.remove_chanctx			= ath12k_mac_op_remove_chanctx,
13051 	.change_chanctx			= ath12k_mac_op_change_chanctx,
13052 	.assign_vif_chanctx		= ath12k_mac_op_assign_vif_chanctx,
13053 	.unassign_vif_chanctx		= ath12k_mac_op_unassign_vif_chanctx,
13054 	.switch_vif_chanctx		= ath12k_mac_op_switch_vif_chanctx,
13055 	.get_txpower			= ath12k_mac_op_get_txpower,
13056 	.set_rts_threshold		= ath12k_mac_op_set_rts_threshold,
13057 	.set_frag_threshold		= ath12k_mac_op_set_frag_threshold,
13058 	.set_bitrate_mask		= ath12k_mac_op_set_bitrate_mask,
13059 	.get_survey			= ath12k_mac_op_get_survey,
13060 	.flush				= ath12k_mac_op_flush,
13061 	.sta_statistics			= ath12k_mac_op_sta_statistics,
13062 	.link_sta_statistics		= ath12k_mac_op_link_sta_statistics,
13063 	.remain_on_channel              = ath12k_mac_op_remain_on_channel,
13064 	.cancel_remain_on_channel       = ath12k_mac_op_cancel_remain_on_channel,
13065 	.change_sta_links               = ath12k_mac_op_change_sta_links,
13066 	.can_activate_links             = ath12k_mac_op_can_activate_links,
13067 #ifdef CONFIG_PM
13068 	.suspend			= ath12k_wow_op_suspend,
13069 	.resume				= ath12k_wow_op_resume,
13070 	.set_wakeup			= ath12k_wow_op_set_wakeup,
13071 #endif
13072 #ifdef CONFIG_ATH12K_DEBUGFS
13073 	.vif_add_debugfs                = ath12k_debugfs_op_vif_add,
13074 #endif
13075 	CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
13076 #ifdef CONFIG_ATH12K_DEBUGFS
13077 	.link_sta_add_debugfs           = ath12k_debugfs_link_sta_op_add,
13078 #endif
13079 };
13080 
ath12k_mac_update_freq_range(struct ath12k * ar,u32 freq_low,u32 freq_high)13081 void ath12k_mac_update_freq_range(struct ath12k *ar,
13082 				  u32 freq_low, u32 freq_high)
13083 {
13084 	if (!(freq_low && freq_high))
13085 		return;
13086 
13087 	if (ar->freq_range.start_freq || ar->freq_range.end_freq) {
13088 		ar->freq_range.start_freq = min(ar->freq_range.start_freq,
13089 						MHZ_TO_KHZ(freq_low));
13090 		ar->freq_range.end_freq = max(ar->freq_range.end_freq,
13091 					      MHZ_TO_KHZ(freq_high));
13092 	} else {
13093 		ar->freq_range.start_freq = MHZ_TO_KHZ(freq_low);
13094 		ar->freq_range.end_freq = MHZ_TO_KHZ(freq_high);
13095 	}
13096 
13097 	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
13098 		   "mac pdev %u freq limit updated. New range %u->%u MHz\n",
13099 		   ar->pdev->pdev_id, KHZ_TO_MHZ(ar->freq_range.start_freq),
13100 		   KHZ_TO_MHZ(ar->freq_range.end_freq));
13101 }
13102 
ath12k_mac_update_ch_list(struct ath12k * ar,struct ieee80211_supported_band * band,u32 freq_low,u32 freq_high)13103 static void ath12k_mac_update_ch_list(struct ath12k *ar,
13104 				      struct ieee80211_supported_band *band,
13105 				      u32 freq_low, u32 freq_high)
13106 {
13107 	int i;
13108 
13109 	if (!(freq_low && freq_high))
13110 		return;
13111 
13112 	for (i = 0; i < band->n_channels; i++) {
13113 		if (band->channels[i].center_freq < freq_low ||
13114 		    band->channels[i].center_freq > freq_high)
13115 			band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
13116 	}
13117 }
13118 
ath12k_get_phy_id(struct ath12k * ar,u32 band)13119 static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
13120 {
13121 	struct ath12k_pdev *pdev = ar->pdev;
13122 	struct ath12k_pdev_cap *pdev_cap = &pdev->cap;
13123 
13124 	if (band == WMI_HOST_WLAN_2GHZ_CAP)
13125 		return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
13126 
13127 	if (band == WMI_HOST_WLAN_5GHZ_CAP)
13128 		return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
13129 
13130 	ath12k_warn(ar->ab, "unsupported phy cap:%d\n", band);
13131 
13132 	return 0;
13133 }
13134 
ath12k_mac_update_band(struct ath12k * ar,struct ieee80211_supported_band * orig_band,struct ieee80211_supported_band * new_band)13135 static int ath12k_mac_update_band(struct ath12k *ar,
13136 				  struct ieee80211_supported_band *orig_band,
13137 				  struct ieee80211_supported_band *new_band)
13138 {
13139 	int i;
13140 
13141 	if (!orig_band || !new_band)
13142 		return -EINVAL;
13143 
13144 	if (orig_band->band != new_band->band)
13145 		return -EINVAL;
13146 
13147 	for (i = 0; i < new_band->n_channels; i++) {
13148 		if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
13149 			continue;
13150 		/* An enabled channel in new_band should not be already enabled
13151 		 * in the orig_band
13152 		 */
13153 		if (WARN_ON(!(orig_band->channels[i].flags &
13154 			      IEEE80211_CHAN_DISABLED)))
13155 			return -EINVAL;
13156 		orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
13157 	}
13158 	return 0;
13159 }
13160 
ath12k_mac_setup_channels_rates(struct ath12k * ar,u32 supported_bands,struct ieee80211_supported_band * bands[])13161 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
13162 					   u32 supported_bands,
13163 					   struct ieee80211_supported_band *bands[])
13164 {
13165 	struct ieee80211_supported_band *band;
13166 	struct ath12k_wmi_hal_reg_capabilities_ext_arg *reg_cap;
13167 	struct ath12k_base *ab = ar->ab;
13168 	u32 phy_id, freq_low, freq_high;
13169 	struct ath12k_hw *ah = ar->ah;
13170 	void *channels;
13171 	int ret;
13172 
13173 	BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
13174 		      ARRAY_SIZE(ath12k_5ghz_channels) +
13175 		      ARRAY_SIZE(ath12k_6ghz_channels)) !=
13176 		     ATH12K_NUM_CHANS);
13177 
13178 	reg_cap = &ab->hal_reg_cap[ar->pdev_idx];
13179 
13180 	if (supported_bands & WMI_HOST_WLAN_2GHZ_CAP) {
13181 		channels = kmemdup(ath12k_2ghz_channels,
13182 				   sizeof(ath12k_2ghz_channels),
13183 				   GFP_KERNEL);
13184 		if (!channels)
13185 			return -ENOMEM;
13186 
13187 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
13188 		band->band = NL80211_BAND_2GHZ;
13189 		band->n_channels = ARRAY_SIZE(ath12k_2ghz_channels);
13190 		band->channels = channels;
13191 		band->n_bitrates = ath12k_g_rates_size;
13192 		band->bitrates = ath12k_g_rates;
13193 
13194 		if (ab->hw_params->single_pdev_only) {
13195 			phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
13196 			reg_cap = &ab->hal_reg_cap[phy_id];
13197 		}
13198 
13199 		freq_low = max(reg_cap->low_2ghz_chan,
13200 			       ab->reg_freq_2ghz.start_freq);
13201 		freq_high = min(reg_cap->high_2ghz_chan,
13202 				ab->reg_freq_2ghz.end_freq);
13203 
13204 		ath12k_mac_update_ch_list(ar, band,
13205 					  reg_cap->low_2ghz_chan,
13206 					  reg_cap->high_2ghz_chan);
13207 
13208 		ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13209 
13210 		if (!bands[NL80211_BAND_2GHZ]) {
13211 			bands[NL80211_BAND_2GHZ] = band;
13212 		} else {
13213 			/* Split mac in same band under same wiphy */
13214 			ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
13215 			if (ret) {
13216 				kfree(channels);
13217 				band->channels = NULL;
13218 				return ret;
13219 			}
13220 			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
13221 				   ar->pdev->pdev_id,
13222 				   KHZ_TO_MHZ(ar->freq_range.start_freq),
13223 				   KHZ_TO_MHZ(ar->freq_range.end_freq));
13224 		}
13225 	}
13226 
13227 	if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
13228 		if (reg_cap->high_5ghz_chan >= ATH12K_MIN_6GHZ_FREQ) {
13229 			channels = kmemdup(ath12k_6ghz_channels,
13230 					   sizeof(ath12k_6ghz_channels), GFP_KERNEL);
13231 			if (!channels) {
13232 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13233 				return -ENOMEM;
13234 			}
13235 
13236 			ar->supports_6ghz = true;
13237 			band = &ar->mac.sbands[NL80211_BAND_6GHZ];
13238 			band->band = NL80211_BAND_6GHZ;
13239 			band->n_channels = ARRAY_SIZE(ath12k_6ghz_channels);
13240 			band->channels = channels;
13241 			band->n_bitrates = ath12k_a_rates_size;
13242 			band->bitrates = ath12k_a_rates;
13243 
13244 			freq_low = max(reg_cap->low_5ghz_chan,
13245 				       ab->reg_freq_6ghz.start_freq);
13246 			freq_high = min(reg_cap->high_5ghz_chan,
13247 					ab->reg_freq_6ghz.end_freq);
13248 
13249 			ath12k_mac_update_ch_list(ar, band,
13250 						  reg_cap->low_5ghz_chan,
13251 						  reg_cap->high_5ghz_chan);
13252 
13253 			ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13254 			ah->use_6ghz_regd = true;
13255 
13256 			if (!bands[NL80211_BAND_6GHZ]) {
13257 				bands[NL80211_BAND_6GHZ] = band;
13258 			} else {
13259 				/* Split mac in same band under same wiphy */
13260 				ret = ath12k_mac_update_band(ar,
13261 							     bands[NL80211_BAND_6GHZ],
13262 							     band);
13263 				if (ret) {
13264 					kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13265 					ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13266 					kfree(channels);
13267 					band->channels = NULL;
13268 					return ret;
13269 				}
13270 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
13271 					   ar->pdev->pdev_id,
13272 					   KHZ_TO_MHZ(ar->freq_range.start_freq),
13273 					   KHZ_TO_MHZ(ar->freq_range.end_freq));
13274 			}
13275 		}
13276 
13277 		if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
13278 			channels = kmemdup(ath12k_5ghz_channels,
13279 					   sizeof(ath12k_5ghz_channels),
13280 					   GFP_KERNEL);
13281 			if (!channels) {
13282 				kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13283 				kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13284 				return -ENOMEM;
13285 			}
13286 
13287 			band = &ar->mac.sbands[NL80211_BAND_5GHZ];
13288 			band->band = NL80211_BAND_5GHZ;
13289 			band->n_channels = ARRAY_SIZE(ath12k_5ghz_channels);
13290 			band->channels = channels;
13291 			band->n_bitrates = ath12k_a_rates_size;
13292 			band->bitrates = ath12k_a_rates;
13293 
13294 			if (ab->hw_params->single_pdev_only) {
13295 				phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
13296 				reg_cap = &ab->hal_reg_cap[phy_id];
13297 			}
13298 
13299 			freq_low = max(reg_cap->low_5ghz_chan,
13300 				       ab->reg_freq_5ghz.start_freq);
13301 			freq_high = min(reg_cap->high_5ghz_chan,
13302 					ab->reg_freq_5ghz.end_freq);
13303 
13304 			ath12k_mac_update_ch_list(ar, band,
13305 						  reg_cap->low_5ghz_chan,
13306 						  reg_cap->high_5ghz_chan);
13307 
13308 			ath12k_mac_update_freq_range(ar, freq_low, freq_high);
13309 
13310 			if (!bands[NL80211_BAND_5GHZ]) {
13311 				bands[NL80211_BAND_5GHZ] = band;
13312 			} else {
13313 				/* Split mac in same band under same wiphy */
13314 				ret = ath12k_mac_update_band(ar,
13315 							     bands[NL80211_BAND_5GHZ],
13316 							     band);
13317 				if (ret) {
13318 					kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13319 					ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13320 					kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13321 					ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
13322 					kfree(channels);
13323 					band->channels = NULL;
13324 					return ret;
13325 				}
13326 				ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
13327 					   ar->pdev->pdev_id,
13328 					   KHZ_TO_MHZ(ar->freq_range.start_freq),
13329 					   KHZ_TO_MHZ(ar->freq_range.end_freq));
13330 			}
13331 		}
13332 	}
13333 
13334 	return 0;
13335 }
13336 
ath12k_mac_get_ifmodes(struct ath12k_hw * ah)13337 static u16 ath12k_mac_get_ifmodes(struct ath12k_hw *ah)
13338 {
13339 	struct ath12k *ar;
13340 	int i;
13341 	u16 interface_modes = U16_MAX;
13342 
13343 	for_each_ar(ah, ar, i)
13344 		interface_modes &= ar->ab->hw_params->interface_modes;
13345 
13346 	return interface_modes == U16_MAX ? 0 : interface_modes;
13347 }
13348 
ath12k_mac_is_iface_mode_enable(struct ath12k_hw * ah,enum nl80211_iftype type)13349 static bool ath12k_mac_is_iface_mode_enable(struct ath12k_hw *ah,
13350 					    enum nl80211_iftype type)
13351 {
13352 	struct ath12k *ar;
13353 	int i;
13354 	u16 interface_modes, mode = 0;
13355 	bool is_enable = false;
13356 
13357 	if (type == NL80211_IFTYPE_MESH_POINT) {
13358 		if (IS_ENABLED(CONFIG_MAC80211_MESH))
13359 			mode = BIT(type);
13360 	} else {
13361 		mode = BIT(type);
13362 	}
13363 
13364 	for_each_ar(ah, ar, i) {
13365 		interface_modes = ar->ab->hw_params->interface_modes;
13366 		if (interface_modes & mode) {
13367 			is_enable = true;
13368 			break;
13369 		}
13370 	}
13371 
13372 	return is_enable;
13373 }
13374 
13375 static int
ath12k_mac_setup_radio_iface_comb(struct ath12k * ar,struct ieee80211_iface_combination * comb)13376 ath12k_mac_setup_radio_iface_comb(struct ath12k *ar,
13377 				  struct ieee80211_iface_combination *comb)
13378 {
13379 	u16 interface_modes = ar->ab->hw_params->interface_modes;
13380 	struct ieee80211_iface_limit *limits;
13381 	int n_limits, max_interfaces;
13382 	bool ap, mesh, p2p;
13383 
13384 	ap = interface_modes & BIT(NL80211_IFTYPE_AP);
13385 	p2p = interface_modes & BIT(NL80211_IFTYPE_P2P_DEVICE);
13386 
13387 	mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
13388 	       (interface_modes & BIT(NL80211_IFTYPE_MESH_POINT));
13389 
13390 	if ((ap || mesh) && !p2p) {
13391 		n_limits = 2;
13392 		max_interfaces = 16;
13393 	} else if (p2p) {
13394 		n_limits = 3;
13395 		if (ap || mesh)
13396 			max_interfaces = 16;
13397 		else
13398 			max_interfaces = 3;
13399 	} else {
13400 		n_limits = 1;
13401 		max_interfaces = 1;
13402 	}
13403 
13404 	limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13405 	if (!limits)
13406 		return -ENOMEM;
13407 
13408 	limits[0].max = 1;
13409 	limits[0].types |= BIT(NL80211_IFTYPE_STATION);
13410 
13411 	if (ap || mesh || p2p)
13412 		limits[1].max = max_interfaces;
13413 
13414 	if (ap)
13415 		limits[1].types |= BIT(NL80211_IFTYPE_AP);
13416 
13417 	if (mesh)
13418 		limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
13419 
13420 	if (p2p) {
13421 		limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
13422 					BIT(NL80211_IFTYPE_P2P_GO);
13423 		limits[2].max = 1;
13424 		limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
13425 	}
13426 
13427 	comb[0].limits = limits;
13428 	comb[0].n_limits = n_limits;
13429 	comb[0].max_interfaces = max_interfaces;
13430 	comb[0].beacon_int_infra_match = true;
13431 	comb[0].beacon_int_min_gcd = 100;
13432 
13433 	comb[0].num_different_channels = 1;
13434 	comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
13435 				      BIT(NL80211_CHAN_WIDTH_20) |
13436 				      BIT(NL80211_CHAN_WIDTH_40) |
13437 				      BIT(NL80211_CHAN_WIDTH_80) |
13438 				      BIT(NL80211_CHAN_WIDTH_160);
13439 
13440 	return 0;
13441 }
13442 
13443 static int
ath12k_mac_setup_global_iface_comb(struct ath12k_hw * ah,struct wiphy_radio * radio,u8 n_radio,struct ieee80211_iface_combination * comb)13444 ath12k_mac_setup_global_iface_comb(struct ath12k_hw *ah,
13445 				   struct wiphy_radio *radio,
13446 				   u8 n_radio,
13447 				   struct ieee80211_iface_combination *comb)
13448 {
13449 	const struct ieee80211_iface_combination *iter_comb;
13450 	struct ieee80211_iface_limit *limits;
13451 	int i, j, n_limits;
13452 	bool ap, mesh, p2p;
13453 
13454 	if (!n_radio)
13455 		return 0;
13456 
13457 	ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
13458 	p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
13459 	mesh = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
13460 
13461 	if ((ap || mesh) && !p2p)
13462 		n_limits = 2;
13463 	else if (p2p)
13464 		n_limits = 3;
13465 	else
13466 		n_limits = 1;
13467 
13468 	limits = kcalloc(n_limits, sizeof(*limits), GFP_KERNEL);
13469 	if (!limits)
13470 		return -ENOMEM;
13471 
13472 	for (i = 0; i < n_radio; i++) {
13473 		iter_comb = radio[i].iface_combinations;
13474 		for (j = 0; j < iter_comb->n_limits && j < n_limits; j++) {
13475 			limits[j].types |= iter_comb->limits[j].types;
13476 			limits[j].max += iter_comb->limits[j].max;
13477 		}
13478 
13479 		comb->max_interfaces += iter_comb->max_interfaces;
13480 		comb->num_different_channels += iter_comb->num_different_channels;
13481 		comb->radar_detect_widths |= iter_comb->radar_detect_widths;
13482 	}
13483 
13484 	comb->limits = limits;
13485 	comb->n_limits = n_limits;
13486 	comb->beacon_int_infra_match = true;
13487 	comb->beacon_int_min_gcd = 100;
13488 
13489 	return 0;
13490 }
13491 
13492 static
ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination * iface_comb)13493 void ath12k_mac_cleanup_iface_comb(const struct ieee80211_iface_combination *iface_comb)
13494 {
13495 	kfree(iface_comb[0].limits);
13496 	kfree(iface_comb);
13497 }
13498 
ath12k_mac_cleanup_iface_combinations(struct ath12k_hw * ah)13499 static void ath12k_mac_cleanup_iface_combinations(struct ath12k_hw *ah)
13500 {
13501 	struct wiphy *wiphy = ah->hw->wiphy;
13502 	const struct wiphy_radio *radio;
13503 	int i;
13504 
13505 	if (wiphy->n_radio > 0) {
13506 		radio = wiphy->radio;
13507 		for (i = 0; i < wiphy->n_radio; i++)
13508 			ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13509 
13510 		kfree(wiphy->radio);
13511 	}
13512 
13513 	ath12k_mac_cleanup_iface_comb(wiphy->iface_combinations);
13514 }
13515 
ath12k_mac_setup_iface_combinations(struct ath12k_hw * ah)13516 static int ath12k_mac_setup_iface_combinations(struct ath12k_hw *ah)
13517 {
13518 	struct ieee80211_iface_combination *combinations, *comb;
13519 	struct wiphy *wiphy = ah->hw->wiphy;
13520 	struct wiphy_radio *radio;
13521 	int n_combinations = 1;
13522 	struct ath12k *ar;
13523 	int i, ret;
13524 
13525 	if (ah->num_radio == 1) {
13526 		ar = &ah->radio[0];
13527 
13528 		if (ar->ab->hw_params->single_pdev_only)
13529 			n_combinations = 2;
13530 
13531 		combinations = kcalloc(n_combinations, sizeof(*combinations),
13532 				       GFP_KERNEL);
13533 		if (!combinations)
13534 			return -ENOMEM;
13535 
13536 		ret = ath12k_mac_setup_radio_iface_comb(ar, combinations);
13537 		if (ret) {
13538 			ath12k_hw_warn(ah, "failed to setup radio interface combinations for one radio: %d",
13539 				       ret);
13540 			goto err_free_combinations;
13541 		}
13542 
13543 		if (ar->ab->hw_params->single_pdev_only) {
13544 			comb = combinations + 1;
13545 			memcpy(comb, combinations, sizeof(*comb));
13546 			comb->num_different_channels = 2;
13547 			comb->radar_detect_widths = 0;
13548 		}
13549 
13550 		goto out;
13551 	}
13552 
13553 	combinations = kcalloc(n_combinations, sizeof(*combinations), GFP_KERNEL);
13554 	if (!combinations)
13555 		return -ENOMEM;
13556 
13557 	/* there are multiple radios */
13558 
13559 	radio = kcalloc(ah->num_radio, sizeof(*radio), GFP_KERNEL);
13560 	if (!radio) {
13561 		ret = -ENOMEM;
13562 		goto err_free_combinations;
13563 	}
13564 
13565 	for_each_ar(ah, ar, i) {
13566 		comb = kzalloc(sizeof(*comb), GFP_KERNEL);
13567 		if (!comb) {
13568 			ret = -ENOMEM;
13569 			goto err_free_radios;
13570 		}
13571 
13572 		ret = ath12k_mac_setup_radio_iface_comb(ar, comb);
13573 		if (ret) {
13574 			ath12k_hw_warn(ah, "failed to setup radio interface combinations for radio %d: %d",
13575 				       i, ret);
13576 			kfree(comb);
13577 			goto err_free_radios;
13578 		}
13579 
13580 		radio[i].freq_range = &ar->freq_range;
13581 		radio[i].n_freq_range = 1;
13582 
13583 		radio[i].iface_combinations = comb;
13584 		radio[i].n_iface_combinations = 1;
13585 	}
13586 
13587 	ret = ath12k_mac_setup_global_iface_comb(ah, radio, ah->num_radio, combinations);
13588 	if (ret) {
13589 		ath12k_hw_warn(ah, "failed to setup global interface combinations: %d",
13590 			       ret);
13591 		goto err_free_all_radios;
13592 	}
13593 
13594 	wiphy->radio = radio;
13595 	wiphy->n_radio = ah->num_radio;
13596 
13597 out:
13598 	wiphy->iface_combinations = combinations;
13599 	wiphy->n_iface_combinations = n_combinations;
13600 
13601 	return 0;
13602 
13603 err_free_all_radios:
13604 	i = ah->num_radio;
13605 
13606 err_free_radios:
13607 	while (i--)
13608 		ath12k_mac_cleanup_iface_comb(radio[i].iface_combinations);
13609 
13610 	kfree(radio);
13611 
13612 err_free_combinations:
13613 	kfree(combinations);
13614 
13615 	return ret;
13616 }
13617 
13618 static const u8 ath12k_if_types_ext_capa[] = {
13619 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13620 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13621 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13622 };
13623 
13624 static const u8 ath12k_if_types_ext_capa_sta[] = {
13625 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13626 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13627 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13628 	[9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
13629 };
13630 
13631 static const u8 ath12k_if_types_ext_capa_ap[] = {
13632 	[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
13633 	[2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
13634 	[7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
13635 	[9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT,
13636 	[10] = WLAN_EXT_CAPA11_EMA_SUPPORT,
13637 };
13638 
13639 static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = {
13640 	{
13641 		.extended_capabilities = ath12k_if_types_ext_capa,
13642 		.extended_capabilities_mask = ath12k_if_types_ext_capa,
13643 		.extended_capabilities_len = sizeof(ath12k_if_types_ext_capa),
13644 	}, {
13645 		.iftype = NL80211_IFTYPE_STATION,
13646 		.extended_capabilities = ath12k_if_types_ext_capa_sta,
13647 		.extended_capabilities_mask = ath12k_if_types_ext_capa_sta,
13648 		.extended_capabilities_len =
13649 				sizeof(ath12k_if_types_ext_capa_sta),
13650 	}, {
13651 		.iftype = NL80211_IFTYPE_AP,
13652 		.extended_capabilities = ath12k_if_types_ext_capa_ap,
13653 		.extended_capabilities_mask = ath12k_if_types_ext_capa_ap,
13654 		.extended_capabilities_len =
13655 				sizeof(ath12k_if_types_ext_capa_ap),
13656 		.eml_capabilities = 0,
13657 		.mld_capa_and_ops = 0,
13658 	},
13659 };
13660 
ath12k_mac_cleanup_unregister(struct ath12k * ar)13661 static void ath12k_mac_cleanup_unregister(struct ath12k *ar)
13662 {
13663 	idr_for_each(&ar->txmgmt_idr, ath12k_mac_tx_mgmt_pending_free, ar);
13664 	idr_destroy(&ar->txmgmt_idr);
13665 
13666 	kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
13667 	kfree(ar->mac.sbands[NL80211_BAND_5GHZ].channels);
13668 	kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
13669 }
13670 
ath12k_mac_hw_unregister(struct ath12k_hw * ah)13671 static void ath12k_mac_hw_unregister(struct ath12k_hw *ah)
13672 {
13673 	struct ieee80211_hw *hw = ah->hw;
13674 	struct ath12k *ar;
13675 	int i;
13676 
13677 	for_each_ar(ah, ar, i) {
13678 		cancel_work_sync(&ar->regd_channel_update_work);
13679 		cancel_work_sync(&ar->regd_update_work);
13680 		ath12k_debugfs_unregister(ar);
13681 		ath12k_fw_stats_reset(ar);
13682 	}
13683 
13684 	ieee80211_unregister_hw(hw);
13685 
13686 	for_each_ar(ah, ar, i)
13687 		ath12k_mac_cleanup_unregister(ar);
13688 
13689 	ath12k_mac_cleanup_iface_combinations(ah);
13690 
13691 	SET_IEEE80211_DEV(hw, NULL);
13692 }
13693 
ath12k_mac_setup_register(struct ath12k * ar,u32 * ht_cap,struct ieee80211_supported_band * bands[])13694 static int ath12k_mac_setup_register(struct ath12k *ar,
13695 				     u32 *ht_cap,
13696 				     struct ieee80211_supported_band *bands[])
13697 {
13698 	struct ath12k_pdev_cap *cap = &ar->pdev->cap;
13699 	int ret;
13700 
13701 	init_waitqueue_head(&ar->txmgmt_empty_waitq);
13702 	idr_init(&ar->txmgmt_idr);
13703 	spin_lock_init(&ar->txmgmt_idr_lock);
13704 
13705 	ath12k_pdev_caps_update(ar);
13706 
13707 	ret = ath12k_mac_setup_channels_rates(ar,
13708 					      cap->supported_bands,
13709 					      bands);
13710 	if (ret)
13711 		return ret;
13712 
13713 	ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
13714 	ath12k_mac_setup_sband_iftype_data(ar, cap);
13715 
13716 	ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
13717 	ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
13718 
13719 	ar->rssi_info.min_nf_dbm = ATH12K_DEFAULT_NOISE_FLOOR;
13720 	ar->rssi_info.temp_offset = 0;
13721 	ar->rssi_info.noise_floor = ar->rssi_info.min_nf_dbm + ar->rssi_info.temp_offset;
13722 
13723 	return 0;
13724 }
13725 
ath12k_mac_hw_register(struct ath12k_hw * ah)13726 static int ath12k_mac_hw_register(struct ath12k_hw *ah)
13727 {
13728 	struct ieee80211_hw *hw = ah->hw;
13729 	struct wiphy *wiphy = hw->wiphy;
13730 	struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
13731 	struct ath12k_base *ab = ar->ab;
13732 	struct ath12k_pdev *pdev;
13733 	struct ath12k_pdev_cap *cap;
13734 	static const u32 cipher_suites[] = {
13735 		WLAN_CIPHER_SUITE_TKIP,
13736 		WLAN_CIPHER_SUITE_CCMP,
13737 		WLAN_CIPHER_SUITE_AES_CMAC,
13738 		WLAN_CIPHER_SUITE_BIP_CMAC_256,
13739 		WLAN_CIPHER_SUITE_BIP_GMAC_128,
13740 		WLAN_CIPHER_SUITE_BIP_GMAC_256,
13741 		WLAN_CIPHER_SUITE_GCMP,
13742 		WLAN_CIPHER_SUITE_GCMP_256,
13743 		WLAN_CIPHER_SUITE_CCMP_256,
13744 	};
13745 	int ret, i, j;
13746 	u32 ht_cap = U32_MAX, antennas_rx = 0, antennas_tx = 0;
13747 	bool is_6ghz = false, is_raw_mode = false, is_monitor_disable = false;
13748 	u8 *mac_addr = NULL;
13749 	u8 mbssid_max_interfaces = 0;
13750 
13751 	wiphy->max_ap_assoc_sta = 0;
13752 
13753 	for_each_ar(ah, ar, i) {
13754 		u32 ht_cap_info = 0;
13755 
13756 		pdev = ar->pdev;
13757 		if (ar->ab->pdevs_macaddr_valid) {
13758 			ether_addr_copy(ar->mac_addr, pdev->mac_addr);
13759 		} else {
13760 			ether_addr_copy(ar->mac_addr, ar->ab->mac_addr);
13761 			ar->mac_addr[4] += ar->pdev_idx;
13762 		}
13763 
13764 		ret = ath12k_mac_setup_register(ar, &ht_cap_info, hw->wiphy->bands);
13765 		if (ret)
13766 			goto err_cleanup_unregister;
13767 
13768 		/* 6 GHz does not support HT Cap, hence do not consider it */
13769 		if (!ar->supports_6ghz)
13770 			ht_cap &= ht_cap_info;
13771 
13772 		wiphy->max_ap_assoc_sta += ar->max_num_stations;
13773 
13774 		/* Advertise the max antenna support of all radios, driver can handle
13775 		 * per pdev specific antenna setting based on pdev cap when antenna
13776 		 * changes are made
13777 		 */
13778 		cap = &pdev->cap;
13779 
13780 		antennas_rx = max_t(u32, antennas_rx, cap->rx_chain_mask);
13781 		antennas_tx = max_t(u32, antennas_tx, cap->tx_chain_mask);
13782 
13783 		if (ar->supports_6ghz)
13784 			is_6ghz = true;
13785 
13786 		if (test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags))
13787 			is_raw_mode = true;
13788 
13789 		if (!ar->ab->hw_params->supports_monitor)
13790 			is_monitor_disable = true;
13791 
13792 		if (i == 0)
13793 			mac_addr = ar->mac_addr;
13794 		else
13795 			mac_addr = ab->mac_addr;
13796 
13797 		mbssid_max_interfaces += TARGET_NUM_VDEVS(ar->ab);
13798 	}
13799 
13800 	wiphy->available_antennas_rx = antennas_rx;
13801 	wiphy->available_antennas_tx = antennas_tx;
13802 
13803 	SET_IEEE80211_PERM_ADDR(hw, mac_addr);
13804 	SET_IEEE80211_DEV(hw, ab->dev);
13805 
13806 	ret = ath12k_mac_setup_iface_combinations(ah);
13807 	if (ret) {
13808 		ath12k_err(ab, "failed to setup interface combinations: %d\n", ret);
13809 		goto err_complete_cleanup_unregister;
13810 	}
13811 
13812 	wiphy->interface_modes = ath12k_mac_get_ifmodes(ah);
13813 
13814 	if (ah->num_radio == 1 &&
13815 	    wiphy->bands[NL80211_BAND_2GHZ] &&
13816 	    wiphy->bands[NL80211_BAND_5GHZ] &&
13817 	    wiphy->bands[NL80211_BAND_6GHZ])
13818 		ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
13819 
13820 	ieee80211_hw_set(hw, SIGNAL_DBM);
13821 	ieee80211_hw_set(hw, SUPPORTS_PS);
13822 	ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
13823 	ieee80211_hw_set(hw, MFP_CAPABLE);
13824 	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
13825 	ieee80211_hw_set(hw, HAS_RATE_CONTROL);
13826 	ieee80211_hw_set(hw, AP_LINK_PS);
13827 	ieee80211_hw_set(hw, SPECTRUM_MGMT);
13828 	ieee80211_hw_set(hw, CONNECTION_MONITOR);
13829 	ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK);
13830 	ieee80211_hw_set(hw, CHANCTX_STA_CSA);
13831 	ieee80211_hw_set(hw, QUEUE_CONTROL);
13832 	ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
13833 	ieee80211_hw_set(hw, REPORTS_LOW_ACK);
13834 	ieee80211_hw_set(hw, NO_VIRTUAL_MONITOR);
13835 
13836 	if (test_bit(WMI_TLV_SERVICE_ETH_OFFLOAD, ar->wmi->wmi_ab->svc_map)) {
13837 		ieee80211_hw_set(hw, SUPPORTS_TX_ENCAP_OFFLOAD);
13838 		ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
13839 	}
13840 
13841 	if (cap->nss_ratio_enabled)
13842 		ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
13843 
13844 	if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
13845 		ieee80211_hw_set(hw, AMPDU_AGGREGATION);
13846 		ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
13847 		ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
13848 		ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
13849 		ieee80211_hw_set(hw, USES_RSS);
13850 	}
13851 
13852 	wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
13853 	wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
13854 
13855 	/* TODO: Check if HT capability advertised from firmware is different
13856 	 * for each band for a dual band capable radio. It will be tricky to
13857 	 * handle it when the ht capability different for each band.
13858 	 */
13859 	if (ht_cap & WMI_HT_CAP_DYNAMIC_SMPS ||
13860 	    (is_6ghz && ab->hw_params->supports_dynamic_smps_6ghz))
13861 		wiphy->features |= NL80211_FEATURE_DYNAMIC_SMPS;
13862 
13863 	wiphy->max_scan_ssids = WLAN_SCAN_PARAMS_MAX_SSID;
13864 	wiphy->max_scan_ie_len = WLAN_SCAN_PARAMS_MAX_IE_LEN;
13865 
13866 	hw->max_listen_interval = ATH12K_MAX_HW_LISTEN_INTERVAL;
13867 
13868 	wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
13869 	wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
13870 	wiphy->max_remain_on_channel_duration = 5000;
13871 
13872 	wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
13873 	wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
13874 				   NL80211_FEATURE_AP_SCAN;
13875 
13876 	wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
13877 
13878 	/* MLO is not yet supported so disable Wireless Extensions for now
13879 	 * to make sure ath12k users don't use it. This flag can be removed
13880 	 * once WIPHY_FLAG_SUPPORTS_MLO is enabled.
13881 	 */
13882 	wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
13883 
13884 	/* Copy over MLO related capabilities received from
13885 	 * WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set.
13886 	 */
13887 	if (ab->ag->mlo_capable) {
13888 		ath12k_iftypes_ext_capa[2].eml_capabilities = cap->eml_cap;
13889 		ath12k_iftypes_ext_capa[2].mld_capa_and_ops = cap->mld_cap;
13890 		wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
13891 
13892 		ieee80211_hw_set(hw, MLO_MCAST_MULTI_LINK_TX);
13893 	}
13894 
13895 	hw->queues = ATH12K_HW_MAX_QUEUES;
13896 	wiphy->tx_queue_len = ATH12K_QUEUE_LEN;
13897 	hw->offchannel_tx_hw_queue = ATH12K_HW_MAX_QUEUES - 1;
13898 	hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_EHT;
13899 
13900 	hw->vif_data_size = sizeof(struct ath12k_vif);
13901 	hw->sta_data_size = sizeof(struct ath12k_sta);
13902 	hw->extra_tx_headroom = ab->hw_params->iova_mask;
13903 
13904 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
13905 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STA_TX_PWR);
13906 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
13907 
13908 	wiphy->cipher_suites = cipher_suites;
13909 	wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
13910 
13911 	wiphy->iftype_ext_capab = ath12k_iftypes_ext_capa;
13912 	wiphy->num_iftype_ext_capab = ARRAY_SIZE(ath12k_iftypes_ext_capa);
13913 
13914 	wiphy->mbssid_max_interfaces = mbssid_max_interfaces;
13915 	wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD;
13916 	ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
13917 
13918 	if (is_6ghz) {
13919 		wiphy_ext_feature_set(wiphy,
13920 				      NL80211_EXT_FEATURE_FILS_DISCOVERY);
13921 		wiphy_ext_feature_set(wiphy,
13922 				      NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
13923 	}
13924 
13925 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PUNCT);
13926 	if (test_bit(WMI_TLV_SERVICE_BEACON_PROTECTION_SUPPORT, ab->wmi_ab.svc_map))
13927 		wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
13928 
13929 	ath12k_reg_init(hw);
13930 
13931 	if (!is_raw_mode) {
13932 		hw->netdev_features = NETIF_F_HW_CSUM;
13933 		ieee80211_hw_set(hw, SW_CRYPTO_CONTROL);
13934 		ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
13935 	}
13936 
13937 	if (test_bit(WMI_TLV_SERVICE_NLO, ar->wmi->wmi_ab->svc_map)) {
13938 		wiphy->max_sched_scan_ssids = WMI_PNO_MAX_SUPP_NETWORKS;
13939 		wiphy->max_match_sets = WMI_PNO_MAX_SUPP_NETWORKS;
13940 		wiphy->max_sched_scan_ie_len = WMI_PNO_MAX_IE_LENGTH;
13941 		wiphy->max_sched_scan_plans = WMI_PNO_MAX_SCHED_SCAN_PLANS;
13942 		wiphy->max_sched_scan_plan_interval =
13943 					WMI_PNO_MAX_SCHED_SCAN_PLAN_INT;
13944 		wiphy->max_sched_scan_plan_iterations =
13945 					WMI_PNO_MAX_SCHED_SCAN_PLAN_ITRNS;
13946 		wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
13947 	}
13948 
13949 	ret = ath12k_wow_init(ar);
13950 	if (ret) {
13951 		ath12k_warn(ar->ab, "failed to init wow: %d\n", ret);
13952 		goto err_cleanup_if_combs;
13953 	}
13954 
13955 	/* Boot-time regulatory updates have already been processed.
13956 	 * Mark them as complete now, because after registration,
13957 	 * cfg80211 will notify us again if there are any pending hints.
13958 	 * We need to wait for those hints to be processed, so it's
13959 	 * important to mark the boot-time updates as complete before
13960 	 * proceeding with registration.
13961 	 */
13962 	for_each_ar(ah, ar, i)
13963 		complete_all(&ar->regd_update_completed);
13964 
13965 	ret = ieee80211_register_hw(hw);
13966 	if (ret) {
13967 		ath12k_err(ab, "ieee80211 registration failed: %d\n", ret);
13968 		goto err_cleanup_if_combs;
13969 	}
13970 
13971 	if (is_monitor_disable)
13972 		/* There's a race between calling ieee80211_register_hw()
13973 		 * and here where the monitor mode is enabled for a little
13974 		 * while. But that time is so short and in practise it make
13975 		 * a difference in real life.
13976 		 */
13977 		wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
13978 
13979 	for_each_ar(ah, ar, i) {
13980 		/* Apply the regd received during initialization */
13981 		ret = ath12k_regd_update(ar, true);
13982 		if (ret) {
13983 			ath12k_err(ar->ab, "ath12k regd update failed: %d\n", ret);
13984 			goto err_unregister_hw;
13985 		}
13986 
13987 		if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
13988 			struct wmi_set_current_country_arg current_cc = {};
13989 
13990 			memcpy(&current_cc.alpha2, ab->new_alpha2, 2);
13991 			memcpy(&ar->alpha2, ab->new_alpha2, 2);
13992 
13993 			reinit_completion(&ar->regd_update_completed);
13994 
13995 			ret = ath12k_wmi_send_set_current_country_cmd(ar, &current_cc);
13996 			if (ret)
13997 				ath12k_warn(ar->ab,
13998 					    "failed set cc code for mac register: %d\n",
13999 					    ret);
14000 		}
14001 
14002 		ath12k_fw_stats_init(ar);
14003 		ath12k_debugfs_register(ar);
14004 	}
14005 
14006 	return 0;
14007 
14008 err_unregister_hw:
14009 	for_each_ar(ah, ar, i)
14010 		ath12k_debugfs_unregister(ar);
14011 
14012 	ieee80211_unregister_hw(hw);
14013 
14014 err_cleanup_if_combs:
14015 	ath12k_mac_cleanup_iface_combinations(ah);
14016 
14017 err_complete_cleanup_unregister:
14018 	i = ah->num_radio;
14019 
14020 err_cleanup_unregister:
14021 	for (j = 0; j < i; j++) {
14022 		ar = ath12k_ah_to_ar(ah, j);
14023 		ath12k_mac_cleanup_unregister(ar);
14024 	}
14025 
14026 	SET_IEEE80211_DEV(hw, NULL);
14027 
14028 	return ret;
14029 }
14030 
ath12k_mac_setup(struct ath12k * ar)14031 static void ath12k_mac_setup(struct ath12k *ar)
14032 {
14033 	struct ath12k_base *ab = ar->ab;
14034 	struct ath12k_pdev *pdev = ar->pdev;
14035 	u8 pdev_idx = ar->pdev_idx;
14036 
14037 	ar->lmac_id = ath12k_hw_get_mac_from_pdev_id(ab->hw_params, pdev_idx);
14038 
14039 	ar->wmi = &ab->wmi_ab.wmi[pdev_idx];
14040 	/* FIXME: wmi[0] is already initialized during attach,
14041 	 * Should we do this again?
14042 	 */
14043 	ath12k_wmi_pdev_attach(ab, pdev_idx);
14044 
14045 	ar->cfg_tx_chainmask = pdev->cap.tx_chain_mask;
14046 	ar->cfg_rx_chainmask = pdev->cap.rx_chain_mask;
14047 	ar->num_tx_chains = hweight32(pdev->cap.tx_chain_mask);
14048 	ar->num_rx_chains = hweight32(pdev->cap.rx_chain_mask);
14049 	ar->scan.arvif = NULL;
14050 	ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
14051 
14052 	spin_lock_init(&ar->data_lock);
14053 	INIT_LIST_HEAD(&ar->arvifs);
14054 	INIT_LIST_HEAD(&ar->ppdu_stats_info);
14055 
14056 	init_completion(&ar->vdev_setup_done);
14057 	init_completion(&ar->vdev_delete_done);
14058 	init_completion(&ar->peer_assoc_done);
14059 	init_completion(&ar->peer_delete_done);
14060 	init_completion(&ar->install_key_done);
14061 	init_completion(&ar->bss_survey_done);
14062 	init_completion(&ar->scan.started);
14063 	init_completion(&ar->scan.completed);
14064 	init_completion(&ar->scan.on_channel);
14065 	init_completion(&ar->mlo_setup_done);
14066 	init_completion(&ar->completed_11d_scan);
14067 	init_completion(&ar->regd_update_completed);
14068 
14069 	INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
14070 	wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
14071 	INIT_WORK(&ar->regd_channel_update_work, ath12k_regd_update_chan_list_work);
14072 	INIT_LIST_HEAD(&ar->regd_channel_update_queue);
14073 	INIT_WORK(&ar->regd_update_work, ath12k_regd_update_work);
14074 
14075 	wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
14076 	skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
14077 
14078 	ar->monitor_vdev_id = -1;
14079 	ar->monitor_vdev_created = false;
14080 	ar->monitor_started = false;
14081 }
14082 
__ath12k_mac_mlo_setup(struct ath12k * ar)14083 static int __ath12k_mac_mlo_setup(struct ath12k *ar)
14084 {
14085 	u8 num_link = 0, partner_link_id[ATH12K_GROUP_MAX_RADIO] = {};
14086 	struct ath12k_base *partner_ab, *ab = ar->ab;
14087 	struct ath12k_hw_group *ag = ab->ag;
14088 	struct wmi_mlo_setup_arg mlo = {};
14089 	struct ath12k_pdev *pdev;
14090 	unsigned long time_left;
14091 	int i, j, ret;
14092 
14093 	lockdep_assert_held(&ag->mutex);
14094 
14095 	reinit_completion(&ar->mlo_setup_done);
14096 
14097 	for (i = 0; i < ag->num_devices; i++) {
14098 		partner_ab = ag->ab[i];
14099 
14100 		for (j = 0; j < partner_ab->num_radios; j++) {
14101 			pdev = &partner_ab->pdevs[j];
14102 
14103 			/* Avoid the self link */
14104 			if (ar == pdev->ar)
14105 				continue;
14106 
14107 			partner_link_id[num_link] = pdev->hw_link_id;
14108 			num_link++;
14109 
14110 			ath12k_dbg(ab, ATH12K_DBG_MAC, "device %d pdev %d hw_link_id %d num_link %d\n",
14111 				   i, j, pdev->hw_link_id, num_link);
14112 		}
14113 	}
14114 
14115 	if (num_link == 0)
14116 		return 0;
14117 
14118 	mlo.group_id = cpu_to_le32(ag->id);
14119 	mlo.partner_link_id = partner_link_id;
14120 	mlo.num_partner_links = num_link;
14121 	ar->mlo_setup_status = 0;
14122 
14123 	ath12k_dbg(ab, ATH12K_DBG_MAC, "group id %d num_link %d\n", ag->id, num_link);
14124 
14125 	ret = ath12k_wmi_mlo_setup(ar, &mlo);
14126 	if (ret) {
14127 		ath12k_err(ab, "failed to send  setup MLO WMI command for pdev %d: %d\n",
14128 			   ar->pdev_idx, ret);
14129 		return ret;
14130 	}
14131 
14132 	time_left = wait_for_completion_timeout(&ar->mlo_setup_done,
14133 						WMI_MLO_CMD_TIMEOUT_HZ);
14134 
14135 	if (!time_left || ar->mlo_setup_status)
14136 		return ar->mlo_setup_status ? : -ETIMEDOUT;
14137 
14138 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo setup done for pdev %d\n", ar->pdev_idx);
14139 
14140 	return 0;
14141 }
14142 
__ath12k_mac_mlo_teardown(struct ath12k * ar)14143 static int __ath12k_mac_mlo_teardown(struct ath12k *ar)
14144 {
14145 	struct ath12k_base *ab = ar->ab;
14146 	int ret;
14147 	u8 num_link;
14148 
14149 	if (test_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags))
14150 		return 0;
14151 
14152 	num_link = ath12k_get_num_partner_link(ar);
14153 
14154 	if (num_link == 0)
14155 		return 0;
14156 
14157 	ret = ath12k_wmi_mlo_teardown(ar);
14158 	if (ret) {
14159 		ath12k_warn(ab, "failed to send MLO teardown WMI command for pdev %d: %d\n",
14160 			    ar->pdev_idx, ret);
14161 		return ret;
14162 	}
14163 
14164 	ath12k_dbg(ab, ATH12K_DBG_MAC, "mlo teardown for pdev %d\n", ar->pdev_idx);
14165 
14166 	return 0;
14167 }
14168 
ath12k_mac_mlo_setup(struct ath12k_hw_group * ag)14169 int ath12k_mac_mlo_setup(struct ath12k_hw_group *ag)
14170 {
14171 	struct ath12k_hw *ah;
14172 	struct ath12k *ar;
14173 	int ret;
14174 	int i, j;
14175 
14176 	for (i = 0; i < ag->num_hw; i++) {
14177 		ah = ag->ah[i];
14178 		if (!ah)
14179 			continue;
14180 
14181 		for_each_ar(ah, ar, j) {
14182 			ar = &ah->radio[j];
14183 			ret = __ath12k_mac_mlo_setup(ar);
14184 			if (ret) {
14185 				ath12k_err(ar->ab, "failed to setup MLO: %d\n", ret);
14186 				goto err_setup;
14187 			}
14188 		}
14189 	}
14190 
14191 	return 0;
14192 
14193 err_setup:
14194 	for (i = i - 1; i >= 0; i--) {
14195 		ah = ag->ah[i];
14196 		if (!ah)
14197 			continue;
14198 
14199 		for (j = j - 1; j >= 0; j--) {
14200 			ar = &ah->radio[j];
14201 			if (!ar)
14202 				continue;
14203 
14204 			__ath12k_mac_mlo_teardown(ar);
14205 		}
14206 	}
14207 
14208 	return ret;
14209 }
14210 
ath12k_mac_mlo_teardown(struct ath12k_hw_group * ag)14211 void ath12k_mac_mlo_teardown(struct ath12k_hw_group *ag)
14212 {
14213 	struct ath12k_hw *ah;
14214 	struct ath12k *ar;
14215 	int ret, i, j;
14216 
14217 	for (i = 0; i < ag->num_hw; i++) {
14218 		ah = ag->ah[i];
14219 		if (!ah)
14220 			continue;
14221 
14222 		for_each_ar(ah, ar, j) {
14223 			ar = &ah->radio[j];
14224 			ret = __ath12k_mac_mlo_teardown(ar);
14225 			if (ret) {
14226 				ath12k_err(ar->ab, "failed to teardown MLO: %d\n", ret);
14227 				break;
14228 			}
14229 		}
14230 	}
14231 }
14232 
ath12k_mac_register(struct ath12k_hw_group * ag)14233 int ath12k_mac_register(struct ath12k_hw_group *ag)
14234 {
14235 	struct ath12k_hw *ah;
14236 	int i;
14237 	int ret;
14238 
14239 	for (i = 0; i < ag->num_hw; i++) {
14240 		ah = ath12k_ag_to_ah(ag, i);
14241 
14242 		ret = ath12k_mac_hw_register(ah);
14243 		if (ret)
14244 			goto err;
14245 	}
14246 
14247 	return 0;
14248 
14249 err:
14250 	for (i = i - 1; i >= 0; i--) {
14251 		ah = ath12k_ag_to_ah(ag, i);
14252 		if (!ah)
14253 			continue;
14254 
14255 		ath12k_mac_hw_unregister(ah);
14256 	}
14257 
14258 	return ret;
14259 }
14260 
ath12k_mac_unregister(struct ath12k_hw_group * ag)14261 void ath12k_mac_unregister(struct ath12k_hw_group *ag)
14262 {
14263 	struct ath12k_hw *ah;
14264 	int i;
14265 
14266 	for (i = ag->num_hw - 1; i >= 0; i--) {
14267 		ah = ath12k_ag_to_ah(ag, i);
14268 		if (!ah)
14269 			continue;
14270 
14271 		ath12k_mac_hw_unregister(ah);
14272 	}
14273 }
14274 
ath12k_mac_hw_destroy(struct ath12k_hw * ah)14275 static void ath12k_mac_hw_destroy(struct ath12k_hw *ah)
14276 {
14277 	ieee80211_free_hw(ah->hw);
14278 }
14279 
ath12k_mac_hw_allocate(struct ath12k_hw_group * ag,struct ath12k_pdev_map * pdev_map,u8 num_pdev_map)14280 static struct ath12k_hw *ath12k_mac_hw_allocate(struct ath12k_hw_group *ag,
14281 						struct ath12k_pdev_map *pdev_map,
14282 						u8 num_pdev_map)
14283 {
14284 	struct ieee80211_hw *hw;
14285 	struct ath12k *ar;
14286 	struct ath12k_base *ab;
14287 	struct ath12k_pdev *pdev;
14288 	struct ath12k_hw *ah;
14289 	int i;
14290 	u8 pdev_idx;
14291 
14292 	hw = ieee80211_alloc_hw(struct_size(ah, radio, num_pdev_map),
14293 				&ath12k_ops);
14294 	if (!hw)
14295 		return NULL;
14296 
14297 	ah = ath12k_hw_to_ah(hw);
14298 	ah->hw = hw;
14299 	ah->num_radio = num_pdev_map;
14300 
14301 	mutex_init(&ah->hw_mutex);
14302 	INIT_LIST_HEAD(&ah->ml_peers);
14303 
14304 	for (i = 0; i < num_pdev_map; i++) {
14305 		ab = pdev_map[i].ab;
14306 		pdev_idx = pdev_map[i].pdev_idx;
14307 		pdev = &ab->pdevs[pdev_idx];
14308 
14309 		ar = ath12k_ah_to_ar(ah, i);
14310 		ar->ah = ah;
14311 		ar->ab = ab;
14312 		ar->hw_link_id = pdev->hw_link_id;
14313 		ar->pdev = pdev;
14314 		ar->pdev_idx = pdev_idx;
14315 		pdev->ar = ar;
14316 
14317 		ag->hw_links[ar->hw_link_id].device_id = ab->device_id;
14318 		ag->hw_links[ar->hw_link_id].pdev_idx = pdev_idx;
14319 
14320 		ath12k_mac_setup(ar);
14321 		ath12k_dp_pdev_pre_alloc(ar);
14322 	}
14323 
14324 	return ah;
14325 }
14326 
ath12k_mac_destroy(struct ath12k_hw_group * ag)14327 void ath12k_mac_destroy(struct ath12k_hw_group *ag)
14328 {
14329 	struct ath12k_pdev *pdev;
14330 	struct ath12k_base *ab = ag->ab[0];
14331 	int i, j;
14332 	struct ath12k_hw *ah;
14333 
14334 	for (i = 0; i < ag->num_devices; i++) {
14335 		ab = ag->ab[i];
14336 		if (!ab)
14337 			continue;
14338 
14339 		for (j = 0; j < ab->num_radios; j++) {
14340 			pdev = &ab->pdevs[j];
14341 			if (!pdev->ar)
14342 				continue;
14343 			pdev->ar = NULL;
14344 		}
14345 	}
14346 
14347 	for (i = 0; i < ag->num_hw; i++) {
14348 		ah = ath12k_ag_to_ah(ag, i);
14349 		if (!ah)
14350 			continue;
14351 
14352 		ath12k_mac_hw_destroy(ah);
14353 		ath12k_ag_set_ah(ag, i, NULL);
14354 	}
14355 }
14356 
ath12k_mac_set_device_defaults(struct ath12k_base * ab)14357 static void ath12k_mac_set_device_defaults(struct ath12k_base *ab)
14358 {
14359 	int total_vdev;
14360 
14361 	/* Initialize channel counters frequency value in hertz */
14362 	ab->cc_freq_hz = 320000;
14363 	total_vdev = ab->num_radios * TARGET_NUM_VDEVS(ab);
14364 	ab->free_vdev_map = (1LL << total_vdev) - 1;
14365 }
14366 
ath12k_mac_allocate(struct ath12k_hw_group * ag)14367 int ath12k_mac_allocate(struct ath12k_hw_group *ag)
14368 {
14369 	struct ath12k_pdev_map pdev_map[ATH12K_GROUP_MAX_RADIO];
14370 	int mac_id, device_id, total_radio, num_hw;
14371 	struct ath12k_base *ab;
14372 	struct ath12k_hw *ah;
14373 	int ret, i, j;
14374 	u8 radio_per_hw;
14375 
14376 	total_radio = 0;
14377 	for (i = 0; i < ag->num_devices; i++) {
14378 		ab = ag->ab[i];
14379 		if (!ab)
14380 			continue;
14381 
14382 		ath12k_debugfs_pdev_create(ab);
14383 		ath12k_mac_set_device_defaults(ab);
14384 		total_radio += ab->num_radios;
14385 	}
14386 
14387 	if (!total_radio)
14388 		return -EINVAL;
14389 
14390 	if (WARN_ON(total_radio > ATH12K_GROUP_MAX_RADIO))
14391 		return -ENOSPC;
14392 
14393 	/* All pdev get combined and register as single wiphy based on
14394 	 * hardware group which participate in multi-link operation else
14395 	 * each pdev get register separately.
14396 	 */
14397 	if (ag->mlo_capable)
14398 		radio_per_hw = total_radio;
14399 	else
14400 		radio_per_hw = 1;
14401 
14402 	num_hw = total_radio / radio_per_hw;
14403 
14404 	ag->num_hw = 0;
14405 	device_id = 0;
14406 	mac_id = 0;
14407 	for (i = 0; i < num_hw; i++) {
14408 		for (j = 0; j < radio_per_hw; j++) {
14409 			if (device_id >= ag->num_devices || !ag->ab[device_id]) {
14410 				ret = -ENOSPC;
14411 				goto err;
14412 			}
14413 
14414 			ab = ag->ab[device_id];
14415 			pdev_map[j].ab = ab;
14416 			pdev_map[j].pdev_idx = mac_id;
14417 			mac_id++;
14418 
14419 			/* If mac_id falls beyond the current device MACs then
14420 			 * move to next device
14421 			 */
14422 			if (mac_id >= ab->num_radios) {
14423 				mac_id = 0;
14424 				device_id++;
14425 			}
14426 		}
14427 
14428 		ab = pdev_map->ab;
14429 
14430 		ah = ath12k_mac_hw_allocate(ag, pdev_map, radio_per_hw);
14431 		if (!ah) {
14432 			ath12k_warn(ab, "failed to allocate mac80211 hw device for hw_idx %d\n",
14433 				    i);
14434 			ret = -ENOMEM;
14435 			goto err;
14436 		}
14437 
14438 		ah->dev = ab->dev;
14439 
14440 		ag->ah[i] = ah;
14441 		ag->num_hw++;
14442 	}
14443 
14444 	return 0;
14445 
14446 err:
14447 	for (i = i - 1; i >= 0; i--) {
14448 		ah = ath12k_ag_to_ah(ag, i);
14449 		if (!ah)
14450 			continue;
14451 
14452 		ath12k_mac_hw_destroy(ah);
14453 		ath12k_ag_set_ah(ag, i, NULL);
14454 	}
14455 
14456 	return ret;
14457 }
14458 
ath12k_mac_vif_set_keepalive(struct ath12k_link_vif * arvif,enum wmi_sta_keepalive_method method,u32 interval)14459 int ath12k_mac_vif_set_keepalive(struct ath12k_link_vif *arvif,
14460 				 enum wmi_sta_keepalive_method method,
14461 				 u32 interval)
14462 {
14463 	struct wmi_sta_keepalive_arg arg = {};
14464 	struct ath12k *ar = arvif->ar;
14465 	int ret;
14466 
14467 	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
14468 
14469 	if (arvif->ahvif->vdev_type != WMI_VDEV_TYPE_STA)
14470 		return 0;
14471 
14472 	if (!test_bit(WMI_TLV_SERVICE_STA_KEEP_ALIVE, ar->ab->wmi_ab.svc_map))
14473 		return 0;
14474 
14475 	arg.vdev_id = arvif->vdev_id;
14476 	arg.enabled = 1;
14477 	arg.method = method;
14478 	arg.interval = interval;
14479 
14480 	ret = ath12k_wmi_sta_keepalive(ar, &arg);
14481 	if (ret) {
14482 		ath12k_warn(ar->ab, "failed to set keepalive on vdev %i: %d\n",
14483 			    arvif->vdev_id, ret);
14484 		return ret;
14485 	}
14486 
14487 	return 0;
14488 }
14489