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