xref: /openbsd-src/sys/dev/ic/tireg.h (revision 4b1a56afb1a28c97103da3911d326d1216798a6e)
1*4b1a56afSjsg /*	$OpenBSD: tireg.h,v 1.6 2022/01/09 05:42:42 jsg Exp $	*/
251d3a2bcSkettenis 
351d3a2bcSkettenis /*
451d3a2bcSkettenis  * Copyright (c) 1997, 1998, 1999
551d3a2bcSkettenis  *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
651d3a2bcSkettenis  *
751d3a2bcSkettenis  * Redistribution and use in source and binary forms, with or without
851d3a2bcSkettenis  * modification, are permitted provided that the following conditions
951d3a2bcSkettenis  * are met:
1051d3a2bcSkettenis  * 1. Redistributions of source code must retain the above copyright
1151d3a2bcSkettenis  *    notice, this list of conditions and the following disclaimer.
1251d3a2bcSkettenis  * 2. Redistributions in binary form must reproduce the above copyright
1351d3a2bcSkettenis  *    notice, this list of conditions and the following disclaimer in the
1451d3a2bcSkettenis  *    documentation and/or other materials provided with the distribution.
1551d3a2bcSkettenis  * 3. All advertising materials mentioning features or use of this software
1651d3a2bcSkettenis  *    must display the following acknowledgement:
1751d3a2bcSkettenis  *	This product includes software developed by Bill Paul.
1851d3a2bcSkettenis  * 4. Neither the name of the author nor the names of any co-contributors
1951d3a2bcSkettenis  *    may be used to endorse or promote products derived from this software
2051d3a2bcSkettenis  *    without specific prior written permission.
2151d3a2bcSkettenis  *
2251d3a2bcSkettenis  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
2351d3a2bcSkettenis  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2451d3a2bcSkettenis  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2551d3a2bcSkettenis  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
2651d3a2bcSkettenis  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2751d3a2bcSkettenis  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2851d3a2bcSkettenis  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2951d3a2bcSkettenis  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3051d3a2bcSkettenis  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3151d3a2bcSkettenis  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
3251d3a2bcSkettenis  * THE POSSIBILITY OF SUCH DAMAGE.
3351d3a2bcSkettenis  *
3451d3a2bcSkettenis  * $FreeBSD: src/sys/pci/if_tireg.h,v 1.12 2000/01/18 00:26:29 wpaul Exp $
3551d3a2bcSkettenis  */
3651d3a2bcSkettenis 
3751d3a2bcSkettenis /*
3851d3a2bcSkettenis  * Tigon register offsets. These are memory mapped registers
3951d3a2bcSkettenis  * which can be accessed with the CSR_READ_4()/CSR_WRITE_4() macros.
4051d3a2bcSkettenis  * Each register must be accessed using 32 bit operations.
4151d3a2bcSkettenis  *
42d204baefSmiod  * All registers are accessed through a 16K shared memory block.
4351d3a2bcSkettenis  * The first group of registers are actually copies of the PCI
4451d3a2bcSkettenis  * configuration space registers.
4551d3a2bcSkettenis  */
4651d3a2bcSkettenis 
4751d3a2bcSkettenis #define TI_PCI_ID			PCI_ID_REG /* PCI device/vendor ID */
4851d3a2bcSkettenis #define TI_PCI_CMDSTAT			PCI_COMMAND_STATUS_REG
4951d3a2bcSkettenis #define TI_PCI_CLASSCODE		PCI_CLASS_REG
5051d3a2bcSkettenis #define TI_PCI_BIST			PCI_BHLC_REG
5151d3a2bcSkettenis #define TI_PCI_LOMEM			PCI_MAPS /* Shared memory base address */
5251d3a2bcSkettenis #define TI_PCI_SUBSYS			PCI_SUBVEND_0
5351d3a2bcSkettenis #define TI_PCI_ROMBASE			0x030
5451d3a2bcSkettenis #define TI_PCI_INT			PCI_INTLINE
5551d3a2bcSkettenis 
5651d3a2bcSkettenis /*
5751d3a2bcSkettenis  * Tigon configuration and control registers.
5851d3a2bcSkettenis  */
5951d3a2bcSkettenis #define TI_MISC_HOST_CTL		0x040
6051d3a2bcSkettenis #define TI_MISC_LOCAL_CTL		0x044
6151d3a2bcSkettenis #define TI_SEM_AB			0x048 /* Tigon 2 only */
6251d3a2bcSkettenis #define TI_MISC_CONF			0x050 /* Tigon 2 only */
6351d3a2bcSkettenis #define TI_TIMER_BITS			0x054
6451d3a2bcSkettenis #define TI_TIMERREF			0x058
6551d3a2bcSkettenis #define TI_PCI_STATE			0x05C
6651d3a2bcSkettenis #define TI_MAIN_EVENT_A			0x060
6751d3a2bcSkettenis #define TI_MAILBOX_EVENT_A		0x064
6851d3a2bcSkettenis #define TI_WINBASE			0x068
6951d3a2bcSkettenis #define TI_WINDATA			0x06C
7051d3a2bcSkettenis #define TI_MAIN_EVENT_B			0x070 /* Tigon 2 only */
7151d3a2bcSkettenis #define TI_MAILBOX_EVENT_B		0x074 /* Tigon 2 only */
7251d3a2bcSkettenis #define TI_TIMERREF_B			0x078 /* Tigon 2 only */
7351d3a2bcSkettenis #define TI_SERIAL			0x07C
7451d3a2bcSkettenis 
7551d3a2bcSkettenis /*
7651d3a2bcSkettenis  * Misc host control bits.
7751d3a2bcSkettenis  */
7851d3a2bcSkettenis #define TI_MHC_INTSTATE			0x00000001
7951d3a2bcSkettenis #define TI_MHC_CLEARINT			0x00000002
8051d3a2bcSkettenis #define TI_MHC_RESET			0x00000008
8151d3a2bcSkettenis #define TI_MHC_BYTE_SWAP_ENB		0x00000010
8251d3a2bcSkettenis #define TI_MHC_WORD_SWAP_ENB		0x00000020
8351d3a2bcSkettenis #define TI_MHC_MASK_INTS		0x00000040
8451d3a2bcSkettenis #define TI_MHC_CHIP_REV_MASK		0xF0000000
8551d3a2bcSkettenis 
8651d3a2bcSkettenis #define TI_MHC_BIGENDIAN_INIT	\
8751d3a2bcSkettenis 	(TI_MHC_BYTE_SWAP_ENB|TI_MHC_WORD_SWAP_ENB|TI_MHC_CLEARINT)
8851d3a2bcSkettenis 
8951d3a2bcSkettenis #define TI_MHC_LITTLEENDIAN_INIT	\
9051d3a2bcSkettenis 	(TI_MHC_WORD_SWAP_ENB|TI_MHC_CLEARINT)
9151d3a2bcSkettenis 
9251d3a2bcSkettenis /*
9351d3a2bcSkettenis  * Tigon chip rev values. Rev 4 is the Tigon 1. Rev 6 is the Tigon 2.
9451d3a2bcSkettenis  * Rev 5 is also the Tigon 2, but is a broken version which was never
9551d3a2bcSkettenis  * used in any actual hardware, so we ignore it.
9651d3a2bcSkettenis  */
9751d3a2bcSkettenis #define TI_REV_TIGON_I			0x40000000
9851d3a2bcSkettenis #define TI_REV_TIGON_II			0x60000000
9951d3a2bcSkettenis 
10051d3a2bcSkettenis /*
10151d3a2bcSkettenis  * Firmware revision that we want.
10251d3a2bcSkettenis  */
10351d3a2bcSkettenis #define TI_FIRMWARE_MAJOR		0xc
10451d3a2bcSkettenis #define TI_FIRMWARE_MINOR		0x4
10551d3a2bcSkettenis #define TI_FIRMWARE_FIX			0xd
10651d3a2bcSkettenis 
10751d3a2bcSkettenis /*
108*4b1a56afSjsg  * Miscellaneous Local Control registers.
10951d3a2bcSkettenis  */
11051d3a2bcSkettenis #define TI_MLC_EE_WRITE_ENB		0x00000010
11151d3a2bcSkettenis #define TI_MLC_SRAM_BANK_SIZE		0x00000300 /* Tigon 2 only */
11251d3a2bcSkettenis #define TI_MLC_LOCALADDR_21		0x00004000
11351d3a2bcSkettenis #define TI_MLC_LOCALADDR_22		0x00008000
11451d3a2bcSkettenis #define TI_MLC_SBUS_WRITEERR		0x00080000
11551d3a2bcSkettenis #define TI_MLC_EE_CLK			0x00100000
11651d3a2bcSkettenis #define TI_MLC_EE_TXEN			0x00200000
11751d3a2bcSkettenis #define TI_MLC_EE_DOUT			0x00400000
11851d3a2bcSkettenis #define TI_MLC_EE_DIN			0x00800000
11951d3a2bcSkettenis 
12051d3a2bcSkettenis /* Possible memory sizes. */
12151d3a2bcSkettenis #define TI_MLC_SRAM_BANK_DISA		0x00000000
12251d3a2bcSkettenis #define TI_MLC_SRAM_BANK_1024K		0x00000100
12351d3a2bcSkettenis #define TI_MLC_SRAM_BANK_512K		0x00000200
12451d3a2bcSkettenis #define TI_MLC_SRAM_BANK_256K		0x00000300
12551d3a2bcSkettenis 
12651d3a2bcSkettenis /*
12751d3a2bcSkettenis  * Offset of MAC address inside EEPROM.
12851d3a2bcSkettenis  */
12951d3a2bcSkettenis #define TI_EE_MAC_OFFSET		0x8c
13051d3a2bcSkettenis 
13151d3a2bcSkettenis #define TI_DMA_ASSIST			0x11C
13251d3a2bcSkettenis #define TI_CPU_STATE			0x140
13351d3a2bcSkettenis #define TI_CPU_PROGRAM_COUNTER		0x144
13451d3a2bcSkettenis #define TI_SRAM_ADDR			0x154
13551d3a2bcSkettenis #define TI_SRAM_DATA			0x158
13651d3a2bcSkettenis #define TI_GEN_0			0x180
13751d3a2bcSkettenis #define TI_GEN_X			0x1FC
13851d3a2bcSkettenis #define TI_MAC_TX_STATE			0x200
13951d3a2bcSkettenis #define TI_MAC_RX_STATE			0x220
14051d3a2bcSkettenis #define TI_CPU_CTL_B			0x240 /* Tigon 2 only */
14151d3a2bcSkettenis #define TI_CPU_PROGRAM_COUNTER_B	0x244 /* Tigon 2 only */
14251d3a2bcSkettenis #define TI_SRAM_ADDR_B			0x254 /* Tigon 2 only */
14351d3a2bcSkettenis #define TI_SRAM_DATA_B			0x258 /* Tigon 2 only */
14451d3a2bcSkettenis #define TI_GEN_B_0			0x280 /* Tigon 2 only */
14551d3a2bcSkettenis #define TI_GEN_B_X			0x2FC /* Tigon 2 only */
14651d3a2bcSkettenis 
14751d3a2bcSkettenis /*
14851d3a2bcSkettenis  * Misc config register.
14951d3a2bcSkettenis  */
15051d3a2bcSkettenis #define TI_MCR_SRAM_SYNCHRONOUS		0x00100000 /* Tigon 2 only */
15151d3a2bcSkettenis 
15251d3a2bcSkettenis /*
15351d3a2bcSkettenis  * PCI state register.
15451d3a2bcSkettenis  */
15551d3a2bcSkettenis #define TI_PCISTATE_FORCE_RESET		0x00000001
15651d3a2bcSkettenis #define TI_PCISTATE_PROVIDE_LEN		0x00000002
15751d3a2bcSkettenis #define TI_PCISTATE_READ_MAXDMA		0x0000001C
15851d3a2bcSkettenis #define TI_PCISTATE_WRITE_MAXDMA	0x000000E0
15951d3a2bcSkettenis #define TI_PCISTATE_MINDMA		0x0000FF00
16051d3a2bcSkettenis #define TI_PCISTATE_FIFO_RETRY_ENB	0x00010000
16151d3a2bcSkettenis #define TI_PCISTATE_USE_MEM_RD_MULT	0x00020000
16251d3a2bcSkettenis #define TI_PCISTATE_NO_SWAP_READ_DMA	0x00040000
16351d3a2bcSkettenis #define TI_PCISTATE_NO_SWAP_WRITE_DMA	0x00080000
16451d3a2bcSkettenis #define TI_PCISTATE_66MHZ_BUS		0x00080000 /* Tigon 2 only */
16551d3a2bcSkettenis #define TI_PCISTATE_32BIT_BUS		0x00100000 /* Tigon 2 only */
16651d3a2bcSkettenis #define TI_PCISTATE_ENB_BYTE_ENABLES	0x00800000 /* Tigon 2 only */
16751d3a2bcSkettenis #define TI_PCISTATE_READ_CMD		0x0F000000
16851d3a2bcSkettenis #define TI_PCISTATE_WRITE_CMD		0xF0000000
16951d3a2bcSkettenis 
17051d3a2bcSkettenis #define TI_PCI_READMAX_4		0x04
17151d3a2bcSkettenis #define TI_PCI_READMAX_16		0x08
17251d3a2bcSkettenis #define TI_PCI_READMAX_32		0x0C
17351d3a2bcSkettenis #define TI_PCI_READMAX_64		0x10
17451d3a2bcSkettenis #define TI_PCI_READMAX_128		0x14
17551d3a2bcSkettenis #define TI_PCI_READMAX_256		0x18
17651d3a2bcSkettenis #define TI_PCI_READMAX_1024		0x1C
17751d3a2bcSkettenis 
17851d3a2bcSkettenis #define TI_PCI_WRITEMAX_4		0x20
17951d3a2bcSkettenis #define TI_PCI_WRITEMAX_16		0x40
18051d3a2bcSkettenis #define TI_PCI_WRITEMAX_32		0x60
18151d3a2bcSkettenis #define TI_PCI_WRITEMAX_64		0x80
18251d3a2bcSkettenis #define TI_PCI_WRITEMAX_128		0xA0
18351d3a2bcSkettenis #define TI_PCI_WRITEMAX_256		0xC0
18451d3a2bcSkettenis #define TI_PCI_WRITEMAX_1024		0xE0
18551d3a2bcSkettenis 
18651d3a2bcSkettenis #define TI_PCI_READ_CMD			0x06000000
18751d3a2bcSkettenis #define TI_PCI_WRITE_CMD		0x70000000
18851d3a2bcSkettenis 
18951d3a2bcSkettenis /*
19051d3a2bcSkettenis  * DMA state register.
19151d3a2bcSkettenis  */
19251d3a2bcSkettenis #define TI_DMASTATE_ENABLE		0x00000001
19351d3a2bcSkettenis #define TI_DMASTATE_PAUSE		0x00000002
19451d3a2bcSkettenis 
19551d3a2bcSkettenis /*
19651d3a2bcSkettenis  * CPU state register.
19751d3a2bcSkettenis  */
19851d3a2bcSkettenis #define TI_CPUSTATE_RESET		0x00000001
19951d3a2bcSkettenis #define TI_CPUSTATE_STEP		0x00000002
20051d3a2bcSkettenis #define TI_CPUSTATE_ROMFAIL		0x00000010
20151d3a2bcSkettenis #define TI_CPUSTATE_HALT		0x00010000
20251d3a2bcSkettenis /*
20351d3a2bcSkettenis  * MAC TX state register
20451d3a2bcSkettenis  */
20551d3a2bcSkettenis #define TI_TXSTATE_RESET		0x00000001
20651d3a2bcSkettenis #define TI_TXSTATE_ENB			0x00000002
20751d3a2bcSkettenis #define TI_TXSTATE_STOP			0x00000004
20851d3a2bcSkettenis 
20951d3a2bcSkettenis /*
21051d3a2bcSkettenis  * MAC RX state register
21151d3a2bcSkettenis  */
21251d3a2bcSkettenis #define TI_RXSTATE_RESET		0x00000001
21351d3a2bcSkettenis #define TI_RXSTATE_ENB			0x00000002
21451d3a2bcSkettenis #define TI_RXSTATE_STOP			0x00000004
21551d3a2bcSkettenis 
21651d3a2bcSkettenis /*
21751d3a2bcSkettenis  * Tigon 2 mailbox registers. The mailbox area consists of 256 bytes
21851d3a2bcSkettenis  * split into 64 bit registers. Only the lower 32 bits of each mailbox
21951d3a2bcSkettenis  * are used.
22051d3a2bcSkettenis  */
22151d3a2bcSkettenis #define TI_MB_HOSTINTR_HI		0x500
22251d3a2bcSkettenis #define TI_MB_HOSTINTR_LO		0x504
22351d3a2bcSkettenis #define TI_MB_HOSTINTR			TI_MB_HOSTINTR_LO
22451d3a2bcSkettenis #define TI_MB_CMDPROD_IDX_HI		0x508
22551d3a2bcSkettenis #define TI_MB_CMDPROD_IDX_LO		0x50C
22651d3a2bcSkettenis #define TI_MB_CMDPROD_IDX		TI_MB_CMDPROD_IDX_LO
22751d3a2bcSkettenis #define TI_MB_SENDPROD_IDX_HI		0x510
22851d3a2bcSkettenis #define TI_MB_SENDPROD_IDX_LO		0x514
22951d3a2bcSkettenis #define TI_MB_SENDPROD_IDX		TI_MB_SENDPROD_IDX_LO
23051d3a2bcSkettenis #define TI_MB_STDRXPROD_IDX_HI		0x518 /* Tigon 2 only */
23151d3a2bcSkettenis #define TI_MB_STDRXPROD_IDX_LO		0x51C /* Tigon 2 only */
23251d3a2bcSkettenis #define TI_MB_STDRXPROD_IDX		TI_MB_STDRXPROD_IDX_LO
23351d3a2bcSkettenis #define TI_MB_JUMBORXPROD_IDX_HI	0x520 /* Tigon 2 only */
23451d3a2bcSkettenis #define TI_MB_JUMBORXPROD_IDX_LO	0x524 /* Tigon 2 only */
23551d3a2bcSkettenis #define TI_MB_JUMBORXPROD_IDX		TI_MB_JUMBORXPROD_IDX_LO
23651d3a2bcSkettenis #define TI_MB_MINIRXPROD_IDX_HI		0x528 /* Tigon 2 only */
23751d3a2bcSkettenis #define TI_MB_MINIRXPROD_IDX_LO		0x52C /* Tigon 2 only */
23851d3a2bcSkettenis #define TI_MB_MINIRXPROD_IDX		TI_MB_MINIRXPROD_IDX_LO
23951d3a2bcSkettenis #define TI_MB_RSVD			0x530
24051d3a2bcSkettenis 
24151d3a2bcSkettenis /*
24251d3a2bcSkettenis  * Tigon 2 general communication registers. These are 64 and 32 bit
24351d3a2bcSkettenis  * registers which are only valid after the firmware has been
24451d3a2bcSkettenis  * loaded and started. They actually exist in NIC memory but are
24551d3a2bcSkettenis  * mapped into the host memory via the shared memory region.
24651d3a2bcSkettenis  *
24751d3a2bcSkettenis  * The NIC internally maps these registers starting at address 0,
24851d3a2bcSkettenis  * so to determine the NIC address of any of these registers, we
24951d3a2bcSkettenis  * subtract 0x600 (the address of the first register).
25051d3a2bcSkettenis  */
25151d3a2bcSkettenis 
25251d3a2bcSkettenis #define TI_GCR_BASE			0x600
25351d3a2bcSkettenis #define TI_GCR_MACADDR			0x600
25451d3a2bcSkettenis #define TI_GCR_PAR0			0x600
25551d3a2bcSkettenis #define TI_GCR_PAR1			0x604
25651d3a2bcSkettenis #define TI_GCR_GENINFO_HI		0x608
25751d3a2bcSkettenis #define TI_GCR_GENINFO_LO		0x60C
25851d3a2bcSkettenis #define TI_GCR_MCASTADDR		0x610 /* obsolete */
25951d3a2bcSkettenis #define TI_GCR_MAR0			0x610 /* obsolete */
26051d3a2bcSkettenis #define TI_GCR_MAR1			0x614 /* obsolete */
26151d3a2bcSkettenis #define TI_GCR_OPMODE			0x618
26251d3a2bcSkettenis #define TI_GCR_DMA_READCFG		0x61C
26351d3a2bcSkettenis #define TI_GCR_DMA_WRITECFG		0x620
26451d3a2bcSkettenis #define TI_GCR_TX_BUFFER_RATIO		0x624
26551d3a2bcSkettenis #define TI_GCR_EVENTCONS_IDX		0x628
26651d3a2bcSkettenis #define TI_GCR_CMDCONS_IDX		0x62C
26751d3a2bcSkettenis #define TI_GCR_TUNEPARMS		0x630
26851d3a2bcSkettenis #define TI_GCR_RX_COAL_TICKS		0x630
26951d3a2bcSkettenis #define TI_GCR_TX_COAL_TICKS		0x634
27051d3a2bcSkettenis #define TI_GCR_STAT_TICKS		0x638
27151d3a2bcSkettenis #define TI_GCR_TX_MAX_COAL_BD		0x63C
27251d3a2bcSkettenis #define TI_GCR_RX_MAX_COAL_BD		0x640
27351d3a2bcSkettenis #define TI_GCR_NIC_TRACING		0x644
27451d3a2bcSkettenis #define TI_GCR_GLINK			0x648
27551d3a2bcSkettenis #define TI_GCR_LINK			0x64C
27651d3a2bcSkettenis #define TI_GCR_NICTRACE_PTR		0x650
27751d3a2bcSkettenis #define TI_GCR_NICTRACE_START		0x654
27851d3a2bcSkettenis #define TI_GCR_NICTRACE_LEN		0x658
27951d3a2bcSkettenis #define TI_GCR_IFINDEX			0x65C
28051d3a2bcSkettenis #define TI_GCR_IFMTU			0x660
28151d3a2bcSkettenis #define TI_GCR_MASK_INTRS		0x664
28251d3a2bcSkettenis #define TI_GCR_GLINK_STAT		0x668
28351d3a2bcSkettenis #define TI_GCR_LINK_STAT		0x66C
28451d3a2bcSkettenis #define TI_GCR_RXRETURNCONS_IDX		0x680
28551d3a2bcSkettenis #define TI_GCR_CMDRING			0x700
28651d3a2bcSkettenis 
28751d3a2bcSkettenis #define TI_GCR_NIC_ADDR(x)		(x - TI_GCR_BASE)
28851d3a2bcSkettenis 
28951d3a2bcSkettenis /*
29051d3a2bcSkettenis  * Local memory window. The local memory window is a 2K shared
29151d3a2bcSkettenis  * memory region which can be used to access the NIC's internal
29251d3a2bcSkettenis  * SRAM. The window can be mapped to a given 2K region using
29351d3a2bcSkettenis  * the TI_WINDOW_BASE register.
29451d3a2bcSkettenis  */
29551d3a2bcSkettenis #define TI_WINDOW			0x800
29651d3a2bcSkettenis #define TI_WINLEN			0x800
29751d3a2bcSkettenis 
29851d3a2bcSkettenis #define TI_TICKS_PER_SEC		1000000
29951d3a2bcSkettenis 
30051d3a2bcSkettenis /*
30151d3a2bcSkettenis  * Operation mode register.
30251d3a2bcSkettenis  */
30351d3a2bcSkettenis #define TI_OPMODE_BYTESWAP_BD		0x00000002
30451d3a2bcSkettenis #define TI_OPMODE_WORDSWAP_BD		0x00000004
30551d3a2bcSkettenis #define TI_OPMODE_WARN_ENB		0x00000008 /* not yet implemented */
30651d3a2bcSkettenis #define TI_OPMODE_BYTESWAP_DATA		0x00000010
30751d3a2bcSkettenis #define TI_OPMODE_1_DMA_ACTIVE		0x00000040
30851d3a2bcSkettenis #define TI_OPMODE_SBUS			0x00000100
30951d3a2bcSkettenis #define TI_OPMODE_DONT_FRAG_JUMBO	0x00000200
31051d3a2bcSkettenis #define TI_OPMODE_INCLUDE_CRC		0x00000400
31151d3a2bcSkettenis #define TI_OPMODE_RX_BADFRAMES		0x00000800
31251d3a2bcSkettenis #define TI_OPMODE_NO_EVENT_INTRS	0x00001000
31351d3a2bcSkettenis #define TI_OPMODE_NO_TX_INTRS		0x00002000
31451d3a2bcSkettenis #define TI_OPMODE_NO_RX_INTRS		0x00004000
31551d3a2bcSkettenis #define TI_OPMODE_FATAL_ENB		0x40000000 /* not yet implemented */
31651d3a2bcSkettenis 
31751d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
31851d3a2bcSkettenis #define TI_DMA_SWAP_OPTIONS \
31951d3a2bcSkettenis 	TI_OPMODE_BYTESWAP_DATA| \
32051d3a2bcSkettenis 	TI_OPMODE_BYTESWAP_BD|TI_OPMODE_WORDSWAP_BD
32151d3a2bcSkettenis #else
32251d3a2bcSkettenis #define TI_DMA_SWAP_OPTIONS \
32351d3a2bcSkettenis 	TI_OPMODE_BYTESWAP_DATA
32451d3a2bcSkettenis #endif
32551d3a2bcSkettenis 
32651d3a2bcSkettenis /*
32751d3a2bcSkettenis  * DMA configuration thresholds.
32851d3a2bcSkettenis  */
32951d3a2bcSkettenis #define TI_DMA_STATE_THRESH_16W		0x00000100
33051d3a2bcSkettenis #define TI_DMA_STATE_THRESH_8W		0x00000080
33151d3a2bcSkettenis #define TI_DMA_STATE_THRESH_4W		0x00000040
33251d3a2bcSkettenis #define TI_DMA_STATE_THRESH_2W		0x00000020
33351d3a2bcSkettenis #define TI_DMA_STATE_THRESH_1W		0x00000010
33451d3a2bcSkettenis 
33551d3a2bcSkettenis #define TI_DMA_STATE_FORCE_32_BIT	0x00000008
33651d3a2bcSkettenis 
33751d3a2bcSkettenis /*
33851d3a2bcSkettenis  * Gigabit link status bits.
33951d3a2bcSkettenis  */
34051d3a2bcSkettenis #define TI_GLNK_SENSE_NO_BEG		0x00002000
34151d3a2bcSkettenis #define TI_GLNK_LOOPBACK		0x00004000
34251d3a2bcSkettenis #define TI_GLNK_PREF			0x00008000
34351d3a2bcSkettenis #define TI_GLNK_1000MB			0x00040000
34451d3a2bcSkettenis #define TI_GLNK_FULL_DUPLEX		0x00080000
34551d3a2bcSkettenis #define TI_GLNK_TX_FLOWCTL_Y		0x00200000 /* Tigon 2 only */
34651d3a2bcSkettenis #define TI_GLNK_RX_FLOWCTL_Y		0x00800000
34751d3a2bcSkettenis #define TI_GLNK_AUTONEGENB		0x20000000
34851d3a2bcSkettenis #define TI_GLNK_ENB			0x40000000
34951d3a2bcSkettenis 
35051d3a2bcSkettenis /*
35151d3a2bcSkettenis  * Link status bits.
35251d3a2bcSkettenis  */
35351d3a2bcSkettenis #define TI_LNK_LOOPBACK			0x00004000
35451d3a2bcSkettenis #define TI_LNK_PREF			0x00008000
35551d3a2bcSkettenis #define TI_LNK_10MB			0x00010000
35651d3a2bcSkettenis #define TI_LNK_100MB			0x00020000
35751d3a2bcSkettenis #define TI_LNK_1000MB			0x00040000
35851d3a2bcSkettenis #define TI_LNK_FULL_DUPLEX		0x00080000
35951d3a2bcSkettenis #define TI_LNK_HALF_DUPLEX		0x00100000
36051d3a2bcSkettenis #define TI_LNK_TX_FLOWCTL_Y		0x00200000 /* Tigon 2 only */
36151d3a2bcSkettenis #define TI_LNK_RX_FLOWCTL_Y		0x00800000
36251d3a2bcSkettenis #define TI_LNK_AUTONEGENB		0x20000000
36351d3a2bcSkettenis #define TI_LNK_ENB			0x40000000
36451d3a2bcSkettenis 
36551d3a2bcSkettenis /*
36651d3a2bcSkettenis  * Ring size constants.
36751d3a2bcSkettenis  */
36851d3a2bcSkettenis #define TI_EVENT_RING_CNT	256
36951d3a2bcSkettenis #define TI_CMD_RING_CNT		64
37051d3a2bcSkettenis #define TI_STD_RX_RING_CNT	512
37151d3a2bcSkettenis #define TI_JUMBO_RX_RING_CNT	256
37251d3a2bcSkettenis #define TI_MINI_RX_RING_CNT	1024
37351d3a2bcSkettenis #define TI_RETURN_RING_CNT	2048
37451d3a2bcSkettenis 
37551d3a2bcSkettenis /*
37651d3a2bcSkettenis  * Possible TX ring sizes.
37751d3a2bcSkettenis  */
37851d3a2bcSkettenis #define TI_TX_RING_CNT_128	128
37951d3a2bcSkettenis #define TI_TX_RING_BASE_128	0x3800
38051d3a2bcSkettenis 
38151d3a2bcSkettenis #define TI_TX_RING_CNT_256	256
38251d3a2bcSkettenis #define TI_TX_RING_BASE_256	0x3000
38351d3a2bcSkettenis 
38451d3a2bcSkettenis #define TI_TX_RING_CNT_512	512
38551d3a2bcSkettenis #define TI_TX_RING_BASE_512	0x2000
38651d3a2bcSkettenis 
38751d3a2bcSkettenis #define TI_TX_RING_CNT		TI_TX_RING_CNT_512
38851d3a2bcSkettenis #define TI_TX_RING_BASE		TI_TX_RING_BASE_512
38951d3a2bcSkettenis 
39051d3a2bcSkettenis /*
39151d3a2bcSkettenis  * The Tigon can have up to 8MB of external SRAM, however the Tigon 1
39251d3a2bcSkettenis  * is limited to 2MB total, and in general I think most adapters have
39351d3a2bcSkettenis  * around 1MB. We use this value for zeroing the NIC's SRAM, so to
39451d3a2bcSkettenis  * be safe we use the largest possible value (zeroing memory that
39551d3a2bcSkettenis  * isn't there doesn't hurt anything).
39651d3a2bcSkettenis  */
39751d3a2bcSkettenis #define TI_MEM_MAX		0x7FFFFF
39851d3a2bcSkettenis 
39951d3a2bcSkettenis /*
40051d3a2bcSkettenis  * Even on the alpha, pci addresses are 32-bit quantities
40151d3a2bcSkettenis  */
40251d3a2bcSkettenis 
40351d3a2bcSkettenis typedef struct {
40451d3a2bcSkettenis 	u_int32_t		ti_addr_hi;
40551d3a2bcSkettenis 	u_int32_t		ti_addr_lo;
40651d3a2bcSkettenis } ti_hostaddr;
40751d3a2bcSkettenis #define TI_HOSTADDR(x)	x.ti_addr_lo
40851d3a2bcSkettenis 
40951d3a2bcSkettenis /*
41051d3a2bcSkettenis  * Ring control block structure. The rules for the max_len field
41151d3a2bcSkettenis  * are as follows:
41251d3a2bcSkettenis  *
41351d3a2bcSkettenis  * For the send ring, max_len indicates the number of entries in the
41451d3a2bcSkettenis  * ring (128, 256 or 512).
41551d3a2bcSkettenis  *
41651d3a2bcSkettenis  * For the standard receive ring, max_len indicates the threshold
41751d3a2bcSkettenis  * used to decide when a frame should be put in the jumbo receive ring
41851d3a2bcSkettenis  * instead of the standard one.
41951d3a2bcSkettenis  *
42051d3a2bcSkettenis  * For the mini ring, max_len indicates the size of the buffers in the
42151d3a2bcSkettenis  * ring. This is the value used to decide when a frame is small enough
42251d3a2bcSkettenis  * to be placed in the mini ring.
42351d3a2bcSkettenis  *
42451d3a2bcSkettenis  * For the return receive ring, max_len indicates the number of entries
42551d3a2bcSkettenis  * in the ring. It can be one of 2048, 1024 or 0 (which is the same as
42651d3a2bcSkettenis  * 2048 for backwards compatibility). The value 1024 can only be used
42751d3a2bcSkettenis  * if the mini ring is disabled.
42851d3a2bcSkettenis  */
42951d3a2bcSkettenis struct ti_rcb {
43051d3a2bcSkettenis 	ti_hostaddr		ti_hostaddr;
43151d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
43251d3a2bcSkettenis 	u_int16_t		ti_max_len;
43351d3a2bcSkettenis 	u_int16_t		ti_flags;
43451d3a2bcSkettenis #else
43551d3a2bcSkettenis 	u_int16_t		ti_flags;
43651d3a2bcSkettenis 	u_int16_t		ti_max_len;
43751d3a2bcSkettenis #endif
43851d3a2bcSkettenis 	u_int32_t		ti_unused;
43951d3a2bcSkettenis };
44051d3a2bcSkettenis 
44151d3a2bcSkettenis #define TI_RCB_FLAG_TCP_UDP_CKSUM	0x00000001
44251d3a2bcSkettenis #define TI_RCB_FLAG_IP_CKSUM		0x00000002
44351d3a2bcSkettenis #define TI_RCB_FLAG_NO_PHDR_CKSUM	0x00000008
44451d3a2bcSkettenis #define TI_RCB_FLAG_VLAN_ASSIST		0x00000010
44551d3a2bcSkettenis #define TI_RCB_FLAG_COAL_UPD_ONLY	0x00000020
44651d3a2bcSkettenis #define TI_RCB_FLAG_HOST_RING		0x00000040
44751d3a2bcSkettenis #define TI_RCB_FLAG_IEEE_SNAP_CKSUM	0x00000080
44851d3a2bcSkettenis #define TI_RCB_FLAG_USE_EXT_RX_BD	0x00000100
44951d3a2bcSkettenis #define TI_RCB_FLAG_RING_DISABLED	0x00000200
45051d3a2bcSkettenis 
45151d3a2bcSkettenis struct ti_producer {
45251d3a2bcSkettenis 	u_int32_t		ti_idx;
45351d3a2bcSkettenis 	u_int32_t		ti_unused;
45451d3a2bcSkettenis };
45551d3a2bcSkettenis 
45651d3a2bcSkettenis /*
45751d3a2bcSkettenis  * Tigon statistics counters.
45851d3a2bcSkettenis  */
45951d3a2bcSkettenis struct ti_stats {
46051d3a2bcSkettenis 	/*
46151d3a2bcSkettenis 	 * MAC stats, taken from RFC 1643, ethernet-like MIB
46251d3a2bcSkettenis 	 */
46351d3a2bcSkettenis 	volatile u_int32_t dot3StatsAlignmentErrors;		/* 0 */
46451d3a2bcSkettenis 	volatile u_int32_t dot3StatsFCSErrors;			/* 1 */
46551d3a2bcSkettenis 	volatile u_int32_t dot3StatsSingleCollisionFrames;	/* 2 */
46651d3a2bcSkettenis 	volatile u_int32_t dot3StatsMultipleCollisionFrames;	/* 3 */
46751d3a2bcSkettenis 	volatile u_int32_t dot3StatsSQETestErrors;		/* 4 */
46851d3a2bcSkettenis 	volatile u_int32_t dot3StatsDeferredTransmissions;	/* 5 */
46951d3a2bcSkettenis 	volatile u_int32_t dot3StatsLateCollisions;		/* 6 */
47051d3a2bcSkettenis 	volatile u_int32_t dot3StatsExcessiveCollisions;	/* 7 */
47151d3a2bcSkettenis 	volatile u_int32_t dot3StatsInternalMacTransmitErrors;	/* 8 */
47251d3a2bcSkettenis 	volatile u_int32_t dot3StatsCarrierSenseErrors;		/* 9 */
47351d3a2bcSkettenis 	volatile u_int32_t dot3StatsFrameTooLongs;		/* 10 */
47451d3a2bcSkettenis 	volatile u_int32_t dot3StatsInternalMacReceiveErrors;	/* 11 */
47551d3a2bcSkettenis 	/*
47651d3a2bcSkettenis 	 * interface stats, taken from RFC 1213, MIB-II, interfaces group
47751d3a2bcSkettenis 	 */
47851d3a2bcSkettenis 	volatile u_int32_t ifIndex;				/* 12 */
47951d3a2bcSkettenis 	volatile u_int32_t ifType;				/* 13 */
48051d3a2bcSkettenis 	volatile u_int32_t ifMtu;				/* 14 */
48151d3a2bcSkettenis 	volatile u_int32_t ifSpeed;				/* 15 */
48251d3a2bcSkettenis 	volatile u_int32_t ifAdminStatus;			/* 16 */
48351d3a2bcSkettenis #define IF_ADMIN_STATUS_UP      1
48451d3a2bcSkettenis #define IF_ADMIN_STATUS_DOWN    2
48551d3a2bcSkettenis #define IF_ADMIN_STATUS_TESTING 3
48651d3a2bcSkettenis 	volatile u_int32_t ifOperStatus;			/* 17 */
48751d3a2bcSkettenis #define IF_OPER_STATUS_UP       1
48851d3a2bcSkettenis #define IF_OPER_STATUS_DOWN     2
48951d3a2bcSkettenis #define IF_OPER_STATUS_TESTING  3
49051d3a2bcSkettenis #define IF_OPER_STATUS_UNKNOWN  4
49151d3a2bcSkettenis #define IF_OPER_STATUS_DORMANT  5
49251d3a2bcSkettenis 	volatile u_int32_t ifLastChange;			/* 18 */
49351d3a2bcSkettenis 	volatile u_int32_t ifInDiscards;			/* 19 */
49451d3a2bcSkettenis 	volatile u_int32_t ifInErrors;				/* 20 */
49551d3a2bcSkettenis 	volatile u_int32_t ifInUnknownProtos;			/* 21 */
49651d3a2bcSkettenis 	volatile u_int32_t ifOutDiscards;			/* 22 */
49751d3a2bcSkettenis 	volatile u_int32_t ifOutErrors;				/* 23 */
49851d3a2bcSkettenis 	volatile u_int32_t ifOutQLen;     /* deprecated */	/* 24 */
49951d3a2bcSkettenis 	volatile u_int8_t  ifPhysAddress[8]; /* 8 bytes */	/* 25 - 26 */
50051d3a2bcSkettenis 	volatile u_int8_t  ifDescr[32];				/* 27 - 34 */
50151d3a2bcSkettenis 	u_int32_t alignIt;      /* align to 64 bit for u_int64_ts following */
50251d3a2bcSkettenis 	/*
50351d3a2bcSkettenis 	 * more interface stats, taken from RFC 1573, MIB-IIupdate,
50451d3a2bcSkettenis 	 * interfaces group
50551d3a2bcSkettenis 	 */
50651d3a2bcSkettenis 	volatile u_int64_t ifHCInOctets;			/* 36 - 37 */
50751d3a2bcSkettenis 	volatile u_int64_t ifHCInUcastPkts;			/* 38 - 39 */
50851d3a2bcSkettenis 	volatile u_int64_t ifHCInMulticastPkts;			/* 40 - 41 */
50951d3a2bcSkettenis 	volatile u_int64_t ifHCInBroadcastPkts;			/* 42 - 43 */
51051d3a2bcSkettenis 	volatile u_int64_t ifHCOutOctets;			/* 44 - 45 */
51151d3a2bcSkettenis 	volatile u_int64_t ifHCOutUcastPkts;			/* 46 - 47 */
51251d3a2bcSkettenis 	volatile u_int64_t ifHCOutMulticastPkts;		/* 48 - 49 */
51351d3a2bcSkettenis 	volatile u_int64_t ifHCOutBroadcastPkts;		/* 50 - 51 */
51451d3a2bcSkettenis 	volatile u_int32_t ifLinkUpDownTrapEnable;		/* 52 */
51551d3a2bcSkettenis 	volatile u_int32_t ifHighSpeed;				/* 53 */
51651d3a2bcSkettenis 	volatile u_int32_t ifPromiscuousMode; 			/* 54 */
51751d3a2bcSkettenis 	volatile u_int32_t ifConnectorPresent; /* follow link state 55 */
51851d3a2bcSkettenis 	/*
51951d3a2bcSkettenis 	 * Host Commands
52051d3a2bcSkettenis 	 */
52151d3a2bcSkettenis 	volatile u_int32_t nicCmdsHostState;			/* 56 */
52251d3a2bcSkettenis 	volatile u_int32_t nicCmdsFDRFiltering;			/* 57 */
52351d3a2bcSkettenis 	volatile u_int32_t nicCmdsSetRecvProdIndex;		/* 58 */
52451d3a2bcSkettenis 	volatile u_int32_t nicCmdsUpdateGencommStats;		/* 59 */
52551d3a2bcSkettenis 	volatile u_int32_t nicCmdsResetJumboRing;		/* 60 */
52651d3a2bcSkettenis 	volatile u_int32_t nicCmdsAddMCastAddr;			/* 61 */
52751d3a2bcSkettenis 	volatile u_int32_t nicCmdsDelMCastAddr;			/* 62 */
52851d3a2bcSkettenis 	volatile u_int32_t nicCmdsSetPromiscMode;		/* 63 */
52951d3a2bcSkettenis 	volatile u_int32_t nicCmdsLinkNegotiate;		/* 64 */
53051d3a2bcSkettenis 	volatile u_int32_t nicCmdsSetMACAddr;			/* 65 */
53151d3a2bcSkettenis 	volatile u_int32_t nicCmdsClearProfile;			/* 66 */
53251d3a2bcSkettenis 	volatile u_int32_t nicCmdsSetMulticastMode;		/* 67 */
53351d3a2bcSkettenis 	volatile u_int32_t nicCmdsClearStats;			/* 68 */
53451d3a2bcSkettenis 	volatile u_int32_t nicCmdsSetRecvJumboProdIndex;	/* 69 */
53551d3a2bcSkettenis 	volatile u_int32_t nicCmdsSetRecvMiniProdIndex;		/* 70 */
53651d3a2bcSkettenis 	volatile u_int32_t nicCmdsRefreshStats;			/* 71 */
53751d3a2bcSkettenis 	volatile u_int32_t nicCmdsUnknown;			/* 72 */
53851d3a2bcSkettenis 	/*
53951d3a2bcSkettenis 	 * NIC Events
54051d3a2bcSkettenis 	 */
54151d3a2bcSkettenis 	volatile u_int32_t nicEventsNICFirmwareOperational;	/* 73 */
54251d3a2bcSkettenis 	volatile u_int32_t nicEventsStatsUpdated;		/* 74 */
54351d3a2bcSkettenis 	volatile u_int32_t nicEventsLinkStateChanged;		/* 75 */
54451d3a2bcSkettenis 	volatile u_int32_t nicEventsError;			/* 76 */
54551d3a2bcSkettenis 	volatile u_int32_t nicEventsMCastListUpdated;		/* 77 */
54651d3a2bcSkettenis 	volatile u_int32_t nicEventsResetJumboRing;		/* 78 */
54751d3a2bcSkettenis 	/*
54851d3a2bcSkettenis 	 * Ring manipulation
54951d3a2bcSkettenis 	 */
55051d3a2bcSkettenis 	volatile u_int32_t nicRingSetSendProdIndex;		/* 79 */
55151d3a2bcSkettenis 	volatile u_int32_t nicRingSetSendConsIndex;		/* 80 */
55251d3a2bcSkettenis 	volatile u_int32_t nicRingSetRecvReturnProdIndex;	/* 81 */
55351d3a2bcSkettenis 	/*
55451d3a2bcSkettenis 	 * Interrupts
55551d3a2bcSkettenis 	 */
55651d3a2bcSkettenis 	volatile u_int32_t nicInterrupts;			/* 82 */
55751d3a2bcSkettenis 	volatile u_int32_t nicAvoidedInterrupts;		/* 83 */
55851d3a2bcSkettenis 	/*
559*4b1a56afSjsg 	 * BD Coalescing Thresholds
56051d3a2bcSkettenis 	 */
56151d3a2bcSkettenis 	volatile u_int32_t nicEventThresholdHit;		/* 84 */
56251d3a2bcSkettenis 	volatile u_int32_t nicSendThresholdHit;			/* 85 */
56351d3a2bcSkettenis 	volatile u_int32_t nicRecvThresholdHit;			/* 86 */
56451d3a2bcSkettenis 	/*
56551d3a2bcSkettenis 	 * DMA Attentions
56651d3a2bcSkettenis 	 */
56751d3a2bcSkettenis 	volatile u_int32_t nicDmaRdOverrun;			/* 87 */
56851d3a2bcSkettenis 	volatile u_int32_t nicDmaRdUnderrun;			/* 88 */
56951d3a2bcSkettenis 	volatile u_int32_t nicDmaWrOverrun;			/* 89 */
57051d3a2bcSkettenis 	volatile u_int32_t nicDmaWrUnderrun;			/* 90 */
57151d3a2bcSkettenis 	volatile u_int32_t nicDmaWrMasterAborts;		/* 91 */
57251d3a2bcSkettenis 	volatile u_int32_t nicDmaRdMasterAborts;		/* 92 */
57351d3a2bcSkettenis 	/*
57451d3a2bcSkettenis 	 * NIC Resources
57551d3a2bcSkettenis 	 */
57651d3a2bcSkettenis 	volatile u_int32_t nicDmaWriteRingFull;			/* 93 */
57751d3a2bcSkettenis 	volatile u_int32_t nicDmaReadRingFull;			/* 94 */
57851d3a2bcSkettenis 	volatile u_int32_t nicEventRingFull;			/* 95 */
57951d3a2bcSkettenis 	volatile u_int32_t nicEventProducerRingFull;		/* 96 */
58051d3a2bcSkettenis 	volatile u_int32_t nicTxMacDescrRingFull;		/* 97 */
58151d3a2bcSkettenis 	volatile u_int32_t nicOutOfTxBufSpaceFrameRetry;	/* 98 */
58251d3a2bcSkettenis 	volatile u_int32_t nicNoMoreWrDMADescriptors;		/* 99 */
58351d3a2bcSkettenis 	volatile u_int32_t nicNoMoreRxBDs;			/* 100 */
58451d3a2bcSkettenis 	volatile u_int32_t nicNoSpaceInReturnRing;		/* 101 */
58551d3a2bcSkettenis 	volatile u_int32_t nicSendBDs;            /* current count 102 */
58651d3a2bcSkettenis 	volatile u_int32_t nicRecvBDs;            /* current count 103 */
58751d3a2bcSkettenis 	volatile u_int32_t nicJumboRecvBDs;       /* current count 104 */
58851d3a2bcSkettenis 	volatile u_int32_t nicMiniRecvBDs;        /* current count 105 */
58951d3a2bcSkettenis 	volatile u_int32_t nicTotalRecvBDs;       /* current count 106 */
59051d3a2bcSkettenis 	volatile u_int32_t nicTotalSendBDs;       /* current count 107 */
59151d3a2bcSkettenis 	volatile u_int32_t nicJumboSpillOver;			/* 108 */
59251d3a2bcSkettenis 	volatile u_int32_t nicSbusHangCleared;			/* 109 */
59351d3a2bcSkettenis 	volatile u_int32_t nicEnqEventDelayed;			/* 110 */
59451d3a2bcSkettenis 	/*
59551d3a2bcSkettenis 	 * Stats from MAC rx completion
59651d3a2bcSkettenis 	 */
59751d3a2bcSkettenis 	volatile u_int32_t nicMacRxLateColls;			/* 111 */
59851d3a2bcSkettenis 	volatile u_int32_t nicMacRxLinkLostDuringPkt;		/* 112 */
59951d3a2bcSkettenis 	volatile u_int32_t nicMacRxPhyDecodeErr;		/* 113 */
60051d3a2bcSkettenis 	volatile u_int32_t nicMacRxMacAbort;			/* 114 */
60151d3a2bcSkettenis 	volatile u_int32_t nicMacRxTruncNoResources;		/* 115 */
60251d3a2bcSkettenis 	/*
60351d3a2bcSkettenis 	 * Stats from the mac_stats area
60451d3a2bcSkettenis 	 */
60551d3a2bcSkettenis 	volatile u_int32_t nicMacRxDropUla;			/* 116 */
60651d3a2bcSkettenis 	volatile u_int32_t nicMacRxDropMcast;			/* 117 */
60751d3a2bcSkettenis 	volatile u_int32_t nicMacRxFlowControl;			/* 118 */
60851d3a2bcSkettenis 	volatile u_int32_t nicMacRxDropSpace;			/* 119 */
60951d3a2bcSkettenis 	volatile u_int32_t nicMacRxColls;			/* 120 */
61051d3a2bcSkettenis 	/*
61151d3a2bcSkettenis  	 * MAC RX Attentions
61251d3a2bcSkettenis 	 */
61351d3a2bcSkettenis 	volatile u_int32_t nicMacRxTotalAttns;			/* 121 */
61451d3a2bcSkettenis 	volatile u_int32_t nicMacRxLinkAttns;			/* 122 */
61551d3a2bcSkettenis 	volatile u_int32_t nicMacRxSyncAttns;			/* 123 */
61651d3a2bcSkettenis 	volatile u_int32_t nicMacRxConfigAttns;			/* 124 */
61751d3a2bcSkettenis 	volatile u_int32_t nicMacReset;				/* 125 */
61851d3a2bcSkettenis 	volatile u_int32_t nicMacRxBufDescrAttns;		/* 126 */
61951d3a2bcSkettenis 	volatile u_int32_t nicMacRxBufAttns;			/* 127 */
62051d3a2bcSkettenis 	volatile u_int32_t nicMacRxZeroFrameCleanup;		/* 128 */
62151d3a2bcSkettenis 	volatile u_int32_t nicMacRxOneFrameCleanup;		/* 129 */
62251d3a2bcSkettenis 	volatile u_int32_t nicMacRxMultipleFrameCleanup;	/* 130 */
62351d3a2bcSkettenis 	volatile u_int32_t nicMacRxTimerCleanup;		/* 131 */
62451d3a2bcSkettenis 	volatile u_int32_t nicMacRxDmaCleanup;			/* 132 */
62551d3a2bcSkettenis 	/*
62651d3a2bcSkettenis 	 * Stats from the mac_stats area
62751d3a2bcSkettenis 	 */
62851d3a2bcSkettenis 	volatile u_int32_t nicMacTxCollisionHistogram[15];	/* 133 */
62951d3a2bcSkettenis 	/*
63051d3a2bcSkettenis 	 * MAC TX Attentions
63151d3a2bcSkettenis 	 */
63251d3a2bcSkettenis 	volatile u_int32_t nicMacTxTotalAttns;			/* 134 */
63351d3a2bcSkettenis 	/*
63451d3a2bcSkettenis 	 * NIC Profile
63551d3a2bcSkettenis 	 */
63651d3a2bcSkettenis 	volatile u_int32_t nicProfile[32];			/* 135 */
63751d3a2bcSkettenis 	/*
63851d3a2bcSkettenis 	 * Pat to 1024 bytes.
63951d3a2bcSkettenis 	 */
64051d3a2bcSkettenis 	u_int32_t		pad[75];
64151d3a2bcSkettenis };
64251d3a2bcSkettenis /*
64351d3a2bcSkettenis  * Tigon general information block. This resides in host memory
64451d3a2bcSkettenis  * and contains the status counters, ring control blocks and
64551d3a2bcSkettenis  * producer pointers.
64651d3a2bcSkettenis  */
64751d3a2bcSkettenis 
64851d3a2bcSkettenis struct ti_gib {
64951d3a2bcSkettenis 	struct ti_stats		ti_stats;
65051d3a2bcSkettenis 	struct ti_rcb		ti_ev_rcb;
65151d3a2bcSkettenis 	struct ti_rcb		ti_cmd_rcb;
65251d3a2bcSkettenis 	struct ti_rcb		ti_tx_rcb;
65351d3a2bcSkettenis 	struct ti_rcb		ti_std_rx_rcb;
65451d3a2bcSkettenis 	struct ti_rcb		ti_jumbo_rx_rcb;
65551d3a2bcSkettenis 	struct ti_rcb		ti_mini_rx_rcb;
65651d3a2bcSkettenis 	struct ti_rcb		ti_return_rcb;
65751d3a2bcSkettenis 	ti_hostaddr		ti_ev_prodidx_ptr;
65851d3a2bcSkettenis 	ti_hostaddr		ti_return_prodidx_ptr;
65951d3a2bcSkettenis 	ti_hostaddr		ti_tx_considx_ptr;
66051d3a2bcSkettenis 	ti_hostaddr		ti_refresh_stats_ptr;
66151d3a2bcSkettenis };
66251d3a2bcSkettenis 
66351d3a2bcSkettenis /*
66451d3a2bcSkettenis  * Buffer descriptor structures. There are basically three types
66551d3a2bcSkettenis  * of structures: normal receive descriptors, extended receive
66651d3a2bcSkettenis  * descriptors and transmit descriptors. The extended receive
66751d3a2bcSkettenis  * descriptors are optionally used only for the jumbo receive ring.
66851d3a2bcSkettenis  */
66951d3a2bcSkettenis 
67051d3a2bcSkettenis struct ti_rx_desc {
67151d3a2bcSkettenis 	ti_hostaddr		ti_addr;
67251d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
67351d3a2bcSkettenis 	u_int16_t		ti_idx;
67451d3a2bcSkettenis 	u_int16_t		ti_len;
67551d3a2bcSkettenis #else
67651d3a2bcSkettenis 	u_int16_t		ti_len;
67751d3a2bcSkettenis 	u_int16_t		ti_idx;
67851d3a2bcSkettenis #endif
67951d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
68051d3a2bcSkettenis 	u_int16_t		ti_type;
68151d3a2bcSkettenis 	u_int16_t		ti_flags;
68251d3a2bcSkettenis #else
68351d3a2bcSkettenis 	u_int16_t		ti_flags;
68451d3a2bcSkettenis 	u_int16_t		ti_type;
68551d3a2bcSkettenis #endif
68651d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
68751d3a2bcSkettenis 	u_int16_t		ti_ip_cksum;
68851d3a2bcSkettenis 	u_int16_t		ti_tcp_udp_cksum;
68951d3a2bcSkettenis #else
69051d3a2bcSkettenis 	u_int16_t		ti_tcp_udp_cksum;
69151d3a2bcSkettenis 	u_int16_t		ti_ip_cksum;
69251d3a2bcSkettenis #endif
69351d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
69451d3a2bcSkettenis 	u_int16_t		ti_error_flags;
69551d3a2bcSkettenis 	u_int16_t		ti_vlan_tag;
69651d3a2bcSkettenis #else
69751d3a2bcSkettenis 	u_int16_t		ti_vlan_tag;
69851d3a2bcSkettenis 	u_int16_t		ti_error_flags;
69951d3a2bcSkettenis #endif
70051d3a2bcSkettenis 	u_int32_t		ti_rsvd;
70151d3a2bcSkettenis 	u_int32_t		ti_opaque;
70251d3a2bcSkettenis };
70351d3a2bcSkettenis 
70451d3a2bcSkettenis struct ti_rx_desc_ext {
70551d3a2bcSkettenis 	ti_hostaddr		ti_addr1;
70651d3a2bcSkettenis 	ti_hostaddr		ti_addr2;
70751d3a2bcSkettenis 	ti_hostaddr		ti_addr3;
70851d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
70951d3a2bcSkettenis 	u_int16_t		ti_len1;
71051d3a2bcSkettenis 	u_int16_t		ti_len2;
71151d3a2bcSkettenis #else
71251d3a2bcSkettenis 	u_int16_t		ti_len2;
71351d3a2bcSkettenis 	u_int16_t		ti_len1;
71451d3a2bcSkettenis #endif
71551d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
71651d3a2bcSkettenis 	u_int16_t		ti_len3;
71751d3a2bcSkettenis 	u_int16_t		ti_rsvd0;
71851d3a2bcSkettenis #else
71951d3a2bcSkettenis 	u_int16_t		ti_rsvd0;
72051d3a2bcSkettenis 	u_int16_t		ti_len3;
72151d3a2bcSkettenis #endif
72251d3a2bcSkettenis 	ti_hostaddr		ti_addr0;
72351d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
72451d3a2bcSkettenis 	u_int16_t		ti_idx;
72551d3a2bcSkettenis 	u_int16_t		ti_len0;
72651d3a2bcSkettenis #else
72751d3a2bcSkettenis 	u_int16_t		ti_len0;
72851d3a2bcSkettenis 	u_int16_t		ti_idx;
72951d3a2bcSkettenis #endif
73051d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
73151d3a2bcSkettenis 	u_int16_t		ti_type;
73251d3a2bcSkettenis 	u_int16_t		ti_flags;
73351d3a2bcSkettenis #else
73451d3a2bcSkettenis 	u_int16_t		ti_flags;
73551d3a2bcSkettenis 	u_int16_t		ti_type;
73651d3a2bcSkettenis #endif
73751d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
73851d3a2bcSkettenis 	u_int16_t		ti_ip_cksum;
73951d3a2bcSkettenis 	u_int16_t		ti_tcp_udp_cksum;
74051d3a2bcSkettenis #else
74151d3a2bcSkettenis 	u_int16_t		ti_tcp_udp_cksum;
74251d3a2bcSkettenis 	u_int16_t		ti_ip_cksum;
74351d3a2bcSkettenis #endif
74451d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
74551d3a2bcSkettenis 	u_int16_t		ti_error_flags;
74651d3a2bcSkettenis 	u_int16_t		ti_vlan_tag;
74751d3a2bcSkettenis #else
74851d3a2bcSkettenis 	u_int16_t		ti_vlan_tag;
74951d3a2bcSkettenis 	u_int16_t		ti_error_flags;
75051d3a2bcSkettenis #endif
75151d3a2bcSkettenis 	u_int32_t		ti_rsvd1;
75251d3a2bcSkettenis 	u_int32_t		ti_opaque;
75351d3a2bcSkettenis };
75451d3a2bcSkettenis 
75551d3a2bcSkettenis /*
75651d3a2bcSkettenis  * Transmit descriptors are, mercifully, very small.
75751d3a2bcSkettenis  */
75851d3a2bcSkettenis struct ti_tx_desc {
75951d3a2bcSkettenis 	ti_hostaddr		ti_addr;
76051d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
76151d3a2bcSkettenis 	u_int16_t		ti_len;
76251d3a2bcSkettenis 	u_int16_t		ti_flags;
76351d3a2bcSkettenis #else
76451d3a2bcSkettenis 	u_int16_t		ti_flags;
76551d3a2bcSkettenis 	u_int16_t		ti_len;
76651d3a2bcSkettenis #endif
76751d3a2bcSkettenis #if BYTE_ORDER == BIG_ENDIAN
76851d3a2bcSkettenis 	u_int16_t		ti_rsvd;
76951d3a2bcSkettenis 	u_int16_t		ti_vlan_tag;
77051d3a2bcSkettenis #else
77151d3a2bcSkettenis 	u_int16_t		ti_vlan_tag;
77251d3a2bcSkettenis 	u_int16_t		ti_rsvd;
77351d3a2bcSkettenis #endif
77451d3a2bcSkettenis };
77551d3a2bcSkettenis 
77651d3a2bcSkettenis /*
77751d3a2bcSkettenis  * NOTE!  On the Alpha, we have an alignment constraint.
77851d3a2bcSkettenis  * The first thing in the packet is a 14-byte Ethernet header.
77951d3a2bcSkettenis  * This means that the packet is misaligned.  To compensate,
78051d3a2bcSkettenis  * we actually offset the data 2 bytes into the cluster.  This
781*4b1a56afSjsg  * aligns the packet after the Ethernet header at a 32-bit
78251d3a2bcSkettenis  * boundary.
78351d3a2bcSkettenis  */
78451d3a2bcSkettenis 
78551d3a2bcSkettenis #define TI_JUMBO_FRAMELEN	9018
78651d3a2bcSkettenis #define TI_JUMBO_MTU		(TI_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
78751d3a2bcSkettenis #define TI_PAGE_SIZE		PAGE_SIZE
78851d3a2bcSkettenis 
78951d3a2bcSkettenis /*
79051d3a2bcSkettenis  * Buffer descriptor error flags.
79151d3a2bcSkettenis  */
79251d3a2bcSkettenis #define TI_BDERR_CRC			0x0001
79351d3a2bcSkettenis #define TI_BDERR_COLLDETECT		0x0002
79451d3a2bcSkettenis #define TI_BDERR_LINKLOST		0x0004
79551d3a2bcSkettenis #define TI_BDERR_DECODE			0x0008
79651d3a2bcSkettenis #define TI_BDERR_ODD_NIBBLES		0x0010
79751d3a2bcSkettenis #define TI_BDERR_MAC_ABRT		0x0020
79851d3a2bcSkettenis #define TI_BDERR_RUNT			0x0040
79951d3a2bcSkettenis #define TI_BDERR_TRUNC			0x0080
80051d3a2bcSkettenis #define TI_BDERR_GIANT			0x0100
80151d3a2bcSkettenis 
80251d3a2bcSkettenis /*
80351d3a2bcSkettenis  * Buffer descriptor flags.
80451d3a2bcSkettenis  */
80551d3a2bcSkettenis #define TI_BDFLAG_TCP_UDP_CKSUM		0x0001
80651d3a2bcSkettenis #define TI_BDFLAG_IP_CKSUM		0x0002
80751d3a2bcSkettenis #define TI_BDFLAG_END			0x0004
80851d3a2bcSkettenis #define TI_BDFLAG_MORE			0x0008
80951d3a2bcSkettenis #define TI_BDFLAG_JUMBO_RING		0x0010
81051d3a2bcSkettenis #define TI_BDFLAG_UCAST_PKT		0x0020
81151d3a2bcSkettenis #define TI_BDFLAG_MCAST_PKT		0x0040
81251d3a2bcSkettenis #define TI_BDFLAG_BCAST_PKT		0x0060
81351d3a2bcSkettenis #define TI_BDFLAG_IP_FRAG		0x0080
81451d3a2bcSkettenis #define TI_BDFLAG_IP_FRAG_END		0x0100
81551d3a2bcSkettenis #define TI_BDFLAG_VLAN_TAG		0x0200
81651d3a2bcSkettenis #define TI_BDFLAG_ERROR			0x0400
81751d3a2bcSkettenis #define TI_BDFLAG_COAL_NOW		0x0800
81851d3a2bcSkettenis #define	TI_BDFLAG_MINI_RING		0x1000
81951d3a2bcSkettenis 
82051d3a2bcSkettenis /*
82151d3a2bcSkettenis  * Descriptor type flags. I think these only have meaning for
82251d3a2bcSkettenis  * the Tigon 1. I had to extract them from the sample driver source
82351d3a2bcSkettenis  * since they aren't in the manual.
82451d3a2bcSkettenis  */
82551d3a2bcSkettenis #define TI_BDTYPE_TYPE_NULL			0x0000
82651d3a2bcSkettenis #define TI_BDTYPE_SEND_BD			0x0001
82751d3a2bcSkettenis #define TI_BDTYPE_RECV_BD			0x0002
82851d3a2bcSkettenis #define TI_BDTYPE_RECV_JUMBO_BD			0x0003
82951d3a2bcSkettenis #define TI_BDTYPE_RECV_BD_LAST			0x0004
83051d3a2bcSkettenis #define TI_BDTYPE_SEND_DATA			0x0005
83151d3a2bcSkettenis #define TI_BDTYPE_SEND_DATA_LAST		0x0006
83251d3a2bcSkettenis #define TI_BDTYPE_RECV_DATA			0x0007
83351d3a2bcSkettenis #define TI_BDTYPE_RECV_DATA_LAST		0x000b
83451d3a2bcSkettenis #define TI_BDTYPE_EVENT_RUPT			0x000c
83551d3a2bcSkettenis #define TI_BDTYPE_EVENT_NO_RUPT			0x000d
83651d3a2bcSkettenis #define TI_BDTYPE_ODD_START			0x000e
83751d3a2bcSkettenis #define TI_BDTYPE_UPDATE_STATS			0x000f
83851d3a2bcSkettenis #define TI_BDTYPE_SEND_DUMMY_DMA		0x0010
83951d3a2bcSkettenis #define TI_BDTYPE_EVENT_PROD			0x0011
84051d3a2bcSkettenis #define TI_BDTYPE_TX_CONS			0x0012
84151d3a2bcSkettenis #define TI_BDTYPE_RX_PROD			0x0013
84251d3a2bcSkettenis #define TI_BDTYPE_REFRESH_STATS			0x0014
84351d3a2bcSkettenis #define TI_BDTYPE_SEND_DATA_LAST_VLAN		0x0015
84451d3a2bcSkettenis #define TI_BDTYPE_SEND_DATA_COAL		0x0016
84551d3a2bcSkettenis #define TI_BDTYPE_SEND_DATA_LAST_COAL		0x0017
84651d3a2bcSkettenis #define TI_BDTYPE_SEND_DATA_LAST_VLAN_COAL	0x0018
84751d3a2bcSkettenis #define TI_BDTYPE_TX_CONS_NO_INTR		0x0019
84851d3a2bcSkettenis 
84951d3a2bcSkettenis /*
85051d3a2bcSkettenis  * Tigon command structure.
85151d3a2bcSkettenis  */
85251d3a2bcSkettenis struct ti_cmd_desc {
85351d3a2bcSkettenis 	u_int32_t		ti_cmdx;
85451d3a2bcSkettenis };
85551d3a2bcSkettenis 
85651d3a2bcSkettenis #define TI_CMD_CMD(cmd) (((((cmd)->ti_cmdx)) >> 24) & 0xff)
85751d3a2bcSkettenis #define TI_CMD_CODE(cmd) (((((cmd)->ti_cmdx)) >> 12) & 0xfff)
85851d3a2bcSkettenis #define TI_CMD_IDX(cmd) ((((cmd)->ti_cmdx)) & 0xfff)
85951d3a2bcSkettenis 
86051d3a2bcSkettenis #define TI_CMD_HOST_STATE		0x01
86151d3a2bcSkettenis #define TI_CMD_CODE_STACK_UP		0x01
86251d3a2bcSkettenis #define TI_CMD_CODE_STACK_DOWN		0x02
86351d3a2bcSkettenis 
86451d3a2bcSkettenis /*
86551d3a2bcSkettenis  * This command enables software address filtering. It's a workaround
86651d3a2bcSkettenis  * for a bug in the Tigon 1 and not implemented for the Tigon 2.
86751d3a2bcSkettenis  */
86851d3a2bcSkettenis #define TI_CMD_FDR_FILTERING		0x02
86951d3a2bcSkettenis #define TI_CMD_CODE_FILT_ENB		0x01
87051d3a2bcSkettenis #define TI_CMD_CODE_FILT_DIS		0x02
87151d3a2bcSkettenis 
87251d3a2bcSkettenis #define TI_CMD_SET_RX_PROD_IDX		0x03 /* obsolete */
87351d3a2bcSkettenis #define TI_CMD_UPDATE_GENCOM		0x04
87451d3a2bcSkettenis #define TI_CMD_RESET_JUMBO_RING		0x05
87551d3a2bcSkettenis #define TI_CMD_SET_PARTIAL_RX_CNT	0x06
87651d3a2bcSkettenis #define TI_CMD_ADD_MCAST_ADDR		0x08 /* obsolete */
87751d3a2bcSkettenis #define TI_CMD_DEL_MCAST_ADDR		0x09 /* obsolete */
87851d3a2bcSkettenis 
87951d3a2bcSkettenis #define TI_CMD_SET_PROMISC_MODE		0x0A
88051d3a2bcSkettenis #define TI_CMD_CODE_PROMISC_ENB		0x01
88151d3a2bcSkettenis #define TI_CMD_CODE_PROMISC_DIS		0x02
88251d3a2bcSkettenis 
88351d3a2bcSkettenis #define TI_CMD_LINK_NEGOTIATION		0x0B
88451d3a2bcSkettenis #define TI_CMD_CODE_NEGOTIATE_BOTH	0x00
88551d3a2bcSkettenis #define TI_CMD_CODE_NEGOTIATE_GIGABIT	0x01
88651d3a2bcSkettenis #define TI_CMD_CODE_NEGOTIATE_10_100	0x02
88751d3a2bcSkettenis 
88851d3a2bcSkettenis #define TI_CMD_SET_MAC_ADDR		0x0C
88951d3a2bcSkettenis #define TI_CMD_CLR_PROFILE		0x0D
89051d3a2bcSkettenis 
89151d3a2bcSkettenis #define TI_CMD_SET_ALLMULTI		0x0E
89251d3a2bcSkettenis #define TI_CMD_CODE_ALLMULTI_ENB	0x01
89351d3a2bcSkettenis #define TI_CMD_CODE_ALLMULTI_DIS	0x02
89451d3a2bcSkettenis 
89551d3a2bcSkettenis #define TI_CMD_CLR_STATS		0x0F
89651d3a2bcSkettenis #define TI_CMD_SET_RX_JUMBO_PROD_IDX	0x10 /* obsolete */
89751d3a2bcSkettenis #define TI_CMD_RFRSH_STATS		0x11
89851d3a2bcSkettenis 
89951d3a2bcSkettenis #define TI_CMD_EXT_ADD_MCAST		0x12
90051d3a2bcSkettenis #define TI_CMD_EXT_DEL_MCAST		0x13
90151d3a2bcSkettenis 
90251d3a2bcSkettenis /*
90351d3a2bcSkettenis  * Utility macros to make issuing commands a little simpler. Assumes
90451d3a2bcSkettenis  * that 'sc' and 'cmd' are in local scope.
90551d3a2bcSkettenis  */
90651d3a2bcSkettenis #define TI_DO_CMD(x, y, z)					\
907fb8aa33eSjsg do {								\
90851d3a2bcSkettenis 	cmd.ti_cmdx = (((x) << 24) | ((y) << 12) | ((z)));	\
909fb8aa33eSjsg 	ti_cmd(sc, &cmd);					\
910fb8aa33eSjsg } while (0)
91151d3a2bcSkettenis 
91251d3a2bcSkettenis #define TI_DO_CMD_EXT(x, y, z, v, w)				\
913fb8aa33eSjsg do {								\
91451d3a2bcSkettenis 	cmd.ti_cmdx = (((x) << 24) | ((y) << 12) | ((z)));	\
915fb8aa33eSjsg 	ti_cmd_ext(sc, &cmd, v, w);				\
916fb8aa33eSjsg } while (0)
91751d3a2bcSkettenis 
91851d3a2bcSkettenis /*
91951d3a2bcSkettenis  * Other utility macros.
92051d3a2bcSkettenis  */
921fb8aa33eSjsg #define TI_INC(x, y)						\
922fb8aa33eSjsg do {								\
923fb8aa33eSjsg 	(x) = (x + 1) % y;					\
924fb8aa33eSjsg } while (0)
92551d3a2bcSkettenis 
92651d3a2bcSkettenis #define TI_UPDATE_JUMBOPROD(x, y)				\
927fb8aa33eSjsg do {								\
92851d3a2bcSkettenis 	if (x->ti_hwrev == TI_HWREV_TIGON) {			\
92951d3a2bcSkettenis 		TI_DO_CMD(TI_CMD_SET_RX_JUMBO_PROD_IDX, 0, y);	\
93051d3a2bcSkettenis 	} else {						\
93151d3a2bcSkettenis 		CSR_WRITE_4(x, TI_MB_JUMBORXPROD_IDX, y);	\
932fb8aa33eSjsg 	}							\
933fb8aa33eSjsg } while (0)
93451d3a2bcSkettenis 
93551d3a2bcSkettenis #define TI_UPDATE_MINIPROD(x, y)				\
936fb8aa33eSjsg do {								\
937fb8aa33eSjsg 		CSR_WRITE_4(x, TI_MB_MINIRXPROD_IDX, y);	\
938fb8aa33eSjsg } while (0)
93951d3a2bcSkettenis 
94051d3a2bcSkettenis #define TI_UPDATE_STDPROD(x, y)					\
941fb8aa33eSjsg do {								\
94251d3a2bcSkettenis 	if (x->ti_hwrev == TI_HWREV_TIGON) {			\
94351d3a2bcSkettenis 		TI_DO_CMD(TI_CMD_SET_RX_PROD_IDX, 0, y);	\
94451d3a2bcSkettenis 	} else {						\
94551d3a2bcSkettenis 		CSR_WRITE_4(x, TI_MB_STDRXPROD_IDX, y);		\
946fb8aa33eSjsg 	}							\
947fb8aa33eSjsg } while (0)
94851d3a2bcSkettenis 
94951d3a2bcSkettenis 
95051d3a2bcSkettenis /*
95151d3a2bcSkettenis  * Tigon event structure.
95251d3a2bcSkettenis  */
95351d3a2bcSkettenis struct ti_event_desc {
95451d3a2bcSkettenis 	u_int32_t		ti_eventx;
95551d3a2bcSkettenis 	u_int32_t		ti_rsvd;
95651d3a2bcSkettenis };
95751d3a2bcSkettenis 
95851d3a2bcSkettenis #define TI_EVENT_EVENT(e) (((((e)->ti_eventx)) >> 24) & 0xff)
95951d3a2bcSkettenis #define TI_EVENT_CODE(e) (((((e)->ti_eventx)) >> 12) & 0xfff)
96051d3a2bcSkettenis #define TI_EVENT_IDX(e) (((((e)->ti_eventx))) & 0xfff)
96151d3a2bcSkettenis 
96251d3a2bcSkettenis /*
96351d3a2bcSkettenis  * Tigon events.
96451d3a2bcSkettenis  */
96551d3a2bcSkettenis #define TI_EV_FIRMWARE_UP		0x01
96651d3a2bcSkettenis #define TI_EV_STATS_UPDATED		0x04
96751d3a2bcSkettenis 
96851d3a2bcSkettenis #define TI_EV_LINKSTAT_CHANGED		0x06
96951d3a2bcSkettenis #define TI_EV_CODE_GIG_LINK_UP		0x01
97051d3a2bcSkettenis #define TI_EV_CODE_LINK_DOWN		0x02
97151d3a2bcSkettenis #define TI_EV_CODE_LINK_UP		0x03
97251d3a2bcSkettenis 
97351d3a2bcSkettenis #define TI_EV_ERROR			0x07
97451d3a2bcSkettenis #define TI_EV_CODE_ERR_INVAL_CMD	0x01
97551d3a2bcSkettenis #define TI_EV_CODE_ERR_UNIMP_CMD	0x02
97651d3a2bcSkettenis #define TI_EV_CODE_ERR_BADCFG		0x03
97751d3a2bcSkettenis 
97851d3a2bcSkettenis #define TI_EV_MCAST_UPDATED		0x08
97951d3a2bcSkettenis #define TI_EV_CODE_MCAST_ADD		0x01
98051d3a2bcSkettenis #define TI_EV_CODE_MCAST_DEL		0x02
98151d3a2bcSkettenis 
98251d3a2bcSkettenis #define TI_EV_RESET_JUMBO_RING		0x09
98351d3a2bcSkettenis /*
98451d3a2bcSkettenis  * Register access macros. The Tigon always uses memory mapped register
98551d3a2bcSkettenis  * accesses and all registers must be accessed with 32 bit operations.
98651d3a2bcSkettenis  */
98751d3a2bcSkettenis 
98851d3a2bcSkettenis #define CSR_WRITE_4(sc, reg, val)	\
98951d3a2bcSkettenis 	bus_space_write_4(sc->ti_btag, sc->ti_bhandle, (reg), (val))
99051d3a2bcSkettenis 
99151d3a2bcSkettenis #define CSR_READ_4(sc, reg)		\
99251d3a2bcSkettenis 	bus_space_read_4(sc->ti_btag, sc->ti_bhandle, (reg))
99351d3a2bcSkettenis 
99451d3a2bcSkettenis #define TI_SETBIT(sc, reg, x)	\
99551d3a2bcSkettenis 	CSR_WRITE_4(sc, (reg), (CSR_READ_4(sc, (reg)) | (x)))
99651d3a2bcSkettenis #define TI_CLRBIT(sc, reg, x)	\
99751d3a2bcSkettenis 	CSR_WRITE_4(sc, (reg), (CSR_READ_4(sc, (reg)) & ~(x)))
99851d3a2bcSkettenis 
99951d3a2bcSkettenis /*
100051d3a2bcSkettenis  * Memory management stuff. Note: the SSLOTS, MSLOTS and JSLOTS
100151d3a2bcSkettenis  * values are tuneable. They control the actual amount of buffers
100251d3a2bcSkettenis  * allocated for the standard, mini and jumbo receive rings.
100351d3a2bcSkettenis  */
100451d3a2bcSkettenis 
100551d3a2bcSkettenis #define TI_SSLOTS	256
100651d3a2bcSkettenis #define TI_MSLOTS	256
100751d3a2bcSkettenis #define TI_JSLOTS	384
100851d3a2bcSkettenis 
100951d3a2bcSkettenis #define TI_JRAWLEN	(TI_JUMBO_FRAMELEN + ETHER_ALIGN)
101051d3a2bcSkettenis #define TI_JLEN		(TI_JRAWLEN + (sizeof(u_int64_t) - \
101151d3a2bcSkettenis        (TI_JRAWLEN % sizeof(u_int64_t))))
101251d3a2bcSkettenis #define TI_JPAGESZ	PAGE_SIZE
101351d3a2bcSkettenis #define TI_RESID	(TI_JPAGESZ - (TI_JLEN * TI_JSLOTS) % TI_JPAGESZ)
101451d3a2bcSkettenis #define TI_JMEM		((TI_JLEN * TI_JSLOTS) + TI_RESID)
101551d3a2bcSkettenis 
101651d3a2bcSkettenis struct ti_jslot {
101751d3a2bcSkettenis 	caddr_t			ti_buf;
101851d3a2bcSkettenis 	int			ti_inuse;
101951d3a2bcSkettenis };
102051d3a2bcSkettenis 
102151d3a2bcSkettenis /*
102251d3a2bcSkettenis  * Ring structures. Most of these reside in host memory and we tell
102351d3a2bcSkettenis  * the NIC where they are via the ring control blocks. The exceptions
102451d3a2bcSkettenis  * are the tx and command rings, which live in NIC memory and which
102551d3a2bcSkettenis  * we access via the shared memory window.
102651d3a2bcSkettenis  */
102751d3a2bcSkettenis struct ti_ring_data {
102851d3a2bcSkettenis 	struct ti_rx_desc	ti_rx_std_ring[TI_STD_RX_RING_CNT];
102951d3a2bcSkettenis 	struct ti_rx_desc	ti_rx_jumbo_ring[TI_JUMBO_RX_RING_CNT];
103051d3a2bcSkettenis 	struct ti_rx_desc	ti_rx_mini_ring[TI_MINI_RX_RING_CNT];
103151d3a2bcSkettenis 	struct ti_rx_desc	ti_rx_return_ring[TI_RETURN_RING_CNT];
103251d3a2bcSkettenis 	struct ti_event_desc	ti_event_ring[TI_EVENT_RING_CNT];
103351d3a2bcSkettenis 	struct ti_tx_desc	ti_tx_ring[TI_TX_RING_CNT];
103451d3a2bcSkettenis 
103551d3a2bcSkettenis 	/*
103651d3a2bcSkettenis 	 * Make sure producer structures are aligned on 32-byte cache
103751d3a2bcSkettenis 	 * line boundaries.
103851d3a2bcSkettenis 	 */
103951d3a2bcSkettenis 	struct ti_producer	ti_ev_prodidx_r;
104051d3a2bcSkettenis 	u_int32_t		ti_pad0[6];
104151d3a2bcSkettenis 	struct ti_producer	ti_return_prodidx_r;
104251d3a2bcSkettenis 	u_int32_t		ti_pad1[6];
104351d3a2bcSkettenis 	struct ti_producer	ti_tx_considx_r;
104451d3a2bcSkettenis 	u_int32_t		ti_pad2[6];
104551d3a2bcSkettenis 	struct ti_gib		ti_info;
104651d3a2bcSkettenis };
104751d3a2bcSkettenis 
104851d3a2bcSkettenis #define TI_RING_DMA_ADDR(sc, offset) \
104951d3a2bcSkettenis 	((sc)->ti_ring_map->dm_segs[0].ds_addr + \
105051d3a2bcSkettenis 	offsetof(struct ti_ring_data, offset))
105151d3a2bcSkettenis 
105251d3a2bcSkettenis #define TI_RING_DMASYNC(sc, offset, op) \
105351d3a2bcSkettenis 	bus_dmamap_sync((sc)->sc_dmatag, (sc)->ti_ring_map, \
105451d3a2bcSkettenis 			offsetof(struct ti_ring_data, offset), \
105551d3a2bcSkettenis 			sizeof(((struct ti_ring_data *)0)->offset), (op))
105651d3a2bcSkettenis 
105751d3a2bcSkettenis /*
105851d3a2bcSkettenis  * Number of DMA segments in a TxCB. Note that this is carefully
105951d3a2bcSkettenis  * chosen to make the total struct size an even power of two. It's
1060*4b1a56afSjsg  * critical that no TxCB be split across a page boundary since
106151d3a2bcSkettenis  * no attempt is made to allocate physically contiguous memory.
106251d3a2bcSkettenis  *
106351d3a2bcSkettenis  */
106451d3a2bcSkettenis #ifdef __LP64__
106551d3a2bcSkettenis #define TI_NTXSEG      30
106651d3a2bcSkettenis #else
106751d3a2bcSkettenis #define TI_NTXSEG      31
106851d3a2bcSkettenis #endif
106951d3a2bcSkettenis 
107051d3a2bcSkettenis struct ti_txmap_entry {
107151d3a2bcSkettenis 	bus_dmamap_t			dmamap;
107251d3a2bcSkettenis 	SLIST_ENTRY(ti_txmap_entry)	link;
107351d3a2bcSkettenis };
107451d3a2bcSkettenis 
107551d3a2bcSkettenis /*
107651d3a2bcSkettenis  * Mbuf pointers. We need these to keep track of the virtual addresses
107751d3a2bcSkettenis  * of our mbuf chains since we can only convert from physical to virtual,
107851d3a2bcSkettenis  * not the other way around.
107951d3a2bcSkettenis  */
108051d3a2bcSkettenis struct ti_chain_data {
108151d3a2bcSkettenis 	struct mbuf		*ti_tx_chain[TI_TX_RING_CNT];
108251d3a2bcSkettenis 	struct mbuf		*ti_rx_std_chain[TI_STD_RX_RING_CNT];
108351d3a2bcSkettenis 	struct mbuf		*ti_rx_jumbo_chain[TI_JUMBO_RX_RING_CNT];
108451d3a2bcSkettenis 	struct mbuf		*ti_rx_mini_chain[TI_MINI_RX_RING_CNT];
108551d3a2bcSkettenis 
108651d3a2bcSkettenis 	struct ti_txmap_entry	*ti_tx_map[TI_TX_RING_CNT];
108751d3a2bcSkettenis 	bus_dmamap_t		ti_rx_std_map[TI_STD_RX_RING_CNT];
1088f383607aSdlg 	bus_dmamap_t		ti_rx_jumbo_map[TI_JUMBO_RX_RING_CNT];
108951d3a2bcSkettenis 	bus_dmamap_t		ti_rx_mini_map[TI_MINI_RX_RING_CNT];
109051d3a2bcSkettenis 
109151d3a2bcSkettenis 	/* Stick the jumbo mem management stuff here too. */
109251d3a2bcSkettenis 	struct ti_jslot		ti_jslots[TI_JSLOTS];
109351d3a2bcSkettenis 	void			*ti_jumbo_buf;
109451d3a2bcSkettenis };
109551d3a2bcSkettenis 
109651d3a2bcSkettenis struct ti_type {
109751d3a2bcSkettenis 	u_int16_t		ti_vid;
109851d3a2bcSkettenis 	u_int16_t		ti_did;
109951d3a2bcSkettenis 	char			*ti_name;
110051d3a2bcSkettenis };
110151d3a2bcSkettenis 
110251d3a2bcSkettenis #define TI_HWREV_TIGON		0x01
110351d3a2bcSkettenis #define TI_HWREV_TIGON_II	0x02
110451d3a2bcSkettenis #define TI_TIMEOUT		1000
110551d3a2bcSkettenis #define TI_TXCONS_UNSET		0xFFFF	/* impossible value */
110651d3a2bcSkettenis 
110751d3a2bcSkettenis struct ti_mc_entry {
110851d3a2bcSkettenis 	struct ether_addr		mc_addr;
110951d3a2bcSkettenis 	SLIST_ENTRY(ti_mc_entry)	mc_entries;
111051d3a2bcSkettenis };
111151d3a2bcSkettenis 
111251d3a2bcSkettenis struct ti_softc {
111351d3a2bcSkettenis 	struct device		sc_dv;
111451d3a2bcSkettenis 	struct arpcom		arpcom;		/* interface info */
111551d3a2bcSkettenis 	bus_space_handle_t	ti_bhandle;
111651d3a2bcSkettenis 	bus_space_tag_t		ti_btag;
111751d3a2bcSkettenis 	void *			ti_intrhand;
111851d3a2bcSkettenis 	struct ifmedia		ifmedia;	/* media info */
111951d3a2bcSkettenis 	u_int8_t		ti_hwrev;	/* Tigon rev (1 or 2) */
112051d3a2bcSkettenis 	u_int8_t		ti_sbus;	/* SBus card */
112151d3a2bcSkettenis 	u_int8_t		ti_copper;	/* 1000baseTX card */
112251d3a2bcSkettenis 	u_int8_t		ti_linkstat;	/* Link state */
112351d3a2bcSkettenis 	bus_dma_tag_t		sc_dmatag;
112451d3a2bcSkettenis 	struct ti_ring_data	*ti_rdata;	/* rings */
112551d3a2bcSkettenis 	struct ti_chain_data	ti_cdata;	/* mbufs */
112651d3a2bcSkettenis #define ti_ev_prodidx		ti_rdata->ti_ev_prodidx_r
112751d3a2bcSkettenis #define ti_return_prodidx	ti_rdata->ti_return_prodidx_r
112851d3a2bcSkettenis #define ti_tx_considx		ti_rdata->ti_tx_considx_r
112951d3a2bcSkettenis 	struct ti_tx_desc	*ti_tx_ring_nic;/* pointer to shared mem */
113051d3a2bcSkettenis 	bus_dmamap_t		ti_ring_map;
113151d3a2bcSkettenis 	u_int16_t		ti_tx_saved_prodidx;
113251d3a2bcSkettenis 	u_int16_t		ti_tx_saved_considx;
113351d3a2bcSkettenis 	u_int16_t		ti_rx_saved_considx;
113451d3a2bcSkettenis 	u_int16_t		ti_ev_saved_considx;
113551d3a2bcSkettenis 	u_int16_t		ti_cmd_saved_prodidx;
113651d3a2bcSkettenis 	u_int16_t		ti_std;		/* current std ring head */
113751d3a2bcSkettenis 	u_int16_t		ti_mini;	/* current mini ring head */
1138*4b1a56afSjsg 	u_int16_t		ti_jumbo;	/* current jumbo ring head */
113951d3a2bcSkettenis 	SLIST_HEAD(__ti_mchead, ti_mc_entry)	ti_mc_listhead;
114051d3a2bcSkettenis 	SLIST_HEAD(__ti_txmaphead, ti_txmap_entry)	ti_tx_map_listhead;
114151d3a2bcSkettenis 	u_int32_t		ti_stat_ticks;
114251d3a2bcSkettenis 	u_int32_t		ti_rx_coal_ticks;
114351d3a2bcSkettenis 	u_int32_t		ti_tx_coal_ticks;
114451d3a2bcSkettenis 	u_int32_t		ti_rx_max_coal_bds;
114551d3a2bcSkettenis 	u_int32_t		ti_tx_max_coal_bds;
114651d3a2bcSkettenis 	u_int32_t		ti_tx_buf_ratio;
114751d3a2bcSkettenis 	int			ti_txcnt;
114851d3a2bcSkettenis };
114951d3a2bcSkettenis 
115051d3a2bcSkettenis /*
115151d3a2bcSkettenis  * Microchip Technology 24Cxx EEPROM control bytes
115251d3a2bcSkettenis  */
115351d3a2bcSkettenis #define EEPROM_CTL_READ			0xA1	/* 0101 0001 */
115451d3a2bcSkettenis #define EEPROM_CTL_WRITE		0xA0	/* 0101 0000 */
115551d3a2bcSkettenis 
115651d3a2bcSkettenis /*
115751d3a2bcSkettenis  * Note that EEPROM_START leaves transmission enabled.
115851d3a2bcSkettenis  */
115951d3a2bcSkettenis #define EEPROM_START							\
116051d3a2bcSkettenis 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock pin high */\
116151d3a2bcSkettenis 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Set DATA bit to 1 */	\
116251d3a2bcSkettenis 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Enable xmit to write bit */\
116351d3a2bcSkettenis 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Pull DATA bit to 0 again */\
116451d3a2bcSkettenis 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock low again */
116551d3a2bcSkettenis 
116651d3a2bcSkettenis /*
116751d3a2bcSkettenis  * EEPROM_STOP ends access to the EEPROM and clears the ETXEN bit so
116851d3a2bcSkettenis  * that no further data can be written to the EEPROM I/O pin.
116951d3a2bcSkettenis  */
117051d3a2bcSkettenis #define EEPROM_STOP							\
117151d3a2bcSkettenis 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Disable xmit */	\
117251d3a2bcSkettenis 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Pull DATA to 0 */	\
117351d3a2bcSkettenis 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock high */	\
117451d3a2bcSkettenis 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Enable xmit */	\
117551d3a2bcSkettenis 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Toggle DATA to 1 */	\
117651d3a2bcSkettenis 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Disable xmit. */	\
117751d3a2bcSkettenis 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock low again */
1178