Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/mediatek/mt76/mt7915/main.c
48526 views
1
// SPDX-License-Identifier: ISC
2
/* Copyright (C) 2020 MediaTek Inc. */
3
4
#include <linux/etherdevice.h>
5
#include <linux/platform_device.h>
6
#include <linux/pci.h>
7
#include <linux/module.h>
8
#include "mt7915.h"
9
#include "mcu.h"
10
11
static bool mt7915_dev_running(struct mt7915_dev *dev)
12
{
13
struct mt7915_phy *phy;
14
15
if (test_bit(MT76_STATE_RUNNING, &dev->mphy.state))
16
return true;
17
18
phy = mt7915_ext_phy(dev);
19
20
return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state);
21
}
22
23
int mt7915_run(struct ieee80211_hw *hw)
24
{
25
struct mt7915_dev *dev = mt7915_hw_dev(hw);
26
struct mt7915_phy *phy = mt7915_hw_phy(hw);
27
bool running;
28
int ret;
29
30
running = mt7915_dev_running(dev);
31
32
if (!running) {
33
ret = mt76_connac_mcu_set_pm(&dev->mt76,
34
dev->phy.mt76->band_idx, 0);
35
if (ret)
36
goto out;
37
38
ret = mt7915_mcu_set_mac(dev, dev->phy.mt76->band_idx,
39
true, true);
40
if (ret)
41
goto out;
42
43
mt7915_mac_enable_nf(dev, dev->phy.mt76->band_idx);
44
}
45
46
if (phy != &dev->phy) {
47
ret = mt76_connac_mcu_set_pm(&dev->mt76,
48
phy->mt76->band_idx, 0);
49
if (ret)
50
goto out;
51
52
ret = mt7915_mcu_set_mac(dev, phy->mt76->band_idx,
53
true, true);
54
if (ret)
55
goto out;
56
57
mt7915_mac_enable_nf(dev, phy->mt76->band_idx);
58
}
59
60
ret = mt7915_mcu_set_thermal_throttling(phy,
61
MT7915_THERMAL_THROTTLE_MAX);
62
63
if (ret)
64
goto out;
65
66
ret = mt7915_mcu_set_thermal_protect(phy);
67
68
if (ret)
69
goto out;
70
71
ret = mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b,
72
phy->mt76->band_idx);
73
if (ret)
74
goto out;
75
76
ret = mt7915_mcu_set_sku_en(phy, true);
77
if (ret)
78
goto out;
79
80
ret = mt7915_mcu_set_chan_info(phy, MCU_EXT_CMD(SET_RX_PATH));
81
if (ret)
82
goto out;
83
84
set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
85
86
if (!mt76_testmode_enabled(phy->mt76))
87
ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
88
MT7915_WATCHDOG_TIME);
89
90
if (!running)
91
mt7915_mac_reset_counters(phy);
92
93
out:
94
return ret;
95
}
96
97
static int mt7915_start(struct ieee80211_hw *hw)
98
{
99
struct mt7915_dev *dev = mt7915_hw_dev(hw);
100
int ret;
101
102
flush_work(&dev->init_work);
103
104
mutex_lock(&dev->mt76.mutex);
105
ret = mt7915_run(hw);
106
mutex_unlock(&dev->mt76.mutex);
107
108
return ret;
109
}
110
111
static void mt7915_stop(struct ieee80211_hw *hw, bool suspend)
112
{
113
struct mt7915_dev *dev = mt7915_hw_dev(hw);
114
struct mt7915_phy *phy = mt7915_hw_phy(hw);
115
116
cancel_delayed_work_sync(&phy->mt76->mac_work);
117
118
mutex_lock(&dev->mt76.mutex);
119
120
mt76_testmode_reset(phy->mt76, true);
121
122
clear_bit(MT76_STATE_RUNNING, &phy->mt76->state);
123
124
if (phy != &dev->phy) {
125
mt76_connac_mcu_set_pm(&dev->mt76, phy->mt76->band_idx, 1);
126
mt7915_mcu_set_mac(dev, phy->mt76->band_idx, false, false);
127
}
128
129
if (!mt7915_dev_running(dev)) {
130
mt76_connac_mcu_set_pm(&dev->mt76, dev->phy.mt76->band_idx, 1);
131
mt7915_mcu_set_mac(dev, dev->phy.mt76->band_idx, false, false);
132
}
133
134
mutex_unlock(&dev->mt76.mutex);
135
}
136
137
static inline int get_free_idx(u32 mask, u8 start, u8 end)
138
{
139
return ffs(~mask & GENMASK(end, start));
140
}
141
142
static int get_omac_idx(enum nl80211_iftype type, u64 mask)
143
{
144
int i;
145
146
switch (type) {
147
case NL80211_IFTYPE_MESH_POINT:
148
case NL80211_IFTYPE_ADHOC:
149
case NL80211_IFTYPE_STATION:
150
/* prefer hw bssid slot 1-3 */
151
i = get_free_idx(mask, HW_BSSID_1, HW_BSSID_3);
152
if (i)
153
return i - 1;
154
155
if (type != NL80211_IFTYPE_STATION)
156
break;
157
158
i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX);
159
if (i)
160
return i - 1;
161
162
if (~mask & BIT(HW_BSSID_0))
163
return HW_BSSID_0;
164
165
break;
166
case NL80211_IFTYPE_MONITOR:
167
case NL80211_IFTYPE_AP:
168
/* ap uses hw bssid 0 and ext bssid */
169
if (~mask & BIT(HW_BSSID_0))
170
return HW_BSSID_0;
171
172
i = get_free_idx(mask, EXT_BSSID_1, EXT_BSSID_MAX);
173
if (i)
174
return i - 1;
175
176
break;
177
default:
178
WARN_ON(1);
179
break;
180
}
181
182
return -1;
183
}
184
185
static void mt7915_init_bitrate_mask(struct ieee80211_vif *vif)
186
{
187
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
188
int i;
189
190
for (i = 0; i < ARRAY_SIZE(mvif->bitrate_mask.control); i++) {
191
mvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
192
mvif->bitrate_mask.control[i].he_gi = 0xff;
193
mvif->bitrate_mask.control[i].he_ltf = 0xff;
194
mvif->bitrate_mask.control[i].legacy = GENMASK(31, 0);
195
memset(mvif->bitrate_mask.control[i].ht_mcs, 0xff,
196
sizeof(mvif->bitrate_mask.control[i].ht_mcs));
197
memset(mvif->bitrate_mask.control[i].vht_mcs, 0xff,
198
sizeof(mvif->bitrate_mask.control[i].vht_mcs));
199
memset(mvif->bitrate_mask.control[i].he_mcs, 0xff,
200
sizeof(mvif->bitrate_mask.control[i].he_mcs));
201
}
202
}
203
204
static int mt7915_add_interface(struct ieee80211_hw *hw,
205
struct ieee80211_vif *vif)
206
{
207
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
208
struct mt7915_dev *dev = mt7915_hw_dev(hw);
209
struct mt7915_phy *phy = mt7915_hw_phy(hw);
210
struct mt76_txq *mtxq;
211
bool ext_phy = phy != &dev->phy;
212
int idx, ret = 0;
213
214
mutex_lock(&dev->mt76.mutex);
215
216
mt76_testmode_reset(phy->mt76, true);
217
218
if (vif->type == NL80211_IFTYPE_MONITOR &&
219
is_zero_ether_addr(vif->addr))
220
phy->monitor_vif = vif;
221
222
mvif->mt76.idx = __ffs64(~dev->mt76.vif_mask);
223
if (mvif->mt76.idx >= (MT7915_MAX_INTERFACES << dev->dbdc_support)) {
224
ret = -ENOSPC;
225
goto out;
226
}
227
228
idx = get_omac_idx(vif->type, phy->omac_mask);
229
if (idx < 0) {
230
ret = -ENOSPC;
231
goto out;
232
}
233
mvif->mt76.omac_idx = idx;
234
mvif->phy = phy;
235
mvif->mt76.band_idx = phy->mt76->band_idx;
236
mvif->mt76.wcid = &mvif->sta.wcid;
237
238
mvif->mt76.wmm_idx = vif->type != NL80211_IFTYPE_AP;
239
if (ext_phy)
240
mvif->mt76.wmm_idx += 2;
241
242
ret = mt7915_mcu_add_dev_info(phy, vif, true);
243
if (ret)
244
goto out;
245
246
dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx);
247
phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx);
248
249
idx = mt76_wcid_alloc(dev->mt76.wcid_mask, mt7915_wtbl_size(dev));
250
if (idx < 0) {
251
ret = -ENOSPC;
252
goto out;
253
}
254
255
INIT_LIST_HEAD(&mvif->sta.rc_list);
256
mvif->sta.wcid.idx = idx;
257
mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET;
258
mt76_wcid_init(&mvif->sta.wcid, phy->mt76->band_idx);
259
260
mt7915_mac_wtbl_update(dev, idx,
261
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
262
263
if (vif->txq) {
264
mtxq = (struct mt76_txq *)vif->txq->drv_priv;
265
mtxq->wcid = idx;
266
}
267
268
if (vif->type != NL80211_IFTYPE_AP &&
269
(!mvif->mt76.omac_idx || mvif->mt76.omac_idx > 3))
270
vif->offload_flags = 0;
271
vif->offload_flags |= IEEE80211_OFFLOAD_ENCAP_4ADDR;
272
273
mt7915_init_bitrate_mask(vif);
274
memset(&mvif->cap, -1, sizeof(mvif->cap));
275
276
mt7915_mcu_add_bss_info(phy, vif, true);
277
mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, true);
278
rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid);
279
280
out:
281
mutex_unlock(&dev->mt76.mutex);
282
283
return ret;
284
}
285
286
static void mt7915_remove_interface(struct ieee80211_hw *hw,
287
struct ieee80211_vif *vif)
288
{
289
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
290
struct mt7915_sta *msta = &mvif->sta;
291
struct mt7915_dev *dev = mt7915_hw_dev(hw);
292
struct mt7915_phy *phy = mt7915_hw_phy(hw);
293
int idx = msta->wcid.idx;
294
295
mt7915_mcu_add_bss_info(phy, vif, false);
296
mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false);
297
mt76_wcid_mask_clear(dev->mt76.wcid_mask, mvif->sta.wcid.idx);
298
299
mutex_lock(&dev->mt76.mutex);
300
mt76_testmode_reset(phy->mt76, true);
301
mutex_unlock(&dev->mt76.mutex);
302
303
if (vif == phy->monitor_vif)
304
phy->monitor_vif = NULL;
305
306
mt7915_mcu_add_dev_info(phy, vif, false);
307
308
rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
309
310
mutex_lock(&dev->mt76.mutex);
311
dev->mt76.vif_mask &= ~BIT_ULL(mvif->mt76.idx);
312
phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx);
313
mutex_unlock(&dev->mt76.mutex);
314
315
spin_lock_bh(&dev->mt76.sta_poll_lock);
316
if (!list_empty(&msta->wcid.poll_list))
317
list_del_init(&msta->wcid.poll_list);
318
spin_unlock_bh(&dev->mt76.sta_poll_lock);
319
320
mt76_wcid_cleanup(&dev->mt76, &msta->wcid);
321
}
322
323
int mt7915_set_channel(struct mt76_phy *mphy)
324
{
325
struct mt7915_phy *phy = mphy->priv;
326
struct mt7915_dev *dev = phy->dev;
327
int ret;
328
329
if (dev->cal) {
330
ret = mt7915_mcu_apply_tx_dpd(phy);
331
if (ret)
332
goto out;
333
}
334
335
ret = mt7915_mcu_set_chan_info(phy, MCU_EXT_CMD(CHANNEL_SWITCH));
336
if (ret)
337
goto out;
338
339
mt7915_mac_set_timing(phy);
340
ret = mt7915_dfs_init_radar_detector(phy);
341
mt7915_mac_cca_stats_reset(phy);
342
343
mt7915_mac_reset_counters(phy);
344
phy->noise = 0;
345
346
out:
347
if (!mt76_testmode_enabled(phy->mt76))
348
ieee80211_queue_delayed_work(phy->mt76->hw,
349
&phy->mt76->mac_work,
350
MT7915_WATCHDOG_TIME);
351
352
return ret;
353
}
354
355
static int mt7915_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
356
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
357
struct ieee80211_key_conf *key)
358
{
359
struct mt7915_dev *dev = mt7915_hw_dev(hw);
360
struct mt7915_phy *phy = mt7915_hw_phy(hw);
361
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
362
struct mt7915_sta *msta = sta ? (struct mt7915_sta *)sta->drv_priv :
363
&mvif->sta;
364
struct mt76_wcid *wcid = &msta->wcid;
365
u8 *wcid_keyidx = &wcid->hw_key_idx;
366
int idx = key->keyidx;
367
int err = 0;
368
369
if (sta && !wcid->sta) {
370
if (cmd != SET_KEY)
371
return 0;
372
373
return -EOPNOTSUPP;
374
}
375
376
/* The hardware does not support per-STA RX GTK, fallback
377
* to software mode for these.
378
*/
379
if ((vif->type == NL80211_IFTYPE_ADHOC ||
380
vif->type == NL80211_IFTYPE_MESH_POINT) &&
381
(key->cipher == WLAN_CIPHER_SUITE_TKIP ||
382
key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
383
!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
384
return -EOPNOTSUPP;
385
386
/* fall back to sw encryption for unsupported ciphers */
387
switch (key->cipher) {
388
case WLAN_CIPHER_SUITE_AES_CMAC:
389
wcid_keyidx = &wcid->hw_key_idx2;
390
key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIE;
391
break;
392
case WLAN_CIPHER_SUITE_TKIP:
393
case WLAN_CIPHER_SUITE_CCMP:
394
case WLAN_CIPHER_SUITE_CCMP_256:
395
case WLAN_CIPHER_SUITE_GCMP:
396
case WLAN_CIPHER_SUITE_GCMP_256:
397
case WLAN_CIPHER_SUITE_SMS4:
398
break;
399
case WLAN_CIPHER_SUITE_WEP40:
400
case WLAN_CIPHER_SUITE_WEP104:
401
default:
402
return -EOPNOTSUPP;
403
}
404
405
mutex_lock(&dev->mt76.mutex);
406
407
if (cmd == SET_KEY && !sta && !mvif->mt76.cipher) {
408
mvif->mt76.cipher = mt76_connac_mcu_get_cipher(key->cipher);
409
mt7915_mcu_add_bss_info(phy, vif, true);
410
}
411
412
if (cmd == SET_KEY) {
413
*wcid_keyidx = idx;
414
} else {
415
if (idx == *wcid_keyidx)
416
*wcid_keyidx = -1;
417
goto out;
418
}
419
420
mt76_wcid_key_setup(&dev->mt76, wcid, key);
421
err = mt76_connac_mcu_add_key(&dev->mt76, vif, &msta->bip,
422
key, MCU_EXT_CMD(STA_REC_UPDATE),
423
&msta->wcid, cmd);
424
out:
425
mutex_unlock(&dev->mt76.mutex);
426
427
return err;
428
}
429
430
static int mt7915_set_sar_specs(struct ieee80211_hw *hw,
431
const struct cfg80211_sar_specs *sar)
432
{
433
struct mt7915_phy *phy = mt7915_hw_phy(hw);
434
struct mt7915_dev *dev = mt7915_hw_dev(hw);
435
int err = -EINVAL;
436
437
mutex_lock(&dev->mt76.mutex);
438
if (!cfg80211_chandef_valid(&phy->mt76->chandef))
439
goto out;
440
441
err = mt76_init_sar_power(hw, sar);
442
if (err)
443
goto out;
444
445
err = mt7915_mcu_set_txpower_sku(phy);
446
out:
447
mutex_unlock(&dev->mt76.mutex);
448
449
return err;
450
}
451
452
static int mt7915_config(struct ieee80211_hw *hw, int radio_idx,
453
u32 changed)
454
{
455
struct mt7915_dev *dev = mt7915_hw_dev(hw);
456
struct mt7915_phy *phy = mt7915_hw_phy(hw);
457
int ret;
458
459
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
460
#ifdef CONFIG_NL80211_TESTMODE
461
if (phy->mt76->test.state != MT76_TM_STATE_OFF) {
462
mutex_lock(&dev->mt76.mutex);
463
mt76_testmode_reset(phy->mt76, false);
464
mutex_unlock(&dev->mt76.mutex);
465
}
466
#endif
467
ret = mt76_update_channel(phy->mt76);
468
if (ret)
469
return ret;
470
}
471
472
if (changed & (IEEE80211_CONF_CHANGE_POWER |
473
IEEE80211_CONF_CHANGE_CHANNEL)) {
474
ret = mt7915_mcu_set_txpower_sku(phy);
475
if (ret)
476
return ret;
477
}
478
479
mutex_lock(&dev->mt76.mutex);
480
481
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
482
bool enabled = !!(hw->conf.flags & IEEE80211_CONF_MONITOR);
483
bool band = phy->mt76->band_idx;
484
u32 rxfilter = phy->rxfilter;
485
486
if (!enabled) {
487
rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
488
dev->monitor_mask &= ~BIT(band);
489
} else {
490
rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
491
dev->monitor_mask |= BIT(band);
492
}
493
494
mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN,
495
enabled);
496
mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_MDP_DCR0_RX_HDR_TRANS_EN,
497
!dev->monitor_mask);
498
mt76_testmode_reset(phy->mt76, true);
499
mt76_wr(dev, MT_WF_RFCR(band), rxfilter);
500
}
501
502
mutex_unlock(&dev->mt76.mutex);
503
504
return 0;
505
}
506
507
static int
508
mt7915_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
509
unsigned int link_id, u16 queue,
510
const struct ieee80211_tx_queue_params *params)
511
{
512
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
513
514
/* no need to update right away, we'll get BSS_CHANGED_QOS */
515
queue = mt76_connac_lmac_mapping(queue);
516
mvif->queue_params[queue] = *params;
517
518
return 0;
519
}
520
521
static void mt7915_configure_filter(struct ieee80211_hw *hw,
522
unsigned int changed_flags,
523
unsigned int *total_flags,
524
u64 multicast)
525
{
526
struct mt7915_dev *dev = mt7915_hw_dev(hw);
527
struct mt7915_phy *phy = mt7915_hw_phy(hw);
528
bool band = phy->mt76->band_idx;
529
u32 ctl_flags = MT_WF_RFCR1_DROP_ACK |
530
MT_WF_RFCR1_DROP_BF_POLL |
531
MT_WF_RFCR1_DROP_BA |
532
MT_WF_RFCR1_DROP_CFEND |
533
MT_WF_RFCR1_DROP_CFACK;
534
u32 rxfilter;
535
u32 flags = 0;
536
537
#define MT76_FILTER(_flag, _hw) do { \
538
flags |= *total_flags & FIF_##_flag; \
539
phy->rxfilter &= ~(_hw); \
540
phy->rxfilter |= !(flags & FIF_##_flag) * (_hw); \
541
} while (0)
542
543
mutex_lock(&dev->mt76.mutex);
544
545
phy->rxfilter &= ~(MT_WF_RFCR_DROP_OTHER_BSS |
546
MT_WF_RFCR_DROP_OTHER_BEACON |
547
MT_WF_RFCR_DROP_FRAME_REPORT |
548
MT_WF_RFCR_DROP_PROBEREQ |
549
MT_WF_RFCR_DROP_MCAST_FILTERED |
550
MT_WF_RFCR_DROP_MCAST |
551
MT_WF_RFCR_DROP_BCAST |
552
MT_WF_RFCR_DROP_DUPLICATE |
553
MT_WF_RFCR_DROP_A2_BSSID |
554
MT_WF_RFCR_DROP_UNWANTED_CTL |
555
MT_WF_RFCR_DROP_STBC_MULTI);
556
557
MT76_FILTER(OTHER_BSS, MT_WF_RFCR_DROP_OTHER_TIM |
558
MT_WF_RFCR_DROP_A3_MAC |
559
MT_WF_RFCR_DROP_A3_BSSID);
560
561
MT76_FILTER(FCSFAIL, MT_WF_RFCR_DROP_FCSFAIL);
562
563
MT76_FILTER(CONTROL, MT_WF_RFCR_DROP_CTS |
564
MT_WF_RFCR_DROP_RTS |
565
MT_WF_RFCR_DROP_CTL_RSV);
566
567
*total_flags = flags;
568
rxfilter = phy->rxfilter;
569
if (hw->conf.flags & IEEE80211_CONF_MONITOR)
570
rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC;
571
else
572
rxfilter |= MT_WF_RFCR_DROP_OTHER_UC;
573
mt76_wr(dev, MT_WF_RFCR(band), rxfilter);
574
575
if (*total_flags & FIF_CONTROL)
576
mt76_clear(dev, MT_WF_RFCR1(band), ctl_flags);
577
else
578
mt76_set(dev, MT_WF_RFCR1(band), ctl_flags);
579
580
mutex_unlock(&dev->mt76.mutex);
581
}
582
583
static void
584
mt7915_update_bss_color(struct ieee80211_hw *hw,
585
struct ieee80211_vif *vif,
586
struct cfg80211_he_bss_color *bss_color)
587
{
588
struct mt7915_dev *dev = mt7915_hw_dev(hw);
589
590
switch (vif->type) {
591
case NL80211_IFTYPE_AP: {
592
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
593
594
if (mvif->mt76.omac_idx > HW_BSSID_MAX)
595
return;
596
fallthrough;
597
}
598
case NL80211_IFTYPE_STATION:
599
mt7915_mcu_update_bss_color(dev, vif, bss_color);
600
break;
601
default:
602
break;
603
}
604
}
605
606
static void mt7915_bss_info_changed(struct ieee80211_hw *hw,
607
struct ieee80211_vif *vif,
608
struct ieee80211_bss_conf *info,
609
u64 changed)
610
{
611
struct mt7915_phy *phy = mt7915_hw_phy(hw);
612
struct mt7915_dev *dev = mt7915_hw_dev(hw);
613
int set_bss_info = -1, set_sta = -1;
614
615
mutex_lock(&dev->mt76.mutex);
616
617
/*
618
* station mode uses BSSID to map the wlan entry to a peer,
619
* and then peer references bss_info_rfch to set bandwidth cap.
620
*/
621
if (changed & BSS_CHANGED_BSSID &&
622
vif->type == NL80211_IFTYPE_STATION)
623
set_bss_info = set_sta = !is_zero_ether_addr(info->bssid);
624
if (changed & BSS_CHANGED_ASSOC)
625
set_bss_info = vif->cfg.assoc;
626
if (changed & BSS_CHANGED_BEACON_ENABLED &&
627
info->enable_beacon &&
628
vif->type != NL80211_IFTYPE_AP)
629
set_bss_info = set_sta = 1;
630
631
if (set_bss_info == 1)
632
mt7915_mcu_add_bss_info(phy, vif, true);
633
if (set_sta == 1)
634
mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, false);
635
636
if (changed & BSS_CHANGED_ERP_CTS_PROT)
637
mt7915_mac_enable_rtscts(dev, vif, info->use_cts_prot);
638
639
if (changed & BSS_CHANGED_ERP_SLOT) {
640
int slottime = 9;
641
642
if (phy->mt76->chandef.chan->band == NL80211_BAND_2GHZ &&
643
!info->use_short_slot)
644
slottime = 20;
645
646
if (slottime != phy->slottime) {
647
phy->slottime = slottime;
648
mt7915_mac_set_timing(phy);
649
}
650
}
651
652
/* ensure that enable txcmd_mode after bss_info */
653
if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
654
mt7915_mcu_set_tx(dev, vif);
655
656
if (changed & BSS_CHANGED_HE_OBSS_PD)
657
mt7915_mcu_add_obss_spr(phy, vif, &info->he_obss_pd);
658
659
if (changed & BSS_CHANGED_HE_BSS_COLOR)
660
mt7915_update_bss_color(hw, vif, &info->he_bss_color);
661
662
if (changed & (BSS_CHANGED_BEACON |
663
BSS_CHANGED_BEACON_ENABLED))
664
mt7915_mcu_add_beacon(hw, vif, info->enable_beacon, changed);
665
666
if (changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
667
BSS_CHANGED_FILS_DISCOVERY))
668
mt7915_mcu_add_inband_discov(dev, vif, changed);
669
670
if (set_bss_info == 0)
671
mt7915_mcu_add_bss_info(phy, vif, false);
672
if (set_sta == 0)
673
mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false);
674
675
mutex_unlock(&dev->mt76.mutex);
676
}
677
678
static void
679
mt7915_vif_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif)
680
{
681
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
682
struct mt7915_vif_cap *vc = &mvif->cap;
683
684
vc->ht_ldpc = vif->bss_conf.ht_ldpc;
685
vc->vht_ldpc = vif->bss_conf.vht_ldpc;
686
vc->vht_su_ebfer = vif->bss_conf.vht_su_beamformer;
687
vc->vht_su_ebfee = vif->bss_conf.vht_su_beamformee;
688
vc->vht_mu_ebfer = vif->bss_conf.vht_mu_beamformer;
689
vc->vht_mu_ebfee = vif->bss_conf.vht_mu_beamformee;
690
vc->he_ldpc = vif->bss_conf.he_ldpc;
691
vc->he_su_ebfer = vif->bss_conf.he_su_beamformer;
692
vc->he_su_ebfee = vif->bss_conf.he_su_beamformee;
693
vc->he_mu_ebfer = vif->bss_conf.he_mu_beamformer;
694
}
695
696
static int
697
mt7915_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
698
struct ieee80211_bss_conf *link_conf)
699
{
700
struct mt7915_phy *phy = mt7915_hw_phy(hw);
701
struct mt7915_dev *dev = mt7915_hw_dev(hw);
702
int err;
703
704
mutex_lock(&dev->mt76.mutex);
705
706
mt7915_vif_check_caps(phy, vif);
707
708
err = mt7915_mcu_add_bss_info(phy, vif, true);
709
if (err)
710
goto out;
711
err = mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_PORT_SECURE, false);
712
out:
713
mutex_unlock(&dev->mt76.mutex);
714
715
return err;
716
}
717
718
static void
719
mt7915_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
720
struct ieee80211_bss_conf *link_conf)
721
{
722
struct mt7915_dev *dev = mt7915_hw_dev(hw);
723
724
mutex_lock(&dev->mt76.mutex);
725
mt7915_mcu_add_sta(dev, vif, NULL, CONN_STATE_DISCONNECT, false);
726
mutex_unlock(&dev->mt76.mutex);
727
}
728
729
static void
730
mt7915_channel_switch_beacon(struct ieee80211_hw *hw,
731
struct ieee80211_vif *vif,
732
struct cfg80211_chan_def *chandef)
733
{
734
struct mt7915_dev *dev = mt7915_hw_dev(hw);
735
736
mutex_lock(&dev->mt76.mutex);
737
mt7915_mcu_add_beacon(hw, vif, true, BSS_CHANGED_BEACON);
738
mutex_unlock(&dev->mt76.mutex);
739
}
740
741
int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
742
struct ieee80211_sta *sta)
743
{
744
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
745
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
746
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
747
bool ext_phy = mvif->phy != &dev->phy;
748
int idx;
749
750
idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
751
if (idx < 0)
752
return -ENOSPC;
753
754
INIT_LIST_HEAD(&msta->rc_list);
755
INIT_LIST_HEAD(&msta->wcid.poll_list);
756
msta->vif = mvif;
757
msta->wcid.sta_disabled = 1;
758
msta->wcid.idx = idx;
759
msta->wcid.phy_idx = ext_phy;
760
msta->jiffies = jiffies;
761
762
ewma_avg_signal_init(&msta->avg_ack_signal);
763
764
mt7915_mac_wtbl_update(dev, idx,
765
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
766
mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_DISCONNECT, true);
767
768
return 0;
769
}
770
771
struct drop_sta_iter {
772
struct mt7915_dev *dev;
773
struct ieee80211_hw *hw;
774
struct ieee80211_vif *vif;
775
u8 sta_addr[ETH_ALEN];
776
};
777
778
static void
779
__mt7915_drop_sta(void *ptr, u8 *mac, struct ieee80211_vif *vif)
780
{
781
struct drop_sta_iter *data = ptr;
782
struct ieee80211_sta *sta;
783
struct mt7915_sta *msta;
784
785
if (vif == data->vif || vif->type != NL80211_IFTYPE_AP)
786
return;
787
788
sta = ieee80211_find_sta_by_ifaddr(data->hw, data->sta_addr, mac);
789
if (!sta)
790
return;
791
792
msta = (struct mt7915_sta *)sta->drv_priv;
793
mt7915_mcu_add_sta(data->dev, vif, sta, CONN_STATE_DISCONNECT, false);
794
msta->wcid.sta_disabled = 1;
795
msta->wcid.sta = 0;
796
}
797
798
static void
799
mt7915_drop_other_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
800
struct ieee80211_sta *sta)
801
{
802
struct mt76_phy *ext_phy = dev->mt76.phys[MT_BAND1];
803
struct drop_sta_iter data = {
804
.dev = dev,
805
.hw = dev->mphy.hw,
806
.vif = vif,
807
};
808
809
if (vif->type != NL80211_IFTYPE_AP)
810
return;
811
812
memcpy(data.sta_addr, sta->addr, ETH_ALEN);
813
ieee80211_iterate_active_interfaces(data.hw, 0, __mt7915_drop_sta, &data);
814
815
if (!ext_phy)
816
return;
817
818
data.hw = ext_phy->hw;
819
ieee80211_iterate_active_interfaces(data.hw, 0, __mt7915_drop_sta, &data);
820
}
821
822
int mt7915_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,
823
struct ieee80211_sta *sta, enum mt76_sta_event ev)
824
{
825
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
826
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
827
int i, ret;
828
u32 addr;
829
830
switch (ev) {
831
case MT76_STA_EVENT_ASSOC:
832
ret = mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_CONNECT, true);
833
if (ret)
834
return ret;
835
836
addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 30);
837
mt76_rmw_field(dev, addr, GENMASK(7, 0), 0xa0);
838
839
ret = mt7915_mcu_add_rate_ctrl(dev, vif, sta, false);
840
if (ret)
841
return ret;
842
843
msta->wcid.tx_info |= MT_WCID_TX_INFO_SET;
844
msta->wcid.sta = 1;
845
msta->wcid.sta_disabled = 0;
846
847
return 0;
848
849
case MT76_STA_EVENT_AUTHORIZE:
850
mt7915_drop_other_sta(dev, vif, sta);
851
return mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_PORT_SECURE, false);
852
853
case MT76_STA_EVENT_DISASSOC:
854
for (i = 0; i < ARRAY_SIZE(msta->twt.flow); i++)
855
mt7915_mac_twt_teardown_flow(dev, msta, i);
856
857
mt7915_mcu_add_sta(dev, vif, sta, CONN_STATE_DISCONNECT, false);
858
msta->wcid.sta_disabled = 1;
859
msta->wcid.sta = 0;
860
return 0;
861
}
862
863
return 0;
864
}
865
866
void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
867
struct ieee80211_sta *sta)
868
{
869
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
870
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
871
872
mt7915_mac_wtbl_update(dev, msta->wcid.idx,
873
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
874
875
spin_lock_bh(&mdev->sta_poll_lock);
876
if (!list_empty(&msta->wcid.poll_list))
877
list_del_init(&msta->wcid.poll_list);
878
if (!list_empty(&msta->rc_list))
879
list_del_init(&msta->rc_list);
880
spin_unlock_bh(&mdev->sta_poll_lock);
881
}
882
883
static void mt7915_tx(struct ieee80211_hw *hw,
884
struct ieee80211_tx_control *control,
885
struct sk_buff *skb)
886
{
887
struct mt7915_dev *dev = mt7915_hw_dev(hw);
888
struct mt76_phy *mphy = hw->priv;
889
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
890
struct ieee80211_vif *vif = info->control.vif;
891
struct mt76_wcid *wcid = &dev->mt76.global_wcid;
892
893
if (control->sta) {
894
struct mt7915_sta *sta;
895
896
sta = (struct mt7915_sta *)control->sta->drv_priv;
897
wcid = &sta->wcid;
898
}
899
900
if (vif && !control->sta) {
901
struct mt7915_vif *mvif;
902
903
mvif = (struct mt7915_vif *)vif->drv_priv;
904
wcid = &mvif->sta.wcid;
905
}
906
907
mt76_tx(mphy, control->sta, wcid, skb);
908
}
909
910
static int mt7915_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx,
911
u32 val)
912
{
913
struct mt7915_dev *dev = mt7915_hw_dev(hw);
914
struct mt7915_phy *phy = mt7915_hw_phy(hw);
915
int ret;
916
917
mutex_lock(&dev->mt76.mutex);
918
ret = mt76_connac_mcu_set_rts_thresh(&dev->mt76, val,
919
phy->mt76->band_idx);
920
mutex_unlock(&dev->mt76.mutex);
921
922
return ret;
923
}
924
925
static int
926
mt7915_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
927
struct ieee80211_ampdu_params *params)
928
{
929
enum ieee80211_ampdu_mlme_action action = params->action;
930
struct mt7915_dev *dev = mt7915_hw_dev(hw);
931
struct ieee80211_sta *sta = params->sta;
932
struct ieee80211_txq *txq = sta->txq[params->tid];
933
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
934
u16 tid = params->tid;
935
u16 ssn = params->ssn;
936
struct mt76_txq *mtxq;
937
int ret = 0;
938
939
if (!txq)
940
return -EINVAL;
941
942
mtxq = (struct mt76_txq *)txq->drv_priv;
943
944
mutex_lock(&dev->mt76.mutex);
945
switch (action) {
946
case IEEE80211_AMPDU_RX_START:
947
mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn,
948
params->buf_size);
949
ret = mt7915_mcu_add_rx_ba(dev, params, true);
950
break;
951
case IEEE80211_AMPDU_RX_STOP:
952
mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid);
953
ret = mt7915_mcu_add_rx_ba(dev, params, false);
954
break;
955
case IEEE80211_AMPDU_TX_OPERATIONAL:
956
mtxq->aggr = true;
957
mtxq->send_bar = false;
958
ret = mt7915_mcu_add_tx_ba(dev, params, true);
959
break;
960
case IEEE80211_AMPDU_TX_STOP_FLUSH:
961
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
962
mtxq->aggr = false;
963
clear_bit(tid, &msta->wcid.ampdu_state);
964
ret = mt7915_mcu_add_tx_ba(dev, params, false);
965
break;
966
case IEEE80211_AMPDU_TX_START:
967
set_bit(tid, &msta->wcid.ampdu_state);
968
ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
969
break;
970
case IEEE80211_AMPDU_TX_STOP_CONT:
971
mtxq->aggr = false;
972
clear_bit(tid, &msta->wcid.ampdu_state);
973
ret = mt7915_mcu_add_tx_ba(dev, params, false);
974
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
975
break;
976
}
977
mutex_unlock(&dev->mt76.mutex);
978
979
return ret;
980
}
981
982
static int
983
mt7915_get_stats(struct ieee80211_hw *hw,
984
struct ieee80211_low_level_stats *stats)
985
{
986
struct mt7915_phy *phy = mt7915_hw_phy(hw);
987
struct mt7915_dev *dev = mt7915_hw_dev(hw);
988
struct mt76_mib_stats *mib = &phy->mib;
989
990
mutex_lock(&dev->mt76.mutex);
991
992
stats->dot11RTSSuccessCount = mib->rts_cnt;
993
stats->dot11RTSFailureCount = mib->rts_retries_cnt;
994
stats->dot11FCSErrorCount = mib->fcs_err_cnt;
995
stats->dot11ACKFailureCount = mib->ack_fail_cnt;
996
997
mutex_unlock(&dev->mt76.mutex);
998
999
return 0;
1000
}
1001
1002
u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif)
1003
{
1004
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1005
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1006
bool band = phy->mt76->band_idx;
1007
union {
1008
u64 t64;
1009
u32 t32[2];
1010
} tsf;
1011
u16 n;
1012
1013
lockdep_assert_held(&dev->mt76.mutex);
1014
1015
n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0
1016
: mvif->mt76.omac_idx;
1017
/* TSF software read */
1018
if (is_mt7915(&dev->mt76))
1019
mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
1020
MT_LPON_TCR_SW_READ);
1021
else
1022
mt76_rmw(dev, MT_LPON_TCR_MT7916(band, n), MT_LPON_TCR_SW_MODE,
1023
MT_LPON_TCR_SW_READ);
1024
tsf.t32[0] = mt76_rr(dev, MT_LPON_UTTR0(band));
1025
tsf.t32[1] = mt76_rr(dev, MT_LPON_UTTR1(band));
1026
1027
return tsf.t64;
1028
}
1029
1030
static u64
1031
mt7915_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1032
{
1033
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1034
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1035
u64 ret;
1036
1037
mutex_lock(&dev->mt76.mutex);
1038
ret = __mt7915_get_tsf(hw, mvif);
1039
mutex_unlock(&dev->mt76.mutex);
1040
1041
return ret;
1042
}
1043
1044
static void
1045
mt7915_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1046
u64 timestamp)
1047
{
1048
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1049
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1050
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1051
bool band = phy->mt76->band_idx;
1052
union {
1053
u64 t64;
1054
u32 t32[2];
1055
} tsf = { .t64 = timestamp, };
1056
u16 n;
1057
1058
mutex_lock(&dev->mt76.mutex);
1059
1060
n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0
1061
: mvif->mt76.omac_idx;
1062
mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
1063
mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
1064
/* TSF software overwrite */
1065
if (is_mt7915(&dev->mt76))
1066
mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
1067
MT_LPON_TCR_SW_WRITE);
1068
else
1069
mt76_rmw(dev, MT_LPON_TCR_MT7916(band, n), MT_LPON_TCR_SW_MODE,
1070
MT_LPON_TCR_SW_WRITE);
1071
1072
mutex_unlock(&dev->mt76.mutex);
1073
}
1074
1075
static void
1076
mt7915_offset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1077
s64 timestamp)
1078
{
1079
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1080
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1081
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1082
bool band = phy->mt76->band_idx;
1083
union {
1084
u64 t64;
1085
u32 t32[2];
1086
} tsf = { .t64 = timestamp, };
1087
u16 n;
1088
1089
mutex_lock(&dev->mt76.mutex);
1090
1091
n = mvif->mt76.omac_idx > HW_BSSID_MAX ? HW_BSSID_0
1092
: mvif->mt76.omac_idx;
1093
mt76_wr(dev, MT_LPON_UTTR0(band), tsf.t32[0]);
1094
mt76_wr(dev, MT_LPON_UTTR1(band), tsf.t32[1]);
1095
/* TSF software adjust*/
1096
if (is_mt7915(&dev->mt76))
1097
mt76_rmw(dev, MT_LPON_TCR(band, n), MT_LPON_TCR_SW_MODE,
1098
MT_LPON_TCR_SW_ADJUST);
1099
else
1100
mt76_rmw(dev, MT_LPON_TCR_MT7916(band, n), MT_LPON_TCR_SW_MODE,
1101
MT_LPON_TCR_SW_ADJUST);
1102
1103
mutex_unlock(&dev->mt76.mutex);
1104
}
1105
1106
static void
1107
mt7915_set_coverage_class(struct ieee80211_hw *hw, int radio_idx,
1108
s16 coverage_class)
1109
{
1110
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1111
struct mt7915_dev *dev = phy->dev;
1112
1113
mutex_lock(&dev->mt76.mutex);
1114
phy->coverage_class = max_t(s16, coverage_class, 0);
1115
mt7915_mac_set_timing(phy);
1116
mutex_unlock(&dev->mt76.mutex);
1117
}
1118
1119
static int
1120
mt7915_set_antenna(struct ieee80211_hw *hw, int radio_idx, u32 tx_ant, u32 rx_ant)
1121
{
1122
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1123
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1124
int max_nss = hweight8(hw->wiphy->available_antennas_tx);
1125
u8 chainshift = dev->chainshift;
1126
u8 band = phy->mt76->band_idx;
1127
1128
if (!tx_ant || tx_ant != rx_ant || ffs(tx_ant) > max_nss)
1129
return -EINVAL;
1130
1131
mutex_lock(&dev->mt76.mutex);
1132
1133
phy->mt76->antenna_mask = tx_ant;
1134
1135
/* handle a variant of mt7916/mt7981 which has 3T3R but nss2 on 5 GHz band */
1136
if ((is_mt7916(&dev->mt76) || is_mt7981(&dev->mt76)) &&
1137
band && hweight8(tx_ant) == max_nss)
1138
phy->mt76->chainmask = (dev->chainmask >> chainshift) << chainshift;
1139
else
1140
phy->mt76->chainmask = tx_ant << (chainshift * band);
1141
1142
mt76_set_stream_caps(phy->mt76, true);
1143
mt7915_set_stream_vht_txbf_caps(phy);
1144
mt7915_set_stream_he_caps(phy);
1145
1146
mutex_unlock(&dev->mt76.mutex);
1147
1148
return 0;
1149
}
1150
1151
static void mt7915_sta_statistics(struct ieee80211_hw *hw,
1152
struct ieee80211_vif *vif,
1153
struct ieee80211_sta *sta,
1154
struct station_info *sinfo)
1155
{
1156
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1157
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1158
struct rate_info *txrate = &msta->wcid.rate;
1159
struct rate_info rxrate = {};
1160
1161
if (!mt7915_mcu_get_rx_rate(phy, vif, sta, &rxrate)) {
1162
sinfo->rxrate = rxrate;
1163
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
1164
}
1165
1166
if (txrate->legacy || txrate->flags) {
1167
if (txrate->legacy) {
1168
sinfo->txrate.legacy = txrate->legacy;
1169
} else {
1170
sinfo->txrate.mcs = txrate->mcs;
1171
sinfo->txrate.nss = txrate->nss;
1172
sinfo->txrate.bw = txrate->bw;
1173
sinfo->txrate.he_gi = txrate->he_gi;
1174
sinfo->txrate.he_dcm = txrate->he_dcm;
1175
sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc;
1176
}
1177
sinfo->txrate.flags = txrate->flags;
1178
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
1179
}
1180
1181
/* offloading flows bypass networking stack, so driver counts and
1182
* reports sta statistics via NL80211_STA_INFO when WED is active.
1183
*/
1184
if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) {
1185
sinfo->tx_bytes = msta->wcid.stats.tx_bytes;
1186
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
1187
1188
if (!mt7915_mcu_wed_wa_tx_stats(phy->dev, msta->wcid.idx)) {
1189
sinfo->tx_packets = msta->wcid.stats.tx_packets;
1190
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
1191
}
1192
1193
if (mtk_wed_get_rx_capa(&phy->dev->mt76.mmio.wed)) {
1194
sinfo->rx_bytes = msta->wcid.stats.rx_bytes;
1195
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
1196
1197
sinfo->rx_packets = msta->wcid.stats.rx_packets;
1198
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
1199
}
1200
}
1201
1202
sinfo->tx_failed = msta->wcid.stats.tx_failed;
1203
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
1204
1205
sinfo->tx_retries = msta->wcid.stats.tx_retries;
1206
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
1207
1208
sinfo->ack_signal = (s8)msta->ack_signal;
1209
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
1210
1211
sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->avg_ack_signal);
1212
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
1213
}
1214
1215
static void mt7915_sta_rc_work(void *data, struct ieee80211_sta *sta)
1216
{
1217
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1218
struct mt7915_dev *dev = msta->vif->phy->dev;
1219
u32 *changed = data;
1220
1221
spin_lock_bh(&dev->mt76.sta_poll_lock);
1222
msta->changed |= *changed;
1223
if (list_empty(&msta->rc_list))
1224
list_add_tail(&msta->rc_list, &dev->sta_rc_list);
1225
spin_unlock_bh(&dev->mt76.sta_poll_lock);
1226
}
1227
1228
static void mt7915_sta_rc_update(struct ieee80211_hw *hw,
1229
struct ieee80211_vif *vif,
1230
struct ieee80211_link_sta *link_sta,
1231
u32 changed)
1232
{
1233
struct ieee80211_sta *sta = link_sta->sta;
1234
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1235
struct mt7915_dev *dev = phy->dev;
1236
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1237
1238
if (!msta->wcid.sta)
1239
return;
1240
1241
mt7915_sta_rc_work(&changed, sta);
1242
ieee80211_queue_work(hw, &dev->rc_work);
1243
}
1244
1245
static int
1246
mt7915_set_bitrate_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1247
const struct cfg80211_bitrate_mask *mask)
1248
{
1249
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1250
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1251
struct mt7915_dev *dev = phy->dev;
1252
u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED;
1253
1254
mvif->bitrate_mask = *mask;
1255
1256
/* if multiple rates across different preambles are given we can
1257
* reconfigure this info with all peers using sta_rec command with
1258
* the below exception cases.
1259
* - single rate : if a rate is passed along with different preambles,
1260
* we select the highest one as fixed rate. i.e VHT MCS for VHT peers.
1261
* - multiple rates: if it's not in range format i.e 0-{7,8,9} for VHT
1262
* then multiple MCS setting (MCS 4,5,6) is not supported.
1263
*/
1264
ieee80211_iterate_stations_atomic(hw, mt7915_sta_rc_work, &changed);
1265
ieee80211_queue_work(hw, &dev->rc_work);
1266
1267
return 0;
1268
}
1269
1270
static void mt7915_sta_set_4addr(struct ieee80211_hw *hw,
1271
struct ieee80211_vif *vif,
1272
struct ieee80211_sta *sta,
1273
bool enabled)
1274
{
1275
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1276
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1277
1278
if (enabled)
1279
set_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags);
1280
else
1281
clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags);
1282
1283
if (!msta->wcid.sta)
1284
return;
1285
1286
mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
1287
}
1288
1289
static void mt7915_sta_set_decap_offload(struct ieee80211_hw *hw,
1290
struct ieee80211_vif *vif,
1291
struct ieee80211_sta *sta,
1292
bool enabled)
1293
{
1294
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1295
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1296
1297
if (enabled)
1298
set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
1299
else
1300
clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
1301
1302
if (!msta->wcid.sta)
1303
return;
1304
1305
mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
1306
}
1307
1308
static int mt7915_sta_set_txpwr(struct ieee80211_hw *hw,
1309
struct ieee80211_vif *vif,
1310
struct ieee80211_sta *sta)
1311
{
1312
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1313
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1314
s16 txpower = sta->deflink.txpwr.power;
1315
int ret;
1316
1317
if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC)
1318
txpower = 0;
1319
1320
mutex_lock(&dev->mt76.mutex);
1321
1322
/* NOTE: temporarily use 0 as minimum limit, which is a
1323
* global setting and will be applied to all stations.
1324
*/
1325
ret = mt7915_mcu_set_txpower_frame_min(phy, 0);
1326
if (ret)
1327
goto out;
1328
1329
/* This only applies to data frames while pushing traffic,
1330
* whereas the management frames or other packets that are
1331
* using fixed rate can be configured via TxD.
1332
*/
1333
ret = mt7915_mcu_set_txpower_frame(phy, vif, sta, txpower);
1334
1335
out:
1336
mutex_unlock(&dev->mt76.mutex);
1337
1338
return ret;
1339
}
1340
1341
static const char mt7915_gstrings_stats[][ETH_GSTRING_LEN] = {
1342
"tx_ampdu_cnt",
1343
"tx_stop_q_empty_cnt",
1344
"tx_mpdu_attempts",
1345
"tx_mpdu_success",
1346
"tx_rwp_fail_cnt",
1347
"tx_rwp_need_cnt",
1348
"tx_pkt_ebf_cnt",
1349
"tx_pkt_ibf_cnt",
1350
"tx_ampdu_len:0-1",
1351
"tx_ampdu_len:2-10",
1352
"tx_ampdu_len:11-19",
1353
"tx_ampdu_len:20-28",
1354
"tx_ampdu_len:29-37",
1355
"tx_ampdu_len:38-46",
1356
"tx_ampdu_len:47-55",
1357
"tx_ampdu_len:56-79",
1358
"tx_ampdu_len:80-103",
1359
"tx_ampdu_len:104-127",
1360
"tx_ampdu_len:128-151",
1361
"tx_ampdu_len:152-175",
1362
"tx_ampdu_len:176-199",
1363
"tx_ampdu_len:200-223",
1364
"tx_ampdu_len:224-247",
1365
"ba_miss_count",
1366
"tx_beamformer_ppdu_iBF",
1367
"tx_beamformer_ppdu_eBF",
1368
"tx_beamformer_rx_feedback_all",
1369
"tx_beamformer_rx_feedback_he",
1370
"tx_beamformer_rx_feedback_vht",
1371
"tx_beamformer_rx_feedback_ht",
1372
"tx_beamformer_rx_feedback_bw", /* zero based idx: 20, 40, 80, 160 */
1373
"tx_beamformer_rx_feedback_nc",
1374
"tx_beamformer_rx_feedback_nr",
1375
"tx_beamformee_ok_feedback_pkts",
1376
"tx_beamformee_feedback_trig",
1377
"tx_mu_beamforming",
1378
"tx_mu_mpdu",
1379
"tx_mu_successful_mpdu",
1380
"tx_su_successful_mpdu",
1381
"tx_msdu_pack_1",
1382
"tx_msdu_pack_2",
1383
"tx_msdu_pack_3",
1384
"tx_msdu_pack_4",
1385
"tx_msdu_pack_5",
1386
"tx_msdu_pack_6",
1387
"tx_msdu_pack_7",
1388
"tx_msdu_pack_8",
1389
1390
/* rx counters */
1391
"rx_fifo_full_cnt",
1392
"rx_mpdu_cnt",
1393
"channel_idle_cnt",
1394
"primary_cca_busy_time",
1395
"secondary_cca_busy_time",
1396
"primary_energy_detect_time",
1397
"cck_mdrdy_time",
1398
"ofdm_mdrdy_time",
1399
"green_mdrdy_time",
1400
"rx_vector_mismatch_cnt",
1401
"rx_delimiter_fail_cnt",
1402
"rx_mrdy_cnt",
1403
"rx_len_mismatch_cnt",
1404
"rx_ampdu_cnt",
1405
"rx_ampdu_bytes_cnt",
1406
"rx_ampdu_valid_subframe_cnt",
1407
"rx_ampdu_valid_subframe_b_cnt",
1408
"rx_pfdrop_cnt",
1409
"rx_vec_queue_overflow_drop_cnt",
1410
"rx_ba_cnt",
1411
1412
/* muru mu-mimo and ofdma related stats */
1413
"dl_cck_cnt",
1414
"dl_ofdm_cnt",
1415
"dl_htmix_cnt",
1416
"dl_htgf_cnt",
1417
"dl_vht_su_cnt",
1418
"dl_vht_2mu_cnt",
1419
"dl_vht_3mu_cnt",
1420
"dl_vht_4mu_cnt",
1421
"dl_he_su_cnt",
1422
"dl_he_ext_su_cnt",
1423
"dl_he_2ru_cnt",
1424
"dl_he_2mu_cnt",
1425
"dl_he_3ru_cnt",
1426
"dl_he_3mu_cnt",
1427
"dl_he_4ru_cnt",
1428
"dl_he_4mu_cnt",
1429
"dl_he_5to8ru_cnt",
1430
"dl_he_9to16ru_cnt",
1431
"dl_he_gtr16ru_cnt",
1432
1433
"ul_hetrig_su_cnt",
1434
"ul_hetrig_2ru_cnt",
1435
"ul_hetrig_3ru_cnt",
1436
"ul_hetrig_4ru_cnt",
1437
"ul_hetrig_5to8ru_cnt",
1438
"ul_hetrig_9to16ru_cnt",
1439
"ul_hetrig_gtr16ru_cnt",
1440
"ul_hetrig_2mu_cnt",
1441
"ul_hetrig_3mu_cnt",
1442
"ul_hetrig_4mu_cnt",
1443
1444
/* per vif counters */
1445
"v_tx_mode_cck",
1446
"v_tx_mode_ofdm",
1447
"v_tx_mode_ht",
1448
"v_tx_mode_ht_gf",
1449
"v_tx_mode_vht",
1450
"v_tx_mode_he_su",
1451
"v_tx_mode_he_ext_su",
1452
"v_tx_mode_he_tb",
1453
"v_tx_mode_he_mu",
1454
"v_tx_bw_20",
1455
"v_tx_bw_40",
1456
"v_tx_bw_80",
1457
"v_tx_bw_160",
1458
"v_tx_mcs_0",
1459
"v_tx_mcs_1",
1460
"v_tx_mcs_2",
1461
"v_tx_mcs_3",
1462
"v_tx_mcs_4",
1463
"v_tx_mcs_5",
1464
"v_tx_mcs_6",
1465
"v_tx_mcs_7",
1466
"v_tx_mcs_8",
1467
"v_tx_mcs_9",
1468
"v_tx_mcs_10",
1469
"v_tx_mcs_11",
1470
"v_tx_nss_1",
1471
"v_tx_nss_2",
1472
"v_tx_nss_3",
1473
"v_tx_nss_4",
1474
};
1475
1476
#define MT7915_SSTATS_LEN ARRAY_SIZE(mt7915_gstrings_stats)
1477
1478
/* Ethtool related API */
1479
static
1480
void mt7915_get_et_strings(struct ieee80211_hw *hw,
1481
struct ieee80211_vif *vif,
1482
u32 sset, u8 *data)
1483
{
1484
if (sset != ETH_SS_STATS)
1485
return;
1486
1487
memcpy(data, mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
1488
data += sizeof(mt7915_gstrings_stats);
1489
page_pool_ethtool_stats_get_strings(data);
1490
}
1491
1492
static
1493
int mt7915_get_et_sset_count(struct ieee80211_hw *hw,
1494
struct ieee80211_vif *vif, int sset)
1495
{
1496
if (sset != ETH_SS_STATS)
1497
return 0;
1498
1499
return MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
1500
}
1501
1502
static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
1503
{
1504
struct mt76_ethtool_worker_info *wi = wi_data;
1505
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1506
1507
if (msta->vif->mt76.idx != wi->idx)
1508
return;
1509
1510
mt76_ethtool_worker(wi, &msta->wcid.stats, false);
1511
}
1512
1513
static
1514
void mt7915_get_et_stats(struct ieee80211_hw *hw,
1515
struct ieee80211_vif *vif,
1516
struct ethtool_stats *stats, u64 *data)
1517
{
1518
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1519
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1520
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1521
struct mt76_mib_stats *mib = &phy->mib;
1522
struct mt76_ethtool_worker_info wi = {
1523
.data = data,
1524
.idx = mvif->mt76.idx,
1525
};
1526
/* See mt7915_ampdu_stat_read_phy, etc */
1527
int i, ei = 0, stats_size;
1528
1529
mutex_lock(&dev->mt76.mutex);
1530
1531
mt7915_mac_update_stats(phy);
1532
1533
data[ei++] = mib->tx_ampdu_cnt;
1534
data[ei++] = mib->tx_stop_q_empty_cnt;
1535
data[ei++] = mib->tx_mpdu_attempts_cnt;
1536
data[ei++] = mib->tx_mpdu_success_cnt;
1537
data[ei++] = mib->tx_rwp_fail_cnt;
1538
data[ei++] = mib->tx_rwp_need_cnt;
1539
data[ei++] = mib->tx_pkt_ebf_cnt;
1540
data[ei++] = mib->tx_pkt_ibf_cnt;
1541
1542
/* Tx ampdu stat */
1543
for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++)
1544
data[ei++] = phy->mt76->aggr_stats[i];
1545
1546
data[ei++] = phy->mib.ba_miss_cnt;
1547
1548
/* Tx Beamformer monitor */
1549
data[ei++] = mib->tx_bf_ibf_ppdu_cnt;
1550
data[ei++] = mib->tx_bf_ebf_ppdu_cnt;
1551
1552
/* Tx Beamformer Rx feedback monitor */
1553
data[ei++] = mib->tx_bf_rx_fb_all_cnt;
1554
data[ei++] = mib->tx_bf_rx_fb_he_cnt;
1555
data[ei++] = mib->tx_bf_rx_fb_vht_cnt;
1556
data[ei++] = mib->tx_bf_rx_fb_ht_cnt;
1557
1558
data[ei++] = mib->tx_bf_rx_fb_bw;
1559
data[ei++] = mib->tx_bf_rx_fb_nc_cnt;
1560
data[ei++] = mib->tx_bf_rx_fb_nr_cnt;
1561
1562
/* Tx Beamformee Rx NDPA & Tx feedback report */
1563
data[ei++] = mib->tx_bf_fb_cpl_cnt;
1564
data[ei++] = mib->tx_bf_fb_trig_cnt;
1565
1566
/* Tx SU & MU counters */
1567
data[ei++] = mib->tx_bf_cnt;
1568
data[ei++] = mib->tx_mu_mpdu_cnt;
1569
data[ei++] = mib->tx_mu_acked_mpdu_cnt;
1570
data[ei++] = mib->tx_su_acked_mpdu_cnt;
1571
1572
/* Tx amsdu info (pack-count histogram) */
1573
for (i = 0; i < ARRAY_SIZE(mib->tx_amsdu); i++)
1574
data[ei++] = mib->tx_amsdu[i];
1575
1576
/* rx counters */
1577
data[ei++] = mib->rx_fifo_full_cnt;
1578
data[ei++] = mib->rx_mpdu_cnt;
1579
data[ei++] = mib->channel_idle_cnt;
1580
data[ei++] = mib->primary_cca_busy_time;
1581
data[ei++] = mib->secondary_cca_busy_time;
1582
data[ei++] = mib->primary_energy_detect_time;
1583
data[ei++] = mib->cck_mdrdy_time;
1584
data[ei++] = mib->ofdm_mdrdy_time;
1585
data[ei++] = mib->green_mdrdy_time;
1586
data[ei++] = mib->rx_vector_mismatch_cnt;
1587
data[ei++] = mib->rx_delimiter_fail_cnt;
1588
data[ei++] = mib->rx_mrdy_cnt;
1589
data[ei++] = mib->rx_len_mismatch_cnt;
1590
data[ei++] = mib->rx_ampdu_cnt;
1591
data[ei++] = mib->rx_ampdu_bytes_cnt;
1592
data[ei++] = mib->rx_ampdu_valid_subframe_cnt;
1593
data[ei++] = mib->rx_ampdu_valid_subframe_bytes_cnt;
1594
data[ei++] = mib->rx_pfdrop_cnt;
1595
data[ei++] = mib->rx_vec_queue_overflow_drop_cnt;
1596
data[ei++] = mib->rx_ba_cnt;
1597
1598
data[ei++] = mib->dl_cck_cnt;
1599
data[ei++] = mib->dl_ofdm_cnt;
1600
data[ei++] = mib->dl_htmix_cnt;
1601
data[ei++] = mib->dl_htgf_cnt;
1602
data[ei++] = mib->dl_vht_su_cnt;
1603
data[ei++] = mib->dl_vht_2mu_cnt;
1604
data[ei++] = mib->dl_vht_3mu_cnt;
1605
data[ei++] = mib->dl_vht_4mu_cnt;
1606
data[ei++] = mib->dl_he_su_cnt;
1607
data[ei++] = mib->dl_he_ext_su_cnt;
1608
data[ei++] = mib->dl_he_2ru_cnt;
1609
data[ei++] = mib->dl_he_2mu_cnt;
1610
data[ei++] = mib->dl_he_3ru_cnt;
1611
data[ei++] = mib->dl_he_3mu_cnt;
1612
data[ei++] = mib->dl_he_4ru_cnt;
1613
data[ei++] = mib->dl_he_4mu_cnt;
1614
data[ei++] = mib->dl_he_5to8ru_cnt;
1615
data[ei++] = mib->dl_he_9to16ru_cnt;
1616
data[ei++] = mib->dl_he_gtr16ru_cnt;
1617
1618
data[ei++] = mib->ul_hetrig_su_cnt;
1619
data[ei++] = mib->ul_hetrig_2ru_cnt;
1620
data[ei++] = mib->ul_hetrig_3ru_cnt;
1621
data[ei++] = mib->ul_hetrig_4ru_cnt;
1622
data[ei++] = mib->ul_hetrig_5to8ru_cnt;
1623
data[ei++] = mib->ul_hetrig_9to16ru_cnt;
1624
data[ei++] = mib->ul_hetrig_gtr16ru_cnt;
1625
data[ei++] = mib->ul_hetrig_2mu_cnt;
1626
data[ei++] = mib->ul_hetrig_3mu_cnt;
1627
data[ei++] = mib->ul_hetrig_4mu_cnt;
1628
1629
/* Add values for all stations owned by this vif */
1630
wi.initial_stat_idx = ei;
1631
ieee80211_iterate_stations_atomic(hw, mt7915_ethtool_worker, &wi);
1632
1633
mutex_unlock(&dev->mt76.mutex);
1634
1635
if (wi.sta_count == 0)
1636
return;
1637
1638
ei += wi.worker_stat_count;
1639
1640
mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei);
1641
1642
stats_size = MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
1643
if (ei != stats_size)
1644
dev_err(dev->mt76.dev, "ei: %d size: %d", ei, stats_size);
1645
}
1646
1647
static void
1648
mt7915_twt_teardown_request(struct ieee80211_hw *hw,
1649
struct ieee80211_sta *sta,
1650
u8 flowid)
1651
{
1652
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1653
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1654
1655
mutex_lock(&dev->mt76.mutex);
1656
mt7915_mac_twt_teardown_flow(dev, msta, flowid);
1657
mutex_unlock(&dev->mt76.mutex);
1658
}
1659
1660
static int
1661
mt7915_set_frag_threshold(struct ieee80211_hw *hw, int radio_idx, u32 val)
1662
{
1663
return 0;
1664
}
1665
1666
static int
1667
mt7915_set_radar_background(struct ieee80211_hw *hw,
1668
struct cfg80211_chan_def *chandef)
1669
{
1670
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1671
struct mt7915_dev *dev = phy->dev;
1672
int ret = -EINVAL;
1673
bool running;
1674
1675
mutex_lock(&dev->mt76.mutex);
1676
1677
if (dev->mt76.region == NL80211_DFS_UNSET)
1678
goto out;
1679
1680
if (dev->rdd2_phy && dev->rdd2_phy != phy) {
1681
/* rdd2 is already locked */
1682
ret = -EBUSY;
1683
goto out;
1684
}
1685
1686
/* rdd2 already configured on a radar channel */
1687
running = dev->rdd2_phy &&
1688
cfg80211_chandef_valid(&dev->rdd2_chandef) &&
1689
!!(dev->rdd2_chandef.chan->flags & IEEE80211_CHAN_RADAR);
1690
1691
if (!chandef || running ||
1692
!(chandef->chan->flags & IEEE80211_CHAN_RADAR)) {
1693
ret = mt7915_mcu_rdd_background_enable(phy, NULL);
1694
if (ret)
1695
goto out;
1696
1697
if (!running)
1698
goto update_phy;
1699
}
1700
1701
ret = mt7915_mcu_rdd_background_enable(phy, chandef);
1702
if (ret)
1703
goto out;
1704
1705
update_phy:
1706
dev->rdd2_phy = chandef ? phy : NULL;
1707
if (chandef)
1708
dev->rdd2_chandef = *chandef;
1709
out:
1710
mutex_unlock(&dev->mt76.mutex);
1711
1712
return ret;
1713
}
1714
1715
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
1716
static int
1717
mt7915_net_fill_forward_path(struct ieee80211_hw *hw,
1718
struct ieee80211_vif *vif,
1719
struct ieee80211_sta *sta,
1720
struct net_device_path_ctx *ctx,
1721
struct net_device_path *path)
1722
{
1723
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1724
struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1725
struct mt7915_dev *dev = mt7915_hw_dev(hw);
1726
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1727
struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
1728
1729
if (!mtk_wed_device_active(wed))
1730
return -ENODEV;
1731
1732
if (msta->wcid.idx > 0xff)
1733
return -EIO;
1734
1735
path->type = DEV_PATH_MTK_WDMA;
1736
path->dev = ctx->dev;
1737
path->mtk_wdma.wdma_idx = wed->wdma_idx;
1738
path->mtk_wdma.bss = mvif->mt76.idx;
1739
path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? msta->wcid.idx : 0x3ff;
1740
path->mtk_wdma.queue = phy != &dev->phy;
1741
1742
ctx->dev = NULL;
1743
1744
return 0;
1745
}
1746
#endif
1747
1748
static void
1749
mt7915_reconfig_complete(struct ieee80211_hw *hw,
1750
enum ieee80211_reconfig_type reconfig_type)
1751
{
1752
struct mt7915_phy *phy = mt7915_hw_phy(hw);
1753
1754
ieee80211_wake_queues(hw);
1755
ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
1756
MT7915_WATCHDOG_TIME);
1757
}
1758
1759
const struct ieee80211_ops mt7915_ops = {
1760
.add_chanctx = ieee80211_emulate_add_chanctx,
1761
.remove_chanctx = ieee80211_emulate_remove_chanctx,
1762
.change_chanctx = ieee80211_emulate_change_chanctx,
1763
.switch_vif_chanctx = ieee80211_emulate_switch_vif_chanctx,
1764
.tx = mt7915_tx,
1765
.start = mt7915_start,
1766
.stop = mt7915_stop,
1767
.add_interface = mt7915_add_interface,
1768
.remove_interface = mt7915_remove_interface,
1769
.config = mt7915_config,
1770
.conf_tx = mt7915_conf_tx,
1771
.configure_filter = mt7915_configure_filter,
1772
.bss_info_changed = mt7915_bss_info_changed,
1773
.start_ap = mt7915_start_ap,
1774
.stop_ap = mt7915_stop_ap,
1775
.sta_state = mt76_sta_state,
1776
.sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
1777
.link_sta_rc_update = mt7915_sta_rc_update,
1778
.set_key = mt7915_set_key,
1779
.ampdu_action = mt7915_ampdu_action,
1780
.set_rts_threshold = mt7915_set_rts_threshold,
1781
.wake_tx_queue = mt76_wake_tx_queue,
1782
.sw_scan_start = mt76_sw_scan,
1783
.sw_scan_complete = mt76_sw_scan_complete,
1784
.release_buffered_frames = mt76_release_buffered_frames,
1785
.get_txpower = mt76_get_txpower,
1786
.set_sar_specs = mt7915_set_sar_specs,
1787
.channel_switch_beacon = mt7915_channel_switch_beacon,
1788
.get_stats = mt7915_get_stats,
1789
.get_et_sset_count = mt7915_get_et_sset_count,
1790
.get_et_stats = mt7915_get_et_stats,
1791
.get_et_strings = mt7915_get_et_strings,
1792
.get_tsf = mt7915_get_tsf,
1793
.set_tsf = mt7915_set_tsf,
1794
.offset_tsf = mt7915_offset_tsf,
1795
.get_survey = mt76_get_survey,
1796
.get_antenna = mt76_get_antenna,
1797
.set_antenna = mt7915_set_antenna,
1798
.set_bitrate_mask = mt7915_set_bitrate_mask,
1799
.set_coverage_class = mt7915_set_coverage_class,
1800
.sta_statistics = mt7915_sta_statistics,
1801
.sta_set_txpwr = mt7915_sta_set_txpwr,
1802
.sta_set_4addr = mt7915_sta_set_4addr,
1803
.sta_set_decap_offload = mt7915_sta_set_decap_offload,
1804
.add_twt_setup = mt7915_mac_add_twt_setup,
1805
.twt_teardown_request = mt7915_twt_teardown_request,
1806
.set_frag_threshold = mt7915_set_frag_threshold,
1807
CFG80211_TESTMODE_CMD(mt76_testmode_cmd)
1808
CFG80211_TESTMODE_DUMP(mt76_testmode_dump)
1809
#ifdef CONFIG_MAC80211_DEBUGFS
1810
.sta_add_debugfs = mt7915_sta_add_debugfs,
1811
#endif
1812
.set_radar_background = mt7915_set_radar_background,
1813
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
1814
.net_fill_forward_path = mt7915_net_fill_forward_path,
1815
.net_setup_tc = mt76_wed_net_setup_tc,
1816
#endif
1817
.reconfig_complete = mt7915_reconfig_complete,
1818
};
1819
1820