Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/mediatek/mt76/mt7615/mcu.c
108325 views
1
// SPDX-License-Identifier: BSD-3-Clause-Clear
2
/* Copyright (C) 2019 MediaTek Inc.
3
*
4
* Author: Roy Luo <[email protected]>
5
* Ryder Lee <[email protected]>
6
*/
7
8
#include <linux/firmware.h>
9
#include "mt7615.h"
10
#include "mcu.h"
11
#include "mac.h"
12
#include "eeprom.h"
13
14
static bool prefer_offload_fw = true;
15
module_param(prefer_offload_fw, bool, 0644);
16
MODULE_PARM_DESC(prefer_offload_fw,
17
"Prefer client mode offload firmware (MT7663)");
18
19
struct mt7615_patch_hdr {
20
char build_date[16];
21
char platform[4];
22
__be32 hw_sw_ver;
23
__be32 patch_ver;
24
__be16 checksum;
25
} __packed;
26
27
struct mt7615_fw_trailer {
28
__le32 addr;
29
u8 chip_id;
30
u8 feature_set;
31
u8 eco_code;
32
char fw_ver[10];
33
char build_date[15];
34
__le32 len;
35
} __packed;
36
37
#define FW_V3_COMMON_TAILER_SIZE 36
38
#define FW_V3_REGION_TAILER_SIZE 40
39
#define FW_START_OVERRIDE BIT(0)
40
#define FW_START_DLYCAL BIT(1)
41
#define FW_START_WORKING_PDA_CR4 BIT(2)
42
43
struct mt7663_fw_buf {
44
__le32 crc;
45
__le32 d_img_size;
46
__le32 block_size;
47
u8 rsv[4];
48
__le32 img_dest_addr;
49
__le32 img_size;
50
u8 feature_set;
51
};
52
53
#define MT7615_PATCH_ADDRESS 0x80000
54
#define MT7622_PATCH_ADDRESS 0x9c000
55
#define MT7663_PATCH_ADDRESS 0xdc000
56
57
#define N9_REGION_NUM 2
58
#define CR4_REGION_NUM 1
59
60
#define IMG_CRC_LEN 4
61
62
void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
63
int cmd, int *wait_seq)
64
{
65
int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
66
struct mt7615_uni_txd *uni_txd;
67
struct mt7615_mcu_txd *mcu_txd;
68
u8 seq, q_idx, pkt_fmt;
69
__le32 *txd;
70
u32 val;
71
72
/* TODO: make dynamic based on msg type */
73
dev->mt76.mcu.timeout = 20 * HZ;
74
75
seq = ++dev->mt76.mcu.msg_seq & 0xf;
76
if (!seq)
77
seq = ++dev->mt76.mcu.msg_seq & 0xf;
78
if (wait_seq)
79
*wait_seq = seq;
80
81
txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
82
txd = (__le32 *)skb_push(skb, txd_len);
83
84
if (cmd != MCU_CMD(FW_SCATTER)) {
85
q_idx = MT_TX_MCU_PORT_RX_Q0;
86
pkt_fmt = MT_TX_TYPE_CMD;
87
} else {
88
q_idx = MT_TX_MCU_PORT_RX_FWDL;
89
pkt_fmt = MT_TX_TYPE_FW;
90
}
91
92
val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
93
FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
94
FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
95
txd[0] = cpu_to_le32(val);
96
97
val = MT_TXD1_LONG_FORMAT |
98
FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) |
99
FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt);
100
txd[1] = cpu_to_le32(val);
101
102
if (cmd & __MCU_CMD_FIELD_UNI) {
103
uni_txd = (struct mt7615_uni_txd *)txd;
104
uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
105
uni_txd->option = MCU_CMD_UNI_EXT_ACK;
106
uni_txd->cid = cpu_to_le16(mcu_cmd);
107
uni_txd->s2d_index = MCU_S2D_H2N;
108
uni_txd->pkt_type = MCU_PKT_ID;
109
uni_txd->seq = seq;
110
111
return;
112
}
113
114
mcu_txd = (struct mt7615_mcu_txd *)txd;
115
mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
116
mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx));
117
mcu_txd->s2d_index = MCU_S2D_H2N;
118
mcu_txd->pkt_type = MCU_PKT_ID;
119
mcu_txd->seq = seq;
120
mcu_txd->cid = mcu_cmd;
121
mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
122
123
if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
124
if (cmd & __MCU_CMD_FIELD_QUERY)
125
mcu_txd->set_query = MCU_Q_QUERY;
126
else
127
mcu_txd->set_query = MCU_Q_SET;
128
mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
129
} else {
130
mcu_txd->set_query = MCU_Q_NA;
131
}
132
}
133
EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg);
134
135
int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
136
struct sk_buff *skb, int seq)
137
{
138
struct mt7615_mcu_rxd *rxd;
139
int ret = 0;
140
141
if (!skb) {
142
dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
143
cmd, seq);
144
return -ETIMEDOUT;
145
}
146
147
rxd = (struct mt7615_mcu_rxd *)skb->data;
148
if (seq != rxd->seq)
149
return -EAGAIN;
150
151
if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
152
skb_pull(skb, sizeof(*rxd) - 4);
153
ret = *skb->data;
154
} else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
155
skb_pull(skb, sizeof(*rxd));
156
ret = le32_to_cpu(*(__le32 *)skb->data);
157
} else if (cmd == MCU_EXT_QUERY(RF_REG_ACCESS)) {
158
skb_pull(skb, sizeof(*rxd));
159
ret = le32_to_cpu(*(__le32 *)&skb->data[8]);
160
} else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
161
cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
162
cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
163
cmd == MCU_UNI_CMD(HIF_CTRL) ||
164
cmd == MCU_UNI_CMD(OFFLOAD) ||
165
cmd == MCU_UNI_CMD(SUSPEND)) {
166
struct mt76_connac_mcu_uni_event *event;
167
168
skb_pull(skb, sizeof(*rxd));
169
event = (struct mt76_connac_mcu_uni_event *)skb->data;
170
ret = le32_to_cpu(event->status);
171
} else if (cmd == MCU_CE_QUERY(REG_READ)) {
172
struct mt76_connac_mcu_reg_event *event;
173
174
skb_pull(skb, sizeof(*rxd));
175
event = (struct mt76_connac_mcu_reg_event *)skb->data;
176
ret = (int)le32_to_cpu(event->val);
177
}
178
179
return ret;
180
}
181
EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
182
183
static int
184
mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
185
int cmd, int *seq)
186
{
187
struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
188
enum mt76_mcuq_id qid;
189
190
mt7615_mcu_fill_msg(dev, skb, cmd, seq);
191
if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
192
qid = MT_MCUQ_WM;
193
else
194
qid = MT_MCUQ_FWDL;
195
196
return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0);
197
}
198
199
u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
200
{
201
struct {
202
__le32 wifi_stream;
203
__le32 address;
204
__le32 data;
205
} req = {
206
.wifi_stream = cpu_to_le32(wf),
207
.address = cpu_to_le32(reg),
208
};
209
210
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS),
211
&req, sizeof(req), true);
212
}
213
214
int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val)
215
{
216
struct {
217
__le32 wifi_stream;
218
__le32 address;
219
__le32 data;
220
} req = {
221
.wifi_stream = cpu_to_le32(wf),
222
.address = cpu_to_le32(reg),
223
.data = cpu_to_le32(val),
224
};
225
226
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS),
227
&req, sizeof(req), false);
228
}
229
230
void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
231
{
232
if (!is_mt7622(&dev->mt76))
233
return;
234
235
#if defined(__linux__)
236
regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
237
MT_INFRACFG_MISC_AP2CONN_WAKE,
238
!en * MT_INFRACFG_MISC_AP2CONN_WAKE);
239
#elif defined(__FreeBSD__)
240
panic("%s: LinuxKPI needs regmap\n", __func__);
241
#endif
242
}
243
EXPORT_SYMBOL_GPL(mt7622_trigger_hif_int);
244
245
static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
246
{
247
struct mt76_phy *mphy = &dev->mt76.phy;
248
struct mt76_connac_pm *pm = &dev->pm;
249
struct mt76_dev *mdev = &dev->mt76;
250
u32 addr;
251
int err;
252
253
if (is_mt7663(mdev)) {
254
/* Clear firmware own via N9 eint */
255
mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
256
mt76_poll(dev, MT_CONN_ON_MISC, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
257
258
addr = MT_CONN_HIF_ON_LPCTL;
259
} else {
260
addr = MT_CFG_LPCR_HOST;
261
}
262
263
mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
264
265
mt7622_trigger_hif_int(dev, true);
266
267
err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
268
269
mt7622_trigger_hif_int(dev, false);
270
271
if (err) {
272
dev_err(mdev->dev, "driver own failed\n");
273
return -ETIMEDOUT;
274
}
275
276
clear_bit(MT76_STATE_PM, &mphy->state);
277
278
pm->stats.last_wake_event = jiffies;
279
pm->stats.doze_time += pm->stats.last_wake_event -
280
pm->stats.last_doze_event;
281
282
return 0;
283
}
284
285
static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
286
{
287
struct mt76_phy *mphy = &dev->mt76.phy;
288
struct mt76_connac_pm *pm = &dev->pm;
289
int i, err = 0;
290
291
mutex_lock(&pm->mutex);
292
293
if (!test_bit(MT76_STATE_PM, &mphy->state))
294
goto out;
295
296
for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
297
mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
298
if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
299
MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
300
break;
301
}
302
303
if (i == MT7615_DRV_OWN_RETRY_COUNT) {
304
dev_err(dev->mt76.dev, "driver own failed\n");
305
err = -EIO;
306
goto out;
307
}
308
clear_bit(MT76_STATE_PM, &mphy->state);
309
310
pm->stats.last_wake_event = jiffies;
311
pm->stats.doze_time += pm->stats.last_wake_event -
312
pm->stats.last_doze_event;
313
out:
314
mutex_unlock(&pm->mutex);
315
316
return err;
317
}
318
319
static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
320
{
321
struct mt76_phy *mphy = &dev->mt76.phy;
322
struct mt76_connac_pm *pm = &dev->pm;
323
int err = 0;
324
u32 addr;
325
326
mutex_lock(&pm->mutex);
327
328
if (mt76_connac_skip_fw_pmctrl(mphy, pm))
329
goto out;
330
331
mt7622_trigger_hif_int(dev, true);
332
333
addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
334
mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
335
336
if (is_mt7622(&dev->mt76) &&
337
!mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
338
MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
339
dev_err(dev->mt76.dev, "Timeout for firmware own\n");
340
clear_bit(MT76_STATE_PM, &mphy->state);
341
err = -EIO;
342
}
343
344
mt7622_trigger_hif_int(dev, false);
345
if (!err) {
346
pm->stats.last_doze_event = jiffies;
347
pm->stats.awake_time += pm->stats.last_doze_event -
348
pm->stats.last_wake_event;
349
}
350
out:
351
mutex_unlock(&pm->mutex);
352
353
return err;
354
}
355
356
static void
357
mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
358
{
359
if (vif->bss_conf.csa_active)
360
ieee80211_csa_finish(vif, 0);
361
}
362
363
static void
364
mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb)
365
{
366
struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
367
struct mt76_phy *mphy = &dev->mt76.phy;
368
struct mt7615_mcu_csa_notify *c;
369
370
c = (struct mt7615_mcu_csa_notify *)skb->data;
371
372
if (c->omac_idx > EXT_BSSID_MAX)
373
return;
374
375
if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx))
376
mphy = dev->mt76.phys[MT_BAND1];
377
378
ieee80211_iterate_active_interfaces_atomic(mphy->hw,
379
IEEE80211_IFACE_ITER_RESUME_ALL,
380
mt7615_mcu_csa_finish, mphy->hw);
381
}
382
383
static void
384
mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
385
{
386
struct mt76_phy *mphy = &dev->mt76.phy;
387
struct mt7615_mcu_rdd_report *r;
388
389
r = (struct mt7615_mcu_rdd_report *)skb->data;
390
391
if (!dev->radar_pattern.n_pulses && !r->long_detected &&
392
!r->constant_prf_detected && !r->staggered_prf_detected)
393
return;
394
395
if (r->band_idx && dev->mt76.phys[MT_BAND1])
396
mphy = dev->mt76.phys[MT_BAND1];
397
398
if (mt76_phy_dfs_state(mphy) < MT_DFS_STATE_CAC)
399
return;
400
401
ieee80211_radar_detected(mphy->hw, NULL);
402
dev->hw_pattern++;
403
}
404
405
static void
406
mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
407
{
408
struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
409
const char *data = (char *)&rxd[1];
410
const char *type;
411
412
switch (rxd->s2d_index) {
413
case 0:
414
type = "N9";
415
break;
416
case 2:
417
type = "CR4";
418
break;
419
default:
420
type = "unknown";
421
break;
422
}
423
424
wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type,
425
(int)(skb->len - sizeof(*rxd)), data);
426
}
427
428
static void
429
mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
430
{
431
struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
432
433
switch (rxd->ext_eid) {
434
case MCU_EXT_EVENT_RDD_REPORT:
435
mt7615_mcu_rx_radar_detected(dev, skb);
436
break;
437
case MCU_EXT_EVENT_CSA_NOTIFY:
438
mt7615_mcu_rx_csa_notify(dev, skb);
439
break;
440
case MCU_EXT_EVENT_FW_LOG_2_HOST:
441
mt7615_mcu_rx_log_message(dev, skb);
442
break;
443
default:
444
break;
445
}
446
}
447
448
static void
449
mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
450
{
451
u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
452
struct mt7615_phy *phy;
453
struct mt76_phy *mphy;
454
455
if (*seq_num & BIT(7) && dev->mt76.phys[MT_BAND1])
456
mphy = dev->mt76.phys[MT_BAND1];
457
else
458
mphy = &dev->mt76.phy;
459
460
phy = mphy->priv;
461
462
spin_lock_bh(&dev->mt76.lock);
463
__skb_queue_tail(&phy->scan_event_list, skb);
464
spin_unlock_bh(&dev->mt76.lock);
465
466
ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
467
MT7615_HW_SCAN_TIMEOUT);
468
}
469
470
static void
471
mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
472
{
473
struct mt7615_roc_tlv *event;
474
struct mt7615_phy *phy;
475
struct mt76_phy *mphy;
476
int duration;
477
478
skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
479
event = (struct mt7615_roc_tlv *)skb->data;
480
481
if (event->dbdc_band && dev->mt76.phys[MT_BAND1])
482
mphy = dev->mt76.phys[MT_BAND1];
483
else
484
mphy = &dev->mt76.phy;
485
486
ieee80211_ready_on_channel(mphy->hw);
487
488
phy = mphy->priv;
489
phy->roc_grant = true;
490
wake_up(&phy->roc_wait);
491
492
duration = le32_to_cpu(event->max_interval);
493
mod_timer(&phy->roc_timer,
494
round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
495
}
496
497
static void
498
mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
499
{
500
struct mt76_connac_beacon_loss_event *event;
501
struct mt76_phy *mphy;
502
u8 band_idx = 0; /* DBDC support */
503
504
skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
505
event = (struct mt76_connac_beacon_loss_event *)skb->data;
506
if (band_idx && dev->mt76.phys[MT_BAND1])
507
mphy = dev->mt76.phys[MT_BAND1];
508
else
509
mphy = &dev->mt76.phy;
510
511
ieee80211_iterate_active_interfaces_atomic(mphy->hw,
512
IEEE80211_IFACE_ITER_RESUME_ALL,
513
mt76_connac_mcu_beacon_loss_iter,
514
event);
515
}
516
517
static void
518
mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
519
{
520
struct mt76_connac_mcu_bss_event *event;
521
struct mt76_phy *mphy;
522
u8 band_idx = 0; /* DBDC support */
523
524
skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
525
event = (struct mt76_connac_mcu_bss_event *)skb->data;
526
527
if (band_idx && dev->mt76.phys[MT_BAND1])
528
mphy = dev->mt76.phys[MT_BAND1];
529
else
530
mphy = &dev->mt76.phy;
531
532
if (event->is_absent)
533
ieee80211_stop_queues(mphy->hw);
534
else
535
ieee80211_wake_queues(mphy->hw);
536
}
537
538
static void
539
mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
540
{
541
struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
542
543
switch (rxd->eid) {
544
case MCU_EVENT_EXT:
545
mt7615_mcu_rx_ext_event(dev, skb);
546
break;
547
case MCU_EVENT_BSS_BEACON_LOSS:
548
mt7615_mcu_beacon_loss_event(dev, skb);
549
break;
550
case MCU_EVENT_ROC:
551
mt7615_mcu_roc_event(dev, skb);
552
break;
553
case MCU_EVENT_SCHED_SCAN_DONE:
554
case MCU_EVENT_SCAN_DONE:
555
mt7615_mcu_scan_event(dev, skb);
556
return;
557
case MCU_EVENT_BSS_ABSENCE:
558
mt7615_mcu_bss_event(dev, skb);
559
break;
560
case MCU_EVENT_COREDUMP:
561
mt76_connac_mcu_coredump_event(&dev->mt76, skb,
562
&dev->coredump);
563
return;
564
default:
565
break;
566
}
567
dev_kfree_skb(skb);
568
}
569
570
void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
571
{
572
struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
573
574
if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
575
rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
576
rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
577
rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
578
rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
579
rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
580
rxd->eid == MCU_EVENT_BSS_ABSENCE ||
581
rxd->eid == MCU_EVENT_SCAN_DONE ||
582
rxd->eid == MCU_EVENT_COREDUMP ||
583
rxd->eid == MCU_EVENT_ROC ||
584
!rxd->seq)
585
mt7615_mcu_rx_unsolicited_event(dev, skb);
586
else
587
mt76_mcu_rx_event(&dev->mt76, skb);
588
}
589
590
static int
591
mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif,
592
bool bssid, bool enable)
593
{
594
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
595
u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
596
u32 mask = dev->omac_mask >> 32 & ~BIT(idx);
597
const u8 *addr = vif->addr;
598
struct {
599
u8 mode;
600
u8 force_clear;
601
u8 clear_bitmap[8];
602
u8 entry_count;
603
u8 write;
604
605
u8 index;
606
u8 bssid;
607
u8 addr[ETH_ALEN];
608
} __packed req = {
609
.mode = !!mask || enable,
610
.entry_count = 1,
611
.write = 1,
612
613
.index = idx * 2 + bssid,
614
};
615
616
if (bssid)
617
addr = vif->bss_conf.bssid;
618
619
if (enable)
620
ether_addr_copy(req.addr, addr);
621
622
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE),
623
&req, sizeof(req), true);
624
}
625
626
static int
627
mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
628
bool enable)
629
{
630
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
631
struct mt7615_dev *dev = phy->dev;
632
struct {
633
struct req_hdr {
634
u8 omac_idx;
635
u8 band_idx;
636
__le16 tlv_num;
637
u8 is_tlv_append;
638
u8 rsv[3];
639
} __packed hdr;
640
struct req_tlv {
641
__le16 tag;
642
__le16 len;
643
u8 active;
644
u8 band_idx;
645
u8 omac_addr[ETH_ALEN];
646
} __packed tlv;
647
} data = {
648
.hdr = {
649
.omac_idx = mvif->mt76.omac_idx,
650
.band_idx = mvif->mt76.band_idx,
651
.tlv_num = cpu_to_le16(1),
652
.is_tlv_append = 1,
653
},
654
.tlv = {
655
.tag = cpu_to_le16(DEV_INFO_ACTIVE),
656
.len = cpu_to_le16(sizeof(struct req_tlv)),
657
.active = enable,
658
.band_idx = mvif->mt76.band_idx,
659
},
660
};
661
662
if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
663
return mt7615_mcu_muar_config(dev, vif, false, enable);
664
665
memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
666
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
667
&data, sizeof(data), true);
668
}
669
670
static int
671
mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
672
struct ieee80211_hw *hw,
673
struct ieee80211_vif *vif, bool enable)
674
{
675
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
676
struct mt76_wcid *wcid = &dev->mt76.global_wcid;
677
struct ieee80211_mutable_offsets offs;
678
struct ieee80211_tx_info *info;
679
struct req {
680
u8 omac_idx;
681
u8 enable;
682
u8 wlan_idx;
683
u8 band_idx;
684
u8 pkt_type;
685
u8 need_pre_tbtt_int;
686
__le16 csa_ie_pos;
687
__le16 pkt_len;
688
__le16 tim_ie_pos;
689
u8 pkt[512];
690
u8 csa_cnt;
691
/* bss color change */
692
u8 bcc_cnt;
693
__le16 bcc_ie_pos;
694
} __packed req = {
695
.omac_idx = mvif->mt76.omac_idx,
696
.enable = enable,
697
.wlan_idx = wcid->idx,
698
.band_idx = mvif->mt76.band_idx,
699
};
700
struct sk_buff *skb;
701
702
if (!enable)
703
goto out;
704
705
skb = ieee80211_beacon_get_template(hw, vif, &offs, 0);
706
if (!skb)
707
return -EINVAL;
708
709
if (skb->len > 512 - MT_TXD_SIZE) {
710
dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
711
dev_kfree_skb(skb);
712
return -EINVAL;
713
}
714
715
info = IEEE80211_SKB_CB(skb);
716
info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, mvif->mt76.band_idx);
717
718
mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
719
0, NULL, 0, true);
720
memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
721
req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
722
req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
723
if (offs.cntdwn_counter_offs[0]) {
724
u16 csa_offs;
725
726
csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
727
req.csa_ie_pos = cpu_to_le16(csa_offs);
728
req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]];
729
}
730
dev_kfree_skb(skb);
731
732
out:
733
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(BCN_OFFLOAD), &req,
734
sizeof(req), true);
735
}
736
737
static int
738
mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
739
{
740
return mt76_connac_mcu_set_pm(&dev->mt76, band, state);
741
}
742
743
static int
744
mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
745
struct ieee80211_sta *sta, bool enable)
746
{
747
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
748
struct mt7615_dev *dev = phy->dev;
749
struct sk_buff *skb;
750
751
if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
752
mt7615_mcu_muar_config(dev, vif, true, enable);
753
754
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL);
755
if (IS_ERR(skb))
756
return PTR_ERR(skb);
757
758
if (enable)
759
mt76_connac_mcu_bss_omac_tlv(skb, vif);
760
761
mt76_connac_mcu_bss_basic_tlv(skb, vif, sta, phy->mt76,
762
mvif->sta.wcid.idx, enable);
763
764
if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START &&
765
mvif->mt76.omac_idx < REPEATER_BSSID_START)
766
mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76);
767
768
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
769
MCU_EXT_CMD(BSS_INFO_UPDATE), true);
770
}
771
772
static int
773
mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
774
struct ieee80211_ampdu_params *params,
775
bool enable)
776
{
777
struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
778
struct mt7615_vif *mvif = msta->vif;
779
struct wtbl_req_hdr *wtbl_hdr;
780
struct sk_buff *skb = NULL;
781
int err;
782
783
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
784
WTBL_SET, NULL, &skb);
785
if (IS_ERR(wtbl_hdr))
786
return PTR_ERR(wtbl_hdr);
787
788
mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true,
789
NULL, wtbl_hdr);
790
791
err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
792
MCU_EXT_CMD(WTBL_UPDATE), true);
793
if (err < 0)
794
return err;
795
796
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
797
&msta->wcid);
798
if (IS_ERR(skb))
799
return PTR_ERR(skb);
800
801
mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true);
802
803
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
804
MCU_EXT_CMD(STA_REC_UPDATE), true);
805
}
806
807
static int
808
mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
809
struct ieee80211_ampdu_params *params,
810
bool enable)
811
{
812
struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
813
struct mt7615_vif *mvif = msta->vif;
814
struct wtbl_req_hdr *wtbl_hdr;
815
struct sk_buff *skb;
816
int err;
817
818
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
819
&msta->wcid);
820
if (IS_ERR(skb))
821
return PTR_ERR(skb);
822
823
mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
824
825
err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
826
MCU_EXT_CMD(STA_REC_UPDATE), true);
827
if (err < 0 || !enable)
828
return err;
829
830
skb = NULL;
831
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
832
WTBL_SET, NULL, &skb);
833
if (IS_ERR(wtbl_hdr))
834
return PTR_ERR(wtbl_hdr);
835
836
mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
837
NULL, wtbl_hdr);
838
839
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
840
MCU_EXT_CMD(WTBL_UPDATE), true);
841
}
842
843
static int
844
mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
845
struct ieee80211_sta *sta, bool enable)
846
{
847
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
848
struct sk_buff *skb, *sskb, *wskb = NULL;
849
struct ieee80211_link_sta *link_sta;
850
struct mt7615_dev *dev = phy->dev;
851
struct wtbl_req_hdr *wtbl_hdr;
852
struct mt7615_sta *msta;
853
bool new_entry = true;
854
int conn_state;
855
int cmd, err;
856
857
msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
858
link_sta = sta ? &sta->deflink : NULL;
859
860
sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
861
&msta->wcid);
862
if (IS_ERR(sskb))
863
return PTR_ERR(sskb);
864
865
if (!sta) {
866
if (mvif->sta_added)
867
new_entry = false;
868
else
869
mvif->sta_added = true;
870
}
871
conn_state = enable ? CONN_STATE_PORT_SECURE : CONN_STATE_DISCONNECT;
872
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, sskb, &vif->bss_conf,
873
link_sta, conn_state, new_entry);
874
if (enable && sta)
875
mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
876
MT76_STA_INFO_STATE_ASSOC);
877
878
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
879
WTBL_RESET_AND_SET, NULL,
880
&wskb);
881
if (IS_ERR(wtbl_hdr)) {
882
dev_kfree_skb(sskb);
883
return PTR_ERR(wtbl_hdr);
884
}
885
886
if (enable) {
887
mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta,
888
NULL, wtbl_hdr);
889
if (sta)
890
mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
891
NULL, wtbl_hdr, true, true);
892
mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid,
893
NULL, wtbl_hdr);
894
}
895
896
cmd = enable ? MCU_EXT_CMD(WTBL_UPDATE) : MCU_EXT_CMD(STA_REC_UPDATE);
897
skb = enable ? wskb : sskb;
898
899
err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
900
if (err < 0) {
901
skb = enable ? sskb : wskb;
902
dev_kfree_skb(skb);
903
904
return err;
905
}
906
907
cmd = enable ? MCU_EXT_CMD(STA_REC_UPDATE) : MCU_EXT_CMD(WTBL_UPDATE);
908
skb = enable ? sskb : wskb;
909
910
return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
911
}
912
913
static int
914
mt7615_mcu_wtbl_update_hdr_trans(struct mt7615_dev *dev,
915
struct ieee80211_vif *vif,
916
struct ieee80211_sta *sta)
917
{
918
return mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
919
}
920
921
static const struct mt7615_mcu_ops wtbl_update_ops = {
922
.add_beacon_offload = mt7615_mcu_add_beacon_offload,
923
.set_pm_state = mt7615_mcu_ctrl_pm_state,
924
.add_dev_info = mt7615_mcu_add_dev,
925
.add_bss_info = mt7615_mcu_add_bss,
926
.add_tx_ba = mt7615_mcu_wtbl_tx_ba,
927
.add_rx_ba = mt7615_mcu_wtbl_rx_ba,
928
.sta_add = mt7615_mcu_wtbl_sta_add,
929
.set_drv_ctrl = mt7615_mcu_drv_pmctrl,
930
.set_fw_ctrl = mt7615_mcu_fw_pmctrl,
931
.set_sta_decap_offload = mt7615_mcu_wtbl_update_hdr_trans,
932
};
933
934
static int
935
mt7615_mcu_sta_ba(struct mt7615_dev *dev,
936
struct ieee80211_ampdu_params *params,
937
bool enable, bool tx)
938
{
939
struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
940
struct mt7615_vif *mvif = msta->vif;
941
struct wtbl_req_hdr *wtbl_hdr;
942
struct tlv *sta_wtbl;
943
struct sk_buff *skb;
944
945
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
946
&msta->wcid);
947
if (IS_ERR(skb))
948
return PTR_ERR(skb);
949
950
mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
951
952
sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
953
954
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
955
WTBL_SET, sta_wtbl, &skb);
956
if (IS_ERR(wtbl_hdr))
957
return PTR_ERR(wtbl_hdr);
958
959
mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx,
960
sta_wtbl, wtbl_hdr);
961
962
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
963
MCU_EXT_CMD(STA_REC_UPDATE), true);
964
}
965
966
static int
967
mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
968
struct ieee80211_ampdu_params *params,
969
bool enable)
970
{
971
return mt7615_mcu_sta_ba(dev, params, enable, true);
972
}
973
974
static int
975
mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
976
struct ieee80211_ampdu_params *params,
977
bool enable)
978
{
979
return mt7615_mcu_sta_ba(dev, params, enable, false);
980
}
981
982
static int
983
__mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
984
struct ieee80211_sta *sta, bool enable, int cmd,
985
bool offload_fw)
986
{
987
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
988
struct mt76_sta_cmd_info info = {
989
.sta = sta,
990
.vif = vif,
991
.offload_fw = offload_fw,
992
.enable = enable,
993
.newly = true,
994
.cmd = cmd,
995
};
996
997
info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
998
return mt76_connac_mcu_sta_cmd(phy, &info);
999
}
1000
1001
static int
1002
mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1003
struct ieee80211_sta *sta, bool enable)
1004
{
1005
return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1006
MCU_EXT_CMD(STA_REC_UPDATE), false);
1007
}
1008
1009
static int
1010
mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
1011
struct ieee80211_vif *vif,
1012
struct ieee80211_sta *sta)
1013
{
1014
struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1015
1016
return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
1017
vif, &msta->wcid,
1018
MCU_EXT_CMD(STA_REC_UPDATE));
1019
}
1020
1021
static const struct mt7615_mcu_ops sta_update_ops = {
1022
.add_beacon_offload = mt7615_mcu_add_beacon_offload,
1023
.set_pm_state = mt7615_mcu_ctrl_pm_state,
1024
.add_dev_info = mt7615_mcu_add_dev,
1025
.add_bss_info = mt7615_mcu_add_bss,
1026
.add_tx_ba = mt7615_mcu_sta_tx_ba,
1027
.add_rx_ba = mt7615_mcu_sta_rx_ba,
1028
.sta_add = mt7615_mcu_add_sta,
1029
.set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1030
.set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1031
.set_sta_decap_offload = mt7615_mcu_sta_update_hdr_trans,
1032
};
1033
1034
static int
1035
mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
1036
{
1037
return 0;
1038
}
1039
1040
static int
1041
mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
1042
struct ieee80211_hw *hw,
1043
struct ieee80211_vif *vif,
1044
bool enable)
1045
{
1046
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1047
struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1048
struct ieee80211_mutable_offsets offs;
1049
struct {
1050
struct req_hdr {
1051
u8 bss_idx;
1052
u8 pad[3];
1053
} __packed hdr;
1054
struct bcn_content_tlv {
1055
__le16 tag;
1056
__le16 len;
1057
__le16 tim_ie_pos;
1058
__le16 csa_ie_pos;
1059
__le16 bcc_ie_pos;
1060
/* 0: disable beacon offload
1061
* 1: enable beacon offload
1062
* 2: update probe respond offload
1063
*/
1064
u8 enable;
1065
/* 0: legacy format (TXD + payload)
1066
* 1: only cap field IE
1067
*/
1068
u8 type;
1069
__le16 pkt_len;
1070
u8 pkt[512];
1071
} __packed beacon_tlv;
1072
} req = {
1073
.hdr = {
1074
.bss_idx = mvif->mt76.idx,
1075
},
1076
.beacon_tlv = {
1077
.tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1078
.len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1079
.enable = enable,
1080
},
1081
};
1082
struct sk_buff *skb;
1083
1084
if (!enable)
1085
goto out;
1086
1087
skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs, 0);
1088
if (!skb)
1089
return -EINVAL;
1090
1091
if (skb->len > 512 - MT_TXD_SIZE) {
1092
dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1093
dev_kfree_skb(skb);
1094
return -EINVAL;
1095
}
1096
1097
mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
1098
wcid, NULL, 0, NULL, 0, true);
1099
memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1100
req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1101
req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1102
1103
if (offs.cntdwn_counter_offs[0]) {
1104
u16 csa_offs;
1105
1106
csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
1107
req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1108
}
1109
dev_kfree_skb(skb);
1110
1111
out:
1112
return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1113
&req, sizeof(req), true);
1114
}
1115
1116
static int
1117
mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1118
bool enable)
1119
{
1120
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1121
1122
return mt76_connac_mcu_uni_add_dev(phy->mt76, &vif->bss_conf, &mvif->mt76,
1123
&mvif->sta.wcid, enable);
1124
}
1125
1126
static int
1127
mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1128
struct ieee80211_sta *sta, bool enable)
1129
{
1130
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1131
1132
return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
1133
enable, NULL);
1134
}
1135
1136
static inline int
1137
mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1138
struct ieee80211_sta *sta, bool enable)
1139
{
1140
return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1141
MCU_UNI_CMD(STA_REC_UPDATE), true);
1142
}
1143
1144
static int
1145
mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
1146
struct ieee80211_ampdu_params *params,
1147
bool enable)
1148
{
1149
struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv;
1150
1151
return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params,
1152
MCU_UNI_CMD(STA_REC_UPDATE), enable,
1153
true);
1154
}
1155
1156
static int
1157
mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
1158
struct ieee80211_ampdu_params *params,
1159
bool enable)
1160
{
1161
struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1162
struct mt7615_vif *mvif = msta->vif;
1163
struct wtbl_req_hdr *wtbl_hdr;
1164
struct tlv *sta_wtbl;
1165
struct sk_buff *skb;
1166
int err;
1167
1168
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1169
&msta->wcid);
1170
if (IS_ERR(skb))
1171
return PTR_ERR(skb);
1172
1173
mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
1174
1175
err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1176
MCU_UNI_CMD(STA_REC_UPDATE), true);
1177
if (err < 0 || !enable)
1178
return err;
1179
1180
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1181
&msta->wcid);
1182
if (IS_ERR(skb))
1183
return PTR_ERR(skb);
1184
1185
sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1186
sizeof(struct tlv));
1187
1188
wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1189
WTBL_SET, sta_wtbl, &skb);
1190
if (IS_ERR(wtbl_hdr))
1191
return PTR_ERR(wtbl_hdr);
1192
1193
mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
1194
sta_wtbl, wtbl_hdr);
1195
1196
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1197
MCU_UNI_CMD(STA_REC_UPDATE), true);
1198
}
1199
1200
static int
1201
mt7615_mcu_sta_uni_update_hdr_trans(struct mt7615_dev *dev,
1202
struct ieee80211_vif *vif,
1203
struct ieee80211_sta *sta)
1204
{
1205
struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1206
1207
return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
1208
vif, &msta->wcid,
1209
MCU_UNI_CMD(STA_REC_UPDATE));
1210
}
1211
1212
static const struct mt7615_mcu_ops uni_update_ops = {
1213
.add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
1214
.set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
1215
.add_dev_info = mt7615_mcu_uni_add_dev,
1216
.add_bss_info = mt7615_mcu_uni_add_bss,
1217
.add_tx_ba = mt7615_mcu_uni_tx_ba,
1218
.add_rx_ba = mt7615_mcu_uni_rx_ba,
1219
.sta_add = mt7615_mcu_uni_add_sta,
1220
.set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
1221
.set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1222
.set_sta_decap_offload = mt7615_mcu_sta_uni_update_hdr_trans,
1223
};
1224
1225
int mt7615_mcu_restart(struct mt76_dev *dev)
1226
{
1227
return mt76_mcu_send_msg(dev, MCU_CMD(RESTART_DL_REQ), NULL, 0, true);
1228
}
1229
EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
1230
1231
static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
1232
{
1233
const struct mt7615_patch_hdr *hdr;
1234
const struct firmware *fw = NULL;
1235
int len, ret, sem;
1236
1237
ret = firmware_request_nowarn(&fw, name, dev->mt76.dev);
1238
if (ret)
1239
return ret;
1240
1241
if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
1242
dev_err(dev->mt76.dev, "Invalid firmware\n");
1243
ret = -EINVAL;
1244
goto release_fw;
1245
}
1246
1247
sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true);
1248
switch (sem) {
1249
case PATCH_IS_DL:
1250
goto release_fw;
1251
case PATCH_NOT_DL_SEM_SUCCESS:
1252
break;
1253
default:
1254
dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
1255
ret = -EAGAIN;
1256
goto release_fw;
1257
}
1258
1259
hdr = (const struct mt7615_patch_hdr *)(fw->data);
1260
1261
dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
1262
be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
1263
1264
len = fw->size - sizeof(*hdr);
1265
1266
ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1267
DL_MODE_NEED_RSP);
1268
if (ret) {
1269
dev_err(dev->mt76.dev, "Download request failed\n");
1270
goto out;
1271
}
1272
1273
ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1274
fw->data + sizeof(*hdr), len);
1275
if (ret) {
1276
dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1277
goto out;
1278
}
1279
1280
ret = mt76_connac_mcu_start_patch(&dev->mt76);
1281
if (ret)
1282
dev_err(dev->mt76.dev, "Failed to start patch\n");
1283
1284
out:
1285
sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
1286
switch (sem) {
1287
case PATCH_REL_SEM_SUCCESS:
1288
break;
1289
default:
1290
ret = -EAGAIN;
1291
dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
1292
break;
1293
}
1294
1295
release_fw:
1296
release_firmware(fw);
1297
1298
return ret;
1299
}
1300
1301
static int
1302
mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
1303
const struct mt7615_fw_trailer *hdr,
1304
const u8 *data, bool is_cr4)
1305
{
1306
int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
1307
int err, i, offset = 0;
1308
u32 len, addr, mode;
1309
1310
for (i = 0; i < n_region; i++) {
1311
mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
1312
hdr[i].feature_set, is_cr4);
1313
len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
1314
addr = le32_to_cpu(hdr[i].addr);
1315
1316
err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1317
mode);
1318
if (err) {
1319
dev_err(dev->mt76.dev, "Download request failed\n");
1320
return err;
1321
}
1322
1323
err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1324
data + offset, len);
1325
if (err) {
1326
dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1327
return err;
1328
}
1329
1330
offset += len;
1331
}
1332
1333
return 0;
1334
}
1335
1336
static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
1337
{
1338
const struct mt7615_fw_trailer *hdr;
1339
const struct firmware *fw;
1340
int ret;
1341
1342
ret = request_firmware(&fw, name, dev->mt76.dev);
1343
if (ret)
1344
return ret;
1345
1346
if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
1347
dev_err(dev->mt76.dev, "Invalid firmware\n");
1348
ret = -EINVAL;
1349
goto out;
1350
}
1351
1352
hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1353
N9_REGION_NUM * sizeof(*hdr));
1354
1355
dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1356
hdr->fw_ver, hdr->build_date);
1357
1358
ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
1359
if (ret)
1360
goto out;
1361
1362
ret = mt76_connac_mcu_start_firmware(&dev->mt76,
1363
le32_to_cpu(hdr->addr),
1364
FW_START_OVERRIDE);
1365
if (ret) {
1366
dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1367
goto out;
1368
}
1369
1370
snprintf(dev->mt76.hw->wiphy->fw_version,
1371
sizeof(dev->mt76.hw->wiphy->fw_version),
1372
"%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1373
1374
if (!is_mt7615(&dev->mt76)) {
1375
dev->fw_ver = MT7615_FIRMWARE_V2;
1376
dev->mcu_ops = &sta_update_ops;
1377
} else {
1378
dev->fw_ver = MT7615_FIRMWARE_V1;
1379
dev->mcu_ops = &wtbl_update_ops;
1380
}
1381
1382
out:
1383
release_firmware(fw);
1384
return ret;
1385
}
1386
1387
static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
1388
{
1389
const struct mt7615_fw_trailer *hdr;
1390
const struct firmware *fw;
1391
int ret;
1392
1393
ret = request_firmware(&fw, name, dev->mt76.dev);
1394
if (ret)
1395
return ret;
1396
1397
if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
1398
dev_err(dev->mt76.dev, "Invalid firmware\n");
1399
ret = -EINVAL;
1400
goto out;
1401
}
1402
1403
hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1404
CR4_REGION_NUM * sizeof(*hdr));
1405
1406
dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
1407
hdr->fw_ver, hdr->build_date);
1408
1409
ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
1410
if (ret)
1411
goto out;
1412
1413
ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
1414
FW_START_WORKING_PDA_CR4);
1415
if (ret) {
1416
dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
1417
goto out;
1418
}
1419
1420
out:
1421
release_firmware(fw);
1422
1423
return ret;
1424
}
1425
1426
static int mt7615_load_ram(struct mt7615_dev *dev)
1427
{
1428
int ret;
1429
1430
ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
1431
if (ret)
1432
return ret;
1433
1434
return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
1435
}
1436
1437
static int mt7615_load_firmware(struct mt7615_dev *dev)
1438
{
1439
int ret;
1440
u32 val;
1441
1442
val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
1443
1444
if (val != FW_STATE_FW_DOWNLOAD) {
1445
dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1446
return -EIO;
1447
}
1448
1449
ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
1450
if (ret)
1451
return ret;
1452
1453
ret = mt7615_load_ram(dev);
1454
if (ret)
1455
return ret;
1456
1457
if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
1458
FIELD_PREP(MT_TOP_MISC2_FW_STATE,
1459
FW_STATE_RDY), 500)) {
1460
dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1461
return -EIO;
1462
}
1463
1464
return 0;
1465
}
1466
1467
static int mt7622_load_firmware(struct mt7615_dev *dev)
1468
{
1469
int ret;
1470
u32 val;
1471
1472
mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1473
1474
val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
1475
if (val != FW_STATE_FW_DOWNLOAD) {
1476
dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1477
return -EIO;
1478
}
1479
1480
ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
1481
if (ret)
1482
return ret;
1483
1484
ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
1485
if (ret)
1486
return ret;
1487
1488
if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
1489
FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
1490
FW_STATE_NORMAL_TRX), 1500)) {
1491
dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1492
return -EIO;
1493
}
1494
1495
mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1496
1497
return 0;
1498
}
1499
1500
int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
1501
{
1502
struct {
1503
u8 ctrl_val;
1504
u8 pad[3];
1505
} data = {
1506
.ctrl_val = ctrl
1507
};
1508
1509
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST),
1510
&data, sizeof(data), true);
1511
}
1512
1513
static int mt7615_mcu_cal_cache_apply(struct mt7615_dev *dev)
1514
{
1515
struct {
1516
bool cache_enable;
1517
u8 pad[3];
1518
} data = {
1519
.cache_enable = true
1520
};
1521
1522
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(CAL_CACHE), &data,
1523
sizeof(data), false);
1524
}
1525
1526
static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
1527
{
1528
u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
1529
const struct mt76_connac2_fw_trailer *hdr;
1530
const struct mt7663_fw_buf *buf;
1531
const struct firmware *fw;
1532
const u8 *base_addr;
1533
int i, ret;
1534
1535
ret = request_firmware(&fw, name, dev->mt76.dev);
1536
if (ret)
1537
return ret;
1538
1539
if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
1540
dev_err(dev->mt76.dev, "Invalid firmware\n");
1541
ret = -EINVAL;
1542
goto out;
1543
}
1544
1545
hdr = (const void *)(fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE);
1546
dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1547
hdr->fw_ver, hdr->build_date);
1548
dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
1549
1550
base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
1551
for (i = 0; i < hdr->n_region; i++) {
1552
u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
1553
u32 len, addr, mode;
1554
1555
dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
1556
1557
buf = (const struct mt7663_fw_buf *)(base_addr - shift);
1558
mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
1559
buf->feature_set, false);
1560
addr = le32_to_cpu(buf->img_dest_addr);
1561
len = le32_to_cpu(buf->img_size);
1562
1563
ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1564
mode);
1565
if (ret) {
1566
dev_err(dev->mt76.dev, "Download request failed\n");
1567
goto out;
1568
}
1569
1570
ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1571
fw->data + offset, len);
1572
if (ret) {
1573
dev_err(dev->mt76.dev, "Failed to send firmware\n");
1574
goto out;
1575
}
1576
1577
offset += le32_to_cpu(buf->img_size);
1578
if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
1579
override_addr = le32_to_cpu(buf->img_dest_addr);
1580
dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
1581
i, override_addr);
1582
}
1583
}
1584
1585
if (override_addr)
1586
flag |= FW_START_OVERRIDE;
1587
1588
dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
1589
override_addr, flag);
1590
1591
ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
1592
if (ret) {
1593
dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1594
goto out;
1595
}
1596
1597
snprintf(dev->mt76.hw->wiphy->fw_version,
1598
sizeof(dev->mt76.hw->wiphy->fw_version),
1599
"%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1600
1601
out:
1602
release_firmware(fw);
1603
1604
return ret;
1605
}
1606
1607
static int
1608
mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
1609
{
1610
const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
1611
const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
1612
int ret;
1613
1614
if (!prefer_offload_fw) {
1615
secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
1616
primary_rom = MT7663_ROM_PATCH;
1617
}
1618
selected_rom = primary_rom;
1619
1620
ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
1621
if (ret) {
1622
dev_info(dev->mt76.dev, "%s not found, switching to %s",
1623
primary_rom, secondary_rom);
1624
ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
1625
secondary_rom);
1626
if (ret) {
1627
dev_err(dev->mt76.dev, "failed to load %s",
1628
secondary_rom);
1629
return ret;
1630
}
1631
selected_rom = secondary_rom;
1632
}
1633
1634
if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
1635
*n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
1636
dev->fw_ver = MT7615_FIRMWARE_V3;
1637
dev->mcu_ops = &uni_update_ops;
1638
} else {
1639
*n9_firmware = MT7663_FIRMWARE_N9;
1640
dev->fw_ver = MT7615_FIRMWARE_V2;
1641
dev->mcu_ops = &sta_update_ops;
1642
}
1643
1644
return 0;
1645
}
1646
1647
int __mt7663_load_firmware(struct mt7615_dev *dev)
1648
{
1649
const char *n9_firmware;
1650
int ret;
1651
1652
ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
1653
if (ret) {
1654
dev_dbg(dev->mt76.dev, "Firmware is already download\n");
1655
return -EIO;
1656
}
1657
1658
ret = mt7663_load_rom_patch(dev, &n9_firmware);
1659
if (ret)
1660
return ret;
1661
1662
ret = mt7663_load_n9(dev, n9_firmware);
1663
if (ret)
1664
return ret;
1665
1666
if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
1667
MT_TOP_MISC2_FW_N9_RDY, 1500)) {
1668
ret = mt76_get_field(dev, MT_CONN_ON_MISC,
1669
MT7663_TOP_MISC2_FW_STATE);
1670
dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1671
return -EIO;
1672
}
1673
1674
#ifdef CONFIG_PM
1675
if (mt7615_firmware_offload(dev))
1676
dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
1677
#endif /* CONFIG_PM */
1678
1679
dev_dbg(dev->mt76.dev, "Firmware init done\n");
1680
1681
return 0;
1682
}
1683
EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
1684
1685
static int mt7663_load_firmware(struct mt7615_dev *dev)
1686
{
1687
int ret;
1688
1689
mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1690
1691
ret = __mt7663_load_firmware(dev);
1692
if (ret)
1693
return ret;
1694
1695
mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1696
1697
return 0;
1698
}
1699
1700
int mt7615_mcu_init(struct mt7615_dev *dev)
1701
{
1702
static const struct mt76_mcu_ops mt7615_mcu_ops = {
1703
.headroom = sizeof(struct mt7615_mcu_txd),
1704
.mcu_skb_send_msg = mt7615_mcu_send_message,
1705
.mcu_parse_response = mt7615_mcu_parse_response,
1706
};
1707
int ret;
1708
1709
dev->mt76.mcu_ops = &mt7615_mcu_ops;
1710
1711
ret = mt7615_mcu_drv_pmctrl(dev);
1712
if (ret)
1713
return ret;
1714
1715
switch (mt76_chip(&dev->mt76)) {
1716
case 0x7622:
1717
ret = mt7622_load_firmware(dev);
1718
break;
1719
case 0x7663:
1720
ret = mt7663_load_firmware(dev);
1721
break;
1722
default:
1723
ret = mt7615_load_firmware(dev);
1724
break;
1725
}
1726
if (ret)
1727
return ret;
1728
1729
mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
1730
dev_dbg(dev->mt76.dev, "Firmware init done\n");
1731
set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
1732
1733
if (dev->dbdc_support) {
1734
ret = mt7615_mcu_cal_cache_apply(dev);
1735
if (ret)
1736
return ret;
1737
}
1738
1739
return mt7615_mcu_fw_log_2_host(dev, 0);
1740
}
1741
EXPORT_SYMBOL_GPL(mt7615_mcu_init);
1742
1743
void mt7615_mcu_exit(struct mt7615_dev *dev)
1744
{
1745
mt7615_mcu_restart(&dev->mt76);
1746
mt7615_mcu_set_fw_ctrl(dev);
1747
skb_queue_purge(&dev->mt76.mcu.res_q);
1748
}
1749
EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
1750
1751
int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
1752
{
1753
struct {
1754
u8 buffer_mode;
1755
u8 content_format;
1756
__le16 len;
1757
} __packed req_hdr = {
1758
.buffer_mode = 1,
1759
};
1760
u8 *eep = (u8 *)dev->mt76.eeprom.data;
1761
struct sk_buff *skb;
1762
int eep_len, offset;
1763
1764
switch (mt76_chip(&dev->mt76)) {
1765
case 0x7622:
1766
eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
1767
offset = MT_EE_NIC_CONF_0;
1768
break;
1769
case 0x7663:
1770
eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
1771
req_hdr.content_format = 1;
1772
offset = MT_EE_CHIP_ID;
1773
break;
1774
default:
1775
eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
1776
offset = MT_EE_NIC_CONF_0;
1777
break;
1778
}
1779
1780
req_hdr.len = cpu_to_le16(eep_len);
1781
1782
skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
1783
if (!skb)
1784
return -ENOMEM;
1785
1786
skb_put_data(skb, &req_hdr, sizeof(req_hdr));
1787
skb_put_data(skb, eep + offset, eep_len);
1788
1789
return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1790
MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
1791
}
1792
1793
int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
1794
const struct ieee80211_tx_queue_params *params)
1795
{
1796
#define WMM_AIFS_SET BIT(0)
1797
#define WMM_CW_MIN_SET BIT(1)
1798
#define WMM_CW_MAX_SET BIT(2)
1799
#define WMM_TXOP_SET BIT(3)
1800
#define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
1801
WMM_CW_MAX_SET | WMM_TXOP_SET)
1802
struct req_data {
1803
u8 number;
1804
u8 rsv[3];
1805
u8 queue;
1806
u8 valid;
1807
u8 aifs;
1808
u8 cw_min;
1809
__le16 cw_max;
1810
__le16 txop;
1811
} __packed req = {
1812
.number = 1,
1813
.queue = queue,
1814
.valid = WMM_PARAM_SET,
1815
.aifs = params->aifs,
1816
.cw_min = 5,
1817
.cw_max = cpu_to_le16(10),
1818
.txop = cpu_to_le16(params->txop),
1819
};
1820
1821
if (params->cw_min)
1822
req.cw_min = fls(params->cw_min);
1823
if (params->cw_max)
1824
req.cw_max = cpu_to_le16(fls(params->cw_max));
1825
1826
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE),
1827
&req, sizeof(req), true);
1828
}
1829
1830
int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
1831
{
1832
struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
1833
struct dbdc_entry {
1834
u8 type;
1835
u8 index;
1836
u8 band;
1837
u8 _rsv;
1838
};
1839
struct {
1840
u8 enable;
1841
u8 num;
1842
u8 _rsv[2];
1843
struct dbdc_entry entry[64];
1844
} req = {
1845
.enable = !!ext_phy,
1846
};
1847
int i;
1848
1849
if (!ext_phy)
1850
goto out;
1851
1852
#define ADD_DBDC_ENTRY(_type, _idx, _band) \
1853
do { \
1854
req.entry[req.num].type = _type; \
1855
req.entry[req.num].index = _idx; \
1856
req.entry[req.num++].band = _band; \
1857
} while (0)
1858
1859
for (i = 0; i < 4; i++) {
1860
bool band = !!(ext_phy->omac_mask & BIT_ULL(i));
1861
1862
ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
1863
}
1864
1865
for (i = 0; i < 14; i++) {
1866
bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i));
1867
1868
ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
1869
}
1870
1871
ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
1872
1873
for (i = 0; i < 3; i++)
1874
ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
1875
1876
ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
1877
ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
1878
ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
1879
ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
1880
1881
ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
1882
ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
1883
1884
out:
1885
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DBDC_CTRL), &req,
1886
sizeof(req), true);
1887
}
1888
1889
int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
1890
{
1891
struct {
1892
__le16 tag;
1893
__le16 min_lpn;
1894
} req = {
1895
.tag = cpu_to_le16(0x1),
1896
.min_lpn = cpu_to_le16(val),
1897
};
1898
1899
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
1900
&req, sizeof(req), true);
1901
}
1902
1903
int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
1904
const struct mt7615_dfs_pulse *pulse)
1905
{
1906
struct {
1907
__le16 tag;
1908
__le32 max_width; /* us */
1909
__le32 max_pwr; /* dbm */
1910
__le32 min_pwr; /* dbm */
1911
__le32 min_stgr_pri; /* us */
1912
__le32 max_stgr_pri; /* us */
1913
__le32 min_cr_pri; /* us */
1914
__le32 max_cr_pri; /* us */
1915
} req = {
1916
.tag = cpu_to_le16(0x3),
1917
#define __req_field(field) .field = cpu_to_le32(pulse->field)
1918
__req_field(max_width),
1919
__req_field(max_pwr),
1920
__req_field(min_pwr),
1921
__req_field(min_stgr_pri),
1922
__req_field(max_stgr_pri),
1923
__req_field(min_cr_pri),
1924
__req_field(max_cr_pri),
1925
#undef __req_field
1926
};
1927
1928
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
1929
&req, sizeof(req), true);
1930
}
1931
1932
int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
1933
const struct mt7615_dfs_pattern *pattern)
1934
{
1935
struct {
1936
__le16 tag;
1937
__le16 radar_type;
1938
u8 enb;
1939
u8 stgr;
1940
u8 min_crpn;
1941
u8 max_crpn;
1942
u8 min_crpr;
1943
u8 min_pw;
1944
u8 max_pw;
1945
__le32 min_pri;
1946
__le32 max_pri;
1947
u8 min_crbn;
1948
u8 max_crbn;
1949
u8 min_stgpn;
1950
u8 max_stgpn;
1951
u8 min_stgpr;
1952
} req = {
1953
.tag = cpu_to_le16(0x2),
1954
.radar_type = cpu_to_le16(index),
1955
#define __req_field_u8(field) .field = pattern->field
1956
#define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
1957
__req_field_u8(enb),
1958
__req_field_u8(stgr),
1959
__req_field_u8(min_crpn),
1960
__req_field_u8(max_crpn),
1961
__req_field_u8(min_crpr),
1962
__req_field_u8(min_pw),
1963
__req_field_u8(max_pw),
1964
__req_field_u32(min_pri),
1965
__req_field_u32(max_pri),
1966
__req_field_u8(min_crbn),
1967
__req_field_u8(max_crbn),
1968
__req_field_u8(min_stgpn),
1969
__req_field_u8(max_stgpn),
1970
__req_field_u8(min_stgpr),
1971
#undef __req_field_u8
1972
#undef __req_field_u32
1973
};
1974
1975
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
1976
&req, sizeof(req), true);
1977
}
1978
1979
int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
1980
{
1981
struct {
1982
u8 pulse_num;
1983
u8 rsv[3];
1984
struct {
1985
__le32 start_time;
1986
__le16 width;
1987
__le16 power;
1988
} pattern[32];
1989
} req = {
1990
.pulse_num = dev->radar_pattern.n_pulses,
1991
};
1992
u32 start_time = ktime_to_ms(ktime_get_boottime());
1993
int i;
1994
1995
if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
1996
return -EINVAL;
1997
1998
/* TODO: add some noise here */
1999
for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2000
u32 ts = start_time + i * dev->radar_pattern.period;
2001
2002
req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width);
2003
req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power);
2004
req.pattern[i].start_time = cpu_to_le32(ts);
2005
}
2006
2007
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_PATTERN),
2008
&req, sizeof(req), false);
2009
}
2010
2011
static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2012
{
2013
struct mt76_phy *mphy = phy->mt76;
2014
struct ieee80211_hw *hw = mphy->hw;
2015
struct mt76_power_limits limits;
2016
s8 *limits_array = (s8 *)&limits;
2017
int n_chains = hweight8(mphy->antenna_mask);
2018
int tx_power = hw->conf.power_level * 2;
2019
int i;
2020
static const u8 sku_mapping[] = {
2021
#define SKU_FIELD(_type, _field) \
2022
[MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field)
2023
SKU_FIELD(CCK_1_2, cck[0]),
2024
SKU_FIELD(CCK_55_11, cck[2]),
2025
SKU_FIELD(OFDM_6_9, ofdm[0]),
2026
SKU_FIELD(OFDM_12_18, ofdm[2]),
2027
SKU_FIELD(OFDM_24_36, ofdm[4]),
2028
SKU_FIELD(OFDM_48, ofdm[6]),
2029
SKU_FIELD(OFDM_54, ofdm[7]),
2030
SKU_FIELD(HT20_0_8, mcs[0][0]),
2031
SKU_FIELD(HT20_32, ofdm[0]),
2032
SKU_FIELD(HT20_1_2_9_10, mcs[0][1]),
2033
SKU_FIELD(HT20_3_4_11_12, mcs[0][3]),
2034
SKU_FIELD(HT20_5_13, mcs[0][5]),
2035
SKU_FIELD(HT20_6_14, mcs[0][6]),
2036
SKU_FIELD(HT20_7_15, mcs[0][7]),
2037
SKU_FIELD(HT40_0_8, mcs[1][0]),
2038
SKU_FIELD(HT40_32, ofdm[0]),
2039
SKU_FIELD(HT40_1_2_9_10, mcs[1][1]),
2040
SKU_FIELD(HT40_3_4_11_12, mcs[1][3]),
2041
SKU_FIELD(HT40_5_13, mcs[1][5]),
2042
SKU_FIELD(HT40_6_14, mcs[1][6]),
2043
SKU_FIELD(HT40_7_15, mcs[1][7]),
2044
SKU_FIELD(VHT20_0, mcs[0][0]),
2045
SKU_FIELD(VHT20_1_2, mcs[0][1]),
2046
SKU_FIELD(VHT20_3_4, mcs[0][3]),
2047
SKU_FIELD(VHT20_5_6, mcs[0][5]),
2048
SKU_FIELD(VHT20_7, mcs[0][7]),
2049
SKU_FIELD(VHT20_8, mcs[0][8]),
2050
SKU_FIELD(VHT20_9, mcs[0][9]),
2051
SKU_FIELD(VHT40_0, mcs[1][0]),
2052
SKU_FIELD(VHT40_1_2, mcs[1][1]),
2053
SKU_FIELD(VHT40_3_4, mcs[1][3]),
2054
SKU_FIELD(VHT40_5_6, mcs[1][5]),
2055
SKU_FIELD(VHT40_7, mcs[1][7]),
2056
SKU_FIELD(VHT40_8, mcs[1][8]),
2057
SKU_FIELD(VHT40_9, mcs[1][9]),
2058
SKU_FIELD(VHT80_0, mcs[2][0]),
2059
SKU_FIELD(VHT80_1_2, mcs[2][1]),
2060
SKU_FIELD(VHT80_3_4, mcs[2][3]),
2061
SKU_FIELD(VHT80_5_6, mcs[2][5]),
2062
SKU_FIELD(VHT80_7, mcs[2][7]),
2063
SKU_FIELD(VHT80_8, mcs[2][8]),
2064
SKU_FIELD(VHT80_9, mcs[2][9]),
2065
SKU_FIELD(VHT160_0, mcs[3][0]),
2066
SKU_FIELD(VHT160_1_2, mcs[3][1]),
2067
SKU_FIELD(VHT160_3_4, mcs[3][3]),
2068
SKU_FIELD(VHT160_5_6, mcs[3][5]),
2069
SKU_FIELD(VHT160_7, mcs[3][7]),
2070
SKU_FIELD(VHT160_8, mcs[3][8]),
2071
SKU_FIELD(VHT160_9, mcs[3][9]),
2072
#undef SKU_FIELD
2073
};
2074
2075
tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan, tx_power);
2076
tx_power -= mt76_tx_power_path_delta(n_chains);
2077
tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
2078
&limits, tx_power);
2079
mphy->txpower_cur = tx_power;
2080
2081
if (is_mt7663(mphy->dev)) {
2082
memset(sku, tx_power, MT_SKU_4SS_DELTA + 1);
2083
return;
2084
}
2085
2086
for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2087
sku[i] = limits_array[sku_mapping[i]];
2088
2089
for (i = 0; i < 4; i++) {
2090
int delta = 0;
2091
2092
if (i < n_chains - 1)
2093
delta = mt76_tx_power_path_delta(n_chains) -
2094
mt76_tx_power_path_delta(i + 1);
2095
sku[MT_SKU_1SS_DELTA + i] = delta;
2096
}
2097
}
2098
2099
static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2100
{
2101
static const u8 width_to_bw[] = {
2102
[NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2103
[NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2104
[NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2105
[NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2106
[NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2107
[NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2108
[NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2109
[NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2110
};
2111
2112
if (chandef->width >= ARRAY_SIZE(width_to_bw))
2113
return 0;
2114
2115
return width_to_bw[chandef->width];
2116
}
2117
2118
int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2119
{
2120
struct mt7615_dev *dev = phy->dev;
2121
struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2122
int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2123
struct {
2124
u8 control_chan;
2125
u8 center_chan;
2126
u8 bw;
2127
u8 tx_streams;
2128
u8 rx_streams_mask;
2129
u8 switch_reason;
2130
u8 band_idx;
2131
/* for 80+80 only */
2132
u8 center_chan2;
2133
__le16 cac_case;
2134
u8 channel_band;
2135
u8 rsv0;
2136
__le32 outband_freq;
2137
u8 txpower_drop;
2138
u8 rsv1[3];
2139
u8 txpower_sku[53];
2140
u8 rsv2[3];
2141
} req = {
2142
.control_chan = chandef->chan->hw_value,
2143
.center_chan = ieee80211_frequency_to_channel(freq1),
2144
.tx_streams = hweight8(phy->mt76->antenna_mask),
2145
.rx_streams_mask = phy->mt76->chainmask,
2146
.center_chan2 = ieee80211_frequency_to_channel(freq2),
2147
};
2148
2149
if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
2150
phy->mt76->hw->conf.flags & IEEE80211_CONF_MONITOR)
2151
req.switch_reason = CH_SWITCH_NORMAL;
2152
else if (phy->mt76->offchannel)
2153
req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2154
else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
2155
NL80211_IFTYPE_AP))
2156
req.switch_reason = CH_SWITCH_DFS;
2157
else
2158
req.switch_reason = CH_SWITCH_NORMAL;
2159
2160
req.band_idx = phy != &dev->phy;
2161
req.bw = mt7615_mcu_chan_bw(chandef);
2162
2163
if (mt76_testmode_enabled(phy->mt76))
2164
memset(req.txpower_sku, 0x3f, 49);
2165
else
2166
mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2167
2168
return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2169
}
2170
2171
int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
2172
{
2173
struct {
2174
u8 action;
2175
u8 rsv[3];
2176
} req = {};
2177
2178
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL),
2179
&req, sizeof(req), true);
2180
}
2181
2182
int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
2183
u32 val)
2184
{
2185
struct {
2186
u8 test_mode_en;
2187
u8 param_idx;
2188
u8 _rsv[2];
2189
2190
__le32 value;
2191
2192
u8 pad[8];
2193
} req = {
2194
.test_mode_en = test_mode,
2195
.param_idx = param,
2196
.value = cpu_to_le32(val),
2197
};
2198
2199
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL),
2200
&req, sizeof(req), false);
2201
}
2202
2203
int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2204
{
2205
struct mt7615_dev *dev = phy->dev;
2206
struct {
2207
u8 format_id;
2208
u8 sku_enable;
2209
u8 band_idx;
2210
u8 rsv;
2211
} req = {
2212
.format_id = 0,
2213
.band_idx = phy != &dev->phy,
2214
.sku_enable = enable,
2215
};
2216
2217
return mt76_mcu_send_msg(&dev->mt76,
2218
MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
2219
&req, sizeof(req), true);
2220
}
2221
2222
static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
2223
{
2224
int i;
2225
2226
for (i = 0; i < n_freqs; i++)
2227
if (cur == freqs[i])
2228
return i;
2229
2230
return -1;
2231
}
2232
2233
static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
2234
{
2235
static const u16 freq_list[] = {
2236
4980, 5805, 5905, 5190,
2237
5230, 5270, 5310, 5350,
2238
5390, 5430, 5470, 5510,
2239
5550, 5590, 5630, 5670,
2240
5710, 5755, 5795, 5835,
2241
5875, 5210, 5290, 5370,
2242
5450, 5530, 5610, 5690,
2243
5775, 5855
2244
};
2245
static const u16 freq_bw40[] = {
2246
5190, 5230, 5270, 5310,
2247
5350, 5390, 5430, 5470,
2248
5510, 5550, 5590, 5630,
2249
5670, 5710, 5755, 5795,
2250
5835, 5875
2251
};
2252
int offset_2g = ARRAY_SIZE(freq_list);
2253
int idx;
2254
2255
if (freq < 4000) {
2256
if (freq < 2427)
2257
return offset_2g;
2258
if (freq < 2442)
2259
return offset_2g + 1;
2260
if (freq < 2457)
2261
return offset_2g + 2;
2262
2263
return offset_2g + 3;
2264
}
2265
2266
switch (bw) {
2267
case NL80211_CHAN_WIDTH_80:
2268
case NL80211_CHAN_WIDTH_80P80:
2269
case NL80211_CHAN_WIDTH_160:
2270
break;
2271
default:
2272
idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2273
freq + 10);
2274
if (idx >= 0) {
2275
freq = freq_bw40[idx];
2276
break;
2277
}
2278
2279
idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2280
freq - 10);
2281
if (idx >= 0) {
2282
freq = freq_bw40[idx];
2283
break;
2284
}
2285
fallthrough;
2286
case NL80211_CHAN_WIDTH_40:
2287
idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2288
freq);
2289
if (idx >= 0)
2290
break;
2291
2292
return -1;
2293
2294
}
2295
2296
return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2297
}
2298
2299
int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
2300
{
2301
struct mt7615_dev *dev = phy->dev;
2302
struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2303
int freq2 = chandef->center_freq2;
2304
int ret;
2305
struct {
2306
u8 direction;
2307
u8 runtime_calibration;
2308
u8 _rsv[2];
2309
2310
__le16 center_freq;
2311
u8 bw;
2312
u8 band;
2313
u8 is_freq2;
2314
u8 success;
2315
u8 dbdc_en;
2316
2317
u8 _rsv2;
2318
2319
struct {
2320
__le32 sx0_i_lna[4];
2321
__le32 sx0_q_lna[4];
2322
2323
__le32 sx2_i_lna[4];
2324
__le32 sx2_q_lna[4];
2325
} dcoc_data[4];
2326
} req = {
2327
.direction = 1,
2328
2329
.bw = mt7615_mcu_chan_bw(chandef),
2330
.band = chandef->center_freq1 > 4000,
2331
.dbdc_en = !!dev->mt76.phys[MT_BAND1],
2332
};
2333
u16 center_freq = chandef->center_freq1;
2334
int freq_idx;
2335
u8 *eep = dev->mt76.eeprom.data;
2336
2337
if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
2338
return 0;
2339
2340
if (chandef->width == NL80211_CHAN_WIDTH_160) {
2341
freq2 = center_freq + 40;
2342
center_freq -= 40;
2343
}
2344
2345
again:
2346
req.runtime_calibration = 1;
2347
freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
2348
if (freq_idx < 0)
2349
goto out;
2350
2351
memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
2352
freq_idx * MT7615_EEPROM_DCOC_SIZE,
2353
sizeof(req.dcoc_data));
2354
req.runtime_calibration = 0;
2355
2356
out:
2357
req.center_freq = cpu_to_le16(center_freq);
2358
ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RXDCOC_CAL), &req,
2359
sizeof(req), true);
2360
2361
if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2362
chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2363
req.is_freq2 = true;
2364
center_freq = freq2;
2365
goto again;
2366
}
2367
2368
return ret;
2369
}
2370
2371
static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
2372
{
2373
static const u16 freq_list[] = {
2374
4920, 4940, 4960, 4980,
2375
5040, 5060, 5080, 5180,
2376
5200, 5220, 5240, 5260,
2377
5280, 5300, 5320, 5340,
2378
5360, 5380, 5400, 5420,
2379
5440, 5460, 5480, 5500,
2380
5520, 5540, 5560, 5580,
2381
5600, 5620, 5640, 5660,
2382
5680, 5700, 5720, 5745,
2383
5765, 5785, 5805, 5825,
2384
5845, 5865, 5885, 5905
2385
};
2386
int offset_2g = ARRAY_SIZE(freq_list);
2387
int idx;
2388
2389
if (freq < 4000) {
2390
if (freq < 2432)
2391
return offset_2g;
2392
if (freq < 2457)
2393
return offset_2g + 1;
2394
2395
return offset_2g + 2;
2396
}
2397
2398
if (bw != NL80211_CHAN_WIDTH_20) {
2399
idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2400
freq + 10);
2401
if (idx >= 0)
2402
return idx;
2403
2404
idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2405
freq - 10);
2406
if (idx >= 0)
2407
return idx;
2408
}
2409
2410
return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2411
}
2412
2413
2414
int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
2415
{
2416
struct mt7615_dev *dev = phy->dev;
2417
struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2418
int freq2 = chandef->center_freq2;
2419
int ret;
2420
struct {
2421
u8 direction;
2422
u8 runtime_calibration;
2423
u8 _rsv[2];
2424
2425
__le16 center_freq;
2426
u8 bw;
2427
u8 band;
2428
u8 is_freq2;
2429
u8 success;
2430
u8 dbdc_en;
2431
2432
u8 _rsv2;
2433
2434
struct {
2435
struct {
2436
u32 dpd_g0;
2437
u8 data[32];
2438
} wf0, wf1;
2439
2440
struct {
2441
u32 dpd_g0_prim;
2442
u32 dpd_g0_sec;
2443
u8 data_prim[32];
2444
u8 data_sec[32];
2445
} wf2, wf3;
2446
} dpd_data;
2447
} req = {
2448
.direction = 1,
2449
2450
.bw = mt7615_mcu_chan_bw(chandef),
2451
.band = chandef->center_freq1 > 4000,
2452
.dbdc_en = !!dev->mt76.phys[MT_BAND1],
2453
};
2454
u16 center_freq = chandef->center_freq1;
2455
int freq_idx;
2456
u8 *eep = dev->mt76.eeprom.data;
2457
2458
if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
2459
return 0;
2460
2461
if (chandef->width == NL80211_CHAN_WIDTH_160) {
2462
freq2 = center_freq + 40;
2463
center_freq -= 40;
2464
}
2465
2466
again:
2467
req.runtime_calibration = 1;
2468
freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
2469
if (freq_idx < 0)
2470
goto out;
2471
2472
memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
2473
freq_idx * MT7615_EEPROM_TXDPD_SIZE,
2474
sizeof(req.dpd_data));
2475
req.runtime_calibration = 0;
2476
2477
out:
2478
req.center_freq = cpu_to_le16(center_freq);
2479
ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXDPD_CAL),
2480
&req, sizeof(req), true);
2481
2482
if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2483
chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2484
req.is_freq2 = true;
2485
center_freq = freq2;
2486
goto again;
2487
}
2488
2489
return ret;
2490
}
2491
2492
int mt7615_mcu_set_rx_hdr_trans_blacklist(struct mt7615_dev *dev)
2493
{
2494
struct {
2495
u8 operation;
2496
u8 count;
2497
u8 _rsv[2];
2498
u8 index;
2499
u8 enable;
2500
__le16 etype;
2501
} req = {
2502
.operation = 1,
2503
.count = 1,
2504
.enable = 1,
2505
.etype = cpu_to_le16(ETH_P_PAE),
2506
};
2507
2508
return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2509
&req, sizeof(req), false);
2510
}
2511
2512
int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
2513
bool enable)
2514
{
2515
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2516
struct {
2517
u8 bss_idx;
2518
u8 dtim_period;
2519
__le16 aid;
2520
__le16 bcn_interval;
2521
__le16 atim_window;
2522
u8 uapsd;
2523
u8 bmc_delivered_ac;
2524
u8 bmc_triggered_ac;
2525
u8 pad;
2526
} req = {
2527
.bss_idx = mvif->mt76.idx,
2528
.aid = cpu_to_le16(vif->cfg.aid),
2529
.dtim_period = vif->bss_conf.dtim_period,
2530
.bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
2531
};
2532
struct {
2533
u8 bss_idx;
2534
u8 pad[3];
2535
} req_hdr = {
2536
.bss_idx = mvif->mt76.idx,
2537
};
2538
int err;
2539
2540
if (vif->type != NL80211_IFTYPE_STATION)
2541
return 0;
2542
2543
err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT),
2544
&req_hdr, sizeof(req_hdr), false);
2545
if (err < 0 || !enable)
2546
return err;
2547
2548
return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_CONNECTED),
2549
&req, sizeof(req), false);
2550
}
2551
2552
int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2553
struct ieee80211_channel *chan, int duration)
2554
{
2555
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2556
struct mt7615_dev *dev = phy->dev;
2557
struct mt7615_roc_tlv req = {
2558
.bss_idx = mvif->mt76.idx,
2559
.active = !chan,
2560
.max_interval = cpu_to_le32(duration),
2561
.primary_chan = chan ? chan->hw_value : 0,
2562
.band = chan ? chan->band : 0,
2563
.req_type = 2,
2564
};
2565
2566
phy->roc_grant = false;
2567
2568
return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_ROC),
2569
&req, sizeof(req), false);
2570
}
2571
2572