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