[][openwrt][[MAC80211][hnat][Refactor HQoS PPPQ function to enable QDMA queue rate limit adjust dynamically]

[Description]
Refactor HQoS PPPQ function to enable QDMA queue rate limit adjust dynamically.

[Release-log]
N/A


Change-Id: Ifef8086ff26233a7f09f1ed0a9fb7d2b7801156e
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/10924057
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch
index 467908f..fe61707 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch
@@ -1,19 +1,19 @@
-From afe52388d50de92c69e0ce0beb22f8dbb33fc8c1 Mon Sep 17 00:00:00 2001
+From c557c27733996b90479841995ef04783e209285b Mon Sep 17 00:00:00 2001
 From: "chak-kei.lam" <chak-kei.lam@mediatek.com>
-Date: Tue, 15 Jul 2025 10:23:04 +0800
+Date: Thu, 17 Jul 2025 11:22:34 +0800
 Subject: [PATCH] flow offload add mtkhnat qdma qos
 
 ---
  drivers/net/ethernet/mediatek/Makefile        |   2 +-
  drivers/net/ethernet/mediatek/mtk_eth_soc.c   |   2 +
- drivers/net/ethernet/mediatek/mtk_eth_soc.h   |  24 ++++
- drivers/net/ethernet/mediatek/mtk_ppe.c       |  37 ++++-
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h   |  31 +++++
+ drivers/net/ethernet/mediatek/mtk_ppe.c       |  37 +++++-
  drivers/net/ethernet/mediatek/mtk_ppe.h       |   3 +
- .../net/ethernet/mediatek/mtk_ppe_offload.c   |  48 +++++--
- .../net/ethernet/mediatek/mtk_qdma_debugfs.c  | 135 ++++++++++++++++++
+ .../net/ethernet/mediatek/mtk_ppe_offload.c   |  58 +++++++--
+ .../net/ethernet/mediatek/mtk_qdma_debugfs.c  | 118 ++++++++++++++++++
  include/net/flow_offload.h                    |   1 +
  net/netfilter/nf_flow_table_offload.c         |   4 +-
- 9 files changed, 244 insertions(+), 12 deletions(-)
+ 9 files changed, 242 insertions(+), 14 deletions(-)
  create mode 100644 drivers/net/ethernet/mediatek/mtk_qdma_debugfs.c
 
 diff --git a/drivers/net/ethernet/mediatek/Makefile b/drivers/net/ethernet/mediatek/Makefile
@@ -30,10 +30,10 @@
  ifdef CONFIG_DEBUG_FS
  mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index ab93631..ca37ba5 100644
+index 010a971..c166c35 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -6707,6 +6707,8 @@ static int mtk_probe(struct platform_device *pdev)
+@@ -6706,6 +6706,8 @@ static int mtk_probe(struct platform_device *pdev)
  		}
  
  		mtk_ppe_debugfs_init(eth);
@@ -43,7 +43,7 @@
  
  	for (i = 0; i < MTK_MAX_DEVS; i++) {
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-index a66cffe..efad9eb 100644
+index ce660c2..cc062b8 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 @@ -2383,6 +2383,7 @@ struct mtk_eth {
@@ -54,7 +54,7 @@
  	u8				ppe_num;
  	struct mtk_ppe			*ppe[MTK_MAX_PPE_NUM];
  	struct rhashtable		flow_table;
-@@ -2462,6 +2463,27 @@ mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash)
+@@ -2462,6 +2463,34 @@ mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash)
  	return ppe->foe_table + hash * soc->foe_entry_size;
  }
  
@@ -68,21 +68,28 @@
 +}
 +
 +static inline int
-+mtk_ppe_check_pppq_path(struct net_device *idev, int dsa_port)
++mtk_ppe_check_pppq_path(struct mtk_mac *mac, struct net_device *idev, int dsa_port)
 +{
 +	bool wifi_rx = !!(idev->ieee80211_ptr);
 +
++	/* Handle cases of DSA switch ports */
 +	if ((dsa_port >= 0 && dsa_port <= 4) ||
 +	    (dsa_port == 5 && wifi_rx))
 +		return 1;
 +
++#if defined(CONFIG_MEDIATEK_NETSYS_V3)
++	/* Handle cases of GMAC port linked less or equal to 1Gbps */
++	if (mac->speed <= SPEED_1000)
++		return 1;
++#endif
++
 +	return 0;
 +}
 +
  /* read the hardware status register */
  void mtk_stats_update_mac(struct mtk_mac *mac);
  
