blob: 5ff363b9cf8c1c7c72982ec98de7dc44cef77383 [file] [log] [blame]
developer69bcd592024-03-25 14:26:39 +08001From 01556d88ad11f0d096d2816b2a69999994e1740f Mon Sep 17 00:00:00 2001
developer3c9c74d2023-09-11 11:36:12 +08002From: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
developer69bcd592024-03-25 14:26:39 +08003Date: Mon, 18 Mar 2024 16:26:28 +0800
4Subject: [PATCH 05/24] flow-offload-add-mkhnat-dual-ppe-new-v2
developer3262bf82022-07-12 11:37:54 +08005
6---
7 arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 1 +
developer69bcd592024-03-25 14:26:39 +08008 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 50 ++++++++++++++-----
9 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 14 ++++--
developer3262bf82022-07-12 11:37:54 +080010 drivers/net/ethernet/mediatek/mtk_ppe.c | 5 +-
developerfce0d152024-01-11 13:37:13 +080011 drivers/net/ethernet/mediatek/mtk_ppe.h | 7 ++-
developer69bcd592024-03-25 14:26:39 +080012 .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 27 +++++++---
13 .../net/ethernet/mediatek/mtk_ppe_offload.c | 48 ++++++++++++++----
developer3262bf82022-07-12 11:37:54 +080014 include/linux/netdevice.h | 4 ++
developer69bcd592024-03-25 14:26:39 +080015 8 files changed, 119 insertions(+), 37 deletions(-)
developer3262bf82022-07-12 11:37:54 +080016 mode change 100644 => 100755 drivers/net/ethernet/mediatek/mtk_ppe_offload.c
17
18diff --git a/arch/arm64/boot/dts/mediatek/mt7986a.dtsi b/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
developer69bcd592024-03-25 14:26:39 +080019index 3a4f279..d70151b 100644
developer3262bf82022-07-12 11:37:54 +080020--- a/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
21+++ b/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
developer69bcd592024-03-25 14:26:39 +080022@@ -483,6 +483,7 @@
developer3262bf82022-07-12 11:37:54 +080023 mediatek,ethsys = <&ethsys>;
24 mediatek,sgmiisys = <&sgmiisys0>, <&sgmiisys1>;
25 mediatek,wed = <&wed0>, <&wed1>;
26+ mtketh-ppe-num = <2>;
27 #reset-cells = <1>;
28 #address-cells = <1>;
29 #size-cells = <0>;
30diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer69bcd592024-03-25 14:26:39 +080031index 2fb67e0..7eeddb3 100644
developer3262bf82022-07-12 11:37:54 +080032--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
33+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer69bcd592024-03-25 14:26:39 +080034@@ -2464,7 +2464,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
developer3262bf82022-07-12 11:37:54 +080035 #endif
36
developer69bcd592024-03-25 14:26:39 +080037 if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
38- mtk_ppe_check_skb(eth->ppe, skb, hash);
39+ mtk_ppe_check_skb(eth->ppe[0], skb, hash);
40
developer3262bf82022-07-12 11:37:54 +080041 if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
developer69bcd592024-03-25 14:26:39 +080042 if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_RX_V2)) {
43@@ -4112,8 +4112,12 @@ static int mtk_open(struct net_device *dev)
developer3c9c74d2023-09-11 11:36:12 +080044 regmap_write(eth->sgmii->pcs[id].regmap,
45 SGMSYS_QPHY_PWR_STATE_CTRL, 0);
developer3262bf82022-07-12 11:37:54 +080046
developer780b9152022-12-15 14:09:45 +080047- if (eth->soc->offload_version && mtk_ppe_start(&eth->ppe) == 0)
developer3262bf82022-07-12 11:37:54 +080048- gdm_config = MTK_GDMA_TO_PPE;
developer780b9152022-12-15 14:09:45 +080049+ if (eth->soc->offload_version) {
developer3262bf82022-07-12 11:37:54 +080050+ gdm_config = MTK_GDMA_TO_PPE0;
51+
52+ for (i = 0; i < eth->ppe_num; i++)
53+ mtk_ppe_start(eth->ppe[i]);
54+ }
55
developer780b9152022-12-15 14:09:45 +080056 mtk_gdm_config(eth, mac->id, gdm_config);
developer3262bf82022-07-12 11:37:54 +080057
developer69bcd592024-03-25 14:26:39 +080058@@ -4202,8 +4206,10 @@ static int mtk_stop(struct net_device *dev)
developer3262bf82022-07-12 11:37:54 +080059
60 mtk_dma_free(eth);
61
62- if (eth->soc->offload_version)
63- mtk_ppe_stop(eth->ppe);
64+ if (eth->soc->offload_version) {
65+ for (i = 0; i < eth->ppe_num; i++)
66+ mtk_ppe_stop(eth->ppe[i]);
67+ }
68
69 return 0;
70 }
developer69bcd592024-03-25 14:26:39 +080071@@ -5762,15 +5768,35 @@ static int mtk_probe(struct platform_device *pdev)
developer3262bf82022-07-12 11:37:54 +080072 }
73
74 if (eth->soc->offload_version) {
75- eth->ppe = mtk_ppe_init(eth, eth->base + MTK_ETH_PPE_BASE, 2);
76- if (!eth->ppe) {
77- err = -ENOMEM;
78- goto err_free_dev;
79+ unsigned int val;
80+
81+ err = of_property_read_u32_index(pdev->dev.of_node, "mtketh-ppe-num", 0, &val);
82+ if (err < 0)
83+ eth->ppe_num = 1;
84+ else
85+ eth->ppe_num = val;
86+
87+ if (eth->ppe_num > MTK_MAX_PPE_NUM) {
88+ dev_warn(&pdev->dev, "%d is not a valid ppe num, please check mtketh-ppe-num in dts !", eth->ppe_num);
89+ eth->ppe_num = MTK_MAX_PPE_NUM;
90 }
91
92- err = mtk_eth_offload_init(eth);
93- if (err)
94- goto err_free_dev;
95+ dev_info(&pdev->dev, "ppe num = %d\n", eth->ppe_num);
96+
97+ for (i = 0; i < eth->ppe_num; i++) {
98+ eth->ppe[i] = mtk_ppe_init(eth,
99+ eth->base + MTK_ETH_PPE_BASE + i * 0x400, 2, i);
100+ if (!eth->ppe[i]) {
101+ err = -ENOMEM;
102+ goto err_free_dev;
103+ }
104+
105+ err = mtk_eth_offload_init(eth, i);
106+ if (err)
107+ goto err_free_dev;
108+ }
109+
110+ mtk_ppe_debugfs_init(eth);
111 }
112
113 for (i = 0; i < MTK_MAX_DEVS; i++) {
114diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer69bcd592024-03-25 14:26:39 +0800115index 910baaf..3995608 100644
developer3262bf82022-07-12 11:37:54 +0800116--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
117+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer69bcd592024-03-25 14:26:39 +0800118@@ -137,7 +137,12 @@
developer3262bf82022-07-12 11:37:54 +0800119 #define MTK_GDMA_UCS_EN BIT(20)
developer780b9152022-12-15 14:09:45 +0800120 #define MTK_GDMA_STRP_CRC BIT(16)
developer3262bf82022-07-12 11:37:54 +0800121 #define MTK_GDMA_TO_PDMA 0x0
122-#define MTK_GDMA_TO_PPE 0x3333
123+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
124+#define MTK_GDMA_TO_PPE0 0x3333
125+#define MTK_GDMA_TO_PPE1 0x4444
126+#else
127+#define MTK_GDMA_TO_PPE0 0x4444
128+#endif
129 #define MTK_GDMA_DROP_ALL 0x7777
130
developer780b9152022-12-15 14:09:45 +0800131 /* GDM Egress Control Register */
developer69bcd592024-03-25 14:26:39 +0800132@@ -1936,7 +1941,8 @@ struct mtk_eth {
developer3262bf82022-07-12 11:37:54 +0800133 spinlock_t syscfg0_lock;
134 struct timer_list mtk_dma_monitor_timer;
135
136- struct mtk_ppe *ppe;
137+ u8 ppe_num;
138+ struct mtk_ppe *ppe[MTK_MAX_PPE_NUM];
139 struct rhashtable flow_table;
140 };
141
developer69bcd592024-03-25 14:26:39 +0800142@@ -2019,9 +2025,11 @@ int mtk_toprgu_init(struct mtk_eth *eth, struct device_node *r);
developerb35f4fa2023-03-14 13:24:47 +0800143 int mtk_dump_usxgmii(struct regmap *pmap, char *name, u32 offset, u32 range);
developer740bee82023-10-16 10:58:43 +0800144 void mtk_usxgmii_link_poll(struct work_struct *work);
developer3262bf82022-07-12 11:37:54 +0800145
146-int mtk_eth_offload_init(struct mtk_eth *eth);
147+int mtk_eth_offload_init(struct mtk_eth *eth, int id);
148 int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
149 void *type_data);
150 void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
developer55392d12023-07-10 12:54:02 +0800151 u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index);
developer3262bf82022-07-12 11:37:54 +0800152+
developerb35f4fa2023-03-14 13:24:47 +0800153+int mtk_ppe_debugfs_init(struct mtk_eth *eth);
154 #endif /* MTK_ETH_H */
developer3262bf82022-07-12 11:37:54 +0800155diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer69bcd592024-03-25 14:26:39 +0800156index e195fb3..c9ee505 100755
developer3262bf82022-07-12 11:37:54 +0800157--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
158+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer3c9c74d2023-09-11 11:36:12 +0800159@@ -696,7 +696,7 @@ int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
developer3262bf82022-07-12 11:37:54 +0800160 }
161
162 struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
163- int version)
164+ int version, int id)
165 {
166 struct device *dev = eth->dev;
167 struct mtk_foe_entry *foe;
developer3c9c74d2023-09-11 11:36:12 +0800168@@ -715,6 +715,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
developer3262bf82022-07-12 11:37:54 +0800169 ppe->eth = eth;
170 ppe->dev = dev;
171 ppe->version = version;
172+ ppe->id = id;
173
174 foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe),
175 &ppe->foe_phys, GFP_KERNEL);
developer3c9c74d2023-09-11 11:36:12 +0800176@@ -723,8 +724,6 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
developer3262bf82022-07-12 11:37:54 +0800177
178 ppe->foe_table = foe;
179
180- mtk_ppe_debugfs_init(ppe);
181-
182 return ppe;
183 }
184
185diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer3c9c74d2023-09-11 11:36:12 +0800186index 7012351..86bbac8 100644
developer3262bf82022-07-12 11:37:54 +0800187--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
188+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer3c9c74d2023-09-11 11:36:12 +0800189@@ -9,8 +9,10 @@
developer3262bf82022-07-12 11:37:54 +0800190 #include <linux/rhashtable.h>
191
developer4df64ba2022-09-01 14:44:55 +0800192 #if defined(CONFIG_MEDIATEK_NETSYS_V2)
developer3262bf82022-07-12 11:37:54 +0800193+#define MTK_MAX_PPE_NUM 2
developer3262bf82022-07-12 11:37:54 +0800194 #define MTK_ETH_PPE_BASE 0x2000
developer4df64ba2022-09-01 14:44:55 +0800195 #else
196+#define MTK_MAX_PPE_NUM 1
197 #define MTK_ETH_PPE_BASE 0xc00
198 #endif
developer3262bf82022-07-12 11:37:54 +0800199
developer3c9c74d2023-09-11 11:36:12 +0800200@@ -299,6 +301,7 @@ struct mtk_flow_entry {
developer3262bf82022-07-12 11:37:54 +0800201 };
202 };
203 u8 type;
204+ s8 ppe_index;
205 s8 wed_index;
206 u16 hash;
207 union {
developer3c9c74d2023-09-11 11:36:12 +0800208@@ -318,6 +321,7 @@ struct mtk_ppe {
developer3262bf82022-07-12 11:37:54 +0800209 struct device *dev;
210 void __iomem *base;
211 int version;
212+ int id;
213
214 struct mtk_foe_entry *foe_table;
215 dma_addr_t foe_phys;
developer3c9c74d2023-09-11 11:36:12 +0800216@@ -330,7 +334,7 @@ struct mtk_ppe {
developer3262bf82022-07-12 11:37:54 +0800217 void *acct_table;
218 };
219
220-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version);
221+struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version, int id);
222 int mtk_ppe_start(struct mtk_ppe *ppe);
223 int mtk_ppe_stop(struct mtk_ppe *ppe);
224
developer3c9c74d2023-09-11 11:36:12 +0800225@@ -381,6 +385,5 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
developer3262bf82022-07-12 11:37:54 +0800226 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
227 void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
228 int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
229-int mtk_ppe_debugfs_init(struct mtk_ppe *ppe);
230
231 #endif
232diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
developer3c9c74d2023-09-11 11:36:12 +0800233index a591ab1..f4ebe59 100644
developer3262bf82022-07-12 11:37:54 +0800234--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
235+++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
236@@ -73,9 +73,8 @@ mtk_print_addr_info(struct seq_file *m, struct mtk_flow_addr_info *ai)
237 }
238
239 static int
240-mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)
241+mtk_ppe_debugfs_foe_show(struct seq_file *m, struct mtk_ppe *ppe, bool bind)
242 {
243- struct mtk_ppe *ppe = m->private;
244 int i;
245
246 for (i = 0; i < MTK_PPE_ENTRIES; i++) {
247@@ -122,6 +121,8 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)
248 break;
249 }
250
251+ seq_printf(m, " ppe=%d", ppe->id);
252+
253 seq_printf(m, " orig=");
254 mtk_print_addr_info(m, &ai);
255
256@@ -164,13 +165,25 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)
257 static int
258 mtk_ppe_debugfs_foe_show_all(struct seq_file *m, void *private)
259 {
260- return mtk_ppe_debugfs_foe_show(m, private, false);
261+ struct mtk_eth *eth = m->private;
262+ int i;
263+
264+ for (i = 0; i < eth->ppe_num; i++)
265+ mtk_ppe_debugfs_foe_show(m, eth->ppe[i], false);
266+
267+ return 0;
268 }
269
270 static int
271 mtk_ppe_debugfs_foe_show_bind(struct seq_file *m, void *private)
272 {
273- return mtk_ppe_debugfs_foe_show(m, private, true);
274+ struct mtk_eth *eth = m->private;
275+ int i;
276+
277+ for (i = 0; i < eth->ppe_num; i++)
278+ mtk_ppe_debugfs_foe_show(m, eth->ppe[i], true);
279+
280+ return 0;
281 }
282
283 static int
284@@ -187,7 +200,7 @@ mtk_ppe_debugfs_foe_open_bind(struct inode *inode, struct file *file)
285 inode->i_private);
286 }
287
288-int mtk_ppe_debugfs_init(struct mtk_ppe *ppe)
289+int mtk_ppe_debugfs_init(struct mtk_eth *eth)
290 {
291 static const struct file_operations fops_all = {
292 .open = mtk_ppe_debugfs_foe_open_all,
293@@ -209,8 +222,8 @@ int mtk_ppe_debugfs_init(struct mtk_ppe *ppe)
294 if (!root)
295 return -ENOMEM;
296
297- debugfs_create_file("entries", S_IRUGO, root, ppe, &fops_all);
298- debugfs_create_file("bind", S_IRUGO, root, ppe, &fops_bind);
299+ debugfs_create_file("entries", S_IRUGO, root, eth, &fops_all);
300+ debugfs_create_file("bind", S_IRUGO, root, eth, &fops_bind);
301
302 return 0;
303 }
304diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
305old mode 100644
306new mode 100755
developer740bee82023-10-16 10:58:43 +0800307index 77594f3..f256607
developer3262bf82022-07-12 11:37:54 +0800308--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
309+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer3c9c74d2023-09-11 11:36:12 +0800310@@ -229,9 +229,12 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developer3262bf82022-07-12 11:37:54 +0800311 struct flow_action_entry *act;
312 struct mtk_flow_data data = {};
313 struct mtk_foe_entry foe;
314- struct net_device *odev = NULL;
315+ struct net_device *idev = NULL, *odev = NULL;
316 struct mtk_flow_entry *entry;
317+ struct net_device_path_ctx ctx = {};
318+ struct net_device_path path = {};
319 int offload_type = 0;
developer3c9c74d2023-09-11 11:36:12 +0800320+ int ppe_index = 0;
developer3262bf82022-07-12 11:37:54 +0800321 int wed_index = -1;
322 u16 addr_type = 0;
developer3c9c74d2023-09-11 11:36:12 +0800323 u8 l4proto = 0;
324@@ -245,6 +248,10 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developer3262bf82022-07-12 11:37:54 +0800325 struct flow_match_meta match;
326
327 flow_rule_match_meta(rule, &match);
328+ idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex);
329+
330+ if (!idev)
331+ pr_info("[%s] idev doesn't exist !\n", __func__);
332 } else {
333 return -EOPNOTSUPP;
334 }
developer3c9c74d2023-09-11 11:36:12 +0800335@@ -347,6 +354,20 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
336 if (err)
337 return err;
developer3262bf82022-07-12 11:37:54 +0800338
developer4df64ba2022-09-01 14:44:55 +0800339+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
developer3262bf82022-07-12 11:37:54 +0800340+ if (idev && idev->netdev_ops->ndo_fill_receive_path) {
341+ ctx.dev = idev;
342+ idev->netdev_ops->ndo_fill_receive_path(&ctx, &path);
developer3c9c74d2023-09-11 11:36:12 +0800343+ ppe_index = path.mtk_wdma.wdma_idx;
344+ if (ppe_index >= eth->ppe_num) {
developer3262bf82022-07-12 11:37:54 +0800345+ if (printk_ratelimit())
developer3c9c74d2023-09-11 11:36:12 +0800346+ pr_info("[%s] PPE%d doesn't exist, please check mtketh-ppe-num in dts !\n", __func__, ppe_index);
developer3262bf82022-07-12 11:37:54 +0800347+
348+ return -EINVAL;
349+ }
350+ }
developer4df64ba2022-09-01 14:44:55 +0800351+#endif
developer3262bf82022-07-12 11:37:54 +0800352+
developer3c9c74d2023-09-11 11:36:12 +0800353 if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_PORTS)) {
354 struct flow_match_ports ports;
355
356@@ -440,9 +461,10 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
357
developer3262bf82022-07-12 11:37:54 +0800358 entry->cookie = f->cookie;
359 memcpy(&entry->data, &foe, sizeof(entry->data));
developer3c9c74d2023-09-11 11:36:12 +0800360+ entry->ppe_index = ppe_index;
developer3262bf82022-07-12 11:37:54 +0800361 entry->wed_index = wed_index;
362
363- if (mtk_foe_entry_commit(eth->ppe, entry) < 0)
developer3c9c74d2023-09-11 11:36:12 +0800364+ if (mtk_foe_entry_commit(eth->ppe[ppe_index], entry) < 0)
developer3262bf82022-07-12 11:37:54 +0800365 goto free;
366
367 err = rhashtable_insert_fast(&eth->flow_table, &entry->node,
developer3c9c74d2023-09-11 11:36:12 +0800368@@ -453,7 +475,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developer3262bf82022-07-12 11:37:54 +0800369 return 0;
370
371 clear:
372- mtk_foe_entry_clear(eth->ppe, entry);
developer3c9c74d2023-09-11 11:36:12 +0800373+ mtk_foe_entry_clear(eth->ppe[ppe_index], entry);
developer3262bf82022-07-12 11:37:54 +0800374 free:
375 kfree(entry);
376 if (wed_index >= 0)
developer3c9c74d2023-09-11 11:36:12 +0800377@@ -465,13 +487,15 @@ static int
developer3262bf82022-07-12 11:37:54 +0800378 mtk_flow_offload_destroy(struct mtk_eth *eth, struct flow_cls_offload *f)
379 {
380 struct mtk_flow_entry *entry;
381+ int i;
382
383 entry = rhashtable_lookup(&eth->flow_table, &f->cookie,
384 mtk_flow_ht_params);
385 if (!entry)
386 return -ENOENT;
387
388- mtk_foe_entry_clear(eth->ppe, entry);
389+ i = entry->ppe_index;
390+ mtk_foe_entry_clear(eth->ppe[i], entry);
391 rhashtable_remove_fast(&eth->flow_table, &entry->node,
392 mtk_flow_ht_params);
393 if (entry->wed_index >= 0)
developer3c9c74d2023-09-11 11:36:12 +0800394@@ -486,13 +510,15 @@ mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f)
developer3262bf82022-07-12 11:37:54 +0800395 {
396 struct mtk_flow_entry *entry;
397 u32 idle;
398+ int i;
399
400 entry = rhashtable_lookup(&eth->flow_table, &f->cookie,
401 mtk_flow_ht_params);
402 if (!entry)
403 return -ENOENT;
404
405- idle = mtk_foe_entry_idle_time(eth->ppe, entry);
406+ i = entry->ppe_index;
407+ idle = mtk_foe_entry_idle_time(eth->ppe[i], entry);
408 f->stats.lastused = jiffies - idle * HZ;
409
410 return 0;
developer3c9c74d2023-09-11 11:36:12 +0800411@@ -543,10 +569,12 @@ mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
developer3262bf82022-07-12 11:37:54 +0800412 static LIST_HEAD(block_cb_list);
413 struct flow_block_cb *block_cb;
414 flow_setup_cb_t *cb;
developerf1313102022-10-11 11:02:55 +0800415- int err = 0;
416+ int i, err = 0;
417
developer3262bf82022-07-12 11:37:54 +0800418- if (!eth->ppe || !eth->ppe->foe_table)
419- return -EOPNOTSUPP;
420+ for (i = 0; i < eth->ppe_num; i++) {
421+ if (!eth->ppe[i] || !eth->ppe[i]->foe_table)
422+ return -EOPNOTSUPP;
423+ }
424
425 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
426 return -EOPNOTSUPP;
developer3c9c74d2023-09-11 11:36:12 +0800427@@ -603,9 +631,9 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
developer3262bf82022-07-12 11:37:54 +0800428 }
429 }
430
431-int mtk_eth_offload_init(struct mtk_eth *eth)
432+int mtk_eth_offload_init(struct mtk_eth *eth, int id)
433 {
434- if (!eth->ppe || !eth->ppe->foe_table)
435+ if (!eth->ppe[id] || !eth->ppe[id]->foe_table)
436 return 0;
437
438 return rhashtable_init(&eth->flow_table, &mtk_flow_ht_params);
439diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
developer69bcd592024-03-25 14:26:39 +0800440index 5305384..b2abebe 100644
developer3262bf82022-07-12 11:37:54 +0800441--- a/include/linux/netdevice.h
442+++ b/include/linux/netdevice.h
developer69bcd592024-03-25 14:26:39 +0800443@@ -1316,6 +1316,8 @@ struct tlsdev_ops;
developer3262bf82022-07-12 11:37:54 +0800444 * rtnl_lock is not held.
445 * int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, struct net_device_path *path);
446 * Get the forwarding path to reach the real device from the HW destination address
447+ * int (*ndo_fill_receive_path)(struct net_device_path_ctx *ctx, struct net_device_path *path);
448+ * Get the receiving path to reach the real device from the HW source address
449 */
450 struct net_device_ops {
451 int (*ndo_init)(struct net_device *dev);
developer69bcd592024-03-25 14:26:39 +0800452@@ -1515,6 +1517,8 @@ struct net_device_ops {
developer3262bf82022-07-12 11:37:54 +0800453 struct devlink_port * (*ndo_get_devlink_port)(struct net_device *dev);
454 int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx,
455 struct net_device_path *path);
456+ int (*ndo_fill_receive_path)(struct net_device_path_ctx *ctx,
457+ struct net_device_path *path);
458 };
459
460 /**
461--
4622.18.0
463