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