summaryrefslogtreecommitdiff
path: root/sys/arch/sparc/dev/bereg.h
blob: 01d33f0f46a3919ae888291d0f27594369f24636 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
/*	$OpenBSD: bereg.h,v 1.12 2003/06/02 18:40:59 jason Exp $	*/

/*
 * Copyright (c) 1998 Theo de Raadt and Jason L. Wright.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * BE Global registers
 */
struct be_bregs {
	volatile u_int32_t xif_cfg;		/* XIF config */
	volatile u_int32_t _unused[63];		/* reserved */
	volatile u_int32_t stat;		/* status, clear on read */
	volatile u_int32_t imask;		/* interrupt mask */
	volatile u_int32_t _unused2[64];	/* reserved */
	volatile u_int32_t tx_swreset;		/* tx software reset */
	volatile u_int32_t tx_cfg;		/* tx config */
	volatile u_int32_t ipkt_gap1;		/* inter-packet gap 1 */
	volatile u_int32_t ipkt_gap2;		/* inter-packet gap 2 */
	volatile u_int32_t attempt_limit;	/* tx attempt limit */
	volatile u_int32_t stime;		/* tx slot time */
	volatile u_int32_t preamble_len;	/* size of tx preamble */
	volatile u_int32_t preamble_pattern;	/* pattern for tx preamble */
	volatile u_int32_t tx_sframe_delim;	/* tx delimiter */
	volatile u_int32_t jsize;		/* jam length */
	volatile u_int32_t tx_pkt_max;		/* tx max pkt size */
	volatile u_int32_t tx_pkt_min;		/* tx min pkt size */
	volatile u_int32_t peak_attempt;	/* count of tx peak attempts */
	volatile u_int32_t dt_ctr;		/* tx defer timer */
	volatile u_int32_t nc_ctr;		/* tx normal collision cntr */
	volatile u_int32_t fc_ctr;		/* tx first-collision cntr */
	volatile u_int32_t ex_ctr;		/* tx excess-collision cntr */
	volatile u_int32_t lt_ctr;		/* tx late-collision cntr */
	volatile u_int32_t rand_seed;		/* tx random number seed */
	volatile u_int32_t tx_smachine;		/* tx state machine */
	volatile u_int32_t _unused3[44];	/* reserved */
	volatile u_int32_t rx_swreset;		/* rx software reset */
	volatile u_int32_t rx_cfg;		/* rx config register */
	volatile u_int32_t rx_pkt_max;		/* rx max pkt size */
	volatile u_int32_t rx_pkt_min;		/* rx min pkt size */
	volatile u_int32_t mac_addr2;		/* ethernet address 2 (MSB) */
	volatile u_int32_t mac_addr1;		/* ethernet address 1 */
	volatile u_int32_t mac_addr0;		/* ethernet address 0 (LSB) */
	volatile u_int32_t fr_ctr;		/* rx frame receive cntr */
	volatile u_int32_t gle_ctr;		/* rx giant-len error cntr */
	volatile u_int32_t unale_ctr;		/* rx unaligned error cntr */
	volatile u_int32_t rcrce_ctr;		/* rx CRC error cntr */
	volatile u_int32_t rx_smachine;		/* rx state machine */
	volatile u_int32_t rx_cvalid;		/* rx code violation */
	volatile u_int32_t _unused4;		/* reserved */
	volatile u_int32_t htable3;		/* hash table 3 */
	volatile u_int32_t htable2;		/* hash table 2 */
	volatile u_int32_t htable1;		/* hash table 1 */
	volatile u_int32_t htable0;		/* hash table 0 */
	volatile u_int32_t afilter2;		/* address filter 2 */
	volatile u_int32_t afilter1;		/* address filter 1 */
	volatile u_int32_t afilter0;		/* address filter 0 */
	volatile u_int32_t afilter_mask;	/* address filter mask */
};

/* be_bregs.xif_cfg: XIF config. */
#define BE_BR_XCFG_ODENABLE	0x00000001	/* output driver enable */
#define BE_BR_XCFG_RESV		0x00000002	/* reserved, write as 1 */
#define BE_BR_XCFG_MLBACK	0x00000004	/* loopback-mode mii enable */
#define BE_BR_XCFG_SMODE	0x00000008	/* enable serial mode */

/* be_bregs.stat: status, clear on read. */
#define BE_BR_STAT_GOTFRAME	0x00000001	/* received a frame */
#define BE_BR_STAT_RCNTEXP	0x00000002	/* rx frame cntr expired */
#define BE_BR_STAT_ACNTEXP	0x00000004	/* align-error cntr expired */
#define BE_BR_STAT_CCNTEXP	0x00000008	/* crc-error cntr expired */
#define BE_BR_STAT_LCNTEXP	0x00000010	/* length-error cntr expired */
#define BE_BR_STAT_RFIFOVF	0x00000020	/* rx fifo overflow */
#define BE_BR_STAT_CVCNTEXP	0x00000040	/* code-violation cntr exprd */
#define BE_BR_STAT_SENTFRAME	0x00000100	/* transmitted a frame */
#define BE_BR_STAT_TFIFO_UND	0x00000200	/* tx fifo underrun */
#define BE_BR_STAT_MAXPKTERR	0x00000400	/* max-packet size error */
#define BE_BR_STAT_NCNTEXP	0x00000800	/* normal-collision cntr exp */
#define BE_BR_STAT_ECNTEXP	0x00001000	/* excess-collision cntr exp */
#define BE_BR_STAT_LCCNTEXP	0x00002000	/* late-collision cntr exp */
#define BE_BR_STAT_FCNTEXP	0x00004000	/* first-collision cntr exp */
#define BE_BR_STAT_DTIMEXP	0x00008000	/* defer-timer expired */

#define BE_BR_STAT_BITS		"\20\1RX\2RCNT\3ACNT\4CCNT\5LCNT\6RFIFO\7CVCNT\11TX\12TFIFO\13TMAXPKT\14NCNT\15ECNT\16LCCNT\17ECNT\20DTIME"

/* be_bregs.imask: interrupt mask. */
#define BE_BR_IMASK_GOTFRAME	0x00000001	/* received a frame */
#define BE_BR_IMASK_RCNTEXP	0x00000002	/* rx frame cntr expired */
#define BE_BR_IMASK_ACNTEXP	0x00000004	/* align-error cntr expired */
#define BE_BR_IMASK_CCNTEXP	0x00000008	/* crc-error cntr expired */
#define BE_BR_IMASK_LCNTEXP	0x00000010	/* length-error cntr expired */
#define BE_BR_IMASK_RFIFOVF	0x00000020	/* rx fifo overflow */
#define BE_BR_IMASK_CVCNTEXP	0x00000040	/* code-violation cntr exprd */
#define BE_BR_IMASK_SENTFRAME	0x00000100	/* transmitted a frame */
#define BE_BR_IMASK_TFIFO_UND	0x00000200	/* tx fifo underrun */
#define BE_BR_IMASK_MAXPKTERR	0x00000400	/* max-packet size error */
#define BE_BR_IMASK_NCNTEXP	0x00000800	/* normal-collision cntr exp */
#define BE_BR_IMASK_ECNTEXP	0x00001000	/* excess-collision cntr exp */
#define BE_BR_IMASK_LCCNTEXP	0x00002000	/* late-collision cntr exp */
#define BE_BR_IMASK_FCNTEXP	0x00004000	/* first-collision cntr exp */
#define BE_BR_IMASK_DTIMEXP	0x00008000	/* defer-timer expired */

