[][MAC80211][hnat][Fix eth0 transition timed out happened in 1_WAN, 3_LAN bi-direction test load unbalance scenario]

[Description]
Fix eth0 transition timed out happened in 1_WAN, 3_LAN bi-direction test
load unbalance scenario.

This patch setup QDMA queue 6~11 when pppq is enabled, where queue 6~11
are used to transmit short packet in PPPQ mode,
set the min rate to 1Mbps to avoid the priority of QDMA queue is
unlimited and blocked the CPU packet transmission.

Without this patch, the 1_WAN, 3_LAN bi-direction load unbalance test
would trigger eth0 QDMA transmission timeout in mt7981(Cheetah).

[Release-log]
N/A


Change-Id: I29ba068b099fbc7281ffd490314d4b481f569c6a
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8914620
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch
index 4110b83..ba80883 100644
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3012-flow-offload-add-mtkhnat-qdma-qos.patch
@@ -1,6 +1,6 @@
-From 0247c9d63f56bbe34f4205f986957b5036a9a4d8 Mon Sep 17 00:00:00 2001
-From: Bc-bocun Chen <bc-bocun.chen@mediatek.com>
-Date: Mon, 18 Sep 2023 11:11:03 +0800
+From 51573e91708521bdc47a9d6f771f2cbde11e5ed7 Mon Sep 17 00:00:00 2001
+From: "chak-kei.lam" <chak-kei.lam@mediatek.com>
+Date: Tue, 9 Apr 2024 15:05:24 +0800
 Subject: [PATCH 12/24] flow-offload-add-mtkhnat-qdma-qos
 
 ---
@@ -10,10 +10,10 @@
  drivers/net/ethernet/mediatek/mtk_ppe.c       |  48 +-
  drivers/net/ethernet/mediatek/mtk_ppe.h       |   4 +
  .../net/ethernet/mediatek/mtk_ppe_offload.c   |  28 +-
- .../net/ethernet/mediatek/mtk_qdma_debugfs.c  | 439 ++++++++++++++++++
+ .../net/ethernet/mediatek/mtk_qdma_debugfs.c  | 448 ++++++++++++++++++
  include/net/flow_offload.h                    |   1 +
  net/netfilter/nf_flow_table_offload.c         |   4 +-
- 9 files changed, 581 insertions(+), 5 deletions(-)
+ 9 files changed, 590 insertions(+), 5 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 9cd306d..1660fd9 100644
+index 60672c6..8e3a276 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -5813,6 +5813,8 @@ static int mtk_probe(struct platform_device *pdev)
+@@ -5838,6 +5838,8 @@ static int mtk_probe(struct platform_device *pdev)
  		}
  
  		mtk_ppe_debugfs_init(eth);
@@ -42,7 +42,7 @@
  	}
  
  	for (i = 0; i < MTK_MAX_DEVS; i++) {
-@@ -5925,6 +5927,7 @@ static const struct mtk_soc_data mt2701_data = {
+@@ -5953,6 +5955,7 @@ static const struct mtk_soc_data mt2701_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT,
@@ -50,7 +50,7 @@
  	},
  };
  
-@@ -5945,6 +5948,7 @@ static const struct mtk_soc_data mt7621_data = {
+@@ -5976,6 +5979,7 @@ static const struct mtk_soc_data mt7621_data = {
  		.rxd_size = sizeof(struct mtk_rx_dma),
  		.dma_max_len = MTK_TX_DMA_BUF_LEN,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT,
@@ -58,7 +58,7 @@
  	},
  };
  
-@@ -5966,6 +5970,7 @@ static const struct mtk_soc_data mt7622_data = {
+@@ -6000,6 +6004,7 @@ static const struct mtk_soc_data mt7622_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT,
@@ -66,7 +66,7 @@
  	},
  };
  
-@@ -5986,6 +5991,7 @@ static const struct mtk_soc_data mt7623_data = {
+@@ -6023,6 +6028,7 @@ static const struct mtk_soc_data mt7623_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT,
@@ -74,7 +74,7 @@
  	},
  };
  
-@@ -6026,6 +6032,7 @@ static const struct mtk_soc_data mt7986_data = {
+@@ -6069,6 +6075,7 @@ static const struct mtk_soc_data mt7986_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID_V2,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN_V2,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT_V2,
@@ -82,7 +82,7 @@
  	},
  };
  
