Merge "[rdk-b][common][bsp][Refactor and sync kernel/wifi from Openwrt]"
diff --git a/recipes-kernel/linux-mt76/files/patches/0003-mt76-mt7915-rework-rx-testmode-stats.patch b/recipes-kernel/linux-mt76/files/patches/0003-mt76-mt7915-rework-rx-testmode-stats.patch
index 4a210f3..3e00f4f 100644
--- a/recipes-kernel/linux-mt76/files/patches/0003-mt76-mt7915-rework-rx-testmode-stats.patch
+++ b/recipes-kernel/linux-mt76/files/patches/0003-mt76-mt7915-rework-rx-testmode-stats.patch
@@ -1,7 +1,7 @@
-From 605c1bcc3fbf898506ddb96d98bf3d97db8e5d89 Mon Sep 17 00:00:00 2001
+From 5719f0432f1df81f1834096fb0e6a0439d01bf57 Mon Sep 17 00:00:00 2001
 From: Shayne Chen <shayne.chen@mediatek.com>
 Date: Mon, 3 Jan 2022 17:09:53 +0800
-Subject: [PATCH 03/12] mt76: mt7915: rework rx testmode stats
+Subject: [PATCH] mt76: mt7915: rework rx testmode stats
 
 ---
  mac80211.c        |  3 +-
@@ -15,10 +15,10 @@
  8 files changed, 109 insertions(+), 17 deletions(-)
 
 diff --git a/mac80211.c b/mac80211.c
-index 57e9156..5782244 100644
+index a46884d6..d74300f3 100644
 --- a/mac80211.c
 +++ b/mac80211.c
-@@ -747,7 +747,8 @@ void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb)
+@@ -751,7 +751,8 @@ void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb)
  	}
  
  #ifdef CONFIG_NL80211_TESTMODE
@@ -29,10 +29,10 @@
  		if (status->flag & RX_FLAG_FAILED_FCS_CRC)
  			phy->test.rx_stats.fcs_error[q]++;
 diff --git a/mt76.h b/mt76.h
-index 4e8997c..28720ee 100644
+index 4da77d47..94541cd7 100644
 --- a/mt76.h
 +++ b/mt76.h
