xref: /linux/drivers/net/wireless/mediatek/mt76/mac80211.c (revision 4b660dbd9ee2059850fd30e0df420ca7a38a1856)
1 // SPDX-License-Identifier: ISC
2 /*
3  * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
4  */
5 #include <linux/sched.h>
6 #include <linux/of.h>
7 #include "mt76.h"
8 
9 #define CHAN2G(_idx, _freq) {			\
10 	.band = NL80211_BAND_2GHZ,		\
11 	.center_freq = (_freq),			\
12 	.hw_value = (_idx),			\
13 	.max_power = 30,			\
14 }
15 
16 #define CHAN5G(_idx, _freq) {			\
17 	.band = NL80211_BAND_5GHZ,		\
18 	.center_freq = (_freq),			\
19 	.hw_value = (_idx),			\
20 	.max_power = 30,			\
21 }
22 
23 #define CHAN6G(_idx, _freq) {			\
24 	.band = NL80211_BAND_6GHZ,		\
25 	.center_freq = (_freq),			\
26 	.hw_value = (_idx),			\
27 	.max_power = 30,			\
28 }
29 
30 static const struct ieee80211_channel mt76_channels_2ghz[] = {
31 	CHAN2G(1, 2412),
32 	CHAN2G(2, 2417),
33 	CHAN2G(3, 2422),
34 	CHAN2G(4, 2427),
35 	CHAN2G(5, 2432),
36 	CHAN2G(6, 2437),
37 	CHAN2G(7, 2442),
38 	CHAN2G(8, 2447),
39 	CHAN2G(9, 2452),
40 	CHAN2G(10, 2457),
41 	CHAN2G(11, 2462),
42 	CHAN2G(12, 2467),
43 	CHAN2G(13, 2472),
44 	CHAN2G(14, 2484),
45 };
46 
47 static const struct ieee80211_channel mt76_channels_5ghz[] = {
48 	CHAN5G(36, 5180),
49 	CHAN5G(40, 5200),
50 	CHAN5G(44, 5220),
51 	CHAN5G(48, 5240),
52 
53 	CHAN5G(52, 5260),
54 	CHAN5G(56, 5280),
55 	CHAN5G(60, 5300),
56 	CHAN5G(64, 5320),
57 
58 	CHAN5G(100, 5500),
59 	CHAN5G(104, 5520),
60 	CHAN5G(108, 5540),
61 	CHAN5G(112, 5560),
62 	CHAN5G(116, 5580),
63 	CHAN5G(120, 5600),
64 	CHAN5G(124, 5620),
65 	CHAN5G(128, 5640),
66 	CHAN5G(132, 5660),
67 	CHAN5G(136, 5680),
68 	CHAN5G(140, 5700),
69 	CHAN5G(144, 5720),
70 
71 	CHAN5G(149, 5745),
72 	CHAN5G(153, 5765),
73 	CHAN5G(157, 5785),
74 	CHAN5G(161, 5805),
75 	CHAN5G(165, 5825),
76 	CHAN5G(169, 5845),
77 	CHAN5G(173, 5865),
78 	CHAN5G(177, 5885),
79 };
80 
81 static const struct ieee80211_channel mt76_channels_6ghz[] = {
82 	/* UNII-5 */
83 	CHAN6G(1, 5955),
84 	CHAN6G(5, 5975),
85 	CHAN6G(9, 5995),
86 	CHAN6G(13, 6015),
87 	CHAN6G(17, 6035),
88 	CHAN6G(21, 6055),
89 	CHAN6G(25, 6075),
90 	CHAN6G(29, 6095),
91 	CHAN6G(33, 6115),
92 	CHAN6G(37, 6135),
93 	CHAN6G(41, 6155),
94 	CHAN6G(45, 6175),
95 	CHAN6G(49, 6195),
96 	CHAN6G(53, 6215),
97 	CHAN6G(57, 6235),
98 	CHAN6G(61, 6255),
99 	CHAN6G(65, 6275),
100 	CHAN6G(69, 6295),
101 	CHAN6G(73, 6315),
102 	CHAN6G(77, 6335),
103 	CHAN6G(81, 6355),
104 	CHAN6G(85, 6375),
105 	CHAN6G(89, 6395),
106 	CHAN6G(93, 6415),
107 	/* UNII-6 */
108 	CHAN6G(97, 6435),
109 	CHAN6G(101, 6455),
110 	CHAN6G(105, 6475),
111 	CHAN6G(109, 6495),
112 	CHAN6G(113, 6515),
113 	CHAN6G(117, 6535),
114 	/* UNII-7 */
115 	CHAN6G(121, 6555),
116 	CHAN6G(125, 6575),
117 	CHAN6G(129, 6595),
118 	CHAN6G(133, 6615),
119 	CHAN6G(137, 6635),
120 	CHAN6G(141, 6655),
121 	CHAN6G(145, 6675),
122 	CHAN6G(149, 6695),
123 	CHAN6G(153, 6715),
124 	CHAN6G(157, 6735),
125 	CHAN6G(161, 6755),
126 	CHAN6G(165, 6775),
127 	CHAN6G(169, 6795),
128 	CHAN6G(173, 6815),
129 	CHAN6G(177, 6835),
130 	CHAN6G(181, 6855),
131 	CHAN6G(185, 6875),
132 	/* UNII-8 */
133 	CHAN6G(189, 6895),
134 	CHAN6G(193, 6915),
135 	CHAN6G(197, 6935),
136 	CHAN6G(201, 6955),
137 	CHAN6G(205, 6975),
138 	CHAN6G(209, 6995),
139 	CHAN6G(213, 7015),
140 	CHAN6G(217, 7035),
141 	CHAN6G(221, 7055),
142 	CHAN6G(225, 7075),
143 	CHAN6G(229, 7095),
144 	CHAN6G(233, 7115),
145 };
146 
147 static const struct ieee80211_tpt_blink mt76_tpt_blink[] = {
148 	{ .throughput =   0 * 1024, .blink_time = 334 },
149 	{ .throughput =   1 * 1024, .blink_time = 260 },
150 	{ .throughput =   5 * 1024, .blink_time = 220 },
151 	{ .throughput =  10 * 1024, .blink_time = 190 },
152 	{ .throughput =  20 * 1024, .blink_time = 170 },
153 	{ .throughput =  50 * 1024, .blink_time = 150 },
154 	{ .throughput =  70 * 1024, .blink_time = 130 },
155 	{ .throughput = 100 * 1024, .blink_time = 110 },
156 	{ .throughput = 200 * 1024, .blink_time =  80 },
157 	{ .throughput = 300 * 1024, .blink_time =  50 },
158 };
159 
160 struct ieee80211_rate mt76_rates[] = {
161 	CCK_RATE(0, 10),
162 	CCK_RATE(1, 20),
163 	CCK_RATE(2, 55),
164 	CCK_RATE(3, 110),
165 	OFDM_RATE(11, 60),
166 	OFDM_RATE(15, 90),
167 	OFDM_RATE(10, 120),
168 	OFDM_RATE(14, 180),
169 	OFDM_RATE(9,  240),
170 	OFDM_RATE(13, 360),
171 	OFDM_RATE(8,  480),
172 	OFDM_RATE(12, 540),
173 };
174 EXPORT_SYMBOL_GPL(mt76_rates);
175 
176 static const struct cfg80211_sar_freq_ranges mt76_sar_freq_ranges[] = {
177 	{ .start_freq = 2402, .end_freq = 2494, },
178 	{ .start_freq = 5150, .end_freq = 5350, },
179 	{ .start_freq = 5350, .end_freq = 5470, },
180 	{ .start_freq = 5470, .end_freq = 5725, },
181 	{ .start_freq = 5725, .end_freq = 5950, },
182 	{ .start_freq = 5945, .end_freq = 6165, },
183 	{ .start_freq = 6165, .end_freq = 6405, },
184 	{ .start_freq = 6405, .end_freq = 6525, },
185 	{ .start_freq = 6525, .end_freq = 6705, },
186 	{ .start_freq = 6705, .end_freq = 6865, },
187 	{ .start_freq = 6865, .end_freq = 7125, },
188 };
189 
190 static const struct cfg80211_sar_capa mt76_sar_capa = {
191 	.type = NL80211_SAR_TYPE_POWER,
192 	.num_freq_ranges = ARRAY_SIZE(mt76_sar_freq_ranges),
193 	.freq_ranges = &mt76_sar_freq_ranges[0],
194 };
195 
196 static int mt76_led_init(struct mt76_phy *phy)
197 {
198 	struct mt76_dev *dev = phy->dev;
199 	struct ieee80211_hw *hw = phy->hw;
200 	struct device_node *np = dev->dev->of_node;
201 
202 	if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set)
203 		return 0;
204 
205 	np = of_get_child_by_name(np, "led");
206 	if (np) {
207 		if (!of_device_is_available(np)) {
208 			of_node_put(np);
209 			dev_info(dev->dev,
210 				"led registration was explicitly disabled by dts\n");
211 			return 0;
212 		}
213 
214 		if (phy == &dev->phy) {
215 			int led_pin;
216 
217 			if (!of_property_read_u32(np, "led-sources", &led_pin))
218 				phy->leds.pin = led_pin;
219 
220 			phy->leds.al =
221 				of_property_read_bool(np, "led-active-low");
222 		}
223 
224 		of_node_put(np);
225 	}
226 
227 	snprintf(phy->leds.name, sizeof(phy->leds.name), "mt76-%s",
228 		 wiphy_name(hw->wiphy));
229 
230 	phy->leds.cdev.name = phy->leds.name;
231 	phy->leds.cdev.default_trigger =
232 		ieee80211_create_tpt_led_trigger(hw,
233 					IEEE80211_TPT_LEDTRIG_FL_RADIO,
234 					mt76_tpt_blink,
235 					ARRAY_SIZE(mt76_tpt_blink));
236 
237 	dev_info(dev->dev,
238 		"registering led '%s'\n", phy->leds.name);
239 
240 	return led_classdev_register(dev->dev, &phy->leds.cdev);
241 }
242 
243 static void mt76_led_cleanup(struct mt76_phy *phy)
244 {
245 	if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set)
246 		return;
247 
248 	led_classdev_unregister(&phy->leds.cdev);
249 }
250 
251 static void mt76_init_stream_cap(struct mt76_phy *phy,
252 				 struct ieee80211_supported_band *sband,
253 				 bool vht)
254 {
255 	struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
256 	int i, nstream = hweight8(phy->antenna_mask);
257 	struct ieee80211_sta_vht_cap *vht_cap;
258 	u16 mcs_map = 0;
259 
260 	if (nstream > 1)
261 		ht_cap->cap |= IEEE80211_HT_CAP_TX_STBC;
262 	else
263 		ht_cap->cap &= ~IEEE80211_HT_CAP_TX_STBC;
264 
265 	for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
266 		ht_cap->mcs.rx_mask[i] = i < nstream ? 0xff : 0;
267 
268 	if (!vht)
269 		return;
270 
271 	vht_cap = &sband->vht_cap;
272 	if (nstream > 1)
273 		vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
274 	else
275 		vht_cap->cap &= ~IEEE80211_VHT_CAP_TXSTBC;
276 	vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
277 			IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
278 
279 	for (i = 0; i < 8; i++) {
280 		if (i < nstream)
281 			mcs_map |= (IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2));
282 		else
283 			mcs_map |=
284 				(IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2));
285 	}
286 	vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
287 	vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
288 	if (ieee80211_hw_check(phy->hw, SUPPORTS_VHT_EXT_NSS_BW))
289 		vht_cap->vht_mcs.tx_highest |=
290 				cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
291 }
292 
293 void mt76_set_stream_caps(struct mt76_phy *phy, bool vht)
294 {
295 	if (phy->cap.has_2ghz)
296 		mt76_init_stream_cap(phy, &phy->sband_2g.sband, false);
297 	if (phy->cap.has_5ghz)
298 		mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht);
299 	if (phy->cap.has_6ghz)
300 		mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht);
301 }
302 EXPORT_SYMBOL_GPL(mt76_set_stream_caps);
303 
304 static int
305 mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband,
306 		const struct ieee80211_channel *chan, int n_chan,
307 		struct ieee80211_rate *rates, int n_rates,
308 		bool ht, bool vht)
309 {
310 	struct ieee80211_supported_band *sband = &msband->sband;
311 	struct ieee80211_sta_vht_cap *vht_cap;
312 	struct ieee80211_sta_ht_cap *ht_cap;
313 	struct mt76_dev *dev = phy->dev;
314 	void *chanlist;
315 	int size;
316 
317 	size = n_chan * sizeof(*chan);
318 	chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL);
319 	if (!chanlist)
320 		return -ENOMEM;
321 
322 	msband->chan = devm_kcalloc(dev->dev, n_chan, sizeof(*msband->chan),
323 				    GFP_KERNEL);
324 	if (!msband->chan)
325 		return -ENOMEM;
326 
327 	sband->channels = chanlist;
328 	sband->n_channels = n_chan;
329 	sband->bitrates = rates;
330 	sband->n_bitrates = n_rates;
331 
332 	if (!ht)
333 		return 0;
334 
335 	ht_cap = &sband->ht_cap;
336 	ht_cap->ht_supported = true;
337 	ht_cap->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
338 		       IEEE80211_HT_CAP_GRN_FLD |
339 		       IEEE80211_HT_CAP_SGI_20 |
340 		       IEEE80211_HT_CAP_SGI_40 |
341 		       (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
342 
343 	ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
344 	ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
345 
346 	mt76_init_stream_cap(phy, sband, vht);
347 
348 	if (!vht)
349 		return 0;
350 
351 	vht_cap = &sband->vht_cap;
352 	vht_cap->vht_supported = true;
353 	vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC |
354 			IEEE80211_VHT_CAP_RXSTBC_1 |
355 			IEEE80211_VHT_CAP_SHORT_GI_80 |
356 			(3 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT);
357 
358 	return 0;
359 }
360 
361 static int
362 mt76_init_sband_2g(struct mt76_phy *phy, struct ieee80211_rate *rates,
363 		   int n_rates)
364 {
365 	phy->hw->wiphy->bands[NL80211_BAND_2GHZ] = &phy->sband_2g.sband;
366 
367 	return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz,
368 			       ARRAY_SIZE(mt76_channels_2ghz), rates,
369 			       n_rates, true, false);
370 }
371 
372 static int
373 mt76_init_sband_5g(struct mt76_phy *phy, struct ieee80211_rate *rates,
374 		   int n_rates, bool vht)
375 {
376 	phy->hw->wiphy->bands[NL80211_BAND_5GHZ] = &phy->sband_5g.sband;
377 
378 	return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz,
379 			       ARRAY_SIZE(mt76_channels_5ghz), rates,
380 			       n_rates, true, vht);
381 }
382 
383 static int
384 mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates,
385 		   int n_rates)
386 {
387 	phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband;
388 
389 	return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz,
390 			       ARRAY_SIZE(mt76_channels_6ghz), rates,
391 			       n_rates, false, false);
392 }
393 
394 static void
395 mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband,
396 		 enum nl80211_band band)
397 {
398 	struct ieee80211_supported_band *sband = &msband->sband;
399 	bool found = false;
400 	int i;
401 
402 	if (!sband)
403 		return;
404 
405 	for (i = 0; i < sband->n_channels; i++) {
406 		if (sband->channels[i].flags & IEEE80211_CHAN_DISABLED)
407 			continue;
408 
409 		found = true;
410 		break;
411 	}
412 
413 	if (found) {
414 		phy->chandef.chan = &sband->channels[0];
415 		phy->chan_state = &msband->chan[0];
416 		return;
417 	}
418 
419 	sband->n_channels = 0;
420 	phy->hw->wiphy->bands[band] = NULL;
421 }
422 
423 static int
424 mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)
425 {
426 	struct mt76_dev *dev = phy->dev;
427 	struct wiphy *wiphy = hw->wiphy;
428 
429 	INIT_LIST_HEAD(&phy->tx_list);
430 	spin_lock_init(&phy->tx_lock);
431 
432 	SET_IEEE80211_DEV(hw, dev->dev);
433 	SET_IEEE80211_PERM_ADDR(hw, phy->macaddr);
434 
435 	wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR |
436 			   NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
437 	wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH |
438 			WIPHY_FLAG_SUPPORTS_TDLS |
439 			WIPHY_FLAG_AP_UAPSD;
440 
441 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
442 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
443 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AQL);
444 
445 	wiphy->available_antennas_tx = phy->antenna_mask;
446 	wiphy->available_antennas_rx = phy->antenna_mask;
447 
448 	wiphy->sar_capa = &mt76_sar_capa;
449 	phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges,
450 				sizeof(struct mt76_freq_range_power),
451 				GFP_KERNEL);
452 	if (!phy->frp)
453 		return -ENOMEM;
454 
455 	hw->txq_data_size = sizeof(struct mt76_txq);
456 	hw->uapsd_max_sp_len = IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL;
457 
458 	if (!hw->max_tx_fragments)
459 		hw->max_tx_fragments = 16;
460 
461 	ieee80211_hw_set(hw, SIGNAL_DBM);
462 	ieee80211_hw_set(hw, AMPDU_AGGREGATION);
463 	ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
464 	ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
465 	ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
466 	ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
467 	ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
468 
469 	if (!(dev->drv->drv_flags & MT_DRV_AMSDU_OFFLOAD) &&
470 	    hw->max_tx_fragments > 1) {
471 		ieee80211_hw_set(hw, TX_AMSDU);
472 		ieee80211_hw_set(hw, TX_FRAG_LIST);
473 	}
474 
475 	ieee80211_hw_set(hw, MFP_CAPABLE);
476 	ieee80211_hw_set(hw, AP_LINK_PS);
477 	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
478 
479 	return 0;
480 }
481 
482 struct mt76_phy *
483 mt76_alloc_phy(struct mt76_dev *dev, unsigned int size,
484 	       const struct ieee80211_ops *ops, u8 band_idx)
485 {
486 	struct ieee80211_hw *hw;
487 	unsigned int phy_size;
488 	struct mt76_phy *phy;
489 
490 	phy_size = ALIGN(sizeof(*phy), 8);
491 	hw = ieee80211_alloc_hw(size + phy_size, ops);
492 	if (!hw)
493 		return NULL;
494 
495 	phy = hw->priv;
496 	phy->dev = dev;
497 	phy->hw = hw;
498 	phy->priv = hw->priv + phy_size;
499 	phy->band_idx = band_idx;
500 
501 	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
502 	hw->wiphy->interface_modes =
503 		BIT(NL80211_IFTYPE_STATION) |
504 		BIT(NL80211_IFTYPE_AP) |
505 #ifdef CONFIG_MAC80211_MESH
506 		BIT(NL80211_IFTYPE_MESH_POINT) |
507 #endif
508 		BIT(NL80211_IFTYPE_P2P_CLIENT) |
509 		BIT(NL80211_IFTYPE_P2P_GO) |
510 		BIT(NL80211_IFTYPE_ADHOC);
511 
512 	return phy;
513 }
514 EXPORT_SYMBOL_GPL(mt76_alloc_phy);
515 
516 int mt76_register_phy(struct mt76_phy *phy, bool vht,
517 		      struct ieee80211_rate *rates, int n_rates)
518 {
519 	int ret;
520 
521 	ret = mt76_phy_init(phy, phy->hw);
522 	if (ret)
523 		return ret;
524 
525 	if (phy->cap.has_2ghz) {
526 		ret = mt76_init_sband_2g(phy, rates, n_rates);
527 		if (ret)
528 			return ret;
529 	}
530 
531 	if (phy->cap.has_5ghz) {
532 		ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht);
533 		if (ret)
534 			return ret;
535 	}
536 
537 	if (phy->cap.has_6ghz) {
538 		ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4);
539 		if (ret)
540 			return ret;
541 	}
542 
543 	if (IS_ENABLED(CONFIG_MT76_LEDS)) {
544 		ret = mt76_led_init(phy);
545 		if (ret)
546 			return ret;
547 	}
548 
549 	wiphy_read_of_freq_limits(phy->hw->wiphy);
550 	mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ);
551 	mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ);
552 	mt76_check_sband(phy, &phy->sband_6g, NL80211_BAND_6GHZ);
553 
554 	ret = ieee80211_register_hw(phy->hw);
555 	if (ret)
556 		return ret;
557 
558 	set_bit(MT76_STATE_REGISTERED, &phy->state);
559 	phy->dev->phys[phy->band_idx] = phy;
560 
561 	return 0;
562 }
563 EXPORT_SYMBOL_GPL(mt76_register_phy);
564 
565 void mt76_unregister_phy(struct mt76_phy *phy)
566 {
567 	struct mt76_dev *dev = phy->dev;
568 
569 	if (!test_bit(MT76_STATE_REGISTERED, &phy->state))
570 		return;
571 
572 	if (IS_ENABLED(CONFIG_MT76_LEDS))
573 		mt76_led_cleanup(phy);
574 	mt76_tx_status_check(dev, true);
575 	ieee80211_unregister_hw(phy->hw);
576 	dev->phys[phy->band_idx] = NULL;
577 }
578 EXPORT_SYMBOL_GPL(mt76_unregister_phy);
579 
580 int mt76_create_page_pool(struct mt76_dev *dev, struct mt76_queue *q)
581 {
582 	bool is_qrx = mt76_queue_is_rx(dev, q);
583 	struct page_pool_params pp_params = {
584 		.order = 0,
585 		.flags = 0,
586 		.nid = NUMA_NO_NODE,
587 		.dev = dev->dma_dev,
588 	};
589 	int idx = is_qrx ? q - dev->q_rx : -1;
590 
591 	/* Allocate page_pools just for rx/wed_tx_free queues */
592 	if (!is_qrx && !mt76_queue_is_wed_tx_free(q))
593 		return 0;
594 
595 	switch (idx) {
596 	case MT_RXQ_MAIN:
597 	case MT_RXQ_BAND1:
598 	case MT_RXQ_BAND2:
599 		pp_params.pool_size = 256;
600 		break;
601 	default:
602 		pp_params.pool_size = 16;
603 		break;
604 	}
605 
606 	if (mt76_is_mmio(dev)) {
607 		/* rely on page_pool for DMA mapping */
608 		pp_params.flags |= PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
609 		pp_params.dma_dir = DMA_FROM_DEVICE;
610 		pp_params.max_len = PAGE_SIZE;
611 		pp_params.offset = 0;
612 		/* NAPI is available just for rx queues */
613 		if (idx >= 0 && idx < ARRAY_SIZE(dev->napi))
614 			pp_params.napi = &dev->napi[idx];
615 	}
616 
617 	q->page_pool = page_pool_create(&pp_params);
618 	if (IS_ERR(q->page_pool)) {
619 		int err = PTR_ERR(q->page_pool);
620 
621 		q->page_pool = NULL;
622 		return err;
623 	}
624 
625 	return 0;
626 }
627 EXPORT_SYMBOL_GPL(mt76_create_page_pool);
628 
629 struct mt76_dev *
630 mt76_alloc_device(struct device *pdev, unsigned int size,
631 		  const struct ieee80211_ops *ops,
632 		  const struct mt76_driver_ops *drv_ops)
633 {
634 	struct ieee80211_hw *hw;
635 	struct mt76_phy *phy;
636 	struct mt76_dev *dev;
637 	int i;
638 
639 	hw = ieee80211_alloc_hw(size, ops);
640 	if (!hw)
641 		return NULL;
642 
643 	dev = hw->priv;
644 	dev->hw = hw;
645 	dev->dev = pdev;
646 	dev->drv = drv_ops;
647 	dev->dma_dev = pdev;
648 
649 	phy = &dev->phy;
650 	phy->dev = dev;
651 	phy->hw = hw;
652 	phy->band_idx = MT_BAND0;
653 	dev->phys[phy->band_idx] = phy;
654 
655 	spin_lock_init(&dev->rx_lock);
656 	spin_lock_init(&dev->lock);
657 	spin_lock_init(&dev->cc_lock);
658 	spin_lock_init(&dev->status_lock);
659 	spin_lock_init(&dev->wed_lock);
660 	mutex_init(&dev->mutex);
661 	init_waitqueue_head(&dev->tx_wait);
662 
663 	skb_queue_head_init(&dev->mcu.res_q);
664 	init_waitqueue_head(&dev->mcu.wait);
665 	mutex_init(&dev->mcu.mutex);
666 	dev->tx_worker.fn = mt76_tx_worker;
667 
668 	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
669 	hw->wiphy->interface_modes =
670 		BIT(NL80211_IFTYPE_STATION) |
671 		BIT(NL80211_IFTYPE_AP) |
672 #ifdef CONFIG_MAC80211_MESH
673 		BIT(NL80211_IFTYPE_MESH_POINT) |
674 #endif
675 		BIT(NL80211_IFTYPE_P2P_CLIENT) |
676 		BIT(NL80211_IFTYPE_P2P_GO) |
677 		BIT(NL80211_IFTYPE_ADHOC);
678 
679 	spin_lock_init(&dev->token_lock);
680 	idr_init(&dev->token);
681 
682 	spin_lock_init(&dev->rx_token_lock);
683 	idr_init(&dev->rx_token);
684 
685 	INIT_LIST_HEAD(&dev->wcid_list);
686 	INIT_LIST_HEAD(&dev->sta_poll_list);
687 	spin_lock_init(&dev->sta_poll_lock);
688 
689 	INIT_LIST_HEAD(&dev->txwi_cache);
690 	INIT_LIST_HEAD(&dev->rxwi_cache);
691 	dev->token_size = dev->drv->token_size;
692 
693 	for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++)
694 		skb_queue_head_init(&dev->rx_skb[i]);
695 
696 	dev->wq = alloc_ordered_workqueue("mt76", 0);
697 	if (!dev->wq) {
698 		ieee80211_free_hw(hw);
699 		return NULL;
700 	}
701 
702 	return dev;
703 }
704 EXPORT_SYMBOL_GPL(mt76_alloc_device);
705 
706 int mt76_register_device(struct mt76_dev *dev, bool vht,
707 			 struct ieee80211_rate *rates, int n_rates)
708 {
709 	struct ieee80211_hw *hw = dev->hw;
710 	struct mt76_phy *phy = &dev->phy;
711 	int ret;
712 
713 	dev_set_drvdata(dev->dev, dev);
714 	mt76_wcid_init(&dev->global_wcid);
715 	ret = mt76_phy_init(phy, hw);
716 	if (ret)
717 		return ret;
718 
719 	if (phy->cap.has_2ghz) {
720 		ret = mt76_init_sband_2g(phy, rates, n_rates);
721 		if (ret)
722 			return ret;
723 	}
724 
725 	if (phy->cap.has_5ghz) {
726 		ret = mt76_init_sband_5g(phy, rates + 4, n_rates - 4, vht);
727 		if (ret)
728 			return ret;
729 	}
730 
731 	if (phy->cap.has_6ghz) {
732 		ret = mt76_init_sband_6g(phy, rates + 4, n_rates - 4);
733 		if (ret)
734 			return ret;
735 	}
736 
737 	wiphy_read_of_freq_limits(hw->wiphy);
738 	mt76_check_sband(&dev->phy, &phy->sband_2g, NL80211_BAND_2GHZ);
739 	mt76_check_sband(&dev->phy, &phy->sband_5g, NL80211_BAND_5GHZ);
740 	mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ);
741 
742 	if (IS_ENABLED(CONFIG_MT76_LEDS)) {
743 		ret = mt76_led_init(phy);
744 		if (ret)
745 			return ret;
746 	}
747 
748 	ret = ieee80211_register_hw(hw);
749 	if (ret)
750 		return ret;
751 
752 	WARN_ON(mt76_worker_setup(hw, &dev->tx_worker, NULL, "tx"));
753 	set_bit(MT76_STATE_REGISTERED, &phy->state);
754 	sched_set_fifo_low(dev->tx_worker.task);
755 
756 	return 0;
757 }
758 EXPORT_SYMBOL_GPL(mt76_register_device);
759 
760 void mt76_unregister_device(struct mt76_dev *dev)
761 {
762 	struct ieee80211_hw *hw = dev->hw;
763 
764 	if (!test_bit(MT76_STATE_REGISTERED, &dev->phy.state))
765 		return;
766 
767 	if (IS_ENABLED(CONFIG_MT76_LEDS))
768 		mt76_led_cleanup(&dev->phy);
769 	mt76_tx_status_check(dev, true);
770 	mt76_wcid_cleanup(dev, &dev->global_wcid);
771 	ieee80211_unregister_hw(hw);
772 }
773 EXPORT_SYMBOL_GPL(mt76_unregister_device);
774 
775 void mt76_free_device(struct mt76_dev *dev)
776 {
777 	mt76_worker_teardown(&dev->tx_worker);
778 	if (dev->wq) {
779 		destroy_workqueue(dev->wq);
780 		dev->wq = NULL;
781 	}
782 	ieee80211_free_hw(dev->hw);
783 }
784 EXPORT_SYMBOL_GPL(mt76_free_device);
785 
786 static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q)
787 {
788 	struct sk_buff *skb = phy->rx_amsdu[q].head;
789 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
790 	struct mt76_dev *dev = phy->dev;
791 
792 	phy->rx_amsdu[q].head = NULL;
793 	phy->rx_amsdu[q].tail = NULL;
794 
795 	/*
796 	 * Validate if the amsdu has a proper first subframe.
797 	 * A single MSDU can be parsed as A-MSDU when the unauthenticated A-MSDU
798 	 * flag of the QoS header gets flipped. In such cases, the first
799 	 * subframe has a LLC/SNAP header in the location of the destination
800 	 * address.
801 	 */
802 	if (skb_shinfo(skb)->frag_list) {
803 		int offset = 0;
804 
805 		if (!(status->flag & RX_FLAG_8023)) {
806 			offset = ieee80211_get_hdrlen_from_skb(skb);
807 
808 			if ((status->flag &
809 			     (RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED)) ==
810 			    RX_FLAG_DECRYPTED)
811 				offset += 8;
812 		}
813 
814 		if (ether_addr_equal(skb->data + offset, rfc1042_header)) {
815 			dev_kfree_skb(skb);
816 			return;
817 		}
818 	}
819 	__skb_queue_tail(&dev->rx_skb[q], skb);
820 }
821 
822 static void mt76_rx_release_burst(struct mt76_phy *phy, enum mt76_rxq_id q,
823 				  struct sk_buff *skb)
824 {
825 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
826 
827 	if (phy->rx_amsdu[q].head &&
828 	    (!status->amsdu || status->first_amsdu ||
829 	     status->seqno != phy->rx_amsdu[q].seqno))
830 		mt76_rx_release_amsdu(phy, q);
831 
832 	if (!phy->rx_amsdu[q].head) {
833 		phy->rx_amsdu[q].tail = &skb_shinfo(skb)->frag_list;
834 		phy->rx_amsdu[q].seqno = status->seqno;
835 		phy->rx_amsdu[q].head = skb;
836 	} else {
837 		*phy->rx_amsdu[q].tail = skb;
838 		phy->rx_amsdu[q].tail = &skb->next;
839 	}
840 
841 	if (!status->amsdu || status->last_amsdu)
842 		mt76_rx_release_amsdu(phy, q);
843 }
844 
845 void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb)
846 {
847 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
848 	struct mt76_phy *phy = mt76_dev_phy(dev, status->phy_idx);
849 
850 	if (!test_bit(MT76_STATE_RUNNING, &phy->state)) {
851 		dev_kfree_skb(skb);
852 		return;
853 	}
854 
855 #ifdef CONFIG_NL80211_TESTMODE
856 	if (phy->test.state == MT76_TM_STATE_RX_FRAMES) {
857 		phy->test.rx_stats.packets[q]++;
858 		if (status->flag & RX_FLAG_FAILED_FCS_CRC)
859 			phy->test.rx_stats.fcs_error[q]++;
860 	}
861 #endif
862 
863 	mt76_rx_release_burst(phy, q, skb);
864 }
865 EXPORT_SYMBOL_GPL(mt76_rx);
866 
867 bool mt76_has_tx_pending(struct mt76_phy *phy)
868 {
869 	struct mt76_queue *q;
870 	int i;
871 
872 	for (i = 0; i < __MT_TXQ_MAX; i++) {
873 		q = phy->q_tx[i];
874 		if (q && q->queued)
875 			return true;
876 	}
877 
878 	return false;
879 }
880 EXPORT_SYMBOL_GPL(mt76_has_tx_pending);
881 
882 static struct mt76_channel_state *
883 mt76_channel_state(struct mt76_phy *phy, struct ieee80211_channel *c)
884 {
885 	struct mt76_sband *msband;
886 	int idx;
887 
888 	if (c->band == NL80211_BAND_2GHZ)
889 		msband = &phy->sband_2g;
890 	else if (c->band == NL80211_BAND_6GHZ)
891 		msband = &phy->sband_6g;
892 	else
893 		msband = &phy->sband_5g;
894 
895 	idx = c - &msband->sband.channels[0];
896 	return &msband->chan[idx];
897 }
898 
899 void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time)
900 {
901 	struct mt76_channel_state *state = phy->chan_state;
902 
903 	state->cc_active += ktime_to_us(ktime_sub(time,
904 						  phy->survey_time));
905 	phy->survey_time = time;
906 }
907 EXPORT_SYMBOL_GPL(mt76_update_survey_active_time);
908 
909 void mt76_update_survey(struct mt76_phy *phy)
910 {
911 	struct mt76_dev *dev = phy->dev;
912 	ktime_t cur_time;
913 
914 	if (dev->drv->update_survey)
915 		dev->drv->update_survey(phy);
916 
917 	cur_time = ktime_get_boottime();
918 	mt76_update_survey_active_time(phy, cur_time);
919 
920 	if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME) {
921 		struct mt76_channel_state *state = phy->chan_state;
922 
923 		spin_lock_bh(&dev->cc_lock);
924 		state->cc_bss_rx += dev->cur_cc_bss_rx;
925 		dev->cur_cc_bss_rx = 0;
926 		spin_unlock_bh(&dev->cc_lock);
927 	}
928 }
929 EXPORT_SYMBOL_GPL(mt76_update_survey);
930 
931 void mt76_set_channel(struct mt76_phy *phy)
932 {
933 	struct mt76_dev *dev = phy->dev;
934 	struct ieee80211_hw *hw = phy->hw;
935 	struct cfg80211_chan_def *chandef = &hw->conf.chandef;
936 	bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
937 	int timeout = HZ / 5;
938 
939 	wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout);
940 	mt76_update_survey(phy);
941 
942 	if (phy->chandef.chan->center_freq != chandef->chan->center_freq ||
943 	    phy->chandef.width != chandef->width)
944 		phy->dfs_state = MT_DFS_STATE_UNKNOWN;
945 
946 	phy->chandef = *chandef;
947 	phy->chan_state = mt76_channel_state(phy, chandef->chan);
948 
949 	if (!offchannel)
950 		phy->main_chan = chandef->chan;
951 
952 	if (chandef->chan != phy->main_chan)
953 		memset(phy->chan_state, 0, sizeof(*phy->chan_state));
954 }
955 EXPORT_SYMBOL_GPL(mt76_set_channel);
956 
957 int mt76_get_survey(struct ieee80211_hw *hw, int idx,
958 		    struct survey_info *survey)
959 {
960 	struct mt76_phy *phy = hw->priv;
961 	struct mt76_dev *dev = phy->dev;
962 	struct mt76_sband *sband;
963 	struct ieee80211_channel *chan;
964 	struct mt76_channel_state *state;
965 	int ret = 0;
966 
967 	mutex_lock(&dev->mutex);
968 	if (idx == 0 && dev->drv->update_survey)
969 		mt76_update_survey(phy);
970 
971 	if (idx >= phy->sband_2g.sband.n_channels +
972 		   phy->sband_5g.sband.n_channels) {
973 		idx -= (phy->sband_2g.sband.n_channels +
974 			phy->sband_5g.sband.n_channels);
975 		sband = &phy->sband_6g;
976 	} else if (idx >= phy->sband_2g.sband.n_channels) {
977 		idx -= phy->sband_2g.sband.n_channels;
978 		sband = &phy->sband_5g;
979 	} else {
980 		sband = &phy->sband_2g;
981 	}
982 
983 	if (idx >= sband->sband.n_channels) {
984 		ret = -ENOENT;
985 		goto out;
986 	}
987 
988 	chan = &sband->sband.channels[idx];
989 	state = mt76_channel_state(phy, chan);
990 
991 	memset(survey, 0, sizeof(*survey));
992 	survey->channel = chan;
993 	survey->filled = SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY;
994 	survey->filled |= dev->drv->survey_flags;
995 	if (state->noise)
996 		survey->filled |= SURVEY_INFO_NOISE_DBM;
997 
998 	if (chan == phy->main_chan) {
999 		survey->filled |= SURVEY_INFO_IN_USE;
1000 
1001 		if (dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME)
1002 			survey->filled |= SURVEY_INFO_TIME_BSS_RX;
1003 	}
1004 
1005 	survey->time_busy = div_u64(state->cc_busy, 1000);
1006 	survey->time_rx = div_u64(state->cc_rx, 1000);
1007 	survey->time = div_u64(state->cc_active, 1000);
1008 	survey->noise = state->noise;
1009 
1010 	spin_lock_bh(&dev->cc_lock);
1011 	survey->time_bss_rx = div_u64(state->cc_bss_rx, 1000);
1012 	survey->time_tx = div_u64(state->cc_tx, 1000);
1013 	spin_unlock_bh(&dev->cc_lock);
1014 
1015 out:
1016 	mutex_unlock(&dev->mutex);
1017 
1018 	return ret;
1019 }
1020 EXPORT_SYMBOL_GPL(mt76_get_survey);
1021 
1022 void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid,
1023 			 struct ieee80211_key_conf *key)
1024 {
1025 	struct ieee80211_key_seq seq;
1026 	int i;
1027 
1028 	wcid->rx_check_pn = false;
1029 
1030 	if (!key)
1031 		return;
1032 
1033 	if (key->cipher != WLAN_CIPHER_SUITE_CCMP)
1034 		return;
1035 
1036 	wcid->rx_check_pn = true;
1037 
1038 	/* data frame */
1039 	for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
1040 		ieee80211_get_key_rx_seq(key, i, &seq);
1041 		memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn));
1042 	}
1043 
1044 	/* robust management frame */
1045 	ieee80211_get_key_rx_seq(key, -1, &seq);
1046 	memcpy(wcid->rx_key_pn[i], seq.ccmp.pn, sizeof(seq.ccmp.pn));
1047 
1048 }
1049 EXPORT_SYMBOL(mt76_wcid_key_setup);
1050 
1051 int mt76_rx_signal(u8 chain_mask, s8 *chain_signal)
1052 {
1053 	int signal = -128;
1054 	u8 chains;
1055 
1056 	for (chains = chain_mask; chains; chains >>= 1, chain_signal++) {
1057 		int cur, diff;
1058 
1059 		cur = *chain_signal;
1060 		if (!(chains & BIT(0)) ||
1061 		    cur > 0)
1062 			continue;
1063 
1064 		if (cur > signal)
1065 			swap(cur, signal);
1066 
1067 		diff = signal - cur;
1068 		if (diff == 0)
1069 			signal += 3;
1070 		else if (diff <= 2)
1071 			signal += 2;
1072 		else if (diff <= 6)
1073 			signal += 1;
1074 	}
1075 
1076 	return signal;
1077 }
1078 EXPORT_SYMBOL(mt76_rx_signal);
1079 
1080 static void
1081 mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
1082 		struct ieee80211_hw **hw,
1083 		struct ieee80211_sta **sta)
1084 {
1085 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
1086 	struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
1087 	struct mt76_rx_status mstat;
1088 
1089 	mstat = *((struct mt76_rx_status *)skb->cb);
1090 	memset(status, 0, sizeof(*status));
1091 
1092 	status->flag = mstat.flag;
1093 	status->freq = mstat.freq;
1094 	status->enc_flags = mstat.enc_flags;
1095 	status->encoding = mstat.encoding;
1096 	status->bw = mstat.bw;
1097 	if (status->encoding == RX_ENC_EHT) {
1098 		status->eht.ru = mstat.eht.ru;
1099 		status->eht.gi = mstat.eht.gi;
1100 	} else {
1101 		status->he_ru = mstat.he_ru;
1102 		status->he_gi = mstat.he_gi;
1103 		status->he_dcm = mstat.he_dcm;
1104 	}
1105 	status->rate_idx = mstat.rate_idx;
1106 	status->nss = mstat.nss;
1107 	status->band = mstat.band;
1108 	status->signal = mstat.signal;
1109 	status->chains = mstat.chains;
1110 	status->ampdu_reference = mstat.ampdu_ref;
1111 	status->device_timestamp = mstat.timestamp;
1112 	status->mactime = mstat.timestamp;
1113 	status->signal = mt76_rx_signal(mstat.chains, mstat.chain_signal);
1114 	if (status->signal <= -128)
1115 		status->flag |= RX_FLAG_NO_SIGNAL_VAL;
1116 
1117 	if (ieee80211_is_beacon(hdr->frame_control) ||
1118 	    ieee80211_is_probe_resp(hdr->frame_control))
1119 		status->boottime_ns = ktime_get_boottime_ns();
1120 
1121 	BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb));
1122 	BUILD_BUG_ON(sizeof(status->chain_signal) !=
1123 		     sizeof(mstat.chain_signal));
1124 	memcpy(status->chain_signal, mstat.chain_signal,
1125 	       sizeof(mstat.chain_signal));
1126 
1127 	*sta = wcid_to_sta(mstat.wcid);
1128 	*hw = mt76_phy_hw(dev, mstat.phy_idx);
1129 }
1130 
1131 static void
1132 mt76_check_ccmp_pn(struct sk_buff *skb)
1133 {
1134 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
1135 	struct mt76_wcid *wcid = status->wcid;
1136 	struct ieee80211_hdr *hdr;
1137 	int security_idx;
1138 	int ret;
1139 
1140 	if (!(status->flag & RX_FLAG_DECRYPTED))
1141 		return;
1142 
1143 	if (status->flag & RX_FLAG_ONLY_MONITOR)
1144 		return;
1145 
1146 	if (!wcid || !wcid->rx_check_pn)
1147 		return;
1148 
1149 	security_idx = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
1150 	if (status->flag & RX_FLAG_8023)
1151 		goto skip_hdr_check;
1152 
1153 	hdr = mt76_skb_get_hdr(skb);
1154 	if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
1155 		/*
1156 		 * Validate the first fragment both here and in mac80211
1157 		 * All further fragments will be validated by mac80211 only.
1158 		 */
1159 		if (ieee80211_is_frag(hdr) &&
1160 		    !ieee80211_is_first_frag(hdr->frame_control))
1161 			return;
1162 	}
1163 
1164 	/* IEEE 802.11-2020, 12.5.3.4.4 "PN and replay detection" c):
1165 	 *
1166 	 * the recipient shall maintain a single replay counter for received
1167 	 * individually addressed robust Management frames that are received
1168 	 * with the To DS subfield equal to 0, [...]
1169 	 */
1170 	if (ieee80211_is_mgmt(hdr->frame_control) &&
1171 	    !ieee80211_has_tods(hdr->frame_control))
1172 		security_idx = IEEE80211_NUM_TIDS;
1173 
1174 skip_hdr_check:
1175 	BUILD_BUG_ON(sizeof(status->iv) != sizeof(wcid->rx_key_pn[0]));
1176 	ret = memcmp(status->iv, wcid->rx_key_pn[security_idx],
1177 		     sizeof(status->iv));
1178 	if (ret <= 0) {
1179 		status->flag |= RX_FLAG_ONLY_MONITOR;
1180 		return;
1181 	}
1182 
1183 	memcpy(wcid->rx_key_pn[security_idx], status->iv, sizeof(status->iv));
1184 
1185 	if (status->flag & RX_FLAG_IV_STRIPPED)
1186 		status->flag |= RX_FLAG_PN_VALIDATED;
1187 }
1188 
1189 static void
1190 mt76_airtime_report(struct mt76_dev *dev, struct mt76_rx_status *status,
1191 		    int len)
1192 {
1193 	struct mt76_wcid *wcid = status->wcid;
1194 	struct ieee80211_rx_status info = {
1195 		.enc_flags = status->enc_flags,
1196 		.rate_idx = status->rate_idx,
1197 		.encoding = status->encoding,
1198 		.band = status->band,
1199 		.nss = status->nss,
1200 		.bw = status->bw,
1201 	};
1202 	struct ieee80211_sta *sta;
1203 	u32 airtime;
1204 	u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
1205 
1206 	airtime = ieee80211_calc_rx_airtime(dev->hw, &info, len);
1207 	spin_lock(&dev->cc_lock);
1208 	dev->cur_cc_bss_rx += airtime;
1209 	spin_unlock(&dev->cc_lock);
1210 
1211 	if (!wcid || !wcid->sta)
1212 		return;
1213 
1214 	sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
1215 	ieee80211_sta_register_airtime(sta, tidno, 0, airtime);
1216 }
1217 
1218 static void
1219 mt76_airtime_flush_ampdu(struct mt76_dev *dev)
1220 {
1221 	struct mt76_wcid *wcid;
1222 	int wcid_idx;
1223 
1224 	if (!dev->rx_ampdu_len)
1225 		return;
1226 
1227 	wcid_idx = dev->rx_ampdu_status.wcid_idx;
1228 	if (wcid_idx < ARRAY_SIZE(dev->wcid))
1229 		wcid = rcu_dereference(dev->wcid[wcid_idx]);
1230 	else
1231 		wcid = NULL;
1232 	dev->rx_ampdu_status.wcid = wcid;
1233 
1234 	mt76_airtime_report(dev, &dev->rx_ampdu_status, dev->rx_ampdu_len);
1235 
1236 	dev->rx_ampdu_len = 0;
1237 	dev->rx_ampdu_ref = 0;
1238 }
1239 
1240 static void
1241 mt76_airtime_check(struct mt76_dev *dev, struct sk_buff *skb)
1242 {
1243 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
1244 	struct mt76_wcid *wcid = status->wcid;
1245 
1246 	if (!(dev->drv->drv_flags & MT_DRV_SW_RX_AIRTIME))
1247 		return;
1248 
1249 	if (!wcid || !wcid->sta) {
1250 		struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
1251 
1252 		if (status->flag & RX_FLAG_8023)
1253 			return;
1254 
1255 		if (!ether_addr_equal(hdr->addr1, dev->phy.macaddr))
1256 			return;
1257 
1258 		wcid = NULL;
1259 	}
1260 
1261 	if (!(status->flag & RX_FLAG_AMPDU_DETAILS) ||
1262 	    status->ampdu_ref != dev->rx_ampdu_ref)
1263 		mt76_airtime_flush_ampdu(dev);
1264 
1265 	if (status->flag & RX_FLAG_AMPDU_DETAILS) {
1266 		if (!dev->rx_ampdu_len ||
1267 		    status->ampdu_ref != dev->rx_ampdu_ref) {
1268 			dev->rx_ampdu_status = *status;
1269 			dev->rx_ampdu_status.wcid_idx = wcid ? wcid->idx : 0xff;
1270 			dev->rx_ampdu_ref = status->ampdu_ref;
1271 		}
1272 
1273 		dev->rx_ampdu_len += skb->len;
1274 		return;
1275 	}
1276 
1277 	mt76_airtime_report(dev, status, skb->len);
1278 }
1279 
1280 static void
1281 mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
1282 {
1283 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
1284 	struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
1285 	struct ieee80211_sta *sta;
1286 	struct ieee80211_hw *hw;
1287 	struct mt76_wcid *wcid = status->wcid;
1288 	u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
1289 	bool ps;
1290 
1291 	hw = mt76_phy_hw(dev, status->phy_idx);
1292 	if (ieee80211_is_pspoll(hdr->frame_control) && !wcid &&
1293 	    !(status->flag & RX_FLAG_8023)) {
1294 		sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr2, NULL);
1295 		if (sta)
1296 			wcid = status->wcid = (struct mt76_wcid *)sta->drv_priv;
1297 	}
1298 
1299 	mt76_airtime_check(dev, skb);
1300 
1301 	if (!wcid || !wcid->sta)
1302 		return;
1303 
1304 	sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
1305 
1306 	if (status->signal <= 0)
1307 		ewma_signal_add(&wcid->rssi, -status->signal);
1308 
1309 	wcid->inactive_count = 0;
1310 
1311 	if (status->flag & RX_FLAG_8023)
1312 		return;
1313 
1314 	if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags))
1315 		return;
1316 
1317 	if (ieee80211_is_pspoll(hdr->frame_control)) {
1318 		ieee80211_sta_pspoll(sta);
1319 		return;
1320 	}
1321 
1322 	if (ieee80211_has_morefrags(hdr->frame_control) ||
1323 	    !(ieee80211_is_mgmt(hdr->frame_control) ||
1324 	      ieee80211_is_data(hdr->frame_control)))
1325 		return;
1326 
1327 	ps = ieee80211_has_pm(hdr->frame_control);
1328 
1329 	if (ps && (ieee80211_is_data_qos(hdr->frame_control) ||
1330 		   ieee80211_is_qos_nullfunc(hdr->frame_control)))
1331 		ieee80211_sta_uapsd_trigger(sta, tidno);
1332 
1333 	if (!!test_bit(MT_WCID_FLAG_PS, &wcid->flags) == ps)
1334 		return;
1335 
1336 	if (ps)
1337 		set_bit(MT_WCID_FLAG_PS, &wcid->flags);
1338 
1339 	if (dev->drv->sta_ps)
1340 		dev->drv->sta_ps(dev, sta, ps);
1341 
1342 	if (!ps)
1343 		clear_bit(MT_WCID_FLAG_PS, &wcid->flags);
1344 
1345 	ieee80211_sta_ps_transition(sta, ps);
1346 }
1347 
1348 void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
1349 		      struct napi_struct *napi)
1350 {
1351 	struct ieee80211_sta *sta;
1352 	struct ieee80211_hw *hw;
1353 	struct sk_buff *skb, *tmp;
1354 	LIST_HEAD(list);
1355 
1356 	spin_lock(&dev->rx_lock);
1357 	while ((skb = __skb_dequeue(frames)) != NULL) {
1358 		struct sk_buff *nskb = skb_shinfo(skb)->frag_list;
1359 
1360 		mt76_check_ccmp_pn(skb);
1361 		skb_shinfo(skb)->frag_list = NULL;
1362 		mt76_rx_convert(dev, skb, &hw, &sta);
1363 		ieee80211_rx_list(hw, sta, skb, &list);
1364 
1365 		/* subsequent amsdu frames */
1366 		while (nskb) {
1367 			skb = nskb;
1368 			nskb = nskb->next;
1369 			skb->next = NULL;
1370 
1371 			mt76_rx_convert(dev, skb, &hw, &sta);
1372 			ieee80211_rx_list(hw, sta, skb, &list);
1373 		}
1374 	}
1375 	spin_unlock(&dev->rx_lock);
1376 
1377 	if (!napi) {
1378 		netif_receive_skb_list(&list);
1379 		return;
1380 	}
1381 
1382 	list_for_each_entry_safe(skb, tmp, &list, list) {
1383 		skb_list_del_init(skb);
1384 		napi_gro_receive(napi, skb);
1385 	}
1386 }
1387 
1388 void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
1389 			   struct napi_struct *napi)
1390 {
1391 	struct sk_buff_head frames;
1392 	struct sk_buff *skb;
1393 
1394 	__skb_queue_head_init(&frames);
1395 
1396 	while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
1397 		mt76_check_sta(dev, skb);
1398 		if (mtk_wed_device_active(&dev->mmio.wed))
1399 			__skb_queue_tail(&frames, skb);
1400 		else
1401 			mt76_rx_aggr_reorder(skb, &frames);
1402 	}
1403 
1404 	mt76_rx_complete(dev, &frames, napi);
1405 }
1406 EXPORT_SYMBOL_GPL(mt76_rx_poll_complete);
1407 
1408 static int
1409 mt76_sta_add(struct mt76_phy *phy, struct ieee80211_vif *vif,
1410 	     struct ieee80211_sta *sta)
1411 {
1412 	struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
1413 	struct mt76_dev *dev = phy->dev;
1414 	int ret;
1415 	int i;
1416 
1417 	mutex_lock(&dev->mutex);
1418 
1419 	ret = dev->drv->sta_add(dev, vif, sta);
1420 	if (ret)
1421 		goto out;
1422 
1423 	for (i = 0; i < ARRAY_SIZE(sta->txq); i++) {
1424 		struct mt76_txq *mtxq;
1425 
1426 		if (!sta->txq[i])
1427 			continue;
1428 
1429 		mtxq = (struct mt76_txq *)sta->txq[i]->drv_priv;
1430 		mtxq->wcid = wcid->idx;
1431 	}
1432 
1433 	ewma_signal_init(&wcid->rssi);
1434 	if (phy->band_idx == MT_BAND1)
1435 		mt76_wcid_mask_set(dev->wcid_phy_mask, wcid->idx);
1436 	wcid->phy_idx = phy->band_idx;
1437 	rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
1438 
1439 	mt76_wcid_init(wcid);
1440 out:
1441 	mutex_unlock(&dev->mutex);
1442 
1443 	return ret;
1444 }
1445 
1446 void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
1447 		       struct ieee80211_sta *sta)
1448 {
1449 	struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
1450 	int i, idx = wcid->idx;
1451 
1452 	for (i = 0; i < ARRAY_SIZE(wcid->aggr); i++)
1453 		mt76_rx_aggr_stop(dev, wcid, i);
1454 
1455 	if (dev->drv->sta_remove)
1456 		dev->drv->sta_remove(dev, vif, sta);
1457 
1458 	mt76_wcid_cleanup(dev, wcid);
1459 
1460 	mt76_wcid_mask_clear(dev->wcid_mask, idx);
1461 	mt76_wcid_mask_clear(dev->wcid_phy_mask, idx);
1462 }
1463 EXPORT_SYMBOL_GPL(__mt76_sta_remove);
1464 
1465 static void
1466 mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
1467 		struct ieee80211_sta *sta)
1468 {
1469 	mutex_lock(&dev->mutex);
1470 	__mt76_sta_remove(dev, vif, sta);
1471 	mutex_unlock(&dev->mutex);
1472 }
1473 
1474 int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1475 		   struct ieee80211_sta *sta,
1476 		   enum ieee80211_sta_state old_state,
1477 		   enum ieee80211_sta_state new_state)
1478 {
1479 	struct mt76_phy *phy = hw->priv;
1480 	struct mt76_dev *dev = phy->dev;
1481 
1482 	if (old_state == IEEE80211_STA_NOTEXIST &&
1483 	    new_state == IEEE80211_STA_NONE)
1484 		return mt76_sta_add(phy, vif, sta);
1485 
1486 	if (old_state == IEEE80211_STA_AUTH &&
1487 	    new_state == IEEE80211_STA_ASSOC &&
1488 	    dev->drv->sta_assoc)
1489 		dev->drv->sta_assoc(dev, vif, sta);
1490 
1491 	if (old_state == IEEE80211_STA_NONE &&
1492 	    new_state == IEEE80211_STA_NOTEXIST)
1493 		mt76_sta_remove(dev, vif, sta);
1494 
1495 	return 0;
1496 }
1497 EXPORT_SYMBOL_GPL(mt76_sta_state);
1498 
1499 void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1500 			     struct ieee80211_sta *sta)
1501 {
1502 	struct mt76_phy *phy = hw->priv;
1503 	struct mt76_dev *dev = phy->dev;
1504 	struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
1505 
1506 	mutex_lock(&dev->mutex);
1507 	spin_lock_bh(&dev->status_lock);
1508 	rcu_assign_pointer(dev->wcid[wcid->idx], NULL);
1509 	spin_unlock_bh(&dev->status_lock);
1510 	mutex_unlock(&dev->mutex);
1511 }
1512 EXPORT_SYMBOL_GPL(mt76_sta_pre_rcu_remove);
1513 
1514 void mt76_wcid_init(struct mt76_wcid *wcid)
1515 {
1516 	INIT_LIST_HEAD(&wcid->tx_list);
1517 	skb_queue_head_init(&wcid->tx_pending);
1518 
1519 	INIT_LIST_HEAD(&wcid->list);
1520 	idr_init(&wcid->pktid);
1521 }
1522 EXPORT_SYMBOL_GPL(mt76_wcid_init);
1523 
1524 void mt76_wcid_cleanup(struct mt76_dev *dev, struct mt76_wcid *wcid)
1525 {
1526 	struct mt76_phy *phy = dev->phys[wcid->phy_idx];
1527 	struct ieee80211_hw *hw;
1528 	struct sk_buff_head list;
1529 	struct sk_buff *skb;
1530 
1531 	mt76_tx_status_lock(dev, &list);
1532 	mt76_tx_status_skb_get(dev, wcid, -1, &list);
1533 	mt76_tx_status_unlock(dev, &list);
1534 
1535 	idr_destroy(&wcid->pktid);
1536 
1537 	spin_lock_bh(&phy->tx_lock);
1538 
1539 	if (!list_empty(&wcid->tx_list))
1540 		list_del_init(&wcid->tx_list);
1541 
1542 	spin_lock(&wcid->tx_pending.lock);
1543 	skb_queue_splice_tail_init(&wcid->tx_pending, &list);
1544 	spin_unlock(&wcid->tx_pending.lock);
1545 
1546 	spin_unlock_bh(&phy->tx_lock);
1547 
1548 	while ((skb = __skb_dequeue(&list)) != NULL) {
1549 		hw = mt76_tx_status_get_hw(dev, skb);
1550 		ieee80211_free_txskb(hw, skb);
1551 	}
1552 }
1553 EXPORT_SYMBOL_GPL(mt76_wcid_cleanup);
1554 
1555 int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1556 		     int *dbm)
1557 {
1558 	struct mt76_phy *phy = hw->priv;
1559 	int n_chains = hweight16(phy->chainmask);
1560 	int delta = mt76_tx_power_nss_delta(n_chains);
1561 
1562 	*dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2);
1563 
1564 	return 0;
1565 }
1566 EXPORT_SYMBOL_GPL(mt76_get_txpower);
1567 
1568 int mt76_init_sar_power(struct ieee80211_hw *hw,
1569 			const struct cfg80211_sar_specs *sar)
1570 {
1571 	struct mt76_phy *phy = hw->priv;
1572 	const struct cfg80211_sar_capa *capa = hw->wiphy->sar_capa;
1573 	int i;
1574 
1575 	if (sar->type != NL80211_SAR_TYPE_POWER || !sar->num_sub_specs)
1576 		return -EINVAL;
1577 
1578 	for (i = 0; i < sar->num_sub_specs; i++) {
1579 		u32 index = sar->sub_specs[i].freq_range_index;
1580 		/* SAR specifies power limitaton in 0.25dbm */
1581 		s32 power = sar->sub_specs[i].power >> 1;
1582 
1583 		if (power > 127 || power < -127)
1584 			power = 127;
1585 
1586 		phy->frp[index].range = &capa->freq_ranges[index];
1587 		phy->frp[index].power = power;
1588 	}
1589 
1590 	return 0;
1591 }
1592 EXPORT_SYMBOL_GPL(mt76_init_sar_power);
1593 
1594 int mt76_get_sar_power(struct mt76_phy *phy,
1595 		       struct ieee80211_channel *chan,
1596 		       int power)
1597 {
1598 	const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa;
1599 	int freq, i;
1600 
1601 	if (!capa || !phy->frp)
1602 		return power;
1603 
1604 	if (power > 127 || power < -127)
1605 		power = 127;
1606 
1607 	freq = ieee80211_channel_to_frequency(chan->hw_value, chan->band);
1608 	for (i = 0 ; i < capa->num_freq_ranges; i++) {
1609 		if (phy->frp[i].range &&
1610 		    freq >= phy->frp[i].range->start_freq &&
1611 		    freq < phy->frp[i].range->end_freq) {
1612 			power = min_t(int, phy->frp[i].power, power);
1613 			break;
1614 		}
1615 	}
1616 
1617 	return power;
1618 }
1619 EXPORT_SYMBOL_GPL(mt76_get_sar_power);
1620 
1621 static void
1622 __mt76_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
1623 {
1624 	if (vif->bss_conf.csa_active && ieee80211_beacon_cntdwn_is_complete(vif, 0))
1625 		ieee80211_csa_finish(vif, 0);
1626 }
1627 
1628 void mt76_csa_finish(struct mt76_dev *dev)
1629 {
1630 	if (!dev->csa_complete)
1631 		return;
1632 
1633 	ieee80211_iterate_active_interfaces_atomic(dev->hw,
1634 		IEEE80211_IFACE_ITER_RESUME_ALL,
1635 		__mt76_csa_finish, dev);
1636 
1637 	dev->csa_complete = 0;
1638 }
1639 EXPORT_SYMBOL_GPL(mt76_csa_finish);
1640 
1641 static void
1642 __mt76_csa_check(void *priv, u8 *mac, struct ieee80211_vif *vif)
1643 {
1644 	struct mt76_dev *dev = priv;
1645 
1646 	if (!vif->bss_conf.csa_active)
1647 		return;
1648 
1649 	dev->csa_complete |= ieee80211_beacon_cntdwn_is_complete(vif, 0);
1650 }
1651 
1652 void mt76_csa_check(struct mt76_dev *dev)
1653 {
1654 	ieee80211_iterate_active_interfaces_atomic(dev->hw,
1655 		IEEE80211_IFACE_ITER_RESUME_ALL,
1656 		__mt76_csa_check, dev);
1657 }
1658 EXPORT_SYMBOL_GPL(mt76_csa_check);
1659 
1660 int
1661 mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set)
1662 {
1663 	return 0;
1664 }
1665 EXPORT_SYMBOL_GPL(mt76_set_tim);
1666 
1667 void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id)
1668 {
1669 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
1670 	int hdr_len = ieee80211_get_hdrlen_from_skb(skb);
1671 	u8 *hdr, *pn = status->iv;
1672 
1673 	__skb_push(skb, 8);
1674 	memmove(skb->data, skb->data + 8, hdr_len);
1675 	hdr = skb->data + hdr_len;
1676 
1677 	hdr[0] = pn[5];
1678 	hdr[1] = pn[4];
1679 	hdr[2] = 0;
1680 	hdr[3] = 0x20 | (key_id << 6);
1681 	hdr[4] = pn[3];
1682 	hdr[5] = pn[2];
1683 	hdr[6] = pn[1];
1684 	hdr[7] = pn[0];
1685 
1686 	status->flag &= ~RX_FLAG_IV_STRIPPED;
1687 }
1688 EXPORT_SYMBOL_GPL(mt76_insert_ccmp_hdr);
1689 
1690 int mt76_get_rate(struct mt76_dev *dev,
1691 		  struct ieee80211_supported_band *sband,
1692 		  int idx, bool cck)
1693 {
1694 	int i, offset = 0, len = sband->n_bitrates;
1695 
1696 	if (cck) {
1697 		if (sband != &dev->phy.sband_2g.sband)
1698 			return 0;
1699 
1700 		idx &= ~BIT(2); /* short preamble */
1701 	} else if (sband == &dev->phy.sband_2g.sband) {
1702 		offset = 4;
1703 	}
1704 
1705 	for (i = offset; i < len; i++) {
1706 		if ((sband->bitrates[i].hw_value & GENMASK(7, 0)) == idx)
1707 			return i;
1708 	}
1709 
1710 	return 0;
1711 }
1712 EXPORT_SYMBOL_GPL(mt76_get_rate);
1713 
1714 void mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1715 		  const u8 *mac)
1716 {
1717 	struct mt76_phy *phy = hw->priv;
1718 
1719 	set_bit(MT76_SCANNING, &phy->state);
1720 }
1721 EXPORT_SYMBOL_GPL(mt76_sw_scan);
1722 
1723 void mt76_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1724 {
1725 	struct mt76_phy *phy = hw->priv;
1726 
1727 	clear_bit(MT76_SCANNING, &phy->state);
1728 }
1729 EXPORT_SYMBOL_GPL(mt76_sw_scan_complete);
1730 
1731 int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
1732 {
1733 	struct mt76_phy *phy = hw->priv;
1734 	struct mt76_dev *dev = phy->dev;
1735 
1736 	mutex_lock(&dev->mutex);
1737 	*tx_ant = phy->antenna_mask;
1738 	*rx_ant = phy->antenna_mask;
1739 	mutex_unlock(&dev->mutex);
1740 
1741 	return 0;
1742 }
1743 EXPORT_SYMBOL_GPL(mt76_get_antenna);
1744 
1745 struct mt76_queue *
1746 mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
1747 		int ring_base, void *wed, u32 flags)
1748 {
1749 	struct mt76_queue *hwq;
1750 	int err;
1751 
1752 	hwq = devm_kzalloc(dev->dev, sizeof(*hwq), GFP_KERNEL);
1753 	if (!hwq)
1754 		return ERR_PTR(-ENOMEM);
1755 
1756 	hwq->flags = flags;
1757 	hwq->wed = wed;
1758 
1759 	err = dev->queue_ops->alloc(dev, hwq, idx, n_desc, 0, ring_base);
1760 	if (err < 0)
1761 		return ERR_PTR(err);
1762 
1763 	return hwq;
1764 }
1765 EXPORT_SYMBOL_GPL(mt76_init_queue);
1766 
1767 u16 mt76_calculate_default_rate(struct mt76_phy *phy,
1768 				struct ieee80211_vif *vif, int rateidx)
1769 {
1770 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
1771 	struct cfg80211_chan_def *chandef = mvif->ctx ?
1772 					    &mvif->ctx->def :
1773 					    &phy->chandef;
1774 	int offset = 0;
1775 
1776 	if (chandef->chan->band != NL80211_BAND_2GHZ)
1777 		offset = 4;
1778 
1779 	/* pick the lowest rate for hidden nodes */
1780 	if (rateidx < 0)
1781 		rateidx = 0;
1782 
1783 	rateidx += offset;
1784 	if (rateidx >= ARRAY_SIZE(mt76_rates))
1785 		rateidx = offset;
1786 
1787 	return mt76_rates[rateidx].hw_value;
1788 }
1789 EXPORT_SYMBOL_GPL(mt76_calculate_default_rate);
1790 
1791 void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
1792 			 struct mt76_sta_stats *stats, bool eht)
1793 {
1794 	int i, ei = wi->initial_stat_idx;
1795 	u64 *data = wi->data;
1796 
1797 	wi->sta_count++;
1798 
1799 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_CCK];
1800 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_OFDM];
1801 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT];
1802 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_HT_GF];
1803 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_VHT];
1804 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_SU];
1805 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_EXT_SU];
1806 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_TB];
1807 	data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_MU];
1808 	if (eht) {
1809 		data[ei++] += stats->tx_mode[MT_PHY_TYPE_EHT_SU];
1810 		data[ei++] += stats->tx_mode[MT_PHY_TYPE_EHT_TRIG];
1811 		data[ei++] += stats->tx_mode[MT_PHY_TYPE_EHT_MU];
1812 	}
1813 
1814 	for (i = 0; i < (ARRAY_SIZE(stats->tx_bw) - !eht); i++)
1815 		data[ei++] += stats->tx_bw[i];
1816 
1817 	for (i = 0; i < (eht ? 14 : 12); i++)
1818 		data[ei++] += stats->tx_mcs[i];
1819 
1820 	for (i = 0; i < 4; i++)
1821 		data[ei++] += stats->tx_nss[i];
1822 
1823 	wi->worker_stat_count = ei - wi->initial_stat_idx;
1824 }
1825 EXPORT_SYMBOL_GPL(mt76_ethtool_worker);
1826 
1827 void mt76_ethtool_page_pool_stats(struct mt76_dev *dev, u64 *data, int *index)
1828 {
1829 #ifdef CONFIG_PAGE_POOL_STATS
1830 	struct page_pool_stats stats = {};
1831 	int i;
1832 
1833 	mt76_for_each_q_rx(dev, i)
1834 		page_pool_get_stats(dev->q_rx[i].page_pool, &stats);
1835 
1836 	page_pool_ethtool_stats_get(data, &stats);
1837 	*index += page_pool_ethtool_stats_get_count();
1838 #endif
1839 }
1840 EXPORT_SYMBOL_GPL(mt76_ethtool_page_pool_stats);
1841 
1842 enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy)
1843 {
1844 	struct ieee80211_hw *hw = phy->hw;
1845 	struct mt76_dev *dev = phy->dev;
1846 
1847 	if (dev->region == NL80211_DFS_UNSET ||
1848 	    test_bit(MT76_SCANNING, &phy->state))
1849 		return MT_DFS_STATE_DISABLED;
1850 
1851 	if (!hw->conf.radar_enabled) {
1852 		if ((hw->conf.flags & IEEE80211_CONF_MONITOR) &&
1853 		    (phy->chandef.chan->flags & IEEE80211_CHAN_RADAR))
1854 			return MT_DFS_STATE_ACTIVE;
1855 
1856 		return MT_DFS_STATE_DISABLED;
1857 	}
1858 
1859 	if (!cfg80211_reg_can_beacon(hw->wiphy, &phy->chandef, NL80211_IFTYPE_AP))
1860 		return MT_DFS_STATE_CAC;
1861 
1862 	return MT_DFS_STATE_ACTIVE;
1863 }
1864 EXPORT_SYMBOL_GPL(mt76_phy_dfs_state);
1865