xref: /linux/drivers/net/ethernet/airoha/airoha_eth.h (revision a869d3a5eb011a9cf9bd864f31f5cf27362de8c7)
1b38f4ff0SLorenzo Bianconi /* SPDX-License-Identifier: GPL-2.0-only */
2b38f4ff0SLorenzo Bianconi /*
3b38f4ff0SLorenzo Bianconi  * Copyright (c) 2024 AIROHA Inc
4b38f4ff0SLorenzo Bianconi  * Author: Lorenzo Bianconi <lorenzo@kernel.org>
5b38f4ff0SLorenzo Bianconi  */
6b38f4ff0SLorenzo Bianconi 
7b38f4ff0SLorenzo Bianconi #ifndef AIROHA_ETH_H
8b38f4ff0SLorenzo Bianconi #define AIROHA_ETH_H
9b38f4ff0SLorenzo Bianconi 
103fe15c64SLorenzo Bianconi #include <linux/debugfs.h>
11b38f4ff0SLorenzo Bianconi #include <linux/etherdevice.h>
12b38f4ff0SLorenzo Bianconi #include <linux/iopoll.h>
13b38f4ff0SLorenzo Bianconi #include <linux/kernel.h>
14b38f4ff0SLorenzo Bianconi #include <linux/netdevice.h>
15b38f4ff0SLorenzo Bianconi #include <linux/reset.h>
1600a76783SLorenzo Bianconi #include <net/dsa.h>
17b38f4ff0SLorenzo Bianconi 
1880369686SLorenzo Bianconi #define AIROHA_MAX_NUM_GDM_PORTS	4
19b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_QDMA		2
20f252493eSLorenzo Bianconi #define AIROHA_MAX_NUM_IRQ_BANKS	4
21af3cf757SLorenzo Bianconi #define AIROHA_MAX_DSA_PORTS		7
22b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_RSTS		3
23b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_XSI_RSTS		5
24168ef0c1SLorenzo Bianconi #define AIROHA_MAX_MTU			9216
25b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_PACKET_SIZE		2048
26b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_CHANNELS		4
27b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_QUEUES		8
28b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_RING		32
29b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_RX_RING		32
30b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_NETDEV_TX_RINGS	(AIROHA_NUM_TX_RING + \
31b38f4ff0SLorenzo Bianconi 					 AIROHA_NUM_QOS_CHANNELS)
32b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_TABLE	64
33b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_PORT	16
34b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_IRQ		2
35b38f4ff0SLorenzo Bianconi #define HW_DSCP_NUM			2048
36b38f4ff0SLorenzo Bianconi #define IRQ_QUEUE_LEN(_n)		((_n) ? 1024 : 2048)
37b38f4ff0SLorenzo Bianconi #define TX_DSCP_NUM			1024
38b38f4ff0SLorenzo Bianconi #define RX_DSCP_NUM(_n)			\
39b38f4ff0SLorenzo Bianconi 	((_n) ==  2 ? 128 :		\
40b38f4ff0SLorenzo Bianconi 	 (_n) == 11 ? 128 :		\
41b38f4ff0SLorenzo Bianconi 	 (_n) == 15 ? 128 :		\
42b38f4ff0SLorenzo Bianconi 	 (_n) ==  0 ? 1024 : 16)
43b38f4ff0SLorenzo Bianconi 
44b38f4ff0SLorenzo Bianconi #define PSE_RSV_PAGES			128
45b38f4ff0SLorenzo Bianconi #define PSE_QUEUE_RSV_PAGES		64
46b38f4ff0SLorenzo Bianconi 
47b38f4ff0SLorenzo Bianconi #define QDMA_METER_IDX(_n)		((_n) & 0xff)
48b38f4ff0SLorenzo Bianconi #define QDMA_METER_GROUP(_n)		(((_n) >> 8) & 0x3)
49b38f4ff0SLorenzo Bianconi 
5000a76783SLorenzo Bianconi #define PPE_NUM				2
5100a76783SLorenzo Bianconi #define PPE1_SRAM_NUM_ENTRIES		(8 * 1024)
5200a76783SLorenzo Bianconi #define PPE_SRAM_NUM_ENTRIES		(2 * PPE1_SRAM_NUM_ENTRIES)
53b81e0f2bSLorenzo Bianconi #ifdef CONFIG_NET_AIROHA_FLOW_STATS
54b81e0f2bSLorenzo Bianconi #define PPE1_STATS_NUM_ENTRIES		(4 * 1024)
55b81e0f2bSLorenzo Bianconi #else
56b81e0f2bSLorenzo Bianconi #define PPE1_STATS_NUM_ENTRIES		0
57b81e0f2bSLorenzo Bianconi #endif /* CONFIG_NET_AIROHA_FLOW_STATS */
58b81e0f2bSLorenzo Bianconi #define PPE_STATS_NUM_ENTRIES		(2 * PPE1_STATS_NUM_ENTRIES)
59b81e0f2bSLorenzo Bianconi #define PPE1_SRAM_NUM_DATA_ENTRIES	(PPE1_SRAM_NUM_ENTRIES - PPE1_STATS_NUM_ENTRIES)
60b81e0f2bSLorenzo Bianconi #define PPE_SRAM_NUM_DATA_ENTRIES	(2 * PPE1_SRAM_NUM_DATA_ENTRIES)
6100a76783SLorenzo Bianconi #define PPE_DRAM_NUM_ENTRIES		(16 * 1024)
6200a76783SLorenzo Bianconi #define PPE_NUM_ENTRIES			(PPE_SRAM_NUM_ENTRIES + PPE_DRAM_NUM_ENTRIES)
6300a76783SLorenzo Bianconi #define PPE_HASH_MASK			(PPE_NUM_ENTRIES - 1)
6400a76783SLorenzo Bianconi #define PPE_ENTRY_SIZE			80
6500a76783SLorenzo Bianconi #define PPE_RAM_NUM_ENTRIES_SHIFT(_n)	(__ffs((_n) >> 10))
6600a76783SLorenzo Bianconi 
67af3cf757SLorenzo Bianconi #define MTK_HDR_LEN			4
68af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_8100	1
69af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_88A8	2
70af3cf757SLorenzo Bianconi 
71b38f4ff0SLorenzo Bianconi enum {
72b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX0,
73b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX1,
74b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX2,
75b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX3,
76b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_IDX4,
77b38f4ff0SLorenzo Bianconi 	QDMA_INT_REG_MAX
78b38f4ff0SLorenzo Bianconi };
79b38f4ff0SLorenzo Bianconi 
80b38f4ff0SLorenzo Bianconi enum {
819cd451d4SLorenzo Bianconi 	HSGMII_LAN_PCIE0_SRCPORT = 0x16,
829cd451d4SLorenzo Bianconi 	HSGMII_LAN_PCIE1_SRCPORT,
839cd451d4SLorenzo Bianconi 	HSGMII_LAN_ETH_SRCPORT,
849cd451d4SLorenzo Bianconi 	HSGMII_LAN_USB_SRCPORT,
859cd451d4SLorenzo Bianconi };
869cd451d4SLorenzo Bianconi 
879cd451d4SLorenzo Bianconi enum {
88b38f4ff0SLorenzo Bianconi 	XSI_PCIE0_VIP_PORT_MASK	= BIT(22),
89b38f4ff0SLorenzo Bianconi 	XSI_PCIE1_VIP_PORT_MASK	= BIT(23),
90b38f4ff0SLorenzo Bianconi 	XSI_USB_VIP_PORT_MASK	= BIT(25),
91b38f4ff0SLorenzo Bianconi 	XSI_ETH_VIP_PORT_MASK	= BIT(24),
92b38f4ff0SLorenzo Bianconi };
93b38f4ff0SLorenzo Bianconi 
94b38f4ff0SLorenzo Bianconi enum {
95b38f4ff0SLorenzo Bianconi 	DEV_STATE_INITIALIZED,
96b38f4ff0SLorenzo Bianconi };
97b38f4ff0SLorenzo Bianconi 
98b38f4ff0SLorenzo Bianconi enum {
99b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q1 = 1,
100b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q5 = 5,
101b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q6 = 6,
102b38f4ff0SLorenzo Bianconi 	CDM_CRSN_QSEL_Q15 = 15,
103b38f4ff0SLorenzo Bianconi };
104b38f4ff0SLorenzo Bianconi 
105b38f4ff0SLorenzo Bianconi enum {
106b38f4ff0SLorenzo Bianconi 	CRSN_08 = 0x8,
107b38f4ff0SLorenzo Bianconi 	CRSN_21 = 0x15, /* KA */
108b38f4ff0SLorenzo Bianconi 	CRSN_22 = 0x16, /* hit bind and force route to CPU */
109b38f4ff0SLorenzo Bianconi 	CRSN_24 = 0x18,
110b38f4ff0SLorenzo Bianconi 	CRSN_25 = 0x19,
111b38f4ff0SLorenzo Bianconi };
112b38f4ff0SLorenzo Bianconi 
113b38f4ff0SLorenzo Bianconi enum {
114b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM1,
115b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM1,
116b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM2,
117b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM3,
118b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_PPE1,
119b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM2,
120b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM3,
121b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM4,
122b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_PPE2,
123b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_GDM4,
124b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_CDM5,
125b38f4ff0SLorenzo Bianconi 	FE_PSE_PORT_DROP = 0xf,
126b38f4ff0SLorenzo Bianconi };
127b38f4ff0SLorenzo Bianconi 
128b38f4ff0SLorenzo Bianconi enum tx_sched_mode {
129b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR8,
130b38f4ff0SLorenzo Bianconi 	TC_SCH_SP,
131b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR7,
132b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR6,
133b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR5,
134b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR4,
135b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR3,
136b38f4ff0SLorenzo Bianconi 	TC_SCH_WRR2,
137b38f4ff0SLorenzo Bianconi };
138b38f4ff0SLorenzo Bianconi 
139df8398fbSLorenzo Bianconi enum trtcm_unit_type {
140df8398fbSLorenzo Bianconi 	TRTCM_BYTE_UNIT,
141df8398fbSLorenzo Bianconi 	TRTCM_PACKET_UNIT,
142df8398fbSLorenzo Bianconi };
143df8398fbSLorenzo Bianconi 
144b38f4ff0SLorenzo Bianconi enum trtcm_param_type {
145b38f4ff0SLorenzo Bianconi 	TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */
146b38f4ff0SLorenzo Bianconi 	TRTCM_TOKEN_RATE_MODE,
147b38f4ff0SLorenzo Bianconi 	TRTCM_BUCKETSIZE_SHIFT_MODE,
148b38f4ff0SLorenzo Bianconi 	TRTCM_BUCKET_COUNTER_MODE,
149b38f4ff0SLorenzo Bianconi };
150b38f4ff0SLorenzo Bianconi 
151b38f4ff0SLorenzo Bianconi enum trtcm_mode_type {
152b38f4ff0SLorenzo Bianconi 	TRTCM_COMMIT_MODE,
153b38f4ff0SLorenzo Bianconi 	TRTCM_PEAK_MODE,
154b38f4ff0SLorenzo Bianconi };
155b38f4ff0SLorenzo Bianconi 
156b38f4ff0SLorenzo Bianconi enum trtcm_param {
157b38f4ff0SLorenzo Bianconi 	TRTCM_TICK_SEL = BIT(0),
158b38f4ff0SLorenzo Bianconi 	TRTCM_PKT_MODE = BIT(1),
159b38f4ff0SLorenzo Bianconi 	TRTCM_METER_MODE = BIT(2),
160b38f4ff0SLorenzo Bianconi };
161b38f4ff0SLorenzo Bianconi 
162b38f4ff0SLorenzo Bianconi #define MIN_TOKEN_SIZE				4096
163b38f4ff0SLorenzo Bianconi #define MAX_TOKEN_SIZE_OFFSET			17
164b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_MASK			GENMASK(23, 6)
165b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_FRACTION_MASK		GENMASK(5, 0)
166b38f4ff0SLorenzo Bianconi 
167b38f4ff0SLorenzo Bianconi struct airoha_queue_entry {
168b38f4ff0SLorenzo Bianconi 	union {
169b38f4ff0SLorenzo Bianconi 		void *buf;
170b38f4ff0SLorenzo Bianconi 		struct sk_buff *skb;
171b38f4ff0SLorenzo Bianconi 	};
172b38f4ff0SLorenzo Bianconi 	dma_addr_t dma_addr;
173b38f4ff0SLorenzo Bianconi 	u16 dma_len;
174b38f4ff0SLorenzo Bianconi };
175b38f4ff0SLorenzo Bianconi 
176b38f4ff0SLorenzo Bianconi struct airoha_queue {
177b38f4ff0SLorenzo Bianconi 	struct airoha_qdma *qdma;
178b38f4ff0SLorenzo Bianconi 
179b38f4ff0SLorenzo Bianconi 	/* protect concurrent queue accesses */
180b38f4ff0SLorenzo Bianconi 	spinlock_t lock;
181b38f4ff0SLorenzo Bianconi 	struct airoha_queue_entry *entry;
182b38f4ff0SLorenzo Bianconi 	struct airoha_qdma_desc *desc;
183b38f4ff0SLorenzo Bianconi 	u16 head;
184b38f4ff0SLorenzo Bianconi 	u16 tail;
185b38f4ff0SLorenzo Bianconi 
186b38f4ff0SLorenzo Bianconi 	int queued;
187b38f4ff0SLorenzo Bianconi 	int ndesc;
188b38f4ff0SLorenzo Bianconi 	int free_thr;
189b38f4ff0SLorenzo Bianconi 	int buf_size;
190b38f4ff0SLorenzo Bianconi 
191b38f4ff0SLorenzo Bianconi 	struct napi_struct napi;
192b38f4ff0SLorenzo Bianconi 	struct page_pool *page_pool;
193e12182ddSLorenzo Bianconi 	struct sk_buff *skb;
194b38f4ff0SLorenzo Bianconi };
195b38f4ff0SLorenzo Bianconi 
196b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue {
197b38f4ff0SLorenzo Bianconi 	struct airoha_qdma *qdma;
198b38f4ff0SLorenzo Bianconi 
199b38f4ff0SLorenzo Bianconi 	struct napi_struct napi;
200b38f4ff0SLorenzo Bianconi 
201b38f4ff0SLorenzo Bianconi 	int size;
202b38f4ff0SLorenzo Bianconi 	u32 *q;
203b38f4ff0SLorenzo Bianconi };
204b38f4ff0SLorenzo Bianconi 
205b38f4ff0SLorenzo Bianconi struct airoha_hw_stats {
206b38f4ff0SLorenzo Bianconi 	/* protect concurrent hw_stats accesses */
207b38f4ff0SLorenzo Bianconi 	spinlock_t lock;
208b38f4ff0SLorenzo Bianconi 	struct u64_stats_sync syncp;
209b38f4ff0SLorenzo Bianconi 
210b38f4ff0SLorenzo Bianconi 	/* get_stats64 */
211b38f4ff0SLorenzo Bianconi 	u64 rx_ok_pkts;
212b38f4ff0SLorenzo Bianconi 	u64 tx_ok_pkts;
213b38f4ff0SLorenzo Bianconi 	u64 rx_ok_bytes;
214b38f4ff0SLorenzo Bianconi 	u64 tx_ok_bytes;
215b38f4ff0SLorenzo Bianconi 	u64 rx_multicast;
216b38f4ff0SLorenzo Bianconi 	u64 rx_errors;
217b38f4ff0SLorenzo Bianconi 	u64 rx_drops;
218b38f4ff0SLorenzo Bianconi 	u64 tx_drops;
219b38f4ff0SLorenzo Bianconi 	u64 rx_crc_error;
220b38f4ff0SLorenzo Bianconi 	u64 rx_over_errors;
221b38f4ff0SLorenzo Bianconi 	/* ethtool stats */
222b38f4ff0SLorenzo Bianconi 	u64 tx_broadcast;
223b38f4ff0SLorenzo Bianconi 	u64 tx_multicast;
224b38f4ff0SLorenzo Bianconi 	u64 tx_len[7];
225b38f4ff0SLorenzo Bianconi 	u64 rx_broadcast;
226b38f4ff0SLorenzo Bianconi 	u64 rx_fragment;
227b38f4ff0SLorenzo Bianconi 	u64 rx_jabber;
228b38f4ff0SLorenzo Bianconi 	u64 rx_len[7];
229b38f4ff0SLorenzo Bianconi };
230b38f4ff0SLorenzo Bianconi 
23100a76783SLorenzo Bianconi enum {
23200a76783SLorenzo Bianconi 	PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
23300a76783SLorenzo Bianconi };
23400a76783SLorenzo Bianconi 
23500a76783SLorenzo Bianconi enum {
23600a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_INVALID,
23700a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_UNBIND,
23800a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_BIND,
23900a76783SLorenzo Bianconi 	AIROHA_FOE_STATE_FIN
24000a76783SLorenzo Bianconi };
24100a76783SLorenzo Bianconi 
24200a76783SLorenzo Bianconi enum {
24300a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV4_HNAPT = 0,
24400a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV4_ROUTE = 1,
24500a76783SLorenzo Bianconi 	PPE_PKT_TYPE_BRIDGE = 2,
24600a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV4_DSLITE = 3,
24700a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
24800a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
24900a76783SLorenzo Bianconi 	PPE_PKT_TYPE_IPV6_6RD = 7,
25000a76783SLorenzo Bianconi };
25100a76783SLorenzo Bianconi 
25200a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_SMAC_ID		GENMASK(20, 16)
25300a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_PPPOE_ID		GENMASK(15, 0)
25400a76783SLorenzo Bianconi 
25500a76783SLorenzo Bianconi struct airoha_foe_mac_info_common {
25600a76783SLorenzo Bianconi 	u16 vlan1;
25700a76783SLorenzo Bianconi 	u16 etype;
25800a76783SLorenzo Bianconi 
25900a76783SLorenzo Bianconi 	u32 dest_mac_hi;
26000a76783SLorenzo Bianconi 
26100a76783SLorenzo Bianconi 	u16 vlan2;
26200a76783SLorenzo Bianconi 	u16 dest_mac_lo;
26300a76783SLorenzo Bianconi 
26400a76783SLorenzo Bianconi 	u32 src_mac_hi;
26500a76783SLorenzo Bianconi };
26600a76783SLorenzo Bianconi 
26700a76783SLorenzo Bianconi struct airoha_foe_mac_info {
26800a76783SLorenzo Bianconi 	struct airoha_foe_mac_info_common common;
26900a76783SLorenzo Bianconi 
27000a76783SLorenzo Bianconi 	u16 pppoe_id;
27100a76783SLorenzo Bianconi 	u16 src_mac_lo;
272b81e0f2bSLorenzo Bianconi 
273b81e0f2bSLorenzo Bianconi 	u32 meter;
27400a76783SLorenzo Bianconi };
27500a76783SLorenzo Bianconi 
27600a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PREBIND		BIT(24)
27700a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PACKETS		GENMASK(23, 8)
27800a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP		GENMASK(7, 0)
27900a76783SLorenzo Bianconi 
28000a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATIC		BIT(31)
28100a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_UDP			BIT(30)
28200a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATE		GENMASK(29, 28)
28300a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PACKET_TYPE		GENMASK(27, 25)
28400a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TTL			BIT(24)
28500a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP	BIT(23)
28600a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PPPOE		BIT(22)
28700a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VPM			GENMASK(21, 20)
28800a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VLAN_LAYER		GENMASK(19, 16)
28900a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_KEEPALIVE		BIT(15)
29000a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TIMESTAMP		GENMASK(14, 0)
29100a76783SLorenzo Bianconi 
29200a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_DSCP			GENMASK(31, 24)
29300a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PORT_AG			GENMASK(23, 13)
29400a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PCP			BIT(12)
29500a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_MULTICAST		BIT(11)
29600a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_FAST_PATH		BIT(10)
29700a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_QOS			BIT(9)
29800a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_PORT			GENMASK(8, 5)
29900a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_NBQ			GENMASK(4, 0)
30000a76783SLorenzo Bianconi 
30100a76783SLorenzo Bianconi #define AIROHA_FOE_ACTDP			GENMASK(31, 24)
30200a76783SLorenzo Bianconi #define AIROHA_FOE_SHAPER_ID			GENMASK(23, 16)
30300a76783SLorenzo Bianconi #define AIROHA_FOE_CHANNEL			GENMASK(15, 11)
30400a76783SLorenzo Bianconi #define AIROHA_FOE_QID				GENMASK(10, 8)
30500a76783SLorenzo Bianconi #define AIROHA_FOE_DPI				BIT(7)
30600a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL			BIT(6)
30700a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL_ID			GENMASK(5, 0)
30800a76783SLorenzo Bianconi 
309b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_TUNNEL_MTU			GENMASK(31, 16)
310b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_ACNT_GRP3			GENMASK(15, 9)
311b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_METER_GRP3			GENMASK(8, 5)
312b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_METER_GRP2			GENMASK(4, 0)
313b81e0f2bSLorenzo Bianconi 
31400a76783SLorenzo Bianconi struct airoha_foe_bridge {
31500a76783SLorenzo Bianconi 	u32 dest_mac_hi;
31600a76783SLorenzo Bianconi 
31700a76783SLorenzo Bianconi 	u16 src_mac_hi;
31800a76783SLorenzo Bianconi 	u16 dest_mac_lo;
31900a76783SLorenzo Bianconi 
32000a76783SLorenzo Bianconi 	u32 src_mac_lo;
32100a76783SLorenzo Bianconi 
32200a76783SLorenzo Bianconi 	u32 ib2;
32300a76783SLorenzo Bianconi 
32400a76783SLorenzo Bianconi 	u32 rsv[5];
32500a76783SLorenzo Bianconi 
32600a76783SLorenzo Bianconi 	u32 data;
32700a76783SLorenzo Bianconi 
32800a76783SLorenzo Bianconi 	struct airoha_foe_mac_info l2;
32900a76783SLorenzo Bianconi };
33000a76783SLorenzo Bianconi 
33100a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple {
33200a76783SLorenzo Bianconi 	u32 src_ip;
33300a76783SLorenzo Bianconi 	u32 dest_ip;
33400a76783SLorenzo Bianconi 	union {
33500a76783SLorenzo Bianconi 		struct {
33600a76783SLorenzo Bianconi 			u16 dest_port;
33700a76783SLorenzo Bianconi 			u16 src_port;
33800a76783SLorenzo Bianconi 		};
33900a76783SLorenzo Bianconi 		struct {
34000a76783SLorenzo Bianconi 			u8 protocol;
34100a76783SLorenzo Bianconi 			u8 _pad[3]; /* fill with 0xa5a5a5 */
34200a76783SLorenzo Bianconi 		};
34300a76783SLorenzo Bianconi 		u32 ports;
34400a76783SLorenzo Bianconi 	};
34500a76783SLorenzo Bianconi };
34600a76783SLorenzo Bianconi 
34700a76783SLorenzo Bianconi struct airoha_foe_ipv4 {
34800a76783SLorenzo Bianconi 	struct airoha_foe_ipv4_tuple orig_tuple;
34900a76783SLorenzo Bianconi 
35000a76783SLorenzo Bianconi 	u32 ib2;
35100a76783SLorenzo Bianconi 
35200a76783SLorenzo Bianconi 	struct airoha_foe_ipv4_tuple new_tuple;
35300a76783SLorenzo Bianconi 
35400a76783SLorenzo Bianconi 	u32 rsv[2];
35500a76783SLorenzo Bianconi 
35600a76783SLorenzo Bianconi 	u32 data;
35700a76783SLorenzo Bianconi 
35800a76783SLorenzo Bianconi 	struct airoha_foe_mac_info l2;
35900a76783SLorenzo Bianconi };
36000a76783SLorenzo Bianconi 
36100a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite {
36200a76783SLorenzo Bianconi 	struct airoha_foe_ipv4_tuple ip4;
36300a76783SLorenzo Bianconi 
36400a76783SLorenzo Bianconi 	u32 ib2;
36500a76783SLorenzo Bianconi 
36600a76783SLorenzo Bianconi 	u8 flow_label[3];
36700a76783SLorenzo Bianconi 	u8 priority;
36800a76783SLorenzo Bianconi 
36900a76783SLorenzo Bianconi 	u32 rsv[4];
37000a76783SLorenzo Bianconi 
37100a76783SLorenzo Bianconi 	u32 data;
37200a76783SLorenzo Bianconi 
37300a76783SLorenzo Bianconi 	struct airoha_foe_mac_info l2;
37400a76783SLorenzo Bianconi };
37500a76783SLorenzo Bianconi 
37600a76783SLorenzo Bianconi struct airoha_foe_ipv6 {
37700a76783SLorenzo Bianconi 	u32 src_ip[4];
37800a76783SLorenzo Bianconi 	u32 dest_ip[4];
37900a76783SLorenzo Bianconi 
38000a76783SLorenzo Bianconi 	union {
38100a76783SLorenzo Bianconi 		struct {
38200a76783SLorenzo Bianconi 			u16 dest_port;
38300a76783SLorenzo Bianconi 			u16 src_port;
38400a76783SLorenzo Bianconi 		};
38500a76783SLorenzo Bianconi 		struct {
38600a76783SLorenzo Bianconi 			u8 protocol;
38700a76783SLorenzo Bianconi 			u8 pad[3];
38800a76783SLorenzo Bianconi 		};
38900a76783SLorenzo Bianconi 		u32 ports;
39000a76783SLorenzo Bianconi 	};
39100a76783SLorenzo Bianconi 
39200a76783SLorenzo Bianconi 	u32 data;
39300a76783SLorenzo Bianconi 
39400a76783SLorenzo Bianconi 	u32 ib2;
39500a76783SLorenzo Bianconi 
39600a76783SLorenzo Bianconi 	struct airoha_foe_mac_info_common l2;
397b81e0f2bSLorenzo Bianconi 
398b81e0f2bSLorenzo Bianconi 	u32 meter;
39900a76783SLorenzo Bianconi };
40000a76783SLorenzo Bianconi 
40100a76783SLorenzo Bianconi struct airoha_foe_entry {
40200a76783SLorenzo Bianconi 	union {
40300a76783SLorenzo Bianconi 		struct {
40400a76783SLorenzo Bianconi 			u32 ib1;
40500a76783SLorenzo Bianconi 			union {
40600a76783SLorenzo Bianconi 				struct airoha_foe_bridge bridge;
40700a76783SLorenzo Bianconi 				struct airoha_foe_ipv4 ipv4;
40800a76783SLorenzo Bianconi 				struct airoha_foe_ipv4_dslite dslite;
40900a76783SLorenzo Bianconi 				struct airoha_foe_ipv6 ipv6;
41000a76783SLorenzo Bianconi 				DECLARE_FLEX_ARRAY(u32, d);
41100a76783SLorenzo Bianconi 			};
41200a76783SLorenzo Bianconi 		};
41300a76783SLorenzo Bianconi 		u8 data[PPE_ENTRY_SIZE];
41400a76783SLorenzo Bianconi 	};
41500a76783SLorenzo Bianconi };
41600a76783SLorenzo Bianconi 
417b81e0f2bSLorenzo Bianconi struct airoha_foe_stats {
418b81e0f2bSLorenzo Bianconi 	u32 bytes;
419b81e0f2bSLorenzo Bianconi 	u32 packets;
420b81e0f2bSLorenzo Bianconi };
421b81e0f2bSLorenzo Bianconi 
422b81e0f2bSLorenzo Bianconi struct airoha_foe_stats64 {
423b81e0f2bSLorenzo Bianconi 	u64 bytes;
424b81e0f2bSLorenzo Bianconi 	u64 packets;
425b81e0f2bSLorenzo Bianconi };
426b81e0f2bSLorenzo Bianconi 
42700a76783SLorenzo Bianconi struct airoha_flow_data {
42800a76783SLorenzo Bianconi 	struct ethhdr eth;
42900a76783SLorenzo Bianconi 
43000a76783SLorenzo Bianconi 	union {
43100a76783SLorenzo Bianconi 		struct {
43200a76783SLorenzo Bianconi 			__be32 src_addr;
43300a76783SLorenzo Bianconi 			__be32 dst_addr;
43400a76783SLorenzo Bianconi 		} v4;
43500a76783SLorenzo Bianconi 
43600a76783SLorenzo Bianconi 		struct {
43700a76783SLorenzo Bianconi 			struct in6_addr src_addr;
43800a76783SLorenzo Bianconi 			struct in6_addr dst_addr;
43900a76783SLorenzo Bianconi 		} v6;
44000a76783SLorenzo Bianconi 	};
44100a76783SLorenzo Bianconi 
44200a76783SLorenzo Bianconi 	__be16 src_port;
44300a76783SLorenzo Bianconi 	__be16 dst_port;
44400a76783SLorenzo Bianconi 
44500a76783SLorenzo Bianconi 	struct {
44600a76783SLorenzo Bianconi 		struct {
44700a76783SLorenzo Bianconi 			u16 id;
44800a76783SLorenzo Bianconi 			__be16 proto;
44900a76783SLorenzo Bianconi 		} hdr[2];
45000a76783SLorenzo Bianconi 		u8 num;
45100a76783SLorenzo Bianconi 	} vlan;
45200a76783SLorenzo Bianconi 	struct {
45300a76783SLorenzo Bianconi 		u16 sid;
45400a76783SLorenzo Bianconi 		u8 num;
45500a76783SLorenzo Bianconi 	} pppoe;
45600a76783SLorenzo Bianconi };
45700a76783SLorenzo Bianconi 
458b4916f67SLorenzo Bianconi enum airoha_flow_entry_type {
459b4916f67SLorenzo Bianconi 	FLOW_TYPE_L4,
460b4916f67SLorenzo Bianconi 	FLOW_TYPE_L2,
461b4916f67SLorenzo Bianconi 	FLOW_TYPE_L2_SUBFLOW,
462b4916f67SLorenzo Bianconi };
463b4916f67SLorenzo Bianconi 
46400a76783SLorenzo Bianconi struct airoha_flow_table_entry {
465b4916f67SLorenzo Bianconi 	union {
466b4916f67SLorenzo Bianconi 		struct hlist_node list; /* PPE L3 flow entry */
467cd53f622SLorenzo Bianconi 		struct {
468b4916f67SLorenzo Bianconi 			struct rhash_head l2_node;  /* L2 flow entry */
469cd53f622SLorenzo Bianconi 			struct hlist_head l2_flows; /* PPE L2 subflows list */
470cd53f622SLorenzo Bianconi 		};
471b4916f67SLorenzo Bianconi 	};
47200a76783SLorenzo Bianconi 
47300a76783SLorenzo Bianconi 	struct airoha_foe_entry data;
474cd53f622SLorenzo Bianconi 	struct hlist_node l2_subflow_node; /* PPE L2 subflow entry */
47500a76783SLorenzo Bianconi 	u32 hash;
47600a76783SLorenzo Bianconi 
477b81e0f2bSLorenzo Bianconi 	struct airoha_foe_stats64 stats;
478b4916f67SLorenzo Bianconi 	enum airoha_flow_entry_type type;
479b4916f67SLorenzo Bianconi 
48000a76783SLorenzo Bianconi 	struct rhash_head node;
48100a76783SLorenzo Bianconi 	unsigned long cookie;
48200a76783SLorenzo Bianconi };
48300a76783SLorenzo Bianconi 
484f252493eSLorenzo Bianconi /* RX queue to IRQ mapping: BIT(q) in IRQ(n) */
485f252493eSLorenzo Bianconi #define RX_IRQ0_BANK_PIN_MASK			0x839f
486f252493eSLorenzo Bianconi #define RX_IRQ1_BANK_PIN_MASK			0x7fe00000
487f252493eSLorenzo Bianconi #define RX_IRQ2_BANK_PIN_MASK			0x20
488f252493eSLorenzo Bianconi #define RX_IRQ3_BANK_PIN_MASK			0x40
489f252493eSLorenzo Bianconi #define RX_IRQ_BANK_PIN_MASK(_n)		\
490f252493eSLorenzo Bianconi 	(((_n) == 3) ? RX_IRQ3_BANK_PIN_MASK :	\
491f252493eSLorenzo Bianconi 	 ((_n) == 2) ? RX_IRQ2_BANK_PIN_MASK :	\
492f252493eSLorenzo Bianconi 	 ((_n) == 1) ? RX_IRQ1_BANK_PIN_MASK :	\
493f252493eSLorenzo Bianconi 	 RX_IRQ0_BANK_PIN_MASK)
494f252493eSLorenzo Bianconi 
4959439db26SLorenzo Bianconi struct airoha_irq_bank {
4969439db26SLorenzo Bianconi 	struct airoha_qdma *qdma;
497b38f4ff0SLorenzo Bianconi 
498b38f4ff0SLorenzo Bianconi 	/* protect concurrent irqmask accesses */
499b38f4ff0SLorenzo Bianconi 	spinlock_t irq_lock;
500b38f4ff0SLorenzo Bianconi 	u32 irqmask[QDMA_INT_REG_MAX];
501b38f4ff0SLorenzo Bianconi 	int irq;
5029439db26SLorenzo Bianconi };
5039439db26SLorenzo Bianconi 
5049439db26SLorenzo Bianconi struct airoha_qdma {
5059439db26SLorenzo Bianconi 	struct airoha_eth *eth;
5069439db26SLorenzo Bianconi 	void __iomem *regs;
507b38f4ff0SLorenzo Bianconi 
50880369686SLorenzo Bianconi 	atomic_t users;
50980369686SLorenzo Bianconi 
5109439db26SLorenzo Bianconi 	struct airoha_irq_bank irq_banks[AIROHA_MAX_NUM_IRQ_BANKS];
5119439db26SLorenzo Bianconi 
512b38f4ff0SLorenzo Bianconi 	struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ];
513b38f4ff0SLorenzo Bianconi 
514b38f4ff0SLorenzo Bianconi 	struct airoha_queue q_tx[AIROHA_NUM_TX_RING];
515b38f4ff0SLorenzo Bianconi 	struct airoha_queue q_rx[AIROHA_NUM_RX_RING];
516b38f4ff0SLorenzo Bianconi };
517b38f4ff0SLorenzo Bianconi 
518b38f4ff0SLorenzo Bianconi struct airoha_gdm_port {
519b38f4ff0SLorenzo Bianconi 	struct airoha_qdma *qdma;
520b38f4ff0SLorenzo Bianconi 	struct net_device *dev;
521b38f4ff0SLorenzo Bianconi 	int id;
522b38f4ff0SLorenzo Bianconi 
523b38f4ff0SLorenzo Bianconi 	struct airoha_hw_stats stats;
524b38f4ff0SLorenzo Bianconi 
525b38f4ff0SLorenzo Bianconi 	DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS);
526b38f4ff0SLorenzo Bianconi 
527b38f4ff0SLorenzo Bianconi 	/* qos stats counters */
528b38f4ff0SLorenzo Bianconi 	u64 cpu_tx_packets;
529b38f4ff0SLorenzo Bianconi 	u64 fwd_tx_packets;
530af3cf757SLorenzo Bianconi 
531af3cf757SLorenzo Bianconi 	struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS];
532b38f4ff0SLorenzo Bianconi };
533b38f4ff0SLorenzo Bianconi 
53400a76783SLorenzo Bianconi #define AIROHA_RXD4_PPE_CPU_REASON	GENMASK(20, 16)
53500a76783SLorenzo Bianconi #define AIROHA_RXD4_FOE_ENTRY		GENMASK(15, 0)
53600a76783SLorenzo Bianconi 
53700a76783SLorenzo Bianconi struct airoha_ppe {
53800a76783SLorenzo Bianconi 	struct airoha_eth *eth;
53900a76783SLorenzo Bianconi 
54000a76783SLorenzo Bianconi 	void *foe;
54100a76783SLorenzo Bianconi 	dma_addr_t foe_dma;
54200a76783SLorenzo Bianconi 
543b4916f67SLorenzo Bianconi 	struct rhashtable l2_flows;
544b4916f67SLorenzo Bianconi 
54500a76783SLorenzo Bianconi 	struct hlist_head *foe_flow;
54600a76783SLorenzo Bianconi 	u16 foe_check_time[PPE_NUM_ENTRIES];
5473fe15c64SLorenzo Bianconi 
548b81e0f2bSLorenzo Bianconi 	struct airoha_foe_stats *foe_stats;
549b81e0f2bSLorenzo Bianconi 	dma_addr_t foe_stats_dma;
550b81e0f2bSLorenzo Bianconi 
5513fe15c64SLorenzo Bianconi 	struct dentry *debugfs_dir;
55200a76783SLorenzo Bianconi };
55300a76783SLorenzo Bianconi 
554b38f4ff0SLorenzo Bianconi struct airoha_eth {
555b38f4ff0SLorenzo Bianconi 	struct device *dev;
556b38f4ff0SLorenzo Bianconi 
557b38f4ff0SLorenzo Bianconi 	unsigned long state;
558b38f4ff0SLorenzo Bianconi 	void __iomem *fe_regs;
559b38f4ff0SLorenzo Bianconi 
56023290c7bSLorenzo Bianconi 	struct airoha_npu __rcu *npu;
56123290c7bSLorenzo Bianconi 
56200a76783SLorenzo Bianconi 	struct airoha_ppe *ppe;
56300a76783SLorenzo Bianconi 	struct rhashtable flow_table;
56400a76783SLorenzo Bianconi 
565b38f4ff0SLorenzo Bianconi 	struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS];
566b38f4ff0SLorenzo Bianconi 	struct reset_control_bulk_data xsi_rsts[AIROHA_MAX_NUM_XSI_RSTS];
567b38f4ff0SLorenzo Bianconi 
568b38f4ff0SLorenzo Bianconi 	struct net_device *napi_dev;
569b38f4ff0SLorenzo Bianconi 
570b38f4ff0SLorenzo Bianconi 	struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA];
571b38f4ff0SLorenzo Bianconi 	struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS];
572b38f4ff0SLorenzo Bianconi };
573b38f4ff0SLorenzo Bianconi 
574e0758a86SLorenzo Bianconi u32 airoha_rr(void __iomem *base, u32 offset);
575e0758a86SLorenzo Bianconi void airoha_wr(void __iomem *base, u32 offset, u32 val);
576e0758a86SLorenzo Bianconi u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val);
577e0758a86SLorenzo Bianconi 
578e0758a86SLorenzo Bianconi #define airoha_fe_rr(eth, offset)				\
579e0758a86SLorenzo Bianconi 	airoha_rr((eth)->fe_regs, (offset))
580e0758a86SLorenzo Bianconi #define airoha_fe_wr(eth, offset, val)				\
581e0758a86SLorenzo Bianconi 	airoha_wr((eth)->fe_regs, (offset), (val))
582e0758a86SLorenzo Bianconi #define airoha_fe_rmw(eth, offset, mask, val)			\
583e0758a86SLorenzo Bianconi 	airoha_rmw((eth)->fe_regs, (offset), (mask), (val))
584e0758a86SLorenzo Bianconi #define airoha_fe_set(eth, offset, val)				\
585e0758a86SLorenzo Bianconi 	airoha_rmw((eth)->fe_regs, (offset), 0, (val))
586e0758a86SLorenzo Bianconi #define airoha_fe_clear(eth, offset, val)			\
587e0758a86SLorenzo Bianconi 	airoha_rmw((eth)->fe_regs, (offset), (val), 0)
588e0758a86SLorenzo Bianconi 
589e0758a86SLorenzo Bianconi #define airoha_qdma_rr(qdma, offset)				\
590e0758a86SLorenzo Bianconi 	airoha_rr((qdma)->regs, (offset))
591e0758a86SLorenzo Bianconi #define airoha_qdma_wr(qdma, offset, val)			\
592e0758a86SLorenzo Bianconi 	airoha_wr((qdma)->regs, (offset), (val))
593e0758a86SLorenzo Bianconi #define airoha_qdma_rmw(qdma, offset, mask, val)		\
594e0758a86SLorenzo Bianconi 	airoha_rmw((qdma)->regs, (offset), (mask), (val))
595e0758a86SLorenzo Bianconi #define airoha_qdma_set(qdma, offset, val)			\
596e0758a86SLorenzo Bianconi 	airoha_rmw((qdma)->regs, (offset), 0, (val))
597e0758a86SLorenzo Bianconi #define airoha_qdma_clear(qdma, offset, val)			\
598e0758a86SLorenzo Bianconi 	airoha_rmw((qdma)->regs, (offset), (val), 0)
599e0758a86SLorenzo Bianconi 
600c683e378SLorenzo Bianconi static inline bool airhoa_is_lan_gdm_port(struct airoha_gdm_port *port)
601c683e378SLorenzo Bianconi {
602c683e378SLorenzo Bianconi 	/* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
603c683e378SLorenzo Bianconi 	 * GDM{2,3,4} can be used as wan port connected to an external
604c683e378SLorenzo Bianconi 	 * phy module.
605c683e378SLorenzo Bianconi 	 */
606c683e378SLorenzo Bianconi 	return port->id == 1;
607c683e378SLorenzo Bianconi }
608c683e378SLorenzo Bianconi 
60909bccf56SLorenzo Bianconi bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
61009bccf56SLorenzo Bianconi 			      struct airoha_gdm_port *port);
61109bccf56SLorenzo Bianconi 
612cd53f622SLorenzo Bianconi void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
613cd53f622SLorenzo Bianconi 			  u16 hash);
614df8398fbSLorenzo Bianconi int airoha_ppe_setup_tc_block_cb(struct net_device *dev, void *type_data);
61500a76783SLorenzo Bianconi int airoha_ppe_init(struct airoha_eth *eth);
61600a76783SLorenzo Bianconi void airoha_ppe_deinit(struct airoha_eth *eth);
617*a869d3a5SLorenzo Bianconi void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port);
6183fe15c64SLorenzo Bianconi struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe,
6193fe15c64SLorenzo Bianconi 						  u32 hash);
620b81e0f2bSLorenzo Bianconi void airoha_ppe_foe_entry_get_stats(struct airoha_ppe *ppe, u32 hash,
621b81e0f2bSLorenzo Bianconi 				    struct airoha_foe_stats64 *stats);
6223fe15c64SLorenzo Bianconi 
62308d0185eSArnd Bergmann #ifdef CONFIG_DEBUG_FS
6243fe15c64SLorenzo Bianconi int airoha_ppe_debugfs_init(struct airoha_ppe *ppe);
6253fe15c64SLorenzo Bianconi #else
6263fe15c64SLorenzo Bianconi static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe)
6273fe15c64SLorenzo Bianconi {
6283fe15c64SLorenzo Bianconi 	return 0;
6293fe15c64SLorenzo Bianconi }
6303fe15c64SLorenzo Bianconi #endif
63100a76783SLorenzo Bianconi 
632b38f4ff0SLorenzo Bianconi #endif /* AIROHA_ETH_H */
633