+++ /dev/null
-From 5536ffc5cd4009a333107d0930b7d281ecfe637f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 7 Jun 2022 11:28:40 +0200
-Subject: mt76: connac: move connac2_mac_write_txwi in mt76_connac module
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit 182071cdd594bc79f42899c85afa995c370ef82d ]
-
-mac_write_txwi code is shared between connac2 devices (mt7915 and
-mt7921). Move it in connac module.
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../net/wireless/mediatek/mt76/mt76_connac.h | 6 +
- .../wireless/mediatek/mt76/mt76_connac_mac.c | 284 ++++++++++++++++++
- .../net/wireless/mediatek/mt76/mt7915/mac.c | 251 +---------------
- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 2 +-
- .../wireless/mediatek/mt76/mt7915/mt7915.h | 1 -
- .../net/wireless/mediatek/mt76/mt7921/mac.c | 212 +------------
- .../net/wireless/mediatek/mt76/mt7921/main.c | 2 +-
- .../net/wireless/mediatek/mt76/mt7921/mcu.c | 4 +-
- .../wireless/mediatek/mt76/mt7921/mt7921.h | 5 -
- .../wireless/mediatek/mt76/mt7921/pci_mac.c | 4 +-
- 10 files changed, 299 insertions(+), 472 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
-index 400ba514460e..a9d7a269fcf3 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
-@@ -12,6 +12,8 @@
- #define MT76_CONNAC_MAX_SCHED_SCAN_SSID 10
- #define MT76_CONNAC_MAX_SCAN_MATCH 16
-
-+#define MT76_CONNAC_MAX_WMM_SETS 4
-+
- #define MT76_CONNAC_COREDUMP_TIMEOUT (HZ / 20)
- #define MT76_CONNAC_COREDUMP_SZ (1300 * 1024)
-
-@@ -244,5 +246,9 @@ void mt76_connac_pm_queue_skb(struct ieee80211_hw *hw,
- struct sk_buff *skb);
- void mt76_connac_pm_dequeue_skbs(struct mt76_phy *phy,
- struct mt76_connac_pm *pm);
-+void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
-+ struct sk_buff *skb, struct mt76_wcid *wcid,
-+ struct ieee80211_key_conf *key, int pid,
-+ u32 changed);
-
- #endif /* __MT76_CONNAC_H */
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
-index 306e9eaea917..0ea795565c88 100644
---- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
-@@ -2,6 +2,7 @@
- /* Copyright (C) 2020 MediaTek Inc. */
-
- #include "mt76_connac.h"
-+#include "mt76_connac2_mac.h"
-
- int mt76_connac_pm_wake(struct mt76_phy *phy, struct mt76_connac_pm *pm)
- {
-@@ -115,3 +116,286 @@ void mt76_connac_pm_dequeue_skbs(struct mt76_phy *phy,
- mt76_worker_schedule(&phy->dev->tx_worker);
- }
- EXPORT_SYMBOL_GPL(mt76_connac_pm_dequeue_skbs);
-+
-+static u16
-+mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy, struct ieee80211_vif *vif,
-+ bool beacon, bool mcast)
-+{
-+ u8 mode = 0, band = mphy->chandef.chan->band;
-+ int rateidx = 0, mcast_rate;
-+
-+ if (!vif)
-+ goto legacy;
-+
-+ if (is_mt7921(mphy->dev)) {
-+ rateidx = ffs(vif->bss_conf.basic_rates) - 1;
-+ goto legacy;
-+ }
-+
-+ if (beacon) {
-+ struct cfg80211_bitrate_mask *mask;
-+
-+ mask = &vif->bss_conf.beacon_tx_rate;
-+ if (hweight16(mask->control[band].he_mcs[0]) == 1) {
-+ rateidx = ffs(mask->control[band].he_mcs[0]) - 1;
-+ mode = MT_PHY_TYPE_HE_SU;
-+ goto out;
-+ } else if (hweight16(mask->control[band].vht_mcs[0]) == 1) {
-+ rateidx = ffs(mask->control[band].vht_mcs[0]) - 1;
-+ mode = MT_PHY_TYPE_VHT;
-+ goto out;
-+ } else if (hweight8(mask->control[band].ht_mcs[0]) == 1) {
-+ rateidx = ffs(mask->control[band].ht_mcs[0]) - 1;
-+ mode = MT_PHY_TYPE_HT;
-+ goto out;
-+ } else if (hweight32(mask->control[band].legacy) == 1) {
-+ rateidx = ffs(mask->control[band].legacy) - 1;
-+ goto legacy;
-+ }
-+ }
-+
-+ mcast_rate = vif->bss_conf.mcast_rate[band];
-+ if (mcast && mcast_rate > 0)
-+ rateidx = mcast_rate - 1;
-+ else
-+ rateidx = ffs(vif->bss_conf.basic_rates) - 1;
-+
-+legacy:
-+ rateidx = mt76_calculate_default_rate(mphy, rateidx);
-+ mode = rateidx >> 8;
-+ rateidx &= GENMASK(7, 0);
-+
-+out:
-+ return FIELD_PREP(MT_TX_RATE_IDX, rateidx) |
-+ FIELD_PREP(MT_TX_RATE_MODE, mode);
-+}
-+
-+static void
-+mt76_connac2_mac_write_txwi_8023(__le32 *txwi, struct sk_buff *skb,
-+ struct mt76_wcid *wcid)
-+{
-+ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-+ u8 fc_type, fc_stype;
-+ u16 ethertype;
-+ bool wmm = false;
-+ u32 val;
-+
-+ if (wcid->sta) {
-+ struct ieee80211_sta *sta;
-+
-+ sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
-+ wmm = sta->wme;
-+ }
-+
-+ val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_3) |
-+ FIELD_PREP(MT_TXD1_TID, tid);
-+
-+ ethertype = get_unaligned_be16(&skb->data[12]);
-+ if (ethertype >= ETH_P_802_3_MIN)
-+ val |= MT_TXD1_ETH_802_3;
-+
-+ txwi[1] |= cpu_to_le32(val);
-+
-+ fc_type = IEEE80211_FTYPE_DATA >> 2;
-+ fc_stype = wmm ? IEEE80211_STYPE_QOS_DATA >> 4 : 0;
-+
-+ val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
-+ FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype);
-+
-+ txwi[2] |= cpu_to_le32(val);
-+
-+ val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
-+ FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
-+
-+ txwi[7] |= cpu_to_le32(val);
-+}
-+
-+static void
-+mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
-+ struct sk_buff *skb,
-+ struct ieee80211_key_conf *key)
-+{
-+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+ struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+ bool multicast = is_multicast_ether_addr(hdr->addr1);
-+ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-+ __le16 fc = hdr->frame_control;
-+ u8 fc_type, fc_stype;
-+ u32 val;
-+
-+ if (ieee80211_is_action(fc) &&
-+ mgmt->u.action.category == WLAN_CATEGORY_BACK &&
-+ mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ) {
-+ u16 capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
-+
-+ txwi[5] |= cpu_to_le32(MT_TXD5_ADD_BA);
-+ tid = (capab >> 2) & IEEE80211_QOS_CTL_TID_MASK;
-+ } else if (ieee80211_is_back_req(hdr->frame_control)) {
-+ struct ieee80211_bar *bar = (struct ieee80211_bar *)hdr;
-+ u16 control = le16_to_cpu(bar->control);
-+
-+ tid = FIELD_GET(IEEE80211_BAR_CTRL_TID_INFO_MASK, control);
-+ }
-+
-+ val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_11) |
-+ FIELD_PREP(MT_TXD1_HDR_INFO,
-+ ieee80211_get_hdrlen_from_skb(skb) / 2) |
-+ FIELD_PREP(MT_TXD1_TID, tid);
-+
-+ txwi[1] |= cpu_to_le32(val);
-+
-+ fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
-+ fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4;
-+
-+ val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
-+ FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype) |
-+ FIELD_PREP(MT_TXD2_MULTICAST, multicast);
-+
-+ if (key && multicast && ieee80211_is_robust_mgmt_frame(skb) &&
-+ key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
-+ val |= MT_TXD2_BIP;
-+ txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME);
-+ }
-+
-+ if (!ieee80211_is_data(fc) || multicast ||
-+ info->flags & IEEE80211_TX_CTL_USE_MINRATE)
-+ val |= MT_TXD2_FIX_RATE;
-+
-+ txwi[2] |= cpu_to_le32(val);
-+
-+ if (ieee80211_is_beacon(fc)) {
-+ txwi[3] &= ~cpu_to_le32(MT_TXD3_SW_POWER_MGMT);
-+ txwi[3] |= cpu_to_le32(MT_TXD3_REM_TX_COUNT);
-+ if (!is_mt7921(dev))
-+ txwi[7] |= cpu_to_le32(FIELD_PREP(MT_TXD7_SPE_IDX,
-+ 0x18));
-+ }
-+
-+ if (info->flags & IEEE80211_TX_CTL_INJECTED) {
-+ u16 seqno = le16_to_cpu(hdr->seq_ctrl);
-+
-+ if (ieee80211_is_back_req(hdr->frame_control)) {
-+ struct ieee80211_bar *bar;
-+
-+ bar = (struct ieee80211_bar *)skb->data;
-+ seqno = le16_to_cpu(bar->start_seq_num);
-+ }
-+
-+ val = MT_TXD3_SN_VALID |
-+ FIELD_PREP(MT_TXD3_SEQ, IEEE80211_SEQ_TO_SN(seqno));
-+ txwi[3] |= cpu_to_le32(val);
-+ txwi[7] &= ~cpu_to_le32(MT_TXD7_HW_AMSDU);
-+ }
-+
-+ if (mt76_is_mmio(dev)) {
-+ val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
-+ FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
-+ txwi[7] |= cpu_to_le32(val);
-+ } else {
-+ val = FIELD_PREP(MT_TXD8_L_TYPE, fc_type) |
-+ FIELD_PREP(MT_TXD8_L_SUB_TYPE, fc_stype);
-+ txwi[8] |= cpu_to_le32(val);
-+ }
-+}
-+
-+void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
-+ struct sk_buff *skb, struct mt76_wcid *wcid,
-+ struct ieee80211_key_conf *key, int pid,
-+ u32 changed)
-+{
-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+ bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY;
-+ struct ieee80211_vif *vif = info->control.vif;
-+ struct mt76_phy *mphy = &dev->phy;
-+ u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0, band_idx = 0;
-+ u32 val, sz_txd = mt76_is_mmio(dev) ? MT_TXD_SIZE : MT_SDIO_TXD_SIZE;
-+ bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
-+ bool beacon = !!(changed & (BSS_CHANGED_BEACON |
-+ BSS_CHANGED_BEACON_ENABLED));
-+ bool inband_disc = !!(changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
-+ BSS_CHANGED_FILS_DISCOVERY));
-+
-+ if (vif) {
-+ struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
-+
-+ omac_idx = mvif->omac_idx;
-+ wmm_idx = mvif->wmm_idx;
-+ band_idx = mvif->band_idx;
-+ }
-+
-+ if (ext_phy && dev->phy2)
-+ mphy = dev->phy2;
-+
-+ if (inband_disc) {
-+ p_fmt = MT_TX_TYPE_FW;
-+ q_idx = MT_LMAC_ALTX0;
-+ } else if (beacon) {
-+ p_fmt = MT_TX_TYPE_FW;
-+ q_idx = MT_LMAC_BCN0;
-+ } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) {
-+ p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-+ q_idx = MT_LMAC_ALTX0;
-+ } else {
-+ p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-+ q_idx = wmm_idx * MT76_CONNAC_MAX_WMM_SETS +
-+ mt76_connac_lmac_mapping(skb_get_queue_mapping(skb));
-+ }
-+
-+ val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + sz_txd) |
-+ FIELD_PREP(MT_TXD0_PKT_FMT, p_fmt) |
-+ FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
-+ txwi[0] = cpu_to_le32(val);
-+
-+ val = MT_TXD1_LONG_FORMAT |
-+ FIELD_PREP(MT_TXD1_WLAN_IDX, wcid->idx) |
-+ FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx);
-+ if (!is_mt7921(dev))
-+ val |= MT_TXD1_VTA;
-+ if (ext_phy || band_idx)
-+ val |= MT_TXD1_TGID;
-+
-+ txwi[1] = cpu_to_le32(val);
-+ txwi[2] = 0;
-+
-+ val = FIELD_PREP(MT_TXD3_REM_TX_COUNT, 15);
-+ if (!is_mt7921(dev))
-+ val |= MT_TXD3_SW_POWER_MGMT;
-+ if (key)
-+ val |= MT_TXD3_PROTECT_FRAME;
-+ if (info->flags & IEEE80211_TX_CTL_NO_ACK)
-+ val |= MT_TXD3_NO_ACK;
-+
-+ txwi[3] = cpu_to_le32(val);
-+ txwi[4] = 0;
-+
-+ val = FIELD_PREP(MT_TXD5_PID, pid);
-+ if (pid >= MT_PACKET_ID_FIRST)
-+ val |= MT_TXD5_TX_STATUS_HOST;
-+
-+ txwi[5] = cpu_to_le32(val);
-+ txwi[6] = 0;
-+ txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
-+
-+ if (is_8023)
-+ mt76_connac2_mac_write_txwi_8023(txwi, skb, wcid);
-+ else
-+ mt76_connac2_mac_write_txwi_80211(dev, txwi, skb, key);
-+
-+ if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) {
-+ /* Fixed rata is available just for 802.11 txd */
-+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+ bool multicast = is_multicast_ether_addr(hdr->addr1);
-+ u16 rate = mt76_connac2_mac_tx_rate_val(mphy, vif, beacon,
-+ multicast);
-+ u32 val = MT_TXD6_FIXED_BW;
-+
-+ /* hardware won't add HTC for mgmt/ctrl frame */
-+ txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD);
-+
-+ val |= FIELD_PREP(MT_TXD6_TX_RATE, rate);
-+ txwi[6] |= cpu_to_le32(val);
-+ txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
-+ }
-+}
-+EXPORT_SYMBOL_GPL(mt76_connac2_mac_write_txwi);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-index d65a873739af..9bf8db47d103 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-@@ -1013,265 +1013,18 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
- #endif
- }
-
--static void
--mt7915_mac_write_txwi_8023(__le32 *txwi, struct sk_buff *skb,
-- struct mt76_wcid *wcid)
--{
--
-- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-- u8 fc_type, fc_stype;
-- u16 ethertype;
-- bool wmm = false;
-- u32 val;
--
-- if (wcid->sta) {
-- struct ieee80211_sta *sta;
--
-- sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
-- wmm = sta->wme;
-- }
--
-- val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_3) |
-- FIELD_PREP(MT_TXD1_TID, tid);
--
-- ethertype = get_unaligned_be16(&skb->data[12]);
-- if (ethertype >= ETH_P_802_3_MIN)
-- val |= MT_TXD1_ETH_802_3;
--
-- txwi[1] |= cpu_to_le32(val);
--
-- fc_type = IEEE80211_FTYPE_DATA >> 2;
-- fc_stype = wmm ? IEEE80211_STYPE_QOS_DATA >> 4 : 0;
--
-- val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype);
--
-- txwi[2] |= cpu_to_le32(val);
--
-- val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
-- txwi[7] |= cpu_to_le32(val);
--}
--
--static void
--mt7915_mac_write_txwi_80211(__le32 *txwi, struct sk_buff *skb,
-- struct ieee80211_key_conf *key, bool *mcast)
--{
-- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-- struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-- __le16 fc = hdr->frame_control;
-- u8 fc_type, fc_stype;
-- u32 val;
--
-- *mcast = is_multicast_ether_addr(hdr->addr1);
--
-- if (ieee80211_is_action(fc) &&
-- mgmt->u.action.category == WLAN_CATEGORY_BACK &&
-- mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ) {
-- u16 capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
--
-- txwi[5] |= cpu_to_le32(MT_TXD5_ADD_BA);
-- tid = (capab >> 2) & IEEE80211_QOS_CTL_TID_MASK;
-- } else if (ieee80211_is_back_req(hdr->frame_control)) {
-- struct ieee80211_bar *bar = (struct ieee80211_bar *)hdr;
-- u16 control = le16_to_cpu(bar->control);
--
-- tid = FIELD_GET(IEEE80211_BAR_CTRL_TID_INFO_MASK, control);
-- }
--
-- val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_11) |
-- FIELD_PREP(MT_TXD1_HDR_INFO,
-- ieee80211_get_hdrlen_from_skb(skb) / 2) |
-- FIELD_PREP(MT_TXD1_TID, tid);
-- txwi[1] |= cpu_to_le32(val);
--
-- fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
-- fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4;
--
-- val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype) |
-- FIELD_PREP(MT_TXD2_MULTICAST, *mcast);
--
-- if (key && *mcast && ieee80211_is_robust_mgmt_frame(skb) &&
-- key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
-- val |= MT_TXD2_BIP;
-- txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME);
-- }
--
-- if (!ieee80211_is_data(fc) || *mcast ||
-- info->flags & IEEE80211_TX_CTL_USE_MINRATE)
-- val |= MT_TXD2_FIX_RATE;
--
-- txwi[2] |= cpu_to_le32(val);
--
-- if (ieee80211_is_beacon(fc)) {
-- txwi[3] &= ~cpu_to_le32(MT_TXD3_SW_POWER_MGMT);
-- txwi[3] |= cpu_to_le32(MT_TXD3_REM_TX_COUNT);
-- txwi[7] |= cpu_to_le32(FIELD_PREP(MT_TXD7_SPE_IDX, 0x18));
-- }
--
-- if (info->flags & IEEE80211_TX_CTL_INJECTED) {
-- u16 seqno = le16_to_cpu(hdr->seq_ctrl);
--
-- if (ieee80211_is_back_req(hdr->frame_control)) {
-- struct ieee80211_bar *bar;
--
-- bar = (struct ieee80211_bar *)skb->data;
-- seqno = le16_to_cpu(bar->start_seq_num);
-- }
--
-- val = MT_TXD3_SN_VALID |
-- FIELD_PREP(MT_TXD3_SEQ, IEEE80211_SEQ_TO_SN(seqno));
-- txwi[3] |= cpu_to_le32(val);
-- txwi[7] &= ~cpu_to_le32(MT_TXD7_HW_AMSDU);
-- }
--
-- val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
-- txwi[7] |= cpu_to_le32(val);
--}
--
--static u16
--mt7915_mac_tx_rate_val(struct mt76_phy *mphy, struct ieee80211_vif *vif,
-- bool beacon, bool mcast)
--{
-- u8 mode = 0, band = mphy->chandef.chan->band;
-- int rateidx = 0, mcast_rate;
--
-- if (beacon) {
-- struct cfg80211_bitrate_mask *mask;
--
-- mask = &vif->bss_conf.beacon_tx_rate;
-- if (hweight16(mask->control[band].he_mcs[0]) == 1) {
-- rateidx = ffs(mask->control[band].he_mcs[0]) - 1;
-- mode = MT_PHY_TYPE_HE_SU;
-- goto out;
-- } else if (hweight16(mask->control[band].vht_mcs[0]) == 1) {
-- rateidx = ffs(mask->control[band].vht_mcs[0]) - 1;
-- mode = MT_PHY_TYPE_VHT;
-- goto out;
-- } else if (hweight8(mask->control[band].ht_mcs[0]) == 1) {
-- rateidx = ffs(mask->control[band].ht_mcs[0]) - 1;
-- mode = MT_PHY_TYPE_HT;
-- goto out;
-- } else if (hweight32(mask->control[band].legacy) == 1) {
-- rateidx = ffs(mask->control[band].legacy) - 1;
-- goto legacy;
-- }
-- }
--
-- mcast_rate = vif->bss_conf.mcast_rate[band];
-- if (mcast && mcast_rate > 0)
-- rateidx = mcast_rate - 1;
-- else
-- rateidx = ffs(vif->bss_conf.basic_rates) - 1;
--
--legacy:
-- rateidx = mt76_calculate_default_rate(mphy, rateidx);
-- mode = rateidx >> 8;
-- rateidx &= GENMASK(7, 0);
--
--out:
-- return FIELD_PREP(MT_TX_RATE_IDX, rateidx) |
-- FIELD_PREP(MT_TX_RATE_MODE, mode);
--}
--
- void mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
- struct ieee80211_key_conf *key, u32 changed)
- {
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-- struct ieee80211_vif *vif = info->control.vif;
- struct mt76_phy *mphy = &dev->phy;
-- bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY;
-- u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0, band_idx = 0;
-- bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
-- bool mcast = false;
-- u16 tx_count = 15;
-- u32 val;
-- bool beacon = !!(changed & (BSS_CHANGED_BEACON |
-- BSS_CHANGED_BEACON_ENABLED));
-- bool inband_disc = !!(changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
-- BSS_CHANGED_FILS_DISCOVERY));
-
-- if (vif) {
-- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
--
-- omac_idx = mvif->mt76.omac_idx;
-- wmm_idx = mvif->mt76.wmm_idx;
-- band_idx = mvif->mt76.band_idx;
-- }
--
-- if (ext_phy && dev->phy2)
-+ if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2)
- mphy = dev->phy2;
-
-- if (inband_disc) {
-- p_fmt = MT_TX_TYPE_FW;
-- q_idx = MT_LMAC_ALTX0;
-- } else if (beacon) {
-- p_fmt = MT_TX_TYPE_FW;
-- q_idx = MT_LMAC_BCN0;
-- } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) {
-- p_fmt = MT_TX_TYPE_CT;
-- q_idx = MT_LMAC_ALTX0;
-- } else {
-- p_fmt = MT_TX_TYPE_CT;
-- q_idx = wmm_idx * MT7915_MAX_WMM_SETS +
-- mt76_connac_lmac_mapping(skb_get_queue_mapping(skb));
-- }
--
-- val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + MT_TXD_SIZE) |
-- FIELD_PREP(MT_TXD0_PKT_FMT, p_fmt) |
-- FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
-- txwi[0] = cpu_to_le32(val);
--
-- val = MT_TXD1_LONG_FORMAT | MT_TXD1_VTA |
-- FIELD_PREP(MT_TXD1_WLAN_IDX, wcid->idx) |
-- FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx);
--
-- if (ext_phy || band_idx)
-- val |= MT_TXD1_TGID;
--
-- txwi[1] = cpu_to_le32(val);
--
-- txwi[2] = 0;
-+ mt76_connac2_mac_write_txwi(dev, txwi, skb, wcid, key, pid, changed);
-
-- val = MT_TXD3_SW_POWER_MGMT |
-- FIELD_PREP(MT_TXD3_REM_TX_COUNT, tx_count);
-- if (key)
-- val |= MT_TXD3_PROTECT_FRAME;
-- if (info->flags & IEEE80211_TX_CTL_NO_ACK)
-- val |= MT_TXD3_NO_ACK;
--
-- txwi[3] = cpu_to_le32(val);
-- txwi[4] = 0;
--
-- val = FIELD_PREP(MT_TXD5_PID, pid);
-- if (pid >= MT_PACKET_ID_FIRST)
-- val |= MT_TXD5_TX_STATUS_HOST;
-- txwi[5] = cpu_to_le32(val);
--
-- txwi[6] = 0;
-- txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
--
-- if (is_8023)
-- mt7915_mac_write_txwi_8023(txwi, skb, wcid);
-- else
-- mt7915_mac_write_txwi_80211(txwi, skb, key, &mcast);
--
-- if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) {
-- u16 rate = mt7915_mac_tx_rate_val(mphy, vif, beacon, mcast);
--
-- /* hardware won't add HTC for mgmt/ctrl frame */
-- txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD);
--
-- val = MT_TXD6_FIXED_BW |
-- FIELD_PREP(MT_TXD6_TX_RATE, rate);
-- txwi[6] |= cpu_to_le32(val);
-- txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
-- }
-
- if (mt76_testmode_enabled(mphy))
- mt7915_mac_write_txwi_tm(mphy->priv, txwi, skb);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-index 0ef3952bc33c..695c38a6f90c 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-@@ -2701,7 +2701,7 @@ int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
- struct edca *e = &req.edca[ac];
-
- e->set = WMM_PARAM_SET;
-- e->queue = ac + mvif->mt76.wmm_idx * MT7915_MAX_WMM_SETS;
-+ e->queue = ac + mvif->mt76.wmm_idx * MT76_CONNAC_MAX_WMM_SETS;
- e->aifs = q->aifs;
- e->txop = cpu_to_le16(q->txop);
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-index 41d76e24dd8b..6e4bff51b427 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-@@ -10,7 +10,6 @@
- #include "regs.h"
-
- #define MT7915_MAX_INTERFACES 19
--#define MT7915_MAX_WMM_SETS 4
- #define MT7915_WTBL_SIZE 288
- #define MT7916_WTBL_SIZE 544
- #define MT7915_WTBL_RESERVED (mt7915_wtbl_size(dev) - 1)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-index 3ae7989c8500..297f3630537e 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-@@ -808,216 +808,6 @@ mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
- return 0;
- }
-
--static void
--mt7921_mac_write_txwi_8023(__le32 *txwi, struct sk_buff *skb,
-- struct mt76_wcid *wcid)
--{
-- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-- u8 fc_type, fc_stype;
-- u16 ethertype;
-- bool wmm = false;
-- u32 val;
--
-- if (wcid->sta) {
-- struct ieee80211_sta *sta;
--
-- sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
-- wmm = sta->wme;
-- }
--
-- val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_3) |
-- FIELD_PREP(MT_TXD1_TID, tid);
--
-- ethertype = get_unaligned_be16(&skb->data[12]);
-- if (ethertype >= ETH_P_802_3_MIN)
-- val |= MT_TXD1_ETH_802_3;
--
-- txwi[1] |= cpu_to_le32(val);
--
-- fc_type = IEEE80211_FTYPE_DATA >> 2;
-- fc_stype = wmm ? IEEE80211_STYPE_QOS_DATA >> 4 : 0;
--
-- val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype);
--
-- txwi[2] |= cpu_to_le32(val);
--
-- val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
-- txwi[7] |= cpu_to_le32(val);
--}
--
--static void
--mt7921_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct ieee80211_key_conf *key)
--{
-- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-- struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-- bool multicast = is_multicast_ether_addr(hdr->addr1);
-- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-- __le16 fc = hdr->frame_control;
-- u8 fc_type, fc_stype;
-- u32 val;
--
-- if (ieee80211_is_action(fc) &&
-- mgmt->u.action.category == WLAN_CATEGORY_BACK &&
-- mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ) {
-- u16 capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
--
-- txwi[5] |= cpu_to_le32(MT_TXD5_ADD_BA);
-- tid = (capab >> 2) & IEEE80211_QOS_CTL_TID_MASK;
-- } else if (ieee80211_is_back_req(hdr->frame_control)) {
-- struct ieee80211_bar *bar = (struct ieee80211_bar *)hdr;
-- u16 control = le16_to_cpu(bar->control);
--
-- tid = FIELD_GET(IEEE80211_BAR_CTRL_TID_INFO_MASK, control);
-- }
--
-- val = FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_802_11) |
-- FIELD_PREP(MT_TXD1_HDR_INFO,
-- ieee80211_get_hdrlen_from_skb(skb) / 2) |
-- FIELD_PREP(MT_TXD1_TID, tid);
-- txwi[1] |= cpu_to_le32(val);
--
-- fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
-- fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4;
--
-- val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype) |
-- FIELD_PREP(MT_TXD2_MULTICAST, multicast);
--
-- if (key && multicast && ieee80211_is_robust_mgmt_frame(skb) &&
-- key->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
-- val |= MT_TXD2_BIP;
-- txwi[3] &= ~cpu_to_le32(MT_TXD3_PROTECT_FRAME);
-- }
--
-- if (!ieee80211_is_data(fc) || multicast ||
-- info->flags & IEEE80211_TX_CTL_USE_MINRATE)
-- val |= MT_TXD2_FIX_RATE;
--
-- txwi[2] |= cpu_to_le32(val);
--
-- if (ieee80211_is_beacon(fc)) {
-- txwi[3] &= ~cpu_to_le32(MT_TXD3_SW_POWER_MGMT);
-- txwi[3] |= cpu_to_le32(MT_TXD3_REM_TX_COUNT);
-- }
--
-- if (info->flags & IEEE80211_TX_CTL_INJECTED) {
-- u16 seqno = le16_to_cpu(hdr->seq_ctrl);
--
-- if (ieee80211_is_back_req(hdr->frame_control)) {
-- struct ieee80211_bar *bar;
--
-- bar = (struct ieee80211_bar *)skb->data;
-- seqno = le16_to_cpu(bar->start_seq_num);
-- }
--
-- val = MT_TXD3_SN_VALID |
-- FIELD_PREP(MT_TXD3_SEQ, IEEE80211_SEQ_TO_SN(seqno));
-- txwi[3] |= cpu_to_le32(val);
-- txwi[7] &= ~cpu_to_le32(MT_TXD7_HW_AMSDU);
-- }
--
-- if (mt76_is_mmio(dev)) {
-- val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
-- txwi[7] |= cpu_to_le32(val);
-- } else {
-- val = FIELD_PREP(MT_TXD8_L_TYPE, fc_type) |
-- FIELD_PREP(MT_TXD8_L_SUB_TYPE, fc_stype);
-- txwi[8] |= cpu_to_le32(val);
-- }
--}
--
--void mt7921_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct mt76_wcid *wcid,
-- struct ieee80211_key_conf *key, int pid,
-- bool beacon)
--{
-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-- struct ieee80211_vif *vif = info->control.vif;
-- struct mt76_phy *mphy = &dev->phy;
-- u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0;
-- u32 sz_txd = mt76_is_mmio(dev) ? MT_TXD_SIZE : MT_SDIO_TXD_SIZE;
-- bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
-- u16 tx_count = 15;
-- u32 val;
--
-- if (vif) {
-- struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
--
-- omac_idx = mvif->omac_idx;
-- wmm_idx = mvif->wmm_idx;
-- }
--
-- if (beacon) {
-- p_fmt = MT_TX_TYPE_FW;
-- q_idx = MT_LMAC_BCN0;
-- } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) {
-- p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-- q_idx = MT_LMAC_ALTX0;
-- } else {
-- p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-- q_idx = wmm_idx * MT7921_MAX_WMM_SETS +
-- mt76_connac_lmac_mapping(skb_get_queue_mapping(skb));
-- }
--
-- val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + sz_txd) |
-- FIELD_PREP(MT_TXD0_PKT_FMT, p_fmt) |
-- FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
-- txwi[0] = cpu_to_le32(val);
--
-- val = MT_TXD1_LONG_FORMAT |
-- FIELD_PREP(MT_TXD1_WLAN_IDX, wcid->idx) |
-- FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx);
--
-- txwi[1] = cpu_to_le32(val);
-- txwi[2] = 0;
--
-- val = FIELD_PREP(MT_TXD3_REM_TX_COUNT, tx_count);
-- if (key)
-- val |= MT_TXD3_PROTECT_FRAME;
-- if (info->flags & IEEE80211_TX_CTL_NO_ACK)
-- val |= MT_TXD3_NO_ACK;
--
-- txwi[3] = cpu_to_le32(val);
-- txwi[4] = 0;
--
-- val = FIELD_PREP(MT_TXD5_PID, pid);
-- if (pid >= MT_PACKET_ID_FIRST)
-- val |= MT_TXD5_TX_STATUS_HOST;
-- txwi[5] = cpu_to_le32(val);
--
-- txwi[6] = 0;
-- txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
--
-- if (is_8023)
-- mt7921_mac_write_txwi_8023(txwi, skb, wcid);
-- else
-- mt7921_mac_write_txwi_80211(dev, txwi, skb, key);
--
-- if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) {
-- int rateidx = vif ? ffs(vif->bss_conf.basic_rates) - 1 : 0;
-- u16 rate, mode;
--
-- /* hardware won't add HTC for mgmt/ctrl frame */
-- txwi[2] |= cpu_to_le32(MT_TXD2_HTC_VLD);
--
-- rate = mt76_calculate_default_rate(mphy, rateidx);
-- mode = rate >> 8;
-- rate &= GENMASK(7, 0);
-- rate |= FIELD_PREP(MT_TX_RATE_MODE, mode);
--
-- val = MT_TXD6_FIXED_BW |
-- FIELD_PREP(MT_TXD6_TX_RATE, rate);
-- txwi[6] |= cpu_to_le32(val);
-- txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
-- }
--}
--EXPORT_SYMBOL_GPL(mt7921_mac_write_txwi);
--
- void mt7921_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
- {
- struct mt7921_sta *msta;
-@@ -1645,7 +1435,7 @@ mt7921_usb_sdio_write_txwi(struct mt7921_dev *dev, struct mt76_wcid *wcid,
- __le32 *txwi = (__le32 *)(skb->data - MT_SDIO_TXD_SIZE);
-
- memset(txwi, 0, MT_SDIO_TXD_SIZE);
-- mt7921_mac_write_txwi(&dev->mt76, txwi, skb, wcid, key, pid, false);
-+ mt76_connac2_mac_write_txwi(&dev->mt76, txwi, skb, wcid, key, pid, 0);
- skb_push(skb, MT_SDIO_TXD_SIZE);
- }
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-index d7e2bd605117..aa3d92d94353 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-@@ -321,7 +321,7 @@ static int mt7921_add_interface(struct ieee80211_hw *hw,
- mvif->mt76.omac_idx = mvif->mt76.idx;
- mvif->phy = phy;
- mvif->mt76.band_idx = 0;
-- mvif->mt76.wmm_idx = mvif->mt76.idx % MT7921_MAX_WMM_SETS;
-+ mvif->mt76.wmm_idx = mvif->mt76.idx % MT76_CONNAC_MAX_WMM_SETS;
-
- ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid,
- true);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-index c2245be657d4..f2bfa0c4e737 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-@@ -1226,8 +1226,8 @@ mt7921_mcu_uni_add_beacon_offload(struct mt7921_dev *dev,
- return -EINVAL;
- }
-
-- mt7921_mac_write_txwi(&dev->mt76, (__le32 *)(req.beacon_tlv.pkt), skb,
-- wcid, NULL, 0, true);
-+ mt76_connac2_mac_write_txwi(&dev->mt76, (__le32 *)(req.beacon_tlv.pkt),
-+ skb, wcid, NULL, 0, BSS_CHANGED_BEACON);
- memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
- req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
- req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-index d105e815fcd4..9b484b389117 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-@@ -10,7 +10,6 @@
- #include "regs.h"
-
- #define MT7921_MAX_INTERFACES 4
--#define MT7921_MAX_WMM_SETS 4
- #define MT7921_WTBL_SIZE 20
- #define MT7921_WTBL_RESERVED (MT7921_WTBL_SIZE - 1)
- #define MT7921_WTBL_STA (MT7921_WTBL_RESERVED - \
-@@ -411,10 +410,6 @@ int mt7921_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- void *data, int len);
- int mt7921_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- struct netlink_callback *cb, void *data, int len);
--void mt7921_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct mt76_wcid *wcid,
-- struct ieee80211_key_conf *key, int pid,
-- bool beacon);
- void mt7921_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi);
- void mt7921_mac_sta_poll(struct mt7921_dev *dev);
- int mt7921_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
-index f261cbfae2f3..b0f58bcf70cb 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
-@@ -72,8 +72,8 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- }
-
- pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
-- mt7921_mac_write_txwi(mdev, txwi_ptr, tx_info->skb, wcid, key,
-- pid, false);
-+ mt76_connac2_mac_write_txwi(mdev, txwi_ptr, tx_info->skb, wcid, key,
-+ pid, 0);
-
- txp = (struct mt7921_txp_common *)(txwi + MT_TXD_SIZE);
- memset(txp, 0, sizeof(struct mt7921_txp_common));
---
-2.35.1
-
+++ /dev/null
-From d3d26f6277444cd8f05771aa21dfc0f34386ff67 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 7 Jun 2022 11:28:39 +0200
-Subject: mt76: connac: move mac connac2 defs in mt76_connac2_mac.h
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit 90211957a640e6933b236e06728578d252f7374f ]
-
-This is a preliminary patch to share connac2 mac txwi code.
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../wireless/mediatek/mt76/mt76_connac2_mac.h | 167 ++++++++++++++++++
- .../net/wireless/mediatek/mt76/mt7915/mac.h | 142 +--------------
- .../wireless/mediatek/mt76/mt7915/mt7915.h | 14 --
- .../net/wireless/mediatek/mt76/mt7921/mac.h | 123 +------------
- .../wireless/mediatek/mt76/mt7921/mt7921.h | 10 --
- 5 files changed, 171 insertions(+), 285 deletions(-)
- create mode 100644 drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
-new file mode 100644
-index 000000000000..c9d9c8475a38
---- /dev/null
-+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
-@@ -0,0 +1,167 @@
-+/* SPDX-License-Identifier: ISC */
-+/* Copyright (C) 2022 MediaTek Inc. */
-+
-+#ifndef __MT76_CONNAC2_MAC_H
-+#define __MT76_CONNAC2_MAC_H
-+
-+enum tx_header_format {
-+ MT_HDR_FORMAT_802_3,
-+ MT_HDR_FORMAT_CMD,
-+ MT_HDR_FORMAT_802_11,
-+ MT_HDR_FORMAT_802_11_EXT,
-+};
-+
-+enum tx_pkt_type {
-+ MT_TX_TYPE_CT,
-+ MT_TX_TYPE_SF,
-+ MT_TX_TYPE_CMD,
-+ MT_TX_TYPE_FW,
-+};
-+
-+enum {
-+ MT_CTX0,
-+ MT_HIF0 = 0x0,
-+
-+ MT_LMAC_AC00 = 0x0,
-+ MT_LMAC_AC01,
-+ MT_LMAC_AC02,
-+ MT_LMAC_AC03,
-+ MT_LMAC_ALTX0 = 0x10,
-+ MT_LMAC_BMC0,
-+ MT_LMAC_BCN0,
-+ MT_LMAC_PSMP0,
-+};
-+
-+#define MT_TXD_SIZE (8 * 4)
-+#define MT_SDIO_TXD_SIZE (MT_TXD_SIZE + 8 * 4)
-+#define MT_SDIO_TAIL_SIZE 8
-+#define MT_SDIO_HDR_SIZE 4
-+#define MT_USB_TAIL_SIZE 4
-+
-+#define MT_TXD0_Q_IDX GENMASK(31, 25)
-+#define MT_TXD0_PKT_FMT GENMASK(24, 23)
-+#define MT_TXD0_ETH_TYPE_OFFSET GENMASK(22, 16)
-+#define MT_TXD0_TX_BYTES GENMASK(15, 0)
-+
-+#define MT_TXD1_LONG_FORMAT BIT(31)
-+#define MT_TXD1_TGID BIT(30)
-+#define MT_TXD1_OWN_MAC GENMASK(29, 24)
-+#define MT_TXD1_AMSDU BIT(23)
-+#define MT_TXD1_TID GENMASK(22, 20)
-+#define MT_TXD1_HDR_PAD GENMASK(19, 18)
-+#define MT_TXD1_HDR_FORMAT GENMASK(17, 16)
-+#define MT_TXD1_HDR_INFO GENMASK(15, 11)
-+#define MT_TXD1_ETH_802_3 BIT(15)
-+#define MT_TXD1_VTA BIT(10)
-+#define MT_TXD1_WLAN_IDX GENMASK(9, 0)
-+
-+#define MT_TXD2_FIX_RATE BIT(31)
-+#define MT_TXD2_FIXED_RATE BIT(30)
-+#define MT_TXD2_POWER_OFFSET GENMASK(29, 24)
-+#define MT_TXD2_MAX_TX_TIME GENMASK(23, 16)
-+#define MT_TXD2_FRAG GENMASK(15, 14)
-+#define MT_TXD2_HTC_VLD BIT(13)
-+#define MT_TXD2_DURATION BIT(12)
-+#define MT_TXD2_BIP BIT(11)
-+#define MT_TXD2_MULTICAST BIT(10)
-+#define MT_TXD2_RTS BIT(9)
-+#define MT_TXD2_SOUNDING BIT(8)
-+#define MT_TXD2_NDPA BIT(7)
-+#define MT_TXD2_NDP BIT(6)
-+#define MT_TXD2_FRAME_TYPE GENMASK(5, 4)
-+#define MT_TXD2_SUB_TYPE GENMASK(3, 0)
-+
-+#define MT_TXD3_SN_VALID BIT(31)
-+#define MT_TXD3_PN_VALID BIT(30)
-+#define MT_TXD3_SW_POWER_MGMT BIT(29)
-+#define MT_TXD3_BA_DISABLE BIT(28)
-+#define MT_TXD3_SEQ GENMASK(27, 16)
-+#define MT_TXD3_REM_TX_COUNT GENMASK(15, 11)
-+#define MT_TXD3_TX_COUNT GENMASK(10, 6)
-+#define MT_TXD3_TIMING_MEASURE BIT(5)
-+#define MT_TXD3_DAS BIT(4)
-+#define MT_TXD3_EEOSP BIT(3)
-+#define MT_TXD3_EMRD BIT(2)
-+#define MT_TXD3_PROTECT_FRAME BIT(1)
-+#define MT_TXD3_NO_ACK BIT(0)
-+
-+#define MT_TXD4_PN_LOW GENMASK(31, 0)
-+
-+#define MT_TXD5_PN_HIGH GENMASK(31, 16)
-+#define MT_TXD5_MD BIT(15)
-+#define MT_TXD5_ADD_BA BIT(14)
-+#define MT_TXD5_TX_STATUS_HOST BIT(10)
-+#define MT_TXD5_TX_STATUS_MCU BIT(9)
-+#define MT_TXD5_TX_STATUS_FMT BIT(8)
-+#define MT_TXD5_PID GENMASK(7, 0)
-+
-+#define MT_TXD6_TX_IBF BIT(31)
-+#define MT_TXD6_TX_EBF BIT(30)
-+#define MT_TXD6_TX_RATE GENMASK(29, 16)
-+#define MT_TXD6_SGI GENMASK(15, 14)
-+#define MT_TXD6_HELTF GENMASK(13, 12)
-+#define MT_TXD6_LDPC BIT(11)
-+#define MT_TXD6_SPE_ID_IDX BIT(10)
-+#define MT_TXD6_ANT_ID GENMASK(7, 4)
-+#define MT_TXD6_DYN_BW BIT(3)
-+#define MT_TXD6_FIXED_BW BIT(2)
-+#define MT_TXD6_BW GENMASK(1, 0)
-+
-+#define MT_TXD7_TXD_LEN GENMASK(31, 30)
-+#define MT_TXD7_UDP_TCP_SUM BIT(29)
-+#define MT_TXD7_IP_SUM BIT(28)
-+#define MT_TXD7_TYPE GENMASK(21, 20)
-+#define MT_TXD7_SUB_TYPE GENMASK(19, 16)
-+
-+#define MT_TXD7_PSE_FID GENMASK(27, 16)
-+#define MT_TXD7_SPE_IDX GENMASK(15, 11)
-+#define MT_TXD7_HW_AMSDU BIT(10)
-+#define MT_TXD7_TX_TIME GENMASK(9, 0)
-+
-+#define MT_TXD8_L_TYPE GENMASK(5, 4)
-+#define MT_TXD8_L_SUB_TYPE GENMASK(3, 0)
-+
-+#define MT_TX_RATE_STBC BIT(13)
-+#define MT_TX_RATE_NSS GENMASK(12, 10)
-+#define MT_TX_RATE_MODE GENMASK(9, 6)
-+#define MT_TX_RATE_SU_EXT_TONE BIT(5)
-+#define MT_TX_RATE_DCM BIT(4)
-+/* VHT/HE only use bits 0-3 */
-+#define MT_TX_RATE_IDX GENMASK(5, 0)
-+
-+#define MT_TXS0_FIXED_RATE BIT(31)
-+#define MT_TXS0_BW GENMASK(30, 29)
-+#define MT_TXS0_TID GENMASK(28, 26)
-+#define MT_TXS0_AMPDU BIT(25)
-+#define MT_TXS0_TXS_FORMAT GENMASK(24, 23)
-+#define MT_TXS0_BA_ERROR BIT(22)
-+#define MT_TXS0_PS_FLAG BIT(21)
-+#define MT_TXS0_TXOP_TIMEOUT BIT(20)
-+#define MT_TXS0_BIP_ERROR BIT(19)
-+
-+#define MT_TXS0_QUEUE_TIMEOUT BIT(18)
-+#define MT_TXS0_RTS_TIMEOUT BIT(17)
-+#define MT_TXS0_ACK_TIMEOUT BIT(16)
-+#define MT_TXS0_ACK_ERROR_MASK GENMASK(18, 16)
-+
-+#define MT_TXS0_TX_STATUS_HOST BIT(15)
-+#define MT_TXS0_TX_STATUS_MCU BIT(14)
-+#define MT_TXS0_TX_RATE GENMASK(13, 0)
-+
-+#define MT_TXS1_SEQNO GENMASK(31, 20)
-+#define MT_TXS1_RESP_RATE GENMASK(19, 16)
-+#define MT_TXS1_RXV_SEQNO GENMASK(15, 8)
-+#define MT_TXS1_TX_POWER_DBM GENMASK(7, 0)
-+
-+#define MT_TXS2_BF_STATUS GENMASK(31, 30)
-+#define MT_TXS2_LAST_TX_RATE GENMASK(29, 27)
-+#define MT_TXS2_SHARED_ANTENNA BIT(26)
-+#define MT_TXS2_WCID GENMASK(25, 16)
-+#define MT_TXS2_TX_DELAY GENMASK(15, 0)
-+
-+#define MT_TXS3_PID GENMASK(31, 24)
-+#define MT_TXS3_ANT_ID GENMASK(23, 0)
-+
-+#define MT_TXS4_TIMESTAMP GENMASK(31, 0)
-+
-+#endif /* __MT76_CONNAC2_MAC_H */
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
-index 5add1dd36dbe..51496981cb1e 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.h
-@@ -4,6 +4,8 @@
- #ifndef __MT7915_MAC_H
- #define __MT7915_MAC_H
-
-+#include "../mt76_connac2_mac.h"
-+
- #define MT_CT_PARSE_LEN 72
- #define MT_CT_DMA_BUF_NUM 2
-
-@@ -165,20 +167,6 @@ enum rx_pkt_type {
- #define MT_CRXV_FOE_HI GENMASK(6, 0)
- #define MT_CRXV_FOE_SHIFT 13
-
--enum tx_header_format {
-- MT_HDR_FORMAT_802_3,
-- MT_HDR_FORMAT_CMD,
-- MT_HDR_FORMAT_802_11,
-- MT_HDR_FORMAT_802_11_EXT,
--};
--
--enum tx_pkt_type {
-- MT_TX_TYPE_CT,
-- MT_TX_TYPE_SF,
-- MT_TX_TYPE_CMD,
-- MT_TX_TYPE_FW,
--};
--
- enum tx_port_idx {
- MT_TX_PORT_IDX_LMAC,
- MT_TX_PORT_IDX_MCU
-@@ -199,97 +187,6 @@ enum tx_mcu_port_q_idx {
- #define MT_CT_INFO_HSR2_TX BIT(4)
- #define MT_CT_INFO_FROM_HOST BIT(7)
-
--#define MT_TXD_SIZE (8 * 4)
--
--#define MT_TXD0_Q_IDX GENMASK(31, 25)
--#define MT_TXD0_PKT_FMT GENMASK(24, 23)
--#define MT_TXD0_ETH_TYPE_OFFSET GENMASK(22, 16)
--#define MT_TXD0_TX_BYTES GENMASK(15, 0)
--
--#define MT_TXD1_LONG_FORMAT BIT(31)
--#define MT_TXD1_TGID BIT(30)
--#define MT_TXD1_OWN_MAC GENMASK(29, 24)
--#define MT_TXD1_AMSDU BIT(23)
--#define MT_TXD1_TID GENMASK(22, 20)
--#define MT_TXD1_HDR_PAD GENMASK(19, 18)
--#define MT_TXD1_HDR_FORMAT GENMASK(17, 16)
--#define MT_TXD1_HDR_INFO GENMASK(15, 11)
--#define MT_TXD1_ETH_802_3 BIT(15)
--#define MT_TXD1_VTA BIT(10)
--#define MT_TXD1_WLAN_IDX GENMASK(9, 0)
--
--#define MT_TXD2_FIX_RATE BIT(31)
--#define MT_TXD2_FIXED_RATE BIT(30)
--#define MT_TXD2_POWER_OFFSET GENMASK(29, 24)
--#define MT_TXD2_MAX_TX_TIME GENMASK(23, 16)
--#define MT_TXD2_FRAG GENMASK(15, 14)
--#define MT_TXD2_HTC_VLD BIT(13)
--#define MT_TXD2_DURATION BIT(12)
--#define MT_TXD2_BIP BIT(11)
--#define MT_TXD2_MULTICAST BIT(10)
--#define MT_TXD2_RTS BIT(9)
--#define MT_TXD2_SOUNDING BIT(8)
--#define MT_TXD2_NDPA BIT(7)
--#define MT_TXD2_NDP BIT(6)
--#define MT_TXD2_FRAME_TYPE GENMASK(5, 4)
--#define MT_TXD2_SUB_TYPE GENMASK(3, 0)
--
--#define MT_TXD3_SN_VALID BIT(31)
--#define MT_TXD3_PN_VALID BIT(30)
--#define MT_TXD3_SW_POWER_MGMT BIT(29)
--#define MT_TXD3_BA_DISABLE BIT(28)
--#define MT_TXD3_SEQ GENMASK(27, 16)
--#define MT_TXD3_REM_TX_COUNT GENMASK(15, 11)
--#define MT_TXD3_TX_COUNT GENMASK(10, 6)
--#define MT_TXD3_TIMING_MEASURE BIT(5)
--#define MT_TXD3_DAS BIT(4)
--#define MT_TXD3_EEOSP BIT(3)
--#define MT_TXD3_EMRD BIT(2)
--#define MT_TXD3_PROTECT_FRAME BIT(1)
--#define MT_TXD3_NO_ACK BIT(0)
--
--#define MT_TXD4_PN_LOW GENMASK(31, 0)
--
--#define MT_TXD5_PN_HIGH GENMASK(31, 16)
--#define MT_TXD5_MD BIT(15)
--#define MT_TXD5_ADD_BA BIT(14)
--#define MT_TXD5_TX_STATUS_HOST BIT(10)
--#define MT_TXD5_TX_STATUS_MCU BIT(9)
--#define MT_TXD5_TX_STATUS_FMT BIT(8)
--#define MT_TXD5_PID GENMASK(7, 0)
--
--#define MT_TXD6_TX_IBF BIT(31)
--#define MT_TXD6_TX_EBF BIT(30)
--#define MT_TXD6_TX_RATE GENMASK(29, 16)
--#define MT_TXD6_SGI GENMASK(15, 14)
--#define MT_TXD6_HELTF GENMASK(13, 12)
--#define MT_TXD6_LDPC BIT(11)
--#define MT_TXD6_SPE_ID_IDX BIT(10)
--#define MT_TXD6_ANT_ID GENMASK(7, 4)
--#define MT_TXD6_DYN_BW BIT(3)
--#define MT_TXD6_FIXED_BW BIT(2)
--#define MT_TXD6_BW GENMASK(1, 0)
--
--#define MT_TXD7_TXD_LEN GENMASK(31, 30)
--#define MT_TXD7_UDP_TCP_SUM BIT(29)
--#define MT_TXD7_IP_SUM BIT(28)
--
--#define MT_TXD7_TYPE GENMASK(21, 20)
--#define MT_TXD7_SUB_TYPE GENMASK(19, 16)
--
--#define MT_TXD7_PSE_FID GENMASK(27, 16)
--#define MT_TXD7_SPE_IDX GENMASK(15, 11)
--#define MT_TXD7_HW_AMSDU BIT(10)
--#define MT_TXD7_TX_TIME GENMASK(9, 0)
--
--#define MT_TX_RATE_STBC BIT(13)
--#define MT_TX_RATE_NSS GENMASK(12, 10)
--#define MT_TX_RATE_MODE GENMASK(9, 6)
--#define MT_TX_RATE_SU_EXT_TONE BIT(5)
--#define MT_TX_RATE_DCM BIT(4)
--/* VHT/HE only use bits 0-3 */
--#define MT_TX_RATE_IDX GENMASK(5, 0)
--
- #define MT_TXP_MAX_BUF_NUM 6
-
- struct mt7915_txp {
-@@ -322,41 +219,6 @@ struct mt7915_tx_free {
- /* will support this field in further revision */
- #define MT_TX_FREE_RATE GENMASK(13, 0)
-
--#define MT_TXS0_FIXED_RATE BIT(31)
--#define MT_TXS0_BW GENMASK(30, 29)
--#define MT_TXS0_TID GENMASK(28, 26)
--#define MT_TXS0_AMPDU BIT(25)
--#define MT_TXS0_TXS_FORMAT GENMASK(24, 23)
--#define MT_TXS0_BA_ERROR BIT(22)
--#define MT_TXS0_PS_FLAG BIT(21)
--#define MT_TXS0_TXOP_TIMEOUT BIT(20)
--#define MT_TXS0_BIP_ERROR BIT(19)
--
--#define MT_TXS0_QUEUE_TIMEOUT BIT(18)
--#define MT_TXS0_RTS_TIMEOUT BIT(17)
--#define MT_TXS0_ACK_TIMEOUT BIT(16)
--#define MT_TXS0_ACK_ERROR_MASK GENMASK(18, 16)
--
--#define MT_TXS0_TX_STATUS_HOST BIT(15)
--#define MT_TXS0_TX_STATUS_MCU BIT(14)
--#define MT_TXS0_TX_RATE GENMASK(13, 0)
--
--#define MT_TXS1_SEQNO GENMASK(31, 20)
--#define MT_TXS1_RESP_RATE GENMASK(19, 16)
--#define MT_TXS1_RXV_SEQNO GENMASK(15, 8)
--#define MT_TXS1_TX_POWER_DBM GENMASK(7, 0)
--
--#define MT_TXS2_BF_STATUS GENMASK(31, 30)
--#define MT_TXS2_LAST_TX_RATE GENMASK(29, 27)
--#define MT_TXS2_SHARED_ANTENNA BIT(26)
--#define MT_TXS2_WCID GENMASK(25, 16)
--#define MT_TXS2_TX_DELAY GENMASK(15, 0)
--
--#define MT_TXS3_PID GENMASK(31, 24)
--#define MT_TXS3_ANT_ID GENMASK(23, 0)
--
--#define MT_TXS4_TIMESTAMP GENMASK(31, 0)
--
- #define MT_TXS5_F0_FINAL_MPDU BIT(31)
- #define MT_TXS5_F0_QOS BIT(30)
- #define MT_TXS5_F0_TX_COUNT GENMASK(29, 25)
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-index 64b4c3c09d33..41d76e24dd8b 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-@@ -335,20 +335,6 @@ enum {
- __MT_WFDMA_MAX,
- };
-
--enum {
-- MT_CTX0,
-- MT_HIF0 = 0x0,
--
-- MT_LMAC_AC00 = 0x0,
-- MT_LMAC_AC01,
-- MT_LMAC_AC02,
-- MT_LMAC_AC03,
-- MT_LMAC_ALTX0 = 0x10,
-- MT_LMAC_BMC0,
-- MT_LMAC_BCN0,
-- MT_LMAC_PSMP0,
--};
--
- enum {
- MT_RX_SEL0,
- MT_RX_SEL1,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.h b/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
-index 79447e2d0143..556e687bd235 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.h
-@@ -4,6 +4,8 @@
- #ifndef __MT7921_MAC_H
- #define __MT7921_MAC_H
-
-+#include "../mt76_connac2_mac.h"
-+
- #define MT_CT_PARSE_LEN 72
- #define MT_CT_DMA_BUF_NUM 2
-
-@@ -163,20 +165,6 @@ enum rx_pkt_type {
- #define MT_CRXV_FOE_HI GENMASK(6, 0)
- #define MT_CRXV_FOE_SHIFT 13
-
--enum tx_header_format {
-- MT_HDR_FORMAT_802_3,
-- MT_HDR_FORMAT_CMD,
-- MT_HDR_FORMAT_802_11,
-- MT_HDR_FORMAT_802_11_EXT,
--};
--
--enum tx_pkt_type {
-- MT_TX_TYPE_CT,
-- MT_TX_TYPE_SF,
-- MT_TX_TYPE_CMD,
-- MT_TX_TYPE_FW,
--};
--
- enum tx_port_idx {
- MT_TX_PORT_IDX_LMAC,
- MT_TX_PORT_IDX_MCU
-@@ -197,104 +185,6 @@ enum tx_mcu_port_q_idx {
- #define MT_CT_INFO_HSR2_TX BIT(4)
- #define MT_CT_INFO_FROM_HOST BIT(7)
-
--#define MT_TXD_SIZE (8 * 4)
--
--#define MT_SDIO_TXD_SIZE (MT_TXD_SIZE + 8 * 4)
--#define MT_SDIO_TAIL_SIZE 8
--#define MT_SDIO_HDR_SIZE 4
--#define MT_USB_TAIL_SIZE 4
--
--#define MT_TXD0_Q_IDX GENMASK(31, 25)
--#define MT_TXD0_PKT_FMT GENMASK(24, 23)
--#define MT_TXD0_ETH_TYPE_OFFSET GENMASK(22, 16)
--#define MT_TXD0_TX_BYTES GENMASK(15, 0)
--
--#define MT_TXD1_LONG_FORMAT BIT(31)
--#define MT_TXD1_TGID BIT(30)
--#define MT_TXD1_OWN_MAC GENMASK(29, 24)
--#define MT_TXD1_AMSDU BIT(23)
--#define MT_TXD1_TID GENMASK(22, 20)
--#define MT_TXD1_HDR_PAD GENMASK(19, 18)
--#define MT_TXD1_HDR_FORMAT GENMASK(17, 16)
--#define MT_TXD1_HDR_INFO GENMASK(15, 11)
--#define MT_TXD1_ETH_802_3 BIT(15)
--#define MT_TXD1_VTA BIT(10)
--#define MT_TXD1_WLAN_IDX GENMASK(9, 0)
--
--#define MT_TXD2_FIX_RATE BIT(31)
--#define MT_TXD2_FIXED_RATE BIT(30)
--#define MT_TXD2_POWER_OFFSET GENMASK(29, 24)
--#define MT_TXD2_MAX_TX_TIME GENMASK(23, 16)
--#define MT_TXD2_FRAG GENMASK(15, 14)
--#define MT_TXD2_HTC_VLD BIT(13)
--#define MT_TXD2_DURATION BIT(12)
--#define MT_TXD2_BIP BIT(11)
--#define MT_TXD2_MULTICAST BIT(10)
--#define MT_TXD2_RTS BIT(9)
--#define MT_TXD2_SOUNDING BIT(8)
--#define MT_TXD2_NDPA BIT(7)
--#define MT_TXD2_NDP BIT(6)
--#define MT_TXD2_FRAME_TYPE GENMASK(5, 4)
--#define MT_TXD2_SUB_TYPE GENMASK(3, 0)
--
--#define MT_TXD3_SN_VALID BIT(31)
--#define MT_TXD3_PN_VALID BIT(30)
--#define MT_TXD3_SW_POWER_MGMT BIT(29)
--#define MT_TXD3_BA_DISABLE BIT(28)
--#define MT_TXD3_SEQ GENMASK(27, 16)
--#define MT_TXD3_REM_TX_COUNT GENMASK(15, 11)
--#define MT_TXD3_TX_COUNT GENMASK(10, 6)
--#define MT_TXD3_TIMING_MEASURE BIT(5)
--#define MT_TXD3_DAS BIT(4)
--#define MT_TXD3_EEOSP BIT(3)
--#define MT_TXD3_EMRD BIT(2)
--#define MT_TXD3_PROTECT_FRAME BIT(1)
--#define MT_TXD3_NO_ACK BIT(0)
--
--#define MT_TXD4_PN_LOW GENMASK(31, 0)
--
--#define MT_TXD5_PN_HIGH GENMASK(31, 16)
--#define MT_TXD5_MD BIT(15)
--#define MT_TXD5_ADD_BA BIT(14)
--#define MT_TXD5_TX_STATUS_HOST BIT(10)
--#define MT_TXD5_TX_STATUS_MCU BIT(9)
--#define MT_TXD5_TX_STATUS_FMT BIT(8)
--#define MT_TXD5_PID GENMASK(7, 0)
--
--#define MT_TXD6_TX_IBF BIT(31)
--#define MT_TXD6_TX_EBF BIT(30)
--#define MT_TXD6_TX_RATE GENMASK(29, 16)
--#define MT_TXD6_SGI GENMASK(15, 14)
--#define MT_TXD6_HELTF GENMASK(13, 12)
--#define MT_TXD6_LDPC BIT(11)
--#define MT_TXD6_SPE_ID_IDX BIT(10)
--#define MT_TXD6_ANT_ID GENMASK(7, 4)
--#define MT_TXD6_DYN_BW BIT(3)
--#define MT_TXD6_FIXED_BW BIT(2)
--#define MT_TXD6_BW GENMASK(1, 0)
--
--#define MT_TXD7_TXD_LEN GENMASK(31, 30)
--#define MT_TXD7_UDP_TCP_SUM BIT(29)
--#define MT_TXD7_IP_SUM BIT(28)
--
--#define MT_TXD7_TYPE GENMASK(21, 20)
--#define MT_TXD7_SUB_TYPE GENMASK(19, 16)
--
--#define MT_TXD7_PSE_FID GENMASK(27, 16)
--#define MT_TXD7_SPE_IDX GENMASK(15, 11)
--#define MT_TXD7_HW_AMSDU BIT(10)
--#define MT_TXD7_TX_TIME GENMASK(9, 0)
--
--#define MT_TXD8_L_TYPE GENMASK(5, 4)
--#define MT_TXD8_L_SUB_TYPE GENMASK(3, 0)
--
--#define MT_TX_RATE_STBC BIT(13)
--#define MT_TX_RATE_NSS GENMASK(12, 10)
--#define MT_TX_RATE_MODE GENMASK(9, 6)
--#define MT_TX_RATE_SU_EXT_TONE BIT(5)
--#define MT_TX_RATE_DCM BIT(4)
--#define MT_TX_RATE_IDX GENMASK(3, 0)
--
- #define MT_TXP_MAX_BUF_NUM 6
-
- struct mt7921_txp {
-@@ -325,15 +215,6 @@ struct mt7921_tx_free {
- /* will support this field in further revision */
- #define MT_TX_FREE_RATE GENMASK(13, 0)
-
--#define MT_TXS0_BW GENMASK(30, 29)
--#define MT_TXS0_TXS_FORMAT GENMASK(24, 23)
--#define MT_TXS0_ACK_ERROR_MASK GENMASK(18, 16)
--#define MT_TXS0_TX_RATE GENMASK(13, 0)
--
--#define MT_TXS2_WCID GENMASK(25, 16)
--
--#define MT_TXS3_PID GENMASK(31, 24)
--
- static inline struct mt7921_txp_common *
- mt7921_txwi_to_txp(struct mt76_dev *dev, struct mt76_txwi_cache *t)
- {
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-index a049bd35e0bc..d105e815fcd4 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-@@ -244,16 +244,6 @@ struct mt7921_txpwr {
- } data[TXPWR_MAX_NUM];
- };
-
--enum {
-- MT_LMAC_AC00,
-- MT_LMAC_AC01,
-- MT_LMAC_AC02,
-- MT_LMAC_AC03,
-- MT_LMAC_ALTX0 = 0x10,
-- MT_LMAC_BMC0,
-- MT_LMAC_BCN0,
--};
--
- static inline struct mt7921_phy *
- mt7921_hw_phy(struct ieee80211_hw *hw)
- {
---
-2.35.1
-
+++ /dev/null
-From e4cfaffd52b1756a4fdab00b30e525a8962df8de Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 26 Apr 2022 10:23:35 +0800
-Subject: mt76: mt7915: add support for 6G in-band discovery
-
-From: MeiChia Chiu <MeiChia.Chiu@mediatek.com>
-
-[ Upstream commit 869f06468e77b06795bc5855bd5b6b03c6cb147c ]
-
-Add offloading FILS discovery and unsolicited broadcast probe response support.
-
-Reviewed-by: Ryder Lee <ryder.lee@mediatek.com>
-Signed-off-by: MeiChia Chiu <MeiChia.Chiu@mediatek.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../net/wireless/mediatek/mt76/mt7915/init.c | 2 +
- .../net/wireless/mediatek/mt76/mt7915/mac.c | 17 +++--
- .../net/wireless/mediatek/mt76/mt7915/main.c | 8 +-
- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 75 ++++++++++++++++++-
- .../net/wireless/mediatek/mt76/mt7915/mcu.h | 15 +++-
- .../wireless/mediatek/mt76/mt7915/mt7915.h | 4 +-
- 6 files changed, 107 insertions(+), 14 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
-index 6d29366c5139..a03251a2960a 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
-@@ -351,6 +351,8 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HT);
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_VHT);
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HE);
-+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
-+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_FILS_DISCOVERY);
-
- if (!mdev->dev->of_node ||
- !of_property_read_bool(mdev->dev->of_node,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-index 45169a027fda..7873fdaf0373 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-@@ -1181,7 +1181,7 @@ mt7915_mac_tx_rate_val(struct mt76_phy *mphy, struct ieee80211_vif *vif,
-
- void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
-- struct ieee80211_key_conf *key, bool beacon)
-+ struct ieee80211_key_conf *key, u32 changed)
- {
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- struct ieee80211_vif *vif = info->control.vif;
-@@ -1192,6 +1192,10 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
- bool mcast = false;
- u16 tx_count = 15;
- u32 val;
-+ bool beacon = !!(changed & (BSS_CHANGED_BEACON |
-+ BSS_CHANGED_BEACON_ENABLED));
-+ bool inband_disc = !!(changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
-+ BSS_CHANGED_FILS_DISCOVERY));
-
- if (vif) {
- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-@@ -1204,7 +1208,10 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
- if (ext_phy && dev->mt76.phy2)
- mphy = dev->mt76.phy2;
-
-- if (beacon) {
-+ if (inband_disc) {
-+ p_fmt = MT_TX_TYPE_FW;
-+ q_idx = MT_LMAC_ALTX0;
-+ } else if (beacon) {
- p_fmt = MT_TX_TYPE_FW;
- q_idx = MT_LMAC_BCN0;
- } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) {
-@@ -1312,8 +1319,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- return id;
-
- pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
-- mt7915_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, pid, key,
-- false);
-+ mt7915_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, pid, key, 0);
-
- txp = (struct mt7915_txp *)(txwi + MT_TXD_SIZE);
- for (i = 0; i < nbuf; i++) {
-@@ -1923,7 +1929,8 @@ mt7915_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif)
- case NL80211_IFTYPE_MESH_POINT:
- case NL80211_IFTYPE_ADHOC:
- case NL80211_IFTYPE_AP:
-- mt7915_mcu_add_beacon(hw, vif, vif->bss_conf.enable_beacon);
-+ mt7915_mcu_add_beacon(hw, vif, vif->bss_conf.enable_beacon,
-+ BSS_CHANGED_BEACON_ENABLED);
- break;
- default:
- break;
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-index 187cf4ccd36e..d6d0a17c3730 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-@@ -630,8 +630,10 @@ static void mt7915_bss_info_changed(struct ieee80211_hw *hw,
- mt7915_update_bss_color(hw, vif, &info->he_bss_color);
-
- if (changed & (BSS_CHANGED_BEACON |
-- BSS_CHANGED_BEACON_ENABLED))
-- mt7915_mcu_add_beacon(hw, vif, info->enable_beacon);
-+ BSS_CHANGED_BEACON_ENABLED |
-+ BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
-+ BSS_CHANGED_FILS_DISCOVERY))
-+ mt7915_mcu_add_beacon(hw, vif, info->enable_beacon, changed);
-
- mutex_unlock(&dev->mt76.mutex);
- }
-@@ -644,7 +646,7 @@ mt7915_channel_switch_beacon(struct ieee80211_hw *hw,
- struct mt7915_dev *dev = mt7915_hw_dev(hw);
-
- mutex_lock(&dev->mt76.mutex);
-- mt7915_mcu_add_beacon(hw, vif, true);
-+ mt7915_mcu_add_beacon(hw, vif, true, BSS_CHANGED_BEACON);
- mutex_unlock(&dev->mt76.mutex);
- }
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-index 736c9c342baa..4bfb26e730eb 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-@@ -1892,6 +1892,7 @@ mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- u8 *buf;
- int len = sizeof(*cont) + MT_TXD_SIZE + skb->len;
-
-+ len = (len & 0x3) ? ((len | 0x3) + 1) : len;
- tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CONTENT,
- len, &bcn->sub_ntlv, &bcn->len);
-
-@@ -1910,7 +1911,7 @@ mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-
- buf = (u8 *)tlv + sizeof(*cont);
- mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
-- true);
-+ BSS_CHANGED_BEACON);
- memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
- }
-
-@@ -1992,8 +1993,71 @@ mt7915_mcu_beacon_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif,
- }
- }
-
--int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
-- struct ieee80211_vif *vif, int en)
-+static void
-+mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-+ struct sk_buff *rskb, struct bss_info_bcn *bcn,
-+ u32 changed)
-+{
-+#define OFFLOAD_TX_MODE_SU BIT(0)
-+#define OFFLOAD_TX_MODE_MU BIT(1)
-+ struct ieee80211_hw *hw = mt76_hw(dev);
-+ struct mt7915_phy *phy = mt7915_hw_phy(hw);
-+ struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-+ struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
-+ enum nl80211_band band = chandef->chan->band;
-+ struct mt76_wcid *wcid = &dev->mt76.global_wcid;
-+ struct bss_info_inband_discovery *discov;
-+ struct ieee80211_tx_info *info;
-+ struct sk_buff *skb = NULL;
-+ struct tlv *tlv;
-+ bool ext_phy = phy != &dev->phy;
-+ u8 *buf, interval;
-+ int len;
-+
-+ if (changed & BSS_CHANGED_FILS_DISCOVERY &&
-+ vif->bss_conf.fils_discovery.max_interval) {
-+ interval = vif->bss_conf.fils_discovery.max_interval;
-+ skb = ieee80211_get_fils_discovery_tmpl(hw, vif);
-+ } else if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP &&
-+ vif->bss_conf.unsol_bcast_probe_resp_interval) {
-+ interval = vif->bss_conf.unsol_bcast_probe_resp_interval;
-+ skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
-+ }
-+
-+ if (!skb)
-+ return;
-+
-+ info = IEEE80211_SKB_CB(skb);
-+ info->control.vif = vif;
-+ info->band = band;
-+
-+ if (ext_phy)
-+ info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
-+
-+ len = sizeof(*discov) + MT_TXD_SIZE + skb->len;
-+ len = (len & 0x3) ? ((len | 0x3) + 1) : len;
-+
-+ tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_DISCOV,
-+ len, &bcn->sub_ntlv, &bcn->len);
-+ discov = (struct bss_info_inband_discovery *)tlv;
-+ discov->tx_mode = OFFLOAD_TX_MODE_SU;
-+ /* 0: UNSOL PROBE RESP, 1: FILS DISCOV */
-+ discov->tx_type = !!(changed & BSS_CHANGED_FILS_DISCOVERY);
-+ discov->tx_interval = interval;
-+ discov->prob_rsp_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
-+ discov->enable = true;
-+
-+ buf = (u8 *)tlv + sizeof(*discov);
-+
-+ mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
-+ changed);
-+ memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
-+
-+ dev_kfree_skb(skb);
-+}
-+
-+int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-+ int en, u32 changed)
- {
- #define MAX_BEACON_SIZE 512
- struct mt7915_dev *dev = mt7915_hw_dev(hw);
-@@ -2044,6 +2108,11 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
- mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs);
- dev_kfree_skb(skb);
-
-+ if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP ||
-+ changed & BSS_CHANGED_FILS_DISCOVERY)
-+ mt7915_mcu_beacon_inband_discov(dev, vif, rskb,
-+ bcn, changed);
-+
- out:
- return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
- MCU_EXT_CMD(BSS_INFO_UPDATE), true);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
-index 960072a44222..2b5495bd1e20 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
-@@ -414,11 +414,23 @@ struct bss_info_bcn_cont {
- __le16 pkt_len;
- } __packed __aligned(4);
-
-+struct bss_info_inband_discovery {
-+ __le16 tag;
-+ __le16 len;
-+ u8 tx_type;
-+ u8 tx_mode;
-+ u8 tx_interval;
-+ u8 enable;
-+ __le16 rsv;
-+ __le16 prob_rsp_len;
-+} __packed __aligned(4);
-+
- enum {
- BSS_INFO_BCN_CSA,
- BSS_INFO_BCN_BCC,
- BSS_INFO_BCN_MBSSID,
- BSS_INFO_BCN_CONTENT,
-+ BSS_INFO_BCN_DISCOV,
- BSS_INFO_BCN_MAX
- };
-
-@@ -486,6 +498,7 @@ enum {
- #define MT7915_BEACON_UPDATE_SIZE (sizeof(struct sta_req_hdr) + \
- sizeof(struct bss_info_bcn_cntdwn) + \
- sizeof(struct bss_info_bcn_mbss) + \
-- sizeof(struct bss_info_bcn_cont))
-+ sizeof(struct bss_info_bcn_cont) + \
-+ sizeof(struct bss_info_inband_discovery))
-
- #endif
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-index 4b6eda958ef3..ff413fe1da5e 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-@@ -463,7 +463,7 @@ int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
- int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- struct cfg80211_he_bss_color *he_bss_color);
- int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-- int enable);
-+ int enable, u32 changed);
- int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- bool enable);
- int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
-@@ -550,7 +550,7 @@ void mt7915_mac_cca_stats_reset(struct mt7915_phy *phy);
- void mt7915_mac_enable_nf(struct mt7915_dev *dev, bool ext_phy);
- void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
-- struct ieee80211_key_conf *key, bool beacon);
-+ struct ieee80211_key_conf *key, u32 changed);
- void mt7915_mac_set_timing(struct mt7915_phy *phy);
- int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta);
---
-2.35.1
-
+++ /dev/null
-From 97c5577cb493dbe3f3ef0bf350695e52d9df9acd Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 20 Jun 2022 14:17:17 +0800
-Subject: mt76: mt7915: fix incorrect testmode ipg on band 1 caused by wmm_idx
-
-From: Shayne Chen <shayne.chen@mediatek.com>
-
-[ Upstream commit 6e744cfeee02c2d8676eb55d5b3720808812f41f ]
-
-Fix the issue that the measured inter packet gap didn't fit its
-setting value.
-
-Fixes: c2d3b1926f30 ("mt76: mt7915: add support for ipg in testmode")
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/wireless/mediatek/mt76/mt7915/testmode.c | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/testmode.c b/drivers/net/wireless/mediatek/mt76/mt7915/testmode.c
-index 20f63644e929..0f5c1e5bffe1 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/testmode.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/testmode.c
-@@ -168,13 +168,14 @@ mt7915_tm_set_tam_arb(struct mt7915_phy *phy, bool enable, bool mu)
- }
-
- static int
--mt7915_tm_set_wmm_qid(struct mt7915_dev *dev, u8 qid, u8 aifs, u8 cw_min,
-+mt7915_tm_set_wmm_qid(struct mt7915_phy *phy, u8 qid, u8 aifs, u8 cw_min,
- u16 cw_max, u16 txop)
- {
-+ struct mt7915_vif *mvif = (struct mt7915_vif *)phy->monitor_vif->drv_priv;
- struct mt7915_mcu_tx req = { .total = 1 };
- struct edca *e = &req.edca[0];
-
-- e->queue = qid;
-+ e->queue = qid + mvif->mt76.wmm_idx * MT76_CONNAC_MAX_WMM_SETS;
- e->set = WMM_PARAM_SET;
-
- e->aifs = aifs;
-@@ -182,7 +183,7 @@ mt7915_tm_set_wmm_qid(struct mt7915_dev *dev, u8 qid, u8 aifs, u8 cw_min,
- e->cw_max = cpu_to_le16(cw_max);
- e->txop = cpu_to_le16(txop);
-
-- return mt7915_mcu_update_edca(dev, &req);
-+ return mt7915_mcu_update_edca(phy->dev, &req);
- }
-
- static int
-@@ -244,7 +245,7 @@ mt7915_tm_set_ipg_params(struct mt7915_phy *phy, u32 ipg, u8 mode)
-
- mt7915_tm_set_slot_time(phy, slot_time, sifs);
-
-- return mt7915_tm_set_wmm_qid(dev,
-+ return mt7915_tm_set_wmm_qid(phy,
- mt76_connac_lmac_mapping(IEEE80211_AC_BE),
- aifsn, cw, cw, 0);
- }
---
-2.35.1
-
+++ /dev/null
-From ca4fb9b60c0b6bb52c2bdd4b3a3800096b9a4c0b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 7 Jun 2022 11:28:38 +0200
-Subject: mt76: mt7915: rely on mt76_dev in mt7915_mac_write_txwi signature
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit d502e30020b85857ead0f9d392d24dba8c0f44cb ]
-
-This is a preliminary patch to share txwi configuration code.
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../net/wireless/mediatek/mt76/mt7915/mac.c | 23 +++++++++----------
- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 4 ++--
- .../wireless/mediatek/mt76/mt7915/mt7915.h | 2 +-
- 3 files changed, 14 insertions(+), 15 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-index 7873fdaf0373..d65a873739af 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
-@@ -1014,8 +1014,8 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
- }
-
- static void
--mt7915_mac_write_txwi_8023(struct mt7915_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct mt76_wcid *wcid)
-+mt7915_mac_write_txwi_8023(__le32 *txwi, struct sk_buff *skb,
-+ struct mt76_wcid *wcid)
- {
-
- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-@@ -1054,9 +1054,8 @@ mt7915_mac_write_txwi_8023(struct mt7915_dev *dev, __le32 *txwi,
- }
-
- static void
--mt7915_mac_write_txwi_80211(struct mt7915_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct ieee80211_key_conf *key,
-- bool *mcast)
-+mt7915_mac_write_txwi_80211(__le32 *txwi, struct sk_buff *skb,
-+ struct ieee80211_key_conf *key, bool *mcast)
- {
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
-@@ -1179,13 +1178,13 @@ mt7915_mac_tx_rate_val(struct mt76_phy *mphy, struct ieee80211_vif *vif,
- FIELD_PREP(MT_TX_RATE_MODE, mode);
- }
-
--void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
-+void mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
- struct ieee80211_key_conf *key, u32 changed)
- {
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- struct ieee80211_vif *vif = info->control.vif;
-- struct mt76_phy *mphy = &dev->mphy;
-+ struct mt76_phy *mphy = &dev->phy;
- bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY;
- u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0, band_idx = 0;
- bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
-@@ -1205,8 +1204,8 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
- band_idx = mvif->mt76.band_idx;
- }
-
-- if (ext_phy && dev->mt76.phy2)
-- mphy = dev->mt76.phy2;
-+ if (ext_phy && dev->phy2)
-+ mphy = dev->phy2;
-
- if (inband_disc) {
- p_fmt = MT_TX_TYPE_FW;
-@@ -1258,9 +1257,9 @@ void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
- txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
-
- if (is_8023)
-- mt7915_mac_write_txwi_8023(dev, txwi, skb, wcid);
-+ mt7915_mac_write_txwi_8023(txwi, skb, wcid);
- else
-- mt7915_mac_write_txwi_80211(dev, txwi, skb, key, &mcast);
-+ mt7915_mac_write_txwi_80211(txwi, skb, key, &mcast);
-
- if (txwi[2] & cpu_to_le32(MT_TXD2_FIX_RATE)) {
- u16 rate = mt7915_mac_tx_rate_val(mphy, vif, beacon, mcast);
-@@ -1319,7 +1318,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- return id;
-
- pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
-- mt7915_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, pid, key, 0);
-+ mt7915_mac_write_txwi(mdev, txwi_ptr, tx_info->skb, wcid, pid, key, 0);
-
- txp = (struct mt7915_txp *)(txwi + MT_TXD_SIZE);
- for (i = 0; i < nbuf; i++) {
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-index 4bfb26e730eb..0ef3952bc33c 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
-@@ -1910,7 +1910,7 @@ mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
- }
-
- buf = (u8 *)tlv + sizeof(*cont);
-- mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
-+ mt7915_mac_write_txwi(&dev->mt76, (__le32 *)buf, skb, wcid, 0, NULL,
- BSS_CHANGED_BEACON);
- memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
- }
-@@ -2049,7 +2049,7 @@ mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vi
-
- buf = (u8 *)tlv + sizeof(*discov);
-
-- mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
-+ mt7915_mac_write_txwi(&dev->mt76, (__le32 *)buf, skb, wcid, 0, NULL,
- changed);
- memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-index ff413fe1da5e..64b4c3c09d33 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
-@@ -548,7 +548,7 @@ bool mt7915_mac_wtbl_update(struct mt7915_dev *dev, int idx, u32 mask);
- void mt7915_mac_reset_counters(struct mt7915_phy *phy);
- void mt7915_mac_cca_stats_reset(struct mt7915_phy *phy);
- void mt7915_mac_enable_nf(struct mt7915_dev *dev, bool ext_phy);
--void mt7915_mac_write_txwi(struct mt7915_dev *dev, __le32 *txwi,
-+void mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid, int pid,
- struct ieee80211_key_conf *key, u32 changed);
- void mt7915_mac_set_timing(struct mt7915_phy *phy);
---
-2.35.1
-
+++ /dev/null
-From cb9d7e965884f88681508d5d4b131768d3fd8188 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 7 Apr 2022 02:29:14 +0800
-Subject: mt76: mt7921: Add AP mode support
-
-From: Sean Wang <sean.wang@mediatek.com>
-
-[ Upstream commit 116c69603b01f2d6e4499ca5d535f5b71c52052c ]
-
-add AP mode support to mt7921 that can work for mt7921[e,s,u]
-with the common code.
-
-Tested-by: Deren Wu <deren.wu@mediatek.com>
-Tested-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Sean Wang <sean.wang@mediatek.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../net/wireless/mediatek/mt76/mt7921/init.c | 11 ++-
- .../net/wireless/mediatek/mt76/mt7921/mac.c | 9 +++
- .../net/wireless/mediatek/mt76/mt7921/main.c | 45 +++++++++++
- .../net/wireless/mediatek/mt76/mt7921/mcu.c | 79 ++++++++++++++++++-
- .../wireless/mediatek/mt76/mt7921/mt7921.h | 4 +
- 5 files changed, 146 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
-index 37453e1c136f..0a688c6545b3 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
-@@ -11,6 +11,10 @@ static const struct ieee80211_iface_limit if_limits[] = {
- {
- .max = MT7921_MAX_INTERFACES,
- .types = BIT(NL80211_IFTYPE_STATION)
-+ },
-+ {
-+ .max = 1,
-+ .types = BIT(NL80211_IFTYPE_AP)
- }
- };
-
-@@ -64,7 +68,8 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
- wiphy->iface_combinations = if_comb;
- wiphy->flags &= ~(WIPHY_FLAG_IBSS_RSN | WIPHY_FLAG_4ADDR_AP |
- WIPHY_FLAG_4ADDR_STATION);
-- wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
-+ wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
-+ BIT(NL80211_IFTYPE_AP);
- wiphy->n_iface_combinations = ARRAY_SIZE(if_comb);
- wiphy->max_scan_ie_len = MT76_CONNAC_SCAN_IE_LEN;
- wiphy->max_scan_ssids = 4;
-@@ -80,6 +85,10 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
- wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
- NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
- wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_SET_SCAN_DWELL);
-+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_LEGACY);
-+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HT);
-+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_VHT);
-+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HE);
-
- ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
- ieee80211_hw_set(hw, HAS_RATE_CONTROL);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-index c5350e7a11e6..ac11e8b28f13 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-@@ -1363,12 +1363,21 @@ mt7921_vif_connect_iter(void *priv, u8 *mac,
- {
- struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
- struct mt7921_dev *dev = mvif->phy->dev;
-+ struct ieee80211_hw *hw = mt76_hw(dev);
-
- if (vif->type == NL80211_IFTYPE_STATION)
- ieee80211_disconnect(vif, true);
-
- mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, true);
- mt7921_mcu_set_tx(dev, vif);
-+
-+ if (vif->type == NL80211_IFTYPE_AP) {
-+ mt76_connac_mcu_uni_add_bss(dev->phy.mt76, vif, &mvif->sta.wcid,
-+ true);
-+ mt7921_mcu_sta_update(dev, NULL, vif, true,
-+ MT76_STA_INFO_STATE_NONE);
-+ mt7921_mcu_uni_add_beacon_offload(dev, hw, vif, true);
-+ }
- }
-
- /* system error recovery */
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-index 9b9e80f56eda..d7e2bd605117 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
-@@ -53,6 +53,7 @@ mt7921_init_he_caps(struct mt7921_phy *phy, enum nl80211_band band,
-
- switch (i) {
- case NL80211_IFTYPE_STATION:
-+ case NL80211_IFTYPE_AP:
- break;
- default:
- continue;
-@@ -86,6 +87,23 @@ mt7921_init_he_caps(struct mt7921_phy *phy, enum nl80211_band band,
- IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
-
- switch (i) {
-+ case NL80211_IFTYPE_AP:
-+ he_cap_elem->mac_cap_info[2] |=
-+ IEEE80211_HE_MAC_CAP2_BSR;
-+ he_cap_elem->mac_cap_info[4] |=
-+ IEEE80211_HE_MAC_CAP4_BQR;
-+ he_cap_elem->mac_cap_info[5] |=
-+ IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX;
-+ he_cap_elem->phy_cap_info[3] |=
-+ IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
-+ IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
-+ he_cap_elem->phy_cap_info[6] |=
-+ IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
-+ IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
-+ he_cap_elem->phy_cap_info[9] |=
-+ IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
-+ IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
-+ break;
- case NL80211_IFTYPE_STATION:
- he_cap_elem->mac_cap_info[1] |=
- IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US;
-@@ -635,6 +653,20 @@ static void mt7921_bss_info_changed(struct ieee80211_hw *hw,
- }
- }
-
-+ if (changed & BSS_CHANGED_BEACON_ENABLED && info->enable_beacon) {
-+ struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
-+
-+ mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
-+ true);
-+ mt7921_mcu_sta_update(dev, NULL, vif, true,
-+ MT76_STA_INFO_STATE_NONE);
-+ }
-+
-+ if (changed & (BSS_CHANGED_BEACON |
-+ BSS_CHANGED_BEACON_ENABLED))
-+ mt7921_mcu_uni_add_beacon_offload(dev, hw, vif,
-+ info->enable_beacon);
-+
- /* ensure that enable txcmd_mode after bss_info */
- if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
- mt7921_mcu_set_tx(dev, vif);
-@@ -1395,6 +1427,18 @@ static int mt7921_set_sar_specs(struct ieee80211_hw *hw,
- return err;
- }
-
-+static void
-+mt7921_channel_switch_beacon(struct ieee80211_hw *hw,
-+ struct ieee80211_vif *vif,
-+ struct cfg80211_chan_def *chandef)
-+{
-+ struct mt7921_dev *dev = mt7921_hw_dev(hw);
-+
-+ mt7921_mutex_acquire(dev);
-+ mt7921_mcu_uni_add_beacon_offload(dev, hw, vif, true);
-+ mt7921_mutex_release(dev);
-+}
-+
- const struct ieee80211_ops mt7921_ops = {
- .tx = mt7921_tx,
- .start = mt7921_start,
-@@ -1413,6 +1457,7 @@ const struct ieee80211_ops mt7921_ops = {
- .set_rts_threshold = mt7921_set_rts_threshold,
- .wake_tx_queue = mt76_wake_tx_queue,
- .release_buffered_frames = mt76_release_buffered_frames,
-+ .channel_switch_beacon = mt7921_channel_switch_beacon,
- .get_txpower = mt76_get_txpower,
- .get_stats = mt7921_get_stats,
- .get_et_sset_count = mt7921_get_et_sset_count,
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-index 2a609b25561c..b1ce15cea9e0 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-@@ -248,7 +248,8 @@ mt7921_mcu_connection_loss_iter(void *priv, u8 *mac,
- if (mvif->idx != event->bss_idx)
- return;
-
-- if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
-+ if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER) ||
-+ vif->type != NL80211_IFTYPE_STATION)
- return;
-
- ieee80211_connection_loss(vif);
-@@ -1167,3 +1168,79 @@ int mt7921_mcu_set_sniffer(struct mt7921_dev *dev, struct ieee80211_vif *vif,
- return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(SNIFFER), &req, sizeof(req),
- true);
- }
-+
-+int
-+mt7921_mcu_uni_add_beacon_offload(struct mt7921_dev *dev,
-+ struct ieee80211_hw *hw,
-+ struct ieee80211_vif *vif,
-+ bool enable)
-+{
-+ struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
-+ struct mt76_wcid *wcid = &dev->mt76.global_wcid;
-+ struct ieee80211_mutable_offsets offs;
-+ struct {
-+ struct req_hdr {
-+ u8 bss_idx;
-+ u8 pad[3];
-+ } __packed hdr;
-+ struct bcn_content_tlv {
-+ __le16 tag;
-+ __le16 len;
-+ __le16 tim_ie_pos;
-+ __le16 csa_ie_pos;
-+ __le16 bcc_ie_pos;
-+ /* 0: disable beacon offload
-+ * 1: enable beacon offload
-+ * 2: update probe respond offload
-+ */
-+ u8 enable;
-+ /* 0: legacy format (TXD + payload)
-+ * 1: only cap field IE
-+ */
-+ u8 type;
-+ __le16 pkt_len;
-+ u8 pkt[512];
-+ } __packed beacon_tlv;
-+ } req = {
-+ .hdr = {
-+ .bss_idx = mvif->mt76.idx,
-+ },
-+ .beacon_tlv = {
-+ .tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
-+ .len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
-+ .enable = enable,
-+ },
-+ };
-+ struct sk_buff *skb;
-+
-+ if (!enable)
-+ goto out;
-+
-+ skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs);
-+ if (!skb)
-+ return -EINVAL;
-+
-+ if (skb->len > 512 - MT_TXD_SIZE) {
-+ dev_err(dev->mt76.dev, "beacon size limit exceed\n");
-+ dev_kfree_skb(skb);
-+ return -EINVAL;
-+ }
-+
-+ mt7921_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
-+ wcid, NULL, 0, true);
-+ memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
-+ req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
-+ req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
-+
-+ if (offs.cntdwn_counter_offs[0]) {
-+ u16 csa_offs;
-+
-+ csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
-+ req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
-+ }
-+ dev_kfree_skb(skb);
-+
-+out:
-+ return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
-+ &req, sizeof(req), true);
-+}
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-index 7690364bc079..d497a7e59a29 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-@@ -470,4 +470,8 @@ int mt7921u_wfsys_reset(struct mt7921_dev *dev);
- int mt7921u_dma_init(struct mt7921_dev *dev);
- int mt7921u_init_reset(struct mt7921_dev *dev);
- int mt7921u_mac_reset(struct mt7921_dev *dev);
-+int mt7921_mcu_uni_add_beacon_offload(struct mt7921_dev *dev,
-+ struct ieee80211_hw *hw,
-+ struct ieee80211_vif *vif,
-+ bool enable);
- #endif
---
-2.35.1
-
+++ /dev/null
-From bdec8b3e32716c381149c169a100b932f420a779 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 7 Jun 2022 11:28:37 +0200
-Subject: mt76: mt7921: rely on mt76_dev in mt7921_mac_write_txwi signature
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit e00b3e407efeed81dc30a72e4041ff57bf7068d5 ]
-
-This is a preliminary patch to share txwi configuration code.
-
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- .../net/wireless/mediatek/mt76/mt7921/mac.c | 23 +++++++++----------
- .../net/wireless/mediatek/mt76/mt7921/mcu.c | 2 +-
- .../wireless/mediatek/mt76/mt7921/mt7921.h | 2 +-
- .../wireless/mediatek/mt76/mt7921/pci_mac.c | 2 +-
- 4 files changed, 14 insertions(+), 15 deletions(-)
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-index ac11e8b28f13..3ae7989c8500 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c
-@@ -809,8 +809,8 @@ mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
- }
-
- static void
--mt7921_mac_write_txwi_8023(struct mt7921_dev *dev, __le32 *txwi,
-- struct sk_buff *skb, struct mt76_wcid *wcid)
-+mt7921_mac_write_txwi_8023(__le32 *txwi, struct sk_buff *skb,
-+ struct mt76_wcid *wcid)
- {
- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
- u8 fc_type, fc_stype;
-@@ -848,7 +848,7 @@ mt7921_mac_write_txwi_8023(struct mt7921_dev *dev, __le32 *txwi,
- }
-
- static void
--mt7921_mac_write_txwi_80211(struct mt7921_dev *dev, __le32 *txwi,
-+mt7921_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct ieee80211_key_conf *key)
- {
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-@@ -920,7 +920,7 @@ mt7921_mac_write_txwi_80211(struct mt7921_dev *dev, __le32 *txwi,
- txwi[7] &= ~cpu_to_le32(MT_TXD7_HW_AMSDU);
- }
-
-- if (mt76_is_mmio(&dev->mt76)) {
-+ if (mt76_is_mmio(dev)) {
- val = FIELD_PREP(MT_TXD7_TYPE, fc_type) |
- FIELD_PREP(MT_TXD7_SUB_TYPE, fc_stype);
- txwi[7] |= cpu_to_le32(val);
-@@ -931,17 +931,16 @@ mt7921_mac_write_txwi_80211(struct mt7921_dev *dev, __le32 *txwi,
- }
- }
-
--void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
-+void mt7921_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid,
- struct ieee80211_key_conf *key, int pid,
- bool beacon)
- {
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- struct ieee80211_vif *vif = info->control.vif;
-- struct mt76_phy *mphy = &dev->mphy;
-+ struct mt76_phy *mphy = &dev->phy;
- u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0;
-- bool is_mmio = mt76_is_mmio(&dev->mt76);
-- u32 sz_txd = is_mmio ? MT_TXD_SIZE : MT_SDIO_TXD_SIZE;
-+ u32 sz_txd = mt76_is_mmio(dev) ? MT_TXD_SIZE : MT_SDIO_TXD_SIZE;
- bool is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
- u16 tx_count = 15;
- u32 val;
-@@ -957,10 +956,10 @@ void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
- p_fmt = MT_TX_TYPE_FW;
- q_idx = MT_LMAC_BCN0;
- } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) {
-- p_fmt = is_mmio ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-+ p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
- q_idx = MT_LMAC_ALTX0;
- } else {
-- p_fmt = is_mmio ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-+ p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
- q_idx = wmm_idx * MT7921_MAX_WMM_SETS +
- mt76_connac_lmac_mapping(skb_get_queue_mapping(skb));
- }
-@@ -995,7 +994,7 @@ void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
- txwi[7] = wcid->amsdu ? cpu_to_le32(MT_TXD7_HW_AMSDU) : 0;
-
- if (is_8023)
-- mt7921_mac_write_txwi_8023(dev, txwi, skb, wcid);
-+ mt7921_mac_write_txwi_8023(txwi, skb, wcid);
- else
- mt7921_mac_write_txwi_80211(dev, txwi, skb, key);
-
-@@ -1646,7 +1645,7 @@ mt7921_usb_sdio_write_txwi(struct mt7921_dev *dev, struct mt76_wcid *wcid,
- __le32 *txwi = (__le32 *)(skb->data - MT_SDIO_TXD_SIZE);
-
- memset(txwi, 0, MT_SDIO_TXD_SIZE);
-- mt7921_mac_write_txwi(dev, txwi, skb, wcid, key, pid, false);
-+ mt7921_mac_write_txwi(&dev->mt76, txwi, skb, wcid, key, pid, false);
- skb_push(skb, MT_SDIO_TXD_SIZE);
- }
-
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-index b1ce15cea9e0..c2245be657d4 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
-@@ -1226,7 +1226,7 @@ mt7921_mcu_uni_add_beacon_offload(struct mt7921_dev *dev,
- return -EINVAL;
- }
-
-- mt7921_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
-+ mt7921_mac_write_txwi(&dev->mt76, (__le32 *)(req.beacon_tlv.pkt), skb,
- wcid, NULL, 0, true);
- memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
- req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-index d497a7e59a29..a049bd35e0bc 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
-@@ -421,7 +421,7 @@ int mt7921_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- void *data, int len);
- int mt7921_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- struct netlink_callback *cb, void *data, int len);
--void mt7921_mac_write_txwi(struct mt7921_dev *dev, __le32 *txwi,
-+void mt7921_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
- struct sk_buff *skb, struct mt76_wcid *wcid,
- struct ieee80211_key_conf *key, int pid,
- bool beacon);
-diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
-index 5ca14dbbdd26..f261cbfae2f3 100644
---- a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
-@@ -72,7 +72,7 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- }
-
- pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
-- mt7921_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
-+ mt7921_mac_write_txwi(mdev, txwi_ptr, tx_info->skb, wcid, key,
- pid, false);
-
- txp = (struct mt7921_txp_common *)(txwi + MT_TXD_SIZE);
---
-2.35.1
-