-@@ -604,6 +604,8 @@ struct mt76_testmode_ops {
+@@ -612,6 +612,8 @@ struct mt76_testmode_ops {
  	int (*dump_stats)(struct mt76_phy *phy, struct sk_buff *msg);
  };
  
@@ -41,7 +41,7 @@
  struct mt76_testmode_data {
  	enum mt76_testmode_state state;
  
-@@ -635,6 +637,8 @@ struct mt76_testmode_data {
+@@ -643,6 +645,8 @@ struct mt76_testmode_data {
  
  	u8 addr[3][ETH_ALEN];
  
@@ -50,7 +50,7 @@
  	u32 tx_pending;
  	u32 tx_queued;
  	u16 tx_queued_limit;
-@@ -642,6 +646,7 @@ struct mt76_testmode_data {
+@@ -650,6 +654,7 @@ struct mt76_testmode_data {
  	struct {
  		u64 packets[__MT_RXQ_MAX];
  		u64 fcs_error[__MT_RXQ_MAX];
@@ -59,7 +59,7 @@
  };
  
 diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index f1d7c05..e94d670 100644
+index f1d7c05b..e94d6706 100644
 --- a/mt76_connac_mcu.h
 +++ b/mt76_connac_mcu.h
 @@ -1130,6 +1130,7 @@ enum {
@@ -71,7 +71,7 @@
  	MCU_EXT_CMD_GROUP_PRE_CAL_INFO = 0xab,
  	MCU_EXT_CMD_DPD_PRE_CAL_INFO = 0xac,
 diff --git a/mt7915/mcu.h b/mt7915/mcu.h
-index da4ee0a..bd9c6dc 100644
+index cd1edf55..110e4f36 100644
 --- a/mt7915/mcu.h
 +++ b/mt7915/mcu.h
 @@ -9,6 +9,7 @@
@@ -83,7 +83,7 @@
  	MCU_ATE_CLEAN_TXQUEUE = 0x1c,
  };
 diff --git a/mt7915/testmode.c b/mt7915/testmode.c
-index b8c1da1..123ceaf 100644
+index 71793a83..94b24e42 100644
 --- a/mt7915/testmode.c
 +++ b/mt7915/testmode.c
 @@ -133,6 +133,21 @@ mt7915_tm_clean_hwq(struct mt7915_phy *phy, u8 wcid)
@@ -151,7 +151,7 @@
 +	/* pr_info("fcs_ok = %d\n", le16_to_cpu(rs_band->fcs_succ)); */
 +
 +	if (!clear) {
-+		enum mt76_rxq_id q = req.band ? MT_RXQ_EXT : MT_RXQ_MAIN;
++		enum mt76_rxq_id q = req.band ? MT_RXQ_BAND1 : MT_RXQ_MAIN;
 +
 +		td->rx_stats.packets[q] += le32_to_cpu(rs_band->mdrdy_cnt);
 +		td->rx_stats.fcs_error[q] += le16_to_cpu(rs_band->fcs_err);
@@ -205,7 +205,7 @@
 -	fcs_err = is_mt7915(&dev->mt76) ? FIELD_GET(MT_MIB_SDR3_FCS_ERR_MASK, cnt) :
 -		FIELD_GET(MT_MIB_SDR3_FCS_ERR_MASK_MT7916, cnt);
 -
--	q = phy->band_idx ? MT_RXQ_EXT : MT_RXQ_MAIN;
+-	q = phy->band_idx ? MT_RXQ_BAND1 : MT_RXQ_MAIN;
 -	mphy->test.rx_stats.packets[q] += fcs_err;
 -	mphy->test.rx_stats.fcs_error[q] += fcs_err;
 -
@@ -215,7 +215,7 @@
  
  const struct mt76_testmode_ops mt7915_testmode_ops = {
 diff --git a/mt7915/testmode.h b/mt7915/testmode.h
-index 5573ac3..a1c54c8 100644
+index 5573ac30..a1c54c89 100644
 --- a/mt7915/testmode.h
 +++ b/mt7915/testmode.h
 @@ -33,6 +33,12 @@ struct mt7915_tm_clean_txq {
@@ -266,10 +266,10 @@
 +
  #endif
 diff --git a/testmode.c b/testmode.c
-index 7cd0079..e6d1f70 100644
+index b6ceddcb..70fe79a4 100644
 --- a/testmode.c
 +++ b/testmode.c
-@@ -559,6 +559,9 @@ mt76_testmode_dump_stats(struct mt76_phy *phy, struct sk_buff *msg)
+@@ -556,6 +556,9 @@ mt76_testmode_dump_stats(struct mt76_phy *phy, struct sk_buff *msg)
  	    nla_put_u64_64bit(msg, MT76_TM_STATS_ATTR_RX_PACKETS, rx_packets,
  			      MT76_TM_STATS_ATTR_PAD) ||
  	    nla_put_u64_64bit(msg, MT76_TM_STATS_ATTR_RX_FCS_ERROR, rx_fcs_error,
@@ -280,7 +280,7 @@
  		return -EMSGSIZE;
  
 diff --git a/testmode.h b/testmode.h
-index 5e2792d..8961326 100644
+index 5e2792d8..89613266 100644
 --- a/testmode.h
 +++ b/testmode.h
 @@ -101,6 +101,8 @@ enum mt76_testmode_attr {
diff --git a/recipes-kernel/linux-mt76/files/patches/0004-mt76-mt7915-fix-tx-descriptor.patch b/recipes-kernel/linux-mt76/files/patches/0004-mt76-mt7915-fix-tx-descriptor.patch
deleted file mode 100644
index 9b20ba5..0000000
--- a/recipes-kernel/linux-mt76/files/patches/0004-mt76-mt7915-fix-tx-descriptor.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 3b52f9553517631ce961a5ca808619a918ec5edc Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Wed, 19 Jan 2022 15:51:01 +0800
-Subject: [PATCH 04/12] mt76: mt7915: fix tx descriptor
-
----
- mt7915/mac.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/mt7915/mac.c b/mt7915/mac.c
-index b280b0e..9092b40 100644
---- a/mt7915/mac.c
-+++ b/mt7915/mac.c
-@@ -653,6 +653,7 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
- 	if (td->tx_rate_ldpc || (bw > 0 && mode >= MT_PHY_TYPE_HE_SU))
- 		val |= MT_TXD6_LDPC;
- 
-+	txwi[1] &= ~cpu_to_le32(MT_TXD1_VTA);
- 	txwi[3] &= ~cpu_to_le32(MT_TXD3_SN_VALID);
- 	txwi[6] |= cpu_to_le32(val);
- 	txwi[7] |= cpu_to_le32(FIELD_PREP(MT_TXD7_SPE_IDX,
--- 
-2.18.0
-
diff --git a/recipes-kernel/linux-mt76/files/patches/0012-mt76-mt7915-add-spatial-extension-index-support.patch b/recipes-kernel/linux-mt76/files/patches/0012-mt76-mt7915-add-spatial-extension-index-support.patch
index 7060348..3d0e6f2 100644
--- a/recipes-kernel/linux-mt76/files/patches/0012-mt76-mt7915-add-spatial-extension-index-support.patch
+++ b/recipes-kernel/linux-mt76/files/patches/0012-mt76-mt7915-add-spatial-extension-index-support.patch
@@ -1,24 +1,24 @@
-From 7e339b883383bc9a54fddddbe3d56dbadffb5e49 Mon Sep 17 00:00:00 2001
+From 32812cb4898d84772ec5cf7e79b8dcbd0552bd24 Mon Sep 17 00:00:00 2001
 From: Shayne Chen <shayne.chen@mediatek.com>
 Date: Wed, 13 Jul 2022 10:43:16 +0800
 Subject: [PATCH] mt76: mt7915: add spatial extension index support
 
 Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
 ---
- .../net/wireless/mediatek/mt76/mt76_connac.h  | 11 ++++++++++
- .../wireless/mediatek/mt76/mt76_connac_mac.c  | 11 +++++++---
- .../wireless/mediatek/mt76/mt76_connac_mcu.h  |  2 +-
- .../net/wireless/mediatek/mt76/mt7915/main.c  |  3 ---
- .../net/wireless/mediatek/mt76/mt7915/mcu.c   | 20 ++++++++++++++++++-
- .../net/wireless/mediatek/mt76/mt7915/mcu.h   |  1 +
- .../wireless/mediatek/mt76/mt7915/testmode.c  |  9 +++------
+ mt76_connac.h     | 11 +++++++++++
+ mt76_connac_mac.c | 11 ++++++++---
+ mt76_connac_mcu.h |  2 +-
+ mt7915/main.c     |  3 ---
+ mt7915/mcu.c      | 20 +++++++++++++++++++-
+ mt7915/mcu.h      |  1 +
+ mt7915/testmode.c |  9 +++------
  7 files changed, 43 insertions(+), 14 deletions(-)
 
 diff --git a/mt76_connac.h b/mt76_connac.h
-index 9070162c..5a9c1c97 100644
+index d0336553..7b6b3aa6 100644
 --- a/mt76_connac.h
 +++ b/mt76_connac.h
-@@ -255,6 +255,17 @@ mt76_connac_txwi_to_txp(struct mt76_dev *dev, struct mt76_txwi_cache *t)
+@@ -261,6 +261,17 @@ mt76_connac_txwi_to_txp(struct mt76_dev *dev, struct mt76_txwi_cache *t)
  	return (void *)(txwi + MT_TXD_SIZE);
  }
  
@@ -37,10 +37,10 @@
  void mt76_connac_power_save_sched(struct mt76_phy *phy,
  				  struct mt76_connac_pm *pm);
 diff --git a/mt76_connac_mac.c b/mt76_connac_mac.c
-index d83ed593..33abe5d6 100644
+index 18dea8e1..a9e58cfa 100644
 --- a/mt76_connac_mac.c
 +++ b/mt76_connac_mac.c
-@@ -402,9 +402,6 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
+@@ -417,9 +417,6 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
  	if (ieee80211_is_beacon(fc)) {
  		txwi[3] &= ~cpu_to_le32(MT_TXD3_SW_POWER_MGMT);
  		txwi[3] |= cpu_to_le32(MT_TXD3_REM_TX_COUNT);
@@ -50,7 +50,7 @@
  	}
  
  	if (info->flags & IEEE80211_TX_CTL_INJECTED) {
-@@ -531,6 +528,14 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
+@@ -546,6 +543,14 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
  		val |= FIELD_PREP(MT_TXD6_TX_RATE, rate);
  		txwi[6] |= cpu_to_le32(val);
  		txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
@@ -59,7 +59,7 @@
 +			u8 spe_idx = mt76_connac_spe_idx(mphy->antenna_mask);
 +
 +			if (!spe_idx)
-+				spe_idx = 24 + ext_phy;
++				spe_idx = 24 + phy_idx;
 +			txwi[7] |= cpu_to_le32(FIELD_PREP(MT_TXD7_SPE_IDX, spe_idx));
 +		}
  	}
@@ -79,7 +79,7 @@
  	u8 is_5g;
  	u8 mmps_mode;
 diff --git a/mt7915/main.c b/mt7915/main.c
-index 39587992..080e935c 100644
+index 36faefb3..1ba164a4 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
 @@ -957,9 +957,6 @@ mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
@@ -93,7 +93,7 @@
  
  	phy->mt76->antenna_mask = tx_ant;
 diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index 6587be2f..c196d453 100644
+index 9ba930a2..5fc7a242 100644
 --- a/mt7915/mcu.c
 +++ b/mt7915/mcu.c
 @@ -1306,6 +1306,9 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
@@ -134,7 +134,7 @@
  }
  
  static void
-@@ -2649,6 +2664,9 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
+@@ -2646,6 +2661,9 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
  	}
  #endif
  
@@ -185,5 +185,5 @@
  
  	mt7915_tm_set_tam_arb(phy, en,
 -- 
-2.25.1
+2.18.0
 
diff --git a/recipes-kernel/linux-mt76/files/patches/1005-mt76-certification-patches.patch b/recipes-kernel/linux-mt76/files/patches/1005-mt76-certification-patches.patch
index 64bc9e5..05ed88d 100644
--- a/recipes-kernel/linux-mt76/files/patches/1005-mt76-certification-patches.patch
+++ b/recipes-kernel/linux-mt76/files/patches/1005-mt76-certification-patches.patch
@@ -1,20 +1,19 @@
-From 851129617f31e9c802b01eab480f9f8041cfde4f Mon Sep 17 00:00:00 2001
+From e69061ef6ea44ada9215dbfb444eb90795b4e20c Mon Sep 17 00:00:00 2001
 From: MeiChia Chiu <meichia.chiu@mediatek.com>
 Date: Mon, 6 Jun 2022 20:15:51 +0800
-Subject: [PATCH 1005/1008] mt76: certification patches
+Subject: [PATCH 1005/1006] mt76: certification patches
 
 ---
- .../wireless/mediatek/mt76/mt76_connac_mcu.h  |   1 +
- .../net/wireless/mediatek/mt76/mt7915/init.c  |   7 +-
- .../net/wireless/mediatek/mt76/mt7915/mac.c   |  23 +
- .../net/wireless/mediatek/mt76/mt7915/main.c  |  15 +-
- .../net/wireless/mediatek/mt76/mt7915/mcu.c   | 466 ++++++++++++++++++
- .../net/wireless/mediatek/mt76/mt7915/mcu.h   | 207 +++++++-
- .../wireless/mediatek/mt76/mt7915/mt7915.h    |  13 +
- .../mediatek/mt76/mt7915/mtk_debugfs.c        |   7 +-
- .../wireless/mediatek/mt76/mt7915/vendor.c    | 187 +++++++
- .../wireless/mediatek/mt76/mt7915/vendor.h    |  42 ++
- 10 files changed, 962 insertions(+), 6 deletions(-)
+ mt76_connac_mcu.h    |   1 +
+ mt7915/mac.c         |  23 +++
+ mt7915/main.c        |  15 +-
+ mt7915/mcu.c         | 466 +++++++++++++++++++++++++++++++++++++++++++
+ mt7915/mcu.h         | 207 ++++++++++++++++++-
+ mt7915/mt7915.h      |  13 ++
+ mt7915/mtk_debugfs.c |   7 +-
+ mt7915/vendor.c      | 187 +++++++++++++++++
+ mt7915/vendor.h      |  42 ++++
+ 9 files changed, 956 insertions(+), 5 deletions(-)
 
 diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
 index 865bbf3d..25aeedc2 100644
@@ -28,31 +27,8 @@
  	MCU_EXT_CMD_CSI_CTRL = 0xc2,
  };
  
-diff --git a/mt7915/init.c b/mt7915/init.c
-index 6e2a1c13..02d1b6d8 100644
---- a/mt7915/init.c
-+++ b/mt7915/init.c
-@@ -372,12 +372,17 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)
- 	if (!phy->dev->dbdc_support)
- 		wiphy->txq_memory_limit = 32 << 20; /* 32 MiB */
- 
--	if (phy->mt76->cap.has_2ghz)
-+	if (phy->mt76->cap.has_2ghz) {
-+		phy->mt76->sband_2g.sband.ht_cap.ampdu_density =
-+			IEEE80211_HT_MPDU_DENSITY_4;
- 		phy->mt76->sband_2g.sband.ht_cap.cap |=
- 			IEEE80211_HT_CAP_LDPC_CODING |
- 			IEEE80211_HT_CAP_MAX_AMSDU;
-+	}
- 
- 	if (phy->mt76->cap.has_5ghz) {
-+		phy->mt76->sband_5g.sband.ht_cap.ampdu_density =
-+			IEEE80211_HT_MPDU_DENSITY_4;
- 		phy->mt76->sband_5g.sband.ht_cap.cap |=
- 			IEEE80211_HT_CAP_LDPC_CODING |
- 			IEEE80211_HT_CAP_MAX_AMSDU;
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index 8aa5350a..24052f47 100644
+index 75e2036b..6b3fa4ce 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
 @@ -7,6 +7,7 @@
@@ -63,7 +39,7 @@
  
  #define to_rssi(field, rxv)	((FIELD_GET(field, rxv) - 220) / 2)
  
-@@ -1736,6 +1737,21 @@ static void mt7915_mac_severe_check(struct mt7915_phy *phy)
+@@ -1738,6 +1739,21 @@ static void mt7915_mac_severe_check(struct mt7915_phy *phy)
  	phy->trb_ts = trb;
  }
  
@@ -85,7 +61,7 @@
  void mt7915_mac_sta_rc_work(struct work_struct *work)
  {
  	struct mt7915_dev *dev = container_of(work, struct mt7915_dev, rc_work);
-@@ -1758,6 +1774,13 @@ void mt7915_mac_sta_rc_work(struct work_struct *work)
+@@ -1760,6 +1776,13 @@ void mt7915_mac_sta_rc_work(struct work_struct *work)
  		sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
  		vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
  
@@ -100,7 +76,7 @@
  			       IEEE80211_RC_NSS_CHANGED |
  			       IEEE80211_RC_BW_CHANGED))
 diff --git a/mt7915/main.c b/mt7915/main.c
-index cd7314c9..d5fb947a 100644
+index 43daa17c..4e82904f 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
 @@ -653,6 +653,9 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
@@ -133,10 +109,10 @@
  
  void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index a6b5d213..53d4cd44 100644
+index f7a3eb19..f692e520 100644
 --- a/mt7915/mcu.c
 +++ b/mt7915/mcu.c
-@@ -3579,6 +3579,472 @@ mt7915_mcu_report_csi(struct mt7915_dev *dev, struct sk_buff *skb)
+@@ -3572,6 +3572,472 @@ mt7915_mcu_report_csi(struct mt7915_dev *dev, struct sk_buff *skb)
  
  	return 0;
  }
@@ -844,10 +820,10 @@
  
  #endif
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 2af06d35..5aafaac0 100644
+index 5551d77a..267fa7eb 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
-@@ -663,6 +663,19 @@ void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+@@ -664,6 +664,19 @@ void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  #endif
  
  #ifdef CONFIG_MTK_VENDOR
@@ -1158,5 +1134,5 @@
  
  enum mtk_vendor_attr_csi_ctrl {
 -- 
-2.25.1
+2.18.0
 
diff --git a/recipes-kernel/linux-mt76/files/patches/1006-mt76-mt7915-add-L0.5-system-error-recovery-support.patch b/recipes-kernel/linux-mt76/files/patches/1006-mt76-mt7915-add-L0.5-system-error-recovery-support.patch
index aed5db0..777dfbe 100644
--- a/recipes-kernel/linux-mt76/files/patches/1006-mt76-mt7915-add-L0.5-system-error-recovery-support.patch
+++ b/recipes-kernel/linux-mt76/files/patches/1006-mt76-mt7915-add-L0.5-system-error-recovery-support.patch
@@ -1,21 +1,20 @@
-From ae9d492fc2d9e15e6625187bc0fcbc154fb58e02 Mon Sep 17 00:00:00 2001
+From a9856ee394084946e0fb59c6b56dfd66108761ba Mon Sep 17 00:00:00 2001
 From: Bo Jiao <Bo.Jiao@mediatek.com>
 Date: Wed, 22 Jun 2022 10:51:59 +0800
-Subject: [PATCH 1006/1008] mt76: mt7915: add L0.5 system error recovery
- support
+Subject: [PATCH] mt76: mt7915: add L0.5 system error recovery support
 
 ---
- .../wireless/mediatek/mt76/mt7915/debugfs.c   |  88 ++++--
- .../net/wireless/mediatek/mt76/mt7915/dma.c   |  48 +++
- .../net/wireless/mediatek/mt76/mt7915/init.c  |   8 +-
- .../net/wireless/mediatek/mt76/mt7915/mac.c   | 284 ++++++++++++++----
- .../net/wireless/mediatek/mt76/mt7915/main.c  |  19 +-
- .../net/wireless/mediatek/mt76/mt7915/mcu.c   |  95 +++++-
- .../net/wireless/mediatek/mt76/mt7915/mcu.h   |   3 +-
- .../net/wireless/mediatek/mt76/mt7915/mmio.c  |   8 +-
- .../wireless/mediatek/mt76/mt7915/mt7915.h    |  23 ++
- .../net/wireless/mediatek/mt76/mt7915/regs.h  |  16 +
- 10 files changed, 493 insertions(+), 99 deletions(-)
+ mt7915/debugfs.c |  88 ++++++++++++---
+ mt7915/dma.c     |  48 ++++++++
+ mt7915/init.c    |   8 +-
+ mt7915/mac.c     | 283 +++++++++++++++++++++++++++++++++++++----------
+ mt7915/main.c    |  19 +++-
+ mt7915/mcu.c     |  95 ++++++++++++++--
+ mt7915/mcu.h     |   3 +-
+ mt7915/mmio.c    |   8 +-
+ mt7915/mt7915.h  |  23 ++++
+ mt7915/regs.h    |  16 +++
+ 10 files changed, 492 insertions(+), 99 deletions(-)
 
 diff --git a/mt7915/debugfs.c b/mt7915/debugfs.c
 index 0cfb6068..07de2eef 100644
@@ -142,16 +141,16 @@
  	kfree(buff);
  	return ret;
 diff --git a/mt7915/dma.c b/mt7915/dma.c
-index c2d655cd..9e3d14db 100644
+index f7e6bb10..4b594a53 100644
 --- a/mt7915/dma.c
 +++ b/mt7915/dma.c
-@@ -486,6 +486,54 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -479,6 +479,54 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  	return 0;
  }
  
 +int mt7915_dma_reset(struct mt7915_dev *dev, bool force)
 +{
-+	struct mt76_phy *mphy_ext = dev->mt76.phy2;
++	struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
 +	int i;
 +
 +	/* clean up hw queues */
@@ -201,7 +200,7 @@
  {
  	mt7915_dma_disable(dev, true);
 diff --git a/mt7915/init.c b/mt7915/init.c
-index 02d1b6d8..0d5109a3 100644
+index 37b7b54a..141c5ad8 100644
 --- a/mt7915/init.c
 +++ b/mt7915/init.c
 @@ -262,7 +262,7 @@ static void mt7915_led_set_brightness(struct led_classdev *led_cdev,
@@ -241,7 +240,7 @@
  
  unreg_thermal:
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index 24052f47..f13456bf 100644
+index 6b3fa4ce..e5409413 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
 @@ -3,6 +3,7 @@
@@ -252,15 +251,15 @@
  #include "mt7915.h"
  #include "../dma.h"
  #include "mac.h"
-@@ -1313,85 +1314,188 @@ mt7915_update_beacons(struct mt7915_dev *dev)
- 		mt7915_update_vif_beacon, dev->mt76.phy2->hw);
+@@ -1315,85 +1316,187 @@ mt7915_update_beacons(struct mt7915_dev *dev)
+ 		mt7915_update_vif_beacon, mphy_ext->hw);
  }
  
 -static void
 -mt7915_dma_reset(struct mt7915_dev *dev)
 +void mt7915_tx_token_put(struct mt7915_dev *dev)
  {
--	struct mt76_phy *mphy_ext = dev->mt76.phy2;
+-	struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
 -	u32 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
 -	int i;
 +	struct mt76_txwi_cache *txwi;
@@ -287,16 +286,13 @@
 -	mt76_clear(dev, MT_WFDMA0_GLO_CFG,
 -		   MT_WFDMA0_GLO_CFG_TX_DMA_EN |
 -		   MT_WFDMA0_GLO_CFG_RX_DMA_EN);
-+	ext_phy = dev->mt76.phy2;
++	ext_phy = dev->mt76.phys[MT_BAND1];
 +	phy2 = ext_phy ? ext_phy->priv : NULL;
  
 -	if (is_mt7915(&dev->mt76))
 -		mt76_clear(dev, MT_WFDMA1_GLO_CFG,
 -			   MT_WFDMA1_GLO_CFG_TX_DMA_EN |
 -			   MT_WFDMA1_GLO_CFG_RX_DMA_EN);
-+	/* irq disable */
-+	mt76_wr(dev, MT_INT_MASK_CSR, 0x0);
-+	mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
  	if (dev->hif2) {
 -		mt76_clear(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
 -			   MT_WFDMA0_GLO_CFG_TX_DMA_EN |
@@ -308,15 +304,15 @@
 -				   MT_WFDMA1_GLO_CFG_RX_DMA_EN);
 +		mt76_wr(dev, MT_INT1_MASK_CSR, 0x0);
 +		mt76_wr(dev, MT_INT1_SOURCE_CSR, ~0);
-+	}
+ 	}
+ 
+-	usleep_range(1000, 2000);
 +	if (dev_is_pci(mdev->dev)) {
 +		mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
 +		if (dev->hif2)
 +			mt76_wr(dev, MT_PCIE1_MAC_INT_ENABLE, 0x0);
- 	}
++	}
  
--	usleep_range(1000, 2000);
--
 -	for (i = 0; i < __MT_TXQ_MAX; i++) {
 -		mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);
 -		if (mphy_ext)
@@ -354,15 +350,7 @@
 -	/* re-init prefetch settings after reset */
 -	mt7915_dma_prefetch(dev);
 +	mt7915_dma_reset(dev, true);
- 
--	mt76_set(dev, MT_WFDMA0_GLO_CFG,
--		 MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
--	if (is_mt7915(&dev->mt76))
--		mt76_set(dev, MT_WFDMA1_GLO_CFG,
--			 MT_WFDMA1_GLO_CFG_TX_DMA_EN |
--			 MT_WFDMA1_GLO_CFG_RX_DMA_EN |
--			 MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
--			 MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
++
 +	local_bh_disable();
 +	mt76_for_each_q_rx(mdev, i) {
 +		if (mdev->q_rx[i].ndesc) {
@@ -376,6 +364,15 @@
 +
 +	mt76_wr(dev, MT_INT_MASK_CSR, dev->mt76.mmio.irqmask);
 +	mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
+ 
+-	mt76_set(dev, MT_WFDMA0_GLO_CFG,
+-		 MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
+-	if (is_mt7915(&dev->mt76))
+-		mt76_set(dev, MT_WFDMA1_GLO_CFG,
+-			 MT_WFDMA1_GLO_CFG_TX_DMA_EN |
+-			 MT_WFDMA1_GLO_CFG_RX_DMA_EN |
+-			 MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
+-			 MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
  	if (dev->hif2) {
 -		mt76_set(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
 -			 MT_WFDMA0_GLO_CFG_TX_DMA_EN |
@@ -453,7 +450,10 @@
 -	idr_for_each_entry(&dev->mt76.token, txwi, id) {
 -		mt7915_txwi_free(dev, txwi, NULL, NULL);
 -		dev->mt76.token_count--;
-+	ext_phy = dev->mt76.phy2;
+-	}
+-	spin_unlock_bh(&dev->mt76.token_lock);
+-	idr_destroy(&dev->mt76.token);
++	ext_phy = dev->mt76.phys[MT_BAND1];
 +	phy2 = ext_phy ? ext_phy->priv : NULL;
 +
 +	dev->ser.hw_full_reset = true;
@@ -475,9 +475,7 @@
 +	for (i = 0; i < 10; i++) {
 +		if (!mt7915_mac_reset(dev))
 +			break;
- 	}
--	spin_unlock_bh(&dev->mt76.token_lock);
--	idr_destroy(&dev->mt76.token);
++ 	}
 +	mutex_unlock(&dev->mt76.mutex);
 +
 +	if (i == 10)
@@ -501,8 +499,8 @@
  }
  
  /* system error recovery */
-@@ -1406,6 +1510,36 @@ void mt7915_mac_reset_work(struct work_struct *work)
- 	ext_phy = dev->mt76.phy2;
+@@ -1408,6 +1511,36 @@ void mt7915_mac_reset_work(struct work_struct *work)
+ 	ext_phy = dev->mt76.phys[MT_BAND1];
  	phy2 = ext_phy ? ext_phy->priv : NULL;
  
 +	/* chip full reset */
@@ -538,7 +536,7 @@
  	if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_DMA))
  		return;
  
-@@ -1431,7 +1565,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
+@@ -1433,7 +1566,7 @@ void mt7915_mac_reset_work(struct work_struct *work)
  	mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
  
  	if (mt7915_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {
@@ -547,7 +545,7 @@
  
  		mt7915_tx_token_put(dev);
  		idr_init(&dev->mt76.token);
-@@ -1480,6 +1614,34 @@ void mt7915_mac_reset_work(struct work_struct *work)
+@@ -1482,6 +1615,34 @@ void mt7915_mac_reset_work(struct work_struct *work)
  					     MT7915_WATCHDOG_TIME);
  }
  
@@ -583,7 +581,7 @@
  {
  	struct mt7915_dev *dev = phy->dev;
 diff --git a/mt7915/main.c b/mt7915/main.c
-index d5fb947a..60d990f3 100644
+index 4e82904f..7a7ff86a 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
 @@ -20,17 +20,13 @@ static bool mt7915_dev_running(struct mt7915_dev *dev)
@@ -633,7 +631,7 @@
  	mutex_lock(&dev->mt76.mutex);
  
 diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index 53d4cd44..62412c23 100644
+index f692e520..5eac6ed6 100644
 --- a/mt7915/mcu.c
 +++ b/mt7915/mcu.c
 @@ -150,19 +150,90 @@ mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
@@ -727,7 +725,7 @@
  	rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
  	if (seq != rxd->seq)
  		return -EAGAIN;
-@@ -2273,18 +2344,10 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
+@@ -2266,18 +2337,10 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
  				 sizeof(req), true);
  }
  
@@ -747,7 +745,7 @@
  	/* force firmware operation mode into normal state,
  	 * which should be set before firmware download stage.
  	 */
-@@ -2333,6 +2396,20 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
+@@ -2326,6 +2389,20 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
  				 MCU_WA_PARAM_RED, 0, 0);
  }
  
@@ -784,7 +782,7 @@
  	SER_SET_RECOVER_L3_RX_ABORT,
  	SER_SET_RECOVER_L3_TX_ABORT,
 diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index d0e792f8..6e140e2d 100644
+index c81fa091..8469d8fb 100644
 --- a/mt7915/mmio.c
 +++ b/mt7915/mmio.c
 @@ -24,6 +24,7 @@ static const u32 mt7915_reg[] = {
@@ -825,7 +823,7 @@
  	}
  }
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 5aafaac0..07a1c9ce 100644
+index 267fa7eb..d214b181 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
 @@ -352,6 +352,15 @@ struct mt7915_dev {
@@ -857,7 +855,7 @@
  enum {
  	MT_RX_SEL0,
  	MT_RX_SEL1,
-@@ -513,6 +528,14 @@ s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band);
+@@ -514,6 +529,14 @@ s8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band);
  int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2);
  void mt7915_dma_prefetch(struct mt7915_dev *dev);
  void mt7915_dma_cleanup(struct mt7915_dev *dev);
@@ -873,10 +871,10 @@
  int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev,
  			       struct mt7915_vif *mvif,
 diff --git a/mt7915/regs.h b/mt7915/regs.h
-index c7c9e411..47bae86e 100644
+index 16875680..3d2c15be 100644
 --- a/mt7915/regs.h
 +++ b/mt7915/regs.h
-@@ -32,6 +32,7 @@ enum reg_rev {
+@@ -26,6 +26,7 @@ enum reg_rev {
  	INFRA_MCU_ADDR_END,
  	FW_EXCEPTION_ADDR,
  	SWDEF_BASE_ADDR,
@@ -884,7 +882,7 @@
  	__MT_REG_MAX,
  };
  
-@@ -113,6 +114,11 @@ enum offs_rev {
+@@ -107,6 +108,11 @@ enum offs_rev {
  #define __REG(id)			(dev->reg.reg_rev[(id)])
  #define __OFFS(id)			(dev->reg.offs_rev[(id)])
  
@@ -896,7 +894,7 @@
  /* MCU WFDMA0 */
  #define MT_MCU_WFDMA0_BASE		0x2000
  #define MT_MCU_WFDMA0(ofs)		(MT_MCU_WFDMA0_BASE + (ofs))
-@@ -565,6 +571,10 @@ enum offs_rev {
+@@ -559,6 +565,10 @@ enum offs_rev {
  #define MT_WFDMA0_PRI_DLY_INT_CFG1	MT_WFDMA0(0x2f4)
  #define MT_WFDMA0_PRI_DLY_INT_CFG2	MT_WFDMA0(0x2f8)
  
@@ -907,7 +905,7 @@
  /* WFDMA1 */
  #define MT_WFDMA1_BASE			0xd5000
  #define MT_WFDMA1(ofs)			(MT_WFDMA1_BASE + (ofs))
-@@ -710,6 +720,10 @@ enum offs_rev {
+@@ -704,6 +714,10 @@ enum offs_rev {
  #define MT_MCU_CMD_NORMAL_STATE		BIT(5)
  #define MT_MCU_CMD_ERROR_MASK		GENMASK(5, 1)
  
@@ -918,7 +916,7 @@
  /* TOP RGU */
  #define MT_TOP_RGU_BASE			0x18000000
  #define MT_TOP_PWR_CTRL			(MT_TOP_RGU_BASE + (0x0))
-@@ -985,6 +999,8 @@ enum offs_rev {
+@@ -979,6 +993,8 @@ enum offs_rev {
  #define MT_CPU_UTIL_PEAK_IDLE_CNT	MT_CPU_UTIL(0x0c)
  #define MT_CPU_UTIL_CTRL		MT_CPU_UTIL(0x1c)
  
@@ -928,5 +926,5 @@
  #define MT_LED_TOP_BASE			0x18013000
  #define MT_LED_PHYS(_n)			(MT_LED_TOP_BASE + (_n))
 -- 
-2.25.1
+2.18.0
 
diff --git a/recipes-kernel/linux-mt76/files/patches/1111-mt76-testmode-additional-supports.patch b/recipes-kernel/linux-mt76/files/patches/1111-mt76-testmode-additional-supports.patch
index 0353dfb..3972345 100644
--- a/recipes-kernel/linux-mt76/files/patches/1111-mt76-testmode-additional-supports.patch
+++ b/recipes-kernel/linux-mt76/files/patches/1111-mt76-testmode-additional-supports.patch
@@ -1,33 +1,33 @@
-From 969b99141e451f7af21a2e8f5ec051be6deaa026 Mon Sep 17 00:00:00 2001
+From da1c7ada0eb6dbe66297ab71acd31395afd3bf30 Mon Sep 17 00:00:00 2001
 From: Shayne Chen <shayne.chen@mediatek.com>
 Date: Thu, 21 Apr 2022 15:43:19 +0800
-Subject: [PATCH 1111/1119] mt76: testmode: additional supports
+Subject: [PATCH] mt76: testmode: additional supports
 
 Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
 ---
- drivers/net/wireless/mediatek/mt76/dma.c      |    3 +-
- drivers/net/wireless/mediatek/mt76/mac80211.c |   12 +
- drivers/net/wireless/mediatek/mt76/mt76.h     |  111 +-
- .../wireless/mediatek/mt76/mt76_connac_mcu.c  |    4 +
- .../wireless/mediatek/mt76/mt76_connac_mcu.h  |    2 +
- .../net/wireless/mediatek/mt76/mt7915/init.c  |    2 +-
- .../net/wireless/mediatek/mt76/mt7915/mac.c   |   37 +-
- .../net/wireless/mediatek/mt76/mt7915/main.c  |    2 +-
- .../net/wireless/mediatek/mt76/mt7915/mcu.c   |   10 +-
- .../net/wireless/mediatek/mt76/mt7915/mcu.h   |   28 +-
- .../net/wireless/mediatek/mt76/mt7915/mmio.c  |    2 +
- .../wireless/mediatek/mt76/mt7915/mt7915.h    |   14 +-
- .../net/wireless/mediatek/mt76/mt7915/regs.h  |    3 +
- .../wireless/mediatek/mt76/mt7915/testmode.c  | 1171 +++++++++++++++--
- .../wireless/mediatek/mt76/mt7915/testmode.h  |  278 ++++
- drivers/net/wireless/mediatek/mt76/testmode.c |  275 +++-
- drivers/net/wireless/mediatek/mt76/testmode.h |   75 ++
- .../net/wireless/mediatek/mt76/tools/fields.c |   80 ++
- drivers/net/wireless/mediatek/mt76/tx.c       |    3 +-
- 19 files changed, 1963 insertions(+), 149 deletions(-)
+ dma.c             |    3 +-
+ mac80211.c        |   12 +
+ mt76.h            |  108 ++++-
+ mt76_connac_mcu.c |    4 +
+ mt76_connac_mcu.h |    2 +
+ mt7915/init.c     |    2 +-
+ mt7915/mac.c      |   35 +-
+ mt7915/main.c     |    2 +-
+ mt7915/mcu.c      |   10 +-
+ mt7915/mcu.h      |   28 +-
+ mt7915/mmio.c     |    2 +
+ mt7915/mt7915.h   |   14 +-
+ mt7915/regs.h     |    3 +
+ mt7915/testmode.c | 1171 ++++++++++++++++++++++++++++++++++++++++++---
+ mt7915/testmode.h |  278 +++++++++++
+ testmode.c        |  275 +++++++++--
+ testmode.h        |   75 +++
+ tools/fields.c    |   80 ++++
+ tx.c              |    3 +-
+ 19 files changed, 1961 insertions(+), 146 deletions(-)
 
 diff --git a/dma.c b/dma.c
-index f22273cd..03ee9109 100644
+index 40cb9109..8ea09e6e 100644
 --- a/dma.c
 +++ b/dma.c
 @@ -426,8 +426,7 @@ free:
@@ -41,7 +41,7 @@
  #endif
  
 diff --git a/mac80211.c b/mac80211.c
-index a7e082f7..9984def5 100644
+index d74300f3..e1c33324 100644
 --- a/mac80211.c
 +++ b/mac80211.c
 @@ -55,6 +55,13 @@ static const struct ieee80211_channel mt76_channels_5ghz[] = {
@@ -71,10 +71,10 @@
  
  static const struct ieee80211_channel mt76_channels_6ghz[] = {
 diff --git a/mt76.h b/mt76.h
-index 8325409a..4c8a671f 100644
+index 8e81f406..d03f312e 100644
 --- a/mt76.h
 +++ b/mt76.h
-@@ -602,6 +602,21 @@ struct mt76_testmode_ops {
+@@ -610,6 +610,21 @@ struct mt76_testmode_ops {
  	int (*set_params)(struct mt76_phy *phy, struct nlattr **tb,
  			  enum mt76_testmode_state new_state);
  	int (*dump_stats)(struct mt76_phy *phy, struct sk_buff *msg);
@@ -96,7 +96,7 @@
  };
  
  #define MT_TM_FW_RX_COUNT	BIT(0)
-@@ -610,16 +625,11 @@ struct mt76_testmode_data {
+@@ -618,16 +633,11 @@ struct mt76_testmode_data {
  	enum mt76_testmode_state state;
  
  	u32 param_set[DIV_ROUND_UP(NUM_MT76_TM_ATTRS, 32)];
@@ -113,7 +113,7 @@
  	u8 tx_rate_stbc;
  	u8 tx_ltf;
  
-@@ -635,10 +645,37 @@ struct mt76_testmode_data {
+@@ -643,10 +653,37 @@ struct mt76_testmode_data {
  	u8 tx_power[4];
  	u8 tx_power_control;
  
@@ -152,7 +152,7 @@
  	u32 tx_pending;
  	u32 tx_queued;
  	u16 tx_queued_limit;
-@@ -1120,14 +1157,69 @@ static inline bool mt76_testmode_enabled(struct mt76_phy *phy)
+@@ -1123,6 +1160,59 @@ static inline bool mt76_testmode_enabled(struct mt76_phy *phy)
  #endif
  }
  
@@ -212,19 +212,17 @@
  static inline bool mt76_is_testmode_skb(struct mt76_dev *dev,
  					struct sk_buff *skb,
  					struct ieee80211_hw **hw)
- {
- #ifdef CONFIG_NL80211_TESTMODE
--	if (skb == dev->phy.test.tx_skb)
-+	if (mt76_testmode_enabled(&dev->phy) &&
-+	    __mt76_is_testmode_skb(&dev->phy, skb))
- 		*hw = dev->phy.hw;
--	else if (dev->phy2 && skb == dev->phy2->test.tx_skb)
-+	else if (dev->phy2 && mt76_testmode_enabled(dev->phy2) &&
-+		 __mt76_is_testmode_skb(dev->phy2, skb))
- 		*hw = dev->phy2->hw;
- 	else
- 		return false;
-@@ -1227,7 +1319,8 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+@@ -1133,7 +1223,8 @@ static inline bool mt76_is_testmode_skb(struct mt76_dev *dev,
+ 	for (i = 0; i < ARRAY_SIZE(dev->phys); i++) {
+ 		struct mt76_phy *phy = dev->phys[i];
+ 
+-		if (phy && skb == phy->test.tx_skb) {
++		if (phy && mt76_testmode_enabled(phy) &&
++		    __mt76_is_testmode_skb(phy, skb)) {
+ 			*hw = dev->phys[i]->hw;
+ 			return true;
+ 		}
+@@ -1234,7 +1325,8 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb,
  		       struct netlink_callback *cb, void *data, int len);
  int mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state);
@@ -235,7 +233,7 @@
  static inline void mt76_testmode_reset(struct mt76_phy *phy, bool disable)
  {
 diff --git a/mt76_connac_mcu.c b/mt76_connac_mcu.c
-index 261181dc..cd350689 100644
+index 47b2bce6..e701db8a 100644
 --- a/mt76_connac_mcu.c
 +++ b/mt76_connac_mcu.c
 @@ -391,6 +391,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
@@ -277,7 +275,7 @@
  	MCU_EXT_CMD_CSI_CTRL = 0xc2,
  };
 diff --git a/mt7915/init.c b/mt7915/init.c
-index 0d5109a3..b549fa04 100644
+index 141c5ad8..538ff5c3 100644
 --- a/mt7915/init.c
 +++ b/mt7915/init.c
 @@ -576,7 +576,7 @@ static void mt7915_init_work(struct work_struct *work)
@@ -290,10 +288,10 @@
  	mt7915_init_txpower(dev, &dev->mphy.sband_2g.sband);
  	mt7915_init_txpower(dev, &dev->mphy.sband_5g.sband);
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index f13456bf..5e5df23d 100644
+index e5409413..f0eefc6d 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
-@@ -565,17 +565,39 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
+@@ -565,16 +565,38 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
  {
  #ifdef CONFIG_NL80211_TESTMODE
  	struct mt76_testmode_data *td = &phy->mt76->test;
@@ -319,7 +317,7 @@
 +		txwi[3] &= ~cpu_to_le32(MT_TXD3_NO_ACK);
 +		le32p_replace_bits(&txwi[3], 0x1f, MT_TXD3_REM_TX_COUNT);
 +
-+		return;
+ 		return;
 +	}
 +
 +	mt76_tm_for_each_entry(phy->mt76, wcid, ed)
@@ -327,16 +325,15 @@
 +			break;
 +
 +	if (!ed)
- 		return;
- 
++		return;
++
 +	nss = ed->tx_rate_nss;
 +	rate_idx = ed->tx_rate_idx;
 +	ldpc = ed->tx_rate_ldpc;
-+
+ 
  	switch (td->tx_rate_mode) {
  	case MT76_TM_TX_MODE_HT:
- 		nss = 1 + (rate_idx >> 3);
-@@ -664,14 +686,13 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
+@@ -664,13 +686,14 @@ mt7915_mac_write_txwi_tm(struct mt7915_phy *phy, __le32 *txwi,
  	if (mode >= MT_PHY_TYPE_HE_SU)
  		val |= FIELD_PREP(MT_TXD6_HELTF, td->tx_ltf);
  
@@ -344,8 +341,7 @@
 +	if (ldpc || (bw > 0 && mode >= MT_PHY_TYPE_HE_SU))
  		val |= MT_TXD6_LDPC;
  
--	txwi[1] &= ~cpu_to_le32(MT_TXD1_VTA);
--	txwi[3] &= ~cpu_to_le32(MT_TXD3_SN_VALID);
+ 	txwi[3] &= ~cpu_to_le32(MT_TXD3_SN_VALID);
 +	if (phy->test.bf_en)
 +		val |= MT_TXD6_TX_IBF | MT_TXD6_TX_EBF;
 +
@@ -356,7 +352,7 @@
  }
  
 diff --git a/mt7915/main.c b/mt7915/main.c
-index 60d990f3..dd0b3cc2 100644
+index 7a7ff86a..b5c3c14e 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
 @@ -224,7 +224,7 @@ static int mt7915_add_interface(struct ieee80211_hw *hw,
@@ -369,7 +365,7 @@
  		mvif->mt76.wmm_idx += 2;
  
 diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index 0f71356b..c65fee98 100644
+index 9a7c9d3d..ecdc4fb3 100644
 --- a/mt7915/mcu.c
 +++ b/mt7915/mcu.c
 @@ -434,6 +434,11 @@ mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
@@ -392,7 +388,7 @@
  	    !rxd->seq)
  		mt7915_mcu_rx_unsolicited_event(dev, skb);
  	else
-@@ -2831,14 +2837,14 @@ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
+@@ -2824,14 +2830,14 @@ static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
  	return 0;
  }
  
@@ -467,7 +463,7 @@
  
  enum {
 diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index 6e140e2d..6d1dbdbd 100644
+index 8469d8fb..8d966eff 100644
 --- a/mt7915/mmio.c
 +++ b/mt7915/mmio.c
 @@ -76,6 +76,7 @@ static const u32 mt7915_offs[] = {
@@ -487,7 +483,7 @@
  	[AGG_PCR0]		= 0x040,
  	[AGG_ACR0]		= 0x054,
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 07a1c9ce..7c7d6bd3 100644
+index d214b181..99f364c0 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
 @@ -303,6 +303,9 @@ struct mt7915_phy {
@@ -515,7 +511,7 @@
  #ifdef MTK_DEBUG
  	u16 wlan_idx;
  	struct {
-@@ -571,7 +582,7 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
+@@ -572,7 +583,7 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
  				   struct ieee80211_vif *vif,
  				   struct ieee80211_sta *sta,
  				   void *data, u32 field);
@@ -524,7 +520,7 @@
  int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset);
  int mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num);
  int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable,
-@@ -604,6 +615,7 @@ int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl);
+@@ -605,6 +616,7 @@ int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl);
  int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level);
  void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb);
  void mt7915_mcu_exit(struct mt7915_dev *dev);
@@ -533,10 +529,10 @@
  static inline u16 mt7915_wtbl_size(struct mt7915_dev *dev)
  {
 diff --git a/mt7915/regs.h b/mt7915/regs.h
-index 47bae86e..444440e1 100644
+index 3d2c15be..05ab6d9b 100644
 --- a/mt7915/regs.h
 +++ b/mt7915/regs.h
-@@ -51,6 +51,7 @@ enum offs_rev {
+@@ -45,6 +45,7 @@ enum offs_rev {
  	ARB_DRNGR0,
  	ARB_SCR,
  	RMAC_MIB_AIRTIME14,
@@ -544,7 +540,7 @@
  	AGG_AWSCR0,
  	AGG_PCR0,
  	AGG_ACR0,
-@@ -467,6 +468,8 @@ enum offs_rev {
+@@ -461,6 +462,8 @@ enum offs_rev {
  #define MT_WF_AGG_BASE(_band)		((_band) ? 0x820f2000 : 0x820e2000)
  #define MT_WF_AGG(_band, ofs)		(MT_WF_AGG_BASE(_band) + (ofs))
  
@@ -554,7 +550,7 @@
  							  (_n) * 4))
  #define MT_AGG_PCR0(_band, _n)		MT_WF_AGG(_band, (__OFFS(AGG_PCR0) +	\
 diff --git a/mt7915/testmode.c b/mt7915/testmode.c
-index b2eee3f2..3efd1ff0 100644
+index 331d8b9d..de6e63e1 100644
 --- a/mt7915/testmode.c
 +++ b/mt7915/testmode.c
 @@ -9,6 +9,9 @@
@@ -1678,7 +1674,7 @@
 -	/* pr_info("fcs_ok = %d\n", le16_to_cpu(rs_band->fcs_succ)); */
  
  	if (!clear) {
- 		enum mt76_rxq_id q = req.band ? MT_RXQ_EXT : MT_RXQ_MAIN;
+ 		enum mt76_rxq_id q = req.band ? MT_RXQ_BAND1 : MT_RXQ_MAIN;
 @@ -560,13 +1494,61 @@ mt7915_tm_get_rx_stats(struct mt7915_phy *phy, bool clear)
  	return 0;
  }
@@ -2200,7 +2196,7 @@
 +
  #endif
 diff --git a/testmode.c b/testmode.c
-index 31439b39..86323f64 100644
+index d7eb1f03..2653182a 100644
 --- a/testmode.c
 +++ b/testmode.c
 @@ -27,28 +27,16 @@ const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = {
@@ -2340,7 +2336,7 @@
  {
  #define MT_TXP_MAX_LEN	4095
  	u16 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
-@@ -119,7 +175,8 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
+@@ -118,7 +174,8 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
  	nfrags = len / MT_TXP_MAX_LEN;
  	head_len = nfrags ? MT_TXP_MAX_LEN : len;
  
@@ -2350,7 +2346,7 @@
  		fc |= IEEE80211_STYPE_QOS_DATA;
  
  	head = alloc_skb(head_len, GFP_KERNEL);
-@@ -128,9 +185,9 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
+@@ -127,9 +184,9 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
  
  	hdr = __skb_put_zero(head, sizeof(*hdr));
  	hdr->frame_control = cpu_to_le16(fc);
@@ -2363,7 +2359,7 @@
  	skb_set_queue_mapping(head, IEEE80211_AC_BE);
  	get_random_bytes(__skb_put(head, head_len - sizeof(*hdr)),
  			 head_len - sizeof(*hdr));
-@@ -156,7 +213,7 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
+@@ -153,7 +210,7 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
  
  		frag = alloc_skb(frag_len, GFP_KERNEL);
  		if (!frag) {
@@ -2372,7 +2368,7 @@
  			dev_kfree_skb(head);
  			return -ENOMEM;
  		}
-@@ -169,15 +226,14 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
+@@ -166,15 +223,14 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
  		frag_tail = &(*frag_tail)->next;
  	}
  
@@ -2392,7 +2388,7 @@
  {
  	struct mt76_testmode_data *td = &phy->test;
  	struct ieee80211_tx_info *info;
-@@ -185,7 +241,7 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
+@@ -182,7 +238,7 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
  	u8 max_nss = hweight8(phy->antenna_mask);
  	int ret;
  
@@ -2401,7 +2397,7 @@
  	if (ret)
  		return ret;
  
-@@ -195,7 +251,7 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
+@@ -192,7 +248,7 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
  	if (td->tx_antenna_mask)
  		max_nss = min_t(u8, max_nss, hweight8(td->tx_antenna_mask));
  
@@ -2410,7 +2406,7 @@
  	rate = &info->control.rates[0];
  	rate->count = 1;
  	rate->idx = td->tx_rate_idx;
-@@ -267,6 +323,25 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
+@@ -264,6 +320,25 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
  out:
  	return 0;
  }
@@ -2436,7 +2432,7 @@
  
  static void
  mt76_testmode_tx_start(struct mt76_phy *phy)
-@@ -277,6 +352,14 @@ mt76_testmode_tx_start(struct mt76_phy *phy)
+@@ -274,6 +349,14 @@ mt76_testmode_tx_start(struct mt76_phy *phy)
  	td->tx_queued = 0;
  	td->tx_done = 0;
  	td->tx_pending = td->tx_count;
@@ -2451,7 +2447,7 @@
  	mt76_worker_schedule(&dev->tx_worker);
  }
  
-@@ -295,7 +378,7 @@ mt76_testmode_tx_stop(struct mt76_phy *phy)
+@@ -292,7 +375,7 @@ mt76_testmode_tx_stop(struct mt76_phy *phy)
  	wait_event_timeout(dev->tx_wait, td->tx_done == td->tx_queued,
  			   MT76_TM_TIMEOUT * HZ);
  
@@ -2460,7 +2456,7 @@
  }
  
  static inline void
-@@ -326,6 +409,8 @@ mt76_testmode_init_defaults(struct mt76_phy *phy)
+@@ -323,6 +406,8 @@ mt76_testmode_init_defaults(struct mt76_phy *phy)
  	memcpy(td->addr[0], phy->macaddr, ETH_ALEN);
  	memcpy(td->addr[1], phy->macaddr, ETH_ALEN);
  	memcpy(td->addr[2], phy->macaddr, ETH_ALEN);
@@ -2469,7 +2465,7 @@
  }
  
  static int
-@@ -335,8 +420,12 @@ __mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state)
+@@ -332,8 +417,12 @@ __mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state)
  	struct mt76_dev *dev = phy->dev;
  	int err;
  
@@ -2483,7 +2479,7 @@
  
  	if (state == MT76_TM_STATE_TX_FRAMES) {
  		err = mt76_testmode_tx_init(phy);
-@@ -406,6 +495,44 @@ mt76_tm_get_u8(struct nlattr *attr, u8 *dest, u8 min, u8 max)
+@@ -403,6 +492,44 @@ mt76_tm_get_u8(struct nlattr *attr, u8 *dest, u8 min, u8 max)
  	return 0;
  }
  
@@ -2528,7 +2524,7 @@
  int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  		      void *data, int len)
  {
-@@ -429,6 +556,11 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+@@ -426,6 +553,11 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  
  	mutex_lock(&dev->mutex);
  
@@ -2540,7 +2536,7 @@
  	if (tb[MT76_TM_ATTR_RESET]) {
  		mt76_testmode_set_state(phy, MT76_TM_STATE_OFF);
  		memset(td, 0, sizeof(*td));
-@@ -456,7 +588,10 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+@@ -453,7 +585,10 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  	    mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_DUTY_CYCLE],
  			   &td->tx_duty_cycle, 0, 99) ||
  	    mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_POWER_CONTROL],
@@ -2552,7 +2548,7 @@
  		goto out;
  
  	if (tb[MT76_TM_ATTR_TX_LENGTH]) {
-@@ -488,8 +623,7 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+@@ -485,8 +620,7 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  
  	if (tb[MT76_TM_ATTR_TX_POWER]) {
  		struct nlattr *cur;
@@ -2562,7 +2558,7 @@
  
  		nla_for_each_nested(cur, tb[MT76_TM_ATTR_TX_POWER], rem) {
  			if (nla_len(cur) != 1 ||
-@@ -509,11 +643,45 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+@@ -506,11 +640,45 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
  			if (nla_len(cur) != ETH_ALEN || idx >= 3)
  				goto out;
  
@@ -2609,7 +2605,7 @@
  	if (dev->test_ops->set_params) {
  		err = dev->test_ops->set_params(phy, tb, state);
  		if (err)
-@@ -578,6 +746,7 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
+@@ -575,6 +743,7 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
  	struct mt76_phy *phy = hw->priv;
  	struct mt76_dev *dev = phy->dev;
  	struct mt76_testmode_data *td = &phy->test;
@@ -2617,7 +2613,7 @@
  	struct nlattr *tb[NUM_MT76_TM_ATTRS] = {};
  	int err = 0;
  	void *a;
-@@ -610,6 +779,19 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
+@@ -607,6 +776,19 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
  		goto out;
  	}
  
@@ -2637,7 +2633,7 @@
  	mt76_testmode_init_defaults(phy);
  
  	err = -EMSGSIZE;
-@@ -622,12 +804,8 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
+@@ -619,12 +801,8 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
  		goto out;
  
  	if (nla_put_u32(msg, MT76_TM_ATTR_TX_COUNT, td->tx_count) ||
@@ -2650,7 +2646,7 @@
  	    nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_STBC, td->tx_rate_stbc) ||
  	    (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_LTF) &&
  	     nla_put_u8(msg, MT76_TM_ATTR_TX_LTF, td->tx_ltf)) ||
-@@ -647,6 +825,15 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
+@@ -644,6 +822,15 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
  	     nla_put_u8(msg, MT76_TM_ATTR_FREQ_OFFSET, td->freq_offset)))
  		goto out;
  
@@ -2898,7 +2894,7 @@
  };
  
 diff --git a/tx.c b/tx.c
-index 6c8d50d3..ae44afe0 100644
+index 65e2b7c1..8b33186b 100644
 --- a/tx.c
 +++ b/tx.c
 @@ -245,8 +245,7 @@ void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff *
@@ -2912,5 +2908,5 @@
  			wake_up(&dev->tx_wait);
  
 -- 
-2.25.1
+2.18.0
 
diff --git a/recipes-kernel/linux-mt76/files/patches/3001-mt76-add-wed-tx-support.patch b/recipes-kernel/linux-mt76/files/patches/3001-mt76-add-wed-tx-support.patch
index 0cc1f89..ed4e187 100644
--- a/recipes-kernel/linux-mt76/files/patches/3001-mt76-add-wed-tx-support.patch
+++ b/recipes-kernel/linux-mt76/files/patches/3001-mt76-add-wed-tx-support.patch
@@ -1,7 +1,7 @@
-From 379918ba724d761166f0677848b6266fe999486a Mon Sep 17 00:00:00 2001
+From 47fc67f6071081280625a5cb34c5612429787f77 Mon Sep 17 00:00:00 2001
 From: Sujuan Chen <sujuan.chen@mediatek.com>
 Date: Sun, 12 Jun 2022 16:38:45 +0800
-Subject: [PATCH 3001/3003] mt76 add wed tx support
+Subject: [PATCH 3001/3002] mt76 add wed tx support
 
 Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
 ---
@@ -18,10 +18,10 @@
  10 files changed, 193 insertions(+), 97 deletions(-)
 
 diff --git a/mt76_connac.h b/mt76_connac.h
-index 5a9c1c9..c8d8680 100644
+index 7b6b3aa6..f71ded84 100644
 --- a/mt76_connac.h
 +++ b/mt76_connac.h
-@@ -110,6 +110,7 @@ struct mt76_connac_sta_key_conf {
+@@ -116,6 +116,7 @@ struct mt76_connac_sta_key_conf {
  };
  
  #define MT_TXP_MAX_BUF_NUM		6
@@ -30,11 +30,11 @@
  struct mt76_connac_fw_txp {
  	__le16 flags;
 diff --git a/mt7915/dma.c b/mt7915/dma.c
-index 9e3d14d..7122322 100644
+index 8905018c..248a67f2 100644
 --- a/mt7915/dma.c
 +++ b/mt7915/dma.c
-@@ -12,7 +12,10 @@ mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base
- 	int i, err;
+@@ -11,7 +11,10 @@ mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base
+ 	struct mt7915_dev *dev = phy->dev;
  
  	if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) {
 -		ring_base = MT_WED_TX_RING_BASE;
@@ -45,7 +45,7 @@
  		idx -= MT_TXQ_ID(0);
  	}
  
-@@ -74,14 +77,23 @@ static void mt7915_dma_config(struct mt7915_dev *dev)
+@@ -58,14 +61,23 @@ static void mt7915_dma_config(struct mt7915_dev *dev)
  		MCUQ_CONFIG(MT_MCUQ_WA, WFDMA1, MT_INT_TX_DONE_MCU_WA, MT7915_TXQ_MCU_WA);
  		MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA1, MT_INT_TX_DONE_FWDL, MT7915_TXQ_FWDL);
  	} else {
@@ -53,29 +53,29 @@
 +		if(is_mt7916(&dev->mt76) && (mtk_wed_device_active(&dev->mt76.mmio.wed))) {
 +			RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_WED_RX_DONE_BAND0_MT7916, MT7916_RXQ_BAND0);
 +			RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MT7916, MT7916_RXQ_MCU_WA);
-+			RXQ_CONFIG(MT_RXQ_EXT, WFDMA0, MT_INT_WED_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
++			RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_WED_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
 +			RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MAIN_MT7916, MT7916_RXQ_MCU_WA_MAIN);
 +			TXQ_CONFIG(0, WFDMA0, MT_INT_WED_TX_DONE_BAND0, MT7915_TXQ_BAND0);
 +			TXQ_CONFIG(1, WFDMA0, MT_INT_WED_TX_DONE_BAND1, MT7915_TXQ_BAND1);
 +		} else {
 +			RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0_MT7916, MT7916_RXQ_BAND0);
 +			RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA, MT7916_RXQ_MCU_WA);
-+			RXQ_CONFIG(MT_RXQ_EXT, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
++			RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
 +			RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_RX_DONE_WA_MAIN_MT7916, MT7916_RXQ_MCU_WA_MAIN);
 +			TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0, MT7915_TXQ_BAND0);
 +			TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1, MT7915_TXQ_BAND1);
 +		}
  		RXQ_CONFIG(MT_RXQ_MCU, WFDMA0, MT_INT_RX_DONE_WM, MT7916_RXQ_MCU_WM);
 -		RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA, MT7916_RXQ_MCU_WA);
--		RXQ_CONFIG(MT_RXQ_EXT, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
- 		RXQ_CONFIG(MT_RXQ_EXT_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT_MT7916, MT7916_RXQ_MCU_WA_EXT);
+-		RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916, MT7916_RXQ_BAND1);
+ 		RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT_MT7916, MT7916_RXQ_MCU_WA_EXT);
 -		RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_RX_DONE_WA_MAIN_MT7916, MT7916_RXQ_MCU_WA_MAIN);
 -		TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0, MT7915_TXQ_BAND0);
 -		TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1, MT7915_TXQ_BAND1);
  		MCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM, MT7915_TXQ_MCU_WM);
  		MCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA_MT7916, MT7915_TXQ_MCU_WA);
  		MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL, MT7915_TXQ_FWDL);
-@@ -330,7 +342,9 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
+@@ -323,7 +335,9 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
  		u32 wed_irq_mask = irq_mask;
  
  		wed_irq_mask |= MT_INT_TX_DONE_BAND0 | MT_INT_TX_DONE_BAND1;
@@ -86,7 +86,7 @@
  		mtk_wed_device_start(&dev->mt76.mmio.wed, wed_irq_mask);
  	}
  