-@@ -2500,4 +2522,6 @@ int mtk_ptp_clock_init(struct mtk_eth *eth);
+@@ -2500,4 +2529,6 @@ int mtk_ptp_clock_init(struct mtk_eth *eth);
  int mtk_ptp_clock_deinit(struct mtk_eth *eth);
  
  int mtk_ppe_debugfs_init(struct mtk_eth *eth);
@@ -180,7 +187,7 @@
  
  #endif
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index b80f72d..53cc9cf 100755
+index b80f72d..16f8477 100755
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 @@ -9,6 +9,8 @@
@@ -192,7 +199,7 @@
  #include <net/dsa.h>
  #include "mtk_eth_soc.h"
  #include "mtk_wed.h"
-@@ -183,13 +185,21 @@ mtk_flow_get_dsa_port(struct net_device **dev)
+@@ -183,13 +185,22 @@ mtk_flow_get_dsa_port(struct net_device **dev)
  
  static int
  mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
@@ -204,43 +211,51 @@
  	struct mtk_wdma_info info = {};
 -	int pse_port, dsa_port;
 +	struct nf_conn *ct = NULL;
++	struct mtk_mac *mac;
 +	u32 ct_mark = 0;
 +	int pse_port, dsa_port, queue;
- 
--	if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) {
++
 +	if (f->flow && f->flow->ct) {
 +		ct = f->flow->ct;
 +		ct_mark = ct->mark;
 +	}
-+
+ 
+-	if (mtk_flow_get_wdma_info(dev, dest_mac, &info) == 0) {
 +	if (mtk_flow_get_wdma_info(odev, dest_mac, &info) == 0) {
  		mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss,
  				       info.wcid);
  		pse_port = PSE_PPE0_PORT;
-@@ -205,18 +215,40 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+@@ -205,18 +216,45 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  		goto out;
  	}
  
 -	dsa_port = mtk_flow_get_dsa_port(&dev);
 -	if (dsa_port >= 0)
+-		mtk_foe_entry_set_dsa(foe, dsa_port);
 +	dsa_port = mtk_flow_get_dsa_port(&odev);
-+	if (dsa_port >= 0) {
-+		queue = dsa_port;
- 		mtk_foe_entry_set_dsa(foe, dsa_port);
-+	}
-+
-+	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(idev, dsa_port))
-+		mtk_foe_entry_set_qid(foe, queue & MTK_QDMA_TX_MASK);
  
 -	if (dev == eth->netdev[0])
-+	if (odev == eth->netdev[0])
++	if (odev == eth->netdev[0]) {
++		mac = eth->mac[0];
  		pse_port = PSE_GDM1_PORT;
 -	else if (dev == eth->netdev[1])
-+	else if (odev == eth->netdev[1])
++	} else if (odev == eth->netdev[1]) {
++		mac = eth->mac[1];
  		pse_port = PSE_GDM2_PORT;
- 	else
+-	else
++	} else
  		return -EOPNOTSUPP;
  
++	if (dsa_port >= 0) {
++		queue = dsa_port + MTK_GMAC_ID_MAX;
++		mtk_foe_entry_set_dsa(foe, dsa_port);
++	} else {
++		queue = (pse_port == PSE_GDM3_PORT) ? 2 : pse_port - 1;
++	}
++
++	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(mac, idev, dsa_port))
++		mtk_foe_entry_set_qid(foe, queue & MTK_QDMA_TX_MASK);
++
  out:
 +	if (eth->qos_toggle == 1 || (ct_mark & MTK_QDMA_TX_MASK) >= 6) {
 +		u8 qos_ul_toggle;
@@ -262,7 +277,7 @@
  	mtk_foe_entry_set_pse_port(foe, pse_port);
  
  	return 0;
-@@ -447,7 +479,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -447,7 +485,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
  	if (data.pppoe.num == 1)
  		mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid);
  
