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 634 static inline bool airoha_is_lan_gdm_port(struct airoha_gdm_port *port) 635 { 636 /* GDM1 port on EN7581 SoC is connected to the lan dsa switch. 637 * GDM{2,3,4} can be used as wan port connected to an external 638 * phy module. 639 */ 640 return port->id == 1; 641 } 642 643 static inline bool airoha_is_7581(struct airoha_eth *eth) 644 { 645 return eth->soc->version == 0x7581; 646 } 647 648 static inline bool airoha_is_7583(struct airoha_eth *eth) 649 { 650 return eth->soc->version == 0x7583; 651 } 652 653 int airoha_get_fe_port(struct airoha_gdm_port *port); 654 bool airoha_is_valid_gdm_port(struct airoha_eth *eth, 655 struct airoha_gdm_port *port); 656 657 void airoha_ppe_set_cpu_port(struct airoha_gdm_port *port, u8 ppe_id); 658 bool airoha_ppe_is_enabled(struct airoha_eth *eth, int index); 659 void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb, 660 u16 hash, bool rx_wlan); 661 int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data); 662 int airoha_ppe_init(struct airoha_eth *eth); 663 void airoha_ppe_deinit(struct airoha_eth *eth); 664 void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port); 665 u32 airoha_ppe_get_total_num_entries(struct airoha_ppe *ppe); 666 struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe, 667 u32 hash); 668 void airoha_ppe_foe_entry_get_stats(struct airoha_ppe *ppe, u32 hash, 669 struct airoha_foe_stats64 *stats); 670 671 #ifdef CONFIG_DEBUG_FS 672 int airoha_ppe_debugfs_init(struct airoha_ppe *ppe); 673 #else 674 static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe) 675 { 676 return 0; 677 } 678 #endif 679 680 #endif /* AIROHA_ETH_H */ 681