-@@ -355,15 +369,19 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -348,15 +362,19 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  
  	mt7915_dma_disable(dev, true);
  
@@ -110,7 +110,7 @@
  	}
  
  	/* init tx queue */
-@@ -417,7 +435,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -410,7 +428,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  		return ret;
  
  	/* event from WA */
@@ -119,7 +119,7 @@
  		wa_rx_base = MT_WED_RX_RING_BASE;
  		wa_rx_idx = MT7915_RXQ_MCU_WA;
  		dev->mt76.q_rx[MT_RXQ_MCU_WA].flags = MT_WED_Q_TXFREE;
-@@ -444,11 +462,20 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -437,11 +455,20 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  
  	/* tx free notify event from WA for band0 */
  	if (!is_mt7915(mdev)) {
@@ -144,10 +144,10 @@
  			return ret;
  	}
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index 0310ca7..db21d83 100644
+index 2f154518..39a115ed 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
-@@ -835,9 +835,9 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id)
+@@ -826,9 +826,9 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id)
  
  	txp->token = cpu_to_le16(token_id);
  	txp->nbuf = 1;
@@ -160,7 +160,7 @@
  
  static void
 diff --git a/mt7915/main.c b/mt7915/main.c
-index 6085e12..2e721cd 100644
+index c287de36..b77b3be7 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
 @@ -1439,14 +1439,19 @@ mt7915_net_fill_forward_path(struct ieee80211_hw *hw,
@@ -186,10 +186,10 @@
  
  	ctx->dev = NULL;
 diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index ffe0447..9e9a2ea 100644
+index 65f91c1f..dd46762d 100644
 --- a/mt7915/mcu.c
 +++ b/mt7915/mcu.c
-@@ -2377,7 +2377,7 @@ int mt7915_run_firmware(struct mt7915_dev *dev)
+@@ -2374,7 +2374,7 @@ int mt7915_run_firmware(struct mt7915_dev *dev)
  	if (ret)
  		return ret;
  
@@ -199,7 +199,7 @@
  
  	ret = mt7915_mcu_set_mwds(dev, 1);
 diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index 6d1dbdb..b4a3120 100644
+index 8d966eff..b0d8a616 100644
 --- a/mt7915/mmio.c
 +++ b/mt7915/mmio.c
 @@ -10,6 +10,9 @@
@@ -341,10 +341,10 @@
  				     void __iomem *mem_base, u32 device_id)
  {
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 491566e..3912792 100644
+index 87be6002..a3ffbc63 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
-@@ -533,6 +533,8 @@ static inline void mt7986_wmac_disable(struct mt7915_dev *dev)
+@@ -532,6 +532,8 @@ static inline void mt7986_wmac_disable(struct mt7915_dev *dev)
  {
  }
  #endif
@@ -354,7 +354,7 @@
  				     void __iomem *mem_base, u32 device_id);
  void mt7915_wfsys_reset(struct mt7915_dev *dev);
 diff --git a/mt7915/pci.c b/mt7915/pci.c
