* [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks
@ 2026-02-19 0:39 sean.wang
2026-02-19 0:39 ` [PATCH 02/11] wifi: mt76: mt7921: use mt76_for_each_q_rx() in reset path sean.wang
` (10 more replies)
0 siblings, 11 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:39 UTC (permalink / raw)
To: nbd, lorenzo.bianconi; +Cc: linux-wireless, linux-mediatek, Sean Wang
From: Sean Wang <sean.wang@mediatek.com>
Unify all per-chip conditionals under the new is_connac2() helper. This
avoids confusion caused by the previous is_mt7921() check, which
implicitly covered multiple connac2 chipsets and no longer reflected its
actual scope. This is a clean-up only change with no functional impact.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
.../net/wireless/mediatek/mt76/mt76_connac.h | 2 +-
.../wireless/mediatek/mt76/mt76_connac_mac.c | 16 ++++++------
.../wireless/mediatek/mt76/mt76_connac_mcu.c | 26 +++++++++----------
.../wireless/mediatek/mt76/mt76_connac_mcu.h | 2 +-
.../net/wireless/mediatek/mt76/mt792x_core.c | 2 +-
.../net/wireless/mediatek/mt76/mt792x_dma.c | 2 +-
6 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
index 813d61bffc2c..02bea67d37c3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
@@ -187,7 +187,7 @@ static inline bool is_mt7922(struct mt76_dev *dev)
return mt76_chip(dev) == 0x7922;
}
-static inline bool is_mt7921(struct mt76_dev *dev)
+static inline bool is_connac2(struct mt76_dev *dev)
{
return mt76_chip(dev) == 0x7961 || is_mt7922(dev) || is_mt7920(dev);
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
index 4ef44514d48d..e76f6e28b7f0 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
@@ -173,7 +173,7 @@ void mt76_connac_write_hw_txp(struct mt76_dev *dev,
txp->msdu_id[0] = cpu_to_le16(id | MT_MSDU_ID_VALID);
- if (is_mt7663(dev) || is_mt7921(dev) || is_mt7925(dev))
+ if (is_mt7663(dev) || is_connac2(dev) || is_mt7925(dev))
last_mask = MT_TXD_LEN_LAST;
else
last_mask = MT_TXD_LEN_AMSDU_LAST |
@@ -217,7 +217,7 @@ mt76_connac_txp_skb_unmap_hw(struct mt76_dev *dev,
u32 last_mask;
int i;
- if (is_mt7663(dev) || is_mt7921(dev) || is_mt7925(dev))
+ if (is_mt7663(dev) || is_connac2(dev) || is_mt7925(dev))
last_mask = MT_TXD_LEN_LAST;
else
last_mask = MT_TXD_LEN_MSDU_LAST;
@@ -309,7 +309,7 @@ u16 mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy,
chandef = mvif->ctx ? &mvif->ctx->def : &mphy->chandef;
band = chandef->chan->band;
- if (is_mt7921(mphy->dev)) {
+ if (is_connac2(mphy->dev)) {
rateidx = ffs(conf->basic_rates) - 1;
goto legacy;
}
@@ -547,7 +547,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
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))
+ if (!is_connac2(dev))
val |= MT_TXD1_VTA;
if (phy_idx || band_idx)
val |= MT_TXD1_TGID;
@@ -556,7 +556,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
txwi[2] = 0;
val = FIELD_PREP(MT_TXD3_REM_TX_COUNT, 15);
- if (!is_mt7921(dev))
+ if (!is_connac2(dev))
val |= MT_TXD3_SW_POWER_MGMT;
if (key)
val |= MT_TXD3_PROTECT_FRAME;
@@ -598,7 +598,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
txwi[6] |= cpu_to_le32(val);
txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
- if (!is_mt7921(dev)) {
+ if (!is_connac2(dev)) {
u8 spe_idx = mt76_connac_spe_idx(mphy->antenna_mask);
if (!spe_idx)
@@ -830,7 +830,7 @@ mt76_connac2_mac_decode_he_mu_radiotap(struct mt76_dev *dev, struct sk_buff *skb
};
struct ieee80211_radiotap_he_mu *he_mu;
- if (is_mt7921(dev)) {
+ if (is_connac2(dev)) {
mu_known.flags1 |= HE_BITS(MU_FLAGS1_SIG_B_COMP_KNOWN);
mu_known.flags2 |= HE_BITS(MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN);
}
@@ -1046,7 +1046,7 @@ int mt76_connac2_mac_fill_rx_rate(struct mt76_dev *dev,
stbc = FIELD_GET(MT_PRXV_HT_STBC, v0);
gi = FIELD_GET(MT_PRXV_HT_SGI, v0);
*mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
- if (is_mt7921(dev))
+ if (is_connac2(dev))
dcm = !!(idx & MT_PRXV_TX_DCM);
else
dcm = FIELD_GET(MT_PRXV_DCM, v0);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index 3f583e2a1dc1..d7fbf3454bb8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -65,7 +65,7 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
int cmd;
if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
- (is_mt7921(dev) && addr == 0x900000) ||
+ (is_connac2(dev) && addr == 0x900000) ||
(is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
(is_mt799x(dev) && addr == 0x900000))
cmd = MCU_CMD(PATCH_START_REQ);
@@ -402,7 +402,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
switch (vif->type) {
case NL80211_IFTYPE_MESH_POINT:
case NL80211_IFTYPE_AP:
- if (vif->p2p && !is_mt7921(dev))
+ if (vif->p2p && !is_connac2(dev))
conn_type = CONNECTION_P2P_GC;
else
conn_type = CONNECTION_INFRA_STA;
@@ -410,7 +410,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
basic->aid = cpu_to_le16(link_sta->sta->aid);
break;
case NL80211_IFTYPE_STATION:
- if (vif->p2p && !is_mt7921(dev))
+ if (vif->p2p && !is_connac2(dev))
conn_type = CONNECTION_P2P_GO;
else
conn_type = CONNECTION_INFRA_AP;
@@ -874,7 +874,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
struct sta_rec_vht *vht;
int len;
- len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
+ len = is_connac2(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
vht = (struct sta_rec_vht *)tlv;
vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
@@ -885,7 +885,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
/* starec uapsd */
mt76_connac_mcu_sta_uapsd(skb, vif, sta);
- if (!is_mt7921(dev))
+ if (!is_connac2(dev))
return;
if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
@@ -1778,7 +1778,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
req->ssid_type_ext = n_ssids ? BIT(0) : 0;
req->ssids_num = n_ssids;
- duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
+ duration = is_connac2(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
/* increase channel time for passive scan */
if (!sreq->n_ssids)
duration *= 2;
@@ -1821,7 +1821,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
req->ies_len = cpu_to_le16(sreq->ie_len);
}
- if (is_mt7921(phy->dev))
+ if (is_connac2(phy->dev))
req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
memcpy(req->bssid, sreq->bssid, ETH_ALEN);
@@ -1897,7 +1897,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
get_random_mask_addr(addr, sreq->mac_addr,
sreq->mac_addr_mask);
}
- if (is_mt7921(phy->dev)) {
+ if (is_connac2(phy->dev)) {
req->mt7921.bss_idx = mvif->idx;
req->mt7921.delay = cpu_to_le32(sreq->delay);
}
@@ -2037,7 +2037,7 @@ mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
struct mt76_power_limits *limits,
enum nl80211_band band)
{
- int max_power = is_mt7921(dev) ? 127 : 63;
+ int max_power = is_connac2(dev) ? 127 : 63;
int i, offset = sizeof(limits->cck);
memset(sku, max_power, MT_SKU_POWER_LIMIT);
@@ -2065,7 +2065,7 @@ mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
offset += 12;
}
- if (!is_mt7921(dev))
+ if (!is_connac2(dev))
return;
/* he */
@@ -2121,7 +2121,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
enum nl80211_band band)
{
struct mt76_dev *dev = phy->dev;
- int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
+ int sku_len, batch_len = is_connac2(dev) ? 8 : 16;
static const u8 chan_list_2ghz[] = {
1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14
@@ -2162,7 +2162,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
if (!limits)
return -ENOMEM;
- sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
+ sku_len = is_connac2(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
tx_power = 2 * phy->hw->conf.power_level;
if (!tx_power)
tx_power = 127;
@@ -3080,7 +3080,7 @@ static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info)
{
u32 mode = DL_MODE_NEED_RSP;
- if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
+ if ((!is_connac2(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
return mode;
switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
index f44977f9093d..1ef25385f3c6 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
@@ -1866,7 +1866,7 @@ mt76_connac_mcu_gen_dl_mode(struct mt76_dev *dev, u8 feature_set, bool is_wa)
ret |= feature_set & FW_FEATURE_SET_ENCRYPT ?
DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV : 0;
- if (is_mt7921(dev) || is_mt7925(dev))
+ if (is_connac2(dev) || is_mt7925(dev))
ret |= feature_set & FW_FEATURE_ENCRY_MODE ?
DL_CONFIG_ENCRY_MODE_SEL : 0;
ret |= FIELD_PREP(DL_MODE_KEY_IDX,
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
index f318a53e4deb..2142fcc4ae27 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
@@ -151,7 +151,7 @@ void mt792x_stop(struct ieee80211_hw *hw, bool suspend)
cancel_work_sync(&dev->reset_work);
mt76_connac_free_pending_tx_skbs(&dev->pm, NULL);
- if (is_mt7921(&dev->mt76)) {
+ if (is_connac2(&dev->mt76)) {
mt792x_mutex_acquire(dev);
mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, false, false);
mt792x_mutex_release(dev);
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
index 1ddec7788b66..34f07bd3097d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
@@ -356,7 +356,7 @@ EXPORT_SYMBOL_GPL(mt792x_poll_rx);
int mt792x_wfsys_reset(struct mt792x_dev *dev)
{
- u32 addr = is_mt7921(&dev->mt76) ? 0x18000140 : 0x7c000140;
+ u32 addr = is_connac2(&dev->mt76) ? 0x18000140 : 0x7c000140;
mt76_clear(dev, addr, WFSYS_SW_RST_B);
msleep(50);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 02/11] wifi: mt76: mt7921: use mt76_for_each_q_rx() in reset path
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
@ 2026-02-19 0:39 ` sean.wang
2026-02-19 0:39 ` [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy sean.wang
` (9 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:39 UTC (permalink / raw)
To: nbd, lorenzo.bianconi; +Cc: linux-wireless, linux-mediatek, Sean Wang
From: Sean Wang <sean.wang@mediatek.com>
Replace explicit napi_disable() calls for RX queues with
mt76_for_each_q_rx() in mt7921e_mac_reset().
This removes hardcoded queue indices and disables all configured
RX queues during reset.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
index 5ec084432ae3..0db7acb3a637 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci_mac.c
@@ -71,9 +71,9 @@ int mt7921e_mac_reset(struct mt792x_dev *dev)
mt76_txq_schedule_all(&dev->mphy);
mt76_worker_disable(&dev->mt76.tx_worker);
- napi_disable(&dev->mt76.napi[MT_RXQ_MAIN]);
- napi_disable(&dev->mt76.napi[MT_RXQ_MCU]);
- napi_disable(&dev->mt76.napi[MT_RXQ_MCU_WA]);
+ mt76_for_each_q_rx(&dev->mt76, i) {
+ napi_disable(&dev->mt76.napi[i]);
+ }
napi_disable(&dev->mt76.tx_napi);
mt76_connac2_tx_token_put(&dev->mt76);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
2026-02-19 0:39 ` [PATCH 02/11] wifi: mt76: mt7921: use mt76_for_each_q_rx() in reset path sean.wang
@ 2026-02-19 0:39 ` sean.wang
2026-02-20 10:09 ` Philip Müller
2026-02-19 0:40 ` [PATCH 04/11] wifi: mt76: mt7921: add MT7902e DMA layout support sean.wang
` (8 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:39 UTC (permalink / raw)
To: nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
From: Sean Wang <sean.wang@mediatek.com>
MT7902 PCIe requires a different wm2_complete_mask value, so introduce a
mutable per-device copy of the default irq_map and override the field
only for this chip. Other devices continue using the shared const
template.
This is a prerequisite patch before enabling MT7902 PCIe support.
Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
index 65c7fe671137..5f857a21f362 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
@@ -327,6 +327,20 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
dev->hif_ops = &mt7921_pcie_ops;
dev->irq_map = &irq_map;
mt76_mmio_init(&dev->mt76, regs);
+
+ if (id->device == 0x7902) {
+ struct mt792x_irq_map *map;
+
+ /* MT7902 needs a mutable copy because wm2_complete_mask differs */
+ map = devm_kmemdup(&pdev->dev, &irq_map,
+ sizeof(irq_map), GFP_KERNEL);
+ if (!map)
+ return -ENOMEM;
+
+ map->rx.wm2_complete_mask = 0;
+ dev->irq_map = map;
+ }
+
tasklet_init(&mdev->irq_tasklet, mt792x_irq_tasklet, (unsigned long)dev);
dev->phy.dev = dev;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 04/11] wifi: mt76: mt7921: add MT7902e DMA layout support
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
2026-02-19 0:39 ` [PATCH 02/11] wifi: mt76: mt7921: use mt76_for_each_q_rx() in reset path sean.wang
2026-02-19 0:39 ` [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 05/11] wifi: mt76: connac: mark MT7902 as hw txp devices sean.wang
` (7 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
From: Sean Wang <sean.wang@mediatek.com>
Add MT7902 PCIe specific DMA layout overrides for MCU TXQ index, RX ring
size, and MCU_WA usage. Common layout remains the default for other chips.
This is a prerequisite patch before enabling MT7902 PCIe support.
Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
.../wireless/mediatek/mt76/mt7921/mt7921.h | 14 +++++++
.../net/wireless/mediatek/mt76/mt7921/pci.c | 41 +++++++++++++++----
2 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
index ad92af98e314..64f60c4fc60c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
@@ -17,6 +17,9 @@
#define MT7921_RX_MCU_RING_SIZE 8
#define MT7921_RX_MCU_WA_RING_SIZE 512
+/* MT7902 Rx Ring0 is for both Rx Event and Tx Done Event */
+#define MT7902_RX_MCU_RING_SIZE 512
+
#define MT7921_EEPROM_SIZE 3584
#define MT7921_TOKEN_SIZE 8192
@@ -119,6 +122,17 @@ enum mt7921_rxq_id {
MT7921_RXQ_MCU_WM = 0,
};
+/* MT7902 assigns its MCU-WM TXQ at index 15 */
+enum mt7902_txq_id {
+ MT7902_TXQ_MCU_WM = 15,
+};
+
+struct mt7921_dma_layout {
+ u8 mcu_wm_txq;
+ u16 mcu_rxdone_ring_size;
+ bool has_mcu_wa;
+};
+
enum {
MT7921_CLC_POWER,
MT7921_CLC_CHAN,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
index 5f857a21f362..6bb3c6a1cf6a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
@@ -167,8 +167,29 @@ static u32 mt7921_rmw(struct mt76_dev *mdev, u32 offset, u32 mask, u32 val)
static int mt7921_dma_init(struct mt792x_dev *dev)
{
+ struct mt7921_dma_layout layout = {
+ /* General case: MT7921 / MT7922 /MT7920 */
+ .mcu_wm_txq = MT7921_TXQ_MCU_WM,
+ .mcu_rxdone_ring_size = MT7921_RX_MCU_RING_SIZE,
+ .has_mcu_wa = true,
+ };
+ bool is_mt7902;
int ret;
+ is_mt7902 = mt7921_l1_rr(dev, MT_HW_CHIPID) == 0x7902;
+
+ /*
+ * MT7902 special case:
+ * - MCU-WM TXQ uses index 15
+ * - RX Ring0 is larger and shared for event/TX-done
+ * - MT7902 does not use the MCU_WA ring
+ */
+ if (is_mt7902) {
+ layout.mcu_wm_txq = MT7902_TXQ_MCU_WM;
+ layout.mcu_rxdone_ring_size = MT7902_RX_MCU_RING_SIZE;
+ layout.has_mcu_wa = false;
+ }
+
mt76_dma_attach(&dev->mt76);
ret = mt792x_dma_disable(dev, true);
@@ -185,7 +206,7 @@ static int mt7921_dma_init(struct mt792x_dev *dev)
mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, 0x4);
/* command to WM */
- ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, MT7921_TXQ_MCU_WM,
+ ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM, layout.mcu_wm_txq,
MT7921_TX_MCU_RING_SIZE, MT_TX_RING_BASE);
if (ret)
return ret;
@@ -199,18 +220,20 @@ static int mt7921_dma_init(struct mt792x_dev *dev)
/* event from WM before firmware download */
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
MT7921_RXQ_MCU_WM,
- MT7921_RX_MCU_RING_SIZE,
+ layout.mcu_rxdone_ring_size,
MT_RX_BUF_SIZE, MT_RX_EVENT_RING_BASE);
if (ret)
return ret;
- /* Change mcu queue after firmware download */
- ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
- MT7921_RXQ_MCU_WM,
- MT7921_RX_MCU_WA_RING_SIZE,
- MT_RX_BUF_SIZE, MT_WFDMA0(0x540));
- if (ret)
- return ret;
+ if (layout.has_mcu_wa) {
+ /* Change mcu queue after firmware download */
+ ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
+ MT7921_RXQ_MCU_WM,
+ MT7921_RX_MCU_WA_RING_SIZE,
+ MT_RX_BUF_SIZE, MT_WFDMA0(0x540));
+ if (ret)
+ return ret;
+ }
/* rx data */
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 05/11] wifi: mt76: connac: mark MT7902 as hw txp devices
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (2 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 04/11] wifi: mt76: mt7921: add MT7902e DMA layout support sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 06/11] wifi: mt76: mt792x: add PSE handling barrier for the large MCU cmd sean.wang
` (6 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
From: Sean Wang <sean.wang@mediatek.com>
Add MT7902 to is_mt76_fw_txp() so it follows the legacy TX descriptor
path like the other connac2 chips that return false.
This is a prerequisite patch before enabling MT7902 pcie support.
Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt76_connac.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
index 02bea67d37c3..d868bb7c7ab8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
@@ -271,6 +271,7 @@ static inline bool is_mt76_fw_txp(struct mt76_dev *dev)
case 0x7961:
case 0x7920:
case 0x7922:
+ case 0x7902:
case 0x7925:
case 0x7663:
case 0x7622:
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 06/11] wifi: mt76: mt792x: add PSE handling barrier for the large MCU cmd
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (3 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 05/11] wifi: mt76: connac: mark MT7902 as hw txp devices sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 07/11] wifi: mt76: mt792x: ensure MCU ready before ROM patch download sean.wang
` (5 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
From: Sean Wang <sean.wang@mediatek.com>
Add a dummy register read in mt76_connac_mcu_rate_txpower_band() to act as
a PSE barrier. This would release PSE pages and prevents buffer underflow
issues when handling MCU commands with larger payloads without the response
in mt76_connac_mcu_set_rate_txpower().
This is a prerequisite patch before enabling MT7902 PCIe and SDIO support.
Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 4 ++++
drivers/net/wireless/mediatek/mt76/mt792x_regs.h | 2 ++
2 files changed, 6 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index d7fbf3454bb8..89bd52ea8bf7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -4,6 +4,7 @@
#include <linux/firmware.h>
#include "mt76_connac2_mac.h"
#include "mt76_connac_mcu.h"
+#include "mt792x_regs.h"
int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option)
{
@@ -2246,6 +2247,9 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
false);
if (err < 0)
goto out;
+
+ /* read a CR to avoid PSE buffer underflow */
+ mt76_connac_mcu_reg_rr(dev, MT_PSE_BASE);
}
out:
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_regs.h b/drivers/net/wireless/mediatek/mt76/mt792x_regs.h
index acf627aed609..7ddde9286861 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_regs.h
@@ -25,6 +25,8 @@
#define MT_PLE_AC_QEMPTY(_n) MT_PLE(0x500 + 0x40 * (_n))
#define MT_PLE_AMSDU_PACK_MSDU_CNT(n) MT_PLE(0x10e0 + ((n) << 2))
+#define MT_PSE_BASE 0x820c8000
+
/* TMAC: band 0(0x21000), band 1(0xa1000) */
#define MT_WF_TMAC_BASE(_band) ((_band) ? 0x820f4000 : 0x820e4000)
#define MT_WF_TMAC(_band, ofs) (MT_WF_TMAC_BASE(_band) + (ofs))
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 07/11] wifi: mt76: mt792x: ensure MCU ready before ROM patch download
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (4 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 06/11] wifi: mt76: mt792x: add PSE handling barrier for the large MCU cmd sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 08/11] wifi: mt76: mt7921: add MT7902 MCU support sean.wang
` (4 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi; +Cc: linux-wireless, linux-mediatek, Sean Wang
From: Sean Wang <sean.wang@mediatek.com>
Restart the MCU and poll FW state to ensure correct MCU status
before downloading the ROM patch.
This is a prerequisite for enabling MT7902 PCIe and has been
validated on MT7921 and MT7925 since they share the common code path.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt792x_core.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
index 2142fcc4ae27..152cfcca2f90 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
@@ -926,6 +926,13 @@ int mt792x_load_firmware(struct mt792x_dev *dev)
{
int ret;
+ mt76_connac_mcu_restart(&dev->mt76);
+
+ if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC_FW_STATE,
+ MT_TOP_MISC2_FW_PWR_ON, 1000))
+ dev_warn(dev->mt76.dev,
+ "MCU is not ready for firmware download\n");
+
ret = mt76_connac2_load_patch(&dev->mt76, mt792x_patch_name(dev));
if (ret)
return ret;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 08/11] wifi: mt76: mt7921: add MT7902 MCU support
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (5 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 07/11] wifi: mt76: mt792x: ensure MCU ready before ROM patch download sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 09/11] wifi: mt76: mt792x: add MT7902 WFDMA prefetch configuration sean.wang
` (3 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi; +Cc: linux-wireless, linux-mediatek, Sean Wang
From: Sean Wang <sean.wang@mediatek.com>
Add MCU support for the MT7902 chipset.
runtime pm is not yet supported by the driver, but normal mac80211
operation is unaffected.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt76_connac.h | 8 +++++++-
drivers/net/wireless/mediatek/mt76/mt7921/init.c | 4 +++-
drivers/net/wireless/mediatek/mt76/mt792x.h | 6 ++++++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
index d868bb7c7ab8..51423c7740bd 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
@@ -182,6 +182,11 @@ static inline bool is_mt7920(struct mt76_dev *dev)
return mt76_chip(dev) == 0x7920;
}
+static inline bool is_mt7902(struct mt76_dev *dev)
+{
+ return mt76_chip(dev) == 0x7902;
+}
+
static inline bool is_mt7922(struct mt76_dev *dev)
{
return mt76_chip(dev) == 0x7922;
@@ -189,7 +194,8 @@ static inline bool is_mt7922(struct mt76_dev *dev)
static inline bool is_connac2(struct mt76_dev *dev)
{
- return mt76_chip(dev) == 0x7961 || is_mt7922(dev) || is_mt7920(dev);
+ return mt76_chip(dev) == 0x7961 || is_mt7922(dev) || is_mt7920(dev) ||
+ is_mt7902(dev);
}
static inline bool is_mt7663(struct mt76_dev *dev)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
index 29732315af1c..8e7790702191 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
@@ -302,7 +302,9 @@ int mt7921_register_device(struct mt792x_dev *dev)
dev->pm.idle_timeout = MT792x_PM_TIMEOUT;
dev->pm.stats.last_wake_event = jiffies;
dev->pm.stats.last_doze_event = jiffies;
- if (!mt76_is_usb(&dev->mt76)) {
+
+ if (!mt76_is_usb(&dev->mt76) &&
+ !is_mt7902(&dev->mt76)) {
dev->pm.enable_user = true;
dev->pm.enable = true;
dev->pm.ds_enable_user = true;
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h
index 8388638ed550..1f381ab356bc 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x.h
+++ b/drivers/net/wireless/mediatek/mt76/mt792x.h
@@ -41,11 +41,13 @@
#define MT792x_MCU_INIT_RETRY_COUNT 10
#define MT792x_WFSYS_INIT_RETRY_COUNT 2
+#define MT7902_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7902_1.bin"
#define MT7920_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1a.bin"
#define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin"
#define MT7922_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7922_1.bin"
#define MT7925_FIRMWARE_WM "mediatek/mt7925/WIFI_RAM_CODE_MT7925_1_1.bin"
+#define MT7902_ROM_PATCH "mediatek/WIFI_MT7902_patch_mcu_1_1_hdr.bin"
#define MT7920_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin"
#define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin"
#define MT7922_ROM_PATCH "mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin"
@@ -448,6 +450,8 @@ void mt792x_config_mac_addr_list(struct mt792x_dev *dev);
static inline char *mt792x_ram_name(struct mt792x_dev *dev)
{
switch (mt76_chip(&dev->mt76)) {
+ case 0x7902:
+ return MT7902_FIRMWARE_WM;
case 0x7920:
return MT7920_FIRMWARE_WM;
case 0x7922:
@@ -462,6 +466,8 @@ static inline char *mt792x_ram_name(struct mt792x_dev *dev)
static inline char *mt792x_patch_name(struct mt792x_dev *dev)
{
switch (mt76_chip(&dev->mt76)) {
+ case 0x7902:
+ return MT7902_ROM_PATCH;
case 0x7920:
return MT7920_ROM_PATCH;
case 0x7922:
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 09/11] wifi: mt76: mt792x: add MT7902 WFDMA prefetch configuration
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (6 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 08/11] wifi: mt76: mt7921: add MT7902 MCU support sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 10/11] wifi: mt76: mt7921: add MT7902 PCIe device support sean.wang
` (2 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
From: Sean Wang <sean.wang@mediatek.com>
Configure the RX/TX ring prefetch setting for MT7902 PCIe device.
This is a prerequisite patch before enabling MT7902 PCIe support.
Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt792x_dma.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
index 34f07bd3097d..002aece857b2 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
@@ -103,6 +103,22 @@ static void mt792x_dma_prefetch(struct mt792x_dev *dev)
mt76_wr(dev, MT_WFDMA0_TX_RING3_EXT_CTRL, PREFETCH(0x0400, 0x10));
mt76_wr(dev, MT_WFDMA0_TX_RING15_EXT_CTRL, PREFETCH(0x0500, 0x4));
mt76_wr(dev, MT_WFDMA0_TX_RING16_EXT_CTRL, PREFETCH(0x0540, 0x4));
+ } else if (is_mt7902(&dev->mt76)) {
+ /* rx ring */
+ mt76_wr(dev, MT_WFDMA0_RX_RING0_EXT_CTRL, PREFETCH(0x0000, 0x4));
+ mt76_wr(dev, MT_WFDMA0_RX_RING1_EXT_CTRL, PREFETCH(0x0040, 0x4));
+ mt76_wr(dev, MT_WFDMA0_RX_RING2_EXT_CTRL, PREFETCH(0x0080, 0x4));
+ mt76_wr(dev, MT_WFDMA0_RX_RING3_EXT_CTRL, PREFETCH(0x00c0, 0x4));
+ /* tx ring */
+ mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, PREFETCH(0x0100, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING1_EXT_CTRL, PREFETCH(0x0140, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING2_EXT_CTRL, PREFETCH(0x0180, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING3_EXT_CTRL, PREFETCH(0x01c0, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING4_EXT_CTRL, PREFETCH(0x0200, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING5_EXT_CTRL, PREFETCH(0x0240, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING6_EXT_CTRL, PREFETCH(0x0280, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING15_EXT_CTRL, PREFETCH(0x02c0, 0x4));
+ mt76_wr(dev, MT_WFDMA0_TX_RING16_EXT_CTRL, PREFETCH(0x0300, 0x4));
} else {
/* rx ring */
mt76_wr(dev, MT_WFDMA0_RX_RING0_EXT_CTRL, PREFETCH(0x0, 0x4));
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 10/11] wifi: mt76: mt7921: add MT7902 PCIe device support
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (7 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 09/11] wifi: mt76: mt792x: add MT7902 WFDMA prefetch configuration sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-19 0:40 ` [PATCH 11/11] wifi: mt76: mt7921: add MT7902 SDIO " sean.wang
2026-02-20 20:41 ` [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks Philip Müller
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
From: Sean Wang <sean.wang@mediatek.com>
Register the MT7902 PCI device ID in the mt7921 driver and add its
corresponding firmware and ROM patch names.
Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
index 6bb3c6a1cf6a..7a790ddf43bb 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
@@ -26,6 +26,8 @@ static const struct pci_device_id mt7921_pci_device_table[] = {
.driver_data = (kernel_ulong_t)MT7922_FIRMWARE_WM },
{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7920),
.driver_data = (kernel_ulong_t)MT7920_FIRMWARE_WM },
+ { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7902),
+ .driver_data = (kernel_ulong_t)MT7902_FIRMWARE_WM },
{ },
};
@@ -617,6 +619,8 @@ MODULE_FIRMWARE(MT7921_FIRMWARE_WM);
MODULE_FIRMWARE(MT7921_ROM_PATCH);
MODULE_FIRMWARE(MT7922_FIRMWARE_WM);
MODULE_FIRMWARE(MT7922_ROM_PATCH);
+MODULE_FIRMWARE(MT7902_FIRMWARE_WM);
+MODULE_FIRMWARE(MT7902_ROM_PATCH);
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
MODULE_DESCRIPTION("MediaTek MT7921E (PCIe) wireless driver");
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 11/11] wifi: mt76: mt7921: add MT7902 SDIO device support
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (8 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 10/11] wifi: mt76: mt7921: add MT7902 PCIe device support sean.wang
@ 2026-02-19 0:40 ` sean.wang
2026-02-20 20:41 ` [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks Philip Müller
10 siblings, 0 replies; 16+ messages in thread
From: sean.wang @ 2026-02-19 0:40 UTC (permalink / raw)
To: nbd, lorenzo.bianconi; +Cc: linux-wireless, linux-mediatek, Sean Wang
From: Sean Wang <sean.wang@mediatek.com>
Register the MT7902 SDIO device ID in the mt7921 driver and add its
corresponding firmware and ROM patch names.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
index 3421e53dc948..9150f185716c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
@@ -19,6 +19,8 @@
static const struct sdio_device_id mt7921s_table[] = {
{ SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7901),
.driver_data = (kernel_ulong_t)MT7921_FIRMWARE_WM },
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7902),
+ .driver_data = (kernel_ulong_t)MT7902_FIRMWARE_WM },
{ } /* Terminating entry */
};
@@ -317,6 +319,8 @@ static int mt7921s_resume(struct device *__dev)
MODULE_DEVICE_TABLE(sdio, mt7921s_table);
MODULE_FIRMWARE(MT7921_FIRMWARE_WM);
MODULE_FIRMWARE(MT7921_ROM_PATCH);
+MODULE_FIRMWARE(MT7902_FIRMWARE_WM);
+MODULE_FIRMWARE(MT7902_ROM_PATCH);
static DEFINE_SIMPLE_DEV_PM_OPS(mt7921s_pm_ops, mt7921s_suspend, mt7921s_resume);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy
2026-02-19 0:39 ` [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy sean.wang
@ 2026-02-20 10:09 ` Philip Müller
2026-02-20 18:39 ` Sean Wang
0 siblings, 1 reply; 16+ messages in thread
From: Philip Müller @ 2026-02-20 10:09 UTC (permalink / raw)
To: sean.wang, nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang, Xiong Huang
Hi Sean,
on Linus master tree we still have 'mt76_mmio_init(&dev->mt76,
pcim_iomap_table(pdev)[0]);', hence your patch currently won't apply.
On 2/19/26 01:39, sean.wang@kernel.org wrote:
> From: Sean Wang <sean.wang@mediatek.com>
>
> MT7902 PCIe requires a different wm2_complete_mask value, so introduce a
> mutable per-device copy of the default irq_map and override the field
> only for this chip. Other devices continue using the shared const
> template.
>
> This is a prerequisite patch before enabling MT7902 PCIe support.
>
> Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
> Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
> Signed-off-by: Sean Wang <sean.wang@mediatek.com>
> ---
> drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> index 65c7fe671137..5f857a21f362 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> @@ -327,6 +327,20 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
> dev->hif_ops = &mt7921_pcie_ops;
> dev->irq_map = &irq_map;
> mt76_mmio_init(&dev->mt76, regs);
> +
> + if (id->device == 0x7902) {
> + struct mt792x_irq_map *map;
> +
> + /* MT7902 needs a mutable copy because wm2_complete_mask differs */
> + map = devm_kmemdup(&pdev->dev, &irq_map,
> + sizeof(irq_map), GFP_KERNEL);
> + if (!map)
> + return -ENOMEM;
> +
> + map->rx.wm2_complete_mask = 0;
> + dev->irq_map = map;
> + }
> +
> tasklet_init(&mdev->irq_tasklet, mt792x_irq_tasklet, (unsigned long)dev);
>
> dev->phy.dev = dev;
--
Best, Philip
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy
2026-02-20 10:09 ` Philip Müller
@ 2026-02-20 18:39 ` Sean Wang
0 siblings, 0 replies; 16+ messages in thread
From: Sean Wang @ 2026-02-20 18:39 UTC (permalink / raw)
To: Philip Müller
Cc: nbd, lorenzo.bianconi, linux-wireless, linux-mediatek, Sean Wang,
Xiong Huang
Hi Philip,
On Fri, Feb 20, 2026 at 4:09 AM Philip Müller <philm@manjaro.org> wrote:
>
> Hi Sean,
>
> on Linus master tree we still have 'mt76_mmio_init(&dev->mt76,
> pcim_iomap_table(pdev)[0]);', hence your patch currently won't apply.
The patchset is based on the latest mt76 tree.
If needed, please apply the following commit first so the series
applies cleanly:
https://github.com/nbd168/wireless/commit/4eefc435c985f4dfdba9afb1c705f0e17377c084
That patch will go to Linus’ master first, then this series.
>
> On 2/19/26 01:39, sean.wang@kernel.org wrote:
> > From: Sean Wang <sean.wang@mediatek.com>
> >
> > MT7902 PCIe requires a different wm2_complete_mask value, so introduce a
> > mutable per-device copy of the default irq_map and override the field
> > only for this chip. Other devices continue using the shared const
> > template.
> >
> > This is a prerequisite patch before enabling MT7902 PCIe support.
> >
> > Co-developed-by: Xiong Huang <xiong.huang@mediatek.com>
> > Signed-off-by: Xiong Huang <xiong.huang@mediatek.com>
> > Signed-off-by: Sean Wang <sean.wang@mediatek.com>
> > ---
> > drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 14 ++++++++++++++
> > 1 file changed, 14 insertions(+)
> >
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> > index 65c7fe671137..5f857a21f362 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> > @@ -327,6 +327,20 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
> > dev->hif_ops = &mt7921_pcie_ops;
> > dev->irq_map = &irq_map;
> > mt76_mmio_init(&dev->mt76, regs);
> > +
> > + if (id->device == 0x7902) {
> > + struct mt792x_irq_map *map;
> > +
> > + /* MT7902 needs a mutable copy because wm2_complete_mask differs */
> > + map = devm_kmemdup(&pdev->dev, &irq_map,
> > + sizeof(irq_map), GFP_KERNEL);
> > + if (!map)
> > + return -ENOMEM;
> > +
> > + map->rx.wm2_complete_mask = 0;
> > + dev->irq_map = map;
> > + }
> > +
> > tasklet_init(&mdev->irq_tasklet, mt792x_irq_tasklet, (unsigned long)dev);
> >
> > dev->phy.dev = dev;
>
>
> --
> Best, Philip
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
` (9 preceding siblings ...)
2026-02-19 0:40 ` [PATCH 11/11] wifi: mt76: mt7921: add MT7902 SDIO " sean.wang
@ 2026-02-20 20:41 ` Philip Müller
2026-02-21 20:19 ` Sean Wang
10 siblings, 1 reply; 16+ messages in thread
From: Philip Müller @ 2026-02-20 20:41 UTC (permalink / raw)
To: sean.wang, nbd, lorenzo.bianconi
Cc: linux-wireless, linux-mediatek, Sean Wang
Hi Sean,
this patch needed the following lines additionally to compile cleanly:
drivers/net/wireless/mediatek/mt76/mt792x_core.c
@@ -691,7 +691,7 @@ int mt792x_init_wiphy(struct ieee80211_h
ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
ieee80211_hw_set(hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
- if (is_mt7921(&dev->mt76)) {
+ if (is_connac2(&dev->mt76)) {
ieee80211_hw_set(hw, CHANCTX_STA_CSA);
}
On 2/19/26 01:39, sean.wang@kernel.org wrote:
> From: Sean Wang <sean.wang@mediatek.com>
>
> Unify all per-chip conditionals under the new is_connac2() helper. This
> avoids confusion caused by the previous is_mt7921() check, which
> implicitly covered multiple connac2 chipsets and no longer reflected its
> actual scope. This is a clean-up only change with no functional impact.
>
> Signed-off-by: Sean Wang <sean.wang@mediatek.com>
> ---
> .../net/wireless/mediatek/mt76/mt76_connac.h | 2 +-
> .../wireless/mediatek/mt76/mt76_connac_mac.c | 16 ++++++------
> .../wireless/mediatek/mt76/mt76_connac_mcu.c | 26 +++++++++----------
> .../wireless/mediatek/mt76/mt76_connac_mcu.h | 2 +-
> .../net/wireless/mediatek/mt76/mt792x_core.c | 2 +-
> .../net/wireless/mediatek/mt76/mt792x_dma.c | 2 +-
> 6 files changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
> index 813d61bffc2c..02bea67d37c3 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
> @@ -187,7 +187,7 @@ static inline bool is_mt7922(struct mt76_dev *dev)
> return mt76_chip(dev) == 0x7922;
> }
>
> -static inline bool is_mt7921(struct mt76_dev *dev)
> +static inline bool is_connac2(struct mt76_dev *dev)
> {
> return mt76_chip(dev) == 0x7961 || is_mt7922(dev) || is_mt7920(dev);
> }
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> index 4ef44514d48d..e76f6e28b7f0 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> @@ -173,7 +173,7 @@ void mt76_connac_write_hw_txp(struct mt76_dev *dev,
>
> txp->msdu_id[0] = cpu_to_le16(id | MT_MSDU_ID_VALID);
>
> - if (is_mt7663(dev) || is_mt7921(dev) || is_mt7925(dev))
> + if (is_mt7663(dev) || is_connac2(dev) || is_mt7925(dev))
> last_mask = MT_TXD_LEN_LAST;
> else
> last_mask = MT_TXD_LEN_AMSDU_LAST |
> @@ -217,7 +217,7 @@ mt76_connac_txp_skb_unmap_hw(struct mt76_dev *dev,
> u32 last_mask;
> int i;
>
> - if (is_mt7663(dev) || is_mt7921(dev) || is_mt7925(dev))
> + if (is_mt7663(dev) || is_connac2(dev) || is_mt7925(dev))
> last_mask = MT_TXD_LEN_LAST;
> else
> last_mask = MT_TXD_LEN_MSDU_LAST;
> @@ -309,7 +309,7 @@ u16 mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy,
> chandef = mvif->ctx ? &mvif->ctx->def : &mphy->chandef;
> band = chandef->chan->band;
>
> - if (is_mt7921(mphy->dev)) {
> + if (is_connac2(mphy->dev)) {
> rateidx = ffs(conf->basic_rates) - 1;
> goto legacy;
> }
> @@ -547,7 +547,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
> 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))
> + if (!is_connac2(dev))
> val |= MT_TXD1_VTA;
> if (phy_idx || band_idx)
> val |= MT_TXD1_TGID;
> @@ -556,7 +556,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
> txwi[2] = 0;
>
> val = FIELD_PREP(MT_TXD3_REM_TX_COUNT, 15);
> - if (!is_mt7921(dev))
> + if (!is_connac2(dev))
> val |= MT_TXD3_SW_POWER_MGMT;
> if (key)
> val |= MT_TXD3_PROTECT_FRAME;
> @@ -598,7 +598,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
> txwi[6] |= cpu_to_le32(val);
> txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
>
> - if (!is_mt7921(dev)) {
> + if (!is_connac2(dev)) {
> u8 spe_idx = mt76_connac_spe_idx(mphy->antenna_mask);
>
> if (!spe_idx)
> @@ -830,7 +830,7 @@ mt76_connac2_mac_decode_he_mu_radiotap(struct mt76_dev *dev, struct sk_buff *skb
> };
> struct ieee80211_radiotap_he_mu *he_mu;
>
> - if (is_mt7921(dev)) {
> + if (is_connac2(dev)) {
> mu_known.flags1 |= HE_BITS(MU_FLAGS1_SIG_B_COMP_KNOWN);
> mu_known.flags2 |= HE_BITS(MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN);
> }
> @@ -1046,7 +1046,7 @@ int mt76_connac2_mac_fill_rx_rate(struct mt76_dev *dev,
> stbc = FIELD_GET(MT_PRXV_HT_STBC, v0);
> gi = FIELD_GET(MT_PRXV_HT_SGI, v0);
> *mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
> - if (is_mt7921(dev))
> + if (is_connac2(dev))
> dcm = !!(idx & MT_PRXV_TX_DCM);
> else
> dcm = FIELD_GET(MT_PRXV_DCM, v0);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
> index 3f583e2a1dc1..d7fbf3454bb8 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
> @@ -65,7 +65,7 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
> int cmd;
>
> if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
> - (is_mt7921(dev) && addr == 0x900000) ||
> + (is_connac2(dev) && addr == 0x900000) ||
> (is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
> (is_mt799x(dev) && addr == 0x900000))
> cmd = MCU_CMD(PATCH_START_REQ);
> @@ -402,7 +402,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
> switch (vif->type) {
> case NL80211_IFTYPE_MESH_POINT:
> case NL80211_IFTYPE_AP:
> - if (vif->p2p && !is_mt7921(dev))
> + if (vif->p2p && !is_connac2(dev))
> conn_type = CONNECTION_P2P_GC;
> else
> conn_type = CONNECTION_INFRA_STA;
> @@ -410,7 +410,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
> basic->aid = cpu_to_le16(link_sta->sta->aid);
> break;
> case NL80211_IFTYPE_STATION:
> - if (vif->p2p && !is_mt7921(dev))
> + if (vif->p2p && !is_connac2(dev))
> conn_type = CONNECTION_P2P_GO;
> else
> conn_type = CONNECTION_INFRA_AP;
> @@ -874,7 +874,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
> struct sta_rec_vht *vht;
> int len;
>
> - len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
> + len = is_connac2(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
> tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
> vht = (struct sta_rec_vht *)tlv;
> vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
> @@ -885,7 +885,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
> /* starec uapsd */
> mt76_connac_mcu_sta_uapsd(skb, vif, sta);
>
> - if (!is_mt7921(dev))
> + if (!is_connac2(dev))
> return;
>
> if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
> @@ -1778,7 +1778,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
> req->ssid_type_ext = n_ssids ? BIT(0) : 0;
> req->ssids_num = n_ssids;
>
> - duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
> + duration = is_connac2(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
> /* increase channel time for passive scan */
> if (!sreq->n_ssids)
> duration *= 2;
> @@ -1821,7 +1821,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
> req->ies_len = cpu_to_le16(sreq->ie_len);
> }
>
> - if (is_mt7921(phy->dev))
> + if (is_connac2(phy->dev))
> req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
>
> memcpy(req->bssid, sreq->bssid, ETH_ALEN);
> @@ -1897,7 +1897,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
> get_random_mask_addr(addr, sreq->mac_addr,
> sreq->mac_addr_mask);
> }
> - if (is_mt7921(phy->dev)) {
> + if (is_connac2(phy->dev)) {
> req->mt7921.bss_idx = mvif->idx;
> req->mt7921.delay = cpu_to_le32(sreq->delay);
> }
> @@ -2037,7 +2037,7 @@ mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
> struct mt76_power_limits *limits,
> enum nl80211_band band)
> {
> - int max_power = is_mt7921(dev) ? 127 : 63;
> + int max_power = is_connac2(dev) ? 127 : 63;
> int i, offset = sizeof(limits->cck);
>
> memset(sku, max_power, MT_SKU_POWER_LIMIT);
> @@ -2065,7 +2065,7 @@ mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
> offset += 12;
> }
>
> - if (!is_mt7921(dev))
> + if (!is_connac2(dev))
> return;
>
> /* he */
> @@ -2121,7 +2121,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
> enum nl80211_band band)
> {
> struct mt76_dev *dev = phy->dev;
> - int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
> + int sku_len, batch_len = is_connac2(dev) ? 8 : 16;
> static const u8 chan_list_2ghz[] = {
> 1, 2, 3, 4, 5, 6, 7,
> 8, 9, 10, 11, 12, 13, 14
> @@ -2162,7 +2162,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
> if (!limits)
> return -ENOMEM;
>
> - sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
> + sku_len = is_connac2(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
> tx_power = 2 * phy->hw->conf.power_level;
> if (!tx_power)
> tx_power = 127;
> @@ -3080,7 +3080,7 @@ static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info)
> {
> u32 mode = DL_MODE_NEED_RSP;
>
> - if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
> + if ((!is_connac2(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
> return mode;
>
> switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> index f44977f9093d..1ef25385f3c6 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> @@ -1866,7 +1866,7 @@ mt76_connac_mcu_gen_dl_mode(struct mt76_dev *dev, u8 feature_set, bool is_wa)
>
> ret |= feature_set & FW_FEATURE_SET_ENCRYPT ?
> DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV : 0;
> - if (is_mt7921(dev) || is_mt7925(dev))
> + if (is_connac2(dev) || is_mt7925(dev))
> ret |= feature_set & FW_FEATURE_ENCRY_MODE ?
> DL_CONFIG_ENCRY_MODE_SEL : 0;
> ret |= FIELD_PREP(DL_MODE_KEY_IDX,
> diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
> index f318a53e4deb..2142fcc4ae27 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
> @@ -151,7 +151,7 @@ void mt792x_stop(struct ieee80211_hw *hw, bool suspend)
> cancel_work_sync(&dev->reset_work);
> mt76_connac_free_pending_tx_skbs(&dev->pm, NULL);
>
> - if (is_mt7921(&dev->mt76)) {
> + if (is_connac2(&dev->mt76)) {
> mt792x_mutex_acquire(dev);
> mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, false, false);
> mt792x_mutex_release(dev);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> index 1ddec7788b66..34f07bd3097d 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> @@ -356,7 +356,7 @@ EXPORT_SYMBOL_GPL(mt792x_poll_rx);
>
> int mt792x_wfsys_reset(struct mt792x_dev *dev)
> {
> - u32 addr = is_mt7921(&dev->mt76) ? 0x18000140 : 0x7c000140;
> + u32 addr = is_connac2(&dev->mt76) ? 0x18000140 : 0x7c000140;
>
> mt76_clear(dev, addr, WFSYS_SW_RST_B);
> msleep(50);
--
Best, Philip
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks
2026-02-20 20:41 ` [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks Philip Müller
@ 2026-02-21 20:19 ` Sean Wang
2026-03-22 8:04 ` Philip Müller
0 siblings, 1 reply; 16+ messages in thread
From: Sean Wang @ 2026-02-21 20:19 UTC (permalink / raw)
To: Philip Müller
Cc: nbd, lorenzo.bianconi, linux-wireless, linux-mediatek, Sean Wang
On Fri, Feb 20, 2026 at 2:41 PM Philip Müller <philm@manjaro.org> wrote:
>
> Hi Sean,
>
> this patch needed the following lines additionally to compile cleanly:
>
Hi Philip,
Thanks for the catch I’ll update this in the next version.
Best,
Sean
> drivers/net/wireless/mediatek/mt76/mt792x_core.c
>
> @@ -691,7 +691,7 @@ int mt792x_init_wiphy(struct ieee80211_h
> ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
> ieee80211_hw_set(hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
>
> - if (is_mt7921(&dev->mt76)) {
> + if (is_connac2(&dev->mt76)) {
> ieee80211_hw_set(hw, CHANCTX_STA_CSA);
> }
>
> On 2/19/26 01:39, sean.wang@kernel.org wrote:
> > From: Sean Wang <sean.wang@mediatek.com>
> >
> > Unify all per-chip conditionals under the new is_connac2() helper. This
> > avoids confusion caused by the previous is_mt7921() check, which
> > implicitly covered multiple connac2 chipsets and no longer reflected its
> > actual scope. This is a clean-up only change with no functional impact.
> >
> > Signed-off-by: Sean Wang <sean.wang@mediatek.com>
> > ---
> > .../net/wireless/mediatek/mt76/mt76_connac.h | 2 +-
> > .../wireless/mediatek/mt76/mt76_connac_mac.c | 16 ++++++------
> > .../wireless/mediatek/mt76/mt76_connac_mcu.c | 26 +++++++++----------
> > .../wireless/mediatek/mt76/mt76_connac_mcu.h | 2 +-
> > .../net/wireless/mediatek/mt76/mt792x_core.c | 2 +-
> > .../net/wireless/mediatek/mt76/mt792x_dma.c | 2 +-
> > 6 files changed, 25 insertions(+), 25 deletions(-)
> >
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac.h b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
> > index 813d61bffc2c..02bea67d37c3 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac.h
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac.h
> > @@ -187,7 +187,7 @@ static inline bool is_mt7922(struct mt76_dev *dev)
> > return mt76_chip(dev) == 0x7922;
> > }
> >
> > -static inline bool is_mt7921(struct mt76_dev *dev)
> > +static inline bool is_connac2(struct mt76_dev *dev)
> > {
> > return mt76_chip(dev) == 0x7961 || is_mt7922(dev) || is_mt7920(dev);
> > }
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > index 4ef44514d48d..e76f6e28b7f0 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
> > @@ -173,7 +173,7 @@ void mt76_connac_write_hw_txp(struct mt76_dev *dev,
> >
> > txp->msdu_id[0] = cpu_to_le16(id | MT_MSDU_ID_VALID);
> >
> > - if (is_mt7663(dev) || is_mt7921(dev) || is_mt7925(dev))
> > + if (is_mt7663(dev) || is_connac2(dev) || is_mt7925(dev))
> > last_mask = MT_TXD_LEN_LAST;
> > else
> > last_mask = MT_TXD_LEN_AMSDU_LAST |
> > @@ -217,7 +217,7 @@ mt76_connac_txp_skb_unmap_hw(struct mt76_dev *dev,
> > u32 last_mask;
> > int i;
> >
> > - if (is_mt7663(dev) || is_mt7921(dev) || is_mt7925(dev))
> > + if (is_mt7663(dev) || is_connac2(dev) || is_mt7925(dev))
> > last_mask = MT_TXD_LEN_LAST;
> > else
> > last_mask = MT_TXD_LEN_MSDU_LAST;
> > @@ -309,7 +309,7 @@ u16 mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy,
> > chandef = mvif->ctx ? &mvif->ctx->def : &mphy->chandef;
> > band = chandef->chan->band;
> >
> > - if (is_mt7921(mphy->dev)) {
> > + if (is_connac2(mphy->dev)) {
> > rateidx = ffs(conf->basic_rates) - 1;
> > goto legacy;
> > }
> > @@ -547,7 +547,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
> > 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))
> > + if (!is_connac2(dev))
> > val |= MT_TXD1_VTA;
> > if (phy_idx || band_idx)
> > val |= MT_TXD1_TGID;
> > @@ -556,7 +556,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
> > txwi[2] = 0;
> >
> > val = FIELD_PREP(MT_TXD3_REM_TX_COUNT, 15);
> > - if (!is_mt7921(dev))
> > + if (!is_connac2(dev))
> > val |= MT_TXD3_SW_POWER_MGMT;
> > if (key)
> > val |= MT_TXD3_PROTECT_FRAME;
> > @@ -598,7 +598,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
> > txwi[6] |= cpu_to_le32(val);
> > txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
> >
> > - if (!is_mt7921(dev)) {
> > + if (!is_connac2(dev)) {
> > u8 spe_idx = mt76_connac_spe_idx(mphy->antenna_mask);
> >
> > if (!spe_idx)
> > @@ -830,7 +830,7 @@ mt76_connac2_mac_decode_he_mu_radiotap(struct mt76_dev *dev, struct sk_buff *skb
> > };
> > struct ieee80211_radiotap_he_mu *he_mu;
> >
> > - if (is_mt7921(dev)) {
> > + if (is_connac2(dev)) {
> > mu_known.flags1 |= HE_BITS(MU_FLAGS1_SIG_B_COMP_KNOWN);
> > mu_known.flags2 |= HE_BITS(MU_FLAGS2_PUNC_FROM_SIG_A_BW_KNOWN);
> > }
> > @@ -1046,7 +1046,7 @@ int mt76_connac2_mac_fill_rx_rate(struct mt76_dev *dev,
> > stbc = FIELD_GET(MT_PRXV_HT_STBC, v0);
> > gi = FIELD_GET(MT_PRXV_HT_SGI, v0);
> > *mode = FIELD_GET(MT_PRXV_TX_MODE, v0);
> > - if (is_mt7921(dev))
> > + if (is_connac2(dev))
> > dcm = !!(idx & MT_PRXV_TX_DCM);
> > else
> > dcm = FIELD_GET(MT_PRXV_DCM, v0);
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
> > index 3f583e2a1dc1..d7fbf3454bb8 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
> > @@ -65,7 +65,7 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
> > int cmd;
> >
> > if ((!is_connac_v1(dev) && addr == MCU_PATCH_ADDRESS) ||
> > - (is_mt7921(dev) && addr == 0x900000) ||
> > + (is_connac2(dev) && addr == 0x900000) ||
> > (is_mt7925(dev) && (addr == 0x900000 || addr == 0xe0002800)) ||
> > (is_mt799x(dev) && addr == 0x900000))
> > cmd = MCU_CMD(PATCH_START_REQ);
> > @@ -402,7 +402,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
> > switch (vif->type) {
> > case NL80211_IFTYPE_MESH_POINT:
> > case NL80211_IFTYPE_AP:
> > - if (vif->p2p && !is_mt7921(dev))
> > + if (vif->p2p && !is_connac2(dev))
> > conn_type = CONNECTION_P2P_GC;
> > else
> > conn_type = CONNECTION_INFRA_STA;
> > @@ -410,7 +410,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
> > basic->aid = cpu_to_le16(link_sta->sta->aid);
> > break;
> > case NL80211_IFTYPE_STATION:
> > - if (vif->p2p && !is_mt7921(dev))
> > + if (vif->p2p && !is_connac2(dev))
> > conn_type = CONNECTION_P2P_GO;
> > else
> > conn_type = CONNECTION_INFRA_AP;
> > @@ -874,7 +874,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
> > struct sta_rec_vht *vht;
> > int len;
> >
> > - len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
> > + len = is_connac2(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
> > tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
> > vht = (struct sta_rec_vht *)tlv;
> > vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
> > @@ -885,7 +885,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
> > /* starec uapsd */
> > mt76_connac_mcu_sta_uapsd(skb, vif, sta);
> >
> > - if (!is_mt7921(dev))
> > + if (!is_connac2(dev))
> > return;
> >
> > if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
> > @@ -1778,7 +1778,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
> > req->ssid_type_ext = n_ssids ? BIT(0) : 0;
> > req->ssids_num = n_ssids;
> >
> > - duration = is_mt7921(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
> > + duration = is_connac2(phy->dev) ? 0 : MT76_CONNAC_SCAN_CHANNEL_TIME;
> > /* increase channel time for passive scan */
> > if (!sreq->n_ssids)
> > duration *= 2;
> > @@ -1821,7 +1821,7 @@ int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
> > req->ies_len = cpu_to_le16(sreq->ie_len);
> > }
> >
> > - if (is_mt7921(phy->dev))
> > + if (is_connac2(phy->dev))
> > req->scan_func |= SCAN_FUNC_SPLIT_SCAN;
> >
> > memcpy(req->bssid, sreq->bssid, ETH_ALEN);
> > @@ -1897,7 +1897,7 @@ int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
> > get_random_mask_addr(addr, sreq->mac_addr,
> > sreq->mac_addr_mask);
> > }
> > - if (is_mt7921(phy->dev)) {
> > + if (is_connac2(phy->dev)) {
> > req->mt7921.bss_idx = mvif->idx;
> > req->mt7921.delay = cpu_to_le32(sreq->delay);
> > }
> > @@ -2037,7 +2037,7 @@ mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
> > struct mt76_power_limits *limits,
> > enum nl80211_band band)
> > {
> > - int max_power = is_mt7921(dev) ? 127 : 63;
> > + int max_power = is_connac2(dev) ? 127 : 63;
> > int i, offset = sizeof(limits->cck);
> >
> > memset(sku, max_power, MT_SKU_POWER_LIMIT);
> > @@ -2065,7 +2065,7 @@ mt76_connac_mcu_build_sku(struct mt76_dev *dev, s8 *sku,
> > offset += 12;
> > }
> >
> > - if (!is_mt7921(dev))
> > + if (!is_connac2(dev))
> > return;
> >
> > /* he */
> > @@ -2121,7 +2121,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
> > enum nl80211_band band)
> > {
> > struct mt76_dev *dev = phy->dev;
> > - int sku_len, batch_len = is_mt7921(dev) ? 8 : 16;
> > + int sku_len, batch_len = is_connac2(dev) ? 8 : 16;
> > static const u8 chan_list_2ghz[] = {
> > 1, 2, 3, 4, 5, 6, 7,
> > 8, 9, 10, 11, 12, 13, 14
> > @@ -2162,7 +2162,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
> > if (!limits)
> > return -ENOMEM;
> >
> > - sku_len = is_mt7921(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
> > + sku_len = is_connac2(dev) ? sizeof(sku_tlbv) : sizeof(sku_tlbv) - 92;
> > tx_power = 2 * phy->hw->conf.power_level;
> > if (!tx_power)
> > tx_power = 127;
> > @@ -3080,7 +3080,7 @@ static u32 mt76_connac2_get_data_mode(struct mt76_dev *dev, u32 info)
> > {
> > u32 mode = DL_MODE_NEED_RSP;
> >
> > - if ((!is_mt7921(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
> > + if ((!is_connac2(dev) && !is_mt7925(dev)) || info == PATCH_SEC_NOT_SUPPORT)
> > return mode;
> >
> > switch (FIELD_GET(PATCH_SEC_ENC_TYPE_MASK, info)) {
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > index f44977f9093d..1ef25385f3c6 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
> > @@ -1866,7 +1866,7 @@ mt76_connac_mcu_gen_dl_mode(struct mt76_dev *dev, u8 feature_set, bool is_wa)
> >
> > ret |= feature_set & FW_FEATURE_SET_ENCRYPT ?
> > DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV : 0;
> > - if (is_mt7921(dev) || is_mt7925(dev))
> > + if (is_connac2(dev) || is_mt7925(dev))
> > ret |= feature_set & FW_FEATURE_ENCRY_MODE ?
> > DL_CONFIG_ENCRY_MODE_SEL : 0;
> > ret |= FIELD_PREP(DL_MODE_KEY_IDX,
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
> > index f318a53e4deb..2142fcc4ae27 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
> > @@ -151,7 +151,7 @@ void mt792x_stop(struct ieee80211_hw *hw, bool suspend)
> > cancel_work_sync(&dev->reset_work);
> > mt76_connac_free_pending_tx_skbs(&dev->pm, NULL);
> >
> > - if (is_mt7921(&dev->mt76)) {
> > + if (is_connac2(&dev->mt76)) {
> > mt792x_mutex_acquire(dev);
> > mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, false, false);
> > mt792x_mutex_release(dev);
> > diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> > index 1ddec7788b66..34f07bd3097d 100644
> > --- a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> > +++ b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> > @@ -356,7 +356,7 @@ EXPORT_SYMBOL_GPL(mt792x_poll_rx);
> >
> > int mt792x_wfsys_reset(struct mt792x_dev *dev)
> > {
> > - u32 addr = is_mt7921(&dev->mt76) ? 0x18000140 : 0x7c000140;
> > + u32 addr = is_connac2(&dev->mt76) ? 0x18000140 : 0x7c000140;
> >
> > mt76_clear(dev, addr, WFSYS_SW_RST_B);
> > msleep(50);
>
>
> --
> Best, Philip
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks
2026-02-21 20:19 ` Sean Wang
@ 2026-03-22 8:04 ` Philip Müller
0 siblings, 0 replies; 16+ messages in thread
From: Philip Müller @ 2026-03-22 8:04 UTC (permalink / raw)
To: Sean Wang
Cc: nbd, lorenzo.bianconi, linux-wireless, linux-mediatek, Sean Wang
On 2/21/26 21:19, Sean Wang wrote:
> Thanks for the catch I’ll update this in the next version.
Hi Sean, thx. Do you have already an updated version of this driver and
a rough idea when all of this might reach wireless-next branch?
--
Best, Philip
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-03-22 8:15 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-19 0:39 [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks sean.wang
2026-02-19 0:39 ` [PATCH 02/11] wifi: mt76: mt7921: use mt76_for_each_q_rx() in reset path sean.wang
2026-02-19 0:39 ` [PATCH 03/11] wifi: mt76: mt7921: handle MT7902 irq_map quirk with mutable copy sean.wang
2026-02-20 10:09 ` Philip Müller
2026-02-20 18:39 ` Sean Wang
2026-02-19 0:40 ` [PATCH 04/11] wifi: mt76: mt7921: add MT7902e DMA layout support sean.wang
2026-02-19 0:40 ` [PATCH 05/11] wifi: mt76: connac: mark MT7902 as hw txp devices sean.wang
2026-02-19 0:40 ` [PATCH 06/11] wifi: mt76: mt792x: add PSE handling barrier for the large MCU cmd sean.wang
2026-02-19 0:40 ` [PATCH 07/11] wifi: mt76: mt792x: ensure MCU ready before ROM patch download sean.wang
2026-02-19 0:40 ` [PATCH 08/11] wifi: mt76: mt7921: add MT7902 MCU support sean.wang
2026-02-19 0:40 ` [PATCH 09/11] wifi: mt76: mt792x: add MT7902 WFDMA prefetch configuration sean.wang
2026-02-19 0:40 ` [PATCH 10/11] wifi: mt76: mt7921: add MT7902 PCIe device support sean.wang
2026-02-19 0:40 ` [PATCH 11/11] wifi: mt76: mt7921: add MT7902 SDIO " sean.wang
2026-02-20 20:41 ` [PATCH 01/11] wifi: mt76: connac: use is_connac2() to replace is_mt7921() checks Philip Müller
2026-02-21 20:19 ` Sean Wang
2026-03-22 8:04 ` Philip Müller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox