xref: /dflybsd-src/sys/dev/netif/ste/if_stereg.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino  * Copyright (c) 1997, 1998, 1999
386d7f5d3SJohn Marino  *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
486d7f5d3SJohn Marino  *
586d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
686d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
786d7f5d3SJohn Marino  * are met:
886d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
986d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
1086d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
1186d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
1286d7f5d3SJohn Marino  *    documentation and/or other materials provided with the distribution.
1386d7f5d3SJohn Marino  * 3. All advertising materials mentioning features or use of this software
1486d7f5d3SJohn Marino  *    must display the following acknowledgement:
1586d7f5d3SJohn Marino  *	This product includes software developed by Bill Paul.
1686d7f5d3SJohn Marino  * 4. Neither the name of the author nor the names of any co-contributors
1786d7f5d3SJohn Marino  *    may be used to endorse or promote products derived from this software
1886d7f5d3SJohn Marino  *    without specific prior written permission.
1986d7f5d3SJohn Marino  *
2086d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
2186d7f5d3SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2286d7f5d3SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2386d7f5d3SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
2486d7f5d3SJohn Marino  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2586d7f5d3SJohn Marino  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2686d7f5d3SJohn Marino  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2786d7f5d3SJohn Marino  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2886d7f5d3SJohn Marino  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2986d7f5d3SJohn Marino  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
3086d7f5d3SJohn Marino  * THE POSSIBILITY OF SUCH DAMAGE.
3186d7f5d3SJohn Marino  *
3286d7f5d3SJohn Marino  * $FreeBSD: src/sys/pci/if_stereg.h,v 1.5.2.3 2002/08/21 15:26:01 ambrisko Exp $
3386d7f5d3SJohn Marino  * $DragonFly: src/sys/dev/netif/ste/if_stereg.h,v 1.7 2006/08/01 18:10:05 swildner Exp $
3486d7f5d3SJohn Marino  */
3586d7f5d3SJohn Marino 
3686d7f5d3SJohn Marino /*
3786d7f5d3SJohn Marino  * Register definitions for the Sundance Technologies ST201 PCI
3886d7f5d3SJohn Marino  * fast ethernet controller. The register space is 128 bytes long and
3986d7f5d3SJohn Marino  * can be accessed using either PCI I/O space or PCI memory mapping.
4086d7f5d3SJohn Marino  * There are 32-bit, 16-bit and 8-bit registers.
4186d7f5d3SJohn Marino  */
4286d7f5d3SJohn Marino 
4386d7f5d3SJohn Marino #define STE_DMACTL		0x00
4486d7f5d3SJohn Marino #define STE_TX_DMALIST_PTR	0x04
4586d7f5d3SJohn Marino #define STE_TX_DMABURST_THRESH	0x08
4686d7f5d3SJohn Marino #define STE_TX_DMAURG_THRESH	0x09
4786d7f5d3SJohn Marino #define STE_TX_DMAPOLL_PERIOD	0x0A
4886d7f5d3SJohn Marino #define STE_RX_DMASTATUS	0x0C
4986d7f5d3SJohn Marino #define STE_RX_DMALIST_PTR	0x10
5086d7f5d3SJohn Marino #define STE_RX_DMABURST_THRESH	0x14
5186d7f5d3SJohn Marino #define STE_RX_DMAURG_THRESH	0x15
5286d7f5d3SJohn Marino #define STE_RX_DMAPOLL_PERIOD	0x16
5386d7f5d3SJohn Marino #define STE_DEBUGCTL		0x1A
5486d7f5d3SJohn Marino #define STE_ASICCTL		0x30
5586d7f5d3SJohn Marino #define STE_EEPROM_DATA		0x34
5686d7f5d3SJohn Marino #define STE_EEPROM_CTL		0x36
5786d7f5d3SJohn Marino #define STE_FIFOCTL		0x3A
5886d7f5d3SJohn Marino #define STE_TX_STARTTHRESH	0x3C
5986d7f5d3SJohn Marino #define STE_RX_EARLYTHRESH	0x3E
6086d7f5d3SJohn Marino #define STE_EXT_ROMADDR		0x40
6186d7f5d3SJohn Marino #define STE_EXT_ROMDATA		0x44
6286d7f5d3SJohn Marino #define STE_WAKE_EVENT		0x45
6386d7f5d3SJohn Marino #define STE_TX_STATUS		0x46
6486d7f5d3SJohn Marino #define STE_TX_FRAMEID		0x47
6586d7f5d3SJohn Marino #define STE_COUNTDOWN		0x48
6686d7f5d3SJohn Marino #define STE_ISR_ACK		0x4A
6786d7f5d3SJohn Marino #define STE_IMR			0x4C
6886d7f5d3SJohn Marino #define STE_ISR			0x4E
6986d7f5d3SJohn Marino #define STE_MACCTL0		0x50
7086d7f5d3SJohn Marino #define STE_MACCTL1		0x52
7186d7f5d3SJohn Marino #define STE_PAR0		0x54
7286d7f5d3SJohn Marino #define STE_PAR1		0x56
7386d7f5d3SJohn Marino #define STE_PAR2		0x58
7486d7f5d3SJohn Marino #define STE_MAX_FRAMELEN	0x5A
7586d7f5d3SJohn Marino #define STE_RX_MODE		0x5C
7686d7f5d3SJohn Marino #define STE_TX_RECLAIM_THRESH	0x5D
7786d7f5d3SJohn Marino #define STE_PHYCTL		0x5E
7886d7f5d3SJohn Marino #define STE_MAR0		0x60
7986d7f5d3SJohn Marino #define STE_MAR1		0x62
8086d7f5d3SJohn Marino #define STE_MAR2		0x64
8186d7f5d3SJohn Marino #define STE_MAR3		0x66
8286d7f5d3SJohn Marino #define STE_STATS		0x68
8386d7f5d3SJohn Marino 
8486d7f5d3SJohn Marino #define STE_LATE_COLLS  0x75
8586d7f5d3SJohn Marino #define STE_MULTI_COLLS	0x76
8686d7f5d3SJohn Marino #define STE_SINGLE_COLLS 0x77
8786d7f5d3SJohn Marino 
8886d7f5d3SJohn Marino #define STE_DMACTL_RXDMA_STOPPED	0x00000001
8986d7f5d3SJohn Marino #define STE_DMACTL_TXDMA_CMPREQ		0x00000002
9086d7f5d3SJohn Marino #define STE_DMACTL_TXDMA_STOPPED	0x00000004
9186d7f5d3SJohn Marino #define STE_DMACTL_RXDMA_COMPLETE	0x00000008
9286d7f5d3SJohn Marino #define STE_DMACTL_TXDMA_COMPLETE	0x00000010
9386d7f5d3SJohn Marino #define STE_DMACTL_RXDMA_STALL		0x00000100
9486d7f5d3SJohn Marino #define STE_DMACTL_RXDMA_UNSTALL	0x00000200
9586d7f5d3SJohn Marino #define STE_DMACTL_TXDMA_STALL		0x00000400
9686d7f5d3SJohn Marino #define STE_DMACTL_TXDMA_UNSTALL	0x00000800
9786d7f5d3SJohn Marino #define STE_DMACTL_TXDMA_INPROG		0x00004000
9886d7f5d3SJohn Marino #define STE_DMACTL_DMA_HALTINPROG	0x00008000
9986d7f5d3SJohn Marino #define STE_DMACTL_RXEARLY_ENABLE	0x00020000
10086d7f5d3SJohn Marino #define STE_DMACTL_COUNTDOWN_SPEED	0x00040000
10186d7f5d3SJohn Marino #define STE_DMACTL_COUNTDOWN_MODE	0x00080000
10286d7f5d3SJohn Marino #define STE_DMACTL_MWI_DISABLE		0x00100000
10386d7f5d3SJohn Marino #define STE_DMACTL_RX_DISCARD_OFLOWS	0x00400000
10486d7f5d3SJohn Marino #define STE_DMACTL_COUNTDOWN_ENABLE	0x00800000
10586d7f5d3SJohn Marino #define STE_DMACTL_TARGET_ABORT		0x40000000
10686d7f5d3SJohn Marino #define STE_DMACTL_MASTER_ABORT		0x80000000
10786d7f5d3SJohn Marino 
10886d7f5d3SJohn Marino /*
10986d7f5d3SJohn Marino  * TX DMA burst thresh is the number of 32-byte blocks that
11086d7f5d3SJohn Marino  * must be loaded into the TX Fifo before a TXDMA burst request
11186d7f5d3SJohn Marino  * will be issued.
11286d7f5d3SJohn Marino  */
11386d7f5d3SJohn Marino #define STE_TXDMABURST_THRESH		0x1F
11486d7f5d3SJohn Marino 
11586d7f5d3SJohn Marino /*
11686d7f5d3SJohn Marino  * The number of 32-byte blocks in the TX FIFO falls below the
11786d7f5d3SJohn Marino  * TX DMA urgent threshold, a TX DMA urgent request will be
11886d7f5d3SJohn Marino  * generated.
11986d7f5d3SJohn Marino  */
12086d7f5d3SJohn Marino #define STE_TXDMAURG_THRESH		0x3F
12186d7f5d3SJohn Marino 
12286d7f5d3SJohn Marino /*
12386d7f5d3SJohn Marino  * Number of 320ns intervals between polls of the TXDMA next
12486d7f5d3SJohn Marino  * descriptor pointer (if we're using polling mode).
12586d7f5d3SJohn Marino  */
12686d7f5d3SJohn Marino #define STE_TXDMA_POLL_PERIOD		0x7F
12786d7f5d3SJohn Marino 
12886d7f5d3SJohn Marino #define STE_RX_DMASTATUS_FRAMELEN	0x00001FFF
12986d7f5d3SJohn Marino #define STE_RX_DMASTATUS_RXERR		0x00004000
13086d7f5d3SJohn Marino #define STE_RX_DMASTATUS_DMADONE	0x00008000
13186d7f5d3SJohn Marino #define STE_RX_DMASTATUS_FIFO_OFLOW	0x00010000
13286d7f5d3SJohn Marino #define STE_RX_DMASTATUS_RUNT		0x00020000
13386d7f5d3SJohn Marino #define STE_RX_DMASTATUS_ALIGNERR	0x00040000
13486d7f5d3SJohn Marino #define STE_RX_DMASTATUS_CRCERR		0x00080000
13586d7f5d3SJohn Marino #define STE_RX_DMASTATUS_GIANT		0x00100000
13686d7f5d3SJohn Marino #define STE_RX_DMASTATUS_DRIBBLE	0x00800000
13786d7f5d3SJohn Marino #define STE_RX_DMASTATUS_DMA_OFLOW	0x01000000
13886d7f5d3SJohn Marino 
13986d7f5d3SJohn Marino /*
14086d7f5d3SJohn Marino  * RX DMA burst thresh is the number of 32-byte blocks that
14186d7f5d3SJohn Marino  * must be present in the RX FIFO before a RXDMA bus master
14286d7f5d3SJohn Marino  * request will be issued.
14386d7f5d3SJohn Marino  */
14486d7f5d3SJohn Marino #define STE_RXDMABURST_THRESH		0xFF
14586d7f5d3SJohn Marino 
14686d7f5d3SJohn Marino /*
14786d7f5d3SJohn Marino  * The number of 32-byte blocks in the RX FIFO falls below the
14886d7f5d3SJohn Marino  * RX DMA urgent threshold, a RX DMA urgent request will be
14986d7f5d3SJohn Marino  * generated.
15086d7f5d3SJohn Marino  */
15186d7f5d3SJohn Marino #define STE_RXDMAURG_THRESH		0x1F
15286d7f5d3SJohn Marino 
15386d7f5d3SJohn Marino /*
15486d7f5d3SJohn Marino  * Number of 320ns intervals between polls of the RXDMA complete
15586d7f5d3SJohn Marino  * bit in the status field on the current RX descriptor (if we're
15686d7f5d3SJohn Marino  * using polling mode).
15786d7f5d3SJohn Marino  */
15886d7f5d3SJohn Marino #define STE_RXDMA_POLL_PERIOD		0x7F
15986d7f5d3SJohn Marino 
16086d7f5d3SJohn Marino #define STE_DEBUGCTL_GPIO0_CTL		0x0001
16186d7f5d3SJohn Marino #define STE_DEBUGCTL_GPIO1_CTL		0x0002
16286d7f5d3SJohn Marino #define STE_DEBUGCTL_GPIO0_DATA		0x0004
16386d7f5d3SJohn Marino #define STE_DEBUGCTL_GPIO1_DATA		0x0008
16486d7f5d3SJohn Marino 
16586d7f5d3SJohn Marino #define STE_ASICCTL_ROMSIZE		0x00000002
16686d7f5d3SJohn Marino #define STE_ASICCTL_TX_LARGEPKTS	0x00000004
16786d7f5d3SJohn Marino #define STE_ASICCTL_RX_LARGEPKTS	0x00000008
16886d7f5d3SJohn Marino #define STE_ASICCTL_EXTROM_DISABLE	0x00000010
16986d7f5d3SJohn Marino #define STE_ASICCTL_PHYSPEED_10		0x00000020
17086d7f5d3SJohn Marino #define STE_ASICCTL_PHYSPEED_100	0x00000040
17186d7f5d3SJohn Marino #define STE_ASICCTL_PHYMEDIA		0x00000080
17286d7f5d3SJohn Marino #define STE_ASICCTL_FORCEDCONFIG	0x00000700
17386d7f5d3SJohn Marino #define STE_ASICCTL_D3RESET_DISABLE	0x00000800
17486d7f5d3SJohn Marino #define STE_ASICCTL_SPEEDUPMODE		0x00002000
17586d7f5d3SJohn Marino #define STE_ASICCTL_LEDMODE		0x00004000
17686d7f5d3SJohn Marino #define STE_ASICCTL_RSTOUT_POLARITY	0x00008000
17786d7f5d3SJohn Marino #define STE_ASICCTL_GLOBAL_RESET	0x00010000
17886d7f5d3SJohn Marino #define STE_ASICCTL_RX_RESET		0x00020000
17986d7f5d3SJohn Marino #define STE_ASICCTL_TX_RESET		0x00040000
18086d7f5d3SJohn Marino #define STE_ASICCTL_DMA_RESET		0x00080000
18186d7f5d3SJohn Marino #define STE_ASICCTL_FIFO_RESET		0x00100000
18286d7f5d3SJohn Marino #define STE_ASICCTL_NETWORK_RESET	0x00200000
18386d7f5d3SJohn Marino #define STE_ASICCTL_HOST_RESET		0x00400000
18486d7f5d3SJohn Marino #define STE_ASICCTL_AUTOINIT_RESET	0x00800000
18586d7f5d3SJohn Marino #define STE_ASICCTL_EXTRESET_RESET	0x01000000
18686d7f5d3SJohn Marino #define STE_ASICCTL_SOFTINTR		0x02000000
18786d7f5d3SJohn Marino #define STE_ASICCTL_RESET_BUSY		0x04000000
18886d7f5d3SJohn Marino 
18986d7f5d3SJohn Marino #define STE_ASICCTL1_GLOBAL_RESET	0x0001
19086d7f5d3SJohn Marino #define STE_ASICCTL1_RX_RESET		0x0002
19186d7f5d3SJohn Marino #define STE_ASICCTL1_TX_RESET		0x0004
19286d7f5d3SJohn Marino #define STE_ASICCTL1_DMA_RESET		0x0008
19386d7f5d3SJohn Marino #define STE_ASICCTL1_FIFO_RESET		0x0010
19486d7f5d3SJohn Marino #define STE_ASICCTL1_NETWORK_RESET	0x0020
19586d7f5d3SJohn Marino #define STE_ASICCTL1_HOST_RESET		0x0040
19686d7f5d3SJohn Marino #define STE_ASICCTL1_AUTOINIT_RESET	0x0080
19786d7f5d3SJohn Marino #define STE_ASICCTL1_EXTRESET_RESET	0x0100
19886d7f5d3SJohn Marino #define STE_ASICCTL1_SOFTINTR		0x0200
19986d7f5d3SJohn Marino #define STE_ASICCTL1_RESET_BUSY		0x0400
20086d7f5d3SJohn Marino 
20186d7f5d3SJohn Marino #define STE_EECTL_ADDR			0x00FF
20286d7f5d3SJohn Marino #define STE_EECTL_OPCODE		0x0300
20386d7f5d3SJohn Marino #define STE_EECTL_BUSY			0x1000
20486d7f5d3SJohn Marino 
20586d7f5d3SJohn Marino #define STE_EEOPCODE_WRITE		0x0100
20686d7f5d3SJohn Marino #define STE_EEOPCODE_READ		0x0200
20786d7f5d3SJohn Marino #define STE_EEOPCODE_ERASE		0x0300
20886d7f5d3SJohn Marino 
20986d7f5d3SJohn Marino #define STE_FIFOCTL_RAMTESTMODE		0x0001
21086d7f5d3SJohn Marino #define STE_FIFOCTL_OVERRUNMODE		0x0200
21186d7f5d3SJohn Marino #define STE_FIFOCTL_RXFIFOFULL		0x0800
21286d7f5d3SJohn Marino #define STE_FIFOCTL_TX_BUSY		0x4000
21386d7f5d3SJohn Marino #define STE_FIFOCTL_RX_BUSY		0x8000
21486d7f5d3SJohn Marino 
21586d7f5d3SJohn Marino /*
21686d7f5d3SJohn Marino  * The number of bytes that must in present in the TX FIFO before
21786d7f5d3SJohn Marino  * transmission begins. Value should be in increments of 4 bytes.
21886d7f5d3SJohn Marino  */
21986d7f5d3SJohn Marino #define STE_TXSTART_THRESH		0x1FFC
22086d7f5d3SJohn Marino 
22186d7f5d3SJohn Marino /*
22286d7f5d3SJohn Marino  * Number of bytes that must be present in the RX FIFO before
22386d7f5d3SJohn Marino  * an RX EARLY interrupt is generated.
22486d7f5d3SJohn Marino  */
22586d7f5d3SJohn Marino #define STE_RXEARLY_THRESH		0x1FFC
22686d7f5d3SJohn Marino 
22786d7f5d3SJohn Marino #define STE_WAKEEVENT_WAKEPKT_ENB	0x01
22886d7f5d3SJohn Marino #define STE_WAKEEVENT_MAGICPKT_ENB	0x02
22986d7f5d3SJohn Marino #define STE_WAKEEVENT_LINKEVT_ENB	0x04
23086d7f5d3SJohn Marino #define STE_WAKEEVENT_WAKEPOLARITY	0x08
23186d7f5d3SJohn Marino #define STE_WAKEEVENT_WAKEPKTEVENT	0x10
23286d7f5d3SJohn Marino #define STE_WAKEEVENT_MAGICPKTEVENT	0x20
23386d7f5d3SJohn Marino #define STE_WAKEEVENT_LINKEVENT		0x40
23486d7f5d3SJohn Marino #define STE_WAKEEVENT_WAKEONLAN_ENB	0x80
23586d7f5d3SJohn Marino 
23686d7f5d3SJohn Marino #define STE_TXSTATUS_RECLAIMERR		0x02
23786d7f5d3SJohn Marino #define STE_TXSTATUS_STATSOFLOW		0x04
23886d7f5d3SJohn Marino #define STE_TXSTATUS_EXCESSCOLLS	0x08
23986d7f5d3SJohn Marino #define STE_TXSTATUS_UNDERRUN		0x10
24086d7f5d3SJohn Marino #define STE_TXSTATUS_TXINTR_REQ		0x40
24186d7f5d3SJohn Marino #define STE_TXSTATUS_TXDONE		0x80
24286d7f5d3SJohn Marino 
24386d7f5d3SJohn Marino #define STE_ISRACK_INTLATCH		0x0001
24486d7f5d3SJohn Marino #define STE_ISRACK_HOSTERR		0x0002
24586d7f5d3SJohn Marino #define STE_ISRACK_TX_DONE		0x0004
24686d7f5d3SJohn Marino #define STE_ISRACK_MACCTL_FRAME		0x0008
24786d7f5d3SJohn Marino #define STE_ISRACK_RX_DONE		0x0010
24886d7f5d3SJohn Marino #define STE_ISRACK_RX_EARLY		0x0020
24986d7f5d3SJohn Marino #define STE_ISRACK_SOFTINTR		0x0040
25086d7f5d3SJohn Marino #define STE_ISRACK_STATS_OFLOW		0x0080
25186d7f5d3SJohn Marino #define STE_ISRACK_LINKEVENT		0x0100
25286d7f5d3SJohn Marino #define STE_ISRACK_TX_DMADONE		0x0200
25386d7f5d3SJohn Marino #define STE_ISRACK_RX_DMADONE		0x0400
25486d7f5d3SJohn Marino 
25586d7f5d3SJohn Marino #define STE_IMR_HOSTERR			0x0002
25686d7f5d3SJohn Marino #define STE_IMR_TX_DONE			0x0004
25786d7f5d3SJohn Marino #define STE_IMR_MACCTL_FRAME		0x0008
25886d7f5d3SJohn Marino #define STE_IMR_RX_DONE			0x0010
25986d7f5d3SJohn Marino #define STE_IMR_RX_EARLY		0x0020
26086d7f5d3SJohn Marino #define STE_IMR_SOFTINTR		0x0040
26186d7f5d3SJohn Marino #define STE_IMR_STATS_OFLOW		0x0080
26286d7f5d3SJohn Marino #define STE_IMR_LINKEVENT		0x0100
26386d7f5d3SJohn Marino #define STE_IMR_TX_DMADONE		0x0200
26486d7f5d3SJohn Marino #define STE_IMR_RX_DMADONE		0x0400
26586d7f5d3SJohn Marino 
26686d7f5d3SJohn Marino #define STE_INTRS					\
26786d7f5d3SJohn Marino 	(STE_IMR_RX_DMADONE|STE_IMR_TX_DMADONE|	\
26886d7f5d3SJohn Marino 	STE_IMR_TX_DONE|STE_IMR_HOSTERR| \
26986d7f5d3SJohn Marino         STE_IMR_LINKEVENT)
27086d7f5d3SJohn Marino 
27186d7f5d3SJohn Marino #define STE_ISR_INTLATCH		0x0001
27286d7f5d3SJohn Marino #define STE_ISR_HOSTERR			0x0002
27386d7f5d3SJohn Marino #define STE_ISR_TX_DONE			0x0004
27486d7f5d3SJohn Marino #define STE_ISR_MACCTL_FRAME		0x0008
27586d7f5d3SJohn Marino #define STE_ISR_RX_DONE			0x0010
27686d7f5d3SJohn Marino #define STE_ISR_RX_EARLY		0x0020
27786d7f5d3SJohn Marino #define STE_ISR_SOFTINTR		0x0040
27886d7f5d3SJohn Marino #define STE_ISR_STATS_OFLOW		0x0080
27986d7f5d3SJohn Marino #define STE_ISR_LINKEVENT		0x0100
28086d7f5d3SJohn Marino #define STE_ISR_TX_DMADONE		0x0200
28186d7f5d3SJohn Marino #define STE_ISR_RX_DMADONE		0x0400
28286d7f5d3SJohn Marino 
28386d7f5d3SJohn Marino /*
28486d7f5d3SJohn Marino  * Note: the Sundance manual gives the impression that the's
28586d7f5d3SJohn Marino  * only one 32-bit MACCTL register. In fact, there are two
28686d7f5d3SJohn Marino  * 16-bit registers side by side, and you have to access them
28786d7f5d3SJohn Marino  * separately.
28886d7f5d3SJohn Marino  */
28986d7f5d3SJohn Marino #define STE_MACCTL0_IPG			0x0003
29086d7f5d3SJohn Marino #define STE_MACCTL0_FULLDUPLEX		0x0020
29186d7f5d3SJohn Marino #define STE_MACCTL0_RX_GIANTS		0x0040
29286d7f5d3SJohn Marino #define STE_MACCTL0_FLOWCTL_ENABLE	0x0100
29386d7f5d3SJohn Marino #define STE_MACCTL0_RX_FCS		0x0200
29486d7f5d3SJohn Marino #define STE_MACCTL0_FIFOLOOPBK		0x0400
29586d7f5d3SJohn Marino #define STE_MACCTL0_MACLOOPBK		0x0800
29686d7f5d3SJohn Marino 
29786d7f5d3SJohn Marino #define STE_MACCTL1_COLLDETECT		0x0001
29886d7f5d3SJohn Marino #define STE_MACCTL1_CARRSENSE		0x0002
29986d7f5d3SJohn Marino #define STE_MACCTL1_TX_BUSY		0x0004
30086d7f5d3SJohn Marino #define STE_MACCTL1_TX_ERROR		0x0008
30186d7f5d3SJohn Marino #define STE_MACCTL1_STATS_ENABLE	0x0020
30286d7f5d3SJohn Marino #define STE_MACCTL1_STATS_DISABLE	0x0040
30386d7f5d3SJohn Marino #define STE_MACCTL1_STATS_ENABLED	0x0080
30486d7f5d3SJohn Marino #define STE_MACCTL1_TX_ENABLE		0x0100
30586d7f5d3SJohn Marino #define STE_MACCTL1_TX_DISABLE		0x0200
30686d7f5d3SJohn Marino #define STE_MACCTL1_TX_ENABLED		0x0400
30786d7f5d3SJohn Marino #define STE_MACCTL1_RX_ENABLE		0x0800
30886d7f5d3SJohn Marino #define STE_MACCTL1_RX_DISABLE		0x1000
30986d7f5d3SJohn Marino #define STE_MACCTL1_RX_ENABLED		0x2000
31086d7f5d3SJohn Marino #define STE_MACCTL1_PAUSED		0x4000
31186d7f5d3SJohn Marino 
31286d7f5d3SJohn Marino #define STE_IPG_96BT			0x00000000
31386d7f5d3SJohn Marino #define STE_IPG_128BT			0x00000001
31486d7f5d3SJohn Marino #define STE_IPG_224BT			0x00000002
31586d7f5d3SJohn Marino #define STE_IPG_544BT			0x00000003
31686d7f5d3SJohn Marino 
31786d7f5d3SJohn Marino #define STE_RXMODE_UNICAST		0x01
31886d7f5d3SJohn Marino #define STE_RXMODE_ALLMULTI		0x02
31986d7f5d3SJohn Marino #define STE_RXMODE_BROADCAST		0x04
32086d7f5d3SJohn Marino #define STE_RXMODE_PROMISC		0x08
32186d7f5d3SJohn Marino #define STE_RXMODE_MULTIHASH		0x10
32286d7f5d3SJohn Marino #define STE_RXMODE_ALLIPMULTI		0x20
32386d7f5d3SJohn Marino 
32486d7f5d3SJohn Marino #define STE_PHYCTL_MCLK			0x01
32586d7f5d3SJohn Marino #define STE_PHYCTL_MDATA		0x02
32686d7f5d3SJohn Marino #define STE_PHYCTL_MDIR			0x04
32786d7f5d3SJohn Marino #define STE_PHYCTL_CLK25_DISABLE	0x08
32886d7f5d3SJohn Marino #define STE_PHYCTL_DUPLEXPOLARITY	0x10
32986d7f5d3SJohn Marino #define STE_PHYCTL_DUPLEXSTAT		0x20
33086d7f5d3SJohn Marino #define STE_PHYCTL_SPEEDSTAT		0x40
33186d7f5d3SJohn Marino #define STE_PHYCTL_LINKSTAT		0x80
33286d7f5d3SJohn Marino 
33386d7f5d3SJohn Marino /*
33486d7f5d3SJohn Marino  * EEPROM offsets.
33586d7f5d3SJohn Marino  */
33686d7f5d3SJohn Marino #define STE_EEADDR_CONFIGPARM		0x00
33786d7f5d3SJohn Marino #define STE_EEADDR_ASICCTL		0x02
33886d7f5d3SJohn Marino #define STE_EEADDR_SUBSYS_ID		0x04
33986d7f5d3SJohn Marino #define STE_EEADDR_SUBVEN_ID		0x08
34086d7f5d3SJohn Marino 
34186d7f5d3SJohn Marino #define STE_EEADDR_NODE0		0x10
34286d7f5d3SJohn Marino #define STE_EEADDR_NODE1		0x12
34386d7f5d3SJohn Marino #define STE_EEADDR_NODE2		0x14
34486d7f5d3SJohn Marino 
34586d7f5d3SJohn Marino /* PCI registers */
34686d7f5d3SJohn Marino #define STE_PCI_VENDOR_ID		0x00
34786d7f5d3SJohn Marino #define STE_PCI_DEVICE_ID		0x02
34886d7f5d3SJohn Marino #define STE_PCI_COMMAND			0x04
34986d7f5d3SJohn Marino #define STE_PCI_STATUS			0x06
35086d7f5d3SJohn Marino #define STE_PCI_CLASSCODE		0x09
35186d7f5d3SJohn Marino #define STE_PCI_LATENCY_TIMER		0x0D
35286d7f5d3SJohn Marino #define STE_PCI_HEADER_TYPE		0x0E
35386d7f5d3SJohn Marino #define STE_PCI_LOIO			0x10
35486d7f5d3SJohn Marino #define STE_PCI_LOMEM			0x14
35586d7f5d3SJohn Marino #define STE_PCI_BIOSROM			0x30
35686d7f5d3SJohn Marino #define STE_PCI_INTLINE			0x3C
35786d7f5d3SJohn Marino #define STE_PCI_INTPIN			0x3D
35886d7f5d3SJohn Marino #define STE_PCI_MINGNT			0x3E
35986d7f5d3SJohn Marino #define STE_PCI_MINLAT			0x0F
36086d7f5d3SJohn Marino 
36186d7f5d3SJohn Marino #define STE_PCI_CAPID			0x50 /* 8 bits */
36286d7f5d3SJohn Marino #define STE_PCI_NEXTPTR			0x51 /* 8 bits */
36386d7f5d3SJohn Marino #define STE_PCI_PWRMGMTCAP		0x52 /* 16 bits */
36486d7f5d3SJohn Marino #define STE_PCI_PWRMGMTCTRL		0x54 /* 16 bits */
36586d7f5d3SJohn Marino 
36686d7f5d3SJohn Marino #define STE_PME_EN			0x0010
36786d7f5d3SJohn Marino #define STE_PME_STATUS			0x8000
36886d7f5d3SJohn Marino 
36986d7f5d3SJohn Marino 
37086d7f5d3SJohn Marino struct ste_stats {
37186d7f5d3SJohn Marino 	u_int32_t		ste_rx_bytes;
37286d7f5d3SJohn Marino 	u_int32_t		ste_tx_bytes;
37386d7f5d3SJohn Marino 	u_int16_t		ste_tx_frames;
37486d7f5d3SJohn Marino 	u_int16_t		ste_rx_frames;
37586d7f5d3SJohn Marino 	u_int8_t		ste_carrsense_errs;
37686d7f5d3SJohn Marino 	u_int8_t		ste_late_colls;
37786d7f5d3SJohn Marino 	u_int8_t		ste_multi_colls;
37886d7f5d3SJohn Marino 	u_int8_t		ste_single_colls;
37986d7f5d3SJohn Marino 	u_int8_t		ste_tx_frames_defered;
38086d7f5d3SJohn Marino 	u_int8_t		ste_rx_lost_frames;
38186d7f5d3SJohn Marino 	u_int8_t		ste_tx_excess_defers;
38286d7f5d3SJohn Marino 	u_int8_t		ste_tx_abort_excess_colls;
38386d7f5d3SJohn Marino 	u_int8_t		ste_tx_bcast_frames;
38486d7f5d3SJohn Marino 	u_int8_t		ste_rx_bcast_frames;
38586d7f5d3SJohn Marino 	u_int8_t		ste_tx_mcast_frames;
38686d7f5d3SJohn Marino 	u_int8_t		ste_rx_mcast_frames;
38786d7f5d3SJohn Marino };
38886d7f5d3SJohn Marino 
38986d7f5d3SJohn Marino struct ste_frag {
39086d7f5d3SJohn Marino 	u_int32_t		ste_addr;
39186d7f5d3SJohn Marino 	u_int32_t		ste_len;
39286d7f5d3SJohn Marino };
39386d7f5d3SJohn Marino 
39486d7f5d3SJohn Marino #define STE_FRAG_LAST		0x80000000
39586d7f5d3SJohn Marino #define STE_FRAG_LEN		0x00001FFF
39686d7f5d3SJohn Marino 
39786d7f5d3SJohn Marino #define STE_MAXFRAGS	8
39886d7f5d3SJohn Marino 
39986d7f5d3SJohn Marino struct ste_desc {
40086d7f5d3SJohn Marino 	u_int32_t		ste_next;
40186d7f5d3SJohn Marino 	u_int32_t		ste_ctl;
40286d7f5d3SJohn Marino 	struct ste_frag		ste_frags[STE_MAXFRAGS];
40386d7f5d3SJohn Marino };
40486d7f5d3SJohn Marino 
40586d7f5d3SJohn Marino struct ste_desc_onefrag {
40686d7f5d3SJohn Marino 	u_int32_t		ste_next;
40786d7f5d3SJohn Marino 	u_int32_t		ste_status;
40886d7f5d3SJohn Marino 	struct ste_frag		ste_frag;
40986d7f5d3SJohn Marino };
41086d7f5d3SJohn Marino 
41186d7f5d3SJohn Marino #define STE_TXCTL_WORDALIGN	0x00000003
41286d7f5d3SJohn Marino #define STE_TXCTL_FRAMEID	0x000003FC
41386d7f5d3SJohn Marino #define STE_TXCTL_NOCRC		0x00002000
41486d7f5d3SJohn Marino #define STE_TXCTL_TXINTR	0x00008000
41586d7f5d3SJohn Marino #define STE_TXCTL_DMADONE	0x00010000
41686d7f5d3SJohn Marino #define STE_TXCTL_DMAINTR	0x80000000
41786d7f5d3SJohn Marino 
41886d7f5d3SJohn Marino #define STE_RXSTAT_FRAMELEN	0x00001FFF
41986d7f5d3SJohn Marino #define STE_RXSTAT_FRAME_ERR	0x00004000
42086d7f5d3SJohn Marino #define STE_RXSTAT_DMADONE	0x00008000
42186d7f5d3SJohn Marino #define STE_RXSTAT_FIFO_OFLOW	0x00010000
42286d7f5d3SJohn Marino #define STE_RXSTAT_RUNT		0x00020000
42386d7f5d3SJohn Marino #define STE_RXSTAT_ALIGNERR	0x00040000
42486d7f5d3SJohn Marino #define STE_RXSTAT_CRCERR	0x00080000
42586d7f5d3SJohn Marino #define STE_RXSTAT_GIANT	0x00100000
42686d7f5d3SJohn Marino #define STE_RXSTAT_DRIBBLEBITS	0x00800000
42786d7f5d3SJohn Marino #define STE_RXSTAT_DMA_OFLOW	0x01000000
42886d7f5d3SJohn Marino #define STE_RXATAT_ONEBUF	0x10000000
42986d7f5d3SJohn Marino 
43086d7f5d3SJohn Marino /*
43186d7f5d3SJohn Marino  * register space access macros
43286d7f5d3SJohn Marino  */
43386d7f5d3SJohn Marino #define CSR_WRITE_4(sc, reg, val)	\
43486d7f5d3SJohn Marino 	bus_space_write_4(sc->ste_btag, sc->ste_bhandle, reg, val)
43586d7f5d3SJohn Marino #define CSR_WRITE_2(sc, reg, val)	\
43686d7f5d3SJohn Marino 	bus_space_write_2(sc->ste_btag, sc->ste_bhandle, reg, val)
43786d7f5d3SJohn Marino #define CSR_WRITE_1(sc, reg, val)	\
43886d7f5d3SJohn Marino 	bus_space_write_1(sc->ste_btag, sc->ste_bhandle, reg, val)
43986d7f5d3SJohn Marino 
44086d7f5d3SJohn Marino #define CSR_READ_4(sc, reg)		\
44186d7f5d3SJohn Marino 	bus_space_read_4(sc->ste_btag, sc->ste_bhandle, reg)
44286d7f5d3SJohn Marino #define CSR_READ_2(sc, reg)		\
44386d7f5d3SJohn Marino 	bus_space_read_2(sc->ste_btag, sc->ste_bhandle, reg)
44486d7f5d3SJohn Marino #define CSR_READ_1(sc, reg)		\
44586d7f5d3SJohn Marino 	bus_space_read_1(sc->ste_btag, sc->ste_bhandle, reg)
44686d7f5d3SJohn Marino 
44786d7f5d3SJohn Marino #define STE_TIMEOUT		1000
44886d7f5d3SJohn Marino #define STE_MIN_FRAMELEN	60
44986d7f5d3SJohn Marino #define STE_PACKET_SIZE		1536
45086d7f5d3SJohn Marino #define ETHER_ALIGN		2
45186d7f5d3SJohn Marino #define STE_RX_LIST_CNT		64
45286d7f5d3SJohn Marino #define STE_TX_LIST_CNT		64
45386d7f5d3SJohn Marino #define STE_INC(x, y)		(x) = (x + 1) % y
45486d7f5d3SJohn Marino #define STE_NEXT(x, y)		(x + 1) % y
45586d7f5d3SJohn Marino 
45686d7f5d3SJohn Marino struct ste_type {
45786d7f5d3SJohn Marino 	u_int16_t		ste_vid;
45886d7f5d3SJohn Marino 	u_int16_t		ste_did;
45986d7f5d3SJohn Marino 	char			*ste_name;
46086d7f5d3SJohn Marino };
46186d7f5d3SJohn Marino 
46286d7f5d3SJohn Marino struct ste_list_data {
46386d7f5d3SJohn Marino 	struct ste_desc_onefrag	ste_rx_list[STE_RX_LIST_CNT];
46486d7f5d3SJohn Marino 	struct ste_desc		ste_tx_list[STE_TX_LIST_CNT];
46586d7f5d3SJohn Marino 	u_int8_t		ste_pad[STE_MIN_FRAMELEN];
46686d7f5d3SJohn Marino };
46786d7f5d3SJohn Marino 
46886d7f5d3SJohn Marino struct ste_chain {
46986d7f5d3SJohn Marino 	struct ste_desc		*ste_ptr;
47086d7f5d3SJohn Marino 	struct mbuf		*ste_mbuf;
47186d7f5d3SJohn Marino 	struct ste_chain	*ste_next;
47286d7f5d3SJohn Marino 	struct ste_chain	*ste_prev;
47386d7f5d3SJohn Marino 	u_int32_t		ste_phys;
47486d7f5d3SJohn Marino };
47586d7f5d3SJohn Marino 
47686d7f5d3SJohn Marino struct ste_chain_onefrag {
47786d7f5d3SJohn Marino 	struct ste_desc_onefrag	*ste_ptr;
47886d7f5d3SJohn Marino 	struct mbuf		*ste_mbuf;
47986d7f5d3SJohn Marino 	struct ste_chain_onefrag	*ste_next;
48086d7f5d3SJohn Marino };
48186d7f5d3SJohn Marino 
48286d7f5d3SJohn Marino struct ste_chain_data {
48386d7f5d3SJohn Marino 	struct ste_chain_onefrag ste_rx_chain[STE_RX_LIST_CNT];
48486d7f5d3SJohn Marino 	struct ste_chain	 ste_tx_chain[STE_TX_LIST_CNT];
48586d7f5d3SJohn Marino 	struct ste_chain_onefrag *ste_rx_head;
48686d7f5d3SJohn Marino 
48786d7f5d3SJohn Marino 	int			ste_tx_prod;
48886d7f5d3SJohn Marino 	int			ste_tx_cons;
48986d7f5d3SJohn Marino 	int			ste_tx_cnt;
49086d7f5d3SJohn Marino };
49186d7f5d3SJohn Marino 
49286d7f5d3SJohn Marino struct ste_softc {
49386d7f5d3SJohn Marino 	struct arpcom		arpcom;
49486d7f5d3SJohn Marino 	bus_space_tag_t		ste_btag;
49586d7f5d3SJohn Marino 	bus_space_handle_t	ste_bhandle;
49686d7f5d3SJohn Marino 	struct resource		*ste_res;
49786d7f5d3SJohn Marino 	struct resource		*ste_irq;
49886d7f5d3SJohn Marino 	void			*ste_intrhand;
49986d7f5d3SJohn Marino 	struct ste_type		*ste_info;
50086d7f5d3SJohn Marino 	device_t		ste_miibus;
50186d7f5d3SJohn Marino 	device_t		ste_dev;
50286d7f5d3SJohn Marino 	int			ste_tx_thresh;
50386d7f5d3SJohn Marino 	u_int8_t		ste_link;
50486d7f5d3SJohn Marino 	int			ste_if_flags;
50586d7f5d3SJohn Marino 	int			ste_tx_prev_idx;
50686d7f5d3SJohn Marino 	struct ste_list_data	*ste_ldata;
50786d7f5d3SJohn Marino 	struct ste_chain_data	ste_cdata;
50886d7f5d3SJohn Marino 	struct callout		ste_stat_timer;
50986d7f5d3SJohn Marino 	u_int8_t		ste_one_phy;
51086d7f5d3SJohn Marino };
51186d7f5d3SJohn Marino 
51286d7f5d3SJohn Marino struct ste_mii_frame {
51386d7f5d3SJohn Marino 	u_int8_t		mii_stdelim;
51486d7f5d3SJohn Marino 	u_int8_t		mii_opcode;
51586d7f5d3SJohn Marino 	u_int8_t		mii_phyaddr;
51686d7f5d3SJohn Marino 	u_int8_t		mii_regaddr;
51786d7f5d3SJohn Marino 	u_int8_t		mii_turnaround;
51886d7f5d3SJohn Marino 	u_int16_t		mii_data;
51986d7f5d3SJohn Marino };
52086d7f5d3SJohn Marino 
52186d7f5d3SJohn Marino /*
52286d7f5d3SJohn Marino  * MII constants
52386d7f5d3SJohn Marino  */
52486d7f5d3SJohn Marino #define STE_MII_STARTDELIM	0x01
52586d7f5d3SJohn Marino #define STE_MII_READOP		0x02
52686d7f5d3SJohn Marino #define STE_MII_WRITEOP		0x01
52786d7f5d3SJohn Marino #define STE_MII_TURNAROUND	0x02
528