@@ -273,10 +288,10 @@
  		return err;
 diff --git a/drivers/net/ethernet/mediatek/mtk_qdma_debugfs.c b/drivers/net/ethernet/mediatek/mtk_qdma_debugfs.c
 new file mode 100644
-index 0000000..e8839b7
+index 0000000..9f77236
 --- /dev/null
 +++ b/drivers/net/ethernet/mediatek/mtk_qdma_debugfs.c
-@@ -0,0 +1,135 @@
+@@ -0,0 +1,118 @@
 +/* SPDX-License-Identifier: GPL-2.0
 + *
 + * Copyright (c) 2022 MediaTek Inc.
@@ -291,21 +306,6 @@
 +
 +static struct mtk_eth *_eth;
 +
-+static void mtk_qdma_qos_shaper_ebl(struct mtk_eth *eth, u32 id, u32 enable)
-+{
-+	qdma_qos_shaper_ebl(id, enable);
-+}
-+
-+static void mtk_qdma_qos_disable(struct mtk_eth *eth)
-+{
-+	qdma_qos_disable();
-+}
-+
-+static void mtk_qdma_qos_pppq_enable(struct mtk_eth *eth)
-+{
-+	qdma_qos_pppq_ebl(true);
-+}
-+
 + static ssize_t mtk_qmda_debugfs_write_qos(struct file *file, const char __user *buffer,
 +					   size_t count, loff_t *data)
 +{
@@ -320,15 +320,13 @@
 +	if (buf[0] == '0') {
 +		pr_info("HQoS is going to be disabled !\n");
 +		eth->qos_toggle = 0;
-+		mtk_qdma_qos_disable(eth);
 +	} else if (buf[0] == '1') {
 +		pr_info("HQoS mode is going to be enabled !\n");
 +		eth->qos_toggle = 1;
 +	} else if (buf[0] == '2') {
 +		pr_info("Per-port-per-queue mode is going to be enabled !\n");
-+		pr_info("PPPQ use qid 0~11 (scheduler 0).\n");
++		pr_info("PPPQ use qid 0~14 (scheduler 0).\n");
 +		eth->qos_toggle = 2;
-+		mtk_qdma_qos_pppq_enable(eth);
 +	}
 +
 +	return len;
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3015-ethernet-update-ppe-from-netsys2-to-netsys3.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3015-ethernet-update-ppe-from-netsys2-to-netsys3.patch
index d8b26b4..7283027 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3015-ethernet-update-ppe-from-netsys2-to-netsys3.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3015-ethernet-update-ppe-from-netsys2-to-netsys3.patch
@@ -8,15 +8,15 @@
  drivers/net/ethernet/mediatek/mtk_eth_soc.h   |  5 +-
  drivers/net/ethernet/mediatek/mtk_ppe.c       | 74 +++++++++++++++++--
  drivers/net/ethernet/mediatek/mtk_ppe.h       | 44 +++++++++--
- .../net/ethernet/mediatek/mtk_ppe_offload.c   |  6 +-
+ .../net/ethernet/mediatek/mtk_ppe_offload.c   |  7 +-
  drivers/net/ethernet/mediatek/mtk_ppe_regs.h  |  8 ++
- 6 files changed, 131 insertions(+), 19 deletions(-)
+ 6 files changed, 132 insertions(+), 19 deletions(-)
 
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index ca37ba5..01ddb22 100644
+index c166c35..3fc070c 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2730,7 +2730,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
+@@ -2741,7 +2741,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
  			skb_checksum_none_assert(skb);
  		skb->protocol = eth_type_trans(skb, netdev);
  
@@ -25,7 +25,7 @@
  		hash = trxd.rxd5 & MTK_RXD5_FOE_ENTRY_V2;
  		reason = FIELD_GET(MTK_RXD5_PPE_CPU_REASON_V2, trxd.rxd5);
  		if (hash != MTK_RXD5_FOE_ENTRY_V2)
-@@ -6694,7 +6694,8 @@ static int mtk_probe(struct platform_device *pdev)
+@@ -6693,7 +6693,8 @@ static int mtk_probe(struct platform_device *pdev)
  
  		for (i = 0; i < eth->ppe_num; i++) {
  			eth->ppe[i] = mtk_ppe_init(eth,
@@ -35,7 +35,7 @@
  						   i);
  			if (!eth->ppe[i]) {
  				err = -ENOMEM;
-@@ -6998,6 +6999,10 @@ static const struct mtk_soc_data mt7988_data = {
+@@ -6997,6 +6998,10 @@ static const struct mtk_soc_data mt7988_data = {
  	.required_clks = MT7988_CLKS_BITMAP,
  	.required_pctl = false,
  	.has_sram = true,
@@ -46,7 +46,7 @@
  	.rss_num = 4,
  	.txrx = {
  		.txd_size = sizeof(struct mtk_tx_dma_v2),
-@@ -7019,6 +7024,10 @@ static const struct mtk_soc_data mt7987_data = {
+@@ -7018,6 +7023,10 @@ static const struct mtk_soc_data mt7987_data = {
  	.required_clks = MT7987_CLKS_BITMAP,
  	.required_pctl = false,
  	.has_sram = true,
@@ -58,7 +58,7 @@
  	.txrx = {
  		.txd_size = sizeof(struct mtk_tx_dma_v2),
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-index efad9eb..708e32c 100644
+index cc062b8..1482139 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 @@ -195,9 +195,10 @@
@@ -371,10 +371,10 @@
  int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
  void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index 6eb5fe9..38af97c 100755
+index 6b08a07..9e84fe8 100755
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-@@ -283,7 +283,7 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+@@ -204,7 +204,7 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  		mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss,
  				       info.wcid);
  		pse_port = PSE_PPE0_PORT;
@@ -383,16 +383,17 @@
  		if (info.wdma_idx == 0)
  			pse_port = PSE_WDMA0_PORT;
  		else if (info.wdma_idx == 1)
-@@ -316,6 +316,8 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
- 		pse_port = PSE_GDM1_PORT;
- 	else if (odev == eth->netdev[1])
+@@ -228,6 +228,9 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+ 	} else if (odev == eth->netdev[1]) {
+ 		mac = eth->mac[1];
  		pse_port = PSE_GDM2_PORT;
-+	else if (odev == eth->netdev[2])
++	} else if (odev == eth->netdev[2]) {
++		mac = eth->mac[2];
 +		pse_port = PSE_GDM3_PORT;
- 	else
+ 	} else
  		return -EOPNOTSUPP;
  
-@@ -474,7 +476,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -389,7 +392,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
  	if (err)
  		return err;
  
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3023-mtk-ppe-dispatch-short-packets-to-high-prio.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3023-mtk-ppe-dispatch-short-packets-to-high-prio.patch
index d9e1771..5a950c7 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3023-mtk-ppe-dispatch-short-packets-to-high-prio.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3023-mtk-ppe-dispatch-short-packets-to-high-prio.patch
@@ -8,10 +8,10 @@
  1 file changed, 89 insertions(+), 1 deletion(-)
 
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index e901011..b0973f5 100644
+index 9b3bdd8..5e8d88a 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-@@ -190,6 +190,86 @@ mtk_flow_get_dsa_port(struct net_device **dev, int *proto)
+@@ -186,6 +186,86 @@ mtk_flow_get_dsa_port(struct net_device **dev)
  #endif
  }
  
@@ -98,13 +98,13 @@
  static int
  mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  			   struct net_device *idev, struct net_device *odev,
-@@ -230,8 +310,16 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
- 		mtk_foe_entry_set_dsa(foe, dsa_proto, dsa_port);
+@@ -242,8 +322,16 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+ 		queue = (pse_port == PSE_GDM3_PORT) ? 2 : pse_port - 1;
  	}
  
--	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(idev, dsa_port))
-+	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(idev, dsa_port)) {
-+		if ((dsa_port >= 0) && ct && nf_ct_protonum(ct) == IPPROTO_TCP) {
+-	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(mac, idev, dsa_port))
++	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(mac, idev, dsa_port)) {
++		if (ct && nf_ct_protonum(ct) == IPPROTO_TCP && (queue >= 3 && queue <= 8)) {
 +			/* Dispatch the IPv4/IPv6 TCP Ack packets to the high-priority
 +			 * queue, assuming they are less than 64 bytes.
 +			 */
