xref: /freebsd/sys/dev/rge/if_rgereg.h (revision 4bf8ce037dc8fa699be87350bb6467f1b74cb96d)
1*4bf8ce03SAdrian Chadd /*-
2*4bf8ce03SAdrian Chadd  * SPDX-License-Identifier: BSD-2-Clause
3*4bf8ce03SAdrian Chadd  *
4*4bf8ce03SAdrian Chadd  * Copyright (c) 2019, 2020, 2025 Kevin Lo <kevlo@openbsd.org>
5*4bf8ce03SAdrian Chadd  *
6*4bf8ce03SAdrian Chadd  * Permission to use, copy, modify, and distribute this software for any
7*4bf8ce03SAdrian Chadd  * purpose with or without fee is hereby granted, provided that the above
8*4bf8ce03SAdrian Chadd  * copyright notice and this permission notice appear in all copies.
9*4bf8ce03SAdrian Chadd  *
10*4bf8ce03SAdrian Chadd  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*4bf8ce03SAdrian Chadd  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*4bf8ce03SAdrian Chadd  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*4bf8ce03SAdrian Chadd  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*4bf8ce03SAdrian Chadd  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*4bf8ce03SAdrian Chadd  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*4bf8ce03SAdrian Chadd  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*4bf8ce03SAdrian Chadd  */
18*4bf8ce03SAdrian Chadd 
19*4bf8ce03SAdrian Chadd /*	$OpenBSD: if_rgereg.h,v 1.15 2025/09/19 00:41:14 kevlo Exp $	*/
20*4bf8ce03SAdrian Chadd 
21*4bf8ce03SAdrian Chadd #ifndef	__IF_RGEREG_H__
22*4bf8ce03SAdrian Chadd #define	__IF_RGEREG_H__
23*4bf8ce03SAdrian Chadd 
24*4bf8ce03SAdrian Chadd #define RGE_PCI_BAR0		PCI_MAPREG_START
25*4bf8ce03SAdrian Chadd #define RGE_PCI_BAR1		(PCI_MAPREG_START + 4)
26*4bf8ce03SAdrian Chadd #define RGE_PCI_BAR2		(PCI_MAPREG_START + 8)
27*4bf8ce03SAdrian Chadd 
28*4bf8ce03SAdrian Chadd /* For now, a single MSI message, no multi-RX/TX ring support */
29*4bf8ce03SAdrian Chadd #define	RGE_MSI_MESSAGES	1
30*4bf8ce03SAdrian Chadd 
31*4bf8ce03SAdrian Chadd #define RGE_MAC0		0x0000
32*4bf8ce03SAdrian Chadd #define RGE_MAC4		0x0004
33*4bf8ce03SAdrian Chadd #define RGE_MAR0		0x0008
34*4bf8ce03SAdrian Chadd #define RGE_MAR4		0x000c
35*4bf8ce03SAdrian Chadd #define	RGE_DTCCR_LO		0x0010
36*4bf8ce03SAdrian Chadd #define		RGE_DTCCR_CMD		(1U << 3)
37*4bf8ce03SAdrian Chadd #define	RGE_DTCCR_HI		0x0014
38*4bf8ce03SAdrian Chadd #define RGE_TXDESC_ADDR_LO	0x0020
39*4bf8ce03SAdrian Chadd #define RGE_TXDESC_ADDR_HI	0x0024
40*4bf8ce03SAdrian Chadd #define RGE_INT_CFG0		0x0034
41*4bf8ce03SAdrian Chadd #define RGE_CMD			0x0037
42*4bf8ce03SAdrian Chadd #define RGE_IMR			0x0038
43*4bf8ce03SAdrian Chadd #define RGE_ISR			0x003c
44*4bf8ce03SAdrian Chadd #define RGE_TXCFG		0x0040
45*4bf8ce03SAdrian Chadd #define RGE_RXCFG		0x0044
46*4bf8ce03SAdrian Chadd #define RGE_TIMERCNT		0x0048
47*4bf8ce03SAdrian Chadd #define RGE_EECMD		0x0050
48*4bf8ce03SAdrian Chadd #define RGE_CFG0		0x0051
49*4bf8ce03SAdrian Chadd #define RGE_CFG1		0x0052
50*4bf8ce03SAdrian Chadd #define RGE_CFG2		0x0053
51*4bf8ce03SAdrian Chadd #define RGE_CFG3		0x0054
52*4bf8ce03SAdrian Chadd #define RGE_CFG4		0x0055
53*4bf8ce03SAdrian Chadd #define RGE_CFG5		0x0056
54*4bf8ce03SAdrian Chadd #define RGE_TDFNR		0x0057
55*4bf8ce03SAdrian Chadd #define RGE_TIMERINT0		0x0058
56*4bf8ce03SAdrian Chadd #define RGE_TIMERINT1		0x005c
57*4bf8ce03SAdrian Chadd #define RGE_CSIDR		0x0064
58*4bf8ce03SAdrian Chadd #define RGE_CSIAR		0x0068
59*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT		0x006c
60*4bf8ce03SAdrian Chadd #define RGE_PMCH		0x006f
61*4bf8ce03SAdrian Chadd #define RGE_INT_CFG1		0x007a
62*4bf8ce03SAdrian Chadd #define RGE_EPHYAR		0x0080
63*4bf8ce03SAdrian Chadd #define RGE_TIMERINT2		0x008c
64*4bf8ce03SAdrian Chadd #define RGE_TXSTART		0x0090
65*4bf8ce03SAdrian Chadd #define RGE_MACOCP		0x00b0
66*4bf8ce03SAdrian Chadd #define RGE_PHYOCP		0x00b8
67*4bf8ce03SAdrian Chadd #define RGE_DLLPR		0x00d0
68*4bf8ce03SAdrian Chadd #define RGE_TWICMD		0x00d2
69*4bf8ce03SAdrian Chadd #define RGE_MCUCMD		0x00d3
70*4bf8ce03SAdrian Chadd #define RGE_RXMAXSIZE		0x00da
71*4bf8ce03SAdrian Chadd #define RGE_CPLUSCMD		0x00e0
72*4bf8ce03SAdrian Chadd #define RGE_IM			0x00e2
73*4bf8ce03SAdrian Chadd #define RGE_RXDESC_ADDR_LO	0x00e4
74*4bf8ce03SAdrian Chadd #define RGE_RXDESC_ADDR_HI	0x00e8
75*4bf8ce03SAdrian Chadd #define RGE_PPSW		0x00f2
76*4bf8ce03SAdrian Chadd #define RGE_TIMERINT3		0x00f4
77*4bf8ce03SAdrian Chadd #define RGE_RADMFIFO_PROTECT	0x0402
78*4bf8ce03SAdrian Chadd #define RGE_INTMITI(i)		(0x0a00 + (i) * 4)
79*4bf8ce03SAdrian Chadd #define RGE_PHYBASE		0x0a40
80*4bf8ce03SAdrian Chadd #define RGE_EPHYAR_EXT_ADDR	0x0ffe
81*4bf8ce03SAdrian Chadd #define RGE_ADDR0		0x19e0
82*4bf8ce03SAdrian Chadd #define RGE_ADDR1		0x19e4
83*4bf8ce03SAdrian Chadd #define RGE_RSS_CTRL		0x4500
84*4bf8ce03SAdrian Chadd #define RGE_RXQUEUE_CTRL	0x4800
85*4bf8ce03SAdrian Chadd #define RGE_EEE_TXIDLE_TIMER	0x6048
86*4bf8ce03SAdrian Chadd 
87*4bf8ce03SAdrian Chadd /* Flags for register RGE_INT_CFG0 */
88*4bf8ce03SAdrian Chadd #define RGE_INT_CFG0_EN			0x01
89*4bf8ce03SAdrian Chadd #define RGE_INT_CFG0_TIMEOUT_BYPASS	0x02
90*4bf8ce03SAdrian Chadd #define RGE_INT_CFG0_MITIGATION_BYPASS	0x04
91*4bf8ce03SAdrian Chadd #define RGE_INT_CFG0_RDU_BYPASS_8126	0x10
92*4bf8ce03SAdrian Chadd #define RGE_INT_CFG0_AVOID_MISS_INTR	0x40
93*4bf8ce03SAdrian Chadd 
94*4bf8ce03SAdrian Chadd /* Flags for register RGE_CMD */
95*4bf8ce03SAdrian Chadd #define RGE_CMD_RXBUF_EMPTY	0x01
96*4bf8ce03SAdrian Chadd #define RGE_CMD_TXENB		0x04
97*4bf8ce03SAdrian Chadd #define RGE_CMD_RXENB		0x08
98*4bf8ce03SAdrian Chadd #define RGE_CMD_RESET		0x10
99*4bf8ce03SAdrian Chadd #define RGE_CMD_STOPREQ		0x80
100*4bf8ce03SAdrian Chadd 
101*4bf8ce03SAdrian Chadd /* Flags for register RGE_ISR */
102*4bf8ce03SAdrian Chadd #define RGE_ISR_RX_OK		0x00000001
103*4bf8ce03SAdrian Chadd #define RGE_ISR_RX_ERR		0x00000002
104*4bf8ce03SAdrian Chadd #define RGE_ISR_TX_OK		0x00000004
105*4bf8ce03SAdrian Chadd #define RGE_ISR_TX_ERR		0x00000008
106*4bf8ce03SAdrian Chadd #define RGE_ISR_RX_DESC_UNAVAIL	0x00000010
107*4bf8ce03SAdrian Chadd #define RGE_ISR_LINKCHG		0x00000020
108*4bf8ce03SAdrian Chadd #define RGE_ISR_RX_FIFO_OFLOW	0x00000040
109*4bf8ce03SAdrian Chadd #define RGE_ISR_TX_DESC_UNAVAIL	0x00000080
110*4bf8ce03SAdrian Chadd #define RGE_ISR_SWI		0x00000100
111*4bf8ce03SAdrian Chadd #define RGE_ISR_PCS_TIMEOUT	0x00004000
112*4bf8ce03SAdrian Chadd #define RGE_ISR_SYSTEM_ERR	0x00008000
113*4bf8ce03SAdrian Chadd 
114*4bf8ce03SAdrian Chadd #define RGE_INTRS		\
115*4bf8ce03SAdrian Chadd 	(RGE_ISR_RX_OK | RGE_ISR_RX_ERR | RGE_ISR_TX_OK |		\
116*4bf8ce03SAdrian Chadd 	RGE_ISR_TX_ERR | RGE_ISR_LINKCHG | RGE_ISR_TX_DESC_UNAVAIL |	\
117*4bf8ce03SAdrian Chadd 	RGE_ISR_PCS_TIMEOUT | RGE_ISR_SYSTEM_ERR)
118*4bf8ce03SAdrian Chadd 
119*4bf8ce03SAdrian Chadd #define RGE_INTRS_TIMER		\
120*4bf8ce03SAdrian Chadd 	(RGE_ISR_RX_ERR | RGE_ISR_TX_ERR | RGE_ISR_PCS_TIMEOUT |	\
121*4bf8ce03SAdrian Chadd 	RGE_ISR_SYSTEM_ERR)
122*4bf8ce03SAdrian Chadd 
123*4bf8ce03SAdrian Chadd /* Flags for register RGE_TXCFG */
124*4bf8ce03SAdrian Chadd #define RGE_TXCFG_HWREV		0x7cf00000
125*4bf8ce03SAdrian Chadd 
126*4bf8ce03SAdrian Chadd /* Flags for register RGE_RXCFG */
127*4bf8ce03SAdrian Chadd #define RGE_RXCFG_ALLPHYS	0x00000001
128*4bf8ce03SAdrian Chadd #define RGE_RXCFG_INDIV		0x00000002
129*4bf8ce03SAdrian Chadd #define RGE_RXCFG_MULTI		0x00000004
130*4bf8ce03SAdrian Chadd #define RGE_RXCFG_BROAD		0x00000008
131*4bf8ce03SAdrian Chadd #define RGE_RXCFG_RUNT		0x00000010
132*4bf8ce03SAdrian Chadd #define RGE_RXCFG_ERRPKT	0x00000020
133*4bf8ce03SAdrian Chadd #define RGE_RXCFG_VLANSTRIP	0x00c00000
134*4bf8ce03SAdrian Chadd 
135*4bf8ce03SAdrian Chadd /* Flags for register RGE_EECMD */
136*4bf8ce03SAdrian Chadd #define RGE_EECMD_WRITECFG	0xc0
137*4bf8ce03SAdrian Chadd 
138*4bf8ce03SAdrian Chadd /* Flags for register RGE_CFG1 */
139*4bf8ce03SAdrian Chadd #define RGE_CFG1_PM_EN		0x01
140*4bf8ce03SAdrian Chadd #define RGE_CFG1_SPEED_DOWN	0x10
141*4bf8ce03SAdrian Chadd 
142*4bf8ce03SAdrian Chadd /* Flags for register RGE_CFG2 */
143*4bf8ce03SAdrian Chadd #define RGE_CFG2_PMSTS_EN	0x20
144*4bf8ce03SAdrian Chadd #define RGE_CFG2_CLKREQ_EN	0x80
145*4bf8ce03SAdrian Chadd 
146*4bf8ce03SAdrian Chadd /* Flags for register RGE_CFG3 */
147*4bf8ce03SAdrian Chadd #define RGE_CFG3_RDY_TO_L23	0x02
148*4bf8ce03SAdrian Chadd #define RGE_CFG3_WOL_LINK	0x10
149*4bf8ce03SAdrian Chadd #define RGE_CFG3_WOL_MAGIC	0x20
150*4bf8ce03SAdrian Chadd 
151*4bf8ce03SAdrian Chadd /* Flags for register RGE_CFG5 */
152*4bf8ce03SAdrian Chadd #define RGE_CFG5_PME_STS	0x01
153*4bf8ce03SAdrian Chadd #define RGE_CFG5_WOL_LANWAKE	0x02
154*4bf8ce03SAdrian Chadd #define RGE_CFG5_WOL_UCAST	0x10
155*4bf8ce03SAdrian Chadd #define RGE_CFG5_WOL_MCAST	0x20
156*4bf8ce03SAdrian Chadd #define RGE_CFG5_WOL_BCAST	0x40
157*4bf8ce03SAdrian Chadd 
158*4bf8ce03SAdrian Chadd /* Flags for register RGE_CSIAR */
159*4bf8ce03SAdrian Chadd #define RGE_CSIAR_BYTE_EN	0x0000000f
160*4bf8ce03SAdrian Chadd #define RGE_CSIAR_BYTE_EN_SHIFT	12
161*4bf8ce03SAdrian Chadd #define RGE_CSIAR_ADDR_MASK	0x00000fff
162*4bf8ce03SAdrian Chadd #define RGE_CSIAR_BUSY		0x80000000
163*4bf8ce03SAdrian Chadd 
164*4bf8ce03SAdrian Chadd /* Flags for register RGE_PHYSTAT */
165*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_FDX		0x0001
166*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_LINK	0x0002
167*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_10MBPS	0x0004
168*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_100MBPS	0x0008
169*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_1000MBPS	0x0010
170*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_RXFLOW	0x0020
171*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_TXFLOW	0x0040
172*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_2500MBPS	0x0400
173*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_5000MBPS	0x1000
174*4bf8ce03SAdrian Chadd #define RGE_PHYSTAT_10000MBPS	0x4000
175*4bf8ce03SAdrian Chadd 
176*4bf8ce03SAdrian Chadd /* Flags for register RGE_EPHYAR */
177*4bf8ce03SAdrian Chadd #define RGE_EPHYAR_DATA_MASK	0x0000ffff
178*4bf8ce03SAdrian Chadd #define RGE_EPHYAR_BUSY		0x80000000
179*4bf8ce03SAdrian Chadd #define RGE_EPHYAR_ADDR_MASK	0x0000007f
180*4bf8ce03SAdrian Chadd #define RGE_EPHYAR_ADDR_SHIFT	16
181*4bf8ce03SAdrian Chadd 
182*4bf8ce03SAdrian Chadd /* Flags for register RGE_TXSTART */
183*4bf8ce03SAdrian Chadd #define RGE_TXSTART_START	0x0001
184*4bf8ce03SAdrian Chadd 
185*4bf8ce03SAdrian Chadd /* Flags for register RGE_MACOCP */
186*4bf8ce03SAdrian Chadd #define RGE_MACOCP_DATA_MASK	0x0000ffff
187*4bf8ce03SAdrian Chadd #define RGE_MACOCP_BUSY		0x80000000
188*4bf8ce03SAdrian Chadd #define RGE_MACOCP_ADDR_SHIFT	16
189*4bf8ce03SAdrian Chadd 
190*4bf8ce03SAdrian Chadd /* Flags for register RGE_PHYOCP */
191*4bf8ce03SAdrian Chadd #define RGE_PHYOCP_DATA_MASK	0x0000ffff
192*4bf8ce03SAdrian Chadd #define RGE_PHYOCP_BUSY		0x80000000
193*4bf8ce03SAdrian Chadd #define RGE_PHYOCP_ADDR_SHIFT	16
194*4bf8ce03SAdrian Chadd 
195*4bf8ce03SAdrian Chadd /* Flags for register RGE_DLLPR. */
196*4bf8ce03SAdrian Chadd #define RGE_DLLPR_PFM_EN	0x40
197*4bf8ce03SAdrian Chadd #define RGE_DLLPR_TX_10M_PS_EN	0x80
198*4bf8ce03SAdrian Chadd 
199*4bf8ce03SAdrian Chadd /* Flags for register RGE_MCUCMD */
200*4bf8ce03SAdrian Chadd #define RGE_MCUCMD_RXFIFO_EMPTY	0x10
201*4bf8ce03SAdrian Chadd #define RGE_MCUCMD_TXFIFO_EMPTY	0x20
202*4bf8ce03SAdrian Chadd #define RGE_MCUCMD_IS_OOB	0x80
203*4bf8ce03SAdrian Chadd 
204*4bf8ce03SAdrian Chadd /* Flags for register RGE_CPLUSCMD */
205*4bf8ce03SAdrian Chadd #define RGE_CPLUSCMD_RXCSUM	0x0020
206*4bf8ce03SAdrian Chadd 
207*4bf8ce03SAdrian Chadd #define RGE_TX_NSEGS		32
208*4bf8ce03SAdrian Chadd 
209*4bf8ce03SAdrian Chadd #define RGE_TX_LIST_CNT		1024
210*4bf8ce03SAdrian Chadd #define RGE_RX_LIST_CNT		1024
211*4bf8ce03SAdrian Chadd 
212*4bf8ce03SAdrian Chadd #define RGE_ALIGN		256
213*4bf8ce03SAdrian Chadd #define RGE_TX_LIST_SZ		(sizeof(struct rge_tx_desc) * RGE_TX_LIST_CNT)
214*4bf8ce03SAdrian Chadd #define RGE_RX_LIST_SZ		(sizeof(struct rge_rx_desc) * RGE_RX_LIST_CNT)
215*4bf8ce03SAdrian Chadd #define RGE_NEXT_TX_DESC(x)	(((x) + 1) % RGE_TX_LIST_CNT)
216*4bf8ce03SAdrian Chadd #define RGE_NEXT_RX_DESC(x)	(((x) + 1) % RGE_RX_LIST_CNT)
217*4bf8ce03SAdrian Chadd #define RGE_ADDR_LO(y)		((uint64_t) (y) & 0xffffffff)
218*4bf8ce03SAdrian Chadd #define RGE_ADDR_HI(y)		((uint64_t) (y) >> 32)
219*4bf8ce03SAdrian Chadd 
220*4bf8ce03SAdrian Chadd #define RGE_ADV_2500TFDX	0x0080
221*4bf8ce03SAdrian Chadd #define RGE_ADV_5000TFDX	0x0100
222*4bf8ce03SAdrian Chadd #define RGE_ADV_10000TFDX	0x1000
223*4bf8ce03SAdrian Chadd 
224*4bf8ce03SAdrian Chadd /* Tx descriptor */
225*4bf8ce03SAdrian Chadd struct rge_tx_desc {
226*4bf8ce03SAdrian Chadd 	uint32_t		rge_cmdsts;
227*4bf8ce03SAdrian Chadd 	uint32_t		rge_extsts;
228*4bf8ce03SAdrian Chadd 	uint64_t		rge_addr;
229*4bf8ce03SAdrian Chadd 	uint32_t		reserved[4];
230*4bf8ce03SAdrian Chadd } __packed __aligned(16);
231*4bf8ce03SAdrian Chadd 
232*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_COLL	0x000f0000
233*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_EXCESSCOLL	0x00100000
234*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_TXERR	0x00800000
235*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_EOF	0x10000000
236*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_SOF	0x20000000
237*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_EOR	0x40000000
238*4bf8ce03SAdrian Chadd #define RGE_TDCMDSTS_OWN	0x80000000
239*4bf8ce03SAdrian Chadd 
240*4bf8ce03SAdrian Chadd #define RGE_TDEXTSTS_VTAG	0x00020000
241*4bf8ce03SAdrian Chadd #define RGE_TDEXTSTS_IPCSUM	0x20000000
242*4bf8ce03SAdrian Chadd #define RGE_TDEXTSTS_TCPCSUM	0x40000000
243*4bf8ce03SAdrian Chadd #define RGE_TDEXTSTS_UDPCSUM	0x80000000
244*4bf8ce03SAdrian Chadd 
245*4bf8ce03SAdrian Chadd /* Rx descriptor */
246*4bf8ce03SAdrian Chadd struct rge_rx_desc {
247*4bf8ce03SAdrian Chadd 	union {
248*4bf8ce03SAdrian Chadd 		struct {
249*4bf8ce03SAdrian Chadd 			uint32_t	rsvd0;
250*4bf8ce03SAdrian Chadd 			uint32_t	rsvd1;
251*4bf8ce03SAdrian Chadd 		} rx_qword0;
252*4bf8ce03SAdrian Chadd 	} lo_qword0;
253*4bf8ce03SAdrian Chadd 
254*4bf8ce03SAdrian Chadd 	union {
255*4bf8ce03SAdrian Chadd 		struct {
256*4bf8ce03SAdrian Chadd 			uint32_t	rss;
257*4bf8ce03SAdrian Chadd 			uint16_t	length;
258*4bf8ce03SAdrian Chadd 			uint16_t	hdr_info;
259*4bf8ce03SAdrian Chadd 		} rx_qword1;
260*4bf8ce03SAdrian Chadd 
261*4bf8ce03SAdrian Chadd 		struct {
262*4bf8ce03SAdrian Chadd 			uint32_t	rsvd2;
263*4bf8ce03SAdrian Chadd 			uint32_t	rsvd3;
264*4bf8ce03SAdrian Chadd 		} rx_qword2;
265*4bf8ce03SAdrian Chadd 	} lo_qword1;
266*4bf8ce03SAdrian Chadd 
267*4bf8ce03SAdrian Chadd 	union {
268*4bf8ce03SAdrian Chadd 		uint64_t		rge_addr;
269*4bf8ce03SAdrian Chadd 
270*4bf8ce03SAdrian Chadd 		struct {
271*4bf8ce03SAdrian Chadd 			uint64_t	timestamp;
272*4bf8ce03SAdrian Chadd 		} rx_timestamp;
273*4bf8ce03SAdrian Chadd 
274*4bf8ce03SAdrian Chadd 		struct {
275*4bf8ce03SAdrian Chadd 			uint32_t	rsvd4;
276*4bf8ce03SAdrian Chadd 			uint32_t	rsvd5;
277*4bf8ce03SAdrian Chadd 		} rx_qword3;
278*4bf8ce03SAdrian Chadd 	} hi_qword0;
279*4bf8ce03SAdrian Chadd 
280*4bf8ce03SAdrian Chadd 	union {
281*4bf8ce03SAdrian Chadd 		struct {
282*4bf8ce03SAdrian Chadd 			uint32_t	rge_extsts;
283*4bf8ce03SAdrian Chadd 			uint32_t	rge_cmdsts;
284*4bf8ce03SAdrian Chadd 		} rx_qword4;
285*4bf8ce03SAdrian Chadd 
286*4bf8ce03SAdrian Chadd 		struct {
287*4bf8ce03SAdrian Chadd 			uint16_t	rsvd6;
288*4bf8ce03SAdrian Chadd 			uint16_t	rsvd7;
289*4bf8ce03SAdrian Chadd 			uint32_t	rsvd8;
290*4bf8ce03SAdrian Chadd 		} rx_ptp;
291*4bf8ce03SAdrian Chadd 	} hi_qword1;
292*4bf8ce03SAdrian Chadd } __packed __aligned(16);
293*4bf8ce03SAdrian Chadd 
294*4bf8ce03SAdrian Chadd #define RGE_RDCMDSTS_RXERRSUM	0x00100000
295*4bf8ce03SAdrian Chadd #define RGE_RDCMDSTS_EOF	0x01000000
296*4bf8ce03SAdrian Chadd #define RGE_RDCMDSTS_SOF	0x02000000
297*4bf8ce03SAdrian Chadd #define RGE_RDCMDSTS_EOR	0x40000000
298*4bf8ce03SAdrian Chadd #define RGE_RDCMDSTS_OWN	0x80000000
299*4bf8ce03SAdrian Chadd #define RGE_RDCMDSTS_FRAGLEN	0x00003fff
300*4bf8ce03SAdrian Chadd 
301*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_VTAG	0x00010000
302*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_VLAN_MASK	0x0000ffff
303*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_TCPCSUMERR	0x01000000
304*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_UDPCSUMERR	0x02000000
305*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_IPCSUMERR	0x04000000
306*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_TCPPKT	0x10000000
307*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_UDPPKT	0x20000000
308*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_IPV4	0x40000000
309*4bf8ce03SAdrian Chadd #define RGE_RDEXTSTS_IPV6	0x80000000
310*4bf8ce03SAdrian Chadd 
311*4bf8ce03SAdrian Chadd /*
312*4bf8ce03SAdrian Chadd  * @brief Statistics counter structure
313*4bf8ce03SAdrian Chadd  *
314*4bf8ce03SAdrian Chadd  * This is the layout of the hardware structure that
315*4bf8ce03SAdrian Chadd  * is populated by the hardware when RGE_DTCCR_* is
316*4bf8ce03SAdrian Chadd  * appropriately poked.
317*4bf8ce03SAdrian Chadd  */
318*4bf8ce03SAdrian Chadd struct rge_hw_mac_stats {
319*4bf8ce03SAdrian Chadd 	uint64_t		rge_tx_ok;
320*4bf8ce03SAdrian Chadd 	uint64_t		rge_rx_ok;
321*4bf8ce03SAdrian Chadd 	uint64_t		rge_tx_er;
322*4bf8ce03SAdrian Chadd 	uint32_t		rge_rx_er;
323*4bf8ce03SAdrian Chadd 	uint16_t		rge_miss_pkt;
324*4bf8ce03SAdrian Chadd 	uint16_t		rge_fae; /* frame align errors */
325*4bf8ce03SAdrian Chadd 	uint32_t		rge_tx_1col; /* one collision */
326*4bf8ce03SAdrian Chadd 	uint32_t		rge_tx_mcol; /* multple collisions */
327*4bf8ce03SAdrian Chadd 	uint64_t		rge_rx_ok_phy; /* unicast */
328*4bf8ce03SAdrian Chadd 	uint64_t		rge_rx_ok_brd; /* broadcasts */
329*4bf8ce03SAdrian Chadd 	uint32_t		rge_rx_ok_mul; /* multicasts */
330*4bf8ce03SAdrian Chadd 	uint16_t		rge_tx_abt;
331*4bf8ce03SAdrian Chadd 	uint16_t		rge_tx_undrn;
332*4bf8ce03SAdrian Chadd 
333*4bf8ce03SAdrian Chadd 	/* extended */
334*4bf8ce03SAdrian Chadd 	uint64_t		re_tx_octets;
335*4bf8ce03SAdrian Chadd 	uint64_t		re_rx_octets;
336*4bf8ce03SAdrian Chadd 	uint64_t		re_rx_multicast64;
337*4bf8ce03SAdrian Chadd 	uint64_t		re_tx_unicast64;
338*4bf8ce03SAdrian Chadd 	uint64_t		re_tx_broadcast64;
339*4bf8ce03SAdrian Chadd 	uint64_t		re_tx_multicast64;
340*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_pause_on;
341*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_pause_off;
342*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_pause_all;
343*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_deferred;
344*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_late_collision;
345*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_all_collision;
346*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_aborted32;
347*4bf8ce03SAdrian Chadd 	uint32_t		re_align_errors32;
348*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_frame_too_long;
349*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_runt;
350*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_pause_on;
351*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_pause_off;
352*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_pause_all;
353*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_unknown_opcode;
354*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_mac_error;
355*4bf8ce03SAdrian Chadd 	uint32_t		re_tx_underrun32;
356*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_mac_missed;
357*4bf8ce03SAdrian Chadd 	uint32_t		re_rx_tcam_dropped;
358*4bf8ce03SAdrian Chadd 	uint32_t		re_tdu;
359*4bf8ce03SAdrian Chadd 	uint32_t		re_rdu;
360*4bf8ce03SAdrian Chadd 
361*4bf8ce03SAdrian Chadd } __packed __aligned(sizeof(uint64_t));
362*4bf8ce03SAdrian Chadd 
363*4bf8ce03SAdrian Chadd #define RGE_STATS_BUF_SIZE	sizeof(struct rge_hw_mac_stats)
364*4bf8ce03SAdrian Chadd 
365*4bf8ce03SAdrian Chadd #define RGE_STATS_ALIGNMENT	64
366*4bf8ce03SAdrian Chadd 
367*4bf8ce03SAdrian Chadd /* Ram version */
368*4bf8ce03SAdrian Chadd #define RGE_MAC_R25D_RCODE_VER		0x0027
369*4bf8ce03SAdrian Chadd #define RGE_MAC_R26_RCODE_VER		0x0033
370*4bf8ce03SAdrian Chadd #define RGE_MAC_R27_RCODE_VER		0x0036
371*4bf8ce03SAdrian Chadd #define RGE_MAC_R25_RCODE_VER		0x0b33
372*4bf8ce03SAdrian Chadd #define RGE_MAC_R25B_RCODE_VER		0x0b99
373*4bf8ce03SAdrian Chadd 
374*4bf8ce03SAdrian Chadd #define RGE_TIMEOUT		100
375*4bf8ce03SAdrian Chadd 
376*4bf8ce03SAdrian Chadd #define RGE_JUMBO_FRAMELEN	9216
377*4bf8ce03SAdrian Chadd #define RGE_JUMBO_MTU							\
378*4bf8ce03SAdrian Chadd 	(RGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN - 		\
379*4bf8ce03SAdrian Chadd 	ETHER_VLAN_ENCAP_LEN)
380*4bf8ce03SAdrian Chadd 
381*4bf8ce03SAdrian Chadd #define RGE_TXCFG_CONFIG	0x03000700
382*4bf8ce03SAdrian Chadd #define RGE_RXCFG_CONFIG	0x41000700
383*4bf8ce03SAdrian Chadd #define RGE_RXCFG_CONFIG_8125B	0x41000c00
384*4bf8ce03SAdrian Chadd #define RGE_RXCFG_CONFIG_8125D	0x41200c00
385*4bf8ce03SAdrian Chadd #define RGE_RXCFG_CONFIG_8126	0x41200d00
386*4bf8ce03SAdrian Chadd 
387*4bf8ce03SAdrian Chadd #endif	/* __IF_RGEREG_H__ */
388