mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
4d18083d6b
commit
96326447d4
@@ -59,7 +59,9 @@ struct mtk_wed_flow_block_priv {
|
||||
static const struct mtk_wed_soc_data mt7622_data = {
|
||||
.regmap = {
|
||||
.tx_bm_tkid = 0x088,
|
||||
.wpdma_rx_ring0 = 0x770,
|
||||
.wpdma_rx_ring = {
|
||||
0x770,
|
||||
},
|
||||
.reset_idx_tx_mask = GENMASK(3, 0),
|
||||
.reset_idx_rx_mask = GENMASK(17, 16),
|
||||
},
|
||||
@@ -70,7 +72,9 @@ static const struct mtk_wed_soc_data mt7622_data = {
|
||||
static const struct mtk_wed_soc_data mt7986_data = {
|
||||
.regmap = {
|
||||
.tx_bm_tkid = 0x0c8,
|
||||
.wpdma_rx_ring0 = 0x770,
|
||||
.wpdma_rx_ring = {
|
||||
0x770,
|
||||
},
|
||||
.reset_idx_tx_mask = GENMASK(1, 0),
|
||||
.reset_idx_rx_mask = GENMASK(7, 6),
|
||||
},
|
||||
@@ -81,7 +85,10 @@ static const struct mtk_wed_soc_data mt7986_data = {
|
||||
static const struct mtk_wed_soc_data mt7988_data = {
|
||||
.regmap = {
|
||||
.tx_bm_tkid = 0x0c8,
|
||||
.wpdma_rx_ring0 = 0x7d0,
|
||||
.wpdma_rx_ring = {
|
||||
0x7d0,
|
||||
0x7d8,
|
||||
},
|
||||
.reset_idx_tx_mask = GENMASK(1, 0),
|
||||
.reset_idx_rx_mask = GENMASK(7, 6),
|
||||
},
|
||||
@@ -621,8 +628,8 @@ mtk_wed_amsdu_init(struct mtk_wed_device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* eagle E1 PCIE1 tx ring 22 flow control issue */
|
||||
if (dev->wlan.id == 0x7991)
|
||||
/* Kite and Eagle E1 PCIE1 tx ring 22 flow control issue */
|
||||
if (dev->wlan.id == 0x7991 || dev->wlan.id == 0x7992)
|
||||
wed_clr(dev, MTK_WED_AMSDU_FIFO, MTK_WED_AMSDU_IS_PRIOR0_RING);
|
||||
|
||||
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_AMSDU_EN);
|
||||
@@ -1239,7 +1246,11 @@ mtk_wed_set_wpdma(struct mtk_wed_device *dev)
|
||||
return;
|
||||
|
||||
wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
|
||||
wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring0, dev->wlan.wpdma_rx);
|
||||
wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring[0],
|
||||
dev->wlan.wpdma_rx[0]);
|
||||
if (mtk_wed_is_v3_or_greater(dev->hw))
|
||||
wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring[1],
|
||||
dev->wlan.wpdma_rx[1]);
|
||||
|
||||
if (!dev->wlan.hw_rro)
|
||||
return;
|
||||
@@ -2323,6 +2334,16 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
|
||||
if (!dev->rx_wdma[i].desc)
|
||||
mtk_wed_wdma_rx_ring_setup(dev, i, 16, false);
|
||||
|
||||
if (dev->wlan.hw_rro) {
|
||||
for (i = 0; i < MTK_WED_RX_PAGE_QUEUES; i++) {
|
||||
u32 addr = MTK_WED_RRO_MSDU_PG_CTRL0(i) +
|
||||
MTK_WED_RING_OFS_COUNT;
|
||||
|
||||
if (!wed_r32(dev, addr))
|
||||
wed_w32(dev, addr, 1);
|
||||
}
|
||||
}
|
||||
|
||||
mtk_wed_hw_init(dev);
|
||||
mtk_wed_configure_irq(dev, irq_mask);
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ struct mtk_wed_wo;
|
||||
struct mtk_wed_soc_data {
|
||||
struct {
|
||||
u32 tx_bm_tkid;
|
||||
u32 wpdma_rx_ring0;
|
||||
u32 wpdma_rx_ring[MTK_WED_RX_QUEUES];
|
||||
u32 reset_idx_tx_mask;
|
||||
u32 reset_idx_rx_mask;
|
||||
} regmap;
|
||||
|
||||
@@ -664,8 +664,8 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
|
||||
MT_RXQ_WED_RING_BASE;
|
||||
wed->wlan.wpdma_rx_glo = pci_resource_start(pci_dev, 0) +
|
||||
MT_WPDMA_GLO_CFG;
|
||||
wed->wlan.wpdma_rx = pci_resource_start(pci_dev, 0) +
|
||||
MT_RXQ_WED_DATA_RING_BASE;
|
||||
wed->wlan.wpdma_rx[0] = pci_resource_start(pci_dev, 0) +
|
||||
MT_RXQ_WED_DATA_RING_BASE;
|
||||
} else {
|
||||
struct platform_device *plat_dev = pdev_ptr;
|
||||
struct resource *res;
|
||||
@@ -687,7 +687,7 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
|
||||
wed->wlan.wpdma_tx = res->start + MT_TXQ_WED_RING_BASE;
|
||||
wed->wlan.wpdma_txfree = res->start + MT_RXQ_WED_RING_BASE;
|
||||
wed->wlan.wpdma_rx_glo = res->start + MT_WPDMA_GLO_CFG;
|
||||
wed->wlan.wpdma_rx = res->start + MT_RXQ_WED_DATA_RING_BASE;
|
||||
wed->wlan.wpdma_rx[0] = res->start + MT_RXQ_WED_DATA_RING_BASE;
|
||||
}
|
||||
wed->wlan.nbuf = MT7915_HW_TOKEN_SIZE;
|
||||
wed->wlan.tx_tbit[0] = is_mt7915(&dev->mt76) ? 4 : 30;
|
||||
|
||||
@@ -503,9 +503,9 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
|
||||
}
|
||||
|
||||
wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + hif1_ofs + MT_WFDMA0_GLO_CFG;
|
||||
wed->wlan.wpdma_rx = wed->wlan.phy_base + hif1_ofs +
|
||||
MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
|
||||
MT7996_RXQ_BAND0 * MT_RING_SIZE;
|
||||
wed->wlan.wpdma_rx[0] = wed->wlan.phy_base + hif1_ofs +
|
||||
MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
|
||||
MT7996_RXQ_BAND0 * MT_RING_SIZE;
|
||||
|
||||
wed->wlan.id = MT7996_DEVICE_ID_2;
|
||||
wed->wlan.tx_tbit[0] = ffs(MT_INT_TX_DONE_BAND2) - 1;
|
||||
@@ -518,9 +518,9 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
|
||||
|
||||
wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + MT_WFDMA0_GLO_CFG;
|
||||
|
||||
wed->wlan.wpdma_rx = wed->wlan.phy_base +
|
||||
MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
|
||||
MT7996_RXQ_BAND0 * MT_RING_SIZE;
|
||||
wed->wlan.wpdma_rx[0] = wed->wlan.phy_base +
|
||||
MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
|
||||
MT7996_RXQ_BAND0 * MT_RING_SIZE;
|
||||
|
||||
wed->wlan.wpdma_rx_rro[0] = wed->wlan.phy_base +
|
||||
MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND0) +
|
||||
|
||||
@@ -147,7 +147,7 @@ struct mtk_wed_device {
|
||||
u32 wpdma_tx;
|
||||
u32 wpdma_txfree;
|
||||
u32 wpdma_rx_glo;
|
||||
u32 wpdma_rx;
|
||||
u32 wpdma_rx[MTK_WED_RX_QUEUES];
|
||||
u32 wpdma_rx_rro[MTK_WED_RX_QUEUES];
|
||||
u32 wpdma_rx_pg;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user