@@ -114,7 +114,8 @@
  		mtk_foe_entry_set_qid(foe, queue & MTK_QDMA_TX_MASK);
 +	}
  
- 	if (odev == eth->netdev[0])
- 		pse_port = PSE_GDM1_PORT;
+ out:
+ 	mtk_foe_entry_set_dscp(foe, dscp);
 -- 
 2.45.2
+
diff --git a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3033-flow-offload-add-mxl862-switch-dsa-tag-8021q-support.patch b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3033-flow-offload-add-mxl862-switch-dsa-tag-8021q-support.patch
index ec053cb..b09ed56 100644
--- a/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3033-flow-offload-add-mxl862-switch-dsa-tag-8021q-support.patch
+++ b/autobuild/autobuild_5.4_mac80211_release/target/linux/mediatek/patches-5.4/999-3033-flow-offload-add-mxl862-switch-dsa-tag-8021q-support.patch
@@ -10,7 +10,7 @@
  3 files changed, 35 insertions(+), 22 deletions(-)
 
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
-index 4bf7c43..b26259b 100644
+index 967c8d3..0eb980a 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
 @@ -365,20 +365,29 @@ int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
@@ -65,7 +65,7 @@
  int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid);
  int mtk_foe_entry_set_tops_entry(struct mtk_foe_entry *entry, int tops_entry);
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index 93c08f0..8ad774b 100644
+index e51cce4..84399ca 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 @@ -166,7 +166,7 @@ mtk_flow_mangle_ipv4(const struct flow_action_entry *act,
@@ -92,29 +92,34 @@
  
  	return dp->index;
  #else
-@@ -276,7 +279,7 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
- 	struct mtk_wdma_info info = {};
+@@ -277,7 +280,7 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  	struct nf_conn *ct = NULL;
+ 	struct mtk_mac *mac;
  	u32 ct_mark = 0;
 -	int pse_port, dsa_port, queue;
 +	int pse_port, dsa_port, dsa_proto, queue;
  
  	if (f->flow && f->flow->ct) {
  		ct = f->flow->ct;
-@@ -301,10 +304,10 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+@@ -302,7 +305,7 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  		goto out;
  	}
  
 -	dsa_port = mtk_flow_get_dsa_port(&odev);
 +	dsa_port = mtk_flow_get_dsa_port(&odev, &dsa_proto);
+ 
+ 	if (odev == eth->netdev[0]) {
+ 		mac = eth->mac[0];
+@@ -318,7 +321,7 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+ 
  	if (dsa_port >= 0) {
- 		queue = dsa_port;
+ 		queue = dsa_port + MTK_GMAC_ID_MAX;
 -		mtk_foe_entry_set_dsa(foe, dsa_port);
 +		mtk_foe_entry_set_dsa(foe, dsa_proto, dsa_port);
+ 	} else {
+ 		queue = (pse_port == PSE_GDM3_PORT) ? 2 : pse_port - 1;
  	}
- 
- 	if (eth->qos_toggle == 2 && mtk_ppe_check_pppq_path(idev, dsa_port)) {
-@@ -495,6 +498,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -502,6 +505,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
  		return err;
  
  #if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
@@ -122,7 +127,7 @@
  	if (idev && idev->netdev_ops->ndo_fill_receive_path) {
  		ctx.dev = idev;
  		idev->netdev_ops->ndo_fill_receive_path(&ctx, &path);
-@@ -575,6 +579,14 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -582,6 +586,14 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
  			return err;
  	}
  
@@ -137,7 +142,7 @@
  	if (offload_type == MTK_PPE_PKT_TYPE_BRIDGE)
  		foe.bridge.vlan = data.vlan_in;
  
-@@ -587,14 +599,6 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -594,14 +606,6 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
  	if (data.pppoe.num == 1)
  		mtk_foe_entry_set_pppoe(&foe, data.pppoe.sid);