/* be_bregs.tx_cfg: tx config. */
#define BE_BR_TXCFG_ENABLE	0x00000001	/* enable the transmitter */
#define BE_BR_TXCFG_FIFO	0x00000010	/* default tx fthresh */
#define BE_BR_TXCFG_SMODE	0x00000020	/* enable slow transmit mode */
#define BE_BR_TXCFG_CIGN	0x00000040	/* ignore tx collisions */
#define BE_BR_TXCFG_FCSOFF	0x00000080	/* do not emit fcs */
#define BE_BR_TXCFG_DBACKOFF	0x00000100	/* disable backoff */
#define BE_BR_TXCFG_FULLDPLX	0x00000200	/* enable full-duplex */

/* be_bregs.rx_cfg: rx config. */
#define BE_BR_RXCFG_ENABLE	0x00000001	/* enable the receiver */
#define BE_BR_RXCFG_FIFO	0x0000000e	/* default rx fthresh */
#define BE_BR_RXCFG_PSTRIP	0x00000020	/* pad byte strip enable */
#define BE_BR_RXCFG_PMISC	0x00000040	/* enable promiscous mode */
#define BE_BR_RXCFG_DERR	0x00000080	/* disable error checking */
#define BE_BR_RXCFG_DCRCS	0x00000100	/* disable crc stripping */
#define BE_BR_RXCFG_ME		0x00000200	/* receive packets for me */
#define BE_BR_RXCFG_PGRP	0x00000400	/* enable promisc group mode */
#define BE_BR_RXCFG_HENABLE	0x00000800	/* enable hash filter */
#define BE_BR_RXCFG_AENABLE	0x00001000	/* enable address filter */

/*
 * BE Channel registers
 */
struct be_cregs {
	volatile u_int32_t ctrl;		/* control */
	volatile u_int32_t stat;		/* status */
	volatile u_int32_t rxds;		/* rx descriptor ring ptr */
	volatile u_int32_t txds;		/* tx descriptor ring ptr */
	volatile u_int32_t rimask;		/* rx interrupt mask */
	volatile u_int32_t timask;		/* tx interrupt mask */
	volatile u_int32_t qmask;		/* qec error interrupt mask */
	volatile u_int32_t bmask;		/* be error interrupt mask */
	volatile u_int32_t rxwbufptr;		/* local memory rx write ptr */
	volatile u_int32_t rxrbufptr;		/* local memory rx read ptr */
	volatile u_int32_t txwbufptr;		/* local memory tx write ptr */
	volatile u_int32_t txrbufptr;		/* local memory tx read ptr */
	volatile u_int32_t ccnt;		/* collision counter */
};

/* be_cregs.ctrl: control. */
#define	BE_CR_CTRL_TWAKEUP	0x00000001	/* tx dma wakeup */

/* be_cregs.stat: status. */
#define BE_CR_STAT_BERROR	0x80000000	/* be error */
#define BE_CR_STAT_TXIRQ	0x00200000	/* tx interrupt */
#define BE_CR_STAT_TXDERR	0x00080000	/* tx descriptor is bad */
#define BE_CR_STAT_TXLERR	0x00040000	/* tx late error */
#define BE_CR_STAT_TXPERR	0x00020000	/* tx parity error */
#define BE_CR_STAT_TXSERR	0x00010000	/* tx sbus error ack */
#define BE_CR_STAT_RXIRQ	0x00000020	/* rx interrupt */
#define BE_CR_STAT_RXDROP	0x00000010	/* rx packet dropped */
#define BE_CR_STAT_RXSMALL	0x00000008	/* rx buffer too small */
#define BE_CR_STAT_RXLERR	0x00000004	/* rx late error */
#define BE_CR_STAT_RXPERR	0x00000002	/* rx parity error */
#define BE_CR_STAT_RXSERR	0x00000001	/* rx sbus error ack */

/*
 * All bits except rxirq/txirq
 */
#define	BE_CR_STAT_ERRORS	\
			(BE_CR_STAT_BERROR |				\
			 BE_CR_STAT_TXDERR | BE_CR_STAT_TXLERR |	\
			 BE_CR_STAT_TXPERR | BE_CR_STAT_TXSERR |	\
			 BE_CR_STAT_RXDROP | BE_CR_STAT_RXSMALL |	\
			 BE_CR_STAT_RXLERR | BE_CR_STAT_RXPERR |	\
			 BE_CR_STAT_RXSERR)

