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