-@@ -6047,6 +6054,7 @@ static const struct mtk_soc_data mt7981_data = {
+@@ -6093,6 +6100,7 @@ static const struct mtk_soc_data mt7981_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID_V2,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN_V2,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT_V2,
@@ -90,7 +90,7 @@
  	},
  };
  
-@@ -6065,6 +6073,7 @@ static const struct mtk_soc_data mt7988_data = {
+@@ -6117,6 +6125,7 @@ static const struct mtk_soc_data mt7988_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID_V2,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN_V2,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT_V2,
@@ -98,7 +98,7 @@
  	},
  };
  
-@@ -6083,6 +6092,7 @@ static const struct mtk_soc_data rt5350_data = {
+@@ -6138,6 +6147,7 @@ static const struct mtk_soc_data rt5350_data = {
  		.rx_dma_l4_valid = RX_DMA_L4_VALID_PDMA,
  		.dma_max_len = MTK_TX_DMA_BUF_LEN,
  		.dma_len_offset = MTK_TX_DMA_BUF_SHIFT,
@@ -107,10 +107,10 @@
  };
  
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-index 5f90765..02ca0b2 100644
+index 52e4b85..7b3230e 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -487,6 +487,9 @@
+@@ -495,6 +495,9 @@
  #define FC_THRES_DROP_EN	(7 << 16)
  #define FC_THRES_MIN		0x4444
  
@@ -120,7 +120,7 @@
  /* QDMA Interrupt Status Register */
  #define MTK_QDMA_INT_STATUS	(QDMA_BASE + 0x218)
  #if defined(CONFIG_MEDIATEK_NETSYS_RX_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
-@@ -530,6 +533,11 @@
+@@ -538,6 +541,11 @@
  /* QDMA Interrupt Mask Register */
  #define MTK_QDMA_HRED2		(QDMA_BASE + 0x244)
  
@@ -132,7 +132,7 @@
  /* QDMA TX Forward CPU Pointer Register */
  #define MTK_QTX_CTX_PTR		(QDMA_BASE +0x300)
  
-@@ -557,6 +565,14 @@
+@@ -565,6 +573,14 @@
  /* QDMA FQ Free Page Buffer Length Register */
  #define MTK_QDMA_FQ_BLEN	(QDMA_BASE +0x32c)
  
@@ -147,7 +147,7 @@
  /* WDMA Registers */
  #define MTK_WDMA_CTX_PTR(x)	(WDMA_BASE(x) + 0x8)
  #define MTK_WDMA_DTX_PTR(x)	(WDMA_BASE(x) + 0xC)
-@@ -1743,6 +1759,7 @@ struct mtk_soc_data {
+@@ -1753,6 +1769,7 @@ struct mtk_soc_data {
  		u32	rx_dma_l4_valid;
  		u32	dma_max_len;
  		u32	dma_len_offset;
@@ -155,7 +155,7 @@
  	} txrx;
  };
  
-@@ -1936,6 +1953,7 @@ struct mtk_eth {
+@@ -1946,6 +1963,7 @@ struct mtk_eth {
  	spinlock_t			syscfg0_lock;
  	struct timer_list		mtk_dma_monitor_timer;
  
@@ -163,7 +163,7 @@
  	u8				ppe_num;
  	struct mtk_ppe			*ppe[MTK_MAX_PPE_NUM];
  	struct rhashtable		flow_table;
-@@ -1994,6 +2012,36 @@ extern const struct of_device_id of_mtk_match[];
+@@ -2004,6 +2022,36 @@ extern const struct of_device_id of_mtk_match[];
  extern u32 mtk_hwlro_stats_ebl;
  extern u32 dbg_show_level;
  
@@ -200,7 +200,7 @@
  /* read the hardware status register */
  void mtk_stats_update_mac(struct mtk_mac *mac);
  
-@@ -2027,4 +2075,6 @@ void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
+@@ -2037,4 +2085,6 @@ void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
  u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index);
  
  int mtk_ppe_debugfs_init(struct mtk_eth *eth);
@@ -208,10 +208,10 @@
 +int mtk_qdma_debugfs_init(struct mtk_eth *eth);
  #endif /* MTK_ETH_H */
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
-index 94e03b2..8388f65 100755
+index 7b92fff..f5dbfe9 100755
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
-@@ -128,7 +128,7 @@ static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable)
+@@ -139,7 +139,7 @@ static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable)
  		enable * MTK_PPE_CACHE_CTL_EN);
  }
  
