Merge tag 'mt76-for-kvalo-2021-01-29' of https://github.com/nbd168/wireless
authorKalle Valo <kvalo@codeaurora.org>
Mon, 8 Feb 2021 17:04:02 +0000 (19:04 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 8 Feb 2021 17:04:02 +0000 (19:04 +0200)
mt76 patches for 5.12

* add new mt7921e driver
* factor out common code shared between 7615/7663 and 7921
* performance optimizations
* 7915 dbdc fixes
* 802.11 encap offload support
* support for multiple pcie gen1 host interfaces on 7915
* 7915 testmode support
* bugfixes
* testmode support enhancements
* endian fixes
* 7915 txbf support

1  2 
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c

@@@ -231,7 -231,7 +231,7 @@@ mt7615_mcu_send_message(struct mt76_de
                        int cmd, int *seq)
  {
        struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
 -      enum mt76_txq_id qid;
 +      enum mt76_mcuq_id qid;
  
        mt7615_mcu_fill_msg(dev, skb, cmd, seq);
        if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
@@@ -480,30 -480,15 +480,15 @@@ mt7615_mcu_roc_event(struct mt7615_dev 
                  round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
  }
  
- static void
- mt7615_mcu_beacon_loss_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt7615_beacon_loss_event *event = priv;
-       if (mvif->idx != event->bss_idx)
-               return;
-       if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
-               return;
-       ieee80211_beacon_loss(vif);
- }
  static void
  mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
  {
-       struct mt7615_beacon_loss_event *event;
+       struct mt76_connac_beacon_loss_event *event;
        struct mt76_phy *mphy;
        u8 band_idx = 0; /* DBDC support */
  
        skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
-       event = (struct mt7615_beacon_loss_event *)skb->data;
+       event = (struct mt76_connac_beacon_loss_event *)skb->data;
        if (band_idx && dev->mt76.phy2)
                mphy = dev->mt76.phy2;
        else
  
        ieee80211_iterate_active_interfaces_atomic(mphy->hw,
                                        IEEE80211_IFACE_ITER_RESUME_ALL,
-                                       mt7615_mcu_beacon_loss_iter, event);
+                                       mt76_connac_mcu_beacon_loss_iter,
+                                       event);
  }
  
  static void
  mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
  {
-       struct mt7615_mcu_bss_event *event;
+       struct mt76_connac_mcu_bss_event *event;
        struct mt76_phy *mphy;
        u8 band_idx = 0; /* DBDC support */
  
-       event = (struct mt7615_mcu_bss_event *)(skb->data +
-                                               sizeof(struct mt7615_mcu_rxd));
+       skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
+       event = (struct mt76_connac_mcu_bss_event *)skb->data;
  
        if (band_idx && dev->mt76.phy2)
                mphy = dev->mt76.phy2;
@@@ -557,6 -543,10 +543,10 @@@ mt7615_mcu_rx_unsolicited_event(struct 
        case MCU_EVENT_BSS_ABSENCE:
                mt7615_mcu_bss_event(dev, skb);
                break;
+       case MCU_EVENT_COREDUMP:
+               mt76_connac_mcu_coredump_event(&dev->mt76, skb,
+                                              &dev->coredump);
+               return;
        default:
                break;
        }
@@@ -575,6 -565,7 +565,7 @@@ void mt7615_mcu_rx_event(struct mt7615_
            rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
            rxd->eid == MCU_EVENT_BSS_ABSENCE ||
            rxd->eid == MCU_EVENT_SCAN_DONE ||
+           rxd->eid == MCU_EVENT_COREDUMP ||
            rxd->eid == MCU_EVENT_ROC ||
            !rxd->seq)
                mt7615_mcu_rx_unsolicited_event(dev, skb);
                mt76_mcu_rx_event(&dev->mt76, skb);
  }
  
- static int mt7615_mcu_init_download(struct mt7615_dev *dev, u32 addr,
-                                   u32 len, u32 mode)
- {
-       struct {
-               __le32 addr;
-               __le32 len;
-               __le32 mode;
-       } req = {
-               .addr = cpu_to_le32(addr),
-               .len = cpu_to_le32(len),
-               .mode = cpu_to_le32(mode),
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_TARGET_ADDRESS_LEN_REQ,
-                                &req, sizeof(req), true);
- }
  static int
  mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif,
                       bool bssid, bool enable)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       u32 idx = mvif->omac_idx - REPEATER_BSSID_START;
+       u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
        u32 mask = dev->omac_mask >> 32 & ~BIT(idx);
        const u8 *addr = vif->addr;
        struct {
  }
  
  static int
- mt7615_mcu_add_dev(struct mt7615_dev *dev, struct ieee80211_vif *vif,
+ mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
                   bool enable)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
+       struct mt7615_dev *dev = phy->dev;
        struct {
                struct req_hdr {
                        u8 omac_idx;
                } __packed tlv;
        } data = {
                .hdr = {
-                       .omac_idx = mvif->omac_idx,
-                       .band_idx = mvif->band_idx,
+                       .omac_idx = mvif->mt76.omac_idx,
+                       .band_idx = mvif->mt76.band_idx,
                        .tlv_num = cpu_to_le16(1),
                        .is_tlv_append = 1,
                },
                        .tag = cpu_to_le16(DEV_INFO_ACTIVE),
                        .len = cpu_to_le16(sizeof(struct req_tlv)),
                        .active = enable,
-                       .band_idx = mvif->band_idx,
+                       .band_idx = mvif->mt76.band_idx,
                },
        };
  
-       if (mvif->omac_idx >= REPEATER_BSSID_START)
+       if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
                return mt7615_mcu_muar_config(dev, vif, false, enable);
  
        memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
@@@ -703,10 -678,10 +678,10 @@@ mt7615_mcu_add_beacon_offload(struct mt
                u8 bcc_cnt;
                __le16 bcc_ie_pos;
        } __packed req = {
-               .omac_idx = mvif->omac_idx,
+               .omac_idx = mvif->mt76.omac_idx,
                .enable = enable,
                .wlan_idx = wcid->idx,
-               .band_idx = mvif->band_idx,
+               .band_idx = mvif->mt76.band_idx,
        };
        struct sk_buff *skb;
  
                return -EINVAL;
        }
  
-       if (mvif->band_idx) {
+       if (mvif->mt76.band_idx) {
                info = IEEE80211_SKB_CB(skb);
                info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
        }
@@@ -774,86 -749,6 +749,6 @@@ mt7615_mcu_ctrl_pm_state(struct mt7615_
                                 sizeof(req), true);
  }
  
- static struct sk_buff *
- mt7615_mcu_alloc_sta_req(struct mt7615_dev *dev, struct mt7615_vif *mvif,
-                        struct mt7615_sta *msta)
- {
-       struct sta_req_hdr hdr = {
-               .bss_idx = mvif->idx,
-               .wlan_idx = msta ? msta->wcid.idx : 0,
-               .muar_idx = msta ? mvif->omac_idx : 0,
-               .is_tlv_append = 1,
-       };
-       struct sk_buff *skb;
-       skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, MT7615_STA_UPDATE_MAX_SIZE);
-       if (!skb)
-               return ERR_PTR(-ENOMEM);
-       skb_put_data(skb, &hdr, sizeof(hdr));
-       return skb;
- }
- static struct wtbl_req_hdr *
- mt7615_mcu_alloc_wtbl_req(struct mt7615_dev *dev, struct mt7615_sta *msta,
-                         int cmd, void *sta_wtbl, struct sk_buff **skb)
- {
-       struct tlv *sta_hdr = sta_wtbl;
-       struct wtbl_req_hdr hdr = {
-               .wlan_idx = msta->wcid.idx,
-               .operation = cmd,
-       };
-       struct sk_buff *nskb = *skb;
-       if (!nskb) {
-               nskb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
-                                         MT7615_WTBL_UPDATE_BA_SIZE);
-               if (!nskb)
-                       return ERR_PTR(-ENOMEM);
-               *skb = nskb;
-       }
-       if (sta_hdr)
-               sta_hdr->len = cpu_to_le16(sizeof(hdr));
-       return skb_put_data(nskb, &hdr, sizeof(hdr));
- }
- static struct tlv *
- mt7615_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
-                         void *sta_ntlv, void *sta_wtbl)
- {
-       struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
-       struct tlv *sta_hdr = sta_wtbl;
-       struct tlv *ptlv, tlv = {
-               .tag = cpu_to_le16(tag),
-               .len = cpu_to_le16(len),
-       };
-       u16 ntlv;
-       ptlv = skb_put(skb, len);
-       memcpy(ptlv, &tlv, sizeof(tlv));
-       ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
-       ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
-       if (sta_hdr) {
-               u16 size = le16_to_cpu(sta_hdr->len);
-               sta_hdr->len = cpu_to_le16(size + len);
-       }
-       return ptlv;
- }
- static struct tlv *
- mt7615_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
- {
-       return mt7615_mcu_add_nested_tlv(skb, tag, len, skb->data, NULL);
- }
  static int
  mt7615_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
                         struct ieee80211_sta *sta, bool enable)
        u8 wlan_idx = mvif->sta.wcid.idx;
        struct tlv *tlv;
  
