[][MAC80211][WED][Fix kite RX T.P ~0 due to sync upstream]
[Description]
Fix kite RX T.P ~0 due to sync upstream]
1. add init msdu_page_ctrl at wed start state
2. wed assign should be in order. such as wed0 -> wed1 -> ....
not base on pci domain
3. fix SER case call trace due to double free hwrro buffer
4. fix wed1 didn't init on 88d+eagle
[Release-log]
Change-Id: Idcabebc9c2be1ff195bf2642af8585b6b2019e59
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8725249
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch
index 28417c1..2aa0131 100644
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3009-add-wed-ser-support.patch
@@ -1,7 +1,7 @@
-From d62ace95491fa4569c9ca9bca0b49b4995194a45 Mon Sep 17 00:00:00 2001
+From 7f1319357888271ea4aeeda81723b19a8f5ef2c0 Mon Sep 17 00:00:00 2001
From: Sujuan Chen <sujuan.chen@mediatek.com>
Date: Mon, 18 Sep 2023 11:05:45 +0800
-Subject: [PATCH 09/24] add-wed-ser-support
+Subject: [PATCH] add-wed-ser-support
---
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 +
@@ -52,7 +52,7 @@
eth->netdev[i]);
break;
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index ad9f3d5..5dd1182 100644
+index ad9f3d5..b993f0e 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -13,8 +13,10 @@
@@ -343,8 +343,8 @@
return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep,
- timeout, false, dev);
+ timeout, false, dev, reg, mask);
-+}
-+
+ }
+
+static int
+mtk_wed_rx_reset(struct mtk_wed_device *dev)
+{
@@ -352,9 +352,9 @@
+ u8 val = WO_STATE_SER_RESET;
+ int i, ret;
+
-+ mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
-+ MTK_WED_WO_CMD_CHANGE_STATE, &val,
-+ sizeof(val), true);
++ ret = mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
++ MTK_WED_WO_CMD_CHANGE_STATE, &val,
++ sizeof(val), true);
+
+ if (ret)
+ return ret;
@@ -457,8 +457,8 @@
+ mtk_wed_free_rx_buffer(dev);
+
+ return 0;
- }
-
++}
++
+
static void
mtk_wed_reset_dma(struct mtk_wed_device *dev)
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch
index c3aac60..ee8eb41 100644
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3019-mtk-wed-add-wed3-support.patch
@@ -1,16 +1,16 @@
-From 3519673178423e9b7271782fd1a66f42cce88d19 Mon Sep 17 00:00:00 2001
+From 01c157492967f2c2f969ccf8aefe93519cb662d6 Mon Sep 17 00:00:00 2001
From: Sujuan Chen <sujuan.chen@mediatek.com>
Date: Mon, 18 Sep 2023 13:21:15 +0800
-Subject: [PATCH 19/24] mtk:wed:add wed3 support
+Subject: [PATCH] mtk:wed:add wed3 support
---
- arch/arm64/boot/dts/mediatek/mt7988.dtsi | 152 ++-
+ arch/arm64/boot/dts/mediatek/mt7988.dtsi | 152 +-
.../dts/mediatek/mt7988a-dsa-10g-spim-nor.dts | 16 +-
.../dts/mediatek/mt7988d-dsa-10g-spim-nor.dts | 16 +-
drivers/net/ethernet/mediatek/mtk_ppe.c | 17 +-
drivers/net/ethernet/mediatek/mtk_ppe.h | 2 +-
.../net/ethernet/mediatek/mtk_ppe_offload.c | 9 +-
- drivers/net/ethernet/mediatek/mtk_wed.c | 1192 +++++++++++++----
+ drivers/net/ethernet/mediatek/mtk_wed.c | 1228 +++++++++++++----
drivers/net/ethernet/mediatek/mtk_wed.h | 73 +-
.../net/ethernet/mediatek/mtk_wed_debugfs.c | 584 +++++++-
drivers/net/ethernet/mediatek/mtk_wed_mcu.c | 40 +-
@@ -18,7 +18,7 @@
drivers/net/ethernet/mediatek/mtk_wed_regs.h | 353 ++++-
include/linux/netdevice.h | 7 +
include/linux/soc/mediatek/mtk_wed.h | 77 +-
- 14 files changed, 2146 insertions(+), 399 deletions(-)
+ 14 files changed, 2161 insertions(+), 420 deletions(-)
mode change 100755 => 100644 drivers/net/ethernet/mediatek/mtk_ppe.c
diff --git a/arch/arm64/boot/dts/mediatek/mt7988.dtsi b/arch/arm64/boot/dts/mediatek/mt7988.dtsi
@@ -392,7 +392,7 @@
return err;
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index 68eedd3..2fed493 100644
+index 68eedd3..878f1bb 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -23,9 +23,45 @@
@@ -469,39 +469,56 @@
static int
mtk_wdma_rx_reset(struct mtk_wed_device *dev)
{
-@@ -249,7 +305,7 @@ mtk_wed_assign(struct mtk_wed_device *dev)
- if (!hw->wed_dev)
- goto out;
+@@ -238,71 +294,171 @@ void mtk_wed_fe_reset_complete(void)
+ static struct mtk_wed_hw *
+ mtk_wed_assign(struct mtk_wed_device *dev)
+ {
+- struct mtk_wed_hw *hw;
+ int i;
+
+- if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
+- hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)];
+- if (!hw)
+- return NULL;
++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
++ struct mtk_wed_hw *hw = hw_list[i];
+
+- if (!hw->wed_dev)
+- goto out;
++ if (!hw || hw->wed_dev)
++ continue;
- if (hw->version == 1)
-+ if (mtk_wed_is_v1(hw))
- return NULL;
+- return NULL;
++ hw->wed_dev = dev;
++ hw->pci_base = MTK_WED_PCIE_BASE;
- /* MT7986 WED devices do not have any pcie slot restrictions */
-@@ -269,40 +325,153 @@ mtk_wed_assign(struct mtk_wed_device *dev)
- }
+- /* MT7986 WED devices do not have any pcie slot restrictions */
+- }
+- /* MT7986 PCIE or AXI */
+- for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
+- hw = hw_list[i];
+- if (hw && !hw->wed_dev)
+- goto out;
++ return hw;
+ }
- static int
--mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
+ return NULL;
++}
+
+-out:
+- hw->wed_dev = dev;
+- return hw;
++static int
+mtk_wed_amsdu_buffer_alloc(struct mtk_wed_device *dev)
- {
-- struct mtk_wdma_desc *desc;
-- dma_addr_t desc_phys;
-- void **page_list;
-- int token = dev->wlan.token_start;
-- int ring_size, n_pages, page_idx;
++{
+ struct mtk_wed_hw *hw = dev->hw;
+ struct mtk_wed_amsdu *wed_amsdu;
- int i;
-
++ int i;
++
+ if (!mtk_wed_is_v3_or_greater(hw))
+ return 0;
-
-- if (dev->hw->version == 1)
-- ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
-- else
-- ring_size = MTK_WED_VLD_GROUP_SIZE * MTK_WED_PER_GROUP_PKT +
-- MTK_WED_WDMA_RING_SIZE * 2;
++
+ wed_amsdu = devm_kcalloc(hw->dev, MTK_WED_AMSDU_NPAGES,
+ sizeof(*wed_amsdu), GFP_KERNEL);
+ if (!wed_amsdu)
@@ -562,8 +579,7 @@
+
+ if (!wed_amsdu)
+ return 0;
-
-- n_pages = ring_size / MTK_WED_BUF_PER_PAGE;
++
+ for (i = 0; i < MTK_WED_AMSDU_NPAGES; i++)
+ wed_w32(dev, MTK_WED_AMSDU_HIFTXD_BASE_L(i),
+ wed_amsdu[i].txd_phy);
@@ -604,20 +620,32 @@
+ wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_AMSDU_EN);
+
+ return 0;
-+}
-+
-+static int
-+mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
-+{
+ }
+
+ static int
+ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
+ {
+- struct mtk_wdma_desc *desc;
+- dma_addr_t desc_phys;
+- void **page_list;
+ u32 desc_size = dev->hw->soc->tx_ring_desc_size;
+ int i, page_idx = 0, n_pages, ring_size;
-+ int token = dev->wlan.token_start;
+ int token = dev->wlan.token_start;
+- int ring_size, n_pages, page_idx;
+- int i;
+-
+ struct mtk_wed_buf *page_list;
+ dma_addr_t desc_phys;
+ void *desc_ptr;
-+
+
+- if (dev->hw->version == 1)
+ if (!mtk_wed_is_v3_or_greater(dev->hw)) {
-+ ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
+ ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
+- else
+- ring_size = MTK_WED_VLD_GROUP_SIZE * MTK_WED_PER_GROUP_PKT +
+- MTK_WED_WDMA_RING_SIZE * 2;
+-
+- n_pages = ring_size / MTK_WED_BUF_PER_PAGE;
+ dev->tx_buf_ring.size = ring_size;
+ } else {
+ dev->tx_buf_ring.size = MTK_WED_TX_BM_DMA_SIZE;
@@ -650,7 +678,7 @@
dma_addr_t page_phys, buf_phys;
struct page *page;
void *buf;
-@@ -319,7 +488,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
+@@ -319,7 +475,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
return -ENOMEM;
}
@@ -660,7 +688,7 @@
dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
DMA_BIDIRECTIONAL);
-@@ -327,28 +497,31 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
+@@ -327,28 +484,31 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
buf_phys = page_phys;
for (s = 0; s < MTK_WED_BUF_PER_PAGE; s++) {
@@ -712,7 +740,7 @@
buf += MTK_WED_BUF_SIZE;
buf_phys += MTK_WED_BUF_SIZE;
}
-@@ -363,48 +536,107 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
+@@ -363,48 +523,107 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
static void
mtk_wed_free_tx_buffer(struct mtk_wed_device *dev)
{
@@ -840,7 +868,7 @@
dma_addr_t desc_phys;
dev->rx_buf_ring.size = dev->wlan.rx_nbuf;
-@@ -418,13 +650,48 @@ mtk_wed_rx_buffer_alloc(struct mtk_wed_device *dev)
+@@ -418,13 +637,48 @@ mtk_wed_rx_buffer_alloc(struct mtk_wed_device *dev)
dev->rx_buf_ring.desc_phys = desc_phys;
dev->wlan.init_rx_buf(dev, dev->wlan.rx_npkt);
@@ -891,7 +919,7 @@
if (!desc)
return;
-@@ -433,6 +700,28 @@ mtk_wed_free_rx_buffer(struct mtk_wed_device *dev)
+@@ -433,6 +687,28 @@ mtk_wed_free_rx_buffer(struct mtk_wed_device *dev)
dma_free_coherent(dev->hw->dev, dev->rx_buf_ring.size * sizeof(*desc),
desc, dev->rx_buf_ring.desc_phys);
@@ -920,7 +948,7 @@
}
static void
-@@ -450,6 +739,8 @@ mtk_wed_rx_buffer_hw_init(struct mtk_wed_device *dev)
+@@ -450,6 +726,8 @@ mtk_wed_rx_buffer_hw_init(struct mtk_wed_device *dev)
FIELD_PREP(MTK_WED_RX_BM_DYN_ALLOC_TH_H, 0xffff));
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN);
@@ -929,7 +957,7 @@
}
static void
-@@ -465,6 +756,16 @@ mtk_wed_free_ring(struct mtk_wed_device *dev, struct mtk_wed_ring *ring)
+@@ -465,6 +743,16 @@ mtk_wed_free_ring(struct mtk_wed_device *dev, struct mtk_wed_ring *ring)
static void
mtk_wed_free_rx_rings(struct mtk_wed_device *dev)
{
@@ -946,7 +974,7 @@
mtk_wed_free_rx_buffer(dev);
mtk_wed_free_ring(dev, &dev->rro.ring);
}
-@@ -475,9 +776,12 @@ mtk_wed_free_tx_rings(struct mtk_wed_device *dev)
+@@ -475,9 +763,12 @@ mtk_wed_free_tx_rings(struct mtk_wed_device *dev)
int i;
for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++)
@@ -961,7 +989,7 @@
}
static void
-@@ -485,8 +789,20 @@ mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
+@@ -485,8 +776,20 @@ mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
{
u32 mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK;
@@ -983,7 +1011,7 @@
if (!dev->hw->num_flows)
mask &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD;
-@@ -498,6 +814,9 @@ mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
+@@ -498,6 +801,9 @@ mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
static void
mtk_wed_set_512_support(struct mtk_wed_device *dev, bool enable)
{
@@ -993,7 +1021,7 @@
if (enable) {
wed_w32(dev, MTK_WED_TXDP_CTRL, MTK_WED_TXDP_DW9_OVERWR);
wed_w32(dev, MTK_WED_TXP_DW1,
-@@ -509,22 +828,15 @@ mtk_wed_set_512_support(struct mtk_wed_device *dev, bool enable)
+@@ -509,22 +815,15 @@ mtk_wed_set_512_support(struct mtk_wed_device *dev, bool enable)
}
}
@@ -1020,7 +1048,7 @@
if (cur_idx == MTK_WED_RX_RING_SIZE - 1)
break;
-@@ -532,14 +844,12 @@ mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev, int idx)
+@@ -532,14 +831,12 @@ mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev, int idx)
}
if (i == 3) {
@@ -1039,7 +1067,7 @@
}
static void
-@@ -561,7 +871,7 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
+@@ -561,7 +858,7 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
MTK_WDMA_GLO_CFG_RX_INFO2_PRERES);
@@ -1048,7 +1076,7 @@
regmap_write(dev->hw->mirror, dev->hw->index * 4, 0);
wdma_clr(dev, MTK_WDMA_GLO_CFG,
MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
-@@ -573,9 +883,17 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
+@@ -573,9 +870,17 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
MTK_WED_WPDMA_RX_D_RX_DRV_EN);
wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
@@ -1067,7 +1095,7 @@
}
static void
-@@ -589,7 +907,7 @@ mtk_wed_stop(struct mtk_wed_device *dev)
+@@ -589,7 +894,7 @@ mtk_wed_stop(struct mtk_wed_device *dev)
wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
@@ -1076,7 +1104,7 @@
return;
wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0);
-@@ -608,13 +926,21 @@ mtk_wed_deinit(struct mtk_wed_device *dev)
+@@ -608,13 +913,21 @@ mtk_wed_deinit(struct mtk_wed_device *dev)
MTK_WED_CTRL_WED_TX_BM_EN |
MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
@@ -1099,7 +1127,7 @@
}
static void
-@@ -627,6 +953,8 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -627,6 +940,8 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
mtk_wdma_rx_reset(dev);
mtk_wed_reset(dev, MTK_WED_RESET_WED);
@@ -1108,7 +1136,7 @@
mtk_wed_free_tx_buffer(dev);
mtk_wed_free_tx_rings(dev);
-@@ -636,7 +964,6 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -636,7 +951,6 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
mtk_wed_free_rx_rings(dev);
if(hw->wed_wo)
mtk_wed_wo_exit(hw);
@@ -1116,7 +1144,7 @@
}
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
-@@ -664,21 +991,36 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -664,21 +978,36 @@ mtk_wed_detach(struct mtk_wed_device *dev)
mutex_unlock(&hw_lock);
}
@@ -1139,11 +1167,11 @@
+ "mediatek,wed-pcie");
+ if (IS_ERR(regs))
+ break;
-
-- regmap_update_bits(regs, 0, BIT(0), BIT(0));
++
+ regmap_update_bits(regs, 0, BIT(0), BIT(0));
+ }
-+
+
+- regmap_update_bits(regs, 0, BIT(0), BIT(0));
+ if (dev->wlan.msi) {
+ wed_w32(dev, MTK_WED_PCIE_CFG_INTM,
+ dev->hw->pci_base | 0xc08);
@@ -1160,7 +1188,7 @@
wed_w32(dev, MTK_WED_PCIE_INT_CTRL,
FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2));
-@@ -686,19 +1028,9 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
+@@ -686,19 +1015,9 @@ 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 |
@@ -1183,7 +1211,7 @@
break;
}
case MTK_WED_BUS_AXI:
-@@ -714,45 +1046,71 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
+@@ -714,45 +1033,71 @@ mtk_wed_bus_init(struct mtk_wed_device *dev)
static void
mtk_wed_set_wpdma(struct mtk_wed_device *dev)
{
@@ -1275,7 +1303,7 @@
} else {
wed_w32(dev, MTK_WED_WDMA_CFG_BASE, dev->hw->wdma_phy);
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_ETH_DMAD_FMT);
-@@ -844,7 +1202,8 @@ mtk_wed_rro_cfg(struct mtk_wed_device *dev)
+@@ -844,7 +1189,8 @@ mtk_wed_rro_cfg(struct mtk_wed_device *dev)
},
};
@@ -1285,7 +1313,7 @@
&req, sizeof(req), true);
}
-@@ -895,11 +1254,18 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
+@@ -895,11 +1241,18 @@ mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
}
/* configure RX_ROUTE_QM */
@@ -1309,7 +1337,7 @@
/* enable RX_ROUTE_QM */
wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
-@@ -918,35 +1284,26 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
+@@ -918,35 +1271,26 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE);
@@ -1350,7 +1378,7 @@
wed_w32(dev, MTK_WED_TX_BM_DYN_THR,
FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO_V2, 0) |
MTK_WED_TX_BM_DYN_THR_HI_V2);
-@@ -956,32 +1313,73 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
+@@ -956,32 +1300,73 @@ mtk_wed_hw_init(struct mtk_wed_device *dev)
dev->tx_buf_ring.size / 128) |
FIELD_PREP(MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM,
dev->tx_buf_ring.size / 128));
@@ -1431,7 +1459,7 @@
}
static void
-@@ -1099,13 +1497,8 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1099,13 +1484,8 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
if (ret) {
mtk_wed_reset(dev, MTK_WED_RESET_WED_RX_DMA);
} else {
@@ -1447,7 +1475,7 @@
wed_w32(dev, MTK_WED_RESET_IDX, 0);
}
-@@ -1162,7 +1555,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1162,7 +1542,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA);
} else {
@@ -1457,7 +1485,7 @@
wed_w32(dev, MTK_WED_RESET_IDX, 0);
}
-@@ -1226,7 +1620,7 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1226,7 +1607,7 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
}
dev->init_done = false;
@@ -1466,7 +1494,7 @@
return;
if (!busy) {
-@@ -1257,7 +1651,6 @@ static int
+@@ -1257,7 +1638,6 @@ static int
mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
bool reset)
{
@@ -1474,7 +1502,7 @@
struct mtk_wed_ring *wdma;
if (idx >= ARRAY_SIZE(dev->rx_wdma))
-@@ -1265,9 +1658,11 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
+@@ -1265,9 +1645,11 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
wdma = &dev->rx_wdma[idx];
if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
@@ -1487,7 +1515,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,
-@@ -1286,7 +1681,6 @@ static int
+@@ -1286,7 +1668,6 @@ static int
mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
bool reset)
{
@@ -1495,7 +1523,7 @@
struct mtk_wed_ring *wdma;
if (idx >= ARRAY_SIZE(dev->tx_wdma))
-@@ -1294,9 +1688,29 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
+@@ -1294,9 +1675,29 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
wdma = &dev->tx_wdma[idx];
if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
@@ -1526,7 +1554,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,
-@@ -1354,7 +1768,7 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1354,7 +1755,7 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
MTK_WED_CTRL_WED_TX_BM_EN |
MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
@@ -1535,7 +1563,7 @@
wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER,
MTK_WED_PCIE_INT_TRIGGER_STATUS);
-@@ -1364,8 +1778,9 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1364,8 +1765,9 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
} else {
@@ -1547,7 +1575,7 @@
/* initail tx interrupt trigger */
wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX,
MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN |
-@@ -1384,19 +1799,25 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1384,19 +1786,25 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG,
dev->wlan.txfree_tbit));
@@ -1583,7 +1611,7 @@
}
/* initail wdma interrupt agent */
wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask);
-@@ -1407,56 +1828,293 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1407,58 +1815,295 @@ mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
wed_w32(dev, MTK_WED_INT_MASK, irq_mask);
}
@@ -1682,7 +1710,9 @@
+
+ if (!mtk_wed_get_rx_capa(dev))
+ return;
-+
+
+- for (i = 0; i < MTK_WED_RX_QUEUES; i++)
+- mtk_wed_check_wfdma_rx_fill(dev, i);
+ wed_set(dev, MTK_WED_WDMA_GLO_CFG,
+ MTK_WED_WDMA_GLO_CFG_TX_DRV_EN |
+ MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
@@ -1728,9 +1758,9 @@
+ dev_err(dev->hw->dev,
+ "mtk_wed%d: rx(%d) dma enable successful!\n",
+ dev->hw->index, i);
-+ }
-+}
-+
+ }
+ }
+
+static void
+mtk_wed_start_hw_rro(struct mtk_wed_device *dev, u32 irq_mask)
+{
@@ -1838,9 +1868,7 @@
+ struct mtk_wed_ring *ring = &dev->ind_cmd_ring;
+ u32 val = readl(regs + MTK_WED_RING_OFS_COUNT);
+ int i = 0, count = 0;
-
-- for (i = 0; i < MTK_WED_RX_QUEUES; i++)
-- mtk_wed_check_wfdma_rx_fill(dev, i);
++
+ ring->wpdma = regs;
+
+ if (readl(regs) & 0xf)
@@ -1879,7 +1907,7 @@
+ dev_err(dev->hw->dev,
+ "mtk_wed%d: write ba session base failed!\n",
+ dev->hw->index);
- }
++ }
+
+ /* pn check init */
+ for (i = 0; i < dev->wlan.ind_cmd.particular_sid; i++) {
@@ -1904,10 +1932,27 @@
+ wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_IND_CMD_EN);
+
+ return 0;
- }
-
++}
++
static void
-@@ -1477,14 +2135,14 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+ {
+@@ -1471,20 +2116,29 @@ 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 < 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_configure_irq(dev, irq_mask);
mtk_wed_set_ext_int(dev, true);
@@ -1924,7 +1969,7 @@
/* driver set mid ready and only once */
wed_w32(dev, MTK_WED_EXT_INT_MASK1,
MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
-@@ -1494,12 +2152,19 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1494,12 +2148,19 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
wed_r32(dev, MTK_WED_EXT_INT_MASK1);
wed_r32(dev, MTK_WED_EXT_INT_MASK2);
@@ -1944,7 +1989,18 @@
mtk_wed_dma_enable(dev);
dev->running = true;
-@@ -1537,11 +2202,13 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1516,9 +2177,7 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+ RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
+ "mtk_wed_attach without holding the RCU read lock");
+
+- if ((dev->wlan.bus_type == MTK_WED_BUS_PCIE &&
+- pci_domain_nr(dev->wlan.pci_dev->bus) > 1) ||
+- !try_module_get(THIS_MODULE))
++ if (!try_module_get(THIS_MODULE))
+ return -ENODEV;
+
+ rcu_read_unlock();
+@@ -1537,11 +2196,13 @@ mtk_wed_attach(struct mtk_wed_device *dev)
: &dev->wlan.platform_dev->dev;
dev_info(device, "attaching wed device %d version %d\n",
hw->index, hw->version);
@@ -1958,7 +2014,7 @@
if (hw->eth->dma_dev == hw->eth->dev &&
of_dma_is_coherent(hw->eth->dev->of_node))
-@@ -1551,6 +2218,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1551,6 +2212,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
if (ret)
goto out;
@@ -1969,7 +2025,7 @@
if (mtk_wed_get_rx_capa(dev)) {
ret = mtk_wed_rro_alloc(dev);
if (ret)
-@@ -1563,13 +2234,14 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1563,13 +2228,14 @@ mtk_wed_attach(struct mtk_wed_device *dev)
init_completion(&dev->wlan_reset_done);
atomic_set(&dev->fe_reset, 0);
@@ -1987,7 +2043,7 @@
out:
if (ret) {
-@@ -1613,6 +2285,24 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
+@@ -1613,6 +2279,24 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
ring->reg_base = MTK_WED_RING_TX(idx);
ring->wpdma = regs;
@@ -2012,7 +2068,7 @@
/* WED -> WPDMA */
wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
-@@ -1632,7 +2322,7 @@ static int
+@@ -1632,7 +2316,7 @@ static int
mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
{
struct mtk_wed_ring *ring = &dev->txfree_ring;
@@ -2021,7 +2077,7 @@
/*
* For txfree event handling, the same DMA ring is shared between WED
-@@ -1692,9 +2382,13 @@ mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
+@@ -1692,9 +2376,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);
@@ -2038,7 +2094,7 @@
if (val && net_ratelimit())
pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val);
-@@ -1718,19 +2412,20 @@ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
+@@ -1718,19 +2406,20 @@ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
int mtk_wed_flow_add(int index)
{
struct mtk_wed_hw *hw = hw_list[index];
@@ -2068,7 +2124,7 @@
goto out;
}
-@@ -1749,14 +2444,15 @@ void mtk_wed_flow_remove(int index)
+@@ -1749,14 +2438,15 @@ void mtk_wed_flow_remove(int index)
{
struct mtk_wed_hw *hw = hw_list[index];
@@ -2090,7 +2146,7 @@
goto out;
hw->wed_dev->wlan.offload_disable(hw->wed_dev);
-@@ -1799,6 +2495,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1799,6 +2489,10 @@ 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,
@@ -2101,7 +2157,7 @@
};
struct device_node *eth_np = eth->dev->of_node;
struct platform_device *pdev;
-@@ -1840,14 +2540,22 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1840,14 +2534,22 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
hw->wdma_phy = wdma_phy;
hw->index = index;
hw->irq = irq;
@@ -2129,7 +2185,7 @@
if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) {
kfree(hw);
goto unlock;
-@@ -1857,8 +2565,10 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1857,8 +2559,10 @@ 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);
}
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3020-mtk-wed-add-wed3-ser-support.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3020-mtk-wed-add-wed3-ser-support.patch
index 9778202..7423a6e 100644
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3020-mtk-wed-add-wed3-ser-support.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3020-mtk-wed-add-wed3-ser-support.patch
@@ -1,16 +1,16 @@
-From 11f1e7684e9cadd83038694396ebd99792cff590 Mon Sep 17 00:00:00 2001
+From 67a20e07982e9c43d299679f75fd81638271fc63 Mon Sep 17 00:00:00 2001
From: mtk27745 <rex.lu@mediatek.com>
Date: Mon, 18 Sep 2023 13:22:44 +0800
-Subject: [PATCH 20/24] mtk wed add wed3 ser support
+Subject: [PATCH 2/6] mtk wed add wed3 ser support
---
- drivers/net/ethernet/mediatek/mtk_wed.c | 340 ++++++++++++++++---
+ drivers/net/ethernet/mediatek/mtk_wed.c | 339 ++++++++++++++++---
drivers/net/ethernet/mediatek/mtk_wed_regs.h | 68 +++-
include/linux/soc/mediatek/mtk_wed.h | 8 +-
- 3 files changed, 368 insertions(+), 48 deletions(-)
+ 3 files changed, 367 insertions(+), 48 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index 2fed493..7f14d43 100644
+index 4b32a82..02c156a 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -110,24 +110,88 @@ mtk_wdma_read_reset(struct mtk_wed_device *dev)
@@ -235,7 +235,7 @@
wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX);
wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
-@@ -1402,25 +1563,6 @@ mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size, bool tx)
+@@ -1389,25 +1550,6 @@ mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size, bool tx)
}
}
@@ -261,7 +261,7 @@
static int
mtk_wed_rx_reset(struct mtk_wed_device *dev)
-@@ -1436,13 +1578,32 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1423,13 +1565,32 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
if (ret)
return ret;
@@ -294,7 +294,7 @@
wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
-@@ -1470,15 +1631,36 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1457,15 +1618,36 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0);
}
@@ -333,7 +333,7 @@
}
/* reset tx wdma */
-@@ -1486,8 +1668,12 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1473,8 +1655,12 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
/* reset tx wdma drv */
wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_TX_DRV_EN);
@@ -348,7 +348,7 @@
mtk_wed_reset(dev, MTK_WED_RESET_WDMA_TX_DRV);
/* reset wed rx dma */
-@@ -1508,6 +1694,14 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
+@@ -1495,6 +1681,14 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
MTK_WED_CTRL_WED_RX_BM_BUSY);
mtk_wed_reset(dev, MTK_WED_RESET_RX_BM);
@@ -363,15 +363,7 @@
/* wo change to enable state */
val = WO_STATE_ENABLE;
ret = mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
-@@ -1527,6 +1721,7 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
- }
-
- mtk_wed_free_rx_buffer(dev);
-+ mtk_wed_hwrro_free_buffer(dev);
-
- return 0;
- }
-@@ -1562,16 +1757,55 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1549,16 +1743,55 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
/* 2. Reset WDMA Rx DMA/Driver_Engine */
busy = !!mtk_wdma_rx_reset(dev);
@@ -428,7 +420,7 @@
wed_w32(dev, MTK_WED_WDMA_RESET_IDX,
MTK_WED_WDMA_RESET_IDX_RX | MTK_WED_WDMA_RESET_IDX_DRV);
wed_w32(dev, MTK_WED_WDMA_RESET_IDX, 0);
-@@ -1587,8 +1821,13 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1574,8 +1807,13 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
for (i = 0; i < 100; i++) {
@@ -444,7 +436,7 @@
break;
}
-@@ -1612,6 +1851,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1599,6 +1837,8 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_DRV);
@@ -453,7 +445,7 @@
} else {
wed_w32(dev, MTK_WED_WPDMA_RESET_IDX,
MTK_WED_WPDMA_RESET_IDX_TX |
-@@ -1628,7 +1869,14 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1615,7 +1855,14 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
wed_w32(dev, MTK_WED_RESET_IDX, 0);
}
@@ -469,7 +461,7 @@
}
static int
-@@ -1945,7 +2193,7 @@ mtk_wed_dma_enable(struct mtk_wed_device *dev)
+@@ -1932,7 +2179,7 @@ mtk_wed_dma_enable(struct mtk_wed_device *dev)
}
static void
@@ -478,7 +470,7 @@
{
int i;
-@@ -1955,6 +2203,12 @@ mtk_wed_start_hw_rro(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1942,6 +2189,12 @@ mtk_wed_start_hw_rro(struct mtk_wed_device *dev, u32 irq_mask)
if (!mtk_wed_get_rx_capa(dev) || !dev->wlan.hw_rro)
return;