[Change and sync linux version from OpenWRT]

[Description]
Change and sync linux version from OpenWRT
1. sync kernel to Openwrt21.02 : v5.4.188
2. sync mtk kernel patch from mtk_feed

[Release-log]
N/A

diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986-clkitg.dtsi b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986-clkitg.dtsi
index 70b56f2..b148f6d 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986-clkitg.dtsi
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986-clkitg.dtsi
@@ -152,8 +152,8 @@
 			<&topckgen CK_TOP_SPINFI_BCK>,
 			<&topckgen CK_TOP_I2C_BCK>,
 			<&topckgen CK_TOP_PEXTP_TL>,
-			<&topckgen CK_TOP_EMMC_250M>,
-			<&topckgen CK_TOP_EMMC_416M>,
+			<&clk40m>,
+			<&clk40m>,
 			<&topckgen CK_TOP_F_26M_ADC_CK>,
 			<&topckgen CK_TOP_SYSAXI>,
 			<&topckgen CK_TOP_NETSYS_WED_MCU>,
@@ -176,8 +176,8 @@
 			<&topckgen CK_TOP_PWM_SEL>,
 			<&topckgen CK_TOP_I2C_SEL>,
 			<&topckgen CK_TOP_PEXTP_TL_SEL>,
-			<&topckgen CK_TOP_EMMC_250M_SEL	>,
-			<&topckgen CK_TOP_EMMC_416M_SEL	>,
+			<&clk40m>,
+			<&clk40m>,
 			<&topckgen CK_TOP_F_26M_ADC_SEL>,
 			<&topckgen CK_TOP_DRAMC_SEL>,
 			<&topckgen CK_TOP_DRAMC_MD32_SEL>,
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 cb80e99..6f2d966 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
@@ -3,7 +3,7 @@
 #include "mt7986a-pinctrl.dtsi"
 #include "mt7986-spim-nand-partition.dtsi"
 / {
-	model = "MediaTek MT7986b gsw RFB";
+	model = "MediaTek MT7986a gsw RFB";
 	compatible = "mediatek,mt7986a-2500wan-gsw-spim-snand-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
@@ -145,7 +145,7 @@
 
 	port6: port@6 {
 		compatible = "mediatek,mt753x-port";
-		mediatek,ssc-on;
+		/* mediatek,ssc-on; */
 		reg = <6>;
 		phy-mode = "sgmii";
 		fixed-link {
@@ -157,7 +157,7 @@
 
 &hnat {
 	mtketh-wan = "eth1";
-	mtketh-lan = "lan";
+	mtketh-lan = "eth0";
 	mtketh-max-gmac = <2>;
 	status = "okay";
 };
@@ -204,9 +204,6 @@
 &wbsys {
 	mediatek,mtd-eeprom = <&factory 0x0000>;
 	status = "okay";
-        pinctrl-names = "default", "dbdc";
-        pinctrl-0 = <&wf_2g_5g_pins>;
-        pinctrl-1 = <&wf_dbdc_pins>;
 };
 
 &pio {
@@ -226,39 +223,4 @@
 			mediatek,pull-down-adv = <0>;	/* bias-disable */
 		};
 	};
-
-        wf_2g_5g_pins: wf_2g_5g-pins {
-                mux {
-                        function = "wifi";
-                        groups = "wf_2g", "wf_5g";
-                };
-                conf {
-                        pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
-                               "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
-                               "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
-                               "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
-                               "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
-                               "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
-                               "WF1_TOP_CLK", "WF1_TOP_DATA";
-                        drive-strength = <MTK_DRIVE_4mA>;
-                };
-        };
-
-        wf_dbdc_pins: wf_dbdc-pins {
-                mux {
-                        function = "wifi";
-                        groups = "wf_dbdc";
-                };
-                conf {
-                        pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
-                               "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
-                               "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
-                               "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
-                               "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
-                               "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
-                               "WF1_TOP_CLK", "WF1_TOP_DATA";
-                        drive-strength = <MTK_DRIVE_4mA>;
-                };
-        };
-
 };
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 840b52f..d6eee2c 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
@@ -4,7 +4,7 @@
 #include "mt7986-spim-nand-partition.dtsi"
 / {
 	model = "MediaTek MT7986b gsw RFB";
-	compatible = "mediatek,mt7986b-gsw-spim-snand-rfb";
+	compatible = "mediatek,mt7986b-2500wan-gsw-spim-snand-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
 				earlycon=uart8250,mmio32,0x11002000";
@@ -121,7 +121,7 @@
 
 	port6: port@6 {
 		compatible = "mediatek,mt753x-port";
-		mediatek,ssc-on;
+		/* mediatek,ssc-on; */
 		reg = <6>;
 		phy-mode = "sgmii";
 		fixed-link {
@@ -133,7 +133,7 @@
 
 &hnat {
 	mtketh-wan = "eth1";
-	mtketh-lan = "lan";
+	mtketh-lan = "eth0";
 	mtketh-max-gmac = <2>;
 	status = "okay";
 };
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-snfi-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-snfi-nand-rfb.dts
index b260808..06efb78 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-snfi-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm/boot/dts/mt7986b-snfi-nand-rfb.dts
@@ -4,7 +4,7 @@
 #include "mt7986-snfi-nand-partition.dtsi"
 / {
 	model = "MediaTek MT7986b RFB";
-	compatible = "mediatek,mt7986b-snfi-snand-rfb";
+	compatible = "mediatek,mt7986b-2500wan-snfi-snand-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
 				earlycon=uart8250,mmio32,0x11002000";
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-snfi-nand-2500wan-p5.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-snfi-nand-2500wan-p5.dts
index ad1dbfa..ea663eb 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-snfi-nand-2500wan-p5.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-snfi-nand-2500wan-p5.dts
@@ -2,7 +2,7 @@
 #include "mt7981.dtsi"
 / {
 	model = "MediaTek MT7981 RFB";
-	compatible = "mediatek,mt7981-snand-pcie-2500wan-p5-rfb";
+	compatible = "mediatek,mt7981-snfi-snand-pcie-2500wan-p5-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
 				earlycon=uart8250,mmio32,0x11002000";
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-spim-nand-2500wan-gmac2.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-spim-nand-2500wan-gmac2.dts
index 904d529..6c24709 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-spim-nand-2500wan-gmac2.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-spim-nand-2500wan-gmac2.dts
@@ -2,7 +2,7 @@
 #include "mt7981.dtsi"
 / {
 	model = "MediaTek MT7981 RFB";
-	compatible = "mediatek,mt7981-spim-snand-rfb";
+	compatible = "mediatek,mt7981-spim-snand-2500wan-gmac2-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
 				earlycon=uart8250,mmio32,0x11002000";
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986-clkitg.dtsi b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986-clkitg.dtsi
index 70b56f2..b148f6d 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986-clkitg.dtsi
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986-clkitg.dtsi
@@ -152,8 +152,8 @@
 			<&topckgen CK_TOP_SPINFI_BCK>,
 			<&topckgen CK_TOP_I2C_BCK>,
 			<&topckgen CK_TOP_PEXTP_TL>,
-			<&topckgen CK_TOP_EMMC_250M>,
-			<&topckgen CK_TOP_EMMC_416M>,
+			<&clk40m>,
+			<&clk40m>,
 			<&topckgen CK_TOP_F_26M_ADC_CK>,
 			<&topckgen CK_TOP_SYSAXI>,
 			<&topckgen CK_TOP_NETSYS_WED_MCU>,
@@ -176,8 +176,8 @@
 			<&topckgen CK_TOP_PWM_SEL>,
 			<&topckgen CK_TOP_I2C_SEL>,
 			<&topckgen CK_TOP_PEXTP_TL_SEL>,
-			<&topckgen CK_TOP_EMMC_250M_SEL	>,
-			<&topckgen CK_TOP_EMMC_416M_SEL	>,
+			<&clk40m>,
+			<&clk40m>,
 			<&topckgen CK_TOP_F_26M_ADC_SEL>,
 			<&topckgen CK_TOP_DRAMC_SEL>,
 			<&topckgen CK_TOP_DRAMC_MD32_SEL>,
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 21d5dc8..6f2d966 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
@@ -3,7 +3,7 @@
 #include "mt7986a-pinctrl.dtsi"
 #include "mt7986-spim-nand-partition.dtsi"
 / {
-	model = "MediaTek MT7986b gsw RFB";
+	model = "MediaTek MT7986a gsw RFB";
 	compatible = "mediatek,mt7986a-2500wan-gsw-spim-snand-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
@@ -145,7 +145,7 @@
 
 	port6: port@6 {
 		compatible = "mediatek,mt753x-port";
-		mediatek,ssc-on;
+		/* mediatek,ssc-on; */
 		reg = <6>;
 		phy-mode = "sgmii";
 		fixed-link {
@@ -157,7 +157,7 @@
 
 &hnat {
 	mtketh-wan = "eth1";
-	mtketh-lan = "lan";
+	mtketh-lan = "eth0";
 	mtketh-max-gmac = <2>;
 	status = "okay";
 };
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 840b52f..d6eee2c 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
@@ -4,7 +4,7 @@
 #include "mt7986-spim-nand-partition.dtsi"
 / {
 	model = "MediaTek MT7986b gsw RFB";
-	compatible = "mediatek,mt7986b-gsw-spim-snand-rfb";
+	compatible = "mediatek,mt7986b-2500wan-gsw-spim-snand-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
 				earlycon=uart8250,mmio32,0x11002000";
@@ -121,7 +121,7 @@
 
 	port6: port@6 {
 		compatible = "mediatek,mt753x-port";
-		mediatek,ssc-on;
+		/* mediatek,ssc-on; */
 		reg = <6>;
 		phy-mode = "sgmii";
 		fixed-link {
@@ -133,7 +133,7 @@
 
 &hnat {
 	mtketh-wan = "eth1";
-	mtketh-lan = "lan";
+	mtketh-lan = "eth0";
 	mtketh-max-gmac = <2>;
 	status = "okay";
 };
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-snfi-nand-rfb.dts b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-snfi-nand-rfb.dts
index b260808..06efb78 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-snfi-nand-rfb.dts
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7986b-snfi-nand-rfb.dts
@@ -4,7 +4,7 @@
 #include "mt7986-snfi-nand-partition.dtsi"
 / {
 	model = "MediaTek MT7986b RFB";
-	compatible = "mediatek,mt7986b-snfi-snand-rfb";
+	compatible = "mediatek,mt7986b-2500wan-snfi-snand-rfb";
 	chosen {
 		bootargs = "console=ttyS0,115200n1 loglevel=8  \
 				earlycon=uart8250,mmio32,0x11002000";
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 1bf43b3..a50c25f 100755
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -485,10 +485,9 @@
 	mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
 }
 
-static void mtk_mac_link_up(struct phylink_config *config,
-                            struct phy_device *phy,
-                            unsigned int mode, phy_interface_t interface,
-                            int speed, int duplex, bool tx_pause, bool rx_pause)
+static void mtk_mac_link_up(struct phylink_config *config, unsigned int mode,
+			    phy_interface_t interface,
+			    struct phy_device *phy)
 {
 	struct mtk_mac *mac = container_of(config, struct mtk_mac,
 					   phylink_config);
@@ -2679,7 +2678,7 @@
 	netif_start_queue(dev);
 	phy_node = of_parse_phandle(mac->of_node, "phy-handle", 0);
 	if (!phy_node) {
-		regmap_write(eth->sgmii->regmap[0], SGMSYS_QPHY_PWR_STATE_CTRL, 0);
+		regmap_write(eth->sgmii->regmap[mac->id], SGMSYS_QPHY_PWR_STATE_CTRL, 0);
 	}
 	return 0;
 }
@@ -2723,9 +2722,9 @@
 		val |= BMCR_PDOWN;
 		_mtk_mdio_write(eth, 0, 0, val);
 	}else {
-		regmap_read(eth->sgmii->regmap[0], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
+		regmap_read(eth->sgmii->regmap[mac->id], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
 		val |= SGMII_PHYA_PWD;
-		regmap_write(eth->sgmii->regmap[0], SGMSYS_QPHY_PWR_STATE_CTRL, val);
+		regmap_write(eth->sgmii->regmap[mac->id], SGMSYS_QPHY_PWR_STATE_CTRL, val);
 	}
 
 	//GMAC RX disable
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h
index a31c4f6..4cd18bc 100755
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -364,7 +364,7 @@
 #define MTK_CHK_DDONE_EN	BIT(28)
 #define MTK_DMAD_WR_WDONE	BIT(26)
 #define MTK_WCOMP_EN		BIT(24)
-#define MTK_RESV_BUF		(0x40 << 16)
+#define MTK_RESV_BUF		(0x80 << 16)
 #define MTK_MUTLI_CNT		(0x4 << 12)
 
 /* QDMA Reset Index Register */
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
index 58a83b8..68aad32 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
@@ -351,7 +351,7 @@
 
 	/* enable FOE */
 	cr_set_bits(hnat_priv->ppe_base[ppe_id] + PPE_FLOW_CFG,
-		    BIT_UDP_IP4F_NAT_EN | BIT_IPV4_NAT_EN | BIT_IPV4_NAPT_EN |
+		    BIT_IPV4_NAT_EN | BIT_IPV4_NAPT_EN |
 		    BIT_IPV4_NAT_FRAG_EN | BIT_IPV4_HASH_GREK |
 		    BIT_IPV4_DSL_EN | BIT_IPV6_6RD_EN |
 		    BIT_IPV6_3T_ROUTE_EN | BIT_IPV6_5T_ROUTE_EN);
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
index a5403a8..69f1c21 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c
@@ -1036,10 +1036,52 @@
 	return single_open(file, hnat_whnat_show, file->private_data);
 }
 
+static ssize_t hnat_whnat_write(struct file *file, const char __user *buf,
+				size_t length, loff_t *offset)
+{
+	char line[64] = {0};
+	struct net_device *dev;
+	int enable;
+	char name[32];
+	size_t size;
+
+	if (length >= sizeof(line))
+		return -EINVAL;
+
+	if (copy_from_user(line, buf, length))
+		return -EFAULT;
+
+	if (sscanf(line, "%s %d", name, &enable) != 2)
+		return -EFAULT;
+
+	line[length] = '\0';
+
+	dev = dev_get_by_name(&init_net, name);
+
+	if (dev) {
+		if (enable) {
+			mtk_ppe_dev_register_hook(dev);
+			pr_info("register wifi extern if = %s\n", dev->name);
+		} else {
+			mtk_ppe_dev_unregister_hook(dev);
+			pr_info("unregister wifi extern if = %s\n", dev->name);
+		}
+	} else {
+		pr_info("no such device!\n");
+	}
+
+	size = strlen(line);
+	*offset += size;
+
+	return length;
+}
+
+
 static const struct file_operations hnat_whnat_fops = {
 	.open = hnat_whnat_open,
 	.read = seq_read,
 	.llseek = seq_lseek,
+	.write = hnat_whnat_write,
 	.release = single_release,
 };
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
index 24275a0..8d199ef 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
@@ -1027,7 +1027,6 @@
 	entry.bfib1.vpm = (entry.bfib1.vlan_layer) ? 1 : 0;
 	entry.bfib1.ttl = 1;
 	entry.bfib1.cah = 1;
-	entry.bfib1.ka = 1;
 	entry.bfib1.time_stamp = (hnat_priv->data->version == MTK_HNAT_V4) ?
 		readl(hnat_priv->fe_base + 0x0010) & (0xFF) :
 		readl(hnat_priv->fe_base + 0x0010) & (0x7FFF);
@@ -1108,6 +1107,8 @@
 		return 0;
 
 	entry.bfib1.pkt_type = foe->udib1.pkt_type; /* Get packte type state*/
+	entry.bfib1.state = foe->udib1.state;
+
 #if defined(CONFIG_MEDIATEK_NETSYS_V2)
 	entry.bfib1.sp = foe->udib1.sp;
 #endif
@@ -1558,13 +1559,13 @@
 	if (!whnat)
 		entry.bfib1.state = BIND;
 
+	wmb();
 	memcpy(foe, &entry, sizeof(entry));
 	/*reset statistic for this entry*/
 	if (hnat_priv->data->per_flow_accounting)
 		memset(&hnat_priv->acct[skb_hnat_ppe(skb)][skb_hnat_entry(skb)],
 		       0, sizeof(struct mib_entry));
 
-	wmb();
 	skb_hnat_filled(skb) = HNAT_INFO_FILLED;
 
 	return 0;
@@ -1574,6 +1575,7 @@
 {
 	struct foe_entry *entry;
 	struct ethhdr *eth;
+	struct hnat_bind_info_blk bfib1_tx;
 
 	if (skb_hnat_alg(skb) || !is_hnat_info_filled(skb) ||
 	    !is_magic_tag_valid(skb) || !IS_SPACE_AVAILABLE_HEAD(skb))
@@ -1604,6 +1606,7 @@
 		return NF_ACCEPT;
 
 	eth = eth_hdr(skb);
+	memcpy(&bfib1_tx, &entry->bfib1, sizeof(entry->bfib1));
 
 	/*not bind multicast if PPE mcast not enable*/
 	if (!hnat_priv->data->mcast) {
@@ -1619,7 +1622,7 @@
 	/* Some mt_wifi virtual interfaces, such as apcli,
 	 * will change the smac for specail purpose.
 	 */
-	switch (entry->bfib1.pkt_type) {
+	switch (bfib1_tx.pkt_type) {
 	case IPV4_HNAPT:
 	case IPV4_HNAT:
 		entry->ipv4_hnapt.smac_hi = swab32(*((u32 *)eth->h_source));
@@ -1636,24 +1639,18 @@
 	}
 
 	if (skb->vlan_tci) {
-		entry->bfib1.vlan_layer += 1;
-		entry->bfib1.vpm = 1;
+		bfib1_tx.vlan_layer = 1;
+		bfib1_tx.vpm = 1;
 		if (IS_IPV4_GRP(entry)) {
 			entry->ipv4_hnapt.etype = htons(ETH_P_8021Q);
-			if(entry->ipv4_hnapt.vlan1)
-				entry->ipv4_hnapt.vlan2 = skb->vlan_tci;
-			else
-				entry->ipv4_hnapt.vlan1 = skb->vlan_tci;
+			entry->ipv4_hnapt.vlan1 = skb->vlan_tci;
 		} else if (IS_IPV6_GRP(entry)) {
 			entry->ipv6_5t_route.etype = htons(ETH_P_8021Q);
-			if(entry->ipv6_5t_route.vlan1)
-				entry->ipv6_5t_route.vlan2 = skb->vlan_tci;
-			else
-				entry->ipv6_5t_route.vlan1 = skb->vlan_tci;
+			entry->ipv6_5t_route.vlan1 = skb->vlan_tci;
 		}
 	} else {
-		entry->bfib1.vpm = 0;
-		entry->bfib1.vlan_layer = 0;
+		bfib1_tx.vpm = 0;
+		bfib1_tx.vlan_layer = 0;
 	}
 
 	/* MT7622 wifi hw_nat not support QoS */
@@ -1666,7 +1663,6 @@
 			entry->ipv4_hnapt.winfo.bssid = skb_hnat_bss_id(skb);
 			entry->ipv4_hnapt.winfo.wcid = skb_hnat_wc_id(skb);
 #if defined(CONFIG_MEDIATEK_NETSYS_V2)
-			entry->ipv4_hnapt.iblk2.fqos = (IS_HQOS_MODE) ? 1 : 0;
 			entry->ipv4_hnapt.iblk2.rxid = skb_hnat_rx_id(skb);
 			entry->ipv4_hnapt.iblk2.winfoi = 1;
 #else
@@ -1676,8 +1672,8 @@
 #endif
 		} else {
 			if (IS_GMAC1_MODE && !hnat_dsa_is_enable(hnat_priv)) {
-				entry->bfib1.vpm = 1;
-				entry->bfib1.vlan_layer = 1;
+				bfib1_tx.vpm = 1;
+				bfib1_tx.vlan_layer = 1;
 
 				if (FROM_GE_LAN(skb))
 					entry->ipv4_hnapt.vlan1 = 1;
@@ -1687,8 +1683,8 @@
 
 			if (IS_HQOS_MODE &&
 			    (FROM_GE_LAN(skb) || FROM_GE_WAN(skb) || FROM_GE_VIRTUAL(skb))) {
-				entry->bfib1.vpm = 0;
-				entry->bfib1.vlan_layer = 1;
+				bfib1_tx.vpm = 0;
+				bfib1_tx.vlan_layer = 1;
 				entry->ipv4_hnapt.etype = htons(HQOS_MAGIC_TAG);
 				entry->ipv4_hnapt.vlan1 = skb_hnat_entry(skb);
 				entry->ipv4_hnapt.iblk2.fqos = 1;
@@ -1704,7 +1700,6 @@
 			entry->ipv6_5t_route.winfo.bssid = skb_hnat_bss_id(skb);
 			entry->ipv6_5t_route.winfo.wcid = skb_hnat_wc_id(skb);
 #if defined(CONFIG_MEDIATEK_NETSYS_V2)
-			entry->ipv6_5t_route.iblk2.fqos = (IS_HQOS_MODE) ? 1 : 0;
 			entry->ipv6_5t_route.iblk2.rxid = skb_hnat_rx_id(skb);
 			entry->ipv6_5t_route.iblk2.winfoi = 1;
 #else
@@ -1714,8 +1709,8 @@
 #endif
 		} else {
 			if (IS_GMAC1_MODE && !hnat_dsa_is_enable(hnat_priv)) {
-				entry->bfib1.vpm = 1;
-				entry->bfib1.vlan_layer = 1;
+				bfib1_tx.vpm = 1;
+				bfib1_tx.vlan_layer = 1;
 
 				if (FROM_GE_LAN(skb))
 					entry->ipv6_5t_route.vlan1 = 1;
@@ -1725,8 +1720,8 @@
 
 			if (IS_HQOS_MODE &&
 			    (FROM_GE_LAN(skb) || FROM_GE_WAN(skb) || FROM_GE_VIRTUAL(skb))) {
-				entry->bfib1.vpm = 0;
-				entry->bfib1.vlan_layer = 1;
+				bfib1_tx.vpm = 0;
+				bfib1_tx.vlan_layer = 1;
 				entry->ipv6_5t_route.etype = htons(HQOS_MAGIC_TAG);
 				entry->ipv6_5t_route.vlan1 = skb_hnat_entry(skb);
 				entry->ipv6_5t_route.iblk2.fqos = 1;
@@ -1735,7 +1730,9 @@
 		entry->ipv6_5t_route.iblk2.dp = gmac_no;
 	}
 
-	entry->bfib1.state = BIND;
+	bfib1_tx.state = BIND;
+	wmb();
+	memcpy(&entry->bfib1, &bfib1_tx, sizeof(bfib1_tx));
 
 	return NF_ACCEPT;
 }
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/Makefile b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/Makefile
deleted file mode 100644
index 25cc107..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-#always build-in
-obj-y += mt_wifi_mtd.o
-obj-y += pci_mediatek_rbus.o
-
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/mt_wifi_mtd.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/mt_wifi_mtd.c
deleted file mode 100644
index 9294c73..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/mt_wifi_mtd.c
+++ /dev/null
@@ -1,98 +0,0 @@
-#include <linux/version.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <asm/io.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/concat.h>
-#include <linux/mtd/partitions.h>
-#if defined (CONFIG_MIPS)
-#include <asm/addrspace.h>
-#endif
-
-int mt_mtd_write_nm_wifi(char *name, loff_t to, size_t len, const u_char *buf)
-{
-	int ret = -1;
-	size_t rdlen, wrlen;
-	struct mtd_info *mtd;
-	struct erase_info ei;
-	u_char *bak = NULL;
-
-	mtd = get_mtd_device_nm(name);
-	if (IS_ERR(mtd))
-		return -1;
-
-	if (len > mtd->erasesize) {
-		put_mtd_device(mtd);
-		return -E2BIG;
-	}
-
-	bak = kmalloc(mtd->erasesize, GFP_KERNEL);
-	if (bak == NULL) {
-		put_mtd_device(mtd);
-		return -ENOMEM;
-	}
-
-	ret = mtd_read(mtd, 0, mtd->erasesize, &rdlen, bak);
-
-	if (ret != 0) {
-		put_mtd_device(mtd);
-		kfree(bak);
-		return ret;
-	}
-
-	if (rdlen != mtd->erasesize)
-		printk("warning: ra_mtd_write: rdlen is not equal to erasesize\n");
-
-	memcpy(bak + to, buf, len);
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0))
-	ei.mtd = mtd;
-	ei.callback = NULL;
-	ei.priv = 0;
-#endif
-	ei.addr = 0;
-	ei.len = mtd->erasesize;
-	ret = mtd_erase(mtd, &ei);
-
-	if (ret != 0) {
-		put_mtd_device(mtd);
-		kfree(bak);
-		return ret;
-	}
-
-	ret = mtd_write(mtd, 0, mtd->erasesize, &wrlen, bak);
-
-
-
-	put_mtd_device(mtd);
-	kfree(bak);
-	return ret;
-}
-EXPORT_SYMBOL(mt_mtd_write_nm_wifi);
-
-
-int mt_mtd_read_nm_wifi(char *name, loff_t from, size_t len, u_char *buf)
-{
-	int ret;
-	size_t rdlen;
-	struct mtd_info *mtd;
-
-	mtd = get_mtd_device_nm(name);
-	if (IS_ERR(mtd))
-		return -1;
-
-	ret = mtd_read(mtd, from, len, &rdlen, buf);
-
-	if (rdlen != len)
-			printk("warning: ra_mtd_read_nm: rdlen is not equal to len\n");
-
-	put_mtd_device(mtd);
-
-	return ret;
-}
-EXPORT_SYMBOL(mt_mtd_read_nm_wifi);
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/pci_mediatek_rbus.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/pci_mediatek_rbus.c
deleted file mode 100644
index 840834d..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/net/wireless/wifi_utility/pci_mediatek_rbus.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (c) 2017 MediaTek Inc.
- * Author: Star Chang <star.chang@mediatek.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/irqdomain.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
-#include <linux/of_pci.h>
-#include <linux/of_platform.h>
-#include <linux/pci.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-#include <linux/resource.h>
-#include <linux/types.h>
-#include <linux/pinctrl/consumer.h>
-
-
-/*platform device & platform driver match name*/
-#define OF_RBUS_NAME "mediatek,wbsys"
-#define OF_PIO_NAME "mediatek,mt7622-pctl-a-syscfg"
-
-#define RBUS_VENDOR_ID_OFFSET 0
-#define RBUS_CHIP_ID_OFFSET 2
-#define RBUS_BAR_OFFSET 0x10
-#define RBUS_DEFAULT_CHIP_ID 0x7622
-#define RBUS_DEFAULT_VEND_ID 0x14c3
-#define RBUS_TSSI_CTRL_OFFSET 0x34
-#define RBUS_TSSI_CTRL_MASK 0x1
-#define RBUS_PA_LNA_CTRL_OFFSET 0x38
-#define RBUS_PA_LNA_CTRL_MASK 0x3
-
-#define GPIO_G2_MISC_OFFSET 0x00000AF0
-#define GPIO_G2_MISC_MASK 0xffffff00
-
-static char rbus_string[] = "rbus";
-unsigned int dev_second_irq = 0;
-unsigned int multi_intr_2nd = 0;
-unsigned int multi_intr_3rd = 0;
-unsigned int multi_intr_4th = 0;
-EXPORT_SYMBOL(dev_second_irq);
-EXPORT_SYMBOL(multi_intr_2nd);
-EXPORT_SYMBOL(multi_intr_3rd);
-EXPORT_SYMBOL(multi_intr_4th);
-
-static const struct of_device_id rbus_of_ids[] = {
-	{   .compatible = OF_RBUS_NAME, },
-	{ },
-};
-
-struct rbus_dev {
-	char name[36];
-	struct device *dev;
-	struct resource *res;
-	struct list_head resources;
-	unsigned int base_addr;
-	unsigned int irq;
-	unsigned int chip_id;
-	unsigned int vend_id;
-};
-
-enum {
-	TSSI_MODE_DIS=0,
-	TSSI_MODE_EN=1
-};
-
-enum {
-	IPA_ILNA_MODE=0,
-	IPA_ELNA_MODE=1,
-	EPA_ELNA_MODE=2,
-	EPA_ILNA_MODE=3
-};
-
-#define RBUS_IO_READ32(_A, _R, _pV) (*(_pV) = readl((void *)(_A + _R)))
-#define RBUS_IO_WRITE32(_A, _R, _V)	 writel(_V, (void *)(_A + _R))
-
-/*fake configure space*/
-static unsigned char rbus_conf_space[] = {
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x76, 0xc3, 0x14,
-	0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x60, 0x61, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x05, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xc3, 0x01, 0x08, 0x00, 0x00, 0x00,
-	0x10, 0x00, 0x02, 0x00, 0x40, 0x83, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x12, 0x8c, 0x40, 0x01,
-	0x43, 0x00, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static int
-rbus_tssi_config(struct platform_device *pdev, unsigned char mode)
-{
-	struct device_node *node = NULL;
-	unsigned long addr;
-	unsigned int value = 0;
-
-	node = of_find_compatible_node(NULL, NULL, OF_PIO_NAME);
-	if (!node) {
-		dev_err(&pdev->dev, "%s(): can't find node for %s\n", __func__, OF_PIO_NAME);
-		return -ENODEV;
-	}
-
-	addr = (unsigned long) of_iomap(node, 0);
-	RBUS_IO_READ32(addr, GPIO_G2_MISC_OFFSET, &value);
-
-	if (mode == TSSI_MODE_EN) {
-		value &= GPIO_G2_MISC_MASK;
-		RBUS_IO_WRITE32(addr, GPIO_G2_MISC_OFFSET, value);
-	}
-
-	RBUS_IO_READ32(addr, GPIO_G2_MISC_OFFSET, &value);
-	return 0;
-}
-
-static int
-rbus_pa_lan_config(struct platform_device *pdev, unsigned int devfn, unsigned char mode)
-{
-	struct pinctrl *p;
-	struct pinctrl_state *s;
-	unsigned char state[32] = "";
-	int ret = 0;
-
-	if (mode != IPA_ELNA_MODE && mode != EPA_ELNA_MODE)
-		return ret;
-
-	p = devm_pinctrl_get(&pdev->dev);
-
-	if (!p) {
-		dev_err(&pdev->dev, "%s(): can't get pinctrl by dev:%p\n", __func__, &pdev->dev);
-		return ret;
-	}
-
-	strncpy(state, "state_epa", sizeof("state_epa"));
-
-	s = pinctrl_lookup_state(p, state);
-
-	if (!s) {
-		dev_err(&pdev->dev, "%s(): can't find pinctrl state: %s\n", __func__, state);
-		return ret;
-	}
-
-	ret = pinctrl_select_state(p, s);
-
-	if (ret < 0)
-		dev_err(&pdev->dev, "%s(): pinctrl select to %s fail!, ret=%d\n", __func__, state, ret);
-
-	return ret;
-}
-
-static void
-rbus_init_config(struct rbus_dev *rbus)
-{
-	rbus_conf_space[RBUS_VENDOR_ID_OFFSET] = rbus->vend_id & 0xff;
-	rbus_conf_space[RBUS_VENDOR_ID_OFFSET + 1] = (rbus->vend_id >> 8) & 0xff;
-	rbus_conf_space[RBUS_CHIP_ID_OFFSET] = rbus->chip_id & 0xff;
-	rbus_conf_space[RBUS_CHIP_ID_OFFSET + 1] = (rbus->chip_id >> 8) & 0xff;
-	rbus_conf_space[RBUS_BAR_OFFSET + 3] = (rbus->base_addr >> 24) & 0xff;
-	rbus_conf_space[RBUS_BAR_OFFSET + 2] = (rbus->base_addr >> 16) & 0xff;
-	rbus_conf_space[RBUS_BAR_OFFSET + 1] = (rbus->base_addr >> 8) & 0xff;
-}
-
-static int
-rbus_read_config(struct pci_bus *bus, unsigned int devfn, int where,
-			int size, u32 *value)
-{
-	u32 *cr;
-
-	if(where >= sizeof(rbus_conf_space))
-		return PCIBIOS_BUFFER_TOO_SMALL;
-
-	cr = (u32 *) &rbus_conf_space[where];
-
-	if(devfn == 0)
-		*value = *cr;
-	return PCIBIOS_SUCCESSFUL;
-}
-
-static int
-rbus_write_config(struct pci_bus *bus, unsigned int devfn, int where,
-			int size, u32 value)
-{
-	int i;
-	struct platform_device *pdev = bus->sysdata;
-
-	if (devfn != 0)
-		goto end;
-
-	for (i = 0 ; i < size ; i++) {
-		rbus_conf_space[where + i] = (value << (i * 8)) & 0xff;
-	}
-	/*handle vendor specific action*/
-	switch(where) {
-	case RBUS_TSSI_CTRL_OFFSET:
-		rbus_tssi_config(pdev, (value & RBUS_TSSI_CTRL_MASK));
-	break;
-	case RBUS_PA_LNA_CTRL_OFFSET:
-		rbus_pa_lan_config(pdev, devfn, (value & RBUS_PA_LNA_CTRL_MASK));
-	break;
-	default:
-	break;
-	}
-end:
-	return PCIBIOS_SUCCESSFUL;
-}
-
-
-struct pci_ops rbus_ops = {
-	.read  = rbus_read_config,
-	.write = rbus_write_config,
-};
-
-static int rbus_add_port(struct rbus_dev *rbus,
-				   struct platform_device *pdev)
-{
-	struct pci_bus *bus;
-	struct pci_dev *pci;
-
-	bus = pci_scan_root_bus(&pdev->dev, 0, &rbus_ops,
-				pdev, &rbus->resources);
-
-	if (!bus)
-		return -ENOMEM;
-
-	pci_bus_add_devices(bus);
-
-	pci = pci_scan_single_device(bus, 0);
-
-	if (pci) {
-		/*re-assign hw resource*/
-		pci->irq = rbus->irq;
-		pci->resource[0].start = rbus->res->start;
-		pci->resource[0].end = rbus->res->end;
-	}
-	return 0;
-}
-
-static int rbus_add_res(struct rbus_dev *rbus)
-{
-	struct device *dev = rbus->dev;
-	struct platform_device *pdev = to_platform_device(dev);
-	struct resource bus_range;
-
-	INIT_LIST_HEAD(&rbus->resources);
-	/*resource allocate*/
-	rbus->res  = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	rbus->irq = platform_get_irq(pdev, 0);
-	rbus->base_addr = (unsigned int)rbus->res->start;
-	if (rbus->chip_id == 0x7629)
-		dev_second_irq = platform_get_irq(pdev, 1);
-	else if (rbus->chip_id == 0x7986) {
-		multi_intr_2nd = platform_get_irq(pdev, 1);
-		multi_intr_3rd = platform_get_irq(pdev, 2);
-		multi_intr_4th = platform_get_irq(pdev, 3);
-	}
-
-	pci_add_resource(&rbus->resources, rbus->res);
-
-	bus_range = (struct resource) {
-		.name	= "rbus_range",
-		.start	= 0,
-		.end	= 0xff,
-		.flags	= IORESOURCE_BUS,
-	};
-
-	pci_add_resource(&rbus->resources, &bus_range);
-	return 0;
-}
-
-/*
-*
-*/
-static int rbus_probe(struct platform_device *pdev)
-{
-	struct device_node *node = NULL;
-	struct rbus_dev *rbus;
-
-	node = of_find_compatible_node(NULL, NULL, OF_RBUS_NAME);
-	if (!node)
-		return -ENODEV;
-
-	rbus = devm_kzalloc(&pdev->dev, sizeof(*rbus), GFP_KERNEL);
-	if (!rbus)
-		return -ENOMEM;
-
-	rbus->dev = &pdev->dev;
-
-	if (of_property_read_u32_index(node, "chip_id", 0, &rbus->chip_id)) {
-		rbus->chip_id = RBUS_DEFAULT_CHIP_ID;
-	}
-
-	if (of_property_read_u32_index(node, "vend_id", 0, &rbus->vend_id)) {
-		rbus->vend_id = RBUS_DEFAULT_VEND_ID;
-	}
-	/*set priv_data to pdev*/
-	snprintf(rbus->name,sizeof(rbus->name),"mediatek-rbus");
-	platform_set_drvdata(pdev, rbus);
-	rbus_add_res(rbus);
-	/*init config, need run before add port*/
-	rbus_init_config(rbus);
-	/*add pci bus & device*/
-	rbus_add_port(rbus, pdev);
-	return -ENODEV;
-}
-
-/*
-*
-*/
-static int rbus_remove(struct platform_device *pdev)
-{
-	struct rbus_dev *rbus = platform_get_drvdata(pdev);
-	dev_err(&pdev->dev, "remove rbus name: %s\n", rbus->name);
-	return 0;
-}
-
-
-/*
-* global resource preparing
-*/
-static struct platform_driver rbus_driver = {
-	.probe  = rbus_probe,
-	.remove = rbus_remove,
-	.driver = {
-		.name   = rbus_string,
-		.owner  = THIS_MODULE,
-#ifdef CONFIG_OF
-		.of_match_table = rbus_of_ids,
-#endif /*CONFIG_OF*/
-	},
-};
-
-/* PCIe driver does not allow module unload */
-static int __init rbus_init(void)
-{
-	return platform_driver_probe(&rbus_driver, rbus_probe);
-}
-
-subsys_initcall_sync(rbus_init);
-
-MODULE_DESCRIPTION("Mediatek RBUS host controller driver");
-MODULE_LICENSE("GPL v2");
-
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-declaration.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-declaration.h
index f517e20..70db398 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-declaration.h
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-declaration.h
@@ -13,6 +13,7 @@
  DEVICE_ATTR_DECLARED(RG_USB20_HSTX_SRCTRL);
  DEVICE_ATTR_DECLARED(RG_USB20_DISCTH);
  DEVICE_ATTR_DECLARED(RG_CHGDT_EN);
+ DEVICE_ATTR_DECLARED(reg);
 
  #define HQA_INFORMACTION_COLLECTS() do {\
 	ECHO_HQA(USB20_PHY_USBPHYACR0, RG_USB20_INTR_EN, 1); \
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-statement.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-statement.h
index b929342..e898a26 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-statement.h
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/unusual-statement.h
@@ -13,4 +13,5 @@
 UNUSUAL_DEVICE_ATTR(RG_USB20_HSTX_SRCTRL),
 UNUSUAL_DEVICE_ATTR(RG_USB20_DISCTH),
 UNUSUAL_DEVICE_ATTR(RG_CHGDT_EN),
+UNUSUAL_DEVICE_ATTR(reg),
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-chgdt-en.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-chgdt-en.c
index 13626c1..575680e 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-chgdt-en.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-chgdt-en.c
@@ -21,6 +21,7 @@
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
 	struct usb_hcd *hcd = mtk->hcd;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device_node  *node = dev->of_node;
 	ssize_t cnt = 0;
 	void __iomem *addr;
 	u32 val;
@@ -64,8 +65,8 @@
 			cnt += sprintf(buf + cnt,
 				       "USB20 Port%i: 0x%08X\n", i, val);
 
-			ret = query_phy_addr(dev->of_node,
-						 &index, &io, &length);
+			ret = query_phy_addr(node,
+					 &index, &io, &length, PHY_TYPE_USB2);
 			if (ret && ret != -EACCES) {
 				if (ret == -EPERM)
 					cnt += sprintf(buf + cnt,
@@ -139,7 +140,7 @@
 	hqa_info(mtk, " params: %i %i %s\n",
 		port, index, str);
 
-	ret = query_phy_addr(node, &index, &io, &length);
+	ret = query_phy_addr(node, &index, &io, &length, PHY_TYPE_USB2);
 	if (ret && ret != -EACCES)
 		goto error;
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-discth.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-discth.c
index 66a024a..83a94bd 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-discth.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-discth.c
@@ -21,6 +21,7 @@
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
 	struct usb_hcd *hcd = mtk->hcd;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device_node  *node = dev->of_node;
 	ssize_t cnt = 0;
 	void __iomem *addr;
 	u32 val;
@@ -66,8 +67,8 @@
 			cnt += sprintf(buf + cnt,
 				       "USB20 Port%i: 0x%08X\n", i, val);
 
-			ret = query_phy_addr(dev->of_node,
-						 &index, &io, &length);
+			ret = query_phy_addr(node,
+					&index, &io, &length, PHY_TYPE_USB2);
 			if (ret && ret != -EACCES) {
 				if (ret == -EPERM)
 					cnt += sprintf(buf + cnt,
@@ -141,7 +142,7 @@
 	hqa_info(mtk, " params: %i %i %s\n",
 		port, index, str);
 
-	ret = query_phy_addr(node, &index, &io, &length);
+	ret = query_phy_addr(node, &index, &io, &length, PHY_TYPE_USB2);
 	if (ret && ret != -EACCES)
 		goto error;
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-hstx-srctrl.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-hstx-srctrl.c
index a7791cf..a387798 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-hstx-srctrl.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-hstx-srctrl.c
@@ -21,6 +21,7 @@
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
 	struct usb_hcd *hcd = mtk->hcd;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device_node  *node = dev->of_node;
 	ssize_t cnt = 0;
 	void __iomem *addr;
 	u32 val;
@@ -66,8 +67,8 @@
 			cnt += sprintf(buf + cnt,
 				       "USB20 Port%i: 0x%08X\n", i, val);
 
-			ret = query_phy_addr(dev->of_node,
-						 &index, &io, &length);
+			ret = query_phy_addr(node,
+					 &index, &io, &length, PHY_TYPE_USB2);
 			if (ret && ret != -EACCES) {
 				if (ret == -EPERM)
 					cnt += sprintf(buf + cnt,
@@ -141,7 +142,7 @@
 	hqa_info(mtk, " params: %i %i %s\n",
 		port, index, str);
 
-	ret = query_phy_addr(node, &index, &io, &length);
+	ret = query_phy_addr(node, &index, &io, &length, PHY_TYPE_USB2);
 	if (ret && ret != -EACCES)
 		goto error;
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-intr-en.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-intr-en.c
index acdaf8b..3922c73 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-intr-en.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-intr-en.c
@@ -21,6 +21,7 @@
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
 	struct usb_hcd *hcd = mtk->hcd;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device_node  *node = dev->of_node;
 	ssize_t cnt = 0;
 	void __iomem *addr;
 	u32 val;
@@ -65,8 +66,8 @@
 			cnt += sprintf(buf + cnt,
 				       "USB20 Port%i: 0x%08X\n", i, val);
 
-			ret = query_phy_addr(dev->of_node,
-						 &index, &io, &length);
+			ret = query_phy_addr(node,
+					 &index, &io, &length, PHY_TYPE_USB2);
 			if (ret && ret != -EACCES) {
 				if (ret == -EPERM)
 					cnt += sprintf(buf + cnt,
@@ -140,7 +141,7 @@
 	hqa_info(mtk, " params: %i %i %s\n",
 		port, index, str);
 
-	ret = query_phy_addr(node, &index, &io, &length);
+	ret = query_phy_addr(node, &index, &io, &length, PHY_TYPE_USB2);
 	if (ret && ret != -EACCES)
 		goto error;
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-reg.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-reg.c
new file mode 100644
index 0000000..366747d
--- /dev/null
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-reg.c
@@ -0,0 +1,392 @@
+// SPDX-License-Identifier: GPL-2.0

+/*

+ * xHCI host controller toolkit driver for intr-en

+ *

+ * Copyright (C) 2021  MediaTek Inc.

+ *

+ *  Author: Zhanyong Wang <zhanyong.wang@mediatek.com>

+ */

+

+

+#include <linux/platform_device.h>

+#include <linux/module.h>

+#include <linux/slab.h>

+#include <linux/usb.h>

+#include "xhci-mtk.h"

+#include "xhci-mtk-test.h"

+#include "xhci-mtk-unusual.h"

+

+#define REGS_LIMIT_XHCI 0x1000

+#define REGS_LIMIT_MU3D 0x2e00

+static ssize_t reg_show(struct device *dev,

+			 struct device_attribute *attr, char *buf)

+{

+	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);

+	ssize_t cnt = 0;

+

+	cnt += sprintf(buf + cnt,

+		"SSUSB register operation interface help info.\n"

+		"  rx - read xhci  reg: offset [len]\n"

+		"  rm - read mu3d  reg: offset [len]\n"

+		"  ri - read ippc  reg: offset [len]\n"

+		"  rp - read phy   reg: offset [len]\n"

+		"  wx - write xhci reg: offset value\n"

+		"  wm - write mu3d reg: offset value\n"

+		"  wi - write ippc reg: offset value\n"

+		"  wp - write phy  reg: offset value\n"

+		"  sx - set xhci mac reg bits: offset bit_start mask value\n"

+		"  sm - set mu3d mac reg bits: offset bit_start mask value\n"

+		"  si - set ippc     reg bits: offset bit_start mask value\n"

+		"  sp - set phy      reg bits: offset bit_start mask value\n"

+		"  px - print xhci mac reg bits: offset bit_start mask\n"

+		"  pm - print mu3d mac reg bits: offset bit_start mask\n"

+		"  pi - print ippc     reg bits: offset bit_start mask\n"

+		"  pp - print phy      reg bits: offset bit_start mask\n"

+		"  NOTE: numbers should be HEX, except bit_star(DEC)\n");

+

+	if (mtk->hqa_pos) {

+		cnt += sprintf(buf + cnt, "%s", mtk->hqa_buf);

+		mtk->hqa_pos = 0;

+	}

+

+	return cnt;

+}

+

+/* base address: return value; limit is put into @limit */

+static void __iomem *get_reg_base_limit(struct xhci_hcd_mtk *mtk,

+					const char *buf, u32 *limit)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	struct platform_device *device = to_platform_device(mtk->dev);

+	void __iomem *base = NULL;

+	struct device_node  *node = mtk->dev->of_node;

+	u32 io     = 0;

+	u32 range  = 0;

+	u32 len    = 0;

+	int index  = 0;

+	int ret    = 0;

+

+	switch (buf[1]) {

+	case 'x':

+		ret = query_reg_addr(device, &io, &range, "mac");

+		if (ret) break;

+

+		base = ioremap(io, range);

+

+		xhci_info(xhci, "xhci's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+		hqa_info (mtk,  "xhci's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+		break;

+	case 'm':

+		if (!mtk->has_ippc)

+			device = to_platform_device(device->dev.parent);

+

+		ret = query_reg_addr(device, &io, &range, "mac");

+		if (ret) break;

+

+		if (mtk->has_ippc) {

+			io   += REGS_LIMIT_XHCI;

+			range = REGS_LIMIT_MU3D;

+		}

+

+		base = ioremap(io, range);

+                xhci_info(xhci, "mu3d's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+                hqa_info (mtk,  "mu3d's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+		break;

+	case 'i':

+		ret = query_reg_addr(device, &io, &range, "ippc");

+		if (ret) break;

+

+		base = ioremap(io, range);

+		xhci_info(xhci, "ippc's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+		hqa_info (mtk,  "ippc's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+		break;

+	case 'p':

+		ret = query_phy_addr(node, &index, &io, &len, PHY_TYPE_USB3);

+		if (ret && ret != -EACCES) break;

+

+		range  = io & 0x0000FFFF;

+		range += len;

+

+		io &= 0xFFFF0000;

+

+		base = ioremap(io, range);

+		xhci_info(xhci, "phy's reg: [0x%08X ~ 0x%08X]\n",

+			      io, io + range);

+		hqa_info (mtk,  "phy's reg: [0x%08X ~ 0x%08X]\n",

+			  io, io + range);

+		break;

+	default:

+		base = NULL;

+	}

+

+	*limit = range;

+

+	return base;

+}

+

+static void ssusb_write_reg(struct xhci_hcd_mtk *mtk, const char *buf)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	void __iomem *base;

+	u32 offset = 0;

+	u32 value = 0;

+	u32 old_val = 0;

+	u32 limit = 0;

+	u32 param;

+

+	param = sscanf(buf, "%*s 0x%x 0x%x", &offset, &value);

+	xhci_info(xhci, "params-%d (offset: %#x, value: %#x)\n",

+		  param, offset, value);

+	hqa_info (mtk,  "params-%d (offset: %#x, value: %#x)\n",

+		  param, offset, value);

+

+	base = get_reg_base_limit(mtk, buf, &limit);

+	if (!base || (param != 2)) {

+		xhci_err(xhci, "params are invalid!\n");

+		hqa_info(mtk,  "params are invalid since %p, %u!\n",

+			 base, param);

+		return;

+	}

+

+	offset &= ~0x3;  /* 4-bytes align */

+	if (offset >= limit) {

+		xhci_err(xhci, "reg's offset overrun!\n");

+		hqa_info(mtk,  "reg's offset overrun since %u >= %u!\n",

+			 offset, limit);

+		return;

+	}

+	old_val = readl(base + offset);

+	writel(value, base + offset);

+	xhci_info(xhci, "0x%8.8x : 0x%8.8x --> 0x%8.8x\n", offset, old_val,

+		  readl(base + offset));

+	hqa_info (mtk,  "0x%8.8x : 0x%8.8x --> 0x%8.8x\n", offset, old_val,

+		  readl(base + offset));

+

+	base = (void __iomem *)((unsigned long)base & 0xFFFF0000);

+	iounmap(base);

+}

+

+static void read_single_reg(struct xhci_hcd_mtk *mtk,

+			void __iomem *base, u32 offset, u32 limit)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	u32 value;

+

+	offset &= ~0x3;  /* 4-bytes align */

+	if (offset >= limit) {

+		xhci_err(xhci, "reg's offset overrun!\n");

+		hqa_info(mtk,  "reg's offset overrun since %u >= %u!\n",

+			 offset, limit);

+		return;

+	}

+	value = readl(base + offset);

+	xhci_err(xhci, "0x%8.8x : 0x%8.8x\n", offset, value);

+	hqa_info(mtk,  "0x%8.8x : 0x%8.8x\n", offset, value);

+}

+

+static void read_multi_regs(struct xhci_hcd_mtk *mtk,

+			    void __iomem *base, u32 offset, u32 len, u32 limit)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	int i;

+

+	/* at least 4 ints */

+	offset &= ~0xF;

+	len = (len + 0x3) & ~0x3;

+

+	if (offset + len > limit) {

+		xhci_err(xhci, "reg's offset overrun!\n");

+		hqa_info(mtk,  "reg's offset overrun since %u > %u!\n",

+			 offset + len, limit);

+		return;

+	}

+

+	len >>= 2;

+	xhci_info(xhci, "read regs [%#x, %#x)\n", offset, offset + (len << 4));

+	hqa_info (mtk,  "read regs [%#x, %#x)\n", offset, offset + (len << 4));

+	for (i = 0; i < len; i++) {

+		xhci_err(xhci, "0x%8.8x : 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x\n",

+			offset, readl(base + offset),

+			readl(base + offset + 0x4),

+			readl(base + offset + 0x8),

+			readl(base + offset + 0xc));

+		hqa_info(mtk,  "0x%8.8x : 0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x\n",

+			 offset, readl(base + offset),

+			 readl(base + offset + 0x4),

+			 readl(base + offset + 0x8),

+			 readl(base + offset + 0xc));

+		offset += 0x10;

+	}

+}

+

+static void ssusb_read_regs(struct xhci_hcd_mtk *mtk, const char *buf)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	void __iomem *base;

+	u32 offset = 0;

+	u32 len = 0;

+	u32 limit = 0;

+	u32 param;

+

+	param = sscanf(buf, "%*s 0x%x 0x%x", &offset, &len);

+	xhci_info(xhci, "params-%d (offset: %#x, len: %#x)\n",

+		  param, offset, len);

+	hqa_info (mtk,  "params-%d (offset: %#x, len: %#x)\n",

+		 param, offset, len);

+

+	base = get_reg_base_limit(mtk, buf, &limit);

+	if (!base || !param) {

+		xhci_err(xhci, "params are invalid!\n");

+		hqa_info(mtk,  "params are invalid since %p, %u!\n",

+			 base, param);

+		return;

+	}

+

+	if (param == 1)

+		read_single_reg(mtk, base, offset, limit);

+	else

+		read_multi_regs(mtk, base, offset, len, limit);

+

+	base = (void __iomem *)((unsigned long)base & 0xFFFF0000);

+	iounmap(base);

+}

+

+static void ssusb_set_reg_bits(struct xhci_hcd_mtk *mtk, const char *buf)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	void __iomem *base;

+	u32 offset = 0;

+	u32 bit_start = 0;

+	u32 mask = 0;

+	u32 value = 0;

+	u32 old_val = 0;

+	u32 new_val = 0;

+	u32 limit = 0;

+	u32 param;

+

+	param = sscanf(buf, "%*s 0x%x %d 0x%x 0x%x",

+		       &offset, &bit_start, &mask, &value);

+	xhci_info(xhci, "params-%d (offset:%#x,bit_start:%d,mask:%#x,value:%#x)\n",

+		  param, offset, bit_start, mask, value);

+	hqa_info(mtk,  "params-%d (offset:%#x,bit_start:%d,mask:%#x,value:%#x)\n",

+		 param, offset, bit_start, mask, value);

+

+	base = get_reg_base_limit(mtk, buf, &limit);

+	if (!base || (param != 4) || (bit_start > 31)) {

+		xhci_err(xhci, "params are invalid!\n");

+		hqa_info(mtk,  "params are invalid since %p, %u, %u\n",

+			 base, param, bit_start);

+		return;

+	}

+

+	offset &= ~0x3;  /* 4-bytes align */

+	if (offset >= limit) {

+		xhci_err(xhci, "reg's offset overrun!\n");

+		hqa_info(mtk,  "reg's offset overrun since %u >= %u!\n",

+			 offset, limit);

+		return;

+	}

+	old_val = readl(base + offset);

+	new_val = old_val;

+	new_val &= ~(mask << bit_start);

+	new_val |= (value << bit_start);

+	writel(new_val, base + offset);

+	xhci_info(xhci, "0x%8.8x : 0x%8.8x --> 0x%8.8x\n", offset, old_val,

+		  readl(base + offset));

+	hqa_info (mtk,  "0x%8.8x : 0x%8.8x --> 0x%8.8x\n", offset, old_val,

+		 readl(base + offset));

+

+	base = (void __iomem *)((unsigned long)base & 0xFFFF0000);

+	iounmap(base);

+}

+

+static void ssusb_print_reg_bits(struct xhci_hcd_mtk *mtk, const char *buf)

+{

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+	void __iomem *base;

+	u32 offset = 0;

+	u32 bit_start = 0;

+	u32 mask = 0;

+	u32 old_val = 0;

+	u32 new_val = 0;

+	u32 limit = 0;

+	u32 param;

+

+	param = sscanf(buf, "%*s 0x%x %d 0x%x", &offset, &bit_start, &mask);

+	xhci_info(xhci, "params-%d (offset: %#x, bit_start: %d, mask: %#x)\n",

+		param, offset, bit_start, mask);

+	hqa_info (mtk,  "params-%d (offset: %#x, bit_start: %d, mask: %#x)\n",

+		param, offset, bit_start, mask);

+

+	base = get_reg_base_limit(mtk, buf, &limit);

+	if (!base || (param != 3) || (bit_start > 31)) {

+		xhci_err(xhci, "params are invalid!\n");

+		hqa_info(mtk,  "params are invalid since %p, %u, %u\n",

+			 base, param, bit_start);

+		return;

+	}

+

+	offset &= ~0x3;  /* 4-bytes align */

+	if (offset >= limit) {

+		xhci_err(xhci, "reg's offset overrun!\n");

+		hqa_info(mtk,  "reg's offset overrun since %u >= %u!\n",

+			 offset, limit);

+		return;

+	}

+

+	old_val = readl(base + offset);

+	new_val = old_val;

+	new_val >>= bit_start;

+	new_val &= mask;

+	xhci_info(xhci, "0x%8.8x : 0x%8.8x (0x%x)\n", offset, old_val, new_val);

+	hqa_info (mtk,  "0x%8.8x : 0x%8.8x (0x%x)\n", offset, old_val, new_val);

+

+	base = (void __iomem *)((unsigned long)base & 0xFFFF0000);

+	iounmap(base);

+}

+

+static ssize_t

+reg_store(struct device *dev, struct device_attribute *attr,

+	  const char *buf, size_t n)

+{

+	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);

+	struct usb_hcd *hcd = mtk->hcd;

+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);

+

+	xhci_info(xhci, "cmd:%s\n", buf);

+	hqa_info (mtk,  "cmd:%s\n", buf);

+

+	switch (buf[0]) {

+	case 'w':

+		ssusb_write_reg(mtk, buf);

+		break;

+	case 'r':

+		ssusb_read_regs(mtk, buf);

+		break;

+	case 's':

+		ssusb_set_reg_bits(mtk, buf);

+		break;

+	case 'p':

+		ssusb_print_reg_bits(mtk, buf);

+		break;

+	default:

+		xhci_err(xhci, "No such cmd\n");

+		hqa_info(mtk,  "No such cmd\n");

+	}

+

+	return n;

+}

+DEVICE_ATTR_RW(reg);

diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-term-vref.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-term-vref.c
index 3b40ef9..31861be 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-term-vref.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-term-vref.c
@@ -22,6 +22,7 @@
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
 	struct usb_hcd *hcd = mtk->hcd;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device_node  *node = dev->of_node;
 	ssize_t cnt = 0;
 	void __iomem *addr;
 	u32 val;
@@ -67,8 +68,8 @@
 			cnt += sprintf(buf + cnt,
 				       "USB20 Port%i: 0x%08X\n", i, val);
 
-			ret = query_phy_addr(dev->of_node,
-						 &index, &io, &length);
+			ret = query_phy_addr(node,
+					 &index, &io, &length, PHY_TYPE_USB2);
 			if (ret && ret != -EACCES) {
 				if (ret == -EPERM)
 					cnt += sprintf(buf + cnt,
@@ -143,7 +144,7 @@
 	hqa_info(mtk, " params: %i %i %s\n",
 		port, index, str);
 
-	ret = query_phy_addr(node, &index, &io, &length);
+	ret = query_phy_addr(node, &index, &io, &length, PHY_TYPE_USB2);
 	if (ret && ret != -EACCES)
 		goto error;
 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.c
index 4939e55..36564d2 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.c
@@ -16,6 +16,8 @@
 #include <linux/kobject.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/usb.h>
+#include <linux/usb/hcd.h>
 #include <dt-bindings/phy/phy.h>
 #include "../core/usb.h"
 #include "xhci-mtk.h"
@@ -32,20 +34,50 @@
 				int argc, char **argv);
 static int t_test_enumerate_bus(struct xhci_hcd_mtk *mtk,
 				int argc, char **argv);
+static int t_debug_port(struct xhci_hcd_mtk *mtk, int argc, char **argv);
 static int t_power_u1u2(struct xhci_hcd_mtk *mtk, int argc, char **argv);
 
 #define PORT_PLS_VALUE(p) ((p >> 5) & 0xf)
+/* ip_xhci_cap register */
+#define CAP_U3_PORT_NUM(p)	((p) & 0xff)
+#define CAP_U2_PORT_NUM(p)	(((p) >> 8) & 0xff)
 
 #define MAX_NAME_SIZE 32
 #define MAX_ARG_SIZE 4
 
+struct class_info {
+        int class;
+        char *class_name;
+};
+
+static const struct class_info clas_info[] = {
+        /* max. 5 chars. per name string */
+        {USB_CLASS_PER_INTERFACE,       ">ifc"},
+        {USB_CLASS_AUDIO,               "audio"},
+        {USB_CLASS_COMM,                "comm."},
+        {USB_CLASS_HID,                 "HID"},
+        {USB_CLASS_PHYSICAL,            "PID"},
+        {USB_CLASS_STILL_IMAGE,         "still"},
+        {USB_CLASS_PRINTER,             "print"},
+        {USB_CLASS_MASS_STORAGE,        "stor."},
+        {USB_CLASS_HUB,                 "hub"},
+        {USB_CLASS_CDC_DATA,            "data"},
+        {USB_CLASS_CSCID,               "scard"},
+        {USB_CLASS_CONTENT_SEC,         "c-sec"},
+        {USB_CLASS_VIDEO,               "video"},
+        {USB_CLASS_WIRELESS_CONTROLLER, "wlcon"},
+        {USB_CLASS_MISC,                "misc"},
+        {USB_CLASS_APP_SPEC,            "app."},
+        {USB_CLASS_VENDOR_SPEC,         "vend."},
+        {-1,                            "unk."}         /* leave as last */
+};
+
 struct hqa_test_cmd {
 	char name[MAX_NAME_SIZE];
 	int (*cb_func)(struct xhci_hcd_mtk *mtk, int argc, char **argv);
 	char *discription;
 };
 
-
 struct hqa_test_cmd xhci_mtk_hqa_cmds[] = {
 	{"test.j", &t_test_j, "Test_J"},
 	{"test.k", &t_test_k, "Test_K"},
@@ -56,10 +88,20 @@
 	{"test.enumbus", &t_test_enumerate_bus, "Enumerate Bus"},
 	{"test.getdesc", &t_test_get_device_descriptor,
 				"Get Device Discriptor"},
+	{"test.debug", &t_debug_port, "debug Port infor"},
 	{"pm.u1u2", &t_power_u1u2, "Port U1,U2"},
 	{"", NULL, ""},
 };
 
+static const char *class_decode(const int class)
+{
+        int i;
+
+        for (i = 0; clas_info[i].class != -1; i++)
+                if (clas_info[i].class == class)
+                        break;
+        return clas_info[i].class_name;
+}
 
 int call_hqa_func(struct xhci_hcd_mtk *mtk, char *buf)
 {
@@ -256,6 +298,82 @@
 	return retval;
 }
 
+static void show_string(struct usb_device *udev, char *id, char *string)
+{
+	if (!string)
+		return;
+	dev_info(&udev->dev, "%s: %s\n", id, string);
+}
+
+static void announce_device(struct usb_device *udev)
+{
+	u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
+
+	dev_info(&udev->dev,
+		"New USB device found, idVendor=%04x, idProduct=%04x, bcdDevice=%2x.%02x\n",
+		le16_to_cpu(udev->descriptor.idVendor),
+		le16_to_cpu(udev->descriptor.idProduct),
+		bcdDevice >> 8, bcdDevice & 0xff);
+	dev_info(&udev->dev,
+		"New USB device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
+		udev->descriptor.iManufacturer,
+		udev->descriptor.iProduct,
+		udev->descriptor.iSerialNumber);
+	show_string(udev, "Product", udev->product);
+	show_string(udev, "Manufacturer", udev->manufacturer);
+	show_string(udev, "SerialNumber", udev->serial);
+}
+
+static int t_debug_port(struct xhci_hcd_mtk *mtk, int argc, char **argv)
+{
+	struct usb_hcd *hcd = mtk->hcd;
+	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct usb_device *usb2_rh;
+	struct usb_device *udev;
+	long port_id;
+        const struct usb_device_descriptor *desc;
+        u16 bcdUSB;
+        u16 bcdDevice;
+
+	port_id = 2;
+
+	if (argc > 1 && kstrtol(argv[1], 10, &port_id))
+		xhci_err(xhci, "mu3h %s get port-id failed\n", __func__);
+
+	xhci_err(xhci, "mu3h %s test port%d\n", __func__, (int)port_id);
+
+
+	usb2_rh = hcd->self.root_hub;
+	udev = usb_hub_find_child(usb2_rh, port_id - 1);
+	if (udev == NULL) {
+		xhci_err(xhci, "mu3h %s usb_hub_find_child(..., %i) failed\n", __func__, (int)port_id);
+		return -EPERM;
+	}
+
+	dev_info(&udev->dev, "%s\n", usb_state_string(udev->state));
+	if (udev && udev->state == USB_STATE_CONFIGURED) {
+		announce_device(udev);
+		desc = (const struct usb_device_descriptor *)&udev->descriptor;
+                bcdUSB    = le16_to_cpu(desc->bcdUSB);
+                bcdDevice = le16_to_cpu(desc->bcdDevice);
+
+                dev_info(&udev->dev, "D:  Ver=%2x.%02x Cls=%02x(%-5s) Sub=%02x Prot=%02x MxPS=%2d #Cfgs=%3d\n",
+                        bcdUSB >> 8, bcdUSB & 0xff,
+                        desc->bDeviceClass,
+                        class_decode(desc->bDeviceClass),
+                        desc->bDeviceSubClass,
+                        desc->bDeviceProtocol,
+                        desc->bMaxPacketSize0,
+                        desc->bNumConfigurations);
+
+                dev_info(&udev->dev, "P:  Vendor=%04x ProdID=%04x Rev=%2x.%02x\n",
+                        le16_to_cpu(desc->idVendor),
+                        le16_to_cpu(desc->idProduct),
+                        bcdDevice >> 8, bcdDevice & 0xff);
+	}
+
+	return 0;
+}
 
 static int t_test_suspend(struct xhci_hcd_mtk *mtk, int argc, char **argv)
 {
@@ -447,33 +565,43 @@
 	u32 val;
 	u32 ports;
 	int len = 0;
-	int bufLen = PAGE_SIZE;
 	struct hqa_test_cmd *hqa;
 	int i;
 
-	len += snprintf(buf+len, bufLen-len, "info:\n");
-	len += snprintf(buf+len, bufLen-len,
+	len += sprintf(buf+len, "info:\n");
+	len += sprintf(buf+len,
 			"\techo -n item port-id > hqa\n");
-	len += snprintf(buf+len, bufLen-len,
+	len += sprintf(buf+len,
 			"\tport-id : based on number of usb3-port, e.g.\n");
-	len += snprintf(buf+len, bufLen-len,
+	len += sprintf(buf+len,
 			"\t\txHCI with 1 u3p, 2 u2p: 1st u2p-id is 2(1+1), 2nd is 3\n");
-	len += snprintf(buf+len, bufLen-len, "items:\n");
+	len += sprintf(buf+len, "items:\n");
 
 	for (i = 0; i < ARRAY_SIZE(xhci_mtk_hqa_cmds); i++) {
 		hqa = &xhci_mtk_hqa_cmds[i];
-		len += snprintf(buf+len, bufLen-len,
+		len += sprintf(buf+len,
 				"\t%s: %s\n", hqa->name, hqa->discription);
 	}
 
 	ports = mtk->num_u3_ports + mtk->num_u2_ports;
-	for (i = mtk->num_u3_ports + 1; i <= ports; i++) {
-		addr = &xhci->op_regs->port_power_base +
+	for (i = 1; i <= ports; i++) {
+		addr = &xhci->op_regs->port_status_base +
 			NUM_PORT_REGS * ((i - 1) & 0xff);
 		val = readl(addr);
-		len += snprintf(buf+len, bufLen-len,
-			"USB20 Port%i PORTMSC[31,28] 4b'0000: 0x%08X\n",
-			i, val);
+		if (i <= mtk->num_u3_ports)
+			len += sprintf(buf + len,
+				"USB30 Port%i: 0x%08X\n", i, val);
+		else {
+			len += sprintf(buf + len,
+				"USB20 Port%i: 0x%08X\n", i, val);
+
+			addr = &xhci->op_regs->port_power_base +
+				NUM_PORT_REGS * ((i - 1) & 0xff);
+			val = readl(addr);
+			len += sprintf(buf+len,
+				"USB20 Port%i PORTMSC[31,28] 4b'0000: 0x%08X\n",
+				i, val);
+		}
 	}
 
 	return len;
@@ -511,17 +639,17 @@
 	int ports;
 
 	cnt += sprintf(buf + cnt, "usb3hqa usage:\n");
-	cnt += sprintf(buf + cnt, "	echo u3port >usb3hqa\n");
+	cnt += sprintf(buf + cnt, "	echo [u3port] >usb3hqa\n");
 
 	ports = mtk->num_u3_ports + mtk->num_u2_ports;
 	for (i = 1; i <= ports; i++) {
 		addr = &xhci->op_regs->port_status_base +
 			NUM_PORT_REGS * ((i - 1) & 0xff);
 		val = readl(addr);
-		if (i < mtk->num_u3_ports)
+		if (i <= mtk->num_u3_ports)
 			cnt += sprintf(buf + cnt,
 				"USB30 Port%i: 0x%08X\n", i, val);
-		else 
+		else
 			cnt += sprintf(buf + cnt,
 				"USB20 Port%i: 0x%08X\n", i, val);
 	}
@@ -554,8 +682,8 @@
 	words = sscanf(buf, "%d", &port);
 	if ((words != 1) ||
 	    (port < 1 || port > mtk->num_u3_ports)) {
-		hqa_info(mtk, "usb3hqa: param number:%i, port:%i failure\n",
-			words, port);
+		hqa_info(mtk, "usb3hqa: param number:%i, port:%i (%i) failure\n",
+			words, port, mtk->num_u3_ports);
 		return -EINVAL;
 	}
 
@@ -580,9 +708,16 @@
 
 int hqa_create_attr(struct device *dev)
 {
-	int idx, err = 0;
-	int num = ARRAY_SIZE(mu3h_hqa_attr_list);
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
+	struct usb_hcd *hcd = mtk->hcd;
+	struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs;
+	struct platform_device *device = to_platform_device(dev);
+	int num = ARRAY_SIZE(mu3h_hqa_attr_list);
+	int idx;
+	int err = 0;
+	u32 value;
+	u32 addr = hcd->rsrc_start;
+	u32 length;
 
 	if (dev == NULL || mtk == NULL)
 		return -EINVAL;
@@ -593,6 +728,19 @@
 	if (!mtk->hqa_buf)
 		return -ENOMEM;
 
+	if (!mtk->has_ippc) {
+		err = query_reg_addr(device, &addr, &length, "ippc");
+		if (err)
+			return -EINVAL;
+
+		mtk->ippc_regs = ioremap(addr, length);
+	}
+
+	ippc  = mtk->ippc_regs;
+	value = readl(&ippc->ip_xhci_cap);
+	mtk->num_u3_ports = CAP_U3_PORT_NUM(value);
+	mtk->num_u2_ports = CAP_U2_PORT_NUM(value);
+
 	for (idx = 0; idx < num; idx++) {
 		err = device_create_file(dev, mu3h_hqa_attr_list[idx]);
 		if (err)
@@ -614,4 +762,8 @@
 	kfree(mtk->hqa_buf);
 	mtk->hqa_size = 0;
 	mtk->hqa_pos  = 0;
+	if (!mtk->has_ippc) {
+		iounmap(mtk->ippc_regs);
+		mtk->ippc_regs = NULL;
+	}
 }
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.h
index 83e1542..7f76d29 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.h
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-test.h
@@ -15,6 +15,8 @@
 #ifdef CONFIG_USB_XHCI_MTK_DEBUGFS
 int hqa_create_attr(struct device *dev);
 void hqa_remove_attr(struct device *dev);
+void ssusb_remap_ip_regs(struct device *dev);
+
 #else
 static inline int hqa_create_attr(struct device *dev)
 {
@@ -23,5 +25,8 @@
 static inline void hqa_remove_attr(struct device *dev)
 {
 }
+static inline void ssusb_remap_ip_regs(struct device *dev)
+{
+}
 #endif
 #endif /* __XHCI_MTK_TEST_H */
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.c
index 14d7d0b..01029fb 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.c
@@ -13,7 +13,6 @@
 #include <linux/usb.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <dt-bindings/phy/phy.h>
 #include "xhci-mtk.h"
 #include "xhci-mtk-test.h"
 #include "xhci-mtk-unusual.h"
@@ -127,42 +126,81 @@
 	return value;
 }
 
-int query_phy_addr(struct device_node *np, int *start, u32 *addr, u32 *length)
+int query_phy_addr(struct device_node *np, int *start, u32 *addr, u32 *length, int type)
 {
 	int ret = -EPERM;
 	struct of_phandle_args args;
 	struct resource res;
+	struct device_node  *node = np;
 	int numphys = 0;
 	int index;
 
-	if (start == NULL || addr == NULL || length == NULL)
+	if (np == NULL || start == NULL || addr == NULL || length == NULL)
 		return -EINVAL;
 
-	numphys = of_count_phandle_with_args(np, "phys", "#phy-cells");
-	for ( index = *start; (numphys > 0) && index < numphys; index++) {
-		ret = of_parse_phandle_with_args(np, "phys", "#phy-cells",
+	while (node) {
+		numphys = of_count_phandle_with_args(node,
+			"phys", "#phy-cells");
+		for (index = *start;
+		     (numphys > 0) && index < numphys; index++) {
+			ret = of_parse_phandle_with_args(node,
+				"phys", "#phy-cells",
 				index, &args);
-		if (ret < 0)
-			break;
+			if (ret < 0)
+				break;
+
+			if (args.args[0] == type) {
+				ret = of_address_to_resource(args.np,
+					0, &res);
+				if (ret < 0) {
+					of_node_put(args.np);
+					break;
+				}
 
-		if (args.args[0] == PHY_TYPE_USB2) {
-			ret = of_address_to_resource(args.np, 0, &res);
-			if (ret < 0) {
+				*addr   = res.start;
+				*length = (u32)resource_size(&res);
+				*start  = index;
+				if (!of_device_is_available(args.np))
+					ret = -EACCES;
+
 				of_node_put(args.np);
 				break;
 			}
+		}
+		if (index < numphys)
+			break;
 
-			*addr   = res.start;
-			*length = (u32)resource_size(&res);
-			*start  = index;
-			if (!of_device_is_available(args.np))
-				ret = -EACCES;
+		node = node->parent;
+	}
+
+	ret = index < numphys ? ret : -EPERM;
+	return ret;
+}
 
-			of_node_put(args.np);
+int query_reg_addr(struct platform_device *pdev, u32 *addr, u32 *length, const char* name)
+{
+	int ret = -EPERM;
+	struct resource *pres;
+	struct platform_device *device = pdev;
+
+	if (pdev == NULL || addr == NULL || length == NULL)
+		return -EINVAL;
+
+	while (device) {
+		pres = platform_get_resource_byname(device, IORESOURCE_MEM, name);
+		if (pres != NULL) {
+			*addr   = pres->start;
+			*length = (u32)resource_size(pres);
+			ret = 0;
 			break;
 		}
+
+		if (device->dev.parent == NULL)
+			break;
+
+		device = to_platform_device(device->dev.parent);
 	}
 
-	ret = index < numphys ? ret : -EPERM;
 	return ret;
 }
+
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.h
index ddbf4e3..0bc6dd8 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.h
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-unusual.h
@@ -10,6 +10,8 @@
 #ifndef __XHCI_MTK_UNUSUAL_H
 #define __XHCI_MTK_UNUSUAL_H
 
+#include <dt-bindings/phy/phy.h>
+
 #define HQA_PREFIX_SIZE		4*1024
 
 #define BIT_WIDTH_1		1
@@ -131,7 +133,10 @@
 				u32 shift, const char *buf);
 u32 bin2str(u32 value, u32 width, char *buffer);
 int query_phy_addr(struct device_node *np, int *start,
-				u32 *addr, u32 *length);
+				u32 *addr, u32 *length, int type);
+int query_reg_addr(struct platform_device *pdev, u32 *addr,
+				u32 *length, const char* name);
+
 static inline int remaining(struct xhci_hcd_mtk *mtk)
 {
 	u32 surplus = 0;
@@ -178,7 +183,12 @@
 	return 0;
 };
 static inline int query_phy_addr(struct device_node *np, int *start,
-					u32 *addr, u32 *length)
+					u32 *addr, u32 *length, int type)
+{
+	return -EPERM;
+}
+static inline int query_reg_addr(struct platform_device *pdev, u32 *addr,
+					u32 *length, const char* name)
 {
 	return -EPERM;
 }
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-vrt-vref.c b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-vrt-vref.c
index ec0ef75..1a6d611 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-vrt-vref.c
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/drivers/usb/host/xhci-mtk-vrt-vref.c
@@ -21,6 +21,7 @@
 	struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev);
 	struct usb_hcd *hcd = mtk->hcd;
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device_node  *node = dev->of_node;
 	ssize_t cnt = 0;
 	void __iomem *addr;
 	u32 val;
@@ -66,8 +67,8 @@
 			cnt += sprintf(buf + cnt,
 				       "USB20 Port%i: 0x%08X\n", i, val);
 
-			ret = query_phy_addr(dev->of_node,
-						 &index, &io, &length);
+			ret = query_phy_addr(node,
+					 &index, &io, &length, PHY_TYPE_USB2);
 			if (ret && ret != -EACCES) {
 				if (ret == -EPERM)
 					cnt += sprintf(buf + cnt,
@@ -95,7 +96,7 @@
 	}
 
 	if (mtk->hqa_pos) {
-		cnt += sprintf(buf + cnt, "%s", mtk->hqa_buf);          
+		cnt += sprintf(buf + cnt, "%s", mtk->hqa_buf);
 		mtk->hqa_pos = 0;
 	}
 
@@ -142,8 +143,8 @@
 	hqa_info(mtk, " params: %i %i %s\n",
 		port, index, str);
 
-	ret = query_phy_addr(node, &index, &io, &length);
-	if (ret && ret != -EACCES) 
+	ret = query_phy_addr(node, &index, &io, &length, PHY_TYPE_USB2);
+	if (ret && ret != -EACCES)
 		goto error;
 
 	io += (length != 0x100) ? 0x300 : 0;
@@ -156,7 +157,7 @@
 
 	iounmap(addr);
 	ret = n;
-      
+
 error:
 	kfree(str);
 	return ret;
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/mtk_nl80211_inc/mtk_vendor_nl80211.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/mtk_nl80211_inc/mtk_vendor_nl80211.h
deleted file mode 100755
index 22ada41..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/mtk_nl80211_inc/mtk_vendor_nl80211.h
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- * Copyright (c) [2020], MediaTek Inc. All rights reserved.
- *
- * This software/firmware and related documentation ("MediaTek Software") are
- * protected under relevant copyright laws.
- * The information contained herein is confidential and proprietary to
- * MediaTek Inc. and/or its licensors.
- * Except as otherwise provided in the applicable licensing terms with
- * MediaTek Inc. and/or its licensors, any reproduction, modification, use or
- * disclosure of MediaTek Software, and information contained herein, in whole
- * or in part, shall be strictly prohibited.
-*/
-
-#ifndef __MTK_VENDOR_NL80211_H
-#define __MTK_VENDOR_NL80211_H
-/*
- * This header file defines the userspace API to the wireless stack. Please
- * be careful not to break things - i.e. don't move anything around or so
- * unless you can demonstrate that it breaks neither API nor ABI.
- *
- */
-
-#include <linux/types.h>
-
-#ifndef GNU_PACKED
-#define GNU_PACKED  __attribute__ ((packed))
-#endif /* GNU_PACKED */
-
-#define MTK_NL80211_VENDOR_ID	0x0ce7
-
-/**
- * enum mtk_nl80211_vendor_commands - supported mtk nl80211 vendor commands
- *
- * @MTK_NL80211_VENDOR_SUBCMD_UNSPEC: Reserved value 0
- * @MTK_NL80211_VENDOR_SUBCMD_TEST: Test for nl80211command/event
- * @MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0x000000ae:
- * @MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0x000000c2:
- * @MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL:
- * @MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_DOT11V_WNM:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_WAPP:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_CH_MONITOR:
- * @MTK_NL80211_VENDOR_SUBCMD_BSS_INFO:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_MAP_R3:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_HS_ANQP_RSP:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_HS:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_OFFCH_SCAN:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_DFS_INFO:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_WSC:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_MBO_MSG:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_RRM_COMMAND:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_QOS:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_CAP: command to get capability information
- *  from wifi driver, it requres mtk_nl80211_vendor_attr_get_cap attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_GET_RUNTIME_INFO: command to get run time information
- *  from wifi driver, it requres mtk_nl80211_vendor_attr_get_runtime_info attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_GET_STATISTIC: command to get statistic information
- *  from wifi driver, it requres mtk_nl80211_vendor_attr_get_static_info attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_GET_SRG_BITMAP:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_STATIC_INFO:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_WNM:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_HS:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_WSC:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_DFS_ZERO_WAIT:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_FRAME:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_APCLI_INFO:
- * @MTK_NL80211_VENDOR_SUBCMD_BBP:
- * @MTK_NL80211_VENDOR_SUBCMD_MAC: command to set or get mac register
- *  information to/from wifi driver, require mtk_nl80211_vendor_attrs_mac
- *  attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_E2P:
- * @MTK_NL80211_VENDOR_SUBCMD_ATE:
- * @MTK_NL80211_VENDOR_SUBCMD_STATISTICS: command to get statistic information
- *  in string from wifi driver, this command is used to be compatible with
- *  old iwpriv stat command, it requres mtk_nl80211_vendor_attrs_statistics
- *  attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_ADD_PMKID_CACHE:
- * @MTK_NL80211_VENDOR_SUBCMD_RADIUS_DATA:
- * @MTK_NL80211_VENDOR_SUBCMD_GSITESURVEY:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_MAC_TABLE:
- * @MTK_NL80211_VENDOR_SUBCMD_STATIC_WEP_COPY:
- * @MTK_NL80211_VENDOR_SUBCMD_WSC_PROFILE:
- * @MTK_NL80211_VENDOR_SUBCMD_RF:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_WSC_PROFILE_U32_ITEM:
- * @MTK_NL80211_VENDOR_SUBCMD_QUERY_BATABLE:
- * @MTK_NL80211_VENDOR_SUBCMD_RD:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_FT_PARAM:
- * @MTK_NL80211_VENDOR_SUBCMD_SET_WSCOOB:
- * @MTK_NL80211_VENDOR_SUBCMD_WSC_CALLBACK:
- * @MTK_NL80211_VENDOR_SUBCMD_RX_STATISTICS:
- * @MTK_NL80211_VENDOR_SUBCMD_GET_DRIVER_INFO:
- * @MTK_NL80211_VENDOR_SUBCMD_STA_VLAN:
- * @MTK_NL80211_VENDOR_SUBCMD_PHY_STATE:
- * @MTK_NL80211_VENDOR_SUBCMD_VENDOR_SET: command to set old iwpriv set command
- *  string to wifi driver, it requires mtk_nl80211_vendor_attrs_vendor_set attributes,
- *  please note that this command is just used to be compatible with old iwpriv
- *  set command, and it will be discarded in some time.
- *
- * @MTK_NL80211_VENDOR_SUBCMD_VENDOR_SHOW: command to set old iwpriv show command
- *  string to wifi driver, require mtk_nl80211_vendor_attrs_vendor_show attributes,
- *  please note that this command is just used to be compatible with old iwpriv
- *  show command, and it will be discarded in some time.
- *
- * @MTK_NL80211_VENDOR_SUBCMD_HS:
- * @MTK_NL80211_VENDOR_SUBCMD_WNM:
- * @MTK_NL80211_VENDOR_SUBCMD_MBO_MSG:
- * @MTK_NL80211_VENDOR_SUBCMD_NEIGHBOR_REPORT:
- * @MTK_NL80211_VENDOR_SUBCMD_OFFCHANNEL_INFO:
- * @MTK_NL80211_VENDOR_SUBCMD_OCE_MSG:
- * @MTK_NL80211_VENDOR_SUBCMD_WAPP_REQ: command to set or get wapp requred
- *  information from wifi driver, require mtk_nl80211_vendor_attr_wapp_req attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_SET_AP_SECURITY: command to set ap security configurations
- *  to a specific bss in wifi driver, it requires mtk_nl80211_vendor_attrs_ap_security
- *  attributes.
- * @MTK_NL80211_VENDOR_SUBCMD_SET_AP_VOW:  command to set ap vow configurations
- *  it requires mtk_nl80211_vendor_attrs_ap_vow attributes.
- * @MTK_NL80211_VENDOR_CMD_MAX: highest used command number
- * @__MTK_NL80211_VENDOR_CMD_AFTER_LAST: internal use
- */
-enum mtk_nl80211_vendor_commands {
-	MTK_NL80211_VENDOR_SUBCMD_UNSPEC = 0,
-	MTK_NL80211_VENDOR_SUBCMD_TEST = 1,
-
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0x000000ae,
-	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0x000000c2,
-	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL,
-	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL,
-	MTK_NL80211_VENDOR_SUBCMD_SET_DOT11V_WNM,
-	MTK_NL80211_VENDOR_SUBCMD_SET_WAPP,
-	MTK_NL80211_VENDOR_SUBCMD_SET_CH_MONITOR,
-	MTK_NL80211_VENDOR_SUBCMD_BSS_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_SET_MAP_R3,
-	MTK_NL80211_VENDOR_SUBCMD_SET_HS_ANQP_RSP,
-	MTK_NL80211_VENDOR_SUBCMD_SET_HS,
-	MTK_NL80211_VENDOR_SUBCMD_SET_OFFCH_SCAN,
-	MTK_NL80211_VENDOR_SUBCMD_SET_DFS_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_SET_WSC,
-	MTK_NL80211_VENDOR_SUBCMD_SET_MBO_MSG,
-	MTK_NL80211_VENDOR_SUBCMD_SET_RRM_COMMAND,
-	MTK_NL80211_VENDOR_SUBCMD_SET_QOS,
-	MTK_NL80211_VENDOR_SUBCMD_GET_CAP,
-	MTK_NL80211_VENDOR_SUBCMD_GET_RUNTIME_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_GET_STATISTIC,
-	MTK_NL80211_VENDOR_SUBCMD_GET_SRG_BITMAP,
-	MTK_NL80211_VENDOR_SUBCMD_GET_STATIC_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_GET_WNM,
-	MTK_NL80211_VENDOR_SUBCMD_GET_HS,
-	MTK_NL80211_VENDOR_SUBCMD_GET_WSC,
-	MTK_NL80211_VENDOR_SUBCMD_GET_DFS_ZERO_WAIT,
-	MTK_NL80211_VENDOR_SUBCMD_GET_FRAME,
-	MTK_NL80211_VENDOR_SUBCMD_GET_APCLI_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_BBP,
-	MTK_NL80211_VENDOR_SUBCMD_MAC,
-	MTK_NL80211_VENDOR_SUBCMD_E2P,
-	MTK_NL80211_VENDOR_SUBCMD_ATE,
-	MTK_NL80211_VENDOR_SUBCMD_STATISTICS,
-	MTK_NL80211_VENDOR_SUBCMD_ADD_PMKID_CACHE,
-	MTK_NL80211_VENDOR_SUBCMD_RADIUS_DATA,
-	MTK_NL80211_VENDOR_SUBCMD_GSITESURVEY,
-	MTK_NL80211_VENDOR_SUBCMD_GET_MAC_TABLE,
-	MTK_NL80211_VENDOR_SUBCMD_STATIC_WEP_COPY,
-	MTK_NL80211_VENDOR_SUBCMD_WSC_PROFILE  ,
-	MTK_NL80211_VENDOR_SUBCMD_RF,
-	MTK_NL80211_VENDOR_SUBCMD_SET_WSC_PROFILE_U32_ITEM,
-	MTK_NL80211_VENDOR_SUBCMD_QUERY_BATABLE,
-	MTK_NL80211_VENDOR_SUBCMD_RD,
-	MTK_NL80211_VENDOR_SUBCMD_SET_FT_PARAM,
-	MTK_NL80211_VENDOR_SUBCMD_SET_WSCOOB,
-	MTK_NL80211_VENDOR_SUBCMD_WSC_CALLBACK,
-	MTK_NL80211_VENDOR_SUBCMD_RX_STATISTICS,
-	MTK_NL80211_VENDOR_SUBCMD_GET_DRIVER_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_STA_VLAN,
-	MTK_NL80211_VENDOR_SUBCMD_PHY_STATE,
-	MTK_NL80211_VENDOR_SUBCMD_VENDOR_SET,
-	MTK_NL80211_VENDOR_SUBCMD_VENDOR_SHOW,
-	MTK_NL80211_VENDOR_SUBCMD_HS,
-	MTK_NL80211_VENDOR_SUBCMD_WNM,
-	MTK_NL80211_VENDOR_SUBCMD_MBO_MSG,
-	MTK_NL80211_VENDOR_SUBCMD_NEIGHBOR_REPORT,
-	MTK_NL80211_VENDOR_SUBCMD_OFFCHANNEL_INFO,
-	MTK_NL80211_VENDOR_SUBCMD_OCE_MSG,
-	MTK_NL80211_VENDOR_SUBCMD_WAPP_REQ,
-	MTK_NL80211_VENDOR_SUBCMD_SET_AP_SECURITY,
-	MTK_NL80211_VENDOR_SUBCMD_SET_AP_VOW,
-	/* add new commands above here */
-	/* used to define NL80211_CMD_MAX below */
-	__MTK_NL80211_VENDOR_CMD_AFTER_LAST,
-	MTK_NL80211_VENDOR_CMD_MAX = __MTK_NL80211_VENDOR_CMD_AFTER_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_events - MediaTek nl80211 asynchoronous event identifiers
- *
- * @MTK_NL80211_VENDOR_EVENT_UNSPEC: Reserved value 0
- *
- * @MTK_NL80211_VENDOR_EVENT_TEST: Test for nl80211command/event
- */
-enum mtk_nl80211_vendor_events {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_EVENT_UNSPEC = 0,
-	MTK_NL80211_VENDOR_EVENT_TEST,
-
-	MTK_NL80211_VENDOR_EVENT_RSP_WAPP_EVENT,
-
-	/* add new events above here */
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_test - Specifies the values for vendor test
- * command MTK_NL80211_VENDOR_ATTR_TEST
- * @MTK_NL80211_VENDOR_ATTR_TEST:enable nl80211 test
- */
-enum mtk_nl80211_vendor_attr_test {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_TEST_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_TEST,
-
-	__MTK_NL80211_VENDOR_ATTR_TEST_LAST,
-	MTK_NL80211_VENDOR_ATTR_TEST_MAX =
-	__MTK_NL80211_VENDOR_ATTR_TEST_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_event_test - Specifies the values for vendor test
- * event MTK_NL80211_VENDOR_ATTR_TEST
- * @MTK_NL80211_VENDOR_ATTR_TEST:receive nl80211 test event
- */
-enum mtk_nl80211_vendor_attr_event_test {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_EVENT_TEST_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_EVENT_TEST,
-
-	__MTK_NL80211_VENDOR_ATTR_EVENT_TEST_LAST,
-	MTK_NL80211_VENDOR_ATTR_EVENT_TEST_MAX =
-	__MTK_NL80211_VENDOR_ATTR_EVENT_TEST_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attrs_wnm - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_SET_DOT11V_WNM.
- * Information in these attributes is used to set/get wnm information
- * to/from driver from/to user application.
- *
- * @MTK_NL80211_VENDOR_ATTR_WNM_CMD:
- * @MTK_NL80211_VENDOR_ATTR_WNM_BTM_REQ: BTM request frame
- * @MTK_NL80211_VENDOR_ATTR_WNM_BTM_RSP:
- */
-enum mtk_nl80211_vendor_attrs_dot11v_wnm {
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_DOT11V_WNM_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_DOT11V_WNM_CMD,
-	MTK_NL80211_VENDOR_ATTR_DOT11V_WNM_BTM_REQ,
-	MTK_NL80211_VENDOR_ATTR_DOT11V_WNM_BTM_RSP,
-	/* add attributes here, update the policy in nl80211.c */
-
-	__MTK_NL80211_VENDOR_ATTR_DOT11V_WNM_AFTER_LAST,
-	MTK_NL80211_VENDOR_DOT11V_WNM_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_DOT11V_WNM_AFTER_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attrs_vendor_set - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_VENDOR_SET.
- * Information in these attributes is used to set information
- * to driver from user application.
- *
- * @MTK_NL80211_VENDOR_ATTR_VENDOR_SET_CMD_STR: command string
- */
-enum mtk_nl80211_vendor_attrs_vendor_set {
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SET_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SET_CMD_STR,
-	/* add attributes here, update the policy in nl80211.c */
-
-	__MTK_NL80211_VENDOR_ATTR_VENDOR_SET_AFTER_LAST,
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SET_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_VENDOR_SET_AFTER_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attrs_vendor_show - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_VENDOR_SHOW.
- * Information in these attributes is used to get information
- * from driver to user application.
- *
- * @MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_CMD_STR: command string
- * @MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_RSP_STR: show rsp string buffer
- */
-enum mtk_nl80211_vendor_attrs_vendor_show {
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_CMD_STR,
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_RSP_STR,
-	/* add attributes here, update the policy in nl80211.c */
-
-	__MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_AFTER_LAST,
-	MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_VENDOR_SHOW_AFTER_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attrs_statistics - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_STATISTICS.
- * Information in these attributes is used to get wnm information
- * to/from driver from/to user application.
- *
- * @MTK_NL80211_VENDOR_ATTR_STATISTICS_STR: statistic information string
- */
-enum mtk_nl80211_vendor_attrs_statistics {
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_STATISTICS_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_STATISTICS_STR,
-	/* add attributes here, update the policy in nl80211.c */
-
-	__MTK_NL80211_VENDOR_ATTR_STATISTICS_AFTER_LAST,
-	MTK_NL80211_VENDOR_ATTR_STATISTICS_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_STATISTICS_AFTER_LAST - 1
-};
-
-/**
- * structure mac_param - This structure defines the payload format of
- * MTK_NL80211_VENDOR_ATTR_MAC_WRITE_PARAM and MTK_NL80211_VENDOR_ATTR_MAC_SHOW_PARAM.
- * Information in this structure is used to get/set mac register information
- * from/to driver.
- *
- * @start: start mac address
- * @end: end mac address
- * @value: value for the mac register
- */
-struct GNU_PACKED mac_param {
-	unsigned int start;
-	unsigned int end;
-	unsigned int value;
-};
-
-/**
- * enum mtk_nl80211_vendor_attrs_mac - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_MAC.
- * Information in these attributes is used to get/set mac information
- * from/to driver.
- *
- * @MTK_NL80211_VENDOR_ATTR_MAC_WRITE_PARAM: params, refer to struct GNU_PACKED mac_param
- * @MTK_NL80211_VENDOR_ATTR_MAC_SHOW_PARAM: params, refer to struct GNU_PACKED mac_param
- * @MTK_NL80211_VENDOR_ATTR_MAC_RSP_STR: RSP string
- */
-enum mtk_nl80211_vendor_attrs_mac {
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_MAC_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_MAC_WRITE_PARAM,
-	MTK_NL80211_VENDOR_ATTR_MAC_SHOW_PARAM,
-	MTK_NL80211_VENDOR_ATTR_MAC_RSP_STR,
-	/* add attributes here, update the policy in nl80211.c */
-
-	__MTK_NL80211_VENDOR_ATTR_MAC_AFTER_LAST,
-	MTK_NL80211_VENDOR_ATTR_MAC_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_MAC_AFTER_LAST - 1
-};
-
-/**
- * enum mtk_vendor_attr_authmode - This enum defines the value of
- * MTK_NL80211_VENDOR_ATTR_AP_SECURITY_AUTHMODE.
- * Information in these attributes is used set auth mode of a specific bss.
- */
-enum mtk_vendor_attr_authmode {
-	NL80211_AUTH_OPEN,
-	NL80211_AUTH_SHARED,
-	NL80211_AUTH_WEPAUTO,
-	NL80211_AUTH_WPA,
-	NL80211_AUTH_WPAPSK,
-	NL80211_AUTH_WPANONE,
-	NL80211_AUTH_WPA2,
-	NL80211_AUTH_WPA2MIX,
-	NL80211_AUTH_WPA2PSK,
-	NL80211_AUTH_WPA3,
-	NL80211_AUTH_WPA3_192,
-	NL80211_AUTH_WPA3PSK,
-	NL80211_AUTH_WPA2PSKWPA3PSK,
-	NL80211_AUTH_WPA2PSKMIXWPA3PSK,
-	NL80211_AUTH_WPA1WPA2,
-	NL80211_AUTH_WPAPSKWPA2PSK,
-	NL80211_AUTH_WPA_AES_WPA2_TKIPAES,
-	NL80211_AUTH_WPA_AES_WPA2_TKIP,
-	NL80211_AUTH_WPA_TKIP_WPA2_AES,
-	NL80211_AUTH_WPA_TKIP_WPA2_TKIPAES,
-	NL80211_AUTH_WPA_TKIPAES_WPA2_AES,
-	NL80211_AUTH_WPA_TKIPAES_WPA2_TKIPAES,
-	NL80211_AUTH_WPA_TKIPAES_WPA2_TKIP,
-	NL80211_AUTH_OWE,
-	NL80211_AUTH_FILS_SHA256,
-	NL80211_AUTH_FILS_SHA384,
-	NL80211_AUTH_WAICERT,
-	NL80211_AUTH_WAIPSK,
-	NL80211_AUTH_DPP,
-	NL80211_AUTH_DPPWPA2PSK,
-	NL80211_AUTH_DPPWPA3PSK,
-	NL80211_AUTH_DPPWPA3PSKWPA2PSK,
-	NL80211_AUTH_WPA2_ENT_OSEN
-};
-
-/**
- * enum mtk_vendor_attr_encryptype - This enum defines the value of
- * MTK_NL80211_VENDOR_ATTR_AP_SECURITY_ENCRYPTYPE.
- * Information in these attributes is used set encryption type of a specific bss.
- */
-enum mtk_vendor_attr_encryptype {
-	NL80211_ENCRYPTYPE_NONE,
-	NL80211_ENCRYPTYPE_WEP,
-	NL80211_ENCRYPTYPE_TKIP,
-	NL80211_ENCRYPTYPE_AES,
-	NL80211_ENCRYPTYPE_CCMP128,
-	NL80211_ENCRYPTYPE_CCMP256,
-	NL80211_ENCRYPTYPE_GCMP128,
-	NL80211_ENCRYPTYPE_GCMP256,
-	NL80211_ENCRYPTYPE_TKIPAES,
-	NL80211_ENCRYPTYPE_TKIPCCMP128,
-	NL80211_ENCRYPTYPE_WPA_AES_WPA2_TKIPAES,
-	NL80211_ENCRYPTYPE_WPA_AES_WPA2_TKIP,
-	NL80211_ENCRYPTYPE_WPA_TKIP_WPA2_AES,
-	NL80211_ENCRYPTYPE_WPA_TKIP_WPA2_TKIPAES,
-	NL80211_ENCRYPTYPE_WPA_TKIPAES_WPA2_AES,
-	NL80211_ENCRYPTYPE_WPA_TKIPAES_WPA2_TKIPAES,
-	NL80211_ENCRYPTYPE_WPA_TKIPAES_WPA2_TKIP,
-	NL80211_ENCRYPTYPE_SMS4
-};
-
-#define MAX_WEP_KEY_LEN 32
-/**
- * structure wep_key_param - This structure defines the payload format of
- * MTK_NL80211_VENDOR_ATTR_AP_SECURITY_WEPKEY. Information in this structure
- * is used to set wep key information to a specific bss in wifi driver.
- *
- * @key_idx: key index
- * @key_len: key length
- * @key: key value
- */
-struct GNU_PACKED wep_key_param {
-	unsigned char key_idx;
-	unsigned int key_len;
-	unsigned char key[MAX_WEP_KEY_LEN];
-};
-
-/**
- * structure vow_group_en_param - This structure defines the payload format of
- * MTK_NL80211_VENDOR_ATTR_AP_VOW_ATC_EN_INFO &
- * MTK_NL80211_VENDOR_ATTR_AP_VOW_BW_CTL_EN_INFO.
- * Information in this structure is used to set vow airtime control enable configuration
- * to a specific group in wifi driver.
- *
- * @group: vow group
- * @en: Enable/Disable
- */
-struct GNU_PACKED vow_group_en_param {
-	unsigned int group;
-	unsigned int en;
-};
-
-/**
- * structure vow_group_en_param - This structure defines the payload format of
- * MTK_NL80211_VENDOR_ATTR_AP_VOW_MIN_RATE_INFO &
- * MTK_NL80211_VENDOR_ATTR_AP_VOW_MAX_RATE_INFO.
- * Information in this structure is used to set vow airtime rate configuration
- * to a specific group in wifi driver.
- *
- * @group: vow group
- * @rate: vow rate
- */
-struct GNU_PACKED vow_rate_param {
-	unsigned int group;
-	unsigned int rate;
-};
-
-/**
- * structure vow_group_en_param - This structure defines the payload format of
- * MTK_NL80211_VENDOR_ATTR_AP_VOW_MIN_RATIO_INFO &
- * MTK_NL80211_VENDOR_ATTR_AP_VOW_MAX_RATIO_INFO.
- * Information in this structure is used to set vow airtime ratio configuration
- * to a specific group in wifi driver.
- *
- * @group: vow group
- * @ratio: vow ratio
- */
-struct GNU_PACKED vow_ratio_param {
-	unsigned int group;
-	unsigned int ratio;
-};
-
-/**
- * enum mtk_nl80211_vendor_attrs_ap_vow - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_SET_AP_VOW.
- * Information in these attributes is used to set vow configuration
- * to driver from user application.
- *
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_ATF_EN_INFO: u8, air time fairness enable attributes
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_ATC_EN_INFO: refer to vow_group_en_param
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_BW_EN_INFO: u8, air time bw enalbe attributes
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_BW_CTL_EN_INFO: refer to vow_group_en_param
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_MIN_RATE_INFO: refer to vow_rate_param
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_MAX_RATE_INFO: refer to vow_rate_param
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_MIN_RATIO_INFO: refer to vow_ratio_param
- * @MTK_NL80211_VENDOR_ATTR_AP_VOW_MAX_RATIO_INFO: refer to vow_ratio_param
- */
-enum mtk_nl80211_vendor_attrs_ap_vow{
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_ATF_EN_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_ATC_EN_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_BW_EN_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_BW_CTL_EN_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_MIN_RATE_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_MAX_RATE_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_MIN_RATIO_INFO,
-	MTK_NL80211_VENDOR_ATTR_AP_VOW_MAX_RATIO_INFO,
-	__MTK_NL80211_VENDOR_ATTR_AP_VOW_AFTER_LAST,
-	MTK_NL80211_VENDOR_AP_VOW_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_AP_VOW_AFTER_LAST - 1
-};
-/**
- * enum mtk_nl80211_vendor_attrs_ap_security - This enum defines
- * attributes required for MTK_NL80211_VENDOR_SUBCMD_SET_AP_SECURITY.
- * Information in these attributes is used to set security information
- * to driver from user application.
- *
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_AUTHMODE:  u32, auth mode attributes, refer to mtk_vendor_attr_authmode
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_ENCRYPTYPE: u32, encryptype, refer to mtk_vendor_attr_encryptype
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_REKEYINTERVAL: u32, rekey interval in seconds
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_REKEYMETHOD: u8, 0-by time, 1-by pkt count
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_DEFAULTKEYID: u8, default key index
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_WEPKEY: refer to wep_key_param
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PASSPHRASE: string
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PMF: u8 1-support pmf, 0-not support pmf
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PMF_REQUIRE: u8 1-pmf is required, 0-pmf is not required
- * @MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PMF_SHA256: u8 1-pmfsha256 is desired, 0-pmfsha256 is not desired
- */
-enum mtk_nl80211_vendor_attrs_ap_security {
-/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_INVALID = 0,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_AUTHMODE,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_ENCRYPTYPE,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_REKEYINTERVAL,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_REKEYMETHOD,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_DEFAULTKEYID,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_WEPKEY,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PASSPHRASE,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PMF_CAPABLE,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PMF_REQUIRE,
-	MTK_NL80211_VENDOR_ATTR_AP_SECURITY_PMF_SHA256,
-	/* add attributes here, update the policy in nl80211.c */
-
-	__MTK_NL80211_VENDOR_ATTR_AP_SECURITY_AFTER_LAST,
-	MTK_NL80211_VENDOR_AP_SECURITY_ATTR_MAX = __MTK_NL80211_VENDOR_ATTR_AP_SECURITY_AFTER_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_get_static_info - Specifies the vendor attribute values
- * to get static info
- */
-enum mtk_nl80211_vendor_attr_get_static_info {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_CHIP_ID,
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_DRIVER_VER,
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_COEXISTENCE,
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_WIFI_VER,
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_WAPP_SUPPORT_VER,
-
-	__MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_LAST,
-	MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_MAX =
-	__MTK_NL80211_VENDOR_ATTR_GET_STATIC_INFO_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_get_runtime_info - Specifies the vendor attribute values
- * to get runtime info
- */
-enum mtk_nl80211_vendor_attr_get_runtime_info {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_MAX_NUM_OF_STA,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_CHAN_LIST,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_OP_CLASS,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_BSS_INFO,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_NOP_CHANNEL_LIST,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_WMODE,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_WAPP_WSC_PROFILES,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_PMK_BY_PEER_MAC,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_802_11_AUTHENTICATION_MODE,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_802_11_MAC_ADDRESS,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_GET_802_11_CURRENTCHANNEL,
-
-	__MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_LAST,
-	MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_MAX =
-	__MTK_NL80211_VENDOR_ATTR_GET_RUNTIME_INFO_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_get_statistic - Specifies the vendor attribute values
- * to get statistic info
- */
-enum mtk_nl80211_vendor_attr_get_statistic {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_GET_STATISTIC_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_GET_802_11_STATISTICS,
-	MTK_NL80211_VENDOR_ATTR_GET_TX_PWR,
-	MTK_NL80211_VENDOR_ATTR_GET_AP_METRICS,
-	MTK_NL80211_VENDOR_ATTR_GET_802_11_PER_BSS_STATISTICS,
-	MTK_NL80211_VENDOR_ATTR_GET_CPU_TEMPERATURE,
-
-	_MTK_NL80211_VENDOR_ATTR_GET_STATISTIC_LAST,
-	MTK_NL80211_VENDOR_ATTR_GET_STATISTIC_MAX =
-	_MTK_NL80211_VENDOR_ATTR_GET_STATISTIC_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_wapp_req - Specifies the vendor attribute values
- * to request wifi info
- */
-enum mtk_nl80211_vendor_attr_wapp_req {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_WAPP_REQ_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_WAPP_REQ,
-
-	__MTK_NL80211_VENDOR_ATTR_WAPP_REQ_LAST,
-	MTK_NL80211_VENDOR_ATTR_WAPP_REQ_MAX =
-	__MTK_NL80211_VENDOR_ATTR_WAPP_REQ_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_event_rsp_wapp_event - Specifies the vendor attribute values
- * to get wifi info event
- */
-enum mtk_nl80211_vendor_attr_event_rsp_wapp_event {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_EVENT_RSP_WAPP_EVENT_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_EVENT_RSP_WAPP_EVENT,
-
-	__MTK_NL80211_VENDOR_ATTR_EVENT_RSP_WAPP_EVENT_LAST,
-	MTK_NL80211_VENDOR_ATTR_EVENT_RSP_WAPP_EVENT_MAX =
-	__MTK_NL80211_VENDOR_ATTR_EVENT_RSP_WAPP_EVENT_LAST - 1
-};
-
-/**
- * enum mtk_nl80211_vendor_attr_get_cap - Specifies the vendor attribute values
- * to get capability info
- */
-enum mtk_nl80211_vendor_attr_get_cap {
-	/* don't change the order or add anything between, this is ABI! */
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_INVALID = 0,
-
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_CAC_CAP,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_MISC_CAP,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_HT_CAP,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_VHT_CAP,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_WF6_CAPABILTY,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_HE_CAP,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_QUERY_11H_CAPABILITY,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_QUERY_RRM_CAPABILITY,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_QUERY_KVR_CAPABILITY,
-
-
-	__MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_LAST,
-	MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_MAX =
-	__MTK_NL80211_VENDOR_ATTR_GET_CAP_INFO_LAST - 1
-};
-
-#endif /* __MTK_VENDOR_NL80211_H */
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/wapp/mt_wlan_cmm_oid.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/wapp/mt_wlan_cmm_oid.h
deleted file mode 100644
index ce31b3b..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/wapp/mt_wlan_cmm_oid.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- ***************************************************************************
- * Mediatek Tech Inc.
- * 4F, No. 2 Technology 5th Rd.
- * Science-based Industrial Park
- * Hsin-chu, Taiwan, R.O.C.
- *
- * (c) Copyright 2020-2021, Mediatek Technology, Inc.
- *
- * All rights reserved. Mediatek's source code is an unpublished work and the
- * use of a copyright notice does not imply otherwise. This source code
- * contains confidential trade secret material of Mediatek Tech. Any attemp
- * or participation in deciphering, decoding, reverse engineering or in any
- * way altering the source code is stricitly prohibited, unless the prior
- * written consent of Mediatek Technology, Inc. is obtained.
- ***************************************************************************
-
-        Module Name:
-        wapp_cmm_type.h
-
-        Abstract:
-
-        Revision History:
-        Who         When          What
-        --------    ----------    ----------------------------------------------
-*/
-/* This file is used by wifi driver and wapp.
-   Keep data structure sync */
-
-#define OID_802_11_APCLI_ENABLE			0x09B0
-#define OID_802_11_AUTO_ROAM			0x09B1
-#define OID_802_11_APCLI_BSSID			0x09B2
-#define OID_802_11_APPROXY_REFRESH		0x09B3
-#define OID_802_11_AUTH_MODE			0x09B4
-#define OID_802_11_APCLI_PMFMFPC		0x09B5
-#define OID_802_11_APCLI_SSID			0x09B6
-#define OID_802_11_APCLI_WPAPSK			0x09B7
-#define OID_802_11_APCLI_AUTH_MODE		0x09B8
-#define OID_802_11_APCLI_ENCRY_TYPE		0x09B9
-#define OID_802_11_ACL_ADDENTRY			0x09BA
-#define OID_802_11_ACL_DELENTRY			0x09BB
-#define OID_802_11_ACL_CLEARALL			0x09BC
-#define OID_802_11_ACCESS_POLICY		0x09BD
-#define OID_802_11_APCLI_AUTO_CONNECT		0x09BE
-#define OID_802_11_BCNREQ			0x09BF
-#define OID_802_11_BLADD			0x09C0
-#define OID_802_11_BLDEL			0x09C1
-#define OID_802_11_BHBSS			0x09C2
-#define OID_802_11_SET_CHANNEL			0x09C3
-#define OID_802_11_DPP_ENABLE			0x09C4
-#define OID_802_11_DISCONNECT_STA		0x09C5
-#define OID_802_11_DEFAULT_KEYID		0x09C6
-#define OID_802_11_DISCONNECT_ALL_STA		0x09C7
-#define OID_802_11_ENCRYP_TYPE			0x09C8
-#define OID_802_11_FHBSS			0x09C9
-#define OID_802_11_HTBSSCOEX			0x09CA
-#define OID_802_11_HIDE_SSID			0x09CB
-#define OID_802_11_HTBW				0x09CC
-#define OID_802_11_KEY1				0x09CD
-#define OID_802_11_MAP_CHANNEL			0x09CE
-#define OID_802_11_MNT_ENABLE			0x09CF
-#define OID_802_11_MNT_RULE			0x09D0
-#define OID_802_11_MNT_STA0			0x09D1
-#define OID_802_11_MAP_CHANNEL_ENABLE		0x09D2
-#define OID_802_11_MAP_ENABLE			0x09D3
-#define OID_802_11_PMFMFPC			0x09D4
-#define OID_802_11_RADIOON			0x09D5
-#define OID_802_11_SITESURVEY			0x09D6
-#define OID_802_11_TS_BH_PRIMARY_VID		0x09D7
-#define OID_802_11_TS_BH_PRIMARY_PCP		0x09D8
-#define OID_802_11_TS_BH_VID			0x09D9
-#define OID_802_11_TS_FH_VID			0x09DA
-#define OID_802_11_TRANSPARENT_VID		0x09DB
-#define OID_802_11_VHTBW			0x09DC
-#define OID_802_11_V10_CONVERTER		0x09DD
-#define OID_802_11_WSC_STOP			0x09DE
-#define OID_802_11_WSCCONF_MODE			0x09DF
-#define OID_802_11_WSC_MODE			0x09E0
-#define OID_802_11_WSC_GET_CONF			0x09E1
-#define OID_802_11_WSCCONF_STATUS		0x09E2
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/wapp/wapp_cmm_type.h b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/wapp/wapp_cmm_type.h
deleted file mode 100755
index d9216c9..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/files-5.4/include/uapi/linux/wapp/wapp_cmm_type.h
+++ /dev/null
@@ -1,1139 +0,0 @@
-/*
- ***************************************************************************
- * Mediatek Tech Inc.
- * 4F, No. 2 Technology 5th Rd.
- * Science-based Industrial Park
- * Hsin-chu, Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2011, Mediatek Technology, Inc.
- *
- * All rights reserved. Mediatek's source code is an unpublished work and the
- * use of a copyright notice does not imply otherwise. This source code
- * contains confidential trade secret material of Mediatek Tech. Any attemp
- * or participation in deciphering, decoding, reverse engineering or in any
- * way altering the source code is stricitly prohibited, unless the prior
- * written consent of Mediatek Technology, Inc. is obtained.
- ***************************************************************************
-
-	Module Name:
-	wapp_cmm_type.h
-
-	Abstract:
-
-	Revision History:
-	Who         When          What
-	--------    ----------    ----------------------------------------------
-*/
-/* This file is used by wifi driver and wapp.
-   Keep data structure sync */
-
-#ifndef __WAPP_TYPES_H__
-#define __WAPP_TYPES_H__
-
-//#include <linux/if_ether.h>
-#ifdef WAPP_SUPPORT
-#define MAX_BSSLOAD_THRD			100
-#endif /* WAPP_SUPPORT */
-
-#ifndef GNU_PACKED
-#define GNU_PACKED  (__attribute__ ((packed)))
-#endif /* GNU_PACKED */
-
-#ifndef MAC_ADDR_LEN
-#define MAC_ADDR_LEN				6
-#endif
-#ifndef LEN_PMK
-#define LEN_PMK					32
-#endif
-#ifndef LEN_PMK_MAX
-#define LEN_PMK_MAX				48
-#endif
-#ifndef LEN_PMKID
-#define LEN_PMKID				16
-#endif
-#ifndef LEN_MAX_PTK
-#define LEN_MAX_PTK				88
-#endif
-#ifndef LEN_PSK
-#define LEN_PSK					64
-#endif
-#ifndef LEN_MAX_URI
-#define LEN_MAX_URI                             120
-#endif
-
-#ifndef AC_NUM
-#define AC_NUM						4
-#endif
-#define MAX_HE_MCS_LEN 12
-#define MAX_OP_CLASS 16
-#define MAX_LEN_OF_SSID 32
-#define MAX_NUM_OF_CHANNELS		59 // 14 channels @2.4G +  12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0@Japan + 1 as NULL termination
-#define ASSOC_REQ_LEN 154
-#define ASSOC_REQ_LEN_MAX 512
-#define PREQ_IE_LEN 200
-#define BCN_RPT_LEN 200
-#define IWSC_MAX_SUB_MASK_LIST_COUNT	3
-#define WMODE_CAP_N(_x)                        (((_x) & (WMODE_GN | WMODE_AN)) != 0)
-#define WMODE_CAP_AC(_x)               (((_x) & (WMODE_AC)) != 0)
-#define WMODE_CAP_AX(_x)	((_x) & (WMODE_AX_24G | WMODE_AX_5G | WMODE_AX_6G))
-#define WMODE_CAP(_x, _mode)   (((_x) & (_mode)) != 0)
-
-#define MAX_SUPPORT_INF_NUM 17 * MAX_NUM_OF_RADIO /* 16MBSS+1APCLI */
-#define MAX_NUM_OF_WAPP_CHANNELS 59
-#define MAX_PROFILE_CNT 4
-#define PER_EVENT_LIST_MAX_NUM 		5
-#define	DAEMON_NEIGHBOR_REPORT_MAX_NUM 128
-#define VERSION_WAPP_CMM "v3.0.0.1"
-#ifdef MAP_R3_WF6
-#define MAX_TID 4
-#endif
-typedef enum {
-	WAPP_STA_INVALID,
-	WAPP_STA_DISCONNECTED,
-	WAPP_STA_CONNECTED,
-} WAPP_STA_STATE;
-
-typedef enum {
-	WAPP_BSS_STOP = 0,
-	WAPP_BSS_START,
-} WAPP_BSS_STATE;
-
-typedef enum {
-	WAPP_AUTH = 0,
-	WAPP_ASSOC,
-	WAPP_EAPOL
-} WAPP_CNNCT_STAGE;
-
-typedef enum {
-	WAPP_BSSLOAD_NORMAL = 0,
-	WAPP_BSSLOAD_HIGH,
-	WAPP_BSSLOAD_LOW,
-} WAPP_BSSLOAD_STATE;
-
-typedef enum {
-	NOT_FAILURE = 0,
-	AP_NOT_READY,
-	ACL_CHECK_FAIL,
-	BSSID_NOT_FOUND,
-	BSSID_MISMATCH,
-	BSSID_IF_NOT_READY,
-	BND_STRG_CONNECT_CHECK_FAIL,
-	DISALLOW_NEW_ASSOCI,
-	EZ_CONNECT_DISALLOW,
-	EZ_SETUP_FUNC_DISABLED,
-	FT_ERROR,
-	GO_UPDATE_NOT_COMPLETE,
-	MLME_NO_RESOURCE,
-	MLME_ASSOC_REJ_TEMP,
-	MLME_UNABLE_HANDLE_STA,
-	MLME_EZ_CNNCT_LOOP,
-	MLME_REQ_WITH_INVALID_PARAM,
-	MLME_REJECT_TIMEOUT,
-	MLME_UNSPECIFY_FAILURE,
-	NOT_FOUND_IN_RADIUS_ACL,
-	PEER_REQ_SANITY_FAIL,
-} WAPP_CNNCT_FAIL_REASON_LIST;
-
-typedef enum {
-	WAPP_APCLI_DISASSOCIATED = 0,
-	WAPP_APCLI_ASSOCIATED,
-} WAPP_APCLI_ASSOC_STATE;
-
-typedef enum {
-	WAPP_DEV_QUERY_RSP = 1,
-	WAPP_HT_CAP_QUERY_RSP,
-	WAPP_VHT_CAP_QUERY_RSP,
-	WAPP_HE_CAP_QUERY_RSP,
-	WAPP_MISC_CAP_QUERY_RSP,
-	WAPP_CLI_QUERY_RSP,
-	WAPP_CLI_LIST_QUERY_RSP,
-	WAPP_CLI_JOIN_EVENT,
-	WAPP_CLI_LEAVE_EVENT,
-	WAPP_CLI_PROBE_EVENT,
-	WAPP_CHN_LIST_RSP,
-	WAPP_OP_CLASS_RSP,
-	WAPP_BSS_INFO_RSP,
-	WAPP_AP_METRIC_RSP,
-	WAPP_CH_UTIL_QUERY_RSP,
-	WAPP_AP_CONFIG_RSP,
-	WAPP_APCLI_QUERY_RSP,
-	MAP_BH_STA_WPS_DONE,
-	MAP_TRIGGER_RSSI_STEER,
-	WAPP_RCEV_BCN_REPORT,
-	WAPP_RCEV_BCN_REPORT_COMPLETE,
-	WAPP_RCEV_MONITOR_INFO,
-	WAPP_BSSLOAD_RSP,
-	WAPP_BSSLOAD_CROSSING,
-	WAPP_BSS_STATE_CHANGE,
-	WAPP_CH_CHANGE,
-	WAPP_TX_POWER_CHANGE,
-	WAPP_APCLI_ASSOC_STATE_CHANGE,
-	WAPP_STA_RSSI_RSP,
-	WAPP_CLI_ACTIVE_CHANGE,
-	WAPP_CSA_EVENT,
-	WAPP_STA_CNNCT_REJ,
-	WAPP_APCLI_RSSI_RSP,
-	WAPP_SCAN_RESULT_RSP,
-	WAPP_MAP_VENDOR_IE,
-	WAPP_WSC_SCAN_COMP_NOTIF,
-	WAPP_MAP_WSC_CONFIG,
-	WAPP_WSC_EAPOL_START_NOTIF,
-	WAPP_WSC_EAPOL_COMPLETE_NOTIF,
-	WAPP_SCAN_COMPLETE_NOTIF,
-	WAPP_A4_ENTRY_MISSING_NOTIF,
-	WAPP_RADAR_DETECT_NOTIF,
-	WAPP_APCLI_ASSOC_STATE_CHANGE_VENDOR10,
-	WAPP_CAC_STOP, //MAP R2
-	WAPP_STA_DISASSOC_EVENT,
-	WAPP_RADIO_METRIC_RSP,
-	WAPP_DPP_ACTION_FRAME_RECEIVED,
-	WAPP_DPP_ACTION_FRAME_STATUS,
-	WAPP_DPP_CCE_RSP,
-	WAPP_CAC_PERIOD_EVENT,
-	WAPP_UNSAFE_CHANNEL_EVENT,
-	WAPP_BAND_STATUS_CHANGE_EVENT,
-	WAPP_STA_INFO,
-	WAPP_R3_RECONFIG_TRIGGER,
-	WAPP_R3_DPP_URI_INFO,
-	WAPP_NO_STA_CONNECT_TIMEOUT_EVENT,
-	WAPP_NO_DATA_TRAFFIC_TIMEOUT_EVENT,
-	WAPP_WIFI_UP_EVENT,
-	WAPP_WIFI_DOWN_EVENT,
-	WAPP_QOS_ACTION_FRAME_EVENT = 70,
-	WAPP_MSCS_CLASSIFIER_PARAM_EVENT,
-	WAPP_VEND_SPEC_UP_TUPLE_EVENT,
-	WAPP_CH_CHANGE_R3,
-	WAPP_SELF_SRG_BITMAP_EVENT,
-	WAPP_UPLINK_TRAFFIC_EVENT,
-	WAPP_CONFIG_WPS_EVENT,
-} WAPP_EVENT_ID;
-
-typedef enum {
-	WAPP_DEV_QUERY_REQ = 1,
-	WAPP_HT_CAP_QUERY_REQ,
-	WAPP_VHT_CAP_QUERY_REQ,
-	WAPP_HE_CAP_QUERY_REQ,
-	WAPP_MISC_CAP_QUERY_REQ,
-	WAPP_CLI_QUERY_REQ,
-	WAPP_CLI_LIST_QUERY_REQ,
-	WAPP_CHN_LIST_QUERY_REQ,
-	WAPP_OP_CLASS_QUERY_REQ,
-	WAPP_BSS_INFO_QUERY_REQ,
-	WAPP_AP_METRIC_QUERY_REQ,
-	WAPP_CH_UTIL_QUERY_REQ,
-	WAPP_APCLI_QUERY_REQ,
-	WAPP_BSS_START_REQ,
-	WAPP_BSS_STOP_REQ,
-	WAPP_TXPWR_PRCTG_REQ,
-	WAPP_STEERING_POLICY_SET_REQ,
-	WAPP_BSS_LOAD_THRD_SET_REQ,
-	WAPP_AP_CONFIG_SET_REQ,
-	WAPP_BSSLOAD_QUERY_REQ,
-	WAPP_HECAP_QUERY_REQ,
-	WAPP_STA_RSSI_QUERY_REQ,
-	WAPP_APCLI_RSSI_QUERY_REQ,
-	WAPP_GET_SCAN_RESULTS,
-	WAPP_SEND_NULL_FRAMES,
-	WAPP_WSC_PBC_EXEC,
-	WAPP_WSC_SET_BH_PROFILE,
-	WAPP_SET_SCAN_BH_SSIDS,
-	WAPP_SET_AVOID_SCAN_CAC,
-#ifdef MAP_R2
-	WAPP_RADIO_METRICS_REQ,
-#endif
-#ifdef DPP_R2_SUPPORT
-	WAPP_GET_CCE_RESULT,
-#endif
-	WAPP_SET_SRG_BITMAP,
-	WAPP_SET_TOPOLOGY_UPDATE,
-	WAPP_SET_SRG_UPLINK_STATUS,
-} WAPP_REQ_ID;
-
-typedef enum {
-	PARAM_DGAF_DISABLED,
-	PARAM_PROXY_ARP,
-	PARAM_L2_FILTER,
-	PARAM_ICMPV4_DENY,
-	PARAM_MMPDU_SIZE,
-	PARAM_EXTERNAL_ANQP_SERVER_TEST,
-	PARAM_GAS_COME_BACK_DELAY,
-	PARAM_WNM_NOTIFICATION,
-	PARAM_QOSMAP,
-	PARAM_WNM_BSS_TRANSITION_MANAGEMENT,
-} WAPP_PARAM;
-
-typedef struct GNU_PACKED _WAPP_CONNECT_FAILURE_REASON {
-	u8	connect_stage;
-	u16	reason;
-} WAPP_CONNECT_FAILURE_REASON;
-
-typedef struct GNU_PACKED _wapp_dev_info {
-	u32	ifindex;
-	u8	ifname[IFNAMSIZ];
-	u8	mac_addr[MAC_ADDR_LEN];
-	u8	dev_type;
-	u8	radio_id;
-	u16	wireless_mode;
-	uintptr_t	adpt_id;
-	u8 dev_active;
-} wapp_dev_info;
-
-typedef struct GNU_PACKED _wdev_ht_cap {
-	u8	tx_stream;
-	u8	rx_stream;
-	u8	sgi_20;
-	u8	sgi_40;
-	u8	ht_40;
-} wdev_ht_cap;
-
-typedef struct GNU_PACKED _wdev_vht_cap {
-	u8	sup_tx_mcs[2];
-	u8	sup_rx_mcs[2];
-	u8	tx_stream;
-	u8	rx_stream;
-	u8	sgi_80;
-	u8	sgi_160;
-	u8	vht_160;
-	u8	vht_8080;
-	u8	su_bf;
-	u8	mu_bf;
-} wdev_vht_cap;
-
-typedef struct GNU_PACKED _wdev_he_cap {
-	unsigned char he_mcs_len;
-	unsigned char he_mcs[MAX_HE_MCS_LEN];
-	unsigned char tx_stream;
-	unsigned char rx_stream;
-	unsigned char he_8080;
-	unsigned char he_160;
-	unsigned char su_bf_cap;
-	unsigned char mu_bf_cap;
-	unsigned char ul_mu_mimo_cap;
-	unsigned char ul_mu_mimo_ofdma_cap;
-	unsigned char dl_mu_mimo_ofdma_cap;
-	unsigned char ul_ofdma_cap;
-	unsigned char dl_ofdma_cap;
-	unsigned char gi; /* 0:auto;1:800;2:1600;3:3200 */
-} wdev_he_cap;
-
-
-#ifdef MAP_R2
-typedef struct GNU_PACKED _wdev_extended_ap_metrics {
-	u32 uc_tx;
-	u32 uc_rx;
-	u32 mc_tx;
-	u32 mc_rx;
-	u32 bc_tx;
-	u32 bc_rx;
-} wdev_extended_ap_metric;
-
-
-typedef struct GNU_PACKED _wdev_sta_extended_info {
-#if 0
-	u8 bssid[MAC_ADDR_LEN];
-#endif
-	u32 last_data_ul_rate;
-	u32 last_data_dl_rate;
-	u32 utilization_rx;
-	u32 utilization_tx;
-} wdev_sta_ext_info;
-
-typedef struct GNU_PACKED _wdev_extended_sta_metrics {
-#if 0
-	u8 sta_mac[MAC_ADDR_LEN];
-	u8 extended_info_cnt;
-#endif
-	wdev_sta_ext_info sta_info;
-} wdev_extended_sta_metrics;
-
-#endif
-typedef struct GNU_PACKED _wapp_cac_info {
-	u8 channel;
-	u8 ret;
-	u8 cac_timer;
-} wapp_cac_info;
-#ifdef MAP_R2
-typedef enum cac_mode
-{
-	CONTINUOUS_CAC,
-	DEDICATED_CAC,
-	REDUCED_MIMO_CAC,
-} CAC_MODE;
-#endif
-
-
-typedef struct GNU_PACKED _wdev_misc_cap {
-	u8	max_num_of_cli;
-	u8	max_num_of_bss;
-	u8	num_of_bss;
-	u8	max_num_of_block_cli;
-} wdev_misc_cap;
-
-struct GNU_PACKED he_nss{
-	u16 nss_80:2;
-	u16 nss_160:2;
-	u16 nss_8080:2;
-};
-
-struct GNU_PACKED map_cli_cap {
-	u16 bw:2;
-	u16 phy_mode:3;
-	u16 nss:2;
-	u16 btm_capable:1;
-	u16 rrm_capable:1;
-	u16 mbo_capable:1;
-	struct he_nss nss_he;
-};
-
-#ifdef MAP_R3_WF6
-struct GNU_PACKED assoc_wifi6_sta_info {
-	unsigned char tid;
-	unsigned char tid_q_size;
-};
-
-typedef struct GNU_PACKED _wdev_wf6_cap {
-	unsigned char he_mcs_len;
-	unsigned char he_mcs[MAX_HE_MCS_LEN];
-	unsigned char tx_stream;
-	unsigned char rx_stream;
-	unsigned char he_8080;
-	unsigned char he_160;
-	unsigned char su_bf_cap;
-	unsigned char mu_bf_cap;
-	unsigned char ul_mu_mimo_cap;
-	unsigned char ul_mu_mimo_ofdma_cap;
-	unsigned char dl_mu_mimo_ofdma_cap;
-	unsigned char ul_ofdma_cap;
-	unsigned char dl_ofdma_cap;
-	unsigned char agent_role;
-	unsigned char su_beamformee_status;
-	unsigned char beamformee_sts_less80;
-	unsigned char beamformee_sts_more80;
-	unsigned char max_user_dl_tx_mu_mimo;
-	unsigned char max_user_ul_rx_mu_mimo;
-	unsigned char max_user_dl_tx_ofdma;
-	unsigned char max_user_ul_rx_ofdma;
-	unsigned char rts_status;
-	unsigned char mu_rts_status;
-	unsigned char m_bssid_status;
-	unsigned char mu_edca_status;
-	unsigned char twt_requester_status;
-	unsigned char twt_responder_status;
-} wdev_wf6_cap;
-
-typedef struct GNU_PACKED _wdev_wf6_cap_roles {
-	unsigned char role_supp;
-	wdev_wf6_cap wf6_role[2];
-} wdev_wf6_cap_roles;
-#endif
-
-typedef struct GNU_PACKED _wapp_client_info {
-	u8 mac_addr[MAC_ADDR_LEN];
-	u8 bssid[MAC_ADDR_LEN];
-	u8 sta_status; /* WAPP_STA_STATE */
-	u16 assoc_time;
-	u16 downlink;
-	u16 uplink;
-	signed char uplink_rssi;
-	/*traffic stats*/
-	u32 bytes_sent;
-	u32 bytes_received;
-	u32 packets_sent;
-	u32 packets_received;
-	u32 tx_packets_errors;
-	u32 rx_packets_errors;
-	u32 retransmission_count;
-	u16 link_availability;
-	u16 assoc_req_len;
-	u8 bLocalSteerDisallow;
-	u8 bBTMSteerDisallow;
-	u8 status;
-	/* ht_cap */
-	/* vht_cap */
-
-	/* Throughput for Tx/Rx */
-	u32 tx_tp;
-	u32 rx_tp;
-	struct map_cli_cap cli_caps;
-#ifdef MAP_R2
-	wdev_extended_sta_metrics ext_metric_info;
-#endif
-	u16 disassoc_reason;
-#ifdef MAP_R2
-	u8 IsReassoc;
-#endif
-	u8  is_APCLI;
-#ifdef MAP_R3_WF6
-	u8 tid_cnt;
-	struct assoc_wifi6_sta_info status_tlv[MAX_TID];
-#endif
-} wapp_client_info;
-
-struct GNU_PACKED chnList {
-	u8 channel;
-	u8 pref;
-	u16 cac_timer;
-};
-
-typedef struct GNU_PACKED _wdev_chn_info {
-	u8		op_ch;
-	u8		op_class;
-	u16		band; /* 24g; 5g1; 5g2 */
-	u8		ch_list_num;
-	u8		non_op_chn_num;
-	u16		dl_mcs;
-	struct chnList ch_list[32];
-	u8		non_op_ch_list[32];
-	u8		AutoChannelSkipListNum;
-	u8		AutoChannelSkipList[MAX_NUM_OF_CHANNELS + 1];
-} wdev_chn_info;
-
-struct GNU_PACKED opClassInfo {
-	u8	op_class;
-	u8	num_of_ch;
-	u8	ch_list[13];
-};
-
-typedef struct GNU_PACKED _wdev_op_class_info {
-	u8		num_of_op_class;
-	struct opClassInfo opClassInfo[MAX_OP_CLASS];
-} wdev_op_class_info;
-
-struct GNU_PACKED opClassInfoExt {
-	u8	op_class;
-	u8	num_of_ch;
-	u8	ch_list[MAX_NUM_OF_CHANNELS];
-};
-
-struct GNU_PACKED _wdev_op_class_info_ext {
-	u8		num_of_op_class;
-	struct opClassInfoExt opClassInfoExt[MAX_OP_CLASS];
-};
-
-typedef struct GNU_PACKED _wdev_bss_info {
-	u8 if_addr[MAC_ADDR_LEN];
-	u8 bssid[MAC_ADDR_LEN];
-	char ssid[MAX_LEN_OF_SSID + 1];
-	u8 SsidLen;
-	u8 map_role;
-	u32 auth_mode;
-	u32 enc_type;
-	u8 key_len;
-	u8 key[64 + 1];
-	u8 hidden_ssid;
-} wdev_bss_info;
-
-typedef struct GNU_PACKED _wsc_apcli_config {
-	char ssid[MAX_LEN_OF_SSID + 1];
-	u8 SsidLen;
-	u16 AuthType;
-	u16 EncrType;
-	u8 Key[64];
-	u16 KeyLength;
-	u8 KeyIndex;
-	u8 bssid[MAC_ADDR_LEN];
-	u8 peer_map_role;
-	u8 own_map_role;
-} wsc_apcli_config;
-
-typedef struct GNU_PACKED _wsc_apcli_config_msg {
-	u32 profile_count;
-	wsc_apcli_config apcli_config[0];
-} wsc_apcli_config_msg, *p_wsc_apcli_config_msg;
-
-typedef struct GNU_PACKED _wdev_ap_metric {
-	u8		bssid[MAC_ADDR_LEN];
-	u8		cu;
-	u8 		ESPI_AC[AC_NUM][3];
-#ifdef MAP_R2
-	wdev_extended_ap_metric ext_ap_metric;
-#endif
-} wdev_ap_metric;
-
-#ifdef MAP_R2
-typedef struct GNU_PACKED _wdev_radio_metric {
-	u8 cu_noise;
-	u8 cu_tx;
-	u8 cu_rx;
-	u8 cu_other;
-	u32 edcca;
-} wdev_radio_metric;
-#endif
-typedef struct GNU_PACKED _wdev_ap_config {
-	u8 sta_report_on_cop;
-	u8 sta_report_not_cop;
-	u8 rssi_steer;
-} wdev_ap_config;
-
-struct GNU_PACKED pwr_limit {
-	u8	op_class;
-	u8	max_pwr;
-};
-
-typedef struct GNU_PACKED _wdev_tx_power {
-	u8		num_of_op_class;
-	struct pwr_limit tx_pwr_limit[MAX_OP_CLASS];
-	u16 tx_pwr;
-} wdev_tx_power;
-
-/*Driver detects sta needed to steer*/
-typedef struct GNU_PACKED _wdev_steer_sta {
-	u8 mac_addr[MAC_ADDR_LEN];
-} wdev_steer_sta;
-
-typedef struct GNU_PACKED _wapp_probe_info {
-	u8 mac_addr[MAC_ADDR_LEN];
-	u8 channel;
-	signed char rssi;
-	u8 preq_len;
-	u8 preq[PREQ_IE_LEN];
-} wapp_probe_info;
-
-typedef struct GNU_PACKED _wapp_bcn_rpt_info {
-	u8 sta_addr[MAC_ADDR_LEN];
-	u8 last_fragment;
-	u16 bcn_rpt_len;
-	u8 bcn_rpt[BCN_RPT_LEN];
-} wapp_bcn_rpt_info;
-
-typedef struct GNU_PACKED wapp_bhsta_info {
-	u8 mac_addr[MAC_ADDR_LEN];
-	u8 connected_bssid[MAC_ADDR_LEN];
-	u8 peer_map_enable;
-} wapp_bhsta_info;
-
-typedef struct GNU_PACKED _wdev_steer_policy {
-	u8 steer_policy;
-	u8 cu_thr;
-	u8 rcpi_thr;
-} wdev_steer_policy;
-
-typedef struct GNU_PACKED _bssload_threshold {
-	u8 high_bssload_thrd;
-	u8 low_bssload_thrd;
-} bssload_threshold;
-
-typedef struct GNU_PACKED _wapp_bssload_info {
-	u16 sta_cnt;
-	u8 ch_util;
-	u16 AvalAdmCap;
-} wapp_bssload_info;
-
-/* By air monitor*/
-typedef struct GNU_PACKED _wapp_mnt_info {
-	u8 sta_addr[MAC_ADDR_LEN];
-	signed char rssi;
-} wapp_mnt_info;
-
-typedef struct GNU_PACKED _wapp_csa_info {
-	u8 new_channel;
-} wapp_csa_info;
-
-#ifdef WPS_UNCONFIG_FEATURE_SUPPORT
-struct GNU_PACKED wapp_wps_config_info {
-	u8 SSID[33];	/* mandatory */
-	u8 channel;
-	u16 AuthType;	/* mandatory, 1: open, 2: wpa-psk, 4: shared, 8:wpa, 0x10: wpa2, 0x20: wpa2-psk */
-	u16 EncrType;	/* mandatory, 1: none, 2: wep, 4: tkip, 8: aes */
-	u8 Key[64];		/* mandatory, Maximum 64 byte */
-	u16 KeyLength;
-	u8 MacAddr[MAC_ADDR_LEN];	/* mandatory, AP MAC address */
-	u8 bss_role;				/*0-Fronthaul, 1-Backhaul*/
-	u8 index;
-};
-#endif
-typedef struct GNU_PACKED _wapp_bss_state_info {
-	u32 interface_index;
-	WAPP_BSS_STATE bss_state;
-} wapp_bss_state_info;
-
-typedef struct GNU_PACKED _wapp_ch_change_info {
-	u32 interface_index;
-	u8 new_ch;/*New channel IEEE number*/
-	u8 op_class;
-} wapp_ch_change_info;
-
-typedef struct GNU_PACKED _wapp_txpower_change_info {
-	u32 interface_index;
-	u16 new_tx_pwr;/*New TX power*/
-} wapp_txpower_change_info;
-
-typedef struct GNU_PACKED _wapp_apcli_association_info {
-	u32 interface_index;
-	WAPP_APCLI_ASSOC_STATE apcli_assoc_state;
-	signed char rssi;
-	signed char PeerMAPEnable;
-} wapp_apcli_association_info;
-
-typedef struct GNU_PACKED _wapp_bssload_crossing_info {
-	u32 interface_index;
-	u8 bssload_high_thrd;
-	u8 bssload_low_thrd;
-	u8 bssload;
-} wapp_bssload_crossing_info;
-
-typedef struct GNU_PACKED _wapp_sta_cnnct_rejected_info {
-	u32 interface_index;
-	u8 sta_mac[MAC_ADDR_LEN];
-	u8 bssid[MAC_ADDR_LEN];
-	WAPP_CONNECT_FAILURE_REASON cnnct_fail;
-#ifdef MAP_R2
-	u16 assoc_status_code;
-	u16 assoc_reason_code;
-#endif
-} wapp_sta_cnnct_rej_info;
-
-struct GNU_PACKED map_vendor_ie
-{
-	u8 type;
-	u8 subtype;
-	u8 root_distance;
-	u8 connectivity_to_controller;
-	u16 uplink_rate;
-	u8 uplink_bssid[MAC_ADDR_LEN];
-	u8 bssid_5g[MAC_ADDR_LEN];
-	u8 bssid_2g[MAC_ADDR_LEN];
-};
-
-typedef struct _qbss_load_param {
-	u8     bValid;                     /* 1: variable contains valid value */
-	u16      StaNum;
-	u8       ChannelUtilization;
-	u16      RemainingAdmissionControl;  /* in unit of 32-us */
-} QBSS_LOAD_PARM, *PQBSS_LOAD_PARM;
-
-#ifdef MAP_R2
-typedef struct GNU_PACKED _wapp_qbss_load {
-	u8 bValid;/*1: variable contains valid value*/
-	u16  StaNum;
-	u8   ChannelUtilization;
-	u16  RemainingAdmissionControl;/*in unit of 32-us*/
-} WAPP_QBSS_LOAD_PARM;
-
-#endif
-#ifdef MAP_6E_SUPPORT
-struct GNU_PACKED map_rnr {
-	u8 channel;
-	u8 op;
-	u8 cce_ind;
-};
-#endif
-
-#ifdef DPP_R2_SUPPORT
-struct GNU_PACKED cce_vendor_ie
-{
-	u8 value;
-};
-
-#define MAX_CCE_CHANNEL 128
-
-struct GNU_PACKED cce_vendor_ie_result {
-	u8 num;
-	u8 cce_ch[MAX_CCE_CHANNEL];//channel list, on which beacon includes cce ie
-};
-#endif
-
-struct GNU_PACKED scan_bss_info {
-	u8 Bssid[MAC_ADDR_LEN];
-	u8 Channel;
-	u8 CentralChannel;
-	signed char Rssi;
-	signed char MinSNR;
-	u8 Privacy;
-
-	u8 SsidLen;
-	u8 Ssid[MAX_LEN_OF_SSID];
-
-	u16 AuthMode;
-	u16 EncrypType;
-	wdev_ht_cap ht_cap;
-	wdev_vht_cap vht_cap;
-	wdev_he_cap he_cap;
-	u8 map_vendor_ie_found;
-	struct map_vendor_ie map_info;
-#ifdef MAP_R2
-        WAPP_QBSS_LOAD_PARM QbssLoad;
-#endif
-#ifdef MAP_6E_SUPPORT
-	struct map_rnr rnr_6e;
-#endif
-};
-struct GNU_PACKED wapp_scan_info {
-	u32 interface_index;
-	u8 more_bss;
-	u8 bss_count;
-	struct scan_bss_info bss[0];
-};
-
-struct GNU_PACKED wapp_wsc_scan_info {
-	u8 bss_count;
-	u8 Uuid[16];
-};
-
-struct GNU_PACKED radar_notif_s
-{
-	u32 channel;
-	u32 status;
-	u32 bw;
-};
-
-#ifdef WIFI_MD_COEX_SUPPORT
-struct GNU_PACKED unsafe_channel_notif_s
-{
-	u32 ch_bitmap[4];
-};
-
-struct GNU_PACKED band_status_change {
-	u8 status;	/*0-radio temporarily cannot be used, 1-radio can be used*/
-};
-#endif
-
-typedef struct GNU_PACKED _NDIS_802_11_SSID {
-	u32 SsidLength;	/* length of SSID field below, in bytes; */
-	/* this can be zero. */
-	char Ssid[MAX_LEN_OF_SSID];	/* SSID information field */
-} NDIS_802_11_SSID, *PNDIS_802_11_SSID;
-struct GNU_PACKED nop_channel_list_s
-{
-	u8 channel_count;
-	u8 channel_list[MAX_NUM_OF_WAPP_CHANNELS];
-};
-
-/* WSC configured credential */
-typedef struct _WSC_CREDENTIAL {
-	NDIS_802_11_SSID SSID;	/* mandatory */
-	u16 AuthType;	/* mandatory, 1: open, 2: wpa-psk, 4: shared, 8:wpa, 0x10: wpa2, 0x20: wpa2-psk */
-	u16 EncrType;	/* mandatory, 1: none, 2: wep, 4: tkip, 8: aes */
-	u8 Key[64];		/* mandatory, Maximum 64 byte */
-	u16 KeyLength;
-	u8 MacAddr[MAC_ADDR_LEN];	/* mandatory, AP MAC address */
-	u8 KeyIndex;		/* optional, default is 1 */
-	u8 bFromUPnP;	/* TRUE: This credential is from external UPnP registrar */
-	u8 bss_role;		/*0-Fronthaul, 1-Backhaul*/
-	u8 DevPeerRole;	/* Device role for the peer device sending M8 */
-	u16 IpConfigMethod;
-	u32				RegIpv4Addr;
-	u32				Ipv4SubMask;
-	u32				EnrIpv4Addr;
-	u32				AvaIpv4SubmaskList[IWSC_MAX_SUB_MASK_LIST_COUNT];
-} WSC_CREDENTIAL, *PWSC_CREDENTIAL;
-
-struct scan_SSID
-{
-	char ssid[MAX_LEN_OF_SSID+ 1];
-	unsigned char SsidLen;
-};
-
-struct vendor_map_element {
-	u8 eid;
-	u8 length;
-	char oui[3]; /* 0x50 6F 9A */
-	char mtk_ie_element[4];
-	char type;
-	char subtype;
-	char root_distance;
-	char controller_connectivity;
-	short uplink_rate;
-	char uplink_bssid[MAC_ADDR_LEN];
-	char _5g_bssid[MAC_ADDR_LEN];
-	char _2g_bssid[MAC_ADDR_LEN];
-};
-
-struct GNU_PACKED scan_BH_ssids
-{
-	unsigned long scan_cookie;
-	unsigned char scan_channel_count;
-	unsigned char scan_channel_list[32];
-	unsigned char profile_cnt;
-	struct scan_SSID scan_SSID_val[MAX_PROFILE_CNT];
-};
-
-struct GNU_PACKED action_frm_data {
-	u32 ifindex;
-	u8 bssid[MAC_ADDR_LEN];
-	u8 destination_addr[MAC_ADDR_LEN];
-	u8 transmitter_addr[MAC_ADDR_LEN];
-	u32 chan;
-	u32 wait_time;
-	u32 no_cck;
-	u32 frm_len;
-	u16 seq_no;
-	char frm[0];
-};
-
-struct GNU_PACKED roc_req {
-	u32 ifindex;
-	u32 chan;
-	u32 wait_time;
-};
-
-#ifdef DPP_SUPPORT
-struct GNU_PACKED wapp_dpp_action_frame {
-	u8 src[MAC_ADDR_LEN];
-	u32 wapp_dpp_frame_id_no;
-	u32 chan;
-	u32 frm_len;
-	u32 is_gas;
-	u8 frm[0];
-};
-
-struct GNU_PACKED wapp_dpp_frm_tx_status {
-	u8 tx_success;
-	u16 seq_no;
-};
-
-struct GNU_PACKED pmk_req {
-	u32 ifindex;
-	u8 pmk[LEN_PMK];
-	u8 pmk_len;
-	u8 pmkid[LEN_PMKID];
-	u8 authenticator_addr[MAC_ADDR_LEN];
-	u8 supplicant_addr[MAC_ADDR_LEN];
-	int timeout;
-	int akmp;
-	u8 ssid[MAX_LEN_OF_SSID];
-	size_t ssidlen;
-};
-#endif /*DPP_SUPPORT*/
-#ifdef MAP_R3
-struct GNU_PACKED wapp_sta_info {
-        u8 src[MAC_ADDR_LEN];
-        char ssid[MAX_LEN_OF_SSID + 1];
-        unsigned char SsidLen;
-	u8 passphrase[LEN_PSK];
-	u8 pmk_len;
-        u8 pmk[LEN_PMK_MAX];
-	u8 ptk_len;
-        u8 ptk[LEN_MAX_PTK];
-};
-
-struct GNU_PACKED wapp_uri_info {
-	u8 src_mac[MAC_ADDR_LEN];
-	u8 uri_len;
-	u8 rcvd_uri[LEN_MAX_URI];
-};
-#endif /* MAP_R3 */
-
-struct GNU_PACKED wapp_srg_bitmap {
-	u32 color_31_0;
-	u32 color_63_32;
-	u32 bssid_31_0;
-	u32 bssid_63_32;
-};
-
-struct GNU_PACKED wapp_mesh_sr_info {
-	u8 sr_mode;
-	u8 ul_traffic_status;
-	struct wapp_srg_bitmap bm_info;
-};
-
-struct GNU_PACKED wapp_mesh_sr_topology {
-	u8 map_dev_count;
-	u8 map_dev_sr_support_mode;
-	u8 self_role;
-	u8 map_remote_al_mac[MAC_ADDR_LEN];
-	u8 map_remote_fh_bssid[MAC_ADDR_LEN];
-	u8 map_remote_bh_mac[MAC_ADDR_LEN];
-	unsigned char ssid_len;
-	unsigned char ssid[MAX_LEN_OF_SSID + 1];
-};
-
-typedef union GNU_PACKED _wapp_event_data {
-	wapp_dev_info dev_info;
-	wdev_ht_cap ht_cap;
-	wdev_vht_cap vht_cap;
-	wdev_misc_cap misc_cap;
-	wapp_client_info cli_info;
-	wdev_chn_info chn_list;
-	wdev_op_class_info op_class;
-	wdev_bss_info bss_info;
-	wdev_ap_metric ap_metrics;
-	wdev_ap_config ap_conf;
-	wdev_tx_power tx_pwr;
-	wdev_steer_sta str_sta;
-	wapp_probe_info probe_info;
-	wapp_bcn_rpt_info bcn_rpt_info;
-	wapp_bssload_info bssload_info;
-	wapp_bssload_crossing_info bssload_crossing_info;
-	wapp_mnt_info mnt_info;
-	wapp_bss_state_info bss_state_info;
-	wapp_ch_change_info ch_change_info;
-	wapp_txpower_change_info txpwr_change_info;
-	wapp_apcli_association_info apcli_association_info;
-	wapp_bhsta_info bhsta_info;
-	wapp_csa_info csa_info;
-	wapp_sta_cnnct_rej_info sta_cnnct_rej_info;
-	u8 ch_util;
-	struct wapp_scan_info scan_info;
-	struct wapp_wsc_scan_info wsc_scan_info;
-	u32 a4_missing_entry_ip;
-	struct radar_notif_s radar_notif;
-#ifdef WPS_UNCONFIG_FEATURE_SUPPORT
-	struct wapp_wps_config_info wps_conf_info;
-#endif
-        wapp_cac_info cac_info;
-#ifdef MAP_R2
-	wdev_extended_ap_metric ext_ap_metrics;
-	wdev_radio_metric radio_metrics;
-#endif
-#ifdef DPP_SUPPORT
-	u32 wapp_dpp_frame_id_no;
-	struct wapp_dpp_action_frame frame;
-	struct wapp_dpp_frm_tx_status tx_status;
-#ifdef DPP_R2_SUPPORT
-	struct cce_vendor_ie_result cce_ie_result;
-#endif
-#endif /*DPP_SUPPORT*/
-	unsigned char cac_enable;
-#ifdef WIFI_MD_COEX_SUPPORT
-	struct unsafe_channel_notif_s unsafe_ch_notif;
-	struct band_status_change band_status;
-#endif
-#ifdef MAP_R3
-	struct wapp_sta_info sta_info;
-        struct wapp_uri_info uri_info;
-#endif /* MAP_R3 */
-#ifdef QOS_R1
-	u8 *qos_frm;
-#endif
-	u8	ifname[IFNAMSIZ];
-#ifdef MAP_R3
-	struct wapp_mesh_sr_info mesh_sr_info;
-#endif /* MAP_R3 */
-} wapp_event_data;
-struct GNU_PACKED _wapp_event2_data {
-	wapp_client_info cli_info;
-};
-typedef struct GNU_PACKED _wapp_req_data {
-	u32	ifindex;
-	u8 mac_addr[MAC_ADDR_LEN];
-	u32 value;
-	bssload_threshold bssload_thrd;
-	wdev_steer_policy str_policy;
-	wdev_ap_config ap_conf;
-	WSC_CREDENTIAL bh_wsc_profile;
-	struct scan_BH_ssids scan_bh_ssids;
-#ifdef MAP_R3
-	struct wapp_srg_bitmap bm_info;
-	u8 band_index;
-	struct wapp_mesh_sr_topology topology_update;
-#endif /* MAP_R3 */
-} wapp_req_data;
-
-struct GNU_PACKED wapp_req {
-	u8 req_id;
-	u8 data_len;
-	wapp_req_data data;
-};
-
-struct GNU_PACKED wapp_event {
-	u8 len;
-	u8 event_id;
-	u32 ifindex;
-	wapp_event_data data;
-};
-struct GNU_PACKED wapp_event2 {
-	u8 len;
-	u8 event_id;
-	u32 ifindex;
-	struct _wapp_event2_data data;
-};
-typedef struct GNU_PACKED _tbtt_info_set {
-	u8 NrAPTbttOffset;
-	u32 ShortBssid;
-} tbtt_info_set;
-
-typedef struct GNU_PACKED _wapp_nr_info
-{
-	u8 	Bssid[MAC_ADDR_LEN];
-	u32 BssidInfo;
-	u8  RegulatoryClass;
-	u8  ChNum;
-	u8  PhyType;
-	u8  CandidatePrefSubID;
-	u8  CandidatePrefSubLen;
-	u8  CandidatePref;
-	/* extra sec info */
-	u32 akm;
-	u32 cipher;
-	u8  TbttInfoSetNum;
-	tbtt_info_set TbttInfoSet;
-	u8  Rssi;
-} wapp_nr_info;
-
-/* for NR IE , append Bssid ~ CandidatePref */
-#define NEIGHBOR_REPORT_IE_SIZE 	sizeof(wapp_nr_info) - 15
-
-
-typedef struct daemon_nr_list {
-	u8 	CurrListNum;
-	wapp_nr_info NRInfo[DAEMON_NEIGHBOR_REPORT_MAX_NUM];
-} DAEMON_NR_LIST, *P_DAEMON_NR_LIST;
-
-typedef struct GNU_PACKED daemon_neighbor_report_list {
-	u8	Newlist;
-	u8 	TotalNum;
-	u8 	CurrNum;
-	u8 	reserved;
-	wapp_nr_info EvtNRInfo[PER_EVENT_LIST_MAX_NUM];
-} DAEMON_EVENT_NR_LIST, *P_DAEMON_EVENT_NR_LIST;
-
-
-typedef struct GNU_PACKED neighbor_report_msg {
-	DAEMON_EVENT_NR_LIST evt_nr_list;
-} DAEMON_NR_MSG, *P_DAEMON_NR_MSG;
-
-
-/* for coverting wireless mode to string  */
-enum WIFI_MODE {
-	WMODE_INVALID = 0,
-	WMODE_A = 1 << 0,
-	WMODE_B = 1 << 1,
-	WMODE_G = 1 << 2,
-	WMODE_GN = 1 << 3,
-	WMODE_AN = 1 << 4,
-	WMODE_AC = 1 << 5,
-	WMODE_AX_24G = 1 << 6,
-	WMODE_AX_5G = 1 << 7,
-	WMODE_AX_6G = 1 << 8,
-	WMODE_COMP = 9, /* total types of supported wireless mode, add this value once yow add new type */
-};
-typedef union GNU_PACKED _RRM_BSSID_INFO
-{
-	struct GNU_PACKED
-	{
-#ifdef RT_BIG_ENDIAN
-		u32 Reserved:18;
-		u32 FTM:1;
-		u32 VHT:1;
-		u32 HT:1;
-		u32 MobilityDomain:1;
-		u32 ImmediateBA:1;
-		u32 DelayBlockAck:1;
-		u32 RRM:1;
-		u32 APSD:1;
-		u32 Qos:1;
-		u32 SpectrumMng:1;
-		u32 KeyScope:1;
-		u32 Security:1;
-		u32 APReachAble:2;
-#else
-		u32 APReachAble:2;
-		u32 Security:1;
-		u32 KeyScope:1;
-		u32 SpectrumMng:1;
-		u32 Qos:1;
-		u32 APSD:1;
-		u32 RRM:1;
-		u32 DelayBlockAck:1;
-		u32 ImmediateBA:1;
-		u32 MobilityDomain:1;
-		u32 HT:1;
-		u32 VHT:1;
-		u32 FTM:1;
-		u32 Reserved:18;
-#endif
-	} field;
-	u32 word;
-} RRM_BSSID_INFO, *PRRM_BSSID_INFO;
-#endif /* __WAPP_TYPES_H__ */
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/401-pinctrl-add-mt7986-driver-32bit.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/401-pinctrl-add-mt7986-driver-32bit.patch
new file mode 100644
index 0000000..5022e49
--- /dev/null
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/401-pinctrl-add-mt7986-driver-32bit.patch
@@ -0,0 +1,28 @@
+diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig
+index 701f9af..9109f91 100644
+--- a/drivers/pinctrl/mediatek/Kconfig
++++ b/drivers/pinctrl/mediatek/Kconfig
+@@ -100,6 +100,11 @@ config PINCTRL_MT7622
+ 	default ARM64 && ARCH_MEDIATEK
+ 	select PINCTRL_MTK_MOORE
+ 
++config PINCTRL_MT7986
++	bool "Mediatek MT7986 pin control"
++	depends on OF
++	select PINCTRL_MTK_MOORE
++
+ config PINCTRL_MT8173
+ 	bool "Mediatek MT8173 pin control"
+ 	depends on OF
+diff --git a/drivers/pinctrl/mediatek/Makefile b/drivers/pinctrl/mediatek/Makefile
+index a74325a..d408585 100644
+--- a/drivers/pinctrl/mediatek/Makefile
++++ b/drivers/pinctrl/mediatek/Makefile
+@@ -15,6 +15,7 @@ obj-$(CONFIG_PINCTRL_MT6797)	+= pinctrl-mt6797.o
+ obj-$(CONFIG_PINCTRL_MT7622)	+= pinctrl-mt7622.o
+ obj-$(CONFIG_PINCTRL_MT7623)	+= pinctrl-mt7623.o
+ obj-$(CONFIG_PINCTRL_MT7629)	+= pinctrl-mt7629.o
++obj-$(CONFIG_PINCTRL_MT7986)	+= pinctrl-mt7986.o
+ obj-$(CONFIG_PINCTRL_MT8173)	+= pinctrl-mt8173.o
+ obj-$(CONFIG_PINCTRL_MT8183)	+= pinctrl-mt8183.o
+ obj-$(CONFIG_PINCTRL_MT8516)	+= pinctrl-mt8516.o
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/999-add_armv7_support_for_panther.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/999-add_armv7_support_for_panther.patch
similarity index 100%
rename from recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/999-add_armv7_support_for_panther.patch
rename to recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/999-add_armv7_support_for_panther.patch
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/mt7986-32bit.cfg b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/mt7986-32bit.cfg
similarity index 100%
rename from recipes-kernel/linux/linux-mediatek-5.4/mediatek/mt7986-32bit.cfg
rename to recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-32bit-5.4/mt7986-32bit.cfg
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0101-add-mtk-wifi-utility-rbus.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0101-add-mtk-wifi-utility-rbus.patch
deleted file mode 100644
index 211324b..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0101-add-mtk-wifi-utility-rbus.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -urN a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile
---- a/drivers/net/wireless/Makefile	2020-05-08 12:16:50.030922777 +0800
-+++ b/drivers/net/wireless/Makefile	2020-05-08 12:16:55.718755223 +0800
-@@ -12,6 +12,7 @@
- obj-$(CONFIG_WLAN_VENDOR_INTERSIL) += intersil/
- obj-$(CONFIG_WLAN_VENDOR_MARVELL) += marvell/
- obj-$(CONFIG_WLAN_VENDOR_MEDIATEK) += mediatek/
-+obj-y += wifi_utility/
- obj-$(CONFIG_WLAN_VENDOR_RALINK) += ralink/
- obj-$(CONFIG_WLAN_VENDOR_REALTEK) += realtek/
- obj-$(CONFIG_WLAN_VENDOR_RSI) += rsi/
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0303-mtd-spinand-disable-on-die-ECC.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0303-mtd-spinand-disable-on-die-ECC.patch
new file mode 100644
index 0000000..5c18ea0
--- /dev/null
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0303-mtd-spinand-disable-on-die-ECC.patch
@@ -0,0 +1,31 @@
+From b341f120cfc9ca1dfd48364b7f36ac2c1fbdea43 Mon Sep 17 00:00:00 2001
+From: Xiangsheng Hou <xiangsheng.hou@mediatek.com>
+Date: Wed, 3 Apr 2019 16:30:01 +0800
+Subject: [PATCH 3/6] mtd: spinand: disable on-die ECC
+
+Change-Id: I9745adaed5295202fabbe8ab8947885c57a5b847
+Signed-off-by: Xiangsheng Hou <xiangsheng.hou@mediatek.com>
+---
+ drivers/mtd/nand/spi/core.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/mtd/nand/spi/core.c
++++ b/drivers/mtd/nand/spi/core.c
+@@ -491,7 +491,7 @@ static int spinand_mtd_read(struct mtd_i
+ 	int ret = 0;
+ 
+ 	if (ops->mode != MTD_OPS_RAW && spinand->eccinfo.ooblayout)
+-		enable_ecc = true;
++		enable_ecc = false;
+ 
+ 	mutex_lock(&spinand->lock);
+ 
+@@ -539,7 +539,7 @@ static int spinand_mtd_write(struct mtd_
+ 	int ret = 0;
+ 
+ 	if (ops->mode != MTD_OPS_RAW && mtd->ooblayout)
+-		enable_ecc = true;
++		enable_ecc = false;
+ 
+ 	mutex_lock(&spinand->lock);
+ 
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0600-net-phylink-propagate-resolved-link-config-via-mac_l.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0600-net-phylink-propagate-resolved-link-config-via-mac_l.patch
index a49b921..13a9a51 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0600-net-phylink-propagate-resolved-link-config-via-mac_l.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0600-net-phylink-propagate-resolved-link-config-via-mac_l.patch
@@ -109,6 +109,22 @@
  {
  	struct mvpp2_port *port = mvpp2_phylink_to_port(config);
  	u32 val;
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -449,9 +449,10 @@ static void mtk_mac_link_down(struct phy
+ 	mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
+ }
+ 
+-static void mtk_mac_link_up(struct phylink_config *config, unsigned int mode,
+-			    phy_interface_t interface,
+-			    struct phy_device *phy)
++static void mtk_mac_link_up(struct phylink_config *config,
++			    struct phy_device *phy,
++			    unsigned int mode, phy_interface_t interface,
++			    int speed, int duplex, bool tx_pause, bool rx_pause)
+ {
+ 	struct mtk_mac *mac = container_of(config, struct mtk_mac,
+ 					   phylink_config);
 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
 +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
 @@ -925,8 +925,10 @@ static void stmmac_mac_link_down(struct
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0671-add-micron-MT29F4G01ABAFD-spi-nand-support.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0671-add-micron-MT29F4G01ABAFD-spi-nand-support.patch
deleted file mode 100644
index 40833c0..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0671-add-micron-MT29F4G01ABAFD-spi-nand-support.patch
+++ /dev/null
@@ -1,111 +0,0 @@
---- a/drivers/mtd/nand/spi/micron.c
-+++ b/drivers/mtd/nand/spi/micron.c
-@@ -18,7 +18,9 @@
- #define MICRON_STATUS_ECC_4TO6_BITFLIPS	(3 << 4)
- #define MICRON_STATUS_ECC_7TO8_BITFLIPS	(5 << 4)
- 
--static SPINAND_OP_VARIANTS(read_cache_variants,
-+#define MICRON_CFG_CR			BIT(0)
-+
-+static SPINAND_OP_VARIANTS(quadio_read_cache_variants,
- 		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
- 		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
- 		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
-@@ -26,46 +28,46 @@ static SPINAND_OP_VARIANTS(read_cache_va
- 		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
- 		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
- 
--static SPINAND_OP_VARIANTS(write_cache_variants,
-+static SPINAND_OP_VARIANTS(x4_write_cache_variants,
- 		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
- 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
- 
--static SPINAND_OP_VARIANTS(update_cache_variants,
-+static SPINAND_OP_VARIANTS(x4_update_cache_variants,
- 		SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
- 		SPINAND_PROG_LOAD(false, 0, NULL, 0));
- 
--static int mt29f2g01abagd_ooblayout_ecc(struct mtd_info *mtd, int section,
--					struct mtd_oob_region *region)
-+static int micron_8_ooblayout_ecc(struct mtd_info *mtd, int section,
-+				  struct mtd_oob_region *region)
- {
- 	if (section)
- 		return -ERANGE;
- 
--	region->offset = 64;
--	region->length = 64;
-+	region->offset = mtd->oobsize / 2;
-+	region->length = mtd->oobsize / 2;
- 
- 	return 0;
- }
- 
--static int mt29f2g01abagd_ooblayout_free(struct mtd_info *mtd, int section,
--					 struct mtd_oob_region *region)
-+static int micron_8_ooblayout_free(struct mtd_info *mtd, int section,
-+				   struct mtd_oob_region *region)
- {
- 	if (section)
- 		return -ERANGE;
- 
- 	/* Reserve 2 bytes for the BBM. */
- 	region->offset = 2;
--	region->length = 62;
-+	region->length = (mtd->oobsize / 2) - 2;
- 
- 	return 0;
- }
- 
--static const struct mtd_ooblayout_ops mt29f2g01abagd_ooblayout = {
--	.ecc = mt29f2g01abagd_ooblayout_ecc,
--	.free = mt29f2g01abagd_ooblayout_free,
-+static const struct mtd_ooblayout_ops micron_8_ooblayout = {
-+	.ecc = micron_8_ooblayout_ecc,
-+	.free = micron_8_ooblayout_free,
- };
- 
--static int mt29f2g01abagd_ecc_get_status(struct spinand_device *spinand,
--					 u8 status)
-+static int micron_8_ecc_get_status(struct spinand_device *spinand,
-+				   u8 status)
- {
- 	switch (status & MICRON_STATUS_ECC_MASK) {
- 	case STATUS_ECC_NO_BITFLIPS:
-@@ -94,12 +96,21 @@ static const struct spinand_info micron_
- 	SPINAND_INFO("MT29F2G01ABAGD", 0x24,
- 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
- 		     NAND_ECCREQ(8, 512),
--		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
--					      &write_cache_variants,
--					      &update_cache_variants),
-+		     SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants,
-+					      &x4_write_cache_variants,
-+					      &x4_update_cache_variants),
- 		     0,
--		     SPINAND_ECCINFO(&mt29f2g01abagd_ooblayout,
--				     mt29f2g01abagd_ecc_get_status)),
-+		     SPINAND_ECCINFO(&micron_8_ooblayout,
-+				     micron_8_ecc_get_status)),
-+	SPINAND_INFO("MT29F4G01ABAFD", 0x34,
-+		     NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
-+		     NAND_ECCREQ(8, 512),
-+		     SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants,
-+					      &x4_write_cache_variants,
-+					      &x4_update_cache_variants),
-+		     SPINAND_HAS_CR_FEAT_BIT,
-+		     SPINAND_ECCINFO(&micron_8_ooblayout,
-+				     micron_8_ecc_get_status)),
- };
- 
- static int micron_spinand_detect(struct spinand_device *spinand)
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -270,6 +270,7 @@ struct spinand_ecc_info {
- };
- 
- #define SPINAND_HAS_QE_BIT		BIT(0)
-+#define SPINAND_HAS_CR_FEAT_BIT		BIT(1)
- 
- /**
-  * struct spinand_info - Structure used to describe SPI NAND chips
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0672-add-F50L1G41LB-and-GD5F1GQ5UExxG-snand-support.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0672-add-F50L1G41LB-and-GD5F1GQ5UExxG-snand-support.patch
deleted file mode 100644
index 63eee5d..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/0672-add-F50L1G41LB-and-GD5F1GQ5UExxG-snand-support.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-Index: linux-5.4.158/drivers/mtd/nand/spi/gigadevice.c
-===================================================================
---- linux-5.4.158.orig/drivers/mtd/nand/spi/gigadevice.c
-+++ linux-5.4.158/drivers/mtd/nand/spi/gigadevice.c
-@@ -36,6 +36,15 @@ static SPINAND_OP_VARIANTS(read_cache_va
- 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
- 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
- 
-+/* Q5 devices, QUADIO: Dummy bytes only valid for 1 GBit variants */
-+static SPINAND_OP_VARIANTS(gd5f1gq5_read_cache_variants,
-+		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
-+		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-+		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
-+		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
-+		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
-+		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
-+
- static SPINAND_OP_VARIANTS(write_cache_variants,
- 		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
- 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
-@@ -223,7 +232,54 @@ static int gd5fxgq4ufxxg_ecc_get_status(
- 	return -EINVAL;
- }
- 
-+static int esmt_1_ooblayout_ecc(struct mtd_info *mtd, int section,
-+				  struct mtd_oob_region *region)
-+{
-+	if (section > 3)
-+		return -ERANGE;
-+
-+	region->offset = (16 * section) + 8;
-+	region->length = 8;
-+
-+	return 0;
-+}
-+
-+static int esmt_1_ooblayout_free(struct mtd_info *mtd, int section,
-+				   struct mtd_oob_region *region)
-+{
-+	if (section > 3)
-+		return -ERANGE;
-+
-+	region->offset = (16 * section) + 2;
-+	region->length = 6;
-+
-+	return 0;
-+}
-+
-+static const struct mtd_ooblayout_ops esmt_1_ooblayout = {
-+	.ecc = esmt_1_ooblayout_ecc,
-+	.free = esmt_1_ooblayout_free,
-+};
-+
- static const struct spinand_info gigadevice_spinand_table[] = {
-+	SPINAND_INFO("F50L1G41LB", 0x01,
-+		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
-+		     NAND_ECCREQ(8, 512),
-+		     SPINAND_INFO_OP_VARIANTS(&gd5f1gq5_read_cache_variants,
-+					      &write_cache_variants,
-+					      &update_cache_variants),
-+		     0,
-+		     SPINAND_ECCINFO(&esmt_1_ooblayout,
-+				     NULL)),
-+	SPINAND_INFO("GD5F1GQ5UExxG", 0x51,
-+		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
-+		     NAND_ECCREQ(4, 512),
-+		     SPINAND_INFO_OP_VARIANTS(&gd5f1gq5_read_cache_variants,
-+					      &write_cache_variants,
-+					      &update_cache_variants),
-+		     SPINAND_HAS_QE_BIT,
-+		     SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
-+				     gd5fxgq4xa_ecc_get_status)),
- 	SPINAND_INFO("GD5F1GQ4xA", 0xF1,
- 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
- 		     NAND_ECCREQ(8, 512),
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/1004_remove_eth_transmit_timeout_hw_reset.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/1004_remove_eth_transmit_timeout_hw_reset.patch
deleted file mode 100755
index 69a0acb..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/1004_remove_eth_transmit_timeout_hw_reset.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-Index: linux-5.4.143/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-===================================================================
---- linux-5.4.143.orig/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ linux-5.4.143/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2483,9 +2483,7 @@ static void mtk_tx_timeout(struct net_de
- 	eth->netdev[mac->id]->stats.tx_errors++;
- 	netif_err(eth, tx_err, dev,
- 		  "transmit timed out\n");
--	schedule_work(&eth->pending_work);
- }
--
- static irqreturn_t mtk_handle_irq_rx(int irq, void *priv)
- {
- 	struct mtk_napi *rx_napi = priv;
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/1005-mtkhnat-fix-pse-hang-for-multi-stations.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/1005-mtkhnat-fix-pse-hang-for-multi-stations.patch
deleted file mode 100644
index aaf1794..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/1005-mtkhnat-fix-pse-hang-for-multi-stations.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c b/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
-index c0794e37..2968eb68 100644
---- a/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
-+++ b/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
-@@ -250,6 +250,7 @@ static int hnat_start(int ppe_id)
- 	writel(0, hnat_priv->ppe_base[ppe_id] + PPE_DFT_CPORT); /* pdma */
- 	/* writel(0x55555555, hnat_priv->ppe_base[ppe_id] + PPE_DFT_CPORT); */ /* qdma */
- 	cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_GLO_CFG, TTL0_DRP, 0);
-+	cr_set_field(hnat_priv->ppe_base[ppe_id] + PPE_GLO_CFG, MCAST_TB_EN, 1);
- 
- 	if (hnat_priv->data->version == MTK_HNAT_V4) {
- 		writel(0xcb777, hnat_priv->ppe_base[ppe_id] + PPE_DFT_CPORT1);
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/401-pinctrl-add-mt7986-driver.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/401-pinctrl-add-mt7986-driver.patch
index 5022e49..a02873d 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/401-pinctrl-add-mt7986-driver.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/401-pinctrl-add-mt7986-driver.patch
@@ -2,13 +2,15 @@
 index 701f9af..9109f91 100644
 --- a/drivers/pinctrl/mediatek/Kconfig
 +++ b/drivers/pinctrl/mediatek/Kconfig
-@@ -100,6 +100,11 @@ config PINCTRL_MT7622
+@@ -100,6 +100,13 @@ config PINCTRL_MT7622
  	default ARM64 && ARCH_MEDIATEK
  	select PINCTRL_MTK_MOORE
  
 +config PINCTRL_MT7986
 +	bool "Mediatek MT7986 pin control"
 +	depends on OF
++	depends on ARM64 || COMPILE_TEST
++	default ARM64 && ARCH_MEDIATEK
 +	select PINCTRL_MTK_MOORE
 +
  config PINCTRL_MT8173
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/412-mtd-spinand-gigadevice-Add-support-for-F50L1G41LB-and-GD5F1GQ5UExxG.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/412-mtd-spinand-gigadevice-Add-support-for-F50L1G41LB-and-GD5F1GQ5UExxG.patch
new file mode 100644
index 0000000..32bce58
--- /dev/null
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/412-mtd-spinand-gigadevice-Add-support-for-F50L1G41LB-and-GD5F1GQ5UExxG.patch
@@ -0,0 +1,44 @@
+--- a/drivers/mtd/nand/spi/gigadevice.c
++++ b/drivers/mtd/nand/spi/gigadevice.c
+@@ -39,6 +39,15 @@ static SPINAND_OP_VARIANTS(read_cache_va
+ 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
+ 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
+ 
++/* Q5 devices, QUADIO: Dummy bytes only valid for 1 GBit variants */
++static SPINAND_OP_VARIANTS(gd5f1gq5_read_cache_variants,
++		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
++
+ static SPINAND_OP_VARIANTS(write_cache_variants,
+ 		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+ 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
+@@ -265,6 +274,16 @@ static int gd5fxgq4ufxxg_ecc_get_status(
+ }
+ 
+ static const struct spinand_info gigadevice_spinand_table[] = {
++	SPINAND_INFO("F50L1G41LB",
++	             SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01),
++		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++		     NAND_ECCREQ(8, 512),
++		     SPINAND_INFO_OP_VARIANTS(&gd5f1gq5_read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     0,
++		     SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
++				     gd5fxgq4xa_ecc_get_status)),
+ 	SPINAND_INFO("GD5F1GQ4xA",
+ 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xf1),
+ 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
+@@ -337,7 +356,7 @@ static const struct spinand_info gigadev
+ 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51),
+ 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
+ 		     NAND_ECCREQ(4, 512),
+-		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++		     SPINAND_INFO_OP_VARIANTS(&gd5f1gq5_read_cache_variants,
+ 					      &write_cache_variants,
+ 					      &update_cache_variants),
+ 		     SPINAND_HAS_QE_BIT,
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/413-mtd-spinand-gigadevice-Add-support-for-GD5FxGQxUExxG-GD5FxGQxUExxH-and-GD5FxGMxUExxG-series.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/413-mtd-spinand-gigadevice-Add-support-for-GD5FxGQxUExxG-GD5FxGQxUExxH-and-GD5FxGMxUExxG-series.patch
new file mode 100644
index 0000000..83e4c71
--- /dev/null
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/413-mtd-spinand-gigadevice-Add-support-for-GD5FxGQxUExxG-GD5FxGQxUExxH-and-GD5FxGMxUExxG-series.patch
@@ -0,0 +1,128 @@
+--- a/drivers/mtd/nand/spi/gigadevice.c
++++ b/drivers/mtd/nand/spi/gigadevice.c
+@@ -39,8 +39,9 @@ static SPINAND_OP_VARIANTS(read_cache_va
+ 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
+ 		SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
+ 
+-/* Q5 devices, QUADIO: Dummy bytes only valid for 1 GBit variants */
+-static SPINAND_OP_VARIANTS(gd5f1gq5_read_cache_variants,
++/* For Q5 devices, QUADIO use different dummy byte settings */
++/* Q5 1Gb */
++static SPINAND_OP_VARIANTS(dummy2_read_cache_variants,
+ 		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
+ 		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+ 		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
+@@ -48,6 +49,15 @@ static SPINAND_OP_VARIANTS(gd5f1gq5_read
+ 		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+ 		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
+ 
++/* Q5 2Gb & 4Gb */
++static SPINAND_OP_VARIANTS(dummy4_read_cache_variants,
++		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
++		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
++
+ static SPINAND_OP_VARIANTS(write_cache_variants,
+ 		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+ 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
+@@ -249,7 +259,7 @@ static const struct spinand_info gigadev
+ 	             SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01),
+ 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
+ 		     NAND_ECCREQ(8, 512),
+-		     SPINAND_INFO_OP_VARIANTS(&gd5f1gq5_read_cache_variants,
++		     SPINAND_INFO_OP_VARIANTS(&dummy2_read_cache_variants,
+ 					      &write_cache_variants,
+ 					      &update_cache_variants),
+ 		     0,
+@@ -309,7 +319,87 @@ static const struct spinand_info gigadev
+ 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51),
+ 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
+ 		     NAND_ECCREQ(4, 512),
+-		     SPINAND_INFO_OP_VARIANTS(&gd5f1gq5_read_cache_variants,
++		     SPINAND_INFO_OP_VARIANTS(&dummy2_read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq5xexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F2GQ5UExxG",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x52),
++		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
++		     NAND_ECCREQ(4, 512),
++		     SPINAND_INFO_OP_VARIANTS(&dummy4_read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq5xexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F4GQ6UExxG",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x55),
++		     NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
++		     NAND_ECCREQ(4, 512),
++		     SPINAND_INFO_OP_VARIANTS(&dummy4_read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq5xexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F1GM7UExxG",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x91),
++		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
++		     NAND_ECCREQ(8, 512),
++		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq4uexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F2GM7UExxG",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x92),
++		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
++		     NAND_ECCREQ(8, 512),
++		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq4uexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F4GM8UExxG",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x95),
++		     NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
++		     NAND_ECCREQ(8, 512),
++		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq4uexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F1GQ5UExxH",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x31),
++		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++		     NAND_ECCREQ(4, 512),
++		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq5xexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F2GQ5UExxH",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x32),
++		     NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
++		     NAND_ECCREQ(4, 512),
++		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++					      &write_cache_variants,
++					      &update_cache_variants),
++		     SPINAND_HAS_QE_BIT,
++		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
++				     gd5fxgq5xexxg_ecc_get_status)),
++	SPINAND_INFO("GD5F4GQ6UExxH",
++		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x32),
++		     NAND_MEMORG(1, 2048, 64, 64, 4096, 80, 1, 1, 1),
++		     NAND_ECCREQ(4, 512),
++		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ 					      &write_cache_variants,
+ 					      &update_cache_variants),
+ 		     SPINAND_HAS_QE_BIT,
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9001-PATCH-1-2-xHCI-MT7986-USB-2.0-USBIF-compliance-toolkit.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9001-PATCH-1-2-xHCI-MT7986-USB-2.0-USBIF-compliance-toolkit.patch
index 738d9b2..452b237 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9001-PATCH-1-2-xHCI-MT7986-USB-2.0-USBIF-compliance-toolkit.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9001-PATCH-1-2-xHCI-MT7986-USB-2.0-USBIF-compliance-toolkit.patch
@@ -1,4 +1,4 @@
-From b4048b5efd1ac39f85d86dedbf54a9b614d17d64 Mon Sep 17 00:00:00 2001
+From 9deb29cc86b8fdee6702f8d575f08f9a214cf90a Mon Sep 17 00:00:00 2001
 From: Zhanyong Wang <zhanyong.wang@mediatek.com>
 Date: Thu, 27 May 2021 11:44:17 +0800
 Subject: [PATCH 1/2] xHCI: MT7986 USB 2.0 USBIF compliance toolkit
@@ -8,12 +8,12 @@
 Signed-off-by: Zhanyong Wang <zhanyong.wang@mediatek.com>
 ---
  drivers/usb/host/Kconfig    | 9 +++++++++
- drivers/usb/host/Makefile   | 8 ++++++++
+ drivers/usb/host/Makefile   | 9 +++++++++
  drivers/usb/host/xhci-mtk.c | 5 ++++-
  drivers/usb/host/xhci-mtk.h | 7 +++++++
  drivers/usb/host/xhci.c     | 2 +-
  drivers/usb/host/xhci.h     | 1 +
- 6 files changed, 30 insertions(+), 2 deletions(-)
+ 6 files changed, 31 insertions(+), 2 deletions(-)
 
 diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
 index 79b2e79dddd0..12b1bf9aa043 100644
@@ -36,10 +36,10 @@
  	tristate "xHCI support for Marvell Armada 375/38x/37xx"
  	select USB_XHCI_PLATFORM
 diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
-index b191361257cc..704237831a58 100644
+index b191361257cc..612c855adfa1 100644
 --- a/drivers/usb/host/Makefile
 +++ b/drivers/usb/host/Makefile
-@@ -21,6 +21,14 @@ endif
+@@ -21,6 +21,15 @@ endif
  
  ifneq ($(CONFIG_USB_XHCI_MTK), )
  	xhci-hcd-y += xhci-mtk-sch.o
@@ -51,6 +51,7 @@
 +	xhci-hcd-$(CONFIG_USB_XHCI_MTK_DEBUGFS) += xhci-mtk-hstx-srctrl.o
 +	xhci-hcd-$(CONFIG_USB_XHCI_MTK_DEBUGFS) += xhci-mtk-discth.o
 +	xhci-hcd-$(CONFIG_USB_XHCI_MTK_DEBUGFS) += xhci-mtk-chgdt-en.o
++	xhci-hcd-$(CONFIG_USB_XHCI_MTK_DEBUGFS) += xhci-mtk-reg.o
  endif
  
  xhci-plat-hcd-y := xhci-plat.o
@@ -105,7 +106,7 @@
  
  static inline struct xhci_hcd_mtk *hcd_to_mtk(struct usb_hcd *hcd)
 diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
-index 4bb850370bb6..710ccbe5a3b8 100644
+index 1c8070023161..cf004950bc00 100644
 --- a/drivers/usb/host/xhci.c
 +++ b/drivers/usb/host/xhci.c
 @@ -713,7 +713,7 @@ EXPORT_SYMBOL_GPL(xhci_run);
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9002-PATCH-1-1-usb-add-embedded-Host-feature-support.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9002-PATCH-1-1-usb-add-embedded-Host-feature-support.patch
index 356ae99..14c32a8 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9002-PATCH-1-1-usb-add-embedded-Host-feature-support.patch
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9002-PATCH-1-1-usb-add-embedded-Host-feature-support.patch
@@ -1,4 +1,4 @@
-From 801da3c9fd916d3743b8af174f4ef4aefc071981 Mon Sep 17 00:00:00 2001
+From 5b28b61fb9c88e3d2f7c7057929d55e54bc17966 Mon Sep 17 00:00:00 2001
 From: Zhanyong Wang <zhanyong.wang@mediatek.com>
 Date: Thu, 17 Jun 2021 16:09:04 +0800
 Subject: [PATCH 2/2] usb: add embedded Host feature support
@@ -20,10 +20,10 @@
  3 files changed, 47 insertions(+), 3 deletions(-)
 
 diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
-index 303e8b3c1bda..b8c96ac26886 100644
+index 4cf0dc7f330d..f2f330606d0c 100644
 --- a/drivers/usb/core/hub.c
 +++ b/drivers/usb/core/hub.c
-@@ -2419,6 +2419,8 @@ static int usb_enumerate_device(struct usb_device *udev)
+@@ -2422,6 +2422,8 @@ static int usb_enumerate_device(struct usb_device *udev)
  			if (err < 0)
  				dev_dbg(&udev->dev, "HNP fail, %d\n", err);
  		}
@@ -32,7 +32,7 @@
  		return -ENOTSUPP;
  	}
  
-@@ -4778,9 +4780,10 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
+@@ -4779,9 +4781,10 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
  				goto fail;
  			}
  			if (r) {
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9999-null-test.patch b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9999-null-test.patch
deleted file mode 100644
index e69de29..0000000
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/9999-null-test.patch
+++ /dev/null
diff --git a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/patches-5.4.inc b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/patches-5.4.inc
index 2fbfbf9..c99ccdc 100644
--- a/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/patches-5.4.inc
+++ b/recipes-kernel/linux/linux-mediatek-5.4/mediatek/patches-5.4/patches-5.4.inc
@@ -13,12 +13,12 @@
     file://0020-dts-mt7622-enable-new-mtk-snand-for-ubi.patch \
     file://0021-dts-mt7622-remove-cooling-device.patch \
     file://0100-hwnat_Kconfig_Makefile.patch \
-    file://0101-add-mtk-wifi-utility-rbus.patch \
     file://0111-mt7986-trng-add-rng-support.patch \
     file://0200-show_model_name_in_cpuinfo_on_arm64.patch \
     file://0226-phy-phy-mtk-tphy-Add-hifsys-support.patch \
     file://0227-arm-dts-Add-Unielec-U7623-DTS.patch \
     file://0301-mtd-mtk-ecc-move-mtk-ecc-header-file-to-include-mtd.patch \
+    file://0303-mtd-spinand-disable-on-die-ECC.patch \
     file://0306-spi-spi-mem-MediaTek-Add-SPI-NAND-Flash-interface-dr.patch \
     file://0307-dts-mt7629-add-snand-support.patch \
     file://0308-dts-mt7622-add-snand-support.patch \
@@ -31,7 +31,7 @@
     file://0502-dts-mt7623-eip97-inside-secure-support.patch \
     file://0503-crypto-fix-eip97-cache-incoherent.patch \
     file://0504-macsec-revert-async-support.patch \
-    file://0600-net-phylink-propagate-resolved-link-config-via-mac_l.patch \
+    file://0600-net-phylink-propagate-resolved-link-config-via-mac_l.patch;apply=no \
     file://0601-net-dsa-propagate-resolved-link-config-via-mac_link_.patch \
     file://0602-net-dsa-mt7530-use-resolved-link-config-in-mac_link_.patch \
     file://0603-net-dsa-mt7530-Extend-device-data-ready-for-adding-a.patch \
@@ -43,8 +43,6 @@
     file://0668-spi-mediatek-fix-dma-unmap-twice.patch \
     file://0669-fix-SPIM-NAND-and-NOR-probing.patch \
     file://0670-fix-SPIM-dma-buffer-not-aligned.patch \
-    file://0671-add-micron-MT29F4G01ABAFD-spi-nand-support.patch \
-    file://0672-add-F50L1G41LB-and-GD5F1GQ5UExxG-snand-support.patch \
     file://0701-fix-mtk-nfi-driver-dependency.patch \
     file://0801-mtk-sd-add-mt7986-support.patch \
     file://0900-bt-mtk-serial-fix.patch \
@@ -61,8 +59,6 @@
     file://1001-mtkhnat-ipv6-fix-pskb-expand-head-limitation.patch \
     file://1002-mtkhnat-add-support-for-virtual-interface-acceleration.patch \
     file://1003-dts-mt7622-rfb-change-to-ax-mtd-layout.patch \
-    file://1004_remove_eth_transmit_timeout_hw_reset.patch \
-    file://1005-mtkhnat-fix-pse-hang-for-multi-stations.patch \
     file://1010-pcie-mediatek-fix-clearing-interrupt-status.patch \
     file://1015-pcie-add-pcie-gen3-upstream-driver.patch \
     file://1020-spi-nor-w25q512jv.patch \
@@ -74,6 +70,8 @@
     file://400-mtd-add-mtk-snand-driver.patch \
     file://401-pinctrl-add-mt7986-driver.patch \
     file://402-pinctrl-add-mt7981-driver.patch \
+    file://412-mtd-spinand-gigadevice-Add-support-for-F50L1G41LB-and-GD5F1GQ5UExxG.patch \
+    file://413-mtd-spinand-gigadevice-Add-support-for-GD5FxGQxUExxG-GD5FxGQxUExxH-and-GD5FxGMxUExxG-series.patch \
     file://500-auxadc-add-auxadc-32k-clk.patch \
     file://730-net-ethernet-mtk_eth_soc-add-mtk-dsa-tag-rx-offload.patch \
     file://738-mt7531-gsw-internal_phy_calibration.patch \
@@ -95,7 +93,5 @@
     file://9001-PATCH-1-2-xHCI-MT7986-USB-2.0-USBIF-compliance-toolkit.patch \
     file://9002-PATCH-1-1-usb-add-embedded-Host-feature-support.patch \
     file://9009-Add-spi-runtime-PM-support.patch \
-    file://9010-iwconfig-wireless-rate-fix.patch \
-    file://999-add_armv7_support_for_panther.patch \
-    file://9999-null-test.patch \
+    file://9010-iwconfig-wireless-rate-fix.patch;apply=no \
     "