-       tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
+       tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
  
        switch (vif->type) {
        case NL80211_IFTYPE_MESH_POINT:
        bss->network_type = cpu_to_le32(type);
        bss->dtim_period = vif->bss_conf.dtim_period;
        bss->bmc_tx_wlan_idx = wlan_idx;
-       bss->wmm_idx = mvif->wmm_idx;
+       bss->wmm_idx = mvif->mt76.wmm_idx;
        bss->active = enable;
  
        return 0;
@@@ -903,12 -798,12 +798,12 @@@ static voi
  mt7615_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
+       u8 omac_idx = mvif->mt76.omac_idx;
        struct bss_info_omac *omac;
        struct tlv *tlv;
        u32 type = 0;
-       u8 idx;
  
-       tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
+       tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
  
        switch (vif->type) {
        case NL80211_IFTYPE_MESH_POINT:
        }
  
        omac = (struct bss_info_omac *)tlv;
-       idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
        omac->conn_type = cpu_to_le32(type);
-       omac->omac_idx = mvif->omac_idx;
-       omac->band_idx = mvif->band_idx;
-       omac->hw_bss_idx = idx;
+       omac->omac_idx = mvif->mt76.omac_idx;
+       omac->band_idx = mvif->mt76.band_idx;
+       omac->hw_bss_idx = omac_idx > EXT_BSSID_START ? HW_BSSID_0 : omac_idx;
  }
  
  /* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
@@@ -949,304 -843,17 +843,17 @@@ mt7615_mcu_bss_ext_tlv(struct sk_buff *
        int ext_bss_idx, tsf_offset;
        struct tlv *tlv;
  
-       ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
+       ext_bss_idx = mvif->mt76.omac_idx - EXT_BSSID_START;
        if (ext_bss_idx < 0)
                return;
  
-       tlv = mt7615_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
+       tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
  
        ext = (struct bss_info_ext_bss *)tlv;
        tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
        ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
  }
  
- static void
- mt7615_mcu_sta_ba_tlv(struct sk_buff *skb,
-                     struct ieee80211_ampdu_params *params,
-                     bool enable, bool tx)
- {
-       struct sta_rec_ba *ba;
-       struct tlv *tlv;
-       tlv = mt7615_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
-       ba = (struct sta_rec_ba *)tlv;
-       ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT,
-       ba->winsize = cpu_to_le16(params->buf_size);
-       ba->ssn = cpu_to_le16(params->ssn);
-       ba->ba_en = enable << params->tid;
-       ba->amsdu = params->amsdu;
-       ba->tid = params->tid;
- }
- static void
- mt7615_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
-                        struct ieee80211_sta *sta, bool enable)
- {
-       struct sta_rec_basic *basic;
-       struct tlv *tlv;
-       int conn_type;
-       tlv = mt7615_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
-       basic = (struct sta_rec_basic *)tlv;
-       basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
-       if (enable) {
-               basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
-               basic->conn_state = CONN_STATE_PORT_SECURE;
-       } else {
-               basic->conn_state = CONN_STATE_DISCONNECT;
-       }
-       if (!sta) {
-               basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
-               eth_broadcast_addr(basic->peer_addr);
-               return;
-       }
-       switch (vif->type) {
-       case NL80211_IFTYPE_MESH_POINT:
-       case NL80211_IFTYPE_AP:
-               if (vif->p2p)
-                       conn_type = CONNECTION_P2P_GC;
-               else
-                       conn_type = CONNECTION_INFRA_STA;
-               basic->conn_type = cpu_to_le32(conn_type);
-               basic->aid = cpu_to_le16(sta->aid);
-               break;
-       case NL80211_IFTYPE_STATION:
-               if (vif->p2p)
-                       conn_type = CONNECTION_P2P_GO;
-               else
-                       conn_type = CONNECTION_INFRA_AP;
-               basic->conn_type = cpu_to_le32(conn_type);
-               basic->aid = cpu_to_le16(vif->bss_conf.aid);
-               break;
-       case NL80211_IFTYPE_ADHOC:
-               basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
-               basic->aid = cpu_to_le16(sta->aid);
-               break;
-       default:
-               WARN_ON(1);
-               break;
-       }
-       memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
-       basic->qos = sta->wme;
- }
- static void
- mt7615_mcu_sta_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- {
-       struct tlv *tlv;
-       if (sta->ht_cap.ht_supported) {
-               struct sta_rec_ht *ht;
-               tlv = mt7615_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
-               ht = (struct sta_rec_ht *)tlv;
-               ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
-       }
-       if (sta->vht_cap.vht_supported) {
-               struct sta_rec_vht *vht;
-               tlv = mt7615_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
-               vht = (struct sta_rec_vht *)tlv;
-               vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
-               vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
-               vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
-       }
- }
- static void
- mt7615_mcu_sta_uapsd(struct sk_buff *skb, struct ieee80211_vif *vif,
-                    struct ieee80211_sta *sta)
- {
-       struct sta_rec_uapsd *uapsd;
-       struct tlv *tlv;
-       if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
-               return;
-       tlv = mt7615_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
-       uapsd = (struct sta_rec_uapsd *)tlv;
-       if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
-               uapsd->dac_map |= BIT(3);
-               uapsd->tac_map |= BIT(3);
-       }
-       if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
-               uapsd->dac_map |= BIT(2);
-               uapsd->tac_map |= BIT(2);
-       }
-       if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
-               uapsd->dac_map |= BIT(1);
-               uapsd->tac_map |= BIT(1);
-       }
-       if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
-               uapsd->dac_map |= BIT(0);
-               uapsd->tac_map |= BIT(0);
-       }
-       uapsd->max_sp = sta->max_sp;
- }
- static void
- mt7615_mcu_wtbl_ba_tlv(struct sk_buff *skb,
-                      struct ieee80211_ampdu_params *params,
-                      bool enable, bool tx, void *sta_wtbl,
-                      void *wtbl_tlv)
- {
-       struct wtbl_ba *ba;
-       struct tlv *tlv;
-       tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
-                                       wtbl_tlv, sta_wtbl);
-       ba = (struct wtbl_ba *)tlv;
-       ba->tid = params->tid;
-       if (tx) {
-               ba->ba_type = MT_BA_TYPE_ORIGINATOR;
-               ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
-               ba->ba_winsize = cpu_to_le16(params->buf_size);
-               ba->ba_en = enable;
-       } else {
-               memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
-               ba->ba_type = MT_BA_TYPE_RECIPIENT;
-               ba->rst_ba_tid = params->tid;
-               ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
-               ba->rst_ba_sb = 1;
-       }
-       if (enable && tx) {
-               u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
-               int i;
-               for (i = 7; i > 0; i--) {
-                       if (params->buf_size >= ba_range[i])
-                               break;
-               }
-               ba->ba_winsize_idx = i;
-       }
- }
- static void
- mt7615_mcu_wtbl_generic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
-                           struct ieee80211_sta *sta, void *sta_wtbl,
-                           void *wtbl_tlv)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct wtbl_generic *generic;
-       struct wtbl_rx *rx;
-       struct wtbl_spe *spe;
-       struct tlv *tlv;
-       tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_GENERIC, sizeof(*generic),
-                                       wtbl_tlv, sta_wtbl);
-       generic = (struct wtbl_generic *)tlv;
-       if (sta) {
-               if (vif->type == NL80211_IFTYPE_STATION)
-                       generic->partial_aid = cpu_to_le16(vif->bss_conf.aid);
-               else
-                       generic->partial_aid = cpu_to_le16(sta->aid);
-               memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
-               generic->muar_idx = mvif->omac_idx;
-               generic->qos = sta->wme;
-       } else {
-               eth_broadcast_addr(generic->peer_addr);
-               generic->muar_idx = 0xe;
-       }
-       tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
-                                       wtbl_tlv, sta_wtbl);
-       rx = (struct wtbl_rx *)tlv;
-       rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
-       rx->rca2 = 1;
-       rx->rv = 1;
-       tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
-                                       wtbl_tlv, sta_wtbl);
-       spe = (struct wtbl_spe *)tlv;
-       spe->spe_idx = 24;
- }
- static void
- mt7615_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
-                      void *sta_wtbl, void *wtbl_tlv)
- {
-       struct tlv *tlv;
-       struct wtbl_ht *ht = NULL;
-       u32 flags = 0;
-       if (sta->ht_cap.ht_supported) {
-               tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
-                                               wtbl_tlv, sta_wtbl);
-               ht = (struct wtbl_ht *)tlv;
-               ht->ldpc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
-               ht->af = sta->ht_cap.ampdu_factor;
-               ht->mm = sta->ht_cap.ampdu_density;
-               ht->ht = 1;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
-                       flags |= MT_WTBL_W5_SHORT_GI_20;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
-                       flags |= MT_WTBL_W5_SHORT_GI_40;
-       }
-       if (sta->vht_cap.vht_supported) {
-               struct wtbl_vht *vht;
-               u8 af;
-               tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_VHT, sizeof(*vht),
-                                               wtbl_tlv, sta_wtbl);
-               vht = (struct wtbl_vht *)tlv;
-               vht->ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
-               vht->vht = 1;
-               af = (sta->vht_cap.cap &
-                     IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
-                     IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
-               if (ht)
-                   ht->af = max(ht->af, af);
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
-                       flags |= MT_WTBL_W5_SHORT_GI_80;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
-                       flags |= MT_WTBL_W5_SHORT_GI_160;
-       }
-       /* wtbl smps */
-       if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC) {
-               struct wtbl_smps *smps;
-               tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
-                                               wtbl_tlv, sta_wtbl);
-               smps = (struct wtbl_smps *)tlv;
-               smps->smps = 1;
-       }
-       if (sta->ht_cap.ht_supported) {
-               /* sgi */
-               u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
-                         MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
-               struct wtbl_raw *raw;
-               tlv = mt7615_mcu_add_nested_tlv(skb, WTBL_RAW_DATA,
-                                               sizeof(*raw), wtbl_tlv,
-                                               sta_wtbl);
-               raw = (struct wtbl_raw *)tlv;
-               raw->val = cpu_to_le32(flags);
-               raw->msk = cpu_to_le32(~msk);
-               raw->wtbl_idx = 1;
-               raw->dw = 5;
-       }
- }
  static int
  mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
                   struct ieee80211_sta *sta, bool enable)
        struct mt7615_dev *dev = phy->dev;
        struct sk_buff *skb;
  
-       if (mvif->omac_idx >= REPEATER_BSSID_START)
+       if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
                mt7615_mcu_muar_config(dev, vif, true, enable);
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, NULL);
+       skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
  
        mt7615_mcu_bss_basic_tlv(skb, vif, sta, enable);
  
-       if (enable && mvif->omac_idx >= EXT_BSSID_START &&
-           mvif->omac_idx < REPEATER_BSSID_START)
+       if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START &&
+           mvif->mt76.omac_idx < REPEATER_BSSID_START)
                mt7615_mcu_bss_ext_tlv(skb, mvif);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
@@@ -1286,22 -893,25 +893,25 @@@ mt7615_mcu_wtbl_tx_ba(struct mt7615_de
        struct sk_buff *skb = NULL;
        int err;
  
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
+       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
+                                                 WTBL_SET, NULL, &skb);
        if (IS_ERR(wtbl_hdr))
                return PTR_ERR(wtbl_hdr);
  
-       mt7615_mcu_wtbl_ba_tlv(skb, params, enable, true, NULL, wtbl_hdr);
+       mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true,
+                                   NULL, wtbl_hdr);
  
        err = mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
                                    true);
        if (err < 0)
                return err;
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
+       skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
+                                           &msta->wcid);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
-       mt7615_mcu_sta_ba_tlv(skb, params, enable, true);
+       mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
                                     MCU_EXT_CMD_STA_REC_UPDATE, true);
@@@ -1318,11 -928,12 +928,12 @@@ mt7615_mcu_wtbl_rx_ba(struct mt7615_de
        struct sk_buff *skb;
        int err;
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
+       skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
+                                           &msta->wcid);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
-       mt7615_mcu_sta_ba_tlv(skb, params, enable, false);
+       mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
  
        err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
                return err;
  
        skb = NULL;
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
+       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
+                                                 WTBL_SET, NULL, &skb);
        if (IS_ERR(wtbl_hdr))
                return PTR_ERR(wtbl_hdr);
  
-       mt7615_mcu_wtbl_ba_tlv(skb, params, enable, false, NULL, wtbl_hdr);
+       mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
+                                   NULL, wtbl_hdr);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
                                     true);
  }
  
  static int
- mt7615_mcu_wtbl_sta_add(struct mt7615_dev *dev, struct ieee80211_vif *vif,
+ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
                        struct ieee80211_sta *sta, bool enable)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
        struct sk_buff *skb, *sskb, *wskb = NULL;
+       struct mt7615_dev *dev = phy->dev;
        struct wtbl_req_hdr *wtbl_hdr;
        struct mt7615_sta *msta;
        int cmd, err;
  
        msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
  
-       sskb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
+       sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
+                                            &msta->wcid);
        if (IS_ERR(sskb))
                return PTR_ERR(sskb);
  
-       mt7615_mcu_sta_basic_tlv(sskb, vif, sta, enable);
-       if (enable && sta) {
-               mt7615_mcu_sta_ht_tlv(sskb, sta);
-               mt7615_mcu_sta_uapsd(sskb, vif, sta);
-       }
+       mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable);
+       if (enable && sta)
+               mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif);
  
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
-                                            NULL, &wskb);
+       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
+                                                 WTBL_RESET_AND_SET, NULL,
+                                                 &wskb);
        if (IS_ERR(wtbl_hdr))
                return PTR_ERR(wtbl_hdr);
  
        if (enable) {
-               mt7615_mcu_wtbl_generic_tlv(wskb, vif, sta, NULL, wtbl_hdr);
+               mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta,
+                                                NULL, wtbl_hdr);
                if (sta)
-                       mt7615_mcu_wtbl_ht_tlv(wskb, sta, NULL, wtbl_hdr);
+                       mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
+                                                   NULL, wtbl_hdr);
        }
  
        cmd = enable ? MCU_EXT_CMD_WTBL_UPDATE : MCU_EXT_CMD_STA_REC_UPDATE;
@@@ -1413,17 -1029,19 +1029,19 @@@ mt7615_mcu_sta_ba(struct mt7615_dev *de
        struct tlv *sta_wtbl;
        struct sk_buff *skb;
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
+       skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
+                                           &msta->wcid);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
-       mt7615_mcu_sta_ba_tlv(skb, params, enable, tx);
+       mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
  
-       sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
+       sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
  
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
-                                            &skb);
-       mt7615_mcu_wtbl_ba_tlv(skb, params, enable, tx, sta_wtbl, wtbl_hdr);
+       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
+                                                 WTBL_SET, sta_wtbl, &skb);
+       mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx,
+                                   sta_wtbl, wtbl_hdr);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
                                     MCU_EXT_CMD_STA_REC_UPDATE, true);
@@@ -1446,46 -1064,22 +1064,22 @@@ mt7615_mcu_sta_rx_ba(struct mt7615_dev 
  }
  
  static int
mt7615_mcu_add_sta_cmd(struct mt7615_dev *dev, struct ieee80211_vif *vif,
-                      struct ieee80211_sta *sta, bool enable, int cmd)
__mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
+                    struct ieee80211_sta *sta, bool enable, int cmd)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct wtbl_req_hdr *wtbl_hdr;
-       struct mt7615_sta *msta;
-       struct tlv *sta_wtbl;
-       struct sk_buff *skb;
-       msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
-       if (IS_ERR(skb))
-               return PTR_ERR(skb);
-       mt7615_mcu_sta_basic_tlv(skb, vif, sta, enable);
-       if (enable && sta) {
-               mt7615_mcu_sta_ht_tlv(skb, sta);
-               mt7615_mcu_sta_uapsd(skb, vif, sta);
-       }
-       sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
+       struct mt76_wcid *wcid;
  
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
-                                            sta_wtbl, &skb);
-       if (enable) {
-               mt7615_mcu_wtbl_generic_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
-               if (sta)
-                       mt7615_mcu_wtbl_ht_tlv(skb, sta, sta_wtbl, wtbl_hdr);
-       }
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
+       wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
+       return mt76_connac_mcu_add_sta_cmd(phy, vif, sta, wcid, enable, cmd);
  }
  
  static int
- mt7615_mcu_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,
+ mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
                   struct ieee80211_sta *sta, bool enable)
  {
-       return mt7615_mcu_add_sta_cmd(dev, vif, sta, enable,
-                                     MCU_EXT_CMD_STA_REC_UPDATE);
+       return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
+                                   MCU_EXT_CMD_STA_REC_UPDATE);
  }
  
  static const struct mt7615_mcu_ops sta_update_ops = {
        .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
  };
  
