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 const struct wiphy_wowlan_support mt7615_wowlan_support = {
1388 .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
1389 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
1391 .pattern_min_len = 1,
1392 .pattern_max_len = MT7615_WOW_PATTEN_MAX_LEN,
1393 .max_nd_match_sets = 10,
1396 static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
1398 const struct mt7615_fw_trailer *hdr;
1399 const struct firmware *fw;
1402 ret = request_firmware(&fw, name, dev->mt76.dev);
1406 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
1407 dev_err(dev->mt76.dev, "Invalid firmware\n");
1412 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1413 N9_REGION_NUM * sizeof(*hdr));
1415 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1416 hdr->fw_ver, hdr->build_date);
1418 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
1422 ret = mt76_connac_mcu_start_firmware(&dev->mt76,
1423 le32_to_cpu(hdr->addr),
1426 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1430 snprintf(dev->mt76.hw->wiphy->fw_version,
1431 sizeof(dev->mt76.hw->wiphy->fw_version),
1432 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1434 if (!is_mt7615(&dev->mt76) &&
1435 !strncmp(hdr->fw_ver, "2.0", sizeof(hdr->fw_ver))) {
1436 dev->fw_ver = MT7615_FIRMWARE_V2;
1437 dev->mcu_ops = &sta_update_ops;
1439 dev->fw_ver = MT7615_FIRMWARE_V1;
1440 dev->mcu_ops = &wtbl_update_ops;
1444 release_firmware(fw);
1448 static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
1450 const struct mt7615_fw_trailer *hdr;
1451 const struct firmware *fw;
1454 ret = request_firmware(&fw, name, dev->mt76.dev);
1458 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
1459 dev_err(dev->mt76.dev, "Invalid firmware\n");
1464 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1465 CR4_REGION_NUM * sizeof(*hdr));
1467 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
1468 hdr->fw_ver, hdr->build_date);
1470 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
1474 ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
1475 FW_START_WORKING_PDA_CR4);
1477 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
1482 release_firmware(fw);
1487 static int mt7615_load_ram(struct mt7615_dev *dev)
1491 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
1495 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
1498 static int mt7615_load_firmware(struct mt7615_dev *dev)
1503 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
1505 if (val != FW_STATE_FW_DOWNLOAD) {
1506 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1510 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
1514 ret = mt7615_load_ram(dev);
1518 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
1519 FIELD_PREP(MT_TOP_MISC2_FW_STATE,
1520 FW_STATE_CR4_RDY), 500)) {
1521 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1528 static int mt7622_load_firmware(struct mt7615_dev *dev)
1533 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1535 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
1536 if (val != FW_STATE_FW_DOWNLOAD) {
1537 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1541 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
1545 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
1549 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
1550 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
1551 FW_STATE_NORMAL_TRX), 1500)) {
1552 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1556 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1561 int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
1570 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_LOG_2_HOST, &data,
1571 sizeof(data), true);
1574 static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
1576 u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
1577 const struct mt7663_fw_trailer *hdr;
1578 const struct mt7663_fw_buf *buf;
1579 const struct firmware *fw;
1580 const u8 *base_addr;
1583 ret = request_firmware(&fw, name, dev->mt76.dev);
1587 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
1588 dev_err(dev->mt76.dev, "Invalid firmware\n");
1593 hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size -
1594 FW_V3_COMMON_TAILER_SIZE);
1596 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1597 hdr->fw_ver, hdr->build_date);
1598 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
1600 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
1601 for (i = 0; i < hdr->n_region; i++) {
1602 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
1603 u32 len, addr, mode;
1605 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
1607 buf = (const struct mt7663_fw_buf *)(base_addr - shift);
1608 mode = mt7615_mcu_gen_dl_mode(buf->feature_set, false);
1609 addr = le32_to_cpu(buf->img_dest_addr);
1610 len = le32_to_cpu(buf->img_size);
1612 ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
1615 dev_err(dev->mt76.dev, "Download request failed\n");
1619 ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD_FW_SCATTER,
1620 fw->data + offset, len);
1622 dev_err(dev->mt76.dev, "Failed to send firmware\n");
1626 offset += le32_to_cpu(buf->img_size);
1627 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
1628 override_addr = le32_to_cpu(buf->img_dest_addr);
1629 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
1635 flag |= FW_START_OVERRIDE;
1637 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
1638 override_addr, flag);
1640 ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
1642 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1646 snprintf(dev->mt76.hw->wiphy->fw_version,
1647 sizeof(dev->mt76.hw->wiphy->fw_version),
1648 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1651 release_firmware(fw);
1657 mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
1659 const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
1660 const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
1663 if (!prefer_offload_fw) {
1664 secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
1665 primary_rom = MT7663_ROM_PATCH;
1667 selected_rom = primary_rom;
1669 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
1671 dev_info(dev->mt76.dev, "%s not found, switching to %s",
1672 primary_rom, secondary_rom);
1673 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
1676 dev_err(dev->mt76.dev, "failed to load %s",
1680 selected_rom = secondary_rom;
1683 if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
1684 *n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
1685 dev->fw_ver = MT7615_FIRMWARE_V3;
1686 dev->mcu_ops = &uni_update_ops;
1688 *n9_firmware = MT7663_FIRMWARE_N9;
1689 dev->fw_ver = MT7615_FIRMWARE_V2;
1690 dev->mcu_ops = &sta_update_ops;
1696 int __mt7663_load_firmware(struct mt7615_dev *dev)
1698 const char *n9_firmware;
1701 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
1703 dev_dbg(dev->mt76.dev, "Firmware is already download\n");
1707 ret = mt7663_load_rom_patch(dev, &n9_firmware);
1711 ret = mt7663_load_n9(dev, n9_firmware);
1715 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
1716 MT_TOP_MISC2_FW_N9_RDY, 1500)) {
1717 ret = mt76_get_field(dev, MT_CONN_ON_MISC,
1718 MT7663_TOP_MISC2_FW_STATE);
1719 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1724 if (mt7615_firmware_offload(dev))
1725 dev->mt76.hw->wiphy->wowlan = &mt7615_wowlan_support;
1726 #endif /* CONFIG_PM */
1728 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1732 EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
1734 static int mt7663_load_firmware(struct mt7615_dev *dev)
1738 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1740 ret = __mt7663_load_firmware(dev);
1744 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1749 int mt7615_mcu_init(struct mt7615_dev *dev)
1751 static const struct mt76_mcu_ops mt7615_mcu_ops = {
1752 .headroom = sizeof(struct mt7615_mcu_txd),
1753 .mcu_skb_send_msg = mt7615_mcu_send_message,
1754 .mcu_parse_response = mt7615_mcu_parse_response,
1755 .mcu_restart = mt7615_mcu_restart,
1759 dev->mt76.mcu_ops = &mt7615_mcu_ops,
1761 ret = mt7615_mcu_drv_pmctrl(dev);
1765 switch (mt76_chip(&dev->mt76)) {
1767 ret = mt7622_load_firmware(dev);
1770 ret = mt7663_load_firmware(dev);
1773 ret = mt7615_load_firmware(dev);
1779 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
1780 dev_dbg(dev->mt76.dev, "Firmware init done\n");
1781 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
1782 mt7615_mcu_fw_log_2_host(dev, 0);
1786 EXPORT_SYMBOL_GPL(mt7615_mcu_init);
1788 void mt7615_mcu_exit(struct mt7615_dev *dev)
1790 __mt76_mcu_restart(&dev->mt76);
1791 mt7615_mcu_set_fw_ctrl(dev);
1792 skb_queue_purge(&dev->mt76.mcu.res_q);
1794 EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
1796 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
1802 } __packed req_hdr = {
1805 u8 *eep = (u8 *)dev->mt76.eeprom.data;
1806 struct sk_buff *skb;
1807 int eep_len, offset;
1809 switch (mt76_chip(&dev->mt76)) {
1811 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
1812 offset = MT_EE_NIC_CONF_0;
1815 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
1816 req_hdr.content_format = 1;
1817 offset = MT_EE_CHIP_ID;
1820 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
1821 offset = MT_EE_NIC_CONF_0;
1825 req_hdr.len = cpu_to_le16(eep_len);
1827 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
1831 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
1832 skb_put_data(skb, eep + offset, eep_len);
1834 return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1835 MCU_EXT_CMD_EFUSE_BUFFER_MODE, true);
1838 int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
1839 const struct ieee80211_tx_queue_params *params)
1841 #define WMM_AIFS_SET BIT(0)
1842 #define WMM_CW_MIN_SET BIT(1)
1843 #define WMM_CW_MAX_SET BIT(2)
1844 #define WMM_TXOP_SET BIT(3)
1845 #define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
1846 WMM_CW_MAX_SET | WMM_TXOP_SET)
1859 .valid = WMM_PARAM_SET,
1860 .aifs = params->aifs,
1862 .cw_max = cpu_to_le16(10),
1863 .txop = cpu_to_le16(params->txop),
1867 req.cw_min = fls(params->cw_min);
1869 req.cw_max = cpu_to_le16(fls(params->cw_max));
1871 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req,
1875 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
1877 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
1888 struct dbdc_entry entry[64];
1890 .enable = !!ext_phy,
1897 #define ADD_DBDC_ENTRY(_type, _idx, _band) \
1899 req.entry[req.num].type = _type; \
1900 req.entry[req.num].index = _idx; \
1901 req.entry[req.num++].band = _band; \
1904 for (i = 0; i < 4; i++) {
1905 bool band = !!(ext_phy->omac_mask & BIT_ULL(i));
1907 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
1910 for (i = 0; i < 14; i++) {
1911 bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i));
1913 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
1916 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
1918 for (i = 0; i < 3; i++)
1919 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
1921 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
1922 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
1923 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
1924 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
1926 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
1927 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
1930 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DBDC_CTRL, &req,
1934 int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
1936 struct wtbl_req_hdr req = {
1937 .operation = WTBL_RESET_ALL,
1940 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE, &req,
1944 int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
1945 enum mt7615_rdd_cmd cmd, u8 index,
1957 .rdd_rx_sel = rx_sel,
1961 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_CTRL, &req,
1965 int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
1971 .tag = cpu_to_le16(0x1),
1972 .min_lpn = cpu_to_le16(val),
1975 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
1979 int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
1980 const struct mt7615_dfs_pulse *pulse)
1984 __le32 max_width; /* us */
1985 __le32 max_pwr; /* dbm */
1986 __le32 min_pwr; /* dbm */
1987 __le32 min_stgr_pri; /* us */
1988 __le32 max_stgr_pri; /* us */
1989 __le32 min_cr_pri; /* us */
1990 __le32 max_cr_pri; /* us */
1992 .tag = cpu_to_le16(0x3),
1993 #define __req_field(field) .field = cpu_to_le32(pulse->field)
1994 __req_field(max_width),
1995 __req_field(max_pwr),
1996 __req_field(min_pwr),
1997 __req_field(min_stgr_pri),
1998 __req_field(max_stgr_pri),
1999 __req_field(min_cr_pri),
2000 __req_field(max_cr_pri),
2004 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
2008 int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
2009 const struct mt7615_dfs_pattern *pattern)
2029 .tag = cpu_to_le16(0x2),
2030 .radar_type = cpu_to_le16(index),
2031 #define __req_field_u8(field) .field = pattern->field
2032 #define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
2033 __req_field_u8(enb),
2034 __req_field_u8(stgr),
2035 __req_field_u8(min_crpn),
2036 __req_field_u8(max_crpn),
2037 __req_field_u8(min_crpr),
2038 __req_field_u8(min_pw),
2039 __req_field_u8(max_pw),
2040 __req_field_u32(min_pri),
2041 __req_field_u32(max_pri),
2042 __req_field_u8(min_crbn),
2043 __req_field_u8(max_crbn),
2044 __req_field_u8(min_stgpn),
2045 __req_field_u8(max_stgpn),
2046 __req_field_u8(min_stgpr),
2047 #undef __req_field_u8
2048 #undef __req_field_u32
2051 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
2055 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
2066 .pulse_num = dev->radar_pattern.n_pulses,
2068 u32 start_time = ktime_to_ms(ktime_get_boottime());
2071 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
2074 /* TODO: add some noise here */
2075 for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2076 u32 ts = start_time + i * dev->radar_pattern.period;
2078 req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width);
2079 req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power);
2080 req.pattern[i].start_time = cpu_to_le32(ts);
2083 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_PATTERN,
2084 &req, sizeof(req), false);
2087 static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2089 struct mt76_phy *mphy = phy->mt76;
2090 struct ieee80211_hw *hw = mphy->hw;
2091 int n_chains = hweight8(mphy->antenna_mask);
2095 tx_power = hw->conf.power_level * 2 -
2096 mt76_tx_power_nss_delta(n_chains);
2097 mphy->txpower_cur = tx_power;
2099 for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2102 for (i = 0; i < 4; i++) {
2105 if (i < n_chains - 1)
2106 delta = mt76_tx_power_nss_delta(n_chains) -
2107 mt76_tx_power_nss_delta(i + 1);
2108 sku[MT_SKU_1SS_DELTA + i] = delta;
2112 static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2114 static const u8 width_to_bw[] = {
2115 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2116 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2117 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2118 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2119 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2120 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2121 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2122 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2125 if (chandef->width >= ARRAY_SIZE(width_to_bw))
2128 return width_to_bw[chandef->width];
2131 int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2133 struct mt7615_dev *dev = phy->dev;
2134 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2135 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2144 /* for 80+80 only */
2149 __le32 outband_freq;
2155 .control_chan = chandef->chan->hw_value,
2156 .center_chan = ieee80211_frequency_to_channel(freq1),
2157 .tx_streams = hweight8(phy->mt76->antenna_mask),
2158 .rx_streams_mask = phy->mt76->chainmask,
2159 .center_chan2 = ieee80211_frequency_to_channel(freq2),
2162 if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2163 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2164 else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
2165 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
2166 req.switch_reason = CH_SWITCH_DFS;
2168 req.switch_reason = CH_SWITCH_NORMAL;
2170 req.band_idx = phy != &dev->phy;
2171 req.bw = mt7615_mcu_chan_bw(chandef);
2173 if (mt76_testmode_enabled(phy->mt76))
2174 memset(req.txpower_sku, 0x3f, 49);
2176 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2178 return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2181 int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index)
2190 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
2194 int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
2206 .test_mode_en = test_mode,
2208 .value = cpu_to_le32(val),
2211 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_ATE_CTRL, &req,
2212 sizeof(req), false);
2215 int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2217 struct mt7615_dev *dev = phy->dev;
2225 .band_idx = phy != &dev->phy,
2226 .sku_enable = enable,
2229 return mt76_mcu_send_msg(&dev->mt76,
2230 MCU_EXT_CMD_TX_POWER_FEATURE_CTRL, &req,
2234 static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
2238 for (i = 0; i < n_freqs; i++)
2239 if (cur == freqs[i])
2245 static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
2247 static const u16 freq_list[] = {
2248 4980, 5805, 5905, 5190,
2249 5230, 5270, 5310, 5350,
2250 5390, 5430, 5470, 5510,
2251 5550, 5590, 5630, 5670,
2252 5710, 5755, 5795, 5835,
2253 5875, 5210, 5290, 5370,
2254 5450, 5530, 5610, 5690,
2257 static const u16 freq_bw40[] = {
2258 5190, 5230, 5270, 5310,
2259 5350, 5390, 5430, 5470,
2260 5510, 5550, 5590, 5630,
2261 5670, 5710, 5755, 5795,
2264 int offset_2g = ARRAY_SIZE(freq_list);
2271 return offset_2g + 1;
2273 return offset_2g + 2;
2275 return offset_2g + 3;
2279 case NL80211_CHAN_WIDTH_80:
2280 case NL80211_CHAN_WIDTH_80P80:
2281 case NL80211_CHAN_WIDTH_160:
2284 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2287 freq = freq_bw40[idx];
2291 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2294 freq = freq_bw40[idx];
2298 case NL80211_CHAN_WIDTH_40:
2299 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2308 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2311 int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
2313 struct mt7615_dev *dev = phy->dev;
2314 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2315 int freq2 = chandef->center_freq2;
2319 u8 runtime_calibration;
2332 __le32 sx0_i_lna[4];
2333 __le32 sx0_q_lna[4];
2335 __le32 sx2_i_lna[4];
2336 __le32 sx2_q_lna[4];
2341 .bw = mt7615_mcu_chan_bw(chandef),
2342 .band = chandef->center_freq1 > 4000,
2343 .dbdc_en = !!dev->mt76.phy2,
2345 u16 center_freq = chandef->center_freq1;
2347 u8 *eep = dev->mt76.eeprom.data;
2349 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
2352 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2353 freq2 = center_freq + 40;
2358 req.runtime_calibration = 1;
2359 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
2363 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
2364 freq_idx * MT7615_EEPROM_DCOC_SIZE,
2365 sizeof(req.dcoc_data));
2366 req.runtime_calibration = 0;
2369 req.center_freq = cpu_to_le16(center_freq);
2370 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RXDCOC_CAL, &req,
2373 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2374 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2375 req.is_freq2 = true;
2376 center_freq = freq2;
2383 static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
2385 static const u16 freq_list[] = {
2386 4920, 4940, 4960, 4980,
2387 5040, 5060, 5080, 5180,
2388 5200, 5220, 5240, 5260,
2389 5280, 5300, 5320, 5340,
2390 5360, 5380, 5400, 5420,
2391 5440, 5460, 5480, 5500,
2392 5520, 5540, 5560, 5580,
2393 5600, 5620, 5640, 5660,
2394 5680, 5700, 5720, 5745,
2395 5765, 5785, 5805, 5825,
2396 5845, 5865, 5885, 5905
2398 int offset_2g = ARRAY_SIZE(freq_list);
2405 return offset_2g + 1;
2407 return offset_2g + 2;
2410 if (bw != NL80211_CHAN_WIDTH_20) {
2411 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2416 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
2422 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2426 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
2428 struct mt7615_dev *dev = phy->dev;
2429 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2430 int freq2 = chandef->center_freq2;
2434 u8 runtime_calibration;
2462 .bw = mt7615_mcu_chan_bw(chandef),
2463 .band = chandef->center_freq1 > 4000,
2464 .dbdc_en = !!dev->mt76.phy2,
2466 u16 center_freq = chandef->center_freq1;
2468 u8 *eep = dev->mt76.eeprom.data;
2470 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
2473 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2474 freq2 = center_freq + 40;
2479 req.runtime_calibration = 1;
2480 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
2484 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
2485 freq_idx * MT7615_EEPROM_TXDPD_SIZE,
2486 sizeof(req.dpd_data));
2487 req.runtime_calibration = 0;
2490 req.center_freq = cpu_to_le16(center_freq);
2491 ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TXDPD_CAL, &req,
2494 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2495 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2496 req.is_freq2 = true;
2497 center_freq = freq2;
2504 int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
2507 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2512 __le16 bcn_interval;
2515 u8 bmc_delivered_ac;
2516 u8 bmc_triggered_ac;
2519 .bss_idx = mvif->mt76.idx,
2520 .aid = cpu_to_le16(vif->bss_conf.aid),
2521 .dtim_period = vif->bss_conf.dtim_period,
2522 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
2528 .bss_idx = mvif->mt76.idx,
2532 if (vif->type != NL80211_IFTYPE_STATION)
2535 err = mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_ABORT, &req_hdr,
2536 sizeof(req_hdr), false);
2537 if (err < 0 || !enable)
2540 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_BSS_CONNECTED, &req,
2541 sizeof(req), false);
2545 int mt7615_mcu_set_hif_suspend(struct mt7615_dev *dev, bool suspend)
2549 u8 hif_type; /* 0x0: HIF_SDIO
2555 struct hif_suspend_tlv {
2559 } __packed hif_suspend;
2562 .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
2563 .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
2568 if (mt76_is_mmio(&dev->mt76))
2569 req.hdr.hif_type = 2;
2570 else if (mt76_is_usb(&dev->mt76))
2571 req.hdr.hif_type = 1;
2572 else if (mt76_is_sdio(&dev->mt76))
2573 req.hdr.hif_type = 0;
2575 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_HIF_CTRL, &req,
2578 EXPORT_SYMBOL_GPL(mt7615_mcu_set_hif_suspend);
2581 mt7615_mcu_set_wow_ctrl(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2582 bool suspend, struct cfg80211_wowlan *wowlan)
2584 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2585 struct mt7615_dev *dev = phy->dev;
2591 struct mt7615_wow_ctrl_tlv wow_ctrl_tlv;
2592 struct mt7615_wow_gpio_param_tlv gpio_tlv;
2595 .bss_idx = mvif->mt76.idx,
2598 .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
2599 .len = cpu_to_le16(sizeof(struct mt7615_wow_ctrl_tlv)),
2600 .cmd = suspend ? 1 : 2,
2603 .tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
2604 .len = cpu_to_le16(sizeof(struct mt7615_wow_gpio_param_tlv)),
2605 .gpio_pin = 0xff, /* follow fw about GPIO pin */
2609 if (wowlan->magic_pkt)
2610 req.wow_ctrl_tlv.trigger |= BIT(0);
2611 if (wowlan->disconnect)
2612 req.wow_ctrl_tlv.trigger |= BIT(2);
2613 if (wowlan->nd_config) {
2614 mt76_connac_mcu_sched_scan_req(phy->mt76, vif,
2616 req.wow_ctrl_tlv.trigger |= BIT(5);
2617 mt76_connac_mcu_sched_scan_enable(phy->mt76, vif, suspend);
2620 if (mt76_is_mmio(&dev->mt76))
2621 req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
2622 else if (mt76_is_usb(&dev->mt76))
2623 req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
2624 else if (mt76_is_sdio(&dev->mt76))
2625 req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
2627 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_SUSPEND, &req,
2632 mt7615_mcu_set_wow_pattern(struct mt7615_dev *dev,
2633 struct ieee80211_vif *vif,
2634 u8 index, bool enable,
2635 struct cfg80211_pkt_pattern *pattern)
2637 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2638 struct mt7615_wow_pattern_tlv *ptlv;
2639 struct sk_buff *skb;
2644 .bss_idx = mvif->mt76.idx,
2647 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2648 sizeof(hdr) + sizeof(*ptlv));
2652 skb_put_data(skb, &hdr, sizeof(hdr));
2653 ptlv = (struct mt7615_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
2654 ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
2655 ptlv->len = cpu_to_le16(sizeof(*ptlv));
2656 ptlv->data_len = pattern->pattern_len;
2657 ptlv->enable = enable;
2658 ptlv->index = index;
2660 memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
2661 memcpy(ptlv->mask, pattern->mask, pattern->pattern_len / 8);
2663 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_SUSPEND,
2668 mt7615_mcu_set_suspend_mode(struct mt7615_dev *dev,
2669 struct ieee80211_vif *vif,
2670 bool enable, u8 mdtim, bool wow_suspend)
2672 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2678 struct mt7615_suspend_tlv suspend_tlv;
2681 .bss_idx = mvif->mt76.idx,
2684 .tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
2685 .len = cpu_to_le16(sizeof(struct mt7615_suspend_tlv)),
2688 .wow_suspend = wow_suspend,
2692 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_SUSPEND, &req,
2697 mt7615_mcu_set_gtk_rekey(struct mt7615_dev *dev,
2698 struct ieee80211_vif *vif,
2701 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2707 struct mt7615_gtk_rekey_tlv gtk_tlv;
2710 .bss_idx = mvif->mt76.idx,
2713 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
2714 .len = cpu_to_le16(sizeof(struct mt7615_gtk_rekey_tlv)),
2715 .rekey_mode = !suspend,
2719 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_OFFLOAD, &req,
2724 mt7615_mcu_set_arp_filter(struct mt7615_dev *dev, struct ieee80211_vif *vif,
2727 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2733 struct mt7615_arpns_tlv arpns;
2736 .bss_idx = mvif->mt76.idx,
2739 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2740 .len = cpu_to_le16(sizeof(struct mt7615_arpns_tlv)),
2745 return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_OFFLOAD, &req,
2749 void mt7615_mcu_set_suspend_iter(void *priv, u8 *mac,
2750 struct ieee80211_vif *vif)
2752 struct mt7615_phy *phy = priv;
2753 bool suspend = test_bit(MT76_STATE_SUSPEND, &phy->mt76->state);
2754 struct ieee80211_hw *hw = phy->mt76->hw;
2755 struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
2758 mt7615_mcu_set_gtk_rekey(phy->dev, vif, suspend);
2759 mt7615_mcu_set_arp_filter(phy->dev, vif, suspend);
2761 mt7615_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
2763 for (i = 0; i < wowlan->n_patterns; i++)
2764 mt7615_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
2765 &wowlan->patterns[i]);
2766 mt7615_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
2770 mt7615_mcu_key_iter(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2771 struct ieee80211_sta *sta, struct ieee80211_key_conf *key,
2774 struct mt7615_gtk_rekey_tlv *gtk_tlv = data;
2777 if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
2778 key->cipher != WLAN_CIPHER_SUITE_CCMP &&
2779 key->cipher != WLAN_CIPHER_SUITE_TKIP)
2782 if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
2783 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
2786 gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
2790 /* we are assuming here to have a single pairwise key */
2791 if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
2792 gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
2793 gtk_tlv->group_cipher = cpu_to_le32(cipher);
2794 gtk_tlv->keyid = key->keyidx;
2798 int mt7615_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
2799 struct ieee80211_vif *vif,
2800 struct cfg80211_gtk_rekey_data *key)
2802 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2803 struct mt7615_dev *dev = mt7615_hw_dev(hw);
2804 struct mt7615_gtk_rekey_tlv *gtk_tlv;
2805 struct sk_buff *skb;
2810 .bss_idx = mvif->mt76.idx,
2813 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2814 sizeof(hdr) + sizeof(*gtk_tlv));
2818 skb_put_data(skb, &hdr, sizeof(hdr));
2819 gtk_tlv = (struct mt7615_gtk_rekey_tlv *)skb_put(skb,
2821 gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
2822 gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
2823 gtk_tlv->rekey_mode = 2;
2824 gtk_tlv->option = 1;
2827 ieee80211_iter_keys_rcu(hw, vif, mt7615_mcu_key_iter, gtk_tlv);
2830 memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
2831 memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
2832 memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
2834 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
2837 #endif /* CONFIG_PM */
2839 int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2840 struct ieee80211_channel *chan, int duration)
2842 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2843 struct mt7615_dev *dev = phy->dev;
2844 struct mt7615_roc_tlv req = {
2845 .bss_idx = mvif->mt76.idx,
2847 .max_interval = cpu_to_le32(duration),
2848 .primary_chan = chan ? chan->hw_value : 0,
2849 .band = chan ? chan->band : 0,
2853 phy->roc_grant = false;
2855 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_ROC, &req,
2856 sizeof(req), false);
2859 int mt7615_mcu_update_arp_filter(struct ieee80211_hw *hw,
2860 struct ieee80211_vif *vif,
2861 struct ieee80211_bss_conf *info)
2863 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2864 struct mt7615_dev *dev = mt7615_hw_dev(hw);
2865 struct sk_buff *skb;
2866 int i, len = min_t(int, info->arp_addr_cnt,
2867 IEEE80211_BSS_ARP_ADDR_LIST_LEN);
2873 struct mt7615_arpns_tlv arp;
2876 .bss_idx = mvif->mt76.idx,
2879 .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
2880 .len = cpu_to_le16(sizeof(struct mt7615_arpns_tlv)),
2882 .mode = 2, /* update */
2887 if (!mt7615_firmware_offload(dev))
2890 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2891 sizeof(req_hdr) + len * sizeof(__be32));
2895 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2896 for (i = 0; i < len; i++) {
2897 u8 *addr = (u8 *)skb_put(skb, sizeof(__be32));
2899 memcpy(addr, &info->arp_addr_list[i], sizeof(__be32));
2902 return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
2906 int mt7615_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
2907 struct ieee80211_vif *vif)
2909 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2910 int ct_window = vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
2911 struct mt7615_dev *dev = mt7615_hw_dev(hw);
2917 .ct_win = cpu_to_le32(ct_window),
2918 .bss_idx = mvif->mt76.idx,
2921 if (!mt7615_firmware_offload(dev))
2924 return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_P2P_OPPPS, &req,
2925 sizeof(req), false);
2928 u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
2934 .addr = cpu_to_le32(offset),
2937 return mt76_mcu_send_msg(dev, MCU_CMD_REG_READ, &req, sizeof(req),
2940 EXPORT_SYMBOL_GPL(mt7615_mcu_reg_rr);
2942 void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
2948 .addr = cpu_to_le32(offset),
2949 .val = cpu_to_le32(val),
2952 mt76_mcu_send_msg(dev, MCU_CMD_REG_WRITE, &req, sizeof(req), false);
2954 EXPORT_SYMBOL_GPL(mt7615_mcu_reg_wr);