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