-index d74f609..c5da01a 100644
+index d74f6097..c5da01a9 100644
 --- a/mt7915/pci.c
 +++ b/mt7915/pci.c
 @@ -12,9 +12,6 @@
@@ -451,10 +451,10 @@
  		goto free_wed_or_irq_vector;
  
 diff --git a/mt7915/regs.h b/mt7915/regs.h
-index 444440e..ffda5f6 100644
+index 05ab6d9b..432ed303 100644
 --- a/mt7915/regs.h
 +++ b/mt7915/regs.h
-@@ -623,6 +623,7 @@ enum offs_rev {
+@@ -617,6 +617,7 @@ enum offs_rev {
  #define MT_PCIE_RECOG_ID_MASK		GENMASK(30, 0)
  #define MT_PCIE_RECOG_ID_SEM		BIT(31)
  
@@ -462,7 +462,7 @@
  #define MT_INT_WED_MASK_CSR		MT_WFDMA_EXT_CSR(0x204)
  
  #define MT_WED_TX_RING_BASE		MT_WFDMA_EXT_CSR(0x300)
-@@ -669,6 +670,13 @@ enum offs_rev {
+@@ -663,6 +664,13 @@ enum offs_rev {
  #define MT_TXQ_EXT_CTRL(q)		(MT_Q_BASE(__TXQ(q)) + 0x600 +	\
  					 MT_TXQ_ID(q)* 0x4)
  
@@ -476,7 +476,7 @@
  #define MT_INT_SOURCE_CSR		__REG(INT_SOURCE_CSR)
  #define MT_INT_MASK_CSR			__REG(INT_MASK_CSR)
  
-@@ -687,6 +695,11 @@ enum offs_rev {
+@@ -681,6 +689,11 @@ enum offs_rev {
  #define MT_INT_RX_DONE_WA_MAIN_MT7916	BIT(2)
  #define MT_INT_RX_DONE_WA_EXT_MT7916	BIT(3)
  
@@ -488,7 +488,7 @@
  #define MT_INT_RX(q)			(dev->q_int_mask[__RXQ(q)])
  #define MT_INT_TX_MCU(q)		(dev->q_int_mask[(q)])
  
-@@ -710,6 +723,8 @@ enum offs_rev {
+@@ -704,6 +717,8 @@ enum offs_rev {
  #define MT_INT_TX_DONE_BAND0		BIT(30)
  #define MT_INT_TX_DONE_BAND1		BIT(31)
  #define MT_INT_TX_DONE_MCU_WA_MT7916	BIT(25)
@@ -498,7 +498,7 @@
  #define MT_INT_TX_DONE_MCU		(MT_INT_TX_MCU(MT_MCUQ_WA) |	\
  					 MT_INT_TX_MCU(MT_MCUQ_WM) |	\
 diff --git a/mt7915/soc.c b/mt7915/soc.c
-index 3618718..8d0b206 100644
+index 3618718d..8d0b2068 100644
 --- a/mt7915/soc.c
 +++ b/mt7915/soc.c
 @@ -1171,10 +1171,6 @@ static int mt7986_wmac_probe(struct platform_device *pdev)
diff --git a/recipes-kernel/linux-mt76/files/patches/3002-mt76-add-wed-rx-support.patch b/recipes-kernel/linux-mt76/files/patches/3002-mt76-add-wed-rx-support.patch
index 92dc07b..49c1573 100644
--- a/recipes-kernel/linux-mt76/files/patches/3002-mt76-add-wed-rx-support.patch
+++ b/recipes-kernel/linux-mt76/files/patches/3002-mt76-add-wed-rx-support.patch
@@ -1,7 +1,7 @@
-From 50c04081556744438d6017c11ddfa3b7239efd26 Mon Sep 17 00:00:00 2001
+From 7051d8491ee276345001a75ee240d45eca8e5aca Mon Sep 17 00:00:00 2001
 From: Sujuan Chen <sujuan.chen@mediatek.com>
 Date: Tue, 5 Jul 2022 19:42:55 +0800
-Subject: [PATCH 3002/3003] mt76 add wed rx support
+Subject: [PATCH] mt76 add wed rx support
 
 Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
 ---
@@ -32,7 +32,7 @@
  24 files changed, 505 insertions(+), 81 deletions(-)
 
 diff --git a/dma.c b/dma.c
-index 03ee9109..4d4d4046 100644
+index 8ea09e6e..3317d2b9 100644
 --- a/dma.c
 +++ b/dma.c
 @@ -98,6 +98,63 @@ mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t)
@@ -463,7 +463,7 @@
  
  	mt76_worker_disable(&dev->tx_worker);
  	netif_napi_del(&dev->tx_napi);
-@@ -801,12 +958,17 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
+@@ -806,12 +963,17 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
  
  	mt76_for_each_q_rx(dev, i) {
  		netif_napi_del(&dev->napi[i]);
@@ -504,10 +504,10 @@
  #define MT_RX_INFO_LEN			4
  #define MT_FCE_INFO_LEN			4
 diff --git a/mac80211.c b/mac80211.c
-index af2c09ad..fa5ce6ec 100644
+index 2f0605d5..a2bd8caa 100644
 --- a/mac80211.c
 +++ b/mac80211.c
-@@ -594,11 +594,14 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
+@@ -598,11 +598,14 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
  		BIT(NL80211_IFTYPE_ADHOC);
  
  	spin_lock_init(&dev->token_lock);
@@ -522,7 +522,7 @@
  	dev->token_size = dev->drv->token_size;
  
  	for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++)
-@@ -1296,7 +1299,10 @@ void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
+@@ -1300,7 +1303,10 @@ void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
  
  	while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
  		mt76_check_sta(dev, skb);
@@ -535,7 +535,7 @@
  
  	mt76_rx_complete(dev, &frames, napi);
 diff --git a/mt76.h b/mt76.h
-index 49314895..0043c7c8 100644
+index 701bee95..2903b625 100644
 --- a/mt76.h
 +++ b/mt76.h
 @@ -20,6 +20,8 @@
@@ -563,7 +563,7 @@
  };
  
  struct mt76_bus_ops {
-@@ -305,7 +309,10 @@ struct mt76_txwi_cache {
+@@ -313,7 +317,10 @@ struct mt76_txwi_cache {
  	struct list_head list;
  	dma_addr_t dma_addr;
  
@@ -575,7 +575,7 @@
  };
  
  struct mt76_rx_tid {
-@@ -403,7 +410,7 @@ struct mt76_driver_ops {
+@@ -411,7 +418,7 @@ struct mt76_driver_ops {
  	bool (*rx_check)(struct mt76_dev *dev, void *data, int len);
  
  	void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q,
@@ -584,7 +584,7 @@
  
  	void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q);
  
-@@ -747,6 +754,7 @@ struct mt76_dev {
+@@ -755,6 +762,7 @@ struct mt76_dev {
  	struct ieee80211_hw *hw;
  
  	spinlock_t lock;
@@ -592,7 +592,7 @@
  	spinlock_t cc_lock;
  
  	u32 cur_cc_bss_rx;
-@@ -772,6 +780,7 @@ struct mt76_dev {
+@@ -780,6 +788,7 @@ struct mt76_dev {
  	struct sk_buff_head rx_skb[__MT_RXQ_MAX];
  
  	struct list_head txwi_cache;
@@ -600,7 +600,7 @@
  	struct mt76_queue *q_mcu[__MT_MCUQ_MAX];
  	struct mt76_queue q_rx[__MT_RXQ_MAX];
  	const struct mt76_queue_ops *queue_ops;
-@@ -785,12 +794,16 @@ struct mt76_dev {
+@@ -793,12 +802,16 @@ struct mt76_dev {
  	u16 wed_token_count;
  	u16 token_count;
  	u16 token_size;
@@ -617,7 +617,7 @@
  	u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)];
  
  	u64 vif_mask;
-@@ -1352,6 +1365,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
+@@ -1356,6 +1369,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
  }
  
  void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
@@ -626,7 +626,7 @@
  void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
  		      struct napi_struct *napi);
  void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
-@@ -1496,6 +1511,12 @@ struct mt76_txwi_cache *
+@@ -1500,6 +1515,12 @@ struct mt76_txwi_cache *
  mt76_token_release(struct mt76_dev *dev, int token, bool *wake);
  int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi);
  void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked);
@@ -666,10 +666,10 @@
  void mt7603_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
  int mt7603_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 diff --git a/mt7615/mac.c b/mt7615/mac.c
-index 37286276..14cdd9a2 100644
+index d6aae60c..4774eaab 100644
 --- a/mt7615/mac.c
 +++ b/mt7615/mac.c
-@@ -1648,7 +1648,7 @@ bool mt7615_rx_check(struct mt76_dev *mdev, void *data, int len)
+@@ -1651,7 +1651,7 @@ bool mt7615_rx_check(struct mt76_dev *mdev, void *data, int len)
  EXPORT_SYMBOL_GPL(mt7615_rx_check);
  
  void mt7615_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
@@ -679,7 +679,7 @@
  	struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
  	__le32 *rxd = (__le32 *)skb->data;
 diff --git a/mt7615/mt7615.h b/mt7615/mt7615.h
-index 25880d1a..983469c7 100644
+index 060d52c8..232b0f29 100644
 --- a/mt7615/mt7615.h
 +++ b/mt7615/mt7615.h
 @@ -511,7 +511,7 @@ void mt7615_tx_worker(struct mt76_worker *w);
@@ -692,7 +692,7 @@
  int mt7615_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
  		       struct ieee80211_sta *sta);
 diff --git a/mt76_connac_mcu.c b/mt76_connac_mcu.c
-index cd350689..24548469 100644
+index e701db8a..6ae1159e 100644
 --- a/mt76_connac_mcu.c
 +++ b/mt76_connac_mcu.c
 @@ -1190,6 +1190,7 @@ int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
@@ -766,10 +766,10 @@
  	struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
  	void *rxwi = skb->data;
 diff --git a/mt7915/dma.c b/mt7915/dma.c
-index 71223221..7d8d60bb 100644
+index ac30698f..197a0169 100644
 --- a/mt7915/dma.c
 +++ b/mt7915/dma.c
-@@ -356,6 +356,7 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
+@@ -349,6 +349,7 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
  int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  {
  	struct mt76_dev *mdev = &dev->mt76;
@@ -777,7 +777,7 @@
  	u32 wa_rx_base, wa_rx_idx;
  	u32 hif1_ofs = 0;
  	int ret;
-@@ -372,10 +373,12 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -365,10 +366,12 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  	if (mtk_wed_device_active(&dev->mt76.mmio.wed) && !is_mt7986(mdev)) {
  		mt76_set(dev, MT_WFDMA_HOST_CONFIG, MT_WFDMA_HOST_CONFIG_WED);
  		if(is_mt7915(mdev)) {
@@ -794,7 +794,7 @@
  		} else {
  			mt76_wr(dev, MT_WFDMA_WED_RING_CONTROL,
  				FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_TX0, 18) |
-@@ -435,7 +438,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -428,7 +431,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  		return ret;
  
  	/* event from WA */
@@ -803,7 +803,7 @@
  		wa_rx_base = MT_WED_RX_RING_BASE;
  		wa_rx_idx = MT7915_RXQ_MCU_WA;
  		dev->mt76.q_rx[MT_RXQ_MCU_WA].flags = MT_WED_Q_TXFREE;
-@@ -451,6 +454,11 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -444,6 +447,11 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  
  	/* rx data queue for band0 */
  	if (!dev->phy.band_idx) {
@@ -815,7 +815,7 @@
  		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
  				       MT_RXQ_ID(MT_RXQ_MAIN),
  				       MT7915_RX_RING_SIZE,
-@@ -465,7 +473,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -458,7 +466,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  		wa_rx_base = MT_RXQ_RING_BASE(MT_RXQ_MAIN_WA);
  		wa_rx_idx = MT_RXQ_ID(MT_RXQ_MAIN_WA);
  
@@ -824,20 +824,20 @@
  			dev->mt76.q_rx[MT_RXQ_MAIN_WA].flags = MT_WED_Q_TXFREE;
  			if (is_mt7916(mdev)) {
  				wa_rx_base =  MT_WED_RX_RING_BASE;
-@@ -482,6 +490,11 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -474,6 +482,11 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+ 	}
  
  	if (dev->dbdc_support || dev->phy.band_idx) {
- 		/* rx data queue for band1 */
 +		if (mtk_wed_device_active(wed) && wed->ver > MTK_WED_V1) {
-+			dev->mt76.q_rx[MT_RXQ_EXT].flags = MT_WED_Q_RX(MT7915_RXQ_BAND1);
++			dev->mt76.q_rx[MT_RXQ_BAND1].flags = MT_WED_Q_RX(MT7915_RXQ_BAND1);
 +			dev->mt76.rx_token_size += MT7915_RX_RING_SIZE;
 +		}
 +
- 		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_EXT],
- 				       MT_RXQ_ID(MT_RXQ_EXT),
- 				       MT7915_RX_RING_SIZE,
+ 		/* rx data queue for band1 */
+ 		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND1],
+ 				       MT_RXQ_ID(MT_RXQ_BAND1),
 diff --git a/mt7915/init.c b/mt7915/init.c
-index b549fa04..eb321b77 100644
+index 538ff5c3..cd9d846d 100644
 --- a/mt7915/init.c
 +++ b/mt7915/init.c
 @@ -695,6 +695,15 @@ mt7915_init_hardware(struct mt7915_dev *dev, struct mt7915_phy *phy2)
@@ -857,7 +857,7 @@
  	idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
  	if (idx)
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index db21d83e..1f8e1230 100644
+index 39a115ed..1a2cadc5 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
 @@ -217,7 +217,7 @@ static void mt7915_mac_sta_poll(struct mt7915_dev *dev)
@@ -906,7 +906,7 @@
  	}
  
  	if (rxv && mode >= MT_PHY_TYPE_HE_SU && !(status->flag & RX_FLAG_8023))
-@@ -840,6 +861,80 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id)
+@@ -831,6 +852,80 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id)
  	return MT_TXD_TXP_BUF_SIZE;
  }
  
@@ -987,7 +987,7 @@
  static void
  mt7915_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
  {
-@@ -1120,7 +1215,7 @@ bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len)
+@@ -1107,7 +1202,7 @@ bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len)
  }
  
  void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
@@ -996,7 +996,7 @@
  {
  	struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
  	__le32 *rxd = (__le32 *)skb->data;
-@@ -1154,7 +1249,7 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
+@@ -1141,7 +1236,7 @@ void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
  		dev_kfree_skb(skb);
  		break;
  	case PKT_TYPE_NORMAL:
@@ -1006,7 +1006,7 @@
  			return;
  		}
 diff --git a/mt7915/main.c b/mt7915/main.c
-index 2e721cd0..9c808ff4 100644
+index b77b3be7..29ee7007 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
 @@ -670,8 +670,15 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
@@ -1058,7 +1058,7 @@
  
  	ctx->dev = NULL;
 diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index 9e9a2ea0..dd712283 100644
+index dd46762d..d83b3dcb 100644
 --- a/mt7915/mcu.c
 +++ b/mt7915/mcu.c
 @@ -1719,6 +1719,7 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
@@ -1078,7 +1078,7 @@
  	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
  				     MCU_EXT_CMD(STA_REC_UPDATE), true);
  }
-@@ -2348,6 +2351,7 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
+@@ -2345,6 +2348,7 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
  int mt7915_run_firmware(struct mt7915_dev *dev)
  {
  	int ret;
@@ -1086,7 +1086,7 @@
  
  	/* force firmware operation mode into normal state,
  	 * which should be set before firmware download stage.
-@@ -2377,8 +2381,14 @@ int mt7915_run_firmware(struct mt7915_dev *dev)
+@@ -2374,8 +2378,14 @@ int mt7915_run_firmware(struct mt7915_dev *dev)
  	if (ret)
  		return ret;
  
@@ -1116,7 +1116,7 @@
  
  enum mcu_mmps_mode {
 diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index b4a3120d..9316e056 100644
+index b0d8a616..111444d7 100644
 --- a/mt7915/mmio.c
 +++ b/mt7915/mmio.c
 @@ -28,6 +28,9 @@ static const u32 mt7915_reg[] = {
@@ -1197,7 +1197,7 @@
  	dev->mt76.dma_dev = wed->dev;
  	mdev->token_size = wed->wlan.token_start;
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 39127922..97eac730 100644
+index a3ffbc63..d23416ca 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
 @@ -18,6 +18,9 @@
@@ -1213,12 +1213,12 @@
 @@ -78,6 +81,7 @@
  #define MT7915_MAX_STA_TWT_AGRT		8
  #define MT7915_MIN_TWT_DUR 64
- #define MT7915_MAX_QUEUE		(__MT_RXQ_MAX + __MT_MCUQ_MAX + 2)
+ #define MT7915_MAX_QUEUE		(MT_RXQ_BAND2 + __MT_MCUQ_MAX + 2)
 +#define MT7915_WED_RX_TOKEN_SIZE	12288
  
  struct mt7915_vif;
  struct mt7915_sta;
-@@ -541,7 +545,9 @@ void mt7915_wfsys_reset(struct mt7915_dev *dev);
+@@ -540,7 +544,9 @@ void mt7915_wfsys_reset(struct mt7915_dev *dev);
  irqreturn_t mt7915_irq_handler(int irq, void *dev_instance);
  u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif);
  u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
@@ -1229,7 +1229,7 @@
  int mt7915_register_device(struct mt7915_dev *dev);
  void mt7915_unregister_device(struct mt7915_dev *dev);
  int mt7915_eeprom_init(struct mt7915_dev *dev);
-@@ -693,7 +699,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
+@@ -692,7 +698,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
  			  struct mt76_tx_info *tx_info);
  void mt7915_tx_token_put(struct mt7915_dev *dev);
  void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
@@ -1239,10 +1239,10 @@
  void mt7915_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
  void mt7915_stats_work(struct work_struct *work);
 diff --git a/mt7915/regs.h b/mt7915/regs.h
-index ffda5f6b..08bf84ce 100644
+index 432ed303..36ef8a9c 100644
 --- a/mt7915/regs.h
 +++ b/mt7915/regs.h
-@@ -33,6 +33,9 @@ enum reg_rev {
+@@ -27,6 +27,9 @@ enum reg_rev {
  	FW_EXCEPTION_ADDR,
  	SWDEF_BASE_ADDR,
  	EXCEPTION_BASE_ADDR,
@@ -1252,7 +1252,7 @@
  	__MT_REG_MAX,
  };
  
-@@ -570,9 +573,13 @@ enum offs_rev {
+@@ -564,9 +567,13 @@ enum offs_rev {
  #define MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2	BIT(21)
  
  #define MT_WFDMA0_RST_DTX_PTR		MT_WFDMA0(0x20c)
@@ -1266,7 +1266,7 @@
  
  #define MT_WFDMA0_MCU_HOST_INT_ENA	MT_WFDMA0(0x1f4)
  #define MT_WFDMA0_MT_WA_WDT_INT		BIT(31)
-@@ -670,12 +677,15 @@ enum offs_rev {
+@@ -664,12 +671,15 @@ enum offs_rev {
  #define MT_TXQ_EXT_CTRL(q)		(MT_Q_BASE(__TXQ(q)) + 0x600 +	\
  					 MT_TXQ_ID(q)* 0x4)
  
@@ -1285,7 +1285,7 @@
  #define MT_INT_SOURCE_CSR		__REG(INT_SOURCE_CSR)
  #define MT_INT_MASK_CSR			__REG(INT_MASK_CSR)
 diff --git a/mt7921/mac.c b/mt7921/mac.c
-index 4fcadf86..4897940b 100644
+index 1374c154..275f3679 100644
 --- a/mt7921/mac.c
 +++ b/mt7921/mac.c
 @@ -555,7 +555,7 @@ out:
@@ -1298,10 +1298,10 @@
  	struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
  	__le32 *rxd = (__le32 *)skb->data;
 diff --git a/mt7921/mt7921.h b/mt7921/mt7921.h
-index efeb82cb..4b2e974b 100644
+index c161031a..0a1f0357 100644
 --- a/mt7921/mt7921.h
 +++ b/mt7921/mt7921.h
-@@ -388,7 +388,7 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
+@@ -381,7 +381,7 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
  void mt7921_tx_worker(struct mt76_worker *w);
  void mt7921_tx_token_put(struct mt7921_dev *dev);
  void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
@@ -1310,7 +1310,7 @@
  void mt7921_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
  void mt7921_stats_work(struct work_struct *work);
  void mt7921_set_stream_he_caps(struct mt7921_phy *phy);
-@@ -424,7 +424,7 @@ int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,
+@@ -417,7 +417,7 @@ int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,
  
  bool mt7921e_rx_check(struct mt76_dev *mdev, void *data, int len);
  void mt7921e_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
@@ -1342,10 +1342,10 @@
  	}
  }
 diff --git a/tx.c b/tx.c
-index ae44afe0..bccd206e 100644
+index 8b33186b..b812d067 100644
 --- a/tx.c
 +++ b/tx.c
-@@ -767,3 +767,37 @@ mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
+@@ -778,3 +778,37 @@ mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
  	return txwi;
  }
  EXPORT_SYMBOL_GPL(mt76_token_release);
diff --git a/recipes-kernel/linux-mt76/files/patches/3004-mt76-add-ser-spport-when-wed-on.patch b/recipes-kernel/linux-mt76/files/patches/3004-mt76-add-ser-spport-when-wed-on.patch
index 17bea92..3984947 100755
--- a/recipes-kernel/linux-mt76/files/patches/3004-mt76-add-ser-spport-when-wed-on.patch
+++ b/recipes-kernel/linux-mt76/files/patches/3004-mt76-add-ser-spport-when-wed-on.patch
@@ -1,4 +1,4 @@
-From f9d72a188038fcda7cc4d8d5a166af4065ca645c Mon Sep 17 00:00:00 2001
+From 4bae67631956c6878e1f055e1cb0e3dd2154f7b7 Mon Sep 17 00:00:00 2001
 From: Sujuan Chen <sujuan.chen@mediatek.com>
 Date: Thu, 28 Jul 2022 11:16:15 +0800
 Subject: [PATCH] mt76 add ser spport when wed on
@@ -15,7 +15,7 @@
  7 files changed, 76 insertions(+), 15 deletions(-)
 
 diff --git a/dma.c b/dma.c
-index 4d4d4046..9f886b77 100644
+index 3317d2b9..fa56ccfb 100644
 --- a/dma.c
 +++ b/dma.c
 @@ -169,7 +169,7 @@ mt76_free_pending_txwi(struct mt76_dev *dev)
@@ -120,10 +120,10 @@
 +int mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q, bool reset);
  #endif
 diff --git a/mt76.h b/mt76.h
-index 0043c7c8..5e03f565 100644
+index 2903b625..831a47a9 100644
 --- a/mt76.h
 +++ b/mt76.h
-@@ -1367,6 +1367,7 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
+@@ -1371,6 +1371,7 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
  void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
  void mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
  struct mt76_txwi_cache *mt76_get_rxwi(struct mt76_dev *dev);
@@ -132,18 +132,18 @@
  		      struct napi_struct *napi);
  void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
 diff --git a/mt7915/dma.c b/mt7915/dma.c
-index 7d8d60bb..6435604b 100644
+index 197a0169..e0a51316 100644
 --- a/mt7915/dma.c
 +++ b/mt7915/dma.c
-@@ -529,6 +529,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
+@@ -522,6 +522,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
  int mt7915_dma_reset(struct mt7915_dev *dev, bool force)
  {
- 	struct mt76_phy *mphy_ext = dev->mt76.phy2;
+ 	struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
 +	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
  	int i;
  
  	/* clean up hw queues */
-@@ -549,28 +550,53 @@ int mt7915_dma_reset(struct mt7915_dev *dev, bool force)
+@@ -542,28 +543,53 @@ int mt7915_dma_reset(struct mt7915_dev *dev, bool force)
  		mt7915_wfsys_reset(dev);
  
  	/* disable wfdma */
@@ -203,10 +203,10 @@
  }
  
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index 1f8e1230..b0df0be0 100644
+index 1a2cadc5..11b73c8f 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
-@@ -925,6 +925,8 @@ void mt7915_wed_release_rx_buf(struct mtk_wed_device *wed)
+@@ -916,6 +916,8 @@ void mt7915_wed_release_rx_buf(struct mtk_wed_device *wed)
  		mt76_put_rxwi(&dev->mt76, rxwi);
  	}
  
@@ -215,7 +215,7 @@
  	if (wed->rx_page.va)
  		return;
  
-@@ -935,6 +937,18 @@ void mt7915_wed_release_rx_buf(struct mtk_wed_device *wed)
+@@ -926,6 +928,18 @@ void mt7915_wed_release_rx_buf(struct mtk_wed_device *wed)
  	return;
  }
  
@@ -234,7 +234,7 @@
  static void
  mt7915_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
  {
-@@ -1674,6 +1688,12 @@ void mt7915_mac_reset_work(struct work_struct *work)
+@@ -1662,6 +1676,12 @@ void mt7915_mac_reset_work(struct work_struct *work)
  	if (!(READ_ONCE(dev->reset_state) & MT_MCU_CMD_STOP_DMA))
  		return;
  
@@ -248,7 +248,7 @@
  	if (ext_phy)
  		ieee80211_stop_queues(ext_phy->hw);
 diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index 9316e056..e1445595 100644
+index 111444d7..1ccec14f 100644
 --- a/mt7915/mmio.c
 +++ b/mt7915/mmio.c
 @@ -757,6 +757,8 @@ mt7915_pci_wed_init(struct mt7915_dev *dev, struct device *pdev, int *irq)
@@ -261,10 +261,10 @@
  	if (mtk_wed_device_attach(wed) != 0)
  		return 0;
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 97eac730..bcc58e5f 100644
+index d23416ca..01b2f681 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
-@@ -548,6 +548,7 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
+@@ -547,6 +547,7 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
  u32 mt7915_wed_init_rx_buf(struct mtk_wed_device *wed,
  				int pkt_num);
  void mt7915_wed_release_rx_buf(struct mtk_wed_device *wed);
diff --git a/recipes-kernel/linux-mt76/files/patches/3005-mt76-mt7915-add-statistic-for-HW-Tx-Path.patch b/recipes-kernel/linux-mt76/files/patches/3005-mt76-mt7915-add-statistic-for-HW-Tx-Path.patch
index e99536a..0b48205 100644
--- a/recipes-kernel/linux-mt76/files/patches/3005-mt76-mt7915-add-statistic-for-HW-Tx-Path.patch
+++ b/recipes-kernel/linux-mt76/files/patches/3005-mt76-mt7915-add-statistic-for-HW-Tx-Path.patch
@@ -1,4 +1,4 @@
-From c00e4e966cec137840f38cd0c7abf3f3237e9ea2 Mon Sep 17 00:00:00 2001
+From 7b9c6ae23f07ac5514492fff192fa927de1d5d17 Mon Sep 17 00:00:00 2001
 From: Yi-Chia Hsieh <Yi-Chia.Hsieh@mediatek.com>
 Date: Thu, 21 Jul 2022 10:56:09 -0700
 Subject: [PATCH] mt76: mt7915: add statistic for H/W Tx Path
@@ -7,7 +7,6 @@
 Add MT_PACKET_ID_WED for PPDU txs, and change MT_PACKET_ID_FIRST to 3
 to differentiate. We also need do byte cnt and pkt cnt for S/W path since
 we report it directly from mt7915_sta_statistics.
-
 ---
  mt76.h             | 49 ++++++++++++++++-------------
  mt76_connac.h      |  5 +--
@@ -22,10 +21,10 @@
  10 files changed, 141 insertions(+), 61 deletions(-)
 
 diff --git a/mt76.h b/mt76.h
-index 9162213..720a419 100644
+index 831a47a9..364b1119 100644
 --- a/mt76.h
 +++ b/mt76.h
-@@ -267,6 +267,30 @@ DECLARE_EWMA(signal, 10, 8);
+@@ -275,6 +275,30 @@ DECLARE_EWMA(signal, 10, 8);
  #define MT_WCID_TX_INFO_TXPWR_ADJ	GENMASK(25, 18)
  #define MT_WCID_TX_INFO_SET		BIT(31)
  
@@ -56,7 +55,7 @@
  struct mt76_wcid {
  	struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS];
  
-@@ -295,6 +319,8 @@ struct mt76_wcid {
+@@ -303,6 +327,8 @@ struct mt76_wcid {
  
  	struct list_head list;
  	struct idr pktid;
@@ -65,7 +64,7 @@
  };
  
  struct mt76_txq {
-@@ -341,7 +367,8 @@ struct mt76_rx_tid {
+@@ -349,7 +375,8 @@ struct mt76_rx_tid {
  #define MT_PACKET_ID_MASK		GENMASK(6, 0)
  #define MT_PACKET_ID_NO_ACK		0
  #define MT_PACKET_ID_NO_SKB		1
@@ -75,7 +74,7 @@
  #define MT_PACKET_ID_HAS_RATE		BIT(7)
  /* This is timer for when to give up when waiting for TXS callback,
   * with starting time being the time at which the DMA_DONE callback
-@@ -861,26 +888,6 @@ struct mt76_power_limits {
+@@ -874,26 +901,6 @@ struct mt76_power_limits {
  	s8 ru[7][12];
  };
  
@@ -103,10 +102,10 @@
  	u64 *data;
  	int idx;
 diff --git a/mt76_connac.h b/mt76_connac.h
-index c8d8680..8f78d12 100644
+index f71ded84..4a43838b 100644
 --- a/mt76_connac.h
 +++ b/mt76_connac.h
-@@ -352,9 +352,10 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
+@@ -366,9 +366,10 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
  				 struct sk_buff *skb, struct mt76_wcid *wcid,
  				 struct ieee80211_key_conf *key, int pid,
  				 enum mt76_txq_id qid, u32 changed);
@@ -120,7 +119,7 @@
  					 struct sk_buff *skb,
  					 __le32 *rxv, u32 mode);
 diff --git a/mt76_connac2_mac.h b/mt76_connac2_mac.h
-index 67ce216..c7064ba 100644
+index 67ce216f..c7064ba2 100644
 --- a/mt76_connac2_mac.h
 +++ b/mt76_connac2_mac.h
 @@ -123,6 +123,12 @@ enum {
@@ -152,10 +151,10 @@
  #define MT_RXD1_NORMAL_WLAN_IDX		GENMASK(9, 0)
  #define MT_RXD1_NORMAL_GROUP_1		BIT(11)
 diff --git a/mt76_connac_mac.c b/mt76_connac_mac.c
-index c1e8955..9e80cae 100644
+index a9e58cfa..af265d99 100644
 --- a/mt76_connac_mac.c
 +++ b/mt76_connac_mac.c
-@@ -471,6 +471,9 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
+@@ -487,6 +487,9 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
  		p_fmt = mt76_is_mmio(dev) ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
  		q_idx = wmm_idx * MT76_CONNAC_MAX_WMM_SETS +
  			mt76_connac_lmac_mapping(skb_get_queue_mapping(skb));
@@ -165,7 +164,7 @@
  	}
  
  	val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + sz_txd) |
-@@ -539,35 +542,26 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
+@@ -555,35 +558,26 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
  }
  EXPORT_SYMBOL_GPL(mt76_connac2_mac_write_txwi);
  
@@ -213,7 +212,7 @@
  
  	txrate = FIELD_GET(MT_TXS0_TX_RATE, txs);
  
-@@ -602,7 +596,7 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
+@@ -618,7 +612,7 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
  	case MT_PHY_TYPE_HT:
  	case MT_PHY_TYPE_HT_GF:
  		if (rate.mcs > 31)
@@ -222,7 +221,7 @@
  
  		rate.flags = RATE_INFO_FLAGS_MCS;
  		if (wcid->rate.flags & RATE_INFO_FLAGS_SHORT_GI)
-@@ -610,7 +604,7 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
+@@ -626,7 +620,7 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
  		break;
  	case MT_PHY_TYPE_VHT:
  		if (rate.mcs > 9)
@@ -231,7 +230,7 @@
  
  		rate.flags = RATE_INFO_FLAGS_VHT_MCS;
  		break;
-@@ -619,14 +613,14 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
+@@ -635,14 +629,14 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
  	case MT_PHY_TYPE_HE_TB:
  	case MT_PHY_TYPE_HE_MU:
  		if (rate.mcs > 11)
@@ -248,7 +247,7 @@
  	}
  
  	stats->tx_mode[mode]++;
-@@ -651,10 +645,37 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
+@@ -667,10 +661,37 @@ bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid,
  	}
  	wcid->rate = rate;
  
@@ -290,10 +289,10 @@
  
  	return !!skb;
 diff --git a/mt7915/mac.c b/mt7915/mac.c
-index 1f8e123..5f42b46 100644
+index 5b684926..63c702e0 100644
 --- a/mt7915/mac.c
 +++ b/mt7915/mac.c
-@@ -1152,13 +1152,10 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
+@@ -1153,13 +1153,10 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
  	u16 wcidx;
  	u8 pid;
  
@@ -308,7 +307,7 @@
  		return;
  
  	if (wcidx >= mt7915_wtbl_size(dev))
-@@ -1172,8 +1169,11 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
+@@ -1173,8 +1170,11 @@ static void mt7915_mac_add_txs(struct mt7915_dev *dev, void *data)
  
  	msta = container_of(wcid, struct mt7915_sta, wcid);
  
@@ -323,10 +322,10 @@
  		goto out;
  
 diff --git a/mt7915/main.c b/mt7915/main.c
-index cfc522f..85d6be8 100644
+index 0f872f5d..b7c6cf6a 100644
 --- a/mt7915/main.c
 +++ b/mt7915/main.c
-@@ -1042,6 +1042,20 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
+@@ -1049,6 +1049,20 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
  	}
  	sinfo->txrate.flags = txrate->flags;
  	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
@@ -347,7 +346,7 @@
  }
  
  static void mt7915_sta_rc_work(void *data, struct ieee80211_sta *sta)
-@@ -1256,7 +1270,7 @@ static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
+@@ -1271,7 +1285,7 @@ static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
  	if (msta->vif->mt76.idx != wi->idx)
  		return;
  
@@ -357,7 +356,7 @@
  
  static
 diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index 08ff556..080bfe7 100644
+index 1ccec14f..bb2d1c45 100644
 --- a/mt7915/mmio.c
 +++ b/mt7915/mmio.c
 @@ -92,6 +92,7 @@ static const u32 mt7915_offs[] = {
@@ -396,7 +395,7 @@
 +	phy = &dev->phy;
 +	mt76_set(dev, MT_AGG_ACR4(phy->band_idx), MT_AGG_ACR_PPDU_TXS2H);
 +
-+	phy = dev->mt76.phy2 ? dev->mt76.phy2->priv : NULL;
++	phy = dev->mt76.phys[MT_BAND1] ? dev->mt76.phys[MT_BAND1]->priv : NULL;
 +	if (phy)
 +		mt76_set(dev, MT_AGG_ACR4(phy->band_idx), MT_AGG_ACR_PPDU_TXS2H);
 +
@@ -419,17 +418,17 @@
 +	phy = &dev->phy;
 +	mt76_clear(dev, MT_AGG_ACR4(phy->band_idx), MT_AGG_ACR_PPDU_TXS2H);
 +
-+	phy = dev->mt76.phy2 ? dev->mt76.phy2->priv : NULL;
++	phy = dev->mt76.phys[MT_BAND1] ? dev->mt76.phys[MT_BAND1]->priv : NULL;
 +	if (phy)
 +		mt76_clear(dev, MT_AGG_ACR4(phy->band_idx), MT_AGG_ACR_PPDU_TXS2H);
  }
  #endif
  
 diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index 22399cc..065c16c 100644
+index 01b2f681..f1b9c0d6 100644
 --- a/mt7915/mt7915.h
 +++ b/mt7915/mt7915.h
-@@ -139,8 +139,6 @@ struct mt7915_sta {
+@@ -142,8 +142,6 @@ struct mt7915_sta {
  	unsigned long jiffies;
  	unsigned long ampdu_state;
  
@@ -439,10 +438,10 @@
  
  	struct {
 diff --git a/mt7915/regs.h b/mt7915/regs.h
-index 08bf84c..694cc56 100644
+index 36ef8a9c..dcb40181 100644
 --- a/mt7915/regs.h
 +++ b/mt7915/regs.h
-@@ -58,6 +58,7 @@ enum offs_rev {
+@@ -52,6 +52,7 @@ enum offs_rev {
  	AGG_AWSCR0,
  	AGG_PCR0,
  	AGG_ACR0,
@@ -450,7 +449,7 @@
  	AGG_MRCR,
  	AGG_ATCR1,
  	AGG_ATCR3,
-@@ -495,6 +496,9 @@ enum offs_rev {
+@@ -489,6 +490,9 @@ enum offs_rev {
  #define MT_AGG_ACR_CFEND_RATE		GENMASK(13, 0)
  #define MT_AGG_ACR_BAR_RATE		GENMASK(29, 16)
  
@@ -461,7 +460,7 @@
  #define MT_AGG_MRCR_BAR_CNT_LIMIT		GENMASK(15, 12)
  #define MT_AGG_MRCR_LAST_RTS_CTS_RN		BIT(6)
 diff --git a/mt7921/mt7921.h b/mt7921/mt7921.h
-index 4b2e974..f48295f 100644
+index 0a1f0357..96267d5b 100644
 --- a/mt7921/mt7921.h
 +++ b/mt7921/mt7921.h
 @@ -100,7 +100,6 @@ struct mt7921_sta {
@@ -473,5 +472,5 @@
  	struct mt76_connac_sta_key_conf bip;
  };
 -- 
-2.32.0
+2.18.0
 
diff --git a/recipes-kernel/linux-mt76/files/patches/patches.inc b/recipes-kernel/linux-mt76/files/patches/patches.inc
index eba8ebf..40f4da7 100644
--- a/recipes-kernel/linux-mt76/files/patches/patches.inc
+++ b/recipes-kernel/linux-mt76/files/patches/patches.inc
@@ -3,7 +3,6 @@
     file://0001-mt76-mt7915-rework-testmode-init-registers.patch \
     file://0002-mt76-testmode-rework-tx-antenna-setting.patch \
     file://0003-mt76-mt7915-rework-rx-testmode-stats.patch \
-    file://0004-mt76-mt7915-fix-tx-descriptor.patch \
     file://0005-mt76-mt7915-drop-undefined-action-frame.patch \
     file://0008-mt76-common-RF-CR-idx-require-8-bits.patch \
     file://0011-mt76-testmode-use-random-payload-for-tx-packets.patch \
diff --git a/recipes-kernel/linux-mt76/linux-mt76.bb b/recipes-kernel/linux-mt76/linux-mt76.bb
index 2f613ef..b74aed7 100644
--- a/recipes-kernel/linux-mt76/linux-mt76.bb
+++ b/recipes-kernel/linux-mt76/linux-mt76.bb
@@ -7,7 +7,7 @@
 
 PV = "1.0"
 
-SRCREV ?= "93e3fce916c62d06892d41bf00d0f4c2926c9a0b"
+SRCREV ?= "5ec78e1ec43d1e39edfea1efb9fd4541fa004af0"
 SRC_URI = " \
     git://git@github.com/openwrt/mt76.git;protocol=https \
     file://COPYING;subdir=git \
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-emmc-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-emmc-rfb.dts
index 40c41b6..0ee8617 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-emmc-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-emmc-rfb.dts
@@ -68,7 +68,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -102,6 +102,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -109,7 +112,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -120,12 +130,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -167,7 +177,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-gsw-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-gsw-spim-nand-rfb.dts
index 925a852..c33a8ac 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-gsw-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-gsw-spim-nand-rfb.dts
@@ -101,7 +101,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -117,7 +124,7 @@
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 	};
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-sd-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-sd-rfb.dts
index 32f9320..e45224a 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-sd-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-sd-rfb.dts
@@ -59,7 +59,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -93,6 +93,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -100,7 +103,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -111,12 +121,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -158,7 +168,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nand-rfb.dts
index 61b68af..89b80b0 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nand-rfb.dts
@@ -50,7 +50,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -84,6 +84,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -91,7 +94,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -102,12 +112,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -149,7 +159,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nor-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nor-rfb.dts
index 629d509..baec4ab 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nor-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986a-2500wan-spim-nor-rfb.dts
@@ -50,7 +50,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -84,6 +84,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -91,7 +94,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -102,12 +112,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -149,7 +159,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-emmc-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-emmc-rfb.dts
index 09e41f6..f7b9582 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-emmc-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-emmc-rfb.dts
@@ -64,6 +64,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -71,7 +74,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -82,12 +92,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -129,7 +139,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-gsw-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-gsw-spim-nand-rfb.dts
index 1603714..80069eb 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-gsw-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-gsw-spim-nand-rfb.dts
@@ -72,7 +72,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -88,7 +95,7 @@
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 	};
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-sd-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-sd-rfb.dts
index c074239..5d8d557 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-sd-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-sd-rfb.dts
@@ -64,6 +64,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -71,7 +74,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -82,12 +92,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -129,7 +139,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-snfi-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-snfi-nand-rfb.dts
index dd02baf..7eb2fc0 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-snfi-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-snfi-nand-rfb.dts
@@ -55,6 +55,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -62,7 +65,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -73,12 +83,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -120,7 +130,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nand-rfb.dts
index 1dc1551..6dc29fc 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nand-rfb.dts
@@ -55,6 +55,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -62,7 +65,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -73,12 +83,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -120,7 +130,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nor-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nor-rfb.dts
index 4cbfe41..ab6a61f 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nor-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-2500wan-spim-nor-rfb.dts
@@ -55,6 +55,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -62,7 +65,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -73,12 +83,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -120,7 +130,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-emmc-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-emmc-rfb.dts
index 40c41b6..0ee8617 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-emmc-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-emmc-rfb.dts
@@ -68,7 +68,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -102,6 +102,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -109,7 +112,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -120,12 +130,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -167,7 +177,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-gsw-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-gsw-spim-nand-rfb.dts
index 925a852..c33a8ac 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-gsw-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-gsw-spim-nand-rfb.dts
@@ -101,7 +101,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -117,7 +124,7 @@
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 	};
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-sd-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-sd-rfb.dts
index 32f9320..e45224a 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-sd-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-sd-rfb.dts
@@ -59,7 +59,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -93,6 +93,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -100,7 +103,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -111,12 +121,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -158,7 +168,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nand-rfb.dts
index 61b68af..89b80b0 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nand-rfb.dts
@@ -50,7 +50,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -84,6 +84,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -91,7 +94,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -102,12 +112,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -149,7 +159,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nor-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nor-rfb.dts
index 629d509..baec4ab 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nor-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986a-2500wan-spim-nor-rfb.dts
@@ -50,7 +50,7 @@
 &uart2 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart2_pins>;
-	status = "okay";
+	status = "disabled";
 };
 
 &i2c0 {
@@ -84,6 +84,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -91,7 +94,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -102,12 +112,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -149,7 +159,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-emmc-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-emmc-rfb.dts
index 09e41f6..f7b9582 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-emmc-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-emmc-rfb.dts
@@ -64,6 +64,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -71,7 +74,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -82,12 +92,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -129,7 +139,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-gsw-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-gsw-spim-nand-rfb.dts
index 1603714..80069eb 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-gsw-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-gsw-spim-nand-rfb.dts
@@ -72,7 +72,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -88,7 +95,7 @@
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 	};
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-sd-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-sd-rfb.dts
index c074239..5d8d557 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-sd-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-sd-rfb.dts
@@ -64,6 +64,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -71,7 +74,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -82,12 +92,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -129,7 +139,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-snfi-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-snfi-nand-rfb.dts
index dd02baf..7eb2fc0 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-snfi-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-snfi-nand-rfb.dts
@@ -55,6 +55,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -62,7 +65,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -73,12 +83,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -120,7 +130,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nand-rfb.dts
index 1dc1551..6dc29fc 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nand-rfb.dts
@@ -55,6 +55,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -62,7 +65,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -73,12 +83,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -120,7 +130,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nor-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nor-rfb.dts
index 4cbfe41..ab6a61f 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nor-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-2500wan-spim-nor-rfb.dts
@@ -55,6 +55,9 @@
 			speed = <2500>;
 			full-duplex;
 			pause;
+			link-gpio = <&pio 47 0>;
+			phy-handle = <&phy5>;
+			label = "lan5";
 		};
 	};
 
@@ -62,7 +65,14 @@
 		compatible = "mediatek,eth-mac";
 		reg = <1>;
 		phy-mode = "2500base-x";
-		phy-handle = <&phy6>;
+
+		fixed-link {
+			speed = <2500>;
+			full-duplex;
+			pause;
+			link-gpio = <&pio 46 0>;
+			phy-handle = <&phy6>;
+		};
 	};
 
 	mdio: mdio-bus {
@@ -73,12 +83,12 @@
 		reset-delay-us = <600>;
 
 		phy5: phy@5 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <5>;
 		};
 
 		phy6: phy@6 {
-			compatible = "ethernet-phy-ieee802.3-c45";
+			compatible = "ethernet-phy-id67c9.de0a";
 			reg = <6>;
 		};
 
@@ -120,7 +130,12 @@
 					reg = <5>;
 					label = "lan5";
 					phy-mode = "2500base-x";
-					phy-handle = <&phy5>;
+
+					fixed-link {
+						speed = <2500>;
+						full-duplex;
+						pause;
+					};
 				};
 
 				port@6 {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand-ecc.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand-ecc.c
index 4094339..885dec3 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand-ecc.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand-ecc.c
@@ -46,6 +46,10 @@
 
 static const uint8_t mt7622_ecc_caps[] = { 4, 6, 8, 10, 12 };
 
+static const uint8_t mt7981_ecc_caps[] = {
+	4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
+};
+
 static const uint8_t mt7986_ecc_caps[] = {
 	4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
 };
@@ -54,6 +58,10 @@
 	[ECC_DECDONE] = 0x11c,
 };
 
+static const uint32_t mt7981_ecc_regs[] = {
+	[ECC_DECDONE] = 0x124,
+};
+
 static const uint32_t mt7986_ecc_regs[] = {
 	[ECC_DECDONE] = 0x124,
 };
@@ -75,6 +83,14 @@
 		.errnum_bits = 5,
 		.errnum_shift = 5,
 	},
+	[SNAND_SOC_MT7981] = {
+		.ecc_caps = mt7981_ecc_caps,
+		.num_ecc_cap = ARRAY_SIZE(mt7981_ecc_caps),
+		.regs = mt7981_ecc_regs,
+		.mode_shift = 5,
+		.errnum_bits = 5,
+		.errnum_shift = 8,
+	},
 	[SNAND_SOC_MT7986] = {
 		.ecc_caps = mt7986_ecc_caps,
 		.num_ecc_cap = ARRAY_SIZE(mt7986_ecc_caps),
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.c
index 884bcfc..a0a50f7 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.c
@@ -83,6 +83,7 @@
 #define NFI_MASTERSTA_MASK_7622		(MAS_ADDR | MAS_RD | MAS_WR | MAS_RDDLY)
 #define AHB_BUS_BUSY			BIT(1)
 #define BUS_BUSY			BIT(0)
+#define NFI_MASTERSTA_MASK_7981		(AHB_BUS_BUSY | BUS_BUSY)
 #define NFI_MASTERSTA_MASK_7986		(AHB_BUS_BUSY | BUS_BUSY)
 
 /* SNFI registers */
@@ -147,6 +148,11 @@
 
 static const uint8_t mt7622_spare_sizes[] = { 16, 26, 27, 28 };
 
+static const uint8_t mt7981_spare_sizes[] = {
+	16, 26, 27, 28, 32, 36, 40, 44, 48, 49, 50, 51, 52, 62, 61, 63, 64,
+	67, 74
+};
+
 static const uint8_t mt7986_spare_sizes[] = {
 	16, 26, 27, 28, 32, 36, 40, 44, 48, 49, 50, 51, 52, 62, 61, 63, 64,
 	67, 74
@@ -181,6 +187,20 @@
 		.latch_lat = 0,
 		.sample_delay = 40
 	},
+	[SNAND_SOC_MT7981] = {
+		.sector_size = 1024,
+		.max_sectors = 16,
+		.fdm_size = 8,
+		.fdm_ecc_size = 1,
+		.fifo_size = 64,
+		.bbm_swap = true,
+		.empty_page_check = true,
+		.mastersta_mask = NFI_MASTERSTA_MASK_7981,
+		.spare_sizes = mt7981_spare_sizes,
+		.num_spare_size = ARRAY_SIZE(mt7981_spare_sizes),
+		.latch_lat = 0,
+		.sample_delay = 40
+	},
 	[SNAND_SOC_MT7986] = {
 		.sector_size = 1024,
 		.max_sectors = 16,
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.h
index 382f80c..37bb6e6 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.h
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/mtd/mtk-snand/mtk-snand.h
@@ -17,6 +17,7 @@
 enum mtk_snand_soc {
 	SNAND_SOC_MT7622,
 	SNAND_SOC_MT7629,
+	SNAND_SOC_MT7981,
 	SNAND_SOC_MT7986,
 
 	__SNAND_SOC_MAX
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/phy/mediatek-ge.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/phy/mediatek-ge.c
index 146f15f..0dc5129 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/phy/mediatek-ge.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/phy/mediatek-ge.c
@@ -21,7 +21,7 @@
 #define MTK_PHY_PAGE_EXTENDED_52B5	0x52b5
 
 /* Registers on MDIO_MMD_VEND1 */
-typedef enum {
+enum {
 	MTK_PHY_MIDDLE_LEVEL_SHAPPER_0TO1 = 0,
 	MTK_PHY_1st_OVERSHOOT_LEVEL_0TO1,
 	MTK_PHY_2nd_OVERSHOOT_LEVEL_0TO1,
@@ -448,44 +448,67 @@
 
 static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
 {
-	/* We add some calibration to efuse values:
-	 * GBE: +7, TBT: +1, HBT: +4, TST: +7
-	 */
+	int bias[16] = {0};
+	switch(phydev->drv->phy_id) {
+		case 0x03a29461:
+		{
+			/* We add some calibration to efuse values:
+			 * GBE: +7, TBT: +1, HBT: +4, TST: +7
+			 */
+			int tmp[16] = { 7, 1, 4, 7,
+					7, 1, 4, 7,
+					7, 1, 4, 7,
+					7, 1, 4, 7 };
+			memcpy(bias, (const void *)tmp, sizeof(bias));
+			break;
+		}
+		case 0x03a29481:
+		{
+			int tmp[16] = { 10, 6, 6, 10,
+					10, 6, 6, 10,
+					10, 6, 6, 10,
+					10, 6, 6, 10 };
+			memcpy(bias, (const void *)tmp, sizeof(bias));
+			break;
+		}
+		default:
+			break;
+	}
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
-		       MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, (buf[0] + 7) << 10);
+		       MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, (buf[0] + bias[0]) << 10);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
-		       MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0] + 1);
+		       MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0] + bias[1]);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
-		       MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, (buf[0] + 4) << 10);
+		       MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, (buf[0] + bias[2]) << 10);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
-		       MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0] + 7);
+		       MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0] + bias[3]);
 
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
-		       MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, (buf[1] + 7) << 8);
+		       MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, (buf[1] + bias[4]) << 8);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
-		       MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1] + 1);
+		       MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1] + bias[5]);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
-		       MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, (buf[1] + 4 ) << 8);
+		       MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, (buf[1] + bias[6]) << 8);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
-		       MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1] + 7);
+		       MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1] + bias[7]);
 
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
-		       MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, (buf[2] + 7) << 8);
+		       MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, (buf[2] + bias[8]) << 8);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
-		       MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2] + 1);
+		       MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2] + bias[9]);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
-		       MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, (buf[2] + 4) << 8);
+		       MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, (buf[2] + bias[10]) << 8);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
-		       MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2] + 7);
+		       MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2] + bias[11]);
 
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
-		       MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, (buf[3] + 7) << 8);
+		       MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, (buf[3] + bias[12]) << 8);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
-		       MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3] + 1);
+		       MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3] + bias[13]);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
-		       MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, (buf[3] + 4) << 8);
+		       MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, (buf[3] + bias[14]) << 8);
 	phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