#define	BE_CR_STAT_BITS		\
    "\20\1RXS\2RXP\3RXL\4RXSMALL\5RXDROP\6RX\21TXS\22TXP\23TXL\24TXD\26TX\40BE"

/* be_cregs.qmask: qec error interrupt mask. */
#define BE_CR_QMASK_TXDERR	0x00080000	/* tx descriptor is bad */
#define BE_CR_QMASK_TXLERR	0x00040000	/* tx late error */
#define BE_CR_QMASK_TXPERR	0x00020000	/* tx parity error */
#define BE_CR_QMASK_TXSERR	0x00010000	/* tx sbus error ack */
#define BE_CR_QMASK_RXDROP	0x00000010	/* rx packet dropped */
#define BE_CR_QMASK_RXSMALL	0x00000008	/* rx buffer too small */
#define BE_CR_QMASK_RXLERR	0x00000004	/* rx late error */
#define BE_CR_QMASK_RXPERR	0x00000002	/* rx parity error */
#define BE_CR_QMASK_RXSERR	0x00000001	/* rx sbus error ack */

/*
 * BE Transceiver registers
 */
struct be_tregs {
	volatile u_int32_t	tcvr_pal;	/* transceiver pal */
	volatile u_int32_t	mgmt_pal;	/* management pal */
};

/* be_tregs.tcvr_pal: transceiver pal */
#define	TCVR_PAL_SERIAL		0x00000001	/* serial mode enable */
#define TCVR_PAL_EXTLBACK	0x00000002	/* external loopback */
#define TCVR_PAL_MSENSE		0x00000004	/* media sense */
#define TCVR_PAL_LTENABLE	0x00000008	/* link test enable */
#define TCVR_PAL_LTSTATUS	0x00000010	/* link test status: p1 only */

/* be_tregs.mgmt_pal: management pal */
#define MGMT_PAL_DCLOCK		0x00000001	/* data clock strobe */
#define MGMT_PAL_OENAB		0x00000002	/* output enable */
#define MGMT_PAL_MDIO		0x00000004	/* MDIO data/attached */
#define MGMT_PAL_EXT_MDIO	MGMT_PAL_MDIO	/* external mdio */
#define MGMT_PAL_TIMEO		0x00000008	/* tx enable timeout error */
#define MGMT_PAL_INT_MDIO	MGMT_PAL_TIMEO	/* internal mdio */

/*
 * BE receive descriptor
 */
struct be_rxd {
	volatile u_int32_t rx_flags;		/* rx descriptor flags */
	volatile u_int32_t rx_addr;		/* rx buffer address */
};

#define BE_RXD_OWN		0x80000000	/* ownership: 1=hw, 0=sw */
#define BE_RXD_UPDATE		0x10000000	/* being updated? */
#define BE_RXD_LENGTH		0x00001fff	/* packet length */

/*
 * BE transmit descriptor
 */
struct be_txd {
	volatile u_int32_t tx_flags;		/* tx descriptor flags */
	volatile u_int32_t tx_addr;		/* tx buffer address */
};

#define BE_TXD_OWN		0x80000000	/* ownership: 1=hw, 0=sw */
#define BE_TXD_SOP		0x40000000	/* start of packet marker */
#define BE_TXD_EOP		0x20000000	/* end of packet marker */
#define BE_TXD_UPDATE		0x10000000	/* being updated? */
#define BE_TXD_LENGTH		0x00001fff	/* packet length */

/* Buffer and Ring sizes: fixed ring size */
#define BE_TX_RING_MAXSIZE	256		/* maximum tx ring size */
#define BE_RX_RING_MAXSIZE	256		/* maximum rx ring size */
#define BE_TX_RING_SIZE		32		/* power of 2, <= MAXSIZE */
#define BE_RX_RING_SIZE		32		/* power of 2, <= MAXSIZE */
#define BE_PKT_BUF_SZ		2048
#define	BE_TX_HIGH_WATER	27		/* enable tx interrupt */
#define	BE_TX_LOW_WATER		5		/* disable tx interrupt */