- static int
- mt7615_mcu_uni_add_dev(struct mt7615_dev *dev,
-                      struct ieee80211_vif *vif, bool enable)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct {
-               struct {
-                       u8 omac_idx;
-                       u8 band_idx;
-                       __le16 pad;
-               } __packed hdr;
-               struct req_tlv {
-                       __le16 tag;
-                       __le16 len;
-                       u8 active;
-                       u8 pad;
-                       u8 omac_addr[ETH_ALEN];
-               } __packed tlv;
-       } dev_req = {
-               .hdr = {
-                       .omac_idx = mvif->omac_idx,
-                       .band_idx = mvif->band_idx,
-               },
-               .tlv = {
-                       .tag = cpu_to_le16(DEV_INFO_ACTIVE),
-                       .len = cpu_to_le16(sizeof(struct req_tlv)),
-                       .active = enable,
-               },
-       };
-       struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct mt7615_bss_basic_tlv basic;
-       } basic_req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .basic = {
-                       .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
-                       .len = cpu_to_le16(sizeof(struct mt7615_bss_basic_tlv)),
-                       .omac_idx = mvif->omac_idx,
-                       .band_idx = mvif->band_idx,
-                       .wmm_idx = mvif->wmm_idx,
-                       .active = enable,
-                       .bmc_tx_wlan_idx = cpu_to_le16(mvif->sta.wcid.idx),
-                       .sta_idx = cpu_to_le16(mvif->sta.wcid.idx),
-                       .conn_state = 1,
-               },
-       };
-       int err, idx, cmd, len;
-       void *data;
-       switch (vif->type) {
-       case NL80211_IFTYPE_MESH_POINT:
-       case NL80211_IFTYPE_AP:
-               basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
-               break;
-       case NL80211_IFTYPE_STATION:
-               basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
-               break;
-       case NL80211_IFTYPE_ADHOC:
-               basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
-               break;
-       default:
-               WARN_ON(1);
-               break;
-       }
-       idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
-       basic_req.basic.hw_bss_idx = idx;
-       memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
-       cmd = enable ? MCU_UNI_CMD_DEV_INFO_UPDATE : MCU_UNI_CMD_BSS_INFO_UPDATE;
-       data = enable ? (void *)&dev_req : (void *)&basic_req;
-       len = enable ? sizeof(dev_req) : sizeof(basic_req);
-       err = mt76_mcu_send_msg(&dev->mt76, cmd, data, len, true);
-       if (err < 0)
-               return err;
-       cmd = enable ? MCU_UNI_CMD_BSS_INFO_UPDATE : MCU_UNI_CMD_DEV_INFO_UPDATE;
-       data = enable ? (void *)&basic_req : (void *)&dev_req;
-       len = enable ? sizeof(basic_req) : sizeof(dev_req);
-       return mt76_mcu_send_msg(&dev->mt76, cmd, data, len, true);
- }
  static int
  mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
  {
  }
  
  static int
- mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
-                      struct ieee80211_sta *sta, bool enable)
+ mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
+                                 struct ieee80211_hw *hw,
+                                 struct ieee80211_vif *vif,
+                                 bool enable)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
-       int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
-       struct mt7615_dev *dev = phy->dev;
+       struct mt76_wcid *wcid = &dev->mt76.global_wcid;
+       struct ieee80211_mutable_offsets offs;
        struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct mt7615_bss_basic_tlv basic;
-               struct mt7615_bss_qos_tlv qos;
-       } basic_req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .basic = {
-                       .tag = cpu_to_le16(UNI_BSS_INFO_BASIC),
-                       .len = cpu_to_le16(sizeof(struct mt7615_bss_basic_tlv)),
-                       .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
-                       .dtim_period = vif->bss_conf.dtim_period,
-                       .omac_idx = mvif->omac_idx,
-                       .band_idx = mvif->band_idx,
-                       .wmm_idx = mvif->wmm_idx,
-                       .active = true, /* keep bss deactivated */
-                       .phymode = 0x38,
-               },
-               .qos = {
-                       .tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
-                       .len = cpu_to_le16(sizeof(struct mt7615_bss_qos_tlv)),
-                       .qos = vif->bss_conf.qos,
-               },
-       };
-       struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct rlm_tlv {
-                       __le16 tag;
-                       __le16 len;
-                       u8 control_channel;
-                       u8 center_chan;
-                       u8 center_chan2;
-                       u8 bw;
-                       u8 tx_streams;
-                       u8 rx_streams;
-                       u8 short_st;
-                       u8 ht_op_info;
-                       u8 sco;
-                       u8 pad[3];
-               } __packed rlm;
-       } __packed rlm_req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .rlm = {
-                       .tag = cpu_to_le16(UNI_BSS_INFO_RLM),
-                       .len = cpu_to_le16(sizeof(struct rlm_tlv)),
-                       .control_channel = chandef->chan->hw_value,
-                       .center_chan = ieee80211_frequency_to_channel(freq1),
-                       .center_chan2 = ieee80211_frequency_to_channel(freq2),
-                       .tx_streams = hweight8(phy->mt76->antenna_mask),
-                       .rx_streams = phy->chainmask,
-                       .short_st = true,
-               },
-       };
-       int err, conn_type;
-       u8 idx;
-       idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
-       basic_req.basic.hw_bss_idx = idx;
-       switch (vif->type) {
-       case NL80211_IFTYPE_MESH_POINT:
-       case NL80211_IFTYPE_AP:
-               if (vif->p2p)
-                       conn_type = CONNECTION_P2P_GO;
-               else
-                       conn_type = CONNECTION_INFRA_AP;
-               basic_req.basic.conn_type = cpu_to_le32(conn_type);
-               break;
-       case NL80211_IFTYPE_STATION:
-               if (vif->p2p)
-                       conn_type = CONNECTION_P2P_GC;
-               else
-                       conn_type = CONNECTION_INFRA_STA;
-               basic_req.basic.conn_type = cpu_to_le32(conn_type);
-               break;
-       case NL80211_IFTYPE_ADHOC:
-               basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
-               break;
-       default:
-               WARN_ON(1);
-               break;
-       }
-       memcpy(basic_req.basic.bssid, vif->bss_conf.bssid, ETH_ALEN);
-       basic_req.basic.bmc_tx_wlan_idx = cpu_to_le16(mvif->sta.wcid.idx);
-       basic_req.basic.sta_idx = cpu_to_le16(mvif->sta.wcid.idx);
-       basic_req.basic.conn_state = !enable;
-       err = mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
-                               &basic_req, sizeof(basic_req), true);
-       if (err < 0)
-               return err;
-       switch (chandef->width) {
-       case NL80211_CHAN_WIDTH_40:
-               rlm_req.rlm.bw = CMD_CBW_40MHZ;
-               break;
-       case NL80211_CHAN_WIDTH_80:
-               rlm_req.rlm.bw = CMD_CBW_80MHZ;
-               break;
-       case NL80211_CHAN_WIDTH_80P80:
-               rlm_req.rlm.bw = CMD_CBW_8080MHZ;
-               break;
-       case NL80211_CHAN_WIDTH_160:
-               rlm_req.rlm.bw = CMD_CBW_160MHZ;
-               break;
-       case NL80211_CHAN_WIDTH_5:
-               rlm_req.rlm.bw = CMD_CBW_5MHZ;
-               break;
-       case NL80211_CHAN_WIDTH_10:
-               rlm_req.rlm.bw = CMD_CBW_10MHZ;
-               break;
-       case NL80211_CHAN_WIDTH_20_NOHT:
-       case NL80211_CHAN_WIDTH_20:
-       default:
-               rlm_req.rlm.bw = CMD_CBW_20MHZ;
-               break;
-       }
-       if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan)
-               rlm_req.rlm.sco = 1; /* SCA */
-       else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan)
-               rlm_req.rlm.sco = 3; /* SCB */
-       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_BSS_INFO_UPDATE,
-                                &rlm_req, sizeof(rlm_req), true);
- }
- static int
- mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
-                                 struct ieee80211_hw *hw,
-                                 struct ieee80211_vif *vif,
-                                 bool enable)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt76_wcid *wcid = &dev->mt76.global_wcid;
-       struct ieee80211_mutable_offsets offs;
-       struct {
-               struct req_hdr {
+               struct req_hdr {
                        u8 bss_idx;
                        u8 pad[3];
                } __packed hdr;
                } __packed beacon_tlv;
        } req = {
                .hdr = {
-                       .bss_idx = mvif->idx,
+                       .bss_idx = mvif->mt76.idx,
                },
                .beacon_tlv = {
                        .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
  }
  
  static int
- mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
-                    struct ieee80211_ampdu_params *params,
-                    bool enable)
+ mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
+                      bool enable)
  {
-       struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
-       struct mt7615_vif *mvif = msta->vif;
-       struct wtbl_req_hdr *wtbl_hdr;
-       struct tlv *sta_wtbl;
-       struct sk_buff *skb;
-       int err;
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
-       if (IS_ERR(skb))
-               return PTR_ERR(skb);
-       sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
+       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
  
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
-                                            &skb);
-       if (IS_ERR(wtbl_hdr))
-               return PTR_ERR(wtbl_hdr);
+       return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
+                                          enable);
+ }
  
-       mt7615_mcu_wtbl_ba_tlv(skb, params, enable, true, sta_wtbl,
-                              wtbl_hdr);
+ static int
+ mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
+                      struct ieee80211_sta *sta, bool enable)
+ {
+       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
  
-       err =  mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_UNI_CMD_STA_REC_UPDATE, true);
-       if (err < 0)
-               return err;
+       return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
+                                          enable);
+ }
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
-       if (IS_ERR(skb))
-               return PTR_ERR(skb);
+ static inline int
+ mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
+                      struct ieee80211_sta *sta, bool enable)
+ {
+       return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
+                                   MCU_UNI_CMD_STA_REC_UPDATE);
+ }
  
-       mt7615_mcu_sta_ba_tlv(skb, params, enable, true);
+ static int
+ mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
+                    struct ieee80211_ampdu_params *params,
+                    bool enable)
+ {
+       struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv;
  
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_UNI_CMD_STA_REC_UPDATE, true);
+       return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params,
+                                     enable, true);
  }
  
  static int
@@@ -1866,43 -1223,38 +1223,38 @@@ mt7615_mcu_uni_rx_ba(struct mt7615_dev 
        struct sk_buff *skb;
        int err;
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
+       skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
+                                           &msta->wcid);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
-       mt7615_mcu_sta_ba_tlv(skb, params, enable, false);
+       mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
  
        err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
                                    MCU_UNI_CMD_STA_REC_UPDATE, true);
        if (err < 0 || !enable)
                return err;
  
-       skb = mt7615_mcu_alloc_sta_req(dev, mvif, msta);
+       skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
+                                           &msta->wcid);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
-       sta_wtbl = mt7615_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
+       sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
+                                          sizeof(struct tlv));
  
-       wtbl_hdr = mt7615_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
-                                            &skb);
+       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
+                                                 WTBL_SET, sta_wtbl, &skb);
        if (IS_ERR(wtbl_hdr))
                return PTR_ERR(wtbl_hdr);
  
-       mt7615_mcu_wtbl_ba_tlv(skb, params, enable, false, sta_wtbl,
-                              wtbl_hdr);
+       mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
+                                   sta_wtbl, wtbl_hdr);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
                                     MCU_UNI_CMD_STA_REC_UPDATE, true);
  }
  
- static int
- mt7615_mcu_uni_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,
-                      struct ieee80211_sta *sta, bool enable)
- {
-       return mt7615_mcu_add_sta_cmd(dev, vif, sta, enable,
-                                     MCU_UNI_CMD_STA_REC_UPDATE);
- }
  static const struct mt7615_mcu_ops uni_update_ops = {
        .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
        .set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
        .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
  };
  
- static int mt7615_mcu_start_firmware(struct mt7615_dev *dev, u32 addr,
-                                    u32 option)
- {
-       struct {
-               __le32 option;
-               __le32 addr;
-       } req = {
-               .option = cpu_to_le32(option),
-               .addr = cpu_to_le32(addr),
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_FW_START_REQ, &req,
-                                sizeof(req), true);
- }
  int mt7615_mcu_restart(struct mt76_dev *dev)
  {
        return mt76_mcu_send_msg(dev, MCU_CMD_RESTART_DL_REQ, NULL, 0, true);
  }
  EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
  
- static int mt7615_mcu_patch_sem_ctrl(struct mt7615_dev *dev, bool get)
- {
-       struct {
-               __le32 op;
-       } req = {
-               .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE),
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_PATCH_SEM_CONTROL, &req,
-                                sizeof(req), true);
- }
- static int mt7615_mcu_start_patch(struct mt7615_dev *dev)
- {
-       struct {
-               u8 check_crc;
-               u8 reserved[3];
-       } req = {
-               .check_crc = 0,
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_PATCH_FINISH_REQ, &req,
-                                sizeof(req), true);
- }
  static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
  {
        const struct mt7615_patch_hdr *hdr;
        const struct firmware *fw = NULL;
        int len, ret, sem;
  
-       sem = mt7615_mcu_patch_sem_ctrl(dev, 1);
+       sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true);
        switch (sem) {
        case PATCH_IS_DL:
                return 0;
  
        len = fw->size - sizeof(*hdr);
  
-       ret = mt7615_mcu_init_download(dev, addr, len, DL_MODE_NEED_RSP);
+       ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
+                                           DL_MODE_NEED_RSP);
        if (ret) {
                dev_err(dev->mt76.dev, "Download request failed\n");
                goto out;
                goto out;
        }
  
-       ret = mt7615_mcu_start_patch(dev);
+       ret = mt76_connac_mcu_start_patch(&dev->mt76);
        if (ret)
                dev_err(dev->mt76.dev, "Failed to start patch\n");
  
  out:
        release_firmware(fw);
  
