Home | History | Annotate | Line # | Download | only in pci
if_tireg.h revision 1.11
      1  1.11     bjh21 /* $NetBSD: if_tireg.h,v 1.11 2001/06/30 17:53:59 bjh21 Exp $ */
      2   1.1  drochner 
      3   1.1  drochner /*
      4   1.1  drochner  * Copyright (c) 1997, 1998, 1999
      5   1.1  drochner  *	Bill Paul <wpaul (at) ctr.columbia.edu>.  All rights reserved.
      6   1.1  drochner  *
      7   1.1  drochner  * Redistribution and use in source and binary forms, with or without
      8   1.1  drochner  * modification, are permitted provided that the following conditions
      9   1.1  drochner  * are met:
     10   1.1  drochner  * 1. Redistributions of source code must retain the above copyright
     11   1.1  drochner  *    notice, this list of conditions and the following disclaimer.
     12   1.1  drochner  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1  drochner  *    notice, this list of conditions and the following disclaimer in the
     14   1.1  drochner  *    documentation and/or other materials provided with the distribution.
     15   1.1  drochner  * 3. All advertising materials mentioning features or use of this software
     16   1.1  drochner  *    must display the following acknowledgement:
     17   1.1  drochner  *	This product includes software developed by Bill Paul.
     18   1.1  drochner  * 4. Neither the name of the author nor the names of any co-contributors
     19   1.1  drochner  *    may be used to endorse or promote products derived from this software
     20   1.1  drochner  *    without specific prior written permission.
     21   1.1  drochner  *
     22   1.1  drochner  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
     23   1.1  drochner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24   1.1  drochner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25   1.1  drochner  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
     26   1.1  drochner  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     27   1.1  drochner  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     28   1.1  drochner  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     29   1.1  drochner  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     30   1.1  drochner  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     31   1.1  drochner  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     32   1.1  drochner  * THE POSSIBILITY OF SUCH DAMAGE.
     33   1.1  drochner  *
     34   1.1  drochner  *	FreeBSD Id: if_tireg.h,v 1.9 1999/07/27 03:54:48 wpaul Exp
     35   1.1  drochner  */
     36   1.1  drochner 
     37   1.1  drochner /*
     38   1.1  drochner  * Tigon register offsets. These are memory mapped registers
     39   1.1  drochner  * which can be accessed with the CSR_READ_4()/CSR_WRITE_4() macros.
     40   1.1  drochner  * Each register must be accessed using 32 bit operations.
     41   1.1  drochner  *
     42   1.1  drochner  * All reegisters are accessed through a 16K shared memory block.
     43   1.1  drochner  * The first group of registers are actually copies of the PCI
     44   1.1  drochner  * configuration space registers.
     45   1.1  drochner  */
     46   1.1  drochner 
     47   1.1  drochner /*
     48   1.1  drochner  * Tigon configuration and control registers.
     49   1.1  drochner  */
     50   1.1  drochner #define TI_MISC_HOST_CTL		0x040
     51   1.1  drochner #define TI_MISC_LOCAL_CTL		0x044
     52   1.1  drochner #define TI_SEM_AB			0x048 /* Tigon 2 only */
     53   1.1  drochner #define TI_MISC_CONF			0x050 /* Tigon 2 only */
     54   1.1  drochner #define TI_TIMER_BITS			0x054
     55   1.1  drochner #define TI_TIMERREF			0x058
     56   1.1  drochner #define TI_PCI_STATE			0x05C
     57   1.1  drochner #define TI_MAIN_EVENT_A			0x060
     58   1.1  drochner #define TI_MAILBOX_EVENT_A		0x064
     59   1.1  drochner #define TI_WINBASE			0x068
     60   1.1  drochner #define TI_WINDATA			0x06C
     61   1.1  drochner #define TI_MAIN_EVENT_B			0x070 /* Tigon 2 only */
     62   1.1  drochner #define TI_MAILBOX_EVENT_B		0x074 /* Tigon 2 only */
     63   1.1  drochner #define TI_TIMERREF_B			0x078 /* Tigon 2 only */
     64   1.1  drochner #define TI_SERIAL			0x07C
     65   1.1  drochner 
     66   1.1  drochner /*
     67   1.1  drochner  * Misc host control bits.
     68   1.1  drochner  */
     69   1.1  drochner #define TI_MHC_INTSTATE			0x00000001
     70   1.1  drochner #define TI_MHC_CLEARINT			0x00000002
     71   1.1  drochner #define TI_MHC_RESET			0x00000008
     72   1.1  drochner #define TI_MHC_BYTE_SWAP_ENB		0x00000010
     73   1.1  drochner #define TI_MHC_WORD_SWAP_ENB		0x00000020
     74   1.1  drochner #define TI_MHC_MASK_INTS		0x00000040
     75   1.1  drochner #define TI_MHC_CHIP_REV_MASK		0xF0000000
     76   1.1  drochner 
     77   1.1  drochner #define TI_MHC_BIGENDIAN_INIT	\
     78   1.1  drochner 	(TI_MHC_BYTE_SWAP_ENB|TI_MHC_WORD_SWAP_ENB|TI_MHC_CLEARINT)
     79   1.1  drochner 
     80   1.1  drochner #define TI_MHC_LITTLEENDIAN_INIT	\
     81   1.1  drochner 	(TI_MHC_WORD_SWAP_ENB|TI_MHC_CLEARINT)
     82   1.1  drochner 
     83   1.1  drochner /*
     84   1.1  drochner  * Tigon chip rev values. Rev 4 is the Tigon 1. Rev 6 is the Tigon 2.
     85   1.1  drochner  * Rev 5 is also the Tigon 2, but is a broken version which was never
     86   1.1  drochner  * used in any actual hardware, so we ignore it.
     87   1.1  drochner  */
     88   1.1  drochner #define TI_REV_TIGON_I			0x40000000
     89   1.1  drochner #define TI_REV_TIGON_II			0x60000000
     90   1.1  drochner 
     91   1.1  drochner /*
     92   1.1  drochner  * Firmware revision that we want.
     93   1.1  drochner  */
     94   1.1  drochner #define TI_FIRMWARE_MAJOR		0xc
     95   1.3    bouyer #define TI_FIRMWARE_MINOR		0x4
     96   1.3    bouyer #define TI_FIRMWARE_FIX			0xd
     97   1.1  drochner 
     98   1.1  drochner /*
     99   1.1  drochner  * Miscelaneous Local Control register.
    100   1.1  drochner  */
    101   1.1  drochner #define TI_MLC_EE_WRITE_ENB		0x00000010
    102   1.1  drochner #define TI_MLC_SRAM_BANK_256K		0x00000200
    103   1.1  drochner #define TI_MLC_SRAM_BANK_SIZE		0x00000300 /* Tigon 2 only */
    104   1.1  drochner #define TI_MLC_LOCALADDR_21		0x00004000
    105   1.1  drochner #define TI_MLC_LOCALADDR_22		0x00008000
    106   1.1  drochner #define TI_MLC_SBUS_WRITEERR		0x00080000
    107   1.1  drochner #define TI_MLC_EE_CLK			0x00100000
    108   1.1  drochner #define TI_MLC_EE_TXEN			0x00200000
    109   1.1  drochner #define TI_MLC_EE_DOUT			0x00400000
    110   1.1  drochner #define TI_MLC_EE_DIN			0x00800000
    111   1.1  drochner 
    112   1.1  drochner /*
    113   1.1  drochner  * Offset of MAC address inside EEPROM.
    114   1.1  drochner  */
    115   1.1  drochner #define TI_EE_MAC_OFFSET		0x8c
    116   1.1  drochner 
    117   1.1  drochner #define TI_DMA_ASSIST			0x11C
    118   1.1  drochner #define TI_CPU_STATE			0x140
    119   1.1  drochner #define TI_CPU_PROGRAM_COUNTER		0x144
    120   1.1  drochner #define TI_SRAM_ADDR			0x154
    121   1.1  drochner #define TI_SRAM_DATA			0x158
    122   1.1  drochner #define TI_GEN_0			0x180
    123   1.1  drochner #define TI_GEN_X			0x1FC
    124   1.1  drochner #define TI_MAC_TX_STATE			0x200
    125   1.1  drochner #define TI_MAC_RX_STATE			0x220
    126   1.1  drochner #define TI_CPU_CTL_B			0x240 /* Tigon 2 only */
    127   1.1  drochner #define TI_CPU_PROGRAM_COUNTER_B	0x244 /* Tigon 2 only */
    128   1.1  drochner #define TI_SRAM_ADDR_B			0x254 /* Tigon 2 only */
    129   1.1  drochner #define TI_SRAM_DATA_B			0x258 /* Tigon 2 only */
    130   1.1  drochner #define TI_GEN_B_0			0x280 /* Tigon 2 only */
    131   1.1  drochner #define TI_GEN_B_X			0x2FC /* Tigon 2 only */
    132   1.1  drochner 
    133   1.1  drochner /*
    134   1.1  drochner  * Misc config register.
    135   1.1  drochner  */
    136   1.1  drochner #define TI_MCR_SRAM_SYNCHRONOUS		0x00100000 /* Tigon 2 only */
    137   1.1  drochner 
    138   1.1  drochner /*
    139   1.1  drochner  * PCI state register.
    140   1.1  drochner  */
    141   1.1  drochner #define TI_PCISTATE_FORCE_RESET		0x00000001
    142   1.1  drochner #define TI_PCISTATE_PROVIDE_LEN		0x00000002
    143   1.1  drochner #define TI_PCISTATE_READ_MAXDMA		0x0000001C
    144   1.1  drochner #define TI_PCISTATE_WRITE_MAXDMA	0x000000E0
    145   1.1  drochner #define TI_PCISTATE_MINDMA		0x0000FF00
    146   1.1  drochner #define TI_PCISTATE_FIFO_RETRY_ENB	0x00010000
    147   1.1  drochner #define TI_PCISTATE_USE_MEM_RD_MULT	0x00020000
    148   1.1  drochner #define TI_PCISTATE_NO_SWAP_READ_DMA	0x00040000
    149   1.1  drochner #define TI_PCISTATE_NO_SWAP_WRITE_DMA	0x00080000
    150   1.1  drochner #define TI_PCISTATE_66MHZ_BUS		0x00080000 /* Tigon 2 only */
    151   1.1  drochner #define TI_PCISTATE_32BIT_BUS		0x00100000 /* Tigon 2 only */
    152   1.1  drochner #define TI_PCISTATE_ENB_BYTE_ENABLES	0x00800000 /* Tigon 2 only */
    153   1.1  drochner #define TI_PCISTATE_READ_CMD		0x0F000000
    154   1.1  drochner #define TI_PCISTATE_WRITE_CMD		0xF0000000
    155   1.1  drochner 
    156   1.1  drochner #define TI_PCI_READMAX_4		0x04
    157   1.1  drochner #define TI_PCI_READMAX_16		0x08
    158   1.1  drochner #define TI_PCI_READMAX_32		0x0C
    159   1.1  drochner #define TI_PCI_READMAX_64		0x10
    160   1.1  drochner #define TI_PCI_READMAX_128		0x14
    161   1.1  drochner #define TI_PCI_READMAX_256		0x18
    162   1.1  drochner #define TI_PCI_READMAX_1024		0x1C
    163   1.1  drochner 
    164   1.1  drochner #define TI_PCI_WRITEMAX_4		0x20
    165   1.1  drochner #define TI_PCI_WRITEMAX_16		0x40
    166   1.1  drochner #define TI_PCI_WRITEMAX_32		0x60
    167   1.1  drochner #define TI_PCI_WRITEMAX_64		0x80
    168   1.1  drochner #define TI_PCI_WRITEMAX_128		0xA0
    169   1.1  drochner #define TI_PCI_WRITEMAX_256		0xC0
    170   1.1  drochner #define TI_PCI_WRITEMAX_1024		0xE0
    171   1.1  drochner 
    172   1.1  drochner #define TI_PCI_READ_CMD			0x06000000
    173   1.1  drochner #define TI_PCI_WRITE_CMD		0x70000000
    174   1.1  drochner 
    175   1.1  drochner /*
    176   1.1  drochner  * DMA state register.
    177   1.1  drochner  */
    178   1.1  drochner #define TI_DMASTATE_ENABLE		0x00000001
    179   1.1  drochner #define TI_DMASTATE_PAUSE		0x00000002
    180   1.1  drochner 
    181   1.1  drochner /*
    182   1.1  drochner  * CPU state register.
    183   1.1  drochner  */
    184   1.1  drochner #define TI_CPUSTATE_RESET		0x00000001
    185   1.1  drochner #define TI_CPUSTATE_STEP		0x00000002
    186   1.1  drochner #define TI_CPUSTATE_ROMFAIL		0x00000010
    187   1.1  drochner #define TI_CPUSTATE_HALT		0x00010000
    188   1.1  drochner /*
    189   1.1  drochner  * MAC TX state register
    190   1.1  drochner  */
    191   1.1  drochner #define TI_TXSTATE_RESET		0x00000001
    192   1.1  drochner #define TI_TXSTATE_ENB			0x00000002
    193   1.1  drochner #define TI_TXSTATE_STOP			0x00000004
    194   1.1  drochner 
    195   1.1  drochner /*
    196   1.1  drochner  * MAC RX state register
    197   1.1  drochner  */
    198   1.1  drochner #define TI_RXSTATE_RESET		0x00000001
    199   1.1  drochner #define TI_RXSTATE_ENB			0x00000002
    200   1.1  drochner #define TI_RXSTATE_STOP			0x00000004
    201   1.1  drochner 
    202   1.1  drochner /*
    203   1.1  drochner  * Tigon 2 mailbox registers. The mailbox area consists of 256 bytes
    204   1.1  drochner  * split into 64 bit registers. Only the lower 32 bits of each mailbox
    205   1.1  drochner  * are used.
    206   1.1  drochner  */
    207   1.1  drochner #define TI_MB_HOSTINTR_HI		0x500
    208   1.1  drochner #define TI_MB_HOSTINTR_LO		0x504
    209   1.1  drochner #define TI_MB_HOSTINTR			TI_MB_HOSTINTR_LO
    210   1.1  drochner #define TI_MB_CMDPROD_IDX_HI		0x508
    211   1.1  drochner #define TI_MB_CMDPROD_IDX_LO		0x50C
    212   1.1  drochner #define TI_MB_CMDPROD_IDX		TI_MB_CMDPROD_IDX_LO
    213   1.1  drochner #define TI_MB_SENDPROD_IDX_HI		0x510
    214   1.1  drochner #define TI_MB_SENDPROD_IDX_LO		0x514
    215   1.1  drochner #define TI_MB_SENDPROD_IDX		TI_MB_SENDPROD_IDX_LO
    216   1.1  drochner #define TI_MB_STDRXPROD_IDX_HI		0x518 /* Tigon 2 only */
    217   1.1  drochner #define TI_MB_STDRXPROD_IDX_LO		0x51C /* Tigon 2 only */
    218   1.1  drochner #define TI_MB_STDRXPROD_IDX		TI_MB_STDRXPROD_IDX_LO
    219   1.1  drochner #define TI_MB_JUMBORXPROD_IDX_HI	0x520 /* Tigon 2 only */
    220   1.1  drochner #define TI_MB_JUMBORXPROD_IDX_LO	0x524 /* Tigon 2 only */
    221   1.1  drochner #define TI_MB_JUMBORXPROD_IDX		TI_MB_JUMBORXPROD_IDX_LO
    222   1.1  drochner #define TI_MB_MINIRXPROD_IDX_HI		0x528 /* Tigon 2 only */
    223   1.1  drochner #define TI_MB_MINIRXPROD_IDX_LO		0x52C /* Tigon 2 only */
    224   1.1  drochner #define TI_MB_MINIRXPROD_IDX		TI_MB_MINIRXPROD_IDX_LO
    225   1.1  drochner #define TI_MB_RSVD			0x530
    226   1.1  drochner 
    227   1.1  drochner /*
    228   1.1  drochner  * Tigon 2 general communication registers. These are 64 and 32 bit
    229   1.1  drochner  * registers which are only valid after the firmware has been
    230   1.1  drochner  * loaded and started. They actually exist in NIC memory but are
    231   1.1  drochner  * mapped into the host memory via the shared memory region.
    232   1.1  drochner  *
    233   1.1  drochner  * The NIC internally maps these registers starting at address 0,
    234   1.1  drochner  * so to determine the NIC address of any of these registers, we
    235   1.1  drochner  * subtract 0x600 (the address of the first register).
    236   1.1  drochner  */
    237   1.1  drochner 
    238   1.1  drochner #define TI_GCR_BASE			0x600
    239   1.1  drochner #define TI_GCR_MACADDR			0x600
    240   1.1  drochner #define TI_GCR_PAR0			0x600
    241   1.1  drochner #define TI_GCR_PAR1			0x604
    242   1.1  drochner #define TI_GCR_GENINFO_HI		0x608
    243   1.1  drochner #define TI_GCR_GENINFO_LO		0x60C
    244   1.1  drochner #define TI_GCR_MCASTADDR		0x610 /* obsolete */
    245   1.1  drochner #define TI_GCR_MAR0			0x610 /* obsolete */
    246   1.1  drochner #define TI_GCR_MAR1			0x614 /* obsolete */
    247   1.1  drochner #define TI_GCR_OPMODE			0x618
    248   1.1  drochner #define TI_GCR_DMA_READCFG		0x61C
    249   1.1  drochner #define TI_GCR_DMA_WRITECFG		0x620
    250   1.1  drochner #define TI_GCR_TX_BUFFER_RATIO		0x624
    251   1.1  drochner #define TI_GCR_EVENTCONS_IDX		0x628
    252   1.1  drochner #define TI_GCR_CMDCONS_IDX		0x62C
    253   1.1  drochner #define TI_GCR_TUNEPARMS		0x630
    254   1.1  drochner #define TI_GCR_RX_COAL_TICKS		0x630
    255   1.1  drochner #define TI_GCR_TX_COAL_TICKS		0x634
    256   1.1  drochner #define TI_GCR_STAT_TICKS		0x638
    257   1.1  drochner #define TI_GCR_TX_MAX_COAL_BD		0x63C
    258   1.1  drochner #define TI_GCR_RX_MAX_COAL_BD		0x640
    259   1.1  drochner #define TI_GCR_NIC_TRACING		0x644
    260   1.1  drochner #define TI_GCR_GLINK			0x648
    261   1.1  drochner #define TI_GCR_LINK			0x64C
    262   1.1  drochner #define TI_GCR_NICTRACE_PTR		0x650
    263   1.1  drochner #define TI_GCR_NICTRACE_START		0x654
    264   1.1  drochner #define TI_GCR_NICTRACE_LEN		0x658
    265   1.1  drochner #define TI_GCR_IFINDEX			0x65C
    266   1.1  drochner #define TI_GCR_IFMTU			0x660
    267   1.1  drochner #define TI_GCR_MASK_INTRS		0x664
    268   1.1  drochner #define TI_GCR_GLINK_STAT		0x668
    269   1.1  drochner #define TI_GCR_LINK_STAT		0x66C
    270   1.1  drochner #define TI_GCR_RXRETURNCONS_IDX		0x680
    271   1.1  drochner #define TI_GCR_CMDRING			0x700
    272   1.1  drochner 
    273   1.1  drochner #define TI_GCR_NIC_ADDR(x)		(x - TI_GCR_BASE);
    274   1.1  drochner 
    275   1.1  drochner /*
    276   1.1  drochner  * Local memory window. The local memory window is a 2K shared
    277   1.1  drochner  * memory region which can be used to access the NIC's internal
    278   1.1  drochner  * SRAM. The window can be mapped to a given 2K region using
    279   1.1  drochner  * the TI_WINDOW_BASE register.
    280   1.1  drochner  */
    281   1.1  drochner #define TI_WINDOW			0x800
    282   1.1  drochner #define TI_WINLEN			0x800
    283   1.1  drochner 
    284   1.1  drochner #define TI_TICKS_PER_SEC		1000000
    285   1.1  drochner 
    286   1.1  drochner /*
    287   1.1  drochner  * Operation mode register.
    288   1.1  drochner  */
    289   1.1  drochner #define TI_OPMODE_BYTESWAP_BD		0x00000002
    290   1.1  drochner #define TI_OPMODE_WORDSWAP_BD		0x00000004
    291   1.1  drochner #define TI_OPMODE_WARN_ENB		0x00000008 /* not yet implimented */
    292   1.1  drochner #define TI_OPMODE_BYTESWAP_DATA		0x00000010
    293   1.1  drochner #define TI_OPMODE_1_DMA_ACTIVE		0x00000040
    294   1.1  drochner #define TI_OPMODE_SBUS			0x00000100
    295   1.1  drochner #define TI_OPMODE_DONT_FRAG_JUMBO	0x00000200
    296   1.1  drochner #define TI_OPMODE_INCLUDE_CRC		0x00000400
    297   1.1  drochner #define TI_OPMODE_RX_BADFRAMES		0x00000800
    298   1.1  drochner #define TI_OPMODE_NO_EVENT_INTRS	0x00001000
    299   1.1  drochner #define TI_OPMODE_NO_TX_INTRS		0x00002000
    300   1.1  drochner #define TI_OPMODE_NO_RX_INTRS		0x00004000
    301   1.1  drochner #define TI_OPMODE_FATAL_ENB		0x40000000 /* not yet implimented */
    302   1.1  drochner 
    303   1.1  drochner /*
    304   1.1  drochner  * DMA configuration thresholds.
    305   1.1  drochner  */
    306   1.1  drochner #define TI_DMA_STATE_THRESH_16W		0x00000100
    307   1.1  drochner #define TI_DMA_STATE_THRESH_8W		0x00000080
    308   1.1  drochner #define TI_DMA_STATE_THRESH_4W		0x00000040
    309   1.1  drochner #define TI_DMA_STATE_THRESH_2W		0x00000020
    310   1.1  drochner #define TI_DMA_STATE_THRESH_1W		0x00000010
    311   1.1  drochner 
    312   1.1  drochner #define TI_DMA_STATE_FORCE_32_BIT	0x00000008
    313   1.1  drochner 
    314   1.1  drochner /*
    315   1.1  drochner  * Gigabit link status bits.
    316   1.1  drochner  */
    317   1.1  drochner #define TI_GLNK_SENSE_NO_BEG		0x00002000
    318   1.1  drochner #define TI_GLNK_LOOPBACK		0x00004000
    319   1.1  drochner #define TI_GLNK_PREF			0x00008000
    320   1.1  drochner #define TI_GLNK_1000MB			0x00040000
    321   1.1  drochner #define TI_GLNK_FULL_DUPLEX		0x00080000
    322   1.1  drochner #define TI_GLNK_TX_FLOWCTL_Y		0x00200000 /* Tigon 2 only */
    323   1.1  drochner #define TI_GLNK_RX_FLOWCTL_Y		0x00800000
    324   1.1  drochner #define TI_GLNK_AUTONEGENB		0x20000000
    325   1.1  drochner #define TI_GLNK_ENB			0x40000000
    326   1.1  drochner 
    327   1.1  drochner /*
    328   1.1  drochner  * Link status bits.
    329   1.1  drochner  */
    330   1.1  drochner #define TI_LNK_LOOPBACK			0x00004000
    331   1.1  drochner #define TI_LNK_PREF			0x00008000
    332   1.1  drochner #define TI_LNK_10MB			0x00010000
    333   1.1  drochner #define TI_LNK_100MB			0x00020000
    334   1.1  drochner #define TI_LNK_1000MB			0x00040000
    335   1.1  drochner #define TI_LNK_FULL_DUPLEX		0x00080000
    336   1.1  drochner #define TI_LNK_HALF_DUPLEX		0x00100000
    337   1.1  drochner #define TI_LNK_TX_FLOWCTL_Y		0x00200000 /* Tigon 2 only */
    338   1.1  drochner #define TI_LNK_RX_FLOWCTL_Y		0x00800000
    339   1.1  drochner #define TI_LNK_AUTONEGENB		0x20000000
    340   1.1  drochner #define TI_LNK_ENB			0x40000000
    341   1.1  drochner 
    342   1.1  drochner /*
    343   1.1  drochner  * Ring size constants.
    344   1.1  drochner  */
    345   1.1  drochner #define TI_EVENT_RING_CNT	256
    346   1.1  drochner #define TI_CMD_RING_CNT		64
    347   1.1  drochner #define TI_STD_RX_RING_CNT	512
    348   1.1  drochner #define TI_JUMBO_RX_RING_CNT	256
    349   1.1  drochner #define TI_MINI_RX_RING_CNT	1024
    350   1.1  drochner #define TI_RETURN_RING_CNT	2048
    351   1.1  drochner 
    352   1.1  drochner /*
    353   1.1  drochner  * Possible TX ring sizes.
    354   1.1  drochner  */
    355   1.1  drochner #define TI_TX_RING_CNT_128	128
    356   1.1  drochner #define TI_TX_RING_BASE_128	0x3800
    357   1.1  drochner 
    358   1.1  drochner #define TI_TX_RING_CNT_256	256
    359   1.1  drochner #define TI_TX_RING_BASE_256	0x3000
    360   1.1  drochner 
    361   1.1  drochner #define TI_TX_RING_CNT_512	512
    362   1.1  drochner #define TI_TX_RING_BASE_512	0x2000
    363   1.1  drochner 
    364   1.1  drochner #define TI_TX_RING_CNT		TI_TX_RING_CNT_512
    365   1.1  drochner #define TI_TX_RING_BASE		TI_TX_RING_BASE_512
    366   1.1  drochner 
    367   1.1  drochner /*
    368   1.1  drochner  * The Tigon can have up to 8MB of external SRAM, however the Tigon 1
    369   1.1  drochner  * is limited to 2MB total, and in general I think most adapters have
    370   1.1  drochner  * around 1MB. We use this value for zeroing the NIC's SRAM, so to
    371   1.1  drochner  * be safe we use the largest possible value (zeroing memory that
    372   1.1  drochner  * isn't there doesn't hurt anything).
    373   1.1  drochner  */
    374   1.1  drochner #define TI_MEM_MAX		0x7FFFFF
    375   1.1  drochner 
    376   1.1  drochner /*
    377   1.1  drochner  * Even on the alpha, pci addresses are 32-bit quantities
    378   1.1  drochner  */
    379   1.1  drochner 
    380   1.1  drochner #ifdef __64_bit_pci_addressing__
    381   1.1  drochner typedef struct {
    382   1.1  drochner 	u_int64_t		ti_addr;
    383   1.1  drochner } ti_hostaddr;
    384   1.1  drochner #define TI_HOSTADDR(x)	x.ti_addr
    385   1.1  drochner #else
    386   1.1  drochner typedef struct {
    387   1.1  drochner 	u_int32_t		ti_addr_hi;
    388   1.1  drochner 	u_int32_t		ti_addr_lo;
    389   1.1  drochner } ti_hostaddr;
    390   1.1  drochner #define TI_HOSTADDR(x)	x.ti_addr_lo
    391   1.1  drochner #endif
    392   1.1  drochner 
    393   1.1  drochner /*
    394   1.1  drochner  * Ring control block structure. The rules for the max_len field
    395   1.1  drochner  * are as follows:
    396   1.1  drochner  *
    397   1.1  drochner  * For the send ring, max_len indicates the number of entries in the
    398   1.1  drochner  * ring (128, 256 or 512).
    399   1.1  drochner  *
    400   1.1  drochner  * For the standard receive ring, max_len indicates the threshold
    401   1.1  drochner  * used to decide when a frame should be put in the jumbo receive ring
    402   1.1  drochner  * instead of the standard one.
    403   1.1  drochner  *
    404   1.1  drochner  * For the mini ring, max_len indicates the size of the buffers in the
    405   1.1  drochner  * ring. This is the value used to decide when a frame is small enough
    406   1.1  drochner  * to be placed in the mini ring.
    407   1.1  drochner  *
    408   1.1  drochner  * For the return receive ring, max_len indicates the number of entries
    409   1.1  drochner  * in the ring. It can be one of 2048, 1024 or 0 (which is the same as
    410   1.1  drochner  * 2048 for backwards compatibility). The value 1024 can only be used
    411   1.1  drochner  * if the mini ring is disabled.
    412   1.1  drochner  */
    413   1.1  drochner struct ti_rcb {
    414   1.1  drochner 	ti_hostaddr		ti_hostaddr;
    415   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    416   1.1  drochner 	u_int16_t		ti_max_len;
    417   1.1  drochner 	u_int16_t		ti_flags;
    418   1.1  drochner #else
    419   1.1  drochner 	u_int16_t		ti_flags;
    420   1.1  drochner 	u_int16_t		ti_max_len;
    421   1.1  drochner #endif
    422   1.1  drochner 	u_int32_t		ti_unused;
    423   1.1  drochner };
    424   1.1  drochner 
    425   1.1  drochner #define TI_RCB_FLAG_TCP_UDP_CKSUM	0x00000001
    426   1.1  drochner #define TI_RCB_FLAG_IP_CKSUM		0x00000002
    427   1.1  drochner #define TI_RCB_FLAG_NO_PHDR_CKSUM	0x00000008
    428   1.1  drochner #define TI_RCB_FLAG_VLAN_ASSIST		0x00000010
    429   1.1  drochner #define TI_RCB_FLAG_COAL_UPD_ONLY	0x00000020
    430   1.1  drochner #define TI_RCB_FLAG_HOST_RING		0x00000040
    431   1.1  drochner #define TI_RCB_FLAG_IEEE_SNAP_CKSUM	0x00000080
    432   1.1  drochner #define TI_RCB_FLAG_USE_EXT_RX_BD	0x00000100
    433   1.1  drochner #define TI_RCB_FLAG_RING_DISABLED	0x00000200
    434   1.1  drochner 
    435   1.1  drochner struct ti_producer {
    436   1.1  drochner 	u_int32_t		ti_idx;
    437   1.1  drochner 	u_int32_t		ti_unused;
    438   1.1  drochner };
    439   1.1  drochner 
    440   1.1  drochner /*
    441   1.1  drochner  * Tigon statistics counters.
    442   1.1  drochner  */
    443   1.1  drochner struct ti_stats {
    444   1.1  drochner 	/*
    445   1.1  drochner 	 * MAC stats, taken from RFC 1643, ethernet-like MIB
    446   1.1  drochner 	 */
    447   1.1  drochner 	volatile u_int32_t dot3StatsAlignmentErrors;		/* 0 */
    448   1.1  drochner 	volatile u_int32_t dot3StatsFCSErrors;			/* 1 */
    449   1.1  drochner 	volatile u_int32_t dot3StatsSingleCollisionFrames;	/* 2 */
    450   1.1  drochner 	volatile u_int32_t dot3StatsMultipleCollisionFrames;	/* 3 */
    451   1.1  drochner 	volatile u_int32_t dot3StatsSQETestErrors;		/* 4 */
    452   1.1  drochner 	volatile u_int32_t dot3StatsDeferredTransmissions;	/* 5 */
    453   1.1  drochner 	volatile u_int32_t dot3StatsLateCollisions;		/* 6 */
    454   1.1  drochner 	volatile u_int32_t dot3StatsExcessiveCollisions;	/* 7 */
    455   1.1  drochner 	volatile u_int32_t dot3StatsInternalMacTransmitErrors;	/* 8 */
    456   1.1  drochner 	volatile u_int32_t dot3StatsCarrierSenseErrors;		/* 9 */
    457   1.1  drochner 	volatile u_int32_t dot3StatsFrameTooLongs;		/* 10 */
    458   1.1  drochner 	volatile u_int32_t dot3StatsInternalMacReceiveErrors;	/* 11 */
    459   1.1  drochner 	/*
    460   1.1  drochner 	 * interface stats, taken from RFC 1213, MIB-II, interfaces group
    461   1.1  drochner 	 */
    462   1.1  drochner 	volatile u_int32_t ifIndex;				/* 12 */
    463   1.1  drochner 	volatile u_int32_t ifType;				/* 13 */
    464   1.1  drochner 	volatile u_int32_t ifMtu;				/* 14 */
    465   1.1  drochner 	volatile u_int32_t ifSpeed;				/* 15 */
    466   1.1  drochner 	volatile u_int32_t ifAdminStatus;			/* 16 */
    467   1.1  drochner #define IF_ADMIN_STATUS_UP      1
    468   1.1  drochner #define IF_ADMIN_STATUS_DOWN    2
    469   1.1  drochner #define IF_ADMIN_STATUS_TESTING 3
    470   1.1  drochner 	volatile u_int32_t ifOperStatus;			/* 17 */
    471   1.1  drochner #define IF_OPER_STATUS_UP       1
    472   1.1  drochner #define IF_OPER_STATUS_DOWN     2
    473   1.1  drochner #define IF_OPER_STATUS_TESTING  3
    474   1.1  drochner #define IF_OPER_STATUS_UNKNOWN  4
    475   1.1  drochner #define IF_OPER_STATUS_DORMANT  5
    476   1.1  drochner 	volatile u_int32_t ifLastChange;			/* 18 */
    477   1.1  drochner 	volatile u_int32_t ifInDiscards;			/* 19 */
    478   1.1  drochner 	volatile u_int32_t ifInErrors;				/* 20 */
    479   1.1  drochner 	volatile u_int32_t ifInUnknownProtos;			/* 21 */
    480   1.1  drochner 	volatile u_int32_t ifOutDiscards;			/* 22 */
    481   1.1  drochner 	volatile u_int32_t ifOutErrors;				/* 23 */
    482   1.1  drochner 	volatile u_int32_t ifOutQLen;     /* deprecated */	/* 24 */
    483   1.1  drochner 	volatile u_int8_t  ifPhysAddress[8]; /* 8 bytes */	/* 25 - 26 */
    484   1.1  drochner 	volatile u_int8_t  ifDescr[32];				/* 27 - 34 */
    485   1.1  drochner 	u_int32_t alignIt;      /* align to 64 bit for u_int64_ts following */
    486   1.1  drochner 	/*
    487   1.1  drochner 	 * more interface stats, taken from RFC 1573, MIB-IIupdate,
    488   1.1  drochner 	 * interfaces group
    489   1.1  drochner 	 */
    490   1.1  drochner 	volatile u_int64_t ifHCInOctets;			/* 36 - 37 */
    491   1.1  drochner 	volatile u_int64_t ifHCInUcastPkts;			/* 38 - 39 */
    492   1.1  drochner 	volatile u_int64_t ifHCInMulticastPkts;			/* 40 - 41 */
    493   1.1  drochner 	volatile u_int64_t ifHCInBroadcastPkts;			/* 42 - 43 */
    494   1.1  drochner 	volatile u_int64_t ifHCOutOctets;			/* 44 - 45 */
    495   1.1  drochner 	volatile u_int64_t ifHCOutUcastPkts;			/* 46 - 47 */
    496   1.1  drochner 	volatile u_int64_t ifHCOutMulticastPkts;		/* 48 - 49 */
    497   1.1  drochner 	volatile u_int64_t ifHCOutBroadcastPkts;		/* 50 - 51 */
    498   1.1  drochner 	volatile u_int32_t ifLinkUpDownTrapEnable;		/* 52 */
    499   1.1  drochner 	volatile u_int32_t ifHighSpeed;				/* 53 */
    500   1.1  drochner 	volatile u_int32_t ifPromiscuousMode; 			/* 54 */
    501   1.1  drochner 	volatile u_int32_t ifConnectorPresent; /* follow link state 55 */
    502   1.1  drochner 	/*
    503   1.1  drochner 	 * Host Commands
    504   1.1  drochner 	 */
    505   1.1  drochner 	volatile u_int32_t nicCmdsHostState;			/* 56 */
    506   1.1  drochner 	volatile u_int32_t nicCmdsFDRFiltering;			/* 57 */
    507   1.1  drochner 	volatile u_int32_t nicCmdsSetRecvProdIndex;		/* 58 */
    508   1.1  drochner 	volatile u_int32_t nicCmdsUpdateGencommStats;		/* 59 */
    509   1.1  drochner 	volatile u_int32_t nicCmdsResetJumboRing;		/* 60 */
    510   1.1  drochner 	volatile u_int32_t nicCmdsAddMCastAddr;			/* 61 */
    511   1.1  drochner 	volatile u_int32_t nicCmdsDelMCastAddr;			/* 62 */
    512   1.1  drochner 	volatile u_int32_t nicCmdsSetPromiscMode;		/* 63 */
    513   1.1  drochner 	volatile u_int32_t nicCmdsLinkNegotiate;		/* 64 */
    514   1.1  drochner 	volatile u_int32_t nicCmdsSetMACAddr;			/* 65 */
    515   1.1  drochner 	volatile u_int32_t nicCmdsClearProfile;			/* 66 */
    516   1.1  drochner 	volatile u_int32_t nicCmdsSetMulticastMode;		/* 67 */
    517   1.1  drochner 	volatile u_int32_t nicCmdsClearStats;			/* 68 */
    518   1.1  drochner 	volatile u_int32_t nicCmdsSetRecvJumboProdIndex;	/* 69 */
    519   1.1  drochner 	volatile u_int32_t nicCmdsSetRecvMiniProdIndex;		/* 70 */
    520   1.1  drochner 	volatile u_int32_t nicCmdsRefreshStats;			/* 71 */
    521   1.1  drochner 	volatile u_int32_t nicCmdsUnknown;			/* 72 */
    522   1.1  drochner 	/*
    523   1.1  drochner 	 * NIC Events
    524   1.1  drochner 	 */
    525   1.1  drochner 	volatile u_int32_t nicEventsNICFirmwareOperational;	/* 73 */
    526   1.1  drochner 	volatile u_int32_t nicEventsStatsUpdated;		/* 74 */
    527   1.1  drochner 	volatile u_int32_t nicEventsLinkStateChanged;		/* 75 */
    528   1.1  drochner 	volatile u_int32_t nicEventsError;			/* 76 */
    529   1.1  drochner 	volatile u_int32_t nicEventsMCastListUpdated;		/* 77 */
    530   1.1  drochner 	volatile u_int32_t nicEventsResetJumboRing;		/* 78 */
    531   1.1  drochner 	/*
    532   1.1  drochner 	 * Ring manipulation
    533   1.1  drochner 	 */
    534   1.1  drochner 	volatile u_int32_t nicRingSetSendProdIndex;		/* 79 */
    535   1.1  drochner 	volatile u_int32_t nicRingSetSendConsIndex;		/* 80 */
    536   1.1  drochner 	volatile u_int32_t nicRingSetRecvReturnProdIndex;	/* 81 */
    537   1.1  drochner 	/*
    538   1.1  drochner 	 * Interrupts
    539   1.1  drochner 	 */
    540   1.1  drochner 	volatile u_int32_t nicInterrupts;			/* 82 */
    541   1.1  drochner 	volatile u_int32_t nicAvoidedInterrupts;		/* 83 */
    542   1.1  drochner 	/*
    543   1.1  drochner 	 * BD Coalessing Thresholds
    544   1.1  drochner 	 */
    545   1.1  drochner 	volatile u_int32_t nicEventThresholdHit;		/* 84 */
    546   1.1  drochner 	volatile u_int32_t nicSendThresholdHit;			/* 85 */
    547   1.1  drochner 	volatile u_int32_t nicRecvThresholdHit;			/* 86 */
    548   1.1  drochner 	/*
    549   1.1  drochner 	 * DMA Attentions
    550   1.1  drochner 	 */
    551   1.1  drochner 	volatile u_int32_t nicDmaRdOverrun;			/* 87 */
    552   1.1  drochner 	volatile u_int32_t nicDmaRdUnderrun;			/* 88 */
    553   1.1  drochner 	volatile u_int32_t nicDmaWrOverrun;			/* 89 */
    554   1.1  drochner 	volatile u_int32_t nicDmaWrUnderrun;			/* 90 */
    555   1.1  drochner 	volatile u_int32_t nicDmaWrMasterAborts;		/* 91 */
    556   1.1  drochner 	volatile u_int32_t nicDmaRdMasterAborts;		/* 92 */
    557   1.1  drochner 	/*
    558   1.1  drochner 	 * NIC Resources
    559   1.1  drochner 	 */
    560   1.1  drochner 	volatile u_int32_t nicDmaWriteRingFull;			/* 93 */
    561   1.1  drochner 	volatile u_int32_t nicDmaReadRingFull;			/* 94 */
    562   1.1  drochner 	volatile u_int32_t nicEventRingFull;			/* 95 */
    563   1.1  drochner 	volatile u_int32_t nicEventProducerRingFull;		/* 96 */
    564   1.1  drochner 	volatile u_int32_t nicTxMacDescrRingFull;		/* 97 */
    565   1.1  drochner 	volatile u_int32_t nicOutOfTxBufSpaceFrameRetry;	/* 98 */
    566   1.1  drochner 	volatile u_int32_t nicNoMoreWrDMADescriptors;		/* 99 */
    567   1.1  drochner 	volatile u_int32_t nicNoMoreRxBDs;			/* 100 */
    568   1.1  drochner 	volatile u_int32_t nicNoSpaceInReturnRing;		/* 101 */
    569   1.1  drochner 	volatile u_int32_t nicSendBDs;            /* current count 102 */
    570   1.1  drochner 	volatile u_int32_t nicRecvBDs;            /* current count 103 */
    571   1.1  drochner 	volatile u_int32_t nicJumboRecvBDs;       /* current count 104 */
    572   1.1  drochner 	volatile u_int32_t nicMiniRecvBDs;        /* current count 105 */
    573   1.1  drochner 	volatile u_int32_t nicTotalRecvBDs;       /* current count 106 */
    574   1.1  drochner 	volatile u_int32_t nicTotalSendBDs;       /* current count 107 */
    575   1.1  drochner 	volatile u_int32_t nicJumboSpillOver;			/* 108 */
    576   1.1  drochner 	volatile u_int32_t nicSbusHangCleared;			/* 109 */
    577   1.1  drochner 	volatile u_int32_t nicEnqEventDelayed;			/* 110 */
    578   1.1  drochner 	/*
    579   1.1  drochner 	 * Stats from MAC rx completion
    580   1.1  drochner 	 */
    581   1.1  drochner 	volatile u_int32_t nicMacRxLateColls;			/* 111 */
    582   1.1  drochner 	volatile u_int32_t nicMacRxLinkLostDuringPkt;		/* 112 */
    583   1.1  drochner 	volatile u_int32_t nicMacRxPhyDecodeErr;		/* 113 */
    584   1.1  drochner 	volatile u_int32_t nicMacRxMacAbort;			/* 114 */
    585   1.1  drochner 	volatile u_int32_t nicMacRxTruncNoResources;		/* 115 */
    586   1.1  drochner 	/*
    587   1.1  drochner 	 * Stats from the mac_stats area
    588   1.1  drochner 	 */
    589   1.1  drochner 	volatile u_int32_t nicMacRxDropUla;			/* 116 */
    590   1.1  drochner 	volatile u_int32_t nicMacRxDropMcast;			/* 117 */
    591   1.1  drochner 	volatile u_int32_t nicMacRxFlowControl;			/* 118 */
    592   1.1  drochner 	volatile u_int32_t nicMacRxDropSpace;			/* 119 */
    593   1.1  drochner 	volatile u_int32_t nicMacRxColls;			/* 120 */
    594   1.1  drochner 	/*
    595   1.1  drochner  	 * MAC RX Attentions
    596   1.1  drochner 	 */
    597   1.1  drochner 	volatile u_int32_t nicMacRxTotalAttns;			/* 121 */
    598   1.1  drochner 	volatile u_int32_t nicMacRxLinkAttns;			/* 122 */
    599   1.1  drochner 	volatile u_int32_t nicMacRxSyncAttns;			/* 123 */
    600   1.1  drochner 	volatile u_int32_t nicMacRxConfigAttns;			/* 124 */
    601   1.1  drochner 	volatile u_int32_t nicMacReset;				/* 125 */
    602   1.1  drochner 	volatile u_int32_t nicMacRxBufDescrAttns;		/* 126 */
    603   1.1  drochner 	volatile u_int32_t nicMacRxBufAttns;			/* 127 */
    604   1.1  drochner 	volatile u_int32_t nicMacRxZeroFrameCleanup;		/* 128 */
    605   1.1  drochner 	volatile u_int32_t nicMacRxOneFrameCleanup;		/* 129 */
    606   1.1  drochner 	volatile u_int32_t nicMacRxMultipleFrameCleanup;	/* 130 */
    607   1.1  drochner 	volatile u_int32_t nicMacRxTimerCleanup;		/* 131 */
    608   1.1  drochner 	volatile u_int32_t nicMacRxDmaCleanup;			/* 132 */
    609   1.1  drochner 	/*
    610   1.1  drochner 	 * Stats from the mac_stats area
    611   1.1  drochner 	 */
    612   1.1  drochner 	volatile u_int32_t nicMacTxCollisionHistogram[15];	/* 133 */
    613   1.1  drochner 	/*
    614   1.1  drochner 	 * MAC TX Attentions
    615   1.1  drochner 	 */
    616   1.1  drochner 	volatile u_int32_t nicMacTxTotalAttns;			/* 134 */
    617   1.1  drochner 	/*
    618   1.1  drochner 	 * NIC Profile
    619   1.1  drochner 	 */
    620   1.1  drochner 	volatile u_int32_t nicProfile[32];			/* 135 */
    621   1.1  drochner 	/*
    622   1.1  drochner 	 * Pat to 1024 bytes.
    623   1.1  drochner 	 */
    624   1.1  drochner 	u_int32_t		pad[75];
    625   1.1  drochner };
    626   1.1  drochner /*
    627   1.1  drochner  * Tigon general information block. This resides in host memory
    628   1.1  drochner  * and contains the status counters, ring control blocks and
    629   1.1  drochner  * producer pointers.
    630   1.1  drochner  */
    631   1.1  drochner 
    632   1.1  drochner struct ti_gib {
    633   1.1  drochner 	struct ti_stats		ti_stats;
    634   1.1  drochner 	struct ti_rcb		ti_ev_rcb;
    635   1.1  drochner 	struct ti_rcb		ti_cmd_rcb;
    636   1.1  drochner 	struct ti_rcb		ti_tx_rcb;
    637   1.1  drochner 	struct ti_rcb		ti_std_rx_rcb;
    638   1.1  drochner 	struct ti_rcb		ti_jumbo_rx_rcb;
    639   1.1  drochner 	struct ti_rcb		ti_mini_rx_rcb;
    640   1.1  drochner 	struct ti_rcb		ti_return_rcb;
    641   1.1  drochner 	ti_hostaddr		ti_ev_prodidx_ptr;
    642   1.1  drochner 	ti_hostaddr		ti_return_prodidx_ptr;
    643   1.1  drochner 	ti_hostaddr		ti_tx_considx_ptr;
    644   1.1  drochner 	ti_hostaddr		ti_refresh_stats_ptr;
    645   1.1  drochner };
    646   1.1  drochner 
    647   1.1  drochner /*
    648   1.1  drochner  * Buffer descriptor structures. There are basically three types
    649   1.1  drochner  * of structures: normal receive descriptors, extended receive
    650   1.1  drochner  * descriptors and transmit descriptors. The extended receive
    651   1.1  drochner  * descriptors are optionally used only for the jumbo receive ring.
    652   1.1  drochner  */
    653   1.1  drochner 
    654   1.1  drochner struct ti_rx_desc {
    655   1.1  drochner 	ti_hostaddr		ti_addr;
    656   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    657   1.1  drochner 	u_int16_t		ti_idx;
    658   1.1  drochner 	u_int16_t		ti_len;
    659   1.1  drochner #else
    660   1.1  drochner 	u_int16_t		ti_len;
    661   1.1  drochner 	u_int16_t		ti_idx;
    662   1.1  drochner #endif
    663   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    664   1.1  drochner 	u_int16_t		ti_type;
    665   1.1  drochner 	u_int16_t		ti_flags;
    666   1.1  drochner #else
    667   1.1  drochner 	u_int16_t		ti_flags;
    668   1.1  drochner 	u_int16_t		ti_type;
    669   1.1  drochner #endif
    670   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    671   1.1  drochner 	u_int16_t		ti_ip_cksum;
    672   1.1  drochner 	u_int16_t		ti_tcp_udp_cksum;
    673   1.1  drochner #else
    674   1.1  drochner 	u_int16_t		ti_tcp_udp_cksum;
    675   1.1  drochner 	u_int16_t		ti_ip_cksum;
    676   1.1  drochner #endif
    677   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    678   1.1  drochner 	u_int16_t		ti_error_flags;
    679   1.1  drochner 	u_int16_t		ti_vlan_tag;
    680   1.1  drochner #else
    681   1.1  drochner 	u_int16_t		ti_vlan_tag;
    682   1.1  drochner 	u_int16_t		ti_error_flags;
    683   1.1  drochner #endif
    684   1.1  drochner 	u_int32_t		ti_rsvd;
    685   1.1  drochner 	u_int32_t		ti_opaque;
    686   1.1  drochner };
    687   1.1  drochner 
    688   1.1  drochner struct ti_rx_desc_ext {
    689   1.1  drochner 	ti_hostaddr		ti_addr1;
    690   1.1  drochner 	ti_hostaddr		ti_addr2;
    691   1.1  drochner 	ti_hostaddr		ti_addr3;
    692   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    693   1.1  drochner 	u_int16_t		ti_len1;
    694   1.1  drochner 	u_int16_t		ti_len2;
    695   1.1  drochner #else
    696   1.1  drochner 	u_int16_t		ti_len2;
    697   1.1  drochner 	u_int16_t		ti_len1;
    698   1.1  drochner #endif
    699   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    700   1.1  drochner 	u_int16_t		ti_len3;
    701   1.1  drochner 	u_int16_t		ti_rsvd0;
    702   1.1  drochner #else
    703   1.1  drochner 	u_int16_t		ti_rsvd0;
    704   1.1  drochner 	u_int16_t		ti_len3;
    705   1.1  drochner #endif
    706   1.1  drochner 	ti_hostaddr		ti_addr0;
    707   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    708   1.1  drochner 	u_int16_t		ti_idx;
    709   1.1  drochner 	u_int16_t		ti_len0;
    710   1.1  drochner #else
    711   1.1  drochner 	u_int16_t		ti_len0;
    712   1.1  drochner 	u_int16_t		ti_idx;
    713   1.1  drochner #endif
    714   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    715   1.1  drochner 	u_int16_t		ti_type;
    716   1.1  drochner 	u_int16_t		ti_flags;
    717   1.1  drochner #else
    718   1.1  drochner 	u_int16_t		ti_flags;
    719   1.1  drochner 	u_int16_t		ti_type;
    720   1.1  drochner #endif
    721   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    722   1.1  drochner 	u_int16_t		ti_ip_cksum;
    723   1.1  drochner 	u_int16_t		ti_tcp_udp_cksum;
    724   1.1  drochner #else
    725   1.1  drochner 	u_int16_t		ti_tcp_udp_cksum;
    726   1.1  drochner 	u_int16_t		ti_ip_cksum;
    727   1.1  drochner #endif
    728   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    729   1.1  drochner 	u_int16_t		ti_error_flags;
    730   1.1  drochner 	u_int16_t		ti_vlan_tag;
    731   1.1  drochner #else
    732   1.1  drochner 	u_int16_t		ti_vlan_tag;
    733   1.1  drochner 	u_int16_t		ti_error_flags;
    734   1.1  drochner #endif
    735   1.1  drochner 	u_int32_t		ti_rsvd1;
    736   1.1  drochner 	u_int32_t		ti_opaque;
    737   1.1  drochner };
    738   1.1  drochner 
    739   1.1  drochner /*
    740   1.1  drochner  * Transmit descriptors are, mercifully, very small.
    741   1.1  drochner  */
    742   1.1  drochner struct ti_tx_desc {
    743   1.1  drochner 	ti_hostaddr		ti_addr;
    744   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    745   1.1  drochner 	u_int16_t		ti_len;
    746   1.1  drochner 	u_int16_t		ti_flags;
    747   1.1  drochner #else
    748   1.1  drochner 	u_int16_t		ti_flags;
    749   1.1  drochner 	u_int16_t		ti_len;
    750   1.1  drochner #endif
    751   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    752   1.1  drochner 	u_int16_t		ti_rsvd;
    753   1.1  drochner 	u_int16_t		ti_vlan_tag;
    754   1.1  drochner #else
    755   1.1  drochner 	u_int16_t		ti_vlan_tag;
    756   1.1  drochner 	u_int16_t		ti_rsvd;
    757   1.1  drochner #endif
    758   1.1  drochner };
    759   1.1  drochner 
    760   1.1  drochner /*
    761   1.1  drochner  * NOTE!  On the Alpha, we have an alignment constraint.
    762   1.1  drochner  * The first thing in the packet is a 14-byte Ethernet header.
    763   1.1  drochner  * This means that the packet is misaligned.  To compensate,
    764   1.1  drochner  * we actually offset the data 2 bytes into the cluster.  This
    765   1.1  drochner  * alignes the packet after the Ethernet header at a 32-bit
    766   1.1  drochner  * boundary.
    767   1.1  drochner  */
    768   1.1  drochner 
    769   1.1  drochner #define ETHER_ALIGN 2
    770   1.1  drochner 
    771   1.1  drochner #define TI_PAGE_SIZE		PAGE_SIZE
    772   1.1  drochner 
    773   1.1  drochner /*
    774   1.1  drochner  * Buffer descriptor error flags.
    775   1.1  drochner  */
    776   1.1  drochner #define TI_BDERR_CRC			0x0001
    777   1.1  drochner #define TI_BDERR_COLLDETECT		0x0002
    778   1.1  drochner #define TI_BDERR_LINKLOST		0x0004
    779   1.1  drochner #define TI_BDERR_DECODE			0x0008
    780   1.1  drochner #define TI_BDERR_ODD_NIBBLES		0x0010
    781   1.1  drochner #define TI_BDERR_MAC_ABRT		0x0020
    782   1.1  drochner #define TI_BDERR_RUNT			0x0040
    783   1.1  drochner #define TI_BDERR_TRUNC			0x0080
    784   1.1  drochner #define TI_BDERR_GIANT			0x0100
    785   1.1  drochner 
    786   1.1  drochner /*
    787   1.1  drochner  * Buffer descriptor flags.
    788   1.1  drochner  */
    789   1.1  drochner #define TI_BDFLAG_TCP_UDP_CKSUM		0x0001
    790   1.1  drochner #define TI_BDFLAG_IP_CKSUM		0x0002
    791   1.1  drochner #define TI_BDFLAG_END			0x0004
    792   1.1  drochner #define TI_BDFLAG_MORE			0x0008
    793   1.1  drochner #define TI_BDFLAG_JUMBO_RING		0x0010
    794   1.1  drochner #define TI_BDFLAG_UCAST_PKT		0x0020
    795   1.1  drochner #define TI_BDFLAG_MCAST_PKT		0x0040
    796   1.1  drochner #define TI_BDFLAG_BCAST_PKT		0x0060
    797   1.1  drochner #define TI_BDFLAG_IP_FRAG		0x0080
    798   1.1  drochner #define TI_BDFLAG_IP_FRAG_END		0x0100
    799   1.1  drochner #define TI_BDFLAG_VLAN_TAG		0x0200
    800   1.1  drochner #define TI_BDFLAG_ERROR			0x0400
    801   1.1  drochner #define TI_BDFLAG_COAL_NOW		0x0800
    802   1.1  drochner #define	TI_BDFLAG_MINI_RING		0x1000
    803   1.1  drochner 
    804   1.1  drochner /*
    805   1.1  drochner  * Descriptor type flags. I think these only have meaning for
    806   1.1  drochner  * the Tigon 1. I had to extract them from the sample driver source
    807   1.1  drochner  * since they aren't in the manual.
    808   1.1  drochner  */
    809   1.1  drochner #define TI_BDTYPE_TYPE_NULL			0x0000
    810   1.1  drochner #define TI_BDTYPE_SEND_BD			0x0001
    811   1.1  drochner #define TI_BDTYPE_RECV_BD			0x0002
    812   1.1  drochner #define TI_BDTYPE_RECV_JUMBO_BD			0x0003
    813   1.1  drochner #define TI_BDTYPE_RECV_BD_LAST			0x0004
    814   1.1  drochner #define TI_BDTYPE_SEND_DATA			0x0005
    815   1.1  drochner #define TI_BDTYPE_SEND_DATA_LAST		0x0006
    816   1.1  drochner #define TI_BDTYPE_RECV_DATA			0x0007
    817   1.1  drochner #define TI_BDTYPE_RECV_DATA_LAST		0x000b
    818   1.1  drochner #define TI_BDTYPE_EVENT_RUPT			0x000c
    819   1.1  drochner #define TI_BDTYPE_EVENT_NO_RUPT			0x000d
    820   1.1  drochner #define TI_BDTYPE_ODD_START			0x000e
    821   1.1  drochner #define TI_BDTYPE_UPDATE_STATS			0x000f
    822   1.1  drochner #define TI_BDTYPE_SEND_DUMMY_DMA		0x0010
    823   1.1  drochner #define TI_BDTYPE_EVENT_PROD			0x0011
    824   1.1  drochner #define TI_BDTYPE_TX_CONS			0x0012
    825   1.1  drochner #define TI_BDTYPE_RX_PROD			0x0013
    826   1.1  drochner #define TI_BDTYPE_REFRESH_STATS			0x0014
    827   1.1  drochner #define TI_BDTYPE_SEND_DATA_LAST_VLAN		0x0015
    828   1.1  drochner #define TI_BDTYPE_SEND_DATA_COAL		0x0016
    829   1.1  drochner #define TI_BDTYPE_SEND_DATA_LAST_COAL		0x0017
    830   1.1  drochner #define TI_BDTYPE_SEND_DATA_LAST_VLAN_COAL	0x0018
    831   1.1  drochner #define TI_BDTYPE_TX_CONS_NO_INTR		0x0019
    832   1.1  drochner 
    833   1.1  drochner /*
    834   1.1  drochner  * Tigon command structure.
    835   1.1  drochner  */
    836   1.1  drochner struct ti_cmd_desc {
    837   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    838   1.1  drochner 	u_int32_t		ti_cmd:8;
    839   1.1  drochner 	u_int32_t		ti_code:12;
    840   1.1  drochner 	u_int32_t		ti_idx:12;
    841   1.1  drochner #else
    842   1.1  drochner 	u_int32_t		ti_idx:12;
    843   1.1  drochner 	u_int32_t		ti_code:12;
    844   1.1  drochner 	u_int32_t		ti_cmd:8;
    845   1.1  drochner #endif
    846   1.1  drochner };
    847   1.1  drochner 
    848   1.1  drochner #define TI_CMD_HOST_STATE		0x01
    849   1.1  drochner #define TI_CMD_CODE_STACK_UP		0x01
    850   1.1  drochner #define TI_CMD_CODE_STACK_DOWN		0x02
    851   1.1  drochner 
    852   1.1  drochner /*
    853   1.1  drochner  * This command enables software address filtering. It's a workaround
    854   1.1  drochner  * for a bug in the Tigon 1 and not implemented for the Tigon 2.
    855   1.1  drochner  */
    856   1.1  drochner #define TI_CMD_FDR_FILTERING		0x02
    857   1.1  drochner #define TI_CMD_CODE_FILT_ENB		0x01
    858   1.1  drochner #define TI_CMD_CODE_FILT_DIS		0x02
    859   1.1  drochner 
    860   1.1  drochner #define TI_CMD_SET_RX_PROD_IDX		0x03 /* obsolete */
    861   1.1  drochner #define TI_CMD_UPDATE_GENCOM		0x04
    862   1.1  drochner #define TI_CMD_RESET_JUMBO_RING		0x05
    863   1.1  drochner #define TI_CMD_SET_PARTIAL_RX_CNT	0x06
    864   1.1  drochner #define TI_CMD_ADD_MCAST_ADDR		0x08 /* obsolete */
    865   1.1  drochner #define TI_CMD_DEL_MCAST_ADDR		0x09 /* obsolete */
    866   1.1  drochner 
    867   1.1  drochner #define TI_CMD_SET_PROMISC_MODE		0x0A
    868   1.1  drochner #define TI_CMD_CODE_PROMISC_ENB		0x01
    869   1.1  drochner #define TI_CMD_CODE_PROMISC_DIS		0x02
    870   1.1  drochner 
    871   1.1  drochner #define TI_CMD_LINK_NEGOTIATION		0x0B
    872   1.1  drochner #define TI_CMD_CODE_NEGOTIATE_BOTH	0x00
    873   1.1  drochner #define TI_CMD_CODE_NEGOTIATE_GIGABIT	0x01
    874   1.1  drochner #define TI_CMD_CODE_NEGOTIATE_10_100	0x02
    875   1.1  drochner 
    876   1.1  drochner #define TI_CMD_SET_MAC_ADDR		0x0C
    877   1.1  drochner #define TI_CMD_CLR_PROFILE		0x0D
    878   1.1  drochner 
    879   1.1  drochner #define TI_CMD_SET_ALLMULTI		0x0E
    880   1.1  drochner #define TI_CMD_CODE_ALLMULTI_ENB	0x01
    881   1.1  drochner #define TI_CMD_CODE_ALLMULTI_DIS	0x02
    882   1.1  drochner 
    883   1.1  drochner #define TI_CMD_CLR_STATS		0x0F
    884   1.1  drochner #define TI_CMD_SET_RX_JUMBO_PROD_IDX	0x10 /* obsolete */
    885   1.1  drochner #define TI_CMD_RFRSH_STATS		0x11
    886   1.1  drochner 
    887   1.1  drochner #define TI_CMD_EXT_ADD_MCAST		0x12
    888   1.1  drochner #define TI_CMD_EXT_DEL_MCAST		0x13
    889   1.1  drochner 
    890   1.1  drochner /*
    891   1.1  drochner  * Utility macros to make issuing commands a little simpler. Assumes
    892   1.1  drochner  * that 'sc' and 'cmd' are in local scope.
    893   1.1  drochner  */
    894   1.1  drochner #define TI_DO_CMD(x, y, z)		\
    895   1.1  drochner 	cmd.ti_cmd = x;			\
    896   1.1  drochner 	cmd.ti_code = y;		\
    897   1.1  drochner 	cmd.ti_idx = z;			\
    898   1.1  drochner 	ti_cmd(sc, &cmd);
    899   1.1  drochner 
    900   1.1  drochner #define TI_DO_CMD_EXT(x, y, z, v, w)	\
    901   1.1  drochner 	cmd.ti_cmd = x;			\
    902   1.1  drochner 	cmd.ti_code = y;		\
    903   1.1  drochner 	cmd.ti_idx = z;			\
    904   1.1  drochner 	ti_cmd_ext(sc, &cmd, v, w);
    905   1.1  drochner 
    906   1.1  drochner /*
    907   1.1  drochner  * Other utility macros.
    908   1.1  drochner  */
    909   1.1  drochner #define TI_INC(x, y)	(x) = (x + 1) % y
    910   1.1  drochner 
    911   1.1  drochner #define TI_UPDATE_JUMBOPROD(x, y)					\
    912   1.1  drochner 	if (x->ti_hwrev == TI_HWREV_TIGON) {				\
    913   1.1  drochner 		TI_DO_CMD(TI_CMD_SET_RX_JUMBO_PROD_IDX, 0, y);	\
    914   1.1  drochner 	} else {							\
    915   1.1  drochner 		CSR_WRITE_4(x, TI_MB_JUMBORXPROD_IDX, y);		\
    916   1.1  drochner 	}
    917   1.1  drochner 
    918   1.1  drochner #define TI_UPDATE_MINIPROD(x, y)					\
    919   1.1  drochner 		CSR_WRITE_4(x, TI_MB_MINIRXPROD_IDX, y);
    920   1.1  drochner 
    921   1.1  drochner #define TI_UPDATE_STDPROD(x, y)						\
    922   1.1  drochner 	if (x->ti_hwrev == TI_HWREV_TIGON) {				\
    923   1.1  drochner 		TI_DO_CMD(TI_CMD_SET_RX_PROD_IDX, 0, y);		\
    924   1.1  drochner 	} else {							\
    925   1.1  drochner 		CSR_WRITE_4(x, TI_MB_STDRXPROD_IDX, y);			\
    926   1.1  drochner 	}
    927   1.1  drochner 
    928   1.1  drochner 
    929   1.1  drochner /*
    930   1.1  drochner  * Tigon event structure.
    931   1.1  drochner  */
    932   1.1  drochner struct ti_event_desc {
    933   1.1  drochner #if BYTE_ORDER == BIG_ENDIAN
    934   1.1  drochner 	u_int32_t		ti_event:8;
    935   1.1  drochner 	u_int32_t		ti_code:12;
    936   1.1  drochner 	u_int32_t		ti_idx:12;
    937   1.1  drochner #else
    938   1.1  drochner 	u_int32_t		ti_idx:12;
    939   1.1  drochner 	u_int32_t		ti_code:12;
    940   1.1  drochner 	u_int32_t		ti_event:8;
    941   1.1  drochner #endif
    942   1.1  drochner 	u_int32_t		ti_rsvd;
    943   1.1  drochner };
    944   1.1  drochner 
    945   1.1  drochner /*
    946   1.1  drochner  * Tigon events.
    947   1.1  drochner  */
    948   1.1  drochner #define TI_EV_FIRMWARE_UP		0x01
    949   1.1  drochner #define TI_EV_STATS_UPDATED		0x04
    950   1.1  drochner 
    951   1.1  drochner #define TI_EV_LINKSTAT_CHANGED		0x06
    952   1.1  drochner #define TI_EV_CODE_GIG_LINK_UP		0x01
    953   1.1  drochner #define TI_EV_CODE_LINK_DOWN		0x02
    954   1.1  drochner #define TI_EV_CODE_LINK_UP		0x03
    955   1.1  drochner 
    956   1.1  drochner #define TI_EV_ERROR			0x07
    957   1.1  drochner #define TI_EV_CODE_ERR_INVAL_CMD	0x01
    958   1.1  drochner #define TI_EV_CODE_ERR_UNIMP_CMD	0x02
    959   1.1  drochner #define TI_EV_CODE_ERR_BADCFG		0x03
    960   1.1  drochner 
    961   1.1  drochner #define TI_EV_MCAST_UPDATED		0x08
    962   1.1  drochner #define TI_EV_CODE_MCAST_ADD		0x01
    963   1.1  drochner #define TI_EV_CODE_MCAST_DEL		0x02
    964   1.1  drochner 
    965   1.1  drochner #define TI_EV_RESET_JUMBO_RING		0x09
    966   1.1  drochner /*
    967   1.1  drochner  * Register access macros. The Tigon always uses memory mapped register
    968   1.1  drochner  * accesses and all registers must be accessed with 32 bit operations.
    969   1.1  drochner  */
    970   1.1  drochner 
    971   1.1  drochner #define CSR_WRITE_4(sc, reg, val)	\
    972   1.4     lukem 	bus_space_write_4(sc->ti_btag, sc->ti_bhandle, (reg), (val))
    973   1.1  drochner 
    974   1.1  drochner #define CSR_READ_4(sc, reg)		\
    975   1.4     lukem 	bus_space_read_4(sc->ti_btag, sc->ti_bhandle, (reg))
    976   1.1  drochner 
    977   1.1  drochner #define TI_SETBIT(sc, reg, x)	\
    978   1.4     lukem 	CSR_WRITE_4(sc, (reg), (CSR_READ_4(sc, (reg)) | (x)))
    979   1.1  drochner #define TI_CLRBIT(sc, reg, x)	\
    980   1.4     lukem 	CSR_WRITE_4(sc, (reg), (CSR_READ_4(sc, (reg)) & ~(x)))
    981   1.1  drochner 
    982   1.1  drochner /*
    983   1.1  drochner  * Memory management stuff. Note: the SSLOTS, MSLOTS and JSLOTS
    984   1.1  drochner  * values are tuneable. They control the actual amount of buffers
    985   1.1  drochner  * allocated for the standard, mini and jumbo receive rings.
    986   1.1  drochner  */
    987   1.1  drochner 
    988   1.1  drochner #define TI_SSLOTS	64 /* 256 */
    989   1.1  drochner #define TI_MSLOTS	64 /* 256 */
    990   1.1  drochner #define TI_JSLOTS	64 /* 256 */
    991   1.1  drochner #define TI_RSLOTS	128
    992   1.1  drochner 
    993   1.5   thorpej #define TI_JRAWLEN (ETHER_MAX_LEN_JUMBO + ETHER_ALIGN + sizeof(u_int64_t))
    994   1.1  drochner #define TI_JLEN (TI_JRAWLEN + (sizeof(u_int64_t) - \
    995   1.1  drochner 	(TI_JRAWLEN % sizeof(u_int64_t))))
    996   1.2   thorpej #define TI_JPAGESZ PAGE_SIZE
    997   1.1  drochner #define TI_RESID (TI_JPAGESZ - (TI_JLEN * TI_JSLOTS) % TI_JPAGESZ)
    998   1.1  drochner #define TI_JMEM ((TI_JLEN * TI_JSLOTS) + TI_RESID)
    999   1.1  drochner 
   1000   1.1  drochner /*
   1001   1.1  drochner  * Ring structures. Most of these reside in host memory and we tell
   1002   1.1  drochner  * the NIC where they are via the ring control blocks. The exceptions
   1003   1.1  drochner  * are the tx and command rings, which live in NIC memory and which
   1004   1.1  drochner  * we access via the shared memory window.
   1005   1.1  drochner  */
   1006   1.1  drochner struct ti_ring_data {
   1007   1.1  drochner 	struct ti_rx_desc	ti_rx_std_ring[TI_STD_RX_RING_CNT];
   1008   1.1  drochner 	struct ti_rx_desc	ti_rx_jumbo_ring[TI_JUMBO_RX_RING_CNT];
   1009   1.1  drochner 	struct ti_rx_desc	ti_rx_mini_ring[TI_MINI_RX_RING_CNT];
   1010   1.1  drochner 	struct ti_rx_desc	ti_rx_return_ring[TI_RETURN_RING_CNT];
   1011   1.1  drochner 	struct ti_event_desc	ti_event_ring[TI_EVENT_RING_CNT];
   1012   1.1  drochner 	struct ti_tx_desc	ti_tx_ring[TI_TX_RING_CNT];
   1013   1.1  drochner 	/*
   1014   1.1  drochner 	 * Make sure producer structures are aligned on 32-byte cache
   1015   1.1  drochner 	 * line boundaries.
   1016   1.1  drochner 	 */
   1017   1.1  drochner 	struct ti_producer	ti_ev_prodidx_r;
   1018   1.1  drochner 	u_int32_t		ti_pad0[6];
   1019   1.1  drochner 	struct ti_producer	ti_return_prodidx_r;
   1020   1.1  drochner 	u_int32_t		ti_pad1[6];
   1021   1.1  drochner 	struct ti_producer	ti_tx_considx_r;
   1022   1.1  drochner 	u_int32_t		ti_pad2[6];
   1023   1.1  drochner 	struct ti_gib		ti_info;
   1024   1.1  drochner };
   1025   1.1  drochner 
   1026   1.9   thorpej #define	TI_CDOFF(x)		offsetof(struct ti_ring_data, x)
   1027   1.9   thorpej #define	TI_CDRXSTDOFF(x)	TI_CDOFF(ti_rx_std_ring[(x)])
   1028   1.9   thorpej #define	TI_CDRXJUMBOOFF(x)	TI_CDOFF(ti_rx_jumbo_ring[(x)])
   1029   1.9   thorpej #define	TI_CDRXMINIOFF(x)	TI_CDOFF(ti_rx_mini_ring[(x)])
   1030   1.9   thorpej #define	TI_CDRXRTNOFF(x)	TI_CDOFF(ti_rx_return_ring[(x)])
   1031   1.9   thorpej #define	TI_CDEVENTOFF(x)	TI_CDOFF(ti_event_ring[(x)])
   1032   1.9   thorpej #define	TI_CDTXOFF(x)		TI_CDOFF(ti_tx_ring[(x)])
   1033   1.9   thorpej #define	TI_CDEVPRODOFF		TI_CDOFF(ti_ev_prodidx_r)
   1034   1.9   thorpej #define	TI_CDRTNPRODOFF		TI_CDOFF(ti_return_prodidx_r)
   1035   1.9   thorpej #define	TI_CDTXCONSOFF		TI_CDOFF(ti_tx_considx_r)
   1036   1.9   thorpej #define	TI_CDGIBOFF		TI_CDOFF(ti_info)
   1037   1.9   thorpej #define	TI_CDSTATSOFF		TI_CDOFF(ti_info.ti_stats)
   1038   1.9   thorpej 
   1039   1.1  drochner /*
   1040   1.1  drochner  * Mbuf pointers. We need these to keep track of the virtual addresses
   1041   1.1  drochner  * of our mbuf chains since we can only convert from physical to virtual,
   1042   1.1  drochner  * not the other way around.
   1043   1.1  drochner  */
   1044   1.1  drochner struct ti_chain_data {
   1045   1.1  drochner 	struct mbuf		*ti_tx_chain[TI_TX_RING_CNT];
   1046   1.1  drochner 	struct mbuf		*ti_rx_std_chain[TI_STD_RX_RING_CNT];
   1047   1.1  drochner 	struct mbuf		*ti_rx_jumbo_chain[TI_JUMBO_RX_RING_CNT];
   1048   1.1  drochner 	struct mbuf		*ti_rx_mini_chain[TI_MINI_RX_RING_CNT];
   1049   1.1  drochner 	/* Stick the jumbo mem management stuff here too. */
   1050   1.3    bouyer 	caddr_t			ti_jslots[TI_JSLOTS];
   1051   1.1  drochner 	void			*ti_jumbo_buf;
   1052   1.1  drochner };
   1053   1.1  drochner 
   1054   1.1  drochner struct ti_type {
   1055   1.1  drochner 	u_int16_t		ti_vid;
   1056   1.1  drochner 	u_int16_t		ti_did;
   1057   1.1  drochner 	char			*ti_name;
   1058   1.1  drochner };
   1059   1.1  drochner 
   1060   1.1  drochner #define TI_HWREV_TIGON		0x01
   1061   1.1  drochner #define TI_HWREV_TIGON_II	0x02
   1062   1.1  drochner #define TI_TIMEOUT		1000
   1063   1.1  drochner #define TI_TXCONS_UNSET		0xFFFF	/* impossible value */
   1064   1.1  drochner 
   1065   1.1  drochner struct ti_mc_entry {
   1066   1.1  drochner 	struct ether_addr		mc_addr;
   1067   1.1  drochner 	SIMPLEQ_ENTRY(ti_mc_entry)	mc_entries;
   1068   1.1  drochner };
   1069   1.1  drochner 
   1070   1.1  drochner struct ti_jpool_entry {
   1071   1.1  drochner 	int                             slot;
   1072   1.1  drochner 	SIMPLEQ_ENTRY(ti_jpool_entry)	jpool_entries;
   1073   1.1  drochner };
   1074   1.1  drochner 
   1075   1.1  drochner struct txdmamap_pool_entry {
   1076   1.1  drochner 	bus_dmamap_t dmamap;
   1077   1.1  drochner 	SIMPLEQ_ENTRY(txdmamap_pool_entry) link;
   1078   1.1  drochner };
   1079   1.1  drochner 
   1080   1.1  drochner struct ti_softc {
   1081   1.1  drochner 	struct device sc_dev;
   1082   1.1  drochner 	struct ethercom		ethercom;	/* interface info */
   1083   1.1  drochner 	bus_space_handle_t	ti_bhandle;
   1084   1.1  drochner 	char			*ti_vhandle;
   1085   1.1  drochner 	bus_space_tag_t		ti_btag;
   1086   1.1  drochner 	void			*ti_intrhand;
   1087   1.7   thorpej 
   1088   1.1  drochner 	struct ifmedia		ifmedia;	/* media info */
   1089   1.7   thorpej 
   1090   1.1  drochner 	u_int8_t		ti_hwrev;	/* Tigon rev (1 or 2) */
   1091  1.11     bjh21 	u_int8_t		ti_copper;	/* 1000baseT card */
   1092   1.1  drochner 	u_int8_t		ti_linkstat;	/* Link state */
   1093   1.1  drochner 	struct ti_ring_data	*ti_rdata;	/* rings */
   1094   1.1  drochner #define ti_ev_prodidx		ti_rdata->ti_ev_prodidx_r
   1095   1.1  drochner #define ti_return_prodidx	ti_rdata->ti_return_prodidx_r
   1096   1.1  drochner #define ti_tx_considx		ti_rdata->ti_tx_considx_r
   1097   1.7   thorpej 
   1098   1.7   thorpej 	struct ti_tx_desc	*ti_tx_ring_nic;/* pointer to shared mem */
   1099   1.7   thorpej 
   1100   1.7   thorpej 	struct ti_chain_data	ti_cdata;	/* mbufs */
   1101   1.7   thorpej 
   1102   1.7   thorpej 	/*
   1103   1.7   thorpej 	 * Function pointers to deal with Tigon 1 vs. Tigon 2 differences.
   1104   1.7   thorpej 	 */
   1105   1.7   thorpej 	int			(*sc_tx_encap)(struct ti_softc *,
   1106   1.7   thorpej 				    struct mbuf *, uint32_t *);
   1107   1.8   thorpej 	void			(*sc_tx_eof)(struct ti_softc *);
   1108   1.7   thorpej 
   1109   1.1  drochner 	u_int16_t		ti_tx_saved_considx;
   1110   1.1  drochner 	u_int16_t		ti_rx_saved_considx;
   1111   1.1  drochner 	u_int16_t		ti_ev_saved_considx;
   1112   1.1  drochner 	u_int16_t		ti_cmd_saved_prodidx;
   1113   1.1  drochner 	u_int16_t		ti_std;		/* current std ring head */
   1114   1.1  drochner 	u_int16_t		ti_mini;	/* current mini ring head */
   1115   1.1  drochner 	u_int16_t		ti_jumbo;	/* current jumo ring head */
   1116   1.1  drochner 	SIMPLEQ_HEAD(, ti_mc_entry)	ti_mc_listhead;
   1117   1.1  drochner 	SIMPLEQ_HEAD(, ti_jpool_entry)	ti_jfree_listhead;
   1118   1.1  drochner 	SIMPLEQ_HEAD(, ti_jpool_entry)	ti_jinuse_listhead;
   1119   1.1  drochner 	u_int32_t		ti_stat_ticks;
   1120   1.1  drochner 	u_int32_t		ti_rx_coal_ticks;
   1121   1.1  drochner 	u_int32_t		ti_tx_coal_ticks;
   1122   1.1  drochner 	u_int32_t		ti_rx_max_coal_bds;
   1123   1.1  drochner 	u_int32_t		ti_tx_max_coal_bds;
   1124   1.1  drochner 	u_int32_t		ti_tx_buf_ratio;
   1125   1.1  drochner 	int			ti_if_flags;
   1126   1.1  drochner 	int			ti_txcnt;
   1127   1.1  drochner 	void *sc_ih;
   1128   1.1  drochner 	bus_dma_tag_t sc_dmat;
   1129   1.1  drochner 	bus_dmamap_t info_dmamap; /* holds ti_rdata */
   1130   1.1  drochner 	u_int32_t info_dmaaddr; /* XXX 64-bit PCI addresses? */
   1131   1.1  drochner 	bus_dmamap_t jumbo_dmamap;
   1132   1.1  drochner 	u_int32_t jumbo_dmaaddr; /* XXX 64-bit PCI addresses? */
   1133   1.1  drochner 	bus_dmamap_t mini_dmamap[TI_MINI_RX_RING_CNT];
   1134   1.1  drochner 	bus_dmamap_t std_dmamap[TI_STD_RX_RING_CNT];
   1135   1.1  drochner 	SIMPLEQ_HEAD(, txdmamap_pool_entry) txdma_list;
   1136   1.1  drochner 	struct txdmamap_pool_entry *txdma[TI_TX_RING_CNT];
   1137   1.1  drochner };
   1138   1.9   thorpej 
   1139   1.9   thorpej #define	TI_CDRXSTDADDR(sc, x)	((sc)->info_dmaaddr + TI_CDRXSTDOFF((x)))
   1140   1.9   thorpej #define	TI_CDRXJUMBOADDR(sc, x)	((sc)->info_dmaaddr + TI_CDRXJUMBOOFF((x)))
   1141   1.9   thorpej #define	TI_CDRXMINIADDR(sc, x)	((sc)->info_dmaaddr + TI_CDRXMINIOFF((x)))
   1142   1.9   thorpej #define	TI_CDRXRTNADDR(sc, x)	((sc)->info_dmaaddr + TI_CDRXRTNOFF((x)))
   1143   1.9   thorpej #define	TI_CDEVENTADDR(sc, x)	((sc)->info_dmaaddr + TI_CDEVENTOFF((x)))
   1144   1.9   thorpej #define	TI_CDTXADDR(sc, x)	((sc)->info_dmaaddr + TI_CDTXOFF((x)))
   1145   1.9   thorpej #define	TI_CDEVPRODADDR(sc)	((sc)->info_dmaaddr + TI_CDEVPRODOFF)
   1146   1.9   thorpej #define	TI_CDRTNPRODADDR(sc)	((sc)->info_dmaaddr + TI_CDRTNPRODOFF)
   1147   1.9   thorpej #define	TI_CDTXCONSADDR(sc)	((sc)->info_dmaaddr + TI_CDTXCONSOFF)
   1148   1.9   thorpej #define	TI_CDGIBADDR(sc)	((sc)->info_dmaaddr + TI_CDGIBOFF)
   1149   1.9   thorpej #define	TI_CDSTATSADDR(sc)	((sc)->info_dmaaddr + TI_CDSTATSOFF)
   1150  1.10   thorpej 
   1151  1.10   thorpej #define	TI_CDRXSTDSYNC(sc, x, ops)					\
   1152  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1153  1.10   thorpej 	    TI_CDRXSTDOFF((x)), sizeof(struct ti_rx_desc), (ops))
   1154  1.10   thorpej 
   1155  1.10   thorpej #define	TI_CDRXJUMBOSYNC(sc, x, ops)					\
   1156  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1157  1.10   thorpej 	    TI_CDRXJUMBOOFF((x)), sizeof(struct ti_rx_desc), (ops))
   1158  1.10   thorpej 
   1159  1.10   thorpej #define	TI_CDRXMINISYNC(sc, x, ops)					\
   1160  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1161  1.10   thorpej 	    TI_CDRXMINIOFF((x)), sizeof(struct ti_rx_desc), (ops))
   1162  1.10   thorpej 
   1163  1.10   thorpej #define	TI_CDRXRTNSYNC(sc, x, ops)					\
   1164  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1165  1.10   thorpej 	    TI_CDRXRTNOFF((x)), sizeof(struct ti_rx_desc), (ops))
   1166  1.10   thorpej 
   1167  1.10   thorpej #define	TI_CDEVENTSYNC(sc, x, ops)					\
   1168  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1169  1.10   thorpej 	    TI_CDEVENTOFF((x)), sizeof(struct ti_event_desc), (ops))
   1170  1.10   thorpej 
   1171  1.10   thorpej #define	TI_CDTXSYNC(sc, x, n, ops)					\
   1172  1.10   thorpej do {									\
   1173  1.10   thorpej 	int __x, __n;							\
   1174  1.10   thorpej 									\
   1175  1.10   thorpej 	__x = (x);							\
   1176  1.10   thorpej 	__n = (n);							\
   1177  1.10   thorpej 									\
   1178  1.10   thorpej 	/* If it will wrap around, sync to the end of the ring. */	\
   1179  1.10   thorpej 	if ((__x + __n) > TI_TX_RING_CNT) {				\
   1180  1.10   thorpej 		bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,	\
   1181  1.10   thorpej 		    TI_CDTXOFF(__x), sizeof(struct ti_tx_desc) *	\
   1182  1.10   thorpej 		    (TI_TX_RING_CNT - __x), (ops));			\
   1183  1.10   thorpej 		__n -= (TI_TX_RING_CNT - __x);				\
   1184  1.10   thorpej 		__x = 0;						\
   1185  1.10   thorpej 	}								\
   1186  1.10   thorpej 									\
   1187  1.10   thorpej 	/* Now sync whatever is left. */				\
   1188  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1189  1.10   thorpej 	    TI_CDTXOFF(__x), sizeof(struct ti_tx_desc) * (__n), (ops));	\
   1190  1.10   thorpej } while (/*CONSTCOND*/0)
   1191  1.10   thorpej 
   1192  1.10   thorpej #define	TI_CEVPRODSYNC(sc, ops)						\
   1193  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1194  1.10   thorpej 	    TI_CDEVPRODOFF, sizeof(struct ti_producer), (ops))
   1195  1.10   thorpej 
   1196  1.10   thorpej #define	TI_CDRTNPRODSYNC(sc, ops)					\
   1197  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1198  1.10   thorpej 	    TI_CDRTNPRODOFF, sizeof(struct ti_producer), (ops))
   1199  1.10   thorpej 
   1200  1.10   thorpej #define	TI_CDTXCONSSYNC(sc, ops)					\
   1201  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1202  1.10   thorpej 	    TI_CDTXCONSOFF, sizeof(struct ti_producer), (ops))
   1203  1.10   thorpej 
   1204  1.10   thorpej #define	TI_CDGIBSYNC(sc, ops)						\
   1205  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1206  1.10   thorpej 	    TI_CDGIBOFF, sizeof(struct ti_gib), (ops))
   1207  1.10   thorpej 
   1208  1.10   thorpej #define	TI_CDSTATSSYNC(sc, ops)						\
   1209  1.10   thorpej 	bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap,		\
   1210  1.10   thorpej 	    TI_CDSTATSOFF, sizeof(struct ti_stats), (ops))
   1211   1.1  drochner 
   1212   1.1  drochner /*
   1213   1.1  drochner  * Microchip Technology 24Cxx EEPROM control bytes
   1214   1.1  drochner  */
   1215   1.1  drochner #define EEPROM_CTL_READ			0xA1	/* 0101 0001 */
   1216   1.1  drochner #define EEPROM_CTL_WRITE		0xA0	/* 0101 0000 */
   1217   1.1  drochner 
   1218   1.1  drochner /*
   1219   1.1  drochner  * Note that EEPROM_START leaves transmission enabled.
   1220   1.1  drochner  */
   1221   1.1  drochner #define EEPROM_START							\
   1222   1.1  drochner 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock pin high */\
   1223   1.1  drochner 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Set DATA bit to 1 */	\
   1224   1.1  drochner 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Enable xmit to write bit */\
   1225   1.1  drochner 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Pull DATA bit to 0 again */\
   1226   1.1  drochner 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock low again */
   1227   1.1  drochner 
   1228   1.1  drochner /*
   1229   1.1  drochner  * EEPROM_STOP ends access to the EEPROM and clears the ETXEN bit so
   1230   1.1  drochner  * that no further data can be written to the EEPROM I/O pin.
   1231   1.1  drochner  */
   1232   1.1  drochner #define EEPROM_STOP							\
   1233   1.1  drochner 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Disable xmit */	\
   1234   1.1  drochner 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Pull DATA to 0 */	\
   1235   1.1  drochner 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock high */	\
   1236   1.1  drochner 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Enable xmit */	\
   1237   1.1  drochner 	TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Toggle DATA to 1 */	\
   1238   1.1  drochner 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Disable xmit. */	\
   1239   1.1  drochner 	TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock low again */
   1240