1 /* 2 * Copyright (c) 2001 Wind River Systems 3 * Copyright (c) 1997, 1998, 1999, 2001 4 * Bill Paul <wpaul@windriver.com>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Bill Paul. 17 * 4. Neither the name of the author nor the names of any co-contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * $FreeBSD: src/sys/dev/bge/if_bgereg.h,v 1.1.2.16 2004/09/23 20:11:18 ps Exp $ 34 */ 35 36 #ifndef _IF_BNXVAR_H_ 37 #define _IF_BNXVAR_H_ 38 39 /* 40 * Tigon general information block. This resides in host memory 41 * and contains the status counters, ring control blocks and 42 * producer pointers. 43 */ 44 45 struct bnx_gib { 46 struct bge_stats bnx_stats; 47 struct bge_rcb bnx_tx_rcb[16]; 48 struct bge_rcb bnx_std_rx_rcb; 49 struct bge_rcb bnx_jumbo_rx_rcb; 50 struct bge_rcb bnx_mini_rx_rcb; 51 struct bge_rcb bnx_return_rcb; 52 }; 53 54 #define BNX_MIN_FRAMELEN 60 55 #define BNX_MAX_FRAMELEN 1536 56 #define BNX_JUMBO_FRAMELEN 9018 57 #define BNX_JUMBO_MTU (BNX_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN) 58 59 #define BNX_TIMEOUT 5000 60 #define BNX_FIRMWARE_TIMEOUT 100000 61 #define BNX_TXCONS_UNSET 0xFFFF /* impossible value */ 62 63 /* 64 * Other utility macros. 65 */ 66 #define BNX_INC(x, y) (x) = ((x) + 1) % (y) 67 68 /* 69 * BAR0 MAC register access macros. The Tigon always uses memory mapped 70 * register accesses and all registers must be accessed with 32 bit 71 * operations. 72 */ 73 74 #define CSR_WRITE_4(sc, reg, val) \ 75 bus_space_write_4(sc->bnx_btag, sc->bnx_bhandle, reg, val) 76 77 #define CSR_READ_4(sc, reg) \ 78 bus_space_read_4(sc->bnx_btag, sc->bnx_bhandle, reg) 79 80 #define BNX_SETBIT(sc, reg, x) \ 81 CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) | x)) 82 83 #define BNX_CLRBIT(sc, reg, x) \ 84 CSR_WRITE_4(sc, reg, (CSR_READ_4(sc, reg) & ~x)) 85 86 /* BAR2 APE register access macros. */ 87 #define APE_WRITE_4(sc, reg, val) \ 88 bus_write_4(sc->bnx_res2, reg, val) 89 90 #define APE_READ_4(sc, reg) \ 91 bus_read_4(sc->bnx_res2, reg) 92 93 #define APE_SETBIT(sc, reg, x) \ 94 APE_WRITE_4(sc, reg, (APE_READ_4(sc, reg) | (x))) 95 #define APE_CLRBIT(sc, reg, x) \ 96 APE_WRITE_4(sc, reg, (APE_READ_4(sc, reg) & ~(x))) 97 98 #define BNX_MEMWIN_READ(sc, x, val) \ 99 do { \ 100 pci_write_config(sc->bnx_dev, BGE_PCI_MEMWIN_BASEADDR, \ 101 (0xFFFF0000 & x), 4); \ 102 val = CSR_READ_4(sc, BGE_MEMWIN_START + (x & 0xFFFF)); \ 103 } while(0) 104 105 #define BNX_MEMWIN_WRITE(sc, x, val) \ 106 do { \ 107 pci_write_config(sc->bnx_dev, BGE_PCI_MEMWIN_BASEADDR, \ 108 (0xFFFF0000 & x), 4); \ 109 CSR_WRITE_4(sc, BGE_MEMWIN_START + (x & 0xFFFF), val); \ 110 } while(0) 111 112 #define RCB_WRITE_4(sc, rcb, offset, val) \ 113 bus_space_write_4(sc->bnx_btag, sc->bnx_bhandle, \ 114 rcb + offsetof(struct bge_rcb, offset), val) 115 116 /* 117 * Memory management stuff. Note: the SSLOTS, MSLOTS and JSLOTS 118 * values are tuneable. They control the actual amount of buffers 119 * allocated for the standard, mini and jumbo receive rings. 120 */ 121 122 #define BNX_SSLOTS 256 123 #define BNX_MSLOTS 256 124 #define BNX_JSLOTS 384 125 126 #define BNX_JRAWLEN (BNX_JUMBO_FRAMELEN + ETHER_ALIGN) 127 #define BNX_JLEN (BNX_JRAWLEN + \ 128 (sizeof(uint64_t) - BNX_JRAWLEN % sizeof(uint64_t))) 129 #define BNX_JPAGESZ PAGE_SIZE 130 #define BNX_RESID (BNX_JPAGESZ - (BNX_JLEN * BNX_JSLOTS) % BNX_JPAGESZ) 131 #define BNX_JMEM ((BNX_JLEN * BNX_JSLOTS) + BNX_RESID) 132 133 struct bnx_softc; 134 struct bnx_tx_ring; 135 136 struct bnx_jslot { 137 struct bnx_softc *bnx_sc; 138 void *bnx_buf; 139 bus_addr_t bnx_paddr; 140 int bnx_inuse; 141 int bnx_slot; 142 SLIST_ENTRY(bnx_jslot) jslot_link; 143 }; 144 145 /* 146 * Ring structures. Most of these reside in host memory and we tell 147 * the NIC where they are via the ring control blocks. The exceptions 148 * are the tx and command rings, which live in NIC memory and which 149 * we access via the shared memory window. 150 */ 151 struct bnx_ring_data { 152 struct bge_rx_bd *bnx_rx_jumbo_ring; 153 bus_addr_t bnx_rx_jumbo_ring_paddr; 154 void *bnx_jumbo_buf; 155 struct bnx_gib bnx_info; 156 }; 157 158 struct bnx_rx_buf { 159 bus_dmamap_t bnx_rx_dmamap; 160 struct mbuf *bnx_rx_mbuf; 161 bus_addr_t bnx_rx_paddr; 162 int bnx_rx_len; 163 int bnx_rx_refilled; 164 } __cachealign; 165 166 struct bnx_rx_std_ring { 167 struct lwkt_serialize bnx_rx_std_serialize; 168 struct bnx_softc *bnx_sc; 169 170 uint16_t bnx_rx_std_stop; 171 uint16_t bnx_rx_std; /* current prod ring head */ 172 struct bge_rx_bd *bnx_rx_std_ring; 173 174 int bnx_rx_std_refill __cachealign; 175 int bnx_rx_std_used; 176 u_int bnx_rx_std_running; 177 struct thread *bnx_rx_std_ithread; 178 179 struct bnx_rx_buf bnx_rx_std_buf[BGE_STD_RX_RING_CNT]; 180 181 bus_dma_tag_t bnx_rx_mtag; /* RX mbuf DMA tag */ 182 183 bus_dma_tag_t bnx_rx_std_ring_tag; 184 bus_dmamap_t bnx_rx_std_ring_map; 185 bus_addr_t bnx_rx_std_ring_paddr; 186 } __cachealign; 187 188 struct bnx_rx_ret_ring { 189 struct lwkt_serialize bnx_rx_ret_serialize; 190 int bnx_rx_mbx; 191 uint32_t bnx_saved_status_tag; 192 volatile uint32_t *bnx_hw_status_tag; 193 int bnx_msix_mbx; 194 struct bnx_softc *bnx_sc; 195 struct bnx_rx_std_ring *bnx_std; 196 struct bnx_tx_ring *bnx_txr; 197 198 /* Shadow of bnx_rx_std_ring's bnx_rx_mtag */ 199 bus_dma_tag_t bnx_rx_mtag; 200 201 volatile uint16_t *bnx_rx_considx; 202 uint16_t bnx_rx_saved_considx; 203 uint16_t bnx_rx_cnt; 204 uint16_t bnx_rx_cntmax; 205 uint16_t bnx_rx_mask; 206 struct bge_rx_bd *bnx_rx_ret_ring; 207 bus_dmamap_t bnx_rx_tmpmap; 208 209 bus_dma_tag_t bnx_rx_ret_ring_tag; 210 bus_dmamap_t bnx_rx_ret_ring_map; 211 bus_addr_t bnx_rx_ret_ring_paddr; 212 213 u_long bnx_rx_pkt; 214 u_long bnx_rx_force_sched; 215 } __cachealign; 216 217 /* 218 * Mbuf pointers. We need these to keep track of the virtual addresses 219 * of our mbuf chains since we can only convert from physical to virtual, 220 * not the other way around. 221 */ 222 struct bnx_chain_data { 223 bus_dma_tag_t bnx_parent_tag; 224 bus_dma_tag_t bnx_rx_jumbo_ring_tag; 225 bus_dma_tag_t bnx_jumbo_tag; 226 bus_dmamap_t bnx_rx_jumbo_ring_map; 227 bus_dmamap_t bnx_jumbo_map; 228 struct bnx_rx_buf bnx_rx_jumbo_chain[BGE_JUMBO_RX_RING_CNT]; 229 /* Stick the jumbo mem management stuff here too. */ 230 struct bnx_jslot bnx_jslots[BNX_JSLOTS]; 231 }; 232 233 struct bnx_tx_buf { 234 bus_dmamap_t bnx_tx_dmamap; 235 struct mbuf *bnx_tx_mbuf; 236 }; 237 238 struct bnx_tx_ring { 239 struct lwkt_serialize bnx_tx_serialize; 240 volatile uint32_t *bnx_hw_status_tag; 241 uint32_t bnx_saved_status_tag; 242 struct bnx_softc *bnx_sc; 243 struct ifaltq_subque *bnx_ifsq; 244 volatile uint16_t *bnx_tx_considx; 245 uint16_t bnx_tx_flags; 246 #define BNX_TX_FLAG_SHORTDMA 0x0001 247 #define BNX_TX_FLAG_FORCE_DEFRAG 0x0002 248 uint16_t bnx_tx_saved_considx; 249 int bnx_tx_cnt; 250 uint32_t bnx_tx_prodidx; 251 int bnx_tx_wreg; 252 int bnx_tx_mbx; 253 struct ifsubq_watchdog bnx_tx_watchdog; 254 255 struct bge_tx_bd *bnx_tx_ring; 256 257 bus_dma_tag_t bnx_tx_mtag; /* TX mbuf DMA tag */ 258 struct bnx_tx_buf bnx_tx_buf[BGE_TX_RING_CNT]; 259 260 bus_dma_tag_t bnx_tx_ring_tag; 261 bus_dmamap_t bnx_tx_ring_map; 262 bus_addr_t bnx_tx_ring_paddr; 263 int bnx_tx_cpuid; 264 265 u_long bnx_tx_pkt; 266 } __cachealign; 267 268 struct bnx_intr_data { 269 struct bnx_softc *bnx_sc; 270 struct bnx_rx_ret_ring *bnx_ret; 271 struct bnx_tx_ring *bnx_txr; 272 273 int bnx_intr_cpuid; 274 struct lwkt_serialize *bnx_intr_serialize; 275 struct callout bnx_intr_timer; 276 void (*bnx_intr_check)(void *); 277 uint16_t bnx_rx_check_considx; 278 uint16_t bnx_tx_check_considx; 279 boolean_t bnx_intr_maylose; 280 281 void *bnx_intr_arg; 282 driver_intr_t *bnx_intr_func; 283 void *bnx_intr_hand; 284 struct resource *bnx_intr_res; 285 int bnx_intr_rid; 286 int bnx_intr_mbx; 287 const uint32_t *bnx_saved_status_tag; 288 289 const char *bnx_intr_desc; 290 char bnx_intr_desc0[64]; 291 292 bus_dma_tag_t bnx_status_tag; 293 bus_dmamap_t bnx_status_map; 294 struct bge_status_block *bnx_status_block; 295 bus_addr_t bnx_status_block_paddr; 296 } __cachealign; 297 298 #define BNX_RX_RING_MAX 4 299 #define BNX_TX_RING_MAX 4 300 #define BNX_INTR_MAX 5 301 302 struct bnx_softc { 303 struct arpcom arpcom; /* interface info */ 304 device_t bnx_dev; 305 device_t bnx_miibus; 306 bus_space_handle_t bnx_bhandle; 307 bus_space_tag_t bnx_btag; 308 struct resource *bnx_res; /* MAC mapped I/O */ 309 struct resource *bnx_res2; /* APE mapped I/O */ 310 struct ifmedia bnx_ifmedia; /* TBI media info */ 311 int bnx_pciecap; 312 uint32_t bnx_flags; /* BNX_FLAG_ */ 313 #define BNX_FLAG_TBI 0x00000001 314 #define BNX_FLAG_JUMBO 0x00000002 315 #define BNX_FLAG_APE 0x00000004 316 #define BNX_FLAG_5717_PLUS 0x00000008 317 #define BNX_FLAG_MII_SERDES 0x00000010 318 #define BNX_FLAG_CPMU 0x00000020 319 #define BNX_FLAG_57765_PLUS 0x00000040 320 #define BNX_FLAG_57765_FAMILY 0x00000080 321 #define BNX_FLAG_STATUSTAG_BUG 0x00000100 322 #define BNX_FLAG_TSO 0x00000200 323 #define BNX_FLAG_NO_EEPROM 0x10000000 324 #define BNX_FLAG_RXTX_BUNDLE 0x20000000 325 #define BNX_FLAG_STATUS_HASTAG 0x80000000 326 327 uint32_t bnx_mfw_flags; /* Management F/W flags */ 328 #define BNX_MFW_ON_RXCPU 0x00000001 329 #define BNX_MFW_ON_APE 0x00000002 330 #define BNX_MFW_TYPE_NCSI 0x00000004 331 #define BNX_MFW_TYPE_DASH 0x00000008 332 int bnx_phy_ape_lock; 333 int bnx_func_addr; 334 335 uint32_t bnx_chipid; 336 uint32_t bnx_asicrev; 337 uint32_t bnx_chiprev; 338 struct bnx_ring_data bnx_ldata; /* rings */ 339 struct bnx_chain_data bnx_cdata; /* mbufs */ 340 341 struct lwkt_serialize bnx_main_serialize; 342 volatile uint32_t *bnx_hw_status; 343 volatile uint32_t *bnx_hw_status_tag; 344 uint32_t bnx_saved_status_tag; 345 int bnx_link_evt; 346 u_long bnx_errors; 347 u_long bnx_norxbds; 348 349 int bnx_serialize_cnt; 350 struct lwkt_serialize **bnx_serialize; 351 352 int bnx_tx_ringcnt; 353 struct bnx_tx_ring *bnx_tx_ring; 354 int bnx_rx_retcnt; 355 struct bnx_rx_ret_ring *bnx_rx_ret_ring; 356 struct bnx_rx_std_ring bnx_rx_std_ring; 357 358 uint16_t bnx_jumbo; /* current jumo ring head */ 359 SLIST_HEAD(__bnx_jfreehead, bnx_jslot) bnx_jfree_listhead; 360 struct lwkt_serialize bnx_jslot_serializer; 361 uint32_t bnx_rx_coal_ticks; 362 uint32_t bnx_tx_coal_ticks; 363 uint32_t bnx_rx_coal_bds; 364 uint32_t bnx_rx_coal_bds_poll; 365 uint32_t bnx_tx_coal_bds; 366 uint32_t bnx_tx_coal_bds_poll; 367 uint32_t bnx_rx_coal_bds_int; 368 uint32_t bnx_tx_coal_bds_int; 369 uint32_t bnx_mi_mode; 370 int bnx_if_flags; 371 int bnx_link; 372 int bnx_tick_cpuid; 373 struct callout bnx_tick_timer; 374 375 int bnx_npoll_rxoff; 376 int bnx_npoll_txoff; 377 378 int bnx_msix_mem_rid; 379 struct resource *bnx_msix_mem_res; 380 int bnx_intr_type; 381 int bnx_intr_cnt; 382 struct bnx_intr_data bnx_intr_data[BNX_INTR_MAX]; 383 384 int bnx_phyno; 385 uint32_t bnx_coal_chg; 386 #define BNX_RX_COAL_TICKS_CHG 0x01 387 #define BNX_TX_COAL_TICKS_CHG 0x02 388 #define BNX_RX_COAL_BDS_CHG 0x04 389 #define BNX_TX_COAL_BDS_CHG 0x08 390 #define BNX_RX_COAL_BDS_INT_CHG 0x40 391 #define BNX_TX_COAL_BDS_INT_CHG 0x80 392 393 void (*bnx_link_upd)(struct bnx_softc *, uint32_t); 394 uint32_t bnx_link_chg; 395 396 int bnx_rss_debug; 397 #define BNX_TSO_NSTATS 45 398 u_long bnx_tsosegs[BNX_TSO_NSTATS]; 399 }; 400 401 #define BNX_NSEG_NEW 40 402 #define BNX_NSEG_SPARE 33 /* enough for 64K TSO segment */ 403 #define BNX_NSEG_RSVD 4 404 405 /* RX coalesce ticks, unit: us */ 406 #define BNX_RX_COAL_TICKS_MIN 0 407 #define BNX_RX_COAL_TICKS_DEF 160 408 #define BNX_RX_COAL_TICKS_MAX 1023 409 410 /* TX coalesce ticks, unit: us */ 411 #define BNX_TX_COAL_TICKS_MIN 0 412 #define BNX_TX_COAL_TICKS_DEF 1023 413 #define BNX_TX_COAL_TICKS_MAX 1023 414 415 /* RX coalesce BDs */ 416 #define BNX_RX_COAL_BDS_MIN 0 417 #define BNX_RX_COAL_BDS_DEF 0 418 #define BNX_RX_COAL_BDS_INT_DEF 80 419 #define BNX_RX_COAL_BDS_MAX 255 420 421 /* TX coalesce BDs */ 422 #define BNX_TX_COAL_BDS_MIN 0 423 #define BNX_TX_COAL_BDS_DEF 128 424 #define BNX_TX_COAL_BDS_POLL_DEF 64 425 #define BNX_TX_COAL_BDS_INT_DEF 64 426 #define BNX_TX_COAL_BDS_MAX 255 427 428 /* Number of segments sent before writing to TX related registers */ 429 #define BNX_TX_WREG_NSEGS 8 430 431 /* Return ring descriptor count */ 432 #define BNX_RETURN_RING_CNT 512 433 434 #define BNX_TX_RING_MAX 4 435 436 #define BNX_RSS_ENABLED(sc) ((sc)->bnx_rx_retcnt > 1) 437 438 #endif /* !_IF_BNXVAR_H_ */ 439