-       sem = mt7615_mcu_patch_sem_ctrl(dev, 0);
+       sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
        switch (sem) {
        case PATCH_REL_SEM_SUCCESS:
                break;
@@@ -2056,7 -1369,8 +1369,8 @@@ mt7615_mcu_send_ram_firmware(struct mt7
                len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
                addr = le32_to_cpu(hdr[i].addr);
  
-               err = mt7615_mcu_init_download(dev, addr, len, mode);
+               err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
+                                                   mode);
                if (err) {
                        dev_err(dev->mt76.dev, "Download request failed\n");
                        return err;
        return 0;
  }
  
- static const struct wiphy_wowlan_support mt7615_wowlan_support = {
-       .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
-                WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | WIPHY_WOWLAN_NET_DETECT,
-       .n_patterns = 1,
-       .pattern_min_len = 1,
-       .pattern_max_len = MT7615_WOW_PATTEN_MAX_LEN,
-       .max_nd_match_sets = 10,
- };
  static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
  {
        const struct mt7615_fw_trailer *hdr;
        if (ret)
                goto out;
  
-       ret = mt7615_mcu_start_firmware(dev, le32_to_cpu(hdr->addr),
-                                       FW_START_OVERRIDE);
+       ret = mt76_connac_mcu_start_firmware(&dev->mt76,
+                                            le32_to_cpu(hdr->addr),
+                                            FW_START_OVERRIDE);
        if (ret) {
                dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
                goto out;
@@@ -2161,7 -1467,8 +1467,8 @@@ static int mt7615_load_cr4(struct mt761
        if (ret)
                goto out;
  
-       ret = mt7615_mcu_start_firmware(dev, 0, FW_START_WORKING_PDA_CR4);
+       ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
+                                            FW_START_WORKING_PDA_CR4);
        if (ret) {
                dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
                goto out;
@@@ -2298,7 -1605,8 +1605,8 @@@ static int mt7663_load_n9(struct mt7615
                addr = le32_to_cpu(buf->img_dest_addr);
                len = le32_to_cpu(buf->img_size);
  
-               ret = mt7615_mcu_init_download(dev, addr, len, mode);
+               ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
+                                                   mode);
                if (ret) {
                        dev_err(dev->mt76.dev, "Download request failed\n");
                        goto out;
        dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
                 override_addr, flag);
  
-       ret = mt7615_mcu_start_firmware(dev, override_addr, flag);
+       ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
        if (ret) {
                dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
                goto out;
@@@ -2410,7 -1718,7 +1718,7 @@@ int __mt7663_load_firmware(struct mt761
  
  #ifdef CONFIG_PM
        if (mt7615_firmware_offload(dev))
-               dev->mt76.hw->wiphy->wowlan = &mt7615_wowlan_support;
+               dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
  #endif /* CONFIG_PM */
  
        dev_dbg(dev->mt76.dev, "Firmware init done\n");
@@@ -2522,42 -1830,6 +1830,6 @@@ int mt7615_mcu_set_eeprom(struct mt7615
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
                                     MCU_EXT_CMD_EFUSE_BUFFER_MODE, true);
  }
- EXPORT_SYMBOL_GPL(mt7615_mcu_set_eeprom);
- int mt7615_mcu_set_mac_enable(struct mt7615_dev *dev, int band, bool enable)
- {
-       struct {
-               u8 enable;
-               u8 band;
-               u8 rsv[2];
-       } __packed req = {
-               .enable = enable,
-               .band = band,
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MAC_INIT_CTRL, &req,
-                                sizeof(req), true);
- }
- int mt7615_mcu_set_rts_thresh(struct mt7615_phy *phy, u32 val)
- {
-       struct mt7615_dev *dev = phy->dev;
-       struct {
-               u8 prot_idx;
-               u8 band;
-               u8 rsv[2];
-               __le32 len_thresh;
-               __le32 pkt_thresh;
-       } __packed req = {
-               .prot_idx = 1,
-               .band = phy != &dev->phy,
-               .len_thresh = cpu_to_le32(val),
-               .pkt_thresh = cpu_to_le32(0x2),
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PROTECT_CTRL, &req,
-                                sizeof(req), true);
- }
  
  int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
                       const struct ieee80211_tx_queue_params *params)
@@@ -2664,7 -1936,6 +1936,6 @@@ int mt7615_mcu_del_wtbl_all(struct mt76
        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_WTBL_UPDATE, &req,
                                 sizeof(req), true);
  }
- EXPORT_SYMBOL_GPL(mt7615_mcu_del_wtbl_all);
  
  int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
                       enum mt7615_rdd_cmd cmd, u8 index,
@@@ -2880,7 -2151,7 +2151,7 @@@ int mt7615_mcu_set_chan_info(struct mt7
                .control_chan = chandef->chan->hw_value,
                .center_chan = ieee80211_frequency_to_channel(freq1),
                .tx_streams = hweight8(phy->mt76->antenna_mask),
-               .rx_streams_mask = phy->chainmask,
+               .rx_streams_mask = phy->mt76->chainmask,
                .center_chan2 = ieee80211_frequency_to_channel(freq2),
        };
  
        req.band_idx = phy != &dev->phy;
        req.bw = mt7615_mcu_chan_bw(chandef);
  
-       if (mt76_testmode_enabled(&dev->mt76))
+       if (mt76_testmode_enabled(phy->mt76))
                memset(req.txpower_sku, 0x3f, 49);
        else
                mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
@@@ -2956,296 -2227,6 +2227,6 @@@ int mt7615_mcu_set_sku_en(struct mt7615
                                 sizeof(req), true);
  }
  
- int mt7615_mcu_set_vif_ps(struct mt7615_dev *dev, struct ieee80211_vif *vif)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct {
-               u8 bss_idx;
-               u8 ps_state; /* 0: device awake
-                             * 1: static power save
-                             * 2: dynamic power saving
-                             */
-       } req = {
-               .bss_idx = mvif->idx,
-               .ps_state = vif->bss_conf.ps ? 2 : 0,
-       };
-       if (vif->type != NL80211_IFTYPE_STATION)
-               return -ENOTSUPP;
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_PS_PROFILE, &req,
-                                sizeof(req), false);
- }
- int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
- {
-       struct mt76_phy *mphy = phy->mt76;
-       struct mt7615_dev *dev = phy->dev;
-       struct mt7615_mcu_channel_domain {
-               __le32 country_code; /* regulatory_request.alpha2 */
-               u8 bw_2g; /* BW_20_40M          0
-                          * BW_20M             1
-                          * BW_20_40_80M       2
-                          * BW_20_40_80_160M   3
-                          * BW_20_40_80_8080M  4
-                          */
-               u8 bw_5g;
-               __le16 pad;
-               u8 n_2ch;
-               u8 n_5ch;
-               __le16 pad2;
-       } __packed hdr = {
-               .bw_2g = 0,
-               .bw_5g = 3,
-               .n_2ch = mphy->sband_2g.sband.n_channels,
-               .n_5ch = mphy->sband_5g.sband.n_channels,
-       };
-       struct mt7615_mcu_chan {
-               __le16 hw_value;
-               __le16 pad;
-               __le32 flags;
-       } __packed;
-       int i, n_channels = hdr.n_2ch + hdr.n_5ch;
-       int len = sizeof(hdr) + n_channels * sizeof(struct mt7615_mcu_chan);
-       struct sk_buff *skb;
-       if (!mt7615_firmware_offload(dev))
-               return 0;
-       skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
-       if (!skb)
-               return -ENOMEM;
-       skb_put_data(skb, &hdr, sizeof(hdr));
-       for (i = 0; i < n_channels; i++) {
-               struct ieee80211_channel *chan;
-               struct mt7615_mcu_chan channel;
-               if (i < hdr.n_2ch)
-                       chan = &mphy->sband_2g.sband.channels[i];
-               else
-                       chan = &mphy->sband_5g.sband.channels[i - hdr.n_2ch];
-               channel.hw_value = cpu_to_le16(chan->hw_value);
-               channel.flags = cpu_to_le32(chan->flags);
-               channel.pad = 0;
-               skb_put_data(skb, &channel, sizeof(channel));
-       }
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_SET_CHAN_DOMAIN,
-                                    false);
- }
- #define MT7615_SCAN_CHANNEL_TIME      60
- int mt7615_mcu_hw_scan(struct mt7615_phy *phy, struct ieee80211_vif *vif,
-                      struct ieee80211_scan_request *scan_req)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct cfg80211_scan_request *sreq = &scan_req->req;
-       int n_ssids = 0, err, i, duration = MT7615_SCAN_CHANNEL_TIME;
-       int ext_channels_num = max_t(int, sreq->n_channels - 32, 0);
-       struct ieee80211_channel **scan_list = sreq->channels;
-       struct mt7615_dev *dev = phy->dev;
-       bool ext_phy = phy != &dev->phy;
-       struct mt7615_mcu_scan_channel *chan;
-       struct mt7615_hw_scan_req *req;
-       struct sk_buff *skb;
-       /* fall-back to sw-scan */
-       if (!mt7615_firmware_offload(dev))
-               return 1;
-       skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(*req));
-       if (!skb)
-               return -ENOMEM;
-       set_bit(MT76_HW_SCANNING, &phy->mt76->state);
-       mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
-       req = (struct mt7615_hw_scan_req *)skb_put(skb, sizeof(*req));
-       req->seq_num = mvif->scan_seq_num | ext_phy << 7;
-       req->bss_idx = mvif->idx;
-       req->scan_type = sreq->n_ssids ? 1 : 0;
-       req->probe_req_num = sreq->n_ssids ? 2 : 0;
-       req->version = 1;
-       for (i = 0; i < sreq->n_ssids; i++) {
-               if (!sreq->ssids[i].ssid_len)
-                       continue;
-               req->ssids[i].ssid_len = cpu_to_le32(sreq->ssids[i].ssid_len);
-               memcpy(req->ssids[i].ssid, sreq->ssids[i].ssid,
-                      sreq->ssids[i].ssid_len);
-               n_ssids++;
-       }
-       req->ssid_type = n_ssids ? BIT(2) : BIT(0);
-       req->ssid_type_ext = n_ssids ? BIT(0) : 0;
-       req->ssids_num = n_ssids;
-       /* increase channel time for passive scan */
-       if (!sreq->n_ssids)
-               duration *= 2;
-       req->timeout_value = cpu_to_le16(sreq->n_channels * duration);
-       req->channel_min_dwell_time = cpu_to_le16(duration);
-       req->channel_dwell_time = cpu_to_le16(duration);
-       req->channels_num = min_t(u8, sreq->n_channels, 32);
-       req->ext_channels_num = min_t(u8, ext_channels_num, 32);
-       for (i = 0; i < req->channels_num + req->ext_channels_num; i++) {
-               if (i >= 32)
-                       chan = &req->ext_channels[i - 32];
-               else
-                       chan = &req->channels[i];
-               chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
-               chan->channel_num = scan_list[i]->hw_value;
-       }
-       req->channel_type = sreq->n_channels ? 4 : 0;
-       if (sreq->ie_len > 0) {
-               memcpy(req->ies, sreq->ie, sreq->ie_len);
-               req->ies_len = cpu_to_le16(sreq->ie_len);
-       }
-       memcpy(req->bssid, sreq->bssid, ETH_ALEN);
-       if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
-               get_random_mask_addr(req->random_mac, sreq->mac_addr,
-                                    sreq->mac_addr_mask);
-               req->scan_func = 1;
-       }
-       err = mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_START_HW_SCAN,
-                                   false);
-       if (err < 0)
-               clear_bit(MT76_HW_SCANNING, &phy->mt76->state);
-       return err;
- }
- int mt7615_mcu_cancel_hw_scan(struct mt7615_phy *phy,
-                             struct ieee80211_vif *vif)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt7615_dev *dev = phy->dev;
-       struct {
-               u8 seq_num;
-               u8 is_ext_channel;
-               u8 rsv[2];
-       } __packed req = {
-               .seq_num = mvif->scan_seq_num,
-       };
-       if (test_and_clear_bit(MT76_HW_SCANNING, &phy->mt76->state)) {
-               struct cfg80211_scan_info info = {
-                       .aborted = true,
-               };
-               ieee80211_scan_completed(phy->mt76->hw, &info);
-       }
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_CANCEL_HW_SCAN, &req,
-                                sizeof(req), false);
- }
- int mt7615_mcu_sched_scan_req(struct mt7615_phy *phy,
-                             struct ieee80211_vif *vif,
-                             struct cfg80211_sched_scan_request *sreq)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct ieee80211_channel **scan_list = sreq->channels;
-       struct mt7615_dev *dev = phy->dev;
-       bool ext_phy = phy != &dev->phy;
-       struct mt7615_mcu_scan_channel *chan;
-       struct mt7615_sched_scan_req *req;
-       struct cfg80211_match_set *match;
-       struct cfg80211_ssid *ssid;
-       struct sk_buff *skb;
-       int i;
-       if (!mt7615_firmware_offload(dev))
-               return -ENOTSUPP;
-       skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
-                                sizeof(*req) + sreq->ie_len);
-       if (!skb)
-               return -ENOMEM;
-       mvif->scan_seq_num = (mvif->scan_seq_num + 1) & 0x7f;
-       req = (struct mt7615_sched_scan_req *)skb_put(skb, sizeof(*req));
-       req->version = 1;
-       req->seq_num = mvif->scan_seq_num | ext_phy << 7;
-       if (sreq->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
-               get_random_mask_addr(req->random_mac, sreq->mac_addr,
-                                    sreq->mac_addr_mask);
-               req->scan_func = 1;
-       }
-       req->ssids_num = sreq->n_ssids;
-       for (i = 0; i < req->ssids_num; i++) {
-               ssid = &sreq->ssids[i];
-               memcpy(req->ssids[i].ssid, ssid->ssid, ssid->ssid_len);
-               req->ssids[i].ssid_len = cpu_to_le32(ssid->ssid_len);
-       }
-       req->match_num = sreq->n_match_sets;
-       for (i = 0; i < req->match_num; i++) {
-               match = &sreq->match_sets[i];
-               memcpy(req->match[i].ssid, match->ssid.ssid,
-                      match->ssid.ssid_len);
-               req->match[i].rssi_th = cpu_to_le32(match->rssi_thold);
-               req->match[i].ssid_len = match->ssid.ssid_len;
-       }
-       req->channel_type = sreq->n_channels ? 4 : 0;
-       req->channels_num = min_t(u8, sreq->n_channels, 64);
-       for (i = 0; i < req->channels_num; i++) {
-               chan = &req->channels[i];
-               chan->band = scan_list[i]->band == NL80211_BAND_2GHZ ? 1 : 2;
-               chan->channel_num = scan_list[i]->hw_value;
-       }
-       req->intervals_num = sreq->n_scan_plans;
-       for (i = 0; i < req->intervals_num; i++)
-               req->intervals[i] = cpu_to_le16(sreq->scan_plans[i].interval);
-       if (sreq->ie_len > 0) {
-               req->ie_len = cpu_to_le16(sreq->ie_len);
-               memcpy(skb_put(skb, sreq->ie_len), sreq->ie, sreq->ie_len);
-       }
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_SCHED_SCAN_REQ,
-                                    false);
- }
- int mt7615_mcu_sched_scan_enable(struct mt7615_phy *phy,
-                                struct ieee80211_vif *vif,
-                                bool enable)
- {
-       struct mt7615_dev *dev = phy->dev;
-       struct {
-               u8 active; /* 0: enabled 1: disabled */
-               u8 rsv[3];
-       } __packed req = {
-               .active = !enable,
-       };
-       if (!mt7615_firmware_offload(dev))
-               return -ENOTSUPP;
-       if (enable)
-               set_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state);
-       else
-               clear_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state);
-       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SCHED_SCAN_ENABLE, &req,
-                                sizeof(req), false);
- }
  static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
  {
        int i;
@@@ -3531,7 -2512,7 +2512,7 @@@ int mt7615_mcu_set_bss_pm(struct mt7615
                u8 bmc_triggered_ac;
                u8 pad;
        } req = {
-               .bss_idx = mvif->idx,
+               .bss_idx = mvif->mt76.idx,
                .aid = cpu_to_le16(vif->bss_conf.aid),
                .dtim_period = vif->bss_conf.dtim_period,
                .bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
                u8 bss_idx;
                u8 pad[3];
        } req_hdr = {
-               .bss_idx = mvif->idx,
+               .bss_idx = mvif->mt76.idx,
        };
        int err;
  
                                 sizeof(req), false);
  }
  