-		       MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3] + 7);
+		       MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3] + bias[15]);
 
 	return 0;
 }
@@ -506,30 +529,43 @@
 static int tx_r50_fill_result(struct phy_device *phydev, u16 *buf,
 			      phy_cal_pair_t txg_calen_x)
 {
+	int bias[4] = {0};
+	switch(phydev->drv->phy_id) {
+		case 0x03a29481:
+		{
+			int tmp[16] = { 1, 1, 1, 1 };
+			memcpy(bias, (const void *)tmp, sizeof(bias));
+			break;
+		}
+		/* 0x03a29461 enters default case */
+		default:
+			break;
+	}
+
 	switch(txg_calen_x) {
 		case PAIR_A:
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
-				       MTK_PHY_DA_TX_R50_A_NORMAL_MASK, buf[0] << 8);
+				       MTK_PHY_DA_TX_R50_A_NORMAL_MASK, (buf[0] + bias[0]) << 8);
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53D,
-				       MTK_PHY_DA_TX_R50_A_TBT_MASK, buf[0]);
+				       MTK_PHY_DA_TX_R50_A_TBT_MASK, (buf[0]) + bias[0]);
 			break;
 		case PAIR_B:
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
-				       MTK_PHY_DA_TX_R50_B_NORMAL_MASK, buf[0] << 8);
+				       MTK_PHY_DA_TX_R50_B_NORMAL_MASK, (buf[0] + bias[1])<< 8);
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53E,
-				       MTK_PHY_DA_TX_R50_B_TBT_MASK, buf[0]);
+				       MTK_PHY_DA_TX_R50_B_TBT_MASK, (buf[0] + bias[1]));
 			break;
 		case PAIR_C:
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
-				       MTK_PHY_DA_TX_R50_C_NORMAL_MASK, buf[0] << 8);
+				       MTK_PHY_DA_TX_R50_C_NORMAL_MASK, (buf[0] + bias[2])<< 8);
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG53F,
-				       MTK_PHY_DA_TX_R50_C_TBT_MASK, buf[0]);
+				       MTK_PHY_DA_TX_R50_C_TBT_MASK, (buf[0] + bias[2]));
 			break;
 		case PAIR_D:
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
-				       MTK_PHY_DA_TX_R50_D_NORMAL_MASK, buf[0] << 8);
+				       MTK_PHY_DA_TX_R50_D_NORMAL_MASK, (buf[0] + bias[3])<< 8);
 			phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG540,
