xref: /onnv-gate/usr/src/uts/common/io/elxl/elxl.h (revision 11717:4992968a6106)
1*11717Sgdamore@opensolaris.org /*
2*11717Sgdamore@opensolaris.org  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
3*11717Sgdamore@opensolaris.org  * Use is subject to license terms.
4*11717Sgdamore@opensolaris.org  */
5*11717Sgdamore@opensolaris.org 
6*11717Sgdamore@opensolaris.org /*
7*11717Sgdamore@opensolaris.org  * Copyright (c) 1998 The NetBSD Foundation, Inc.
8*11717Sgdamore@opensolaris.org  * All rights reserved.
9*11717Sgdamore@opensolaris.org  *
10*11717Sgdamore@opensolaris.org  * This code is derived from software contributed to The NetBSD Foundation
11*11717Sgdamore@opensolaris.org  * by Frank van der Linden.
12*11717Sgdamore@opensolaris.org  *
13*11717Sgdamore@opensolaris.org  * Redistribution and use in source and binary forms, with or without
14*11717Sgdamore@opensolaris.org  * modification, are permitted provided that the following conditions
15*11717Sgdamore@opensolaris.org  * are met:
16*11717Sgdamore@opensolaris.org  * 1. Redistributions of source code must retain the above copyright
17*11717Sgdamore@opensolaris.org  *    notice, this list of conditions and the following disclaimer.
18*11717Sgdamore@opensolaris.org  * 2. Redistributions in binary form must reproduce the above copyright
19*11717Sgdamore@opensolaris.org  *    notice, this list of conditions and the following disclaimer in the
20*11717Sgdamore@opensolaris.org  *    documentation and/or other materials provided with the distribution.
21*11717Sgdamore@opensolaris.org  *
22*11717Sgdamore@opensolaris.org  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
23*11717Sgdamore@opensolaris.org  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24*11717Sgdamore@opensolaris.org  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25*11717Sgdamore@opensolaris.org  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26*11717Sgdamore@opensolaris.org  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27*11717Sgdamore@opensolaris.org  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28*11717Sgdamore@opensolaris.org  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29*11717Sgdamore@opensolaris.org  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30*11717Sgdamore@opensolaris.org  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31*11717Sgdamore@opensolaris.org  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32*11717Sgdamore@opensolaris.org  * POSSIBILITY OF SUCH DAMAGE.
33*11717Sgdamore@opensolaris.org  */
34*11717Sgdamore@opensolaris.org 
35*11717Sgdamore@opensolaris.org 
36*11717Sgdamore@opensolaris.org #ifndef ELXL_H
37*11717Sgdamore@opensolaris.org #define	ELXL_H
38*11717Sgdamore@opensolaris.org 
39*11717Sgdamore@opensolaris.org /*
40*11717Sgdamore@opensolaris.org  * This file defines the registers specific to the EtherLink XL family
41*11717Sgdamore@opensolaris.org  * of NICs.
42*11717Sgdamore@opensolaris.org  */
43*11717Sgdamore@opensolaris.org 
44*11717Sgdamore@opensolaris.org #define	REG_CMD_STAT		0x0e	/* Write command, read status */
45*11717Sgdamore@opensolaris.org 
46*11717Sgdamore@opensolaris.org #define	CMD_GLOBAL_RESET	0x0000
47*11717Sgdamore@opensolaris.org #define	CMD_SELECT_WINDOW	0x0800
48*11717Sgdamore@opensolaris.org #define	CMD_BNC_ENABLE		0x1000	/* enable 10BASE2 DC-DC converter */
49*11717Sgdamore@opensolaris.org #define	CMD_RX_DISABLE		0x1800
50*11717Sgdamore@opensolaris.org #define	CMD_RX_ENABLE		0x2000
51*11717Sgdamore@opensolaris.org #define	CMD_RX_RESET		0x2800
52*11717Sgdamore@opensolaris.org #define	CMD_UP_STALL		0x3000
53*11717Sgdamore@opensolaris.org #define	CMD_UP_UNSTALL		0x3001
54*11717Sgdamore@opensolaris.org #define	CMD_DN_STALL		0x3002
55*11717Sgdamore@opensolaris.org #define	CMD_DN_UNSTALL		0x3003
56*11717Sgdamore@opensolaris.org #define	CMD_TX_ENABLE		0x4800
57*11717Sgdamore@opensolaris.org #define	CMD_TX_DISABLE		0x5000
58*11717Sgdamore@opensolaris.org #define	CMD_TX_RESET		0x5800
59*11717Sgdamore@opensolaris.org #define	CMD_INT_REQ		0x6000
60*11717Sgdamore@opensolaris.org #define	CMD_INT_ACK		0x6800
61*11717Sgdamore@opensolaris.org #define	CMD_INT_ENABLE		0x7000
62*11717Sgdamore@opensolaris.org #define	CMD_IND_ENABLE		0x7800
63*11717Sgdamore@opensolaris.org #define	CMD_SET_FILTER		0x8000
64*11717Sgdamore@opensolaris.org #define	CMD_SET_RXEARLY		0x8800
65*11717Sgdamore@opensolaris.org #define	CMD_SET_TXSTART		0x9800
66*11717Sgdamore@opensolaris.org #define	CMD_STATS_ENABLE	0xa800
67*11717Sgdamore@opensolaris.org #define	CMD_STATS_DISABLE	0xb000
68*11717Sgdamore@opensolaris.org #define	CMD_BNC_DISABLE		0xb800	/* disable 10BASE2 DC-DC converter */
69*11717Sgdamore@opensolaris.org #define	CMD_SET_TXRECLAIM	0xc000
70*11717Sgdamore@opensolaris.org #define	CMD_CLEAR_HASHBIT	0xc800
71*11717Sgdamore@opensolaris.org #define	CMD_SET_HASHBIT		0xcc00
72*11717Sgdamore@opensolaris.org 
73*11717Sgdamore@opensolaris.org /*
74*11717Sgdamore@opensolaris.org  * Defines for the interrupt status register
75*11717Sgdamore@opensolaris.org  */
76*11717Sgdamore@opensolaris.org #define	INT_LATCH		0x0001
77*11717Sgdamore@opensolaris.org #define	INT_HOST_ERROR		0x0002
78*11717Sgdamore@opensolaris.org #define	INT_TX_COMPLETE		0x0004
79*11717Sgdamore@opensolaris.org #define	INT_RX_COMPLETE		0x0010
80*11717Sgdamore@opensolaris.org #define	INT_RX_EARLY		0x0020
81*11717Sgdamore@opensolaris.org #define	INT_REQUESTED		0x0040
82*11717Sgdamore@opensolaris.org #define	INT_STATS		0x0080
83*11717Sgdamore@opensolaris.org #define	INT_LINK		0x0100	/* NB: most NICs don't implement it! */
84*11717Sgdamore@opensolaris.org #define	INT_DN_COMPLETE		0x0200
85*11717Sgdamore@opensolaris.org #define	INT_UP_COMPLETE		0x0400
86*11717Sgdamore@opensolaris.org #define	STAT_CMD_IN_PROGRESS	0x1000
87*11717Sgdamore@opensolaris.org 
88*11717Sgdamore@opensolaris.org #define	INT_WATCHED							\
89*11717Sgdamore@opensolaris.org 	(INT_HOST_ERROR | INT_STATS | INT_DN_COMPLETE | INT_UP_COMPLETE)
90*11717Sgdamore@opensolaris.org 
91*11717Sgdamore@opensolaris.org 
92*11717Sgdamore@opensolaris.org /*
93*11717Sgdamore@opensolaris.org  * Flat address space registers (outside the windows)
94*11717Sgdamore@opensolaris.org  */
95*11717Sgdamore@opensolaris.org 
96*11717Sgdamore@opensolaris.org #define	REG_TXPKTID		0x18	/* 90xB only */
97*11717Sgdamore@opensolaris.org #define	REG_TIMER		0x1a
98*11717Sgdamore@opensolaris.org #define	REG_TXSTATUS		0x1b
99*11717Sgdamore@opensolaris.org #define	TXSTATUS_RECLAIM_ERR	0x02
100*11717Sgdamore@opensolaris.org #define	TXSTATUS_STATUS_OFLOW	0x04	/* bad news! */
101*11717Sgdamore@opensolaris.org #define	TXSTATUS_MAXCOLLISIONS	0x08
102*11717Sgdamore@opensolaris.org #define	TXSTATUS_UNDERRUN	0x10
103*11717Sgdamore@opensolaris.org #define	TXSTATUS_JABBER		0x20
104*11717Sgdamore@opensolaris.org #define	TXSTATUS_INT_REQ	0x40
105*11717Sgdamore@opensolaris.org #define	TXSTATUS_COMPLETE	0x80
106*11717Sgdamore@opensolaris.org #define	TXSTATUS_ERRS		0x32
107*11717Sgdamore@opensolaris.org 
108*11717Sgdamore@opensolaris.org #define	REG_INTSTATUSAUTO	0x1e
109*11717Sgdamore@opensolaris.org #define	REG_DMACTRL		0x20
110*11717Sgdamore@opensolaris.org #define	DMACTRL_DNCMPLREQ	0x00000002
111*11717Sgdamore@opensolaris.org #define	DMACTRL_DNSTALLED	0x00000004
112*11717Sgdamore@opensolaris.org #define	DMACTRL_UPCOMPLETE	0x00000008
113*11717Sgdamore@opensolaris.org #define	DMACTRL_DNCOMPLETE	0x00000010
114*11717Sgdamore@opensolaris.org #define	DMACTRL_UPRXEAREN	0x00000020
115*11717Sgdamore@opensolaris.org #define	DMACTRL_ARNCNTDN	0x00000040
116*11717Sgdamore@opensolaris.org #define	DMACTRL_DNINPROG	0x00000080
117*11717Sgdamore@opensolaris.org #define	DMACTRL_CNTSPEED	0x00000100
118*11717Sgdamore@opensolaris.org #define	DMACTRL_CNTDNMODE	0x00000200
119*11717Sgdamore@opensolaris.org #define	DMACTRL_ALTSEQDIS	0x00010000
120*11717Sgdamore@opensolaris.org #define	DMACTRL_DEFEATMWI	0x00100000
121*11717Sgdamore@opensolaris.org #define	DMACTRL_DEFEATMRL	0x00200000
122*11717Sgdamore@opensolaris.org #define	DMACTRL_UPOVERDIS	0x00400000
123*11717Sgdamore@opensolaris.org #define	DMACTRL_TARGABORT	0x40000000
124*11717Sgdamore@opensolaris.org #define	DMACTRL_MSTRABORT	0x80000000
125*11717Sgdamore@opensolaris.org #define	REG_DNLISTPTR		0x24
126*11717Sgdamore@opensolaris.org #define	REG_DNBURSTTHRESH	0x2a	/* 90xB only */
127*11717Sgdamore@opensolaris.org #define	REG_DNPRIOTHRESH	0x2c	/* 90xB only */
128*11717Sgdamore@opensolaris.org #define	REG_DNPOLL		0x2d	/* 90xB only */
129*11717Sgdamore@opensolaris.org #define	REG_TXFREETHRESH	0x2f	/* 90x only */
130*11717Sgdamore@opensolaris.org #define	REG_UPPKTSTATUS		0x30
131*11717Sgdamore@opensolaris.org #define	REG_FREETIMER		0x34
132*11717Sgdamore@opensolaris.org #define	REG_COUNTDOWN		0x36
133*11717Sgdamore@opensolaris.org #define	REG_UPLISTPTR		0x38
134*11717Sgdamore@opensolaris.org #define	REG_UPPRIOTHRESH	0x3c	/* 90xB only */
135*11717Sgdamore@opensolaris.org #define	REG_UPPOLL		0x3d	/* 90xB only */
136*11717Sgdamore@opensolaris.org #define	REG_UPBURSTTHRESH	0x3e	/* 90xB only */
137*11717Sgdamore@opensolaris.org #define	REG_REALTIMECNT		0x40	/* 90xB only */
138*11717Sgdamore@opensolaris.org #define	REG_DNMAXBURST		0x78	/* 90xB only */
139*11717Sgdamore@opensolaris.org #define	REG_UPMAXBURST		0x7a	/* 90xB only */
140*11717Sgdamore@opensolaris.org 
141*11717Sgdamore@opensolaris.org /*
142*11717Sgdamore@opensolaris.org  * Window 0.  Eeprom access.
143*11717Sgdamore@opensolaris.org  */
144*11717Sgdamore@opensolaris.org #define	W0_MFG_ID		0x00
145*11717Sgdamore@opensolaris.org #define	W0_EE_CMD		0x0a
146*11717Sgdamore@opensolaris.org #define	EE_CMD_ADDR		0x001f
147*11717Sgdamore@opensolaris.org #define	EE_CMD_WRITE_EN		0x0000
148*11717Sgdamore@opensolaris.org #define	EE_CMD_READ		0x0080
149*11717Sgdamore@opensolaris.org #define	EE_CMD_READ8		0x0200
150*11717Sgdamore@opensolaris.org #define	EE_CMD_BUSY		0x8000
151*11717Sgdamore@opensolaris.org #define	W0_EE_DATA		0x0c
152*11717Sgdamore@opensolaris.org /*
153*11717Sgdamore@opensolaris.org  * Window 2.
154*11717Sgdamore@opensolaris.org  */
155*11717Sgdamore@opensolaris.org #define	W2_STATION_ADDRESS	0x00
156*11717Sgdamore@opensolaris.org #define	W2_STATION_MASK		0x06
157*11717Sgdamore@opensolaris.org #define	W2_RESET_OPTIONS	0x0c		/* Reset options (90xB only) */
158*11717Sgdamore@opensolaris.org #define	W2_RESET_OPT_LEDPOLAR	0x0010	/* invert LED polarity */
159*11717Sgdamore@opensolaris.org #define	W2_RESET_OPT_PHYPOWER	0x4000	/* turn on PHY power */
160*11717Sgdamore@opensolaris.org 
161*11717Sgdamore@opensolaris.org 
162*11717Sgdamore@opensolaris.org /*
163*11717Sgdamore@opensolaris.org  * Window 3.
164*11717Sgdamore@opensolaris.org  */
165*11717Sgdamore@opensolaris.org #define	W3_INTERNAL_CONFIG	0x00	/* 32 bits */
166*11717Sgdamore@opensolaris.org #define	W3_MAX_PKT_SIZE		0x04	/* 90xB only */
167*11717Sgdamore@opensolaris.org #define	W3_MAC_CONTROL		0x06
168*11717Sgdamore@opensolaris.org #define	MAC_CONTROL_FDX		0x0020
169*11717Sgdamore@opensolaris.org #define	MAC_CONTROL_ALLOW_LARGE	0x0040
170*11717Sgdamore@opensolaris.org #define	MAC_CONTROL_FLOW_EN	0x0100	/* 90xB only */
171*11717Sgdamore@opensolaris.org #define	MAC_CONTROL_VLT_EN	0x0200	/* 90xB only */
172*11717Sgdamore@opensolaris.org 
173*11717Sgdamore@opensolaris.org /*
174*11717Sgdamore@opensolaris.org  * This is reset options for the other cards, media options for
175*11717Sgdamore@opensolaris.org  * the 90xB NICs. Reset options are in a separate register for
176*11717Sgdamore@opensolaris.org  * the 90xB.
177*11717Sgdamore@opensolaris.org  *
178*11717Sgdamore@opensolaris.org  * Note that these bit values are also the same as the
179*11717Sgdamore@opensolaris.org  * W3_RESET_OPTIONS media selection bits on 90x NICs, which
180*11717Sgdamore@opensolaris.org  * conviently occupies the same register, and pretty much is
181*11717Sgdamore@opensolaris.org  * the same thing.  There are some differences in the upper bits,
182*11717Sgdamore@opensolaris.org  * but we don't care about those.
183*11717Sgdamore@opensolaris.org  */
184*11717Sgdamore@opensolaris.org #define	W3_MEDIAOPT		0x08
185*11717Sgdamore@opensolaris.org #define	MEDIAOPT_100T4		0x0001
186*11717Sgdamore@opensolaris.org #define	MEDIAOPT_100TX		0x0002
187*11717Sgdamore@opensolaris.org #define	MEDIAOPT_100FX		0x0004
188*11717Sgdamore@opensolaris.org #define	MEDIAOPT_10T		0x0008
189*11717Sgdamore@opensolaris.org #define	MEDIAOPT_BNC		0x0010
190*11717Sgdamore@opensolaris.org #define	MEDIAOPT_AUI		0x0020
191*11717Sgdamore@opensolaris.org #define	MEDIAOPT_MII		0x0040
192*11717Sgdamore@opensolaris.org #define	MEDIAOPT_10FL		0x0080
193*11717Sgdamore@opensolaris.org #define	MEDIAOPT_MASK		0x00ff	/* excludes 10BASEFL */
194*11717Sgdamore@opensolaris.org 
195*11717Sgdamore@opensolaris.org /*
196*11717Sgdamore@opensolaris.org  * Window 4 registers.
197*11717Sgdamore@opensolaris.org  */
198*11717Sgdamore@opensolaris.org #define	W4_MEDIASTAT		0xa
199*11717Sgdamore@opensolaris.org #define	MEDIASTAT_SQE_EN	0x0008
200*11717Sgdamore@opensolaris.org #define	MEDIASTAT_JABGUARD_EN	0x0040
201*11717Sgdamore@opensolaris.org #define	MEDIASTAT_LINKBEAT_EN	0x0080
202*11717Sgdamore@opensolaris.org #define	MEDIASTAT_LINKDETECT	0x0800
203*11717Sgdamore@opensolaris.org #define	MEDIASTAT_AUI_DIS	0x8000
204*11717Sgdamore@opensolaris.org 
205*11717Sgdamore@opensolaris.org /*
206*11717Sgdamore@opensolaris.org  * Window 4, offset 8 is defined for MII/PHY access for EtherLink XL
207*11717Sgdamore@opensolaris.org  * cards.
208*11717Sgdamore@opensolaris.org  */
209*11717Sgdamore@opensolaris.org #define	W4_PHYSMGMT		0x08
210*11717Sgdamore@opensolaris.org #define	PHYSMGMT_CLK		0x0001
211*11717Sgdamore@opensolaris.org #define	PHYSMGMT_DATA		0x0002
212*11717Sgdamore@opensolaris.org #define	PHYSMGMT_DIR		0x0004
213*11717Sgdamore@opensolaris.org 
214*11717Sgdamore@opensolaris.org /*
215*11717Sgdamore@opensolaris.org  * Counter in window 4 for packets with a bad start-of-stream delimiter/
216*11717Sgdamore@opensolaris.org  */
217*11717Sgdamore@opensolaris.org #define	W4_BADSSD		0x0c
218*11717Sgdamore@opensolaris.org 
219*11717Sgdamore@opensolaris.org /*
220*11717Sgdamore@opensolaris.org  * Upper bits of 20-bit byte counters.
221*11717Sgdamore@opensolaris.org  */
222*11717Sgdamore@opensolaris.org #define	W4_UBYTESOK		0x0d
223*11717Sgdamore@opensolaris.org 
224*11717Sgdamore@opensolaris.org /*
225*11717Sgdamore@opensolaris.org  * W6 registers, used for statistics
226*11717Sgdamore@opensolaris.org  */
227*11717Sgdamore@opensolaris.org #define	W6_TX_BYTES		0x0c
228*11717Sgdamore@opensolaris.org #define	W6_RX_BYTES		0x0a
229*11717Sgdamore@opensolaris.org #define	W6_UPPER_FRAMES		0x09
230*11717Sgdamore@opensolaris.org #define	W6_DEFER		0x08
231*11717Sgdamore@opensolaris.org #define	W6_RX_FRAMES		0x07
232*11717Sgdamore@opensolaris.org #define	W6_TX_FRAMES		0x06
233*11717Sgdamore@opensolaris.org #define	W6_RX_OVERRUNS		0x05
234*11717Sgdamore@opensolaris.org #define	W6_TX_LATE_COL		0x04
235*11717Sgdamore@opensolaris.org #define	W6_SINGLE_COL		0x03
236*11717Sgdamore@opensolaris.org #define	W6_MULT_COL		0x02
237*11717Sgdamore@opensolaris.org #define	W6_SQE_ERRORS		0x01
238*11717Sgdamore@opensolaris.org #define	W6_NO_CARRIER		0x00
239*11717Sgdamore@opensolaris.org 
240*11717Sgdamore@opensolaris.org /*
241*11717Sgdamore@opensolaris.org  * Receive filter bits for use with CMD_SET_FILTER.
242*11717Sgdamore@opensolaris.org  */
243*11717Sgdamore@opensolaris.org #define	FILTER_UNICAST		0x01
244*11717Sgdamore@opensolaris.org #define	FILTER_ALLMULTI		0x02
245*11717Sgdamore@opensolaris.org #define	FILTER_ALLBCAST		0x04
246*11717Sgdamore@opensolaris.org #define	FILTER_PROMISC		0x08
247*11717Sgdamore@opensolaris.org #define	FILTER_MULTIHASH	0x10	/* only on 90xB */
248*11717Sgdamore@opensolaris.org 
249*11717Sgdamore@opensolaris.org /*
250*11717Sgdamore@opensolaris.org  * Window 7 registers. These are different for 90x and 90xB than
251*11717Sgdamore@opensolaris.org  * for the EtherLink III / Fast EtherLink cards.
252*11717Sgdamore@opensolaris.org  */
253*11717Sgdamore@opensolaris.org 
254*11717Sgdamore@opensolaris.org #define	W7_VLANMASK	0x00	/* 90xB only */
255*11717Sgdamore@opensolaris.org #define	W7_VLANTYPE	0x04	/* 90xB only */
256*11717Sgdamore@opensolaris.org #define	W7_TIMER	0x0a	/* 90x only */
257*11717Sgdamore@opensolaris.org #define	W7_TX_STATUS	0x0b	/* 90x only */
258*11717Sgdamore@opensolaris.org #define	W7_POWEREVENT	0x0c	/* 90xB only */
259*11717Sgdamore@opensolaris.org #define	W7_INTSTATUS	0x0e
260*11717Sgdamore@opensolaris.org 
261*11717Sgdamore@opensolaris.org /*
262*11717Sgdamore@opensolaris.org  * The Internal Config register is different on 90xB cards. The
263*11717Sgdamore@opensolaris.org  * different masks / shifts are defined here.
264*11717Sgdamore@opensolaris.org  */
265*11717Sgdamore@opensolaris.org 
266*11717Sgdamore@opensolaris.org /*
267*11717Sgdamore@opensolaris.org  * Lower 16 bits.
268*11717Sgdamore@opensolaris.org  */
269*11717Sgdamore@opensolaris.org #define	CONFIG_TXLARGE		0x4000
270*11717Sgdamore@opensolaris.org #define	CONFIG_TXLARGE_SHIFT	14
271*11717Sgdamore@opensolaris.org 
272*11717Sgdamore@opensolaris.org #define	CONFIG_RXLARGE		0x8000
273*11717Sgdamore@opensolaris.org #define	CONFIG_RXLARGE_SHIFT	15
274*11717Sgdamore@opensolaris.org 
275*11717Sgdamore@opensolaris.org /*
276*11717Sgdamore@opensolaris.org  * Upper 16 bits.
277*11717Sgdamore@opensolaris.org  */
278*11717Sgdamore@opensolaris.org #define	XCVR_SEL_10T		0x00000000U
279*11717Sgdamore@opensolaris.org #define	XCVR_SEL_AUI		0x00100000U
280*11717Sgdamore@opensolaris.org #define	XCVR_SEL_BNC		0x00300000U
281*11717Sgdamore@opensolaris.org #define	XCVR_SEL_100TX		0x00400000U	/* 3com says don't use this! */
282*11717Sgdamore@opensolaris.org #define	XCVR_SEL_100FX		0x00500000U
283*11717Sgdamore@opensolaris.org #define	XCVR_SEL_MII		0x00600000U
284*11717Sgdamore@opensolaris.org #define	XCVR_SEL_AUTO		0x00800000U
285*11717Sgdamore@opensolaris.org #define	XCVR_SEL_MASK		0x00f00000U
286*11717Sgdamore@opensolaris.org 
287*11717Sgdamore@opensolaris.org #define	RAM_PARTITION_5_3	0x00000000U
288*11717Sgdamore@opensolaris.org #define	RAM_PARTITION_3_1	0x00010000U
289*11717Sgdamore@opensolaris.org #define	RAM_PARTITION_1_1	0x00020000U
290*11717Sgdamore@opensolaris.org #define	RAM_PARTITION_3_5	0x00030000U
291*11717Sgdamore@opensolaris.org #define	RAM_PARTITION_MASK	0x00030000U
292*11717Sgdamore@opensolaris.org 
293*11717Sgdamore@opensolaris.org #define	CONFIG_AUTOSEL		0x0100
294*11717Sgdamore@opensolaris.org #define	CONFIG_AUTOSEL_SHIFT	8
295*11717Sgdamore@opensolaris.org 
296*11717Sgdamore@opensolaris.org #define	CONFIG_DISABLEROM	0x0200
297*11717Sgdamore@opensolaris.org #define	CONFIG_DISABLEROM_SHIFT	9
298*11717Sgdamore@opensolaris.org 
299*11717Sgdamore@opensolaris.org /*
300*11717Sgdamore@opensolaris.org  * ID of internal PHY.
301*11717Sgdamore@opensolaris.org  */
302*11717Sgdamore@opensolaris.org 
303*11717Sgdamore@opensolaris.org #define	INTPHY_ID		24
304*11717Sgdamore@opensolaris.org 
305*11717Sgdamore@opensolaris.org /*
306*11717Sgdamore@opensolaris.org  * Fragment header as laid out in memory for DMA access.
307*11717Sgdamore@opensolaris.org  */
308*11717Sgdamore@opensolaris.org 
309*11717Sgdamore@opensolaris.org #define	EX_FR_LENMASK	0x00001fff	/* mask for length in fr_len field */
310*11717Sgdamore@opensolaris.org #define	EX_FR_LAST	0x80000000	/* indicates last fragment */
311*11717Sgdamore@opensolaris.org 
312*11717Sgdamore@opensolaris.org /*
313*11717Sgdamore@opensolaris.org  * 3Com NICs have separate structures for packet upload (receive) and
314*11717Sgdamore@opensolaris.org  * download (transmit) descriptors.  However, the structures for the
315*11717Sgdamore@opensolaris.org  * "legacy" transmit format are nearly identical except for the fact
316*11717Sgdamore@opensolaris.org  * that the third field is named differently and the bit fields are
317*11717Sgdamore@opensolaris.org  * different.  To maximize code reuse, we use a single type to cover
318*11717Sgdamore@opensolaris.org  * both uses.  Note that for receive we can arrange these in a loop,
319*11717Sgdamore@opensolaris.org  * but not for transmit.  Note also that for simplicity, we only use
320*11717Sgdamore@opensolaris.org  * the "type 0" legacy DPD format -- the features offered by the newer
321*11717Sgdamore@opensolaris.org  * type 1 format are not something we need.
322*11717Sgdamore@opensolaris.org  */
323*11717Sgdamore@opensolaris.org typedef struct ex_pd {
324*11717Sgdamore@opensolaris.org 	uint32_t	pd_link;
325*11717Sgdamore@opensolaris.org 	uint32_t	pd_shared;
326*11717Sgdamore@opensolaris.org 	uint32_t	pd_addr;
327*11717Sgdamore@opensolaris.org 	uint32_t	pd_len;
328*11717Sgdamore@opensolaris.org } ex_pd_t;
329*11717Sgdamore@opensolaris.org #define	pd_fsh		pd_shared
330*11717Sgdamore@opensolaris.org #define	pd_status	pd_shared
331*11717Sgdamore@opensolaris.org 
332*11717Sgdamore@opensolaris.org /*
333*11717Sgdamore@opensolaris.org  * Type 0 Download Packet Descriptor (DPD).  We don't use the other
334*11717Sgdamore@opensolaris.org  * type, since it isn't supported by older 90x ASICs.
335*11717Sgdamore@opensolaris.org  */
336*11717Sgdamore@opensolaris.org struct ex_dpd {
337*11717Sgdamore@opensolaris.org 	uint32_t dpd_nextptr;		/* prt to next fragheader */
338*11717Sgdamore@opensolaris.org 	uint32_t dpd_fsh;		/* frame start header */
339*11717Sgdamore@opensolaris.org 	uint32_t dpd_addr;
340*11717Sgdamore@opensolaris.org 	uint32_t dpd_len;
341*11717Sgdamore@opensolaris.org };
342*11717Sgdamore@opensolaris.org 
343*11717Sgdamore@opensolaris.org struct ex_upd {
344*11717Sgdamore@opensolaris.org 	uint32_t upd_nextptr;
345*11717Sgdamore@opensolaris.org 	uint32_t upd_pktstatus;
346*11717Sgdamore@opensolaris.org 	uint32_t upd_addr;	/* phys addr of frag */
347*11717Sgdamore@opensolaris.org 	uint32_t upd_len;	/* length of frag */
348*11717Sgdamore@opensolaris.org };
349*11717Sgdamore@opensolaris.org 
350*11717Sgdamore@opensolaris.org #define	DPD_DMADDR(s, t) \
351*11717Sgdamore@opensolaris.org 	((s)->sc_dpddma + ((char *)((t)->tx_dpd) - (char *)((s)->sc_dpd)))
352*11717Sgdamore@opensolaris.org 
353*11717Sgdamore@opensolaris.org /*
354*11717Sgdamore@opensolaris.org  * Frame Start Header bitfields.
355*11717Sgdamore@opensolaris.org  */
356*11717Sgdamore@opensolaris.org 
357*11717Sgdamore@opensolaris.org #define	EX_DPD_DNIND	0x80000000	/* intr on download done */
358*11717Sgdamore@opensolaris.org #define	EX_DPD_TXIND	0x00008000	/* intr on tx done */
359*11717Sgdamore@opensolaris.org #define	EX_DPD_NOCRC	0x00002000	/* no CRC append */
360*11717Sgdamore@opensolaris.org 
361*11717Sgdamore@opensolaris.org /*
362*11717Sgdamore@opensolaris.org  * Lower 12 bits are the tx length for the 90x family. The 90xB
363*11717Sgdamore@opensolaris.org  * assumes that the tx length is the sum of all frame lengths,
364*11717Sgdamore@opensolaris.org  * and uses the bits as below. It also defines some more bits in
365*11717Sgdamore@opensolaris.org  * the upper part.
366*11717Sgdamore@opensolaris.org  */
367*11717Sgdamore@opensolaris.org #define	EX_DPD_EMPTY	0x20000000	/* no data in this DPD */
368*11717Sgdamore@opensolaris.org #define	EX_DPD_UPDEFEAT	0x10000000	/* don't round tx lengths up */
369*11717Sgdamore@opensolaris.org #define	EX_DPD_UDPCKSUM	0x08000000	/* do hardware UDP checksum */
370*11717Sgdamore@opensolaris.org #define	EX_DPD_TCPCKSUM	0x04000000	/* do hardware TCP checksum */
371*11717Sgdamore@opensolaris.org #define	EX_DPD_IPCKSUM	0x02000000	/* do hardware IP checksum */
372*11717Sgdamore@opensolaris.org #define	EX_DPD_DNCMPLT	0x01000000	/* packet has been downloaded */
373*11717Sgdamore@opensolaris.org #define	EX_DPD_IDMASK	0x000003fc	/* mask for packet id */
374*11717Sgdamore@opensolaris.org #define	EX_DPD_IDSHIFT	2
375*11717Sgdamore@opensolaris.org #define	EX_DPD_RNDMASK	0x00000003	/* mask for rounding */
376*11717Sgdamore@opensolaris.org 					/* 0 -> dword, 2 -> word, 1,3 -> none */
377*11717Sgdamore@opensolaris.org /*
378*11717Sgdamore@opensolaris.org  * upd_pktstatus bitfields.
379*11717Sgdamore@opensolaris.org  * The *CKSUMERR fields are only valid if the matching *CHECKED field
380*11717Sgdamore@opensolaris.org  * is set.
381*11717Sgdamore@opensolaris.org  */
382*11717Sgdamore@opensolaris.org #define	EX_UPD_PKTLENMASK	0x00001fff	/* 12:0 -> packet length */
383*11717Sgdamore@opensolaris.org #define	EX_UPD_ERROR		0x00004000	/* rcv error */
384*11717Sgdamore@opensolaris.org #define	EX_UPD_COMPLETE		0x00008000	/* rcv complete */
385*11717Sgdamore@opensolaris.org #define	EX_UPD_OVERRUN		0x00010000	/* rcv overrun */
386*11717Sgdamore@opensolaris.org #define	EX_UPD_RUNT		0x00020000	/* pkt < 60 bytes */
387*11717Sgdamore@opensolaris.org #define	EX_UPD_ALIGNERR		0x00040000	/* alignment error */
388*11717Sgdamore@opensolaris.org #define	EX_UPD_CRCERR		0x00080000	/* CRC error */
389*11717Sgdamore@opensolaris.org #define	EX_UPD_OVERSIZED	0x00100000	/* oversize frame */
390*11717Sgdamore@opensolaris.org #define	EX_UPD_DRIBBLEBITS	0x00800000	/* pkt had dribble bits */
391*11717Sgdamore@opensolaris.org #define	EX_UPD_OVERFLOW		0x01000000	/* insufficient space for pkt */
392*11717Sgdamore@opensolaris.org #define	EX_UPD_IPCKSUMERR	0x02000000	/* IP cksum error (90xB) */
393*11717Sgdamore@opensolaris.org #define	EX_UPD_TCPCKSUMERR	0x04000000	/* TCP cksum error (90xB) */
394*11717Sgdamore@opensolaris.org #define	EX_UPD_UDPCKSUMERR	0x08000000	/* UDP cksum error (90xB) */
395*11717Sgdamore@opensolaris.org #define	EX_UPD_IPCHECKED	0x20000000	/* IP cksum done */
396*11717Sgdamore@opensolaris.org #define	EX_UPD_TCPCHECKED	0x40000000	/* TCP cksum done */
397*11717Sgdamore@opensolaris.org #define	EX_UPD_UDPCHECKED	0x80000000	/* UDP cksum done */
398*11717Sgdamore@opensolaris.org 
399*11717Sgdamore@opensolaris.org #define	EX_UPD_ERR		0x001f4000	/* Errors we check for */
400*11717Sgdamore@opensolaris.org #define	EX_UPD_ERR_VLAN		0x000f0000	/* same for 802.1q */
401*11717Sgdamore@opensolaris.org 
402*11717Sgdamore@opensolaris.org #define	EX_UPD_CKSUMERR		0x0e000000	/* any IP checksum error */
403*11717Sgdamore@opensolaris.org 
404*11717Sgdamore@opensolaris.org /*
405*11717Sgdamore@opensolaris.org  * EEPROM offsets.  These are 16-bit word addresses.  There are a lot of
406*11717Sgdamore@opensolaris.org  * other things in here, but we only care about the OEM address.
407*11717Sgdamore@opensolaris.org  */
408*11717Sgdamore@opensolaris.org #define	EE_3COM_ADDR_0		0x00
409*11717Sgdamore@opensolaris.org #define	EE_3COM_ADDR_1		0x01
410*11717Sgdamore@opensolaris.org #define	EE_3COM_ADDR_2		0x02
411*11717Sgdamore@opensolaris.org #define	EE_OEM_ADDR_0		0x0a
412*11717Sgdamore@opensolaris.org #define	EE_OEM_ADDR_1		0x0b
413*11717Sgdamore@opensolaris.org #define	EE_OEM_ADDR_2		0x0c
414*11717Sgdamore@opensolaris.org #define	EE_CAPABILITIES		0x10
415*11717Sgdamore@opensolaris.org 
416*11717Sgdamore@opensolaris.org #define	EX_NTX		256
417*11717Sgdamore@opensolaris.org #define	EX_NRX		128
418*11717Sgdamore@opensolaris.org #define	EX_BUFSZ	1536
419*11717Sgdamore@opensolaris.org 
420*11717Sgdamore@opensolaris.org typedef struct ex_desc {
421*11717Sgdamore@opensolaris.org 	struct ex_desc		*ed_next;
422*11717Sgdamore@opensolaris.org 	struct ex_desc		*ed_prev;
423*11717Sgdamore@opensolaris.org 	ddi_dma_handle_t	ed_dmah;
424*11717Sgdamore@opensolaris.org 	ddi_acc_handle_t	ed_acch;
425*11717Sgdamore@opensolaris.org 	caddr_t			ed_buf;
426*11717Sgdamore@opensolaris.org 	uint32_t		ed_bufaddr;
427*11717Sgdamore@opensolaris.org 	uint32_t		ed_descaddr;
428*11717Sgdamore@opensolaris.org 	uint32_t		ed_off;		/* offset of pd */
429*11717Sgdamore@opensolaris.org 	ex_pd_t			*ed_pd;
430*11717Sgdamore@opensolaris.org } ex_desc_t;
431*11717Sgdamore@opensolaris.org 
432*11717Sgdamore@opensolaris.org typedef struct ex_ring {
433*11717Sgdamore@opensolaris.org 	int			r_count;
434*11717Sgdamore@opensolaris.org 	int			r_avail;
435*11717Sgdamore@opensolaris.org 	ddi_dma_handle_t	r_dmah;
436*11717Sgdamore@opensolaris.org 	ddi_acc_handle_t	r_acch;
437*11717Sgdamore@opensolaris.org 	uint32_t		r_paddr;
438*11717Sgdamore@opensolaris.org 	ex_pd_t			*r_pd;
439*11717Sgdamore@opensolaris.org 	ex_desc_t		*r_desc;
440*11717Sgdamore@opensolaris.org 	ex_desc_t		*r_head;
441*11717Sgdamore@opensolaris.org 	ex_desc_t		*r_tail;
442*11717Sgdamore@opensolaris.org } ex_ring_t;
443*11717Sgdamore@opensolaris.org 
444*11717Sgdamore@opensolaris.org /*
445*11717Sgdamore@opensolaris.org  * Higher level linked list of upload packet descriptors.
446*11717Sgdamore@opensolaris.org  */
447*11717Sgdamore@opensolaris.org struct ex_rxdesc {
448*11717Sgdamore@opensolaris.org 	ddi_dma_handle_t	rx_dmah;
449*11717Sgdamore@opensolaris.org 	ddi_acc_handle_t	rx_acch;
450*11717Sgdamore@opensolaris.org 	caddr_t			rx_buf;
451*11717Sgdamore@opensolaris.org 	uint32_t		rx_paddr;
452*11717Sgdamore@opensolaris.org 	struct ex_upd		*rx_upd;
453*11717Sgdamore@opensolaris.org };
454*11717Sgdamore@opensolaris.org 
455*11717Sgdamore@opensolaris.org /*
456*11717Sgdamore@opensolaris.org  * Ethernet software status per interface.
457*11717Sgdamore@opensolaris.org  */
458*11717Sgdamore@opensolaris.org typedef struct ex_softc {
459*11717Sgdamore@opensolaris.org 	dev_info_t		*ex_dip;
460*11717Sgdamore@opensolaris.org 	mac_handle_t		ex_mach;
461*11717Sgdamore@opensolaris.org 	mii_handle_t		ex_miih;
462*11717Sgdamore@opensolaris.org 	ddi_periodic_t		ex_linkcheck;
463*11717Sgdamore@opensolaris.org 
464*11717Sgdamore@opensolaris.org 	ddi_acc_handle_t	ex_pcih;
465*11717Sgdamore@opensolaris.org 	ddi_acc_handle_t	ex_regsh;
466*11717Sgdamore@opensolaris.org 	caddr_t			ex_regsva;
467*11717Sgdamore@opensolaris.org 
468*11717Sgdamore@opensolaris.org 	kmutex_t		ex_txlock;
469*11717Sgdamore@opensolaris.org 	kmutex_t		ex_intrlock;
470*11717Sgdamore@opensolaris.org 
471*11717Sgdamore@opensolaris.org 	ddi_intr_handle_t	ex_intrh;
472*11717Sgdamore@opensolaris.org 
473*11717Sgdamore@opensolaris.org 	uint8_t			ex_curraddr[6];
474*11717Sgdamore@opensolaris.org 	uint8_t			ex_factaddr[6];
475*11717Sgdamore@opensolaris.org 	boolean_t		ex_promisc;
476*11717Sgdamore@opensolaris.org 	unsigned		ex_mccount;
477*11717Sgdamore@opensolaris.org 
478*11717Sgdamore@opensolaris.org 	boolean_t		ex_running;
479*11717Sgdamore@opensolaris.org 	boolean_t		ex_suspended;
480*11717Sgdamore@opensolaris.org 
481*11717Sgdamore@opensolaris.org 	ex_ring_t		ex_rxring;
482*11717Sgdamore@opensolaris.org 	ex_ring_t		ex_txring;
483*11717Sgdamore@opensolaris.org 
484*11717Sgdamore@opensolaris.org 	uint32_t		ex_xcvr;
485*11717Sgdamore@opensolaris.org 	uint32_t		ex_speed;
486*11717Sgdamore@opensolaris.org 	link_duplex_t		ex_duplex;
487*11717Sgdamore@opensolaris.org 	boolean_t		ex_fdx;
488*11717Sgdamore@opensolaris.org 	link_state_t		ex_link;
489*11717Sgdamore@opensolaris.org 	boolean_t		ex_mii_active;
490*11717Sgdamore@opensolaris.org 	uint32_t		ex_mediaopt;
491*11717Sgdamore@opensolaris.org 	char			ex_medias[128];
492*11717Sgdamore@opensolaris.org 	uint16_t		ex_capab;
493*11717Sgdamore@opensolaris.org 
494*11717Sgdamore@opensolaris.org 	/*
495*11717Sgdamore@opensolaris.org 	 * Kstats.
496*11717Sgdamore@opensolaris.org 	 */
497*11717Sgdamore@opensolaris.org 	uint64_t		ex_ipackets;
498*11717Sgdamore@opensolaris.org 	uint64_t		ex_opackets;
499*11717Sgdamore@opensolaris.org 	uint64_t		ex_ibytes;
500*11717Sgdamore@opensolaris.org 	uint64_t		ex_obytes;
501*11717Sgdamore@opensolaris.org 	uint64_t		ex_brdcstrcv;
502*11717Sgdamore@opensolaris.org 	uint64_t		ex_multircv;
503*11717Sgdamore@opensolaris.org 	uint64_t		ex_brdcstxmt;
504*11717Sgdamore@opensolaris.org 	uint64_t		ex_multixmt;
505*11717Sgdamore@opensolaris.org 	unsigned		ex_toolong;
506*11717Sgdamore@opensolaris.org 	unsigned		ex_runt;
507*11717Sgdamore@opensolaris.org 	unsigned		ex_oflo;
508*11717Sgdamore@opensolaris.org 	unsigned		ex_fcs;
509*11717Sgdamore@opensolaris.org 	unsigned		ex_align;
510*11717Sgdamore@opensolaris.org 	unsigned		ex_allocbfail;
511*11717Sgdamore@opensolaris.org 	unsigned		ex_txerr;
512*11717Sgdamore@opensolaris.org 	unsigned		ex_uflo;
513*11717Sgdamore@opensolaris.org 	unsigned		ex_jabber;
514*11717Sgdamore@opensolaris.org 	unsigned		ex_excoll;
515*11717Sgdamore@opensolaris.org 	unsigned		ex_sqe;
516*11717Sgdamore@opensolaris.org 	unsigned		ex_nocarrier;
517*11717Sgdamore@opensolaris.org 	unsigned		ex_multcol;
518*11717Sgdamore@opensolaris.org 	unsigned		ex_defer;
519*11717Sgdamore@opensolaris.org 	unsigned		ex_latecol;
520*11717Sgdamore@opensolaris.org 	unsigned		ex_singlecol;
521*11717Sgdamore@opensolaris.org 
522*11717Sgdamore@opensolaris.org 	uint_t			ex_conf;	/* config flags */
523*11717Sgdamore@opensolaris.org 
524*11717Sgdamore@opensolaris.org #define	CONF_INTPHY		0x0001	/* has internal PHY at address 24 */
525*11717Sgdamore@opensolaris.org #define	CONF_90XB		0x0002	/* is 90xB */
526*11717Sgdamore@opensolaris.org 
527*11717Sgdamore@opensolaris.org } elxl_t;
528*11717Sgdamore@opensolaris.org 
529*11717Sgdamore@opensolaris.org #define	WAIT_CMD(sc) \
530*11717Sgdamore@opensolaris.org 	{ \
531*11717Sgdamore@opensolaris.org 		int stat; \
532*11717Sgdamore@opensolaris.org 		do { \
533*11717Sgdamore@opensolaris.org 			stat = GET16(REG_CMD_STAT); \
534*11717Sgdamore@opensolaris.org 		} while ((stat & STAT_CMD_IN_PROGRESS) && (stat != 0xffff)); \
535*11717Sgdamore@opensolaris.org 	}
536*11717Sgdamore@opensolaris.org 
537*11717Sgdamore@opensolaris.org #define	GET8(off)	\
538*11717Sgdamore@opensolaris.org 	ddi_get8(sc->ex_regsh, (void *)(sc->ex_regsva + (off)))
539*11717Sgdamore@opensolaris.org #define	GET16(off)	\
540*11717Sgdamore@opensolaris.org 	ddi_get16(sc->ex_regsh, (void *)(sc->ex_regsva + (off)))
541*11717Sgdamore@opensolaris.org #define	GET32(off)	\
542*11717Sgdamore@opensolaris.org 	ddi_get32(sc->ex_regsh, (void *)(sc->ex_regsva + (off)))
543*11717Sgdamore@opensolaris.org #define	PUT8(off, val)	\
544*11717Sgdamore@opensolaris.org 	ddi_put8(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val)
545*11717Sgdamore@opensolaris.org #define	PUT16(off, val)	\
546*11717Sgdamore@opensolaris.org 	ddi_put16(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val)
547*11717Sgdamore@opensolaris.org #define	PUT32(off, val)	\
548*11717Sgdamore@opensolaris.org 	ddi_put32(sc->ex_regsh, (void *)(sc->ex_regsva + (off)), val)
549*11717Sgdamore@opensolaris.org 
550*11717Sgdamore@opensolaris.org #define	SET16(off, val)	PUT16(off, GET16(off) | val)
551*11717Sgdamore@opensolaris.org #define	CLR16(off, val)	PUT16(off, GET16(off) & ~(val))
552*11717Sgdamore@opensolaris.org 
553*11717Sgdamore@opensolaris.org #define	PUT_CMD(x)	PUT16(REG_CMD_STAT, (x))
554*11717Sgdamore@opensolaris.org #define	SET_WIN(x)	PUT16(REG_CMD_STAT, CMD_SELECT_WINDOW | (x))
555*11717Sgdamore@opensolaris.org 
556*11717Sgdamore@opensolaris.org #define	PUT_PD(ring, member, val)	ddi_put32(ring->r_acch, &member, (val))
557*11717Sgdamore@opensolaris.org #define	GET_PD(ring, member)		ddi_get32(ring->r_acch, &member)
558*11717Sgdamore@opensolaris.org 
559*11717Sgdamore@opensolaris.org #endif	/* ELXL_H */
560