- #ifdef CONFIG_PM
- int mt7615_mcu_set_hif_suspend(struct mt7615_dev *dev, bool suspend)
- {
-       struct {
-               struct {
-                       u8 hif_type; /* 0x0: HIF_SDIO
-                                     * 0x1: HIF_USB
-                                     * 0x2: HIF_PCIE
-                                     */
-                       u8 pad[3];
-               } __packed hdr;
-               struct hif_suspend_tlv {
-                       __le16 tag;
-                       __le16 len;
-                       u8 suspend;
-               } __packed hif_suspend;
-       } req = {
-               .hif_suspend = {
-                       .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
-                       .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
-                       .suspend = suspend,
-               },
-       };
-       if (mt76_is_mmio(&dev->mt76))
-               req.hdr.hif_type = 2;
-       else if (mt76_is_usb(&dev->mt76))
-               req.hdr.hif_type = 1;
-       else if (mt76_is_sdio(&dev->mt76))
-               req.hdr.hif_type = 0;
-       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_HIF_CTRL, &req,
-                                sizeof(req), true);
- }
- EXPORT_SYMBOL_GPL(mt7615_mcu_set_hif_suspend);
- static int
- mt7615_mcu_set_wow_ctrl(struct mt7615_phy *phy, struct ieee80211_vif *vif,
-                       bool suspend, struct cfg80211_wowlan *wowlan)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt7615_dev *dev = phy->dev;
-       struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct mt7615_wow_ctrl_tlv wow_ctrl_tlv;
-               struct mt7615_wow_gpio_param_tlv gpio_tlv;
-       } req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .wow_ctrl_tlv = {
-                       .tag = cpu_to_le16(UNI_SUSPEND_WOW_CTRL),
-                       .len = cpu_to_le16(sizeof(struct mt7615_wow_ctrl_tlv)),
-                       .cmd = suspend ? 1 : 2,
-               },
-               .gpio_tlv = {
-                       .tag = cpu_to_le16(UNI_SUSPEND_WOW_GPIO_PARAM),
-                       .len = cpu_to_le16(sizeof(struct mt7615_wow_gpio_param_tlv)),
-                       .gpio_pin = 0xff, /* follow fw about GPIO pin */
-               },
-       };
-       if (wowlan->magic_pkt)
-               req.wow_ctrl_tlv.trigger |= BIT(0);
-       if (wowlan->disconnect)
-               req.wow_ctrl_tlv.trigger |= BIT(2);
-       if (wowlan->nd_config) {
-               mt7615_mcu_sched_scan_req(phy, vif, wowlan->nd_config);
-               req.wow_ctrl_tlv.trigger |= BIT(5);
-               mt7615_mcu_sched_scan_enable(phy, vif, suspend);
-       }
-       if (mt76_is_mmio(&dev->mt76))
-               req.wow_ctrl_tlv.wakeup_hif = WOW_PCIE;
-       else if (mt76_is_usb(&dev->mt76))
-               req.wow_ctrl_tlv.wakeup_hif = WOW_USB;
-       else if (mt76_is_sdio(&dev->mt76))
-               req.wow_ctrl_tlv.wakeup_hif = WOW_GPIO;
-       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_SUSPEND, &req,
-                                sizeof(req), true);
- }
- static int
- mt7615_mcu_set_wow_pattern(struct mt7615_dev *dev,
-                          struct ieee80211_vif *vif,
-                          u8 index, bool enable,
-                          struct cfg80211_pkt_pattern *pattern)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt7615_wow_pattern_tlv *ptlv;
-       struct sk_buff *skb;
-       struct req_hdr {
-               u8 bss_idx;
-               u8 pad[3];
-       } __packed hdr = {
-               .bss_idx = mvif->idx,
-       };
-       skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
-                                sizeof(hdr) + sizeof(*ptlv));
-       if (!skb)
-               return -ENOMEM;
-       skb_put_data(skb, &hdr, sizeof(hdr));
-       ptlv = (struct mt7615_wow_pattern_tlv *)skb_put(skb, sizeof(*ptlv));
-       ptlv->tag = cpu_to_le16(UNI_SUSPEND_WOW_PATTERN);
-       ptlv->len = cpu_to_le16(sizeof(*ptlv));
-       ptlv->data_len = pattern->pattern_len;
-       ptlv->enable = enable;
-       ptlv->index = index;
-       memcpy(ptlv->pattern, pattern->pattern, pattern->pattern_len);
-       memcpy(ptlv->mask, pattern->mask, pattern->pattern_len / 8);
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_SUSPEND,
-                                    true);
- }
- static int
- mt7615_mcu_set_suspend_mode(struct mt7615_dev *dev,
-                           struct ieee80211_vif *vif,
-                           bool enable, u8 mdtim, bool wow_suspend)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct mt7615_suspend_tlv suspend_tlv;
-       } req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .suspend_tlv = {
-                       .tag = cpu_to_le16(UNI_SUSPEND_MODE_SETTING),
-                       .len = cpu_to_le16(sizeof(struct mt7615_suspend_tlv)),
-                       .enable = enable,
-                       .mdtim = mdtim,
-                       .wow_suspend = wow_suspend,
-               },
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_SUSPEND, &req,
-                                sizeof(req), true);
- }
- static int
- mt7615_mcu_set_gtk_rekey(struct mt7615_dev *dev,
-                        struct ieee80211_vif *vif,
-                        bool suspend)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct mt7615_gtk_rekey_tlv gtk_tlv;
-       } __packed req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .gtk_tlv = {
-                       .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY),
-                       .len = cpu_to_le16(sizeof(struct mt7615_gtk_rekey_tlv)),
-                       .rekey_mode = !suspend,
-               },
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_OFFLOAD, &req,
-                                sizeof(req), true);
- }
- static int
- mt7615_mcu_set_arp_filter(struct mt7615_dev *dev, struct ieee80211_vif *vif,
-                         bool suspend)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct {
-               struct {
-                       u8 bss_idx;
-                       u8 pad[3];
-               } __packed hdr;
-               struct mt7615_arpns_tlv arpns;
-       } req = {
-               .hdr = {
-                       .bss_idx = mvif->idx,
-               },
-               .arpns = {
-                       .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
-                       .len = cpu_to_le16(sizeof(struct mt7615_arpns_tlv)),
-                       .mode = suspend,
-               },
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_OFFLOAD, &req,
-                                sizeof(req), true);
- }
- void mt7615_mcu_set_suspend_iter(void *priv, u8 *mac,
-                                struct ieee80211_vif *vif)
- {
-       struct mt7615_phy *phy = priv;
-       bool suspend = test_bit(MT76_STATE_SUSPEND, &phy->mt76->state);
-       struct ieee80211_hw *hw = phy->mt76->hw;
-       struct cfg80211_wowlan *wowlan = hw->wiphy->wowlan_config;
-       int i;
-       mt7615_mcu_set_gtk_rekey(phy->dev, vif, suspend);
-       mt7615_mcu_set_arp_filter(phy->dev, vif, suspend);
-       mt7615_mcu_set_suspend_mode(phy->dev, vif, suspend, 1, true);
-       for (i = 0; i < wowlan->n_patterns; i++)
-               mt7615_mcu_set_wow_pattern(phy->dev, vif, i, suspend,
-                                          &wowlan->patterns[i]);
-       mt7615_mcu_set_wow_ctrl(phy, vif, suspend, wowlan);
- }
- static void
- mt7615_mcu_key_iter(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                   struct ieee80211_sta *sta, struct ieee80211_key_conf *key,
-                   void *data)
- {
-       struct mt7615_gtk_rekey_tlv *gtk_tlv = data;
-       u32 cipher;
-       if (key->cipher != WLAN_CIPHER_SUITE_AES_CMAC &&
-           key->cipher != WLAN_CIPHER_SUITE_CCMP &&
-           key->cipher != WLAN_CIPHER_SUITE_TKIP)
-               return;
-       if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
-               gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
-               cipher = BIT(3);
-       } else {
-               gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
-               cipher = BIT(4);
-       }
-       /* we are assuming here to have a single pairwise key */
-       if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
-               gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
-               gtk_tlv->group_cipher = cpu_to_le32(cipher);
-               gtk_tlv->keyid = key->keyidx;
-       }
- }
- int mt7615_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
-                               struct ieee80211_vif *vif,
-                               struct cfg80211_gtk_rekey_data *key)
- {
-       struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt7615_dev *dev = mt7615_hw_dev(hw);
-       struct mt7615_gtk_rekey_tlv *gtk_tlv;
-       struct sk_buff *skb;
-       struct {
-               u8 bss_idx;
-               u8 pad[3];
-       } __packed hdr = {
-               .bss_idx = mvif->idx,
-       };
-       skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
-                                sizeof(hdr) + sizeof(*gtk_tlv));
-       if (!skb)
-               return -ENOMEM;
-       skb_put_data(skb, &hdr, sizeof(hdr));
-       gtk_tlv = (struct mt7615_gtk_rekey_tlv *)skb_put(skb,
-                                                        sizeof(*gtk_tlv));
-       gtk_tlv->tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_GTK_REKEY);
-       gtk_tlv->len = cpu_to_le16(sizeof(*gtk_tlv));
-       gtk_tlv->rekey_mode = 2;
-       gtk_tlv->option = 1;
-       rcu_read_lock();
-       ieee80211_iter_keys_rcu(hw, vif, mt7615_mcu_key_iter, gtk_tlv);
-       rcu_read_unlock();
-       memcpy(gtk_tlv->kek, key->kek, NL80211_KEK_LEN);
-       memcpy(gtk_tlv->kck, key->kck, NL80211_KCK_LEN);
-       memcpy(gtk_tlv->replay_ctr, key->replay_ctr, NL80211_REPLAY_CTR_LEN);
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_UNI_CMD_OFFLOAD,
-                                    true);
- }
- #endif /* CONFIG_PM */
  int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
                       struct ieee80211_channel *chan, int duration)
  {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
        struct mt7615_dev *dev = phy->dev;
        struct mt7615_roc_tlv req = {
-               .bss_idx = mvif->idx,
+               .bss_idx = mvif->mt76.idx,
                .active = !chan,
                .max_interval = cpu_to_le32(duration),
                .primary_chan = chan ? chan->hw_value : 0,
@@@ -3884,14 -2571,14 +2571,14 @@@ int mt7615_mcu_update_arp_filter(struc
                        u8 bss_idx;
                        u8 pad[3];
                } __packed hdr;
-               struct mt7615_arpns_tlv arp;
+               struct mt76_connac_arpns_tlv arp;
        } req_hdr = {
                .hdr = {
-                       .bss_idx = mvif->idx,
+                       .bss_idx = mvif->mt76.idx,
                },
                .arp = {
                        .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ARP),
-                       .len = cpu_to_le16(sizeof(struct mt7615_arpns_tlv)),
+                       .len = cpu_to_le16(sizeof(struct mt76_connac_arpns_tlv)),
                        .ips_num = len,
                        .mode = 2,  /* update */
                        .option = 1,
@@@ -3929,7 -2616,7 +2616,7 @@@ int mt7615_mcu_set_p2p_oppps(struct iee
                u8 rsv[3];
        } __packed req = {
                .ct_win = cpu_to_le32(ct_window),
-               .bss_idx = mvif->idx,
+               .bss_idx = mvif->mt76.idx,
        };
  
        if (!mt7615_firmware_offload(dev))
@@@ -66,9 -66,6 +66,6 @@@ struct mt7915_fw_region 
  
  #define MCU_PATCH_ADDRESS             0x200000
  
- #define MT_STA_BFER                   BIT(0)
- #define MT_STA_BFEE                   BIT(1)
  #define FW_FEATURE_SET_ENCRYPT                BIT(0)
  #define FW_FEATURE_SET_KEY_IDX                GENMASK(2, 1)
  #define FW_FEATURE_OVERRIDE_ADDR      BIT(5)
@@@ -232,18 -229,14 +229,14 @@@ mt7915_mcu_parse_response(struct mt76_d
        if (seq != rxd->seq)
                return -EAGAIN;
  
-       switch (cmd) {
-       case -MCU_CMD_PATCH_SEM_CONTROL:
+       if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
                skb_pull(skb, sizeof(*rxd) - 4);
                ret = *skb->data;
-               break;
-       case MCU_EXT_CMD_THERMAL_CTRL:
+       } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
                skb_pull(skb, sizeof(*rxd) + 4);
                ret = le32_to_cpu(*(__le32 *)skb->data);
-               break;
-       default:
+       } else {
                skb_pull(skb, sizeof(struct mt7915_mcu_rxd));
-               break;
        }
  
        return ret;
@@@ -255,10 -248,10 +248,10 @@@ mt7915_mcu_send_message(struct mt76_de
  {
        struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
        struct mt7915_mcu_txd *mcu_txd;
-       u8 seq, pkt_fmt, qidx;
 -      enum mt76_txq_id txq;
 +      enum mt76_mcuq_id qid;
        __le32 *txd;
        u32 val;
+       u8 seq;
  
        /* TODO: make dynamic based on msg type */
        mdev->mcu.timeout = 20 * HZ;
        if (!seq)
                seq = ++dev->mt76.mcu.msg_seq & 0xf;
  
-       if (cmd == -MCU_CMD_FW_SCATTER) {
+       if (cmd == MCU_CMD(FW_SCATTER)) {
 -              txq = MT_MCUQ_FWDL;
 +              qid = MT_MCUQ_FWDL;
                goto exit;
        }
  
        mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
-       if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state)) {
+       if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
 -              txq = MT_MCUQ_WA;
 +              qid = MT_MCUQ_WA;
-               qidx = MT_TX_MCU_PORT_RX_Q0;
-               pkt_fmt = MT_TX_TYPE_CMD;
-       } else {
+       else
 -              txq = MT_MCUQ_WM;
 +              qid = MT_MCUQ_WM;
-               qidx = MT_TX_MCU_PORT_RX_Q0;
-               pkt_fmt = MT_TX_TYPE_CMD;
-       }
  
        txd = mcu_txd->txd;
  
        val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
-             FIELD_PREP(MT_TXD0_PKT_FMT, pkt_fmt) |
-             FIELD_PREP(MT_TXD0_Q_IDX, qidx);
+             FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
+             FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
        txd[0] = cpu_to_le32(val);
  
        val = MT_TXD1_LONG_FORMAT |
        txd[1] = cpu_to_le32(val);
  
        mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
-       mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, qidx));
+       mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
+                                              MT_TX_MCU_PORT_RX_Q0));
        mcu_txd->pkt_type = MCU_PKT_ID;
        mcu_txd->seq = seq;
  
