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 struct mt7615_patch_hdr {
22 struct mt7615_fw_trailer {
32 #define FW_V3_COMMON_TAILER_SIZE 36
33 #define FW_V3_REGION_TAILER_SIZE 40
34 #define FW_START_OVERRIDE BIT(0)
35 #define FW_START_DLYCAL BIT(1)
36 #define FW_START_WORKING_PDA_CR4 BIT(2)
38 struct mt7663_fw_trailer {
50 struct mt7663_fw_buf {
60 #define MT7615_PATCH_ADDRESS 0x80000
61 #define MT7622_PATCH_ADDRESS 0x9c000
62 #define MT7663_PATCH_ADDRESS 0xdc000
64 #define N9_REGION_NUM 2
65 #define CR4_REGION_NUM 1
69 #define FW_FEATURE_SET_ENCRYPT BIT(0)
70 #define FW_FEATURE_SET_KEY_IDX GENMASK(2, 1)
72 #define DL_MODE_ENCRYPT BIT(0)
73 #define DL_MODE_KEY_IDX GENMASK(2, 1)
74 #define DL_MODE_RESET_SEC_IV BIT(3)
75 #define DL_MODE_WORKING_PDA_CR4 BIT(4)
76 #define DL_MODE_VALID_RAM_ENTRY BIT(5)
77 #define DL_MODE_NEED_RSP BIT(31)
79 #define FW_START_OVERRIDE BIT(0)
80 #define FW_START_WORKING_PDA_CR4 BIT(2)
82 void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
83 int cmd, int *wait_seq)
85 int txd_len, mcu_cmd = cmd & MCU_CMD_MASK;
86 struct mt7615_uni_txd *uni_txd;
87 struct mt7615_mcu_txd *mcu_txd;
88 u8 seq, q_idx, pkt_fmt;
92 seq = ++dev->mt76.mcu.msg_seq & 0xf;
94 seq = ++dev->mt76.mcu.msg_seq & 0xf;
98 txd_len = cmd & MCU_UNI_PREFIX ? sizeof(*uni_txd) : sizeof(*mcu_txd);
99 txd = (__le32 *)skb_push(skb, txd_len);
101 if (cmd != MCU_CMD_FW_SCATTER) {
102 q_idx = MT_TX_MCU_PORT_RX_Q0;
103 pkt_fmt = MT_TX_TYPE_CMD;
105 q_idx = MT_TX_MCU_PORT_RX_FWDL;
106 pkt_fmt = MT_TX_TYPE_FW;
109 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
110 FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
111 FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
112 txd[0] = cpu_to_le32(val);
114 val = MT_TXD1_LONG_FORMAT |
115 FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) |
116 FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt);
117 txd[1] = cpu_to_le32(val);
119 if (cmd & MCU_UNI_PREFIX) {
120 uni_txd = (struct mt7615_uni_txd *)txd;
121 uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
122 uni_txd->option = MCU_CMD_UNI_EXT_ACK;
123 uni_txd->cid = cpu_to_le16(mcu_cmd);
124 uni_txd->s2d_index = MCU_S2D_H2N;
125 uni_txd->pkt_type = MCU_PKT_ID;
131 mcu_txd = (struct mt7615_mcu_txd *)txd;
132 mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
133 mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx));
134 mcu_txd->s2d_index = MCU_S2D_H2N;
135 mcu_txd->pkt_type = MCU_PKT_ID;
138 switch (cmd & ~MCU_CMD_MASK) {
140 mcu_txd->set_query = MCU_Q_NA;
141 mcu_txd->cid = mcu_cmd;
144 mcu_txd->set_query = MCU_Q_SET;
145 mcu_txd->cid = mcu_cmd;
148 mcu_txd->cid = MCU_CMD_EXT_CID;
149 mcu_txd->set_query = MCU_Q_SET;
150 mcu_txd->ext_cid = cmd;
151 mcu_txd->ext_cid_ack = 1;
156 static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb,
157 int cmd, int *wait_seq)
159 enum mt76_txq_id qid;
161 mt7615_mcu_fill_msg(dev, skb, cmd, wait_seq);
162 if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
167 return mt76_tx_queue_skb_raw(dev, qid, skb, 0);
171 mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,
172 struct sk_buff *skb, int seq)
174 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
181 case MCU_CMD_PATCH_SEM_CONTROL:
182 skb_pull(skb, sizeof(*rxd) - 4);
185 case MCU_EXT_CMD_GET_TEMP:
186 skb_pull(skb, sizeof(*rxd));
187 ret = le32_to_cpu(*(__le32 *)skb->data);
197 int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq)
199 unsigned long expires = jiffies + 20 * HZ;
204 skb = mt76_mcu_get_response(&dev->mt76, expires);
206 dev_err(dev->mt76.dev, "Message %ld (seq %d) timeout\n",
207 cmd & MCU_CMD_MASK, seq);
211 ret = mt7615_mcu_parse_response(dev, cmd, skb, seq);
220 mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
221 int cmd, bool wait_resp)
223 struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
226 mutex_lock(&mdev->mcu.mutex);
228 ret = __mt7615_mcu_msg_send(dev, skb, cmd, &seq);
233 ret = mt7615_mcu_wait_response(dev, cmd, seq);
236 mutex_unlock(&mdev->mcu.mutex);
242 mt7615_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
243 int len, bool wait_resp)
247 skb = mt76_mcu_msg_alloc(mdev, data, len);
251 return __mt76_mcu_skb_send_msg(mdev, skb, cmd, wait_resp);
255 mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
258 ieee80211_csa_finish(vif);
262 mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
264 struct mt76_phy *mphy = &dev->mt76.phy;
265 struct mt7615_mcu_rdd_report *r;
267 r = (struct mt7615_mcu_rdd_report *)skb->data;
269 if (r->idx && dev->mt76.phy2)
270 mphy = dev->mt76.phy2;
272 ieee80211_radar_detected(mphy->hw);
277 mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
279 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
280 const char *data = (char *)&rxd[1];
283 switch (rxd->s2d_index) {
295 wiphy_info(mt76_hw(dev)->wiphy, "%s: %s", type, data);
299 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
301 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
303 switch (rxd->ext_eid) {
304 case MCU_EXT_EVENT_RDD_REPORT:
305 mt7615_mcu_rx_radar_detected(dev, skb);
307 case MCU_EXT_EVENT_CSA_NOTIFY:
308 ieee80211_iterate_active_interfaces_atomic(dev->mt76.hw,
309 IEEE80211_IFACE_ITER_RESUME_ALL,
310 mt7615_mcu_csa_finish, dev);
312 case MCU_EXT_EVENT_FW_LOG_2_HOST:
313 mt7615_mcu_rx_log_message(dev, skb);
321 mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
323 u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
324 struct mt7615_phy *phy;
325 struct mt76_phy *mphy;
327 if (*seq_num & BIT(7) && dev->mt76.phy2)
328 mphy = dev->mt76.phy2;
330 mphy = &dev->mt76.phy;
332 phy = (struct mt7615_phy *)mphy->priv;
334 spin_lock_bh(&dev->mt76.lock);
335 __skb_queue_tail(&phy->scan_event_list, skb);
336 spin_unlock_bh(&dev->mt76.lock);
338 ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
339 MT7615_HW_SCAN_TIMEOUT);
343 mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
345 struct mt7615_mcu_bss_event *event;
346 struct mt76_phy *mphy;
348 event = (struct mt7615_mcu_bss_event *)(skb->data +
349 sizeof(struct mt7615_mcu_rxd));
351 if (event->bss_idx && dev->mt76.phy2)
352 mphy = dev->mt76.phy2;
354 mphy = &dev->mt76.phy;
356 if (event->is_absent)
357 ieee80211_stop_queues(mphy->hw);
359 ieee80211_wake_queues(mphy->hw);
363 mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
365 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
369 mt7615_mcu_rx_ext_event(dev, skb);
371 case MCU_EVENT_SCHED_SCAN_DONE:
372 case MCU_EVENT_SCAN_DONE:
373 mt7615_mcu_scan_event(dev, skb);
375 case MCU_EVENT_BSS_ABSENCE:
376 mt7615_mcu_bss_event(dev, skb);
384 void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
386 struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
388 if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
389 rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
390 rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
391 rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
392 rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
393 rxd->eid == MCU_EVENT_BSS_ABSENCE ||
394 rxd->eid == MCU_EVENT_SCAN_DONE ||
396 mt7615_mcu_rx_unsolicited_event(dev, skb);
398 mt76_mcu_rx_event(&dev->mt76, skb);
401 static int mt7615_mcu_init_download(struct mt7615_dev *dev, u32 addr,
409 .addr = cpu_to_le32(addr),
410 .len = cpu_to_le32(len),
411 .mode = cpu_to_le32(mode),
414 return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_TARGET_ADDRESS_LEN_REQ,
415 &req, sizeof(req), true);
419 mt7615_mcu_add_dev(struct mt7615_dev *dev, struct ieee80211_vif *vif,
422 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
436 u8 omac_addr[ETH_ALEN];
440 .omac_idx = mvif->omac_idx,
441 .band_idx = mvif->band_idx,
442 .tlv_num = cpu_to_le16(1),
446 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
447 .len = cpu_to_le16(sizeof(struct req_tlv)),
449 .band_idx = mvif->band_idx,
453 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
454 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DEV_INFO_UPDATE,
455 &data, sizeof(data), true);
459 mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
460 struct ieee80211_hw *hw,
461 struct ieee80211_vif *vif, bool enable)
463 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
464 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
465 struct ieee80211_mutable_offsets offs;
466 struct ieee80211_tx_info *info;
473 u8 need_pre_tbtt_int;
479 /* bss color change */
483 .omac_idx = mvif->omac_idx,
485 .wlan_idx = wcid->idx,
486 .band_idx = mvif->band_idx,
490 skb = ieee80211_beacon_get_template(hw, vif, &offs);
494 if (skb->len > 512 - MT_TXD_SIZE) {
495 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
500 if (mvif->band_idx) {
501 info = IEEE80211_SKB_CB(skb);
502 info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
505 mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
507 memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
508 req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
509 req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
510 if (offs.csa_counter_offs[0]) {
513 csa_offs = MT_TXD_SIZE + offs.csa_counter_offs[0] - 4;
514 req.csa_ie_pos = cpu_to_le16(csa_offs);
515 req.csa_cnt = skb->data[offs.csa_counter_offs[0]];
519 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_BCN_OFFLOAD,
520 &req, sizeof(req), true);
524 mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
526 #define ENTER_PM_STATE 1
527 #define EXIT_PM_STATE 2
546 .pm_state = state ? ENTER_PM_STATE : EXIT_PM_STATE,
550 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PM_STATE_CTRL,
551 &req, sizeof(req), true);
554 static struct sk_buff *
555 mt7615_mcu_alloc_sta_req(struct mt7615_dev *dev, struct mt7615_vif *mvif,
556 struct mt7615_sta *msta)
558 struct sta_req_hdr hdr = {
559 .bss_idx = mvif->idx,
560 .wlan_idx = msta ? msta->wcid.idx : 0,
561 .muar_idx = msta ? mvif->omac_idx : 0,
566 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, MT7615_STA_UPDATE_MAX_SIZE);
568 return ERR_PTR(-ENOMEM);
570 skb_put_data(skb, &hdr, sizeof(hdr));
575 static struct wtbl_req_hdr *
576 mt7615_mcu_alloc_wtbl_req(struct mt7615_dev *dev, struct mt7615_sta *msta,
577 int cmd, void *sta_wtbl, struct sk_buff **skb)
579 struct tlv *sta_hdr = sta_wtbl;
580 struct wtbl_req_hdr hdr = {
581 .wlan_idx = msta->wcid.idx,
584 struct sk_buff *nskb = *skb;
587 nskb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
588 MT7615_WTBL_UPDATE_BA_SIZE);
590 return ERR_PTR(-ENOMEM);
596 sta_hdr->len = cpu_to_le16(sizeof(hdr));
598 return skb_put_data(nskb, &hdr, sizeof(hdr));
602 mt7615_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
603 void *sta_ntlv, void *sta_wtbl)
605 struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
606 struct tlv *sta_hdr = sta_wtbl;
607 struct tlv *ptlv, tlv = {
608 .tag = cpu_to_le16(tag),
609 .len = cpu_to_le16(len),
613 ptlv = skb_put(skb, len);
614 memcpy(ptlv, &tlv, sizeof(tlv));
616 ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
617 ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
620 u16 size = le16_to_cpu(sta_hdr->len);
622 sta_hdr->len = cpu_to_le16(size + len);
629 mt7615_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
631 return mt7615_mcu_add_nested_tlv(skb, tag, len, skb->data, NULL);
635 mt7615_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
638 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
639 struct bss_info_basic *bss;
640 u8 wlan_idx = mvif->sta.wcid.idx;
641 u32 type = NETWORK_INFRA;
644 tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
647 case NL80211_IFTYPE_MESH_POINT:
648 case NL80211_IFTYPE_AP:
650 case NL80211_IFTYPE_STATION:
651 /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
653 struct ieee80211_sta *sta;
654 struct mt7615_sta *msta;
657 sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
663 msta = (struct mt7615_sta *)sta->drv_priv;
664 wlan_idx = msta->wcid.idx;
668 case NL80211_IFTYPE_ADHOC:
676 bss = (struct bss_info_basic *)tlv;
677 memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
678 bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
679 bss->network_type = cpu_to_le32(type);
680 bss->dtim_period = vif->bss_conf.dtim_period;
681 bss->bmc_tx_wlan_idx = wlan_idx;
682 bss->wmm_idx = mvif->wmm_idx;
683 bss->active = enable;
689 mt7615_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
691 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
692 struct bss_info_omac *omac;
697 tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
700 case NL80211_IFTYPE_MESH_POINT:
701 case NL80211_IFTYPE_AP:
702 type = CONNECTION_INFRA_AP;
704 case NL80211_IFTYPE_STATION:
705 type = CONNECTION_INFRA_STA;
707 case NL80211_IFTYPE_ADHOC:
708 type = CONNECTION_IBSS_ADHOC;
715 omac = (struct bss_info_omac *)tlv;
716 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
717 omac->conn_type = cpu_to_le32(type);
718 omac->omac_idx = mvif->omac_idx;
719 omac->band_idx = mvif->band_idx;
720 omac->hw_bss_idx = idx;
723 /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
724 #define BCN_TX_ESTIMATE_TIME (4096 + 20)
726 mt7615_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt7615_vif *mvif)
728 struct bss_info_ext_bss *ext;
729 int ext_bss_idx, tsf_offset;
732 ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
736 tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
738 ext = (struct bss_info_ext_bss *)tlv;
739 tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
740 ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
744 mt7615_mcu_sta_ba_tlv(struct sk_buff *skb,
745 struct ieee80211_ampdu_params *params,
746 bool enable, bool tx)
748 struct sta_rec_ba *ba;
751 tlv = mt7615_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
753 ba = (struct sta_rec_ba *)tlv;
754 ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT,
755 ba->winsize = cpu_to_le16(params->buf_size);
756 ba->ssn = cpu_to_le16(params->ssn);
757 ba->ba_en = enable << params->tid;
758 ba->amsdu = params->amsdu;
759 ba->tid = params->tid;
763 mt7615_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
764 struct ieee80211_sta *sta, bool enable)
766 struct sta_rec_basic *basic;
769 tlv = mt7615_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
771 basic = (struct sta_rec_basic *)tlv;
772 basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
775 basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
776 basic->conn_state = CONN_STATE_PORT_SECURE;
778 basic->conn_state = CONN_STATE_DISCONNECT;
782 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
783 eth_broadcast_addr(basic->peer_addr);
788 case NL80211_IFTYPE_MESH_POINT:
789 case NL80211_IFTYPE_AP:
790 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
792 case NL80211_IFTYPE_STATION:
793 basic->conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
795 case NL80211_IFTYPE_ADHOC:
796 basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
803 memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
804 basic->aid = cpu_to_le16(sta->aid);
805 basic->qos = sta->wme;
809 mt7615_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
813 if (sta->ht_cap.ht_supported) {
814 struct sta_rec_ht *ht;
816 tlv = mt7615_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
817 ht = (struct sta_rec_ht *)tlv;
818 ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
820 if (sta->vht_cap.vht_supported) {
821 struct sta_rec_vht *vht;
823 tlv = mt7615_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
824 vht = (struct sta_rec_vht *)tlv;
825 vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
826 vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
827 vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
832 mt7615_mcu_wtbl_ba_tlv(struct sk_buff *skb,
833 struct ieee80211_ampdu_params *params,
834 bool enable, bool tx, void *sta_wtbl,
840 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
843 ba = (struct wtbl_ba *)tlv;
844 ba->tid = params->tid;
847 ba->ba_type = MT_BA_TYPE_ORIGINATOR;
848 ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
849 ba->ba_winsize = cpu_to_le16(params->buf_size);
852 memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
853 ba->ba_type = MT_BA_TYPE_RECIPIENT;
854 ba->rst_ba_tid = params->tid;
855 ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
860 u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
863 for (i = 7; i > 0; i--) {
864 if (params->buf_size >= ba_range[i])
867 ba->ba_winsize_idx = i;
872 mt7615_mcu_wtbl_generic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
873 struct ieee80211_sta *sta, void *sta_wtbl,
876 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
877 struct wtbl_generic *generic;
881 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_GENERIC, sizeof(*generic),
884 generic = (struct wtbl_generic *)tlv;
887 memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
888 generic->partial_aid = cpu_to_le16(sta->aid);
889 generic->muar_idx = mvif->omac_idx;
890 generic->qos = sta->wme;
892 eth_broadcast_addr(generic->peer_addr);
893 generic->muar_idx = 0xe;
896 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
899 rx = (struct wtbl_rx *)tlv;
900 rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
906 mt7615_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
907 void *sta_wtbl, void *wtbl_tlv)
912 if (sta->ht_cap.ht_supported) {
915 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
917 ht = (struct wtbl_ht *)tlv;
918 ht->ldpc = sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING;
919 ht->af = sta->ht_cap.ampdu_factor;
920 ht->mm = sta->ht_cap.ampdu_density;
923 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
924 flags |= MT_WTBL_W5_SHORT_GI_20;
925 if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
926 flags |= MT_WTBL_W5_SHORT_GI_40;
929 if (sta->vht_cap.vht_supported) {
930 struct wtbl_vht *vht;
932 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_VHT, sizeof(*vht),
934 vht = (struct wtbl_vht *)tlv;
935 vht->ldpc = sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC,
938 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
939 flags |= MT_WTBL_W5_SHORT_GI_80;
940 if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
941 flags |= MT_WTBL_W5_SHORT_GI_160;
945 if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC) {
946 struct wtbl_smps *smps;
948 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
950 smps = (struct wtbl_smps *)tlv;
954 if (sta->ht_cap.ht_supported) {
956 u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
957 MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
958 struct wtbl_raw *raw;
960 tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
961 sizeof(*raw), wtbl_tlv,
963 raw = (struct wtbl_raw *)tlv;
964 raw->val = cpu_to_le32(flags);
965 raw->msk = cpu_to_le32(~msk);
972 mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
975 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
976 struct mt7615_dev *dev = phy->dev;
979 skb = mt7615_mcu_alloc_sta_req(dev, mvif, NULL);
984 mt7615_mcu_bss_omac_tlv(skb, vif);
986 mt7615_mcu_bss_basic_tlv(skb, vif, enable);
988 if (enable && mvif->omac_idx > EXT_BSSID_START)
989 mt7615_mcu_bss_ext_tlv(skb, mvif);
991 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
992 MCU_EXT_CMD_BSS_INFO_UPDATE, true);
996 mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
997 struct ieee80211_ampdu_params *params,
1000 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1001 struct mt7615_vif *mvif = msta->vif;
1002 struct wtbl_req_hdr *wtbl_hdr;
1003 struct sk_buff *skb = NULL;
1006 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
1007 if (IS_ERR(wtbl_hdr))
1008 return PTR_ERR(wtbl_hdr);
1010 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, true, NULL, wtbl_hdr);
1012 err = __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1013 MCU_EXT_CMD_WTBL_UPDATE, true);
1017 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1019 return PTR_ERR(skb);
1021 mt7615_mcu_sta_ba_tlv(skb, params, enable, true);
1023 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1024 MCU_EXT_CMD_STA_REC_UPDATE, true);
1028 mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
1029 struct ieee80211_ampdu_params *params,
1032 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1033 struct mt7615_vif *mvif = msta->vif;
1034 struct wtbl_req_hdr *wtbl_hdr;
1035 struct sk_buff *skb;
1038 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1040 return PTR_ERR(skb);
1042 mt7615_mcu_sta_ba_tlv(skb, params, enable, false);
1044 err = __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1045 MCU_EXT_CMD_STA_REC_UPDATE, true);
1046 if (err < 0 || !enable)
1050 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
1051 if (IS_ERR(wtbl_hdr))
1052 return PTR_ERR(wtbl_hdr);
1054 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, false, NULL, wtbl_hdr);
1056 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1057 MCU_EXT_CMD_WTBL_UPDATE, true);
1061 mt7615_mcu_wtbl_sta_add(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1062 struct ieee80211_sta *sta, bool enable)
1064 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1065 struct sk_buff *skb, *sskb, *wskb = NULL;
1066 struct wtbl_req_hdr *wtbl_hdr;
1067 struct mt7615_sta *msta;
1070 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
1072 sskb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1074 return PTR_ERR(sskb);
1076 mt7615_mcu_sta_basic_tlv(sskb, vif, sta, enable);
1078 mt7615_mcu_sta_ht_tlv(sskb, sta);
1080 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
1082 if (IS_ERR(wtbl_hdr))
1083 return PTR_ERR(wtbl_hdr);
1086 mt7615_mcu_wtbl_generic_tlv(wskb, vif, sta, NULL, wtbl_hdr);
1088 mt7615_mcu_wtbl_ht_tlv(wskb, sta, NULL, wtbl_hdr);
1091 cmd = enable ? MCU_EXT_CMD_WTBL_UPDATE : MCU_EXT_CMD_STA_REC_UPDATE;
1092 skb = enable ? wskb : sskb;
1094 err = __mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1098 cmd = enable ? MCU_EXT_CMD_STA_REC_UPDATE : MCU_EXT_CMD_WTBL_UPDATE;
1099 skb = enable ? sskb : wskb;
1101 return __mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1104 static const struct mt7615_mcu_ops wtbl_update_ops = {
1105 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1106 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1107 .add_dev_info = mt7615_mcu_add_dev,
1108 .add_bss_info = mt7615_mcu_add_bss,
1109 .add_tx_ba = mt7615_mcu_wtbl_tx_ba,
1110 .add_rx_ba = mt7615_mcu_wtbl_rx_ba,
1111 .sta_add = mt7615_mcu_wtbl_sta_add,
1115 mt7615_mcu_sta_ba(struct mt7615_dev *dev,
1116 struct ieee80211_ampdu_params *params,
1117 bool enable, bool tx)
1119 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1120 struct mt7615_vif *mvif = msta->vif;
1121 struct wtbl_req_hdr *wtbl_hdr;
1122 struct tlv *sta_wtbl;
1123 struct sk_buff *skb;
1125 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1127 return PTR_ERR(skb);
1129 mt7615_mcu_sta_ba_tlv(skb, params, enable, tx);
1131 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1133 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1135 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, tx, sta_wtbl, wtbl_hdr);
1137 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1138 MCU_EXT_CMD_STA_REC_UPDATE, true);
1142 mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
1143 struct ieee80211_ampdu_params *params,
1146 return mt7615_mcu_sta_ba(dev, params, enable, true);
1150 mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
1151 struct ieee80211_ampdu_params *params,
1154 return mt7615_mcu_sta_ba(dev, params, enable, false);
1158 mt7615_mcu_add_sta_cmd(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1159 struct ieee80211_sta *sta, bool enable, int cmd)
1161 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1162 struct wtbl_req_hdr *wtbl_hdr;
1163 struct mt7615_sta *msta;
1164 struct tlv *sta_wtbl;
1165 struct sk_buff *skb;
1167 msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
1169 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1171 return PTR_ERR(skb);
1173 mt7615_mcu_sta_basic_tlv(skb, vif, sta, enable);
1175 mt7615_mcu_sta_ht_tlv(skb, sta);
1177 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1179 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
1182 mt7615_mcu_wtbl_generic_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
1184 mt7615_mcu_wtbl_ht_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1187 return __mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
1191 mt7615_mcu_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1192 struct ieee80211_sta *sta, bool enable)
1194 return mt7615_mcu_add_sta_cmd(dev, vif, sta, enable,
1195 MCU_EXT_CMD_STA_REC_UPDATE);
1198 static const struct mt7615_mcu_ops sta_update_ops = {
1199 .add_beacon_offload = mt7615_mcu_add_beacon_offload,
1200 .set_pm_state = mt7615_mcu_ctrl_pm_state,
1201 .add_dev_info = mt7615_mcu_add_dev,
1202 .add_bss_info = mt7615_mcu_add_bss,
1203 .add_tx_ba = mt7615_mcu_sta_tx_ba,
1204 .add_rx_ba = mt7615_mcu_sta_rx_ba,
1205 .sta_add = mt7615_mcu_add_sta,
1209 mt7615_mcu_uni_add_dev(struct mt7615_dev *dev,
1210 struct ieee80211_vif *vif, bool enable)
1212 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1224 u8 omac_addr[ETH_ALEN];
1228 .omac_idx = mvif->omac_idx,
1229 .band_idx = mvif->band_idx,
1232 .tag = cpu_to_le16(DEV_INFO_ACTIVE),
1233 .len = cpu_to_le16(sizeof(struct req_tlv)),
1238 memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
1240 return __mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_DEV_INFO_UPDATE,
1241 &data, sizeof(data), true);
1245 mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
1251 mt7615_mcu_uni_add_bss(struct mt7615_phy *phy,
1252 struct ieee80211_vif *vif, bool enable)
1254 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1255 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
1256 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
1257 struct mt7615_dev *dev = phy->dev;
1274 __le16 bmc_tx_wlan_idx;
1275 __le16 bcn_interval;
1277 u8 phymode; /* bit(0): A
1290 .bss_idx = mvif->idx,
1293 .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
1294 .len = cpu_to_le16(sizeof(struct basic_tlv)),
1295 .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
1296 .dtim_period = vif->bss_conf.dtim_period,
1297 .omac_idx = mvif->omac_idx,
1298 .band_idx = mvif->band_idx,
1299 .wmm_idx = mvif->wmm_idx,
1323 } __packed rlm_req = {
1325 .bss_idx = mvif->idx,
1328 .tag = cpu_to_le16(UNI_BSS_INFO_RLM),
1329 .len = cpu_to_le16(sizeof(struct rlm_tlv)),
1330 .control_channel = chandef->chan->hw_value,
1331 .center_chan = ieee80211_frequency_to_channel(freq1),
1332 .center_chan2 = ieee80211_frequency_to_channel(freq2),
1333 .tx_streams = hweight8(phy->mt76->antenna_mask),
1334 .rx_streams = phy->chainmask,
1338 u8 idx, tx_wlan_idx = 0;
1341 idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
1342 basic_req.basic.hw_bss_idx = idx;
1344 switch (vif->type) {
1345 case NL80211_IFTYPE_MESH_POINT:
1346 case NL80211_IFTYPE_AP:
1347 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1348 tx_wlan_idx = mvif->sta.wcid.idx;
1350 case NL80211_IFTYPE_STATION:
1352 struct ieee80211_sta *sta;
1353 struct mt7615_sta *msta;
1356 sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
1362 msta = (struct mt7615_sta *)sta->drv_priv;
1363 tx_wlan_idx = msta->wcid.idx;
1366 basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1373 memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
1374 basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(tx_wlan_idx);
1375 basic_req.basic.sta_idx = cpu_to_le16(tx_wlan_idx);
1376 basic_req.basic.conn_state = !enable;
1378 err = __mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1379 &basic_req, sizeof(basic_req), true);
1383 if (!mt7615_firmware_offload(dev))
1386 switch (chandef->width) {
1387 case NL80211_CHAN_WIDTH_40:
1388 rlm_req.rlm.bw = CMD_CBW_40MHZ;
1390 case NL80211_CHAN_WIDTH_80:
1391 rlm_req.rlm.bw = CMD_CBW_80MHZ;
1393 case NL80211_CHAN_WIDTH_80P80:
1394 rlm_req.rlm.bw = CMD_CBW_8080MHZ;
1396 case NL80211_CHAN_WIDTH_160:
1397 rlm_req.rlm.bw = CMD_CBW_160MHZ;
1399 case NL80211_CHAN_WIDTH_5:
1400 rlm_req.rlm.bw = CMD_CBW_5MHZ;
1402 case NL80211_CHAN_WIDTH_10:
1403 rlm_req.rlm.bw = CMD_CBW_10MHZ;
1405 case NL80211_CHAN_WIDTH_20_NOHT:
1406 case NL80211_CHAN_WIDTH_20:
1408 rlm_req.rlm.bw = CMD_CBW_20MHZ;
1412 if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
1413 rlm_req.rlm.sco = 1; /* SCA */
1414 else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
1415 rlm_req.rlm.sco = 3; /* SCB */
1417 return __mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1418 &rlm_req, sizeof(rlm_req), true);
1422 mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
1423 struct ieee80211_hw *hw,
1424 struct ieee80211_vif *vif,
1427 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
1428 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
1429 struct ieee80211_mutable_offsets offs;
1435 struct bcn_content_tlv {
1441 /* 0: enable beacon offload
1442 * 1: disable beacon offload
1443 * 2: update probe respond offload
1446 /* 0: legacy format (TXD + payload)
1447 * 1: only cap field IE
1452 } __packed beacon_tlv;
1455 .bss_idx = mvif->idx,
1458 .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
1459 .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
1463 struct sk_buff *skb;
1465 skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs);
1469 if (skb->len > 512 - MT_TXD_SIZE) {
1470 dev_err(dev->mt76.dev, "beacon size limit exceed\n");
1475 mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
1476 wcid, NULL, 0, NULL, true);
1477 memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
1478 req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
1479 req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
1481 if (offs.csa_counter_offs[0]) {
1484 csa_offs = MT_TXD_SIZE + offs.csa_counter_offs[0] - 4;
1485 req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
1489 return __mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
1490 &req, sizeof(req), true);
1494 mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
1495 struct ieee80211_ampdu_params *params,
1498 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1499 struct mt7615_vif *mvif = msta->vif;
1500 struct wtbl_req_hdr *wtbl_hdr;
1501 struct tlv *sta_wtbl;
1502 struct sk_buff *skb;
1505 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1507 return PTR_ERR(skb);
1509 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1511 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1513 if (IS_ERR(wtbl_hdr))
1514 return PTR_ERR(wtbl_hdr);
1516 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, true, sta_wtbl,
1519 err = __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1520 MCU_UNI_CMD_STA_REC_UPDATE, true);
1524 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1526 return PTR_ERR(skb);
1528 mt7615_mcu_sta_ba_tlv(skb, params, enable, true);
1530 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1531 MCU_UNI_CMD_STA_REC_UPDATE, true);
1535 mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
1536 struct ieee80211_ampdu_params *params,
1539 struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
1540 struct mt7615_vif *mvif = msta->vif;
1541 struct wtbl_req_hdr *wtbl_hdr;
1542 struct tlv *sta_wtbl;
1543 struct sk_buff *skb;
1546 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1548 return PTR_ERR(skb);
1550 mt7615_mcu_sta_ba_tlv(skb, params, enable, false);
1552 err = __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1553 MCU_UNI_CMD_STA_REC_UPDATE, true);
1554 if (err < 0 || !enable)
1557 skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
1559 return PTR_ERR(skb);
1561 sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1563 wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1565 if (IS_ERR(wtbl_hdr))
1566 return PTR_ERR(wtbl_hdr);
1568 mt7615_mcu_wtbl_ba_tlv(skb, params, enable, false, sta_wtbl,
1571 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
1572 MCU_UNI_CMD_STA_REC_UPDATE, true);
1576 mt7615_mcu_uni_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,
1577 struct ieee80211_sta *sta, bool enable)
1579 return mt7615_mcu_add_sta_cmd(dev, vif, sta, enable,
1580 MCU_UNI_CMD_STA_REC_UPDATE);
1583 static const struct mt7615_mcu_ops uni_update_ops = {
1584 .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
1585 .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
1586 .add_dev_info = mt7615_mcu_uni_add_dev,
1587 .add_bss_info = mt7615_mcu_uni_add_bss,
1588 .add_tx_ba = mt7615_mcu_uni_tx_ba,
1589 .add_rx_ba = mt7615_mcu_uni_rx_ba,
1590 .sta_add = mt7615_mcu_uni_add_sta,
1593 static int mt7615_mcu_send_firmware(struct mt7615_dev *dev, const void *data,
1596 int ret = 0, cur_len;
1599 cur_len = min_t(int, 4096 - sizeof(struct mt7615_mcu_txd),
1602 ret = __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_FW_SCATTER,
1603 data, cur_len, false);
1610 if (mt76_is_mmio(&dev->mt76))
1611 mt76_queue_tx_cleanup(dev, MT_TXQ_FWDL, false);
1617 static int mt7615_mcu_start_firmware(struct mt7615_dev *dev, u32 addr,
1624 .option = cpu_to_le32(option),
1625 .addr = cpu_to_le32(addr),
1628 return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_FW_START_REQ,
1629 &req, sizeof(req), true);
1632 static int mt7615_mcu_restart(struct mt76_dev *dev)
1634 return __mt76_mcu_send_msg(dev, MCU_CMD_RESTART_DL_REQ, NULL,
1638 static int mt7615_mcu_patch_sem_ctrl(struct mt7615_dev *dev, bool get)
1643 .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE),
1646 return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_PATCH_SEM_CONTROL,
1647 &req, sizeof(req), true);
1650 static int mt7615_mcu_start_patch(struct mt7615_dev *dev)
1659 return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_PATCH_FINISH_REQ,
1660 &req, sizeof(req), true);
1663 static void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
1665 if (!is_mt7622(&dev->mt76))
1668 regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
1669 MT_INFRACFG_MISC_AP2CONN_WAKE,
1670 !en * MT_INFRACFG_MISC_AP2CONN_WAKE);
1673 static int mt7615_driver_own(struct mt7615_dev *dev)
1677 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
1678 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
1680 mt7622_trigger_hif_int(dev, true);
1681 if (!mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000)) {
1682 dev_err(dev->mt76.dev, "Timeout for driver own\n");
1685 mt7622_trigger_hif_int(dev, false);
1690 static int mt7615_firmware_own(struct mt7615_dev *dev)
1694 addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
1695 mt7622_trigger_hif_int(dev, true);
1697 mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
1699 if (is_mt7622(&dev->mt76) &&
1700 !mt76_poll_msec(dev, MT_CFG_LPCR_HOST,
1701 MT_CFG_LPCR_HOST_FW_OWN,
1702 MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
1703 dev_err(dev->mt76.dev, "Timeout for firmware own\n");
1706 mt7622_trigger_hif_int(dev, false);
1711 static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
1713 const struct mt7615_patch_hdr *hdr;
1714 const struct firmware *fw = NULL;
1717 sem = mt7615_mcu_patch_sem_ctrl(dev, 1);
1721 case PATCH_NOT_DL_SEM_SUCCESS:
1724 dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
1728 ret = request_firmware(&fw, name, dev->mt76.dev);
1732 if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
1733 dev_err(dev->mt76.dev, "Invalid firmware\n");
1738 hdr = (const struct mt7615_patch_hdr *)(fw->data);
1740 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
1741 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
1743 len = fw->size - sizeof(*hdr);
1745 ret = mt7615_mcu_init_download(dev, addr, len, DL_MODE_NEED_RSP);
1747 dev_err(dev->mt76.dev, "Download request failed\n");
1751 ret = mt7615_mcu_send_firmware(dev, fw->data + sizeof(*hdr), len);
1753 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1757 ret = mt7615_mcu_start_patch(dev);
1759 dev_err(dev->mt76.dev, "Failed to start patch\n");
1762 release_firmware(fw);
1764 sem = mt7615_mcu_patch_sem_ctrl(dev, 0);
1766 case PATCH_REL_SEM_SUCCESS:
1770 dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
1777 static u32 mt7615_mcu_gen_dl_mode(u8 feature_set, bool is_cr4)
1781 ret |= (feature_set & FW_FEATURE_SET_ENCRYPT) ?
1782 (DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV) : 0;
1783 ret |= FIELD_PREP(DL_MODE_KEY_IDX,
1784 FIELD_GET(FW_FEATURE_SET_KEY_IDX, feature_set));
1785 ret |= DL_MODE_NEED_RSP;
1786 ret |= is_cr4 ? DL_MODE_WORKING_PDA_CR4 : 0;
1792 mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
1793 const struct mt7615_fw_trailer *hdr,
1794 const u8 *data, bool is_cr4)
1796 int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
1797 int err, i, offset = 0;
1798 u32 len, addr, mode;
1800 for (i = 0; i < n_region; i++) {
1801 mode = mt7615_mcu_gen_dl_mode(hdr[i].feature_set, is_cr4);
1802 len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
1803 addr = le32_to_cpu(hdr[i].addr);
1805 err = mt7615_mcu_init_download(dev, addr, len, mode);
1807 dev_err(dev->mt76.dev, "Download request failed\n");
1811 err = mt7615_mcu_send_firmware(dev, data + offset, len);
1813 dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
1823 static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
1825 const struct mt7615_fw_trailer *hdr;
1826 const struct firmware *fw;
1829 ret = request_firmware(&fw, name, dev->mt76.dev);
1833 if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
1834 dev_err(dev->mt76.dev, "Invalid firmware\n");
1839 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1840 N9_REGION_NUM * sizeof(*hdr));
1842 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
1843 hdr->fw_ver, hdr->build_date);
1845 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
1849 ret = mt7615_mcu_start_firmware(dev, le32_to_cpu(hdr->addr),
1852 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
1856 snprintf(dev->mt76.hw->wiphy->fw_version,
1857 sizeof(dev->mt76.hw->wiphy->fw_version),
1858 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
1860 if (!strncmp(hdr->fw_ver, "2.0", sizeof(hdr->fw_ver))) {
1861 dev->fw_ver = MT7615_FIRMWARE_V2;
1862 dev->mcu_ops = &sta_update_ops;
1864 dev->fw_ver = MT7615_FIRMWARE_V1;
1865 dev->mcu_ops = &wtbl_update_ops;
1869 release_firmware(fw);
1873 static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
1875 const struct mt7615_fw_trailer *hdr;
1876 const struct firmware *fw;
1879 ret = request_firmware(&fw, name, dev->mt76.dev);
1883 if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
1884 dev_err(dev->mt76.dev, "Invalid firmware\n");
1889 hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
1890 CR4_REGION_NUM * sizeof(*hdr));
1892 dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
1893 hdr->fw_ver, hdr->build_date);
1895 ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
1899 ret = mt7615_mcu_start_firmware(dev, 0, FW_START_WORKING_PDA_CR4);
1901 dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
1906 release_firmware(fw);
1911 static int mt7615_load_ram(struct mt7615_dev *dev)
1915 ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
1919 return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
1922 static int mt7615_load_firmware(struct mt7615_dev *dev)
1927 val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
1929 if (val != FW_STATE_FW_DOWNLOAD) {
1930 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1934 ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
1938 ret = mt7615_load_ram(dev);
1942 if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
1943 FIELD_PREP(MT_TOP_MISC2_FW_STATE,
1944 FW_STATE_CR4_RDY), 500)) {
1945 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1952 static int mt7622_load_firmware(struct mt7615_dev *dev)
1957 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1959 val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
1960 if (val != FW_STATE_FW_DOWNLOAD) {
1961 dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
1965 ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
1969 ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
1973 if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
1974 FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
1975 FW_STATE_NORMAL_TRX), 1500)) {
1976 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
1980 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
1985 int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
1994 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_LOG_2_HOST,
1995 &data, sizeof(data), true);
1998 static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
2000 u32 offset = 0, override_addr = 0, flag = 0;
2001 const struct mt7663_fw_trailer *hdr;
2002 const struct mt7663_fw_buf *buf;
2003 const struct firmware *fw;
2004 const u8 *base_addr;
2007 ret = request_firmware(&fw, name, dev->mt76.dev);
2011 if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
2012 dev_err(dev->mt76.dev, "Invalid firmware\n");
2017 hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size -
2018 FW_V3_COMMON_TAILER_SIZE);
2020 dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
2021 hdr->fw_ver, hdr->build_date);
2022 dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
2024 base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
2025 for (i = 0; i < hdr->n_region; i++) {
2026 u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
2027 u32 len, addr, mode;
2029 dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
2031 buf = (const struct mt7663_fw_buf *)(base_addr - shift);
2032 mode = mt7615_mcu_gen_dl_mode(buf->feature_set, false);
2033 addr = le32_to_cpu(buf->img_dest_addr);
2034 len = le32_to_cpu(buf->img_size);
2036 ret = mt7615_mcu_init_download(dev, addr, len, mode);
2038 dev_err(dev->mt76.dev, "Download request failed\n");
2042 ret = mt7615_mcu_send_firmware(dev, fw->data + offset, len);
2044 dev_err(dev->mt76.dev, "Failed to send firmware\n");
2048 offset += le32_to_cpu(buf->img_size);
2049 if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
2050 override_addr = le32_to_cpu(buf->img_dest_addr);
2051 dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
2056 if (is_mt7663(&dev->mt76)) {
2057 flag |= FW_START_DLYCAL;
2059 flag |= FW_START_OVERRIDE;
2061 dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
2062 override_addr, flag);
2065 ret = mt7615_mcu_start_firmware(dev, override_addr, flag);
2067 dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
2071 snprintf(dev->mt76.hw->wiphy->fw_version,
2072 sizeof(dev->mt76.hw->wiphy->fw_version),
2073 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2076 release_firmware(fw);
2081 int __mt7663_load_firmware(struct mt7615_dev *dev)
2085 ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
2087 dev_dbg(dev->mt76.dev, "Firmware is already download\n");
2091 ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, MT7663_ROM_PATCH);
2095 dev->fw_ver = MT7615_FIRMWARE_V3;
2096 dev->mcu_ops = &uni_update_ops;
2098 ret = mt7663_load_n9(dev, MT7663_FIRMWARE_N9);
2102 if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
2103 MT_TOP_MISC2_FW_N9_RDY, 1500)) {
2104 ret = mt76_get_field(dev, MT_CONN_ON_MISC,
2105 MT7663_TOP_MISC2_FW_STATE);
2106 dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2110 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2114 EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
2116 static int mt7663_load_firmware(struct mt7615_dev *dev)
2120 mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
2122 ret = __mt7663_load_firmware(dev);
2126 mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
2131 int mt7615_mcu_init(struct mt7615_dev *dev)
2133 static const struct mt76_mcu_ops mt7615_mcu_ops = {
2134 .headroom = sizeof(struct mt7615_mcu_txd),
2135 .mcu_skb_send_msg = mt7615_mcu_send_message,
2136 .mcu_send_msg = mt7615_mcu_msg_send,
2137 .mcu_restart = mt7615_mcu_restart,
2141 dev->mt76.mcu_ops = &mt7615_mcu_ops,
2143 ret = mt7615_driver_own(dev);
2147 switch (mt76_chip(&dev->mt76)) {
2149 ret = mt7622_load_firmware(dev);
2152 ret = mt7663_load_firmware(dev);
2155 ret = mt7615_load_firmware(dev);
2161 mt76_queue_tx_cleanup(dev, MT_TXQ_FWDL, false);
2162 dev_dbg(dev->mt76.dev, "Firmware init done\n");
2163 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
2164 mt7615_mcu_fw_log_2_host(dev, 0);
2169 void mt7615_mcu_exit(struct mt7615_dev *dev)
2171 __mt76_mcu_restart(&dev->mt76);
2172 mt7615_firmware_own(dev);
2173 skb_queue_purge(&dev->mt76.mcu.res_q);
2176 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
2182 } __packed req_hdr = {
2185 u8 *eep = (u8 *)dev->mt76.eeprom.data;
2186 struct sk_buff *skb;
2187 int eep_len, offset;
2189 switch (mt76_chip(&dev->mt76)) {
2191 eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
2192 offset = MT_EE_NIC_CONF_0;
2195 eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
2196 req_hdr.content_format = 1;
2197 offset = MT_EE_CHIP_ID;
2200 eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
2201 offset = MT_EE_NIC_CONF_0;
2205 req_hdr.len = cpu_to_le16(eep_len);
2207 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
2211 skb_put_data(skb, &req_hdr, sizeof(req_hdr));
2212 skb_put_data(skb, eep + offset, eep_len);
2214 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
2215 MCU_EXT_CMD_EFUSE_BUFFER_MODE, true);
2218 int mt7615_mcu_set_mac_enable(struct mt7615_dev *dev, int band, bool enable)
2229 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MAC_INIT_CTRL,
2230 &req, sizeof(req), true);
2233 int mt7615_mcu_set_rts_thresh(struct mt7615_phy *phy, u32 val)
2235 struct mt7615_dev *dev = phy->dev;
2244 .band = phy != &dev->phy,
2245 .len_thresh = cpu_to_le32(val),
2246 .pkt_thresh = cpu_to_le32(0x2),
2249 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PROTECT_CTRL,
2250 &req, sizeof(req), true);
2253 int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
2254 const struct ieee80211_tx_queue_params *params)
2256 #define WMM_AIFS_SET BIT(0)
2257 #define WMM_CW_MIN_SET BIT(1)
2258 #define WMM_CW_MAX_SET BIT(2)
2259 #define WMM_TXOP_SET BIT(3)
2260 #define WMM_PARAM_SET (WMM_AIFS_SET | WMM_CW_MIN_SET | \
2261 WMM_CW_MAX_SET | WMM_TXOP_SET)
2274 .valid = WMM_PARAM_SET,
2275 .aifs = params->aifs,
2277 .cw_max = cpu_to_le16(10),
2278 .txop = cpu_to_le16(params->txop),
2282 req.cw_min = fls(params->cw_min);
2284 req.cw_max = cpu_to_le16(fls(params->cw_max));
2286 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE,
2287 &req, sizeof(req), true);
2290 int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
2292 struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
2303 struct dbdc_entry entry[64];
2305 .enable = !!ext_phy,
2312 #define ADD_DBDC_ENTRY(_type, _idx, _band) \
2314 req.entry[req.num].type = _type; \
2315 req.entry[req.num].index = _idx; \
2316 req.entry[req.num++].band = _band; \
2319 for (i = 0; i < 4; i++) {
2320 bool band = !!(ext_phy->omac_mask & BIT(i));
2322 ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
2325 for (i = 0; i < 14; i++) {
2326 bool band = !!(ext_phy->omac_mask & BIT(0x11 + i));
2328 ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
2331 ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
2333 for (i = 0; i < 3; i++)
2334 ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
2336 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
2337 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
2338 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
2339 ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
2341 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
2342 ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
2345 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DBDC_CTRL,
2346 &req, sizeof(req), true);
2349 int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
2351 struct wtbl_req_hdr req = {
2352 .operation = WTBL_RESET_ALL,
2355 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE,
2356 &req, sizeof(req), true);
2359 int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
2360 enum mt7615_rdd_cmd cmd, u8 index,
2372 .rdd_rx_sel = rx_sel,
2376 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_CTRL,
2377 &req, sizeof(req), true);
2380 int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
2390 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH,
2391 &req, sizeof(req), true);
2394 int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
2395 const struct mt7615_dfs_pulse *pulse)
2399 struct mt7615_dfs_pulse pulse;
2404 memcpy(&req.pulse, pulse, sizeof(*pulse));
2406 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH,
2407 &req, sizeof(req), true);
2410 int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
2411 const struct mt7615_dfs_pattern *pattern)
2416 struct mt7615_dfs_pattern pattern;
2419 .radar_type = index,
2422 memcpy(&req.pattern, pattern, sizeof(*pattern));
2424 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH,
2425 &req, sizeof(req), true);
2428 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
2439 .pulse_num = dev->radar_pattern.n_pulses,
2441 u32 start_time = ktime_to_ms(ktime_get_boottime());
2444 if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
2447 /* TODO: add some noise here */
2448 for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
2449 req.pattern[i].width = dev->radar_pattern.width;
2450 req.pattern[i].power = dev->radar_pattern.power;
2451 req.pattern[i].start_time = start_time +
2452 i * dev->radar_pattern.period;
2455 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_PATTERN,
2456 &req, sizeof(req), false);
2459 static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
2461 struct mt76_phy *mphy = phy->mt76;
2462 struct ieee80211_hw *hw = mphy->hw;
2463 int n_chains = hweight8(mphy->antenna_mask);
2467 tx_power = hw->conf.power_level * 2 -
2468 mt76_tx_power_nss_delta(n_chains);
2469 mphy->txpower_cur = tx_power;
2471 for (i = 0; i < MT_SKU_1SS_DELTA; i++)
2474 for (i = 0; i < 4; i++) {
2477 if (i < n_chains - 1)
2478 delta = mt76_tx_power_nss_delta(n_chains) -
2479 mt76_tx_power_nss_delta(i + 1);
2480 sku[MT_SKU_1SS_DELTA + i] = delta;
2484 static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
2486 static const u8 width_to_bw[] = {
2487 [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
2488 [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
2489 [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
2490 [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
2491 [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
2492 [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
2493 [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
2494 [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
2497 if (chandef->width >= ARRAY_SIZE(width_to_bw))
2500 return width_to_bw[chandef->width];
2503 int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
2505 struct mt7615_dev *dev = phy->dev;
2506 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2507 int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
2516 /* for 80+80 only */
2521 __le32 outband_freq;
2527 .control_chan = chandef->chan->hw_value,
2528 .center_chan = ieee80211_frequency_to_channel(freq1),
2529 .tx_streams = hweight8(phy->mt76->antenna_mask),
2530 .rx_streams_mask = phy->chainmask,
2531 .center_chan2 = ieee80211_frequency_to_channel(freq2),
2534 if (dev->mt76.hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
2535 req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
2536 else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
2537 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
2538 req.switch_reason = CH_SWITCH_DFS;
2540 req.switch_reason = CH_SWITCH_NORMAL;
2542 req.band_idx = phy != &dev->phy;
2543 req.bw = mt7615_mcu_chan_bw(chandef);
2545 mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
2547 return __mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
2550 int mt7615_mcu_get_temperature(struct mt7615_dev *dev, int index)
2559 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_GET_TEMP, &req,
2563 int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
2565 struct mt7615_dev *dev = phy->dev;
2573 .band_idx = phy != &dev->phy,
2574 .sku_enable = enable,
2577 return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TX_POWER_FEATURE_CTRL, &req,
2581 int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
2583 struct mt76_phy *mphy = phy->mt76;
2584 struct mt7615_dev *dev = phy->dev;
2585 struct mt7615_mcu_channel_domain {
2586 __le32 country_code; /* regulatory_request.alpha2 */
2587 u8 bw_2g; /* BW_20_40M 0
2590 * BW_20_40_80_160M 3
2591 * BW_20_40_80_8080M 4
2601 .n_2ch = mphy->sband_2g.sband.n_channels,
2602 .n_5ch = mphy->sband_5g.sband.n_channels,
2604 struct mt7615_mcu_chan {
2609 int i, n_channels = hdr.n_2ch + hdr.n_5ch;
2610 int len = sizeof(hdr) + n_channels * sizeof(struct mt7615_mcu_chan);
2611 struct sk_buff *skb;
2613 if (!mt7615_firmware_offload(dev))
2616 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
2620 skb_put_data(skb, &hdr, sizeof(hdr));
2622 for (i = 0; i < n_channels; i++) {
2623 struct ieee80211_channel *chan;
2624 struct mt7615_mcu_chan channel;
2627 chan = &mphy->sband_2g.sband.channels[i];
2629 chan = &mphy->sband_5g.sband.channels[i - hdr.n_2ch];
2631 channel.hw_value = cpu_to_le16(chan->hw_value);
2632 channel.flags = cpu_to_le32(chan->flags);
2635 skb_put_data(skb, &channel, sizeof(channel));
2638 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
2639 MCU_CMD_SET_CHAN_DOMAIN, false);
2642 #define MT7615_SCAN_CHANNEL_TIME 120
2643 int mt7615_mcu_hw_scan(struct mt7615_phy *phy, struct ieee80211_vif *vif,
2644 struct ieee80211_scan_request *scan_req)
2646 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2647 struct cfg80211_scan_request *sreq = &scan_req->req;
2648 int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
2649 struct ieee80211_channel **scan_list = sreq->channels;
2650 int err, i, duration = MT7615_SCAN_CHANNEL_TIME;
2651 struct mt7615_dev *dev = phy->dev;
2652 bool ext_phy = phy != &dev->phy;
2653 struct mt7615_mcu_scan_channel *chan;
2654 struct mt7615_hw_scan_req *req;
2655 struct sk_buff *skb;
2657 /* fall-back to sw-scan */
2658 if (!mt7615_firmware_offload(dev))
2661 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(*req));
2665 set_bit(MT76_HW_SCANNING, &phy->mt76->state);
2666 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
2668 req = (struct mt7615_hw_scan_req *)skb_put(skb, sizeof(*req));
2670 req->seq_num = mvif->scan_seq_num | ext_phy << 7;
2671 req->bss_idx = mvif->idx;
2674 req->probe_req_num = 2;
2676 req->channel_type = 4;
2678 for (i = 0; i < sreq->n_ssids; i++) {
2679 req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
2680 memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid,
2681 sreq->ssids[i].ssid_len);
2684 req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
2685 req->channel_min_dwell_time = cpu_to_le16(duration);
2686 req->channel_dwell_time = cpu_to_le16(duration);
2688 req->channels_num = min_t(u8, sreq->n_channels, 32);
2689 req->ext_channels_num = min_t(u8, ext_channels_num, 32);
2690 for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
2692 chan = &req->ext_channels[i - 32];
2694 chan = &req->channels[i];
2696 chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
2697 chan->channel_num = scan_list[i]->hw_value;
2700 if (sreq->ie_len > 0) {
2701 memcpy(req->ies, sreq->ie, sreq->ie_len);
2702 req->ies_len = cpu_to_le16(sreq->ie_len);
2705 memcpy(req->bssid, sreq->bssid, ETH_ALEN);
2706 if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
2707 get_random_mask_addr(req->random_mac, sreq->mac_addr,
2708 sreq->mac_addr_mask);
2712 err = __mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_START_HW_SCAN,
2715 clear_bit(MT76_HW_SCANNING, &phy->mt76->state);
2720 int mt7615_mcu_cancel_hw_scan(struct mt7615_phy *phy,
2721 struct ieee80211_vif *vif)
2723 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2724 struct mt7615_dev *dev = phy->dev;
2725 struct cfg80211_scan_info info = {
2733 .seq_num = mvif->scan_seq_num,
2736 ieee80211_scan_completed(phy->mt76->hw, &info);
2737 clear_bit(MT76_HW_SCANNING, &phy->mt76->state);
2739 return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_CANCEL_HW_SCAN, &req,
2740 sizeof(req), false);
2743 int mt7615_mcu_sched_scan_req(struct mt7615_phy *phy,
2744 struct ieee80211_vif *vif,
2745 struct cfg80211_sched_scan_request *sreq)
2747 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
2748 struct ieee80211_channel **scan_list = sreq->channels;
2749 struct mt7615_dev *dev = phy->dev;
2750 bool ext_phy = phy != &dev->phy;
2751 struct mt7615_mcu_scan_channel *chan;
2752 struct mt7615_sched_scan_req *req;
2753 struct cfg80211_match_set *match;
2754 struct cfg80211_ssid *ssid;
2755 struct sk_buff *skb;
2758 if (!mt7615_firmware_offload(dev))
2761 skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
2762 sizeof(*req) + sreq->ie_len);
2766 mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
2768 req = (struct mt7615_sched_scan_req *)skb_put(skb, sizeof(*req));
2770 req->seq_num = mvif->scan_seq_num | ext_phy << 7;
2771 req->scan_func = !!(sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR);
2773 req->ssids_num = sreq->n_ssids;
2774 for (i = 0; i < req->ssids_num; i++) {
2775 ssid = &sreq->ssids[i];
2776 memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
2777 req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
2780 req->match_num = sreq->n_match_sets;
2781 for (i = 0; i < req->match_num; i++) {
2782 match = &sreq->match_sets[i];
2783 memcpy(req->match[i].ssid, match->ssid.ssid,
2784 match->ssid.ssid_len);
2785 req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
2786 req->match[i].ssid_len = match->ssid.ssid_len;
2789 req->channel_type = 4;
2790 req->channels_num = min_t(u8, sreq->n_channels, 64);
2791 for (i = 0; i < req->channels_num; i++) {
2792 chan = &req->channels[i];
2793 chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
2794 chan->channel_num = scan_list[i]->hw_value;
2797 req->intervals_num = sreq->n_scan_plans;
2798 for (i = 0; i < req->intervals_num; i++)
2799 req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
2801 if (sreq->ie_len > 0) {
2802 req->ie_len = cpu_to_le16(sreq->ie_len);
2803 memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
2806 return __mt76_mcu_skb_send_msg(&dev->mt76, skb,
2807 MCU_CMD_SCHED_SCAN_REQ, false);
2810 int mt7615_mcu_sched_scan_enable(struct mt7615_phy *phy,
2811 struct ieee80211_vif *vif,
2814 struct mt7615_dev *dev = phy->dev;
2816 u8 active; /* 0: enabled 1: disabled */
2822 if (!mt7615_firmware_offload(dev))
2826 set_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state);
2828 clear_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state);
2830 return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SCHED_SCAN_ENABLE,
2831 &req, sizeof(req), false);
2834 static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
2838 for (i = 0; i < n_freqs; i++)
2839 if (cur == freqs[i])
2845 static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
2847 static const u16 freq_list[] = {
2848 4980, 5805, 5905, 5190,
2849 5230, 5270, 5310, 5350,
2850 5390, 5430, 5470, 5510,
2851 5550, 5590, 5630, 5670,
2852 5710, 5755, 5795, 5835,
2853 5875, 5210, 5290, 5370,
2854 5450, 5530, 5610, 5690,
2857 static const u16 freq_bw40[] = {
2858 5190, 5230, 5270, 5310,
2859 5350, 5390, 5430, 5470,
2860 5510, 5550, 5590, 5630,
2861 5670, 5710, 5755, 5795,
2864 int offset_2g = ARRAY_SIZE(freq_list);
2871 return offset_2g + 1;
2873 return offset_2g + 2;
2875 return offset_2g + 3;
2879 case NL80211_CHAN_WIDTH_80:
2880 case NL80211_CHAN_WIDTH_80P80:
2881 case NL80211_CHAN_WIDTH_160:
2884 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2887 freq = freq_bw40[idx];
2891 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2894 freq = freq_bw40[idx];
2898 case NL80211_CHAN_WIDTH_40:
2899 idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
2908 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
2911 int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
2913 struct mt7615_dev *dev = phy->dev;
2914 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
2915 int freq2 = chandef->center_freq2;
2919 u8 runtime_calibration;
2932 __le32 sx0_i_lna[4];
2933 __le32 sx0_q_lna[4];
2935 __le32 sx2_i_lna[4];
2936 __le32 sx2_q_lna[4];
2941 .bw = mt7615_mcu_chan_bw(chandef),
2942 .band = chandef->center_freq1 > 4000,
2943 .dbdc_en = !!dev->mt76.phy2,
2945 u16 center_freq = chandef->center_freq1;
2947 u8 *eep = dev->mt76.eeprom.data;
2949 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
2952 if (chandef->width == NL80211_CHAN_WIDTH_160) {
2953 freq2 = center_freq + 40;
2958 req.runtime_calibration = 1;
2959 freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
2963 memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
2964 freq_idx * MT7615_EEPROM_DCOC_SIZE,
2965 sizeof(req.dcoc_data));
2966 req.runtime_calibration = 0;
2969 req.center_freq = cpu_to_le16(center_freq);
2970 ret = __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RXDCOC_CAL, &req,
2973 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
2974 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
2975 req.is_freq2 = true;
2976 center_freq = freq2;
2983 static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
2985 static const u16 freq_list[] = {
2986 4920, 4940, 4960, 4980,
2987 5040, 5060, 5080, 5180,
2988 5200, 5220, 5240, 5260,
2989 5280, 5300, 5320, 5340,
2990 5360, 5380, 5400, 5420,
2991 5440, 5460, 5480, 5500,
2992 5520, 5540, 5560, 5580,
2993 5600, 5620, 5640, 5660,
2994 5680, 5700, 5720, 5745,
2995 5765, 5785, 5805, 5825,
2996 5845, 5865, 5885, 5905
2998 int offset_2g = ARRAY_SIZE(freq_list);
3005 return offset_2g + 1;
3007 return offset_2g + 2;
3010 if (bw != NL80211_CHAN_WIDTH_20) {
3011 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3016 idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3022 return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3026 int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
3028 struct mt7615_dev *dev = phy->dev;
3029 struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3030 int freq2 = chandef->center_freq2;
3034 u8 runtime_calibration;
3062 .bw = mt7615_mcu_chan_bw(chandef),
3063 .band = chandef->center_freq1 > 4000,
3064 .dbdc_en = !!dev->mt76.phy2,
3066 u16 center_freq = chandef->center_freq1;
3068 u8 *eep = dev->mt76.eeprom.data;
3070 if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
3073 if (chandef->width == NL80211_CHAN_WIDTH_160) {
3074 freq2 = center_freq + 40;
3079 req.runtime_calibration = 1;
3080 freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
3084 memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
3085 freq_idx * MT7615_EEPROM_TXDPD_SIZE,
3086 sizeof(req.dpd_data));
3087 req.runtime_calibration = 0;
3090 req.center_freq = cpu_to_le16(center_freq);
3091 ret = __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TXDPD_CAL, &req,
3094 if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
3095 chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
3096 req.is_freq2 = true;
3097 center_freq = freq2;