blob: 9957670344413e6f6b971da34aff864d552e708f [file] [log] [blame]
developer0aaf79d2023-08-21 14:10:16 +08001From 8341e1b35ca14f303f828f96f5e63719f80be88e Mon Sep 17 00:00:00 2001
2From: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
3Date: Wed, 23 Aug 2023 11:36:05 +0800
4Subject: [PATCH] 999-3007-flow-offload-add-mkhnat-dual-ppe-new-v2
developeree39bcf2023-06-16 08:03:30 +08005
6---
7 arch/arm64/boot/dts/mediatek/mt7986a.dtsi | 1 +
8 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 67 ++++++++++++++-----
developer0aaf79d2023-08-21 14:10:16 +08009 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 14 +++-
developeree39bcf2023-06-16 08:03:30 +080010 drivers/net/ethernet/mediatek/mtk_ppe.c | 5 +-
11 drivers/net/ethernet/mediatek/mtk_ppe.h | 7 +-
12 .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 27 ++++++--
developer0aaf79d2023-08-21 14:10:16 +080013 .../net/ethernet/mediatek/mtk_ppe_offload.c | 48 ++++++++++---
developeree39bcf2023-06-16 08:03:30 +080014 include/linux/netdevice.h | 4 ++
developer0aaf79d2023-08-21 14:10:16 +080015 8 files changed, 131 insertions(+), 42 deletions(-)
developeree39bcf2023-06-16 08:03:30 +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
developer0aaf79d2023-08-21 14:10:16 +080019index e5d4e12..0c54e12 100644
developeree39bcf2023-06-16 08:03:30 +080020--- a/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
21+++ b/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
developer0aaf79d2023-08-21 14:10:16 +080022@@ -496,6 +496,7 @@
developeree39bcf2023-06-16 08:03:30 +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
developer0aaf79d2023-08-21 14:10:16 +080031index f019c56..81b68d6 100644
developeree39bcf2023-06-16 08:03:30 +080032--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
33+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer0aaf79d2023-08-21 14:10:16 +080034@@ -2097,6 +2097,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
developeree39bcf2023-06-16 08:03:30 +080035 u8 *data, *new_data;
36 struct mtk_rx_dma_v2 *rxd, trxd;
37 int done = 0;
38+ int i;
39
40 if (unlikely(!ring))
41 goto rx_done;
developer0aaf79d2023-08-21 14:10:16 +080042@@ -2209,14 +2210,20 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
developeree39bcf2023-06-16 08:03:30 +080043
44 #if defined(CONFIG_MEDIATEK_NETSYS_RX_V2)
45 reason = FIELD_GET(MTK_RXD5_PPE_CPU_REASON_V2, trxd.rxd5);
46- if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
47- mtk_ppe_check_skb(eth->ppe, skb,
48- trxd.rxd5 & MTK_RXD5_FOE_ENTRY_V2);
49+ if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) {
50+ for (i = 0; i < eth->ppe_num; i++) {
51+ mtk_ppe_check_skb(eth->ppe[i], skb,
52+ trxd.rxd5 & MTK_RXD5_FOE_ENTRY_V2);
53+ }
54+ }
55 #else
56 reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4);
57- if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
58- mtk_ppe_check_skb(eth->ppe, skb,
59- trxd.rxd4 & MTK_RXD4_FOE_ENTRY);
60+ if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) {
61+ for (i = 0; i < eth->ppe_num; i++) {
62+ mtk_ppe_check_skb(eth->ppe[i], skb,
63+ trxd.rxd4 & MTK_RXD4_FOE_ENTRY);
64+ }
65+ }
66 #endif
67
68 if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
developer0aaf79d2023-08-21 14:10:16 +080069@@ -3588,8 +3595,12 @@ static int mtk_open(struct net_device *dev)
70 regmap_write(eth->sgmii->pcs[id].regmap,
71 SGMSYS_QPHY_PWR_STATE_CTRL, 0);
developeree39bcf2023-06-16 08:03:30 +080072
73- if (eth->soc->offload_version && mtk_ppe_start(&eth->ppe) == 0)
74- gdm_config = MTK_GDMA_TO_PPE;
75+ if (eth->soc->offload_version) {
76+ gdm_config = MTK_GDMA_TO_PPE0;
77+
78+ for (i = 0; i < eth->ppe_num; i++)
79+ mtk_ppe_start(eth->ppe[i]);
80+ }
81
82 mtk_gdm_config(eth, mac->id, gdm_config);
83
developer0aaf79d2023-08-21 14:10:16 +080084@@ -3671,8 +3682,10 @@ static int mtk_stop(struct net_device *dev)
developeree39bcf2023-06-16 08:03:30 +080085
86 mtk_dma_free(eth);
87
88- if (eth->soc->offload_version)
89- mtk_ppe_stop(eth->ppe);
90+ if (eth->soc->offload_version) {
91+ for (i = 0; i < eth->ppe_num; i++)
92+ mtk_ppe_stop(eth->ppe[i]);
93+ }
94
95 return 0;
96 }
developer0aaf79d2023-08-21 14:10:16 +080097@@ -4958,15 +4971,35 @@ static int mtk_probe(struct platform_device *pdev)
developeree39bcf2023-06-16 08:03:30 +080098 }
99
100 if (eth->soc->offload_version) {
101- eth->ppe = mtk_ppe_init(eth, eth->base + MTK_ETH_PPE_BASE, 2);
102- if (!eth->ppe) {
103- err = -ENOMEM;
104- goto err_free_dev;
105+ unsigned int val;
106+
107+ err = of_property_read_u32_index(pdev->dev.of_node, "mtketh-ppe-num", 0, &val);
108+ if (err < 0)
109+ eth->ppe_num = 1;
110+ else
111+ eth->ppe_num = val;
112+
113+ if (eth->ppe_num > MTK_MAX_PPE_NUM) {
114+ dev_warn(&pdev->dev, "%d is not a valid ppe num, please check mtketh-ppe-num in dts !", eth->ppe_num);
115+ eth->ppe_num = MTK_MAX_PPE_NUM;
116 }
117
118- err = mtk_eth_offload_init(eth);
119- if (err)
120- goto err_free_dev;
121+ dev_info(&pdev->dev, "ppe num = %d\n", eth->ppe_num);
122+
123+ for (i = 0; i < eth->ppe_num; i++) {
124+ eth->ppe[i] = mtk_ppe_init(eth,
125+ eth->base + MTK_ETH_PPE_BASE + i * 0x400, 2, i);
126+ if (!eth->ppe[i]) {
127+ err = -ENOMEM;
128+ goto err_free_dev;
129+ }
130+
131+ err = mtk_eth_offload_init(eth, i);
132+ if (err)
133+ goto err_free_dev;
134+ }
135+
136+ mtk_ppe_debugfs_init(eth);
137 }
138
139 for (i = 0; i < MTK_MAX_DEVS; i++) {
140diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer0aaf79d2023-08-21 14:10:16 +0800141index 8675c86..fad3e73 100644
developeree39bcf2023-06-16 08:03:30 +0800142--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
143+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer0aaf79d2023-08-21 14:10:16 +0800144@@ -130,7 +130,12 @@
developeree39bcf2023-06-16 08:03:30 +0800145 #define MTK_GDMA_UCS_EN BIT(20)
146 #define MTK_GDMA_STRP_CRC BIT(16)
147 #define MTK_GDMA_TO_PDMA 0x0
148-#define MTK_GDMA_TO_PPE 0x3333
149+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
150+#define MTK_GDMA_TO_PPE0 0x3333
151+#define MTK_GDMA_TO_PPE1 0x4444
152+#else
153+#define MTK_GDMA_TO_PPE0 0x4444
154+#endif
155 #define MTK_GDMA_DROP_ALL 0x7777
156
157 /* GDM Egress Control Register */
developer0aaf79d2023-08-21 14:10:16 +0800158@@ -1856,7 +1861,8 @@ struct mtk_eth {
developeree39bcf2023-06-16 08:03:30 +0800159 spinlock_t syscfg0_lock;
160 struct timer_list mtk_dma_monitor_timer;
161
162- struct mtk_ppe *ppe;
163+ u8 ppe_num;
164+ struct mtk_ppe *ppe[MTK_MAX_PPE_NUM];
165 struct rhashtable flow_table;
166 };
167
developer0aaf79d2023-08-21 14:10:16 +0800168@@ -1918,9 +1924,11 @@ int mtk_usxgmii_init(struct mtk_eth *eth, struct device_node *r);
169 int mtk_toprgu_init(struct mtk_eth *eth, struct device_node *r);
developeree39bcf2023-06-16 08:03:30 +0800170 int mtk_dump_usxgmii(struct regmap *pmap, char *name, u32 offset, u32 range);
171
172-int mtk_eth_offload_init(struct mtk_eth *eth);
173+int mtk_eth_offload_init(struct mtk_eth *eth, int id);
174 int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
175 void *type_data);
176 void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
developer5871fe42023-06-27 17:37:35 +0800177 u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index);
developeree39bcf2023-06-16 08:03:30 +0800178+
179+int mtk_ppe_debugfs_init(struct mtk_eth *eth);
180 #endif /* MTK_ETH_H */
181diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer0aaf79d2023-08-21 14:10:16 +0800182index 7506670..0ff1fef 100755
developeree39bcf2023-06-16 08:03:30 +0800183--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
184+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer0aaf79d2023-08-21 14:10:16 +0800185@@ -696,7 +696,7 @@ int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
developeree39bcf2023-06-16 08:03:30 +0800186 }
187
188 struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
189- int version)
190+ int version, int id)
191 {
192 struct device *dev = eth->dev;
193 struct mtk_foe_entry *foe;
developer0aaf79d2023-08-21 14:10:16 +0800194@@ -715,6 +715,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
developeree39bcf2023-06-16 08:03:30 +0800195 ppe->eth = eth;
196 ppe->dev = dev;
197 ppe->version = version;
198+ ppe->id = id;
199
200 foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe),
201 &ppe->foe_phys, GFP_KERNEL);
developer0aaf79d2023-08-21 14:10:16 +0800202@@ -723,8 +724,6 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
developeree39bcf2023-06-16 08:03:30 +0800203
204 ppe->foe_table = foe;
205
206- mtk_ppe_debugfs_init(ppe);
207-
208 return ppe;
209 }
210
211diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer0aaf79d2023-08-21 14:10:16 +0800212index 7012351..86bbac8 100644
developeree39bcf2023-06-16 08:03:30 +0800213--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
214+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer0aaf79d2023-08-21 14:10:16 +0800215@@ -9,8 +9,10 @@
developeree39bcf2023-06-16 08:03:30 +0800216 #include <linux/rhashtable.h>
217
218 #if defined(CONFIG_MEDIATEK_NETSYS_V2)
219+#define MTK_MAX_PPE_NUM 2
220 #define MTK_ETH_PPE_BASE 0x2000
221 #else
222+#define MTK_MAX_PPE_NUM 1
223 #define MTK_ETH_PPE_BASE 0xc00
224 #endif
225
developer0aaf79d2023-08-21 14:10:16 +0800226@@ -299,6 +301,7 @@ struct mtk_flow_entry {
developeree39bcf2023-06-16 08:03:30 +0800227 };
228 };
229 u8 type;
230+ s8 ppe_index;
231 s8 wed_index;
232 u16 hash;
233 union {
developer0aaf79d2023-08-21 14:10:16 +0800234@@ -318,6 +321,7 @@ struct mtk_ppe {
developeree39bcf2023-06-16 08:03:30 +0800235 struct device *dev;
236 void __iomem *base;
237 int version;
238+ int id;
239
240 struct mtk_foe_entry *foe_table;
241 dma_addr_t foe_phys;
developer0aaf79d2023-08-21 14:10:16 +0800242@@ -330,7 +334,7 @@ struct mtk_ppe {
developeree39bcf2023-06-16 08:03:30 +0800243 void *acct_table;
244 };
245
246-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version);
247+struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version, int id);
248 int mtk_ppe_start(struct mtk_ppe *ppe);
249 int mtk_ppe_stop(struct mtk_ppe *ppe);
250
developer0aaf79d2023-08-21 14:10:16 +0800251@@ -381,6 +385,5 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
developeree39bcf2023-06-16 08:03:30 +0800252 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
253 void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
254 int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
255-int mtk_ppe_debugfs_init(struct mtk_ppe *ppe);
256
257 #endif
258diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
developer0aaf79d2023-08-21 14:10:16 +0800259index a591ab1..f4ebe59 100644
developeree39bcf2023-06-16 08:03:30 +0800260--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
261+++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
262@@ -73,9 +73,8 @@ mtk_print_addr_info(struct seq_file *m, struct mtk_flow_addr_info *ai)
263 }
264
265 static int
266-mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)
267+mtk_ppe_debugfs_foe_show(struct seq_file *m, struct mtk_ppe *ppe, bool bind)
268 {
269- struct mtk_ppe *ppe = m->private;
270 int i;
271
272 for (i = 0; i < MTK_PPE_ENTRIES; i++) {
273@@ -122,6 +121,8 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)
274 break;
275 }
276
277+ seq_printf(m, " ppe=%d", ppe->id);
278+
279 seq_printf(m, " orig=");
280 mtk_print_addr_info(m, &ai);
281
282@@ -164,13 +165,25 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)
283 static int
284 mtk_ppe_debugfs_foe_show_all(struct seq_file *m, void *private)
285 {
286- return mtk_ppe_debugfs_foe_show(m, private, false);
287+ struct mtk_eth *eth = m->private;
288+ int i;
289+
290+ for (i = 0; i < eth->ppe_num; i++)
291+ mtk_ppe_debugfs_foe_show(m, eth->ppe[i], false);
292+
293+ return 0;
294 }
295
296 static int
297 mtk_ppe_debugfs_foe_show_bind(struct seq_file *m, void *private)
298 {
299- return mtk_ppe_debugfs_foe_show(m, private, true);
300+ struct mtk_eth *eth = m->private;
301+ int i;
302+
303+ for (i = 0; i < eth->ppe_num; i++)
304+ mtk_ppe_debugfs_foe_show(m, eth->ppe[i], true);
305+
306+ return 0;
307 }
308
309 static int
310@@ -187,7 +200,7 @@ mtk_ppe_debugfs_foe_open_bind(struct inode *inode, struct file *file)
311 inode->i_private);
312 }
313
314-int mtk_ppe_debugfs_init(struct mtk_ppe *ppe)
315+int mtk_ppe_debugfs_init(struct mtk_eth *eth)
316 {
317 static const struct file_operations fops_all = {
318 .open = mtk_ppe_debugfs_foe_open_all,
319@@ -209,8 +222,8 @@ int mtk_ppe_debugfs_init(struct mtk_ppe *ppe)
320 if (!root)
321 return -ENOMEM;
322
323- debugfs_create_file("entries", S_IRUGO, root, ppe, &fops_all);
324- debugfs_create_file("bind", S_IRUGO, root, ppe, &fops_bind);
325+ debugfs_create_file("entries", S_IRUGO, root, eth, &fops_all);
326+ debugfs_create_file("bind", S_IRUGO, root, eth, &fops_bind);
327
328 return 0;
329 }
330diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
331old mode 100644
332new mode 100755
developer0aaf79d2023-08-21 14:10:16 +0800333index 77594f3..18f6333
developeree39bcf2023-06-16 08:03:30 +0800334--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
335+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer0aaf79d2023-08-21 14:10:16 +0800336@@ -229,9 +229,12 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developeree39bcf2023-06-16 08:03:30 +0800337 struct flow_action_entry *act;
338 struct mtk_flow_data data = {};
339 struct mtk_foe_entry foe;
340- struct net_device *odev = NULL;
341+ struct net_device *idev = NULL, *odev = NULL;
342 struct mtk_flow_entry *entry;
343+ struct net_device_path_ctx ctx = {};
344+ struct net_device_path path = {};
345 int offload_type = 0;
developer0aaf79d2023-08-21 14:10:16 +0800346+ int ppe_index = 0;
developeree39bcf2023-06-16 08:03:30 +0800347 int wed_index = -1;
348 u16 addr_type = 0;
developer0aaf79d2023-08-21 14:10:16 +0800349 u8 l4proto = 0;
350@@ -245,6 +248,10 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developeree39bcf2023-06-16 08:03:30 +0800351 struct flow_match_meta match;
352
353 flow_rule_match_meta(rule, &match);
354+ idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex);
355+
356+ if (!idev)
357+ pr_info("[%s] idev doesn't exist !\n", __func__);
358 } else {
359 return -EOPNOTSUPP;
360 }
developer0aaf79d2023-08-21 14:10:16 +0800361@@ -347,6 +354,20 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
362 if (err)
363 return err;
developeree39bcf2023-06-16 08:03:30 +0800364
developeree39bcf2023-06-16 08:03:30 +0800365+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
366+ if (idev && idev->netdev_ops->ndo_fill_receive_path) {
367+ ctx.dev = idev;
368+ idev->netdev_ops->ndo_fill_receive_path(&ctx, &path);
developer0aaf79d2023-08-21 14:10:16 +0800369+ ppe_index = path.mtk_wdma.wdma_idx;
370+ if (ppe_index >= eth->ppe_num) {
developeree39bcf2023-06-16 08:03:30 +0800371+ if (printk_ratelimit())
developer0aaf79d2023-08-21 14:10:16 +0800372+ pr_info("[%s] PPE%d doesn't exist, please check mtketh-ppe-num in dts !\n", __func__, ppe_index);
developeree39bcf2023-06-16 08:03:30 +0800373+
374+ return -EINVAL;
375+ }
376+ }
377+#endif
378+
developer0aaf79d2023-08-21 14:10:16 +0800379 if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_PORTS)) {
380 struct flow_match_ports ports;
381
382@@ -440,9 +461,10 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
383
developeree39bcf2023-06-16 08:03:30 +0800384 entry->cookie = f->cookie;
385 memcpy(&entry->data, &foe, sizeof(entry->data));
developer0aaf79d2023-08-21 14:10:16 +0800386+ entry->ppe_index = ppe_index;
developeree39bcf2023-06-16 08:03:30 +0800387 entry->wed_index = wed_index;
388
389- if (mtk_foe_entry_commit(eth->ppe, entry) < 0)
developer0aaf79d2023-08-21 14:10:16 +0800390+ if (mtk_foe_entry_commit(eth->ppe[ppe_index], entry) < 0)
developeree39bcf2023-06-16 08:03:30 +0800391 goto free;
392
393 err = rhashtable_insert_fast(&eth->flow_table, &entry->node,
developer0aaf79d2023-08-21 14:10:16 +0800394@@ -453,7 +475,7 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f)
developeree39bcf2023-06-16 08:03:30 +0800395 return 0;
396
397 clear:
398- mtk_foe_entry_clear(eth->ppe, entry);
developer0aaf79d2023-08-21 14:10:16 +0800399+ mtk_foe_entry_clear(eth->ppe[ppe_index], entry);
developeree39bcf2023-06-16 08:03:30 +0800400 free:
401 kfree(entry);
402 if (wed_index >= 0)
developer0aaf79d2023-08-21 14:10:16 +0800403@@ -465,13 +487,15 @@ static int
developeree39bcf2023-06-16 08:03:30 +0800404 mtk_flow_offload_destroy(struct mtk_eth *eth, struct flow_cls_offload *f)
405 {
406 struct mtk_flow_entry *entry;
407+ int i;
408
409 entry = rhashtable_lookup(&eth->flow_table, &f->cookie,
410 mtk_flow_ht_params);
411 if (!entry)
412 return -ENOENT;
413
414- mtk_foe_entry_clear(eth->ppe, entry);
415+ i = entry->ppe_index;
416+ mtk_foe_entry_clear(eth->ppe[i], entry);
417 rhashtable_remove_fast(&eth->flow_table, &entry->node,
418 mtk_flow_ht_params);
419 if (entry->wed_index >= 0)
developer0aaf79d2023-08-21 14:10:16 +0800420@@ -486,13 +510,15 @@ mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f)
developeree39bcf2023-06-16 08:03:30 +0800421 {
422 struct mtk_flow_entry *entry;
423 u32 idle;
424+ int i;
425
426 entry = rhashtable_lookup(&eth->flow_table, &f->cookie,
427 mtk_flow_ht_params);
428 if (!entry)
429 return -ENOENT;
430
431- idle = mtk_foe_entry_idle_time(eth->ppe, entry);
432+ i = entry->ppe_index;
433+ idle = mtk_foe_entry_idle_time(eth->ppe[i], entry);
434 f->stats.lastused = jiffies - idle * HZ;
435
436 return 0;
developer0aaf79d2023-08-21 14:10:16 +0800437@@ -543,10 +569,12 @@ mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
developeree39bcf2023-06-16 08:03:30 +0800438 static LIST_HEAD(block_cb_list);
439 struct flow_block_cb *block_cb;
440 flow_setup_cb_t *cb;
441- int err = 0;
442+ int i, err = 0;
443
444- if (!eth->ppe || !eth->ppe->foe_table)
445- return -EOPNOTSUPP;
446+ for (i = 0; i < eth->ppe_num; i++) {
447+ if (!eth->ppe[i] || !eth->ppe[i]->foe_table)
448+ return -EOPNOTSUPP;
449+ }
450
451 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
452 return -EOPNOTSUPP;
developer0aaf79d2023-08-21 14:10:16 +0800453@@ -603,9 +631,9 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
developeree39bcf2023-06-16 08:03:30 +0800454 }
455 }
456
457-int mtk_eth_offload_init(struct mtk_eth *eth)
458+int mtk_eth_offload_init(struct mtk_eth *eth, int id)
459 {
460- if (!eth->ppe || !eth->ppe->foe_table)
461+ if (!eth->ppe[id] || !eth->ppe[id]->foe_table)
462 return 0;
463
464 return rhashtable_init(&eth->flow_table, &mtk_flow_ht_params);
465diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
developer0aaf79d2023-08-21 14:10:16 +0800466index 59a3e96..0967dc2 100644
developeree39bcf2023-06-16 08:03:30 +0800467--- a/include/linux/netdevice.h
468+++ b/include/linux/netdevice.h
developer0aaf79d2023-08-21 14:10:16 +0800469@@ -1311,6 +1311,8 @@ struct tlsdev_ops;
developeree39bcf2023-06-16 08:03:30 +0800470 * rtnl_lock is not held.
471 * int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, struct net_device_path *path);
472 * Get the forwarding path to reach the real device from the HW destination address
473+ * int (*ndo_fill_receive_path)(struct net_device_path_ctx *ctx, struct net_device_path *path);
474+ * Get the receiving path to reach the real device from the HW source address
475 */
476 struct net_device_ops {
477 int (*ndo_init)(struct net_device *dev);
developer0aaf79d2023-08-21 14:10:16 +0800478@@ -1510,6 +1512,8 @@ struct net_device_ops {
developeree39bcf2023-06-16 08:03:30 +0800479 struct devlink_port * (*ndo_get_devlink_port)(struct net_device *dev);
480 int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx,
481 struct net_device_path *path);
482+ int (*ndo_fill_receive_path)(struct net_device_path_ctx *ctx,
483+ struct net_device_path *path);
484 };
485
486 /**
487--
4882.18.0
489