-       if (cmd < 0) {
-               mcu_txd->set_query = MCU_Q_NA;
-               mcu_txd->cid = -cmd;
-       } else {
-               mcu_txd->cid = MCU_CMD_EXT_CID;
-               mcu_txd->ext_cid = cmd;
+       mcu_txd->cid = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
+       mcu_txd->set_query = MCU_Q_NA;
+       mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
+       if (mcu_txd->ext_cid) {
                mcu_txd->ext_cid_ack = 1;
  
                /* do not use Q_SET for efuse */
-               if (cmd == MCU_EXT_CMD_EFUSE_ACCESS)
+               if (cmd & __MCU_CMD_FIELD_QUERY)
                        mcu_txd->set_query = MCU_Q_QUERY;
                else
                        mcu_txd->set_query = MCU_Q_SET;
        }
  
-       if (cmd == MCU_EXT_CMD_MWDS_SUPPORT)
+       if (cmd & __MCU_CMD_FIELD_WA)
                mcu_txd->s2d_index = MCU_S2D_H2C;
        else
                mcu_txd->s2d_index = MCU_S2D_H2N;
-       WARN_ON(cmd == MCU_EXT_CMD_EFUSE_ACCESS &&
-               mcu_txd->set_query != MCU_Q_QUERY);
  
  exit:
        if (wait_seq)
                *wait_seq = seq;
  
 -      return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[txq], skb, 0);
 +      return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
  }
  
+ static void
+ mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
+ {
+       struct {
+               __le32 args[3];
+       } req = {
+               .args = {
+                       cpu_to_le32(a1),
+                       cpu_to_le32(a2),
+                       cpu_to_le32(a3),
+               },
+       };
+       mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
+ }
  static void
  mt7915_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
  {
@@@ -674,6 -674,7 +674,7 @@@ mt7915_mcu_bss_basic_tlv(struct sk_buf
        switch (vif->type) {
        case NL80211_IFTYPE_MESH_POINT:
        case NL80211_IFTYPE_AP:
+       case NL80211_IFTYPE_MONITOR:
                break;
        case NL80211_IFTYPE_STATION:
                /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
        }
  
        bss = (struct bss_info_basic *)tlv;
-       memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
-       bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
        bss->network_type = cpu_to_le32(type);
-       bss->dtim_period = vif->bss_conf.dtim_period;
        bss->bmc_wcid_lo = to_wcid_lo(wlan_idx);
        bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
-       bss->phy_mode = mt7915_get_phy_mode(phy->dev, vif, band, NULL);
        bss->wmm_idx = mvif->wmm_idx;
        bss->active = enable;
  
+       if (vif->type != NL80211_IFTYPE_MONITOR) {
+               memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
+               bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
+               bss->dtim_period = vif->bss_conf.dtim_period;
+               bss->phy_mode = mt7915_get_phy_mode(phy->dev, vif, band, NULL);
+       } else {
+               memcpy(bss->bssid, phy->mt76->macaddr, ETH_ALEN);
+       }
        return 0;
  }
  
@@@ -727,6 -733,7 +733,7 @@@ mt7915_mcu_bss_omac_tlv(struct sk_buff 
        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
  
        switch (vif->type) {
+       case NL80211_IFTYPE_MONITOR:
        case NL80211_IFTYPE_MESH_POINT:
        case NL80211_IFTYPE_AP:
                type = CONNECTION_INFRA_AP;
@@@ -832,9 -839,9 +839,9 @@@ static voi
  mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
                      struct mt7915_phy *phy)
  {
+       int max_nss = hweight8(phy->mt76->chainmask);
        struct bss_info_ra *ra;
        struct tlv *tlv;
-       int max_nss = hweight8(phy->chainmask);
  
        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_RA, sizeof(*ra));
  
@@@ -972,7 -979,7 +979,7 @@@ mt7915_mcu_muar_config(struct mt7915_ph
        if (enable)
                ether_addr_copy(req.addr, addr);
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MUAR_UPDATE, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), &req,
                                 sizeof(req), true);
  }
  
@@@ -996,6 -1003,9 +1003,9 @@@ int mt7915_mcu_add_bss_info(struct mt79
  
        mt7915_mcu_bss_basic_tlv(skb, vif, phy, enable);
  
+       if (vif->type == NL80211_IFTYPE_MONITOR)
+               goto out;
        if (enable) {
                mt7915_mcu_bss_rfch_tlv(skb, vif, phy);
                mt7915_mcu_bss_bmc_tlv(skb, phy);
                    mvif->omac_idx < REPEATER_BSSID_START)
                        mt7915_mcu_bss_ext_tlv(skb, mvif);
        }
+ out:
        return mt76_mcu_skb_send_msg(&phy->dev->mt76, skb,
-                                    MCU_EXT_CMD_BSS_INFO_UPDATE, true);
+                                    MCU_EXT_CMD(BSS_INFO_UPDATE), true);
  }
  
  /** starec & wtbl **/
  static int
- mt7915_mcu_sta_key_tlv(struct sk_buff *skb, struct ieee80211_key_conf *key,
-                      enum set_key_cmd cmd)
+ mt7915_mcu_sta_key_tlv(struct mt7915_sta *msta, struct sk_buff *skb,
+                      struct ieee80211_key_conf *key, enum set_key_cmd cmd)
  {
+       struct mt7915_sta_key_conf *bip = &msta->bip;
        struct sta_rec_sec *sec;
        struct tlv *tlv;
        u32 len = sizeof(*sec);
  
                sec_key = &sec->key[0];
                sec_key->cipher_len = sizeof(*sec_key);
-               sec_key->key_id = key->keyidx;
  
                if (cipher == MT_CIPHER_BIP_CMAC_128) {
                        sec_key->cipher_id = MT_CIPHER_AES_CCMP;
+                       sec_key->key_id = bip->keyidx;
                        sec_key->key_len = 16;
-                       memcpy(sec_key->key, key->key, 16);
+                       memcpy(sec_key->key, bip->key, 16);
  
                        sec_key = &sec->key[1];
                        sec_key->cipher_id = MT_CIPHER_BIP_CMAC_128;
                        sec_key->cipher_len = sizeof(*sec_key);
                        sec_key->key_len = 16;
-                       memcpy(sec_key->key, key->key + 16, 16);
+                       memcpy(sec_key->key, key->key, 16);
  
                        sec->n_cipher = 2;
                } else {
                        sec_key->cipher_id = cipher;
+                       sec_key->key_id = key->keyidx;
                        sec_key->key_len = key->keylen;
                        memcpy(sec_key->key, key->key, key->keylen);
  
                                memcpy(sec_key->key + 24, key->key + 16, 8);
                        }
  
+                       /* store key_conf for BIP batch update */
+                       if (cipher == MT_CIPHER_AES_CCMP) {
+                               memcpy(bip->key, key->key, key->keylen);
+                               bip->keyidx = key->keyidx;
+                       }
                        len -= sizeof(*sec_key);
                        sec->n_cipher = 1;
                }
@@@ -1088,12 -1106,12 +1106,12 @@@ int mt7915_mcu_add_key(struct mt7915_de
        if (IS_ERR(skb))
                return PTR_ERR(skb);
  
-       ret = mt7915_mcu_sta_key_tlv(skb, key, cmd);
+       ret = mt7915_mcu_sta_key_tlv(msta, skb, key, cmd);
        if (ret)
                return ret;
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  static void
@@@ -1107,7 -1125,7 +1125,7 @@@ mt7915_mcu_sta_ba_tlv(struct sk_buff *s
        tlv = mt7915_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
  
        ba = (struct sta_rec_ba *)tlv;
-       ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT,
+       ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
        ba->winsize = cpu_to_le16(params->buf_size);
        ba->ssn = cpu_to_le16(params->ssn);
        ba->ba_en = enable << params->tid;
@@@ -1173,7 -1191,7 +1191,7 @@@ mt7915_mcu_sta_ba(struct mt7915_dev *de
        mt7915_mcu_wtbl_ba_tlv(skb, params, enable, tx, sta_wtbl, wtbl_hdr);
  
        ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                   MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                   MCU_EXT_CMD(STA_REC_UPDATE), true);
        if (ret)
                return ret;
  
        mt7915_mcu_sta_ba_tlv(skb, params, enable, tx);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
@@@ -1521,7 -1539,7 +1539,7 @@@ mt7915_mcu_add_mu(struct mt7915_dev *de
        mt7915_mcu_sta_muru_tlv(skb, sta);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  static void
@@@ -1688,7 -1706,7 +1706,7 @@@ int mt7915_mcu_sta_update_hdr_trans(str
        wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
        mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, NULL, wtbl_hdr);
  
-       return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD_WTBL_UPDATE,
+       return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD(WTBL_UPDATE),
                                     true);
  }
  
@@@ -1713,12 -1731,13 +1731,13 @@@ int mt7915_mcu_add_smps(struct mt7915_d
        mt7915_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_hdr);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  static void
  mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf)
  {
+       bf->bf_cap = MT_EBF;
        bf->sounding_phy = MT_PHY_TYPE_OFDM;
        bf->ndp_rate = 0;                               /* mcs0 */
        bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT;      /* ofdm 24m */
  }
  
  static void
- mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct sta_rec_bf *bf)
+ mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
+                      struct sta_rec_bf *bf)
  {
        struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
        u8 n = 0;
  
        bf->tx_mode = MT_PHY_TYPE_HT;
-       bf->bf_cap |= MT_IBF;
+       bf->bf_cap = MT_IBF;
  
        if (mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF &&
            (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED))
        else if (mcs->rx_mask[1])
                n = 1;
  
+       bf->nr = hweight8(phy->mt76->chainmask) - 1;
        bf->nc = min_t(u8, bf->nr, n);
-       bf->ibf_ncol = bf->nc;
-       if (sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->nc)
-               bf->ibf_timeout = 0x48;
+       bf->ibf_ncol = n;
  }
  
  static void
  mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
