[][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)