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