-                       struct sta_rec_bf *bf)
+                       struct sta_rec_bf *bf, bool explicit)
  {
        struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
        struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
-       u8 bfee_nr, bfer_nr, n, tx_ant = hweight8(phy->chainmask) - 1;
-       u16 mcs_map;
+       u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
+       u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
+       u8 tx_ant = hweight8(phy->mt76->chainmask) - 1;
  
        bf->tx_mode = MT_PHY_TYPE_VHT;
-       bf->bf_cap |= MT_EBF;
-       mt7915_mcu_sta_sounding_rate(bf);
  
-       bfee_nr = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
-                           pc->cap);
-       bfer_nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
-                           vc->cap);
-       mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
+       if (explicit) {
+               u8 bfee_nr, bfer_nr;
  
-       n = min_t(u8, bfer_nr, bfee_nr);
-       bf->nr = min_t(u8, n, tx_ant);
-       n = mt7915_mcu_get_sta_nss(mcs_map);
+               mt7915_mcu_sta_sounding_rate(bf);
+               bfee_nr = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
+                                   pc->cap);
+               bfer_nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
+                                   vc->cap);
+               bf->nr = min_t(u8, min_t(u8, bfer_nr, bfee_nr), tx_ant);
+               bf->nc = min_t(u8, nss_mcs, bf->nr);
+               bf->ibf_ncol = bf->nc;
  
-       bf->nc = min_t(u8, n, bf->nr);
-       bf->ibf_ncol = bf->nc;
+               if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+                       bf->nr = 1;
+       } else {
+               bf->bf_cap = MT_IBF;
+               bf->nr = tx_ant;
+               bf->nc = min_t(u8, nss_mcs, bf->nr);
+               bf->ibf_ncol = nss_mcs;
  
-       /* force nr from 4 to 2 */
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
-               bf->nr = 1;
+               if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+                       bf->ibf_nrow = 1;
+       }
  }
  
  static void
@@@ -1790,19 -1813,14 +1813,14 @@@ mt7915_mcu_sta_bfer_he(struct ieee80211
  {
        struct ieee80211_sta_he_cap *pc = &sta->he_cap;
        struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
-       const struct ieee80211_he_cap_elem *ve;
-       const struct ieee80211_sta_he_cap *vc;
-       u8 bfee_nr, bfer_nr, nss_mcs;
-       u16 mcs_map;
-       vc = mt7915_get_he_phy_cap(phy, vif);
-       ve = &vc->he_cap_elem;
+       const struct ieee80211_sta_he_cap *vc = mt7915_get_he_phy_cap(phy, vif);
+       const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem;
+       u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80);
+       u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
+       u8 bfee_nr, bfer_nr;
  
        bf->tx_mode = MT_PHY_TYPE_HE_SU;
-       bf->bf_cap |= MT_EBF;
        mt7915_mcu_sta_sounding_rate(bf);
        bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMER_FB,
                                pe->phy_cap_info[6]);
        bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMER_FB,
                         ve->phy_cap_info[5]);
        bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK,
                         pe->phy_cap_info[4]);
-       mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.tx_mcs_80);
-       nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
        bf->nr = min_t(u8, bfer_nr, bfee_nr);
        bf->nc = min_t(u8, nss_mcs, bf->nr);
        bf->ibf_ncol = bf->nc;
  static void
  mt7915_mcu_sta_bfer_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
                        struct ieee80211_vif *vif, struct mt7915_phy *phy,
-                       bool enable)
+                       bool enable, bool explicit)
  {
+       int tx_ant = hweight8(phy->mt76->chainmask) - 1;
        struct sta_rec_bf *bf;
        struct tlv *tlv;
-       int tx_ant = hweight8(phy->chainmask) - 1;
        const u8 matrix[4][4] = {
                {0, 0, 0, 0},
                {1, 1, 0, 0},   /* 2x1, 2x2, 2x3, 2x4 */
                return;
        }
  
+       /* he: eBF only, in accordance with spec
+        * vht: support eBF and iBF
+        * ht: iBF only, since mac80211 lacks of eBF support
+        */
+       if (sta->he_cap.has_he && explicit)
+               mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
+       else if (sta->vht_cap.vht_supported)
+               mt7915_mcu_sta_bfer_vht(sta, phy, bf, explicit);
+       else if (sta->ht_cap.ht_supported)
+               mt7915_mcu_sta_bfer_ht(sta, phy, bf);
+       else
+               return;
        bf->bw = sta->bandwidth;
        bf->ibf_dbw = sta->bandwidth;
        bf->ibf_nrow = tx_ant;
-       bf->ibf_timeout = 0x18;
  
-       if (sta->he_cap.has_he)
-               mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
-       else if (sta->vht_cap.vht_supported)
-               mt7915_mcu_sta_bfer_vht(sta, phy, bf);
-       else if (sta->ht_cap.ht_supported)
-               mt7915_mcu_sta_bfer_ht(sta, bf);
+       if (!explicit && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->nc)
+               bf->ibf_timeout = 0x48;
+       else
+               bf->ibf_timeout = 0x18;
  
-       if (bf->bf_cap & MT_EBF && bf->nr != tx_ant)
+       if (explicit && bf->nr != tx_ant)
                bf->mem_20m = matrix[tx_ant][bf->nc];
        else
                bf->mem_20m = matrix[bf->nr][bf->nc];
@@@ -1910,9 -1934,9 +1934,9 @@@ static voi
  mt7915_mcu_sta_bfee_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
                        struct mt7915_phy *phy)
  {
+       int tx_ant = hweight8(phy->mt76->chainmask) - 1;
        struct sta_rec_bfee *bfee;
        struct tlv *tlv;
-       int tx_ant = hweight8(phy->chainmask) - 1;
        u8 nr = 0;
  
        tlv = mt7915_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
        }
  
        /* reply with identity matrix to avoid 2x2 BF negative gain */
-       if (nr == 1 && tx_ant == 2)
-               bfee->fb_identity_matrix = true;
+       bfee->fb_identity_matrix = !!(nr == 1 && tx_ant == 2);
  }
  
- static u8
- mt7915_mcu_sta_txbf_type(struct mt7915_phy *phy, struct ieee80211_vif *vif,
-                        struct ieee80211_sta *sta)
+ static int
+ mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif,
+                   struct ieee80211_sta *sta, bool enable)
  {
-       u8 type = 0;
+       struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
+       struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
+       struct mt7915_phy *phy;
+       struct sk_buff *skb;
+       int r, len;
+       bool ebfee = 0, ebf = 0;
  
        if (vif->type != NL80211_IFTYPE_STATION &&
            vif->type != NL80211_IFTYPE_AP)
                return 0;
  
+       phy = mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy;
        if (sta->he_cap.has_he) {
                struct ieee80211_he_cap_elem *pe;
                const struct ieee80211_he_cap_elem *ve;
                vc = mt7915_get_he_phy_cap(phy, vif);
                ve = &vc->he_cap_elem;
  
-               if ((HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) ||
-                    HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4])) &&
-                   HE_PHY(CAP4_SU_BEAMFORMEE, ve->phy_cap_info[4]))
-                       type |= MT_STA_BFEE;
-               if ((HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) ||
-                    HE_PHY(CAP4_MU_BEAMFORMER, ve->phy_cap_info[4])) &&
-                   HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]))
-                       type |= MT_STA_BFER;
+               ebfee = !!((HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) ||
+                           HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4])) &&
+                          HE_PHY(CAP4_SU_BEAMFORMEE, ve->phy_cap_info[4]));
+               ebf = !!((HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) ||
+                         HE_PHY(CAP4_MU_BEAMFORMER, ve->phy_cap_info[4])) &&
+                        HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]));
        } else if (sta->vht_cap.vht_supported) {
                struct ieee80211_sta_vht_cap *pc;
                struct ieee80211_sta_vht_cap *vc;
                ce = IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
                     IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
  
-               if ((pc->cap & cr) && (vc->cap & ce))
-                       type |= MT_STA_BFEE;
-               if ((vc->cap & cr) && (pc->cap & ce))
-                       type |= MT_STA_BFER;
-       } else if (sta->ht_cap.ht_supported) {
-               /* TODO: iBF */
+               ebfee = !!((pc->cap & cr) && (vc->cap & ce));
+               ebf = !!((vc->cap & cr) && (pc->cap & ce));
        }
  
-       return type;
- }
- static int
- mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-                   struct ieee80211_sta *sta, bool enable)
- {
-       struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-       struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-       struct mt7915_phy *phy;
-       struct sk_buff *skb;
-       int r, len;
-       u8 type;
-       phy = mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy;
-       type = mt7915_mcu_sta_txbf_type(phy, vif, sta);
        /* must keep each tag independent */
  
        /* starec bf */
-       if (type & MT_STA_BFER) {
+       if (ebf || dev->ibf) {
                len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bf);
  
                skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
                if (IS_ERR(skb))
                        return PTR_ERR(skb);
  
-               mt7915_mcu_sta_bfer_tlv(skb, sta, vif, phy, enable);
+               mt7915_mcu_sta_bfer_tlv(skb, sta, vif, phy, enable, ebf);
  
                r = mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                         MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                         MCU_EXT_CMD(STA_REC_UPDATE), true);
                if (r)
                        return r;
        }
  
        /* starec bfee */
-       if (type & MT_STA_BFEE) {
+       if (ebfee) {
                len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bfee);
  
                skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
                mt7915_mcu_sta_bfee_tlv(skb, sta, phy);
  
                r = mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                         MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                         MCU_EXT_CMD(STA_REC_UPDATE), true);
                if (r)
                        return r;
        }
@@@ -2199,33 -2203,7 +2203,7 @@@ int mt7915_mcu_add_rate_ctrl(struct mt7
        mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
- }
- static int
- mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-                    struct ieee80211_sta *sta)
- {
- #define MT_STA_BSS_GROUP              1
-       struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-       struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-       struct {
-               __le32 action;
-               u8 wlan_idx_lo;
-               u8 status;
-               u8 wlan_idx_hi;
-               u8 rsv0[5];
-               __le32 val;
-               u8 rsv1[8];
-       } __packed req = {
-               .action = cpu_to_le32(MT_STA_BSS_GROUP),
-               .wlan_idx_lo = to_wcid_lo(msta->wcid.idx),
-               .wlan_idx_hi = to_wcid_hi(msta->wcid.idx),
-               .val = cpu_to_le32(mvif->idx % 16),
-       };
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_DRR_CTRL, &req,
-                                sizeof(req), true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif,
                return 0;
  
        /* must keep the order */
-       ret = mt7915_mcu_add_group(dev, vif, sta);
-       if (ret)
-               return ret;
        ret = mt7915_mcu_add_txbf(dev, vif, sta, enable);
        if (ret)
                return ret;
@@@ -2287,7 -2261,7 +2261,7 @@@ int mt7915_mcu_add_sta(struct mt7915_de
        }
  
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  int mt7915_mcu_set_fixed_rate(struct mt7915_dev *dev,
  
  out:
        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
-                                    MCU_EXT_CMD_STA_REC_UPDATE, true);
+                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
  
  int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
                return mt7915_mcu_muar_config(phy, vif, false, enable);
  
        memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DEV_INFO_UPDATE,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
                                 &data, sizeof(data), true);
  }
  
@@@ -2468,7 -2442,7 +2442,7 @@@ int mt7915_mcu_add_beacon(struct ieee80
        dev_kfree_skb(skb);
  
        return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
-                                    MCU_EXT_CMD_BSS_INFO_UPDATE, true);
+                                    MCU_EXT_CMD(BSS_INFO_UPDATE), true);
  }
  
  static int mt7915_mcu_start_firmware(struct mt7915_dev *dev, u32 addr,
                .addr = cpu_to_le32(addr),
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_FW_START_REQ, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(FW_START_REQ), &req,
                                 sizeof(req), true);
  }
  
@@@ -2495,7 -2469,7 +2469,7 @@@ static int mt7915_mcu_restart(struct mt
                .power_mode = 1,
        };
  
-       return mt76_mcu_send_msg(dev, -MCU_CMD_NIC_POWER_CTRL, &req,
+       return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req,
                                 sizeof(req), false);
  }
  
@@@ -2507,7 -2481,7 +2481,7 @@@ static int mt7915_mcu_patch_sem_ctrl(st
                .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE),
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_PATCH_SEM_CONTROL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(PATCH_SEM_CONTROL), &req,
                                 sizeof(req), true);
  }
  
@@@ -2520,7 -2494,7 +2494,7 @@@ static int mt7915_mcu_start_patch(struc
                .check_crc = 0,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_PATCH_FINISH_REQ, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(PATCH_FINISH_REQ), &req,
                                 sizeof(req), true);
  }
  
@@@ -2553,9 -2527,9 +2527,9 @@@ static int mt7915_mcu_init_download(str
        int attr;
  
        if (req.addr == cpu_to_le32(MCU_PATCH_ADDRESS))
-               attr = -MCU_CMD_PATCH_START_REQ;
+               attr = MCU_CMD(PATCH_START_REQ);
        else
-               attr = -MCU_CMD_TARGET_ADDRESS_LEN_REQ;
+               attr = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
  
        return mt76_mcu_send_msg(&dev->mt76, attr, &req, sizeof(req), true);
  }