#define	BE_TX_RING_MAXMASK	(BE_TX_RING_MAXSIZE-1)
#define	BE_RX_RING_MAXMASK	(BE_RX_RING_MAXSIZE-1)
#define	BE_TX_RING_MASK		(BE_TX_RING_SIZE-1)
#define	BE_RX_RING_MASK		(BE_RX_RING_SIZE-1)

/*
 * BE descriptor rings
 */
struct be_desc {
	struct be_rxd be_rxd[BE_RX_RING_MAXSIZE];
	struct be_txd be_txd[BE_TX_RING_MAXSIZE];
};

/*
 * BE packet buffers
 */
struct be_bufs {
	char	rx_buf[BE_RX_RING_SIZE][BE_PKT_BUF_SZ];
	char	tx_buf[BE_TX_RING_SIZE][BE_PKT_BUF_SZ];
};

#define	MC_POLY_BE		0x04c11db7UL	/* mcast crc, big endian */
#define	MC_POLY_LE		0xedb88320UL	/* mcast crc, little endian */

/* PHY addresses */
#define BE_PHY_EXTERNAL		0
#define BE_PHY_INTERNAL		1

/* Transceiver types */
#define BE_TCVR_NONE		0
#define BE_TCVR_INTERNAL	1
#define BE_TCVR_EXTERNAL	2

#define BE_TCVR_READ_INVALID	0xff000000

#define BE_NEGOTIATE_MAXTICKS	16

#define PHY_BMCR		0x00	/* Basic Mode Control Register */
#define PHY_BMSR		0x01	/* Basic Mode Status Register */

/*
 * Basic Mode Control Register (BMCR)
 */
#define PHY_BMCR_RESET		0x8000	/* Software reset		*/
#define PHY_BMCR_LOOPBACK	0x4000	/* Lookback enable		*/
#define PHY_BMCR_SPEED		0x2000	/* 1=100Mb, 0=10Mb		*/
#define PHY_BMCR_ANE		0x1000	/* Auto-Negiation enable	*/
#define PHY_BMCR_PDOWN		0x0800	/* power down the chip		*/
#define PHY_BMCR_ISOLATE	0x0400	/* Isolate the chip		*/
#define PHY_BMCR_RAN		0x0200	/* Restart autonegotiation	*/
#define PHY_BMCR_DUPLEX		0x0100	/* 1=full, 0=half		*/
#define PHY_BMCR_COLLISONTEST	0x0080	/* Create collisions on TX	*/

/*
 * Basic Mode Status Register (BMSR)
 */
#define PHY_BMSR_100BASET4	0x8000	/* 100BaseT4 capable?		*/
#define PHY_BMSR_100BASETX_FULL	0x4000	/* 100BaseTX full duplex cap?	*/
#define PHY_BMSR_100BASETX_HALF	0x2000	/* 100BaseTX half duplex cap?	*/
#define PHY_BMSR_10BASET_FULL	0x1000	/* 10BaseT full duplex cap?	*/
#define PHY_BMSR_10BASET_HALF	0x0800	/* 10BaseT half duplex cap?	*/
#define PHY_BMSR_ANCOMPLETE	0x0020	/* auto-negotiation complete?	*/
#define PHY_BMSR_REMOTEFAULT	0x0010	/* Fault condition seen?	*/
#define PHY_BMSR_ANC		0x0008	/* Can auto-negotiate?		*/
#define PHY_BMSR_LINKSTATUS	0x0004	/* Link established?		*/
#define PHY_BMSR_JABBER		0x0002	/* Jabber detected?		*/
#define PHY_BMSR_EXTENDED	0x0001	/* Extended registers?		*/