[BACK]Return to if_tireg.h CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_tireg.h, Revision 1.1.1.1

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

CVSweb