-				       MTK_PHY_DA_TX_R50_D_TBT_MASK, buf[0]);
+				       MTK_PHY_DA_TX_R50_D_TBT_MASK, (buf[0] + bias[3]));
 			break;
 	}
 	return 0;
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9994-ethernet-update-ppe-from-mt7622-to-mt7986.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9994-ethernet-update-ppe-from-mt7622-to-mt7986.patch
index 6a4766d..a349e14 100755
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9994-ethernet-update-ppe-from-mt7622-to-mt7986.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9994-ethernet-update-ppe-from-mt7622-to-mt7986.patch
@@ -98,41 +98,50 @@
  	hash &= MTK_PPE_ENTRIES - 1;
  
  	return hash;
-@@ -171,8 +171,7 @@ int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
+@@ -171,8 +171,12 @@ int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
  	      MTK_FOE_IB1_BIND_CACHE;
  	entry->ib1 = val;
- 
--	val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
--	      FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) |
+
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +	val = FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0xf) |
++#else
+ 	val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
+ 	      FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) |
++#endif
  	      FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port);
  
  	if (is_multicast_ether_addr(dest_mac))
-@@ -359,12 +358,10 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
+@@ -359,12 +358,19 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
  
  	*ib2 &= ~MTK_FOE_IB2_PORT_MG;
  	*ib2 |= MTK_FOE_IB2_WDMA_WINFO;
