]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mt76: mt7996: Store DMA mapped buffer addresses in mt7996_npu_hw_init()
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 22 Jan 2026 10:40:00 +0000 (11:40 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 23 Mar 2026 09:23:01 +0000 (09:23 +0000)
In order to not always reallocate them during NPU reset, store the DMA
mapped buffer addresses allocated by mt7996_npu_hw_init routine in
mt7996 structure.

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-16-2374614c0de6@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
drivers/net/wireless/mediatek/mt76/mt7996/npu.c

index 5b2aa7b2fa4fb375f080b4fc02dba56f4ffad9fc..3ff730e36fa60830cc9ba5311643b008860cec22 100644 (file)
@@ -31,6 +31,8 @@
 #define MT7996_RX_MCU_RING_SIZE_WA     1024
 #define MT7996_NPU_TX_RING_SIZE                1024
 #define MT7996_NPU_RX_RING_SIZE                1024
+#define MT7996_NPU_TXD_SIZE            3
+
 /* scatter-gather of mcu event is not supported in connac3 */
 #define MT7996_RX_MCU_BUF_SIZE         (2048 + \
                                         SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
@@ -476,6 +478,8 @@ struct mt7996_dev {
                struct list_head page_map[MT7996_RRO_MSDU_PG_HASH_SIZE];
        } wed_rro;
 
+       dma_addr_t npu_txd_addr[2 * MT7996_NPU_TXD_SIZE];
+
        bool ibf;
        u8 fw_debug_wm;
        u8 fw_debug_wa;
index 0085eddc88bcaf99e284dd2e2159d898ea51e297..b8006b8729a11186370a9e33873625b5c1dde75e 100644 (file)
@@ -344,12 +344,14 @@ static int mt7996_npu_txd_init(struct mt7996_dev *dev, struct airoha_npu *npu)
                MT_BAND0,
                is_mt7996(&dev->mt76) ? MT_BAND2 : MT_BAND1,
        };
-       int i;
+       int i, index = 0;
+
+       BUILD_BUG_ON(ARRAY_SIZE(band_list) * 3 !=
+                    ARRAY_SIZE(dev->npu_txd_addr));
 
        for (i = 0; i < ARRAY_SIZE(band_list); i++) {
                int err, band = band_list[i], phy_id;
-               dma_addr_t dma_addr;
-               u32 val, size;
+               u32 val;
 
                err = mt76_npu_get_msg(npu, band + 5,
                                       WLAN_FUNC_GET_WAIT_RXDESC_BASE,
@@ -364,43 +366,29 @@ static int mt7996_npu_txd_init(struct mt7996_dev *dev, struct airoha_npu *npu)
                                               : band;
                writel(val, &dev->mt76.phys[phy_id]->q_tx[0]->regs->desc_base);
 
-               size = is_mt7996(&dev->mt76) ? band == MT_BAND2
-                                            ? MT7996_NPU_TX_RING_SIZE
-                                            : MT7996_NPU_RX_RING_SIZE / 2
-                                            : MT7996_TX_RING_SIZE;
-               if (!dmam_alloc_coherent(dev->mt76.dma_dev, 256 * size,
-                                        &dma_addr, GFP_KERNEL))
-                       return -ENOMEM;
-
                err = mt76_npu_send_msg(npu, band,
                                        WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
-                                       dma_addr, GFP_KERNEL);
+                                       dev->npu_txd_addr[index++], GFP_KERNEL);
                if (err) {
                        dev_warn(dev->mt76.dev,
                                 "failed setting NPU wlan queue buf addr\n");
                        return err;
                }
 
-               if (!dmam_alloc_coherent(dev->mt76.dma_dev, 256 * size,
-                                        &dma_addr, GFP_KERNEL))
-                       return -ENOMEM;
-
                err = mt76_npu_send_msg(npu, band + 5,
                                        WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
-                                       dma_addr, GFP_KERNEL);
+                                       dev->npu_txd_addr[index++],
+                                       GFP_KERNEL);
                if (err) {
                        dev_warn(dev->mt76.dev,
                                 "failed setting NPU wlan tx buf addr\n");
                        return err;
                }
 
-               if (!dmam_alloc_coherent(dev->mt76.dma_dev, 256 * 1024,
-                                        &dma_addr, GFP_KERNEL))
-                       return -ENOMEM;
-
                err = mt76_npu_send_msg(npu, band + 10,
                                        WLAN_FUNC_SET_WAIT_TX_BUF_SPACE_HW_BASE,
-                                       dma_addr, GFP_KERNEL);
+                                       dev->npu_txd_addr[index++],
+                                       GFP_KERNEL);
                if (err) {
                        dev_warn(dev->mt76.dev,
                                 "failed setting NPU wlan tx buf base\n");
@@ -570,7 +558,31 @@ int __mt7996_npu_hw_init(struct mt7996_dev *dev)
 
 int mt7996_npu_hw_init(struct mt7996_dev *dev)
 {
-       int err;
+       int i, err;
+
+       BUILD_BUG_ON(ARRAY_SIZE(dev->npu_txd_addr) % 3);
+
+       for (i = 0; i < ARRAY_SIZE(dev->npu_txd_addr); i += 3) {
+               int band = i && is_mt7996(&dev->mt76) ? MT_BAND2 : MT_BAND0;
+               u32 size = is_mt7996(&dev->mt76) ? band == MT_BAND2
+                                                ? MT7996_NPU_TX_RING_SIZE
+                                                : MT7996_NPU_RX_RING_SIZE / 2
+                                                : MT7996_TX_RING_SIZE;
+
+               if (!dmam_alloc_coherent(dev->mt76.dma_dev, 256 * size,
+                                        &dev->npu_txd_addr[i], GFP_KERNEL))
+                       return -ENOMEM;
+
+               if (!dmam_alloc_coherent(dev->mt76.dma_dev, 256 * size,
+                                        &dev->npu_txd_addr[i + 1],
+                                        GFP_KERNEL))
+                       return -ENOMEM;
+
+               if (!dmam_alloc_coherent(dev->mt76.dma_dev, 256 * 1024,
+                                        &dev->npu_txd_addr[i + 2],
+                                        GFP_KERNEL))
+                       return -ENOMEM;
+       }
 
        mutex_lock(&dev->mt76.mutex);
        err = __mt7996_npu_hw_init(dev);