[][MAC80211][wed][init all msdu_pg cnt to support kite]
[Description]
Add msdu_pg cnt init even if they are not used, to meet HW requirement
add wpdma_rx[1] to support kite(band0/band1 use different RXQ)
[Release-log]
N/A
Change-Id: I1c2617b798fa9d3563183d26b867fe5eb3ac12d2
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7985715
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-wed3-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-wed3-support.patch
index 572426d..2f2b204 100644
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-wed3-support.patch
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211/target/linux/mediatek/patches-5.4/999-3021-mtk-wed-add-wed3-support.patch
@@ -13,7 +13,7 @@
drivers/net/ethernet/mediatek/mtk_ppe.c | 17 +-
drivers/net/ethernet/mediatek/mtk_ppe.h | 2 +-
.../net/ethernet/mediatek/mtk_ppe_offload.c | 13 +-
- drivers/net/ethernet/mediatek/mtk_wed.c | 1155 +++++++++++++----
+ drivers/net/ethernet/mediatek/mtk_wed.c | 1165 +++++++++++++----
drivers/net/ethernet/mediatek/mtk_wed.h | 25 +-
.../net/ethernet/mediatek/mtk_wed_debugfs.c | 584 ++++++++-
drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 13 +-
@@ -1312,7 +1312,7 @@
wed_w32(dev, MTK_WED_PCIE_INT_CTRL,
FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2));
-@@ -756,45 +1119,51 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
+@@ -756,45 +1119,53 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
/* pcie interrupt control: pola/source selection */
wed_set(dev, MTK_WED_PCIE_INT_CTRL,
MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA |
@@ -1374,21 +1374,23 @@
+ int i;
+
+ wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
-+ wed_w32(dev, MTK_WED_WPDMA_RX_RING0, dev->wlan.wpdma_rx);
++ wed_w32(dev, MTK_WED_WPDMA_RX_RING0, dev->wlan.wpdma_rx[0]);
++ if (dev->wlan.wpdma_rx[1])
++ wed_w32(dev, MTK_WED_WPDMA_RX_RING1, dev->wlan.wpdma_rx[1]);
+
+ if (dev->wlan.hwrro) {
-+ wed_w32(dev, MTK_WED_RRO_RX_D_CFG(0), dev->wlan.wpdma_rx_rro[0]);
-+ wed_w32(dev, MTK_WED_RRO_RX_D_CFG(1), dev->wlan.wpdma_rx_rro[1]);
-+ for (i = 0; i < MTK_WED_RX_PAGE_QUEUES; i++) {
-+ wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING_CFG(i),
-+ dev->wlan.wpdma_rx_pg + i * 0x10);
++ wed_w32(dev, MTK_WED_RRO_RX_D_CFG(0), dev->wlan.wpdma_rx_rro[0]);
++ wed_w32(dev, MTK_WED_RRO_RX_D_CFG(1), dev->wlan.wpdma_rx_rro[1]);
++ for (i = 0; i < MTK_WED_RX_PAGE_QUEUES; i++) {
++ wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING_CFG(i),
++ dev->wlan.wpdma_rx_pg + i * 0x10);
+ }
+ }
+ }
}
}
-@@ -806,21 +1175,25 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
+@@ -806,21 +1177,25 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
mtk_wed_deinit(dev);
mtk_wed_reset(dev, MTK_WED_RESET_WED);
@@ -1424,7 +1426,7 @@
offset = dev->hw->index ? 0x04000400 : 0;
wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset);
wed_w32(dev, MTK_WED_WDMA_OFFSET1, 0x29002800 + offset);
-@@ -907,11 +1280,16 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
+@@ -907,11 +1282,16 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
} while (1);
/* configure RX_ROUTE_QM */
@@ -1446,7 +1448,7 @@
/* enable RX_ROUTE_QM */
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
-@@ -920,23 +1298,45 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
+@@ -920,23 +1300,45 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
static void
mtk_wed_tx_hw_init(struct mtk_wed_device *dev)
{
@@ -1502,7 +1504,7 @@
wed_w32(dev, MTK_WED_TX_BM_TKID,
FIELD_PREP(MTK_WED_TX_BM_TKID_START,
-@@ -946,25 +1346,44 @@ mtk_wed_tx_hw_init(struct mtk_wed_device *dev)
+@@ -946,25 +1348,44 @@ mtk_wed_tx_hw_init(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE);
@@ -1516,7 +1518,7 @@
+ else {
+ /* change to new bm */
+ wed_w32(dev, MTK_WED_TX_BM_INIT_PTR, dev->tx_buf_ring.pkt_nums |
-+ MTK_WED_TX_BM_INIT_SW_TAIL_IDX);
++ MTK_WED_TX_BM_INIT_SW_TAIL_IDX);
+ wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_LEGACY_EN);
+ }
@@ -1558,7 +1560,7 @@
wed_clr(dev, MTK_WED_TX_TKID_CTRL, MTK_WED_TX_TKID_CTRL_PAUSE);
}
-@@ -977,7 +1396,26 @@ mtk_wed_rx_hw_init(struct mtk_wed_device *dev)
+@@ -977,7 +1398,26 @@ mtk_wed_rx_hw_init(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
@@ -1585,7 +1587,7 @@
mtk_wed_rro_hw_init(dev);
mtk_wed_route_qm_hw_init(dev);
}
-@@ -991,7 +1429,7 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
+@@ -991,7 +1431,7 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
dev->init_done = true;
mtk_wed_set_ext_int(dev, false);
mtk_wed_tx_hw_init(dev);
@@ -1594,7 +1596,7 @@
mtk_wed_rx_hw_init(dev);
}
-@@ -1015,26 +1453,6 @@ mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size, int scale, bool tx)
+@@ -1015,26 +1455,6 @@ mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size, int scale, bool tx)
}
}
@@ -1621,7 +1623,7 @@
static void
mtk_wed_rx_reset(struct mtk_wed_device *dev)
{
-@@ -1133,7 +1551,7 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1133,7 +1553,7 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
mtk_wed_ring_reset(desc, MTK_WED_RX_RING_SIZE, 1, false);
}
@@ -1630,7 +1632,7 @@
}
-@@ -1271,12 +1689,15 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev,
+@@ -1271,12 +1691,15 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev,
int idx, int size, bool reset)
{
struct mtk_wed_ring *wdma = &dev->tx_wdma[idx];
@@ -1647,7 +1649,7 @@
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT,
-@@ -1296,12 +1717,31 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev,
+@@ -1296,12 +1719,31 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev,
int idx, int size, bool reset)
{
struct mtk_wed_ring *wdma = &dev->rx_wdma[idx];
@@ -1680,7 +1682,7 @@
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT,
-@@ -1312,7 +1752,7 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev,
+@@ -1312,7 +1754,7 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev,
MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0);
if (reset)
mtk_wed_ring_reset(wdma->desc, MTK_WED_WDMA_RING_SIZE,
@@ -1689,7 +1691,7 @@
if (idx == 0) {
wed_w32(dev, MTK_WED_WDMA_RING_TX
+ MTK_WED_RING_OFS_BASE, wdma->desc_phys);
-@@ -1395,7 +1835,7 @@ mtk_wed_send_msg(struct mtk_wed_device *dev, int cmd_id, void *data, int len)
+@@ -1395,7 +1837,7 @@ mtk_wed_send_msg(struct mtk_wed_device *dev, int cmd_id, void *data, int len)
{
struct mtk_wed_wo *wo = dev->hw->wed_wo;
@@ -1698,7 +1700,7 @@
return 0;
return mtk_wed_mcu_send_msg(wo, MODULE_ID_WO, cmd_id, data, len, true);
-@@ -1420,13 +1860,87 @@ mtk_wed_ppe_check(struct mtk_wed_device *dev, struct sk_buff *skb,
+@@ -1420,24 +1862,106 @@ mtk_wed_ppe_check(struct mtk_wed_device *dev, struct sk_buff *skb,
}
}
@@ -1788,7 +1790,18 @@
for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
if (!dev->tx_wdma[i].desc)
-@@ -1437,7 +1951,7 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+ mtk_wed_wdma_rx_ring_setup(dev, i, 16, false);
+
++ for (i = 0; i < ARRAY_SIZE(dev->rx_page_ring); i++) {
++ u32 count = MTK_WED_RRO_MSDU_PG_CTRL0(i) +
++ MTK_WED_RING_OFS_COUNT;
++
++ if (!wed_r32(dev, count))
++ wed_w32(dev, count, 1);
++ }
++
+ mtk_wed_hw_init(dev);
+
mtk_wed_set_int(dev, irq_mask);
mtk_wed_set_ext_int(dev, true);
@@ -1797,7 +1810,7 @@
u32 val;
val = dev->wlan.wpdma_phys |
-@@ -1448,33 +1962,52 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1448,33 +1972,52 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
val |= BIT(1);
val |= BIT(0);
regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
@@ -1853,7 +1866,7 @@
int ret = 0;
RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
-@@ -1494,34 +2027,30 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1494,34 +2037,30 @@ mtk_wed_attach(struct mtk_wed_device *dev)
goto out;
}
@@ -1898,7 +1911,7 @@
ret = mtk_wed_rro_alloc(dev);
if (ret)
goto error;
-@@ -1533,15 +2062,20 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1533,15 +2072,20 @@ mtk_wed_attach(struct mtk_wed_device *dev)
init_completion(&dev->wlan_reset_done);
atomic_set(&dev->fe_reset, 0);
@@ -1922,7 +1935,7 @@
out:
mutex_unlock(&hw_lock);
-@@ -1576,8 +2110,26 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
+@@ -1576,8 +2120,26 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, reset))
return -ENOMEM;
@@ -1949,7 +1962,7 @@
/* WED -> WPDMA */
wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
-@@ -1599,7 +2151,7 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
+@@ -1599,7 +2161,7 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
struct mtk_wed_ring *ring = &dev->txfree_ring;
int i, idx = 1;
@@ -1958,7 +1971,7 @@
idx = 0;
/*
-@@ -1652,6 +2204,129 @@ mtk_wed_rx_ring_setup(struct mtk_wed_device *dev,
+@@ -1652,6 +2214,129 @@ mtk_wed_rx_ring_setup(struct mtk_wed_device *dev,
return 0;
}
@@ -2088,7 +2101,7 @@
static u32
mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
{
-@@ -1659,9 +2334,13 @@ mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
+@@ -1659,9 +2344,13 @@ mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
val = wed_r32(dev, MTK_WED_EXT_INT_STATUS);
wed_w32(dev, MTK_WED_EXT_INT_STATUS, val);
@@ -2105,7 +2118,7 @@
if (val && net_ratelimit())
pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val);
-@@ -1754,6 +2433,9 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1754,6 +2443,9 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
.tx_ring_setup = mtk_wed_tx_ring_setup,
.txfree_ring_setup = mtk_wed_txfree_ring_setup,
.rx_ring_setup = mtk_wed_rx_ring_setup,
@@ -2115,7 +2128,7 @@
.msg_update = mtk_wed_send_msg,
.start = mtk_wed_start,
.stop = mtk_wed_stop,
-@@ -1765,6 +2447,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1765,6 +2457,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
.detach = mtk_wed_detach,
.setup_tc = mtk_wed_eth_setup_tc,
.ppe_check = mtk_wed_ppe_check,
@@ -2123,7 +2136,7 @@
};
struct device_node *eth_np = eth->dev->of_node;
struct platform_device *pdev;
-@@ -1804,9 +2487,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1804,9 +2497,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
hw->wdma_phy = wdma_phy;
hw->index = index;
hw->irq = irq;
@@ -2136,7 +2149,7 @@
hw->mirror = syscon_regmap_lookup_by_phandle(eth_np,
"mediatek,pcie-mirror");
hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np,
-@@ -1821,7 +2505,6 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1821,7 +2515,6 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
regmap_write(hw->mirror, 0, 0);
regmap_write(hw->mirror, 4, 0);
}
@@ -3581,7 +3594,8 @@
@@ -142,9 +163,13 @@ struct mtk_wed_device {
u32 wpdma_txfree;
u32 wpdma_rx_glo;
- u32 wpdma_rx;
+- u32 wpdma_rx;
++ u32 wpdma_rx[MTK_WED_RX_QUEUES];
+ u32 wpdma_rx_rro[MTK_WED_RX_QUEUES];
+ u32 wpdma_rx_pg;