--	if (wdma_idx)
--		*ib2 |= MTK_FOE_IB2_WDMA_DEVIDX;
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +	*ib2 |=  FIELD_PREP(MTK_FOE_IB2_RX_IDX, txq);
- 
--	l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) |
--		    FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) |
--		    FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq);
++
 +	l2->winfo = FIELD_PREP(MTK_FOE_WINFO_WCID, wcid) |
 +		    FIELD_PREP(MTK_FOE_WINFO_BSS, bss);
++#else
+ 	if (wdma_idx)
+ 		*ib2 |= MTK_FOE_IB2_WDMA_DEVIDX;
+ 
+ 	l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) |
+ 		    FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) |
+ 		    FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq);
++#endif
  
  	return 0;
  }
-@@ -741,6 +738,7 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
+@@ -741,6 +738,9 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
  	      MTK_PPE_TB_CFG_AGE_TCP |
  	      MTK_PPE_TB_CFG_AGE_UDP |
  	      MTK_PPE_TB_CFG_AGE_TCP_FIN |
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +	      MTK_PPE_TB_CFG_INFO_SEL |
++#endif
  	      FIELD_PREP(MTK_PPE_TB_CFG_SEARCH_MISS,
  			 MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD) |
  	      FIELD_PREP(MTK_PPE_TB_CFG_KEEPALIVE,
-@@ -757,7 +755,9 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
+@@ -757,7 +755,8 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
  
  	mtk_ppe_cache_enable(ppe, true);
  
@@ -140,7 +149,7 @@
 +	val = MTK_PPE_MD_TOAP_BYP_CRSN0 |
 +	      MTK_PPE_MD_TOAP_BYP_CRSN1 |
 +	      MTK_PPE_MD_TOAP_BYP_CRSN2 |
- 	      MTK_PPE_FLOW_CFG_IP4_UDP_FRAG |
+-	      MTK_PPE_FLOW_CFG_IP4_UDP_FRAG |
  	      MTK_PPE_FLOW_CFG_IP6_3T_ROUTE |
  	      MTK_PPE_FLOW_CFG_IP6_5T_ROUTE |
 @@ -765,7 +765,8 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
@@ -148,17 +157,19 @@
  	      MTK_PPE_FLOW_CFG_IP4_NAPT |
  	      MTK_PPE_FLOW_CFG_IP4_DSLITE |
 -	      MTK_PPE_FLOW_CFG_IP4_NAT_FRAG;
-+	      MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY |
-+	      MTK_PPE_FLOW_CFG_IP4_NAT_FRAG ;
++	      MTK_PPE_FLOW_CFG_IP4_NAT_FRAG |
++	      MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY;
  	ppe_w32(ppe, MTK_PPE_FLOW_CFG, val);
  
  	val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) |
-@@ -800,6 +801,9 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
+@@ -800,6 +801,11 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
  
  	ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0);
- 
+
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +	ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT1, 0xcb777);
 +	ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f);
++#endif
 +
  	return 0;
  }
@@ -167,33 +178,23 @@
 index 1f5cf1c9a..a76f4b0ac 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -8,7 +8,7 @@
