]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7996: Move RRO dma start in a dedicated routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 22 Jan 2026 10:39:57 +0000 (11:39 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 23 Mar 2026 09:23:00 +0000 (09:23 +0000)
This is a preliminary patch to properly enable NPU offloading for MT7996
chipset since NPU initialization must be completed before kicking rx
queues.

Tested-by: Kang Yang <kang.yang@airoha.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://patch.msgid.link/20260122-mt76-npu-eagle-offload-v2-13-2374614c0de6@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/dma.c
drivers/net/wireless/mediatek/mt76/mt7996/init.c
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h

index 07212d93bc62df69720963f5ba04090bc82003fc..1a4f5f5b2a8435933070bb7d8feab26a0c174922 100644 (file)
@@ -521,7 +521,7 @@ static void mt7996_dma_enable(struct mt7996_dev *dev, bool reset)
 int mt7996_dma_rro_init(struct mt7996_dev *dev)
 {
        struct mt76_dev *mdev = &dev->mt76;
-       u32 irq_mask, size;
+       u32 size;
        int ret;
 
        if (dev->mt76.hwrro_mode == MT76_HWRRO_V3_1) {
@@ -548,7 +548,8 @@ int mt7996_dma_rro_init(struct mt7996_dev *dev)
                        mt76_queue_reset(dev, &mdev->q_rx[MT_RXQ_RRO_RXDMAD_C],
                                         true);
                }
-               goto start_hw_rro;
+
+               return 0;
        }
 
        /* ind cmd */
@@ -615,43 +616,49 @@ int mt7996_dma_rro_init(struct mt7996_dev *dev)
                        return ret;
        }
 
-start_hw_rro:
-       if (mtk_wed_device_active(&mdev->mmio.wed)) {
-               irq_mask = mdev->mmio.irqmask |
+       return 0;
+}
+
+void mt7996_dma_rro_start(struct mt7996_dev *dev)
+{
+       u32 irq_mask;
+
+       if (mtk_wed_device_active(&dev->mt76.mmio.wed)) {
+               irq_mask = dev->mt76.mmio.irqmask |
                           MT_INT_TX_DONE_BAND2;
 
                mt76_wr(dev, MT_INT_MASK_CSR, irq_mask);
-               mtk_wed_device_start_hw_rro(&mdev->mmio.wed, irq_mask, false);
+               mtk_wed_device_start_hw_rro(&dev->mt76.mmio.wed, irq_mask,
+                                           false);
                mt7996_irq_enable(dev, irq_mask);
-       } else {
-               if (is_mt7996(&dev->mt76)) {
-                       mt76_queue_rx_init(dev, MT_RXQ_MSDU_PAGE_BAND1,
-                                          mt76_dma_rx_poll);
-                       mt76_queue_rx_init(dev, MT_RXQ_MSDU_PAGE_BAND2,
-                                          mt76_dma_rx_poll);
-                       mt76_queue_rx_init(dev, MT_RXQ_RRO_BAND2,
-                                          mt76_dma_rx_poll);
-               } else {
-                       mt76_queue_rx_init(dev, MT_RXQ_RRO_BAND1,
-                                          mt76_dma_rx_poll);
-               }
+               return;
+       }
 
-               mt76_queue_rx_init(dev, MT_RXQ_RRO_BAND0, mt76_dma_rx_poll);
-               if (dev->mt76.hwrro_mode == MT76_HWRRO_V3_1) {
-                       mt76_queue_rx_init(dev, MT_RXQ_RRO_RXDMAD_C,
-                                          mt76_dma_rx_poll);
-               } else {
-                       mt76_queue_rx_init(dev, MT_RXQ_RRO_IND,
-                                          mt76_dma_rx_poll);
-                       mt76_queue_rx_init(dev, MT_RXQ_MSDU_PAGE_BAND0,
-                                          mt76_dma_rx_poll);
-               }
+       if (is_mt7996(&dev->mt76)) {
+               mt76_queue_rx_init(dev, MT_RXQ_MSDU_PAGE_BAND1,
+                                  mt76_dma_rx_poll);
+               mt76_queue_rx_init(dev, MT_RXQ_MSDU_PAGE_BAND2,
+                                  mt76_dma_rx_poll);
+               mt76_queue_rx_init(dev, MT_RXQ_RRO_BAND2,
+                                  mt76_dma_rx_poll);
+       } else {
+               mt76_queue_rx_init(dev, MT_RXQ_RRO_BAND1,
+                                  mt76_dma_rx_poll);
+       }
 
-               if (!mt76_npu_device_active(&dev->mt76))
-                       mt7996_irq_enable(dev, MT_INT_RRO_RX_DONE);
+       mt76_queue_rx_init(dev, MT_RXQ_RRO_BAND0, mt76_dma_rx_poll);
+       if (dev->mt76.hwrro_mode == MT76_HWRRO_V3_1) {
+               mt76_queue_rx_init(dev, MT_RXQ_RRO_RXDMAD_C,
+                                  mt76_dma_rx_poll);
+       } else {
+               mt76_queue_rx_init(dev, MT_RXQ_RRO_IND,
+                                  mt76_dma_rx_poll);
+               mt76_queue_rx_init(dev, MT_RXQ_MSDU_PAGE_BAND0,
+                                  mt76_dma_rx_poll);
        }
 
-       return 0;
+       if (!mt76_npu_device_active(&dev->mt76))
+               mt7996_irq_enable(dev, MT_INT_RRO_RX_DONE);
 }
 
 int mt7996_dma_init(struct mt7996_dev *dev)
index b76bd324a927e7c1bce98539d24e83a7d5bfee42..8aa9807b5087fa24182385336e79857ef5f3a87c 100644 (file)
@@ -1739,6 +1739,8 @@ int mt7996_register_device(struct mt7996_dev *dev)
        if (ret)
                return ret;
 
+       mt7996_dma_rro_start(dev);
+
        ret = mt76_register_device(&dev->mt76, true, mt76_rates,
                                   ARRAY_SIZE(mt76_rates));
        if (ret)
index dfa338e8508b1d88f313dfc1dbbd31006f38f8a5..5b2aa7b2fa4fb375f080b4fc02dba56f4ffad9fc 100644 (file)
@@ -887,6 +887,7 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
 #endif
 
 int mt7996_dma_rro_init(struct mt7996_dev *dev);
+void mt7996_dma_rro_start(struct mt7996_dev *dev);
 
 #ifdef CONFIG_MT7996_NPU
 int __mt7996_npu_hw_init(struct mt7996_dev *dev);