]> Git Repo - J-linux.git/blob - drivers/net/wireless/mediatek/mt76/mac80211.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / net / wireless / mediatek / mt76 / mac80211.c
1 // SPDX-License-Identifier: ISC
2 /*
3  * Copyright (C) 2016 Felix Fietkau <[email protected]>
4  */
5 #include <linux/sched.h>
6 #include <linux/of.h>
7 #include "mt76.h"
8
9 #define CHAN2G(_idx, _freq) {                   \
10         .band = NL80211_BAND_2GHZ,              \
11         .center_freq = (_freq),                 \
12         .hw_value = (_idx),                     \
13         .max_power = 30,                        \
14 }
15
16 #define CHAN5G(_idx, _freq) {                   \
17         .band = NL80211_BAND_5GHZ,              \
18         .center_freq = (_freq),                 \
19         .hw_value = (_idx),                     \
20         .max_power = 30,                        \
21 }
22
23 #define CHAN6G(_idx, _freq) {                   \
24         .band = NL80211_BAND_6GHZ,              \
25         .center_freq = (_freq),                 \
26         .hw_value = (_idx),                     \
27         .max_power = 30,                        \
28 }
29
30 static const struct ieee80211_channel mt76_channels_2ghz[] = {
31         CHAN2G(1, 2412),
32         CHAN2G(2, 2417),
33         CHAN2G(3, 2422),
34         CHAN2G(4, 2427),
35         CHAN2G(5, 2432),
36         CHAN2G(6, 2437),
37         CHAN2G(7, 2442),
38         CHAN2G(8, 2447),
39         CHAN2G(9, 2452),
40         CHAN2G(10, 2457),
41         CHAN2G(11, 2462),
42         CHAN2G(12, 2467),
43         CHAN2G(13, 2472),
44         CHAN2G(14, 2484),
45 };
46
47 static const struct ieee80211_channel mt76_channels_5ghz[] = {
48         CHAN5G(36, 5180),
49         CHAN5G(40, 5200),
50         CHAN5G(44, 5220),
51         CHAN5G(48, 5240),
52
53         CHAN5G(52, 5260),
54         CHAN5G(56, 5280),
55         CHAN5G(60, 5300),
56         CHAN5G(64, 5320),
57
58         CHAN5G(100, 5500),
59         CHAN5G(104, 5520),
60         CHAN5G(108, 5540),
61         CHAN5G(112, 5560),
62         CHAN5G(116, 5580),
63         CHAN5G(120, 5600),
64         CHAN5G(124, 5620),
65         CHAN5G(128, 5640),
66         CHAN5G(132, 5660),
67         CHAN5G(136, 5680),
68         CHAN5G(140, 5700),
69         CHAN5G(144, 5720),
70
71         CHAN5G(149, 5745),
72         CHAN5G(153, 5765),
73         CHAN5G(157, 5785),
74         CHAN5G(161, 5805),
75         CHAN5G(165, 5825),
76         CHAN5G(169, 5845),
77         CHAN5G(173, 5865),
78         CHAN5G(177, 5885),
79 };
80
81 static const struct ieee80211_channel mt76_channels_6ghz[] = {
82         /* UNII-5 */
83         CHAN6G(1, 5955),
84         CHAN6G(5, 5975),
85         CHAN6G(9, 5995),
86         CHAN6G(13, 6015),
87         CHAN6G(17, 6035),
88         CHAN6G(21, 6055),
89         CHAN6G(25, 6075),
90         CHAN6G(29, 6095),
91         CHAN6G(33, 6115),
92         CHAN6G(37, 6135),
93         CHAN6G(41, 6155),
94         CHAN6G(45, 6175),
95         CHAN6G(49, 6195),
96         CHAN6G(53, 6215),
97         CHAN6G(57, 6235),
98         CHAN6G(61, 6255),
99         CHAN6G(65, 6275),
100         CHAN6G(69, 6295),
101         CHAN6G(73, 6315),
102         CHAN6G(77, 6335),
103         CHAN6G(81, 6355),
104         CHAN6G(85, 6375),
105         CHAN6G(89, 6395),
106         CHAN6G(93, 6415),
107         /* UNII-6 */
108         CHAN6G(97, 6435),
109         CHAN6G(101, 6455),
110         CHAN6G(105, 6475),
111         CHAN6G(109, 6495),
112         CHAN6G(113, 6515),
113         CHAN6G(117, 6535),
114         /* UNII-7 */
115         CHAN6G(121, 6555),
116         CHAN6G(125, 6575),
117         CHAN6G(129, 6595),
118         CHAN6G(133, 6615),
119         CHAN6G(137, 6635),
120         CHAN6G(141, 6655),
121         CHAN6G(145, 6675),
122         CHAN6G(149, 6695),
123         CHAN6G(153, 6715),
124         CHAN6G(157, 6735),
125         CHAN6G(161, 6755),
126         CHAN6G(165, 6775),
127         CHAN6G(169, 6795),
128         CHAN6G(173, 6815),
129         CHAN6G(177, 6835),
130         CHAN6G(181, 6855),
131         CHAN6G(185, 6875),
132         /* UNII-8 */
133         CHAN6G(189, 6895),
134         CHAN6G(193, 6915),
135         CHAN6G(197, 6935),
136         CHAN6G(201, 6955),
137         CHAN6G(205, 6975),
138         CHAN6G(209, 6995),
139         CHAN6G(213, 7015),
140         CHAN6G(217, 7035),
141         CHAN6G(221, 7055),
142         CHAN6G(225, 7075),
143         CHAN6G(229, 7095),
144         CHAN6G(233, 7115),
145 };
146
147 static const struct ieee80211_tpt_blink mt76_tpt_blink[] = {
148         { .throughput =   0 * 1024, .blink_time = 334 },
149         { .throughput =   1 * 1024, .blink_time = 260 },
150         { .throughput =   5 * 1024, .blink_time = 220 },
151         { .throughput =  10 * 1024, .blink_time = 190 },
152         { .throughput =  20 * 1024, .blink_time = 170 },
153         { .throughput =  50 * 1024, .blink_time = 150 },
154         { .throughput =  70 * 1024, .blink_time = 130 },
155         { .throughput = 100 * 1024, .blink_time = 110 },
156         { .throughput = 200 * 1024, .blink_time =  80 },
157         { .throughput = 300 * 1024, .blink_time =  50 },
158 };
159
160 struct ieee80211_rate mt76_rates[] = {
161         CCK_RATE(0, 10),
162         CCK_RATE(1, 20),
163         CCK_RATE(2, 55),
164         CCK_RATE(3, 110),
165         OFDM_RATE(11, 60),
166         OFDM_RATE(15, 90),
167         OFDM_RATE(10, 120),
168         OFDM_RATE(14, 180),
169         OFDM_RATE(9,  240),
170         OFDM_RATE(13, 360),
171         OFDM_RATE(8,  480),
172         OFDM_RATE(12, 540),
173 };
174 EXPORT_SYMBOL_GPL(mt76_rates);
175
176 static const struct cfg80211_sar_freq_ranges mt76_sar_freq_ranges[] = {
177         { .start_freq = 2402, .end_freq = 2494, },
178         { .start_freq = 5150, .end_freq = 5350, },
179         { .start_freq = 5350, .end_freq = 5470, },
180         { .start_freq = 5470, .end_freq = 5725, },
181         { .start_freq = 5725, .end_freq = 5950, },
182         { .start_freq = 5945, .end_freq = 6165, },
183         { .start_freq = 6165, .end_freq = 6405, },
184         { .start_freq = 6405, .end_freq = 6525, },
185         { .start_freq = 6525, .end_freq = 6705, },
186         { .start_freq = 6705, .end_freq = 6865, },
187         { .start_freq = 6865, .end_freq = 7125, },
188 };
189
190 static const struct cfg80211_sar_capa mt76_sar_capa = {
191         .type = NL80211_SAR_TYPE_POWER,
192         .num_freq_ranges = ARRAY_SIZE(mt76_sar_freq_ranges),
193         .freq_ranges = &mt76_sar_freq_ranges[0],
194 };
195
196 static int mt76_led_init(struct mt76_phy *phy)
197 {
198         struct mt76_dev *dev = phy->dev;
199         struct ieee80211_hw *hw = phy->hw;
200         struct device_node *np = dev->dev->of_node;
201
202         if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set)
203                 return 0;
204
205         np = of_get_child_by_name(np, "led");
206         if (np) {
207                 if (!of_device_is_available(np)) {
208                         of_node_put(np);
209                         dev_info(dev->dev,
210                                 "led registration was explicitly disabled by dts\n");
211                         return 0;
212                 }
213
214                 if (phy == &dev->phy) {
215                         int led_pin;
216
217                         if (!of_property_read_u32(np, "led-sources", &led_pin))
218                                 phy->leds.pin = led_pin;
219
220                         phy->leds.al =
221                                 of_property_read_bool(np, "led-active-low");
222                 }
223
224                 of_node_put(np);
225         }
226
227         snprintf(phy->leds.name, sizeof(phy->leds.name), "mt76-%s",
228                  wiphy_name(hw->wiphy));
229
230         phy->leds.cdev.name = phy->leds.name;
231         phy->leds.cdev.default_trigger =
232                 ieee80211_create_tpt_led_trigger(hw,
233                                         IEEE80211_TPT_LEDTRIG_FL_RADIO,
234                                         mt76_tpt_blink,
235                                         ARRAY_SIZE(mt76_tpt_blink));
236
237         dev_info(dev->dev,
238                 "registering led '%s'\n", phy->leds.name);
239
240         return led_classdev_register(dev->dev, &phy->leds.cdev);
241 }
242
243 static void mt76_led_cleanup(struct mt76_phy *phy)
244 {
245         if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set)
246                 return;
247
248         led_classdev_unregister(&phy->leds.cdev);
249 }
250
251 static void mt76_init_stream_cap(struct mt76_phy *phy,
252                                  struct ieee80211_supported_band *sband,
253                                  bool vht)
254 {
255         struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
256         int i, nstream = hweight8(phy->antenna_mask);
257         struct ieee80211_sta_vht_cap *vht_cap;
258         u16 mcs_map = 0;
259
260         if (nstream > 1)
261                 ht_cap->cap |= IEEE80211_HT_CAP_TX_STBC;
262         else
263                 ht_cap->cap &= ~IEEE80211_HT_CAP_TX_STBC;
264
265         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
266                 ht_cap->mcs.rx_mask[i] = i < nstream ? 0xff : 0;
267
268         if (!vht)
269                 return;
270
271         vht_cap = &sband->vht_cap;
272         if (nstream > 1)
273                 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
274         else
275                 vht_cap->cap &= ~IEEE80211_VHT_CAP_TXSTBC;
276         vht_cap->cap |= IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
277                         IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
278
279         for (i = 0; i < 8; i++) {
280                 if (i < nstream)
281                         mcs_map |= (IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2));
282                 else
283                         mcs_map |=
284                                 (IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2));
285         }
286         vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
287         vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
288         if (ieee80211_hw_check(phy->hw, SUPPORTS_VHT_EXT_NSS_BW))
289                 vht_cap->vht_mcs.tx_highest |=
290                                 cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
291 }
292
293 void mt76_set_stream_caps(struct mt76_phy *phy, bool vht)
294 {
295         if (phy->cap.has_2ghz)
296                 mt76_init_stream_cap(phy, &phy->sband_2g.sband, false);
297         if (phy->cap.has_5ghz)
298                 mt76_init_stream_cap(phy, &phy->sband_5g.sband, vht);
299         if (phy->cap.has_6ghz)
300                 mt76_init_stream_cap(phy, &phy->sband_6g.sband, vht);
301 }
302 EXPORT_SYMBOL_GPL(mt76_set_stream_caps);
303
304 static int
305 mt76_init_sband(struct mt76_phy *phy, struct mt76_sband *msband,
306                 const struct ieee80211_channel *chan, int n_chan,
307                 struct ieee80211_rate *rates, int n_rates,
308                 bool ht, bool vht)
309 {
310         struct ieee80211_supported_band *sband = &msband->sband;
311         struct ieee80211_sta_vht_cap *vht_cap;
312         struct ieee80211_sta_ht_cap *ht_cap;
313         struct mt76_dev *dev = phy->dev;
314         void *chanlist;
315         int size;
316
317         size = n_chan * sizeof(*chan);
318         chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL);
319         if (!chanlist)
320                 return -ENOMEM;
321
322         msband->chan = devm_kcalloc(dev->dev, n_chan, sizeof(*msband->chan),
323                                     GFP_KERNEL);
324         if (!msband->chan)
325                 return -ENOMEM;
326
327         sband->channels = chanlist;
328         sband->n_channels = n_chan;
329         sband->bitrates = rates;
330         sband->n_bitrates = n_rates;
331
332         if (!ht)
333                 return 0;
334
335         ht_cap = &sband->ht_cap;
336         ht_cap->ht_supported = true;
337         ht_cap->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
338                        IEEE80211_HT_CAP_GRN_FLD |
339                        IEEE80211_HT_CAP_SGI_20 |
340                        IEEE80211_HT_CAP_SGI_40 |
341                        (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
342
343         ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
344         ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
345
346         mt76_init_stream_cap(phy, sband, vht);
347
348         if (!vht)
349                 return 0;
350
351         vht_cap = &sband->vht_cap;
352         vht_cap->vht_supported = true;
353         vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC |
354                         IEEE80211_VHT_CAP_RXSTBC_1 |
355                         IEEE80211_VHT_CAP_SHORT_GI_80 |
356                         (3 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT);
357
358         return 0;
359 }
360
361 static int
362 mt76_init_sband_2g(struct mt76_phy *phy, struct ieee80211_rate *rates,
363                    int n_rates)
364 {
365         phy->hw->wiphy->bands[NL80211_BAND_2GHZ] = &phy->sband_2g.sband;
366
367         return mt76_init_sband(phy, &phy->sband_2g, mt76_channels_2ghz,
368                                ARRAY_SIZE(mt76_channels_2ghz), rates,
369                                n_rates, true, false);
370 }
371
372 static int
373 mt76_init_sband_5g(struct mt76_phy *phy, struct ieee80211_rate *rates,
374                    int n_rates, bool vht)
375 {
376         phy->hw->wiphy->bands[NL80211_BAND_5GHZ] = &phy->sband_5g.sband;
377
378         return mt76_init_sband(phy, &phy->sband_5g, mt76_channels_5ghz,
379                                ARRAY_SIZE(mt76_channels_5ghz), rates,
380                                n_rates, true, vht);
381 }
382
383 static int
384 mt76_init_sband_6g(struct mt76_phy *phy, struct ieee80211_rate *rates,
385                    int n_rates)
386 {
387         phy->hw->wiphy->bands[NL80211_BAND_6GHZ] = &phy->sband_6g.sband;
388
389         return mt76_init_sband(phy, &phy->sband_6g, mt76_channels_6ghz,
390                                ARRAY_SIZE(mt76_channels_6ghz), rates,
391                                n_rates, false, false);
392 }
393
394 static void
395 mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband,
396                  enum nl80211_band band)
397 {
398         struct ieee80211_supported_band *sband = &msband->sband;
399         bool found = false;
400         int i;
401
402         if (!sband)
403                 return;
404
405         for (i = 0; i < sband->n_channels; i++) {
406                 if (sband->channels[i].flags & IEEE80211_CHAN_DISABLED)
407                         continue;
408
409                 found = true;
410                 break;
411         }
412
413         if (found) {
414                 phy->chandef.chan = &sband->channels[0];
415                 phy->chan_state = &msband->chan[0];
416                 return;
417         }
418
419         sband->n_channels = 0;
420         phy->hw->wiphy->bands[band] = NULL;
421 }
422
423 static int
424 mt76_phy_init(struct mt76_phy *phy, struct ieee80211_hw *hw)
425 {
426         struct mt76_dev *dev = phy->dev;
427         struct wiphy *wiphy = hw->wiphy;
428
429         INIT_LIST_HEAD(&phy->tx_list);
430         spin_lock_init(&phy->tx_lock);
431
432         SET_IEEE80211_DEV(hw, dev->dev);
433         SET_IEEE80211_PERM_ADDR(hw, phy->macaddr);
434
435         wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR |
436                            NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE;
437         wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH |
438                         WIPHY_FLAG_SUPPORTS_TDLS |
439                         WIPHY_FLAG_AP_UAPSD;
440
441         wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
442         wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
443         wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_AQL);
444
445         wiphy->available_antennas_tx = phy->antenna_mask;
446         wiphy->available_antennas_rx = phy->antenna_mask;
447
448         wiphy->sar_capa = &mt76_sar_capa;
449         phy->frp = devm_kcalloc(dev->dev, wiphy->sar_capa->num_freq_ranges,
450                                 sizeof(struct mt76_freq_range_power),
451                                 GFP_KERNEL);
452         if (!phy->frp)
453                 return -ENOMEM;
454
455         hw->txq_data_size = sizeof(struct mt76_txq);
456         hw->uapsd_max_sp_len = IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL;
457
458         if (!hw->max_tx_fragments)
459                 hw->max_tx_fragments = 16;
460
461         ieee80211_hw_set(hw, SIGNAL_DBM);
462         ieee80211_hw_set(hw, AMPDU_AGGREGATION);
463         ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
464         ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
465         ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
466         ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
467         ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER);
468         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 *
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
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
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
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 *
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
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
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
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
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
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
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
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 *
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 *
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
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
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
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
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);
This page took 0.136229 seconds and 4 git commands to generate.