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