summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenzo Bianconi <lorenzo@kernel.org>2026-01-22 13:39:57 +0300
committerFelix Fietkau <nbd@nbd.name>2026-03-23 12:23:00 +0300
commitae8ee98014bab9b6b1b782bb19cf47317ea0499a (patch)
tree072149e8706358bd6ad5981cd659181174ad659d
parent93e2491470d34d2d45b240123da0267d6de68c71 (diff)
downloadlinux-ae8ee98014bab9b6b1b782bb19cf47317ea0499a.tar.xz
wifi: mt76: mt7996: Move RRO dma start in a dedicated routine
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>
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7996/dma.c69
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7996/init.c2
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h1
3 files changed, 41 insertions, 31 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c
index 07212d93bc62..1a4f5f5b2a84 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/dma.c
@@ -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)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index b76bd324a927..8aa9807b5087 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -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)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index dfa338e8508b..5b2aa7b2fa4f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -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);