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