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 = cmd & MCU_CMD_MASK;
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_UNI_PREFIX ? 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_UNI_PREFIX) {
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;
146 switch (cmd & ~MCU_CMD_MASK) {
148 mcu_txd->set_query = MCU_Q_NA;
149 mcu_txd->cid = mcu_cmd;
152 if (cmd & MCU_QUERY_MASK)
153 mcu_txd->set_query = MCU_Q_QUERY;
155 mcu_txd->set_query = MCU_Q_SET;
156 mcu_txd->cid = mcu_cmd;
159 mcu_txd->cid = MCU_CMD_EXT_CID;
160 if (cmd & MCU_QUERY_PREFIX)
161 mcu_txd->set_query = MCU_Q_QUERY;
163 mcu_txd->set_query = MCU_Q_SET;
164 mcu_txd->ext_cid = mcu_cmd;
165 mcu_txd->ext_cid_ack = 1;
169 EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg);
171 int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
172 struct sk_buff *skb, int seq)
174 struct mt7615_mcu_rxd *rxd;
178 dev_err(mdev->dev, "Message %ld (seq %d) timeout\n",
179 cmd & MCU_CMD_MASK, seq);
183 rxd = (struct mt7615_mcu_rxd *)skb->data;
188 case MCU_CMD_PATCH_SEM_CONTROL:
189 skb_pull(skb, sizeof(*rxd) - 4);
192 case MCU_EXT_CMD_GET_TEMP:
193 skb_pull(skb, sizeof(*rxd));
194 ret = le32_to_cpu(*(__le32 *)skb->data);
196 case MCU_EXT_CMD_RF_REG_ACCESS | MCU_QUERY_PREFIX:
197 skb_pull(skb, sizeof(*rxd));
198 ret = le32_to_cpu(*(__le32 *)&skb->data[8]);
200 case MCU_UNI_CMD_DEV_INFO_UPDATE:
201 case MCU_UNI_CMD_BSS_INFO_UPDATE:
202 case MCU_UNI_CMD_STA_REC_UPDATE:
203 case MCU_UNI_CMD_HIF_CTRL:
204 case MCU_UNI_CMD_OFFLOAD:
205 case MCU_UNI_CMD_SUSPEND: {
206 struct mt7615_mcu_uni_event *event;
208 skb_pull(skb, sizeof(*rxd));
209 event = (struct mt7615_mcu_uni_event *)skb->data;
210 ret = le32_to_cpu(event->status);
213 case MCU_CMD_REG_READ: {
214 struct mt7615_mcu_reg_event *event;
216 skb_pull(skb, sizeof(*rxd));
217 event = (struct mt7615_mcu_reg_event *)skb->data;
218 ret = (int)le32_to_cpu(event->val);
227 EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
230 mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
233 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
234 enum mt76_txq_id qid;
236 mt7615_mcu_fill_msg(dev, skb, cmd, seq);
237 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
242 return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0);
245 u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
252 .wifi_stream = cpu_to_le32(wf),
253 .address = cpu_to_le32(reg),
256 return mt76_mcu_send_msg(&dev->mt76,
257 MCU_EXT_CMD_RF_REG_ACCESS | MCU_QUERY_PREFIX,
258 &req, sizeof(req), true);
261 int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val)
268 .wifi_stream = cpu_to_le32(wf),
269 .address = cpu_to_le32(reg),
270 .data = cpu_to_le32(val),
273 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RF_REG_ACCESS, &req,
277 static void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
279 if (!is_mt7622(&dev->mt76))
282 regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
283 MT_INFRACFG_MISC_AP2CONN_WAKE,
284 !en * MT_INFRACFG_MISC_AP2CONN_WAKE);
287 static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
289 struct mt76_phy *mphy = &dev->mt76.phy;
290 struct mt76_dev *mdev = &dev->mt76;
294 addr = is_mt7663(mdev) ? MT_PCIE_DOORBELL_PUSH : MT_CFG_LPCR_HOST;
295 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
297 mt7622_trigger_hif_int(dev, true);
299 addr = is_mt7663(mdev) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
300 err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
302 mt7622_trigger_hif_int(dev, false);
305 dev_err(mdev->dev, "driver own failed\n");
309 clear_bit(MT76_STATE_PM, &mphy->state);
314 static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
316 struct mt76_phy *mphy = &dev->mt76.phy;
319 if (!test_and_clear_bit(MT76_STATE_PM, &mphy->state))
322 for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
323 mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
324 if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
325 MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
329 if (i == MT7615_DRV_OWN_RETRY_COUNT) {
330 dev_err(dev->mt76.dev, "driver own failed\n");
331 set_bit(MT76_STATE_PM, &mphy->state);
336 dev->pm.last_activity = jiffies;
341 static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
343 struct mt76_phy *mphy = &dev->mt76.phy;
347 if (test_and_set_bit(MT76_STATE_PM, &mphy->state))
350 mt7622_trigger_hif_int(dev, true);
352 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
353 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
355 if (is_mt7622(&dev->mt76) &&
356 !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
357 MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
358 dev_err(dev->mt76.dev, "Timeout for firmware own\n");
359 clear_bit(MT76_STATE_PM, &mphy->state);
363 mt7622_trigger_hif_int(dev, false);
369 mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
372 ieee80211_csa_finish(vif);
376 mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
378 struct mt76_phy *mphy = &dev->mt76.phy;
379 struct mt7615_mcu_rdd_report *r;
381 r = (struct mt7615_mcu_rdd_report *)skb->data;
383 if (r->idx && dev->mt76.phy2)
384 mphy = dev->mt76.phy2;
386 ieee80211_radar_detected(mphy->hw);
391 mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
393 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
394 const char *data = (char *)&rxd[1];
397 switch (rxd->s2d_index) {
409 wiphy_info(mt76_hw(dev)->wiphy, "%s: %s", type, data);
413 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
415 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
417 switch (rxd->ext_eid) {
418 case MCU_EXT_EVENT_RDD_REPORT:
419 mt7615_mcu_rx_radar_detected(dev, skb);
421 case MCU_EXT_EVENT_CSA_NOTIFY:
422 ieee80211_iterate_active_interfaces_atomic(dev->mt76.hw,
423 IEEE80211_IFACE_ITER_RESUME_ALL,
424 mt7615_mcu_csa_finish, dev);
426 case MCU_EXT_EVENT_FW_LOG_2_HOST:
427 mt7615_mcu_rx_log_message(dev, skb);
435 mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
437 u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
438 struct mt7615_phy *phy;
439 struct mt76_phy *mphy;
441 if (*seq_num & BIT(7) && dev->mt76.phy2)
442 mphy = dev->mt76.phy2;
444 mphy = &dev->mt76.phy;
446 phy = (struct mt7615_phy *)mphy->priv;
448 spin_lock_bh(&dev->mt76.lock);
449 __skb_queue_tail(&phy->scan_event_list, skb);
450 spin_unlock_bh(&dev->mt76.lock);
452 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
453 MT7615_HW_SCAN_TIMEOUT);
457 mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
459 struct mt7615_roc_tlv *event;
460 struct mt7615_phy *phy;
461 struct mt76_phy *mphy;
464 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
465 event = (struct mt7615_roc_tlv *)skb->data;
467 if (event->dbdc_band && dev->mt76.phy2)
468 mphy = dev->mt76.phy2;
470 mphy = &dev->mt76.phy;
472 ieee80211_ready_on_channel(mphy->hw);
474 phy = (struct mt7615_phy *)mphy->priv;
475 phy->roc_grant = true;
476 wake_up(&phy->roc_wait);
478 duration = le32_to_cpu(event->max_interval);
479 mod_timer(&phy->roc_timer,
480 round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
484 mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
486 struct mt76_connac_beacon_loss_event *event;
487 struct mt76_phy *mphy;
488 u8 band_idx = 0; /* DBDC support */
490 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
491 event = (struct mt76_connac_beacon_loss_event *)skb->data;
492 if (band_idx && dev->mt76.phy2)
493 mphy = dev->mt76.phy2;
495 mphy = &dev->mt76.phy;
497 ieee80211_iterate_active_interfaces_atomic(mphy->hw,
498 IEEE80211_IFACE_ITER_RESUME_ALL,
499 mt76_connac_mcu_beacon_loss_iter,
504 mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
506 struct mt76_connac_mcu_bss_event *event;
507 struct mt76_phy *mphy;
508 u8 band_idx = 0; /* DBDC support */
510 skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
511 event = (struct mt76_connac_mcu_bss_event *)skb->data;
513 if (band_idx && dev->mt76.phy2)
514 mphy = dev->mt76.phy2;
516 mphy = &dev->mt76.phy;
518 if (event->is_absent)
519 ieee80211_stop_queues(mphy->hw);
521 ieee80211_wake_queues(mphy->hw);
525 mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
527 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
531 mt7615_mcu_rx_ext_event(dev, skb);
533 case MCU_EVENT_BSS_BEACON_LOSS:
534 mt7615_mcu_beacon_loss_event(dev, skb);
537 mt7615_mcu_roc_event(dev, skb);
539 case MCU_EVENT_SCHED_SCAN_DONE:
540 case MCU_EVENT_SCAN_DONE:
541 mt7615_mcu_scan_event(dev, skb);
543 case MCU_EVENT_BSS_ABSENCE:
544 mt7615_mcu_bss_event(dev, skb);
552 void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
554 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
556 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
557 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
558 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
559 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
560 rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
561 rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
562 rxd->eid == MCU_EVENT_BSS_ABSENCE ||
563 rxd->eid == MCU_EVENT_SCAN_DONE ||
564 rxd->eid == MCU_EVENT_ROC ||
566 mt7615_mcu_rx_unsolicited_event(dev, skb);
568 mt76_mcu_rx_event(&dev->mt76, skb);
572 mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif,
573 bool bssid, bool enable)
575 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
576 u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
577 u32 mask = dev->omac_mask >> 32 & ~BIT(idx);
578 const u8 *addr = vif->addr;
590 .mode = !!mask || enable,
594 .index = idx * 2 + bssid,
598 addr = vif->bss_conf.bssid;
601 ether_addr_copy(req.addr, addr);
603 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MUAR_UPDATE, &req,
608 mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
611 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
612 struct mt7615_dev *dev = phy->dev;
626 u8 omac_addr[ETH_ALEN];
630 .omac_idx = mvif->mt76.omac_idx,
631 .band_idx = mvif->mt76.band_idx,
632 .tlv_num = cpu_to_le16(1),
636 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
637 .len = cpu_to_le16(sizeof(struct req_tlv)),
639 .band_idx = mvif->mt76.band_idx,
643 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
644 return mt7615_mcu_muar_config(dev, vif, false, enable);
646 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
647 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DEV_INFO_UPDATE,
648 &data, sizeof(data), true);
652 mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
653 struct ieee80211_hw *hw,
654 struct ieee80211_vif *vif, bool enable)
656 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
657 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
658 struct ieee80211_mutable_offsets offs;
659 struct ieee80211_tx_info *info;
666 u8 need_pre_tbtt_int;
672 /* bss color change */
676 .omac_idx = mvif->mt76.omac_idx,
678 .wlan_idx = wcid->idx,
679 .band_idx = mvif->mt76.band_idx,
683 skb = ieee80211_beacon_get_template(hw, vif, &offs);
687 if (skb->len > 512 - MT_TXD_SIZE) {
688 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
693 if (mvif->mt76.band_idx) {
694 info = IEEE80211_SKB_CB(skb);
695 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
698 mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
700 memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
701 req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
702 req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
703 if (offs.cntdwn_counter_offs[0]) {
706 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
707 req.csa_ie_pos = cpu_to_le16(csa_offs);
708 req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]];
712 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_BCN_OFFLOAD, &req,
717 mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
719 #define ENTER_PM_STATE 1
720 #define EXIT_PM_STATE 2
739 .pm_state = state ? ENTER_PM_STATE : EXIT_PM_STATE,
743 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PM_STATE_CTRL, &req,
748 mt7615_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
749 struct ieee80211_sta *sta, bool enable)
751 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
752 u32 type = vif->p2p ? NETWORK_P2P : NETWORK_INFRA;
753 struct bss_info_basic *bss;
754 u8 wlan_idx = mvif->sta.wcid.idx;
757 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
760 case NL80211_IFTYPE_MESH_POINT:
761 case NL80211_IFTYPE_AP:
763 case NL80211_IFTYPE_STATION:
764 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
766 struct mt7615_sta *msta;
768 msta = (struct mt7615_sta *)sta->drv_priv;
769 wlan_idx = msta->wcid.idx;
772 case NL80211_IFTYPE_ADHOC:
780 bss = (struct bss_info_basic *)tlv;
781 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
782 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
783 bss->network_type = cpu_to_le32(type);
784 bss->dtim_period = vif->bss_conf.dtim_period;
785 bss->bmc_tx_wlan_idx = wlan_idx;
786 bss->wmm_idx = mvif->mt76.wmm_idx;
787 bss->active = enable;
793 mt7615_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
795 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
796 u8 omac_idx = mvif->mt76.omac_idx;
797 struct bss_info_omac *omac;
801 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
804 case NL80211_IFTYPE_MESH_POINT:
805 case NL80211_IFTYPE_AP:
807 type = CONNECTION_P2P_GO;
809 type = CONNECTION_INFRA_AP;
811 case NL80211_IFTYPE_STATION:
813 type = CONNECTION_P2P_GC;
815 type = CONNECTION_INFRA_STA;
817 case NL80211_IFTYPE_ADHOC:
818 type = CONNECTION_IBSS_ADHOC;
825 omac = (struct bss_info_omac *)tlv;
826 omac->conn_type = cpu_to_le32(type);
827 omac->omac_idx = mvif->mt76.omac_idx;
828 omac->band_idx = mvif->mt76.band_idx;
829 omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx;
832 /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
833 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
835 mt7615_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt7615_vif *mvif)
837 struct bss_info_ext_bss *ext;
838 int ext_bss_idx, tsf_offset;
841 ext_bss_idx = mvif->mt76.omac_idx - EXT_BSSID_START;
845 tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
847 ext = (struct bss_info_ext_bss *)tlv;
848 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
849 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
853 mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
854 struct ieee80211_sta *sta, bool enable)
856 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
857 struct mt7615_dev *dev = phy->dev;
860 if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
861 mt7615_mcu_muar_config(dev, vif, true, enable);
863 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL);
868 mt7615_mcu_bss_omac_tlv(skb, vif);
870 mt7615_mcu_bss_basic_tlv(skb, vif, sta, enable);
872 if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START &&
873 mvif->mt76.omac_idx < REPEATER_BSSID_START)
874 mt7615_mcu_bss_ext_tlv(skb, mvif);
876 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
877 MCU_EXT_CMD_BSS_INFO_UPDATE, true);
881 mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
882 struct ieee80211_ampdu_params *params,
885 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
886 struct mt7615_vif *mvif = msta->vif;
887 struct wtbl_req_hdr *wtbl_hdr;
888 struct sk_buff *skb = NULL;
891 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
892 WTBL_SET, NULL, &skb);
893 if (IS_ERR(wtbl_hdr))
894 return PTR_ERR(wtbl_hdr);
896 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true,
899 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
904 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
909 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true);
911 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
912 MCU_EXT_CMD_STA_REC_UPDATE, true);
916 mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
917 struct ieee80211_ampdu_params *params,
920 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
921 struct mt7615_vif *mvif = msta->vif;
922 struct wtbl_req_hdr *wtbl_hdr;
926 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
931 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
933 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
934 MCU_EXT_CMD_STA_REC_UPDATE, true);
935 if (err < 0 || !enable)
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, false,
947 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
952 mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
953 struct ieee80211_sta *sta, bool enable)
955 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
956 struct sk_buff *skb, *sskb, *wskb = NULL;
957 struct mt7615_dev *dev = phy->dev;
958 struct wtbl_req_hdr *wtbl_hdr;
959 struct mt7615_sta *msta;
962 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
964 sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
967 return PTR_ERR(sskb);
969 mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable);
971 mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif);
973 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
974 WTBL_RESET_AND_SET, NULL,
976 if (IS_ERR(wtbl_hdr))
977 return PTR_ERR(wtbl_hdr);
980 mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta,
983 mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
987 cmd = enable ? MCU_EXT_CMD_WTBL_UPDATE : MCU_EXT_CMD_STA_REC_UPDATE;
988 skb = enable ? wskb : sskb;
990 err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
992 skb = enable ? sskb : wskb;
998 cmd = enable ? MCU_EXT_CMD_STA_REC_UPDATE : MCU_EXT_CMD_WTBL_UPDATE;
999 skb = enable ? sskb : wskb;
1001 return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1004 static const struct mt7615_mcu_ops wtbl_update_ops = {
1005 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1006 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1007 .add_dev_info = mt7615_mcu_add_dev,
1008 .add_bss_info = mt7615_mcu_add_bss,
1009 .add_tx_ba = mt7615_mcu_wtbl_tx_ba,
1010 .add_rx_ba = mt7615_mcu_wtbl_rx_ba,
1011 .sta_add = mt7615_mcu_wtbl_sta_add,
1012 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1013 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1017 mt7615_mcu_sta_ba(struct mt7615_dev *dev,
1018 struct ieee80211_ampdu_params *params,
1019 bool enable, bool tx)
1021 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1022 struct mt7615_vif *mvif = msta->vif;
1023 struct wtbl_req_hdr *wtbl_hdr;
1024 struct tlv *sta_wtbl;
1025 struct sk_buff *skb;
1027 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1030 return PTR_ERR(skb);
1032 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
1034 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1036 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1037 WTBL_SET, sta_wtbl, &skb);
1038 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx,
1039 sta_wtbl, wtbl_hdr);
1041 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1042 MCU_EXT_CMD_STA_REC_UPDATE, true);
1046 mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
1047 struct ieee80211_ampdu_params *params,
1050 return mt7615_mcu_sta_ba(dev, params, enable, true);
1054 mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
1055 struct ieee80211_ampdu_params *params,
1058 return mt7615_mcu_sta_ba(dev, params, enable, false);
1062 __mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
1063 struct ieee80211_sta *sta, bool enable, int cmd)
1065 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1066 struct mt76_wcid *wcid;
1068 wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
1069 return mt76_connac_mcu_add_sta_cmd(phy, vif, sta, wcid, enable, cmd);
1073 mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1074 struct ieee80211_sta *sta, bool enable)
1076 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1077 MCU_EXT_CMD_STA_REC_UPDATE);
1080 static const struct mt7615_mcu_ops sta_update_ops = {
1081 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1082 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1083 .add_dev_info = mt7615_mcu_add_dev,
1084 .add_bss_info = mt7615_mcu_add_bss,
1085 .add_tx_ba = mt7615_mcu_sta_tx_ba,
1086 .add_rx_ba = mt7615_mcu_sta_rx_ba,
1087 .sta_add = mt7615_mcu_add_sta,
1088 .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
1089 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1093 mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
1099 mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
1100 struct ieee80211_hw *hw,
1101 struct ieee80211_vif *vif,
1104 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1105 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1106 struct ieee80211_mutable_offsets offs;
1112 struct bcn_content_tlv {
1118 /* 0: enable beacon offload
1119 * 1: disable beacon offload
1120 * 2: update probe respond offload
1123 /* 0: legacy format (TXD + payload)
1124 * 1: only cap field IE
1129 } __packed beacon_tlv;
1132 .bss_idx = mvif->mt76.idx,
1135 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1136 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1140 struct sk_buff *skb;
1142 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs);
1146 if (skb->len > 512 - MT_TXD_SIZE) {
1147 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1152 mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
1153 wcid, NULL, 0, NULL, true);
1154 memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1155 req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1156 req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1158 if (offs.cntdwn_counter_offs[0]) {
1161 csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
1162 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1166 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1167 &req, sizeof(req), true);
1171 mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1174 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1176 return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
1181 mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1182 struct ieee80211_sta *sta, bool enable)
1184 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1186 return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
1191 mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
1192 struct ieee80211_sta *sta, bool enable)
1194 return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
1195 MCU_UNI_CMD_STA_REC_UPDATE);
1199 mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
1200 struct ieee80211_ampdu_params *params,
1203 struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv;
1205 return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params,
1210 mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
1211 struct ieee80211_ampdu_params *params,
1214 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1215 struct mt7615_vif *mvif = msta->vif;
1216 struct wtbl_req_hdr *wtbl_hdr;
1217 struct tlv *sta_wtbl;
1218 struct sk_buff *skb;
1221 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1224 return PTR_ERR(skb);
1226 mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
1228 err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1229 MCU_UNI_CMD_STA_REC_UPDATE, true);
1230 if (err < 0 || !enable)
1233 skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
1236 return PTR_ERR(skb);
1238 sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
1239 sizeof(struct tlv));
1241 wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
1242 WTBL_SET, sta_wtbl, &skb);
1243 if (IS_ERR(wtbl_hdr))
1244 return PTR_ERR(wtbl_hdr);
1246 mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
1247 sta_wtbl, wtbl_hdr);
1249 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1250 MCU_UNI_CMD_STA_REC_UPDATE, true);
1253 static const struct mt7615_mcu_ops uni_update_ops = {
1254 .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
1255 .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
1256 .add_dev_info = mt7615_mcu_uni_add_dev,
1257 .add_bss_info = mt7615_mcu_uni_add_bss,
1258 .add_tx_ba = mt7615_mcu_uni_tx_ba,
1259 .add_rx_ba = mt7615_mcu_uni_rx_ba,
1260 .sta_add = mt7615_mcu_uni_add_sta,
1261 .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
1262 .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
1265 int mt7615_mcu_restart(struct mt76_dev *dev)
1267 return mt76_mcu_send_msg(dev, MCU_CMD_RESTART_DL_REQ, NULL, 0, true);
1269 EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
1271 static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
1273 const struct mt7615_patch_hdr *hdr;
1274 const struct firmware *fw = NULL;
1277 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true);
1281 case PATCH_NOT_DL_SEM_SUCCESS:
1284 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
1288 ret = firmware_request_nowarn(&fw, name, dev->mt76.dev);
1292 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
1293 dev_err(dev->mt76.dev, "Invalid firmware\n");
1298 hdr = (const struct mt7615_patch_hdr *)(fw->data);
1300 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
1301 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
1303 len = fw->size - sizeof(*hdr);
1305 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1308 dev_err(dev->mt76.dev, "Download request failed\n");
1312 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER,
1313 fw->data + sizeof(*hdr), len);
1315 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1319 ret = mt76_connac_mcu_start_patch(&dev->mt76);
1321 dev_err(dev->mt76.dev, "Failed to start patch\n");
1324 release_firmware(fw);
1326 sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
1328 case PATCH_REL_SEM_SUCCESS:
1332 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
1339 static u32 mt7615_mcu_gen_dl_mode(u8 feature_set, bool is_cr4)
1343 ret |= (feature_set & FW_FEATURE_SET_ENCRYPT) ?
1344 (DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV) : 0;
1345 ret |= FIELD_PREP(DL_MODE_KEY_IDX,
1346 FIELD_GET(FW_FEATURE_SET_KEY_IDX, feature_set));
1347 ret |= DL_MODE_NEED_RSP;
1348 ret |= is_cr4 ? DL_MODE_WORKING_PDA_CR4 : 0;
1354 mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
1355 const struct mt7615_fw_trailer *hdr,
1356 const u8 *data, bool is_cr4)
1358 int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
1359 int err, i, offset = 0;
1360 u32 len, addr, mode;
1362 for (i = 0; i < n_region; i++) {
1363 mode = mt7615_mcu_gen_dl_mode(hdr[i].feature_set, is_cr4);
1364 len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
1365 addr = le32_to_cpu(hdr[i].addr);
1367 err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1370 dev_err(dev->mt76.dev, "Download request failed\n");
1374 err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER,
1375 data + offset, len);
1377 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1387 static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
1389 const struct mt7615_fw_trailer *hdr;
1390 const struct firmware *fw;
1393 ret = request_firmware(&fw, name, dev->mt76.dev);
1397 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
1398 dev_err(dev->mt76.dev, "Invalid firmware\n");
1403 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1404 N9_REGION_NUM * sizeof(*hdr));
1406 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1407 hdr->fw_ver, hdr->build_date);
1409 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
1413 ret = mt76_connac_mcu_start_firmware(&dev->mt76,
1414 le32_to_cpu(hdr->addr),
1417 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1421 snprintf(dev->mt76.hw->wiphy->fw_version,
1422 sizeof(dev->mt76.hw->wiphy->fw_version),
1423 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1425 if (!is_mt7615(&dev->mt76) &&
1426 !strncmp(hdr->fw_ver, "2.0", sizeof(hdr->fw_ver))) {
1427 dev->fw_ver = MT7615_FIRMWARE_V2;
1428 dev->mcu_ops = &sta_update_ops;
1430 dev->fw_ver = MT7615_FIRMWARE_V1;
1431 dev->mcu_ops = &wtbl_update_ops;
1435 release_firmware(fw);
1439 static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
1441 const struct mt7615_fw_trailer *hdr;
1442 const struct firmware *fw;
1445 ret = request_firmware(&fw, name, dev->mt76.dev);
1449 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
1450 dev_err(dev->mt76.dev, "Invalid firmware\n");
1455 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1456 CR4_REGION_NUM * sizeof(*hdr));
1458 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
1459 hdr->fw_ver, hdr->build_date);
1461 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
1465 ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
1466 FW_START_WORKING_PDA_CR4);
1468 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
1473 release_firmware(fw);
1478 static int mt7615_load_ram(struct mt7615_dev *dev)
1482 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
1486 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
1489 static int mt7615_load_firmware(struct mt7615_dev *dev)
1494 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
1496 if (val != FW_STATE_FW_DOWNLOAD) {
1497 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1501 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
1505 ret = mt7615_load_ram(dev);
1509 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
1510 FIELD_PREP(MT_TOP_MISC2_FW_STATE,
1511 FW_STATE_CR4_RDY), 500)) {
1512 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1519 static int mt7622_load_firmware(struct mt7615_dev *dev)
1524 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1526 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
1527 if (val != FW_STATE_FW_DOWNLOAD) {
1528 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1532 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
1536 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
1540 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
1541 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
1542 FW_STATE_NORMAL_TRX), 1500)) {
1543 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1547 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1552 int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
1561 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_LOG_2_HOST, &data,
1562 sizeof(data), true);
1565 static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
1567 u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
1568 const struct mt7663_fw_trailer *hdr;
1569 const struct mt7663_fw_buf *buf;
1570 const struct firmware *fw;
1571 const u8 *base_addr;
1574 ret = request_firmware(&fw, name, dev->mt76.dev);
1578 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
1579 dev_err(dev->mt76.dev, "Invalid firmware\n");
1584 hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size -
1585 FW_V3_COMMON_TAILER_SIZE);
1587 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1588 hdr->fw_ver, hdr->build_date);
1589 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
1591 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
1592 for (i = 0; i < hdr->n_region; i++) {
1593 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
1594 u32 len, addr, mode;
1596 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
1598 buf = (const struct mt7663_fw_buf *)(base_addr - shift);
1599 mode = mt7615_mcu_gen_dl_mode(buf->feature_set, false);
1600 addr = le32_to_cpu(buf->img_dest_addr);
1601 len = le32_to_cpu(buf->img_size);
1603 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1606 dev_err(dev->mt76.dev, "Download request failed\n");
1610 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER,
1611 fw->data + offset, len);
1613 dev_err(dev->mt76.dev, "Failed to send firmware\n");
1617 offset += le32_to_cpu(buf->img_size);
1618 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
1619 override_addr = le32_to_cpu(buf->img_dest_addr);
1620 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
1626 flag |= FW_START_OVERRIDE;
1628 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
1629 override_addr, flag);
1631 ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
1633 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1637 snprintf(dev->mt76.hw->wiphy->fw_version,
1638 sizeof(dev->mt76.hw->wiphy->fw_version),
1639 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1642 release_firmware(fw);
1648 mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
1650 const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
1651 const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
1654 if (!prefer_offload_fw) {
1655 secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
1656 primary_rom = MT7663_ROM_PATCH;
1658 selected_rom = primary_rom;
1660 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
1662 dev_info(dev->mt76.dev, "%s not found, switching to %s",
1663 primary_rom, secondary_rom);
1664 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
1667 dev_err(dev->mt76.dev, "failed to load %s",
1671 selected_rom = secondary_rom;
1674 if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
1675 *n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
1676 dev->fw_ver = MT7615_FIRMWARE_V3;
1677 dev->mcu_ops = &uni_update_ops;
1679 *n9_firmware = MT7663_FIRMWARE_N9;
1680 dev->fw_ver = MT7615_FIRMWARE_V2;
1681 dev->mcu_ops = &sta_update_ops;
1687 int __mt7663_load_firmware(struct mt7615_dev *dev)
1689 const char *n9_firmware;
1692 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
1694 dev_dbg(dev->mt76.dev, "Firmware is already download\n");
1698 ret = mt7663_load_rom_patch(dev, &n9_firmware);
1702 ret = mt7663_load_n9(dev, n9_firmware);
1706 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
1707 MT_TOP_MISC2_FW_N9_RDY, 1500)) {
1708 ret = mt76_get_field(dev, MT_CONN_ON_MISC,
1709 MT7663_TOP_MISC2_FW_STATE);
1710 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1715 if (mt7615_firmware_offload(dev))
1716 dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
1717 #endif /* CONFIG_PM */
1719 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1723 EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
1725 static int mt7663_load_firmware(struct mt7615_dev *dev)
1729 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1731 ret = __mt7663_load_firmware(dev);
1735 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1740 int mt7615_mcu_init(struct mt7615_dev *dev)
1742 static const struct mt76_mcu_ops mt7615_mcu_ops = {
1743 .headroom = sizeof(struct mt7615_mcu_txd),
1744 .mcu_skb_send_msg = mt7615_mcu_send_message,
1745 .mcu_parse_response = mt7615_mcu_parse_response,
1746 .mcu_restart = mt7615_mcu_restart,
1750 dev->mt76.mcu_ops = &mt7615_mcu_ops,
1752 ret = mt7615_mcu_drv_pmctrl(dev);
1756 switch (mt76_chip(&dev->mt76)) {
1758 ret = mt7622_load_firmware(dev);
1761 ret = mt7663_load_firmware(dev);
1764 ret = mt7615_load_firmware(dev);
1770 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
1771 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1772 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
1773 mt7615_mcu_fw_log_2_host(dev, 0);
1777 EXPORT_SYMBOL_GPL(mt7615_mcu_init);
1779 void mt7615_mcu_exit(struct mt7615_dev *dev)
1781 __mt76_mcu_restart(&dev->mt76);
1782 mt7615_mcu_set_fw_ctrl(dev);
1783 skb_queue_purge(&dev->mt76.mcu.res_q);
1785 EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
1787 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
1793 } __packed req_hdr = {
1796 u8 *eep = (u8 *)dev->mt76.eeprom.data;
1797 struct sk_buff *skb;
1798 int eep_len, offset;
1800 switch (mt76_chip(&dev->mt76)) {
1802 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
1803 offset = MT_EE_NIC_CONF_0;
1806 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
1807 req_hdr.content_format = 1;
1808 offset = MT_EE_CHIP_ID;
1811 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
1812 offset = MT_EE_NIC_CONF_0;
1816 req_hdr.len = cpu_to_le16(eep_len);
1818 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
1822 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
1823 skb_put_data(skb, eep + offset, eep_len);
1825 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1826 MCU_EXT_CMD_EFUSE_BUFFER_MODE, true);
1829 int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
1830 const struct ieee80211_tx_queue_params *params)
1832 #define WMM_AIFS_SET BIT(0)
1833 #define WMM_CW_MIN_SET BIT(1)
1834 #define WMM_CW_MAX_SET BIT(2)
1835 #define WMM_TXOP_SET BIT(3)
1836 #define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
1837 WMM_CW_MAX_SET | WMM_TXOP_SET)
1850 .valid = WMM_PARAM_SET,
1851 .aifs = params->aifs,
1853 .cw_max = cpu_to_le16(10),
1854 .txop = cpu_to_le16(params->txop),
1858 req.cw_min = fls(params->cw_min);
1860 req.cw_max = cpu_to_le16(fls(params->cw_max));
1862 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req,
1866 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
1868 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
1879 struct dbdc_entry entry[64];
1881 .enable = !!ext_phy,
1888 #define ADD_DBDC_ENTRY(_type, _idx, _band) \
1890 req.entry[req.num].type = _type; \
1891 req.entry[req.num].index = _idx; \
1892 req.entry[req.num++].band = _band; \
1895 for (i = 0; i < 4; i++) {
1896 bool band = !!(ext_phy->omac_mask & BIT_ULL(i));
1898 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
1901 for (i = 0; i < 14; i++) {
1902 bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i));
1904 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
1907 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
1909 for (i = 0; i < 3; i++)
1910 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
1912 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
1913 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
1914 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
1915 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
1917 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
1918 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
1921 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DBDC_CTRL, &req,
1925 int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
1927 struct wtbl_req_hdr req = {
1928 .operation = WTBL_RESET_ALL,
1931 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE, &req,
1935 int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
1936 enum mt7615_rdd_cmd cmd, u8 index,
1948 .rdd_rx_sel = rx_sel,
1952 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_CTRL, &req,
1956 int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
1962 .tag = cpu_to_le16(0x1),
1963 .min_lpn = cpu_to_le16(val),
1966 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
1970 int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
1971 const struct mt7615_dfs_pulse *pulse)
1975 __le32 max_width; /* us */
1976 __le32 max_pwr; /* dbm */
1977 __le32 min_pwr; /* dbm */
1978 __le32 min_stgr_pri; /* us */
1979 __le32 max_stgr_pri; /* us */
1980 __le32 min_cr_pri; /* us */
1981 __le32 max_cr_pri; /* us */
1983 .tag = cpu_to_le16(0x3),
1984 #define __req_field(field) .field = cpu_to_le32(pulse->field)
1985 __req_field(max_width),
1986 __req_field(max_pwr),
1987 __req_field(min_pwr),
1988 __req_field(min_stgr_pri),
1989 __req_field(max_stgr_pri),
1990 __req_field(min_cr_pri),
1991 __req_field(max_cr_pri),
1995 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
1999 int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
2000 const struct mt7615_dfs_pattern *pattern)
2020 .tag = cpu_to_le16(0x2),
2021 .radar_type = cpu_to_le16(index),
2022 #define __req_field_u8(field) .field = pattern->field
2023 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2024 __req_field_u8(enb),
2025 __req_field_u8(stgr),
2026 __req_field_u8(min_crpn),
2027 __req_field_u8(max_crpn),
2028 __req_field_u8(min_crpr),
2029 __req_field_u8(min_pw),
2030 __req_field_u8(max_pw),
2031 __req_field_u32(min_pri),
2032 __req_field_u32(max_pri),
2033 __req_field_u8(min_crbn),
2034 __req_field_u8(max_crbn),
2035 __req_field_u8(min_stgpn),
2036 __req_field_u8(max_stgpn),
2037 __req_field_u8(min_stgpr),
2038 #undef __req_field_u8
2039 #undef __req_field_u32
2042 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
2046 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
2057 .pulse_num = dev->radar_pattern.n_pulses,
2059 u32 start_time = ktime_to_ms(ktime_get_boottime());
2062 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
2065 /* TODO: add some noise here */
2066 for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2067 u32 ts = start_time + i * dev->radar_pattern.period;
2069 req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width);
2070 req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power);
2071 req.pattern[i].start_time = cpu_to_le32(ts);
2074 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_PATTERN,
2075 &req, sizeof(req), false);
2078 static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2080 struct mt76_phy *mphy = phy->mt76;
2081 struct ieee80211_hw *hw = mphy->hw;
2082 int n_chains = hweight8(mphy->antenna_mask);
2086 tx_power = hw->conf.power_level * 2 -
2087 mt76_tx_power_nss_delta(n_chains);
2088 mphy->txpower_cur = tx_power;
2090 for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2093 for (i = 0; i < 4; i++) {
2096 if (i < n_chains - 1)
2097 delta = mt76_tx_power_nss_delta(n_chains) -
2098 mt76_tx_power_nss_delta(i + 1);
2099 sku[MT_SKU_1SS_DELTA + i] = delta;
2103 static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2105 static const u8 width_to_bw[] = {
2106 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2107 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2108 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2109 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2110 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2111 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2112 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2113 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2116 if (chandef->width >= ARRAY_SIZE(width_to_bw))
2119 return width_to_bw[chandef->width];
2122 int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2124 struct mt7615_dev *dev = phy->dev;
2125 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2126 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2135 /* for 80+80 only */
2140 __le32 outband_freq;
2146 .control_chan = chandef->chan->hw_value,
2147 .center_chan = ieee80211_frequency_to_channel(freq1),
2148 .tx_streams = hweight8(phy->mt76->antenna_mask),
2149 .rx_streams_mask = phy->mt76->chainmask,
2150 .center_chan2 = ieee80211_frequency_to_channel(freq2),
2153 if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2154 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2155 else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
2156 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
2157 req.switch_reason = CH_SWITCH_DFS;
2159 req.switch_reason = CH_SWITCH_NORMAL;
2161 req.band_idx = phy != &dev->phy;
2162 req.bw = mt7615_mcu_chan_bw(chandef);
2164 if (mt76_testmode_enabled(phy->mt76))
2165 memset(req.txpower_sku, 0x3f, 49);
2167 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2169 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2172 int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index)
2181 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
2185 int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
2197 .test_mode_en = test_mode,
2199 .value = cpu_to_le32(val),
2202 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_ATE_CTRL, &req,
2203 sizeof(req), false);
2206 int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2208 struct mt7615_dev *dev = phy->dev;
2216 .band_idx = phy != &dev->phy,
2217 .sku_enable = enable,
2220 return mt76_mcu_send_msg(&dev->mt76,
2221 MCU_EXT_CMD_TX_POWER_FEATURE_CTRL, &req,
2225 static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
2229 for (i = 0; i < n_freqs; i++)
2230 if (cur == freqs[i])
2236 static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
2238 static const u16 freq_list[] = {
2239 4980, 5805, 5905, 5190,
2240 5230, 5270, 5310, 5350,
2241 5390, 5430, 5470, 5510,
2242 5550, 5590, 5630, 5670,
2243 5710, 5755, 5795, 5835,
2244 5875, 5210, 5290, 5370,
2245 5450, 5530, 5610, 5690,
2248 static const u16 freq_bw40[] = {
2249 5190, 5230, 5270, 5310,
2250 5350, 5390, 5430, 5470,
2251 5510, 5550, 5590, 5630,
2252 5670, 5710, 5755, 5795,
2255 int offset_2g = ARRAY_SIZE(freq_list);
2262 return offset_2g + 1;
2264 return offset_2g + 2;
2266 return offset_2g + 3;
2270 case NL80211_CHAN_WIDTH_80:
2271 case NL80211_CHAN_WIDTH_80P80:
2272 case NL80211_CHAN_WIDTH_160:
2275 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2278 freq = freq_bw40[idx];
2282 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2285 freq = freq_bw40[idx];
2289 case NL80211_CHAN_WIDTH_40:
2290 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2299 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2302 int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
2304 struct mt7615_dev *dev = phy->dev;
2305 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2306 int freq2 = chandef->center_freq2;
2310 u8 runtime_calibration;
2323 __le32 sx0_i_lna[4];
2324 __le32 sx0_q_lna[4];
2326 __le32 sx2_i_lna[4];
2327 __le32 sx2_q_lna[4];
2332 .bw = mt7615_mcu_chan_bw(chandef),
2333 .band = chandef->center_freq1 > 4000,
2334 .dbdc_en = !!dev->mt76.phy2,
2336 u16 center_freq = chandef->center_freq1;
2338 u8 *eep = dev->mt76.eeprom.data;
2340 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
2343 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2344 freq2 = center_freq + 40;
2349 req.runtime_calibration = 1;
2350 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
2354 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
2355 freq_idx * MT7615_EEPROM_DCOC_SIZE,
2356 sizeof(req.dcoc_data));
2357 req.runtime_calibration = 0;
2360 req.center_freq = cpu_to_le16(center_freq);
2361 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RXDCOC_CAL, &req,
2364 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2365 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2366 req.is_freq2 = true;
2367 center_freq = freq2;
2374 static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
2376 static const u16 freq_list[] = {
2377 4920, 4940, 4960, 4980,
2378 5040, 5060, 5080, 5180,
2379 5200, 5220, 5240, 5260,
2380 5280, 5300, 5320, 5340,
2381 5360, 5380, 5400, 5420,
2382 5440, 5460, 5480, 5500,
2383 5520, 5540, 5560, 5580,
2384 5600, 5620, 5640, 5660,
2385 5680, 5700, 5720, 5745,
2386 5765, 5785, 5805, 5825,
2387 5845, 5865, 5885, 5905
2389 int offset_2g = ARRAY_SIZE(freq_list);
2396 return offset_2g + 1;
2398 return offset_2g + 2;
2401 if (bw != NL80211_CHAN_WIDTH_20) {
2402 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2407 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2413 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2417 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
2419 struct mt7615_dev *dev = phy->dev;
2420 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2421 int freq2 = chandef->center_freq2;
2425 u8 runtime_calibration;
2453 .bw = mt7615_mcu_chan_bw(chandef),
2454 .band = chandef->center_freq1 > 4000,
2455 .dbdc_en = !!dev->mt76.phy2,
2457 u16 center_freq = chandef->center_freq1;
2459 u8 *eep = dev->mt76.eeprom.data;
2461 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
2464 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2465 freq2 = center_freq + 40;
2470 req.runtime_calibration = 1;
2471 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
2475 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
2476 freq_idx * MT7615_EEPROM_TXDPD_SIZE,
2477 sizeof(req.dpd_data));
2478 req.runtime_calibration = 0;
2481 req.center_freq = cpu_to_le16(center_freq);
2482 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TXDPD_CAL, &req,
2485 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2486 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2487 req.is_freq2 = true;
2488 center_freq = freq2;
2495 int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
2498 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2503 __le16 bcn_interval;
2506 u8 bmc_delivered_ac;
2507 u8 bmc_triggered_ac;
2510 .bss_idx = mvif->mt76.idx,
2511 .aid = cpu_to_le16(vif->bss_conf.aid),
2512 .dtim_period = vif->bss_conf.dtim_period,
2513 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
2519 .bss_idx = mvif->mt76.idx,
2523 if (vif->type != NL80211_IFTYPE_STATION)
2526 err = mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_ABORT, &req_hdr,
2527 sizeof(req_hdr), false);
2528 if (err < 0 || !enable)
2531 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_CONNECTED, &req,
2532 sizeof(req), false);
2535 int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2536 struct ieee80211_channel *chan, int duration)
2538 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2539 struct mt7615_dev *dev = phy->dev;
2540 struct mt7615_roc_tlv req = {
2541 .bss_idx = mvif->mt76.idx,
2543 .max_interval = cpu_to_le32(duration),
2544 .primary_chan = chan ? chan->hw_value : 0,
2545 .band = chan ? chan->band : 0,
2549 phy->roc_grant = false;
2551 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_ROC, &req,
2552 sizeof(req), false);
2555 int mt7615_mcu_update_arp_filter(struct ieee80211_hw *hw,
2556 struct ieee80211_vif *vif,
2557 struct ieee80211_bss_conf *info)
2559 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2560 struct mt7615_dev *dev = mt7615_hw_dev(hw);
2561 struct sk_buff *skb;
2562 int i, len = min_t(int, info->arp_addr_cnt,
2563 IEEE80211_BSS_ARP_ADDR_LIST_LEN);
2569 struct mt76_connac_arpns_tlv arp;
2572 .bss_idx = mvif->mt76.idx,
2575 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2576 .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
2578 .mode = 2, /* update */
2583 if (!mt7615_firmware_offload(dev))
2586 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2587 sizeof(req_hdr) + len * sizeof(__be32));
2591 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2592 for (i = 0; i < len; i++) {
2593 u8 *addr = (u8 *)skb_put(skb, sizeof(__be32));
2595 memcpy(addr, &info->arp_addr_list[i], sizeof(__be32));
2598 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
2602 int mt7615_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
2603 struct ieee80211_vif *vif)
2605 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2606 int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
2607 struct mt7615_dev *dev = mt7615_hw_dev(hw);
2613 .ct_win = cpu_to_le32(ct_window),
2614 .bss_idx = mvif->mt76.idx,
2617 if (!mt7615_firmware_offload(dev))
2620 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_P2P_OPPPS, &req,
2621 sizeof(req), false);
2624 u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
2630 .addr = cpu_to_le32(offset),
2633 return mt76_mcu_send_msg(dev, MCU_CMD_REG_READ, &req, sizeof(req),
2636 EXPORT_SYMBOL_GPL(mt7615_mcu_reg_rr);
2638 void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
2644 .addr = cpu_to_le32(offset),
2645 .val = cpu_to_le32(val),
2648 mt76_mcu_send_msg(dev, MCU_CMD_REG_WRITE, &req, sizeof(req), false);
2650 EXPORT_SYMBOL_GPL(mt7615_mcu_reg_wr);