[][MAC80211][wed][fix fe reset hang issue]
[Description]
Fix FE reset hang and memory leakage
[Release-log]
N/A
Change-Id: I522ad34767fe2213c05d6a21fbdbcfc81b8f1dca
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7130983
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-1-add-wed-ser-support.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9998-add-wed-ser-support.patch
similarity index 80%
rename from autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-1-add-wed-ser-support.patch
rename to autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9998-add-wed-ser-support.patch
index b2714d0..0d6a50f 100755
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-1-add-wed-ser-support.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9998-add-wed-ser-support.patch
@@ -5,46 +5,46 @@
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
---
- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 +-
- drivers/net/ethernet/mediatek/mtk_wed.c | 347 ++++++++++++++-----
- drivers/net/ethernet/mediatek/mtk_wed.h | 2 +
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 +
+ drivers/net/ethernet/mediatek/mtk_wed.c | 361 ++++++++++++++-----
+ drivers/net/ethernet/mediatek/mtk_wed.h | 11 +
drivers/net/ethernet/mediatek/mtk_wed_regs.h | 12 +
- include/linux/soc/mediatek/mtk_wed.h | 28 +-
- 5 files changed, 297 insertions(+), 101 deletions(-)
+ include/linux/soc/mediatek/mtk_wed.h | 27 +-
+ 5 files changed, 320 insertions(+), 99 deletions(-)
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index 51b40fa..8dbea6b 100644
+index 2b52fa0..2f98525 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -3662,6 +3662,9 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -3680,6 +3680,9 @@ static void mtk_pending_work(struct work_struct *work)
for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!eth->netdev[i])
continue;
+#ifdef CONFIG_NET_MEDIATEK_SOC_WED
-+ mtk_wed_fe_reset(MTK_FE_START_RESET);
++ mtk_wed_fe_reset();
+#else
if (mtk_reset_flag == MTK_FE_STOP_TRAFFIC) {
pr_info("send MTK_FE_STOP_TRAFFIC event\n");
call_netdevice_notifiers(MTK_FE_STOP_TRAFFIC,
-@@ -3675,6 +3678,7 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -3693,6 +3696,7 @@ static void mtk_pending_work(struct work_struct *work)
if (!wait_for_completion_timeout(&wait_ser_done, 3000))
- pr_warn("wait for MTK_FE_START_RESET failed\n");
+ pr_warn("wait for MTK_FE_START_RESET\n");
rtnl_lock();
+#endif
break;
}
-@@ -3713,6 +3717,9 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -3731,6 +3735,9 @@ static void mtk_pending_work(struct work_struct *work)
for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!eth->netdev[i])
continue;
+#ifdef CONFIG_NET_MEDIATEK_SOC_WED
-+ mtk_wed_fe_reset(MTK_FE_RESET_DONE);
++ mtk_wed_fe_reset_complete();
+#else
if (mtk_reset_flag == MTK_FE_STOP_TRAFFIC) {
pr_info("send MTK_FE_START_TRAFFIC event\n");
call_netdevice_notifiers(MTK_FE_START_TRAFFIC,
-@@ -3722,6 +3729,7 @@ static void mtk_pending_work(struct work_struct *work)
+@@ -3740,6 +3747,7 @@ static void mtk_pending_work(struct work_struct *work)
call_netdevice_notifiers(MTK_FE_RESET_DONE,
eth->netdev[i]);
}
@@ -53,7 +53,7 @@
eth->netdev[i]);
break;
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index 7552795..c98d749 100644
+index ff8f658..0917a5a 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -13,8 +13,10 @@
@@ -120,7 +120,59 @@
}
static u32
-@@ -505,8 +511,8 @@ mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev, int idx)
+@@ -172,6 +178,51 @@ mtk_wed_wo_reset(struct mtk_wed_device *dev)
+ iounmap((void *)reg);
+ }
+
++void mtk_wed_fe_reset(void)
++{
++ int i;
++
++ mutex_lock(&hw_lock);
++
++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
++ struct mtk_wed_hw *hw = hw_list[i];
++ struct mtk_wed_device *dev = hw->wed_dev;
++ int err;
++
++ if (!dev || !dev->wlan.reset)
++ continue;
++
++ pr_info("%s: receive fe reset start event, trigger SER\n", __func__);
++
++ /* reset callback blocks until WLAN reset is completed */
++ err = dev->wlan.reset(dev);
++ if (err)
++ dev_err(dev->dev, "wlan reset failed: %d\n", err);
++ }
++
++ mutex_unlock(&hw_lock);
++}
++
++void mtk_wed_fe_reset_complete(void)
++{
++ int i;
++
++ mutex_lock(&hw_lock);
++
++ for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
++ struct mtk_wed_hw *hw = hw_list[i];
++ struct mtk_wed_device *dev = hw->wed_dev;
++
++ if (!dev || !dev->wlan.reset_complete)
++ continue;
++
++ pr_info("%s: receive fe reset done event, continue SER\n", __func__);
++ dev->wlan.reset_complete(dev);
++ }
++
++ mutex_unlock(&hw_lock);
++}
++
+ static struct mtk_wed_hw *
+ mtk_wed_assign(struct mtk_wed_device *dev)
+ {
+@@ -505,8 +556,8 @@ mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev, int idx)
wifi_w32(dev, dev->wlan.wpdma_rx_glo -
dev->wlan.phy_base, val);
} else {
@@ -131,7 +183,7 @@
}
}
-@@ -557,7 +563,7 @@ mtk_wed_dma_enable(struct mtk_wed_device *dev)
+@@ -557,7 +608,7 @@ mtk_wed_dma_enable(struct mtk_wed_device *dev)
FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL,
0x2));
@@ -140,12 +192,16 @@
mtk_wed_check_wfdma_rx_fill(dev, idx);
}
}
-@@ -597,26 +603,31 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
+@@ -594,36 +645,45 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
+ wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
+ MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
+ }
++
++ mtk_wed_set_512_support(dev, false);
}
static void
--mtk_wed_stop(struct mtk_wed_device *dev)
-+mtk_wed_stop(struct mtk_wed_device *dev, bool reset)
+ mtk_wed_stop(struct mtk_wed_device *dev)
{
- mtk_wed_dma_disable(dev);
- mtk_wed_set_512_support(dev, false);
@@ -156,40 +212,50 @@
}
mtk_wed_set_ext_int(dev, false);
-- wed_clr(dev, MTK_WED_CTRL,
-- MTK_WED_CTRL_WDMA_INT_AGENT_EN |
-- MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
-- MTK_WED_CTRL_WED_TX_BM_EN |
-- MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
--
++ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
++ wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0);
++ wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
++ wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
++ wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
++}
++
++static void
++mtk_wed_deinit(struct mtk_wed_device *dev)
++{
++ mtk_wed_stop(dev);
++ mtk_wed_dma_disable(dev);
++
+ wed_clr(dev, MTK_WED_CTRL,
+ MTK_WED_CTRL_WDMA_INT_AGENT_EN |
+ MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
+ MTK_WED_CTRL_WED_TX_BM_EN |
+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
+
- if (dev->ver > MTK_WED_V1) {
-+ if (!reset) {
-+ mtk_wed_dma_disable(dev);
-+ mtk_wed_set_512_support(dev, false);
-+ if (dev->ver > MTK_WED_V1) {
-+ wed_clr(dev, MTK_WED_CTRL,
-+ MTK_WED_CTRL_RX_RRO_QM_EN |
-+ MTK_WED_CTRL_RX_ROUTE_QM_EN |
-+ MTK_WED_CTRL_WED_RX_BM_EN);
-+ } else {
-+ regmap_write(dev->hw->mirror,
-+ dev->hw->index * 4, 0);
-+ }
- wed_clr(dev, MTK_WED_CTRL,
+- wed_clr(dev, MTK_WED_CTRL,
- MTK_WED_CTRL_WED_RX_BM_EN);
-+ MTK_WED_CTRL_WDMA_INT_AGENT_EN |
-+ MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
-+ MTK_WED_CTRL_WED_TX_BM_EN |
-+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
- }
+- }
++ if (dev->hw->ver == 1)
++ return;
- wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
-@@ -634,16 +645,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+- wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
+- wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0);
+- wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
+- wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
+- wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
++ wed_clr(dev, MTK_WED_CTRL,
++ MTK_WED_CTRL_RX_ROUTE_QM_EN |
++ MTK_WED_CTRL_WED_RX_BM_EN |
++ MTK_WED_CTRL_RX_RRO_QM_EN);
+ }
+
+ static void
+@@ -634,16 +694,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
mutex_lock(&hw_lock);
- mtk_wed_stop(dev);
-+ mtk_wed_stop(dev, false);
++ mtk_wed_deinit(dev);
- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
@@ -204,7 +270,7 @@
mtk_wed_free_buffer(dev);
mtk_wed_free_tx_rings(dev);
-@@ -653,8 +661,6 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -653,8 +710,6 @@ mtk_wed_detach(struct mtk_wed_device *dev)
mtk_wed_wo_exit(hw);
}
@@ -213,16 +279,16 @@
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
wlan_node = dev->wlan.pci_dev->dev.of_node;
if (of_dma_is_coherent(wlan_node))
-@@ -748,7 +754,7 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
+@@ -748,7 +803,7 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
{
u32 mask, set;
- mtk_wed_stop(dev);
-+ mtk_wed_stop(dev, false);
++ mtk_wed_deinit(dev);
mtk_wed_reset(dev, MTK_WED_RESET_WED);
if (dev->ver > MTK_WED_V1)
-@@ -961,44 +967,127 @@ mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size, int scale, bool tx)
+@@ -961,44 +1016,127 @@ mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size, int scale, bool tx)
}
static u32
@@ -267,8 +333,8 @@
return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep,
- timeout, false, dev);
+ timeout, false, dev, reg, mask);
-+}
-+
+ }
+
+static void
+mtk_wed_rx_reset(struct mtk_wed_device *dev)
+{
@@ -368,13 +434,13 @@
+ }
+
+ mtk_wed_free_rx_bm(dev);
- }
-
++}
++
+
static void
mtk_wed_reset_dma(struct mtk_wed_device *dev)
{
-@@ -1012,25 +1101,28 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1012,25 +1150,28 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
if (!desc)
continue;
@@ -411,7 +477,7 @@
if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
-@@ -1047,15 +1139,30 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1047,15 +1188,30 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE);
}
@@ -443,7 +509,7 @@
if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
-@@ -1065,6 +1172,16 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
+@@ -1065,6 +1221,16 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
MTK_WED_WPDMA_RESET_IDX_TX |
MTK_WED_WPDMA_RESET_IDX_RX);
wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0);
@@ -460,7 +526,7 @@
}
}
-@@ -1101,13 +1218,15 @@ mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
+@@ -1101,13 +1267,15 @@ mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
}
static int
@@ -480,7 +546,7 @@
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
-@@ -1124,13 +1243,15 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
+@@ -1124,13 +1292,15 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
}
static int
@@ -500,7 +566,7 @@
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
wdma->desc_phys);
-@@ -1140,7 +1261,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
+@@ -1140,7 +1310,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0);
wdma_w32(dev,
MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0);
@@ -511,7 +577,7 @@
if (idx == 0) {
wed_w32(dev, MTK_WED_WDMA_RING_TX
+ MTK_WED_RING_OFS_BASE, wdma->desc_phys);
-@@ -1253,9 +1376,12 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
+@@ -1253,9 +1425,12 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
{
int i, ret;
@@ -525,7 +591,7 @@
mtk_wed_hw_init(dev);
-@@ -1340,10 +1466,6 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1347,10 +1522,6 @@ mtk_wed_attach(struct mtk_wed_device *dev)
goto error;
if (dev->ver > MTK_WED_V1) {
@@ -536,7 +602,7 @@
ret = mtk_wed_rro_alloc(dev);
if (ret)
goto error;
-@@ -1351,6 +1473,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
+@@ -1358,6 +1529,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
mtk_wed_hw_init_early(dev);
@@ -547,7 +613,7 @@
if (dev->ver == MTK_WED_V1)
regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
BIT(hw->index), 0);
-@@ -1367,7 +1493,8 @@ out:
+@@ -1374,7 +1549,8 @@ out:
}
static int
@@ -557,7 +623,7 @@
{
struct mtk_wed_ring *ring = &dev->tx_ring[idx];
-@@ -1385,10 +1512,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
+@@ -1392,10 +1568,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
BUG_ON(idx > ARRAY_SIZE(dev->tx_ring));
@@ -573,7 +639,7 @@
return -ENOMEM;
ring->reg_base = MTK_WED_RING_TX(idx);
-@@ -1436,21 +1565,24 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
+@@ -1443,21 +1621,24 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
}
static int
@@ -603,50 +669,8 @@
/* WPDMA -> WED */
wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
-@@ -1492,6 +1624,41 @@ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
- wed_w32(dev, MTK_WED_INT_MASK, mask);
- }
-
-+void mtk_wed_fe_reset(int cmd)
-+{
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
-+ struct mtk_wed_hw *hw = hw_list[i];
-+ struct mtk_wed_device *dev;
-+
-+ dev = hw->wed_dev ;
-+ if (!dev)
-+ continue;
-+
-+ switch (cmd) {
-+ case MTK_FE_START_RESET:
-+ pr_info("%s: receive fe reset start event, trigger SER\n", __func__);
-+ atomic_set(&dev->fe_reset, 1);
-+ dev->wlan.ser_trigger(dev);
-+ rtnl_unlock();
-+ wait_for_completion(&dev->wlan_reset_done);
-+ rtnl_lock();
-+
-+ break;
-+ case MTK_FE_RESET_DONE:
-+ pr_info("%s: receive fe reset done event, continue SER\n", __func__);
-+ complete(&dev->fe_reset_done);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ }
-+
-+ return;
-+}
-+
- int mtk_wed_flow_add(int index)
- {
- struct mtk_wed_hw *hw = hw_list[index];
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.h b/drivers/net/ethernet/mediatek/mtk_wed.h
-index 8ef5253..f757eac 100644
+index 8ef5253..490873c 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.h
+++ b/drivers/net/ethernet/mediatek/mtk_wed.h
@@ -47,6 +47,7 @@ struct mtk_wed_hw {
@@ -657,13 +681,30 @@
int irq;
int index;
u32 ver;
-@@ -196,5 +197,6 @@ void mtk_wed_mcu_rx_event(struct mtk_wed_wo *wo, struct sk_buff *skb);
- int mtk_wed_mcu_send_msg(struct mtk_wed_wo *wo,int to_id, int cmd,
- const void *data, int len, bool wait_resp);
- int mtk_wed_wo_rx_poll(struct napi_struct *napi, int budget);
-+void mtk_wed_fe_reset(int cmd);
-
+@@ -158,6 +159,9 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+ void mtk_wed_exit(void);
+ int mtk_wed_flow_add(int index);
+ void mtk_wed_flow_remove(int index);
++void mtk_wed_fe_reset(void);
++void mtk_wed_fe_reset_complete(void);
++
+ #else
+ static inline void
+ mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -175,6 +179,13 @@ static inline int mtk_wed_flow_add(int index)
+ static inline void mtk_wed_flow_remove(int index)
+ {
+ }
++static inline void mtk_wed_fe_reset(void)
++{
++}
++
++static inline void mtk_wed_fe_reset_complete(void)
++{
++}
#endif
+
+ #ifdef CONFIG_DEBUG_FS
diff --git a/drivers/net/ethernet/mediatek/mtk_wed_regs.h b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
index 9d021e2..cfcd94f 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
@@ -708,14 +749,15 @@
#define MTK_WED_WPDMA_RX_D_RXD_READ_LEN GENMASK(31, 24)
diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
-index 9a9cc1b..31f4a26 100644
+index e8fca31..98ed390 100644
--- a/include/linux/soc/mediatek/mtk_wed.h
+++ b/include/linux/soc/mediatek/mtk_wed.h
-@@ -161,23 +161,27 @@ struct mtk_wed_device {
+@@ -163,18 +163,23 @@ struct mtk_wed_device {
void (*release_rx_buf)(struct mtk_wed_device *wed);
void (*update_wo_rx_stats)(struct mtk_wed_device *wed,
struct mtk_wed_wo_rx_stats *stats);
-+ void (*ser_trigger)(struct mtk_wed_device *wed);
++ int (*reset)(struct mtk_wed_device *wed);
++ void (*reset_complete)(struct mtk_wed_device *wed);
} wlan;
+ struct completion fe_reset_done;
+ struct completion wlan_reset_done;
@@ -736,19 +778,13 @@
int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
void *data, int len);
void (*detach)(struct mtk_wed_device *dev);
-
-- void (*stop)(struct mtk_wed_device *dev);
-+ void (*stop)(struct mtk_wed_device *dev, bool reset);
- void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
- void (*reset_dma)(struct mtk_wed_device *dev);
-
-@@ -226,12 +230,13 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
+@@ -228,12 +233,13 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
#define mtk_wed_device_active(_dev) !!(_dev)->ops
#define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
#define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
-#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \
- (_dev)->ops->tx_ring_setup(_dev, _ring, _regs)
-+#define mtk_wed_device_stop(_dev, _reset) (_dev)->ops->stop(_dev, _reset)
++#define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
+#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
+ (_dev)->ops->tx_ring_setup(_dev, _ring, _regs, _reset)
#define mtk_wed_device_txfree_ring_setup(_dev, _regs) \
@@ -760,7 +796,7 @@
#define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \
(_dev)->ops->msg_update(_dev, _id, _msg, _len)
#define mtk_wed_device_reg_read(_dev, _reg) \
-@@ -242,6 +247,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
+@@ -244,6 +250,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
(_dev)->ops->irq_get(_dev, _mask)
#define mtk_wed_device_irq_set_mask(_dev, _mask) \
(_dev)->ops->irq_set_mask(_dev, _mask)
@@ -769,12 +805,12 @@
#define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \
(_dev)->ops->ppe_check(_dev, _skb, _reason, _hash)
#else
-@@ -251,14 +258,15 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
+@@ -253,14 +261,15 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
}
#define mtk_wed_device_detach(_dev) do {} while (0)
#define mtk_wed_device_start(_dev, _mask) do {} while (0)
-#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV
-+#define mtk_wed_device_stop(_dev, _reset) do {} while (0)
++#define mtk_wed_device_stop(_dev) do {} while (0)
+#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV
#define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV
-#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9998-ethernet-update-ppe-backward-compatible-two-way-hash.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-1-ethernet-update-ppe-backward-compatible-two-way-hash.patch
similarity index 100%
rename from autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9998-ethernet-update-ppe-backward-compatible-two-way-hash.patch
rename to autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-1-ethernet-update-ppe-backward-compatible-two-way-hash.patch
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-7-mediatek-ethernet-add-wifi2wifi-offload-support.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-7-mediatek-ethernet-add-wifi2wifi-offload-support.patch
index 03af305..85e15c9 100755
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-7-mediatek-ethernet-add-wifi2wifi-offload-support.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/9999-7-mediatek-ethernet-add-wifi2wifi-offload-support.patch
@@ -10,12 +10,13 @@
drivers/net/ethernet/mediatek/mtk_wed.c | 13 +++++++
include/linux/soc/mediatek/mtk_wed.h | 6 +++-
4 files changed, 45 insertions(+), 11 deletions(-)
+ mode change 100755 => 100644 drivers/net/ethernet/mediatek/mtk_ppe_offload.c
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-index ab1df9c..7879798 100644
+index b935de6..acefa48 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -1716,6 +1716,8 @@ void ethsys_reset(struct mtk_eth *eth, u32 reset_bits);
+@@ -1767,6 +1767,8 @@ void ethsys_reset(struct mtk_eth *eth, u32 reset_bits);
int mtk_eth_offload_init(struct mtk_eth *eth, int id);
int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
void *type_data);
@@ -25,7 +26,9 @@
int mtk_ppe_debugfs_init(struct mtk_eth *eth);
diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index 2787a97..23d2048 100644
+old mode 100755
+new mode 100644
+index 2787a97..23d2048
--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
@@ -546,10 +546,20 @@ static int
@@ -99,10 +102,10 @@
return -EOPNOTSUPP;
}
diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index b328a52..a6e6eb8 100644
+index 1a615f2..37a86c3 100644
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
-@@ -1717,6 +1717,18 @@ out:
+@@ -1731,6 +1731,18 @@ out:
mutex_unlock(&hw_lock);
}
@@ -121,7 +124,7 @@
void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
void __iomem *wdma, u32 wdma_phy, int index)
-@@ -1735,6 +1747,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+@@ -1749,6 +1761,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
.irq_get = mtk_wed_irq_get,
.irq_set_mask = mtk_wed_irq_set_mask,
.detach = mtk_wed_detach,
@@ -130,29 +133,29 @@
};
struct device_node *eth_np = eth->dev->of_node;
diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
-index 00c9a78..96c8a03 100644
+index 98ed390..27cf284 100644
--- a/include/linux/soc/mediatek/mtk_wed.h
+++ b/include/linux/soc/mediatek/mtk_wed.h
-@@ -182,7 +182,8 @@ struct mtk_wed_ops {
+@@ -183,7 +183,8 @@ struct mtk_wed_ops {
int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
void *data, int len);
void (*detach)(struct mtk_wed_device *dev);
-
+ int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev,
+ int type, void *type_data);
- void (*stop)(struct mtk_wed_device *dev, bool reset);
+ void (*stop)(struct mtk_wed_device *dev);
void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
void (*reset_dma)(struct mtk_wed_device *dev);
-@@ -231,6 +232,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
+@@ -232,6 +233,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
#define mtk_wed_device_active(_dev) !!(_dev)->ops
#define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) \
+ (_dev)->ops->setup_tc(_dev, _ndev, _type, _data)
#define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
- #define mtk_wed_device_stop(_dev, _reset) (_dev)->ops->stop(_dev, _reset)
+ #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
-@@ -269,6 +272,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
+@@ -270,6 +273,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
#define mtk_wed_device_irq_get(_dev, _mask) 0
#define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
#define mtk_wed_device_dma_reset(_dev) do {} while (0)