xref: /linux/drivers/net/ethernet/freescale/ucc_geth.h (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2ce973b14SLi Yang /*
3047584ceSHaiying Wang  * Copyright (C) Freescale Semicondutor, Inc. 2006-2009. All rights reserved.
4ce973b14SLi Yang  *
5ce973b14SLi Yang  * Author: Shlomi Gridish <gridish@freescale.com>
6ce973b14SLi Yang  *
7ce973b14SLi Yang  * Description:
8ce973b14SLi Yang  * Internal header file for UCC Gigabit Ethernet unit routines.
9ce973b14SLi Yang  *
10ce973b14SLi Yang  * Changelog:
11ce973b14SLi Yang  * Jun 28, 2006 Li Yang <LeoLi@freescale.com>
12ce973b14SLi Yang  * - Rearrange code and style fixes
13ce973b14SLi Yang  */
14ce973b14SLi Yang #ifndef __UCC_GETH_H__
15ce973b14SLi Yang #define __UCC_GETH_H__
16ce973b14SLi Yang 
17ce973b14SLi Yang #include <linux/kernel.h>
18ce973b14SLi Yang #include <linux/list.h>
19*53036aa8SMaxime Chevallier #include <linux/phylink.h>
20b721e253SJoe Perches #include <linux/if_ether.h>
21ce973b14SLi Yang 
227aa1aa6eSZhao Qiang #include <soc/fsl/qe/immap_qe.h>
237aa1aa6eSZhao Qiang #include <soc/fsl/qe/qe.h>
24ce973b14SLi Yang 
257aa1aa6eSZhao Qiang #include <soc/fsl/qe/ucc.h>
267aa1aa6eSZhao Qiang #include <soc/fsl/qe/ucc_fast.h>
27ce973b14SLi Yang 
28ac421852SLi Yang #define DRV_DESC "QE UCC Gigabit Ethernet Controller"
29ac421852SLi Yang #define DRV_NAME "ucc_geth"
30ac421852SLi Yang 
31ce973b14SLi Yang #define NUM_TX_QUEUES                   8
32ce973b14SLi Yang #define NUM_RX_QUEUES                   8
33ce973b14SLi Yang #define NUM_BDS_IN_PREFETCHED_BDS       4
34ce973b14SLi Yang #define TX_IP_OFFSET_ENTRY_MAX          8
35ce973b14SLi Yang #define NUM_OF_PADDRS                   4
36ce973b14SLi Yang #define ENET_INIT_PARAM_MAX_ENTRIES_RX  9
37ce973b14SLi Yang #define ENET_INIT_PARAM_MAX_ENTRIES_TX  8
38ce973b14SLi Yang 
3918a8e864SLi Yang struct ucc_geth {
4018a8e864SLi Yang 	struct ucc_fast uccf;
416b0b594bSTimur Tabi 	u8 res0[0x100 - sizeof(struct ucc_fast)];
42ce973b14SLi Yang 
43ce973b14SLi Yang 	u32 maccfg1;		/* mac configuration reg. 1 */
44ce973b14SLi Yang 	u32 maccfg2;		/* mac configuration reg. 2 */
45ce973b14SLi Yang 	u32 ipgifg;		/* interframe gap reg.  */
46ce973b14SLi Yang 	u32 hafdup;		/* half-duplex reg.  */
47ce973b14SLi Yang 	u8 res1[0x10];
48728de4c9SKim Phillips 	u8 miimng[0x18];	/* MII management structure moved to _mii.h */
49ce973b14SLi Yang 	u32 ifctl;		/* interface control reg */
50ce973b14SLi Yang 	u32 ifstat;		/* interface statux reg */
51ce973b14SLi Yang 	u32 macstnaddr1;	/* mac station address part 1 reg */
52ce973b14SLi Yang 	u32 macstnaddr2;	/* mac station address part 2 reg */
53ce973b14SLi Yang 	u8 res2[0x8];
54ce973b14SLi Yang 	u32 uempr;		/* UCC Ethernet Mac parameter reg */
55ce973b14SLi Yang 	u32 utbipar;		/* UCC tbi address reg */
56ce973b14SLi Yang 	u16 uescr;		/* UCC Ethernet statistics control reg */
57ce973b14SLi Yang 	u8 res3[0x180 - 0x15A];
58ce973b14SLi Yang 	u32 tx64;		/* Total number of frames (including bad
59ce973b14SLi Yang 				   frames) transmitted that were exactly of the
60ce973b14SLi Yang 				   minimal length (64 for un tagged, 68 for
61ce973b14SLi Yang 				   tagged, or with length exactly equal to the
62ce973b14SLi Yang 				   parameter MINLength */
63ce973b14SLi Yang 	u32 tx127;		/* Total number of frames (including bad
64ce973b14SLi Yang 				   frames) transmitted that were between
65ce973b14SLi Yang 				   MINLength (Including FCS length==4) and 127
66ce973b14SLi Yang 				   octets */
67ce973b14SLi Yang 	u32 tx255;		/* Total number of frames (including bad
68ce973b14SLi Yang 				   frames) transmitted that were between 128
69ce973b14SLi Yang 				   (Including FCS length==4) and 255 octets */
70ce973b14SLi Yang 	u32 rx64;		/* Total number of frames received including
71ce973b14SLi Yang 				   bad frames that were exactly of the mninimal
72ce973b14SLi Yang 				   length (64 bytes) */
73ce973b14SLi Yang 	u32 rx127;		/* Total number of frames (including bad
74ce973b14SLi Yang 				   frames) received that were between MINLength
75ce973b14SLi Yang 				   (Including FCS length==4) and 127 octets */
76ce973b14SLi Yang 	u32 rx255;		/* Total number of frames (including bad
77ce973b14SLi Yang 				   frames) received that were between 128
78ce973b14SLi Yang 				   (Including FCS length==4) and 255 octets */
79ce973b14SLi Yang 	u32 txok;		/* Total number of octets residing in frames
8025985edcSLucas De Marchi 				   that where involved in successful
81ce973b14SLi Yang 				   transmission */
82ce973b14SLi Yang 	u16 txcf;		/* Total number of PAUSE control frames
83ce973b14SLi Yang 				   transmitted by this MAC */
84ce973b14SLi Yang 	u8 res4[0x2];
85ce973b14SLi Yang 	u32 tmca;		/* Total number of frames that were transmitted
86af901ca1SAndré Goddard Rosa 				   successfully with the group address bit set
87ce973b14SLi Yang 				   that are not broadcast frames */
88ce973b14SLi Yang 	u32 tbca;		/* Total number of frames transmitted
89af901ca1SAndré Goddard Rosa 				   successfully that had destination address
90ce973b14SLi Yang 				   field equal to the broadcast address */
91ce973b14SLi Yang 	u32 rxfok;		/* Total number of frames received OK */
92ce973b14SLi Yang 	u32 rxbok;		/* Total number of octets received OK */
93ce973b14SLi Yang 	u32 rbyt;		/* Total number of octets received including
94ce973b14SLi Yang 				   octets in bad frames. Must be implemented in
95ce973b14SLi Yang 				   HW because it includes octets in frames that
96ce973b14SLi Yang 				   never even reach the UCC */
97ce973b14SLi Yang 	u32 rmca;		/* Total number of frames that were received
98af901ca1SAndré Goddard Rosa 				   successfully with the group address bit set
99ce973b14SLi Yang 				   that are not broadcast frames */
100af901ca1SAndré Goddard Rosa 	u32 rbca;		/* Total number of frames received successfully
101ce973b14SLi Yang 				   that had destination address equal to the
102ce973b14SLi Yang 				   broadcast address */
103ce973b14SLi Yang 	u32 scar;		/* Statistics carry register */
104ce973b14SLi Yang 	u32 scam;		/* Statistics caryy mask register */
105ce973b14SLi Yang 	u8 res5[0x200 - 0x1c4];
106ba2d3587SEric Dumazet } __packed;
107ce973b14SLi Yang 
108ce973b14SLi Yang /* UCC GETH TEMODR Register */
109ce973b14SLi Yang #define TEMODER_TX_RMON_STATISTICS_ENABLE       0x0100	/* enable Tx statistics
110ce973b14SLi Yang 							 */
111ce973b14SLi Yang #define TEMODER_SCHEDULER_ENABLE                0x2000	/* enable scheduler */
112ce973b14SLi Yang #define TEMODER_IP_CHECKSUM_GENERATE            0x0400	/* generate IPv4
113ce973b14SLi Yang 							   checksums */
114ce973b14SLi Yang #define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1  0x0200	/* enable performance
115ce973b14SLi Yang 							   optimization
116ce973b14SLi Yang 							   enhancement (mode1) */
117ce973b14SLi Yang #define TEMODER_RMON_STATISTICS                 0x0100	/* enable tx statistics
118ce973b14SLi Yang 							 */
119ce973b14SLi Yang #define TEMODER_NUM_OF_QUEUES_SHIFT             (15-15)	/* Number of queues <<
120ce973b14SLi Yang 							   shift */
121ce973b14SLi Yang 
122ce973b14SLi Yang /* UCC GETH TEMODR Register */
123ce973b14SLi Yang #define REMODER_RX_RMON_STATISTICS_ENABLE       0x00001000	/* enable Rx
124ce973b14SLi Yang 								   statistics */
125ce973b14SLi Yang #define REMODER_RX_EXTENDED_FEATURES            0x80000000	/* enable
126ce973b14SLi Yang 								   extended
127ce973b14SLi Yang 								   features */
128ce973b14SLi Yang #define REMODER_VLAN_OPERATION_TAGGED_SHIFT     (31-9 )	/* vlan operation
129ce973b14SLi Yang 							   tagged << shift */
130ce973b14SLi Yang #define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT (31-10)	/* vlan operation non
131ce973b14SLi Yang 							   tagged << shift */
132ce973b14SLi Yang #define REMODER_RX_QOS_MODE_SHIFT               (31-15)	/* rx QoS mode << shift
133ce973b14SLi Yang 							 */
134ce973b14SLi Yang #define REMODER_RMON_STATISTICS                 0x00001000	/* enable rx
135ce973b14SLi Yang 								   statistics */
136ce973b14SLi Yang #define REMODER_RX_EXTENDED_FILTERING           0x00000800	/* extended
137ce973b14SLi Yang 								   filtering
138ce973b14SLi Yang 								   vs.
139ce973b14SLi Yang 								   mpc82xx-like
140ce973b14SLi Yang 								   filtering */
141ce973b14SLi Yang #define REMODER_NUM_OF_QUEUES_SHIFT             (31-23)	/* Number of queues <<
142ce973b14SLi Yang 							   shift */
143ce973b14SLi Yang #define REMODER_DYNAMIC_MAX_FRAME_LENGTH        0x00000008	/* enable
144ce973b14SLi Yang 								   dynamic max
145ce973b14SLi Yang 								   frame length
146ce973b14SLi Yang 								 */
147ce973b14SLi Yang #define REMODER_DYNAMIC_MIN_FRAME_LENGTH        0x00000004	/* enable
148ce973b14SLi Yang 								   dynamic min
149ce973b14SLi Yang 								   frame length
150ce973b14SLi Yang 								 */
151ce973b14SLi Yang #define REMODER_IP_CHECKSUM_CHECK               0x00000002	/* check IPv4
152ce973b14SLi Yang 								   checksums */
153ce973b14SLi Yang #define REMODER_IP_ADDRESS_ALIGNMENT            0x00000001	/* align ip
154ce973b14SLi Yang 								   address to
155ce973b14SLi Yang 								   4-byte
156ce973b14SLi Yang 								   boundary */
157ce973b14SLi Yang 
158ce973b14SLi Yang /* UCC GETH Event Register */
1593bc53427STimur Tabi #define UCCE_TXB   (UCC_GETH_UCCE_TXB7 | UCC_GETH_UCCE_TXB6 | \
1603bc53427STimur Tabi 		    UCC_GETH_UCCE_TXB5 | UCC_GETH_UCCE_TXB4 | \
1613bc53427STimur Tabi 		    UCC_GETH_UCCE_TXB3 | UCC_GETH_UCCE_TXB2 | \
1623bc53427STimur Tabi 		    UCC_GETH_UCCE_TXB1 | UCC_GETH_UCCE_TXB0)
163ce973b14SLi Yang 
1643bc53427STimur Tabi #define UCCE_RXB   (UCC_GETH_UCCE_RXB7 | UCC_GETH_UCCE_RXB6 | \
1653bc53427STimur Tabi 		    UCC_GETH_UCCE_RXB5 | UCC_GETH_UCCE_RXB4 | \
1663bc53427STimur Tabi 		    UCC_GETH_UCCE_RXB3 | UCC_GETH_UCCE_RXB2 | \
1673bc53427STimur Tabi 		    UCC_GETH_UCCE_RXB1 | UCC_GETH_UCCE_RXB0)
168ce973b14SLi Yang 
1693bc53427STimur Tabi #define UCCE_RXF   (UCC_GETH_UCCE_RXF7 | UCC_GETH_UCCE_RXF6 | \
1703bc53427STimur Tabi 		    UCC_GETH_UCCE_RXF5 | UCC_GETH_UCCE_RXF4 | \
1713bc53427STimur Tabi 		    UCC_GETH_UCCE_RXF3 | UCC_GETH_UCCE_RXF2 | \
1723bc53427STimur Tabi 		    UCC_GETH_UCCE_RXF1 | UCC_GETH_UCCE_RXF0)
173ce973b14SLi Yang 
1743bc53427STimur Tabi #define UCCE_OTHER (UCC_GETH_UCCE_SCAR | UCC_GETH_UCCE_GRA | \
1753bc53427STimur Tabi 		    UCC_GETH_UCCE_CBPR | UCC_GETH_UCCE_BSY | \
1763bc53427STimur Tabi 		    UCC_GETH_UCCE_RXC  | UCC_GETH_UCCE_TXC | UCC_GETH_UCCE_TXE)
177702ff12cSMichael Reiss 
1783bc53427STimur Tabi #define UCCE_RX_EVENTS  (UCCE_RXF | UCC_GETH_UCCE_BSY)
1793bc53427STimur Tabi #define UCCE_TX_EVENTS	(UCCE_TXB | UCC_GETH_UCCE_TXE)
180ce973b14SLi Yang 
1811577ecefSAndy Fleming /* TBI defines */
1821577ecefSAndy Fleming #define	ENET_TBI_MII_CR		0x00	/* Control */
1831577ecefSAndy Fleming #define	ENET_TBI_MII_SR		0x01	/* Status */
1841577ecefSAndy Fleming #define	ENET_TBI_MII_ANA	0x04	/* AN advertisement */
1851577ecefSAndy Fleming #define	ENET_TBI_MII_ANLPBPA	0x05	/* AN link partner base page ability */
1861577ecefSAndy Fleming #define	ENET_TBI_MII_ANEX	0x06	/* AN expansion */
1871577ecefSAndy Fleming #define	ENET_TBI_MII_ANNPT	0x07	/* AN next page transmit */
1881577ecefSAndy Fleming #define	ENET_TBI_MII_ANLPANP	0x08	/* AN link partner ability next page */
1891577ecefSAndy Fleming #define	ENET_TBI_MII_EXST	0x0F	/* Extended status */
1901577ecefSAndy Fleming #define	ENET_TBI_MII_JD		0x10	/* Jitter diagnostics */
1911577ecefSAndy Fleming #define	ENET_TBI_MII_TBICON	0x11	/* TBI control */
1921577ecefSAndy Fleming 
193047584ceSHaiying Wang /* TBI MDIO register bit fields*/
194047584ceSHaiying Wang #define TBISR_LSTATUS          0x0004
195047584ceSHaiying Wang #define TBICON_CLK_SELECT       0x0020
196047584ceSHaiying Wang #define TBIANA_ASYMMETRIC_PAUSE 0x0100
197047584ceSHaiying Wang #define TBIANA_SYMMETRIC_PAUSE  0x0080
198047584ceSHaiying Wang #define TBIANA_HALF_DUPLEX      0x0040
199047584ceSHaiying Wang #define TBIANA_FULL_DUPLEX      0x0020
200047584ceSHaiying Wang #define TBICR_PHY_RESET         0x8000
201047584ceSHaiying Wang #define TBICR_ANEG_ENABLE       0x1000
202047584ceSHaiying Wang #define TBICR_RESTART_ANEG      0x0200
203047584ceSHaiying Wang #define TBICR_FULL_DUPLEX       0x0100
204047584ceSHaiying Wang #define TBICR_SPEED1_SET        0x0040
205047584ceSHaiying Wang 
206047584ceSHaiying Wang #define TBIANA_SETTINGS ( \
207047584ceSHaiying Wang 		TBIANA_ASYMMETRIC_PAUSE \
208047584ceSHaiying Wang 		| TBIANA_SYMMETRIC_PAUSE \
209047584ceSHaiying Wang 		| TBIANA_FULL_DUPLEX \
210047584ceSHaiying Wang 		)
211047584ceSHaiying Wang #define TBICR_SETTINGS ( \
212047584ceSHaiying Wang 		TBICR_PHY_RESET \
213047584ceSHaiying Wang 		| TBICR_ANEG_ENABLE \
214047584ceSHaiying Wang 		| TBICR_FULL_DUPLEX \
215047584ceSHaiying Wang 		| TBICR_SPEED1_SET \
216047584ceSHaiying Wang 		)
217047584ceSHaiying Wang 
218ce973b14SLi Yang /* UCC GETH MACCFG1 (MAC Configuration 1 Register) */
219ce973b14SLi Yang #define MACCFG1_FLOW_RX                         0x00000020	/* Flow Control
220ce973b14SLi Yang 								   Rx */
221ce973b14SLi Yang #define MACCFG1_FLOW_TX                         0x00000010	/* Flow Control
222ce973b14SLi Yang 								   Tx */
223ce973b14SLi Yang #define MACCFG1_ENABLE_SYNCHED_RX               0x00000008	/* Rx Enable
224ce973b14SLi Yang 								   synchronized
225ce973b14SLi Yang 								   to Rx stream
226ce973b14SLi Yang 								 */
227ce973b14SLi Yang #define MACCFG1_ENABLE_RX                       0x00000004	/* Enable Rx */
228ce973b14SLi Yang #define MACCFG1_ENABLE_SYNCHED_TX               0x00000002	/* Tx Enable
229ce973b14SLi Yang 								   synchronized
230ce973b14SLi Yang 								   to Tx stream
231ce973b14SLi Yang 								 */
232ce973b14SLi Yang #define MACCFG1_ENABLE_TX                       0x00000001	/* Enable Tx */
233ce973b14SLi Yang 
234ce973b14SLi Yang /* UCC GETH MACCFG2 (MAC Configuration 2 Register) */
235ce973b14SLi Yang #define MACCFG2_PREL_SHIFT                      (31 - 19)	/* Preamble
236ce973b14SLi Yang 								   Length <<
237ce973b14SLi Yang 								   shift */
238ce973b14SLi Yang #define MACCFG2_PREL_MASK                       0x0000f000	/* Preamble
239ce973b14SLi Yang 								   Length mask */
240ce973b14SLi Yang #define MACCFG2_SRP                             0x00000080	/* Soft Receive
241ce973b14SLi Yang 								   Preamble */
242ce973b14SLi Yang #define MACCFG2_STP                             0x00000040	/* Soft
243ce973b14SLi Yang 								   Transmit
244ce973b14SLi Yang 								   Preamble */
245ce973b14SLi Yang #define MACCFG2_RESERVED_1                      0x00000020	/* Reserved -
246ce973b14SLi Yang 								   must be set
247ce973b14SLi Yang 								   to 1 */
248ce973b14SLi Yang #define MACCFG2_LC                              0x00000010	/* Length Check
249ce973b14SLi Yang 								 */
250ce973b14SLi Yang #define MACCFG2_MPE                             0x00000008	/* Magic packet
251ce973b14SLi Yang 								   detect */
252ce973b14SLi Yang #define MACCFG2_FDX                             0x00000001	/* Full Duplex */
253ce973b14SLi Yang #define MACCFG2_FDX_MASK                        0x00000001	/* Full Duplex
254ce973b14SLi Yang 								   mask */
255ce973b14SLi Yang #define MACCFG2_PAD_CRC                         0x00000004
256ce973b14SLi Yang #define MACCFG2_CRC_EN                          0x00000002
257ce973b14SLi Yang #define MACCFG2_PAD_AND_CRC_MODE_NONE           0x00000000	/* Neither
258ce973b14SLi Yang 								   Padding
259ce973b14SLi Yang 								   short frames
260ce973b14SLi Yang 								   nor CRC */
261ce973b14SLi Yang #define MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY       0x00000002	/* Append CRC
262ce973b14SLi Yang 								   only */
263ce973b14SLi Yang #define MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC    0x00000004
264ce973b14SLi Yang #define MACCFG2_INTERFACE_MODE_NIBBLE           0x00000100	/* nibble mode
265ce973b14SLi Yang 								   (MII/RMII/RGMII
266ce973b14SLi Yang 								   10/100bps) */
267ce973b14SLi Yang #define MACCFG2_INTERFACE_MODE_BYTE             0x00000200	/* byte mode
268ce973b14SLi Yang 								   (GMII/TBI/RTB/RGMII
269ce973b14SLi Yang 								   1000bps ) */
270ce973b14SLi Yang #define MACCFG2_INTERFACE_MODE_MASK             0x00000300	/* mask
271ce973b14SLi Yang 								   covering all
272ce973b14SLi Yang 								   relevant
273ce973b14SLi Yang 								   bits */
274ce973b14SLi Yang 
275ce973b14SLi Yang /* UCC GETH IPGIFG (Inter-frame Gap / Inter-Frame Gap Register) */
276ce973b14SLi Yang #define IPGIFG_NON_BACK_TO_BACK_IFG_PART1_SHIFT (31 -  7)	/* Non
277ce973b14SLi Yang 								   back-to-back
278ce973b14SLi Yang 								   inter frame
279ce973b14SLi Yang 								   gap part 1.
280ce973b14SLi Yang 								   << shift */
281ce973b14SLi Yang #define IPGIFG_NON_BACK_TO_BACK_IFG_PART2_SHIFT (31 - 15)	/* Non
282ce973b14SLi Yang 								   back-to-back
283ce973b14SLi Yang 								   inter frame
284ce973b14SLi Yang 								   gap part 2.
285ce973b14SLi Yang 								   << shift */
286ce973b14SLi Yang #define IPGIFG_MINIMUM_IFG_ENFORCEMENT_SHIFT    (31 - 23)	/* Mimimum IFG
287ce973b14SLi Yang 								   Enforcement
288ce973b14SLi Yang 								   << shift */
289ce973b14SLi Yang #define IPGIFG_BACK_TO_BACK_IFG_SHIFT           (31 - 31)	/* back-to-back
290ce973b14SLi Yang 								   inter frame
291ce973b14SLi Yang 								   gap << shift
292ce973b14SLi Yang 								 */
293ce973b14SLi Yang #define IPGIFG_NON_BACK_TO_BACK_IFG_PART1_MAX   127	/* Non back-to-back
294ce973b14SLi Yang 							   inter frame gap part
295ce973b14SLi Yang 							   1. max val */
296ce973b14SLi Yang #define IPGIFG_NON_BACK_TO_BACK_IFG_PART2_MAX   127	/* Non back-to-back
297ce973b14SLi Yang 							   inter frame gap part
298ce973b14SLi Yang 							   2. max val */
299ce973b14SLi Yang #define IPGIFG_MINIMUM_IFG_ENFORCEMENT_MAX      255	/* Mimimum IFG
300ce973b14SLi Yang 							   Enforcement max val */
301ce973b14SLi Yang #define IPGIFG_BACK_TO_BACK_IFG_MAX             127	/* back-to-back inter
302ce973b14SLi Yang 							   frame gap max val */
303ce973b14SLi Yang #define IPGIFG_NBTB_CS_IPG_MASK                 0x7F000000
304ce973b14SLi Yang #define IPGIFG_NBTB_IPG_MASK                    0x007F0000
305ce973b14SLi Yang #define IPGIFG_MIN_IFG_MASK                     0x0000FF00
306ce973b14SLi Yang #define IPGIFG_BTB_IPG_MASK                     0x0000007F
307ce973b14SLi Yang 
308ce973b14SLi Yang /* UCC GETH HAFDUP (Half Duplex Register) */
309ce973b14SLi Yang #define HALFDUP_ALT_BEB_TRUNCATION_SHIFT        (31 - 11)	/* Alternate
310ce973b14SLi Yang 								   Binary
311ce973b14SLi Yang 								   Exponential
312ce973b14SLi Yang 								   Backoff
313ce973b14SLi Yang 								   Truncation
314ce973b14SLi Yang 								   << shift */
315ce973b14SLi Yang #define HALFDUP_ALT_BEB_TRUNCATION_MAX          0xf	/* Alternate Binary
316ce973b14SLi Yang 							   Exponential Backoff
317ce973b14SLi Yang 							   Truncation max val */
318ce973b14SLi Yang #define HALFDUP_ALT_BEB                         0x00080000	/* Alternate
319ce973b14SLi Yang 								   Binary
320ce973b14SLi Yang 								   Exponential
321ce973b14SLi Yang 								   Backoff */
322ce973b14SLi Yang #define HALFDUP_BACK_PRESSURE_NO_BACKOFF        0x00040000	/* Back
323ce973b14SLi Yang 								   pressure no
324ce973b14SLi Yang 								   backoff */
325ce973b14SLi Yang #define HALFDUP_NO_BACKOFF                      0x00020000	/* No Backoff */
326ce973b14SLi Yang #define HALFDUP_EXCESSIVE_DEFER                 0x00010000	/* Excessive
327ce973b14SLi Yang 								   Defer */
328ce973b14SLi Yang #define HALFDUP_MAX_RETRANSMISSION_SHIFT        (31 - 19)	/* Maximum
329ce973b14SLi Yang 								   Retransmission
330ce973b14SLi Yang 								   << shift */
331ce973b14SLi Yang #define HALFDUP_MAX_RETRANSMISSION_MAX          0xf	/* Maximum
332ce973b14SLi Yang 							   Retransmission max
333ce973b14SLi Yang 							   val */
334ce973b14SLi Yang #define HALFDUP_COLLISION_WINDOW_SHIFT          (31 - 31)	/* Collision
335ce973b14SLi Yang 								   Window <<
336ce973b14SLi Yang 								   shift */
337ce973b14SLi Yang #define HALFDUP_COLLISION_WINDOW_MAX            0x3f	/* Collision Window max
338ce973b14SLi Yang 							   val */
339ce973b14SLi Yang #define HALFDUP_ALT_BEB_TR_MASK                 0x00F00000
340ce973b14SLi Yang #define HALFDUP_RETRANS_MASK                    0x0000F000
341ce973b14SLi Yang #define HALFDUP_COL_WINDOW_MASK                 0x0000003F
342ce973b14SLi Yang 
343ce973b14SLi Yang /* UCC GETH UCCS (Ethernet Status Register) */
344ce973b14SLi Yang #define UCCS_BPR                                0x02	/* Back pressure (in
345ce973b14SLi Yang 							   half duplex mode) */
346ce973b14SLi Yang #define UCCS_PAU                                0x02	/* Pause state (in full
347ce973b14SLi Yang 							   duplex mode) */
348ce973b14SLi Yang #define UCCS_MPD                                0x01	/* Magic Packet
349ce973b14SLi Yang 							   Detected */
350ce973b14SLi Yang 
351ce973b14SLi Yang /* UCC GETH IFSTAT (Interface Status Register) */
352ce973b14SLi Yang #define IFSTAT_EXCESS_DEFER                     0x00000200	/* Excessive
353ce973b14SLi Yang 								   transmission
354ce973b14SLi Yang 								   defer */
355ce973b14SLi Yang 
356ce973b14SLi Yang /* UCC GETH MACSTNADDR1 (Station Address Part 1 Register) */
357ce973b14SLi Yang #define MACSTNADDR1_OCTET_6_SHIFT               (31 -  7)	/* Station
358ce973b14SLi Yang 								   address 6th
359ce973b14SLi Yang 								   octet <<
360ce973b14SLi Yang 								   shift */
361ce973b14SLi Yang #define MACSTNADDR1_OCTET_5_SHIFT               (31 - 15)	/* Station
362ce973b14SLi Yang 								   address 5th
363ce973b14SLi Yang 								   octet <<
364ce973b14SLi Yang 								   shift */
365ce973b14SLi Yang #define MACSTNADDR1_OCTET_4_SHIFT               (31 - 23)	/* Station
366ce973b14SLi Yang 								   address 4th
367ce973b14SLi Yang 								   octet <<
368ce973b14SLi Yang 								   shift */
369ce973b14SLi Yang #define MACSTNADDR1_OCTET_3_SHIFT               (31 - 31)	/* Station
370ce973b14SLi Yang 								   address 3rd
371ce973b14SLi Yang 								   octet <<
372ce973b14SLi Yang 								   shift */
373ce973b14SLi Yang 
374ce973b14SLi Yang /* UCC GETH MACSTNADDR2 (Station Address Part 2 Register) */
375ce973b14SLi Yang #define MACSTNADDR2_OCTET_2_SHIFT               (31 -  7)	/* Station
376ce973b14SLi Yang 								   address 2nd
377ce973b14SLi Yang 								   octet <<
378ce973b14SLi Yang 								   shift */
379ce973b14SLi Yang #define MACSTNADDR2_OCTET_1_SHIFT               (31 - 15)	/* Station
380ce973b14SLi Yang 								   address 1st
381ce973b14SLi Yang 								   octet <<
382ce973b14SLi Yang 								   shift */
383ce973b14SLi Yang 
384ce973b14SLi Yang /* UCC GETH UEMPR (Ethernet Mac Parameter Register) */
385ce973b14SLi Yang #define UEMPR_PAUSE_TIME_VALUE_SHIFT            (31 - 15)	/* Pause time
386ce973b14SLi Yang 								   value <<
387ce973b14SLi Yang 								   shift */
388ce973b14SLi Yang #define UEMPR_EXTENDED_PAUSE_TIME_VALUE_SHIFT   (31 - 31)	/* Extended
389ce973b14SLi Yang 								   pause time
390ce973b14SLi Yang 								   value <<
391ce973b14SLi Yang 								   shift */
392ce973b14SLi Yang 
393ce973b14SLi Yang /* UCC GETH UTBIPAR (Ten Bit Interface Physical Address Register) */
394ce973b14SLi Yang #define UTBIPAR_PHY_ADDRESS_SHIFT               (31 - 31)	/* Phy address
395ce973b14SLi Yang 								   << shift */
396ce973b14SLi Yang #define UTBIPAR_PHY_ADDRESS_MASK                0x0000001f	/* Phy address
397ce973b14SLi Yang 								   mask */
398ce973b14SLi Yang 
399ce973b14SLi Yang /* UCC GETH UESCR (Ethernet Statistics Control Register) */
400ce973b14SLi Yang #define UESCR_AUTOZ                             0x8000	/* Automatically zero
401ce973b14SLi Yang 							   addressed
402ce973b14SLi Yang 							   statistical counter
403ce973b14SLi Yang 							   values */
404ce973b14SLi Yang #define UESCR_CLRCNT                            0x4000	/* Clear all statistics
405ce973b14SLi Yang 							   counters */
406ce973b14SLi Yang #define UESCR_MAXCOV_SHIFT                      (15 -  7)	/* Max
407ce973b14SLi Yang 								   Coalescing
408ce973b14SLi Yang 								   Value <<
409ce973b14SLi Yang 								   shift */
410ce973b14SLi Yang #define UESCR_SCOV_SHIFT                        (15 - 15)	/* Status
411ce973b14SLi Yang 								   Coalescing
412ce973b14SLi Yang 								   Value <<
413ce973b14SLi Yang 								   shift */
414ce973b14SLi Yang 
415ce973b14SLi Yang /* UCC GETH UDSR (Data Synchronization Register) */
416ce973b14SLi Yang #define UDSR_MAGIC                              0x067E
417ce973b14SLi Yang 
41818a8e864SLi Yang struct ucc_geth_thread_data_tx {
419ce973b14SLi Yang 	u8 res0[104];
420ba2d3587SEric Dumazet } __packed;
421ce973b14SLi Yang 
42218a8e864SLi Yang struct ucc_geth_thread_data_rx {
423ce973b14SLi Yang 	u8 res0[40];
424ba2d3587SEric Dumazet } __packed;
425ce973b14SLi Yang 
426ce973b14SLi Yang /* Send Queue Queue-Descriptor */
42718a8e864SLi Yang struct ucc_geth_send_queue_qd {
428ce973b14SLi Yang 	u32 bd_ring_base;	/* pointer to BD ring base address */
429ce973b14SLi Yang 	u8 res0[0x8];
430ce973b14SLi Yang 	u32 last_bd_completed_address;/* initialize to last entry in BD ring */
431ce973b14SLi Yang 	u8 res1[0x30];
432ba2d3587SEric Dumazet } __packed;
433ce973b14SLi Yang 
43418a8e864SLi Yang struct ucc_geth_send_queue_mem_region {
43518a8e864SLi Yang 	struct ucc_geth_send_queue_qd sqqd[NUM_TX_QUEUES];
436ba2d3587SEric Dumazet } __packed;
437ce973b14SLi Yang 
43818a8e864SLi Yang struct ucc_geth_thread_tx_pram {
439ce973b14SLi Yang 	u8 res0[64];
440ba2d3587SEric Dumazet } __packed;
441ce973b14SLi Yang 
44218a8e864SLi Yang struct ucc_geth_thread_rx_pram {
443ce973b14SLi Yang 	u8 res0[128];
444ba2d3587SEric Dumazet } __packed;
445ce973b14SLi Yang 
446ce973b14SLi Yang #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING        64
447ce973b14SLi Yang #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_8      64
448ce973b14SLi Yang #define THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING_16     96
449ce973b14SLi Yang 
45018a8e864SLi Yang struct ucc_geth_scheduler {
451ce973b14SLi Yang 	u16 cpucount0;		/* CPU packet counter */
452ce973b14SLi Yang 	u16 cpucount1;		/* CPU packet counter */
453ce973b14SLi Yang 	u16 cecount0;		/* QE packet counter */
454ce973b14SLi Yang 	u16 cecount1;		/* QE packet counter */
455ce973b14SLi Yang 	u16 cpucount2;		/* CPU packet counter */
456ce973b14SLi Yang 	u16 cpucount3;		/* CPU packet counter */
457ce973b14SLi Yang 	u16 cecount2;		/* QE packet counter */
458ce973b14SLi Yang 	u16 cecount3;		/* QE packet counter */
459ce973b14SLi Yang 	u16 cpucount4;		/* CPU packet counter */
460ce973b14SLi Yang 	u16 cpucount5;		/* CPU packet counter */
461ce973b14SLi Yang 	u16 cecount4;		/* QE packet counter */
462ce973b14SLi Yang 	u16 cecount5;		/* QE packet counter */
463ce973b14SLi Yang 	u16 cpucount6;		/* CPU packet counter */
464ce973b14SLi Yang 	u16 cpucount7;		/* CPU packet counter */
465ce973b14SLi Yang 	u16 cecount6;		/* QE packet counter */
466ce973b14SLi Yang 	u16 cecount7;		/* QE packet counter */
467ce973b14SLi Yang 	u32 weightstatus[NUM_TX_QUEUES];	/* accumulated weight factor */
468ce973b14SLi Yang 	u32 rtsrshadow;		/* temporary variable handled by QE */
469ce973b14SLi Yang 	u32 time;		/* temporary variable handled by QE */
470ce973b14SLi Yang 	u32 ttl;		/* temporary variable handled by QE */
471ce973b14SLi Yang 	u32 mblinterval;	/* max burst length interval */
472ce973b14SLi Yang 	u16 nortsrbytetime;	/* normalized value of byte time in tsr units */
473ce973b14SLi Yang 	u8 fracsiz;		/* radix 2 log value of denom. of
474ce973b14SLi Yang 				   NorTSRByteTime */
475ce973b14SLi Yang 	u8 res0[1];
476ce973b14SLi Yang 	u8 strictpriorityq;	/* Strict Priority Mask register */
477ce973b14SLi Yang 	u8 txasap;		/* Transmit ASAP register */
478ce973b14SLi Yang 	u8 extrabw;		/* Extra BandWidth register */
479ce973b14SLi Yang 	u8 oldwfqmask;		/* temporary variable handled by QE */
480ce973b14SLi Yang 	u8 weightfactor[NUM_TX_QUEUES];
481ce973b14SLi Yang 				      /**< weight factor for queues   */
482ce973b14SLi Yang 	u32 minw;		/* temporary variable handled by QE */
483ce973b14SLi Yang 	u8 res1[0x70 - 0x64];
484ba2d3587SEric Dumazet } __packed;
485ce973b14SLi Yang 
48618a8e864SLi Yang struct ucc_geth_tx_firmware_statistics_pram {
487ce973b14SLi Yang 	u32 sicoltx;		/* single collision */
488ce973b14SLi Yang 	u32 mulcoltx;		/* multiple collision */
489ce973b14SLi Yang 	u32 latecoltxfr;	/* late collision */
490ce973b14SLi Yang 	u32 frabortduecol;	/* frames aborted due to transmit collision */
491ce973b14SLi Yang 	u32 frlostinmactxer;	/* frames lost due to internal MAC error
492ce973b14SLi Yang 				   transmission that are not counted on any
493ce973b14SLi Yang 				   other counter */
494ce973b14SLi Yang 	u32 carriersenseertx;	/* carrier sense error */
495ce973b14SLi Yang 	u32 frtxok;		/* frames transmitted OK */
496ce973b14SLi Yang 	u32 txfrexcessivedefer;	/* frames with defferal time greater than
497ce973b14SLi Yang 				   specified threshold */
498ce973b14SLi Yang 	u32 txpkts256;		/* total packets (including bad) between 256
499ce973b14SLi Yang 				   and 511 octets */
500ce973b14SLi Yang 	u32 txpkts512;		/* total packets (including bad) between 512
501ce973b14SLi Yang 				   and 1023 octets */
502ce973b14SLi Yang 	u32 txpkts1024;		/* total packets (including bad) between 1024
503ce973b14SLi Yang 				   and 1518 octets */
504ce973b14SLi Yang 	u32 txpktsjumbo;	/* total packets (including bad) between 1024
505ce973b14SLi Yang 				   and MAXLength octets */
506ba2d3587SEric Dumazet } __packed;
507ce973b14SLi Yang 
50818a8e864SLi Yang struct ucc_geth_rx_firmware_statistics_pram {
509ce973b14SLi Yang 	u32 frrxfcser;		/* frames with crc error */
510ce973b14SLi Yang 	u32 fraligner;		/* frames with alignment error */
511ce973b14SLi Yang 	u32 inrangelenrxer;	/* in range length error */
512ce973b14SLi Yang 	u32 outrangelenrxer;	/* out of range length error */
513ce973b14SLi Yang 	u32 frtoolong;		/* frame too long */
514ce973b14SLi Yang 	u32 runt;		/* runt */
515ce973b14SLi Yang 	u32 verylongevent;	/* very long event */
516ce973b14SLi Yang 	u32 symbolerror;	/* symbol error */
517ce973b14SLi Yang 	u32 dropbsy;		/* drop because of BD not ready */
518ce973b14SLi Yang 	u8 res0[0x8];
519ce973b14SLi Yang 	u32 mismatchdrop;	/* drop because of MAC filtering (e.g. address
520ce973b14SLi Yang 				   or type mismatch) */
521ce973b14SLi Yang 	u32 underpkts;		/* total frames less than 64 octets */
522ce973b14SLi Yang 	u32 pkts256;		/* total frames (including bad) between 256 and
523ce973b14SLi Yang 				   511 octets */
524ce973b14SLi Yang 	u32 pkts512;		/* total frames (including bad) between 512 and
525ce973b14SLi Yang 				   1023 octets */
526ce973b14SLi Yang 	u32 pkts1024;		/* total frames (including bad) between 1024
527ce973b14SLi Yang 				   and 1518 octets */
528ce973b14SLi Yang 	u32 pktsjumbo;		/* total frames (including bad) between 1024
529ce973b14SLi Yang 				   and MAXLength octets */
530ce973b14SLi Yang 	u32 frlossinmacer;	/* frames lost because of internal MAC error
531ce973b14SLi Yang 				   that is not counted in any other counter */
532ce973b14SLi Yang 	u32 pausefr;		/* pause frames */
533ce973b14SLi Yang 	u8 res1[0x4];
534ce973b14SLi Yang 	u32 removevlan;		/* total frames that had their VLAN tag removed
535ce973b14SLi Yang 				 */
536ce973b14SLi Yang 	u32 replacevlan;	/* total frames that had their VLAN tag
537ce973b14SLi Yang 				   replaced */
538ce973b14SLi Yang 	u32 insertvlan;		/* total frames that had their VLAN tag
539ce973b14SLi Yang 				   inserted */
540ba2d3587SEric Dumazet } __packed;
541ce973b14SLi Yang 
54218a8e864SLi Yang struct ucc_geth_rx_interrupt_coalescing_entry {
543ce973b14SLi Yang 	u32 interruptcoalescingmaxvalue;	/* interrupt coalescing max
544ce973b14SLi Yang 						   value */
545ce973b14SLi Yang 	u32 interruptcoalescingcounter;	/* interrupt coalescing counter,
546ce973b14SLi Yang 					   initialize to
547ce973b14SLi Yang 					   interruptcoalescingmaxvalue */
548ba2d3587SEric Dumazet } __packed;
549ce973b14SLi Yang 
55018a8e864SLi Yang struct ucc_geth_rx_interrupt_coalescing_table {
55118a8e864SLi Yang 	struct ucc_geth_rx_interrupt_coalescing_entry coalescingentry[NUM_RX_QUEUES];
552ce973b14SLi Yang 				       /**< interrupt coalescing entry */
553ba2d3587SEric Dumazet } __packed;
554ce973b14SLi Yang 
55518a8e864SLi Yang struct ucc_geth_rx_prefetched_bds {
55618a8e864SLi Yang 	struct qe_bd bd[NUM_BDS_IN_PREFETCHED_BDS];	/* prefetched bd */
557ba2d3587SEric Dumazet } __packed;
558ce973b14SLi Yang 
55918a8e864SLi Yang struct ucc_geth_rx_bd_queues_entry {
560ce973b14SLi Yang 	u32 bdbaseptr;		/* BD base pointer */
561ce973b14SLi Yang 	u32 bdptr;		/* BD pointer */
562ce973b14SLi Yang 	u32 externalbdbaseptr;	/* external BD base pointer */
563ce973b14SLi Yang 	u32 externalbdptr;	/* external BD pointer */
564ba2d3587SEric Dumazet } __packed;
565ce973b14SLi Yang 
56618a8e864SLi Yang struct ucc_geth_tx_global_pram {
567ce973b14SLi Yang 	u16 temoder;
568ce973b14SLi Yang 	u8 res0[0x38 - 0x02];
569ce973b14SLi Yang 	u32 sqptr;		/* a base pointer to send queue memory region */
570ce973b14SLi Yang 	u32 schedulerbasepointer;	/* a base pointer to scheduler memory
571ce973b14SLi Yang 					   region */
572ce973b14SLi Yang 	u32 txrmonbaseptr;	/* base pointer to Tx RMON statistics counter */
573ce973b14SLi Yang 	u32 tstate;		/* tx internal state. High byte contains
574ce973b14SLi Yang 				   function code */
575ce973b14SLi Yang 	u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX];
576ce973b14SLi Yang 	u32 vtagtable[0x8];	/* 8 4-byte VLAN tags */
577ce973b14SLi Yang 	u32 tqptr;		/* a base pointer to the Tx Queues Memory
578ce973b14SLi Yang 				   Region */
579887078deSRasmus Villemoes 	u8 res2[0x78 - 0x74];
580887078deSRasmus Villemoes 	u64 snums_en;
581887078deSRasmus Villemoes 	u32 l2l3baseptr;	/* top byte consists of a few other bit fields */
582887078deSRasmus Villemoes 
583887078deSRasmus Villemoes 	u16 mtu[8];
584887078deSRasmus Villemoes 	u8 res3[0xa8 - 0x94];
585887078deSRasmus Villemoes 	u32 wrrtablebase;	/* top byte is reserved */
586887078deSRasmus Villemoes 	u8 res4[0xc0 - 0xac];
587ba2d3587SEric Dumazet } __packed;
588ce973b14SLi Yang 
589ce973b14SLi Yang /* structure representing Extended Filtering Global Parameters in PRAM */
59018a8e864SLi Yang struct ucc_geth_exf_global_pram {
591ce973b14SLi Yang 	u32 l2pcdptr;		/* individual address filter, high */
592ce973b14SLi Yang 	u8 res0[0x10 - 0x04];
593ba2d3587SEric Dumazet } __packed;
594ce973b14SLi Yang 
59518a8e864SLi Yang struct ucc_geth_rx_global_pram {
596ce973b14SLi Yang 	u32 remoder;		/* ethernet mode reg. */
597ce973b14SLi Yang 	u32 rqptr;		/* base pointer to the Rx Queues Memory Region*/
598ce973b14SLi Yang 	u32 res0[0x1];
599ce973b14SLi Yang 	u8 res1[0x20 - 0xC];
600ce973b14SLi Yang 	u16 typeorlen;		/* cutoff point less than which, type/len field
601ce973b14SLi Yang 				   is considered length */
602ce973b14SLi Yang 	u8 res2[0x1];
603ce973b14SLi Yang 	u8 rxgstpack;		/* acknowledgement on GRACEFUL STOP RX command*/
604ce973b14SLi Yang 	u32 rxrmonbaseptr;	/* base pointer to Rx RMON statistics counter */
605ce973b14SLi Yang 	u8 res3[0x30 - 0x28];
606ce973b14SLi Yang 	u32 intcoalescingptr;	/* Interrupt coalescing table pointer */
607ce973b14SLi Yang 	u8 res4[0x36 - 0x34];
608ce973b14SLi Yang 	u8 rstate;		/* rx internal state. High byte contains
609ce973b14SLi Yang 				   function code */
610ce973b14SLi Yang 	u8 res5[0x46 - 0x37];
611ce973b14SLi Yang 	u16 mrblr;		/* max receive buffer length reg. */
612ce973b14SLi Yang 	u32 rbdqptr;		/* base pointer to RxBD parameter table
613ce973b14SLi Yang 				   description */
614ce973b14SLi Yang 	u16 mflr;		/* max frame length reg. */
615ce973b14SLi Yang 	u16 minflr;		/* min frame length reg. */
616ce973b14SLi Yang 	u16 maxd1;		/* max dma1 length reg. */
617ce973b14SLi Yang 	u16 maxd2;		/* max dma2 length reg. */
618ce973b14SLi Yang 	u32 ecamptr;		/* external CAM address */
619ce973b14SLi Yang 	u32 l2qt;		/* VLAN priority mapping table. */
620ce973b14SLi Yang 	u32 l3qt[0x8];		/* IP priority mapping table. */
621ce973b14SLi Yang 	u16 vlantype;		/* vlan type */
622ce973b14SLi Yang 	u16 vlantci;		/* default vlan tci */
623ce973b14SLi Yang 	u8 addressfiltering[64];	/* address filtering data structure */
624ce973b14SLi Yang 	u32 exfGlobalParam;	/* base address for extended filtering global
625ce973b14SLi Yang 				   parameters */
626ce973b14SLi Yang 	u8 res6[0x100 - 0xC4];	/* Initialize to zero */
627ba2d3587SEric Dumazet } __packed;
628ce973b14SLi Yang 
629ce973b14SLi Yang #define GRACEFUL_STOP_ACKNOWLEDGE_RX            0x01
630ce973b14SLi Yang 
631ce973b14SLi Yang /* structure representing InitEnet command */
63218a8e864SLi Yang struct ucc_geth_init_pram {
633ce973b14SLi Yang 	u8 resinit1;
634ce973b14SLi Yang 	u8 resinit2;
635ce973b14SLi Yang 	u8 resinit3;
636ce973b14SLi Yang 	u8 resinit4;
637ce973b14SLi Yang 	u16 resinit5;
638ce973b14SLi Yang 	u8 res1[0x1];
639ce973b14SLi Yang 	u8 largestexternallookupkeysize;
640ce973b14SLi Yang 	u32 rgftgfrxglobal;
641ce973b14SLi Yang 	u32 rxthread[ENET_INIT_PARAM_MAX_ENTRIES_RX];	/* rx threads */
642ce973b14SLi Yang 	u8 res2[0x38 - 0x30];
643ce973b14SLi Yang 	u32 txglobal;		/* tx global */
644ce973b14SLi Yang 	u32 txthread[ENET_INIT_PARAM_MAX_ENTRIES_TX];	/* tx threads */
645ce973b14SLi Yang 	u8 res3[0x1];
646ba2d3587SEric Dumazet } __packed;
647ce973b14SLi Yang 
648ce973b14SLi Yang #define ENET_INIT_PARAM_RGF_SHIFT               (32 - 4)
649ce973b14SLi Yang #define ENET_INIT_PARAM_TGF_SHIFT               (32 - 8)
650ce973b14SLi Yang 
651ce973b14SLi Yang #define ENET_INIT_PARAM_RISC_MASK               0x0000003f
652ce973b14SLi Yang #define ENET_INIT_PARAM_PTR_MASK                0x00ffffc0
653ce973b14SLi Yang #define ENET_INIT_PARAM_SNUM_MASK               0xff000000
654ce973b14SLi Yang #define ENET_INIT_PARAM_SNUM_SHIFT              24
655ce973b14SLi Yang 
656ce973b14SLi Yang #define ENET_INIT_PARAM_MAGIC_RES_INIT1         0x06
657ce973b14SLi Yang #define ENET_INIT_PARAM_MAGIC_RES_INIT2         0x30
658ce973b14SLi Yang #define ENET_INIT_PARAM_MAGIC_RES_INIT3         0xff
659ce973b14SLi Yang #define ENET_INIT_PARAM_MAGIC_RES_INIT4         0x00
660ce973b14SLi Yang #define ENET_INIT_PARAM_MAGIC_RES_INIT5         0x0400
661ce973b14SLi Yang 
662ce973b14SLi Yang /* structure representing 82xx Address Filtering Enet Address in PRAM */
66318a8e864SLi Yang struct ucc_geth_82xx_enet_address {
664ce973b14SLi Yang 	u8 res1[0x2];
665ce973b14SLi Yang 	u16 h;			/* address (MSB) */
666ce973b14SLi Yang 	u16 m;			/* address */
667ce973b14SLi Yang 	u16 l;			/* address (LSB) */
668ba2d3587SEric Dumazet } __packed;
669ce973b14SLi Yang 
670ce973b14SLi Yang /* structure representing 82xx Address Filtering PRAM */
67118a8e864SLi Yang struct ucc_geth_82xx_address_filtering_pram {
672ce973b14SLi Yang 	u32 iaddr_h;		/* individual address filter, high */
673ce973b14SLi Yang 	u32 iaddr_l;		/* individual address filter, low */
674ce973b14SLi Yang 	u32 gaddr_h;		/* group address filter, high */
675ce973b14SLi Yang 	u32 gaddr_l;		/* group address filter, low */
6766fee40e9SAndy Fleming 	struct ucc_geth_82xx_enet_address __iomem taddr;
6776fee40e9SAndy Fleming 	struct ucc_geth_82xx_enet_address __iomem paddr[NUM_OF_PADDRS];
678ce973b14SLi Yang 	u8 res0[0x40 - 0x38];
679ba2d3587SEric Dumazet } __packed;
680ce973b14SLi Yang 
681ce973b14SLi Yang /* GETH Tx firmware statistics structure, used when calling
682ce973b14SLi Yang    UCC_GETH_GetStatistics. */
68318a8e864SLi Yang struct ucc_geth_tx_firmware_statistics {
684ce973b14SLi Yang 	u32 sicoltx;		/* single collision */
685ce973b14SLi Yang 	u32 mulcoltx;		/* multiple collision */
686ce973b14SLi Yang 	u32 latecoltxfr;	/* late collision */
687ce973b14SLi Yang 	u32 frabortduecol;	/* frames aborted due to transmit collision */
688ce973b14SLi Yang 	u32 frlostinmactxer;	/* frames lost due to internal MAC error
689ce973b14SLi Yang 				   transmission that are not counted on any
690ce973b14SLi Yang 				   other counter */
691ce973b14SLi Yang 	u32 carriersenseertx;	/* carrier sense error */
692ce973b14SLi Yang 	u32 frtxok;		/* frames transmitted OK */
693ce973b14SLi Yang 	u32 txfrexcessivedefer;	/* frames with defferal time greater than
694ce973b14SLi Yang 				   specified threshold */
695ce973b14SLi Yang 	u32 txpkts256;		/* total packets (including bad) between 256
696ce973b14SLi Yang 				   and 511 octets */
697ce973b14SLi Yang 	u32 txpkts512;		/* total packets (including bad) between 512
698ce973b14SLi Yang 				   and 1023 octets */
699ce973b14SLi Yang 	u32 txpkts1024;		/* total packets (including bad) between 1024
700ce973b14SLi Yang 				   and 1518 octets */
701ce973b14SLi Yang 	u32 txpktsjumbo;	/* total packets (including bad) between 1024
702ce973b14SLi Yang 				   and MAXLength octets */
703ba2d3587SEric Dumazet } __packed;
704ce973b14SLi Yang 
705ce973b14SLi Yang /* GETH Rx firmware statistics structure, used when calling
706ce973b14SLi Yang    UCC_GETH_GetStatistics. */
70718a8e864SLi Yang struct ucc_geth_rx_firmware_statistics {
708ce973b14SLi Yang 	u32 frrxfcser;		/* frames with crc error */
709ce973b14SLi Yang 	u32 fraligner;		/* frames with alignment error */
710ce973b14SLi Yang 	u32 inrangelenrxer;	/* in range length error */
711ce973b14SLi Yang 	u32 outrangelenrxer;	/* out of range length error */
712ce973b14SLi Yang 	u32 frtoolong;		/* frame too long */
713ce973b14SLi Yang 	u32 runt;		/* runt */
714ce973b14SLi Yang 	u32 verylongevent;	/* very long event */
715ce973b14SLi Yang 	u32 symbolerror;	/* symbol error */
716ce973b14SLi Yang 	u32 dropbsy;		/* drop because of BD not ready */
717ce973b14SLi Yang 	u8 res0[0x8];
718ce973b14SLi Yang 	u32 mismatchdrop;	/* drop because of MAC filtering (e.g. address
719ce973b14SLi Yang 				   or type mismatch) */
720ce973b14SLi Yang 	u32 underpkts;		/* total frames less than 64 octets */
721ce973b14SLi Yang 	u32 pkts256;		/* total frames (including bad) between 256 and
722ce973b14SLi Yang 				   511 octets */
723ce973b14SLi Yang 	u32 pkts512;		/* total frames (including bad) between 512 and
724ce973b14SLi Yang 				   1023 octets */
725ce973b14SLi Yang 	u32 pkts1024;		/* total frames (including bad) between 1024
726ce973b14SLi Yang 				   and 1518 octets */
727ce973b14SLi Yang 	u32 pktsjumbo;		/* total frames (including bad) between 1024
728ce973b14SLi Yang 				   and MAXLength octets */
729ce973b14SLi Yang 	u32 frlossinmacer;	/* frames lost because of internal MAC error
730ce973b14SLi Yang 				   that is not counted in any other counter */
731ce973b14SLi Yang 	u32 pausefr;		/* pause frames */
732ce973b14SLi Yang 	u8 res1[0x4];
733ce973b14SLi Yang 	u32 removevlan;		/* total frames that had their VLAN tag removed
734ce973b14SLi Yang 				 */
735ce973b14SLi Yang 	u32 replacevlan;	/* total frames that had their VLAN tag
736ce973b14SLi Yang 				   replaced */
737ce973b14SLi Yang 	u32 insertvlan;		/* total frames that had their VLAN tag
738ce973b14SLi Yang 				   inserted */
739ba2d3587SEric Dumazet } __packed;
740ce973b14SLi Yang 
741ce973b14SLi Yang /* GETH hardware statistics structure, used when calling
742ce973b14SLi Yang    UCC_GETH_GetStatistics. */
74318a8e864SLi Yang struct ucc_geth_hardware_statistics {
744ce973b14SLi Yang 	u32 tx64;		/* Total number of frames (including bad
745ce973b14SLi Yang 				   frames) transmitted that were exactly of the
746ce973b14SLi Yang 				   minimal length (64 for un tagged, 68 for
747ce973b14SLi Yang 				   tagged, or with length exactly equal to the
748ce973b14SLi Yang 				   parameter MINLength */
749ce973b14SLi Yang 	u32 tx127;		/* Total number of frames (including bad
750ce973b14SLi Yang 				   frames) transmitted that were between
751ce973b14SLi Yang 				   MINLength (Including FCS length==4) and 127
752ce973b14SLi Yang 				   octets */
753ce973b14SLi Yang 	u32 tx255;		/* Total number of frames (including bad
754ce973b14SLi Yang 				   frames) transmitted that were between 128
755ce973b14SLi Yang 				   (Including FCS length==4) and 255 octets */
756ce973b14SLi Yang 	u32 rx64;		/* Total number of frames received including
757ce973b14SLi Yang 				   bad frames that were exactly of the mninimal
758ce973b14SLi Yang 				   length (64 bytes) */
759ce973b14SLi Yang 	u32 rx127;		/* Total number of frames (including bad
760ce973b14SLi Yang 				   frames) received that were between MINLength
761ce973b14SLi Yang 				   (Including FCS length==4) and 127 octets */
762ce973b14SLi Yang 	u32 rx255;		/* Total number of frames (including bad
763ce973b14SLi Yang 				   frames) received that were between 128
764ce973b14SLi Yang 				   (Including FCS length==4) and 255 octets */
765ce973b14SLi Yang 	u32 txok;		/* Total number of octets residing in frames
76625985edcSLucas De Marchi 				   that where involved in successful
767ce973b14SLi Yang 				   transmission */
768ce973b14SLi Yang 	u16 txcf;		/* Total number of PAUSE control frames
769ce973b14SLi Yang 				   transmitted by this MAC */
770ce973b14SLi Yang 	u32 tmca;		/* Total number of frames that were transmitted
771af901ca1SAndré Goddard Rosa 				   successfully with the group address bit set
772ce973b14SLi Yang 				   that are not broadcast frames */
773ce973b14SLi Yang 	u32 tbca;		/* Total number of frames transmitted
774af901ca1SAndré Goddard Rosa 				   successfully that had destination address
775ce973b14SLi Yang 				   field equal to the broadcast address */
776ce973b14SLi Yang 	u32 rxfok;		/* Total number of frames received OK */
777ce973b14SLi Yang 	u32 rxbok;		/* Total number of octets received OK */
778ce973b14SLi Yang 	u32 rbyt;		/* Total number of octets received including
779ce973b14SLi Yang 				   octets in bad frames. Must be implemented in
780ce973b14SLi Yang 				   HW because it includes octets in frames that
781ce973b14SLi Yang 				   never even reach the UCC */
782ce973b14SLi Yang 	u32 rmca;		/* Total number of frames that were received
783af901ca1SAndré Goddard Rosa 				   successfully with the group address bit set
784ce973b14SLi Yang 				   that are not broadcast frames */
785af901ca1SAndré Goddard Rosa 	u32 rbca;		/* Total number of frames received successfully
786ce973b14SLi Yang 				   that had destination address equal to the
787ce973b14SLi Yang 				   broadcast address */
788ba2d3587SEric Dumazet } __packed;
789ce973b14SLi Yang 
790ce973b14SLi Yang /* UCC GETH Tx errors returned via TxConf callback */
791ce973b14SLi Yang #define TX_ERRORS_DEF      0x0200
792ce973b14SLi Yang #define TX_ERRORS_EXDEF    0x0100
793ce973b14SLi Yang #define TX_ERRORS_LC       0x0080
794ce973b14SLi Yang #define TX_ERRORS_RL       0x0040
795ce973b14SLi Yang #define TX_ERRORS_RC_MASK  0x003C
796ce973b14SLi Yang #define TX_ERRORS_RC_SHIFT 2
797ce973b14SLi Yang #define TX_ERRORS_UN       0x0002
798ce973b14SLi Yang #define TX_ERRORS_CSL      0x0001
799ce973b14SLi Yang 
800ce973b14SLi Yang /* UCC GETH Rx errors returned via RxStore callback */
801ce973b14SLi Yang #define RX_ERRORS_CMR      0x0200
802ce973b14SLi Yang #define RX_ERRORS_M        0x0100
803ce973b14SLi Yang #define RX_ERRORS_BC       0x0080
804ce973b14SLi Yang #define RX_ERRORS_MC       0x0040
805ce973b14SLi Yang 
806ce973b14SLi Yang /* Transmit BD. These are in addition to values defined in uccf. */
807ce973b14SLi Yang #define T_VID      0x003c0000	/* insert VLAN id index mask. */
808ce973b14SLi Yang #define T_DEF      (((u32) TX_ERRORS_DEF     ) << 16)
809ce973b14SLi Yang #define T_EXDEF    (((u32) TX_ERRORS_EXDEF   ) << 16)
810ce973b14SLi Yang #define T_LC       (((u32) TX_ERRORS_LC      ) << 16)
811ce973b14SLi Yang #define T_RL       (((u32) TX_ERRORS_RL      ) << 16)
812ce973b14SLi Yang #define T_RC_MASK  (((u32) TX_ERRORS_RC_MASK ) << 16)
813ce973b14SLi Yang #define T_UN       (((u32) TX_ERRORS_UN      ) << 16)
814ce973b14SLi Yang #define T_CSL      (((u32) TX_ERRORS_CSL     ) << 16)
815ce973b14SLi Yang #define T_ERRORS_REPORT  (T_DEF | T_EXDEF | T_LC | T_RL | T_RC_MASK \
816ce973b14SLi Yang 		| T_UN | T_CSL)	/* transmit errors to report */
817ce973b14SLi Yang 
818ce973b14SLi Yang /* Receive BD. These are in addition to values defined in uccf. */
819ce973b14SLi Yang #define R_LG    0x00200000	/* Frame length violation.  */
820ce973b14SLi Yang #define R_NO    0x00100000	/* Non-octet aligned frame.  */
821ce973b14SLi Yang #define R_SH    0x00080000	/* Short frame.  */
822ce973b14SLi Yang #define R_CR    0x00040000	/* CRC error.  */
823ce973b14SLi Yang #define R_OV    0x00020000	/* Overrun.  */
824ce973b14SLi Yang #define R_IPCH  0x00010000	/* IP checksum check failed. */
825ce973b14SLi Yang #define R_CMR   (((u32) RX_ERRORS_CMR  ) << 16)
826ce973b14SLi Yang #define R_M     (((u32) RX_ERRORS_M    ) << 16)
827ce973b14SLi Yang #define R_BC    (((u32) RX_ERRORS_BC   ) << 16)
828ce973b14SLi Yang #define R_MC    (((u32) RX_ERRORS_MC   ) << 16)
829ce973b14SLi Yang #define R_ERRORS_REPORT (R_CMR | R_M | R_BC | R_MC)	/* receive errors to
830ce973b14SLi Yang 							   report */
831ce973b14SLi Yang #define R_ERRORS_FATAL  (R_LG  | R_NO | R_SH | R_CR | \
832ce973b14SLi Yang 		R_OV | R_IPCH)	/* receive errors to discard */
833ce973b14SLi Yang 
834ce973b14SLi Yang /* Alignments */
835ce973b14SLi Yang #define UCC_GETH_RX_GLOBAL_PRAM_ALIGNMENT	256
836ce973b14SLi Yang #define UCC_GETH_TX_GLOBAL_PRAM_ALIGNMENT       128
837ce973b14SLi Yang #define UCC_GETH_THREAD_RX_PRAM_ALIGNMENT       128
838ce973b14SLi Yang #define UCC_GETH_THREAD_TX_PRAM_ALIGNMENT       64
839ce973b14SLi Yang #define UCC_GETH_THREAD_DATA_ALIGNMENT          256	/* spec gives values
840ce973b14SLi Yang 							   based on num of
841ce973b14SLi Yang 							   threads, but always
842ce973b14SLi Yang 							   using the maximum is
843ce973b14SLi Yang 							   easier */
844ce973b14SLi Yang #define UCC_GETH_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT	32
84558933c64SDave Liu #define UCC_GETH_SCHEDULER_ALIGNMENT		8	/* This is a guess */
846ce973b14SLi Yang #define UCC_GETH_TX_STATISTICS_ALIGNMENT	4	/* This is a guess */
847ce973b14SLi Yang #define UCC_GETH_RX_STATISTICS_ALIGNMENT	4	/* This is a guess */
8487563907eSMichael Barkowski #define UCC_GETH_RX_INTERRUPT_COALESCING_ALIGNMENT	64
849ce973b14SLi Yang #define UCC_GETH_RX_BD_QUEUES_ALIGNMENT		8	/* This is a guess */
850ce973b14SLi Yang #define UCC_GETH_RX_PREFETCHED_BDS_ALIGNMENT	128	/* This is a guess */
85158933c64SDave Liu #define UCC_GETH_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT 8	/* This
852ce973b14SLi Yang 									   is a
853ce973b14SLi Yang 									   guess
854ce973b14SLi Yang 									 */
855ce973b14SLi Yang #define UCC_GETH_RX_BD_RING_ALIGNMENT		32
856ce973b14SLi Yang #define UCC_GETH_TX_BD_RING_ALIGNMENT		32
857ce973b14SLi Yang #define UCC_GETH_MRBLR_ALIGNMENT		128
858ce973b14SLi Yang #define UCC_GETH_RX_BD_RING_SIZE_ALIGNMENT	4
859ce973b14SLi Yang #define UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT	32
860ce973b14SLi Yang #define UCC_GETH_RX_DATA_BUF_ALIGNMENT		64
861ce973b14SLi Yang 
862ce973b14SLi Yang #define UCC_GETH_TAD_EF                         0x80
863ce973b14SLi Yang #define UCC_GETH_TAD_V                          0x40
864ce973b14SLi Yang #define UCC_GETH_TAD_REJ                        0x20
865ce973b14SLi Yang #define UCC_GETH_TAD_VTAG_OP_RIGHT_SHIFT        2
866ce973b14SLi Yang #define UCC_GETH_TAD_VTAG_OP_SHIFT              6
867ce973b14SLi Yang #define UCC_GETH_TAD_V_NON_VTAG_OP              0x20
868ce973b14SLi Yang #define UCC_GETH_TAD_RQOS_SHIFT                 0
869ce973b14SLi Yang #define UCC_GETH_TAD_V_PRIORITY_SHIFT           5
870ce973b14SLi Yang #define UCC_GETH_TAD_CFI                        0x10
871ce973b14SLi Yang 
872ce973b14SLi Yang #define UCC_GETH_VLAN_PRIORITY_MAX              8
873ce973b14SLi Yang #define UCC_GETH_IP_PRIORITY_MAX                64
874ce973b14SLi Yang #define UCC_GETH_TX_VTAG_TABLE_ENTRY_MAX        8
875ce973b14SLi Yang #define UCC_GETH_RX_BD_RING_SIZE_MIN            8
876ce973b14SLi Yang #define UCC_GETH_TX_BD_RING_SIZE_MIN            2
877ac421852SLi Yang #define UCC_GETH_BD_RING_SIZE_MAX		0xffff
878ce973b14SLi Yang 
879ce973b14SLi Yang #define UCC_GETH_SIZE_OF_BD                     QE_SIZEOF_BD
880ce973b14SLi Yang 
881ce973b14SLi Yang /* Driver definitions */
882ce973b14SLi Yang #define TX_BD_RING_LEN                          0x10
8835bbdc057SJoakim Tjernlund #define RX_BD_RING_LEN                          0x20
884ce973b14SLi Yang 
885ce973b14SLi Yang #define TX_RING_MOD_MASK(size)                  (size-1)
886ce973b14SLi Yang #define RX_RING_MOD_MASK(size)                  (size-1)
887ce973b14SLi Yang 
888ce973b14SLi Yang #define ENET_GROUP_ADDR                         0x01	/* Group address mask
889ce973b14SLi Yang 							   for ethernet
890ce973b14SLi Yang 							   addresses */
891ce973b14SLi Yang 
892ce973b14SLi Yang #define TX_TIMEOUT                              (1*HZ)
893ce973b14SLi Yang 
894ce973b14SLi Yang /* Fast Ethernet (10/100 Mbps) */
895ce973b14SLi Yang #define UCC_GETH_URFS_INIT                      512	/* Rx virtual FIFO size
896ce973b14SLi Yang 							 */
897ce973b14SLi Yang #define UCC_GETH_URFET_INIT                     256	/* 1/2 urfs */
898ce973b14SLi Yang #define UCC_GETH_URFSET_INIT                    384	/* 3/4 urfs */
899ce973b14SLi Yang #define UCC_GETH_UTFS_INIT                      512	/* Tx virtual FIFO size
900ce973b14SLi Yang 							 */
901ce973b14SLi Yang #define UCC_GETH_UTFET_INIT                     256	/* 1/2 utfs */
902d830418eSYang Li #define UCC_GETH_UTFTT_INIT                     256	/* 1/2 utfs
903d830418eSYang Li 							   due to errata */
904ce973b14SLi Yang /* Gigabit Ethernet (1000 Mbps) */
905ce973b14SLi Yang #define UCC_GETH_URFS_GIGA_INIT                 4096/*2048*/	/* Rx virtual
906ce973b14SLi Yang 								   FIFO size */
907ce973b14SLi Yang #define UCC_GETH_URFET_GIGA_INIT                2048/*1024*/	/* 1/2 urfs */
908ce973b14SLi Yang #define UCC_GETH_URFSET_GIGA_INIT               3072/*1536*/	/* 3/4 urfs */
90958933c64SDave Liu #define UCC_GETH_UTFS_GIGA_INIT                 4096/*2048*/	/* Tx virtual
910ce973b14SLi Yang 								   FIFO size */
91158933c64SDave Liu #define UCC_GETH_UTFET_GIGA_INIT                2048/*1024*/	/* 1/2 utfs */
91258933c64SDave Liu #define UCC_GETH_UTFTT_GIGA_INIT                4096/*0x40*/	/* Tx virtual
91358933c64SDave Liu 								   FIFO size */
914ce973b14SLi Yang 
915ce973b14SLi Yang #define UCC_GETH_REMODER_INIT                   0	/* bits that must be
916ce973b14SLi Yang 							   set */
917ce973b14SLi Yang #define UCC_GETH_TEMODER_INIT                   0xC000	/* bits that must */
9183bc53427STimur Tabi 
9193bc53427STimur Tabi /* Initial value for UPSMR */
9203bc53427STimur Tabi #define UCC_GETH_UPSMR_INIT                     UCC_GETH_UPSMR_RES1
9213bc53427STimur Tabi 
922ce973b14SLi Yang #define UCC_GETH_MACCFG1_INIT                   0
923dba25f75SMaxime Chevallier #define UCC_GETH_MACCFG2_INIT                   (MACCFG2_RESERVED_1 | \
924dba25f75SMaxime Chevallier 						 (7 << MACCFG2_PREL_SHIFT))
925ce973b14SLi Yang 
926ce973b14SLi Yang /* Ethernet Address Type. */
92718a8e864SLi Yang enum enet_addr_type {
928ce973b14SLi Yang 	ENET_ADDR_TYPE_INDIVIDUAL,
929ce973b14SLi Yang 	ENET_ADDR_TYPE_GROUP,
930ce973b14SLi Yang 	ENET_ADDR_TYPE_BROADCAST
93118a8e864SLi Yang };
932ce973b14SLi Yang 
933ce973b14SLi Yang /* UCC GETH 82xx Ethernet Address Recognition Location */
93418a8e864SLi Yang enum ucc_geth_enet_address_recognition_location {
935ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_STATION_ADDRESS,/* station
936ce973b14SLi Yang 								      address */
937ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_FIRST,	/* additional
938ce973b14SLi Yang 								   station
939ce973b14SLi Yang 								   address
940ce973b14SLi Yang 								   paddr1 */
941ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR2,	/* additional
942ce973b14SLi Yang 								   station
943ce973b14SLi Yang 								   address
944ce973b14SLi Yang 								   paddr2 */
945ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR3,	/* additional
946ce973b14SLi Yang 								   station
947ce973b14SLi Yang 								   address
948ce973b14SLi Yang 								   paddr3 */
949ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_PADDR_LAST,	/* additional
950ce973b14SLi Yang 								   station
951ce973b14SLi Yang 								   address
952ce973b14SLi Yang 								   paddr4 */
953ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_GROUP_HASH,	/* group hash */
954ce973b14SLi Yang 	UCC_GETH_ENET_ADDRESS_RECOGNITION_LOCATION_INDIVIDUAL_HASH /* individual
955ce973b14SLi Yang 								      hash */
95618a8e864SLi Yang };
957ce973b14SLi Yang 
958ce973b14SLi Yang /* UCC GETH vlan operation tagged */
95918a8e864SLi Yang enum ucc_geth_vlan_operation_tagged {
960ce973b14SLi Yang 	UCC_GETH_VLAN_OPERATION_TAGGED_NOP = 0x0,	/* Tagged - nop */
961ce973b14SLi Yang 	UCC_GETH_VLAN_OPERATION_TAGGED_REPLACE_VID_PORTION_OF_Q_TAG
962ce973b14SLi Yang 		= 0x1,	/* Tagged - replace vid portion of q tag */
963ce973b14SLi Yang 	UCC_GETH_VLAN_OPERATION_TAGGED_IF_VID0_REPLACE_VID_WITH_DEFAULT_VALUE
964ce973b14SLi Yang 		= 0x2,	/* Tagged - if vid0 replace vid with default value  */
965ce973b14SLi Yang 	UCC_GETH_VLAN_OPERATION_TAGGED_EXTRACT_Q_TAG_FROM_FRAME
966ce973b14SLi Yang 		= 0x3	/* Tagged - extract q tag from frame */
96718a8e864SLi Yang };
968ce973b14SLi Yang 
969ce973b14SLi Yang /* UCC GETH vlan operation non-tagged */
97018a8e864SLi Yang enum ucc_geth_vlan_operation_non_tagged {
971ce973b14SLi Yang 	UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP = 0x0,	/* Non tagged - nop */
972ce973b14SLi Yang 	UCC_GETH_VLAN_OPERATION_NON_TAGGED_Q_TAG_INSERT = 0x1	/* Non tagged -
973ce973b14SLi Yang 								   q tag insert
974ce973b14SLi Yang 								 */
97518a8e864SLi Yang };
976ce973b14SLi Yang 
977ce973b14SLi Yang /* UCC GETH Rx Quality of Service Mode */
97818a8e864SLi Yang enum ucc_geth_qos_mode {
979ce973b14SLi Yang 	UCC_GETH_QOS_MODE_DEFAULT = 0x0,	/* default queue */
980ce973b14SLi Yang 	UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L2_CRITERIA = 0x1,	/* queue
981ce973b14SLi Yang 								   determined
982ce973b14SLi Yang 								   by L2
983ce973b14SLi Yang 								   criteria */
984ce973b14SLi Yang 	UCC_GETH_QOS_MODE_QUEUE_NUM_FROM_L3_CRITERIA = 0x2	/* queue
985ce973b14SLi Yang 								   determined
986ce973b14SLi Yang 								   by L3
987ce973b14SLi Yang 								   criteria */
98818a8e864SLi Yang };
989ce973b14SLi Yang 
990ce973b14SLi Yang /* UCC GETH Statistics Gathering Mode - These are bit flags, 'or' them together
991ce973b14SLi Yang    for combined functionality */
99218a8e864SLi Yang enum ucc_geth_statistics_gathering_mode {
993ce973b14SLi Yang 	UCC_GETH_STATISTICS_GATHERING_MODE_NONE = 0x00000000,	/* No
994ce973b14SLi Yang 								   statistics
995ce973b14SLi Yang 								   gathering */
996ce973b14SLi Yang 	UCC_GETH_STATISTICS_GATHERING_MODE_HARDWARE = 0x00000001,/* Enable
997ce973b14SLi Yang 								    hardware
998ce973b14SLi Yang 								    statistics
999ce973b14SLi Yang 								    gathering
1000ce973b14SLi Yang 								  */
1001ce973b14SLi Yang 	UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX = 0x00000004,/*Enable
1002ce973b14SLi Yang 								      firmware
1003ce973b14SLi Yang 								      tx
1004ce973b14SLi Yang 								      statistics
1005ce973b14SLi Yang 								      gathering
1006ce973b14SLi Yang 								     */
1007ce973b14SLi Yang 	UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX = 0x00000008/* Enable
1008ce973b14SLi Yang 								      firmware
1009ce973b14SLi Yang 								      rx
1010ce973b14SLi Yang 								      statistics
1011ce973b14SLi Yang 								      gathering
1012ce973b14SLi Yang 								    */
101318a8e864SLi Yang };
1014ce973b14SLi Yang 
1015ce973b14SLi Yang /* UCC GETH Pad and CRC Mode - Note, Padding without CRC is not possible */
101618a8e864SLi Yang enum ucc_geth_maccfg2_pad_and_crc_mode {
1017ce973b14SLi Yang 	UCC_GETH_PAD_AND_CRC_MODE_NONE
1018ce973b14SLi Yang 		= MACCFG2_PAD_AND_CRC_MODE_NONE,	/* Neither Padding
1019ce973b14SLi Yang 							   short frames
1020ce973b14SLi Yang 							   nor CRC */
1021ce973b14SLi Yang 	UCC_GETH_PAD_AND_CRC_MODE_CRC_ONLY
1022ce973b14SLi Yang 		= MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY,	/* Append
1023ce973b14SLi Yang 							   CRC only */
1024ce973b14SLi Yang 	UCC_GETH_PAD_AND_CRC_MODE_PAD_AND_CRC =
1025ce973b14SLi Yang 	    MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC
102618a8e864SLi Yang };
1027ce973b14SLi Yang 
1028ce973b14SLi Yang /* UCC GETH upsmr Flow Control Mode */
102918a8e864SLi Yang enum ucc_geth_flow_control_mode {
1030ce973b14SLi Yang 	UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_NONE = 0x00000000,	/* No automatic
1031ce973b14SLi Yang 								   flow control
1032ce973b14SLi Yang 								 */
1033ce973b14SLi Yang 	UPSMR_AUTOMATIC_FLOW_CONTROL_MODE_PAUSE_WHEN_EMERGENCY
1034ce973b14SLi Yang 		= 0x00004000	/* Send pause frame when RxFIFO reaches its
1035ce973b14SLi Yang 				   emergency threshold */
103618a8e864SLi Yang };
1037ce973b14SLi Yang 
1038ce973b14SLi Yang /* UCC GETH number of threads */
103918a8e864SLi Yang enum ucc_geth_num_of_threads {
1040ce973b14SLi Yang 	UCC_GETH_NUM_OF_THREADS_1 = 0x1,	/* 1 */
1041ce973b14SLi Yang 	UCC_GETH_NUM_OF_THREADS_2 = 0x2,	/* 2 */
1042ce973b14SLi Yang 	UCC_GETH_NUM_OF_THREADS_4 = 0x0,	/* 4 */
1043ce973b14SLi Yang 	UCC_GETH_NUM_OF_THREADS_6 = 0x3,	/* 6 */
1044ce973b14SLi Yang 	UCC_GETH_NUM_OF_THREADS_8 = 0x4	/* 8 */
104518a8e864SLi Yang };
1046ce973b14SLi Yang 
1047ce973b14SLi Yang /* UCC GETH number of station addresses */
104818a8e864SLi Yang enum ucc_geth_num_of_station_addresses {
1049ce973b14SLi Yang 	UCC_GETH_NUM_OF_STATION_ADDRESSES_1,	/* 1 */
1050ce973b14SLi Yang 	UCC_GETH_NUM_OF_STATION_ADDRESSES_5	/* 5 */
105118a8e864SLi Yang };
1052ce973b14SLi Yang 
1053ce973b14SLi Yang /* UCC GETH 82xx Ethernet Address Container */
105418a8e864SLi Yang struct enet_addr_container {
1055b721e253SJoe Perches 	u8 address[ETH_ALEN];	/* ethernet address */
105618a8e864SLi Yang 	enum ucc_geth_enet_address_recognition_location location;	/* location in
1057ce973b14SLi Yang 								   82xx address
1058ce973b14SLi Yang 								   recognition
1059ce973b14SLi Yang 								   hardware */
1060ce973b14SLi Yang 	struct list_head node;
106118a8e864SLi Yang };
1062ce973b14SLi Yang 
106318a8e864SLi Yang #define ENET_ADDR_CONT_ENTRY(ptr) list_entry(ptr, struct enet_addr_container, node)
1064ce973b14SLi Yang 
1065ce973b14SLi Yang /* UCC GETH Termination Action Descriptor (TAD) structure. */
106618a8e864SLi Yang struct ucc_geth_tad_params {
1067ce973b14SLi Yang 	int rx_non_dynamic_extended_features_mode;
1068ce973b14SLi Yang 	int reject_frame;
106918a8e864SLi Yang 	enum ucc_geth_vlan_operation_tagged vtag_op;
107018a8e864SLi Yang 	enum ucc_geth_vlan_operation_non_tagged vnontag_op;
107118a8e864SLi Yang 	enum ucc_geth_qos_mode rqos;
1072ce973b14SLi Yang 	u8 vpri;
1073ce973b14SLi Yang 	u16 vid;
107418a8e864SLi Yang };
1075ce973b14SLi Yang 
1076*53036aa8SMaxime Chevallier struct phylink;
1077*53036aa8SMaxime Chevallier struct phylink_config;
1078*53036aa8SMaxime Chevallier 
1079ce973b14SLi Yang /* GETH protocol initialization structure */
108018a8e864SLi Yang struct ucc_geth_info {
108118a8e864SLi Yang 	struct ucc_fast_info uf_info;
1082ce973b14SLi Yang 	int ipCheckSumCheck;
1083ce973b14SLi Yang 	int ipCheckSumGenerate;
1084ce973b14SLi Yang 	int rxExtendedFiltering;
1085ce973b14SLi Yang 	u32 extendedFilteringChainPointer;
1086ce973b14SLi Yang 	u16 typeorlen;
1087ce973b14SLi Yang 	int dynamicMaxFrameLength;
1088ce973b14SLi Yang 	int dynamicMinFrameLength;
1089ce973b14SLi Yang 	u8 nonBackToBackIfgPart1;
1090ce973b14SLi Yang 	u8 nonBackToBackIfgPart2;
1091ce973b14SLi Yang 	u8 miminumInterFrameGapEnforcement;
1092ce973b14SLi Yang 	u8 backToBackInterFrameGap;
1093ce973b14SLi Yang 	int ipAddressAlignment;
1094ce973b14SLi Yang 	u32 mblinterval;
1095ce973b14SLi Yang 	u16 nortsrbytetime;
1096ce973b14SLi Yang 	u8 fracsiz;
1097ce973b14SLi Yang 	u8 strictpriorityq;
1098ce973b14SLi Yang 	u8 txasap;
1099ce973b14SLi Yang 	u8 extrabw;
1100ce973b14SLi Yang 	int miiPreambleSupress;
1101ce973b14SLi Yang 	u8 altBebTruncation;
1102ce973b14SLi Yang 	int altBeb;
1103ce973b14SLi Yang 	int backPressureNoBackoff;
1104ce973b14SLi Yang 	int noBackoff;
1105ce973b14SLi Yang 	int excessDefer;
1106ce973b14SLi Yang 	u8 maxRetransmission;
1107ce973b14SLi Yang 	u8 collisionWindow;
1108ce973b14SLi Yang 	int pro;
1109ce973b14SLi Yang 	int cap;
1110ce973b14SLi Yang 	int rsh;
1111ce973b14SLi Yang 	int rlpb;
1112ce973b14SLi Yang 	int cam;
1113ce973b14SLi Yang 	int bro;
1114ce973b14SLi Yang 	int ecm;
1115ce973b14SLi Yang 	int receiveFlowControl;
1116ac421852SLi Yang 	int transmitFlowControl;
1117ce973b14SLi Yang 	u8 maxGroupAddrInHash;
1118ce973b14SLi Yang 	u8 maxIndAddrInHash;
1119ce973b14SLi Yang 	u16 maxFrameLength;
1120ce973b14SLi Yang 	u16 minFrameLength;
1121ce973b14SLi Yang 	u16 maxD1Length;
1122ce973b14SLi Yang 	u16 maxD2Length;
1123ce973b14SLi Yang 	u16 vlantype;
1124ce973b14SLi Yang 	u16 vlantci;
1125ce973b14SLi Yang 	u32 ecamptr;
1126ce973b14SLi Yang 	u32 eventRegMask;
1127ce973b14SLi Yang 	u16 pausePeriod;
1128ce973b14SLi Yang 	u16 extensionField;
1129fb1001f3SHaiying Wang 	struct device_node *tbi_node;
1130ce973b14SLi Yang 	u8 weightfactor[NUM_TX_QUEUES];
1131ce973b14SLi Yang 	u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];
1132ce973b14SLi Yang 	u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX];
1133ce973b14SLi Yang 	u8 l3qt[UCC_GETH_IP_PRIORITY_MAX];
1134ce973b14SLi Yang 	u32 vtagtable[UCC_GETH_TX_VTAG_TABLE_ENTRY_MAX];
1135ce973b14SLi Yang 	u8 iphoffset[TX_IP_OFFSET_ENTRY_MAX];
1136ce973b14SLi Yang 	u16 bdRingLenTx[NUM_TX_QUEUES];
1137ce973b14SLi Yang 	u16 bdRingLenRx[NUM_RX_QUEUES];
113818a8e864SLi Yang 	enum ucc_geth_num_of_station_addresses numStationAddresses;
113918a8e864SLi Yang 	enum qe_fltr_largest_external_tbl_lookup_key_size
1140ce973b14SLi Yang 	    largestexternallookupkeysize;
114118a8e864SLi Yang 	enum ucc_geth_statistics_gathering_mode statisticsMode;
114218a8e864SLi Yang 	enum ucc_geth_vlan_operation_tagged vlanOperationTagged;
114318a8e864SLi Yang 	enum ucc_geth_vlan_operation_non_tagged vlanOperationNonTagged;
114418a8e864SLi Yang 	enum ucc_geth_qos_mode rxQoSMode;
114518a8e864SLi Yang 	enum ucc_geth_flow_control_mode aufc;
114618a8e864SLi Yang 	enum ucc_geth_maccfg2_pad_and_crc_mode padAndCrc;
114718a8e864SLi Yang 	enum ucc_geth_num_of_threads numThreadsTx;
114818a8e864SLi Yang 	enum ucc_geth_num_of_threads numThreadsRx;
1149345f8422SHaiying Wang 	unsigned int riscTx;
1150345f8422SHaiying Wang 	unsigned int riscRx;
115118a8e864SLi Yang };
1152ce973b14SLi Yang 
1153ce973b14SLi Yang /* structure representing UCC GETH */
115418a8e864SLi Yang struct ucc_geth_private {
115518a8e864SLi Yang 	struct ucc_geth_info *ug_info;
115618a8e864SLi Yang 	struct ucc_fast_private *uccf;
1157da1aa63eSAnton Vorontsov 	struct device *dev;
1158da1aa63eSAnton Vorontsov 	struct net_device *ndev;
1159bea3348eSStephen Hemminger 	struct napi_struct napi;
11601762a29aSAnton Vorontsov 	struct work_struct timeout_work;
11616fee40e9SAndy Fleming 	struct ucc_geth __iomem *ug_regs;
116218a8e864SLi Yang 	struct ucc_geth_init_pram *p_init_enet_param_shadow;
11636fee40e9SAndy Fleming 	struct ucc_geth_exf_global_pram __iomem *p_exf_glbl_param;
1164ce973b14SLi Yang 	u32 exf_glbl_param_offset;
11656fee40e9SAndy Fleming 	struct ucc_geth_rx_global_pram __iomem *p_rx_glbl_pram;
11666fee40e9SAndy Fleming 	struct ucc_geth_tx_global_pram __iomem *p_tx_glbl_pram;
11676fee40e9SAndy Fleming 	struct ucc_geth_send_queue_mem_region __iomem *p_send_q_mem_reg;
1168ce973b14SLi Yang 	u32 send_q_mem_reg_offset;
11696fee40e9SAndy Fleming 	struct ucc_geth_thread_data_tx __iomem *p_thread_data_tx;
1170ce973b14SLi Yang 	u32 thread_dat_tx_offset;
11716fee40e9SAndy Fleming 	struct ucc_geth_thread_data_rx __iomem *p_thread_data_rx;
1172ce973b14SLi Yang 	u32 thread_dat_rx_offset;
11736fee40e9SAndy Fleming 	struct ucc_geth_scheduler __iomem *p_scheduler;
1174ce973b14SLi Yang 	u32 scheduler_offset;
11756fee40e9SAndy Fleming 	struct ucc_geth_tx_firmware_statistics_pram __iomem *p_tx_fw_statistics_pram;
1176ce973b14SLi Yang 	u32 tx_fw_statistics_pram_offset;
11776fee40e9SAndy Fleming 	struct ucc_geth_rx_firmware_statistics_pram __iomem *p_rx_fw_statistics_pram;
1178ce973b14SLi Yang 	u32 rx_fw_statistics_pram_offset;
11796fee40e9SAndy Fleming 	struct ucc_geth_rx_interrupt_coalescing_table __iomem *p_rx_irq_coalescing_tbl;
1180ce973b14SLi Yang 	u32 rx_irq_coalescing_tbl_offset;
11816fee40e9SAndy Fleming 	struct ucc_geth_rx_bd_queues_entry __iomem *p_rx_bd_qs_tbl;
1182ce973b14SLi Yang 	u32 rx_bd_qs_tbl_offset;
11836fee40e9SAndy Fleming 	u8 __iomem *p_tx_bd_ring[NUM_TX_QUEUES];
11846fee40e9SAndy Fleming 	u8 __iomem *p_rx_bd_ring[NUM_RX_QUEUES];
11856fee40e9SAndy Fleming 	u8 __iomem *confBd[NUM_TX_QUEUES];
11866fee40e9SAndy Fleming 	u8 __iomem *txBd[NUM_TX_QUEUES];
11876fee40e9SAndy Fleming 	u8 __iomem *rxBd[NUM_RX_QUEUES];
1188ce973b14SLi Yang 	int badFrame[NUM_RX_QUEUES];
1189ce973b14SLi Yang 	u16 cpucount[NUM_TX_QUEUES];
11906fee40e9SAndy Fleming 	u16 __iomem *p_cpucount[NUM_TX_QUEUES];
1191ce973b14SLi Yang 	int indAddrRegUsed[NUM_OF_PADDRS];
1192b721e253SJoe Perches 	u8 paddr[NUM_OF_PADDRS][ETH_ALEN];	/* ethernet address */
1193ce973b14SLi Yang 	u8 numGroupAddrInHash;
1194ce973b14SLi Yang 	u8 numIndAddrInHash;
1195ce973b14SLi Yang 	u8 numIndAddrInReg;
1196ce973b14SLi Yang 	int rx_extended_features;
1197ce973b14SLi Yang 	int rx_non_dynamic_extended_features;
1198ce973b14SLi Yang 	struct list_head conf_skbs;
1199ce973b14SLi Yang 	struct list_head group_hash_q;
1200ce973b14SLi Yang 	struct list_head ind_hash_q;
1201ce973b14SLi Yang 	u32 saved_uccm;
1202ce973b14SLi Yang 	spinlock_t lock;
1203ce973b14SLi Yang 	/* pointers to arrays of skbuffs for tx and rx */
1204ce973b14SLi Yang 	struct sk_buff **tx_skbuff[NUM_TX_QUEUES];
1205ce973b14SLi Yang 	struct sk_buff **rx_skbuff[NUM_RX_QUEUES];
1206ce973b14SLi Yang 	/* indices pointing to the next free sbk in skb arrays */
1207ce973b14SLi Yang 	u16 skb_curtx[NUM_TX_QUEUES];
1208ce973b14SLi Yang 	u16 skb_currx[NUM_RX_QUEUES];
1209ce973b14SLi Yang 	/* index of the first skb which hasn't been transmitted yet. */
1210ce973b14SLi Yang 	u16 skb_dirtytx[NUM_TX_QUEUES];
1211ce973b14SLi Yang 
1212ce973b14SLi Yang 	struct ugeth_mii_info *mii_info;
1213728de4c9SKim Phillips 	uint32_t msg_enable;
1214420d56e4SMaxime Chevallier 	u32 wol_en;
1215d2adc441SMaxime Chevallier 	u32 phy_wol_en;
1216b1c4a9ddSHaiying Wang 
1217*53036aa8SMaxime Chevallier 	struct phylink *phylink;
1218*53036aa8SMaxime Chevallier 	struct phylink_config phylink_config;
1219*53036aa8SMaxime Chevallier 
1220b1c4a9ddSHaiying Wang 	struct device_node *node;
122118a8e864SLi Yang };
1222ce973b14SLi Yang 
12236fee40e9SAndy Fleming void uec_set_ethtool_ops(struct net_device *netdev);
12246fee40e9SAndy Fleming int init_flow_control_params(u32 automatic_flow_control_mode,
12256fee40e9SAndy Fleming 		int rx_flow_control_enable, int tx_flow_control_enable,
12266fee40e9SAndy Fleming 		u16 pause_period, u16 extension_field,
12276fee40e9SAndy Fleming 		u32 __iomem *upsmr_register, u32 __iomem *uempr_register,
12286fee40e9SAndy Fleming 		u32 __iomem *maccfg1_register);
12296fee40e9SAndy Fleming 
12306fee40e9SAndy Fleming 
1231ce973b14SLi Yang #endif				/* __UCC_GETH_H__ */
1232