1 1.32 andvar /* $NetBSD: if_tireg.h,v 1.32 2023/02/21 22:13:02 andvar 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.26 msaitoh * All registers 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.27 msaitoh * Miscellaneous 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.31 thorpej #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.29 msaitoh #define TI_OPMODE_WARN_ENB 0x00000008 /* not yet implemented */ 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.29 msaitoh #define TI_OPMODE_FATAL_ENB 0x40000000 /* not yet implemented */ 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.31 thorpej /* 377 1.31 thorpej * Even on the alpha, pci addresses are 32-bit quantities 378 1.31 thorpej */ 379 1.31 thorpej 380 1.31 thorpej #ifdef __64_bit_pci_addressing__ 381 1.31 thorpej typedef struct { 382 1.31 thorpej u_int64_t ti_addr; 383 1.31 thorpej } ti_hostaddr; 384 1.31 thorpej #define TI_HOSTADDR(x) x.ti_addr 385 1.31 thorpej #else 386 1.1 drochner typedef struct { 387 1.28 msaitoh uint32_t ti_addr_hi; 388 1.28 msaitoh uint32_t ti_addr_lo; 389 1.1 drochner } ti_hostaddr; 390 1.31 thorpej #define TI_HOSTADDR(x) x.ti_addr_lo 391 1.31 thorpej #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.15 perry * 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.28 msaitoh uint16_t ti_max_len; 417 1.28 msaitoh uint16_t ti_flags; 418 1.1 drochner #else 419 1.28 msaitoh uint16_t ti_flags; 420 1.28 msaitoh uint16_t ti_max_len; 421 1.1 drochner #endif 422 1.28 msaitoh uint32_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.28 msaitoh uint32_t ti_idx; 437 1.28 msaitoh uint32_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.28 msaitoh volatile uint32_t dot3StatsAlignmentErrors; /* 0 */ 448 1.28 msaitoh volatile uint32_t dot3StatsFCSErrors; /* 1 */ 449 1.28 msaitoh volatile uint32_t dot3StatsSingleCollisionFrames; /* 2 */ 450 1.28 msaitoh volatile uint32_t dot3StatsMultipleCollisionFrames; /* 3 */ 451 1.28 msaitoh volatile uint32_t dot3StatsSQETestErrors; /* 4 */ 452 1.28 msaitoh volatile uint32_t dot3StatsDeferredTransmissions; /* 5 */ 453 1.28 msaitoh volatile uint32_t dot3StatsLateCollisions; /* 6 */ 454 1.28 msaitoh volatile uint32_t dot3StatsExcessiveCollisions; /* 7 */ 455 1.28 msaitoh volatile uint32_t dot3StatsInternalMacTransmitErrors; /* 8 */ 456 1.28 msaitoh volatile uint32_t dot3StatsCarrierSenseErrors; /* 9 */ 457 1.28 msaitoh volatile uint32_t dot3StatsFrameTooLongs; /* 10 */ 458 1.28 msaitoh volatile uint32_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.28 msaitoh volatile uint32_t ifIndex; /* 12 */ 463 1.28 msaitoh volatile uint32_t ifType; /* 13 */ 464 1.28 msaitoh volatile uint32_t ifMtu; /* 14 */ 465 1.28 msaitoh volatile uint32_t ifSpeed; /* 15 */ 466 1.28 msaitoh volatile uint32_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.30 msaitoh volatile uint32_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.30 msaitoh volatile uint32_t ifLastChange; /* 18 */ 477 1.30 msaitoh volatile uint32_t ifInDiscards; /* 19 */ 478 1.28 msaitoh volatile uint32_t ifInErrors; /* 20 */ 479 1.28 msaitoh volatile uint32_t ifInUnknownProtos; /* 21 */ 480 1.28 msaitoh volatile uint32_t ifOutDiscards; /* 22 */ 481 1.28 msaitoh volatile uint32_t ifOutErrors; /* 23 */ 482 1.28 msaitoh volatile uint32_t ifOutQLen; /* deprecated */ /* 24 */ 483 1.28 msaitoh volatile uint8_t ifPhysAddress[8]; /* 8 bytes */ /* 25 - 26 */ 484 1.28 msaitoh volatile uint8_t ifDescr[32]; /* 27 - 34 */ 485 1.30 msaitoh uint32_t alignIt; /* align to 64 bit for uint64_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.30 msaitoh volatile uint64_t ifHCInOctets; /* 36 - 37 */ 491 1.30 msaitoh volatile uint64_t ifHCInUcastPkts; /* 38 - 39 */ 492 1.30 msaitoh volatile uint64_t ifHCInMulticastPkts; /* 40 - 41 */ 493 1.30 msaitoh volatile uint64_t ifHCInBroadcastPkts; /* 42 - 43 */ 494 1.30 msaitoh volatile uint64_t ifHCOutOctets; /* 44 - 45 */ 495 1.30 msaitoh volatile uint64_t ifHCOutUcastPkts; /* 46 - 47 */ 496 1.30 msaitoh volatile uint64_t ifHCOutMulticastPkts; /* 48 - 49 */ 497 1.30 msaitoh volatile uint64_t ifHCOutBroadcastPkts; /* 50 - 51 */ 498 1.28 msaitoh volatile uint32_t ifLinkUpDownTrapEnable; /* 52 */ 499 1.28 msaitoh volatile uint32_t ifHighSpeed; /* 53 */ 500 1.30 msaitoh volatile uint32_t ifPromiscuousMode; /* 54 */ 501 1.28 msaitoh volatile uint32_t ifConnectorPresent; /* follow link state 55 */ 502 1.1 drochner /* 503 1.1 drochner * Host Commands 504 1.1 drochner */ 505 1.28 msaitoh volatile uint32_t nicCmdsHostState; /* 56 */ 506 1.28 msaitoh volatile uint32_t nicCmdsFDRFiltering; /* 57 */ 507 1.28 msaitoh volatile uint32_t nicCmdsSetRecvProdIndex; /* 58 */ 508 1.28 msaitoh volatile uint32_t nicCmdsUpdateGencommStats; /* 59 */ 509 1.28 msaitoh volatile uint32_t nicCmdsResetJumboRing; /* 60 */ 510 1.28 msaitoh volatile uint32_t nicCmdsAddMCastAddr; /* 61 */ 511 1.28 msaitoh volatile uint32_t nicCmdsDelMCastAddr; /* 62 */ 512 1.28 msaitoh volatile uint32_t nicCmdsSetPromiscMode; /* 63 */ 513 1.30 msaitoh volatile uint32_t nicCmdsLinkNegotiate; /* 64 */ 514 1.28 msaitoh volatile uint32_t nicCmdsSetMACAddr; /* 65 */ 515 1.28 msaitoh volatile uint32_t nicCmdsClearProfile; /* 66 */ 516 1.28 msaitoh volatile uint32_t nicCmdsSetMulticastMode; /* 67 */ 517 1.28 msaitoh volatile uint32_t nicCmdsClearStats; /* 68 */ 518 1.30 msaitoh volatile uint32_t nicCmdsSetRecvJumboProdIndex; /* 69 */ 519 1.28 msaitoh volatile uint32_t nicCmdsSetRecvMiniProdIndex; /* 70 */ 520 1.28 msaitoh volatile uint32_t nicCmdsRefreshStats; /* 71 */ 521 1.28 msaitoh volatile uint32_t nicCmdsUnknown; /* 72 */ 522 1.1 drochner /* 523 1.1 drochner * NIC Events 524 1.1 drochner */ 525 1.28 msaitoh volatile uint32_t nicEventsNICFirmwareOperational; /* 73 */ 526 1.28 msaitoh volatile uint32_t nicEventsStatsUpdated; /* 74 */ 527 1.28 msaitoh volatile uint32_t nicEventsLinkStateChanged; /* 75 */ 528 1.28 msaitoh volatile uint32_t nicEventsError; /* 76 */ 529 1.28 msaitoh volatile uint32_t nicEventsMCastListUpdated; /* 77 */ 530 1.28 msaitoh volatile uint32_t nicEventsResetJumboRing; /* 78 */ 531 1.1 drochner /* 532 1.1 drochner * Ring manipulation 533 1.1 drochner */ 534 1.28 msaitoh volatile uint32_t nicRingSetSendProdIndex; /* 79 */ 535 1.28 msaitoh volatile uint32_t nicRingSetSendConsIndex; /* 80 */ 536 1.28 msaitoh volatile uint32_t nicRingSetRecvReturnProdIndex; /* 81 */ 537 1.1 drochner /* 538 1.1 drochner * Interrupts 539 1.1 drochner */ 540 1.28 msaitoh volatile uint32_t nicInterrupts; /* 82 */ 541 1.30 msaitoh volatile uint32_t nicAvoidedInterrupts; /* 83 */ 542 1.1 drochner /* 543 1.12 wiz * BD Coalescing Thresholds 544 1.1 drochner */ 545 1.30 msaitoh volatile uint32_t nicEventThresholdHit; /* 84 */ 546 1.28 msaitoh volatile uint32_t nicSendThresholdHit; /* 85 */ 547 1.28 msaitoh volatile uint32_t nicRecvThresholdHit; /* 86 */ 548 1.1 drochner /* 549 1.1 drochner * DMA Attentions 550 1.1 drochner */ 551 1.28 msaitoh volatile uint32_t nicDmaRdOverrun; /* 87 */ 552 1.28 msaitoh volatile uint32_t nicDmaRdUnderrun; /* 88 */ 553 1.28 msaitoh volatile uint32_t nicDmaWrOverrun; /* 89 */ 554 1.28 msaitoh volatile uint32_t nicDmaWrUnderrun; /* 90 */ 555 1.30 msaitoh volatile uint32_t nicDmaWrMasterAborts; /* 91 */ 556 1.30 msaitoh volatile uint32_t nicDmaRdMasterAborts; /* 92 */ 557 1.1 drochner /* 558 1.1 drochner * NIC Resources 559 1.1 drochner */ 560 1.28 msaitoh volatile uint32_t nicDmaWriteRingFull; /* 93 */ 561 1.28 msaitoh volatile uint32_t nicDmaReadRingFull; /* 94 */ 562 1.28 msaitoh volatile uint32_t nicEventRingFull; /* 95 */ 563 1.28 msaitoh volatile uint32_t nicEventProducerRingFull; /* 96 */ 564 1.28 msaitoh volatile uint32_t nicTxMacDescrRingFull; /* 97 */ 565 1.30 msaitoh volatile uint32_t nicOutOfTxBufSpaceFrameRetry; /* 98 */ 566 1.28 msaitoh volatile uint32_t nicNoMoreWrDMADescriptors; /* 99 */ 567 1.28 msaitoh volatile uint32_t nicNoMoreRxBDs; /* 100 */ 568 1.28 msaitoh volatile uint32_t nicNoSpaceInReturnRing; /* 101 */ 569 1.28 msaitoh volatile uint32_t nicSendBDs; /* current count 102 */ 570 1.28 msaitoh volatile uint32_t nicRecvBDs; /* current count 103 */ 571 1.28 msaitoh volatile uint32_t nicJumboRecvBDs; /* current count 104 */ 572 1.28 msaitoh volatile uint32_t nicMiniRecvBDs; /* current count 105 */ 573 1.28 msaitoh volatile uint32_t nicTotalRecvBDs; /* current count 106 */ 574 1.28 msaitoh volatile uint32_t nicTotalSendBDs; /* current count 107 */ 575 1.28 msaitoh volatile uint32_t nicJumboSpillOver; /* 108 */ 576 1.28 msaitoh volatile uint32_t nicSbusHangCleared; /* 109 */ 577 1.28 msaitoh volatile uint32_t nicEnqEventDelayed; /* 110 */ 578 1.1 drochner /* 579 1.1 drochner * Stats from MAC rx completion 580 1.1 drochner */ 581 1.28 msaitoh volatile uint32_t nicMacRxLateColls; /* 111 */ 582 1.28 msaitoh volatile uint32_t nicMacRxLinkLostDuringPkt; /* 112 */ 583 1.30 msaitoh volatile uint32_t nicMacRxPhyDecodeErr; /* 113 */ 584 1.28 msaitoh volatile uint32_t nicMacRxMacAbort; /* 114 */ 585 1.28 msaitoh volatile uint32_t nicMacRxTruncNoResources; /* 115 */ 586 1.1 drochner /* 587 1.1 drochner * Stats from the mac_stats area 588 1.1 drochner */ 589 1.28 msaitoh volatile uint32_t nicMacRxDropUla; /* 116 */ 590 1.28 msaitoh volatile uint32_t nicMacRxDropMcast; /* 117 */ 591 1.28 msaitoh volatile uint32_t nicMacRxFlowControl; /* 118 */ 592 1.28 msaitoh volatile uint32_t nicMacRxDropSpace; /* 119 */ 593 1.28 msaitoh volatile uint32_t nicMacRxColls; /* 120 */ 594 1.1 drochner /* 595 1.30 msaitoh * MAC RX Attentions 596 1.1 drochner */ 597 1.28 msaitoh volatile uint32_t nicMacRxTotalAttns; /* 121 */ 598 1.28 msaitoh volatile uint32_t nicMacRxLinkAttns; /* 122 */ 599 1.28 msaitoh volatile uint32_t nicMacRxSyncAttns; /* 123 */ 600 1.28 msaitoh volatile uint32_t nicMacRxConfigAttns; /* 124 */ 601 1.28 msaitoh volatile uint32_t nicMacReset; /* 125 */ 602 1.28 msaitoh volatile uint32_t nicMacRxBufDescrAttns; /* 126 */ 603 1.28 msaitoh volatile uint32_t nicMacRxBufAttns; /* 127 */ 604 1.28 msaitoh volatile uint32_t nicMacRxZeroFrameCleanup; /* 128 */ 605 1.28 msaitoh volatile uint32_t nicMacRxOneFrameCleanup; /* 129 */ 606 1.30 msaitoh volatile uint32_t nicMacRxMultipleFrameCleanup; /* 130 */ 607 1.30 msaitoh volatile uint32_t nicMacRxTimerCleanup; /* 131 */ 608 1.28 msaitoh volatile uint32_t nicMacRxDmaCleanup; /* 132 */ 609 1.1 drochner /* 610 1.1 drochner * Stats from the mac_stats area 611 1.1 drochner */ 612 1.28 msaitoh volatile uint32_t nicMacTxCollisionHistogram[15]; /* 133 */ 613 1.1 drochner /* 614 1.1 drochner * MAC TX Attentions 615 1.1 drochner */ 616 1.28 msaitoh volatile uint32_t nicMacTxTotalAttns; /* 134 */ 617 1.1 drochner /* 618 1.1 drochner * NIC Profile 619 1.1 drochner */ 620 1.28 msaitoh volatile uint32_t nicProfile[32]; /* 135 */ 621 1.1 drochner /* 622 1.1 drochner * Pat to 1024 bytes. 623 1.1 drochner */ 624 1.28 msaitoh uint32_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.28 msaitoh uint16_t ti_idx; 658 1.28 msaitoh uint16_t ti_len; 659 1.1 drochner #else 660 1.28 msaitoh uint16_t ti_len; 661 1.28 msaitoh uint16_t ti_idx; 662 1.1 drochner #endif 663 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 664 1.28 msaitoh uint16_t ti_type; 665 1.28 msaitoh uint16_t ti_flags; 666 1.1 drochner #else 667 1.28 msaitoh uint16_t ti_flags; 668 1.28 msaitoh uint16_t ti_type; 669 1.1 drochner #endif 670 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 671 1.28 msaitoh uint16_t ti_ip_cksum; 672 1.28 msaitoh uint16_t ti_tcp_udp_cksum; 673 1.1 drochner #else 674 1.28 msaitoh uint16_t ti_tcp_udp_cksum; 675 1.28 msaitoh uint16_t ti_ip_cksum; 676 1.1 drochner #endif 677 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 678 1.28 msaitoh uint16_t ti_error_flags; 679 1.28 msaitoh uint16_t ti_vlan_tag; 680 1.1 drochner #else 681 1.28 msaitoh uint16_t ti_vlan_tag; 682 1.28 msaitoh uint16_t ti_error_flags; 683 1.1 drochner #endif 684 1.28 msaitoh uint32_t ti_rsvd; 685 1.28 msaitoh uint32_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.28 msaitoh uint16_t ti_len1; 694 1.28 msaitoh uint16_t ti_len2; 695 1.1 drochner #else 696 1.28 msaitoh uint16_t ti_len2; 697 1.28 msaitoh uint16_t ti_len1; 698 1.1 drochner #endif 699 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 700 1.28 msaitoh uint16_t ti_len3; 701 1.28 msaitoh uint16_t ti_rsvd0; 702 1.1 drochner #else 703 1.28 msaitoh uint16_t ti_rsvd0; 704 1.28 msaitoh uint16_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.28 msaitoh uint16_t ti_idx; 709 1.28 msaitoh uint16_t ti_len0; 710 1.1 drochner #else 711 1.28 msaitoh uint16_t ti_len0; 712 1.28 msaitoh uint16_t ti_idx; 713 1.1 drochner #endif 714 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 715 1.28 msaitoh uint16_t ti_type; 716 1.28 msaitoh uint16_t ti_flags; 717 1.1 drochner #else 718 1.28 msaitoh uint16_t ti_flags; 719 1.28 msaitoh uint16_t ti_type; 720 1.1 drochner #endif 721 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 722 1.28 msaitoh uint16_t ti_ip_cksum; 723 1.28 msaitoh uint16_t ti_tcp_udp_cksum; 724 1.1 drochner #else 725 1.28 msaitoh uint16_t ti_tcp_udp_cksum; 726 1.28 msaitoh uint16_t ti_ip_cksum; 727 1.1 drochner #endif 728 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 729 1.28 msaitoh uint16_t ti_error_flags; 730 1.28 msaitoh uint16_t ti_vlan_tag; 731 1.1 drochner #else 732 1.28 msaitoh uint16_t ti_vlan_tag; 733 1.28 msaitoh uint16_t ti_error_flags; 734 1.1 drochner #endif 735 1.28 msaitoh uint32_t ti_rsvd1; 736 1.28 msaitoh uint32_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.28 msaitoh uint16_t ti_len; 746 1.28 msaitoh uint16_t ti_flags; 747 1.1 drochner #else 748 1.28 msaitoh uint16_t ti_flags; 749 1.28 msaitoh uint16_t ti_len; 750 1.1 drochner #endif 751 1.1 drochner #if BYTE_ORDER == BIG_ENDIAN 752 1.28 msaitoh uint16_t ti_rsvd; 753 1.28 msaitoh uint16_t ti_vlan_tag; 754 1.1 drochner #else 755 1.28 msaitoh uint16_t ti_vlan_tag; 756 1.28 msaitoh uint16_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.30 msaitoh * aligns 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 TI_PAGE_SIZE PAGE_SIZE 770 1.1 drochner 771 1.1 drochner /* 772 1.1 drochner * Buffer descriptor error flags. 773 1.1 drochner */ 774 1.1 drochner #define TI_BDERR_CRC 0x0001 775 1.1 drochner #define TI_BDERR_COLLDETECT 0x0002 776 1.1 drochner #define TI_BDERR_LINKLOST 0x0004 777 1.1 drochner #define TI_BDERR_DECODE 0x0008 778 1.1 drochner #define TI_BDERR_ODD_NIBBLES 0x0010 779 1.1 drochner #define TI_BDERR_MAC_ABRT 0x0020 780 1.1 drochner #define TI_BDERR_RUNT 0x0040 781 1.1 drochner #define TI_BDERR_TRUNC 0x0080 782 1.1 drochner #define TI_BDERR_GIANT 0x0100 783 1.1 drochner 784 1.1 drochner /* 785 1.1 drochner * Buffer descriptor flags. 786 1.1 drochner */ 787 1.1 drochner #define TI_BDFLAG_TCP_UDP_CKSUM 0x0001 788 1.1 drochner #define TI_BDFLAG_IP_CKSUM 0x0002 789 1.1 drochner #define TI_BDFLAG_END 0x0004 790 1.1 drochner #define TI_BDFLAG_MORE 0x0008 791 1.1 drochner #define TI_BDFLAG_JUMBO_RING 0x0010 792 1.1 drochner #define TI_BDFLAG_UCAST_PKT 0x0020 793 1.1 drochner #define TI_BDFLAG_MCAST_PKT 0x0040 794 1.1 drochner #define TI_BDFLAG_BCAST_PKT 0x0060 795 1.1 drochner #define TI_BDFLAG_IP_FRAG 0x0080 796 1.1 drochner #define TI_BDFLAG_IP_FRAG_END 0x0100 797 1.1 drochner #define TI_BDFLAG_VLAN_TAG 0x0200 798 1.1 drochner #define TI_BDFLAG_ERROR 0x0400 799 1.1 drochner #define TI_BDFLAG_COAL_NOW 0x0800 800 1.1 drochner #define TI_BDFLAG_MINI_RING 0x1000 801 1.1 drochner 802 1.1 drochner /* 803 1.1 drochner * Descriptor type flags. I think these only have meaning for 804 1.1 drochner * the Tigon 1. I had to extract them from the sample driver source 805 1.1 drochner * since they aren't in the manual. 806 1.1 drochner */ 807 1.1 drochner #define TI_BDTYPE_TYPE_NULL 0x0000 808 1.1 drochner #define TI_BDTYPE_SEND_BD 0x0001 809 1.1 drochner #define TI_BDTYPE_RECV_BD 0x0002 810 1.1 drochner #define TI_BDTYPE_RECV_JUMBO_BD 0x0003 811 1.1 drochner #define TI_BDTYPE_RECV_BD_LAST 0x0004 812 1.1 drochner #define TI_BDTYPE_SEND_DATA 0x0005 813 1.1 drochner #define TI_BDTYPE_SEND_DATA_LAST 0x0006 814 1.1 drochner #define TI_BDTYPE_RECV_DATA 0x0007 815 1.1 drochner #define TI_BDTYPE_RECV_DATA_LAST 0x000b 816 1.1 drochner #define TI_BDTYPE_EVENT_RUPT 0x000c 817 1.1 drochner #define TI_BDTYPE_EVENT_NO_RUPT 0x000d 818 1.1 drochner #define TI_BDTYPE_ODD_START 0x000e 819 1.1 drochner #define TI_BDTYPE_UPDATE_STATS 0x000f 820 1.1 drochner #define TI_BDTYPE_SEND_DUMMY_DMA 0x0010 821 1.1 drochner #define TI_BDTYPE_EVENT_PROD 0x0011 822 1.1 drochner #define TI_BDTYPE_TX_CONS 0x0012 823 1.1 drochner #define TI_BDTYPE_RX_PROD 0x0013 824 1.1 drochner #define TI_BDTYPE_REFRESH_STATS 0x0014 825 1.1 drochner #define TI_BDTYPE_SEND_DATA_LAST_VLAN 0x0015 826 1.1 drochner #define TI_BDTYPE_SEND_DATA_COAL 0x0016 827 1.1 drochner #define TI_BDTYPE_SEND_DATA_LAST_COAL 0x0017 828 1.1 drochner #define TI_BDTYPE_SEND_DATA_LAST_VLAN_COAL 0x0018 829 1.1 drochner #define TI_BDTYPE_TX_CONS_NO_INTR 0x0019 830 1.1 drochner 831 1.1 drochner /* 832 1.1 drochner * Tigon command structure. 833 1.1 drochner */ 834 1.1 drochner struct ti_cmd_desc { 835 1.28 msaitoh uint32_t ti_cmdx; 836 1.1 drochner }; 837 1.1 drochner 838 1.19 tnn #define TI_CMD_CMD(cmd) (((((cmd)->ti_cmdx)) >> 24) & 0xff) 839 1.19 tnn #define TI_CMD_CODE(cmd) (((((cmd)->ti_cmdx)) >> 12) & 0xfff) 840 1.19 tnn #define TI_CMD_IDX(cmd) ((((cmd)->ti_cmdx)) & 0xfff) 841 1.19 tnn 842 1.1 drochner #define TI_CMD_HOST_STATE 0x01 843 1.1 drochner #define TI_CMD_CODE_STACK_UP 0x01 844 1.1 drochner #define TI_CMD_CODE_STACK_DOWN 0x02 845 1.1 drochner 846 1.1 drochner /* 847 1.1 drochner * This command enables software address filtering. It's a workaround 848 1.1 drochner * for a bug in the Tigon 1 and not implemented for the Tigon 2. 849 1.1 drochner */ 850 1.1 drochner #define TI_CMD_FDR_FILTERING 0x02 851 1.1 drochner #define TI_CMD_CODE_FILT_ENB 0x01 852 1.1 drochner #define TI_CMD_CODE_FILT_DIS 0x02 853 1.1 drochner 854 1.1 drochner #define TI_CMD_SET_RX_PROD_IDX 0x03 /* obsolete */ 855 1.1 drochner #define TI_CMD_UPDATE_GENCOM 0x04 856 1.1 drochner #define TI_CMD_RESET_JUMBO_RING 0x05 857 1.1 drochner #define TI_CMD_SET_PARTIAL_RX_CNT 0x06 858 1.1 drochner #define TI_CMD_ADD_MCAST_ADDR 0x08 /* obsolete */ 859 1.1 drochner #define TI_CMD_DEL_MCAST_ADDR 0x09 /* obsolete */ 860 1.1 drochner 861 1.1 drochner #define TI_CMD_SET_PROMISC_MODE 0x0A 862 1.1 drochner #define TI_CMD_CODE_PROMISC_ENB 0x01 863 1.1 drochner #define TI_CMD_CODE_PROMISC_DIS 0x02 864 1.1 drochner 865 1.1 drochner #define TI_CMD_LINK_NEGOTIATION 0x0B 866 1.1 drochner #define TI_CMD_CODE_NEGOTIATE_BOTH 0x00 867 1.1 drochner #define TI_CMD_CODE_NEGOTIATE_GIGABIT 0x01 868 1.1 drochner #define TI_CMD_CODE_NEGOTIATE_10_100 0x02 869 1.1 drochner 870 1.1 drochner #define TI_CMD_SET_MAC_ADDR 0x0C 871 1.1 drochner #define TI_CMD_CLR_PROFILE 0x0D 872 1.1 drochner 873 1.1 drochner #define TI_CMD_SET_ALLMULTI 0x0E 874 1.1 drochner #define TI_CMD_CODE_ALLMULTI_ENB 0x01 875 1.1 drochner #define TI_CMD_CODE_ALLMULTI_DIS 0x02 876 1.1 drochner 877 1.1 drochner #define TI_CMD_CLR_STATS 0x0F 878 1.1 drochner #define TI_CMD_SET_RX_JUMBO_PROD_IDX 0x10 /* obsolete */ 879 1.1 drochner #define TI_CMD_RFRSH_STATS 0x11 880 1.1 drochner 881 1.1 drochner #define TI_CMD_EXT_ADD_MCAST 0x12 882 1.1 drochner #define TI_CMD_EXT_DEL_MCAST 0x13 883 1.1 drochner 884 1.1 drochner /* 885 1.1 drochner * Utility macros to make issuing commands a little simpler. Assumes 886 1.1 drochner * that 'sc' and 'cmd' are in local scope. 887 1.1 drochner */ 888 1.19 tnn #define TI_DO_CMD(x, y, z) do { \ 889 1.19 tnn cmd.ti_cmdx = (((x) << 24) | ((y) << 12) | ((z))); \ 890 1.19 tnn ti_cmd(sc, &cmd); \ 891 1.19 tnn } while(0) 892 1.19 tnn 893 1.19 tnn #define TI_DO_CMD_EXT(x, y, z, v, w) do { \ 894 1.19 tnn cmd.ti_cmdx = (((x) << 24) | ((y) << 12) | ((z))); \ 895 1.19 tnn ti_cmd_ext(sc, &cmd, (v), (w)); \ 896 1.19 tnn } while(0) 897 1.1 drochner 898 1.1 drochner /* 899 1.1 drochner * Other utility macros. 900 1.1 drochner */ 901 1.19 tnn #define TI_INC(x, y) do { (x) = ((x) + 1) % (y); } while(0) 902 1.1 drochner 903 1.19 tnn #define TI_UPDATE_JUMBOPROD(x, y) do { \ 904 1.19 tnn if ((x)->ti_hwrev == TI_HWREV_TIGON) \ 905 1.30 msaitoh TI_DO_CMD(TI_CMD_SET_RX_JUMBO_PROD_IDX, 0, y); \ 906 1.19 tnn else \ 907 1.1 drochner CSR_WRITE_4(x, TI_MB_JUMBORXPROD_IDX, y); \ 908 1.19 tnn } while(0) 909 1.1 drochner 910 1.1 drochner #define TI_UPDATE_MINIPROD(x, y) \ 911 1.19 tnn CSR_WRITE_4(x, TI_MB_MINIRXPROD_IDX, y) 912 1.1 drochner 913 1.19 tnn #define TI_UPDATE_STDPROD(x, y) do { \ 914 1.19 tnn if ((x)->ti_hwrev == TI_HWREV_TIGON) \ 915 1.1 drochner TI_DO_CMD(TI_CMD_SET_RX_PROD_IDX, 0, y); \ 916 1.19 tnn else \ 917 1.1 drochner CSR_WRITE_4(x, TI_MB_STDRXPROD_IDX, y); \ 918 1.19 tnn } while(0) 919 1.1 drochner 920 1.1 drochner 921 1.1 drochner /* 922 1.1 drochner * Tigon event structure. 923 1.1 drochner */ 924 1.1 drochner struct ti_event_desc { 925 1.28 msaitoh uint32_t ti_eventx; 926 1.28 msaitoh uint32_t ti_rsvd; 927 1.1 drochner }; 928 1.1 drochner 929 1.19 tnn #define TI_EVENT_EVENT(e) (((((e)->ti_eventx)) >> 24) & 0xff) 930 1.19 tnn #define TI_EVENT_CODE(e) (((((e)->ti_eventx)) >> 12) & 0xfff) 931 1.19 tnn #define TI_EVENT_IDX(e) (((((e)->ti_eventx))) & 0xfff) 932 1.19 tnn 933 1.1 drochner /* 934 1.1 drochner * Tigon events. 935 1.1 drochner */ 936 1.1 drochner #define TI_EV_FIRMWARE_UP 0x01 937 1.1 drochner #define TI_EV_STATS_UPDATED 0x04 938 1.1 drochner 939 1.1 drochner #define TI_EV_LINKSTAT_CHANGED 0x06 940 1.1 drochner #define TI_EV_CODE_GIG_LINK_UP 0x01 941 1.1 drochner #define TI_EV_CODE_LINK_DOWN 0x02 942 1.1 drochner #define TI_EV_CODE_LINK_UP 0x03 943 1.1 drochner 944 1.1 drochner #define TI_EV_ERROR 0x07 945 1.1 drochner #define TI_EV_CODE_ERR_INVAL_CMD 0x01 946 1.1 drochner #define TI_EV_CODE_ERR_UNIMP_CMD 0x02 947 1.1 drochner #define TI_EV_CODE_ERR_BADCFG 0x03 948 1.1 drochner 949 1.1 drochner #define TI_EV_MCAST_UPDATED 0x08 950 1.1 drochner #define TI_EV_CODE_MCAST_ADD 0x01 951 1.1 drochner #define TI_EV_CODE_MCAST_DEL 0x02 952 1.1 drochner 953 1.1 drochner #define TI_EV_RESET_JUMBO_RING 0x09 954 1.1 drochner /* 955 1.1 drochner * Register access macros. The Tigon always uses memory mapped register 956 1.1 drochner * accesses and all registers must be accessed with 32 bit operations. 957 1.13 bouyer * The Tigon can operate in big-endian mode, so we always write to the 958 1.13 bouyer * registers in native byte order. We assume that all big-endian hosts 959 1.13 bouyer * with a PCI bus have __BUS_SPACE_HAS_STREAM_METHODS defined. 960 1.1 drochner */ 961 1.1 drochner 962 1.13 bouyer #ifdef __BUS_SPACE_HAS_STREAM_METHODS 963 1.13 bouyer #define CSR_WRITE_4(sc, reg, val) \ 964 1.19 tnn bus_space_write_stream_4((sc)->ti_btag, (sc)->ti_bhandle, reg, val) 965 1.13 bouyer 966 1.13 bouyer #define CSR_READ_4(sc, reg) \ 967 1.19 tnn bus_space_read_stream_4((sc)->ti_btag, (sc)->ti_bhandle, reg) 968 1.13 bouyer #else 969 1.1 drochner #define CSR_WRITE_4(sc, reg, val) \ 970 1.19 tnn bus_space_write_4((sc)->ti_btag, (sc)->ti_bhandle, reg, val) 971 1.1 drochner 972 1.1 drochner #define CSR_READ_4(sc, reg) \ 973 1.19 tnn bus_space_read_4((sc)->ti_btag, (sc)->ti_bhandle, reg) 974 1.13 bouyer #endif 975 1.1 drochner 976 1.1 drochner #define TI_SETBIT(sc, reg, x) \ 977 1.19 tnn CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) | (x))) 978 1.1 drochner #define TI_CLRBIT(sc, reg, x) \ 979 1.19 tnn CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) & ~(x))) 980 1.1 drochner 981 1.1 drochner /* 982 1.1 drochner * Memory management stuff. Note: the SSLOTS, MSLOTS and JSLOTS 983 1.1 drochner * values are tuneable. They control the actual amount of buffers 984 1.1 drochner * allocated for the standard, mini and jumbo receive rings. 985 1.1 drochner */ 986 1.1 drochner 987 1.14 he #ifndef TI_SSLOTS 988 1.14 he #define TI_SSLOTS 256 989 1.14 he #endif 990 1.14 he #ifndef TI_MSLOTS 991 1.14 he #define TI_MSLOTS 256 992 1.14 he #endif 993 1.14 he #ifndef TI_JSLOTS 994 1.14 he #define TI_JSLOTS 384 995 1.14 he #endif 996 1.1 drochner #define TI_RSLOTS 128 997 1.1 drochner 998 1.30 msaitoh #define TI_JRAWLEN (ETHER_MAX_LEN_JUMBO + ETHER_ALIGN + sizeof(uint64_t)) 999 1.30 msaitoh #define TI_JLEN (TI_JRAWLEN + (sizeof(uint64_t) - \ 1000 1.30 msaitoh (TI_JRAWLEN % sizeof(uint64_t)))) 1001 1.2 thorpej #define TI_JPAGESZ PAGE_SIZE 1002 1.1 drochner #define TI_RESID (TI_JPAGESZ - (TI_JLEN * TI_JSLOTS) % TI_JPAGESZ) 1003 1.1 drochner #define TI_JMEM ((TI_JLEN * TI_JSLOTS) + TI_RESID) 1004 1.1 drochner 1005 1.1 drochner /* 1006 1.1 drochner * Ring structures. Most of these reside in host memory and we tell 1007 1.1 drochner * the NIC where they are via the ring control blocks. The exceptions 1008 1.1 drochner * are the tx and command rings, which live in NIC memory and which 1009 1.1 drochner * we access via the shared memory window. 1010 1.1 drochner */ 1011 1.1 drochner struct ti_ring_data { 1012 1.1 drochner struct ti_rx_desc ti_rx_std_ring[TI_STD_RX_RING_CNT]; 1013 1.1 drochner struct ti_rx_desc ti_rx_jumbo_ring[TI_JUMBO_RX_RING_CNT]; 1014 1.1 drochner struct ti_rx_desc ti_rx_mini_ring[TI_MINI_RX_RING_CNT]; 1015 1.1 drochner struct ti_rx_desc ti_rx_return_ring[TI_RETURN_RING_CNT]; 1016 1.1 drochner struct ti_event_desc ti_event_ring[TI_EVENT_RING_CNT]; 1017 1.1 drochner struct ti_tx_desc ti_tx_ring[TI_TX_RING_CNT]; 1018 1.1 drochner /* 1019 1.1 drochner * Make sure producer structures are aligned on 32-byte cache 1020 1.1 drochner * line boundaries. 1021 1.1 drochner */ 1022 1.1 drochner struct ti_producer ti_ev_prodidx_r; 1023 1.28 msaitoh uint32_t ti_pad0[6]; 1024 1.1 drochner struct ti_producer ti_return_prodidx_r; 1025 1.28 msaitoh uint32_t ti_pad1[6]; 1026 1.1 drochner struct ti_producer ti_tx_considx_r; 1027 1.28 msaitoh uint32_t ti_pad2[6]; 1028 1.1 drochner struct ti_gib ti_info; 1029 1.1 drochner }; 1030 1.1 drochner 1031 1.9 thorpej #define TI_CDOFF(x) offsetof(struct ti_ring_data, x) 1032 1.9 thorpej #define TI_CDRXSTDOFF(x) TI_CDOFF(ti_rx_std_ring[(x)]) 1033 1.9 thorpej #define TI_CDRXJUMBOOFF(x) TI_CDOFF(ti_rx_jumbo_ring[(x)]) 1034 1.9 thorpej #define TI_CDRXMINIOFF(x) TI_CDOFF(ti_rx_mini_ring[(x)]) 1035 1.9 thorpej #define TI_CDRXRTNOFF(x) TI_CDOFF(ti_rx_return_ring[(x)]) 1036 1.9 thorpej #define TI_CDEVENTOFF(x) TI_CDOFF(ti_event_ring[(x)]) 1037 1.9 thorpej #define TI_CDTXOFF(x) TI_CDOFF(ti_tx_ring[(x)]) 1038 1.9 thorpej #define TI_CDEVPRODOFF TI_CDOFF(ti_ev_prodidx_r) 1039 1.9 thorpej #define TI_CDRTNPRODOFF TI_CDOFF(ti_return_prodidx_r) 1040 1.9 thorpej #define TI_CDTXCONSOFF TI_CDOFF(ti_tx_considx_r) 1041 1.9 thorpej #define TI_CDGIBOFF TI_CDOFF(ti_info) 1042 1.9 thorpej #define TI_CDSTATSOFF TI_CDOFF(ti_info.ti_stats) 1043 1.9 thorpej 1044 1.1 drochner /* 1045 1.1 drochner * Mbuf pointers. We need these to keep track of the virtual addresses 1046 1.1 drochner * of our mbuf chains since we can only convert from physical to virtual, 1047 1.1 drochner * not the other way around. 1048 1.1 drochner */ 1049 1.1 drochner struct ti_chain_data { 1050 1.1 drochner struct mbuf *ti_tx_chain[TI_TX_RING_CNT]; 1051 1.1 drochner struct mbuf *ti_rx_std_chain[TI_STD_RX_RING_CNT]; 1052 1.1 drochner struct mbuf *ti_rx_jumbo_chain[TI_JUMBO_RX_RING_CNT]; 1053 1.1 drochner struct mbuf *ti_rx_mini_chain[TI_MINI_RX_RING_CNT]; 1054 1.1 drochner /* Stick the jumbo mem management stuff here too. */ 1055 1.18 christos void * ti_jslots[TI_JSLOTS]; 1056 1.1 drochner void *ti_jumbo_buf; 1057 1.1 drochner }; 1058 1.1 drochner 1059 1.1 drochner struct ti_type { 1060 1.28 msaitoh uint16_t ti_vid; 1061 1.28 msaitoh uint16_t ti_did; 1062 1.16 christos const char *ti_name; 1063 1.1 drochner }; 1064 1.1 drochner 1065 1.1 drochner #define TI_HWREV_TIGON 0x01 1066 1.1 drochner #define TI_HWREV_TIGON_II 0x02 1067 1.1 drochner #define TI_TIMEOUT 1000 1068 1.1 drochner #define TI_TXCONS_UNSET 0xFFFF /* impossible value */ 1069 1.1 drochner 1070 1.1 drochner struct ti_mc_entry { 1071 1.1 drochner struct ether_addr mc_addr; 1072 1.1 drochner SIMPLEQ_ENTRY(ti_mc_entry) mc_entries; 1073 1.1 drochner }; 1074 1.1 drochner 1075 1.1 drochner struct ti_jpool_entry { 1076 1.1 drochner int slot; 1077 1.1 drochner SIMPLEQ_ENTRY(ti_jpool_entry) jpool_entries; 1078 1.1 drochner }; 1079 1.1 drochner 1080 1.1 drochner struct txdmamap_pool_entry { 1081 1.1 drochner bus_dmamap_t dmamap; 1082 1.1 drochner SIMPLEQ_ENTRY(txdmamap_pool_entry) link; 1083 1.1 drochner }; 1084 1.1 drochner 1085 1.1 drochner struct ti_softc { 1086 1.20 chs device_t sc_dev; 1087 1.1 drochner struct ethercom ethercom; /* interface info */ 1088 1.1 drochner bus_space_handle_t ti_bhandle; 1089 1.1 drochner char *ti_vhandle; 1090 1.1 drochner bus_space_tag_t ti_btag; 1091 1.1 drochner void *ti_intrhand; 1092 1.7 thorpej 1093 1.1 drochner struct ifmedia ifmedia; /* media info */ 1094 1.7 thorpej 1095 1.28 msaitoh uint8_t ti_hwrev; /* Tigon rev (1 or 2) */ 1096 1.28 msaitoh uint8_t ti_copper; /* 1000baseT card */ 1097 1.28 msaitoh uint8_t ti_linkstat; /* Link state */ 1098 1.1 drochner struct ti_ring_data *ti_rdata; /* rings */ 1099 1.1 drochner #define ti_ev_prodidx ti_rdata->ti_ev_prodidx_r 1100 1.1 drochner #define ti_return_prodidx ti_rdata->ti_return_prodidx_r 1101 1.1 drochner #define ti_tx_considx ti_rdata->ti_tx_considx_r 1102 1.7 thorpej 1103 1.7 thorpej struct ti_tx_desc *ti_tx_ring_nic;/* pointer to shared mem */ 1104 1.7 thorpej 1105 1.7 thorpej struct ti_chain_data ti_cdata; /* mbufs */ 1106 1.7 thorpej 1107 1.23 thorpej uint64_t ti_if_collisions; 1108 1.23 thorpej 1109 1.7 thorpej /* 1110 1.7 thorpej * Function pointers to deal with Tigon 1 vs. Tigon 2 differences. 1111 1.7 thorpej */ 1112 1.7 thorpej int (*sc_tx_encap)(struct ti_softc *, 1113 1.7 thorpej struct mbuf *, uint32_t *); 1114 1.8 thorpej void (*sc_tx_eof)(struct ti_softc *); 1115 1.7 thorpej 1116 1.28 msaitoh uint16_t ti_tx_saved_considx; 1117 1.28 msaitoh uint16_t ti_rx_saved_considx; 1118 1.28 msaitoh uint16_t ti_ev_saved_considx; 1119 1.28 msaitoh uint16_t ti_cmd_saved_prodidx; 1120 1.28 msaitoh uint16_t ti_std; /* current std ring head */ 1121 1.28 msaitoh uint16_t ti_mini; /* current mini ring head */ 1122 1.32 andvar uint16_t ti_jumbo; /* current jumbo ring head */ 1123 1.1 drochner SIMPLEQ_HEAD(, ti_mc_entry) ti_mc_listhead; 1124 1.1 drochner SIMPLEQ_HEAD(, ti_jpool_entry) ti_jfree_listhead; 1125 1.1 drochner SIMPLEQ_HEAD(, ti_jpool_entry) ti_jinuse_listhead; 1126 1.28 msaitoh uint32_t ti_stat_ticks; 1127 1.28 msaitoh uint32_t ti_rx_coal_ticks; 1128 1.28 msaitoh uint32_t ti_tx_coal_ticks; 1129 1.28 msaitoh uint32_t ti_rx_max_coal_bds; 1130 1.28 msaitoh uint32_t ti_tx_max_coal_bds; 1131 1.28 msaitoh uint32_t ti_tx_buf_ratio; 1132 1.22 msaitoh u_short ti_if_flags; 1133 1.1 drochner int ti_txcnt; 1134 1.1 drochner void *sc_ih; 1135 1.1 drochner bus_dma_tag_t sc_dmat; 1136 1.1 drochner bus_dmamap_t info_dmamap; /* holds ti_rdata */ 1137 1.28 msaitoh uint32_t info_dmaaddr; /* XXX 64-bit PCI addresses? */ 1138 1.1 drochner bus_dmamap_t jumbo_dmamap; 1139 1.28 msaitoh uint32_t jumbo_dmaaddr; /* XXX 64-bit PCI addresses? */ 1140 1.1 drochner bus_dmamap_t mini_dmamap[TI_MINI_RX_RING_CNT]; 1141 1.1 drochner bus_dmamap_t std_dmamap[TI_STD_RX_RING_CNT]; 1142 1.1 drochner SIMPLEQ_HEAD(, txdmamap_pool_entry) txdma_list; 1143 1.1 drochner struct txdmamap_pool_entry *txdma[TI_TX_RING_CNT]; 1144 1.1 drochner }; 1145 1.9 thorpej 1146 1.9 thorpej #define TI_CDRXSTDADDR(sc, x) ((sc)->info_dmaaddr + TI_CDRXSTDOFF((x))) 1147 1.9 thorpej #define TI_CDRXJUMBOADDR(sc, x) ((sc)->info_dmaaddr + TI_CDRXJUMBOOFF((x))) 1148 1.9 thorpej #define TI_CDRXMINIADDR(sc, x) ((sc)->info_dmaaddr + TI_CDRXMINIOFF((x))) 1149 1.9 thorpej #define TI_CDRXRTNADDR(sc, x) ((sc)->info_dmaaddr + TI_CDRXRTNOFF((x))) 1150 1.9 thorpej #define TI_CDEVENTADDR(sc, x) ((sc)->info_dmaaddr + TI_CDEVENTOFF((x))) 1151 1.9 thorpej #define TI_CDTXADDR(sc, x) ((sc)->info_dmaaddr + TI_CDTXOFF((x))) 1152 1.9 thorpej #define TI_CDEVPRODADDR(sc) ((sc)->info_dmaaddr + TI_CDEVPRODOFF) 1153 1.9 thorpej #define TI_CDRTNPRODADDR(sc) ((sc)->info_dmaaddr + TI_CDRTNPRODOFF) 1154 1.9 thorpej #define TI_CDTXCONSADDR(sc) ((sc)->info_dmaaddr + TI_CDTXCONSOFF) 1155 1.9 thorpej #define TI_CDGIBADDR(sc) ((sc)->info_dmaaddr + TI_CDGIBOFF) 1156 1.9 thorpej #define TI_CDSTATSADDR(sc) ((sc)->info_dmaaddr + TI_CDSTATSOFF) 1157 1.10 thorpej 1158 1.10 thorpej #define TI_CDRXSTDSYNC(sc, x, ops) \ 1159 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1160 1.10 thorpej TI_CDRXSTDOFF((x)), sizeof(struct ti_rx_desc), (ops)) 1161 1.10 thorpej 1162 1.10 thorpej #define TI_CDRXJUMBOSYNC(sc, x, ops) \ 1163 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1164 1.10 thorpej TI_CDRXJUMBOOFF((x)), sizeof(struct ti_rx_desc), (ops)) 1165 1.10 thorpej 1166 1.10 thorpej #define TI_CDRXMINISYNC(sc, x, ops) \ 1167 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1168 1.10 thorpej TI_CDRXMINIOFF((x)), sizeof(struct ti_rx_desc), (ops)) 1169 1.10 thorpej 1170 1.10 thorpej #define TI_CDRXRTNSYNC(sc, x, ops) \ 1171 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1172 1.10 thorpej TI_CDRXRTNOFF((x)), sizeof(struct ti_rx_desc), (ops)) 1173 1.10 thorpej 1174 1.10 thorpej #define TI_CDEVENTSYNC(sc, x, ops) \ 1175 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1176 1.10 thorpej TI_CDEVENTOFF((x)), sizeof(struct ti_event_desc), (ops)) 1177 1.10 thorpej 1178 1.10 thorpej #define TI_CDTXSYNC(sc, x, n, ops) \ 1179 1.10 thorpej do { \ 1180 1.10 thorpej int __x, __n; \ 1181 1.10 thorpej \ 1182 1.10 thorpej __x = (x); \ 1183 1.10 thorpej __n = (n); \ 1184 1.10 thorpej \ 1185 1.10 thorpej /* If it will wrap around, sync to the end of the ring. */ \ 1186 1.10 thorpej if ((__x + __n) > TI_TX_RING_CNT) { \ 1187 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1188 1.10 thorpej TI_CDTXOFF(__x), sizeof(struct ti_tx_desc) * \ 1189 1.10 thorpej (TI_TX_RING_CNT - __x), (ops)); \ 1190 1.10 thorpej __n -= (TI_TX_RING_CNT - __x); \ 1191 1.10 thorpej __x = 0; \ 1192 1.10 thorpej } \ 1193 1.10 thorpej \ 1194 1.10 thorpej /* Now sync whatever is left. */ \ 1195 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1196 1.10 thorpej TI_CDTXOFF(__x), sizeof(struct ti_tx_desc) * (__n), (ops)); \ 1197 1.10 thorpej } while (/*CONSTCOND*/0) 1198 1.10 thorpej 1199 1.10 thorpej #define TI_CEVPRODSYNC(sc, ops) \ 1200 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1201 1.10 thorpej TI_CDEVPRODOFF, sizeof(struct ti_producer), (ops)) 1202 1.10 thorpej 1203 1.10 thorpej #define TI_CDRTNPRODSYNC(sc, ops) \ 1204 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1205 1.10 thorpej TI_CDRTNPRODOFF, sizeof(struct ti_producer), (ops)) 1206 1.10 thorpej 1207 1.10 thorpej #define TI_CDTXCONSSYNC(sc, ops) \ 1208 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1209 1.10 thorpej TI_CDTXCONSOFF, sizeof(struct ti_producer), (ops)) 1210 1.10 thorpej 1211 1.10 thorpej #define TI_CDGIBSYNC(sc, ops) \ 1212 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1213 1.10 thorpej TI_CDGIBOFF, sizeof(struct ti_gib), (ops)) 1214 1.10 thorpej 1215 1.10 thorpej #define TI_CDSTATSSYNC(sc, ops) \ 1216 1.10 thorpej bus_dmamap_sync((sc)->sc_dmat, (sc)->info_dmamap, \ 1217 1.10 thorpej TI_CDSTATSOFF, sizeof(struct ti_stats), (ops)) 1218 1.1 drochner 1219 1.1 drochner /* 1220 1.1 drochner * Microchip Technology 24Cxx EEPROM control bytes 1221 1.1 drochner */ 1222 1.1 drochner #define EEPROM_CTL_READ 0xA1 /* 0101 0001 */ 1223 1.1 drochner #define EEPROM_CTL_WRITE 0xA0 /* 0101 0000 */ 1224 1.1 drochner 1225 1.1 drochner /* 1226 1.1 drochner * Note that EEPROM_START leaves transmission enabled. 1227 1.1 drochner */ 1228 1.19 tnn #define EEPROM_START() do { \ 1229 1.1 drochner TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock pin high */\ 1230 1.1 drochner TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Set DATA bit to 1 */ \ 1231 1.1 drochner TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Enable xmit to write bit */\ 1232 1.1 drochner TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Pull DATA bit to 0 again */\ 1233 1.19 tnn TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock low again */ \ 1234 1.19 tnn } while(0) 1235 1.1 drochner 1236 1.1 drochner /* 1237 1.1 drochner * EEPROM_STOP ends access to the EEPROM and clears the ETXEN bit so 1238 1.1 drochner * that no further data can be written to the EEPROM I/O pin. 1239 1.1 drochner */ 1240 1.19 tnn #define EEPROM_STOP() do { \ 1241 1.1 drochner TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Disable xmit */ \ 1242 1.1 drochner TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Pull DATA to 0 */ \ 1243 1.1 drochner TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock high */ \ 1244 1.1 drochner TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Enable xmit */ \ 1245 1.1 drochner TI_SETBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_DOUT); /* Toggle DATA to 1 */ \ 1246 1.1 drochner TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_TXEN); /* Disable xmit. */ \ 1247 1.19 tnn TI_CLRBIT(sc, TI_MISC_LOCAL_CTL, TI_MLC_EE_CLK); /* Pull clock low again */ \ 1248 1.19 tnn } while(0) 1249