1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2019 MediaTek Inc.
4 * Author: Roy Luo <royluo@google.com>
5 * Ryder Lee <ryder.lee@mediatek.com>
8 #include <linux/firmware.h>
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)");
19 struct mt7615_patch_hdr {
27 struct mt7615_fw_trailer {
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)
43 struct mt7663_fw_trailer {
55 struct mt7663_fw_buf {
65 #define MT7615_PATCH_ADDRESS 0x80000
66 #define MT7622_PATCH_ADDRESS 0x9c000
67 #define MT7663_PATCH_ADDRESS 0xdc000
69 #define N9_REGION_NUM 2
70 #define CR4_REGION_NUM 1
74 #define FW_FEATURE_SET_ENCRYPT BIT(0)
75 #define FW_FEATURE_SET_KEY_IDX GENMASK(2, 1)
77 #define DL_MODE_ENCRYPT BIT(0)
78 #define DL_MODE_KEY_IDX GENMASK(2, 1)
79 #define DL_MODE_RESET_SEC_IV BIT(3)
80 #define DL_MODE_WORKING_PDA_CR4 BIT(4)
81 #define DL_MODE_VALID_RAM_ENTRY BIT(5)
82 #define DL_MODE_NEED_RSP BIT(31)
84 #define FW_START_OVERRIDE BIT(0)
85 #define FW_START_WORKING_PDA_CR4 BIT(2)
87 void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
88 int cmd, int *wait_seq)
90 int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
91 struct mt7615_uni_txd *uni_txd;
92 struct mt7615_mcu_txd *mcu_txd;
93 u8 seq, q_idx, pkt_fmt;
97 /* TODO: make dynamic based on msg type */
98 dev->mt76.mcu.timeout = 20 * HZ;
100 seq = ++dev->mt76.mcu.msg_seq & 0xf;
102 seq = ++dev->mt76.mcu.msg_seq & 0xf;
106 txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
107 txd = (__le32 *)skb_push(skb, txd_len);
109 if (cmd != MCU_CMD(FW_SCATTER)) {
110 q_idx = MT_TX_MCU_PORT_RX_Q0;
111 pkt_fmt = MT_TX_TYPE_CMD;
113 q_idx = MT_TX_MCU_PORT_RX_FWDL;
114 pkt_fmt = MT_TX_TYPE_FW;
117 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
118 FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
119 FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
120 txd[0] = cpu_to_le32(val);
122 val = MT_TXD1_LONG_FORMAT |
123 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) |
124 FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt);
125 txd[1] = cpu_to_le32(val);
127 if (cmd & __MCU_CMD_FIELD_UNI) {
128 uni_txd = (struct mt7615_uni_txd *)txd;
129 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
130 uni_txd->option = MCU_CMD_UNI_EXT_ACK;
131 uni_txd->cid = cpu_to_le16(mcu_cmd);
132 uni_txd->s2d_index = MCU_S2D_H2N;
133 uni_txd->pkt_type = MCU_PKT_ID;
139 mcu_txd = (struct mt7615_mcu_txd *)txd;
140 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
141 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx));
142 mcu_txd->s2d_index = MCU_S2D_H2N;
143 mcu_txd->pkt_type = MCU_PKT_ID;
145 mcu_txd->cid = mcu_cmd;
146 mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
148 if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
149 if (cmd & __MCU_CMD_FIELD_QUERY)
150 mcu_txd->set_query = MCU_Q_QUERY;
152 mcu_txd->set_query = MCU_Q_SET;
153 mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
155 mcu_txd->set_query = MCU_Q_NA;
158 EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg);
160 int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
161 struct sk_buff *skb, int seq)
163 struct mt7615_mcu_rxd *rxd;
167 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
172 rxd = (struct mt7615_mcu_rxd *)skb->data;
176 if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
177 skb_pull(skb, sizeof(*rxd) - 4);
179 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
180 skb_pull(skb, sizeof(*rxd));
181 ret = le32_to_cpu(*(__le32 *)skb->data);
182 } else if (cmd == MCU_EXT_QUERY(RF_REG_ACCESS)) {
183 skb_pull(skb, sizeof(*rxd));
184 ret = le32_to_cpu(*(__le32 *)&skb->data[8]);
185 } else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
186 cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
187 cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
188 cmd == MCU_UNI_CMD(HIF_CTRL) ||
189 cmd == MCU_UNI_CMD(OFFLOAD) ||
190 cmd == MCU_UNI_CMD(SUSPEND)) {
191 struct mt7615_mcu_uni_event *event;
193 skb_pull(skb, sizeof(*rxd));
194 event = (struct mt7615_mcu_uni_event *)skb->data;
195 ret = le32_to_cpu(event->status);
196 } else if (cmd == MCU_CE_QUERY(REG_READ)) {
197 struct mt7615_mcu_reg_event *event;
199 skb_pull(skb, sizeof(*rxd));
200 event = (struct mt7615_mcu_reg_event *)skb->data;
201 ret = (int)le32_to_cpu(event->val);
206 EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
209 mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
212 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
213 enum mt76_mcuq_id qid;
215 mt7615_mcu_fill_msg(dev, skb, cmd, seq);
216 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
221 return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0);
224 u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
231 .wifi_stream = cpu_to_le32(wf),
232 .address = cpu_to_le32(reg),
235 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS),
236 &req, sizeof(req), true);
239 int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val)
246 .wifi_stream = cpu_to_le32(wf),
247 .address = cpu_to_le32(reg),
248 .data = cpu_to_le32(val),
251 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS),
252 &req, sizeof(req), false);
255 void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
257 if (!is_mt7622(&dev->mt76))
260 regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
261 MT_INFRACFG_MISC_AP2CONN_WAKE,
262 !en * MT_INFRACFG_MISC_AP2CONN_WAKE);
264 EXPORT_SYMBOL_GPL(mt7622_trigger_hif_int);
266 static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
268 struct mt76_phy *mphy = &dev->mt76.phy;
269 struct mt76_connac_pm *pm = &dev->pm;
270 struct mt76_dev *mdev = &dev->mt76;
274 if (is_mt7663(mdev)) {
275 /* Clear firmware own via N9 eint */
276 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
277 mt76_poll(dev, MT_CONN_ON_MISC, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
279 addr = MT_CONN_HIF_ON_LPCTL;
281 addr = MT_CFG_LPCR_HOST;
284 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
286 mt7622_trigger_hif_int(dev, true);
288 err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
290 mt7622_trigger_hif_int(dev, false);
293 dev_err(mdev->dev, "driver own failed\n");
297 clear_bit(MT76_STATE_PM, &mphy->state);
299 pm->stats.last_wake_event = jiffies;
300 pm->stats.doze_time += pm->stats.last_wake_event -
301 pm->stats.last_doze_event;
306 static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
308 struct mt76_phy *mphy = &dev->mt76.phy;
309 struct mt76_connac_pm *pm = &dev->pm;
312 mutex_lock(&pm->mutex);
314 if (!test_bit(MT76_STATE_PM, &mphy->state))
317 for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
318 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
319 if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
320 MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
324 if (i == MT7615_DRV_OWN_RETRY_COUNT) {
325 dev_err(dev->mt76.dev, "driver own failed\n");
329 clear_bit(MT76_STATE_PM, &mphy->state);
331 pm->stats.last_wake_event = jiffies;
332 pm->stats.doze_time += pm->stats.last_wake_event -
333 pm->stats.last_doze_event;
335 mutex_unlock(&pm->mutex);
340 static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
342 struct mt76_phy *mphy = &dev->mt76.phy;
343 struct mt76_connac_pm *pm = &dev->pm;
347 mutex_lock(&pm->mutex);
349 if (mt76_connac_skip_fw_pmctrl(mphy, pm))
352 mt7622_trigger_hif_int(dev, true);
354 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
355 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
357 if (is_mt7622(&dev->mt76) &&
358 !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
359 MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
360 dev_err(dev->mt76.dev, "Timeout for firmware own\n");
361 clear_bit(MT76_STATE_PM, &mphy->state);
365 mt7622_trigger_hif_int(dev, false);
367 pm->stats.last_doze_event = jiffies;
368 pm->stats.awake_time += pm->stats.last_doze_event -
369 pm->stats.last_wake_event;
371 mutex_unlock(&pm->mutex);
377 mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
380 ieee80211_csa_finish(vif);
384 mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb)
386 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
387 struct mt76_phy *mphy = &dev->mt76.phy;
388 struct mt7615_mcu_csa_notify *c;
390 c = (struct mt7615_mcu_csa_notify *)skb->data;
392 if (c->omac_idx > EXT_BSSID_MAX)
395 if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx))
396 mphy = dev->mt76.phy2;
398 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
399 IEEE80211_IFACE_ITER_RESUME_ALL,
400 mt7615_mcu_csa_finish, mphy->hw);
404 mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
406 struct mt76_phy *mphy = &dev->mt76.phy;
407 struct mt7615_mcu_rdd_report *r;
409 r = (struct mt7615_mcu_rdd_report *)skb->data;
411 if (!dev->radar_pattern.n_pulses && !r->long_detected &&
412 !r->constant_prf_detected && !r->staggered_prf_detected)
415 if (r->band_idx && dev->mt76.phy2)
416 mphy = dev->mt76.phy2;
418 ieee80211_radar_detected(mphy->hw);
423 mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
425 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
426 const char *data = (char *)&rxd[1];
429 switch (rxd->s2d_index) {
441 wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type,
442 (int)(skb->len - sizeof(*rxd)), data);
446 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
448 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
450 switch (rxd->ext_eid) {
451 case MCU_EXT_EVENT_RDD_REPORT:
452 mt7615_mcu_rx_radar_detected(dev, skb);
454 case MCU_EXT_EVENT_CSA_NOTIFY:
455 mt7615_mcu_rx_csa_notify(dev, skb);
457 case MCU_EXT_EVENT_FW_LOG_2_HOST:
458 mt7615_mcu_rx_log_message(dev, skb);
466 mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
468 u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
469 struct mt7615_phy *phy;
470 struct mt76_phy *mphy;
472 if (*seq_num & BIT(7) && dev->mt76.phy2)
473 mphy = dev->mt76.phy2;
475 mphy = &dev->mt76.phy;
477 phy = (struct mt7615_phy *)mphy->priv;
479 spin_lock_bh(&dev->mt76.lock);
480 __skb_queue_tail(&phy->scan_event_list, skb);
481 spin_unlock_bh(&dev->mt76.lock);
483 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
484 MT7615_HW_SCAN_TIMEOUT);
488 mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
490 struct mt7615_roc_tlv *event;
491 struct mt7615_phy *phy;
492 struct mt76_phy *mphy;
495 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
496 event = (struct mt7615_roc_tlv *)skb->data;
498 if (event->dbdc_band && dev->mt76.phy2)
499 mphy = dev->mt76.phy2;
501 mphy = &dev->mt76.phy;
503 ieee80211_ready_on_channel(mphy->hw);
505 phy = (struct mt7615_phy *)mphy->priv;
506 phy->roc_grant = true;
507 wake_up(&phy->roc_wait);
509 duration = le32_to_cpu(event->max_interval);
510 mod_timer(&phy->roc_timer,
511 round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
515 mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
517 struct mt76_connac_beacon_loss_event *event;
518 struct mt76_phy *mphy;
519 u8 band_idx = 0; /* DBDC support */
521 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
522 event = (struct mt76_connac_beacon_loss_event *)skb->data;
523 if (band_idx && dev->mt76.phy2)
524 mphy = dev->mt76.phy2;
526 mphy = &dev->mt76.phy;
528 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
529 IEEE80211_IFACE_ITER_RESUME_ALL,
530 mt76_connac_mcu_beacon_loss_iter,
535 mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
537 struct mt76_connac_mcu_bss_event *event;
538 struct mt76_phy *mphy;
539 u8 band_idx = 0; /* DBDC support */
541 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
542 event = (struct mt76_connac_mcu_bss_event *)skb->data;
544 if (band_idx && dev->mt76.phy2)
545 mphy = dev->mt76.phy2;
547 mphy = &dev->mt76.phy;
549 if (event->is_absent)
550 ieee80211_stop_queues(mphy->hw);
552 ieee80211_wake_queues(mphy->hw);
556 mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
558 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
562 mt7615_mcu_rx_ext_event(dev, skb);
564 case MCU_EVENT_BSS_BEACON_LOSS:
565 mt7615_mcu_beacon_loss_event(dev, skb);
568 mt7615_mcu_roc_event(dev, skb);
570 case MCU_EVENT_SCHED_SCAN_DONE:
571 case MCU_EVENT_SCAN_DONE:
572 mt7615_mcu_scan_event(dev, skb);
574 case MCU_EVENT_BSS_ABSENCE:
575 mt7615_mcu_bss_event(dev, skb);
577 case MCU_EVENT_COREDUMP:
578 mt76_connac_mcu_coredump_event(&dev->mt76, skb,
587 void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
589 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
591 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
592 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
593 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
594 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
595 rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
596 rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
597 rxd->eid == MCU_EVENT_BSS_ABSENCE ||
598 rxd->eid == MCU_EVENT_SCAN_DONE ||
599 rxd->eid == MCU_EVENT_COREDUMP ||
600 rxd->eid == MCU_EVENT_ROC ||
602 mt7615_mcu_rx_unsolicited_event(dev, skb);
604 mt76_mcu_rx_event(&dev->mt76, skb);
608 mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif,
609 bool bssid, bool enable)
611 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
612 u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
613 u32 mask = dev->omac_mask >> 32 & ~BIT(idx);
614 const u8 *addr = vif->addr;
626 .mode = !!mask || enable,
630 .index = idx * 2 + bssid,
634 addr = vif->bss_conf.bssid;
637 ether_addr_copy(req.addr, addr);
639 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE),
640 &req, sizeof(req), true);
644 mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
647 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
648 struct mt7615_dev *dev = phy->dev;
662 u8 omac_addr[ETH_ALEN];
666 .omac_idx = mvif->mt76.omac_idx,
667 .band_idx = mvif->mt76.band_idx,
668 .tlv_num = cpu_to_le16(1),
672 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
673 .len = cpu_to_le16(sizeof(struct req_tlv)),
675 .band_idx = mvif->mt76.band_idx,
679 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
680 return mt7615_mcu_muar_config(dev, vif, false, enable);
682 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
683 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
684 &data, sizeof(data), true);
688 mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
689 struct ieee80211_hw *hw,
690 struct ieee80211_vif *vif, bool enable)
692 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
693 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
694 struct ieee80211_mutable_offsets offs;
695 struct ieee80211_tx_info *info;
702 u8 need_pre_tbtt_int;
708 /* bss color change */
712 .omac_idx = mvif->mt76.omac_idx,
714 .wlan_idx = wcid->idx,
715 .band_idx = mvif->mt76.band_idx,
722 skb = ieee80211_beacon_get_template(hw, vif, &offs);
726 if (skb->len > 512 - MT_TXD_SIZE) {
727 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
732 if (mvif->mt76.band_idx) {
733 info = IEEE80211_SKB_CB(skb);
734 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
737 mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
739 memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
740 req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
741 req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
742 if (offs.cntdwn_counter_offs[0]) {
745 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
746 req.csa_ie_pos = cpu_to_le16(csa_offs);
747 req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]];
752 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(BCN_OFFLOAD), &req,
757 mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
759 #define ENTER_PM_STATE 1
760 #define EXIT_PM_STATE 2
779 .pm_state = state ? ENTER_PM_STATE : EXIT_PM_STATE,
783 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PM_STATE_CTRL),
784 &req, sizeof(req), true);
788 mt7615_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
789 struct ieee80211_sta *sta, struct mt7615_phy *phy,
792 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
793 u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA;
794 struct bss_info_basic *bss;
795 u8 wlan_idx = mvif->sta.wcid.idx;
798 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
801 case NL80211_IFTYPE_MESH_POINT:
802 case NL80211_IFTYPE_AP:
803 case NL80211_IFTYPE_MONITOR:
805 case NL80211_IFTYPE_STATION:
806 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
808 struct mt7615_sta *msta;
810 msta = (struct mt7615_sta *)sta->drv_priv;
811 wlan_idx = msta->wcid.idx;
814 case NL80211_IFTYPE_ADHOC:
822 bss = (struct bss_info_basic *)tlv;
823 bss->network_type = cpu_to_le32(type);
824 bss->bmc_wcid_lo = wlan_idx;
825 bss->wmm_idx = mvif->mt76.wmm_idx;
826 bss->active = enable;
828 if (vif->type != NL80211_IFTYPE_MONITOR) {
829 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
830 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
831 bss->dtim_period = vif->bss_conf.dtim_period;
833 memcpy(bss->bssid, phy->mt76->macaddr, ETH_ALEN);
840 mt7615_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
842 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
843 u8 omac_idx = mvif->mt76.omac_idx;
844 struct bss_info_omac *omac;
848 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
851 case NL80211_IFTYPE_MONITOR:
852 case NL80211_IFTYPE_MESH_POINT:
853 case NL80211_IFTYPE_AP:
855 type = CONNECTION_P2P_GO;
857 type = CONNECTION_INFRA_AP;
859 case NL80211_IFTYPE_STATION:
861 type = CONNECTION_P2P_GC;
863 type = CONNECTION_INFRA_STA;
865 case NL80211_IFTYPE_ADHOC:
866 type = CONNECTION_IBSS_ADHOC;
873 omac = (struct bss_info_omac *)tlv;
874 omac->conn_type = cpu_to_le32(type);
875 omac->omac_idx = mvif->mt76.omac_idx;
876 omac->band_idx = mvif->mt76.band_idx;
877 omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx;
880 /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
881 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
883 mt7615_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt7615_vif *mvif)
885 struct bss_info_ext_bss *ext;
886 int ext_bss_idx, tsf_offset;
889 ext_bss_idx = mvif->mt76.omac_idx - EXT_BSSID_START;
893 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
895 ext = (struct bss_info_ext_bss *)tlv;
896 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
897 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
901 mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
902 struct ieee80211_sta *sta, bool enable)
904 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
905 struct mt7615_dev *dev = phy->dev;
908 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
909 mt7615_mcu_muar_config(dev, vif, true, enable);
911 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL);
916 mt7615_mcu_bss_omac_tlv(skb, vif);
918 mt7615_mcu_bss_basic_tlv(skb, vif, sta, phy, enable);
920 if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START &&
921 mvif->mt76.omac_idx < REPEATER_BSSID_START)
922 mt7615_mcu_bss_ext_tlv(skb, mvif);
924 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
925 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
929 mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
930 struct ieee80211_ampdu_params *params,
933 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
934 struct mt7615_vif *mvif = msta->vif;
935 struct wtbl_req_hdr *wtbl_hdr;
936 struct sk_buff *skb = NULL;
939 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
940 WTBL_SET, NULL, &skb);
941 if (IS_ERR(wtbl_hdr))
942 return PTR_ERR(wtbl_hdr);
944 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true,
947 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
948 MCU_EXT_CMD(WTBL_UPDATE), true);
952 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
957 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true);
959 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
960 MCU_EXT_CMD(STA_REC_UPDATE), true);
964 mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
965 struct ieee80211_ampdu_params *params,
968 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
969 struct mt7615_vif *mvif = msta->vif;
970 struct wtbl_req_hdr *wtbl_hdr;
974 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
979 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
981 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
982 MCU_EXT_CMD(STA_REC_UPDATE), true);
983 if (err < 0 || !enable)
987 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
988 WTBL_SET, NULL, &skb);
989 if (IS_ERR(wtbl_hdr))
990 return PTR_ERR(wtbl_hdr);
992 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
995 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
996 MCU_EXT_CMD(WTBL_UPDATE), true);
1000 mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1001 struct ieee80211_sta *sta, bool enable)
1003 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1004 struct sk_buff *skb, *sskb, *wskb = NULL;
1005 struct mt7615_dev *dev = phy->dev;
1006 struct wtbl_req_hdr *wtbl_hdr;
1007 struct mt7615_sta *msta;
1010 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
1012 sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1015 return PTR_ERR(sskb);
1017 mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable, true);
1019 mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
1020 MT76_STA_INFO_STATE_ASSOC);
1022 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1023 WTBL_RESET_AND_SET, NULL,
1025 if (IS_ERR(wtbl_hdr))
1026 return PTR_ERR(wtbl_hdr);
1029 mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta,
1032 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
1034 mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid,
1038 cmd = enable ? MCU_EXT_CMD(WTBL_UPDATE) : MCU_EXT_CMD(STA_REC_UPDATE);
1039 skb = enable ? wskb : sskb;
1041 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1043 skb = enable ? sskb : wskb;
1049 cmd = enable ? MCU_EXT_CMD(STA_REC_UPDATE) : MCU_EXT_CMD(WTBL_UPDATE);
1050 skb = enable ? sskb : wskb;
1052 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1056 mt7615_mcu_wtbl_update_hdr_trans(struct mt7615_dev *dev,
1057 struct ieee80211_vif *vif,
1058 struct ieee80211_sta *sta)
1060 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1061 struct wtbl_req_hdr *wtbl_hdr;
1062 struct sk_buff *skb = NULL;
1064 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1065 WTBL_SET, NULL, &skb);
1066 if (IS_ERR(wtbl_hdr))
1067 return PTR_ERR(wtbl_hdr);
1069 mt76_connac_mcu_wtbl_hdr_trans_tlv(skb, vif, &msta->wcid, NULL,
1071 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1072 MCU_EXT_CMD(WTBL_UPDATE), true);
1075 static const struct mt7615_mcu_ops wtbl_update_ops = {
1076 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1077 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1078 .add_dev_info = mt7615_mcu_add_dev,
1079 .add_bss_info = mt7615_mcu_add_bss,
1080 .add_tx_ba = mt7615_mcu_wtbl_tx_ba,
1081 .add_rx_ba = mt7615_mcu_wtbl_rx_ba,
1082 .sta_add = mt7615_mcu_wtbl_sta_add,
1083 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1084 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1085 .set_sta_decap_offload = mt7615_mcu_wtbl_update_hdr_trans,
1089 mt7615_mcu_sta_ba(struct mt7615_dev *dev,
1090 struct ieee80211_ampdu_params *params,
1091 bool enable, bool tx)
1093 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1094 struct mt7615_vif *mvif = msta->vif;
1095 struct wtbl_req_hdr *wtbl_hdr;
1096 struct tlv *sta_wtbl;
1097 struct sk_buff *skb;
1099 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1102 return PTR_ERR(skb);
1104 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
1106 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1108 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1109 WTBL_SET, sta_wtbl, &skb);
1110 if (IS_ERR(wtbl_hdr))
1111 return PTR_ERR(wtbl_hdr);
1113 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx,
1114 sta_wtbl, wtbl_hdr);
1116 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1117 MCU_EXT_CMD(STA_REC_UPDATE), true);
1121 mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
1122 struct ieee80211_ampdu_params *params,
1125 return mt7615_mcu_sta_ba(dev, params, enable, true);
1129 mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
1130 struct ieee80211_ampdu_params *params,
1133 return mt7615_mcu_sta_ba(dev, params, enable, false);
1137 __mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
1138 struct ieee80211_sta *sta, bool enable, int cmd,
1141 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1142 struct mt76_sta_cmd_info info = {
1145 .offload_fw = offload_fw,
1151 info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
1152 return mt76_connac_mcu_sta_cmd(phy, &info);
1156 mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1157 struct ieee80211_sta *sta, bool enable)
1159 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1160 MCU_EXT_CMD(STA_REC_UPDATE), false);
1164 mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
1165 struct ieee80211_vif *vif,
1166 struct ieee80211_sta *sta)
1168 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1170 return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
1172 MCU_EXT_CMD(STA_REC_UPDATE));
1175 static const struct mt7615_mcu_ops sta_update_ops = {
1176 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1177 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1178 .add_dev_info = mt7615_mcu_add_dev,
1179 .add_bss_info = mt7615_mcu_add_bss,
1180 .add_tx_ba = mt7615_mcu_sta_tx_ba,
1181 .add_rx_ba = mt7615_mcu_sta_rx_ba,
1182 .sta_add = mt7615_mcu_add_sta,
1183 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1184 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1185 .set_sta_decap_offload = mt7615_mcu_sta_update_hdr_trans,
1189 mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
1195 mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
1196 struct ieee80211_hw *hw,
1197 struct ieee80211_vif *vif,
1200 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1201 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1202 struct ieee80211_mutable_offsets offs;
1208 struct bcn_content_tlv {
1214 /* 0: disable beacon offload
1215 * 1: enable beacon offload
1216 * 2: update probe respond offload
1219 /* 0: legacy format (TXD + payload)
1220 * 1: only cap field IE
1225 } __packed beacon_tlv;
1228 .bss_idx = mvif->mt76.idx,
1231 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1232 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1236 struct sk_buff *skb;
1241 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs);
1245 if (skb->len > 512 - MT_TXD_SIZE) {
1246 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1251 mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
1252 wcid, NULL, 0, NULL, true);
1253 memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1254 req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1255 req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1257 if (offs.cntdwn_counter_offs[0]) {
1260 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
1261 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1266 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
1267 &req, sizeof(req), true);
1271 mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1274 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1276 return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
1281 mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1282 struct ieee80211_sta *sta, bool enable)
1284 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1286 return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
1291 mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1292 struct ieee80211_sta *sta, bool enable)
1294 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1295 MCU_UNI_CMD(STA_REC_UPDATE), true);
1299 mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
1300 struct ieee80211_ampdu_params *params,
1303 struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv;
1305 return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params,
1310 mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
1311 struct ieee80211_ampdu_params *params,
1314 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1315 struct mt7615_vif *mvif = msta->vif;
1316 struct wtbl_req_hdr *wtbl_hdr;
1317 struct tlv *sta_wtbl;
1318 struct sk_buff *skb;
1321 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1324 return PTR_ERR(skb);
1326 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
1328 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1329 MCU_UNI_CMD(STA_REC_UPDATE), true);
1330 if (err < 0 || !enable)
1333 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1336 return PTR_ERR(skb);
1338 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1339 sizeof(struct tlv));
1341 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1342 WTBL_SET, sta_wtbl, &skb);
1343 if (IS_ERR(wtbl_hdr))
1344 return PTR_ERR(wtbl_hdr);
1346 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
1347 sta_wtbl, wtbl_hdr);
1349 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1350 MCU_UNI_CMD(STA_REC_UPDATE), true);
1354 mt7615_mcu_sta_uni_update_hdr_trans(struct mt7615_dev *dev,
1355 struct ieee80211_vif *vif,
1356 struct ieee80211_sta *sta)
1358 struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
1360 return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
1362 MCU_UNI_CMD(STA_REC_UPDATE));
1365 static const struct mt7615_mcu_ops uni_update_ops = {
1366 .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
1367 .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
1368 .add_dev_info = mt7615_mcu_uni_add_dev,
1369 .add_bss_info = mt7615_mcu_uni_add_bss,
1370 .add_tx_ba = mt7615_mcu_uni_tx_ba,
1371 .add_rx_ba = mt7615_mcu_uni_rx_ba,
1372 .sta_add = mt7615_mcu_uni_add_sta,
1373 .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
1374 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1375 .set_sta_decap_offload = mt7615_mcu_sta_uni_update_hdr_trans,
1378 int mt7615_mcu_restart(struct mt76_dev *dev)
1380 return mt76_mcu_send_msg(dev, MCU_CMD(RESTART_DL_REQ), NULL, 0, true);
1382 EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
1384 static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
1386 const struct mt7615_patch_hdr *hdr;
1387 const struct firmware *fw = NULL;
1390 ret = firmware_request_nowarn(&fw, name, dev->mt76.dev);
1394 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
1395 dev_err(dev->mt76.dev, "Invalid firmware\n");
1400 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true);
1404 case PATCH_NOT_DL_SEM_SUCCESS:
1407 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
1412 hdr = (const struct mt7615_patch_hdr *)(fw->data);
1414 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
1415 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
1417 len = fw->size - sizeof(*hdr);
1419 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1422 dev_err(dev->mt76.dev, "Download request failed\n");
1426 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1427 fw->data + sizeof(*hdr), len);
1429 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1433 ret = mt76_connac_mcu_start_patch(&dev->mt76);
1435 dev_err(dev->mt76.dev, "Failed to start patch\n");
1438 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
1440 case PATCH_REL_SEM_SUCCESS:
1444 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
1449 release_firmware(fw);
1454 static u32 mt7615_mcu_gen_dl_mode(u8 feature_set, bool is_cr4)
1458 ret |= (feature_set & FW_FEATURE_SET_ENCRYPT) ?
1459 (DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV) : 0;
1460 ret |= FIELD_PREP(DL_MODE_KEY_IDX,
1461 FIELD_GET(FW_FEATURE_SET_KEY_IDX, feature_set));
1462 ret |= DL_MODE_NEED_RSP;
1463 ret |= is_cr4 ? DL_MODE_WORKING_PDA_CR4 : 0;
1469 mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
1470 const struct mt7615_fw_trailer *hdr,
1471 const u8 *data, bool is_cr4)
1473 int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
1474 int err, i, offset = 0;
1475 u32 len, addr, mode;
1477 for (i = 0; i < n_region; i++) {
1478 mode = mt7615_mcu_gen_dl_mode(hdr[i].feature_set, is_cr4);
1479 len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
1480 addr = le32_to_cpu(hdr[i].addr);
1482 err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1485 dev_err(dev->mt76.dev, "Download request failed\n");
1489 err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1490 data + offset, len);
1492 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1502 static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
1504 const struct mt7615_fw_trailer *hdr;
1505 const struct firmware *fw;
1508 ret = request_firmware(&fw, name, dev->mt76.dev);
1512 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
1513 dev_err(dev->mt76.dev, "Invalid firmware\n");
1518 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1519 N9_REGION_NUM * sizeof(*hdr));
1521 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1522 hdr->fw_ver, hdr->build_date);
1524 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
1528 ret = mt76_connac_mcu_start_firmware(&dev->mt76,
1529 le32_to_cpu(hdr->addr),
1532 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1536 snprintf(dev->mt76.hw->wiphy->fw_version,
1537 sizeof(dev->mt76.hw->wiphy->fw_version),
1538 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1540 if (!is_mt7615(&dev->mt76)) {
1541 dev->fw_ver = MT7615_FIRMWARE_V2;
1542 dev->mcu_ops = &sta_update_ops;
1544 dev->fw_ver = MT7615_FIRMWARE_V1;
1545 dev->mcu_ops = &wtbl_update_ops;
1549 release_firmware(fw);
1553 static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
1555 const struct mt7615_fw_trailer *hdr;
1556 const struct firmware *fw;
1559 ret = request_firmware(&fw, name, dev->mt76.dev);
1563 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
1564 dev_err(dev->mt76.dev, "Invalid firmware\n");
1569 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1570 CR4_REGION_NUM * sizeof(*hdr));
1572 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
1573 hdr->fw_ver, hdr->build_date);
1575 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
1579 ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
1580 FW_START_WORKING_PDA_CR4);
1582 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
1587 release_firmware(fw);
1592 static int mt7615_load_ram(struct mt7615_dev *dev)
1596 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
1600 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
1603 static int mt7615_load_firmware(struct mt7615_dev *dev)
1608 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
1610 if (val != FW_STATE_FW_DOWNLOAD) {
1611 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1615 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
1619 ret = mt7615_load_ram(dev);
1623 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
1624 FIELD_PREP(MT_TOP_MISC2_FW_STATE,
1625 FW_STATE_RDY), 500)) {
1626 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1633 static int mt7622_load_firmware(struct mt7615_dev *dev)
1638 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1640 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
1641 if (val != FW_STATE_FW_DOWNLOAD) {
1642 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1646 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
1650 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
1654 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
1655 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
1656 FW_STATE_NORMAL_TRX), 1500)) {
1657 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1661 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1666 int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
1675 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST),
1676 &data, sizeof(data), true);
1679 static int mt7615_mcu_cal_cache_apply(struct mt7615_dev *dev)
1685 .cache_enable = true
1688 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(CAL_CACHE), &data,
1689 sizeof(data), false);
1692 static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
1694 u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
1695 const struct mt7663_fw_trailer *hdr;
1696 const struct mt7663_fw_buf *buf;
1697 const struct firmware *fw;
1698 const u8 *base_addr;
1701 ret = request_firmware(&fw, name, dev->mt76.dev);
1705 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
1706 dev_err(dev->mt76.dev, "Invalid firmware\n");
1711 hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size -
1712 FW_V3_COMMON_TAILER_SIZE);
1714 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1715 hdr->fw_ver, hdr->build_date);
1716 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
1718 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
1719 for (i = 0; i < hdr->n_region; i++) {
1720 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
1721 u32 len, addr, mode;
1723 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
1725 buf = (const struct mt7663_fw_buf *)(base_addr - shift);
1726 mode = mt7615_mcu_gen_dl_mode(buf->feature_set, false);
1727 addr = le32_to_cpu(buf->img_dest_addr);
1728 len = le32_to_cpu(buf->img_size);
1730 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1733 dev_err(dev->mt76.dev, "Download request failed\n");
1737 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
1738 fw->data + offset, len);
1740 dev_err(dev->mt76.dev, "Failed to send firmware\n");
1744 offset += le32_to_cpu(buf->img_size);
1745 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
1746 override_addr = le32_to_cpu(buf->img_dest_addr);
1747 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
1753 flag |= FW_START_OVERRIDE;
1755 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
1756 override_addr, flag);
1758 ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
1760 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1764 snprintf(dev->mt76.hw->wiphy->fw_version,
1765 sizeof(dev->mt76.hw->wiphy->fw_version),
1766 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1769 release_firmware(fw);
1775 mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
1777 const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
1778 const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
1781 if (!prefer_offload_fw) {
1782 secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
1783 primary_rom = MT7663_ROM_PATCH;
1785 selected_rom = primary_rom;
1787 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
1789 dev_info(dev->mt76.dev, "%s not found, switching to %s",
1790 primary_rom, secondary_rom);
1791 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
1794 dev_err(dev->mt76.dev, "failed to load %s",
1798 selected_rom = secondary_rom;
1801 if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
1802 *n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
1803 dev->fw_ver = MT7615_FIRMWARE_V3;
1804 dev->mcu_ops = &uni_update_ops;
1806 *n9_firmware = MT7663_FIRMWARE_N9;
1807 dev->fw_ver = MT7615_FIRMWARE_V2;
1808 dev->mcu_ops = &sta_update_ops;
1814 int __mt7663_load_firmware(struct mt7615_dev *dev)
1816 const char *n9_firmware;
1819 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
1821 dev_dbg(dev->mt76.dev, "Firmware is already download\n");
1825 ret = mt7663_load_rom_patch(dev, &n9_firmware);
1829 ret = mt7663_load_n9(dev, n9_firmware);
1833 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
1834 MT_TOP_MISC2_FW_N9_RDY, 1500)) {
1835 ret = mt76_get_field(dev, MT_CONN_ON_MISC,
1836 MT7663_TOP_MISC2_FW_STATE);
1837 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1842 if (mt7615_firmware_offload(dev))
1843 dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
1844 #endif /* CONFIG_PM */
1846 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1850 EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
1852 static int mt7663_load_firmware(struct mt7615_dev *dev)
1856 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1858 ret = __mt7663_load_firmware(dev);
1862 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1867 int mt7615_mcu_init(struct mt7615_dev *dev)
1869 static const struct mt76_mcu_ops mt7615_mcu_ops = {
1870 .headroom = sizeof(struct mt7615_mcu_txd),
1871 .mcu_skb_send_msg = mt7615_mcu_send_message,
1872 .mcu_parse_response = mt7615_mcu_parse_response,
1873 .mcu_restart = mt7615_mcu_restart,
1877 dev->mt76.mcu_ops = &mt7615_mcu_ops,
1879 ret = mt7615_mcu_drv_pmctrl(dev);
1883 switch (mt76_chip(&dev->mt76)) {
1885 ret = mt7622_load_firmware(dev);
1888 ret = mt7663_load_firmware(dev);
1891 ret = mt7615_load_firmware(dev);
1897 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
1898 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1899 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
1901 if (dev->dbdc_support) {
1902 ret = mt7615_mcu_cal_cache_apply(dev);
1907 return mt7615_mcu_fw_log_2_host(dev, 0);
1909 EXPORT_SYMBOL_GPL(mt7615_mcu_init);
1911 void mt7615_mcu_exit(struct mt7615_dev *dev)
1913 __mt76_mcu_restart(&dev->mt76);
1914 mt7615_mcu_set_fw_ctrl(dev);
1915 skb_queue_purge(&dev->mt76.mcu.res_q);
1917 EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
1919 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
1925 } __packed req_hdr = {
1928 u8 *eep = (u8 *)dev->mt76.eeprom.data;
1929 struct sk_buff *skb;
1930 int eep_len, offset;
1932 switch (mt76_chip(&dev->mt76)) {
1934 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
1935 offset = MT_EE_NIC_CONF_0;
1938 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
1939 req_hdr.content_format = 1;
1940 offset = MT_EE_CHIP_ID;
1943 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
1944 offset = MT_EE_NIC_CONF_0;
1948 req_hdr.len = cpu_to_le16(eep_len);
1950 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
1954 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
1955 skb_put_data(skb, eep + offset, eep_len);
1957 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1958 MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
1961 int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
1962 const struct ieee80211_tx_queue_params *params)
1964 #define WMM_AIFS_SET BIT(0)
1965 #define WMM_CW_MIN_SET BIT(1)
1966 #define WMM_CW_MAX_SET BIT(2)
1967 #define WMM_TXOP_SET BIT(3)
1968 #define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
1969 WMM_CW_MAX_SET | WMM_TXOP_SET)
1982 .valid = WMM_PARAM_SET,
1983 .aifs = params->aifs,
1985 .cw_max = cpu_to_le16(10),
1986 .txop = cpu_to_le16(params->txop),
1990 req.cw_min = fls(params->cw_min);
1992 req.cw_max = cpu_to_le16(fls(params->cw_max));
1994 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE),
1995 &req, sizeof(req), true);
1998 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
2000 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
2011 struct dbdc_entry entry[64];
2013 .enable = !!ext_phy,
2020 #define ADD_DBDC_ENTRY(_type, _idx, _band) \
2022 req.entry[req.num].type = _type; \
2023 req.entry[req.num].index = _idx; \
2024 req.entry[req.num++].band = _band; \
2027 for (i = 0; i < 4; i++) {
2028 bool band = !!(ext_phy->omac_mask & BIT_ULL(i));
2030 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
2033 for (i = 0; i < 14; i++) {
2034 bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i));
2036 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
2039 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
2041 for (i = 0; i < 3; i++)
2042 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
2044 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
2045 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
2046 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
2047 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
2049 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
2050 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
2053 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DBDC_CTRL), &req,
2057 int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
2059 struct wtbl_req_hdr req = {
2060 .operation = WTBL_RESET_ALL,
2063 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(WTBL_UPDATE),
2064 &req, sizeof(req), true);
2067 int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
2068 enum mt7615_rdd_cmd cmd, u8 index,
2080 .rdd_rx_sel = rx_sel,
2084 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_CTRL),
2085 &req, sizeof(req), true);
2088 int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
2094 .tag = cpu_to_le16(0x1),
2095 .min_lpn = cpu_to_le16(val),
2098 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
2099 &req, sizeof(req), true);
2102 int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
2103 const struct mt7615_dfs_pulse *pulse)
2107 __le32 max_width; /* us */
2108 __le32 max_pwr; /* dbm */
2109 __le32 min_pwr; /* dbm */
2110 __le32 min_stgr_pri; /* us */
2111 __le32 max_stgr_pri; /* us */
2112 __le32 min_cr_pri; /* us */
2113 __le32 max_cr_pri; /* us */
2115 .tag = cpu_to_le16(0x3),
2116 #define __req_field(field) .field = cpu_to_le32(pulse->field)
2117 __req_field(max_width),
2118 __req_field(max_pwr),
2119 __req_field(min_pwr),
2120 __req_field(min_stgr_pri),
2121 __req_field(max_stgr_pri),
2122 __req_field(min_cr_pri),
2123 __req_field(max_cr_pri),
2127 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
2128 &req, sizeof(req), true);
2131 int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
2132 const struct mt7615_dfs_pattern *pattern)
2152 .tag = cpu_to_le16(0x2),
2153 .radar_type = cpu_to_le16(index),
2154 #define __req_field_u8(field) .field = pattern->field
2155 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2156 __req_field_u8(enb),
2157 __req_field_u8(stgr),
2158 __req_field_u8(min_crpn),
2159 __req_field_u8(max_crpn),
2160 __req_field_u8(min_crpr),
2161 __req_field_u8(min_pw),
2162 __req_field_u8(max_pw),
2163 __req_field_u32(min_pri),
2164 __req_field_u32(max_pri),
2165 __req_field_u8(min_crbn),
2166 __req_field_u8(max_crbn),
2167 __req_field_u8(min_stgpn),
2168 __req_field_u8(max_stgpn),
2169 __req_field_u8(min_stgpr),
2170 #undef __req_field_u8
2171 #undef __req_field_u32
2174 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
2175 &req, sizeof(req), true);
2178 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
2189 .pulse_num = dev->radar_pattern.n_pulses,
2191 u32 start_time = ktime_to_ms(ktime_get_boottime());
2194 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
2197 /* TODO: add some noise here */
2198 for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2199 u32 ts = start_time + i * dev->radar_pattern.period;
2201 req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width);
2202 req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power);
2203 req.pattern[i].start_time = cpu_to_le32(ts);
2206 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_PATTERN),
2207 &req, sizeof(req), false);
2210 static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2212 struct mt76_phy *mphy = phy->mt76;
2213 struct ieee80211_hw *hw = mphy->hw;
2214 struct mt76_power_limits limits;
2215 s8 *limits_array = (s8 *)&limits;
2216 int n_chains = hweight8(mphy->antenna_mask);
2219 static const u8 sku_mapping[] = {
2220 #define SKU_FIELD(_type, _field) \
2221 [MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field)
2222 SKU_FIELD(CCK_1_2, cck[0]),
2223 SKU_FIELD(CCK_55_11, cck[2]),
2224 SKU_FIELD(OFDM_6_9, ofdm[0]),
2225 SKU_FIELD(OFDM_12_18, ofdm[2]),
2226 SKU_FIELD(OFDM_24_36, ofdm[4]),
2227 SKU_FIELD(OFDM_48, ofdm[6]),
2228 SKU_FIELD(OFDM_54, ofdm[7]),
2229 SKU_FIELD(HT20_0_8, mcs[0][0]),
2230 SKU_FIELD(HT20_32, ofdm[0]),
2231 SKU_FIELD(HT20_1_2_9_10, mcs[0][1]),
2232 SKU_FIELD(HT20_3_4_11_12, mcs[0][3]),
2233 SKU_FIELD(HT20_5_13, mcs[0][5]),
2234 SKU_FIELD(HT20_6_14, mcs[0][6]),
2235 SKU_FIELD(HT20_7_15, mcs[0][7]),
2236 SKU_FIELD(HT40_0_8, mcs[1][0]),
2237 SKU_FIELD(HT40_32, ofdm[0]),
2238 SKU_FIELD(HT40_1_2_9_10, mcs[1][1]),
2239 SKU_FIELD(HT40_3_4_11_12, mcs[1][3]),
2240 SKU_FIELD(HT40_5_13, mcs[1][5]),
2241 SKU_FIELD(HT40_6_14, mcs[1][6]),
2242 SKU_FIELD(HT40_7_15, mcs[1][7]),
2243 SKU_FIELD(VHT20_0, mcs[0][0]),
2244 SKU_FIELD(VHT20_1_2, mcs[0][1]),
2245 SKU_FIELD(VHT20_3_4, mcs[0][3]),
2246 SKU_FIELD(VHT20_5_6, mcs[0][5]),
2247 SKU_FIELD(VHT20_7, mcs[0][7]),
2248 SKU_FIELD(VHT20_8, mcs[0][8]),
2249 SKU_FIELD(VHT20_9, mcs[0][9]),
2250 SKU_FIELD(VHT40_0, mcs[1][0]),
2251 SKU_FIELD(VHT40_1_2, mcs[1][1]),
2252 SKU_FIELD(VHT40_3_4, mcs[1][3]),
2253 SKU_FIELD(VHT40_5_6, mcs[1][5]),
2254 SKU_FIELD(VHT40_7, mcs[1][7]),
2255 SKU_FIELD(VHT40_8, mcs[1][8]),
2256 SKU_FIELD(VHT40_9, mcs[1][9]),
2257 SKU_FIELD(VHT80_0, mcs[2][0]),
2258 SKU_FIELD(VHT80_1_2, mcs[2][1]),
2259 SKU_FIELD(VHT80_3_4, mcs[2][3]),
2260 SKU_FIELD(VHT80_5_6, mcs[2][5]),
2261 SKU_FIELD(VHT80_7, mcs[2][7]),
2262 SKU_FIELD(VHT80_8, mcs[2][8]),
2263 SKU_FIELD(VHT80_9, mcs[2][9]),
2264 SKU_FIELD(VHT160_0, mcs[3][0]),
2265 SKU_FIELD(VHT160_1_2, mcs[3][1]),
2266 SKU_FIELD(VHT160_3_4, mcs[3][3]),
2267 SKU_FIELD(VHT160_5_6, mcs[3][5]),
2268 SKU_FIELD(VHT160_7, mcs[3][7]),
2269 SKU_FIELD(VHT160_8, mcs[3][8]),
2270 SKU_FIELD(VHT160_9, mcs[3][9]),
2274 tx_power = hw->conf.power_level * 2 -
2275 mt76_tx_power_nss_delta(n_chains);
2277 tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
2279 mphy->txpower_cur = tx_power;
2281 if (is_mt7663(mphy->dev)) {
2282 memset(sku, tx_power, MT_SKU_4SS_DELTA + 1);
2286 for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2287 sku[i] = limits_array[sku_mapping[i]];
2289 for (i = 0; i < 4; i++) {
2292 if (i < n_chains - 1)
2293 delta = mt76_tx_power_nss_delta(n_chains) -
2294 mt76_tx_power_nss_delta(i + 1);
2295 sku[MT_SKU_1SS_DELTA + i] = delta;
2299 static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2301 static const u8 width_to_bw[] = {
2302 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2303 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2304 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2305 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2306 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2307 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2308 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2309 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2312 if (chandef->width >= ARRAY_SIZE(width_to_bw))
2315 return width_to_bw[chandef->width];
2318 int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2320 struct mt7615_dev *dev = phy->dev;
2321 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2322 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2331 /* for 80+80 only */
2336 __le32 outband_freq;
2342 .control_chan = chandef->chan->hw_value,
2343 .center_chan = ieee80211_frequency_to_channel(freq1),
2344 .tx_streams = hweight8(phy->mt76->antenna_mask),
2345 .rx_streams_mask = phy->mt76->chainmask,
2346 .center_chan2 = ieee80211_frequency_to_channel(freq2),
2349 if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2350 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2351 else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
2352 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
2353 req.switch_reason = CH_SWITCH_DFS;
2355 req.switch_reason = CH_SWITCH_NORMAL;
2357 req.band_idx = phy != &dev->phy;
2358 req.bw = mt7615_mcu_chan_bw(chandef);
2360 if (mt76_testmode_enabled(phy->mt76))
2361 memset(req.txpower_sku, 0x3f, 49);
2363 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2365 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2368 int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
2375 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL),
2376 &req, sizeof(req), true);
2379 int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
2391 .test_mode_en = test_mode,
2393 .value = cpu_to_le32(val),
2396 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL),
2397 &req, sizeof(req), false);
2400 int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2402 struct mt7615_dev *dev = phy->dev;
2410 .band_idx = phy != &dev->phy,
2411 .sku_enable = enable,
2414 return mt76_mcu_send_msg(&dev->mt76,
2415 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
2416 &req, sizeof(req), true);
2419 static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
2423 for (i = 0; i < n_freqs; i++)
2424 if (cur == freqs[i])
2430 static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
2432 static const u16 freq_list[] = {
2433 4980, 5805, 5905, 5190,
2434 5230, 5270, 5310, 5350,
2435 5390, 5430, 5470, 5510,
2436 5550, 5590, 5630, 5670,
2437 5710, 5755, 5795, 5835,
2438 5875, 5210, 5290, 5370,
2439 5450, 5530, 5610, 5690,
2442 static const u16 freq_bw40[] = {
2443 5190, 5230, 5270, 5310,
2444 5350, 5390, 5430, 5470,
2445 5510, 5550, 5590, 5630,
2446 5670, 5710, 5755, 5795,
2449 int offset_2g = ARRAY_SIZE(freq_list);
2456 return offset_2g + 1;
2458 return offset_2g + 2;
2460 return offset_2g + 3;
2464 case NL80211_CHAN_WIDTH_80:
2465 case NL80211_CHAN_WIDTH_80P80:
2466 case NL80211_CHAN_WIDTH_160:
2469 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2472 freq = freq_bw40[idx];
2476 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2479 freq = freq_bw40[idx];
2483 case NL80211_CHAN_WIDTH_40:
2484 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2493 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2496 int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
2498 struct mt7615_dev *dev = phy->dev;
2499 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2500 int freq2 = chandef->center_freq2;
2504 u8 runtime_calibration;
2517 __le32 sx0_i_lna[4];
2518 __le32 sx0_q_lna[4];
2520 __le32 sx2_i_lna[4];
2521 __le32 sx2_q_lna[4];
2526 .bw = mt7615_mcu_chan_bw(chandef),
2527 .band = chandef->center_freq1 > 4000,
2528 .dbdc_en = !!dev->mt76.phy2,
2530 u16 center_freq = chandef->center_freq1;
2532 u8 *eep = dev->mt76.eeprom.data;
2534 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
2537 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2538 freq2 = center_freq + 40;
2543 req.runtime_calibration = 1;
2544 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
2548 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
2549 freq_idx * MT7615_EEPROM_DCOC_SIZE,
2550 sizeof(req.dcoc_data));
2551 req.runtime_calibration = 0;
2554 req.center_freq = cpu_to_le16(center_freq);
2555 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RXDCOC_CAL), &req,
2558 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2559 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2560 req.is_freq2 = true;
2561 center_freq = freq2;
2568 static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
2570 static const u16 freq_list[] = {
2571 4920, 4940, 4960, 4980,
2572 5040, 5060, 5080, 5180,
2573 5200, 5220, 5240, 5260,
2574 5280, 5300, 5320, 5340,
2575 5360, 5380, 5400, 5420,
2576 5440, 5460, 5480, 5500,
2577 5520, 5540, 5560, 5580,
2578 5600, 5620, 5640, 5660,
2579 5680, 5700, 5720, 5745,
2580 5765, 5785, 5805, 5825,
2581 5845, 5865, 5885, 5905
2583 int offset_2g = ARRAY_SIZE(freq_list);
2590 return offset_2g + 1;
2592 return offset_2g + 2;
2595 if (bw != NL80211_CHAN_WIDTH_20) {
2596 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2601 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2607 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2611 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
2613 struct mt7615_dev *dev = phy->dev;
2614 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2615 int freq2 = chandef->center_freq2;
2619 u8 runtime_calibration;
2647 .bw = mt7615_mcu_chan_bw(chandef),
2648 .band = chandef->center_freq1 > 4000,
2649 .dbdc_en = !!dev->mt76.phy2,
2651 u16 center_freq = chandef->center_freq1;
2653 u8 *eep = dev->mt76.eeprom.data;
2655 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
2658 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2659 freq2 = center_freq + 40;
2664 req.runtime_calibration = 1;
2665 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
2669 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
2670 freq_idx * MT7615_EEPROM_TXDPD_SIZE,
2671 sizeof(req.dpd_data));
2672 req.runtime_calibration = 0;
2675 req.center_freq = cpu_to_le16(center_freq);
2676 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXDPD_CAL),
2677 &req, sizeof(req), true);
2679 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2680 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2681 req.is_freq2 = true;
2682 center_freq = freq2;
2689 int mt7615_mcu_set_rx_hdr_trans_blacklist(struct mt7615_dev *dev)
2702 .etype = cpu_to_le16(ETH_P_PAE),
2705 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
2706 &req, sizeof(req), false);
2709 int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
2712 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2717 __le16 bcn_interval;
2720 u8 bmc_delivered_ac;
2721 u8 bmc_triggered_ac;
2724 .bss_idx = mvif->mt76.idx,
2725 .aid = cpu_to_le16(vif->bss_conf.aid),
2726 .dtim_period = vif->bss_conf.dtim_period,
2727 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
2733 .bss_idx = mvif->mt76.idx,
2737 if (vif->type != NL80211_IFTYPE_STATION)
2740 err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT),
2741 &req_hdr, sizeof(req_hdr), false);
2742 if (err < 0 || !enable)
2745 return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_CONNECTED),
2746 &req, sizeof(req), false);
2749 int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2750 struct ieee80211_channel *chan, int duration)
2752 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2753 struct mt7615_dev *dev = phy->dev;
2754 struct mt7615_roc_tlv req = {
2755 .bss_idx = mvif->mt76.idx,
2757 .max_interval = cpu_to_le32(duration),
2758 .primary_chan = chan ? chan->hw_value : 0,
2759 .band = chan ? chan->band : 0,
2763 phy->roc_grant = false;
2765 return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_ROC),
2766 &req, sizeof(req), false);