@@ -220,7 +220,7 @@
  {
  	u32 hv1, hv2, hv3;
  	u32 hash;
-@@ -420,12 +420,58 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
+@@ -431,12 +431,58 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
  	return 0;
  }
  
@@ -280,10 +280,10 @@
  mtk_flow_entry_match(struct mtk_flow_entry *entry, struct mtk_foe_entry *data)
  {
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
-index 86288b0..5ab864f 100644
+index bc48bd9..5529d64 100644
 --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -403,9 +403,13 @@ int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid);
+@@ -429,9 +429,13 @@ int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid);
  int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid);
  int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
  			   int bss, int wcid);
@@ -298,7 +298,7 @@
  
  #endif
 diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
-index b80f72d..3bc50a4 100755
+index f9cd2f9..f0c63da 100755
 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
 @@ -9,6 +9,8 @@
@@ -329,7 +329,7 @@
  	if (dev == eth->netdev[0])
  		pse_port = PSE_GDM1_PORT;
  	else if (dev == eth->netdev[1])
-@@ -217,6 +222,23 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
+@@ -219,6 +224,23 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
  		return -EOPNOTSUPP;
  
  out:
@@ -353,7 +353,7 @@
  	mtk_foe_entry_set_pse_port(foe, pse_port);
  
  	return 0;
-@@ -447,7 +469,9 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
+@@ -449,7 +471,9 @@ 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);
  
@@ -366,10 +366,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..d76b3c5
+index 0000000..c7af3eb
 --- /dev/null
 +++ b/drivers/net/ethernet/mediatek/mtk_qdma_debugfs.c
-@@ -0,0 +1,439 @@
+@@ -0,0 +1,448 @@
 +/* SPDX-License-Identifier: GPL-2.0
 + *
 + * Copyright (c) 2022 MediaTek Inc.
@@ -390,12 +390,21 @@
 +	u32 val;
 +
 +	if (enable) {
-+		val = MTK_QTX_SCH_MIN_RATE_EN | MTK_QTX_SCH_MAX_RATE_EN;
-+		val |= FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN,  1) |
-+		       FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP,  4) |
-+		       FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 25) |
-+		       FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP,  5) |
-+		       FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 4);
++		if (id < MAX_PPPQ_PORT_NUM) {
++			val = MTK_QTX_SCH_MIN_RATE_EN | MTK_QTX_SCH_MAX_RATE_EN;
++			val |=  FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN,  1) |
++		       		FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP,  4) |
++		       		FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN, 25) |
++		       		FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP,  5) |
++		       		FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 4);
++		} else {
++			val = MTK_QTX_SCH_MIN_RATE_EN;
++			val |=  FIELD_PREP(MTK_QTX_SCH_MIN_RATE_MAN,  1) |
++		       		FIELD_PREP(MTK_QTX_SCH_MIN_RATE_EXP,  3) |
++		       		FIELD_PREP(MTK_QTX_SCH_MAX_RATE_MAN,  0) |
++		       		FIELD_PREP(MTK_QTX_SCH_MAX_RATE_EXP,  0) |
++		       		FIELD_PREP(MTK_QTX_SCH_MAX_RATE_WEIGHT, 4);
++		}
 +
 +		writel(val, eth->base + MTK_QTX_SCH(id % MTK_QTX_PER_PAGE));
 +	} else {
@@ -428,7 +437,7 @@
 +{
 +	u32 id, val;
 +
-+	for (id = 0; id < MAX_PPPQ_PORT_NUM; id++) {
++	for (id = 0; id < 2 * MAX_PPPQ_PORT_NUM; id++) {
 +		mtk_qdma_qos_shaper_ebl(eth, id, 1);
 +
 +		writel(FIELD_PREP(MTK_QTX_CFG_HW_RESV_CNT_OFFSET, 4) |
@@ -465,7 +474,7 @@
 +		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~5 (scheduler 0).\n");
++		pr_info("PPPQ use qid 0~11 (scheduler 0).\n");
 +		eth->qos_toggle = 2;
 +		mtk_qdma_qos_pppq_enable(eth);
 +	}