xref: /openbmc/linux/drivers/net/ethernet/synopsys/dwc-xlgmac.h (revision 65e0ace2c5cdd7aa898fea17d6e7bdc909394bf9)
1*65e0ace2SJie Deng /* Synopsys DesignWare Core Enterprise Ethernet (XLGMAC) Driver
2*65e0ace2SJie Deng  *
3*65e0ace2SJie Deng  * Copyright (c) 2017 Synopsys, Inc. (www.synopsys.com)
4*65e0ace2SJie Deng  *
5*65e0ace2SJie Deng  * This program is free software; you can redistribute it and/or modify it
6*65e0ace2SJie Deng  * under  the terms of  the GNU General  Public License as published by the
7*65e0ace2SJie Deng  * Free Software Foundation;  either version 2 of the  License, or (at your
8*65e0ace2SJie Deng  * option) any later version.
9*65e0ace2SJie Deng  *
10*65e0ace2SJie Deng  * This Synopsys DWC XLGMAC software driver and associated documentation
11*65e0ace2SJie Deng  * (hereinafter the "Software") is an unsupported proprietary work of
12*65e0ace2SJie Deng  * Synopsys, Inc. unless otherwise expressly agreed to in writing between
13*65e0ace2SJie Deng  * Synopsys and you. The Software IS NOT an item of Licensed Software or a
14*65e0ace2SJie Deng  * Licensed Product under any End User Software License Agreement or
15*65e0ace2SJie Deng  * Agreement for Licensed Products with Synopsys or any supplement thereto.
16*65e0ace2SJie Deng  * Synopsys is a registered trademark of Synopsys, Inc. Other names included
17*65e0ace2SJie Deng  * in the SOFTWARE may be the trademarks of their respective owners.
18*65e0ace2SJie Deng  */
19*65e0ace2SJie Deng 
20*65e0ace2SJie Deng #ifndef __DWC_XLGMAC_H__
21*65e0ace2SJie Deng #define __DWC_XLGMAC_H__
22*65e0ace2SJie Deng 
23*65e0ace2SJie Deng #include <linux/dma-mapping.h>
24*65e0ace2SJie Deng #include <linux/netdevice.h>
25*65e0ace2SJie Deng #include <linux/workqueue.h>
26*65e0ace2SJie Deng #include <linux/phy.h>
27*65e0ace2SJie Deng #include <linux/if_vlan.h>
28*65e0ace2SJie Deng #include <linux/bitops.h>
29*65e0ace2SJie Deng #include <linux/timecounter.h>
30*65e0ace2SJie Deng 
31*65e0ace2SJie Deng #define XLGMAC_DRV_NAME			"dwc-xlgmac"
32*65e0ace2SJie Deng #define XLGMAC_DRV_VERSION		"1.0.0"
33*65e0ace2SJie Deng #define XLGMAC_DRV_DESC			"Synopsys DWC XLGMAC Driver"
34*65e0ace2SJie Deng 
35*65e0ace2SJie Deng /* Descriptor related parameters */
36*65e0ace2SJie Deng #define XLGMAC_TX_DESC_CNT		1024
37*65e0ace2SJie Deng #define XLGMAC_TX_DESC_MIN_FREE		(XLGMAC_TX_DESC_CNT >> 3)
38*65e0ace2SJie Deng #define XLGMAC_TX_DESC_MAX_PROC		(XLGMAC_TX_DESC_CNT >> 1)
39*65e0ace2SJie Deng #define XLGMAC_RX_DESC_CNT		1024
40*65e0ace2SJie Deng #define XLGMAC_RX_DESC_MAX_DIRTY	(XLGMAC_RX_DESC_CNT >> 3)
41*65e0ace2SJie Deng 
42*65e0ace2SJie Deng /* Descriptors required for maximum contiguous TSO/GSO packet */
43*65e0ace2SJie Deng #define XLGMAC_TX_MAX_SPLIT	((GSO_MAX_SIZE / XLGMAC_TX_MAX_BUF_SIZE) + 1)
44*65e0ace2SJie Deng 
45*65e0ace2SJie Deng /* Maximum possible descriptors needed for a SKB */
46*65e0ace2SJie Deng #define XLGMAC_TX_MAX_DESC_NR	(MAX_SKB_FRAGS + XLGMAC_TX_MAX_SPLIT + 2)
47*65e0ace2SJie Deng 
48*65e0ace2SJie Deng #define XLGMAC_TX_MAX_BUF_SIZE	(0x3fff & ~(64 - 1))
49*65e0ace2SJie Deng #define XLGMAC_RX_MIN_BUF_SIZE	(ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN)
50*65e0ace2SJie Deng #define XLGMAC_RX_BUF_ALIGN	64
51*65e0ace2SJie Deng 
52*65e0ace2SJie Deng /* Maximum Size for Splitting the Header Data
53*65e0ace2SJie Deng  * Keep in sync with SKB_ALLOC_SIZE
54*65e0ace2SJie Deng  * 3'b000: 64 bytes, 3'b001: 128 bytes
55*65e0ace2SJie Deng  * 3'b010: 256 bytes, 3'b011: 512 bytes
56*65e0ace2SJie Deng  * 3'b100: 1023 bytes ,   3'b101'3'b111: Reserved
57*65e0ace2SJie Deng  */
58*65e0ace2SJie Deng #define XLGMAC_SPH_HDSMS_SIZE		3
59*65e0ace2SJie Deng #define XLGMAC_SKB_ALLOC_SIZE		512
60*65e0ace2SJie Deng 
61*65e0ace2SJie Deng #define XLGMAC_MAX_FIFO			81920
62*65e0ace2SJie Deng 
63*65e0ace2SJie Deng #define XLGMAC_MAX_DMA_CHANNELS		16
64*65e0ace2SJie Deng #define XLGMAC_DMA_STOP_TIMEOUT		5
65*65e0ace2SJie Deng #define XLGMAC_DMA_INTERRUPT_MASK	0x31c7
66*65e0ace2SJie Deng 
67*65e0ace2SJie Deng /* Default coalescing parameters */
68*65e0ace2SJie Deng #define XLGMAC_INIT_DMA_TX_USECS	1000
69*65e0ace2SJie Deng #define XLGMAC_INIT_DMA_TX_FRAMES	25
70*65e0ace2SJie Deng #define XLGMAC_INIT_DMA_RX_USECS	30
71*65e0ace2SJie Deng #define XLGMAC_INIT_DMA_RX_FRAMES	25
72*65e0ace2SJie Deng 
73*65e0ace2SJie Deng /* Flow control queue count */
74*65e0ace2SJie Deng #define XLGMAC_MAX_FLOW_CONTROL_QUEUES	8
75*65e0ace2SJie Deng 
76*65e0ace2SJie Deng /* System clock is 125 MHz */
77*65e0ace2SJie Deng #define XLGMAC_SYSCLOCK			125000000
78*65e0ace2SJie Deng 
79*65e0ace2SJie Deng /* Maximum MAC address hash table size (256 bits = 8 bytes) */
80*65e0ace2SJie Deng #define XLGMAC_MAC_HASH_TABLE_SIZE	8
81*65e0ace2SJie Deng 
82*65e0ace2SJie Deng /* Receive Side Scaling */
83*65e0ace2SJie Deng #define XLGMAC_RSS_HASH_KEY_SIZE	40
84*65e0ace2SJie Deng #define XLGMAC_RSS_MAX_TABLE_SIZE	256
85*65e0ace2SJie Deng #define XLGMAC_RSS_LOOKUP_TABLE_TYPE	0
86*65e0ace2SJie Deng #define XLGMAC_RSS_HASH_KEY_TYPE	1
87*65e0ace2SJie Deng 
88*65e0ace2SJie Deng #define XLGMAC_STD_PACKET_MTU		1500
89*65e0ace2SJie Deng #define XLGMAC_JUMBO_PACKET_MTU		9000
90*65e0ace2SJie Deng 
91*65e0ace2SJie Deng /* Helper macro for descriptor handling
92*65e0ace2SJie Deng  *  Always use XLGMAC_GET_DESC_DATA to access the descriptor data
93*65e0ace2SJie Deng  */
94*65e0ace2SJie Deng #define XLGMAC_GET_DESC_DATA(ring, idx) ({				\
95*65e0ace2SJie Deng 	typeof(ring) _ring = (ring);					\
96*65e0ace2SJie Deng 	((_ring)->desc_data_head +					\
97*65e0ace2SJie Deng 	 ((idx) & ((_ring)->dma_desc_count - 1)));			\
98*65e0ace2SJie Deng })
99*65e0ace2SJie Deng 
100*65e0ace2SJie Deng #define XLGMAC_GET_REG_BITS(var, pos, len) ({				\
101*65e0ace2SJie Deng 	typeof(pos) _pos = (pos);					\
102*65e0ace2SJie Deng 	typeof(len) _len = (len);					\
103*65e0ace2SJie Deng 	((var) & GENMASK(_pos + _len - 1, _pos)) >> (_pos);		\
104*65e0ace2SJie Deng })
105*65e0ace2SJie Deng 
106*65e0ace2SJie Deng #define XLGMAC_GET_REG_BITS_LE(var, pos, len) ({			\
107*65e0ace2SJie Deng 	typeof(pos) _pos = (pos);					\
108*65e0ace2SJie Deng 	typeof(len) _len = (len);					\
109*65e0ace2SJie Deng 	typeof(var) _var = le32_to_cpu((var));				\
110*65e0ace2SJie Deng 	((_var) & GENMASK(_pos + _len - 1, _pos)) >> (_pos);		\
111*65e0ace2SJie Deng })
112*65e0ace2SJie Deng 
113*65e0ace2SJie Deng #define XLGMAC_SET_REG_BITS(var, pos, len, val) ({			\
114*65e0ace2SJie Deng 	typeof(var) _var = (var);					\
115*65e0ace2SJie Deng 	typeof(pos) _pos = (pos);					\
116*65e0ace2SJie Deng 	typeof(len) _len = (len);					\
117*65e0ace2SJie Deng 	typeof(val) _val = (val);					\
118*65e0ace2SJie Deng 	_val = (_val << _pos) & GENMASK(_pos + _len - 1, _pos);		\
119*65e0ace2SJie Deng 	_var = (_var & ~GENMASK(_pos + _len - 1, _pos)) | _val;		\
120*65e0ace2SJie Deng })
121*65e0ace2SJie Deng 
122*65e0ace2SJie Deng #define XLGMAC_SET_REG_BITS_LE(var, pos, len, val) ({			\
123*65e0ace2SJie Deng 	typeof(var) _var = (var);					\
124*65e0ace2SJie Deng 	typeof(pos) _pos = (pos);					\
125*65e0ace2SJie Deng 	typeof(len) _len = (len);					\
126*65e0ace2SJie Deng 	typeof(val) _val = (val);					\
127*65e0ace2SJie Deng 	_val = (_val << _pos) & GENMASK(_pos + _len - 1, _pos);		\
128*65e0ace2SJie Deng 	_var = (_var & ~GENMASK(_pos + _len - 1, _pos)) | _val;		\
129*65e0ace2SJie Deng 	cpu_to_le32(_var);						\
130*65e0ace2SJie Deng })
131*65e0ace2SJie Deng 
132*65e0ace2SJie Deng struct xlgmac_pdata;
133*65e0ace2SJie Deng 
134*65e0ace2SJie Deng enum xlgmac_int {
135*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_TI,
136*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_TPS,
137*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_TBU,
138*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_RI,
139*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_RBU,
140*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_RPS,
141*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_TI_RI,
142*65e0ace2SJie Deng 	XLGMAC_INT_DMA_CH_SR_FBE,
143*65e0ace2SJie Deng 	XLGMAC_INT_DMA_ALL,
144*65e0ace2SJie Deng };
145*65e0ace2SJie Deng 
146*65e0ace2SJie Deng struct xlgmac_stats {
147*65e0ace2SJie Deng 	/* MMC TX counters */
148*65e0ace2SJie Deng 	u64 txoctetcount_gb;
149*65e0ace2SJie Deng 	u64 txframecount_gb;
150*65e0ace2SJie Deng 	u64 txbroadcastframes_g;
151*65e0ace2SJie Deng 	u64 txmulticastframes_g;
152*65e0ace2SJie Deng 	u64 tx64octets_gb;
153*65e0ace2SJie Deng 	u64 tx65to127octets_gb;
154*65e0ace2SJie Deng 	u64 tx128to255octets_gb;
155*65e0ace2SJie Deng 	u64 tx256to511octets_gb;
156*65e0ace2SJie Deng 	u64 tx512to1023octets_gb;
157*65e0ace2SJie Deng 	u64 tx1024tomaxoctets_gb;
158*65e0ace2SJie Deng 	u64 txunicastframes_gb;
159*65e0ace2SJie Deng 	u64 txmulticastframes_gb;
160*65e0ace2SJie Deng 	u64 txbroadcastframes_gb;
161*65e0ace2SJie Deng 	u64 txunderflowerror;
162*65e0ace2SJie Deng 	u64 txoctetcount_g;
163*65e0ace2SJie Deng 	u64 txframecount_g;
164*65e0ace2SJie Deng 	u64 txpauseframes;
165*65e0ace2SJie Deng 	u64 txvlanframes_g;
166*65e0ace2SJie Deng 
167*65e0ace2SJie Deng 	/* MMC RX counters */
168*65e0ace2SJie Deng 	u64 rxframecount_gb;
169*65e0ace2SJie Deng 	u64 rxoctetcount_gb;
170*65e0ace2SJie Deng 	u64 rxoctetcount_g;
171*65e0ace2SJie Deng 	u64 rxbroadcastframes_g;
172*65e0ace2SJie Deng 	u64 rxmulticastframes_g;
173*65e0ace2SJie Deng 	u64 rxcrcerror;
174*65e0ace2SJie Deng 	u64 rxrunterror;
175*65e0ace2SJie Deng 	u64 rxjabbererror;
176*65e0ace2SJie Deng 	u64 rxundersize_g;
177*65e0ace2SJie Deng 	u64 rxoversize_g;
178*65e0ace2SJie Deng 	u64 rx64octets_gb;
179*65e0ace2SJie Deng 	u64 rx65to127octets_gb;
180*65e0ace2SJie Deng 	u64 rx128to255octets_gb;
181*65e0ace2SJie Deng 	u64 rx256to511octets_gb;
182*65e0ace2SJie Deng 	u64 rx512to1023octets_gb;
183*65e0ace2SJie Deng 	u64 rx1024tomaxoctets_gb;
184*65e0ace2SJie Deng 	u64 rxunicastframes_g;
185*65e0ace2SJie Deng 	u64 rxlengtherror;
186*65e0ace2SJie Deng 	u64 rxoutofrangetype;
187*65e0ace2SJie Deng 	u64 rxpauseframes;
188*65e0ace2SJie Deng 	u64 rxfifooverflow;
189*65e0ace2SJie Deng 	u64 rxvlanframes_gb;
190*65e0ace2SJie Deng 	u64 rxwatchdogerror;
191*65e0ace2SJie Deng 
192*65e0ace2SJie Deng 	/* Extra counters */
193*65e0ace2SJie Deng 	u64 tx_tso_packets;
194*65e0ace2SJie Deng 	u64 rx_split_header_packets;
195*65e0ace2SJie Deng 	u64 rx_buffer_unavailable;
196*65e0ace2SJie Deng };
197*65e0ace2SJie Deng 
198*65e0ace2SJie Deng struct xlgmac_ring_buf {
199*65e0ace2SJie Deng 	struct sk_buff *skb;
200*65e0ace2SJie Deng 	dma_addr_t skb_dma;
201*65e0ace2SJie Deng 	unsigned int skb_len;
202*65e0ace2SJie Deng };
203*65e0ace2SJie Deng 
204*65e0ace2SJie Deng /* Common Tx and Rx DMA hardware descriptor */
205*65e0ace2SJie Deng struct xlgmac_dma_desc {
206*65e0ace2SJie Deng 	__le32 desc0;
207*65e0ace2SJie Deng 	__le32 desc1;
208*65e0ace2SJie Deng 	__le32 desc2;
209*65e0ace2SJie Deng 	__le32 desc3;
210*65e0ace2SJie Deng };
211*65e0ace2SJie Deng 
212*65e0ace2SJie Deng /* Page allocation related values */
213*65e0ace2SJie Deng struct xlgmac_page_alloc {
214*65e0ace2SJie Deng 	struct page *pages;
215*65e0ace2SJie Deng 	unsigned int pages_len;
216*65e0ace2SJie Deng 	unsigned int pages_offset;
217*65e0ace2SJie Deng 
218*65e0ace2SJie Deng 	dma_addr_t pages_dma;
219*65e0ace2SJie Deng };
220*65e0ace2SJie Deng 
221*65e0ace2SJie Deng /* Ring entry buffer data */
222*65e0ace2SJie Deng struct xlgmac_buffer_data {
223*65e0ace2SJie Deng 	struct xlgmac_page_alloc pa;
224*65e0ace2SJie Deng 	struct xlgmac_page_alloc pa_unmap;
225*65e0ace2SJie Deng 
226*65e0ace2SJie Deng 	dma_addr_t dma_base;
227*65e0ace2SJie Deng 	unsigned long dma_off;
228*65e0ace2SJie Deng 	unsigned int dma_len;
229*65e0ace2SJie Deng };
230*65e0ace2SJie Deng 
231*65e0ace2SJie Deng /* Tx-related desc data */
232*65e0ace2SJie Deng struct xlgmac_tx_desc_data {
233*65e0ace2SJie Deng 	unsigned int packets;		/* BQL packet count */
234*65e0ace2SJie Deng 	unsigned int bytes;		/* BQL byte count */
235*65e0ace2SJie Deng };
236*65e0ace2SJie Deng 
237*65e0ace2SJie Deng /* Rx-related desc data */
238*65e0ace2SJie Deng struct xlgmac_rx_desc_data {
239*65e0ace2SJie Deng 	struct xlgmac_buffer_data hdr;	/* Header locations */
240*65e0ace2SJie Deng 	struct xlgmac_buffer_data buf;	/* Payload locations */
241*65e0ace2SJie Deng 
242*65e0ace2SJie Deng 	unsigned short hdr_len;		/* Length of received header */
243*65e0ace2SJie Deng 	unsigned short len;		/* Length of received packet */
244*65e0ace2SJie Deng };
245*65e0ace2SJie Deng 
246*65e0ace2SJie Deng struct xlgmac_pkt_info {
247*65e0ace2SJie Deng 	struct sk_buff *skb;
248*65e0ace2SJie Deng 
249*65e0ace2SJie Deng 	unsigned int attributes;
250*65e0ace2SJie Deng 
251*65e0ace2SJie Deng 	unsigned int errors;
252*65e0ace2SJie Deng 
253*65e0ace2SJie Deng 	/* descriptors needed for this packet */
254*65e0ace2SJie Deng 	unsigned int desc_count;
255*65e0ace2SJie Deng 	unsigned int length;
256*65e0ace2SJie Deng 
257*65e0ace2SJie Deng 	unsigned int tx_packets;
258*65e0ace2SJie Deng 	unsigned int tx_bytes;
259*65e0ace2SJie Deng 
260*65e0ace2SJie Deng 	unsigned int header_len;
261*65e0ace2SJie Deng 	unsigned int tcp_header_len;
262*65e0ace2SJie Deng 	unsigned int tcp_payload_len;
263*65e0ace2SJie Deng 	unsigned short mss;
264*65e0ace2SJie Deng 
265*65e0ace2SJie Deng 	unsigned short vlan_ctag;
266*65e0ace2SJie Deng 
267*65e0ace2SJie Deng 	u64 rx_tstamp;
268*65e0ace2SJie Deng 
269*65e0ace2SJie Deng 	u32 rss_hash;
270*65e0ace2SJie Deng 	enum pkt_hash_types rss_hash_type;
271*65e0ace2SJie Deng };
272*65e0ace2SJie Deng 
273*65e0ace2SJie Deng struct xlgmac_desc_data {
274*65e0ace2SJie Deng 	/* dma_desc: Virtual address of descriptor
275*65e0ace2SJie Deng 	 *  dma_desc_addr: DMA address of descriptor
276*65e0ace2SJie Deng 	 */
277*65e0ace2SJie Deng 	struct xlgmac_dma_desc *dma_desc;
278*65e0ace2SJie Deng 	dma_addr_t dma_desc_addr;
279*65e0ace2SJie Deng 
280*65e0ace2SJie Deng 	/* skb: Virtual address of SKB
281*65e0ace2SJie Deng 	 *  skb_dma: DMA address of SKB data
282*65e0ace2SJie Deng 	 *  skb_dma_len: Length of SKB DMA area
283*65e0ace2SJie Deng 	 */
284*65e0ace2SJie Deng 	struct sk_buff *skb;
285*65e0ace2SJie Deng 	dma_addr_t skb_dma;
286*65e0ace2SJie Deng 	unsigned int skb_dma_len;
287*65e0ace2SJie Deng 
288*65e0ace2SJie Deng 	/* Tx/Rx -related data */
289*65e0ace2SJie Deng 	struct xlgmac_tx_desc_data tx;
290*65e0ace2SJie Deng 	struct xlgmac_rx_desc_data rx;
291*65e0ace2SJie Deng 
292*65e0ace2SJie Deng 	unsigned int mapped_as_page;
293*65e0ace2SJie Deng 
294*65e0ace2SJie Deng 	/* Incomplete receive save location.  If the budget is exhausted
295*65e0ace2SJie Deng 	 * or the last descriptor (last normal descriptor or a following
296*65e0ace2SJie Deng 	 * context descriptor) has not been DMA'd yet the current state
297*65e0ace2SJie Deng 	 * of the receive processing needs to be saved.
298*65e0ace2SJie Deng 	 */
299*65e0ace2SJie Deng 	unsigned int state_saved;
300*65e0ace2SJie Deng 	struct {
301*65e0ace2SJie Deng 		struct sk_buff *skb;
302*65e0ace2SJie Deng 		unsigned int len;
303*65e0ace2SJie Deng 		unsigned int error;
304*65e0ace2SJie Deng 	} state;
305*65e0ace2SJie Deng };
306*65e0ace2SJie Deng 
307*65e0ace2SJie Deng struct xlgmac_ring {
308*65e0ace2SJie Deng 	/* Per packet related information */
309*65e0ace2SJie Deng 	struct xlgmac_pkt_info pkt_info;
310*65e0ace2SJie Deng 
311*65e0ace2SJie Deng 	/* Virtual/DMA addresses of DMA descriptor list and the total count */
312*65e0ace2SJie Deng 	struct xlgmac_dma_desc *dma_desc_head;
313*65e0ace2SJie Deng 	dma_addr_t dma_desc_head_addr;
314*65e0ace2SJie Deng 	unsigned int dma_desc_count;
315*65e0ace2SJie Deng 
316*65e0ace2SJie Deng 	/* Array of descriptor data corresponding the DMA descriptor
317*65e0ace2SJie Deng 	 * (always use the XLGMAC_GET_DESC_DATA macro to access this data)
318*65e0ace2SJie Deng 	 */
319*65e0ace2SJie Deng 	struct xlgmac_desc_data *desc_data_head;
320*65e0ace2SJie Deng 
321*65e0ace2SJie Deng 	/* Page allocation for RX buffers */
322*65e0ace2SJie Deng 	struct xlgmac_page_alloc rx_hdr_pa;
323*65e0ace2SJie Deng 	struct xlgmac_page_alloc rx_buf_pa;
324*65e0ace2SJie Deng 
325*65e0ace2SJie Deng 	/* Ring index values
326*65e0ace2SJie Deng 	 *  cur   - Tx: index of descriptor to be used for current transfer
327*65e0ace2SJie Deng 	 *          Rx: index of descriptor to check for packet availability
328*65e0ace2SJie Deng 	 *  dirty - Tx: index of descriptor to check for transfer complete
329*65e0ace2SJie Deng 	 *          Rx: index of descriptor to check for buffer reallocation
330*65e0ace2SJie Deng 	 */
331*65e0ace2SJie Deng 	unsigned int cur;
332*65e0ace2SJie Deng 	unsigned int dirty;
333*65e0ace2SJie Deng 
334*65e0ace2SJie Deng 	/* Coalesce frame count used for interrupt bit setting */
335*65e0ace2SJie Deng 	unsigned int coalesce_count;
336*65e0ace2SJie Deng 
337*65e0ace2SJie Deng 	union {
338*65e0ace2SJie Deng 		struct {
339*65e0ace2SJie Deng 			unsigned int xmit_more;
340*65e0ace2SJie Deng 			unsigned int queue_stopped;
341*65e0ace2SJie Deng 			unsigned short cur_mss;
342*65e0ace2SJie Deng 			unsigned short cur_vlan_ctag;
343*65e0ace2SJie Deng 		} tx;
344*65e0ace2SJie Deng 	};
345*65e0ace2SJie Deng } ____cacheline_aligned;
346*65e0ace2SJie Deng 
347*65e0ace2SJie Deng struct xlgmac_channel {
348*65e0ace2SJie Deng 	char name[16];
349*65e0ace2SJie Deng 
350*65e0ace2SJie Deng 	/* Address of private data area for device */
351*65e0ace2SJie Deng 	struct xlgmac_pdata *pdata;
352*65e0ace2SJie Deng 
353*65e0ace2SJie Deng 	/* Queue index and base address of queue's DMA registers */
354*65e0ace2SJie Deng 	unsigned int queue_index;
355*65e0ace2SJie Deng 	void __iomem *dma_regs;
356*65e0ace2SJie Deng 
357*65e0ace2SJie Deng 	/* Per channel interrupt irq number */
358*65e0ace2SJie Deng 	int dma_irq;
359*65e0ace2SJie Deng 	char dma_irq_name[IFNAMSIZ + 32];
360*65e0ace2SJie Deng 
361*65e0ace2SJie Deng 	/* Netdev related settings */
362*65e0ace2SJie Deng 	struct napi_struct napi;
363*65e0ace2SJie Deng 
364*65e0ace2SJie Deng 	unsigned int saved_ier;
365*65e0ace2SJie Deng 
366*65e0ace2SJie Deng 	unsigned int tx_timer_active;
367*65e0ace2SJie Deng 	struct timer_list tx_timer;
368*65e0ace2SJie Deng 
369*65e0ace2SJie Deng 	struct xlgmac_ring *tx_ring;
370*65e0ace2SJie Deng 	struct xlgmac_ring *rx_ring;
371*65e0ace2SJie Deng } ____cacheline_aligned;
372*65e0ace2SJie Deng 
373*65e0ace2SJie Deng struct xlgmac_desc_ops {
374*65e0ace2SJie Deng 	int (*alloc_channles_and_rings)(struct xlgmac_pdata *pdata);
375*65e0ace2SJie Deng 	void (*free_channels_and_rings)(struct xlgmac_pdata *pdata);
376*65e0ace2SJie Deng 	int (*map_tx_skb)(struct xlgmac_channel *channel,
377*65e0ace2SJie Deng 			  struct sk_buff *skb);
378*65e0ace2SJie Deng 	int (*map_rx_buffer)(struct xlgmac_pdata *pdata,
379*65e0ace2SJie Deng 			     struct xlgmac_ring *ring,
380*65e0ace2SJie Deng 			struct xlgmac_desc_data *desc_data);
381*65e0ace2SJie Deng 	void (*unmap_desc_data)(struct xlgmac_pdata *pdata,
382*65e0ace2SJie Deng 				struct xlgmac_desc_data *desc_data);
383*65e0ace2SJie Deng 	void (*tx_desc_init)(struct xlgmac_pdata *pdata);
384*65e0ace2SJie Deng 	void (*rx_desc_init)(struct xlgmac_pdata *pdata);
385*65e0ace2SJie Deng };
386*65e0ace2SJie Deng 
387*65e0ace2SJie Deng struct xlgmac_hw_ops {
388*65e0ace2SJie Deng 	int (*init)(struct xlgmac_pdata *pdata);
389*65e0ace2SJie Deng 	int (*exit)(struct xlgmac_pdata *pdata);
390*65e0ace2SJie Deng 
391*65e0ace2SJie Deng 	int (*tx_complete)(struct xlgmac_dma_desc *dma_desc);
392*65e0ace2SJie Deng 
393*65e0ace2SJie Deng 	void (*enable_tx)(struct xlgmac_pdata *pdata);
394*65e0ace2SJie Deng 	void (*disable_tx)(struct xlgmac_pdata *pdata);
395*65e0ace2SJie Deng 	void (*enable_rx)(struct xlgmac_pdata *pdata);
396*65e0ace2SJie Deng 	void (*disable_rx)(struct xlgmac_pdata *pdata);
397*65e0ace2SJie Deng 
398*65e0ace2SJie Deng 	int (*enable_int)(struct xlgmac_channel *channel,
399*65e0ace2SJie Deng 			  enum xlgmac_int int_id);
400*65e0ace2SJie Deng 	int (*disable_int)(struct xlgmac_channel *channel,
401*65e0ace2SJie Deng 			   enum xlgmac_int int_id);
402*65e0ace2SJie Deng 	void (*dev_xmit)(struct xlgmac_channel *channel);
403*65e0ace2SJie Deng 	int (*dev_read)(struct xlgmac_channel *channel);
404*65e0ace2SJie Deng 
405*65e0ace2SJie Deng 	int (*set_mac_address)(struct xlgmac_pdata *pdata, u8 *addr);
406*65e0ace2SJie Deng 	int (*config_rx_mode)(struct xlgmac_pdata *pdata);
407*65e0ace2SJie Deng 	int (*enable_rx_csum)(struct xlgmac_pdata *pdata);
408*65e0ace2SJie Deng 	int (*disable_rx_csum)(struct xlgmac_pdata *pdata);
409*65e0ace2SJie Deng 
410*65e0ace2SJie Deng 	/* For MII speed configuration */
411*65e0ace2SJie Deng 	int (*set_xlgmii_25000_speed)(struct xlgmac_pdata *pdata);
412*65e0ace2SJie Deng 	int (*set_xlgmii_40000_speed)(struct xlgmac_pdata *pdata);
413*65e0ace2SJie Deng 	int (*set_xlgmii_50000_speed)(struct xlgmac_pdata *pdata);
414*65e0ace2SJie Deng 	int (*set_xlgmii_100000_speed)(struct xlgmac_pdata *pdata);
415*65e0ace2SJie Deng 
416*65e0ace2SJie Deng 	/* For descriptor related operation */
417*65e0ace2SJie Deng 	void (*tx_desc_init)(struct xlgmac_channel *channel);
418*65e0ace2SJie Deng 	void (*rx_desc_init)(struct xlgmac_channel *channel);
419*65e0ace2SJie Deng 	void (*tx_desc_reset)(struct xlgmac_desc_data *desc_data);
420*65e0ace2SJie Deng 	void (*rx_desc_reset)(struct xlgmac_pdata *pdata,
421*65e0ace2SJie Deng 			      struct xlgmac_desc_data *desc_data,
422*65e0ace2SJie Deng 			unsigned int index);
423*65e0ace2SJie Deng 	int (*is_last_desc)(struct xlgmac_dma_desc *dma_desc);
424*65e0ace2SJie Deng 	int (*is_context_desc)(struct xlgmac_dma_desc *dma_desc);
425*65e0ace2SJie Deng 	void (*tx_start_xmit)(struct xlgmac_channel *channel,
426*65e0ace2SJie Deng 			      struct xlgmac_ring *ring);
427*65e0ace2SJie Deng 
428*65e0ace2SJie Deng 	/* For Flow Control */
429*65e0ace2SJie Deng 	int (*config_tx_flow_control)(struct xlgmac_pdata *pdata);
430*65e0ace2SJie Deng 	int (*config_rx_flow_control)(struct xlgmac_pdata *pdata);
431*65e0ace2SJie Deng 
432*65e0ace2SJie Deng 	/* For Vlan related config */
433*65e0ace2SJie Deng 	int (*enable_rx_vlan_stripping)(struct xlgmac_pdata *pdata);
434*65e0ace2SJie Deng 	int (*disable_rx_vlan_stripping)(struct xlgmac_pdata *pdata);
435*65e0ace2SJie Deng 	int (*enable_rx_vlan_filtering)(struct xlgmac_pdata *pdata);
436*65e0ace2SJie Deng 	int (*disable_rx_vlan_filtering)(struct xlgmac_pdata *pdata);
437*65e0ace2SJie Deng 	int (*update_vlan_hash_table)(struct xlgmac_pdata *pdata);
438*65e0ace2SJie Deng 
439*65e0ace2SJie Deng 	/* For RX coalescing */
440*65e0ace2SJie Deng 	int (*config_rx_coalesce)(struct xlgmac_pdata *pdata);
441*65e0ace2SJie Deng 	int (*config_tx_coalesce)(struct xlgmac_pdata *pdata);
442*65e0ace2SJie Deng 	unsigned int (*usec_to_riwt)(struct xlgmac_pdata *pdata,
443*65e0ace2SJie Deng 				     unsigned int usec);
444*65e0ace2SJie Deng 	unsigned int (*riwt_to_usec)(struct xlgmac_pdata *pdata,
445*65e0ace2SJie Deng 				     unsigned int riwt);
446*65e0ace2SJie Deng 
447*65e0ace2SJie Deng 	/* For RX and TX threshold config */
448*65e0ace2SJie Deng 	int (*config_rx_threshold)(struct xlgmac_pdata *pdata,
449*65e0ace2SJie Deng 				   unsigned int val);
450*65e0ace2SJie Deng 	int (*config_tx_threshold)(struct xlgmac_pdata *pdata,
451*65e0ace2SJie Deng 				   unsigned int val);
452*65e0ace2SJie Deng 
453*65e0ace2SJie Deng 	/* For RX and TX Store and Forward Mode config */
454*65e0ace2SJie Deng 	int (*config_rsf_mode)(struct xlgmac_pdata *pdata,
455*65e0ace2SJie Deng 			       unsigned int val);
456*65e0ace2SJie Deng 	int (*config_tsf_mode)(struct xlgmac_pdata *pdata,
457*65e0ace2SJie Deng 			       unsigned int val);
458*65e0ace2SJie Deng 
459*65e0ace2SJie Deng 	/* For TX DMA Operate on Second Frame config */
460*65e0ace2SJie Deng 	int (*config_osp_mode)(struct xlgmac_pdata *pdata);
461*65e0ace2SJie Deng 
462*65e0ace2SJie Deng 	/* For RX and TX PBL config */
463*65e0ace2SJie Deng 	int (*config_rx_pbl_val)(struct xlgmac_pdata *pdata);
464*65e0ace2SJie Deng 	int (*get_rx_pbl_val)(struct xlgmac_pdata *pdata);
465*65e0ace2SJie Deng 	int (*config_tx_pbl_val)(struct xlgmac_pdata *pdata);
466*65e0ace2SJie Deng 	int (*get_tx_pbl_val)(struct xlgmac_pdata *pdata);
467*65e0ace2SJie Deng 	int (*config_pblx8)(struct xlgmac_pdata *pdata);
468*65e0ace2SJie Deng 
469*65e0ace2SJie Deng 	/* For MMC statistics */
470*65e0ace2SJie Deng 	void (*rx_mmc_int)(struct xlgmac_pdata *pdata);
471*65e0ace2SJie Deng 	void (*tx_mmc_int)(struct xlgmac_pdata *pdata);
472*65e0ace2SJie Deng 	void (*read_mmc_stats)(struct xlgmac_pdata *pdata);
473*65e0ace2SJie Deng 
474*65e0ace2SJie Deng 	/* For Receive Side Scaling */
475*65e0ace2SJie Deng 	int (*enable_rss)(struct xlgmac_pdata *pdata);
476*65e0ace2SJie Deng 	int (*disable_rss)(struct xlgmac_pdata *pdata);
477*65e0ace2SJie Deng 	int (*set_rss_hash_key)(struct xlgmac_pdata *pdata,
478*65e0ace2SJie Deng 				const u8 *key);
479*65e0ace2SJie Deng 	int (*set_rss_lookup_table)(struct xlgmac_pdata *pdata,
480*65e0ace2SJie Deng 				    const u32 *table);
481*65e0ace2SJie Deng };
482*65e0ace2SJie Deng 
483*65e0ace2SJie Deng /* This structure contains flags that indicate what hardware features
484*65e0ace2SJie Deng  * or configurations are present in the device.
485*65e0ace2SJie Deng  */
486*65e0ace2SJie Deng struct xlgmac_hw_features {
487*65e0ace2SJie Deng 	/* HW Version */
488*65e0ace2SJie Deng 	unsigned int version;
489*65e0ace2SJie Deng 
490*65e0ace2SJie Deng 	/* HW Feature Register0 */
491*65e0ace2SJie Deng 	unsigned int phyifsel;		/* PHY interface support */
492*65e0ace2SJie Deng 	unsigned int vlhash;		/* VLAN Hash Filter */
493*65e0ace2SJie Deng 	unsigned int sma;		/* SMA(MDIO) Interface */
494*65e0ace2SJie Deng 	unsigned int rwk;		/* PMT remote wake-up packet */
495*65e0ace2SJie Deng 	unsigned int mgk;		/* PMT magic packet */
496*65e0ace2SJie Deng 	unsigned int mmc;		/* RMON module */
497*65e0ace2SJie Deng 	unsigned int aoe;		/* ARP Offload */
498*65e0ace2SJie Deng 	unsigned int ts;		/* IEEE 1588-2008 Advanced Timestamp */
499*65e0ace2SJie Deng 	unsigned int eee;		/* Energy Efficient Ethernet */
500*65e0ace2SJie Deng 	unsigned int tx_coe;		/* Tx Checksum Offload */
501*65e0ace2SJie Deng 	unsigned int rx_coe;		/* Rx Checksum Offload */
502*65e0ace2SJie Deng 	unsigned int addn_mac;		/* Additional MAC Addresses */
503*65e0ace2SJie Deng 	unsigned int ts_src;		/* Timestamp Source */
504*65e0ace2SJie Deng 	unsigned int sa_vlan_ins;	/* Source Address or VLAN Insertion */
505*65e0ace2SJie Deng 
506*65e0ace2SJie Deng 	/* HW Feature Register1 */
507*65e0ace2SJie Deng 	unsigned int rx_fifo_size;	/* MTL Receive FIFO Size */
508*65e0ace2SJie Deng 	unsigned int tx_fifo_size;	/* MTL Transmit FIFO Size */
509*65e0ace2SJie Deng 	unsigned int adv_ts_hi;		/* Advance Timestamping High Word */
510*65e0ace2SJie Deng 	unsigned int dma_width;		/* DMA width */
511*65e0ace2SJie Deng 	unsigned int dcb;		/* DCB Feature */
512*65e0ace2SJie Deng 	unsigned int sph;		/* Split Header Feature */
513*65e0ace2SJie Deng 	unsigned int tso;		/* TCP Segmentation Offload */
514*65e0ace2SJie Deng 	unsigned int dma_debug;		/* DMA Debug Registers */
515*65e0ace2SJie Deng 	unsigned int rss;		/* Receive Side Scaling */
516*65e0ace2SJie Deng 	unsigned int tc_cnt;		/* Number of Traffic Classes */
517*65e0ace2SJie Deng 	unsigned int hash_table_size;	/* Hash Table Size */
518*65e0ace2SJie Deng 	unsigned int l3l4_filter_num;	/* Number of L3-L4 Filters */
519*65e0ace2SJie Deng 
520*65e0ace2SJie Deng 	/* HW Feature Register2 */
521*65e0ace2SJie Deng 	unsigned int rx_q_cnt;		/* Number of MTL Receive Queues */
522*65e0ace2SJie Deng 	unsigned int tx_q_cnt;		/* Number of MTL Transmit Queues */
523*65e0ace2SJie Deng 	unsigned int rx_ch_cnt;		/* Number of DMA Receive Channels */
524*65e0ace2SJie Deng 	unsigned int tx_ch_cnt;		/* Number of DMA Transmit Channels */
525*65e0ace2SJie Deng 	unsigned int pps_out_num;	/* Number of PPS outputs */
526*65e0ace2SJie Deng 	unsigned int aux_snap_num;	/* Number of Aux snapshot inputs */
527*65e0ace2SJie Deng };
528*65e0ace2SJie Deng 
529*65e0ace2SJie Deng struct xlgmac_resources {
530*65e0ace2SJie Deng 	void __iomem *addr;
531*65e0ace2SJie Deng 	int irq;
532*65e0ace2SJie Deng };
533*65e0ace2SJie Deng 
534*65e0ace2SJie Deng struct xlgmac_pdata {
535*65e0ace2SJie Deng 	struct net_device *netdev;
536*65e0ace2SJie Deng 	struct device *dev;
537*65e0ace2SJie Deng 
538*65e0ace2SJie Deng 	struct xlgmac_hw_ops hw_ops;
539*65e0ace2SJie Deng 	struct xlgmac_desc_ops desc_ops;
540*65e0ace2SJie Deng 
541*65e0ace2SJie Deng 	/* Device statistics */
542*65e0ace2SJie Deng 	struct xlgmac_stats stats;
543*65e0ace2SJie Deng 
544*65e0ace2SJie Deng 	u32 msg_enable;
545*65e0ace2SJie Deng 
546*65e0ace2SJie Deng 	/* MAC registers base */
547*65e0ace2SJie Deng 	void __iomem *mac_regs;
548*65e0ace2SJie Deng 
549*65e0ace2SJie Deng 	/* Hardware features of the device */
550*65e0ace2SJie Deng 	struct xlgmac_hw_features hw_feat;
551*65e0ace2SJie Deng 
552*65e0ace2SJie Deng 	struct work_struct restart_work;
553*65e0ace2SJie Deng 
554*65e0ace2SJie Deng 	/* Rings for Tx/Rx on a DMA channel */
555*65e0ace2SJie Deng 	struct xlgmac_channel *channel_head;
556*65e0ace2SJie Deng 	unsigned int channel_count;
557*65e0ace2SJie Deng 	unsigned int tx_ring_count;
558*65e0ace2SJie Deng 	unsigned int rx_ring_count;
559*65e0ace2SJie Deng 	unsigned int tx_desc_count;
560*65e0ace2SJie Deng 	unsigned int rx_desc_count;
561*65e0ace2SJie Deng 	unsigned int tx_q_count;
562*65e0ace2SJie Deng 	unsigned int rx_q_count;
563*65e0ace2SJie Deng 
564*65e0ace2SJie Deng 	/* Tx/Rx common settings */
565*65e0ace2SJie Deng 	unsigned int pblx8;
566*65e0ace2SJie Deng 
567*65e0ace2SJie Deng 	/* Tx settings */
568*65e0ace2SJie Deng 	unsigned int tx_sf_mode;
569*65e0ace2SJie Deng 	unsigned int tx_threshold;
570*65e0ace2SJie Deng 	unsigned int tx_pbl;
571*65e0ace2SJie Deng 	unsigned int tx_osp_mode;
572*65e0ace2SJie Deng 
573*65e0ace2SJie Deng 	/* Rx settings */
574*65e0ace2SJie Deng 	unsigned int rx_sf_mode;
575*65e0ace2SJie Deng 	unsigned int rx_threshold;
576*65e0ace2SJie Deng 	unsigned int rx_pbl;
577*65e0ace2SJie Deng 
578*65e0ace2SJie Deng 	/* Tx coalescing settings */
579*65e0ace2SJie Deng 	unsigned int tx_usecs;
580*65e0ace2SJie Deng 	unsigned int tx_frames;
581*65e0ace2SJie Deng 
582*65e0ace2SJie Deng 	/* Rx coalescing settings */
583*65e0ace2SJie Deng 	unsigned int rx_riwt;
584*65e0ace2SJie Deng 	unsigned int rx_usecs;
585*65e0ace2SJie Deng 	unsigned int rx_frames;
586*65e0ace2SJie Deng 
587*65e0ace2SJie Deng 	/* Current Rx buffer size */
588*65e0ace2SJie Deng 	unsigned int rx_buf_size;
589*65e0ace2SJie Deng 
590*65e0ace2SJie Deng 	/* Flow control settings */
591*65e0ace2SJie Deng 	unsigned int tx_pause;
592*65e0ace2SJie Deng 	unsigned int rx_pause;
593*65e0ace2SJie Deng 
594*65e0ace2SJie Deng 	/* Device interrupt number */
595*65e0ace2SJie Deng 	int dev_irq;
596*65e0ace2SJie Deng 	unsigned int per_channel_irq;
597*65e0ace2SJie Deng 	int channel_irq[XLGMAC_MAX_DMA_CHANNELS];
598*65e0ace2SJie Deng 
599*65e0ace2SJie Deng 	/* Netdev related settings */
600*65e0ace2SJie Deng 	unsigned char mac_addr[ETH_ALEN];
601*65e0ace2SJie Deng 	netdev_features_t netdev_features;
602*65e0ace2SJie Deng 	struct napi_struct napi;
603*65e0ace2SJie Deng 
604*65e0ace2SJie Deng 	/* Filtering support */
605*65e0ace2SJie Deng 	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
606*65e0ace2SJie Deng 
607*65e0ace2SJie Deng 	/* Device clocks */
608*65e0ace2SJie Deng 	unsigned long sysclk_rate;
609*65e0ace2SJie Deng 
610*65e0ace2SJie Deng 	/* RSS addressing mutex */
611*65e0ace2SJie Deng 	struct mutex rss_mutex;
612*65e0ace2SJie Deng 
613*65e0ace2SJie Deng 	/* Receive Side Scaling settings */
614*65e0ace2SJie Deng 	u8 rss_key[XLGMAC_RSS_HASH_KEY_SIZE];
615*65e0ace2SJie Deng 	u32 rss_table[XLGMAC_RSS_MAX_TABLE_SIZE];
616*65e0ace2SJie Deng 	u32 rss_options;
617*65e0ace2SJie Deng 
618*65e0ace2SJie Deng 	int phy_speed;
619*65e0ace2SJie Deng 
620*65e0ace2SJie Deng 	char drv_name[32];
621*65e0ace2SJie Deng 	char drv_ver[32];
622*65e0ace2SJie Deng };
623*65e0ace2SJie Deng 
624*65e0ace2SJie Deng void xlgmac_init_desc_ops(struct xlgmac_desc_ops *desc_ops);
625*65e0ace2SJie Deng void xlgmac_init_hw_ops(struct xlgmac_hw_ops *hw_ops);
626*65e0ace2SJie Deng const struct net_device_ops *xlgmac_get_netdev_ops(void);
627*65e0ace2SJie Deng void xlgmac_dump_tx_desc(struct xlgmac_pdata *pdata,
628*65e0ace2SJie Deng 			 struct xlgmac_ring *ring,
629*65e0ace2SJie Deng 			 unsigned int idx,
630*65e0ace2SJie Deng 			 unsigned int count,
631*65e0ace2SJie Deng 			 unsigned int flag);
632*65e0ace2SJie Deng void xlgmac_dump_rx_desc(struct xlgmac_pdata *pdata,
633*65e0ace2SJie Deng 			 struct xlgmac_ring *ring,
634*65e0ace2SJie Deng 			 unsigned int idx);
635*65e0ace2SJie Deng void xlgmac_print_pkt(struct net_device *netdev,
636*65e0ace2SJie Deng 		      struct sk_buff *skb, bool tx_rx);
637*65e0ace2SJie Deng void xlgmac_get_all_hw_features(struct xlgmac_pdata *pdata);
638*65e0ace2SJie Deng void xlgmac_print_all_hw_features(struct xlgmac_pdata *pdata);
639*65e0ace2SJie Deng int xlgmac_drv_probe(struct device *dev,
640*65e0ace2SJie Deng 		     struct xlgmac_resources *res);
641*65e0ace2SJie Deng int xlgmac_drv_remove(struct device *dev);
642*65e0ace2SJie Deng 
643*65e0ace2SJie Deng /* For debug prints */
644*65e0ace2SJie Deng #ifdef XLGMAC_DEBUG
645*65e0ace2SJie Deng #define XLGMAC_PR(fmt, args...) \
646*65e0ace2SJie Deng 	pr_alert("[%s,%d]:" fmt, __func__, __LINE__, ## args)
647*65e0ace2SJie Deng #else
648*65e0ace2SJie Deng #define XLGMAC_PR(x...)		do { } while (0)
649*65e0ace2SJie Deng #endif
650*65e0ace2SJie Deng 
651*65e0ace2SJie Deng #endif /* __DWC_XLGMAC_H__ */
652