@@@ -2616,7 -2590,7 +2590,7 @@@ static int mt7915_load_patch(struct mt7
                        goto out;
                }
  
-               ret = mt76_mcu_send_firmware(&dev->mt76, -MCU_CMD_FW_SCATTER,
+               ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
                                             dl, len);
                if (ret) {
                        dev_err(dev->mt76.dev, "Failed to send patch\n");
@@@ -2685,7 -2659,7 +2659,7 @@@ mt7915_mcu_send_ram_firmware(struct mt7
                        return err;
                }
  
-               err = mt76_mcu_send_firmware(&dev->mt76, -MCU_CMD_FW_SCATTER,
+               err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
                                             data + offset, len);
                if (err) {
                        dev_err(dev->mt76.dev, "Failed to send firmware.\n");
@@@ -2815,7 -2789,7 +2789,7 @@@ int mt7915_mcu_fw_log_2_host(struct mt7
                .ctrl_val = ctrl
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_LOG_2_HOST, &data,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,
                                 sizeof(data), true);
  }
  
@@@ -2833,7 -2807,7 +2807,7 @@@ int mt7915_mcu_fw_dbg_ctrl(struct mt791
                .level = level,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_FW_DBG_CTRL, &data,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_DBG_CTRL), &data,
                                 sizeof(data), false);
  }
  
@@@ -2846,7 -2820,7 +2820,7 @@@ static int mt7915_mcu_set_mwds(struct m
                .enable = enabled
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MWDS_SUPPORT, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(MWDS_SUPPORT), &req,
                                 sizeof(req), false);
  }
  
@@@ -2873,6 -2847,7 +2847,7 @@@ int mt7915_mcu_init(struct mt7915_dev *
        set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
        mt7915_mcu_fw_log_2_host(dev, 0);
        mt7915_mcu_set_mwds(dev, 1);
+       mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), MCU_WA_PARAM_RED, 0, 0);
  
        return 0;
  }
@@@ -2919,12 -2894,12 +2894,12 @@@ int mt7915_mcu_set_mac(struct mt7915_de
        };
        int ret;
  
-       ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RX_HDR_TRANS,
+       ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
                                &req_trans, sizeof(req_trans), false);
        if (ret)
                return ret;
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_MAC_INIT_CTRL,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MAC_INIT_CTRL),
                                 &req_mac, sizeof(req_mac), true);
  }
  
@@@ -2940,7 -2915,7 +2915,7 @@@ int mt7915_mcu_set_scs(struct mt7915_de
                .enable = enable + 1,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SCS_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SCS_CTRL), &req,
                                 sizeof(req), false);
  }
  
@@@ -2960,34 -2935,25 +2935,25 @@@ int mt7915_mcu_set_rts_thresh(struct mt
                .pkt_thresh = cpu_to_le32(0x2),
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PROTECT_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PROTECT_CTRL), &req,
                                 sizeof(req), true);
  }
  
+ int mt7915_mcu_update_edca(struct mt7915_dev *dev, void *param)
+ {
+       struct mt7915_mcu_tx *req = (struct mt7915_mcu_tx *)param;
+       u8 num = req->total;
+       size_t len = sizeof(*req) -
+                    (IEEE80211_NUM_ACS - num) * sizeof(struct edca);
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), req,
+                                len, true);
+ }
  int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
  {
- #define WMM_AIFS_SET          BIT(0)
- #define WMM_CW_MIN_SET                BIT(1)
- #define WMM_CW_MAX_SET                BIT(2)
- #define WMM_TXOP_SET          BIT(3)
- #define WMM_PARAM_SET         GENMASK(3, 0)
  #define TX_CMD_MODE           1
-       struct edca {
-               u8 queue;
-               u8 set;
-               u8 aifs;
-               u8 cw_min;
-               __le16 cw_max;
-               __le16 txop;
-       };
-       struct mt7915_mcu_tx {
-               u8 total;
-               u8 action;
-               u8 valid;
-               u8 mode;
-               struct edca edca[IEEE80211_NUM_ACS];
-       } __packed req = {
+       struct mt7915_mcu_tx req = {
                .valid = true,
                .mode = TX_CMD_MODE,
                .total = IEEE80211_NUM_ACS,
                else
                        e->cw_max = cpu_to_le16(10);
        }
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EDCA_UPDATE, &req,
-                                sizeof(req), true);
+       return mt7915_mcu_update_edca(dev, &req);
  }
  
  int mt7915_mcu_set_pm(struct mt7915_dev *dev, int band, int enter)
                .band_idx = band,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_PM_STATE_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PM_STATE_CTRL), &req,
                                 sizeof(req), true);
  }
  
@@@ -3066,7 -3032,7 +3032,7 @@@ int mt7915_mcu_rdd_cmd(struct mt7915_de
                .val = val,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_CTRL), &req,
                                 sizeof(req), true);
  }
  
@@@ -3081,7 -3047,7 +3047,7 @@@ int mt7915_mcu_set_fcc5_lpn(struct mt79
                .min_lpn = cpu_to_le16(val),
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
                                 sizeof(req), true);
  }
  
@@@ -3112,7 -3078,7 +3078,7 @@@ int mt7915_mcu_set_pulse_th(struct mt79
  #undef __req_field
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
                                 sizeof(req), true);
  }
  
@@@ -3129,8 -3095,8 +3095,8 @@@ int mt7915_mcu_set_radar_th(struct mt79
                u8 max_crpn;
                u8 min_crpr;
                u8 min_pw;
-               u32 min_pri;
-               u32 max_pri;
+               __le32 min_pri;
+               __le32 max_pri;
                u8 max_pw;
                u8 min_crbn;
                u8 max_crbn;
                u8 max_stgpn;
                u8 min_stgpr;
                u8 rsv[2];
-               u32 min_stgpr_diff;
+               __le32 min_stgpr_diff;
        } __packed req = {
                .tag = cpu_to_le32(0x2),
                .radar_type = cpu_to_le16(index),
  #undef __req_field_u32
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_RDD_TH, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
                                 sizeof(req), true);
  }
  
@@@ -3173,6 -3139,7 +3139,7 @@@ int mt7915_mcu_set_chan_info(struct mt7
        struct mt7915_dev *dev = phy->dev;
        struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
        int freq1 = chandef->center_freq1;
+       bool ext_phy = phy != &dev->phy;
        struct {
                u8 control_ch;
                u8 center_ch;
                .bw = mt7915_mcu_chan_bw(chandef),
                .tx_streams_num = hweight8(phy->mt76->antenna_mask),
                .rx_streams = phy->mt76->antenna_mask,
-               .band_idx = phy != &dev->phy,
+               .band_idx = ext_phy,
                .channel_band = chandef->chan->band,
        };
  
  #ifdef CONFIG_NL80211_TESTMODE
-       if (dev->mt76.test.tx_antenna_mask &&
-           (dev->mt76.test.state == MT76_TM_STATE_TX_FRAMES ||
-            dev->mt76.test.state == MT76_TM_STATE_RX_FRAMES)) {
-               req.tx_streams_num = fls(dev->mt76.test.tx_antenna_mask);
-               req.rx_streams = dev->mt76.test.tx_antenna_mask;
+       if (phy->mt76->test.tx_antenna_mask &&
+           (phy->mt76->test.state == MT76_TM_STATE_TX_FRAMES ||
+            phy->mt76->test.state == MT76_TM_STATE_RX_FRAMES ||
+            phy->mt76->test.state == MT76_TM_STATE_TX_CONT)) {
+               req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask);
+               req.rx_streams = phy->mt76->test.tx_antenna_mask;
+               if (ext_phy) {
+                       req.tx_streams_num = 2;
+                       req.rx_streams >>= 2;
+               }
        }
  #endif
  
        else
                req.switch_reason = CH_SWITCH_NORMAL;
  
-       if (cmd == MCU_EXT_CMD_CHANNEL_SWITCH)
+       if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
                req.rx_streams = hweight8(req.rx_streams);
  
        if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
        return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
  }
  
+ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
+ {
+ #define TOTAL_PAGE_MASK               GENMASK(7, 5)
+ #define PAGE_IDX_MASK         GENMASK(4, 2)
+ #define PER_PAGE_SIZE         0x400
+       struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
+       u8 total = MT7915_EEPROM_SIZE / PER_PAGE_SIZE;
+       u8 *eep = (u8 *)dev->mt76.eeprom.data;
+       int eep_len;
+       int i;
+       for (i = 0; i <= total; i++, eep += eep_len) {
+               struct sk_buff *skb;
+               int ret;
+               if (i == total)
+                       eep_len = MT7915_EEPROM_SIZE % PER_PAGE_SIZE;
+               else
+                       eep_len = PER_PAGE_SIZE;
+               skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
+                                        sizeof(req) + eep_len);
+               if (!skb)
+                       return -ENOMEM;
+               req.format = FIELD_PREP(TOTAL_PAGE_MASK, total) |
+                            FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE;
+               req.len = cpu_to_le16(eep_len);
+               skb_put_data(skb, &req, sizeof(req));
+               skb_put_data(skb, eep, eep_len);
+               ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
+                                           MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
+               if (ret)
+                       return ret;
+       }
+       return 0;
+ }
  int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
  {
-       struct req_hdr {
-               u8 buffer_mode;
-               u8 format;
-               __le16 len;
-       } __packed req = {
+       struct mt7915_mcu_eeprom req = {
                .buffer_mode = EE_MODE_EFUSE,
                .format = EE_FORMAT_WHOLE,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EFUSE_BUFFER_MODE,
+       if (dev->flash_mode)
+               return mt7915_mcu_set_eeprom_flash(dev);
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
                                 &req, sizeof(req), true);
  }
  
@@@ -3254,7 -3267,7 +3267,7 @@@ int mt7915_mcu_get_eeprom(struct mt7915
        int ret;
        u8 *buf;
  
-       ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD_EFUSE_ACCESS, &req,
+       ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS), &req,
                                sizeof(req), true, &skb);
        if (ret)
                return ret;
@@@ -3279,7 -3292,7 +3292,7 @@@ int mt7915_mcu_get_temperature(struct m
                .action = index,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_THERMAL_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
                                 sizeof(req), true);
  }
  
@@@ -3297,7 -3310,7 +3310,7 @@@ int mt7915_mcu_get_tx_rate(struct mt791
                .dump_group = cpu_to_le16(1),
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_RATE_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RATE_CTRL), &req,
                                 sizeof(req), false);
  }
  
@@@ -3326,7 -3339,7 +3339,7 @@@ int mt7915_mcu_set_sku(struct mt7915_ph
                req.val[i] = hw->conf.power_level * 2 + delta[i];
  
        return mt76_mcu_send_msg(&dev->mt76,
-                                MCU_EXT_CMD_TX_POWER_FEATURE_CTRL, &req,
+                                MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
                                 sizeof(req), true);
  }
  
@@@ -3348,7 -3361,7 +3361,7 @@@ int mt7915_mcu_set_test_param(struct mt
                .enable = en,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_ATE_CTRL, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), &req,
                                 sizeof(req), false);
  }
  
@@@ -3367,7 -3380,7 +3380,7 @@@ int mt7915_mcu_set_sku_en(struct mt7915
        };
  
        return mt76_mcu_send_msg(&dev->mt76,
-                                MCU_EXT_CMD_TX_POWER_FEATURE_CTRL, &req,
+                                MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
                                 sizeof(req), true);
  }
  
@@@ -3384,10 -3397,29 +3397,29 @@@ int mt7915_mcu_set_ser(struct mt7915_de
                .band = band,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_SER_TRIGGER,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SER_TRIGGER),
                                 &req, sizeof(req), false);
  }
  
+ int mt7915_mcu_set_txbf_module(struct mt7915_dev *dev)
+ {
+ #define MT_BF_MODULE_UPDATE               25
+       struct {
+               u8 action;
+               u8 bf_num;
+               u8 bf_bitmap;
+               u8 bf_sel[8];
+               u8 rsv[8];
+       } __packed req = {
+               .action = MT_BF_MODULE_UPDATE,
+               .bf_num = 2,
+               .bf_bitmap = GENMASK(1, 0),
+       };
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
+                                sizeof(req), true);
+ }
  int mt7915_mcu_set_txbf_type(struct mt7915_dev *dev)
  {
  #define MT_BF_TYPE_UPDATE             20
        } __packed req = {
                .action = MT_BF_TYPE_UPDATE,
                .ebf = true,
-               .ibf = false,
+               .ibf = dev->ibf,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TXBF_ACTION, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
                                 sizeof(req), true);
  }
  
@@@ -3421,7 -3453,7 +3453,7 @@@ int mt7915_mcu_set_txbf_sounding(struc
                .snd_mode = MT_BF_PROCESSING,
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_TXBF_ACTION, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
                                 sizeof(req), true);
  }
  
@@@ -3446,7 -3478,7 +3478,7 @@@ int mt7915_mcu_add_obss_spr(struct mt79
                .val = cpu_to_le32(enable),
        };
  
-       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_SPR, &req,
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
                                 sizeof(req), true);
  }
  
@@@ -3473,7 -3505,7 +3505,7 @@@ int mt7915_mcu_get_rx_rate(struct mt791
        int ret;
        int i;
  
-       ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD_PHY_STAT_INFO,
+       ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(PHY_STAT_INFO),
                                        &req, sizeof(req), true, &skb);
        if (ret)
                return ret;