1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (c) 2024 AIROHA Inc
4 * Author: Lorenzo Bianconi <lorenzo@kernel.org>
5 */
6
7 #ifndef AIROHA_ETH_H
8 #define AIROHA_ETH_H
9
10 #include <linux/debugfs.h>
11 #include <linux/etherdevice.h>
12 #include <linux/iopoll.h>
13 #include <linux/kernel.h>
14 #include <linux/netdevice.h>
15 #include <linux/reset.h>
16 #include <linux/soc/airoha/airoha_offload.h>
17 #include <net/dsa.h>
18
19 #define AIROHA_MAX_NUM_GDM_PORTS 4
20 #define AIROHA_MAX_NUM_QDMA 2
21 #define AIROHA_MAX_NUM_IRQ_BANKS 4
22 #define AIROHA_MAX_DSA_PORTS 7
23 #define AIROHA_MAX_NUM_RSTS 3
24 #define AIROHA_MAX_MTU 9220
25 #define AIROHA_MAX_PACKET_SIZE 2048
26 #define AIROHA_NUM_QOS_CHANNELS 4
27 #define AIROHA_NUM_QOS_QUEUES 8
28 #define AIROHA_NUM_TX_RING 32
29 #define AIROHA_NUM_RX_RING 32
30 #define AIROHA_NUM_NETDEV_TX_RINGS (AIROHA_NUM_TX_RING + \
31 AIROHA_NUM_QOS_CHANNELS)
32 #define AIROHA_FE_MC_MAX_VLAN_TABLE 64
33 #define AIROHA_FE_MC_MAX_VLAN_PORT 16
34 #define AIROHA_NUM_TX_IRQ 2
35 #define HW_DSCP_NUM 2048
36 #define IRQ_QUEUE_LEN(_n) ((_n) ? 1024 : 2048)
37 #define TX_DSCP_NUM 1024
38 #define RX_DSCP_NUM(_n) \
39 ((_n) == 2 ? 128 : \
40 (_n) == 11 ? 128 : \
41 (_n) == 15 ? 128 : \
42 (_n) == 0 ? 1024 : 16)
43
44 #define PSE_RSV_PAGES 128
45 #define PSE_QUEUE_RSV_PAGES 64
46
47 #define QDMA_METER_IDX(_n) ((_n) & 0xff)
48 #define QDMA_METER_GROUP(_n) (((_n) >> 8) & 0x3)
49
50 #define PPE_SRAM_NUM_ENTRIES (8 * 1024)
51 #define PPE_STATS_NUM_ENTRIES (4 * 1024)
52 #define PPE_DRAM_NUM_ENTRIES (16 * 1024)
53 #define PPE_ENTRY_SIZE 80
54 #define PPE_RAM_NUM_ENTRIES_SHIFT(_n) (__ffs((_n) >> 10))
55
56 #define MTK_HDR_LEN 4
57 #define MTK_HDR_XMIT_TAGGED_TPID_8100 1
58 #define MTK_HDR_XMIT_TAGGED_TPID_88A8 2
59
60 enum {
61 QDMA_INT_REG_IDX0,
62 QDMA_INT_REG_IDX1,
63 QDMA_INT_REG_IDX2,
64 QDMA_INT_REG_IDX3,
65 QDMA_INT_REG_IDX4,
66 QDMA_INT_REG_MAX
67 };
68
69 enum {
70 HSGMII_LAN_7581_PCIE0_SRCPORT = 0x16,
71 HSGMII_LAN_7581_PCIE1_SRCPORT,
72 HSGMII_LAN_7581_ETH_SRCPORT,
73 HSGMII_LAN_7581_USB_SRCPORT,
74 };
75
76 enum {
77 HSGMII_LAN_7583_ETH_SRCPORT = 0x16,
78 HSGMII_LAN_7583_PCIE_SRCPORT = 0x18,
79 HSGMII_LAN_7583_USB_SRCPORT,
80 };
81
82 enum {
83 XSI_PCIE0_VIP_PORT_MASK = BIT(22),
84 XSI_PCIE1_VIP_PORT_MASK = BIT(23),
85 XSI_USB_VIP_PORT_MASK = BIT(25),
86 XSI_ETH_VIP_PORT_MASK = BIT(24),
87 };
88
89 enum {
90 DEV_STATE_INITIALIZED,
91 DEV_STATE_REGISTERED,
92 };
93
94 enum {
95 CDM_CRSN_QSEL_Q1 = 1,
96 CDM_CRSN_QSEL_Q5 = 5,
97 CDM_CRSN_QSEL_Q6 = 6,
98 CDM_CRSN_QSEL_Q15 = 15,
99 };
100
101 enum {
102 CRSN_08 = 0x8,
103 CRSN_21 = 0x15, /* KA */
104 CRSN_22 = 0x16, /* hit bind and force route to CPU */
105 CRSN_24 = 0x18,
106 CRSN_25 = 0x19,
107 };
108
109 enum airoha_gdm_index {
110 AIROHA_GDM1_IDX = 1,
111 AIROHA_GDM2_IDX = 2,
112 AIROHA_GDM3_IDX = 3,
113 AIROHA_GDM4_IDX = 4,
114 };
115
116 enum {
117 FE_PSE_PORT_CDM1,
118 FE_PSE_PORT_GDM1,
119 FE_PSE_PORT_GDM2,
120 FE_PSE_PORT_GDM3,
121 FE_PSE_PORT_PPE1,
122 FE_PSE_PORT_CDM2,
123 FE_PSE_PORT_CDM3,
124 FE_PSE_PORT_CDM4,
125 FE_PSE_PORT_PPE2,
126 FE_PSE_PORT_GDM4,
127 FE_PSE_PORT_CDM5,
128 FE_PSE_PORT_DROP = 0xf,
129 };
130
131 enum tx_sched_mode {
132 TC_SCH_WRR8,
133 TC_SCH_SP,
134 TC_SCH_WRR7,
135 TC_SCH_WRR6,
136 TC_SCH_WRR5,
137 TC_SCH_WRR4,
138 TC_SCH_WRR3,
139 TC_SCH_WRR2,
140 };
141
142 enum trtcm_unit_type {
143 TRTCM_BYTE_UNIT,
144 TRTCM_PACKET_UNIT,
145 };
146
147 enum trtcm_param_type {
148 TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */
149 TRTCM_TOKEN_RATE_MODE,
150 TRTCM_BUCKETSIZE_SHIFT_MODE,
151 TRTCM_BUCKET_COUNTER_MODE,
152 };
153
154 enum trtcm_mode_type {
155 TRTCM_COMMIT_MODE,
156 TRTCM_PEAK_MODE,
157 };
158
159 enum trtcm_param {
160 TRTCM_TICK_SEL = BIT(0),
161 TRTCM_PKT_MODE = BIT(1),
162 TRTCM_METER_MODE = BIT(2),
163 };
164
165 #define MIN_TOKEN_SIZE 4096
166 #define MAX_TOKEN_SIZE_OFFSET 17
167 #define TRTCM_TOKEN_RATE_MASK GENMASK(23, 6)
168 #define TRTCM_TOKEN_RATE_FRACTION_MASK GENMASK(5, 0)
169
170 struct airoha_queue_entry {
171 union {
172 void *buf;
173 struct {
174 struct list_head list;
175 struct sk_buff *skb;
176 };
177 };
178 dma_addr_t dma_addr;
179 u16 dma_len;
180 };
181
182 struct airoha_queue {
183 struct airoha_qdma *qdma;
184
185 /* protect concurrent queue accesses */
186 spinlock_t lock;
187 struct airoha_queue_entry *entry;
188 struct airoha_qdma_desc *desc;
189 u16 head;
190 u16 tail;
191
192 int queued;
193 int ndesc;
194 int free_thr;
195 int buf_size;
196 bool txq_stopped;
197
198 struct napi_struct napi;
199 struct page_pool *page_pool;
200 struct sk_buff *skb;
201
202 struct list_head tx_list;
203 };
204
205 struct airoha_tx_irq_queue {
206 struct airoha_qdma *qdma;
207
208 struct napi_struct napi;
209
210 int size;
211 u32 *q;
212 };
213
214 struct airoha_hw_stats {
215 /* protect concurrent hw_stats accesses */
216 spinlock_t lock;
217 struct u64_stats_sync syncp;
218
219 /* get_stats64 */
220 u64 rx_ok_pkts;
221 u64 tx_ok_pkts;
222 u64 rx_ok_bytes;
223 u64 tx_ok_bytes;
224 u64 rx_multicast;
225 u64 rx_errors;
226 u64 rx_drops;
227 u64 tx_drops;
228 u64 rx_crc_error;
229 u64 rx_over_errors;
230 /* ethtool stats */
231 u64 tx_broadcast;
232 u64 tx_multicast;
233 u64 tx_len[7];
234 u64 rx_broadcast;
235 u64 rx_fragment;
236 u64 rx_jabber;
237 u64 rx_len[7];
238 };
239
240 enum {
241 AIROHA_FOE_STATE_INVALID,
242 AIROHA_FOE_STATE_UNBIND,
243 AIROHA_FOE_STATE_BIND,
244 AIROHA_FOE_STATE_FIN
245 };
246
247 enum {
248 PPE_PKT_TYPE_IPV4_HNAPT = 0,
249 PPE_PKT_TYPE_IPV4_ROUTE = 1,
250 PPE_PKT_TYPE_BRIDGE = 2,
251 PPE_PKT_TYPE_IPV4_DSLITE = 3,
252 PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
253 PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
254 PPE_PKT_TYPE_IPV6_6RD = 7,
255 };
256
257 #define AIROHA_FOE_MAC_SMAC_ID GENMASK(20, 16)
258 #define AIROHA_FOE_MAC_PPPOE_ID GENMASK(15, 0)
259
260 #define AIROHA_FOE_MAC_WDMA_QOS GENMASK(15, 12)
261 #define AIROHA_FOE_MAC_WDMA_BAND BIT(11)
262 #define AIROHA_FOE_MAC_WDMA_WCID GENMASK(10, 0)
263
264 struct airoha_foe_mac_info_common {
265 u16 vlan1;
266 u16 etype;
267
268 u32 dest_mac_hi;
269
270 u16 vlan2;
271 u16 dest_mac_lo;
272
273 u32 src_mac_hi;
274 };
275
276 struct airoha_foe_mac_info {
277 struct airoha_foe_mac_info_common common;
278
279 u16 pppoe_id;
280 u16 src_mac_lo;
281
282 u32 meter;
283 };
284
285 #define AIROHA_FOE_IB1_UNBIND_PREBIND BIT(24)
286 #define AIROHA_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8)
287 #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0)
288
289 #define AIROHA_FOE_IB1_BIND_STATIC BIT(31)
290 #define AIROHA_FOE_IB1_BIND_UDP BIT(30)
291 #define AIROHA_FOE_IB1_BIND_STATE GENMASK(29, 28)
292 #define AIROHA_FOE_IB1_BIND_PACKET_TYPE GENMASK(27, 25)
293 #define AIROHA_FOE_IB1_BIND_TTL BIT(24)
294 #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP BIT(23)
295 #define AIROHA_FOE_IB1_BIND_PPPOE BIT(22)
296 #define AIROHA_FOE_IB1_BIND_VPM GENMASK(21, 20)
297 #define AIROHA_FOE_IB1_BIND_VLAN_LAYER GENMASK(19, 16)
298 #define AIROHA_FOE_IB1_BIND_KEEPALIVE BIT(15)
299 #define AIROHA_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0)
300
301 #define AIROHA_FOE_IB2_DSCP GENMASK(31, 24)
302 #define AIROHA_FOE_IB2_PORT_AG GENMASK(23, 13)
303 #define AIROHA_FOE_IB2_PCP BIT(12)
304 #define AIROHA_FOE_IB2_MULTICAST BIT(11)
305 #define AIROHA_FOE_IB2_FAST_PATH BIT(10)
306 #define AIROHA_FOE_IB2_PSE_QOS BIT(9)
307 #define AIROHA_FOE_IB2_PSE_PORT GENMASK(8, 5)
308 #define AIROHA_FOE_IB2_NBQ GENMASK(4, 0)
309
310 #define AIROHA_FOE_ACTDP GENMASK(31, 24)
311 #define AIROHA_FOE_SHAPER_ID GENMASK(23, 16)
312 #define AIROHA_FOE_CHANNEL GENMASK(15, 11)
313 #define AIROHA_FOE_QID GENMASK(10, 8)
314 #define AIROHA_FOE_DPI BIT(7)
315 #define AIROHA_FOE_TUNNEL BIT(6)
316 #define AIROHA_FOE_TUNNEL_ID GENMASK(5, 0)
317
318 #define AIROHA_FOE_TUNNEL_MTU GENMASK(31, 16)
319 #define AIROHA_FOE_ACNT_GRP3 GENMASK(15, 9)
320 #define AIROHA_FOE_METER_GRP3 GENMASK(8, 5)
321 #define AIROHA_FOE_METER_GRP2 GENMASK(4, 0)
322
323 struct airoha_foe_bridge {
324 u32 dest_mac_hi;
325
326 u16 src_mac_hi;
327 u16 dest_mac_lo;
328
329 u32 src_mac_lo;
330
331 u32 ib2;
332
333 u32 rsv[5];
334
335 u32 data;
336
337 struct airoha_foe_mac_info l2;
338 };
339
340 struct airoha_foe_ipv4_tuple {
341 u32 src_ip;
342 u32 dest_ip;
343 union {
344 struct {
345 u16 dest_port;
346 u16 src_port;
347 };
348 struct {
349 u8 protocol;
350 u8 _pad[3]; /* fill with 0xa5a5a5 */
351 };
352 u32 ports;
353 };
354 };
355
356 struct airoha_foe_ipv4 {
357 struct airoha_foe_ipv4_tuple orig_tuple;
358
359 u32 ib2;
360
361 struct airoha_foe_ipv4_tuple new_tuple;
362
363 u32 rsv[2];
364
365 u32 data;
366
367 struct airoha_foe_mac_info l2;
368 };
369
370 struct airoha_foe_ipv4_dslite {
371 struct airoha_foe_ipv4_tuple ip4;
372
373 u32 ib2;
374
375 u8 flow_label[3];
376 u8 priority;
377
378 u32 rsv[4];
379
380 u32 data;
381
382 struct airoha_foe_mac_info l2;
383 };
384
385 struct airoha_foe_ipv6 {
386 u32 src_ip[4];
387 u32 dest_ip[4];
388
389 union {
390 struct {
391 u16 dest_port;
392 u16 src_port;
393 };
394 struct {
395 u8 protocol;
396 u8 pad[3];
397 };
398 u32 ports;
399 };
400
401 u32 data;
402
403 u32 ib2;
404
405 struct airoha_foe_mac_info_common l2;
406
407 u32 meter;
408 };
409
410 struct airoha_foe_entry {
411 union {
412 struct {
413 u32 ib1;
414 union {
415 struct airoha_foe_bridge bridge;
416 struct airoha_foe_ipv4 ipv4;
417 struct airoha_foe_ipv4_dslite dslite;
418 struct airoha_foe_ipv6 ipv6;
419 DECLARE_FLEX_ARRAY(u32, d);
420 };
421 };
422 u8 data[PPE_ENTRY_SIZE];
423 };
424 };
425
426 struct airoha_foe_stats {
427 u32 bytes;
428 u32 packets;
429 };
430
431 struct airoha_foe_stats64 {
432 u64 bytes;
433 u64 packets;
434 };
435
436 struct airoha_flow_data {
437 struct ethhdr eth;
438
439 union {
440 struct {
441 __be32 src_addr;
442 __be32 dst_addr;
443 } v4;
444
445 struct {
446 struct in6_addr src_addr;
447 struct in6_addr dst_addr;
448 } v6;
449 };
450
451 __be16 src_port;
452 __be16 dst_port;
453
454 struct {
455 struct {
456 u16 id;
457 __be16 proto;
458 } hdr[2];
459 u8 num;
460 } vlan;
461 struct {
462 u16 sid;
463 u8 num;
464 } pppoe;
465 };
466
467 enum airoha_flow_entry_type {
468 FLOW_TYPE_L4,
469 FLOW_TYPE_L2,
470 FLOW_TYPE_L2_SUBFLOW,
471 };
472
473 struct airoha_flow_table_entry {
474 union {
475 struct hlist_node list; /* PPE L3 flow entry */
476 struct {
477 struct rhash_head l2_node; /* L2 flow entry */
478 struct hlist_head l2_flows; /* PPE L2 subflows list */
479 };
480 };
481
482 struct hlist_node l2_subflow_node; /* PPE L2 subflow entry */
483 u32 hash;
484
485 struct airoha_foe_stats64 stats;
486 enum airoha_flow_entry_type type;
487
488 struct rhash_head node;
489 unsigned long cookie;
490
491 /* Must be last --ends in a flexible-array member. */
492 struct airoha_foe_entry data;
493 };
494
495 struct airoha_wdma_info {
496 u8 idx;
497 u8 queue;
498 u16 wcid;
499 u8 bss;
500 };
501
502 /* RX queue to IRQ mapping: BIT(q) in IRQ(n) */
503 #define RX_IRQ0_BANK_PIN_MASK 0x839f
504 #define RX_IRQ1_BANK_PIN_MASK 0x7fe00000
505 #define RX_IRQ2_BANK_PIN_MASK 0x20
506 #define RX_IRQ3_BANK_PIN_MASK 0x40
507 #define RX_IRQ_BANK_PIN_MASK(_n) \
508 (((_n) == 3) ? RX_IRQ3_BANK_PIN_MASK : \
509 ((_n) == 2) ? RX_IRQ2_BANK_PIN_MASK : \
510 ((_n) == 1) ? RX_IRQ1_BANK_PIN_MASK : \
511 RX_IRQ0_BANK_PIN_MASK)
512
513 struct airoha_irq_bank {
514 struct airoha_qdma *qdma;
515
516 /* protect concurrent irqmask accesses */
517 spinlock_t irq_lock;
518 u32 irqmask[QDMA_INT_REG_MAX];
519 int irq;
520 };
521
522 struct airoha_qdma {
523 struct airoha_eth *eth;
524 void __iomem *regs;
525
526 atomic_t users;
527
528 struct airoha_irq_bank irq_banks[AIROHA_MAX_NUM_IRQ_BANKS];
529
530 struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ];
531
532 struct airoha_queue q_tx[AIROHA_NUM_TX_RING];
533 struct airoha_queue q_rx[AIROHA_NUM_RX_RING];
534 };
535
536 struct airoha_gdm_port {
537 struct airoha_qdma *qdma;
538 struct airoha_eth *eth;
539 struct net_device *dev;
540 int id;
541 int nbq;
542
543 struct airoha_hw_stats stats;
544
545 DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS);
546
547 /* qos stats counters */
548 u64 cpu_tx_packets;
549 u64 fwd_tx_packets;
550
551 struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS];
552 };
553
554 #define AIROHA_RXD4_PPE_CPU_REASON GENMASK(20, 16)
555 #define AIROHA_RXD4_FOE_ENTRY GENMASK(15, 0)
556
557 struct airoha_ppe {
558 struct airoha_ppe_dev dev;
559 struct airoha_eth *eth;
560
561 void *foe;
562 dma_addr_t foe_dma;
563
564 struct rhashtable l2_flows;
565
566 struct hlist_head *foe_flow;
567 u16 *foe_check_time;
568
569 struct airoha_foe_stats *foe_stats;
570 dma_addr_t foe_stats_dma;
571
572 struct dentry *debugfs_dir;
573 };
574
575 struct airoha_eth_soc_data {
576 u16 version;
577 const char * const *xsi_rsts_names;
578 int num_xsi_rsts;
579 int num_ppe;
580 struct {
581 int (*get_src_port_id)(struct airoha_gdm_port *port, int nbq);
582 u32 (*get_vip_port)(struct airoha_gdm_port *port, int nbq);
583 } ops;
584 };
585
586 struct airoha_eth {
587 struct device *dev;
588
589 const struct airoha_eth_soc_data *soc;
590
591 unsigned long state;
592 void __iomem *fe_regs;
593
594 struct airoha_npu __rcu *npu;
595
596 struct airoha_ppe *ppe;
597 struct rhashtable flow_table;
598
599 struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS];
600 struct reset_control_bulk_data *xsi_rsts;
601
602 struct net_device *napi_dev;
603
604 struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA];
605 struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS];
606 };
607
608 u32 airoha_rr(void __iomem *base, u32 offset);
609 void airoha_wr(void __iomem *base, u32 offset, u32 val);
610 u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val);
611
612 #define airoha_fe_rr(eth, offset) \
613 airoha_rr((eth)->fe_regs, (offset))
614 #define airoha_fe_wr(eth, offset, val) \
615 airoha_wr((eth)->fe_regs, (offset), (val))
616 #define airoha_fe_rmw(eth, offset, mask, val) \
617 airoha_rmw((eth)->fe_regs, (offset), (mask), (val))
618 #define airoha_fe_set(eth, offset, val) \
619 airoha_rmw((eth)->fe_regs, (offset), 0, (val))
620 #define airoha_fe_clear(eth, offset, val) \
621 airoha_rmw((eth)->fe_regs, (offset), (val), 0)
622
623 #define airoha_qdma_rr(qdma, offset) \
624 airoha_rr((qdma)->regs, (offset))
625 #define airoha_qdma_wr(qdma, offset, val) \
626 airoha_wr((qdma)->regs, (offset), (val))
627 #define airoha_qdma_rmw(qdma, offset, mask, val) \
628 airoha_rmw((qdma)->regs, (offset), (mask), (val))
629 #define airoha_qdma_set(qdma, offset, val) \
630 airoha_rmw((qdma)->regs, (offset), 0, (val))
631 #define airoha_qdma_clear(qdma, offset, val) \
632 airoha_rmw((qdma)->regs, (offset), (val), 0)
633
airoha_qdma_get_txq(struct airoha_qdma * qdma,u16 qid)634 static inline u16 airoha_qdma_get_txq(struct airoha_qdma *qdma, u16 qid)
635 {
636 return qid % ARRAY_SIZE(qdma->q_tx);
637 }
638
airoha_is_lan_gdm_port(struct airoha_gdm_port * port)639 static inline bool airoha_is_lan_gdm_port(struct airoha_gdm_port *port)
640 {
641 /* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
642 * GDM{2,3,4} can be used as wan port connected to an external
643 * phy module.
644 */
645 return port->id == 1;
646 }
647
airoha_is_7581(struct airoha_eth * eth)648 static inline bool airoha_is_7581(struct airoha_eth *eth)
649 {
650 return eth->soc->version == 0x7581;
651 }
652
airoha_is_7583(struct airoha_eth * eth)653 static inline bool airoha_is_7583(struct airoha_eth *eth)
654 {
655 return eth->soc->version == 0x7583;
656 }
657
658 int airoha_get_fe_port(struct airoha_gdm_port *port);
659 bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
660 struct airoha_gdm_port *port);
661
662 void airoha_ppe_set_cpu_port(struct airoha_gdm_port *port, u8 ppe_id,
663 u8 fport);
664 bool airoha_ppe_is_enabled(struct airoha_eth *eth, int index);
665 void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
666 u16 hash, bool rx_wlan);
667 int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data);
668 int airoha_ppe_init(struct airoha_eth *eth);
669 void airoha_ppe_deinit(struct airoha_eth *eth);
670 void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port);
671 u32 airoha_ppe_get_total_num_entries(struct airoha_ppe *ppe);
672 struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe,
673 u32 hash);
674 void airoha_ppe_foe_entry_get_stats(struct airoha_ppe *ppe, u32 hash,
675 struct airoha_foe_stats64 *stats);
676
677 #ifdef CONFIG_DEBUG_FS
678 int airoha_ppe_debugfs_init(struct airoha_ppe *ppe);
679 #else
airoha_ppe_debugfs_init(struct airoha_ppe * ppe)680 static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe)
681 {
682 return 0;
683 }
684 #endif
685
686 #endif /* AIROHA_ETH_H */
687