+@@ -8,7 +8,11 @@
  #include <linux/bitfield.h>
  #include <linux/rhashtable.h>
- 
--#define MTK_ETH_PPE_BASE		0xc00
+
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +#define MTK_ETH_PPE_BASE		0x2000
++#else
+ #define MTK_ETH_PPE_BASE		0xc00
++#endif
  
  #define MTK_PPE_ENTRIES_SHIFT		3
  #define MTK_PPE_ENTRIES			(1024 << MTK_PPE_ENTRIES_SHIFT)
-@@ -16,20 +16,23 @@
+@@ -16,20 +16,40 @@
  #define MTK_PPE_WAIT_TIMEOUT_US		1000000
  
  #define MTK_FOE_IB1_UNBIND_TIMESTAMP	GENMASK(7, 0)
--#define MTK_FOE_IB1_UNBIND_PACKETS	GENMASK(23, 8)
--#define MTK_FOE_IB1_UNBIND_PREBIND	BIT(24)
--
--#define MTK_FOE_IB1_BIND_TIMESTAMP	GENMASK(14, 0)
--#define MTK_FOE_IB1_BIND_KEEPALIVE	BIT(15)
--#define MTK_FOE_IB1_BIND_VLAN_LAYER	GENMASK(18, 16)
--#define MTK_FOE_IB1_BIND_PPPOE		BIT(19)
--#define MTK_FOE_IB1_BIND_VLAN_TAG	BIT(20)
--#define MTK_FOE_IB1_BIND_PKT_SAMPLE	BIT(21)
--#define MTK_FOE_IB1_BIND_CACHE		BIT(22)
--#define MTK_FOE_IB1_BIND_TUNNEL_DECAP	BIT(23)
--#define MTK_FOE_IB1_BIND_TTL		BIT(24)
--
--#define MTK_FOE_IB1_PACKET_TYPE		GENMASK(27, 25)
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +#define MTK_FOE_IB1_UNBIND_SRC_PORT	GENMASK(11, 8)
 +#define MTK_FOE_IB1_UNBIND_PACKETS	GENMASK(19, 12)
 +#define MTK_FOE_IB1_UNBIND_PREBIND	BIT(22)
@@ -210,27 +211,31 @@
 +#define MTK_FOE_IB1_BIND_TUNNEL_DECAP	BIT(21)
 +#define MTK_FOE_IB1_BIND_TTL		BIT(22)
 +#define MTK_FOE_IB1_PACKET_TYPE		GENMASK(27, 23)
++#else
+ #define MTK_FOE_IB1_UNBIND_PACKETS	GENMASK(23, 8)
+ #define MTK_FOE_IB1_UNBIND_PREBIND	BIT(24)
+ 
+ #define MTK_FOE_IB1_BIND_TIMESTAMP	GENMASK(14, 0)
+ #define MTK_FOE_IB1_BIND_KEEPALIVE	BIT(15)
+ #define MTK_FOE_IB1_BIND_VLAN_LAYER	GENMASK(18, 16)
+ #define MTK_FOE_IB1_BIND_PPPOE		BIT(19)
+ #define MTK_FOE_IB1_BIND_VLAN_TAG	BIT(20)
+ #define MTK_FOE_IB1_BIND_PKT_SAMPLE	BIT(21)
+ #define MTK_FOE_IB1_BIND_CACHE		BIT(22)
+ #define MTK_FOE_IB1_BIND_TUNNEL_DECAP	BIT(23)
+ #define MTK_FOE_IB1_BIND_TTL		BIT(24)
+ 
+ #define MTK_FOE_IB1_PACKET_TYPE		GENMASK(27, 25)
++#endif
 +
  #define MTK_FOE_IB1_STATE		GENMASK(29, 28)
  #define MTK_FOE_IB1_UDP			BIT(30)
  #define MTK_FOE_IB1_STATIC		BIT(31)
-@@ -44,24 +47,19 @@ enum {
+@@ -44,24 +47,42 @@ enum {
  	MTK_PPE_PKT_TYPE_IPV6_6RD = 7,
  };
  
--#define MTK_FOE_IB2_QID			GENMASK(3, 0)
--#define MTK_FOE_IB2_PSE_QOS		BIT(4)
--#define MTK_FOE_IB2_DEST_PORT		GENMASK(7, 5)
--#define MTK_FOE_IB2_MULTICAST		BIT(8)
--
--#define MTK_FOE_IB2_WDMA_QID2		GENMASK(13, 12)
--#define MTK_FOE_IB2_WDMA_DEVIDX		BIT(16)
--#define MTK_FOE_IB2_WDMA_WINFO		BIT(17)
--
--#define MTK_FOE_IB2_PORT_MG		GENMASK(17, 12)
--
--#define MTK_FOE_IB2_PORT_AG		GENMASK(23, 18)
--
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +#define MTK_FOE_IB2_QID			GENMASK(6, 0)
 +#define MTK_FOE_IB2_PORT_MG		BIT(7)
 +#define MTK_FOE_IB2_PSE_QOS		BIT(8)
@@ -240,43 +245,56 @@
 +#define MTK_FOE_IB2_RX_IDX		GENMASK(18, 17)
 +#define MTK_FOE_IB2_WDMA_WINFO		BIT(19)
 +#define MTK_FOE_IB2_PORT_AG		GENMASK(23, 20)
++#else
+ #define MTK_FOE_IB2_QID			GENMASK(3, 0)
+ #define MTK_FOE_IB2_PSE_QOS		BIT(4)
+ #define MTK_FOE_IB2_DEST_PORT		GENMASK(7, 5)
+ #define MTK_FOE_IB2_MULTICAST		BIT(8)
+ 
+ #define MTK_FOE_IB2_WDMA_QID2		GENMASK(13, 12)
++#define MTK_FOE_IB2_MIB_CNT		BIT(15)
+ #define MTK_FOE_IB2_WDMA_DEVIDX		BIT(16)
+ #define MTK_FOE_IB2_WDMA_WINFO		BIT(17)
+ 
+ #define MTK_FOE_IB2_PORT_MG		GENMASK(17, 12)
+ 
+ #define MTK_FOE_IB2_PORT_AG		GENMASK(23, 18)
++#endif
+ 
  #define MTK_FOE_IB2_DSCP		GENMASK(31, 24)
  
--#define MTK_FOE_VLAN2_WINFO_BSS		GENMASK(5, 0)
--#define MTK_FOE_VLAN2_WINFO_WCID	GENMASK(13, 6)
--#define MTK_FOE_VLAN2_WINFO_RING	GENMASK(15, 14)
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +#define MTK_FOE_WINFO_BSS		GENMASK(5, 0)
 +#define MTK_FOE_WINFO_WCID		GENMASK(15, 6)
++#else
+ #define MTK_FOE_VLAN2_WINFO_BSS		GENMASK(5, 0)
+ #define MTK_FOE_VLAN2_WINFO_WCID	GENMASK(13, 6)
+ #define MTK_FOE_VLAN2_WINFO_RING	GENMASK(15, 14)
++#endif
  
  enum {
  	MTK_FOE_STATE_INVALID,
-@@ -83,6 +81,9 @@ struct mtk_foe_mac_info {
+@@ -83,6 +81,11 @@ struct mtk_foe_mac_info {
  
  	u16 pppoe_id;
  	u16 src_mac_lo;
 +
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +	u16 minfo;
 +	u16 winfo;
++#endif
  };
  
  /* software-only entry type */
-@@ -96,6 +97,10 @@ struct mtk_foe_bridge {
- 	u32 ib2;
- 
- 	struct mtk_foe_mac_info l2;
-+	u32 new_sip;
-+	u32 new_dip;
-+	u16 new_dport;
-+	u16 new_sport;
- };
- 
- struct mtk_ipv4_tuple {
-@@ -200,7 +205,7 @@ struct mtk_foe_entry {
+@@ -200,7 +205,11 @@ struct mtk_foe_entry {
  		struct mtk_foe_ipv4_dslite dslite;
  		struct mtk_foe_ipv6 ipv6;
  		struct mtk_foe_ipv6_6rd ipv6_6rd;
--		u32 data[19];
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +		u32 data[23];
++#else
+ 		u32 data[19];
++#endif
  	};
  };
  
@@ -284,17 +302,19 @@
 index d4a012608..5a4201447 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-@@ -192,7 +192,12 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+@@ -192,7 +192,15 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  	if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) {
  		mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss,
  				       info.wcid);
--		pse_port = 3;
+ 		pse_port = 3;
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +		if (info.wdma_idx == 0)
 +			pse_port = 8;
 +		else if (info.wdma_idx == 1)
 +			pse_port = 9;
 +		else
 +			return -EOPNOTSUPP;
++#endif
  		*wed_index = info.wdma_idx;
  		goto out;
  	}
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9995-flow-offload-add-mkhnat-dual-ppe-new-v2.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9995-flow-offload-add-mkhnat-dual-ppe-new-v2.patch
index 7a06015..df74a7d 100755
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9995-flow-offload-add-mkhnat-dual-ppe-new-v2.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9995-flow-offload-add-mkhnat-dual-ppe-new-v2.patch
@@ -212,13 +212,17 @@
 index a76f4b0ac..21cc55145 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -8,6 +8,8 @@
+@@ -8,10 +8,12 @@
  #include <linux/bitfield.h>
  #include <linux/rhashtable.h>
  
+ #if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +#define MTK_MAX_PPE_NUM			2
-+
  #define MTK_ETH_PPE_BASE		0x2000
+ #else
++#define MTK_MAX_PPE_NUM			1
+ #define MTK_ETH_PPE_BASE		0xc00
+ #endif
  
  #define MTK_PPE_ENTRIES_SHIFT		3
 @@ -253,6 +255,7 @@ struct mtk_flow_entry {
@@ -354,11 +358,12 @@
  	} else {
  		return -EOPNOTSUPP;
  	}
-@@ -435,11 +441,25 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -435,11 +441,27 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
  	if (!entry)
  		return -ENOMEM;
  
 +	i = 0;
++#if defined(CONFIG_MEDIATEK_NETSYS_V2)
 +	if (idev && idev->netdev_ops->ndo_fill_receive_path) {
 +		ctx.dev = idev;
 +		idev->netdev_ops->ndo_fill_receive_path(&ctx, &path);
@@ -370,6 +375,7 @@
 +			return -EINVAL;
 +		}
 +	}
++#endif
 +
  	entry->cookie = f->cookie;
  	memcpy(&entry->data, &foe, sizeof(entry->data));
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9997-add-wed-rx-support-for-mt7896.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9997-add-wed-rx-support-for-mt7896.patch
old mode 100755
new mode 100644
index 5da593d..8af3142
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9997-add-wed-rx-support-for-mt7896.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/flow_patch/9997-add-wed-rx-support-for-mt7896.patch
@@ -8,7 +8,7 @@
  arch/arm64/boot/dts/mediatek/mt7986a.dtsi     |  42 +-
  arch/arm64/boot/dts/mediatek/mt7986b.dtsi     |  42 +-
  drivers/net/ethernet/mediatek/Makefile        |   2 +-
- drivers/net/ethernet/mediatek/mtk_wed.c       | 627 ++++++++++++++++--
+ drivers/net/ethernet/mediatek/mtk_wed.c       | 631 ++++++++++++++++--
  drivers/net/ethernet/mediatek/mtk_wed.h       |  51 ++
  drivers/net/ethernet/mediatek/mtk_wed_ccif.c  | 133 ++++
  drivers/net/ethernet/mediatek/mtk_wed_ccif.h  |  45 ++
@@ -16,8 +16,8 @@
  drivers/net/ethernet/mediatek/mtk_wed_mcu.c   | 586 ++++++++++++++++
  drivers/net/ethernet/mediatek/mtk_wed_mcu.h   | 125 ++++
  drivers/net/ethernet/mediatek/mtk_wed_regs.h  | 145 +++-
- drivers/net/ethernet/mediatek/mtk_wed_wo.c    | 581 ++++++++++++++++
- drivers/net/ethernet/mediatek/mtk_wed_wo.h    | 327 +++++++++
+ drivers/net/ethernet/mediatek/mtk_wed_wo.c    | 573 ++++++++++++++++
+ drivers/net/ethernet/mediatek/mtk_wed_wo.h    | 336 ++++++++++
  include/linux/soc/mediatek/mtk_wed.h          |  75 ++-
  14 files changed, 2796 insertions(+), 75 deletions(-)
  create mode 100644 drivers/net/ethernet/mediatek/mtk_wed_ccif.c
@@ -324,10 +324,11 @@
  	int i;
  
  	if (!page_list)
-@@ -187,6 +291,13 @@ mtk_wed_free_buffer(struct mtk_wed_device *dev)
+@@ -187,7 +291,14 @@ mtk_wed_free_buffer(struct mtk_wed_device *dev)
  	if (!desc)
  		goto free_pagelist;
  
+-	for (i = 0, page_idx = 0; i < dev->buf_ring.size; i += MTK_WED_BUF_PER_PAGE) {
 +	if (dev->ver == MTK_WED_V1) {
 +		ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
 +	} else {
@@ -335,10 +336,19 @@
 +			    MTK_WED_WDMA_RING_SIZE * 2;
 +	}
 +
- 	for (i = 0, page_idx = 0; i < dev->buf_ring.size; i += MTK_WED_BUF_PER_PAGE) {
++	for (i = 0, page_idx = 0; i < ring_size; i += MTK_WED_BUF_PER_PAGE) {
  		void *page = page_list[page_idx++];
  
-@@ -205,6 +316,42 @@ mtk_wed_free_buffer(struct mtk_wed_device *dev)
+ 		if (!page)
+@@ -198,13 +309,49 @@ mtk_wed_free_buffer(struct mtk_wed_device *dev)
+ 		__free_page(page);
+ 	}
+ 
+-	dma_free_coherent(dev->hw->dev, dev->buf_ring.size * sizeof(*desc),
++	dma_free_coherent(dev->hw->dev, ring_size * sizeof(*desc),
+ 			  desc, dev->buf_ring.desc_phys);
+ 
+ free_pagelist:
  	kfree(page_list);
  }
  
@@ -2552,7 +2562,7 @@
 index 000000000..67dcffb26
 --- /dev/null
 +++ b/drivers/net/ethernet/mediatek/mtk_wed_wo.c
-@@ -0,0 +1,581 @@
+@@ -0,0 +1,573 @@
 +// SPDX-License-Identifier: GPL-2.0-only
 +
 +#include <linux/kernel.h>
@@ -2602,8 +2612,6 @@
 +	woccif_w32(wo, q->regs->desc_base, q->desc_dma);
 +	woccif_w32(wo, q->regs->ring_size, q->ndesc);
 +
-+	/* wo fw start from 1 */
-+	q->tail = q->head = 1;
 +}
 +
 +static void
@@ -2653,6 +2661,9 @@
 +		}
 +		dma_sync_single_for_cpu(wo->hw->dev, addr, len,
 +					DMA_TO_DEVICE);
++
++		q->head = (q->head + 1) % q->ndesc;
++
 +		desc = &q->desc[q->head];
 +		entry = &q->entry[q->head];
 +
@@ -2669,7 +2680,6 @@
 +		q->queued++;
 +		q->entry[q->head].buf = buf;
 +
-+		q->head = (q->head + 1) % q->ndesc;
 +		frames++;
 +	}
 +
@@ -2754,18 +2764,16 @@
 +	if (flush)
 +		last = -1;
 +	else
-+		last = readl(&q->regs->dma_idx);
++		last = woccif_r32(wo, q->regs->dma_idx);
 +
 +	while (q->queued > 0 && q->tail != last) {
 +		struct wed_wo_queue_entry *e;
 +
-+		e = &q->entry[q->tail];
++		e = &q->entry[q->tail + 1];
 +
 +		dma_unmap_single(wo->hw->dev, e->dma_addr, e->dma_len,
 +				 DMA_TO_DEVICE);
 +
-+		if (e->skb)
-+			dev_kfree_skb(e->skb);
 +
 +		memset(e, 0, sizeof(*e));
 +
@@ -2774,8 +2782,6 @@
 +		q->queued--;
 +		spin_unlock_bh(&q->lock);
 +
-+		if (!flush && q->tail == last)
-+			last = readl(&q->regs->dma_idx);
 +	}
 +	spin_unlock_bh(&q->cleanup_lock);
 +
@@ -2794,7 +2800,7 @@
 +	int buf_len = SKB_WITH_OVERHEAD(q->buf_size);
 +	struct wed_wo_queue_entry *e;
 +	struct wed_wo_desc *desc;
-+	int idx = q->tail;
++	int idx = (q->tail + 1) % q->ndesc;;
 +	void *buf;
 +
 +	*more = false;
@@ -2806,7 +2812,7 @@
 +	else if (!(q->desc[idx].ctrl & cpu_to_le32(WED_CTL_DMA_DONE)))
 +		return NULL;
 +
-+	q->tail = (q->tail + 1) % q->ndesc;
++	q->tail = idx;
 +	q->queued--;
 +
 +	desc = &q->desc[idx];
@@ -2911,19 +2917,16 @@
 +		goto error;
 +
 +	/* packet tx, force trigger tx clean. */
-+	if (q->queued + MTK_WED_WO_TXQ_FREE_THR >= q->ndesc - 1)
 +		woif_q_tx_clean(wo, q, false);
 +
-+	if (q->queued + 1 >= q->ndesc - 1) {
++	if (q->queued >= q->ndesc) {
 +		ret = -ENOMEM;
 +		goto error;
 +	}
 +
 +	spin_lock_bh(&q->lock);
 +
-+	dma_sync_single_for_device(wo->hw->dev, addr, len,
-+					   DMA_TO_DEVICE);
-+
++	q->head = (q->head + 1) % q->ndesc;
 +	idx = q->head;
 +
 +	desc = &q->desc[idx];
@@ -2945,7 +2948,6 @@
 +	woif_q_kick(wo, q, 0);
 +	wo->drv_ops->kickout(wo);
 +
-+	q->head = (q->head + 1) % q->ndesc;
 +	spin_unlock_bh(&q->lock);
 +	return 0;
 +