]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7921: add MT7902e DMA layout support
authorSean Wang <sean.wang@mediatek.com>
Thu, 19 Feb 2026 00:40:00 +0000 (18:40 -0600)
committerFelix Fietkau <nbd@nbd.name>
Tue, 24 Mar 2026 15:49:29 +0000 (15:49 +0000)
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>
Link: https://patch.msgid.link/20260219004007.19733-4-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
drivers/net/wireless/mediatek/mt76/mt7921/pci.c

index ad92af98e31453e71d272c60b5facc2a2f97d3b5..64f60c4fc60c886864e83e5f9bafc9ecb11d5573 100644 (file)
@@ -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,
index 5f857a21f362d470522bbc77148d0dbd5a0a8e7f..6bb3c6a1cf6ac2f38e3d78e32f797aa3b4579bc4 100644 (file)
@@ -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],