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