Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: mediatek: wed: Introduce MT7992 WED support to MT7988 SoC

Introduce the second WDMA RX ring in WED driver for MT7988 SoC since the
Mediatek MT7992 WiFi chipset supports two separated WDMA rings.
Add missing MT7988 configurations to properly support WED for MT7992 in
MT76 driver.

Co-developed-by: Rex Lu <rex.lu@mediatek.com>
Signed-off-by: Rex Lu <rex.lu@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://patch.msgid.link/20250812-mt7992-wed-support-v3-1-9ada78a819a4@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Lorenzo Bianconi and committed by
Jakub Kicinski
96326447 4d18083d

+38 -17
+27 -6
drivers/net/ethernet/mediatek/mtk_wed.c
··· 59 59 static const struct mtk_wed_soc_data mt7622_data = { 60 60 .regmap = { 61 61 .tx_bm_tkid = 0x088, 62 - .wpdma_rx_ring0 = 0x770, 62 + .wpdma_rx_ring = { 63 + 0x770, 64 + }, 63 65 .reset_idx_tx_mask = GENMASK(3, 0), 64 66 .reset_idx_rx_mask = GENMASK(17, 16), 65 67 }, ··· 72 70 static const struct mtk_wed_soc_data mt7986_data = { 73 71 .regmap = { 74 72 .tx_bm_tkid = 0x0c8, 75 - .wpdma_rx_ring0 = 0x770, 73 + .wpdma_rx_ring = { 74 + 0x770, 75 + }, 76 76 .reset_idx_tx_mask = GENMASK(1, 0), 77 77 .reset_idx_rx_mask = GENMASK(7, 6), 78 78 }, ··· 85 81 static const struct mtk_wed_soc_data mt7988_data = { 86 82 .regmap = { 87 83 .tx_bm_tkid = 0x0c8, 88 - .wpdma_rx_ring0 = 0x7d0, 84 + .wpdma_rx_ring = { 85 + 0x7d0, 86 + 0x7d8, 87 + }, 89 88 .reset_idx_tx_mask = GENMASK(1, 0), 90 89 .reset_idx_rx_mask = GENMASK(7, 6), 91 90 }, ··· 628 621 return ret; 629 622 } 630 623 631 - /* eagle E1 PCIE1 tx ring 22 flow control issue */ 632 - if (dev->wlan.id == 0x7991) 624 + /* Kite and Eagle E1 PCIE1 tx ring 22 flow control issue */ 625 + if (dev->wlan.id == 0x7991 || dev->wlan.id == 0x7992) 633 626 wed_clr(dev, MTK_WED_AMSDU_FIFO, MTK_WED_AMSDU_IS_PRIOR0_RING); 634 627 635 628 wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_AMSDU_EN); ··· 1246 1239 return; 1247 1240 1248 1241 wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo); 1249 - wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring0, dev->wlan.wpdma_rx); 1242 + wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring[0], 1243 + dev->wlan.wpdma_rx[0]); 1244 + if (mtk_wed_is_v3_or_greater(dev->hw)) 1245 + wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring[1], 1246 + dev->wlan.wpdma_rx[1]); 1250 1247 1251 1248 if (!dev->wlan.hw_rro) 1252 1249 return; ··· 2333 2322 for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) 2334 2323 if (!dev->rx_wdma[i].desc) 2335 2324 mtk_wed_wdma_rx_ring_setup(dev, i, 16, false); 2325 + 2326 + if (dev->wlan.hw_rro) { 2327 + for (i = 0; i < MTK_WED_RX_PAGE_QUEUES; i++) { 2328 + u32 addr = MTK_WED_RRO_MSDU_PG_CTRL0(i) + 2329 + MTK_WED_RING_OFS_COUNT; 2330 + 2331 + if (!wed_r32(dev, addr)) 2332 + wed_w32(dev, addr, 1); 2333 + } 2334 + } 2336 2335 2337 2336 mtk_wed_hw_init(dev); 2338 2337 mtk_wed_configure_irq(dev, irq_mask);
+1 -1
drivers/net/ethernet/mediatek/mtk_wed.h
··· 17 17 struct mtk_wed_soc_data { 18 18 struct { 19 19 u32 tx_bm_tkid; 20 - u32 wpdma_rx_ring0; 20 + u32 wpdma_rx_ring[MTK_WED_RX_QUEUES]; 21 21 u32 reset_idx_tx_mask; 22 22 u32 reset_idx_rx_mask; 23 23 } regmap;
+3 -3
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
··· 664 664 MT_RXQ_WED_RING_BASE; 665 665 wed->wlan.wpdma_rx_glo = pci_resource_start(pci_dev, 0) + 666 666 MT_WPDMA_GLO_CFG; 667 - wed->wlan.wpdma_rx = pci_resource_start(pci_dev, 0) + 668 - MT_RXQ_WED_DATA_RING_BASE; 667 + wed->wlan.wpdma_rx[0] = pci_resource_start(pci_dev, 0) + 668 + MT_RXQ_WED_DATA_RING_BASE; 669 669 } else { 670 670 struct platform_device *plat_dev = pdev_ptr; 671 671 struct resource *res; ··· 687 687 wed->wlan.wpdma_tx = res->start + MT_TXQ_WED_RING_BASE; 688 688 wed->wlan.wpdma_txfree = res->start + MT_RXQ_WED_RING_BASE; 689 689 wed->wlan.wpdma_rx_glo = res->start + MT_WPDMA_GLO_CFG; 690 - wed->wlan.wpdma_rx = res->start + MT_RXQ_WED_DATA_RING_BASE; 690 + wed->wlan.wpdma_rx[0] = res->start + MT_RXQ_WED_DATA_RING_BASE; 691 691 } 692 692 wed->wlan.nbuf = MT7915_HW_TOKEN_SIZE; 693 693 wed->wlan.tx_tbit[0] = is_mt7915(&dev->mt76) ? 4 : 30;
+6 -6
drivers/net/wireless/mediatek/mt76/mt7996/mmio.c
··· 503 503 } 504 504 505 505 wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + hif1_ofs + MT_WFDMA0_GLO_CFG; 506 - wed->wlan.wpdma_rx = wed->wlan.phy_base + hif1_ofs + 507 - MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) + 508 - MT7996_RXQ_BAND0 * MT_RING_SIZE; 506 + wed->wlan.wpdma_rx[0] = wed->wlan.phy_base + hif1_ofs + 507 + MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) + 508 + MT7996_RXQ_BAND0 * MT_RING_SIZE; 509 509 510 510 wed->wlan.id = MT7996_DEVICE_ID_2; 511 511 wed->wlan.tx_tbit[0] = ffs(MT_INT_TX_DONE_BAND2) - 1; ··· 518 518 519 519 wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + MT_WFDMA0_GLO_CFG; 520 520 521 - wed->wlan.wpdma_rx = wed->wlan.phy_base + 522 - MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) + 523 - MT7996_RXQ_BAND0 * MT_RING_SIZE; 521 + wed->wlan.wpdma_rx[0] = wed->wlan.phy_base + 522 + MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) + 523 + MT7996_RXQ_BAND0 * MT_RING_SIZE; 524 524 525 525 wed->wlan.wpdma_rx_rro[0] = wed->wlan.phy_base + 526 526 MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND0) +
+1 -1
include/linux/soc/mediatek/mtk_wed.h
··· 147 147 u32 wpdma_tx; 148 148 u32 wpdma_txfree; 149 149 u32 wpdma_rx_glo; 150 - u32 wpdma_rx; 150 + u32 wpdma_rx[MTK_WED_RX_QUEUES]; 151 151 u32 wpdma_rx_rro[MTK_WED_RX_QUEUES]; 152 152 u32 wpdma_rx_pg; 153 153