1 /*- 2 * Copyright (c) 2006 Broadcom Corporation 3 * David Christensen <davidch@broadcom.com>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 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. Neither the name of Broadcom Corporation nor the name of its contributors 15 * may be used to endorse or promote products derived from this software 16 * without specific prior written consent. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS' 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 28 * THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include <sys/cdefs.h> 32 __FBSDID("$FreeBSD$"); 33 34 /* 35 * The following controllers are supported by this driver: 36 * BCM5706C A2, A3 37 * BCM5708C B1 38 * 39 * The following controllers are not supported by this driver: 40 * (These are not "Production" versions of the controller.) 41 * 42 * BCM5706C A0, A1 43 * BCM5706S A0, A1, A2, A3 44 * BCM5708C A0, B0 45 * BCM5708S A0, B0, B1 46 */ 47 48 #include "opt_bce.h" 49 50 #include <dev/bce/if_bcereg.h> 51 #include <dev/bce/if_bcefw.h> 52 53 /****************************************************************************/ 54 /* BCE Driver Version */ 55 /****************************************************************************/ 56 char bce_driver_version[] = "v0.9.6"; 57 58 59 /****************************************************************************/ 60 /* BCE Debug Options */ 61 /****************************************************************************/ 62 #ifdef BCE_DEBUG 63 u32 bce_debug = BCE_WARN; 64 65 /* 0 = Never */ 66 /* 1 = 1 in 2,147,483,648 */ 67 /* 256 = 1 in 8,388,608 */ 68 /* 2048 = 1 in 1,048,576 */ 69 /* 65536 = 1 in 32,768 */ 70 /* 1048576 = 1 in 2,048 */ 71 /* 268435456 = 1 in 8 */ 72 /* 536870912 = 1 in 4 */ 73 /* 1073741824 = 1 in 2 */ 74 75 /* Controls how often the l2_fhdr frame error check will fail. */ 76 int bce_debug_l2fhdr_status_check = 0; 77 78 /* Controls how often the unexpected attention check will fail. */ 79 int bce_debug_unexpected_attention = 0; 80 81 /* Controls how often to simulate an mbuf allocation failure. */ 82 int bce_debug_mbuf_allocation_failure = 0; 83 84 /* Controls how often to simulate a DMA mapping failure. */ 85 int bce_debug_dma_map_addr_failure = 0; 86 87 /* Controls how often to simulate a bootcode failure. */ 88 int bce_debug_bootcode_running_failure = 0; 89 #endif 90 91 92 /****************************************************************************/ 93 /* PCI Device ID Table */ 94 /* */ 95 /* Used by bce_probe() to identify the devices supported by this driver. */ 96 /****************************************************************************/ 97 #define BCE_DEVDESC_MAX 64 98 99 static struct bce_type bce_devs[] = { 100 /* BCM5706C Controllers and OEM boards. */ 101 { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, HP_VENDORID, 0x3101, 102 "HP NC370T Multifunction Gigabit Server Adapter" }, 103 { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, HP_VENDORID, 0x3106, 104 "HP NC370i Multifunction Gigabit Server Adapter" }, 105 { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, PCI_ANY_ID, PCI_ANY_ID, 106 "Broadcom NetXtreme II BCM5706 1000Base-T" }, 107 108 /* BCM5706S controllers and OEM boards. */ 109 { BRCM_VENDORID, BRCM_DEVICEID_BCM5706S, HP_VENDORID, 0x3102, 110 "HP NC370F Multifunction Gigabit Server Adapter" }, 111 { BRCM_VENDORID, BRCM_DEVICEID_BCM5706S, PCI_ANY_ID, PCI_ANY_ID, 112 "Broadcom NetXtreme II BCM5706 1000Base-SX" }, 113 114 /* BCM5708C controllers and OEM boards. */ 115 { BRCM_VENDORID, BRCM_DEVICEID_BCM5708, PCI_ANY_ID, PCI_ANY_ID, 116 "Broadcom NetXtreme II BCM5708 1000Base-T" }, 117 118 /* BCM5708S controllers and OEM boards. */ 119 { BRCM_VENDORID, BRCM_DEVICEID_BCM5708, PCI_ANY_ID, PCI_ANY_ID, 120 "Broadcom NetXtreme II BCM5708 1000Base-T" }, 121 { 0, 0, 0, 0, NULL } 122 }; 123 124 125 /****************************************************************************/ 126 /* Supported Flash NVRAM device data. */ 127 /****************************************************************************/ 128 static struct flash_spec flash_table[] = 129 { 130 /* Slow EEPROM */ 131 {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400, 132 1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE, 133 SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE, 134 "EEPROM - slow"}, 135 /* Expansion entry 0001 */ 136 {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406, 137 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 138 SAIFUN_FLASH_BYTE_ADDR_MASK, 0, 139 "Entry 0001"}, 140 /* Saifun SA25F010 (non-buffered flash) */ 141 /* strap, cfg1, & write1 need updates */ 142 {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406, 143 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 144 SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2, 145 "Non-buffered flash (128kB)"}, 146 /* Saifun SA25F020 (non-buffered flash) */ 147 /* strap, cfg1, & write1 need updates */ 148 {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406, 149 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 150 SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4, 151 "Non-buffered flash (256kB)"}, 152 /* Expansion entry 0100 */ 153 {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406, 154 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 155 SAIFUN_FLASH_BYTE_ADDR_MASK, 0, 156 "Entry 0100"}, 157 /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */ 158 {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406, 159 0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE, 160 ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2, 161 "Entry 0101: ST M45PE10 (128kB non-bufferred)"}, 162 /* Entry 0110: ST M45PE20 (non-buffered flash)*/ 163 {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406, 164 0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE, 165 ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4, 166 "Entry 0110: ST M45PE20 (256kB non-bufferred)"}, 167 /* Saifun SA25F005 (non-buffered flash) */ 168 /* strap, cfg1, & write1 need updates */ 169 {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406, 170 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 171 SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE, 172 "Non-buffered flash (64kB)"}, 173 /* Fast EEPROM */ 174 {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400, 175 1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE, 176 SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE, 177 "EEPROM - fast"}, 178 /* Expansion entry 1001 */ 179 {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406, 180 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 181 SAIFUN_FLASH_BYTE_ADDR_MASK, 0, 182 "Entry 1001"}, 183 /* Expansion entry 1010 */ 184 {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406, 185 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 186 SAIFUN_FLASH_BYTE_ADDR_MASK, 0, 187 "Entry 1010"}, 188 /* ATMEL AT45DB011B (buffered flash) */ 189 {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400, 190 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE, 191 BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE, 192 "Buffered flash (128kB)"}, 193 /* Expansion entry 1100 */ 194 {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406, 195 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 196 SAIFUN_FLASH_BYTE_ADDR_MASK, 0, 197 "Entry 1100"}, 198 /* Expansion entry 1101 */ 199 {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406, 200 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, 201 SAIFUN_FLASH_BYTE_ADDR_MASK, 0, 202 "Entry 1101"}, 203 /* Ateml Expansion entry 1110 */ 204 {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400, 205 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE, 206 BUFFERED_FLASH_BYTE_ADDR_MASK, 0, 207 "Entry 1110 (Atmel)"}, 208 /* ATMEL AT45DB021B (buffered flash) */ 209 {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400, 210 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE, 211 BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2, 212 "Buffered flash (256kB)"}, 213 }; 214 215 216 /****************************************************************************/ 217 /* FreeBSD device entry points. */ 218 /****************************************************************************/ 219 static int bce_probe (device_t); 220 static int bce_attach (device_t); 221 static int bce_detach (device_t); 222 static void bce_shutdown (device_t); 223 224 225 /****************************************************************************/ 226 /* BCE Debug Data Structure Dump Routines */ 227 /****************************************************************************/ 228 #ifdef BCE_DEBUG 229 static void bce_dump_mbuf (struct bce_softc *, struct mbuf *); 230 static void bce_dump_tx_mbuf_chain (struct bce_softc *, int, int); 231 static void bce_dump_rx_mbuf_chain (struct bce_softc *, int, int); 232 static void bce_dump_txbd (struct bce_softc *, int, struct tx_bd *); 233 static void bce_dump_rxbd (struct bce_softc *, int, struct rx_bd *); 234 static void bce_dump_l2fhdr (struct bce_softc *, int, struct l2_fhdr *); 235 static void bce_dump_tx_chain (struct bce_softc *, int, int); 236 static void bce_dump_rx_chain (struct bce_softc *, int, int); 237 static void bce_dump_status_block (struct bce_softc *); 238 static void bce_dump_stats_block (struct bce_softc *); 239 static void bce_dump_driver_state (struct bce_softc *); 240 static void bce_dump_hw_state (struct bce_softc *); 241 static void bce_breakpoint (struct bce_softc *); 242 #endif 243 244 245 /****************************************************************************/ 246 /* BCE Register/Memory Access Routines */ 247 /****************************************************************************/ 248 static u32 bce_reg_rd_ind (struct bce_softc *, u32); 249 static void bce_reg_wr_ind (struct bce_softc *, u32, u32); 250 static void bce_ctx_wr (struct bce_softc *, u32, u32, u32); 251 static int bce_miibus_read_reg (device_t, int, int); 252 static int bce_miibus_write_reg (device_t, int, int, int); 253 static void bce_miibus_statchg (device_t); 254 255 256 /****************************************************************************/ 257 /* BCE NVRAM Access Routines */ 258 /****************************************************************************/ 259 static int bce_acquire_nvram_lock (struct bce_softc *); 260 static int bce_release_nvram_lock (struct bce_softc *); 261 static void bce_enable_nvram_access (struct bce_softc *); 262 static void bce_disable_nvram_access(struct bce_softc *); 263 static int bce_nvram_read_dword (struct bce_softc *, u32, u8 *, u32); 264 static int bce_init_nvram (struct bce_softc *); 265 static int bce_nvram_read (struct bce_softc *, u32, u8 *, int); 266 static int bce_nvram_test (struct bce_softc *); 267 #ifdef BCE_NVRAM_WRITE_SUPPORT 268 static int bce_enable_nvram_write (struct bce_softc *); 269 static void bce_disable_nvram_write (struct bce_softc *); 270 static int bce_nvram_erase_page (struct bce_softc *, u32); 271 static int bce_nvram_write_dword (struct bce_softc *, u32, u8 *, u32); 272 static int bce_nvram_write (struct bce_softc *, u32, u8 *, int); 273 #endif 274 275 /****************************************************************************/ 276 /* */ 277 /****************************************************************************/ 278 static void bce_dma_map_addr (void *, bus_dma_segment_t *, int, int); 279 static void bce_dma_map_tx_desc (void *, bus_dma_segment_t *, int, bus_size_t, int); 280 static int bce_dma_alloc (device_t); 281 static void bce_dma_free (struct bce_softc *); 282 static void bce_release_resources (struct bce_softc *); 283 284 /****************************************************************************/ 285 /* BCE Firmware Synchronization and Load */ 286 /****************************************************************************/ 287 static int bce_fw_sync (struct bce_softc *, u32); 288 static void bce_load_rv2p_fw (struct bce_softc *, u32 *, u32, u32); 289 static void bce_load_cpu_fw (struct bce_softc *, struct cpu_reg *, struct fw_info *); 290 static void bce_init_cpus (struct bce_softc *); 291 292 static void bce_stop (struct bce_softc *); 293 static int bce_reset (struct bce_softc *, u32); 294 static int bce_chipinit (struct bce_softc *); 295 static int bce_blockinit (struct bce_softc *); 296 static int bce_get_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *, u32 *); 297 298 static int bce_init_tx_chain (struct bce_softc *); 299 static int bce_init_rx_chain (struct bce_softc *); 300 static void bce_free_rx_chain (struct bce_softc *); 301 static void bce_free_tx_chain (struct bce_softc *); 302 303 static int bce_tx_encap (struct bce_softc *, struct mbuf *, u16 *, u16 *, u32 *); 304 static void bce_start_locked (struct ifnet *); 305 static void bce_start (struct ifnet *); 306 static int bce_ioctl (struct ifnet *, u_long, caddr_t); 307 static void bce_watchdog (struct ifnet *); 308 static int bce_ifmedia_upd (struct ifnet *); 309 static void bce_ifmedia_sts (struct ifnet *, struct ifmediareq *); 310 static void bce_init_locked (struct bce_softc *); 311 static void bce_init (void *); 312 313 static void bce_init_context (struct bce_softc *); 314 static void bce_get_mac_addr (struct bce_softc *); 315 static void bce_set_mac_addr (struct bce_softc *); 316 static void bce_phy_intr (struct bce_softc *); 317 static void bce_rx_intr (struct bce_softc *); 318 static void bce_tx_intr (struct bce_softc *); 319 static void bce_disable_intr (struct bce_softc *); 320 static void bce_enable_intr (struct bce_softc *); 321 322 #ifdef DEVICE_POLLING 323 static void bce_poll_locked (struct ifnet *, enum poll_cmd, int); 324 static void bce_poll (struct ifnet *, enum poll_cmd, int); 325 #endif 326 static void bce_intr (void *); 327 static void bce_set_rx_mode (struct bce_softc *); 328 static void bce_stats_update (struct bce_softc *); 329 static void bce_tick_locked (struct bce_softc *); 330 static void bce_tick (void *); 331 static void bce_add_sysctls (struct bce_softc *); 332 333 334 /****************************************************************************/ 335 /* FreeBSD device dispatch table. */ 336 /****************************************************************************/ 337 static device_method_t bce_methods[] = { 338 /* Device interface */ 339 DEVMETHOD(device_probe, bce_probe), 340 DEVMETHOD(device_attach, bce_attach), 341 DEVMETHOD(device_detach, bce_detach), 342 DEVMETHOD(device_shutdown, bce_shutdown), 343 344 /* bus interface */ 345 DEVMETHOD(bus_print_child, bus_generic_print_child), 346 DEVMETHOD(bus_driver_added, bus_generic_driver_added), 347 348 /* MII interface */ 349 DEVMETHOD(miibus_readreg, bce_miibus_read_reg), 350 DEVMETHOD(miibus_writereg, bce_miibus_write_reg), 351 DEVMETHOD(miibus_statchg, bce_miibus_statchg), 352 353 { 0, 0 } 354 }; 355 356 static driver_t bce_driver = { 357 "bce", 358 bce_methods, 359 sizeof(struct bce_softc) 360 }; 361 362 static devclass_t bce_devclass; 363 364 MODULE_DEPEND(bce, pci, 1, 1, 1); 365 MODULE_DEPEND(bce, ether, 1, 1, 1); 366 MODULE_DEPEND(bce, miibus, 1, 1, 1); 367 368 DRIVER_MODULE(bce, pci, bce_driver, bce_devclass, 0, 0); 369 DRIVER_MODULE(miibus, bce, miibus_driver, miibus_devclass, 0, 0); 370 371 372 /****************************************************************************/ 373 /* Device probe function. */ 374 /* */ 375 /* Compares the device to the driver's list of supported devices and */ 376 /* reports back to the OS whether this is the right driver for the device. */ 377 /* */ 378 /* Returns: */ 379 /* BUS_PROBE_DEFAULT on success, positive value on failure. */ 380 /****************************************************************************/ 381 static int 382 bce_probe(device_t dev) 383 { 384 struct bce_type *t; 385 struct bce_softc *sc; 386 char *descbuf; 387 u16 vid = 0, did = 0, svid = 0, sdid = 0; 388 389 t = bce_devs; 390 391 sc = device_get_softc(dev); 392 bzero(sc, sizeof(struct bce_softc)); 393 sc->bce_unit = device_get_unit(dev); 394 sc->bce_dev = dev; 395 396 /* Get the data for the device to be probed. */ 397 vid = pci_get_vendor(dev); 398 did = pci_get_device(dev); 399 svid = pci_get_subvendor(dev); 400 sdid = pci_get_subdevice(dev); 401 402 DBPRINT(sc, BCE_VERBOSE_LOAD, 403 "%s(); VID = 0x%04X, DID = 0x%04X, SVID = 0x%04X, " 404 "SDID = 0x%04X\n", __FUNCTION__, vid, did, svid, sdid); 405 406 /* Look through the list of known devices for a match. */ 407 while(t->bce_name != NULL) { 408 409 if ((vid == t->bce_vid) && (did == t->bce_did) && 410 ((svid == t->bce_svid) || (t->bce_svid == PCI_ANY_ID)) && 411 ((sdid == t->bce_sdid) || (t->bce_sdid == PCI_ANY_ID))) { 412 413 descbuf = malloc(BCE_DEVDESC_MAX, M_TEMP, M_NOWAIT); 414 415 if (descbuf == NULL) 416 return(ENOMEM); 417 418 /* Print out the device identity. */ 419 snprintf(descbuf, BCE_DEVDESC_MAX, "%s (%c%d), %s", 420 t->bce_name, 421 (((pci_read_config(dev, PCIR_REVID, 4) & 0xf0) >> 4) + 'A'), 422 (pci_read_config(dev, PCIR_REVID, 4) & 0xf), 423 bce_driver_version); 424 425 device_set_desc_copy(dev, descbuf); 426 free(descbuf, M_TEMP); 427 return(BUS_PROBE_DEFAULT); 428 } 429 t++; 430 } 431 432 DBPRINT(sc, BCE_VERBOSE_LOAD, "%s(%d): No IOCTL match found!\n", 433 __FILE__, __LINE__); 434 435 return(ENXIO); 436 } 437 438 439 /****************************************************************************/ 440 /* Device attach function. */ 441 /* */ 442 /* Allocates device resources, performs secondary chip identification, */ 443 /* resets and initializes the hardware, and initializes driver instance */ 444 /* variables. */ 445 /* */ 446 /* Returns: */ 447 /* 0 on success, positive value on failure. */ 448 /****************************************************************************/ 449 static int 450 bce_attach(device_t dev) 451 { 452 struct bce_softc *sc; 453 struct ifnet *ifp; 454 u32 val; 455 int mbuf, rid, rc = 0; 456 457 sc = device_get_softc(dev); 458 sc->bce_dev = dev; 459 460 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 461 462 mbuf = device_get_unit(dev); 463 sc->bce_unit = mbuf; 464 465 pci_enable_busmaster(dev); 466 467 /* Allocate PCI memory resources. */ 468 rid = PCIR_BAR(0); 469 sc->bce_res = bus_alloc_resource_any( 470 dev, /* dev */ 471 SYS_RES_MEMORY, /* type */ 472 &rid, /* rid */ 473 RF_ACTIVE | PCI_RF_DENSE); /* flags */ 474 475 if (sc->bce_res == NULL) { 476 BCE_PRINTF(sc, "%s(%d): PCI memory allocation failed\n", 477 __FILE__, __LINE__); 478 rc = ENXIO; 479 goto bce_attach_fail; 480 } 481 482 /* Get various resource handles. */ 483 sc->bce_btag = rman_get_bustag(sc->bce_res); 484 sc->bce_bhandle = rman_get_bushandle(sc->bce_res); 485 sc->bce_vhandle = (vm_offset_t) rman_get_virtual(sc->bce_res); 486 487 /* Allocate PCI IRQ resources. */ 488 rid = 0; 489 sc->bce_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, 490 RF_SHAREABLE | RF_ACTIVE); 491 492 if (sc->bce_irq == NULL) { 493 BCE_PRINTF(sc, "%s(%d): PCI map interrupt failed\n", 494 __FILE__, __LINE__); 495 rc = ENXIO; 496 goto bce_attach_fail; 497 } 498 499 /* Initialize mutex for the current device instance. */ 500 BCE_LOCK_INIT(sc, device_get_nameunit(dev)); 501 502 /* 503 * Configure byte swap and enable indirect register access. 504 * Rely on CPU to do target byte swapping on big endian systems. 505 * Access to registers outside of PCI configurtion space are not 506 * valid until this is done. 507 */ 508 pci_write_config(dev, BCE_PCICFG_MISC_CONFIG, 509 BCE_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | 510 BCE_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP, 4); 511 512 /* Save ASIC revsion info. */ 513 sc->bce_chipid = REG_RD(sc, BCE_MISC_ID); 514 515 /* Weed out any non-production controller revisions. */ 516 switch(BCE_CHIP_ID(sc)) { 517 case BCE_CHIP_ID_5706_A0: 518 case BCE_CHIP_ID_5706_A1: 519 case BCE_CHIP_ID_5708_A0: 520 case BCE_CHIP_ID_5708_B0: 521 BCE_PRINTF(sc, "%s(%d): Unsupported controller revision (%c%d)!\n", 522 __FILE__, __LINE__, 523 (((pci_read_config(dev, PCIR_REVID, 4) & 0xf0) >> 4) + 'A'), 524 (pci_read_config(dev, PCIR_REVID, 4) & 0xf)); 525 rc = ENODEV; 526 goto bce_attach_fail; 527 } 528 529 if (BCE_CHIP_BOND_ID(sc) & BCE_CHIP_BOND_ID_SERDES_BIT) { 530 BCE_PRINTF(sc, "%s(%d): SerDes controllers are not supported!\n", 531 __FILE__, __LINE__); 532 rc = ENODEV; 533 goto bce_attach_fail; 534 } 535 536 /* 537 * The embedded PCIe to PCI-X bridge (EPB) 538 * in the 5708 cannot address memory above 539 * 40 bits (E7_5708CB1_23043 & E6_5708SB1_23043). 540 */ 541 if (BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5708) 542 sc->max_bus_addr = BCE_BUS_SPACE_MAXADDR; 543 else 544 sc->max_bus_addr = BUS_SPACE_MAXADDR; 545 546 /* 547 * Find the base address for shared memory access. 548 * Newer versions of bootcode use a signature and offset 549 * while older versions use a fixed address. 550 */ 551 val = REG_RD_IND(sc, BCE_SHM_HDR_SIGNATURE); 552 if ((val & BCE_SHM_HDR_SIGNATURE_SIG_MASK) == BCE_SHM_HDR_SIGNATURE_SIG) 553 sc->bce_shmem_base = REG_RD_IND(sc, BCE_SHM_HDR_ADDR_0); 554 else 555 sc->bce_shmem_base = HOST_VIEW_SHMEM_BASE; 556 557 DBPRINT(sc, BCE_INFO, "bce_shmem_base = 0x%08X\n", sc->bce_shmem_base); 558 559 /* Set initial device and PHY flags */ 560 sc->bce_flags = 0; 561 sc->bce_phy_flags = 0; 562 563 /* Get PCI bus information (speed and type). */ 564 val = REG_RD(sc, BCE_PCICFG_MISC_STATUS); 565 if (val & BCE_PCICFG_MISC_STATUS_PCIX_DET) { 566 u32 clkreg; 567 568 sc->bce_flags |= BCE_PCIX_FLAG; 569 570 clkreg = REG_RD(sc, BCE_PCICFG_PCI_CLOCK_CONTROL_BITS); 571 572 clkreg &= BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET; 573 switch (clkreg) { 574 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ: 575 sc->bus_speed_mhz = 133; 576 break; 577 578 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ: 579 sc->bus_speed_mhz = 100; 580 break; 581 582 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ: 583 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ: 584 sc->bus_speed_mhz = 66; 585 break; 586 587 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ: 588 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ: 589 sc->bus_speed_mhz = 50; 590 break; 591 592 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW: 593 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ: 594 case BCE_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ: 595 sc->bus_speed_mhz = 33; 596 break; 597 } 598 } else { 599 if (val & BCE_PCICFG_MISC_STATUS_M66EN) 600 sc->bus_speed_mhz = 66; 601 else 602 sc->bus_speed_mhz = 33; 603 } 604 605 if (val & BCE_PCICFG_MISC_STATUS_32BIT_DET) 606 sc->bce_flags |= BCE_PCI_32BIT_FLAG; 607 608 BCE_PRINTF(sc, "ASIC ID 0x%08X; Revision (%c%d); PCI%s %s %dMHz\n", 609 sc->bce_chipid, 610 ((BCE_CHIP_ID(sc) & 0xf000) >> 12) + 'A', 611 ((BCE_CHIP_ID(sc) & 0x0ff0) >> 4), 612 ((sc->bce_flags & BCE_PCIX_FLAG) ? "-X" : ""), 613 ((sc->bce_flags & BCE_PCI_32BIT_FLAG) ? "32-bit" : "64-bit"), 614 sc->bus_speed_mhz); 615 616 /* Reset the controller. */ 617 if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) { 618 rc = ENXIO; 619 goto bce_attach_fail; 620 } 621 622 /* Initialize the controller. */ 623 if (bce_chipinit(sc)) { 624 BCE_PRINTF(sc, "%s(%d): Controller initialization failed!\n", 625 __FILE__, __LINE__); 626 rc = ENXIO; 627 goto bce_attach_fail; 628 } 629 630 /* Perform NVRAM test. */ 631 if (bce_nvram_test(sc)) { 632 BCE_PRINTF(sc, "%s(%d): NVRAM test failed!\n", 633 __FILE__, __LINE__); 634 rc = ENXIO; 635 goto bce_attach_fail; 636 } 637 638 /* Fetch the permanent Ethernet MAC address. */ 639 bce_get_mac_addr(sc); 640 641 /* 642 * Trip points control how many BDs 643 * should be ready before generating an 644 * interrupt while ticks control how long 645 * a BD can sit in the chain before 646 * generating an interrupt. Set the default 647 * values for the RX and TX rings. 648 */ 649 650 #ifdef BCE_DRBUG 651 /* Force more frequent interrupts. */ 652 sc->bce_tx_quick_cons_trip_int = 1; 653 sc->bce_tx_quick_cons_trip = 1; 654 sc->bce_tx_ticks_int = 0; 655 sc->bce_tx_ticks = 0; 656 657 sc->bce_rx_quick_cons_trip_int = 1; 658 sc->bce_rx_quick_cons_trip = 1; 659 sc->bce_rx_ticks_int = 0; 660 sc->bce_rx_ticks = 0; 661 #else 662 sc->bce_tx_quick_cons_trip_int = 20; 663 sc->bce_tx_quick_cons_trip = 20; 664 sc->bce_tx_ticks_int = 80; 665 sc->bce_tx_ticks = 80; 666 667 sc->bce_rx_quick_cons_trip_int = 6; 668 sc->bce_rx_quick_cons_trip = 6; 669 sc->bce_rx_ticks_int = 18; 670 sc->bce_rx_ticks = 18; 671 #endif 672 673 /* Update statistics once every second. */ 674 sc->bce_stats_ticks = 1000000 & 0xffff00; 675 676 /* 677 * The copper based NetXtreme II controllers 678 * use an integrated PHY at address 1 while 679 * the SerDes controllers use a PHY at 680 * address 2. 681 */ 682 sc->bce_phy_addr = 1; 683 684 if (BCE_CHIP_BOND_ID(sc) & BCE_CHIP_BOND_ID_SERDES_BIT) { 685 sc->bce_phy_flags |= BCE_PHY_SERDES_FLAG; 686 sc->bce_flags |= BCE_NO_WOL_FLAG; 687 if (BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5708) { 688 sc->bce_phy_addr = 2; 689 val = REG_RD_IND(sc, sc->bce_shmem_base + 690 BCE_SHARED_HW_CFG_CONFIG); 691 if (val & BCE_SHARED_HW_CFG_PHY_2_5G) 692 sc->bce_phy_flags |= BCE_PHY_2_5G_CAPABLE_FLAG; 693 } 694 } 695 696 /* Allocate DMA memory resources. */ 697 if (bce_dma_alloc(dev)) { 698 BCE_PRINTF(sc, "%s(%d): DMA resource allocation failed!\n", 699 __FILE__, __LINE__); 700 rc = ENXIO; 701 goto bce_attach_fail; 702 } 703 704 /* Allocate an ifnet structure. */ 705 ifp = sc->bce_ifp = if_alloc(IFT_ETHER); 706 if (ifp == NULL) { 707 BCE_PRINTF(sc, "%s(%d): Interface allocation failed!\n", 708 __FILE__, __LINE__); 709 rc = ENXIO; 710 goto bce_attach_fail; 711 } 712 713 /* Initialize the ifnet interface. */ 714 ifp->if_softc = sc; 715 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 716 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 717 ifp->if_ioctl = bce_ioctl; 718 ifp->if_start = bce_start; 719 ifp->if_timer = 0; 720 ifp->if_watchdog = bce_watchdog; 721 ifp->if_init = bce_init; 722 ifp->if_mtu = ETHERMTU; 723 ifp->if_hwassist = BCE_IF_HWASSIST; 724 ifp->if_capabilities = BCE_IF_CAPABILITIES; 725 ifp->if_capenable = ifp->if_capabilities; 726 727 /* Assume a standard 1500 byte MTU size for mbuf allocations. */ 728 sc->mbuf_alloc_size = MCLBYTES; 729 #ifdef DEVICE_POLLING 730 ifp->if_capabilities |= IFCAP_POLLING; 731 #endif 732 733 ifp->if_snd.ifq_drv_maxlen = USABLE_TX_BD; 734 if (sc->bce_phy_flags & BCE_PHY_2_5G_CAPABLE_FLAG) 735 ifp->if_baudrate = IF_Gbps(2.5); 736 else 737 ifp->if_baudrate = IF_Gbps(1); 738 739 IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); 740 IFQ_SET_READY(&ifp->if_snd); 741 742 if (sc->bce_phy_flags & BCE_PHY_SERDES_FLAG) { 743 BCE_PRINTF(sc, "%s(%d): SerDes is not supported by this driver!\n", 744 __FILE__, __LINE__); 745 rc = ENODEV; 746 goto bce_attach_fail; 747 } else { 748 /* Look for our PHY. */ 749 if (mii_phy_probe(dev, &sc->bce_miibus, bce_ifmedia_upd, 750 bce_ifmedia_sts)) { 751 BCE_PRINTF(sc, "%s(%d): PHY probe failed!\n", 752 __FILE__, __LINE__); 753 rc = ENXIO; 754 goto bce_attach_fail; 755 } 756 } 757 758 /* Attach to the Ethernet interface list. */ 759 ether_ifattach(ifp, sc->eaddr); 760 761 #if __FreeBSD_version < 500000 762 callout_init(&sc->bce_stat_ch); 763 #else 764 callout_init(&sc->bce_stat_ch, CALLOUT_MPSAFE); 765 #endif 766 767 /* Hookup IRQ last. */ 768 rc = bus_setup_intr(dev, sc->bce_irq, INTR_TYPE_NET | INTR_MPSAFE, 769 bce_intr, sc, &sc->bce_intrhand); 770 771 if (rc) { 772 BCE_PRINTF(sc, "%s(%d): Failed to setup IRQ!\n", 773 __FILE__, __LINE__); 774 bce_detach(dev); 775 goto bce_attach_exit; 776 } 777 778 /* Print some important debugging info. */ 779 DBRUN(BCE_INFO, bce_dump_driver_state(sc)); 780 781 /* Add the supported sysctls to the kernel. */ 782 bce_add_sysctls(sc); 783 784 goto bce_attach_exit; 785 786 bce_attach_fail: 787 bce_release_resources(sc); 788 789 bce_attach_exit: 790 791 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 792 793 return(rc); 794 } 795 796 797 /****************************************************************************/ 798 /* Device detach function. */ 799 /* */ 800 /* Stops the controller, resets the controller, and releases resources. */ 801 /* */ 802 /* Returns: */ 803 /* 0 on success, positive value on failure. */ 804 /****************************************************************************/ 805 static int 806 bce_detach(device_t dev) 807 { 808 struct bce_softc *sc; 809 struct ifnet *ifp; 810 811 sc = device_get_softc(dev); 812 813 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 814 815 ifp = sc->bce_ifp; 816 817 #ifdef DEVICE_POLLING 818 if (ifp->if_capenable & IFCAP_POLLING) 819 ether_poll_deregister(ifp); 820 #endif 821 822 /* Stop and reset the controller. */ 823 BCE_LOCK(sc); 824 bce_stop(sc); 825 bce_reset(sc, BCE_DRV_MSG_CODE_RESET); 826 BCE_UNLOCK(sc); 827 828 ether_ifdetach(ifp); 829 830 /* If we have a child device on the MII bus remove it too. */ 831 if (sc->bce_phy_flags & BCE_PHY_SERDES_FLAG) { 832 ifmedia_removeall(&sc->bce_ifmedia); 833 } else { 834 bus_generic_detach(dev); 835 device_delete_child(dev, sc->bce_miibus); 836 } 837 838 /* Release all remaining resources. */ 839 bce_release_resources(sc); 840 841 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 842 843 return(0); 844 } 845 846 847 /****************************************************************************/ 848 /* Device shutdown function. */ 849 /* */ 850 /* Stops and resets the controller. */ 851 /* */ 852 /* Returns: */ 853 /* Nothing */ 854 /****************************************************************************/ 855 static void 856 bce_shutdown(device_t dev) 857 { 858 struct bce_softc *sc = device_get_softc(dev); 859 860 BCE_LOCK(sc); 861 bce_stop(sc); 862 bce_reset(sc, BCE_DRV_MSG_CODE_RESET); 863 BCE_UNLOCK(sc); 864 } 865 866 867 /****************************************************************************/ 868 /* Indirect register read. */ 869 /* */ 870 /* Reads NetXtreme II registers using an index/data register pair in PCI */ 871 /* configuration space. Using this mechanism avoids issues with posted */ 872 /* reads but is much slower than memory-mapped I/O. */ 873 /* */ 874 /* Returns: */ 875 /* The value of the register. */ 876 /****************************************************************************/ 877 static u32 878 bce_reg_rd_ind(struct bce_softc *sc, u32 offset) 879 { 880 device_t dev; 881 dev = sc->bce_dev; 882 883 pci_write_config(dev, BCE_PCICFG_REG_WINDOW_ADDRESS, offset, 4); 884 #ifdef BCE_DEBUG 885 { 886 u32 val; 887 val = pci_read_config(dev, BCE_PCICFG_REG_WINDOW, 4); 888 DBPRINT(sc, BCE_EXCESSIVE, "%s(); offset = 0x%08X, val = 0x%08X\n", 889 __FUNCTION__, offset, val); 890 return val; 891 } 892 #else 893 return pci_read_config(dev, BCE_PCICFG_REG_WINDOW, 4); 894 #endif 895 } 896 897 898 /****************************************************************************/ 899 /* Indirect register write. */ 900 /* */ 901 /* Writes NetXtreme II registers using an index/data register pair in PCI */ 902 /* configuration space. Using this mechanism avoids issues with posted */ 903 /* writes but is muchh slower than memory-mapped I/O. */ 904 /* */ 905 /* Returns: */ 906 /* Nothing. */ 907 /****************************************************************************/ 908 static void 909 bce_reg_wr_ind(struct bce_softc *sc, u32 offset, u32 val) 910 { 911 device_t dev; 912 dev = sc->bce_dev; 913 914 DBPRINT(sc, BCE_EXCESSIVE, "%s(); offset = 0x%08X, val = 0x%08X\n", 915 __FUNCTION__, offset, val); 916 917 pci_write_config(dev, BCE_PCICFG_REG_WINDOW_ADDRESS, offset, 4); 918 pci_write_config(dev, BCE_PCICFG_REG_WINDOW, val, 4); 919 } 920 921 922 /****************************************************************************/ 923 /* Context memory write. */ 924 /* */ 925 /* The NetXtreme II controller uses context memory to track connection */ 926 /* information for L2 and higher network protocols. */ 927 /* */ 928 /* Returns: */ 929 /* Nothing. */ 930 /****************************************************************************/ 931 static void 932 bce_ctx_wr(struct bce_softc *sc, u32 cid_addr, u32 offset, u32 val) 933 { 934 935 DBPRINT(sc, BCE_EXCESSIVE, "%s(); cid_addr = 0x%08X, offset = 0x%08X, " 936 "val = 0x%08X\n", __FUNCTION__, cid_addr, offset, val); 937 938 offset += cid_addr; 939 REG_WR(sc, BCE_CTX_DATA_ADR, offset); 940 REG_WR(sc, BCE_CTX_DATA, val); 941 } 942 943 944 /****************************************************************************/ 945 /* PHY register read. */ 946 /* */ 947 /* Implements register reads on the MII bus. */ 948 /* */ 949 /* Returns: */ 950 /* The value of the register. */ 951 /****************************************************************************/ 952 static int 953 bce_miibus_read_reg(device_t dev, int phy, int reg) 954 { 955 struct bce_softc *sc; 956 u32 val; 957 int i; 958 959 sc = device_get_softc(dev); 960 961 /* Make sure we are accessing the correct PHY address. */ 962 if (phy != sc->bce_phy_addr) { 963 DBPRINT(sc, BCE_VERBOSE, "Invalid PHY address %d for PHY read!\n", phy); 964 return(0); 965 } 966 967 if (sc->bce_phy_flags & BCE_PHY_INT_MODE_AUTO_POLLING_FLAG) { 968 val = REG_RD(sc, BCE_EMAC_MDIO_MODE); 969 val &= ~BCE_EMAC_MDIO_MODE_AUTO_POLL; 970 971 REG_WR(sc, BCE_EMAC_MDIO_MODE, val); 972 REG_RD(sc, BCE_EMAC_MDIO_MODE); 973 974 DELAY(40); 975 } 976 977 val = BCE_MIPHY(phy) | BCE_MIREG(reg) | 978 BCE_EMAC_MDIO_COMM_COMMAND_READ | BCE_EMAC_MDIO_COMM_DISEXT | 979 BCE_EMAC_MDIO_COMM_START_BUSY; 980 REG_WR(sc, BCE_EMAC_MDIO_COMM, val); 981 982 for (i = 0; i < BCE_PHY_TIMEOUT; i++) { 983 DELAY(10); 984 985 val = REG_RD(sc, BCE_EMAC_MDIO_COMM); 986 if (!(val & BCE_EMAC_MDIO_COMM_START_BUSY)) { 987 DELAY(5); 988 989 val = REG_RD(sc, BCE_EMAC_MDIO_COMM); 990 val &= BCE_EMAC_MDIO_COMM_DATA; 991 992 break; 993 } 994 } 995 996 if (val & BCE_EMAC_MDIO_COMM_START_BUSY) { 997 BCE_PRINTF(sc, "%s(%d): Error: PHY read timeout! phy = %d, reg = 0x%04X\n", 998 __FILE__, __LINE__, phy, reg); 999 val = 0x0; 1000 } else { 1001 val = REG_RD(sc, BCE_EMAC_MDIO_COMM); 1002 } 1003 1004 DBPRINT(sc, BCE_EXCESSIVE, "%s(): phy = %d, reg = 0x%04X, val = 0x%04X\n", 1005 __FUNCTION__, phy, (u16) reg & 0xffff, (u16) val & 0xffff); 1006 1007 if (sc->bce_phy_flags & BCE_PHY_INT_MODE_AUTO_POLLING_FLAG) { 1008 val = REG_RD(sc, BCE_EMAC_MDIO_MODE); 1009 val |= BCE_EMAC_MDIO_MODE_AUTO_POLL; 1010 1011 REG_WR(sc, BCE_EMAC_MDIO_MODE, val); 1012 REG_RD(sc, BCE_EMAC_MDIO_MODE); 1013 1014 DELAY(40); 1015 } 1016 1017 return (val & 0xffff); 1018 1019 } 1020 1021 1022 /****************************************************************************/ 1023 /* PHY register write. */ 1024 /* */ 1025 /* Implements register writes on the MII bus. */ 1026 /* */ 1027 /* Returns: */ 1028 /* The value of the register. */ 1029 /****************************************************************************/ 1030 static int 1031 bce_miibus_write_reg(device_t dev, int phy, int reg, int val) 1032 { 1033 struct bce_softc *sc; 1034 u32 val1; 1035 int i; 1036 1037 sc = device_get_softc(dev); 1038 1039 /* Make sure we are accessing the correct PHY address. */ 1040 if (phy != sc->bce_phy_addr) { 1041 DBPRINT(sc, BCE_WARN, "Invalid PHY address %d for PHY write!\n", phy); 1042 return(0); 1043 } 1044 1045 DBPRINT(sc, BCE_EXCESSIVE, "%s(): phy = %d, reg = 0x%04X, val = 0x%04X\n", 1046 __FUNCTION__, phy, (u16) reg & 0xffff, (u16) val & 0xffff); 1047 1048 if (sc->bce_phy_flags & BCE_PHY_INT_MODE_AUTO_POLLING_FLAG) { 1049 val1 = REG_RD(sc, BCE_EMAC_MDIO_MODE); 1050 val1 &= ~BCE_EMAC_MDIO_MODE_AUTO_POLL; 1051 1052 REG_WR(sc, BCE_EMAC_MDIO_MODE, val1); 1053 REG_RD(sc, BCE_EMAC_MDIO_MODE); 1054 1055 DELAY(40); 1056 } 1057 1058 val1 = BCE_MIPHY(phy) | BCE_MIREG(reg) | val | 1059 BCE_EMAC_MDIO_COMM_COMMAND_WRITE | 1060 BCE_EMAC_MDIO_COMM_START_BUSY | BCE_EMAC_MDIO_COMM_DISEXT; 1061 REG_WR(sc, BCE_EMAC_MDIO_COMM, val1); 1062 1063 for (i = 0; i < BCE_PHY_TIMEOUT; i++) { 1064 DELAY(10); 1065 1066 val1 = REG_RD(sc, BCE_EMAC_MDIO_COMM); 1067 if (!(val1 & BCE_EMAC_MDIO_COMM_START_BUSY)) { 1068 DELAY(5); 1069 break; 1070 } 1071 } 1072 1073 if (val1 & BCE_EMAC_MDIO_COMM_START_BUSY) 1074 BCE_PRINTF(sc, "%s(%d): PHY write timeout!\n", 1075 __FILE__, __LINE__); 1076 1077 if (sc->bce_phy_flags & BCE_PHY_INT_MODE_AUTO_POLLING_FLAG) { 1078 val1 = REG_RD(sc, BCE_EMAC_MDIO_MODE); 1079 val1 |= BCE_EMAC_MDIO_MODE_AUTO_POLL; 1080 1081 REG_WR(sc, BCE_EMAC_MDIO_MODE, val1); 1082 REG_RD(sc, BCE_EMAC_MDIO_MODE); 1083 1084 DELAY(40); 1085 } 1086 1087 return 0; 1088 } 1089 1090 1091 /****************************************************************************/ 1092 /* MII bus status change. */ 1093 /* */ 1094 /* Called by the MII bus driver when the PHY establishes link to set the */ 1095 /* MAC interface registers. */ 1096 /* */ 1097 /* Returns: */ 1098 /* Nothing. */ 1099 /****************************************************************************/ 1100 static void 1101 bce_miibus_statchg(device_t dev) 1102 { 1103 struct bce_softc *sc; 1104 struct mii_data *mii; 1105 1106 sc = device_get_softc(dev); 1107 1108 mii = device_get_softc(sc->bce_miibus); 1109 1110 BCE_CLRBIT(sc, BCE_EMAC_MODE, BCE_EMAC_MODE_PORT); 1111 1112 /* Set MII or GMII inerface based on the speed negotiated by the PHY. */ 1113 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) { 1114 DBPRINT(sc, BCE_INFO, "Setting GMII interface.\n"); 1115 BCE_SETBIT(sc, BCE_EMAC_MODE, BCE_EMAC_MODE_PORT_GMII); 1116 } else { 1117 DBPRINT(sc, BCE_INFO, "Setting MII interface.\n"); 1118 BCE_SETBIT(sc, BCE_EMAC_MODE, BCE_EMAC_MODE_PORT_MII); 1119 } 1120 1121 /* Set half or full duplex based on the duplicity negotiated by the PHY. */ 1122 if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) { 1123 DBPRINT(sc, BCE_INFO, "Setting Full-Duplex interface.\n"); 1124 BCE_CLRBIT(sc, BCE_EMAC_MODE, BCE_EMAC_MODE_HALF_DUPLEX); 1125 } else { 1126 DBPRINT(sc, BCE_INFO, "Setting Half-Duplex interface.\n"); 1127 BCE_SETBIT(sc, BCE_EMAC_MODE, BCE_EMAC_MODE_HALF_DUPLEX); 1128 } 1129 } 1130 1131 1132 /****************************************************************************/ 1133 /* Acquire NVRAM lock. */ 1134 /* */ 1135 /* Before the NVRAM can be accessed the caller must acquire an NVRAM lock. */ 1136 /* Locks 0 and 2 are reserved, lock 1 is used by firmware and lock 2 is */ 1137 /* for use by the driver. */ 1138 /* */ 1139 /* Returns: */ 1140 /* 0 on success, positive value on failure. */ 1141 /****************************************************************************/ 1142 static int 1143 bce_acquire_nvram_lock(struct bce_softc *sc) 1144 { 1145 u32 val; 1146 int j; 1147 1148 DBPRINT(sc, BCE_VERBOSE, "Acquiring NVRAM lock.\n"); 1149 1150 /* Request access to the flash interface. */ 1151 REG_WR(sc, BCE_NVM_SW_ARB, BCE_NVM_SW_ARB_ARB_REQ_SET2); 1152 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { 1153 val = REG_RD(sc, BCE_NVM_SW_ARB); 1154 if (val & BCE_NVM_SW_ARB_ARB_ARB2) 1155 break; 1156 1157 DELAY(5); 1158 } 1159 1160 if (j >= NVRAM_TIMEOUT_COUNT) { 1161 DBPRINT(sc, BCE_WARN, "Timeout acquiring NVRAM lock!\n"); 1162 return EBUSY; 1163 } 1164 1165 return 0; 1166 } 1167 1168 1169 /****************************************************************************/ 1170 /* Release NVRAM lock. */ 1171 /* */ 1172 /* When the caller is finished accessing NVRAM the lock must be released. */ 1173 /* Locks 0 and 2 are reserved, lock 1 is used by firmware and lock 2 is */ 1174 /* for use by the driver. */ 1175 /* */ 1176 /* Returns: */ 1177 /* 0 on success, positive value on failure. */ 1178 /****************************************************************************/ 1179 static int 1180 bce_release_nvram_lock(struct bce_softc *sc) 1181 { 1182 int j; 1183 u32 val; 1184 1185 DBPRINT(sc, BCE_VERBOSE, "Releasing NVRAM lock.\n"); 1186 1187 /* 1188 * Relinquish nvram interface. 1189 */ 1190 REG_WR(sc, BCE_NVM_SW_ARB, BCE_NVM_SW_ARB_ARB_REQ_CLR2); 1191 1192 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { 1193 val = REG_RD(sc, BCE_NVM_SW_ARB); 1194 if (!(val & BCE_NVM_SW_ARB_ARB_ARB2)) 1195 break; 1196 1197 DELAY(5); 1198 } 1199 1200 if (j >= NVRAM_TIMEOUT_COUNT) { 1201 DBPRINT(sc, BCE_WARN, "Timeout reeasing NVRAM lock!\n"); 1202 return EBUSY; 1203 } 1204 1205 return 0; 1206 } 1207 1208 1209 #ifdef BCE_NVRAM_WRITE_SUPPORT 1210 /****************************************************************************/ 1211 /* Enable NVRAM write access. */ 1212 /* */ 1213 /* Before writing to NVRAM the caller must enable NVRAM writes. */ 1214 /* */ 1215 /* Returns: */ 1216 /* 0 on success, positive value on failure. */ 1217 /****************************************************************************/ 1218 static int 1219 bce_enable_nvram_write(struct bce_softc *sc) 1220 { 1221 u32 val; 1222 1223 DBPRINT(sc, BCE_VERBOSE, "Enabling NVRAM write.\n"); 1224 1225 val = REG_RD(sc, BCE_MISC_CFG); 1226 REG_WR(sc, BCE_MISC_CFG, val | BCE_MISC_CFG_NVM_WR_EN_PCI); 1227 1228 if (!sc->bce_flash_info->buffered) { 1229 int j; 1230 1231 REG_WR(sc, BCE_NVM_COMMAND, BCE_NVM_COMMAND_DONE); 1232 REG_WR(sc, BCE_NVM_COMMAND, BCE_NVM_COMMAND_WREN | BCE_NVM_COMMAND_DOIT); 1233 1234 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { 1235 DELAY(5); 1236 1237 val = REG_RD(sc, BCE_NVM_COMMAND); 1238 if (val & BCE_NVM_COMMAND_DONE) 1239 break; 1240 } 1241 1242 if (j >= NVRAM_TIMEOUT_COUNT) { 1243 DBPRINT(sc, BCE_WARN, "Timeout writing NVRAM!\n"); 1244 return EBUSY; 1245 } 1246 } 1247 return 0; 1248 } 1249 1250 1251 /****************************************************************************/ 1252 /* Disable NVRAM write access. */ 1253 /* */ 1254 /* When the caller is finished writing to NVRAM write access must be */ 1255 /* disabled. */ 1256 /* */ 1257 /* Returns: */ 1258 /* Nothing. */ 1259 /****************************************************************************/ 1260 static void 1261 bce_disable_nvram_write(struct bce_softc *sc) 1262 { 1263 u32 val; 1264 1265 DBPRINT(sc, BCE_VERBOSE, "Disabling NVRAM write.\n"); 1266 1267 val = REG_RD(sc, BCE_MISC_CFG); 1268 REG_WR(sc, BCE_MISC_CFG, val & ~BCE_MISC_CFG_NVM_WR_EN); 1269 } 1270 #endif 1271 1272 1273 /****************************************************************************/ 1274 /* Enable NVRAM access. */ 1275 /* */ 1276 /* Before accessing NVRAM for read or write operations the caller must */ 1277 /* enabled NVRAM access. */ 1278 /* */ 1279 /* Returns: */ 1280 /* Nothing. */ 1281 /****************************************************************************/ 1282 static void 1283 bce_enable_nvram_access(struct bce_softc *sc) 1284 { 1285 u32 val; 1286 1287 DBPRINT(sc, BCE_VERBOSE, "Enabling NVRAM access.\n"); 1288 1289 val = REG_RD(sc, BCE_NVM_ACCESS_ENABLE); 1290 /* Enable both bits, even on read. */ 1291 REG_WR(sc, BCE_NVM_ACCESS_ENABLE, 1292 val | BCE_NVM_ACCESS_ENABLE_EN | BCE_NVM_ACCESS_ENABLE_WR_EN); 1293 } 1294 1295 1296 /****************************************************************************/ 1297 /* Disable NVRAM access. */ 1298 /* */ 1299 /* When the caller is finished accessing NVRAM access must be disabled. */ 1300 /* */ 1301 /* Returns: */ 1302 /* Nothing. */ 1303 /****************************************************************************/ 1304 static void 1305 bce_disable_nvram_access(struct bce_softc *sc) 1306 { 1307 u32 val; 1308 1309 DBPRINT(sc, BCE_VERBOSE, "Disabling NVRAM access.\n"); 1310 1311 val = REG_RD(sc, BCE_NVM_ACCESS_ENABLE); 1312 1313 /* Disable both bits, even after read. */ 1314 REG_WR(sc, BCE_NVM_ACCESS_ENABLE, 1315 val & ~(BCE_NVM_ACCESS_ENABLE_EN | 1316 BCE_NVM_ACCESS_ENABLE_WR_EN)); 1317 } 1318 1319 1320 #ifdef BCE_NVRAM_WRITE_SUPPORT 1321 /****************************************************************************/ 1322 /* Erase NVRAM page before writing. */ 1323 /* */ 1324 /* Non-buffered flash parts require that a page be erased before it is */ 1325 /* written. */ 1326 /* */ 1327 /* Returns: */ 1328 /* 0 on success, positive value on failure. */ 1329 /****************************************************************************/ 1330 static int 1331 bce_nvram_erase_page(struct bce_softc *sc, u32 offset) 1332 { 1333 u32 cmd; 1334 int j; 1335 1336 /* Buffered flash doesn't require an erase. */ 1337 if (sc->bce_flash_info->buffered) 1338 return 0; 1339 1340 DBPRINT(sc, BCE_VERBOSE, "Erasing NVRAM page.\n"); 1341 1342 /* Build an erase command. */ 1343 cmd = BCE_NVM_COMMAND_ERASE | BCE_NVM_COMMAND_WR | 1344 BCE_NVM_COMMAND_DOIT; 1345 1346 /* 1347 * Clear the DONE bit separately, set the NVRAM adress to erase, 1348 * and issue the erase command. 1349 */ 1350 REG_WR(sc, BCE_NVM_COMMAND, BCE_NVM_COMMAND_DONE); 1351 REG_WR(sc, BCE_NVM_ADDR, offset & BCE_NVM_ADDR_NVM_ADDR_VALUE); 1352 REG_WR(sc, BCE_NVM_COMMAND, cmd); 1353 1354 /* Wait for completion. */ 1355 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { 1356 u32 val; 1357 1358 DELAY(5); 1359 1360 val = REG_RD(sc, BCE_NVM_COMMAND); 1361 if (val & BCE_NVM_COMMAND_DONE) 1362 break; 1363 } 1364 1365 if (j >= NVRAM_TIMEOUT_COUNT) { 1366 DBPRINT(sc, BCE_WARN, "Timeout erasing NVRAM.\n"); 1367 return EBUSY; 1368 } 1369 1370 return 0; 1371 } 1372 #endif /* BCE_NVRAM_WRITE_SUPPORT */ 1373 1374 1375 /****************************************************************************/ 1376 /* Read a dword (32 bits) from NVRAM. */ 1377 /* */ 1378 /* Read a 32 bit word from NVRAM. The caller is assumed to have already */ 1379 /* obtained the NVRAM lock and enabled the controller for NVRAM access. */ 1380 /* */ 1381 /* Returns: */ 1382 /* 0 on success and the 32 bit value read, positive value on failure. */ 1383 /****************************************************************************/ 1384 static int 1385 bce_nvram_read_dword(struct bce_softc *sc, u32 offset, u8 *ret_val, 1386 u32 cmd_flags) 1387 { 1388 u32 cmd; 1389 int i, rc = 0; 1390 1391 /* Build the command word. */ 1392 cmd = BCE_NVM_COMMAND_DOIT | cmd_flags; 1393 1394 /* Calculate the offset for buffered flash. */ 1395 if (sc->bce_flash_info->buffered) { 1396 offset = ((offset / sc->bce_flash_info->page_size) << 1397 sc->bce_flash_info->page_bits) + 1398 (offset % sc->bce_flash_info->page_size); 1399 } 1400 1401 /* 1402 * Clear the DONE bit separately, set the address to read, 1403 * and issue the read. 1404 */ 1405 REG_WR(sc, BCE_NVM_COMMAND, BCE_NVM_COMMAND_DONE); 1406 REG_WR(sc, BCE_NVM_ADDR, offset & BCE_NVM_ADDR_NVM_ADDR_VALUE); 1407 REG_WR(sc, BCE_NVM_COMMAND, cmd); 1408 1409 /* Wait for completion. */ 1410 for (i = 0; i < NVRAM_TIMEOUT_COUNT; i++) { 1411 u32 val; 1412 1413 DELAY(5); 1414 1415 val = REG_RD(sc, BCE_NVM_COMMAND); 1416 if (val & BCE_NVM_COMMAND_DONE) { 1417 val = REG_RD(sc, BCE_NVM_READ); 1418 1419 val = bce_be32toh(val); 1420 memcpy(ret_val, &val, 4); 1421 break; 1422 } 1423 } 1424 1425 /* Check for errors. */ 1426 if (i >= NVRAM_TIMEOUT_COUNT) { 1427 BCE_PRINTF(sc, "%s(%d): Timeout error reading NVRAM at offset 0x%08X!\n", 1428 __FILE__, __LINE__, offset); 1429 rc = EBUSY; 1430 } 1431 1432 return(rc); 1433 } 1434 1435 1436 #ifdef BCE_NVRAM_WRITE_SUPPORT 1437 /****************************************************************************/ 1438 /* Write a dword (32 bits) to NVRAM. */ 1439 /* */ 1440 /* Write a 32 bit word to NVRAM. The caller is assumed to have already */ 1441 /* obtained the NVRAM lock, enabled the controller for NVRAM access, and */ 1442 /* enabled NVRAM write access. */ 1443 /* */ 1444 /* Returns: */ 1445 /* 0 on success, positive value on failure. */ 1446 /****************************************************************************/ 1447 static int 1448 bce_nvram_write_dword(struct bce_softc *sc, u32 offset, u8 *val, 1449 u32 cmd_flags) 1450 { 1451 u32 cmd, val32; 1452 int j; 1453 1454 /* Build the command word. */ 1455 cmd = BCE_NVM_COMMAND_DOIT | BCE_NVM_COMMAND_WR | cmd_flags; 1456 1457 /* Calculate the offset for buffered flash. */ 1458 if (sc->bce_flash_info->buffered) { 1459 offset = ((offset / sc->bce_flash_info->page_size) << 1460 sc->bce_flash_info->page_bits) + 1461 (offset % sc->bce_flash_info->page_size); 1462 } 1463 1464 /* 1465 * Clear the DONE bit separately, convert NVRAM data to big-endian, 1466 * set the NVRAM address to write, and issue the write command 1467 */ 1468 REG_WR(sc, BCE_NVM_COMMAND, BCE_NVM_COMMAND_DONE); 1469 memcpy(&val32, val, 4); 1470 val32 = htobe32(val32); 1471 REG_WR(sc, BCE_NVM_WRITE, val32); 1472 REG_WR(sc, BCE_NVM_ADDR, offset & BCE_NVM_ADDR_NVM_ADDR_VALUE); 1473 REG_WR(sc, BCE_NVM_COMMAND, cmd); 1474 1475 /* Wait for completion. */ 1476 for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { 1477 DELAY(5); 1478 1479 if (REG_RD(sc, BCE_NVM_COMMAND) & BCE_NVM_COMMAND_DONE) 1480 break; 1481 } 1482 if (j >= NVRAM_TIMEOUT_COUNT) { 1483 BCE_PRINTF(sc, "%s(%d): Timeout error writing NVRAM at offset 0x%08X\n", 1484 __FILE__, __LINE__, offset); 1485 return EBUSY; 1486 } 1487 1488 return 0; 1489 } 1490 #endif /* BCE_NVRAM_WRITE_SUPPORT */ 1491 1492 1493 /****************************************************************************/ 1494 /* Initialize NVRAM access. */ 1495 /* */ 1496 /* Identify the NVRAM device in use and prepare the NVRAM interface to */ 1497 /* access that device. */ 1498 /* */ 1499 /* Returns: */ 1500 /* 0 on success, positive value on failure. */ 1501 /****************************************************************************/ 1502 static int 1503 bce_init_nvram(struct bce_softc *sc) 1504 { 1505 u32 val; 1506 int j, entry_count, rc; 1507 struct flash_spec *flash; 1508 1509 DBPRINT(sc,BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 1510 1511 /* Determine the selected interface. */ 1512 val = REG_RD(sc, BCE_NVM_CFG1); 1513 1514 entry_count = sizeof(flash_table) / sizeof(struct flash_spec); 1515 1516 rc = 0; 1517 1518 /* 1519 * Flash reconfiguration is required to support additional 1520 * NVRAM devices not directly supported in hardware. 1521 * Check if the flash interface was reconfigured 1522 * by the bootcode. 1523 */ 1524 1525 if (val & 0x40000000) { 1526 /* Flash interface reconfigured by bootcode. */ 1527 1528 DBPRINT(sc,BCE_INFO_LOAD, 1529 "bce_init_nvram(): Flash WAS reconfigured.\n"); 1530 1531 for (j = 0, flash = &flash_table[0]; j < entry_count; 1532 j++, flash++) { 1533 if ((val & FLASH_BACKUP_STRAP_MASK) == 1534 (flash->config1 & FLASH_BACKUP_STRAP_MASK)) { 1535 sc->bce_flash_info = flash; 1536 break; 1537 } 1538 } 1539 } else { 1540 /* Flash interface not yet reconfigured. */ 1541 u32 mask; 1542 1543 DBPRINT(sc,BCE_INFO_LOAD, 1544 "bce_init_nvram(): Flash was NOT reconfigured.\n"); 1545 1546 if (val & (1 << 23)) 1547 mask = FLASH_BACKUP_STRAP_MASK; 1548 else 1549 mask = FLASH_STRAP_MASK; 1550 1551 /* Look for the matching NVRAM device configuration data. */ 1552 for (j = 0, flash = &flash_table[0]; j < entry_count; j++, flash++) { 1553 1554 /* Check if the device matches any of the known devices. */ 1555 if ((val & mask) == (flash->strapping & mask)) { 1556 /* Found a device match. */ 1557 sc->bce_flash_info = flash; 1558 1559 /* Request access to the flash interface. */ 1560 if ((rc = bce_acquire_nvram_lock(sc)) != 0) 1561 return rc; 1562 1563 /* Reconfigure the flash interface. */ 1564 bce_enable_nvram_access(sc); 1565 REG_WR(sc, BCE_NVM_CFG1, flash->config1); 1566 REG_WR(sc, BCE_NVM_CFG2, flash->config2); 1567 REG_WR(sc, BCE_NVM_CFG3, flash->config3); 1568 REG_WR(sc, BCE_NVM_WRITE1, flash->write1); 1569 bce_disable_nvram_access(sc); 1570 bce_release_nvram_lock(sc); 1571 1572 break; 1573 } 1574 } 1575 } 1576 1577 /* Check if a matching device was found. */ 1578 if (j == entry_count) { 1579 sc->bce_flash_info = NULL; 1580 BCE_PRINTF(sc, "%s(%d): Unknown Flash NVRAM found!\n", 1581 __FILE__, __LINE__); 1582 rc = ENODEV; 1583 } 1584 1585 /* Write the flash config data to the shared memory interface. */ 1586 val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_SHARED_HW_CFG_CONFIG2); 1587 val &= BCE_SHARED_HW_CFG2_NVM_SIZE_MASK; 1588 if (val) 1589 sc->bce_flash_size = val; 1590 else 1591 sc->bce_flash_size = sc->bce_flash_info->total_size; 1592 1593 DBPRINT(sc, BCE_INFO_LOAD, "bce_init_nvram() flash->total_size = 0x%08X\n", 1594 sc->bce_flash_info->total_size); 1595 1596 DBPRINT(sc,BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 1597 1598 return rc; 1599 } 1600 1601 1602 /****************************************************************************/ 1603 /* Read an arbitrary range of data from NVRAM. */ 1604 /* */ 1605 /* Prepares the NVRAM interface for access and reads the requested data */ 1606 /* into the supplied buffer. */ 1607 /* */ 1608 /* Returns: */ 1609 /* 0 on success and the data read, positive value on failure. */ 1610 /****************************************************************************/ 1611 static int 1612 bce_nvram_read(struct bce_softc *sc, u32 offset, u8 *ret_buf, 1613 int buf_size) 1614 { 1615 int rc = 0; 1616 u32 cmd_flags, offset32, len32, extra; 1617 1618 if (buf_size == 0) 1619 return 0; 1620 1621 /* Request access to the flash interface. */ 1622 if ((rc = bce_acquire_nvram_lock(sc)) != 0) 1623 return rc; 1624 1625 /* Enable access to flash interface */ 1626 bce_enable_nvram_access(sc); 1627 1628 len32 = buf_size; 1629 offset32 = offset; 1630 extra = 0; 1631 1632 cmd_flags = 0; 1633 1634 if (offset32 & 3) { 1635 u8 buf[4]; 1636 u32 pre_len; 1637 1638 offset32 &= ~3; 1639 pre_len = 4 - (offset & 3); 1640 1641 if (pre_len >= len32) { 1642 pre_len = len32; 1643 cmd_flags = BCE_NVM_COMMAND_FIRST | BCE_NVM_COMMAND_LAST; 1644 } 1645 else { 1646 cmd_flags = BCE_NVM_COMMAND_FIRST; 1647 } 1648 1649 rc = bce_nvram_read_dword(sc, offset32, buf, cmd_flags); 1650 1651 if (rc) 1652 return rc; 1653 1654 memcpy(ret_buf, buf + (offset & 3), pre_len); 1655 1656 offset32 += 4; 1657 ret_buf += pre_len; 1658 len32 -= pre_len; 1659 } 1660 1661 if (len32 & 3) { 1662 extra = 4 - (len32 & 3); 1663 len32 = (len32 + 4) & ~3; 1664 } 1665 1666 if (len32 == 4) { 1667 u8 buf[4]; 1668 1669 if (cmd_flags) 1670 cmd_flags = BCE_NVM_COMMAND_LAST; 1671 else 1672 cmd_flags = BCE_NVM_COMMAND_FIRST | 1673 BCE_NVM_COMMAND_LAST; 1674 1675 rc = bce_nvram_read_dword(sc, offset32, buf, cmd_flags); 1676 1677 memcpy(ret_buf, buf, 4 - extra); 1678 } 1679 else if (len32 > 0) { 1680 u8 buf[4]; 1681 1682 /* Read the first word. */ 1683 if (cmd_flags) 1684 cmd_flags = 0; 1685 else 1686 cmd_flags = BCE_NVM_COMMAND_FIRST; 1687 1688 rc = bce_nvram_read_dword(sc, offset32, ret_buf, cmd_flags); 1689 1690 /* Advance to the next dword. */ 1691 offset32 += 4; 1692 ret_buf += 4; 1693 len32 -= 4; 1694 1695 while (len32 > 4 && rc == 0) { 1696 rc = bce_nvram_read_dword(sc, offset32, ret_buf, 0); 1697 1698 /* Advance to the next dword. */ 1699 offset32 += 4; 1700 ret_buf += 4; 1701 len32 -= 4; 1702 } 1703 1704 if (rc) 1705 return rc; 1706 1707 cmd_flags = BCE_NVM_COMMAND_LAST; 1708 rc = bce_nvram_read_dword(sc, offset32, buf, cmd_flags); 1709 1710 memcpy(ret_buf, buf, 4 - extra); 1711 } 1712 1713 /* Disable access to flash interface and release the lock. */ 1714 bce_disable_nvram_access(sc); 1715 bce_release_nvram_lock(sc); 1716 1717 return rc; 1718 } 1719 1720 1721 #ifdef BCE_NVRAM_WRITE_SUPPORT 1722 /****************************************************************************/ 1723 /* Write an arbitrary range of data from NVRAM. */ 1724 /* */ 1725 /* Prepares the NVRAM interface for write access and writes the requested */ 1726 /* data from the supplied buffer. The caller is responsible for */ 1727 /* calculating any appropriate CRCs. */ 1728 /* */ 1729 /* Returns: */ 1730 /* 0 on success, positive value on failure. */ 1731 /****************************************************************************/ 1732 static int 1733 bce_nvram_write(struct bce_softc *sc, u32 offset, u8 *data_buf, 1734 int buf_size) 1735 { 1736 u32 written, offset32, len32; 1737 u8 *buf, start[4], end[4]; 1738 int rc = 0; 1739 int align_start, align_end; 1740 1741 buf = data_buf; 1742 offset32 = offset; 1743 len32 = buf_size; 1744 align_start = align_end = 0; 1745 1746 if ((align_start = (offset32 & 3))) { 1747 offset32 &= ~3; 1748 len32 += align_start; 1749 if ((rc = bce_nvram_read(sc, offset32, start, 4))) 1750 return rc; 1751 } 1752 1753 if (len32 & 3) { 1754 if ((len32 > 4) || !align_start) { 1755 align_end = 4 - (len32 & 3); 1756 len32 += align_end; 1757 if ((rc = bce_nvram_read(sc, offset32 + len32 - 4, 1758 end, 4))) { 1759 return rc; 1760 } 1761 } 1762 } 1763 1764 if (align_start || align_end) { 1765 buf = malloc(len32, M_DEVBUF, M_NOWAIT); 1766 if (buf == 0) 1767 return ENOMEM; 1768 if (align_start) { 1769 memcpy(buf, start, 4); 1770 } 1771 if (align_end) { 1772 memcpy(buf + len32 - 4, end, 4); 1773 } 1774 memcpy(buf + align_start, data_buf, buf_size); 1775 } 1776 1777 written = 0; 1778 while ((written < len32) && (rc == 0)) { 1779 u32 page_start, page_end, data_start, data_end; 1780 u32 addr, cmd_flags; 1781 int i; 1782 u8 flash_buffer[264]; 1783 1784 /* Find the page_start addr */ 1785 page_start = offset32 + written; 1786 page_start -= (page_start % sc->bce_flash_info->page_size); 1787 /* Find the page_end addr */ 1788 page_end = page_start + sc->bce_flash_info->page_size; 1789 /* Find the data_start addr */ 1790 data_start = (written == 0) ? offset32 : page_start; 1791 /* Find the data_end addr */ 1792 data_end = (page_end > offset32 + len32) ? 1793 (offset32 + len32) : page_end; 1794 1795 /* Request access to the flash interface. */ 1796 if ((rc = bce_acquire_nvram_lock(sc)) != 0) 1797 goto nvram_write_end; 1798 1799 /* Enable access to flash interface */ 1800 bce_enable_nvram_access(sc); 1801 1802 cmd_flags = BCE_NVM_COMMAND_FIRST; 1803 if (sc->bce_flash_info->buffered == 0) { 1804 int j; 1805 1806 /* Read the whole page into the buffer 1807 * (non-buffer flash only) */ 1808 for (j = 0; j < sc->bce_flash_info->page_size; j += 4) { 1809 if (j == (sc->bce_flash_info->page_size - 4)) { 1810 cmd_flags |= BCE_NVM_COMMAND_LAST; 1811 } 1812 rc = bce_nvram_read_dword(sc, 1813 page_start + j, 1814 &flash_buffer[j], 1815 cmd_flags); 1816 1817 if (rc) 1818 goto nvram_write_end; 1819 1820 cmd_flags = 0; 1821 } 1822 } 1823 1824 /* Enable writes to flash interface (unlock write-protect) */ 1825 if ((rc = bce_enable_nvram_write(sc)) != 0) 1826 goto nvram_write_end; 1827 1828 /* Erase the page */ 1829 if ((rc = bce_nvram_erase_page(sc, page_start)) != 0) 1830 goto nvram_write_end; 1831 1832 /* Re-enable the write again for the actual write */ 1833 bce_enable_nvram_write(sc); 1834 1835 /* Loop to write back the buffer data from page_start to 1836 * data_start */ 1837 i = 0; 1838 if (sc->bce_flash_info->buffered == 0) { 1839 for (addr = page_start; addr < data_start; 1840 addr += 4, i += 4) { 1841 1842 rc = bce_nvram_write_dword(sc, addr, 1843 &flash_buffer[i], cmd_flags); 1844 1845 if (rc != 0) 1846 goto nvram_write_end; 1847 1848 cmd_flags = 0; 1849 } 1850 } 1851 1852 /* Loop to write the new data from data_start to data_end */ 1853 for (addr = data_start; addr < data_end; addr += 4, i++) { 1854 if ((addr == page_end - 4) || 1855 ((sc->bce_flash_info->buffered) && 1856 (addr == data_end - 4))) { 1857 1858 cmd_flags |= BCE_NVM_COMMAND_LAST; 1859 } 1860 rc = bce_nvram_write_dword(sc, addr, buf, 1861 cmd_flags); 1862 1863 if (rc != 0) 1864 goto nvram_write_end; 1865 1866 cmd_flags = 0; 1867 buf += 4; 1868 } 1869 1870 /* Loop to write back the buffer data from data_end 1871 * to page_end */ 1872 if (sc->bce_flash_info->buffered == 0) { 1873 for (addr = data_end; addr < page_end; 1874 addr += 4, i += 4) { 1875 1876 if (addr == page_end-4) { 1877 cmd_flags = BCE_NVM_COMMAND_LAST; 1878 } 1879 rc = bce_nvram_write_dword(sc, addr, 1880 &flash_buffer[i], cmd_flags); 1881 1882 if (rc != 0) 1883 goto nvram_write_end; 1884 1885 cmd_flags = 0; 1886 } 1887 } 1888 1889 /* Disable writes to flash interface (lock write-protect) */ 1890 bce_disable_nvram_write(sc); 1891 1892 /* Disable access to flash interface */ 1893 bce_disable_nvram_access(sc); 1894 bce_release_nvram_lock(sc); 1895 1896 /* Increment written */ 1897 written += data_end - data_start; 1898 } 1899 1900 nvram_write_end: 1901 if (align_start || align_end) 1902 free(buf, M_DEVBUF); 1903 1904 return rc; 1905 } 1906 #endif /* BCE_NVRAM_WRITE_SUPPORT */ 1907 1908 1909 /****************************************************************************/ 1910 /* Verifies that NVRAM is accessible and contains valid data. */ 1911 /* */ 1912 /* Reads the configuration data from NVRAM and verifies that the CRC is */ 1913 /* correct. */ 1914 /* */ 1915 /* Returns: */ 1916 /* 0 on success, positive value on failure. */ 1917 /****************************************************************************/ 1918 static int 1919 bce_nvram_test(struct bce_softc *sc) 1920 { 1921 u32 buf[BCE_NVRAM_SIZE / 4]; 1922 u8 *data = (u8 *) buf; 1923 int rc = 0; 1924 u32 magic, csum; 1925 1926 1927 /* 1928 * Check that the device NVRAM is valid by reading 1929 * the magic value at offset 0. 1930 */ 1931 if ((rc = bce_nvram_read(sc, 0, data, 4)) != 0) 1932 goto bce_nvram_test_done; 1933 1934 1935 magic = bce_be32toh(buf[0]); 1936 if (magic != BCE_NVRAM_MAGIC) { 1937 rc = ENODEV; 1938 BCE_PRINTF(sc, "%s(%d): Invalid NVRAM magic value! Expected: 0x%08X, " 1939 "Found: 0x%08X\n", 1940 __FILE__, __LINE__, BCE_NVRAM_MAGIC, magic); 1941 goto bce_nvram_test_done; 1942 } 1943 1944 /* 1945 * Verify that the device NVRAM includes valid 1946 * configuration data. 1947 */ 1948 if ((rc = bce_nvram_read(sc, 0x100, data, BCE_NVRAM_SIZE)) != 0) 1949 goto bce_nvram_test_done; 1950 1951 csum = ether_crc32_le(data, 0x100); 1952 if (csum != BCE_CRC32_RESIDUAL) { 1953 rc = ENODEV; 1954 BCE_PRINTF(sc, "%s(%d): Invalid Manufacturing Information NVRAM CRC! " 1955 "Expected: 0x%08X, Found: 0x%08X\n", 1956 __FILE__, __LINE__, BCE_CRC32_RESIDUAL, csum); 1957 goto bce_nvram_test_done; 1958 } 1959 1960 csum = ether_crc32_le(data + 0x100, 0x100); 1961 if (csum != BCE_CRC32_RESIDUAL) { 1962 BCE_PRINTF(sc, "%s(%d): Invalid Feature Configuration Information " 1963 "NVRAM CRC! Expected: 0x%08X, Found: 08%08X\n", 1964 __FILE__, __LINE__, BCE_CRC32_RESIDUAL, csum); 1965 rc = ENODEV; 1966 } 1967 1968 bce_nvram_test_done: 1969 return rc; 1970 } 1971 1972 1973 /****************************************************************************/ 1974 /* Free any DMA memory owned by the driver. */ 1975 /* */ 1976 /* Scans through each data structre that requires DMA memory and frees */ 1977 /* the memory if allocated. */ 1978 /* */ 1979 /* Returns: */ 1980 /* Nothing. */ 1981 /****************************************************************************/ 1982 static void 1983 bce_dma_free(struct bce_softc *sc) 1984 { 1985 int i; 1986 1987 DBPRINT(sc,BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 1988 1989 /* Destroy the status block. */ 1990 if (sc->status_block != NULL) 1991 bus_dmamem_free( 1992 sc->status_tag, 1993 sc->status_block, 1994 sc->status_map); 1995 1996 if (sc->status_map != NULL) { 1997 bus_dmamap_unload( 1998 sc->status_tag, 1999 sc->status_map); 2000 bus_dmamap_destroy(sc->status_tag, 2001 sc->status_map); 2002 } 2003 2004 if (sc->status_tag != NULL) 2005 bus_dma_tag_destroy(sc->status_tag); 2006 2007 2008 /* Destroy the statistics block. */ 2009 if (sc->stats_block != NULL) 2010 bus_dmamem_free( 2011 sc->stats_tag, 2012 sc->stats_block, 2013 sc->stats_map); 2014 2015 if (sc->stats_map != NULL) { 2016 bus_dmamap_unload( 2017 sc->stats_tag, 2018 sc->stats_map); 2019 bus_dmamap_destroy(sc->stats_tag, 2020 sc->stats_map); 2021 } 2022 2023 if (sc->stats_tag != NULL) 2024 bus_dma_tag_destroy(sc->stats_tag); 2025 2026 2027 /* Free, unmap and destroy all TX buffer descriptor chain pages. */ 2028 for (i = 0; i < TX_PAGES; i++ ) { 2029 if (sc->tx_bd_chain[i] != NULL) 2030 bus_dmamem_free( 2031 sc->tx_bd_chain_tag, 2032 sc->tx_bd_chain[i], 2033 sc->tx_bd_chain_map[i]); 2034 2035 if (sc->tx_bd_chain_map[i] != NULL) { 2036 bus_dmamap_unload( 2037 sc->tx_bd_chain_tag, 2038 sc->tx_bd_chain_map[i]); 2039 bus_dmamap_destroy( 2040 sc->tx_bd_chain_tag, 2041 sc->tx_bd_chain_map[i]); 2042 } 2043 2044 } 2045 2046 /* Destroy the TX buffer descriptor tag. */ 2047 if (sc->tx_bd_chain_tag != NULL) 2048 bus_dma_tag_destroy(sc->tx_bd_chain_tag); 2049 2050 2051 /* Free, unmap and destroy all RX buffer descriptor chain pages. */ 2052 for (i = 0; i < RX_PAGES; i++ ) { 2053 if (sc->rx_bd_chain[i] != NULL) 2054 bus_dmamem_free( 2055 sc->rx_bd_chain_tag, 2056 sc->rx_bd_chain[i], 2057 sc->rx_bd_chain_map[i]); 2058 2059 if (sc->rx_bd_chain_map[i] != NULL) { 2060 bus_dmamap_unload( 2061 sc->rx_bd_chain_tag, 2062 sc->rx_bd_chain_map[i]); 2063 bus_dmamap_destroy( 2064 sc->rx_bd_chain_tag, 2065 sc->rx_bd_chain_map[i]); 2066 } 2067 } 2068 2069 /* Destroy the RX buffer descriptor tag. */ 2070 if (sc->rx_bd_chain_tag != NULL) 2071 bus_dma_tag_destroy(sc->rx_bd_chain_tag); 2072 2073 2074 /* Unload and destroy the TX mbuf maps. */ 2075 for (i = 0; i < TOTAL_TX_BD; i++) { 2076 if (sc->tx_mbuf_map[i] != NULL) { 2077 bus_dmamap_unload(sc->tx_mbuf_tag, 2078 sc->tx_mbuf_map[i]); 2079 bus_dmamap_destroy(sc->tx_mbuf_tag, 2080 sc->tx_mbuf_map[i]); 2081 } 2082 } 2083 2084 /* Destroy the TX mbuf tag. */ 2085 if (sc->tx_mbuf_tag != NULL) 2086 bus_dma_tag_destroy(sc->tx_mbuf_tag); 2087 2088 2089 /* Unload and destroy the RX mbuf maps. */ 2090 for (i = 0; i < TOTAL_RX_BD; i++) { 2091 if (sc->rx_mbuf_map[i] != NULL) { 2092 bus_dmamap_unload(sc->rx_mbuf_tag, 2093 sc->rx_mbuf_map[i]); 2094 bus_dmamap_destroy(sc->rx_mbuf_tag, 2095 sc->rx_mbuf_map[i]); 2096 } 2097 } 2098 2099 /* Destroy the RX mbuf tag. */ 2100 if (sc->rx_mbuf_tag != NULL) 2101 bus_dma_tag_destroy(sc->rx_mbuf_tag); 2102 2103 2104 /* Destroy the parent tag */ 2105 if (sc->parent_tag != NULL) 2106 bus_dma_tag_destroy(sc->parent_tag); 2107 2108 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 2109 2110 } 2111 2112 2113 /****************************************************************************/ 2114 /* Get DMA memory from the OS. */ 2115 /* */ 2116 /* Validates that the OS has provided DMA buffers in response to a */ 2117 /* bus_dmamap_load() call and saves the physical address of those buffers. */ 2118 /* When the callback is used the OS will return 0 for the mapping function */ 2119 /* (bus_dmamap_load()) so we use the value of map_arg->maxsegs to pass any */ 2120 /* failures back to the caller. */ 2121 /* */ 2122 /* Returns: */ 2123 /* Nothing. */ 2124 /****************************************************************************/ 2125 static void 2126 bce_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) 2127 { 2128 struct bce_dmamap_arg *map_arg = arg; 2129 struct bce_softc *sc = map_arg->sc; 2130 2131 /* Simulate a mapping failure. */ 2132 DBRUNIF(DB_RANDOMTRUE(bce_debug_dma_map_addr_failure), 2133 BCE_PRINTF(sc, "%s(%d): Simulating DMA mapping error.\n", 2134 __FILE__, __LINE__); 2135 error = ENOMEM); 2136 2137 /* Check for an error and signal the caller that an error occurred. */ 2138 if (error || (nseg > map_arg->maxsegs)) { 2139 BCE_PRINTF(sc, "%s(%d): DMA mapping error! error = %d, " 2140 "nseg = %d, maxsegs = %d\n", 2141 __FILE__, __LINE__, error, nseg, map_arg->maxsegs); 2142 map_arg->maxsegs = 0; 2143 goto bce_dma_map_addr_exit; 2144 } 2145 2146 map_arg->busaddr = segs->ds_addr; 2147 2148 bce_dma_map_addr_exit: 2149 return; 2150 } 2151 2152 2153 /****************************************************************************/ 2154 /* Map TX buffers into TX buffer descriptors. */ 2155 /* */ 2156 /* Given a series of DMA memory containting an outgoing frame, map the */ 2157 /* segments into the tx_bd structure used by the hardware. */ 2158 /* */ 2159 /* Returns: */ 2160 /* Nothing. */ 2161 /****************************************************************************/ 2162 static void 2163 bce_dma_map_tx_desc(void *arg, bus_dma_segment_t *segs, 2164 int nseg, bus_size_t mapsize, int error) 2165 { 2166 struct bce_dmamap_arg *map_arg; 2167 struct bce_softc *sc; 2168 struct tx_bd *txbd = NULL; 2169 int i = 0; 2170 u16 prod, chain_prod; 2171 u32 prod_bseq; 2172 #ifdef BCE_DEBUG 2173 u16 debug_prod; 2174 #endif 2175 2176 map_arg = arg; 2177 sc = map_arg->sc; 2178 2179 if (error) { 2180 DBPRINT(sc, BCE_WARN, "%s(): Called with error = %d\n", 2181 __FUNCTION__, error); 2182 return; 2183 } 2184 2185 /* Signal error to caller if there's too many segments */ 2186 if (nseg > map_arg->maxsegs) { 2187 DBPRINT(sc, BCE_WARN, 2188 "%s(): Mapped TX descriptors: max segs = %d, " 2189 "actual segs = %d\n", 2190 __FUNCTION__, map_arg->maxsegs, nseg); 2191 2192 map_arg->maxsegs = 0; 2193 return; 2194 } 2195 2196 /* prod points to an empty tx_bd at this point. */ 2197 prod = map_arg->prod; 2198 chain_prod = map_arg->chain_prod; 2199 prod_bseq = map_arg->prod_bseq; 2200 2201 #ifdef BCE_DEBUG 2202 debug_prod = chain_prod; 2203 #endif 2204 2205 DBPRINT(sc, BCE_INFO_SEND, 2206 "%s(): Start: prod = 0x%04X, chain_prod = %04X, " 2207 "prod_bseq = 0x%08X\n", 2208 __FUNCTION__, prod, chain_prod, prod_bseq); 2209 2210 /* 2211 * Cycle through each mbuf segment that makes up 2212 * the outgoing frame, gathering the mapping info 2213 * for that segment and creating a tx_bd to for 2214 * the mbuf. 2215 */ 2216 2217 txbd = &map_arg->tx_chain[TX_PAGE(chain_prod)][TX_IDX(chain_prod)]; 2218 2219 /* Setup the first tx_bd for the first segment. */ 2220 txbd->tx_bd_haddr_lo = htole32(BCE_ADDR_LO(segs[i].ds_addr)); 2221 txbd->tx_bd_haddr_hi = htole32(BCE_ADDR_HI(segs[i].ds_addr)); 2222 txbd->tx_bd_mss_nbytes = htole16(segs[i].ds_len); 2223 txbd->tx_bd_vlan_tag_flags = htole16(map_arg->tx_flags | 2224 TX_BD_FLAGS_START); 2225 prod_bseq += segs[i].ds_len; 2226 2227 /* Setup any remaing segments. */ 2228 for (i = 1; i < nseg; i++) { 2229 prod = NEXT_TX_BD(prod); 2230 chain_prod = TX_CHAIN_IDX(prod); 2231 2232 txbd = &map_arg->tx_chain[TX_PAGE(chain_prod)][TX_IDX(chain_prod)]; 2233 2234 txbd->tx_bd_haddr_lo = htole32(BCE_ADDR_LO(segs[i].ds_addr)); 2235 txbd->tx_bd_haddr_hi = htole32(BCE_ADDR_HI(segs[i].ds_addr)); 2236 txbd->tx_bd_mss_nbytes = htole16(segs[i].ds_len); 2237 txbd->tx_bd_vlan_tag_flags = htole16(map_arg->tx_flags); 2238 2239 prod_bseq += segs[i].ds_len; 2240 } 2241 2242 /* Set the END flag on the last TX buffer descriptor. */ 2243 txbd->tx_bd_vlan_tag_flags |= htole16(TX_BD_FLAGS_END); 2244 2245 DBRUN(BCE_INFO_SEND, bce_dump_tx_chain(sc, debug_prod, nseg)); 2246 2247 DBPRINT(sc, BCE_INFO_SEND, 2248 "%s(): End: prod = 0x%04X, chain_prod = %04X, " 2249 "prod_bseq = 0x%08X\n", 2250 __FUNCTION__, prod, chain_prod, prod_bseq); 2251 2252 /* prod points to the last tx_bd at this point. */ 2253 map_arg->maxsegs = nseg; 2254 map_arg->prod = prod; 2255 map_arg->chain_prod = chain_prod; 2256 map_arg->prod_bseq = prod_bseq; 2257 } 2258 2259 2260 /****************************************************************************/ 2261 /* Allocate any DMA memory needed by the driver. */ 2262 /* */ 2263 /* Allocates DMA memory needed for the various global structures needed by */ 2264 /* hardware. */ 2265 /* */ 2266 /* Returns: */ 2267 /* 0 for success, positive value for failure. */ 2268 /****************************************************************************/ 2269 static int 2270 bce_dma_alloc(device_t dev) 2271 { 2272 struct bce_softc *sc; 2273 int i, error, rc = 0; 2274 struct bce_dmamap_arg map_arg; 2275 2276 sc = device_get_softc(dev); 2277 2278 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 2279 2280 /* 2281 * Allocate the parent bus DMA tag appropriate for PCI. 2282 */ 2283 if (bus_dma_tag_create(NULL, /* parent */ 2284 BCE_DMA_ALIGN, /* alignment */ 2285 BCE_DMA_BOUNDARY, /* boundary */ 2286 sc->max_bus_addr, /* lowaddr */ 2287 BUS_SPACE_MAXADDR, /* highaddr */ 2288 NULL, /* filterfunc */ 2289 NULL, /* filterarg */ 2290 MAXBSIZE, /* maxsize */ 2291 BUS_SPACE_UNRESTRICTED, /* nsegments */ 2292 BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ 2293 0, /* flags */ 2294 NULL, /* locfunc */ 2295 NULL, /* lockarg */ 2296 &sc->parent_tag)) { 2297 BCE_PRINTF(sc, "%s(%d): Could not allocate parent DMA tag!\n", 2298 __FILE__, __LINE__); 2299 rc = ENOMEM; 2300 goto bce_dma_alloc_exit; 2301 } 2302 2303 /* 2304 * Create a DMA tag for the status block, allocate and clear the 2305 * memory, map the memory into DMA space, and fetch the physical 2306 * address of the block. 2307 */ 2308 if (bus_dma_tag_create( 2309 sc->parent_tag, /* parent */ 2310 BCE_DMA_ALIGN, /* alignment */ 2311 BCE_DMA_BOUNDARY, /* boundary */ 2312 sc->max_bus_addr, /* lowaddr */ 2313 BUS_SPACE_MAXADDR, /* highaddr */ 2314 NULL, /* filterfunc */ 2315 NULL, /* filterarg */ 2316 BCE_STATUS_BLK_SZ, /* maxsize */ 2317 1, /* nsegments */ 2318 BCE_STATUS_BLK_SZ, /* maxsegsize */ 2319 0, /* flags */ 2320 NULL, /* lockfunc */ 2321 NULL, /* lockarg */ 2322 &sc->status_tag)) { 2323 BCE_PRINTF(sc, "%s(%d): Could not allocate status block DMA tag!\n", 2324 __FILE__, __LINE__); 2325 rc = ENOMEM; 2326 goto bce_dma_alloc_exit; 2327 } 2328 2329 if(bus_dmamem_alloc( 2330 sc->status_tag, /* dmat */ 2331 (void **)&sc->status_block, /* vaddr */ 2332 BUS_DMA_NOWAIT, /* flags */ 2333 &sc->status_map)) { 2334 BCE_PRINTF(sc, "%s(%d): Could not allocate status block DMA memory!\n", 2335 __FILE__, __LINE__); 2336 rc = ENOMEM; 2337 goto bce_dma_alloc_exit; 2338 } 2339 2340 bzero((char *)sc->status_block, BCE_STATUS_BLK_SZ); 2341 2342 map_arg.sc = sc; 2343 map_arg.maxsegs = 1; 2344 2345 error = bus_dmamap_load( 2346 sc->status_tag, /* dmat */ 2347 sc->status_map, /* map */ 2348 sc->status_block, /* buf */ 2349 BCE_STATUS_BLK_SZ, /* buflen */ 2350 bce_dma_map_addr, /* callback */ 2351 &map_arg, /* callbackarg */ 2352 BUS_DMA_NOWAIT); /* flags */ 2353 2354 if(error || (map_arg.maxsegs == 0)) { 2355 BCE_PRINTF(sc, "%s(%d): Could not map status block DMA memory!\n", 2356 __FILE__, __LINE__); 2357 rc = ENOMEM; 2358 goto bce_dma_alloc_exit; 2359 } 2360 2361 sc->status_block_paddr = map_arg.busaddr; 2362 /* DRC - Fix for 64 bit addresses. */ 2363 DBPRINT(sc, BCE_INFO, "status_block_paddr = 0x%08X\n", 2364 (u32) sc->status_block_paddr); 2365 2366 /* 2367 * Create a DMA tag for the statistics block, allocate and clear the 2368 * memory, map the memory into DMA space, and fetch the physical 2369 * address of the block. 2370 */ 2371 if (bus_dma_tag_create( 2372 sc->parent_tag, /* parent */ 2373 BCE_DMA_ALIGN, /* alignment */ 2374 BCE_DMA_BOUNDARY, /* boundary */ 2375 sc->max_bus_addr, /* lowaddr */ 2376 BUS_SPACE_MAXADDR, /* highaddr */ 2377 NULL, /* filterfunc */ 2378 NULL, /* filterarg */ 2379 BCE_STATS_BLK_SZ, /* maxsize */ 2380 1, /* nsegments */ 2381 BCE_STATS_BLK_SZ, /* maxsegsize */ 2382 0, /* flags */ 2383 NULL, /* lockfunc */ 2384 NULL, /* lockarg */ 2385 &sc->stats_tag)) { 2386 BCE_PRINTF(sc, "%s(%d): Could not allocate statistics block DMA tag!\n", 2387 __FILE__, __LINE__); 2388 rc = ENOMEM; 2389 goto bce_dma_alloc_exit; 2390 } 2391 2392 if (bus_dmamem_alloc( 2393 sc->stats_tag, /* dmat */ 2394 (void **)&sc->stats_block, /* vaddr */ 2395 BUS_DMA_NOWAIT, /* flags */ 2396 &sc->stats_map)) { 2397 BCE_PRINTF(sc, "%s(%d): Could not allocate statistics block DMA memory!\n", 2398 __FILE__, __LINE__); 2399 rc = ENOMEM; 2400 goto bce_dma_alloc_exit; 2401 } 2402 2403 bzero((char *)sc->stats_block, BCE_STATS_BLK_SZ); 2404 2405 map_arg.sc = sc; 2406 map_arg.maxsegs = 1; 2407 2408 error = bus_dmamap_load( 2409 sc->stats_tag, /* dmat */ 2410 sc->stats_map, /* map */ 2411 sc->stats_block, /* buf */ 2412 BCE_STATS_BLK_SZ, /* buflen */ 2413 bce_dma_map_addr, /* callback */ 2414 &map_arg, /* callbackarg */ 2415 BUS_DMA_NOWAIT); /* flags */ 2416 2417 if(error || (map_arg.maxsegs == 0)) { 2418 BCE_PRINTF(sc, "%s(%d): Could not map statistics block DMA memory!\n", 2419 __FILE__, __LINE__); 2420 rc = ENOMEM; 2421 goto bce_dma_alloc_exit; 2422 } 2423 2424 sc->stats_block_paddr = map_arg.busaddr; 2425 /* DRC - Fix for 64 bit address. */ 2426 DBPRINT(sc,BCE_INFO, "stats_block_paddr = 0x%08X\n", 2427 (u32) sc->stats_block_paddr); 2428 2429 /* 2430 * Create a DMA tag for the TX buffer descriptor chain, 2431 * allocate and clear the memory, and fetch the 2432 * physical address of the block. 2433 */ 2434 if(bus_dma_tag_create( 2435 sc->parent_tag, /* parent */ 2436 BCM_PAGE_SIZE, /* alignment */ 2437 BCE_DMA_BOUNDARY, /* boundary */ 2438 sc->max_bus_addr, /* lowaddr */ 2439 BUS_SPACE_MAXADDR, /* highaddr */ 2440 NULL, /* filterfunc */ 2441 NULL, /* filterarg */ 2442 BCE_TX_CHAIN_PAGE_SZ, /* maxsize */ 2443 1, /* nsegments */ 2444 BCE_TX_CHAIN_PAGE_SZ, /* maxsegsize */ 2445 0, /* flags */ 2446 NULL, /* lockfunc */ 2447 NULL, /* lockarg */ 2448 &sc->tx_bd_chain_tag)) { 2449 BCE_PRINTF(sc, "%s(%d): Could not allocate TX descriptor chain DMA tag!\n", 2450 __FILE__, __LINE__); 2451 rc = ENOMEM; 2452 goto bce_dma_alloc_exit; 2453 } 2454 2455 for (i = 0; i < TX_PAGES; i++) { 2456 2457 if(bus_dmamem_alloc( 2458 sc->tx_bd_chain_tag, /* tag */ 2459 (void **)&sc->tx_bd_chain[i], /* vaddr */ 2460 BUS_DMA_NOWAIT, /* flags */ 2461 &sc->tx_bd_chain_map[i])) { 2462 BCE_PRINTF(sc, "%s(%d): Could not allocate TX descriptor " 2463 "chain DMA memory!\n", __FILE__, __LINE__); 2464 rc = ENOMEM; 2465 goto bce_dma_alloc_exit; 2466 } 2467 2468 map_arg.maxsegs = 1; 2469 map_arg.sc = sc; 2470 2471 error = bus_dmamap_load( 2472 sc->tx_bd_chain_tag, /* dmat */ 2473 sc->tx_bd_chain_map[i], /* map */ 2474 sc->tx_bd_chain[i], /* buf */ 2475 BCE_TX_CHAIN_PAGE_SZ, /* buflen */ 2476 bce_dma_map_addr, /* callback */ 2477 &map_arg, /* callbackarg */ 2478 BUS_DMA_NOWAIT); /* flags */ 2479 2480 if(error || (map_arg.maxsegs == 0)) { 2481 BCE_PRINTF(sc, "%s(%d): Could not map TX descriptor chain DMA memory!\n", 2482 __FILE__, __LINE__); 2483 rc = ENOMEM; 2484 goto bce_dma_alloc_exit; 2485 } 2486 2487 sc->tx_bd_chain_paddr[i] = map_arg.busaddr; 2488 /* DRC - Fix for 64 bit systems. */ 2489 DBPRINT(sc, BCE_INFO, "tx_bd_chain_paddr[%d] = 0x%08X\n", 2490 i, (u32) sc->tx_bd_chain_paddr[i]); 2491 } 2492 2493 /* Create a DMA tag for TX mbufs. */ 2494 if (bus_dma_tag_create( 2495 sc->parent_tag, /* parent */ 2496 BCE_DMA_ALIGN, /* alignment */ 2497 BCE_DMA_BOUNDARY, /* boundary */ 2498 sc->max_bus_addr, /* lowaddr */ 2499 BUS_SPACE_MAXADDR, /* highaddr */ 2500 NULL, /* filterfunc */ 2501 NULL, /* filterarg */ 2502 MCLBYTES * BCE_MAX_SEGMENTS, /* maxsize */ 2503 BCE_MAX_SEGMENTS, /* nsegments */ 2504 MCLBYTES, /* maxsegsize */ 2505 0, /* flags */ 2506 NULL, /* lockfunc */ 2507 NULL, /* lockarg */ 2508 &sc->tx_mbuf_tag)) { 2509 BCE_PRINTF(sc, "%s(%d): Could not allocate TX mbuf DMA tag!\n", 2510 __FILE__, __LINE__); 2511 rc = ENOMEM; 2512 goto bce_dma_alloc_exit; 2513 } 2514 2515 /* Create DMA maps for the TX mbufs clusters. */ 2516 for (i = 0; i < TOTAL_TX_BD; i++) { 2517 if (bus_dmamap_create(sc->tx_mbuf_tag, BUS_DMA_NOWAIT, 2518 &sc->tx_mbuf_map[i])) { 2519 BCE_PRINTF(sc, "%s(%d): Unable to create TX mbuf DMA map!\n", 2520 __FILE__, __LINE__); 2521 rc = ENOMEM; 2522 goto bce_dma_alloc_exit; 2523 } 2524 } 2525 2526 /* 2527 * Create a DMA tag for the RX buffer descriptor chain, 2528 * allocate and clear the memory, and fetch the physical 2529 * address of the blocks. 2530 */ 2531 if (bus_dma_tag_create( 2532 sc->parent_tag, /* parent */ 2533 BCM_PAGE_SIZE, /* alignment */ 2534 BCE_DMA_BOUNDARY, /* boundary */ 2535 BUS_SPACE_MAXADDR, /* lowaddr */ 2536 sc->max_bus_addr, /* lowaddr */ 2537 NULL, /* filter */ 2538 NULL, /* filterarg */ 2539 BCE_RX_CHAIN_PAGE_SZ, /* maxsize */ 2540 1, /* nsegments */ 2541 BCE_RX_CHAIN_PAGE_SZ, /* maxsegsize */ 2542 0, /* flags */ 2543 NULL, /* lockfunc */ 2544 NULL, /* lockarg */ 2545 &sc->rx_bd_chain_tag)) { 2546 BCE_PRINTF(sc, "%s(%d): Could not allocate RX descriptor chain DMA tag!\n", 2547 __FILE__, __LINE__); 2548 rc = ENOMEM; 2549 goto bce_dma_alloc_exit; 2550 } 2551 2552 for (i = 0; i < RX_PAGES; i++) { 2553 2554 if (bus_dmamem_alloc( 2555 sc->rx_bd_chain_tag, /* tag */ 2556 (void **)&sc->rx_bd_chain[i], /* vaddr */ 2557 BUS_DMA_NOWAIT, /* flags */ 2558 &sc->rx_bd_chain_map[i])) { 2559 BCE_PRINTF(sc, "%s(%d): Could not allocate RX descriptor chain " 2560 "DMA memory!\n", __FILE__, __LINE__); 2561 rc = ENOMEM; 2562 goto bce_dma_alloc_exit; 2563 } 2564 2565 bzero((char *)sc->rx_bd_chain[i], BCE_RX_CHAIN_PAGE_SZ); 2566 2567 map_arg.maxsegs = 1; 2568 map_arg.sc = sc; 2569 2570 error = bus_dmamap_load( 2571 sc->rx_bd_chain_tag, /* dmat */ 2572 sc->rx_bd_chain_map[i], /* map */ 2573 sc->rx_bd_chain[i], /* buf */ 2574 BCE_RX_CHAIN_PAGE_SZ, /* buflen */ 2575 bce_dma_map_addr, /* callback */ 2576 &map_arg, /* callbackarg */ 2577 BUS_DMA_NOWAIT); /* flags */ 2578 2579 if(error || (map_arg.maxsegs == 0)) { 2580 BCE_PRINTF(sc, "%s(%d): Could not map RX descriptor chain DMA memory!\n", 2581 __FILE__, __LINE__); 2582 rc = ENOMEM; 2583 goto bce_dma_alloc_exit; 2584 } 2585 2586 sc->rx_bd_chain_paddr[i] = map_arg.busaddr; 2587 /* DRC - Fix for 64 bit systems. */ 2588 DBPRINT(sc, BCE_INFO, "rx_bd_chain_paddr[%d] = 0x%08X\n", 2589 i, (u32) sc->rx_bd_chain_paddr[i]); 2590 } 2591 2592 /* 2593 * Create a DMA tag for RX mbufs. 2594 */ 2595 if (bus_dma_tag_create( 2596 sc->parent_tag, /* parent */ 2597 BCE_DMA_ALIGN, /* alignment */ 2598 BCE_DMA_BOUNDARY, /* boundary */ 2599 sc->max_bus_addr, /* lowaddr */ 2600 BUS_SPACE_MAXADDR, /* highaddr */ 2601 NULL, /* filterfunc */ 2602 NULL, /* filterarg */ 2603 MJUM9BYTES, /* maxsize */ 2604 BCE_MAX_SEGMENTS, /* nsegments */ 2605 MJUM9BYTES, /* maxsegsize */ 2606 0, /* flags */ 2607 NULL, /* lockfunc */ 2608 NULL, /* lockarg */ 2609 &sc->rx_mbuf_tag)) { 2610 BCE_PRINTF(sc, "%s(%d): Could not allocate RX mbuf DMA tag!\n", 2611 __FILE__, __LINE__); 2612 rc = ENOMEM; 2613 goto bce_dma_alloc_exit; 2614 } 2615 2616 /* Create DMA maps for the RX mbuf clusters. */ 2617 for (i = 0; i < TOTAL_RX_BD; i++) { 2618 if (bus_dmamap_create(sc->rx_mbuf_tag, BUS_DMA_NOWAIT, 2619 &sc->rx_mbuf_map[i])) { 2620 BCE_PRINTF(sc, "%s(%d): Unable to create RX mbuf DMA map!\n", 2621 __FILE__, __LINE__); 2622 rc = ENOMEM; 2623 goto bce_dma_alloc_exit; 2624 } 2625 } 2626 2627 bce_dma_alloc_exit: 2628 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 2629 2630 return(rc); 2631 } 2632 2633 2634 /****************************************************************************/ 2635 /* Release all resources used by the driver. */ 2636 /* */ 2637 /* Releases all resources acquired by the driver including interrupts, */ 2638 /* interrupt handler, interfaces, mutexes, and DMA memory. */ 2639 /* */ 2640 /* Returns: */ 2641 /* Nothing. */ 2642 /****************************************************************************/ 2643 static void 2644 bce_release_resources(struct bce_softc *sc) 2645 { 2646 device_t dev; 2647 2648 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 2649 2650 dev = sc->bce_dev; 2651 2652 bce_dma_free(sc); 2653 2654 if (sc->bce_intrhand != NULL) 2655 bus_teardown_intr(dev, sc->bce_irq, sc->bce_intrhand); 2656 2657 if (sc->bce_irq != NULL) 2658 bus_release_resource(dev, 2659 SYS_RES_IRQ, 2660 0, 2661 sc->bce_irq); 2662 2663 if (sc->bce_res != NULL) 2664 bus_release_resource(dev, 2665 SYS_RES_MEMORY, 2666 PCIR_BAR(0), 2667 sc->bce_res); 2668 2669 if (sc->bce_ifp != NULL) 2670 if_free(sc->bce_ifp); 2671 2672 2673 if (mtx_initialized(&sc->bce_mtx)) 2674 BCE_LOCK_DESTROY(sc); 2675 2676 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 2677 2678 } 2679 2680 2681 /****************************************************************************/ 2682 /* Firmware synchronization. */ 2683 /* */ 2684 /* Before performing certain events such as a chip reset, synchronize with */ 2685 /* the firmware first. */ 2686 /* */ 2687 /* Returns: */ 2688 /* 0 for success, positive value for failure. */ 2689 /****************************************************************************/ 2690 static int 2691 bce_fw_sync(struct bce_softc *sc, u32 msg_data) 2692 { 2693 int i, rc = 0; 2694 u32 val; 2695 2696 /* Don't waste any time if we've timed out before. */ 2697 if (sc->bce_fw_timed_out) { 2698 rc = EBUSY; 2699 goto bce_fw_sync_exit; 2700 } 2701 2702 /* Increment the message sequence number. */ 2703 sc->bce_fw_wr_seq++; 2704 msg_data |= sc->bce_fw_wr_seq; 2705 2706 DBPRINT(sc, BCE_VERBOSE, "bce_fw_sync(): msg_data = 0x%08X\n", msg_data); 2707 2708 /* Send the message to the bootcode driver mailbox. */ 2709 REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_MB, msg_data); 2710 2711 /* Wait for the bootcode to acknowledge the message. */ 2712 for (i = 0; i < FW_ACK_TIME_OUT_MS; i++) { 2713 /* Check for a response in the bootcode firmware mailbox. */ 2714 val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_FW_MB); 2715 if ((val & BCE_FW_MSG_ACK) == (msg_data & BCE_DRV_MSG_SEQ)) 2716 break; 2717 DELAY(1000); 2718 } 2719 2720 /* If we've timed out, tell the bootcode that we've stopped waiting. */ 2721 if (((val & BCE_FW_MSG_ACK) != (msg_data & BCE_DRV_MSG_SEQ)) && 2722 ((msg_data & BCE_DRV_MSG_DATA) != BCE_DRV_MSG_DATA_WAIT0)) { 2723 2724 BCE_PRINTF(sc, "%s(%d): Firmware synchronization timeout! " 2725 "msg_data = 0x%08X\n", 2726 __FILE__, __LINE__, msg_data); 2727 2728 msg_data &= ~BCE_DRV_MSG_CODE; 2729 msg_data |= BCE_DRV_MSG_CODE_FW_TIMEOUT; 2730 2731 REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_MB, msg_data); 2732 2733 sc->bce_fw_timed_out = 1; 2734 rc = EBUSY; 2735 } 2736 2737 bce_fw_sync_exit: 2738 return (rc); 2739 } 2740 2741 2742 /****************************************************************************/ 2743 /* Load Receive Virtual 2 Physical (RV2P) processor firmware. */ 2744 /* */ 2745 /* Returns: */ 2746 /* Nothing. */ 2747 /****************************************************************************/ 2748 static void 2749 bce_load_rv2p_fw(struct bce_softc *sc, u32 *rv2p_code, 2750 u32 rv2p_code_len, u32 rv2p_proc) 2751 { 2752 int i; 2753 u32 val; 2754 2755 for (i = 0; i < rv2p_code_len; i += 8) { 2756 REG_WR(sc, BCE_RV2P_INSTR_HIGH, *rv2p_code); 2757 rv2p_code++; 2758 REG_WR(sc, BCE_RV2P_INSTR_LOW, *rv2p_code); 2759 rv2p_code++; 2760 2761 if (rv2p_proc == RV2P_PROC1) { 2762 val = (i / 8) | BCE_RV2P_PROC1_ADDR_CMD_RDWR; 2763 REG_WR(sc, BCE_RV2P_PROC1_ADDR_CMD, val); 2764 } 2765 else { 2766 val = (i / 8) | BCE_RV2P_PROC2_ADDR_CMD_RDWR; 2767 REG_WR(sc, BCE_RV2P_PROC2_ADDR_CMD, val); 2768 } 2769 } 2770 2771 /* Reset the processor, un-stall is done later. */ 2772 if (rv2p_proc == RV2P_PROC1) { 2773 REG_WR(sc, BCE_RV2P_COMMAND, BCE_RV2P_COMMAND_PROC1_RESET); 2774 } 2775 else { 2776 REG_WR(sc, BCE_RV2P_COMMAND, BCE_RV2P_COMMAND_PROC2_RESET); 2777 } 2778 } 2779 2780 2781 /****************************************************************************/ 2782 /* Load RISC processor firmware. */ 2783 /* */ 2784 /* Loads firmware from the file if_bcefw.h into the scratchpad memory */ 2785 /* associated with a particular processor. */ 2786 /* */ 2787 /* Returns: */ 2788 /* Nothing. */ 2789 /****************************************************************************/ 2790 static void 2791 bce_load_cpu_fw(struct bce_softc *sc, struct cpu_reg *cpu_reg, 2792 struct fw_info *fw) 2793 { 2794 u32 offset; 2795 u32 val; 2796 2797 /* Halt the CPU. */ 2798 val = REG_RD_IND(sc, cpu_reg->mode); 2799 val |= cpu_reg->mode_value_halt; 2800 REG_WR_IND(sc, cpu_reg->mode, val); 2801 REG_WR_IND(sc, cpu_reg->state, cpu_reg->state_value_clear); 2802 2803 /* Load the Text area. */ 2804 offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base); 2805 if (fw->text) { 2806 int j; 2807 2808 for (j = 0; j < (fw->text_len / 4); j++, offset += 4) { 2809 REG_WR_IND(sc, offset, fw->text[j]); 2810 } 2811 } 2812 2813 /* Load the Data area. */ 2814 offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base); 2815 if (fw->data) { 2816 int j; 2817 2818 for (j = 0; j < (fw->data_len / 4); j++, offset += 4) { 2819 REG_WR_IND(sc, offset, fw->data[j]); 2820 } 2821 } 2822 2823 /* Load the SBSS area. */ 2824 offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base); 2825 if (fw->sbss) { 2826 int j; 2827 2828 for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) { 2829 REG_WR_IND(sc, offset, fw->sbss[j]); 2830 } 2831 } 2832 2833 /* Load the BSS area. */ 2834 offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base); 2835 if (fw->bss) { 2836 int j; 2837 2838 for (j = 0; j < (fw->bss_len/4); j++, offset += 4) { 2839 REG_WR_IND(sc, offset, fw->bss[j]); 2840 } 2841 } 2842 2843 /* Load the Read-Only area. */ 2844 offset = cpu_reg->spad_base + 2845 (fw->rodata_addr - cpu_reg->mips_view_base); 2846 if (fw->rodata) { 2847 int j; 2848 2849 for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) { 2850 REG_WR_IND(sc, offset, fw->rodata[j]); 2851 } 2852 } 2853 2854 /* Clear the pre-fetch instruction. */ 2855 REG_WR_IND(sc, cpu_reg->inst, 0); 2856 REG_WR_IND(sc, cpu_reg->pc, fw->start_addr); 2857 2858 /* Start the CPU. */ 2859 val = REG_RD_IND(sc, cpu_reg->mode); 2860 val &= ~cpu_reg->mode_value_halt; 2861 REG_WR_IND(sc, cpu_reg->state, cpu_reg->state_value_clear); 2862 REG_WR_IND(sc, cpu_reg->mode, val); 2863 } 2864 2865 2866 /****************************************************************************/ 2867 /* Initialize the RV2P, RX, TX, TPAT, and COM CPUs. */ 2868 /* */ 2869 /* Loads the firmware for each CPU and starts the CPU. */ 2870 /* */ 2871 /* Returns: */ 2872 /* Nothing. */ 2873 /****************************************************************************/ 2874 static void 2875 bce_init_cpus(struct bce_softc *sc) 2876 { 2877 struct cpu_reg cpu_reg; 2878 struct fw_info fw; 2879 2880 /* Initialize the RV2P processor. */ 2881 bce_load_rv2p_fw(sc, bce_rv2p_proc1, sizeof(bce_rv2p_proc1), RV2P_PROC1); 2882 bce_load_rv2p_fw(sc, bce_rv2p_proc2, sizeof(bce_rv2p_proc2), RV2P_PROC2); 2883 2884 /* Initialize the RX Processor. */ 2885 cpu_reg.mode = BCE_RXP_CPU_MODE; 2886 cpu_reg.mode_value_halt = BCE_RXP_CPU_MODE_SOFT_HALT; 2887 cpu_reg.mode_value_sstep = BCE_RXP_CPU_MODE_STEP_ENA; 2888 cpu_reg.state = BCE_RXP_CPU_STATE; 2889 cpu_reg.state_value_clear = 0xffffff; 2890 cpu_reg.gpr0 = BCE_RXP_CPU_REG_FILE; 2891 cpu_reg.evmask = BCE_RXP_CPU_EVENT_MASK; 2892 cpu_reg.pc = BCE_RXP_CPU_PROGRAM_COUNTER; 2893 cpu_reg.inst = BCE_RXP_CPU_INSTRUCTION; 2894 cpu_reg.bp = BCE_RXP_CPU_HW_BREAKPOINT; 2895 cpu_reg.spad_base = BCE_RXP_SCRATCH; 2896 cpu_reg.mips_view_base = 0x8000000; 2897 2898 fw.ver_major = bce_RXP_b06FwReleaseMajor; 2899 fw.ver_minor = bce_RXP_b06FwReleaseMinor; 2900 fw.ver_fix = bce_RXP_b06FwReleaseFix; 2901 fw.start_addr = bce_RXP_b06FwStartAddr; 2902 2903 fw.text_addr = bce_RXP_b06FwTextAddr; 2904 fw.text_len = bce_RXP_b06FwTextLen; 2905 fw.text_index = 0; 2906 fw.text = bce_RXP_b06FwText; 2907 2908 fw.data_addr = bce_RXP_b06FwDataAddr; 2909 fw.data_len = bce_RXP_b06FwDataLen; 2910 fw.data_index = 0; 2911 fw.data = bce_RXP_b06FwData; 2912 2913 fw.sbss_addr = bce_RXP_b06FwSbssAddr; 2914 fw.sbss_len = bce_RXP_b06FwSbssLen; 2915 fw.sbss_index = 0; 2916 fw.sbss = bce_RXP_b06FwSbss; 2917 2918 fw.bss_addr = bce_RXP_b06FwBssAddr; 2919 fw.bss_len = bce_RXP_b06FwBssLen; 2920 fw.bss_index = 0; 2921 fw.bss = bce_RXP_b06FwBss; 2922 2923 fw.rodata_addr = bce_RXP_b06FwRodataAddr; 2924 fw.rodata_len = bce_RXP_b06FwRodataLen; 2925 fw.rodata_index = 0; 2926 fw.rodata = bce_RXP_b06FwRodata; 2927 2928 DBPRINT(sc, BCE_INFO_RESET, "Loading RX firmware.\n"); 2929 bce_load_cpu_fw(sc, &cpu_reg, &fw); 2930 2931 /* Initialize the TX Processor. */ 2932 cpu_reg.mode = BCE_TXP_CPU_MODE; 2933 cpu_reg.mode_value_halt = BCE_TXP_CPU_MODE_SOFT_HALT; 2934 cpu_reg.mode_value_sstep = BCE_TXP_CPU_MODE_STEP_ENA; 2935 cpu_reg.state = BCE_TXP_CPU_STATE; 2936 cpu_reg.state_value_clear = 0xffffff; 2937 cpu_reg.gpr0 = BCE_TXP_CPU_REG_FILE; 2938 cpu_reg.evmask = BCE_TXP_CPU_EVENT_MASK; 2939 cpu_reg.pc = BCE_TXP_CPU_PROGRAM_COUNTER; 2940 cpu_reg.inst = BCE_TXP_CPU_INSTRUCTION; 2941 cpu_reg.bp = BCE_TXP_CPU_HW_BREAKPOINT; 2942 cpu_reg.spad_base = BCE_TXP_SCRATCH; 2943 cpu_reg.mips_view_base = 0x8000000; 2944 2945 fw.ver_major = bce_TXP_b06FwReleaseMajor; 2946 fw.ver_minor = bce_TXP_b06FwReleaseMinor; 2947 fw.ver_fix = bce_TXP_b06FwReleaseFix; 2948 fw.start_addr = bce_TXP_b06FwStartAddr; 2949 2950 fw.text_addr = bce_TXP_b06FwTextAddr; 2951 fw.text_len = bce_TXP_b06FwTextLen; 2952 fw.text_index = 0; 2953 fw.text = bce_TXP_b06FwText; 2954 2955 fw.data_addr = bce_TXP_b06FwDataAddr; 2956 fw.data_len = bce_TXP_b06FwDataLen; 2957 fw.data_index = 0; 2958 fw.data = bce_TXP_b06FwData; 2959 2960 fw.sbss_addr = bce_TXP_b06FwSbssAddr; 2961 fw.sbss_len = bce_TXP_b06FwSbssLen; 2962 fw.sbss_index = 0; 2963 fw.sbss = bce_TXP_b06FwSbss; 2964 2965 fw.bss_addr = bce_TXP_b06FwBssAddr; 2966 fw.bss_len = bce_TXP_b06FwBssLen; 2967 fw.bss_index = 0; 2968 fw.bss = bce_TXP_b06FwBss; 2969 2970 fw.rodata_addr = bce_TXP_b06FwRodataAddr; 2971 fw.rodata_len = bce_TXP_b06FwRodataLen; 2972 fw.rodata_index = 0; 2973 fw.rodata = bce_TXP_b06FwRodata; 2974 2975 DBPRINT(sc, BCE_INFO_RESET, "Loading TX firmware.\n"); 2976 bce_load_cpu_fw(sc, &cpu_reg, &fw); 2977 2978 /* Initialize the TX Patch-up Processor. */ 2979 cpu_reg.mode = BCE_TPAT_CPU_MODE; 2980 cpu_reg.mode_value_halt = BCE_TPAT_CPU_MODE_SOFT_HALT; 2981 cpu_reg.mode_value_sstep = BCE_TPAT_CPU_MODE_STEP_ENA; 2982 cpu_reg.state = BCE_TPAT_CPU_STATE; 2983 cpu_reg.state_value_clear = 0xffffff; 2984 cpu_reg.gpr0 = BCE_TPAT_CPU_REG_FILE; 2985 cpu_reg.evmask = BCE_TPAT_CPU_EVENT_MASK; 2986 cpu_reg.pc = BCE_TPAT_CPU_PROGRAM_COUNTER; 2987 cpu_reg.inst = BCE_TPAT_CPU_INSTRUCTION; 2988 cpu_reg.bp = BCE_TPAT_CPU_HW_BREAKPOINT; 2989 cpu_reg.spad_base = BCE_TPAT_SCRATCH; 2990 cpu_reg.mips_view_base = 0x8000000; 2991 2992 fw.ver_major = bce_TPAT_b06FwReleaseMajor; 2993 fw.ver_minor = bce_TPAT_b06FwReleaseMinor; 2994 fw.ver_fix = bce_TPAT_b06FwReleaseFix; 2995 fw.start_addr = bce_TPAT_b06FwStartAddr; 2996 2997 fw.text_addr = bce_TPAT_b06FwTextAddr; 2998 fw.text_len = bce_TPAT_b06FwTextLen; 2999 fw.text_index = 0; 3000 fw.text = bce_TPAT_b06FwText; 3001 3002 fw.data_addr = bce_TPAT_b06FwDataAddr; 3003 fw.data_len = bce_TPAT_b06FwDataLen; 3004 fw.data_index = 0; 3005 fw.data = bce_TPAT_b06FwData; 3006 3007 fw.sbss_addr = bce_TPAT_b06FwSbssAddr; 3008 fw.sbss_len = bce_TPAT_b06FwSbssLen; 3009 fw.sbss_index = 0; 3010 fw.sbss = bce_TPAT_b06FwSbss; 3011 3012 fw.bss_addr = bce_TPAT_b06FwBssAddr; 3013 fw.bss_len = bce_TPAT_b06FwBssLen; 3014 fw.bss_index = 0; 3015 fw.bss = bce_TPAT_b06FwBss; 3016 3017 fw.rodata_addr = bce_TPAT_b06FwRodataAddr; 3018 fw.rodata_len = bce_TPAT_b06FwRodataLen; 3019 fw.rodata_index = 0; 3020 fw.rodata = bce_TPAT_b06FwRodata; 3021 3022 DBPRINT(sc, BCE_INFO_RESET, "Loading TPAT firmware.\n"); 3023 bce_load_cpu_fw(sc, &cpu_reg, &fw); 3024 3025 /* Initialize the Completion Processor. */ 3026 cpu_reg.mode = BCE_COM_CPU_MODE; 3027 cpu_reg.mode_value_halt = BCE_COM_CPU_MODE_SOFT_HALT; 3028 cpu_reg.mode_value_sstep = BCE_COM_CPU_MODE_STEP_ENA; 3029 cpu_reg.state = BCE_COM_CPU_STATE; 3030 cpu_reg.state_value_clear = 0xffffff; 3031 cpu_reg.gpr0 = BCE_COM_CPU_REG_FILE; 3032 cpu_reg.evmask = BCE_COM_CPU_EVENT_MASK; 3033 cpu_reg.pc = BCE_COM_CPU_PROGRAM_COUNTER; 3034 cpu_reg.inst = BCE_COM_CPU_INSTRUCTION; 3035 cpu_reg.bp = BCE_COM_CPU_HW_BREAKPOINT; 3036 cpu_reg.spad_base = BCE_COM_SCRATCH; 3037 cpu_reg.mips_view_base = 0x8000000; 3038 3039 fw.ver_major = bce_COM_b06FwReleaseMajor; 3040 fw.ver_minor = bce_COM_b06FwReleaseMinor; 3041 fw.ver_fix = bce_COM_b06FwReleaseFix; 3042 fw.start_addr = bce_COM_b06FwStartAddr; 3043 3044 fw.text_addr = bce_COM_b06FwTextAddr; 3045 fw.text_len = bce_COM_b06FwTextLen; 3046 fw.text_index = 0; 3047 fw.text = bce_COM_b06FwText; 3048 3049 fw.data_addr = bce_COM_b06FwDataAddr; 3050 fw.data_len = bce_COM_b06FwDataLen; 3051 fw.data_index = 0; 3052 fw.data = bce_COM_b06FwData; 3053 3054 fw.sbss_addr = bce_COM_b06FwSbssAddr; 3055 fw.sbss_len = bce_COM_b06FwSbssLen; 3056 fw.sbss_index = 0; 3057 fw.sbss = bce_COM_b06FwSbss; 3058 3059 fw.bss_addr = bce_COM_b06FwBssAddr; 3060 fw.bss_len = bce_COM_b06FwBssLen; 3061 fw.bss_index = 0; 3062 fw.bss = bce_COM_b06FwBss; 3063 3064 fw.rodata_addr = bce_COM_b06FwRodataAddr; 3065 fw.rodata_len = bce_COM_b06FwRodataLen; 3066 fw.rodata_index = 0; 3067 fw.rodata = bce_COM_b06FwRodata; 3068 3069 DBPRINT(sc, BCE_INFO_RESET, "Loading COM firmware.\n"); 3070 bce_load_cpu_fw(sc, &cpu_reg, &fw); 3071 } 3072 3073 3074 /****************************************************************************/ 3075 /* Initialize context memory. */ 3076 /* */ 3077 /* Clears the memory associated with each Context ID (CID). */ 3078 /* */ 3079 /* Returns: */ 3080 /* Nothing. */ 3081 /****************************************************************************/ 3082 static void 3083 bce_init_context(struct bce_softc *sc) 3084 { 3085 u32 vcid; 3086 3087 vcid = 96; 3088 while (vcid) { 3089 u32 vcid_addr, pcid_addr, offset; 3090 3091 vcid--; 3092 3093 vcid_addr = GET_CID_ADDR(vcid); 3094 pcid_addr = vcid_addr; 3095 3096 REG_WR(sc, BCE_CTX_VIRT_ADDR, 0x00); 3097 REG_WR(sc, BCE_CTX_PAGE_TBL, pcid_addr); 3098 3099 /* Zero out the context. */ 3100 for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) { 3101 CTX_WR(sc, 0x00, offset, 0); 3102 } 3103 3104 REG_WR(sc, BCE_CTX_VIRT_ADDR, vcid_addr); 3105 REG_WR(sc, BCE_CTX_PAGE_TBL, pcid_addr); 3106 } 3107 } 3108 3109 3110 /****************************************************************************/ 3111 /* Fetch the permanent MAC address of the controller. */ 3112 /* */ 3113 /* Returns: */ 3114 /* Nothing. */ 3115 /****************************************************************************/ 3116 static void 3117 bce_get_mac_addr(struct bce_softc *sc) 3118 { 3119 u32 mac_lo = 0, mac_hi = 0; 3120 3121 /* 3122 * The NetXtreme II bootcode populates various NIC 3123 * power-on and runtime configuration items in a 3124 * shared memory area. The factory configured MAC 3125 * address is available from both NVRAM and the 3126 * shared memory area so we'll read the value from 3127 * shared memory for speed. 3128 */ 3129 3130 mac_hi = REG_RD_IND(sc, sc->bce_shmem_base + 3131 BCE_PORT_HW_CFG_MAC_UPPER); 3132 mac_lo = REG_RD_IND(sc, sc->bce_shmem_base + 3133 BCE_PORT_HW_CFG_MAC_LOWER); 3134 3135 if ((mac_lo == 0) && (mac_hi == 0)) { 3136 BCE_PRINTF(sc, "%s(%d): Invalid Ethernet address!\n", 3137 __FILE__, __LINE__); 3138 } else { 3139 sc->eaddr[0] = (u_char)(mac_hi >> 8); 3140 sc->eaddr[1] = (u_char)(mac_hi >> 0); 3141 sc->eaddr[2] = (u_char)(mac_lo >> 24); 3142 sc->eaddr[3] = (u_char)(mac_lo >> 16); 3143 sc->eaddr[4] = (u_char)(mac_lo >> 8); 3144 sc->eaddr[5] = (u_char)(mac_lo >> 0); 3145 } 3146 3147 DBPRINT(sc, BCE_INFO, "Permanent Ethernet address = %6D\n", sc->eaddr, ":"); 3148 } 3149 3150 3151 /****************************************************************************/ 3152 /* Program the MAC address. */ 3153 /* */ 3154 /* Returns: */ 3155 /* Nothing. */ 3156 /****************************************************************************/ 3157 static void 3158 bce_set_mac_addr(struct bce_softc *sc) 3159 { 3160 u32 val; 3161 u8 *mac_addr = sc->eaddr; 3162 3163 DBPRINT(sc, BCE_INFO, "Setting Ethernet address = %6D\n", sc->eaddr, ":"); 3164 3165 val = (mac_addr[0] << 8) | mac_addr[1]; 3166 3167 REG_WR(sc, BCE_EMAC_MAC_MATCH0, val); 3168 3169 val = (mac_addr[2] << 24) | (mac_addr[3] << 16) | 3170 (mac_addr[4] << 8) | mac_addr[5]; 3171 3172 REG_WR(sc, BCE_EMAC_MAC_MATCH1, val); 3173 } 3174 3175 3176 /****************************************************************************/ 3177 /* Stop the controller. */ 3178 /* */ 3179 /* Returns: */ 3180 /* Nothing. */ 3181 /****************************************************************************/ 3182 static void 3183 bce_stop(struct bce_softc *sc) 3184 { 3185 struct ifnet *ifp; 3186 struct ifmedia_entry *ifm; 3187 struct mii_data *mii = NULL; 3188 int mtmp, itmp; 3189 3190 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3191 3192 BCE_LOCK_ASSERT(sc); 3193 3194 ifp = sc->bce_ifp; 3195 3196 mii = device_get_softc(sc->bce_miibus); 3197 3198 callout_stop(&sc->bce_stat_ch); 3199 3200 /* Disable the transmit/receive blocks. */ 3201 REG_WR(sc, BCE_MISC_ENABLE_CLR_BITS, 0x5ffffff); 3202 REG_RD(sc, BCE_MISC_ENABLE_CLR_BITS); 3203 DELAY(20); 3204 3205 bce_disable_intr(sc); 3206 3207 /* Tell firmware that the driver is going away. */ 3208 bce_reset(sc, BCE_DRV_MSG_CODE_SUSPEND_NO_WOL); 3209 3210 /* Free the RX lists. */ 3211 bce_free_rx_chain(sc); 3212 3213 /* Free TX buffers. */ 3214 bce_free_tx_chain(sc); 3215 3216 /* 3217 * Isolate/power down the PHY, but leave the media selection 3218 * unchanged so that things will be put back to normal when 3219 * we bring the interface back up. 3220 */ 3221 3222 itmp = ifp->if_flags; 3223 ifp->if_flags |= IFF_UP; 3224 /* 3225 * If we are called from bce_detach(), mii is already NULL. 3226 */ 3227 if (mii != NULL) { 3228 ifm = mii->mii_media.ifm_cur; 3229 mtmp = ifm->ifm_media; 3230 ifm->ifm_media = IFM_ETHER | IFM_NONE; 3231 mii_mediachg(mii); 3232 ifm->ifm_media = mtmp; 3233 } 3234 3235 ifp->if_flags = itmp; 3236 ifp->if_timer = 0; 3237 3238 sc->bce_link = 0; 3239 3240 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 3241 3242 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3243 3244 } 3245 3246 3247 static int 3248 bce_reset(struct bce_softc *sc, u32 reset_code) 3249 { 3250 u32 val; 3251 int i, rc = 0; 3252 3253 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3254 3255 /* Wait for pending PCI transactions to complete. */ 3256 REG_WR(sc, BCE_MISC_ENABLE_CLR_BITS, 3257 BCE_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE | 3258 BCE_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE | 3259 BCE_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE | 3260 BCE_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE); 3261 val = REG_RD(sc, BCE_MISC_ENABLE_CLR_BITS); 3262 DELAY(5); 3263 3264 /* Assume bootcode is running. */ 3265 sc->bce_fw_timed_out = 0; 3266 3267 /* Give the firmware a chance to prepare for the reset. */ 3268 rc = bce_fw_sync(sc, BCE_DRV_MSG_DATA_WAIT0 | reset_code); 3269 if (rc) 3270 goto bce_reset_exit; 3271 3272 /* Set a firmware reminder that this is a soft reset. */ 3273 REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_RESET_SIGNATURE, 3274 BCE_DRV_RESET_SIGNATURE_MAGIC); 3275 3276 /* Dummy read to force the chip to complete all current transactions. */ 3277 val = REG_RD(sc, BCE_MISC_ID); 3278 3279 /* Chip reset. */ 3280 val = BCE_PCICFG_MISC_CONFIG_CORE_RST_REQ | 3281 BCE_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | 3282 BCE_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP; 3283 REG_WR(sc, BCE_PCICFG_MISC_CONFIG, val); 3284 3285 /* Allow up to 30us for reset to complete. */ 3286 for (i = 0; i < 10; i++) { 3287 val = REG_RD(sc, BCE_PCICFG_MISC_CONFIG); 3288 if ((val & (BCE_PCICFG_MISC_CONFIG_CORE_RST_REQ | 3289 BCE_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0) { 3290 break; 3291 } 3292 DELAY(10); 3293 } 3294 3295 /* Check that reset completed successfully. */ 3296 if (val & (BCE_PCICFG_MISC_CONFIG_CORE_RST_REQ | 3297 BCE_PCICFG_MISC_CONFIG_CORE_RST_BSY)) { 3298 BCE_PRINTF(sc, "%s(%d): Reset failed!\n", 3299 __FILE__, __LINE__); 3300 rc = EBUSY; 3301 goto bce_reset_exit; 3302 } 3303 3304 /* Make sure byte swapping is properly configured. */ 3305 val = REG_RD(sc, BCE_PCI_SWAP_DIAG0); 3306 if (val != 0x01020304) { 3307 BCE_PRINTF(sc, "%s(%d): Byte swap is incorrect!\n", 3308 __FILE__, __LINE__); 3309 rc = ENODEV; 3310 goto bce_reset_exit; 3311 } 3312 3313 /* Just completed a reset, assume that firmware is running again. */ 3314 sc->bce_fw_timed_out = 0; 3315 3316 /* Wait for the firmware to finish its initialization. */ 3317 rc = bce_fw_sync(sc, BCE_DRV_MSG_DATA_WAIT1 | reset_code); 3318 if (rc) 3319 BCE_PRINTF(sc, "%s(%d): Firmware did not complete initialization!\n", 3320 __FILE__, __LINE__); 3321 3322 bce_reset_exit: 3323 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3324 3325 return (rc); 3326 } 3327 3328 3329 static int 3330 bce_chipinit(struct bce_softc *sc) 3331 { 3332 u32 val; 3333 int rc = 0; 3334 3335 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3336 3337 /* Make sure the interrupt is not active. */ 3338 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, BCE_PCICFG_INT_ACK_CMD_MASK_INT); 3339 3340 /* Initialize DMA byte/word swapping, configure the number of DMA */ 3341 /* channels and PCI clock compensation delay. */ 3342 val = BCE_DMA_CONFIG_DATA_BYTE_SWAP | 3343 BCE_DMA_CONFIG_DATA_WORD_SWAP | 3344 #if BYTE_ORDER == BIG_ENDIAN 3345 BCE_DMA_CONFIG_CNTL_BYTE_SWAP | 3346 #endif 3347 BCE_DMA_CONFIG_CNTL_WORD_SWAP | 3348 DMA_READ_CHANS << 12 | 3349 DMA_WRITE_CHANS << 16; 3350 3351 val |= (0x2 << 20) | BCE_DMA_CONFIG_CNTL_PCI_COMP_DLY; 3352 3353 if ((sc->bce_flags & BCE_PCIX_FLAG) && (sc->bus_speed_mhz == 133)) 3354 val |= BCE_DMA_CONFIG_PCI_FAST_CLK_CMP; 3355 3356 /* 3357 * This setting resolves a problem observed on certain Intel PCI 3358 * chipsets that cannot handle multiple outstanding DMA operations. 3359 * See errata E9_5706A1_65. 3360 */ 3361 if ((BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5706) && 3362 (BCE_CHIP_ID(sc) != BCE_CHIP_ID_5706_A0) && 3363 !(sc->bce_flags & BCE_PCIX_FLAG)) 3364 val |= BCE_DMA_CONFIG_CNTL_PING_PONG_DMA; 3365 3366 REG_WR(sc, BCE_DMA_CONFIG, val); 3367 3368 /* Clear the PCI-X relaxed ordering bit. See errata E3_5708CA0_570. */ 3369 if (sc->bce_flags & BCE_PCIX_FLAG) { 3370 u16 val; 3371 3372 val = pci_read_config(sc->bce_dev, BCE_PCI_PCIX_CMD, 2); 3373 pci_write_config(sc->bce_dev, BCE_PCI_PCIX_CMD, val & ~0x2, 2); 3374 } 3375 3376 /* Enable the RX_V2P and Context state machines before access. */ 3377 REG_WR(sc, BCE_MISC_ENABLE_SET_BITS, 3378 BCE_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE | 3379 BCE_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE | 3380 BCE_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE); 3381 3382 /* Initialize context mapping and zero out the quick contexts. */ 3383 bce_init_context(sc); 3384 3385 /* Initialize the on-boards CPUs */ 3386 bce_init_cpus(sc); 3387 3388 /* Prepare NVRAM for access. */ 3389 if (bce_init_nvram(sc)) { 3390 rc = ENODEV; 3391 goto bce_chipinit_exit; 3392 } 3393 3394 /* Set the kernel bypass block size */ 3395 val = REG_RD(sc, BCE_MQ_CONFIG); 3396 val &= ~BCE_MQ_CONFIG_KNL_BYP_BLK_SIZE; 3397 val |= BCE_MQ_CONFIG_KNL_BYP_BLK_SIZE_256; 3398 REG_WR(sc, BCE_MQ_CONFIG, val); 3399 3400 val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE); 3401 REG_WR(sc, BCE_MQ_KNL_BYP_WIND_START, val); 3402 REG_WR(sc, BCE_MQ_KNL_WIND_END, val); 3403 3404 val = (BCM_PAGE_BITS - 8) << 24; 3405 REG_WR(sc, BCE_RV2P_CONFIG, val); 3406 3407 /* Configure page size. */ 3408 val = REG_RD(sc, BCE_TBDR_CONFIG); 3409 val &= ~BCE_TBDR_CONFIG_PAGE_SIZE; 3410 val |= (BCM_PAGE_BITS - 8) << 24 | 0x40; 3411 REG_WR(sc, BCE_TBDR_CONFIG, val); 3412 3413 bce_chipinit_exit: 3414 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3415 3416 return(rc); 3417 } 3418 3419 3420 /****************************************************************************/ 3421 /* Initialize the controller in preparation to send/receive traffic. */ 3422 /* */ 3423 /* Returns: */ 3424 /* 0 for success, positive value for failure. */ 3425 /****************************************************************************/ 3426 static int 3427 bce_blockinit(struct bce_softc *sc) 3428 { 3429 u32 reg, val; 3430 int rc = 0; 3431 3432 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3433 3434 /* Load the hardware default MAC address. */ 3435 bce_set_mac_addr(sc); 3436 3437 /* Set the Ethernet backoff seed value */ 3438 val = sc->eaddr[0] + (sc->eaddr[1] << 8) + 3439 (sc->eaddr[2] << 16) + (sc->eaddr[3] ) + 3440 (sc->eaddr[4] << 8) + (sc->eaddr[5] << 16); 3441 REG_WR(sc, BCE_EMAC_BACKOFF_SEED, val); 3442 3443 sc->last_status_idx = 0; 3444 sc->rx_mode = BCE_EMAC_RX_MODE_SORT_MODE; 3445 3446 /* Set up link change interrupt generation. */ 3447 REG_WR(sc, BCE_EMAC_ATTENTION_ENA, BCE_EMAC_ATTENTION_ENA_LINK); 3448 3449 /* Program the physical address of the status block. */ 3450 REG_WR(sc, BCE_HC_STATUS_ADDR_L, 3451 BCE_ADDR_LO(sc->status_block_paddr)); 3452 REG_WR(sc, BCE_HC_STATUS_ADDR_H, 3453 BCE_ADDR_HI(sc->status_block_paddr)); 3454 3455 /* Program the physical address of the statistics block. */ 3456 REG_WR(sc, BCE_HC_STATISTICS_ADDR_L, 3457 BCE_ADDR_LO(sc->stats_block_paddr)); 3458 REG_WR(sc, BCE_HC_STATISTICS_ADDR_H, 3459 BCE_ADDR_HI(sc->stats_block_paddr)); 3460 3461 /* Program various host coalescing parameters. */ 3462 REG_WR(sc, BCE_HC_TX_QUICK_CONS_TRIP, 3463 (sc->bce_tx_quick_cons_trip_int << 16) | sc->bce_tx_quick_cons_trip); 3464 REG_WR(sc, BCE_HC_RX_QUICK_CONS_TRIP, 3465 (sc->bce_rx_quick_cons_trip_int << 16) | sc->bce_rx_quick_cons_trip); 3466 REG_WR(sc, BCE_HC_COMP_PROD_TRIP, 3467 (sc->bce_comp_prod_trip_int << 16) | sc->bce_comp_prod_trip); 3468 REG_WR(sc, BCE_HC_TX_TICKS, 3469 (sc->bce_tx_ticks_int << 16) | sc->bce_tx_ticks); 3470 REG_WR(sc, BCE_HC_RX_TICKS, 3471 (sc->bce_rx_ticks_int << 16) | sc->bce_rx_ticks); 3472 REG_WR(sc, BCE_HC_COM_TICKS, 3473 (sc->bce_com_ticks_int << 16) | sc->bce_com_ticks); 3474 REG_WR(sc, BCE_HC_CMD_TICKS, 3475 (sc->bce_cmd_ticks_int << 16) | sc->bce_cmd_ticks); 3476 REG_WR(sc, BCE_HC_STATS_TICKS, 3477 (sc->bce_stats_ticks & 0xffff00)); 3478 REG_WR(sc, BCE_HC_STAT_COLLECT_TICKS, 3479 0xbb8); /* 3ms */ 3480 REG_WR(sc, BCE_HC_CONFIG, 3481 (BCE_HC_CONFIG_RX_TMR_MODE | BCE_HC_CONFIG_TX_TMR_MODE | 3482 BCE_HC_CONFIG_COLLECT_STATS)); 3483 3484 /* Clear the internal statistics counters. */ 3485 REG_WR(sc, BCE_HC_COMMAND, BCE_HC_COMMAND_CLR_STAT_NOW); 3486 3487 /* Verify that bootcode is running. */ 3488 reg = REG_RD_IND(sc, sc->bce_shmem_base + BCE_DEV_INFO_SIGNATURE); 3489 3490 DBRUNIF(DB_RANDOMTRUE(bce_debug_bootcode_running_failure), 3491 BCE_PRINTF(sc, "%s(%d): Simulating bootcode failure.\n", 3492 __FILE__, __LINE__); 3493 reg = 0); 3494 3495 if ((reg & BCE_DEV_INFO_SIGNATURE_MAGIC_MASK) != 3496 BCE_DEV_INFO_SIGNATURE_MAGIC) { 3497 BCE_PRINTF(sc, "%s(%d): Bootcode not running! Found: 0x%08X, " 3498 "Expected: 08%08X\n", __FILE__, __LINE__, 3499 (reg & BCE_DEV_INFO_SIGNATURE_MAGIC_MASK), 3500 BCE_DEV_INFO_SIGNATURE_MAGIC); 3501 rc = ENODEV; 3502 goto bce_blockinit_exit; 3503 } 3504 3505 /* Check if any management firmware is running. */ 3506 reg = REG_RD_IND(sc, sc->bce_shmem_base + BCE_PORT_FEATURE); 3507 if (reg & (BCE_PORT_FEATURE_ASF_ENABLED | BCE_PORT_FEATURE_IMD_ENABLED)) { 3508 DBPRINT(sc, BCE_INFO, "Management F/W Enabled.\n"); 3509 sc->bce_flags |= BCE_MFW_ENABLE_FLAG; 3510 } 3511 3512 sc->bce_fw_ver = REG_RD_IND(sc, sc->bce_shmem_base + BCE_DEV_INFO_BC_REV); 3513 DBPRINT(sc, BCE_INFO, "bootcode rev = 0x%08X\n", sc->bce_fw_ver); 3514 3515 /* Allow bootcode to apply any additional fixes before enabling MAC. */ 3516 rc = bce_fw_sync(sc, BCE_DRV_MSG_DATA_WAIT2 | BCE_DRV_MSG_CODE_RESET); 3517 3518 /* Enable link state change interrupt generation. */ 3519 REG_WR(sc, BCE_HC_ATTN_BITS_ENABLE, STATUS_ATTN_BITS_LINK_STATE); 3520 3521 /* Enable all remaining blocks in the MAC. */ 3522 REG_WR(sc, BCE_MISC_ENABLE_SET_BITS, 0x5ffffff); 3523 REG_RD(sc, BCE_MISC_ENABLE_SET_BITS); 3524 DELAY(20); 3525 3526 bce_blockinit_exit: 3527 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3528 3529 return (rc); 3530 } 3531 3532 3533 /****************************************************************************/ 3534 /* Encapsulate an mbuf cluster into the rx_bd chain. */ 3535 /* */ 3536 /* The NetXtreme II can support Jumbo frames by using multiple rx_bd's. */ 3537 /* This routine will map an mbuf cluster into 1 or more rx_bd's as */ 3538 /* necessary. */ 3539 /* */ 3540 /* Returns: */ 3541 /* 0 for success, positive value for failure. */ 3542 /****************************************************************************/ 3543 static int 3544 bce_get_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, u16 *chain_prod, 3545 u32 *prod_bseq) 3546 { 3547 bus_dmamap_t map; 3548 bus_dma_segment_t segs[4]; 3549 struct mbuf *m_new = NULL; 3550 struct rx_bd *rxbd; 3551 int i, nsegs, error, rc = 0; 3552 #ifdef BCE_DEBUG 3553 u16 debug_chain_prod = *chain_prod; 3554 #endif 3555 3556 DBPRINT(sc, (BCE_VERBOSE_RESET | BCE_VERBOSE_RECV), "Entering %s()\n", 3557 __FUNCTION__); 3558 3559 /* Make sure the inputs are valid. */ 3560 DBRUNIF((*chain_prod > MAX_RX_BD), 3561 BCE_PRINTF(sc, "%s(%d): RX producer out of range: 0x%04X > 0x%04X\n", 3562 __FILE__, __LINE__, *chain_prod, (u16) MAX_RX_BD)); 3563 3564 DBPRINT(sc, BCE_VERBOSE_RECV, "%s(enter): prod = 0x%04X, chain_prod = 0x%04X, " 3565 "prod_bseq = 0x%08X\n", __FUNCTION__, *prod, *chain_prod, *prod_bseq); 3566 3567 if (m == NULL) { 3568 3569 DBRUNIF(DB_RANDOMTRUE(bce_debug_mbuf_allocation_failure), 3570 BCE_PRINTF(sc, "%s(%d): Simulating mbuf allocation failure.\n", 3571 __FILE__, __LINE__); 3572 sc->mbuf_alloc_failed++; 3573 rc = ENOBUFS; 3574 goto bce_get_buf_exit); 3575 3576 /* This is a new mbuf allocation. */ 3577 MGETHDR(m_new, M_DONTWAIT, MT_DATA); 3578 if (m_new == NULL) { 3579 3580 DBPRINT(sc, BCE_WARN, "%s(%d): RX mbuf header allocation failed!\n", 3581 __FILE__, __LINE__); 3582 3583 DBRUNIF(1, sc->mbuf_alloc_failed++); 3584 3585 rc = ENOBUFS; 3586 goto bce_get_buf_exit; 3587 } 3588 3589 DBRUNIF(1, sc->rx_mbuf_alloc++); 3590 m_cljget(m_new, M_DONTWAIT, sc->mbuf_alloc_size); 3591 if (!(m_new->m_flags & M_EXT)) { 3592 3593 DBPRINT(sc, BCE_WARN, "%s(%d): RX mbuf chain allocation failed!\n", 3594 __FILE__, __LINE__); 3595 3596 m_freem(m_new); 3597 3598 DBRUNIF(1, sc->rx_mbuf_alloc--); 3599 DBRUNIF(1, sc->mbuf_alloc_failed++); 3600 3601 rc = ENOBUFS; 3602 goto bce_get_buf_exit; 3603 } 3604 3605 m_new->m_len = m_new->m_pkthdr.len = sc->mbuf_alloc_size; 3606 } else { 3607 m_new = m; 3608 m_new->m_len = m_new->m_pkthdr.len = sc->mbuf_alloc_size; 3609 m_new->m_data = m_new->m_ext.ext_buf; 3610 } 3611 3612 /* Map the mbuf cluster into device memory. */ 3613 map = sc->rx_mbuf_map[*chain_prod]; 3614 error = bus_dmamap_load_mbuf_sg(sc->rx_mbuf_tag, map, m_new, 3615 segs, &nsegs, BUS_DMA_NOWAIT); 3616 3617 if (error) { 3618 BCE_PRINTF(sc, "%s(%d): Error mapping mbuf into RX chain!\n", 3619 __FILE__, __LINE__); 3620 3621 m_freem(m_new); 3622 3623 DBRUNIF(1, sc->rx_mbuf_alloc--); 3624 3625 rc = ENOBUFS; 3626 goto bce_get_buf_exit; 3627 } 3628 3629 /* Watch for overflow. */ 3630 DBRUNIF((sc->free_rx_bd > USABLE_RX_BD), 3631 BCE_PRINTF(sc, "%s(%d): Too many free rx_bd (0x%04X > 0x%04X)!\n", 3632 __FILE__, __LINE__, sc->free_rx_bd, (u16) USABLE_RX_BD)); 3633 3634 DBRUNIF((sc->free_rx_bd < sc->rx_low_watermark), 3635 sc->rx_low_watermark = sc->free_rx_bd); 3636 3637 /* Setup the rx_bd for the first segment. */ 3638 rxbd = &sc->rx_bd_chain[RX_PAGE(*chain_prod)][RX_IDX(*chain_prod)]; 3639 3640 rxbd->rx_bd_haddr_lo = htole32(BCE_ADDR_LO(segs[0].ds_addr)); 3641 rxbd->rx_bd_haddr_hi = htole32(BCE_ADDR_HI(segs[0].ds_addr)); 3642 rxbd->rx_bd_len = htole32(segs[0].ds_len); 3643 rxbd->rx_bd_flags = htole32(RX_BD_FLAGS_START); 3644 *prod_bseq += segs[0].ds_len; 3645 3646 for (i = 1; i < nsegs; i++) { 3647 3648 *prod = NEXT_RX_BD(*prod); 3649 *chain_prod = RX_CHAIN_IDX(*prod); 3650 3651 rxbd = &sc->rx_bd_chain[RX_PAGE(*chain_prod)][RX_IDX(*chain_prod)]; 3652 3653 rxbd->rx_bd_haddr_lo = htole32(BCE_ADDR_LO(segs[i].ds_addr)); 3654 rxbd->rx_bd_haddr_hi = htole32(BCE_ADDR_HI(segs[i].ds_addr)); 3655 rxbd->rx_bd_len = htole32(segs[i].ds_len); 3656 rxbd->rx_bd_flags = 0; 3657 *prod_bseq += segs[i].ds_len; 3658 } 3659 3660 rxbd->rx_bd_flags |= htole32(RX_BD_FLAGS_END); 3661 3662 /* Save the mbuf and update our counter. */ 3663 sc->rx_mbuf_ptr[*chain_prod] = m_new; 3664 sc->free_rx_bd -= nsegs; 3665 3666 DBRUN(BCE_VERBOSE_RECV, bce_dump_rx_mbuf_chain(sc, debug_chain_prod, 3667 nsegs)); 3668 3669 DBPRINT(sc, BCE_VERBOSE_RECV, "%s(exit): prod = 0x%04X, chain_prod = 0x%04X, " 3670 "prod_bseq = 0x%08X\n", __FUNCTION__, *prod, *chain_prod, *prod_bseq); 3671 3672 bce_get_buf_exit: 3673 DBPRINT(sc, (BCE_VERBOSE_RESET | BCE_VERBOSE_RECV), "Exiting %s()\n", 3674 __FUNCTION__); 3675 3676 return(rc); 3677 } 3678 3679 3680 /****************************************************************************/ 3681 /* Allocate memory and initialize the TX data structures. */ 3682 /* */ 3683 /* Returns: */ 3684 /* 0 for success, positive value for failure. */ 3685 /****************************************************************************/ 3686 static int 3687 bce_init_tx_chain(struct bce_softc *sc) 3688 { 3689 struct tx_bd *txbd; 3690 u32 val; 3691 int i, rc = 0; 3692 3693 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3694 3695 /* Set the initial TX producer/consumer indices. */ 3696 sc->tx_prod = 0; 3697 sc->tx_cons = 0; 3698 sc->tx_prod_bseq = 0; 3699 sc->used_tx_bd = 0; 3700 DBRUNIF(1, sc->tx_hi_watermark = USABLE_TX_BD); 3701 3702 /* 3703 * The NetXtreme II supports a linked-list structre called 3704 * a Buffer Descriptor Chain (or BD chain). A BD chain 3705 * consists of a series of 1 or more chain pages, each of which 3706 * consists of a fixed number of BD entries. 3707 * The last BD entry on each page is a pointer to the next page 3708 * in the chain, and the last pointer in the BD chain 3709 * points back to the beginning of the chain. 3710 */ 3711 3712 /* Set the TX next pointer chain entries. */ 3713 for (i = 0; i < TX_PAGES; i++) { 3714 int j; 3715 3716 txbd = &sc->tx_bd_chain[i][USABLE_TX_BD_PER_PAGE]; 3717 3718 /* Check if we've reached the last page. */ 3719 if (i == (TX_PAGES - 1)) 3720 j = 0; 3721 else 3722 j = i + 1; 3723 3724 txbd->tx_bd_haddr_hi = htole32(BCE_ADDR_HI(sc->tx_bd_chain_paddr[j])); 3725 txbd->tx_bd_haddr_lo = htole32(BCE_ADDR_LO(sc->tx_bd_chain_paddr[j])); 3726 } 3727 3728 /* 3729 * Initialize the context ID for an L2 TX chain. 3730 */ 3731 val = BCE_L2CTX_TYPE_TYPE_L2; 3732 val |= BCE_L2CTX_TYPE_SIZE_L2; 3733 CTX_WR(sc, GET_CID_ADDR(TX_CID), BCE_L2CTX_TYPE, val); 3734 3735 val = BCE_L2CTX_CMD_TYPE_TYPE_L2 | (8 << 16); 3736 CTX_WR(sc, GET_CID_ADDR(TX_CID), BCE_L2CTX_CMD_TYPE, val); 3737 3738 /* Point the hardware to the first page in the chain. */ 3739 val = BCE_ADDR_HI(sc->tx_bd_chain_paddr[0]); 3740 CTX_WR(sc, GET_CID_ADDR(TX_CID), BCE_L2CTX_TBDR_BHADDR_HI, val); 3741 val = BCE_ADDR_LO(sc->tx_bd_chain_paddr[0]); 3742 CTX_WR(sc, GET_CID_ADDR(TX_CID), BCE_L2CTX_TBDR_BHADDR_LO, val); 3743 3744 DBRUN(BCE_VERBOSE_SEND, bce_dump_tx_chain(sc, 0, TOTAL_TX_BD)); 3745 3746 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3747 3748 return(rc); 3749 } 3750 3751 3752 /****************************************************************************/ 3753 /* Free memory and clear the TX data structures. */ 3754 /* */ 3755 /* Returns: */ 3756 /* Nothing. */ 3757 /****************************************************************************/ 3758 static void 3759 bce_free_tx_chain(struct bce_softc *sc) 3760 { 3761 int i; 3762 3763 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3764 3765 /* Unmap, unload, and free any mbufs still in the TX mbuf chain. */ 3766 for (i = 0; i < TOTAL_TX_BD; i++) { 3767 if (sc->tx_mbuf_ptr[i] != NULL) { 3768 if (sc->tx_mbuf_map != NULL) 3769 bus_dmamap_sync(sc->tx_mbuf_tag, sc->tx_mbuf_map[i], 3770 BUS_DMASYNC_POSTWRITE); 3771 m_freem(sc->tx_mbuf_ptr[i]); 3772 sc->tx_mbuf_ptr[i] = NULL; 3773 DBRUNIF(1, sc->tx_mbuf_alloc--); 3774 } 3775 } 3776 3777 /* Clear each TX chain page. */ 3778 for (i = 0; i < TX_PAGES; i++) 3779 bzero((char *)sc->tx_bd_chain[i], BCE_TX_CHAIN_PAGE_SZ); 3780 3781 /* Check if we lost any mbufs in the process. */ 3782 DBRUNIF((sc->tx_mbuf_alloc), 3783 BCE_PRINTF(sc, "%s(%d): Memory leak! Lost %d mbufs " 3784 "from tx chain!\n", 3785 __FILE__, __LINE__, sc->tx_mbuf_alloc)); 3786 3787 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3788 } 3789 3790 3791 /****************************************************************************/ 3792 /* Allocate memory and initialize the RX data structures. */ 3793 /* */ 3794 /* Returns: */ 3795 /* 0 for success, positive value for failure. */ 3796 /****************************************************************************/ 3797 static int 3798 bce_init_rx_chain(struct bce_softc *sc) 3799 { 3800 struct rx_bd *rxbd; 3801 int i, rc = 0; 3802 u16 prod, chain_prod; 3803 u32 prod_bseq, val; 3804 3805 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3806 3807 /* Initialize the RX producer and consumer indices. */ 3808 sc->rx_prod = 0; 3809 sc->rx_cons = 0; 3810 sc->rx_prod_bseq = 0; 3811 sc->free_rx_bd = BCE_RX_SLACK_SPACE; 3812 DBRUNIF(1, sc->rx_low_watermark = USABLE_RX_BD); 3813 3814 /* Initialize the RX next pointer chain entries. */ 3815 for (i = 0; i < RX_PAGES; i++) { 3816 int j; 3817 3818 rxbd = &sc->rx_bd_chain[i][USABLE_RX_BD_PER_PAGE]; 3819 3820 /* Check if we've reached the last page. */ 3821 if (i == (RX_PAGES - 1)) 3822 j = 0; 3823 else 3824 j = i + 1; 3825 3826 /* Setup the chain page pointers. */ 3827 rxbd->rx_bd_haddr_hi = htole32(BCE_ADDR_HI(sc->rx_bd_chain_paddr[j])); 3828 rxbd->rx_bd_haddr_lo = htole32(BCE_ADDR_LO(sc->rx_bd_chain_paddr[j])); 3829 } 3830 3831 /* Initialize the context ID for an L2 RX chain. */ 3832 val = BCE_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE; 3833 val |= BCE_L2CTX_CTX_TYPE_SIZE_L2; 3834 val |= 0x02 << 8; 3835 CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_CTX_TYPE, val); 3836 3837 /* Point the hardware to the first page in the chain. */ 3838 val = BCE_ADDR_HI(sc->rx_bd_chain_paddr[0]); 3839 CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_NX_BDHADDR_HI, val); 3840 val = BCE_ADDR_LO(sc->rx_bd_chain_paddr[0]); 3841 CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_NX_BDHADDR_LO, val); 3842 3843 /* Allocate mbuf clusters for the rx_bd chain. */ 3844 prod = prod_bseq = 0; 3845 while (prod < BCE_RX_SLACK_SPACE) { 3846 chain_prod = RX_CHAIN_IDX(prod); 3847 if (bce_get_buf(sc, NULL, &prod, &chain_prod, &prod_bseq)) { 3848 BCE_PRINTF(sc, "%s(%d): Error filling RX chain: rx_bd[0x%04X]!\n", 3849 __FILE__, __LINE__, chain_prod); 3850 rc = ENOBUFS; 3851 break; 3852 } 3853 prod = NEXT_RX_BD(prod); 3854 } 3855 3856 /* Save the RX chain producer index. */ 3857 sc->rx_prod = prod; 3858 sc->rx_prod_bseq = prod_bseq; 3859 3860 for (i = 0; i < RX_PAGES; i++) { 3861 bus_dmamap_sync( 3862 sc->rx_bd_chain_tag, 3863 sc->rx_bd_chain_map[i], 3864 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 3865 } 3866 3867 /* Tell the chip about the waiting rx_bd's. */ 3868 REG_WR16(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BDIDX, sc->rx_prod); 3869 REG_WR(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BSEQ, sc->rx_prod_bseq); 3870 3871 DBRUN(BCE_VERBOSE_RECV, bce_dump_rx_chain(sc, 0, TOTAL_RX_BD)); 3872 3873 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3874 3875 return(rc); 3876 } 3877 3878 3879 /****************************************************************************/ 3880 /* Free memory and clear the RX data structures. */ 3881 /* */ 3882 /* Returns: */ 3883 /* Nothing. */ 3884 /****************************************************************************/ 3885 static void 3886 bce_free_rx_chain(struct bce_softc *sc) 3887 { 3888 int i; 3889 3890 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 3891 3892 /* Free any mbufs still in the RX mbuf chain. */ 3893 for (i = 0; i < TOTAL_RX_BD; i++) { 3894 if (sc->rx_mbuf_ptr[i] != NULL) { 3895 if (sc->rx_mbuf_map[i] != NULL) 3896 bus_dmamap_sync(sc->rx_mbuf_tag, sc->rx_mbuf_map[i], 3897 BUS_DMASYNC_POSTREAD); 3898 m_freem(sc->rx_mbuf_ptr[i]); 3899 sc->rx_mbuf_ptr[i] = NULL; 3900 DBRUNIF(1, sc->rx_mbuf_alloc--); 3901 } 3902 } 3903 3904 /* Clear each RX chain page. */ 3905 for (i = 0; i < RX_PAGES; i++) 3906 bzero((char *)sc->rx_bd_chain[i], BCE_RX_CHAIN_PAGE_SZ); 3907 3908 /* Check if we lost any mbufs in the process. */ 3909 DBRUNIF((sc->rx_mbuf_alloc), 3910 BCE_PRINTF(sc, "%s(%d): Memory leak! Lost %d mbufs from rx chain!\n", 3911 __FILE__, __LINE__, sc->rx_mbuf_alloc)); 3912 3913 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 3914 } 3915 3916 3917 /****************************************************************************/ 3918 /* Set media options. */ 3919 /* */ 3920 /* Returns: */ 3921 /* 0 for success, positive value for failure. */ 3922 /****************************************************************************/ 3923 static int 3924 bce_ifmedia_upd(struct ifnet *ifp) 3925 { 3926 struct bce_softc *sc; 3927 struct mii_data *mii; 3928 struct ifmedia *ifm; 3929 int rc = 0; 3930 3931 sc = ifp->if_softc; 3932 ifm = &sc->bce_ifmedia; 3933 3934 /* DRC - ToDo: Add SerDes support. */ 3935 3936 mii = device_get_softc(sc->bce_miibus); 3937 sc->bce_link = 0; 3938 if (mii->mii_instance) { 3939 struct mii_softc *miisc; 3940 for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL; 3941 miisc = LIST_NEXT(miisc, mii_list)) 3942 mii_phy_reset(miisc); 3943 } 3944 mii_mediachg(mii); 3945 3946 return(rc); 3947 } 3948 3949 3950 /****************************************************************************/ 3951 /* Reports current media status. */ 3952 /* */ 3953 /* Returns: */ 3954 /* Nothing. */ 3955 /****************************************************************************/ 3956 static void 3957 bce_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) 3958 { 3959 struct bce_softc *sc; 3960 struct mii_data *mii; 3961 3962 sc = ifp->if_softc; 3963 3964 BCE_LOCK(sc); 3965 3966 mii = device_get_softc(sc->bce_miibus); 3967 3968 /* DRC - ToDo: Add SerDes support. */ 3969 3970 mii_pollstat(mii); 3971 ifmr->ifm_active = mii->mii_media_active; 3972 ifmr->ifm_status = mii->mii_media_status; 3973 3974 BCE_UNLOCK(sc); 3975 } 3976 3977 3978 /****************************************************************************/ 3979 /* Handles PHY generated interrupt events. */ 3980 /* */ 3981 /* Returns: */ 3982 /* Nothing. */ 3983 /****************************************************************************/ 3984 static void 3985 bce_phy_intr(struct bce_softc *sc) 3986 { 3987 u32 new_link_state, old_link_state; 3988 3989 new_link_state = sc->status_block->status_attn_bits & 3990 STATUS_ATTN_BITS_LINK_STATE; 3991 old_link_state = sc->status_block->status_attn_bits_ack & 3992 STATUS_ATTN_BITS_LINK_STATE; 3993 3994 /* Handle any changes if the link state has changed. */ 3995 if (new_link_state != old_link_state) { 3996 3997 DBRUN(BCE_VERBOSE_INTR, bce_dump_status_block(sc)); 3998 3999 sc->bce_link = 0; 4000 callout_stop(&sc->bce_stat_ch); 4001 bce_tick_locked(sc); 4002 4003 /* Update the status_attn_bits_ack field in the status block. */ 4004 if (new_link_state) { 4005 REG_WR(sc, BCE_PCICFG_STATUS_BIT_SET_CMD, 4006 STATUS_ATTN_BITS_LINK_STATE); 4007 DBPRINT(sc, BCE_INFO, "Link is now UP.\n"); 4008 } 4009 else { 4010 REG_WR(sc, BCE_PCICFG_STATUS_BIT_CLEAR_CMD, 4011 STATUS_ATTN_BITS_LINK_STATE); 4012 DBPRINT(sc, BCE_INFO, "Link is now DOWN.\n"); 4013 } 4014 4015 } 4016 4017 /* Acknowledge the link change interrupt. */ 4018 REG_WR(sc, BCE_EMAC_STATUS, BCE_EMAC_STATUS_LINK_CHANGE); 4019 } 4020 4021 4022 /****************************************************************************/ 4023 /* Handles received frame interrupt events. */ 4024 /* */ 4025 /* Returns: */ 4026 /* Nothing. */ 4027 /****************************************************************************/ 4028 static void 4029 bce_rx_intr(struct bce_softc *sc) 4030 { 4031 struct status_block *sblk = sc->status_block; 4032 struct ifnet *ifp = sc->bce_ifp; 4033 u16 hw_cons, sw_cons, sw_chain_cons, sw_prod, sw_chain_prod; 4034 u32 sw_prod_bseq; 4035 struct l2_fhdr *l2fhdr; 4036 4037 DBRUNIF(1, sc->rx_interrupts++); 4038 4039 /* Prepare the RX chain pages to be accessed by the host CPU. */ 4040 for (int i = 0; i < RX_PAGES; i++) 4041 bus_dmamap_sync(sc->rx_bd_chain_tag, 4042 sc->rx_bd_chain_map[i], BUS_DMASYNC_POSTWRITE); 4043 4044 /* Get the hardware's view of the RX consumer index. */ 4045 hw_cons = sc->hw_rx_cons = sblk->status_rx_quick_consumer_index0; 4046 if ((hw_cons & USABLE_RX_BD_PER_PAGE) == USABLE_RX_BD_PER_PAGE) 4047 hw_cons++; 4048 4049 /* Get working copies of the driver's view of the RX indices. */ 4050 sw_cons = sc->rx_cons; 4051 sw_prod = sc->rx_prod; 4052 sw_prod_bseq = sc->rx_prod_bseq; 4053 4054 DBPRINT(sc, BCE_INFO_RECV, "%s(enter): sw_prod = 0x%04X, " 4055 "sw_cons = 0x%04X, sw_prod_bseq = 0x%08X\n", 4056 __FUNCTION__, sw_prod, sw_cons, 4057 sw_prod_bseq); 4058 4059 /* Prevent speculative reads from getting ahead of the status block. */ 4060 bus_space_barrier(sc->bce_btag, sc->bce_bhandle, 0, 0, 4061 BUS_SPACE_BARRIER_READ); 4062 4063 DBRUNIF((sc->free_rx_bd < sc->rx_low_watermark), 4064 sc->rx_low_watermark = sc->free_rx_bd); 4065 4066 /* 4067 * Scan through the receive chain as long 4068 * as there is work to do. 4069 */ 4070 while (sw_cons != hw_cons) { 4071 struct mbuf *m; 4072 struct rx_bd *rxbd; 4073 unsigned int len; 4074 u32 status; 4075 4076 /* Convert the producer/consumer indices to an actual rx_bd index. */ 4077 sw_chain_cons = RX_CHAIN_IDX(sw_cons); 4078 sw_chain_prod = RX_CHAIN_IDX(sw_prod); 4079 4080 /* Get the used rx_bd. */ 4081 rxbd = &sc->rx_bd_chain[RX_PAGE(sw_chain_cons)][RX_IDX(sw_chain_cons)]; 4082 sc->free_rx_bd++; 4083 4084 DBRUN(BCE_VERBOSE_RECV, 4085 BCE_PRINTF(sc, "%s(): ", __FUNCTION__); 4086 bce_dump_rxbd(sc, sw_chain_cons, rxbd)); 4087 4088 #ifdef DEVICE_POLLING 4089 if (ifp->if_capenable & IFCAP_POLLING) { 4090 if (sc->bce_rxcycles <= 0) 4091 break; 4092 sc->bce_rxcycles--; 4093 } 4094 #endif 4095 4096 /* The mbuf is stored with the last rx_bd entry of a packet. */ 4097 if (sc->rx_mbuf_ptr[sw_chain_cons] != NULL) { 4098 4099 /* Validate that this is the last rx_bd. */ 4100 DBRUNIF((!(rxbd->rx_bd_flags & RX_BD_FLAGS_END)), 4101 BCE_PRINTF(sc, "%s(%d): Unexpected mbuf found in rx_bd[0x%04X]!\n", 4102 __FILE__, __LINE__, sw_chain_cons); 4103 bce_breakpoint(sc)); 4104 4105 /* DRC - ToDo: If the received packet is small, say less */ 4106 /* than 128 bytes, allocate a new mbuf here, */ 4107 /* copy the data to that mbuf, and recycle */ 4108 /* the mapped jumbo frame. */ 4109 4110 /* Unmap the mbuf from DMA space. */ 4111 bus_dmamap_sync(sc->rx_mbuf_tag, 4112 sc->rx_mbuf_map[sw_chain_cons], 4113 BUS_DMASYNC_POSTREAD); 4114 bus_dmamap_unload(sc->rx_mbuf_tag, 4115 sc->rx_mbuf_map[sw_chain_cons]); 4116 4117 /* Remove the mbuf from the driver's chain. */ 4118 m = sc->rx_mbuf_ptr[sw_chain_cons]; 4119 sc->rx_mbuf_ptr[sw_chain_cons] = NULL; 4120 4121 /* 4122 * Frames received on the NetXteme II are prepended 4123 * with the l2_fhdr structure which provides status 4124 * information about the received frame (including 4125 * VLAN tags and checksum info) and are also 4126 * automatically adjusted to align the IP header 4127 * (i.e. two null bytes are inserted before the 4128 * Ethernet header). 4129 */ 4130 l2fhdr = mtod(m, struct l2_fhdr *); 4131 4132 len = l2fhdr->l2_fhdr_pkt_len; 4133 status = l2fhdr->l2_fhdr_status; 4134 4135 DBRUNIF(DB_RANDOMTRUE(bce_debug_l2fhdr_status_check), 4136 BCE_PRINTF(sc, "Simulating l2_fhdr status error.\n"); 4137 status = status | L2_FHDR_ERRORS_PHY_DECODE); 4138 4139 /* Watch for unusual sized frames. */ 4140 DBRUNIF(((len < BCE_MIN_MTU) || (len > BCE_MAX_JUMBO_ETHER_MTU_VLAN)), 4141 BCE_PRINTF(sc, "%s(%d): Unusual frame size found. " 4142 "Min(%d), Actual(%d), Max(%d)\n", 4143 __FILE__, __LINE__, (int) BCE_MIN_MTU, 4144 len, (int) BCE_MAX_JUMBO_ETHER_MTU_VLAN); 4145 bce_dump_mbuf(sc, m); 4146 bce_breakpoint(sc)); 4147 4148 len -= ETHER_CRC_LEN; 4149 4150 /* Check the received frame for errors. */ 4151 if (status & (L2_FHDR_ERRORS_BAD_CRC | 4152 L2_FHDR_ERRORS_PHY_DECODE | L2_FHDR_ERRORS_ALIGNMENT | 4153 L2_FHDR_ERRORS_TOO_SHORT | L2_FHDR_ERRORS_GIANT_FRAME)) { 4154 4155 ifp->if_ierrors++; 4156 DBRUNIF(1, sc->l2fhdr_status_errors++); 4157 4158 /* Reuse the mbuf for a new frame. */ 4159 if (bce_get_buf(sc, m, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) { 4160 4161 DBRUNIF(1, bce_breakpoint(sc)); 4162 panic("bce%d: Can't reuse RX mbuf!\n", sc->bce_unit); 4163 4164 } 4165 goto bce_rx_int_next_rx; 4166 } 4167 4168 /* 4169 * Get a new mbuf for the rx_bd. If no new 4170 * mbufs are available then reuse the current mbuf, 4171 * log an ierror on the interface, and generate 4172 * an error in the system log. 4173 */ 4174 if (bce_get_buf(sc, NULL, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) { 4175 4176 DBRUN(BCE_WARN, 4177 BCE_PRINTF(sc, "%s(%d): Failed to allocate " 4178 "new mbuf, incoming frame dropped!\n", 4179 __FILE__, __LINE__)); 4180 4181 ifp->if_ierrors++; 4182 4183 /* Try and reuse the exisitng mbuf. */ 4184 if (bce_get_buf(sc, m, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) { 4185 4186 DBRUNIF(1, bce_breakpoint(sc)); 4187 panic("bce%d: Double mbuf allocation failure!", sc->bce_unit); 4188 4189 } 4190 goto bce_rx_int_next_rx; 4191 } 4192 4193 /* Skip over the l2_fhdr when passing the data up the stack. */ 4194 m_adj(m, sizeof(struct l2_fhdr) + ETHER_ALIGN); 4195 4196 /* Adjust the packet length to match the received data. */ 4197 m->m_pkthdr.len = m->m_len = len; 4198 4199 /* Send the packet to the appropriate interface. */ 4200 m->m_pkthdr.rcvif = ifp; 4201 4202 DBRUN(BCE_VERBOSE_RECV, 4203 struct ether_header *eh; 4204 eh = mtod(m, struct ether_header *); 4205 BCE_PRINTF(sc, "%s(): to: %6D, from: %6D, type: 0x%04X\n", 4206 __FUNCTION__, eh->ether_dhost, ":", 4207 eh->ether_shost, ":", htons(eh->ether_type))); 4208 4209 /* Validate the checksum if offload enabled. */ 4210 if (ifp->if_capenable & IFCAP_RXCSUM) { 4211 4212 /* Check for an IP datagram. */ 4213 if (status & L2_FHDR_STATUS_IP_DATAGRAM) { 4214 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; 4215 4216 /* Check if the IP checksum is valid. */ 4217 if ((l2fhdr->l2_fhdr_ip_xsum ^ 0xffff) == 0) 4218 m->m_pkthdr.csum_flags |= CSUM_IP_VALID; 4219 else 4220 DBPRINT(sc, BCE_WARN_SEND, 4221 "%s(): Invalid IP checksum = 0x%04X!\n", 4222 __FUNCTION__, l2fhdr->l2_fhdr_ip_xsum); 4223 } 4224 4225 /* Check for a valid TCP/UDP frame. */ 4226 if (status & (L2_FHDR_STATUS_TCP_SEGMENT | 4227 L2_FHDR_STATUS_UDP_DATAGRAM)) { 4228 4229 /* Check for a good TCP/UDP checksum. */ 4230 if ((status & (L2_FHDR_ERRORS_TCP_XSUM | 4231 L2_FHDR_ERRORS_UDP_XSUM)) == 0) { 4232 m->m_pkthdr.csum_data = 4233 l2fhdr->l2_fhdr_tcp_udp_xsum; 4234 m->m_pkthdr.csum_flags |= (CSUM_DATA_VALID 4235 | CSUM_PSEUDO_HDR); 4236 } else 4237 DBPRINT(sc, BCE_WARN_SEND, 4238 "%s(): Invalid TCP/UDP checksum = 0x%04X!\n", 4239 __FUNCTION__, l2fhdr->l2_fhdr_tcp_udp_xsum); 4240 } 4241 } 4242 4243 4244 /* 4245 * If we received a packet with a vlan tag, 4246 * attach that information to the packet. 4247 */ 4248 if (status & L2_FHDR_STATUS_L2_VLAN_TAG) { 4249 DBPRINT(sc, BCE_VERBOSE_SEND, "%s(): VLAN tag = 0x%04X\n", 4250 __FUNCTION__, l2fhdr->l2_fhdr_vlan_tag); 4251 #if __FreeBSD_version < 700000 4252 VLAN_INPUT_TAG(ifp, m, l2fhdr->l2_fhdr_vlan_tag, continue); 4253 #else 4254 m->m_pkthdr.ether_vtag = l2fhdr->l2_fhdr_vlan_tag; 4255 m->m_flags |= M_VLANTAG; 4256 #endif 4257 } 4258 4259 /* Pass the mbuf off to the upper layers. */ 4260 ifp->if_ipackets++; 4261 DBPRINT(sc, BCE_VERBOSE_RECV, "%s(): Passing received frame up.\n", 4262 __FUNCTION__); 4263 BCE_UNLOCK(sc); 4264 (*ifp->if_input)(ifp, m); 4265 DBRUNIF(1, sc->rx_mbuf_alloc--); 4266 BCE_LOCK(sc); 4267 4268 bce_rx_int_next_rx: 4269 sw_prod = NEXT_RX_BD(sw_prod); 4270 } 4271 4272 sw_cons = NEXT_RX_BD(sw_cons); 4273 4274 /* Refresh hw_cons to see if there's new work */ 4275 if (sw_cons == hw_cons) { 4276 hw_cons = sc->hw_rx_cons = sblk->status_rx_quick_consumer_index0; 4277 if ((hw_cons & USABLE_RX_BD_PER_PAGE) == USABLE_RX_BD_PER_PAGE) 4278 hw_cons++; 4279 } 4280 4281 /* Prevent speculative reads from getting ahead of the status block. */ 4282 bus_space_barrier(sc->bce_btag, sc->bce_bhandle, 0, 0, 4283 BUS_SPACE_BARRIER_READ); 4284 } 4285 4286 for (int i = 0; i < RX_PAGES; i++) 4287 bus_dmamap_sync(sc->rx_bd_chain_tag, 4288 sc->rx_bd_chain_map[i], BUS_DMASYNC_PREWRITE); 4289 4290 sc->rx_cons = sw_cons; 4291 sc->rx_prod = sw_prod; 4292 sc->rx_prod_bseq = sw_prod_bseq; 4293 4294 REG_WR16(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BDIDX, sc->rx_prod); 4295 REG_WR(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BSEQ, sc->rx_prod_bseq); 4296 4297 DBPRINT(sc, BCE_INFO_RECV, "%s(exit): rx_prod = 0x%04X, " 4298 "rx_cons = 0x%04X, rx_prod_bseq = 0x%08X\n", 4299 __FUNCTION__, sc->rx_prod, sc->rx_cons, sc->rx_prod_bseq); 4300 } 4301 4302 4303 /****************************************************************************/ 4304 /* Handles transmit completion interrupt events. */ 4305 /* */ 4306 /* Returns: */ 4307 /* Nothing. */ 4308 /****************************************************************************/ 4309 static void 4310 bce_tx_intr(struct bce_softc *sc) 4311 { 4312 struct status_block *sblk = sc->status_block; 4313 struct ifnet *ifp = sc->bce_ifp; 4314 u16 hw_tx_cons, sw_tx_cons, sw_tx_chain_cons; 4315 4316 BCE_LOCK_ASSERT(sc); 4317 4318 DBRUNIF(1, sc->tx_interrupts++); 4319 4320 /* Get the hardware's view of the TX consumer index. */ 4321 hw_tx_cons = sc->hw_tx_cons = sblk->status_tx_quick_consumer_index0; 4322 4323 /* Skip to the next entry if this is a chain page pointer. */ 4324 if ((hw_tx_cons & USABLE_TX_BD_PER_PAGE) == USABLE_TX_BD_PER_PAGE) 4325 hw_tx_cons++; 4326 4327 sw_tx_cons = sc->tx_cons; 4328 4329 /* Prevent speculative reads from getting ahead of the status block. */ 4330 bus_space_barrier(sc->bce_btag, sc->bce_bhandle, 0, 0, 4331 BUS_SPACE_BARRIER_READ); 4332 4333 /* Cycle through any completed TX chain page entries. */ 4334 while (sw_tx_cons != hw_tx_cons) { 4335 #ifdef BCE_DEBUG 4336 struct tx_bd *txbd = NULL; 4337 #endif 4338 sw_tx_chain_cons = TX_CHAIN_IDX(sw_tx_cons); 4339 4340 DBPRINT(sc, BCE_INFO_SEND, 4341 "%s(): hw_tx_cons = 0x%04X, sw_tx_cons = 0x%04X, " 4342 "sw_tx_chain_cons = 0x%04X\n", 4343 __FUNCTION__, hw_tx_cons, sw_tx_cons, sw_tx_chain_cons); 4344 4345 DBRUNIF((sw_tx_chain_cons > MAX_TX_BD), 4346 BCE_PRINTF(sc, "%s(%d): TX chain consumer out of range! " 4347 " 0x%04X > 0x%04X\n", 4348 __FILE__, __LINE__, sw_tx_chain_cons, 4349 (int) MAX_TX_BD); 4350 bce_breakpoint(sc)); 4351 4352 DBRUNIF(1, 4353 txbd = &sc->tx_bd_chain[TX_PAGE(sw_tx_chain_cons)] 4354 [TX_IDX(sw_tx_chain_cons)]); 4355 4356 DBRUNIF((txbd == NULL), 4357 BCE_PRINTF(sc, "%s(%d): Unexpected NULL tx_bd[0x%04X]!\n", 4358 __FILE__, __LINE__, sw_tx_chain_cons); 4359 bce_breakpoint(sc)); 4360 4361 DBRUN(BCE_INFO_SEND, 4362 BCE_PRINTF(sc, "%s(): ", __FUNCTION__); 4363 bce_dump_txbd(sc, sw_tx_chain_cons, txbd)); 4364 4365 /* 4366 * Free the associated mbuf. Remember 4367 * that only the last tx_bd of a packet 4368 * has an mbuf pointer and DMA map. 4369 */ 4370 if (sc->tx_mbuf_ptr[sw_tx_chain_cons] != NULL) { 4371 4372 /* Validate that this is the last tx_bd. */ 4373 DBRUNIF((!(txbd->tx_bd_vlan_tag_flags & TX_BD_FLAGS_END)), 4374 BCE_PRINTF(sc, "%s(%d): tx_bd END flag not set but " 4375 "txmbuf == NULL!\n", __FILE__, __LINE__); 4376 bce_breakpoint(sc)); 4377 4378 DBRUN(BCE_INFO_SEND, 4379 BCE_PRINTF(sc, "%s(): Unloading map/freeing mbuf " 4380 "from tx_bd[0x%04X]\n", __FUNCTION__, sw_tx_chain_cons)); 4381 4382 /* Unmap the mbuf. */ 4383 bus_dmamap_unload(sc->tx_mbuf_tag, 4384 sc->tx_mbuf_map[sw_tx_chain_cons]); 4385 4386 /* Free the mbuf. */ 4387 m_freem(sc->tx_mbuf_ptr[sw_tx_chain_cons]); 4388 sc->tx_mbuf_ptr[sw_tx_chain_cons] = NULL; 4389 DBRUNIF(1, sc->tx_mbuf_alloc--); 4390 4391 ifp->if_opackets++; 4392 } 4393 4394 sc->used_tx_bd--; 4395 sw_tx_cons = NEXT_TX_BD(sw_tx_cons); 4396 4397 /* Refresh hw_cons to see if there's new work. */ 4398 hw_tx_cons = sc->hw_tx_cons = sblk->status_tx_quick_consumer_index0; 4399 if ((hw_tx_cons & USABLE_TX_BD_PER_PAGE) == USABLE_TX_BD_PER_PAGE) 4400 hw_tx_cons++; 4401 4402 /* Prevent speculative reads from getting ahead of the status block. */ 4403 bus_space_barrier(sc->bce_btag, sc->bce_bhandle, 0, 0, 4404 BUS_SPACE_BARRIER_READ); 4405 } 4406 4407 /* Clear the TX timeout timer. */ 4408 ifp->if_timer = 0; 4409 4410 /* Clear the tx hardware queue full flag. */ 4411 if ((sc->used_tx_bd + BCE_TX_SLACK_SPACE) < USABLE_TX_BD) { 4412 DBRUNIF((ifp->if_drv_flags & IFF_DRV_OACTIVE), 4413 BCE_PRINTF(sc, "%s(): TX chain is open for business! Used tx_bd = %d\n", 4414 __FUNCTION__, sc->used_tx_bd)); 4415 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 4416 } 4417 4418 sc->tx_cons = sw_tx_cons; 4419 } 4420 4421 4422 /****************************************************************************/ 4423 /* Disables interrupt generation. */ 4424 /* */ 4425 /* Returns: */ 4426 /* Nothing. */ 4427 /****************************************************************************/ 4428 static void 4429 bce_disable_intr(struct bce_softc *sc) 4430 { 4431 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, 4432 BCE_PCICFG_INT_ACK_CMD_MASK_INT); 4433 REG_RD(sc, BCE_PCICFG_INT_ACK_CMD); 4434 } 4435 4436 4437 /****************************************************************************/ 4438 /* Enables interrupt generation. */ 4439 /* */ 4440 /* Returns: */ 4441 /* Nothing. */ 4442 /****************************************************************************/ 4443 static void 4444 bce_enable_intr(struct bce_softc *sc) 4445 { 4446 u32 val; 4447 4448 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, 4449 BCE_PCICFG_INT_ACK_CMD_INDEX_VALID | 4450 BCE_PCICFG_INT_ACK_CMD_MASK_INT | sc->last_status_idx); 4451 4452 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, 4453 BCE_PCICFG_INT_ACK_CMD_INDEX_VALID | sc->last_status_idx); 4454 4455 val = REG_RD(sc, BCE_HC_COMMAND); 4456 REG_WR(sc, BCE_HC_COMMAND, val | BCE_HC_COMMAND_COAL_NOW); 4457 } 4458 4459 4460 /****************************************************************************/ 4461 /* Handles controller initialization. */ 4462 /* */ 4463 /* Must be called from a locked routine. */ 4464 /* */ 4465 /* Returns: */ 4466 /* Nothing. */ 4467 /****************************************************************************/ 4468 static void 4469 bce_init_locked(struct bce_softc *sc) 4470 { 4471 struct ifnet *ifp; 4472 u32 ether_mtu; 4473 4474 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 4475 4476 BCE_LOCK_ASSERT(sc); 4477 4478 ifp = sc->bce_ifp; 4479 4480 /* Check if the driver is still running and bail out if it is. */ 4481 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 4482 goto bce_init_locked_exit; 4483 4484 bce_stop(sc); 4485 4486 if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) { 4487 BCE_PRINTF(sc, "%s(%d): Controller reset failed!\n", 4488 __FILE__, __LINE__); 4489 goto bce_init_locked_exit; 4490 } 4491 4492 if (bce_chipinit(sc)) { 4493 BCE_PRINTF(sc, "%s(%d): Controller initialization failed!\n", 4494 __FILE__, __LINE__); 4495 goto bce_init_locked_exit; 4496 } 4497 4498 if (bce_blockinit(sc)) { 4499 BCE_PRINTF(sc, "%s(%d): Block initialization failed!\n", 4500 __FILE__, __LINE__); 4501 goto bce_init_locked_exit; 4502 } 4503 4504 /* Load our MAC address. */ 4505 bcopy(IF_LLADDR(sc->bce_ifp), sc->eaddr, ETHER_ADDR_LEN); 4506 bce_set_mac_addr(sc); 4507 4508 /* Calculate and program the Ethernet MTU size. */ 4509 ether_mtu = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ifp->if_mtu + 4510 ETHER_CRC_LEN; 4511 4512 DBPRINT(sc, BCE_INFO, "%s(): setting mtu = %d\n",__FUNCTION__, ether_mtu); 4513 4514 /* 4515 * Program the mtu, enabling jumbo frame 4516 * support if necessary. Also set the mbuf 4517 * allocation count for RX frames. 4518 */ 4519 if (ether_mtu > ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) { 4520 REG_WR(sc, BCE_EMAC_RX_MTU_SIZE, ether_mtu | 4521 BCE_EMAC_RX_MTU_SIZE_JUMBO_ENA); 4522 sc->mbuf_alloc_size = MJUM9BYTES; 4523 } else { 4524 REG_WR(sc, BCE_EMAC_RX_MTU_SIZE, ether_mtu); 4525 sc->mbuf_alloc_size = MCLBYTES; 4526 } 4527 4528 /* Calculate the RX Ethernet frame size for rx_bd's. */ 4529 sc->max_frame_size = sizeof(struct l2_fhdr) + 2 + ether_mtu + 8; 4530 4531 DBPRINT(sc, BCE_INFO, 4532 "%s(): mclbytes = %d, mbuf_alloc_size = %d, " 4533 "max_frame_size = %d\n", 4534 __FUNCTION__, (int) MCLBYTES, sc->mbuf_alloc_size, sc->max_frame_size); 4535 4536 /* Program appropriate promiscuous/multicast filtering. */ 4537 bce_set_rx_mode(sc); 4538 4539 /* Init RX buffer descriptor chain. */ 4540 bce_init_rx_chain(sc); 4541 4542 /* Init TX buffer descriptor chain. */ 4543 bce_init_tx_chain(sc); 4544 4545 #ifdef DEVICE_POLLING 4546 /* Disable interrupts if we are polling. */ 4547 if (ifp->if_capenable & IFCAP_POLLING) { 4548 bce_disable_intr(sc); 4549 4550 REG_WR(sc, BCE_HC_RX_QUICK_CONS_TRIP, 4551 (1 << 16) | sc->bce_rx_quick_cons_trip); 4552 REG_WR(sc, BCE_HC_TX_QUICK_CONS_TRIP, 4553 (1 << 16) | sc->bce_tx_quick_cons_trip); 4554 } else 4555 #endif 4556 /* Enable host interrupts. */ 4557 bce_enable_intr(sc); 4558 4559 bce_ifmedia_upd(ifp); 4560 4561 ifp->if_drv_flags |= IFF_DRV_RUNNING; 4562 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 4563 4564 callout_reset(&sc->bce_stat_ch, hz, bce_tick, sc); 4565 4566 bce_init_locked_exit: 4567 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 4568 4569 return; 4570 } 4571 4572 4573 /****************************************************************************/ 4574 /* Handles controller initialization when called from an unlocked routine. */ 4575 /* */ 4576 /* Returns: */ 4577 /* Nothing. */ 4578 /****************************************************************************/ 4579 static void 4580 bce_init(void *xsc) 4581 { 4582 struct bce_softc *sc = xsc; 4583 4584 BCE_LOCK(sc); 4585 bce_init_locked(sc); 4586 BCE_UNLOCK(sc); 4587 } 4588 4589 4590 /****************************************************************************/ 4591 /* Encapsultes an mbuf cluster into the tx_bd chain structure and makes the */ 4592 /* memory visible to the controller. */ 4593 /* */ 4594 /* Returns: */ 4595 /* 0 for success, positive value for failure. */ 4596 /****************************************************************************/ 4597 static int 4598 bce_tx_encap(struct bce_softc *sc, struct mbuf *m_head, u16 *prod, 4599 u16 *chain_prod, u32 *prod_bseq) 4600 { 4601 u32 vlan_tag_flags = 0; 4602 struct bce_dmamap_arg map_arg; 4603 bus_dmamap_t map; 4604 int i, error, rc = 0; 4605 4606 /* Transfer any checksum offload flags to the bd. */ 4607 if (m_head->m_pkthdr.csum_flags) { 4608 if (m_head->m_pkthdr.csum_flags & CSUM_IP) 4609 vlan_tag_flags |= TX_BD_FLAGS_IP_CKSUM; 4610 if (m_head->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)) 4611 vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; 4612 } 4613 4614 /* Transfer any VLAN tags to the bd. */ 4615 if (m_head->m_flags & M_VLANTAG) 4616 vlan_tag_flags |= (TX_BD_FLAGS_VLAN_TAG | 4617 (m_head->m_pkthdr.ether_vtag << 16)); 4618 4619 /* Map the mbuf into DMAable memory. */ 4620 map = sc->tx_mbuf_map[*chain_prod]; 4621 map_arg.sc = sc; 4622 map_arg.prod = *prod; 4623 map_arg.chain_prod = *chain_prod; 4624 map_arg.prod_bseq = *prod_bseq; 4625 map_arg.tx_flags = vlan_tag_flags; 4626 map_arg.maxsegs = USABLE_TX_BD - sc->used_tx_bd - 4627 BCE_TX_SLACK_SPACE; 4628 4629 KASSERT(map_arg.maxsegs > 0, ("Invalid TX maxsegs value!")); 4630 4631 for (i = 0; i < TX_PAGES; i++) 4632 map_arg.tx_chain[i] = sc->tx_bd_chain[i]; 4633 4634 /* Map the mbuf into our DMA address space. */ 4635 error = bus_dmamap_load_mbuf(sc->tx_mbuf_tag, map, m_head, 4636 bce_dma_map_tx_desc, &map_arg, BUS_DMA_NOWAIT); 4637 4638 if (error || map_arg.maxsegs == 0) { 4639 4640 /* Try to defrag the mbuf if there are too many segments. */ 4641 if (error == EFBIG && map_arg.maxsegs != 0) { 4642 struct mbuf *m0; 4643 4644 DBPRINT(sc, BCE_WARN, "%s(): fragmented mbuf (%d pieces)\n", 4645 __FUNCTION__, map_arg.maxsegs); 4646 4647 m0 = m_defrag(m_head, M_DONTWAIT); 4648 if (m0 != NULL) { 4649 m_head = m0; 4650 error = bus_dmamap_load_mbuf(sc->tx_mbuf_tag, 4651 map, m_head, bce_dma_map_tx_desc, &map_arg, 4652 BUS_DMA_NOWAIT); 4653 } 4654 } 4655 4656 /* Still getting an error after a defrag. */ 4657 if (error) { 4658 BCE_PRINTF(sc, 4659 "%s(%d): Error mapping mbuf into TX chain!\n", 4660 __FILE__, __LINE__); 4661 rc = ENOBUFS; 4662 goto bce_tx_encap_exit; 4663 } 4664 4665 } 4666 4667 /* 4668 * Ensure that the map for this transmission 4669 * is placed at the array index of the last 4670 * descriptor in this chain. This is done 4671 * because a single map is used for all 4672 * segments of the mbuf and we don't want to 4673 * delete the map before all of the segments 4674 * have been freed. 4675 */ 4676 sc->tx_mbuf_map[*chain_prod] = 4677 sc->tx_mbuf_map[map_arg.chain_prod]; 4678 sc->tx_mbuf_map[map_arg.chain_prod] = map; 4679 sc->tx_mbuf_ptr[map_arg.chain_prod] = m_head; 4680 sc->used_tx_bd += map_arg.maxsegs; 4681 4682 DBRUNIF((sc->used_tx_bd > sc->tx_hi_watermark), 4683 sc->tx_hi_watermark = sc->used_tx_bd); 4684 4685 DBRUNIF(1, sc->tx_mbuf_alloc++); 4686 4687 DBRUN(BCE_VERBOSE_SEND, bce_dump_tx_mbuf_chain(sc, *chain_prod, 4688 map_arg.maxsegs)); 4689 4690 /* prod still points the last used tx_bd at this point. */ 4691 *prod = map_arg.prod; 4692 *chain_prod = map_arg.chain_prod; 4693 *prod_bseq = map_arg.prod_bseq; 4694 4695 bce_tx_encap_exit: 4696 4697 return(rc); 4698 } 4699 4700 4701 /****************************************************************************/ 4702 /* Main transmit routine when called from another routine with a lock. */ 4703 /* */ 4704 /* Returns: */ 4705 /* Nothing. */ 4706 /****************************************************************************/ 4707 static void 4708 bce_start_locked(struct ifnet *ifp) 4709 { 4710 struct bce_softc *sc = ifp->if_softc; 4711 struct mbuf *m_head = NULL; 4712 int count = 0; 4713 u16 tx_prod, tx_chain_prod; 4714 u32 tx_prod_bseq; 4715 4716 /* If there's no link or the transmit queue is empty then just exit. */ 4717 if (!sc->bce_link || IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { 4718 DBPRINT(sc, BCE_INFO_SEND, "%s(): No link or transmit queue empty.\n", 4719 __FUNCTION__); 4720 goto bce_start_locked_exit; 4721 } 4722 4723 /* prod points to the next free tx_bd. */ 4724 tx_prod = sc->tx_prod; 4725 tx_chain_prod = TX_CHAIN_IDX(tx_prod); 4726 tx_prod_bseq = sc->tx_prod_bseq; 4727 4728 DBPRINT(sc, BCE_INFO_SEND, 4729 "%s(): Start: tx_prod = 0x%04X, tx_chain_prod = %04X, " 4730 "tx_prod_bseq = 0x%08X\n", 4731 __FUNCTION__, tx_prod, tx_chain_prod, tx_prod_bseq); 4732 4733 /* Keep adding entries while there is space in the ring. */ 4734 while(sc->tx_mbuf_ptr[tx_chain_prod] == NULL) { 4735 4736 /* Check for any frames to send. */ 4737 IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); 4738 if (m_head == NULL) 4739 break; 4740 4741 /* 4742 * Pack the data into the transmit ring. If we 4743 * don't have room, place the mbuf back at the 4744 * head of the queue and set the OACTIVE flag 4745 * to wait for the NIC to drain the chain. 4746 */ 4747 if (bce_tx_encap(sc, m_head, &tx_prod, &tx_chain_prod, &tx_prod_bseq)) { 4748 IFQ_DRV_PREPEND(&ifp->if_snd, m_head); 4749 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 4750 DBPRINT(sc, BCE_INFO_SEND, 4751 "TX chain is closed for business! Total tx_bd used = %d\n", 4752 sc->used_tx_bd); 4753 break; 4754 } 4755 4756 count++; 4757 4758 /* Send a copy of the frame to any BPF listeners. */ 4759 BPF_MTAP(ifp, m_head); 4760 4761 tx_prod = NEXT_TX_BD(tx_prod); 4762 tx_chain_prod = TX_CHAIN_IDX(tx_prod); 4763 } 4764 4765 if (count == 0) { 4766 /* no packets were dequeued */ 4767 DBPRINT(sc, BCE_VERBOSE_SEND, "%s(): No packets were dequeued\n", 4768 __FUNCTION__); 4769 goto bce_start_locked_exit; 4770 } 4771 4772 /* Update the driver's counters. */ 4773 sc->tx_prod = tx_prod; 4774 sc->tx_prod_bseq = tx_prod_bseq; 4775 4776 DBPRINT(sc, BCE_INFO_SEND, 4777 "%s(): End: tx_prod = 0x%04X, tx_chain_prod = 0x%04X, " 4778 "tx_prod_bseq = 0x%08X\n", 4779 __FUNCTION__, tx_prod, tx_chain_prod, tx_prod_bseq); 4780 4781 /* Start the transmit. */ 4782 REG_WR16(sc, MB_TX_CID_ADDR + BCE_L2CTX_TX_HOST_BIDX, sc->tx_prod); 4783 REG_WR(sc, MB_TX_CID_ADDR + BCE_L2CTX_TX_HOST_BSEQ, sc->tx_prod_bseq); 4784 4785 /* Set the tx timeout. */ 4786 ifp->if_timer = BCE_TX_TIMEOUT; 4787 4788 bce_start_locked_exit: 4789 return; 4790 } 4791 4792 4793 /****************************************************************************/ 4794 /* Main transmit routine when called from another routine without a lock. */ 4795 /* */ 4796 /* Returns: */ 4797 /* Nothing. */ 4798 /****************************************************************************/ 4799 static void 4800 bce_start(struct ifnet *ifp) 4801 { 4802 struct bce_softc *sc = ifp->if_softc; 4803 4804 BCE_LOCK(sc); 4805 bce_start_locked(ifp); 4806 BCE_UNLOCK(sc); 4807 } 4808 4809 4810 /****************************************************************************/ 4811 /* Handles any IOCTL calls from the operating system. */ 4812 /* */ 4813 /* Returns: */ 4814 /* 0 for success, positive value for failure. */ 4815 /****************************************************************************/ 4816 static int 4817 bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) 4818 { 4819 struct bce_softc *sc = ifp->if_softc; 4820 struct ifreq *ifr = (struct ifreq *) data; 4821 struct mii_data *mii; 4822 int mask, error = 0; 4823 4824 DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); 4825 4826 switch(command) { 4827 4828 /* Set the MTU. */ 4829 case SIOCSIFMTU: 4830 /* Check that the MTU setting is supported. */ 4831 if ((ifr->ifr_mtu < BCE_MIN_MTU) || 4832 (ifr->ifr_mtu > BCE_MAX_JUMBO_MTU)) { 4833 error = EINVAL; 4834 break; 4835 } 4836 4837 DBPRINT(sc, BCE_INFO, "Setting new MTU of %d\n", ifr->ifr_mtu); 4838 4839 BCE_LOCK(sc); 4840 ifp->if_mtu = ifr->ifr_mtu; 4841 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 4842 bce_init_locked(sc); 4843 BCE_UNLOCK(sc); 4844 break; 4845 4846 /* Set interface. */ 4847 case SIOCSIFFLAGS: 4848 DBPRINT(sc, BCE_VERBOSE, "Received SIOCSIFFLAGS\n"); 4849 4850 BCE_LOCK(sc); 4851 4852 /* Check if the interface is up. */ 4853 if (ifp->if_flags & IFF_UP) { 4854 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 4855 /* Change the promiscuous/multicast flags as necessary. */ 4856 bce_set_rx_mode(sc); 4857 } else { 4858 /* Start the HW */ 4859 bce_init_locked(sc); 4860 } 4861 } else { 4862 /* The interface is down. Check if the driver is running. */ 4863 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 4864 bce_stop(sc); 4865 } 4866 } 4867 4868 BCE_UNLOCK(sc); 4869 error = 0; 4870 4871 break; 4872 4873 /* Add/Delete multicast address */ 4874 case SIOCADDMULTI: 4875 case SIOCDELMULTI: 4876 DBPRINT(sc, BCE_VERBOSE, "Received SIOCADDMULTI/SIOCDELMULTI\n"); 4877 4878 BCE_LOCK(sc); 4879 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 4880 bce_set_rx_mode(sc); 4881 error = 0; 4882 } 4883 BCE_UNLOCK(sc); 4884 4885 break; 4886 4887 /* Set/Get Interface media */ 4888 case SIOCSIFMEDIA: 4889 case SIOCGIFMEDIA: 4890 DBPRINT(sc, BCE_VERBOSE, "Received SIOCSIFMEDIA/SIOCGIFMEDIA\n"); 4891 4892 DBPRINT(sc, BCE_VERBOSE, "bce_phy_flags = 0x%08X\n", 4893 sc->bce_phy_flags); 4894 4895 if (sc->bce_phy_flags & BCE_PHY_SERDES_FLAG) { 4896 DBPRINT(sc, BCE_VERBOSE, "SerDes media set/get\n"); 4897 4898 error = ifmedia_ioctl(ifp, ifr, 4899 &sc->bce_ifmedia, command); 4900 } else { 4901 DBPRINT(sc, BCE_VERBOSE, "Copper media set/get\n"); 4902 mii = device_get_softc(sc->bce_miibus); 4903 error = ifmedia_ioctl(ifp, ifr, 4904 &mii->mii_media, command); 4905 } 4906 break; 4907 4908 /* Set interface capability */ 4909 case SIOCSIFCAP: 4910 mask = ifr->ifr_reqcap ^ ifp->if_capenable; 4911 DBPRINT(sc, BCE_INFO, "Received SIOCSIFCAP = 0x%08X\n", (u32) mask); 4912 4913 #ifdef DEVICE_POLLING 4914 if (mask & IFCAP_POLLING) { 4915 if (ifr->ifr_reqcap & IFCAP_POLLING) { 4916 4917 /* Setup the poll routine to call. */ 4918 error = ether_poll_register(bce_poll, ifp); 4919 if (error) { 4920 BCE_PRINTF(sc, "%s(%d): Error registering poll function!\n", 4921 __FILE__, __LINE__); 4922 goto bce_ioctl_exit; 4923 } 4924 4925 /* Clear the interrupt. */ 4926 BCE_LOCK(sc); 4927 bce_disable_intr(sc); 4928 4929 REG_WR(sc, BCE_HC_RX_QUICK_CONS_TRIP, 4930 (1 << 16) | sc->bce_rx_quick_cons_trip); 4931 REG_WR(sc, BCE_HC_TX_QUICK_CONS_TRIP, 4932 (1 << 16) | sc->bce_tx_quick_cons_trip); 4933 4934 ifp->if_capenable |= IFCAP_POLLING; 4935 BCE_UNLOCK(sc); 4936 } else { 4937 /* Clear the poll routine. */ 4938 error = ether_poll_deregister(ifp); 4939 4940 /* Enable interrupt even in error case */ 4941 BCE_LOCK(sc); 4942 bce_enable_intr(sc); 4943 4944 REG_WR(sc, BCE_HC_TX_QUICK_CONS_TRIP, 4945 (sc->bce_tx_quick_cons_trip_int << 16) | 4946 sc->bce_tx_quick_cons_trip); 4947 REG_WR(sc, BCE_HC_RX_QUICK_CONS_TRIP, 4948 (sc->bce_rx_quick_cons_trip_int << 16) | 4949 sc->bce_rx_quick_cons_trip); 4950 4951 ifp->if_capenable &= ~IFCAP_POLLING; 4952 BCE_UNLOCK(sc); 4953 } 4954 } 4955 #endif /*DEVICE_POLLING */ 4956 4957 /* Toggle the TX checksum capabilites enable flag. */ 4958 if (mask & IFCAP_TXCSUM) { 4959 ifp->if_capenable ^= IFCAP_TXCSUM; 4960 if (IFCAP_TXCSUM & ifp->if_capenable) 4961 ifp->if_hwassist = BCE_IF_HWASSIST; 4962 else 4963 ifp->if_hwassist = 0; 4964 } 4965 4966 /* Toggle the RX checksum capabilities enable flag. */ 4967 if (mask & IFCAP_RXCSUM) { 4968 ifp->if_capenable ^= IFCAP_RXCSUM; 4969 if (IFCAP_RXCSUM & ifp->if_capenable) 4970 ifp->if_hwassist = BCE_IF_HWASSIST; 4971 else 4972 ifp->if_hwassist = 0; 4973 } 4974 4975 /* Toggle VLAN_MTU capabilities enable flag. */ 4976 if (mask & IFCAP_VLAN_MTU) { 4977 BCE_PRINTF(sc, "%s(%d): Changing VLAN_MTU not supported.\n", 4978 __FILE__, __LINE__); 4979 } 4980 4981 /* Toggle VLANHWTAG capabilities enabled flag. */ 4982 if (mask & IFCAP_VLAN_HWTAGGING) { 4983 if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) 4984 BCE_PRINTF(sc, "%s(%d): Cannot change VLAN_HWTAGGING while " 4985 "management firmware (ASF/IPMI/UMP) is running!\n", 4986 __FILE__, __LINE__); 4987 else 4988 BCE_PRINTF(sc, "%s(%d): Changing VLAN_HWTAGGING not supported!\n", 4989 __FILE__, __LINE__); 4990 } 4991 4992 break; 4993 default: 4994 DBPRINT(sc, BCE_INFO, "Received unsupported IOCTL: 0x%08X\n", 4995 (u32) command); 4996 4997 /* We don't know how to handle the IOCTL, pass it on. */ 4998 error = ether_ioctl(ifp, command, data); 4999 break; 5000 } 5001 5002 #ifdef DEVICE_POLLING 5003 bce_ioctl_exit: 5004 #endif 5005 5006 DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); 5007 5008 return(error); 5009 } 5010 5011 5012 /****************************************************************************/ 5013 /* Transmit timeout handler. */ 5014 /* */ 5015 /* Returns: */ 5016 /* Nothing. */ 5017 /****************************************************************************/ 5018 static void 5019 bce_watchdog(struct ifnet *ifp) 5020 { 5021 struct bce_softc *sc = ifp->if_softc; 5022 5023 DBRUN(BCE_WARN_SEND, 5024 bce_dump_driver_state(sc); 5025 bce_dump_status_block(sc)); 5026 5027 BCE_PRINTF(sc, "%s(%d): Watchdog timeout occurred, resetting!\n", 5028 __FILE__, __LINE__); 5029 5030 /* DBRUN(BCE_FATAL, bce_breakpoint(sc)); */ 5031 5032 BCE_LOCK(sc); 5033 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 5034 5035 bce_init_locked(sc); 5036 ifp->if_oerrors++; 5037 BCE_UNLOCK(sc); 5038 5039 } 5040 5041 5042 #ifdef DEVICE_POLLING 5043 static void 5044 bce_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count) 5045 { 5046 struct bce_softc *sc = ifp->if_softc; 5047 5048 BCE_LOCK_ASSERT(sc); 5049 5050 sc->bce_rxcycles = count; 5051 5052 bus_dmamap_sync(sc->status_tag, sc->status_map, 5053 BUS_DMASYNC_POSTWRITE); 5054 5055 /* Check for any completed RX frames. */ 5056 if (sc->status_block->status_rx_quick_consumer_index0 != 5057 sc->hw_rx_cons) 5058 bce_rx_intr(sc); 5059 5060 /* Check for any completed TX frames. */ 5061 if (sc->status_block->status_tx_quick_consumer_index0 != 5062 sc->hw_tx_cons) 5063 bce_tx_intr(sc); 5064 5065 /* Check for new frames to transmit. */ 5066 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) 5067 bce_start_locked(ifp); 5068 5069 } 5070 5071 5072 static void 5073 bce_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) 5074 { 5075 struct bce_softc *sc = ifp->if_softc; 5076 5077 BCE_LOCK(sc); 5078 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 5079 bce_poll_locked(ifp, cmd, count); 5080 BCE_UNLOCK(sc); 5081 } 5082 #endif /* DEVICE_POLLING */ 5083 5084 5085 #if 0 5086 static inline int 5087 bce_has_work(struct bce_softc *sc) 5088 { 5089 struct status_block *stat = sc->status_block; 5090 5091 if ((stat->status_rx_quick_consumer_index0 != sc->hw_rx_cons) || 5092 (stat->status_tx_quick_consumer_index0 != sc->hw_tx_cons)) 5093 return 1; 5094 5095 if (((stat->status_attn_bits & STATUS_ATTN_BITS_LINK_STATE) != 0) != 5096 bp->link_up) 5097 return 1; 5098 5099 return 0; 5100 } 5101 #endif 5102 5103 5104 /* 5105 * Interrupt handler. 5106 */ 5107 /****************************************************************************/ 5108 /* Main interrupt entry point. Verifies that the controller generated the */ 5109 /* interrupt and then calls a separate routine for handle the various */ 5110 /* interrupt causes (PHY, TX, RX). */ 5111 /* */ 5112 /* Returns: */ 5113 /* 0 for success, positive value for failure. */ 5114 /****************************************************************************/ 5115 static void 5116 bce_intr(void *xsc) 5117 { 5118 struct bce_softc *sc; 5119 struct ifnet *ifp; 5120 u32 status_attn_bits; 5121 5122 sc = xsc; 5123 ifp = sc->bce_ifp; 5124 5125 BCE_LOCK(sc); 5126 5127 DBRUNIF(1, sc->interrupts_generated++); 5128 5129 #ifdef DEVICE_POLLING 5130 if (ifp->if_capenable & IFCAP_POLLING) { 5131 DBPRINT(sc, BCE_INFO, "Polling enabled!\n"); 5132 goto bce_intr_exit; 5133 } 5134 #endif 5135 5136 bus_dmamap_sync(sc->status_tag, sc->status_map, 5137 BUS_DMASYNC_POSTWRITE); 5138 5139 /* 5140 * If the hardware status block index 5141 * matches the last value read by the 5142 * driver and we haven't asserted our 5143 * interrupt then there's nothing to do. 5144 */ 5145 if ((sc->status_block->status_idx == sc->last_status_idx) && 5146 (REG_RD(sc, BCE_PCICFG_MISC_STATUS) & BCE_PCICFG_MISC_STATUS_INTA_VALUE)) 5147 goto bce_intr_exit; 5148 5149 /* Ack the interrupt and stop others from occuring. */ 5150 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, 5151 BCE_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | 5152 BCE_PCICFG_INT_ACK_CMD_MASK_INT); 5153 5154 /* Keep processing data as long as there is work to do. */ 5155 for (;;) { 5156 5157 status_attn_bits = sc->status_block->status_attn_bits; 5158 5159 DBRUNIF(DB_RANDOMTRUE(bce_debug_unexpected_attention), 5160 BCE_PRINTF(sc, "Simulating unexpected status attention bit set."); 5161 status_attn_bits = status_attn_bits | STATUS_ATTN_BITS_PARITY_ERROR); 5162 5163 /* Was it a link change interrupt? */ 5164 if ((status_attn_bits & STATUS_ATTN_BITS_LINK_STATE) != 5165 (sc->status_block->status_attn_bits_ack & STATUS_ATTN_BITS_LINK_STATE)) 5166 bce_phy_intr(sc); 5167 5168 /* If any other attention is asserted then the chip is toast. */ 5169 if (((status_attn_bits & ~STATUS_ATTN_BITS_LINK_STATE) != 5170 (sc->status_block->status_attn_bits_ack & 5171 ~STATUS_ATTN_BITS_LINK_STATE))) { 5172 5173 DBRUN(1, sc->unexpected_attentions++); 5174 5175 BCE_PRINTF(sc, "%s(%d): Fatal attention detected: 0x%08X\n", 5176 __FILE__, __LINE__, sc->status_block->status_attn_bits); 5177 5178 DBRUN(BCE_FATAL, 5179 if (bce_debug_unexpected_attention == 0) 5180 bce_breakpoint(sc)); 5181 5182 bce_init_locked(sc); 5183 goto bce_intr_exit; 5184 } 5185 5186 /* Check for any completed RX frames. */ 5187 if (sc->status_block->status_rx_quick_consumer_index0 != sc->hw_rx_cons) 5188 bce_rx_intr(sc); 5189 5190 /* Check for any completed TX frames. */ 5191 if (sc->status_block->status_tx_quick_consumer_index0 != sc->hw_tx_cons) 5192 bce_tx_intr(sc); 5193 5194 /* Save the status block index value for use during the next interrupt. */ 5195 sc->last_status_idx = sc->status_block->status_idx; 5196 5197 /* Prevent speculative reads from getting ahead of the status block. */ 5198 bus_space_barrier(sc->bce_btag, sc->bce_bhandle, 0, 0, 5199 BUS_SPACE_BARRIER_READ); 5200 5201 /* If there's no work left then exit the interrupt service routine. */ 5202 if ((sc->status_block->status_rx_quick_consumer_index0 == sc->hw_rx_cons) && 5203 (sc->status_block->status_tx_quick_consumer_index0 == sc->hw_tx_cons)) 5204 break; 5205 5206 } 5207 5208 bus_dmamap_sync(sc->status_tag, sc->status_map, 5209 BUS_DMASYNC_PREWRITE); 5210 5211 /* Re-enable interrupts. */ 5212 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, 5213 BCE_PCICFG_INT_ACK_CMD_INDEX_VALID | sc->last_status_idx | 5214 BCE_PCICFG_INT_ACK_CMD_MASK_INT); 5215 REG_WR(sc, BCE_PCICFG_INT_ACK_CMD, 5216 BCE_PCICFG_INT_ACK_CMD_INDEX_VALID | sc->last_status_idx); 5217 5218 /* Handle any frames that arrived while handling the interrupt. */ 5219 if (ifp->if_drv_flags & IFF_DRV_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) 5220 bce_start_locked(ifp); 5221 5222 bce_intr_exit: 5223 BCE_UNLOCK(sc); 5224 } 5225 5226 5227 /****************************************************************************/ 5228 /* Programs the various packet receive modes (broadcast and multicast). */ 5229 /* */ 5230 /* Returns: */ 5231 /* Nothing. */ 5232 /****************************************************************************/ 5233 static void 5234 bce_set_rx_mode(struct bce_softc *sc) 5235 { 5236 struct ifnet *ifp; 5237 struct ifmultiaddr *ifma; 5238 u32 hashes[4] = { 0, 0, 0, 0 }; 5239 u32 rx_mode, sort_mode; 5240 int h, i; 5241 5242 BCE_LOCK_ASSERT(sc); 5243 5244 ifp = sc->bce_ifp; 5245 5246 /* Initialize receive mode default settings. */ 5247 rx_mode = sc->rx_mode & ~(BCE_EMAC_RX_MODE_PROMISCUOUS | 5248 BCE_EMAC_RX_MODE_KEEP_VLAN_TAG); 5249 sort_mode = 1 | BCE_RPM_SORT_USER0_BC_EN; 5250 5251 /* 5252 * ASF/IPMI/UMP firmware requires that VLAN tag stripping 5253 * be enbled. 5254 */ 5255 if (!(BCE_IF_CAPABILITIES & IFCAP_VLAN_HWTAGGING) && 5256 (!(sc->bce_flags & BCE_MFW_ENABLE_FLAG))) 5257 rx_mode |= BCE_EMAC_RX_MODE_KEEP_VLAN_TAG; 5258 5259 /* 5260 * Check for promiscuous, all multicast, or selected 5261 * multicast address filtering. 5262 */ 5263 if (ifp->if_flags & IFF_PROMISC) { 5264 DBPRINT(sc, BCE_INFO, "Enabling promiscuous mode.\n"); 5265 5266 /* Enable promiscuous mode. */ 5267 rx_mode |= BCE_EMAC_RX_MODE_PROMISCUOUS; 5268 sort_mode |= BCE_RPM_SORT_USER0_PROM_EN; 5269 } else if (ifp->if_flags & IFF_ALLMULTI) { 5270 DBPRINT(sc, BCE_INFO, "Enabling all multicast mode.\n"); 5271 5272 /* Enable all multicast addresses. */ 5273 for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { 5274 REG_WR(sc, BCE_EMAC_MULTICAST_HASH0 + (i * 4), 0xffffffff); 5275 } 5276 sort_mode |= BCE_RPM_SORT_USER0_MC_EN; 5277 } else { 5278 /* Accept one or more multicast(s). */ 5279 DBPRINT(sc, BCE_INFO, "Enabling selective multicast mode.\n"); 5280 5281 IF_ADDR_LOCK(ifp); 5282 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 5283 if (ifma->ifma_addr->sa_family != AF_LINK) 5284 continue; 5285 h = ether_crc32_le(LLADDR((struct sockaddr_dl *) 5286 ifma->ifma_addr), ETHER_ADDR_LEN) & 0x7F; 5287 hashes[(h & 0x60) >> 5] |= 1 << (h & 0x1F); 5288 } 5289 IF_ADDR_UNLOCK(ifp); 5290 5291 for (i = 0; i < 4; i++) 5292 REG_WR(sc, BCE_EMAC_MULTICAST_HASH0 + (i * 4), hashes[i]); 5293 5294 sort_mode |= BCE_RPM_SORT_USER0_MC_HSH_EN; 5295 } 5296 5297 /* Only make changes if the recive mode has actually changed. */ 5298 if (rx_mode != sc->rx_mode) { 5299 DBPRINT(sc, BCE_VERBOSE, "Enabling new receive mode: 0x%08X\n", 5300 rx_mode); 5301 5302 sc->rx_mode = rx_mode; 5303 REG_WR(sc, BCE_EMAC_RX_MODE, rx_mode); 5304 } 5305 5306 /* Disable and clear the exisitng sort before enabling a new sort. */ 5307 REG_WR(sc, BCE_RPM_SORT_USER0, 0x0); 5308 REG_WR(sc, BCE_RPM_SORT_USER0, sort_mode); 5309 REG_WR(sc, BCE_RPM_SORT_USER0, sort_mode | BCE_RPM_SORT_USER0_ENA); 5310 } 5311 5312 5313 /****************************************************************************/ 5314 /* Called periodically to updates statistics from the controllers */ 5315 /* statistics block. */ 5316 /* */ 5317 /* Returns: */ 5318 /* Nothing. */ 5319 /****************************************************************************/ 5320 static void 5321 bce_stats_update(struct bce_softc *sc) 5322 { 5323 struct ifnet *ifp; 5324 struct statistics_block *stats; 5325 5326 DBPRINT(sc, BCE_EXCESSIVE, "Entering %s()\n", __FUNCTION__); 5327 5328 ifp = sc->bce_ifp; 5329 5330 stats = (struct statistics_block *) sc->stats_block; 5331 5332 /* 5333 * Update the interface statistics from the 5334 * hardware statistics. 5335 */ 5336 ifp->if_collisions = (u_long) stats->stat_EtherStatsCollisions; 5337 5338 ifp->if_ierrors = (u_long) stats->stat_EtherStatsUndersizePkts + 5339 (u_long) stats->stat_EtherStatsOverrsizePkts + 5340 (u_long) stats->stat_IfInMBUFDiscards + 5341 (u_long) stats->stat_Dot3StatsAlignmentErrors + 5342 (u_long) stats->stat_Dot3StatsFCSErrors; 5343 5344 ifp->if_oerrors = (u_long) stats->stat_emac_tx_stat_dot3statsinternalmactransmiterrors + 5345 (u_long) stats->stat_Dot3StatsExcessiveCollisions + 5346 (u_long) stats->stat_Dot3StatsLateCollisions; 5347 5348 /* 5349 * Certain controllers don't report 5350 * carrier sense errors correctly. 5351 * See errata E11_5708CA0_1165. 5352 */ 5353 if (!(BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5706) && 5354 !(BCE_CHIP_ID(sc) == BCE_CHIP_ID_5708_A0)) 5355 ifp->if_oerrors += (u_long) stats->stat_Dot3StatsCarrierSenseErrors; 5356 5357 /* 5358 * Update the sysctl statistics from the 5359 * hardware statistics. 5360 */ 5361 sc->stat_IfHCInOctets = 5362 ((u64) stats->stat_IfHCInOctets_hi << 32) + 5363 (u64) stats->stat_IfHCInOctets_lo; 5364 5365 sc->stat_IfHCInBadOctets = 5366 ((u64) stats->stat_IfHCInBadOctets_hi << 32) + 5367 (u64) stats->stat_IfHCInBadOctets_lo; 5368 5369 sc->stat_IfHCOutOctets = 5370 ((u64) stats->stat_IfHCOutOctets_hi << 32) + 5371 (u64) stats->stat_IfHCOutOctets_lo; 5372 5373 sc->stat_IfHCOutBadOctets = 5374 ((u64) stats->stat_IfHCOutBadOctets_hi << 32) + 5375 (u64) stats->stat_IfHCOutBadOctets_lo; 5376 5377 sc->stat_IfHCInUcastPkts = 5378 ((u64) stats->stat_IfHCInUcastPkts_hi << 32) + 5379 (u64) stats->stat_IfHCInUcastPkts_lo; 5380 5381 sc->stat_IfHCInMulticastPkts = 5382 ((u64) stats->stat_IfHCInMulticastPkts_hi << 32) + 5383 (u64) stats->stat_IfHCInMulticastPkts_lo; 5384 5385 sc->stat_IfHCInBroadcastPkts = 5386 ((u64) stats->stat_IfHCInBroadcastPkts_hi << 32) + 5387 (u64) stats->stat_IfHCInBroadcastPkts_lo; 5388 5389 sc->stat_IfHCOutUcastPkts = 5390 ((u64) stats->stat_IfHCOutUcastPkts_hi << 32) + 5391 (u64) stats->stat_IfHCOutUcastPkts_lo; 5392 5393 sc->stat_IfHCOutMulticastPkts = 5394 ((u64) stats->stat_IfHCOutMulticastPkts_hi << 32) + 5395 (u64) stats->stat_IfHCOutMulticastPkts_lo; 5396 5397 sc->stat_IfHCOutBroadcastPkts = 5398 ((u64) stats->stat_IfHCOutBroadcastPkts_hi << 32) + 5399 (u64) stats->stat_IfHCOutBroadcastPkts_lo; 5400 5401 sc->stat_emac_tx_stat_dot3statsinternalmactransmiterrors = 5402 stats->stat_emac_tx_stat_dot3statsinternalmactransmiterrors; 5403 5404 sc->stat_Dot3StatsCarrierSenseErrors = 5405 stats->stat_Dot3StatsCarrierSenseErrors; 5406 5407 sc->stat_Dot3StatsFCSErrors = 5408 stats->stat_Dot3StatsFCSErrors; 5409 5410 sc->stat_Dot3StatsAlignmentErrors = 5411 stats->stat_Dot3StatsAlignmentErrors; 5412 5413 sc->stat_Dot3StatsSingleCollisionFrames = 5414 stats->stat_Dot3StatsSingleCollisionFrames; 5415 5416 sc->stat_Dot3StatsMultipleCollisionFrames = 5417 stats->stat_Dot3StatsMultipleCollisionFrames; 5418 5419 sc->stat_Dot3StatsDeferredTransmissions = 5420 stats->stat_Dot3StatsDeferredTransmissions; 5421 5422 sc->stat_Dot3StatsExcessiveCollisions = 5423 stats->stat_Dot3StatsExcessiveCollisions; 5424 5425 sc->stat_Dot3StatsLateCollisions = 5426 stats->stat_Dot3StatsLateCollisions; 5427 5428 sc->stat_EtherStatsCollisions = 5429 stats->stat_EtherStatsCollisions; 5430 5431 sc->stat_EtherStatsFragments = 5432 stats->stat_EtherStatsFragments; 5433 5434 sc->stat_EtherStatsJabbers = 5435 stats->stat_EtherStatsJabbers; 5436 5437 sc->stat_EtherStatsUndersizePkts = 5438 stats->stat_EtherStatsUndersizePkts; 5439 5440 sc->stat_EtherStatsOverrsizePkts = 5441 stats->stat_EtherStatsOverrsizePkts; 5442 5443 sc->stat_EtherStatsPktsRx64Octets = 5444 stats->stat_EtherStatsPktsRx64Octets; 5445 5446 sc->stat_EtherStatsPktsRx65Octetsto127Octets = 5447 stats->stat_EtherStatsPktsRx65Octetsto127Octets; 5448 5449 sc->stat_EtherStatsPktsRx128Octetsto255Octets = 5450 stats->stat_EtherStatsPktsRx128Octetsto255Octets; 5451 5452 sc->stat_EtherStatsPktsRx256Octetsto511Octets = 5453 stats->stat_EtherStatsPktsRx256Octetsto511Octets; 5454 5455 sc->stat_EtherStatsPktsRx512Octetsto1023Octets = 5456 stats->stat_EtherStatsPktsRx512Octetsto1023Octets; 5457 5458 sc->stat_EtherStatsPktsRx1024Octetsto1522Octets = 5459 stats->stat_EtherStatsPktsRx1024Octetsto1522Octets; 5460 5461 sc->stat_EtherStatsPktsRx1523Octetsto9022Octets = 5462 stats->stat_EtherStatsPktsRx1523Octetsto9022Octets; 5463 5464 sc->stat_EtherStatsPktsTx64Octets = 5465 stats->stat_EtherStatsPktsTx64Octets; 5466 5467 sc->stat_EtherStatsPktsTx65Octetsto127Octets = 5468 stats->stat_EtherStatsPktsTx65Octetsto127Octets; 5469 5470 sc->stat_EtherStatsPktsTx128Octetsto255Octets = 5471 stats->stat_EtherStatsPktsTx128Octetsto255Octets; 5472 5473 sc->stat_EtherStatsPktsTx256Octetsto511Octets = 5474 stats->stat_EtherStatsPktsTx256Octetsto511Octets; 5475 5476 sc->stat_EtherStatsPktsTx512Octetsto1023Octets = 5477 stats->stat_EtherStatsPktsTx512Octetsto1023Octets; 5478 5479 sc->stat_EtherStatsPktsTx1024Octetsto1522Octets = 5480 stats->stat_EtherStatsPktsTx1024Octetsto1522Octets; 5481 5482 sc->stat_EtherStatsPktsTx1523Octetsto9022Octets = 5483 stats->stat_EtherStatsPktsTx1523Octetsto9022Octets; 5484 5485 sc->stat_XonPauseFramesReceived = 5486 stats->stat_XonPauseFramesReceived; 5487 5488 sc->stat_XoffPauseFramesReceived = 5489 stats->stat_XoffPauseFramesReceived; 5490 5491 sc->stat_OutXonSent = 5492 stats->stat_OutXonSent; 5493 5494 sc->stat_OutXoffSent = 5495 stats->stat_OutXoffSent; 5496 5497 sc->stat_FlowControlDone = 5498 stats->stat_FlowControlDone; 5499 5500 sc->stat_MacControlFramesReceived = 5501 stats->stat_MacControlFramesReceived; 5502 5503 sc->stat_XoffStateEntered = 5504 stats->stat_XoffStateEntered; 5505 5506 sc->stat_IfInFramesL2FilterDiscards = 5507 stats->stat_IfInFramesL2FilterDiscards; 5508 5509 sc->stat_IfInRuleCheckerDiscards = 5510 stats->stat_IfInRuleCheckerDiscards; 5511 5512 sc->stat_IfInFTQDiscards = 5513 stats->stat_IfInFTQDiscards; 5514 5515 sc->stat_IfInMBUFDiscards = 5516 stats->stat_IfInMBUFDiscards; 5517 5518 sc->stat_IfInRuleCheckerP4Hit = 5519 stats->stat_IfInRuleCheckerP4Hit; 5520 5521 sc->stat_CatchupInRuleCheckerDiscards = 5522 stats->stat_CatchupInRuleCheckerDiscards; 5523 5524 sc->stat_CatchupInFTQDiscards = 5525 stats->stat_CatchupInFTQDiscards; 5526 5527 sc->stat_CatchupInMBUFDiscards = 5528 stats->stat_CatchupInMBUFDiscards; 5529 5530 sc->stat_CatchupInRuleCheckerP4Hit = 5531 stats->stat_CatchupInRuleCheckerP4Hit; 5532 5533 DBPRINT(sc, BCE_EXCESSIVE, "Exiting %s()\n", __FUNCTION__); 5534 } 5535 5536 5537 static void 5538 bce_tick_locked(struct bce_softc *sc) 5539 { 5540 struct mii_data *mii = NULL; 5541 struct ifnet *ifp; 5542 u32 msg; 5543 5544 ifp = sc->bce_ifp; 5545 5546 BCE_LOCK_ASSERT(sc); 5547 5548 /* Tell the firmware that the driver is still running. */ 5549 #ifdef BCE_DEBUG 5550 msg = (u32) BCE_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE; 5551 #else 5552 msg = (u32) ++sc->bce_fw_drv_pulse_wr_seq; 5553 #endif 5554 REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_PULSE_MB, msg); 5555 5556 /* Update the statistics from the hardware statistics block. */ 5557 bce_stats_update(sc); 5558 5559 /* Schedule the next tick. */ 5560 callout_reset( 5561 &sc->bce_stat_ch, /* callout */ 5562 hz, /* ticks */ 5563 bce_tick, /* function */ 5564 sc); /* function argument */ 5565 5566 /* If link is up already up then we're done. */ 5567 if (sc->bce_link) 5568 goto bce_tick_locked_exit; 5569 5570 /* DRC - ToDo: Add SerDes support and check SerDes link here. */ 5571 5572 mii = device_get_softc(sc->bce_miibus); 5573 mii_tick(mii); 5574 5575 /* Check if the link has come up. */ 5576 if (!sc->bce_link && mii->mii_media_status & IFM_ACTIVE && 5577 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { 5578 sc->bce_link++; 5579 if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T || 5580 IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX) && 5581 bootverbose) 5582 BCE_PRINTF(sc, "Gigabit link up\n"); 5583 /* Now that link is up, handle any outstanding TX traffic. */ 5584 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) 5585 bce_start_locked(ifp); 5586 } 5587 5588 bce_tick_locked_exit: 5589 return; 5590 } 5591 5592 5593 static void 5594 bce_tick(void *xsc) 5595 { 5596 struct bce_softc *sc; 5597 5598 sc = xsc; 5599 5600 BCE_LOCK(sc); 5601 bce_tick_locked(sc); 5602 BCE_UNLOCK(sc); 5603 } 5604 5605 5606 #ifdef BCE_DEBUG 5607 /****************************************************************************/ 5608 /* Allows the driver state to be dumped through the sysctl interface. */ 5609 /* */ 5610 /* Returns: */ 5611 /* 0 for success, positive value for failure. */ 5612 /****************************************************************************/ 5613 static int 5614 bce_sysctl_driver_state(SYSCTL_HANDLER_ARGS) 5615 { 5616 int error; 5617 int result; 5618 struct bce_softc *sc; 5619 5620 result = -1; 5621 error = sysctl_handle_int(oidp, &result, 0, req); 5622 5623 if (error || !req->newptr) 5624 return (error); 5625 5626 if (result == 1) { 5627 sc = (struct bce_softc *)arg1; 5628 bce_dump_driver_state(sc); 5629 } 5630 5631 return error; 5632 } 5633 5634 5635 /****************************************************************************/ 5636 /* Allows the hardware state to be dumped through the sysctl interface. */ 5637 /* */ 5638 /* Returns: */ 5639 /* 0 for success, positive value for failure. */ 5640 /****************************************************************************/ 5641 static int 5642 bce_sysctl_hw_state(SYSCTL_HANDLER_ARGS) 5643 { 5644 int error; 5645 int result; 5646 struct bce_softc *sc; 5647 5648 result = -1; 5649 error = sysctl_handle_int(oidp, &result, 0, req); 5650 5651 if (error || !req->newptr) 5652 return (error); 5653 5654 if (result == 1) { 5655 sc = (struct bce_softc *)arg1; 5656 bce_dump_hw_state(sc); 5657 } 5658 5659 return error; 5660 } 5661 5662 5663 /****************************************************************************/ 5664 /* */ 5665 /* */ 5666 /* Returns: */ 5667 /* 0 for success, positive value for failure. */ 5668 /****************************************************************************/ 5669 static int 5670 bce_sysctl_dump_rx_chain(SYSCTL_HANDLER_ARGS) 5671 { 5672 int error; 5673 int result; 5674 struct bce_softc *sc; 5675 5676 result = -1; 5677 error = sysctl_handle_int(oidp, &result, 0, req); 5678 5679 if (error || !req->newptr) 5680 return (error); 5681 5682 if (result == 1) { 5683 sc = (struct bce_softc *)arg1; 5684 bce_dump_rx_chain(sc, 0, USABLE_RX_BD); 5685 } 5686 5687 return error; 5688 } 5689 5690 5691 /****************************************************************************/ 5692 /* */ 5693 /* */ 5694 /* Returns: */ 5695 /* 0 for success, positive value for failure. */ 5696 /****************************************************************************/ 5697 static int 5698 bce_sysctl_breakpoint(SYSCTL_HANDLER_ARGS) 5699 { 5700 int error; 5701 int result; 5702 struct bce_softc *sc; 5703 5704 result = -1; 5705 error = sysctl_handle_int(oidp, &result, 0, req); 5706 5707 if (error || !req->newptr) 5708 return (error); 5709 5710 if (result == 1) { 5711 sc = (struct bce_softc *)arg1; 5712 bce_breakpoint(sc); 5713 } 5714 5715 return error; 5716 } 5717 #endif 5718 5719 5720 /****************************************************************************/ 5721 /* Adds any sysctl parameters for tuning or debugging purposes. */ 5722 /* */ 5723 /* Returns: */ 5724 /* 0 for success, positive value for failure. */ 5725 /****************************************************************************/ 5726 static void 5727 bce_add_sysctls(struct bce_softc *sc) 5728 { 5729 struct sysctl_ctx_list *ctx; 5730 struct sysctl_oid_list *children; 5731 5732 ctx = device_get_sysctl_ctx(sc->bce_dev); 5733 children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->bce_dev)); 5734 5735 SYSCTL_ADD_STRING(ctx, children, OID_AUTO, 5736 "driver_version", 5737 CTLFLAG_RD, &bce_driver_version, 5738 0, "bce driver version"); 5739 5740 #ifdef BCE_DEBUG 5741 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 5742 "rx_low_watermark", 5743 CTLFLAG_RD, &sc->rx_low_watermark, 5744 0, "Lowest level of free rx_bd's"); 5745 5746 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 5747 "tx_hi_watermark", 5748 CTLFLAG_RD, &sc->tx_hi_watermark, 5749 0, "Highest level of used tx_bd's"); 5750 5751 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 5752 "l2fhdr_status_errors", 5753 CTLFLAG_RD, &sc->l2fhdr_status_errors, 5754 0, "l2_fhdr status errors"); 5755 5756 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 5757 "unexpected_attentions", 5758 CTLFLAG_RD, &sc->unexpected_attentions, 5759 0, "unexpected attentions"); 5760 5761 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 5762 "lost_status_block_updates", 5763 CTLFLAG_RD, &sc->lost_status_block_updates, 5764 0, "lost status block updates"); 5765 5766 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 5767 "mbuf_alloc_failed", 5768 CTLFLAG_RD, &sc->mbuf_alloc_failed, 5769 0, "mbuf cluster allocation failures"); 5770 #endif 5771 5772 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5773 "stat_IfHcInOctets", 5774 CTLFLAG_RD, &sc->stat_IfHCInOctets, 5775 "Bytes received"); 5776 5777 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5778 "stat_IfHCInBadOctets", 5779 CTLFLAG_RD, &sc->stat_IfHCInBadOctets, 5780 "Bad bytes received"); 5781 5782 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5783 "stat_IfHCOutOctets", 5784 CTLFLAG_RD, &sc->stat_IfHCOutOctets, 5785 "Bytes sent"); 5786 5787 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5788 "stat_IfHCOutBadOctets", 5789 CTLFLAG_RD, &sc->stat_IfHCOutBadOctets, 5790 "Bad bytes sent"); 5791 5792 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5793 "stat_IfHCInUcastPkts", 5794 CTLFLAG_RD, &sc->stat_IfHCInUcastPkts, 5795 "Unicast packets received"); 5796 5797 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5798 "stat_IfHCInMulticastPkts", 5799 CTLFLAG_RD, &sc->stat_IfHCInMulticastPkts, 5800 "Multicast packets received"); 5801 5802 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5803 "stat_IfHCInBroadcastPkts", 5804 CTLFLAG_RD, &sc->stat_IfHCInBroadcastPkts, 5805 "Broadcast packets received"); 5806 5807 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5808 "stat_IfHCOutUcastPkts", 5809 CTLFLAG_RD, &sc->stat_IfHCOutUcastPkts, 5810 "Unicast packets sent"); 5811 5812 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5813 "stat_IfHCOutMulticastPkts", 5814 CTLFLAG_RD, &sc->stat_IfHCOutMulticastPkts, 5815 "Multicast packets sent"); 5816 5817 SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, 5818 "stat_IfHCOutBroadcastPkts", 5819 CTLFLAG_RD, &sc->stat_IfHCOutBroadcastPkts, 5820 "Broadcast packets sent"); 5821 5822 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5823 "stat_emac_tx_stat_dot3statsinternalmactransmiterrors", 5824 CTLFLAG_RD, &sc->stat_emac_tx_stat_dot3statsinternalmactransmiterrors, 5825 0, "Internal MAC transmit errors"); 5826 5827 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5828 "stat_Dot3StatsCarrierSenseErrors", 5829 CTLFLAG_RD, &sc->stat_Dot3StatsCarrierSenseErrors, 5830 0, "Carrier sense errors"); 5831 5832 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5833 "stat_Dot3StatsFCSErrors", 5834 CTLFLAG_RD, &sc->stat_Dot3StatsFCSErrors, 5835 0, "Frame check sequence errors"); 5836 5837 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5838 "stat_Dot3StatsAlignmentErrors", 5839 CTLFLAG_RD, &sc->stat_Dot3StatsAlignmentErrors, 5840 0, "Alignment errors"); 5841 5842 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5843 "stat_Dot3StatsSingleCollisionFrames", 5844 CTLFLAG_RD, &sc->stat_Dot3StatsSingleCollisionFrames, 5845 0, "Single Collision Frames"); 5846 5847 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5848 "stat_Dot3StatsMultipleCollisionFrames", 5849 CTLFLAG_RD, &sc->stat_Dot3StatsMultipleCollisionFrames, 5850 0, "Multiple Collision Frames"); 5851 5852 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5853 "stat_Dot3StatsDeferredTransmissions", 5854 CTLFLAG_RD, &sc->stat_Dot3StatsDeferredTransmissions, 5855 0, "Deferred Transmissions"); 5856 5857 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5858 "stat_Dot3StatsExcessiveCollisions", 5859 CTLFLAG_RD, &sc->stat_Dot3StatsExcessiveCollisions, 5860 0, "Excessive Collisions"); 5861 5862 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5863 "stat_Dot3StatsLateCollisions", 5864 CTLFLAG_RD, &sc->stat_Dot3StatsLateCollisions, 5865 0, "Late Collisions"); 5866 5867 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5868 "stat_EtherStatsCollisions", 5869 CTLFLAG_RD, &sc->stat_EtherStatsCollisions, 5870 0, "Collisions"); 5871 5872 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5873 "stat_EtherStatsFragments", 5874 CTLFLAG_RD, &sc->stat_EtherStatsFragments, 5875 0, "Fragments"); 5876 5877 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5878 "stat_EtherStatsJabbers", 5879 CTLFLAG_RD, &sc->stat_EtherStatsJabbers, 5880 0, "Jabbers"); 5881 5882 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5883 "stat_EtherStatsUndersizePkts", 5884 CTLFLAG_RD, &sc->stat_EtherStatsUndersizePkts, 5885 0, "Undersize packets"); 5886 5887 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5888 "stat_EtherStatsOverrsizePkts", 5889 CTLFLAG_RD, &sc->stat_EtherStatsOverrsizePkts, 5890 0, "stat_EtherStatsOverrsizePkts"); 5891 5892 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5893 "stat_EtherStatsPktsRx64Octets", 5894 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx64Octets, 5895 0, "Bytes received in 64 byte packets"); 5896 5897 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5898 "stat_EtherStatsPktsRx65Octetsto127Octets", 5899 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx65Octetsto127Octets, 5900 0, "Bytes received in 65 to 127 byte packets"); 5901 5902 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5903 "stat_EtherStatsPktsRx128Octetsto255Octets", 5904 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx128Octetsto255Octets, 5905 0, "Bytes received in 128 to 255 byte packets"); 5906 5907 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5908 "stat_EtherStatsPktsRx256Octetsto511Octets", 5909 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx256Octetsto511Octets, 5910 0, "Bytes received in 256 to 511 byte packets"); 5911 5912 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5913 "stat_EtherStatsPktsRx512Octetsto1023Octets", 5914 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx512Octetsto1023Octets, 5915 0, "Bytes received in 512 to 1023 byte packets"); 5916 5917 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5918 "stat_EtherStatsPktsRx1024Octetsto1522Octets", 5919 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx1024Octetsto1522Octets, 5920 0, "Bytes received in 1024 t0 1522 byte packets"); 5921 5922 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5923 "stat_EtherStatsPktsRx1523Octetsto9022Octets", 5924 CTLFLAG_RD, &sc->stat_EtherStatsPktsRx1523Octetsto9022Octets, 5925 0, "Bytes received in 1523 to 9022 byte packets"); 5926 5927 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5928 "stat_EtherStatsPktsTx64Octets", 5929 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx64Octets, 5930 0, "Bytes sent in 64 byte packets"); 5931 5932 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5933 "stat_EtherStatsPktsTx65Octetsto127Octets", 5934 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx65Octetsto127Octets, 5935 0, "Bytes sent in 65 to 127 byte packets"); 5936 5937 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5938 "stat_EtherStatsPktsTx128Octetsto255Octets", 5939 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx128Octetsto255Octets, 5940 0, "Bytes sent in 128 to 255 byte packets"); 5941 5942 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5943 "stat_EtherStatsPktsTx256Octetsto511Octets", 5944 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx256Octetsto511Octets, 5945 0, "Bytes sent in 256 to 511 byte packets"); 5946 5947 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5948 "stat_EtherStatsPktsTx512Octetsto1023Octets", 5949 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx512Octetsto1023Octets, 5950 0, "Bytes sent in 512 to 1023 byte packets"); 5951 5952 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5953 "stat_EtherStatsPktsTx1024Octetsto1522Octets", 5954 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx1024Octetsto1522Octets, 5955 0, "Bytes sent in 1024 to 1522 byte packets"); 5956 5957 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5958 "stat_EtherStatsPktsTx1523Octetsto9022Octets", 5959 CTLFLAG_RD, &sc->stat_EtherStatsPktsTx1523Octetsto9022Octets, 5960 0, "Bytes sent in 1523 to 9022 byte packets"); 5961 5962 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5963 "stat_XonPauseFramesReceived", 5964 CTLFLAG_RD, &sc->stat_XonPauseFramesReceived, 5965 0, "XON pause frames receved"); 5966 5967 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5968 "stat_XoffPauseFramesReceived", 5969 CTLFLAG_RD, &sc->stat_XoffPauseFramesReceived, 5970 0, "XOFF pause frames received"); 5971 5972 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5973 "stat_OutXonSent", 5974 CTLFLAG_RD, &sc->stat_OutXonSent, 5975 0, "XON pause frames sent"); 5976 5977 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5978 "stat_OutXoffSent", 5979 CTLFLAG_RD, &sc->stat_OutXoffSent, 5980 0, "XOFF pause frames sent"); 5981 5982 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5983 "stat_FlowControlDone", 5984 CTLFLAG_RD, &sc->stat_FlowControlDone, 5985 0, "Flow control done"); 5986 5987 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5988 "stat_MacControlFramesReceived", 5989 CTLFLAG_RD, &sc->stat_MacControlFramesReceived, 5990 0, "MAC control frames received"); 5991 5992 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5993 "stat_XoffStateEntered", 5994 CTLFLAG_RD, &sc->stat_XoffStateEntered, 5995 0, "XOFF state entered"); 5996 5997 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 5998 "stat_IfInFramesL2FilterDiscards", 5999 CTLFLAG_RD, &sc->stat_IfInFramesL2FilterDiscards, 6000 0, "Received L2 packets discarded"); 6001 6002 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6003 "stat_IfInRuleCheckerDiscards", 6004 CTLFLAG_RD, &sc->stat_IfInRuleCheckerDiscards, 6005 0, "Received packets discarded by rule"); 6006 6007 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6008 "stat_IfInFTQDiscards", 6009 CTLFLAG_RD, &sc->stat_IfInFTQDiscards, 6010 0, "Received packet FTQ discards"); 6011 6012 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6013 "stat_IfInMBUFDiscards", 6014 CTLFLAG_RD, &sc->stat_IfInMBUFDiscards, 6015 0, "Received packets discarded due to lack of controller buffer memory"); 6016 6017 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6018 "stat_IfInRuleCheckerP4Hit", 6019 CTLFLAG_RD, &sc->stat_IfInRuleCheckerP4Hit, 6020 0, "Received packets rule checker hits"); 6021 6022 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6023 "stat_CatchupInRuleCheckerDiscards", 6024 CTLFLAG_RD, &sc->stat_CatchupInRuleCheckerDiscards, 6025 0, "Received packets discarded in Catchup path"); 6026 6027 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6028 "stat_CatchupInFTQDiscards", 6029 CTLFLAG_RD, &sc->stat_CatchupInFTQDiscards, 6030 0, "Received packets discarded in FTQ in Catchup path"); 6031 6032 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6033 "stat_CatchupInMBUFDiscards", 6034 CTLFLAG_RD, &sc->stat_CatchupInMBUFDiscards, 6035 0, "Received packets discarded in controller buffer memory in Catchup path"); 6036 6037 SYSCTL_ADD_UINT(ctx, children, OID_AUTO, 6038 "stat_CatchupInRuleCheckerP4Hit", 6039 CTLFLAG_RD, &sc->stat_CatchupInRuleCheckerP4Hit, 6040 0, "Received packets rule checker hits in Catchup path"); 6041 6042 #ifdef BCE_DEBUG 6043 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 6044 "driver_state", CTLTYPE_INT | CTLFLAG_RW, 6045 (void *)sc, 0, 6046 bce_sysctl_driver_state, "I", "Drive state information"); 6047 6048 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 6049 "hw_state", CTLTYPE_INT | CTLFLAG_RW, 6050 (void *)sc, 0, 6051 bce_sysctl_hw_state, "I", "Hardware state information"); 6052 6053 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 6054 "dump_rx_chain", CTLTYPE_INT | CTLFLAG_RW, 6055 (void *)sc, 0, 6056 bce_sysctl_dump_rx_chain, "I", "Dump rx_bd chain"); 6057 6058 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 6059 "breakpoint", CTLTYPE_INT | CTLFLAG_RW, 6060 (void *)sc, 0, 6061 bce_sysctl_breakpoint, "I", "Driver breakpoint"); 6062 #endif 6063 6064 } 6065 6066 6067 /****************************************************************************/ 6068 /* BCE Debug Routines */ 6069 /****************************************************************************/ 6070 #ifdef BCE_DEBUG 6071 6072 /****************************************************************************/ 6073 /* Prints out information about an mbuf. */ 6074 /* */ 6075 /* Returns: */ 6076 /* Nothing. */ 6077 /****************************************************************************/ 6078 static void 6079 bce_dump_mbuf(struct bce_softc *sc, struct mbuf *m) 6080 { 6081 u32 val_hi, val_lo; 6082 struct mbuf *mp = m; 6083 6084 if (m == NULL) { 6085 /* Index out of range. */ 6086 printf("mbuf ptr is null!\n"); 6087 return; 6088 } 6089 6090 while (mp) { 6091 val_hi = BCE_ADDR_HI(mp); 6092 val_lo = BCE_ADDR_LO(mp); 6093 BCE_PRINTF(sc, "mbuf: vaddr = 0x%08X:%08X, m_len = %d, m_flags = ", 6094 val_hi, val_lo, mp->m_len); 6095 6096 if (mp->m_flags & M_EXT) 6097 printf("M_EXT "); 6098 if (mp->m_flags & M_PKTHDR) 6099 printf("M_PKTHDR "); 6100 printf("\n"); 6101 6102 if (mp->m_flags & M_EXT) { 6103 val_hi = BCE_ADDR_HI(mp->m_ext.ext_buf); 6104 val_lo = BCE_ADDR_LO(mp->m_ext.ext_buf); 6105 BCE_PRINTF(sc, "- m_ext: vaddr = 0x%08X:%08X, ext_size = 0x%04X\n", 6106 val_hi, val_lo, mp->m_ext.ext_size); 6107 } 6108 6109 mp = mp->m_next; 6110 } 6111 6112 6113 } 6114 6115 6116 /****************************************************************************/ 6117 /* Prints out the mbufs in the TX mbuf chain. */ 6118 /* */ 6119 /* Returns: */ 6120 /* Nothing. */ 6121 /****************************************************************************/ 6122 static void 6123 bce_dump_tx_mbuf_chain(struct bce_softc *sc, int chain_prod, int count) 6124 { 6125 struct mbuf *m; 6126 6127 BCE_PRINTF(sc, 6128 "----------------------------" 6129 " tx mbuf data " 6130 "----------------------------\n"); 6131 6132 for (int i = 0; i < count; i++) { 6133 m = sc->tx_mbuf_ptr[chain_prod]; 6134 BCE_PRINTF(sc, "txmbuf[%d]\n", chain_prod); 6135 bce_dump_mbuf(sc, m); 6136 chain_prod = TX_CHAIN_IDX(NEXT_TX_BD(chain_prod)); 6137 } 6138 6139 BCE_PRINTF(sc, 6140 "----------------------------" 6141 "----------------" 6142 "----------------------------\n"); 6143 } 6144 6145 6146 /* 6147 * This routine prints the RX mbuf chain. 6148 */ 6149 static void 6150 bce_dump_rx_mbuf_chain(struct bce_softc *sc, int chain_prod, int count) 6151 { 6152 struct mbuf *m; 6153 6154 BCE_PRINTF(sc, 6155 "----------------------------" 6156 " rx mbuf data " 6157 "----------------------------\n"); 6158 6159 for (int i = 0; i < count; i++) { 6160 m = sc->rx_mbuf_ptr[chain_prod]; 6161 BCE_PRINTF(sc, "rxmbuf[0x%04X]\n", chain_prod); 6162 bce_dump_mbuf(sc, m); 6163 chain_prod = RX_CHAIN_IDX(NEXT_RX_BD(chain_prod)); 6164 } 6165 6166 6167 BCE_PRINTF(sc, 6168 "----------------------------" 6169 "----------------" 6170 "----------------------------\n"); 6171 } 6172 6173 6174 static void 6175 bce_dump_txbd(struct bce_softc *sc, int idx, struct tx_bd *txbd) 6176 { 6177 if (idx > MAX_TX_BD) 6178 /* Index out of range. */ 6179 BCE_PRINTF(sc, "tx_bd[0x%04X]: Invalid tx_bd index!\n", idx); 6180 else if ((idx & USABLE_TX_BD_PER_PAGE) == USABLE_TX_BD_PER_PAGE) 6181 /* TX Chain page pointer. */ 6182 BCE_PRINTF(sc, "tx_bd[0x%04X]: haddr = 0x%08X:%08X, chain page pointer\n", 6183 idx, txbd->tx_bd_haddr_hi, txbd->tx_bd_haddr_lo); 6184 else 6185 /* Normal tx_bd entry. */ 6186 BCE_PRINTF(sc, "tx_bd[0x%04X]: haddr = 0x%08X:%08X, nbytes = 0x%08X, " 6187 "flags = 0x%08X\n", idx, 6188 txbd->tx_bd_haddr_hi, txbd->tx_bd_haddr_lo, 6189 txbd->tx_bd_mss_nbytes, txbd->tx_bd_vlan_tag_flags); 6190 } 6191 6192 6193 static void 6194 bce_dump_rxbd(struct bce_softc *sc, int idx, struct rx_bd *rxbd) 6195 { 6196 if (idx > MAX_RX_BD) 6197 /* Index out of range. */ 6198 BCE_PRINTF(sc, "rx_bd[0x%04X]: Invalid rx_bd index!\n", idx); 6199 else if ((idx & USABLE_RX_BD_PER_PAGE) == USABLE_RX_BD_PER_PAGE) 6200 /* TX Chain page pointer. */ 6201 BCE_PRINTF(sc, "rx_bd[0x%04X]: haddr = 0x%08X:%08X, chain page pointer\n", 6202 idx, rxbd->rx_bd_haddr_hi, rxbd->rx_bd_haddr_lo); 6203 else 6204 /* Normal tx_bd entry. */ 6205 BCE_PRINTF(sc, "rx_bd[0x%04X]: haddr = 0x%08X:%08X, nbytes = 0x%08X, " 6206 "flags = 0x%08X\n", idx, 6207 rxbd->rx_bd_haddr_hi, rxbd->rx_bd_haddr_lo, 6208 rxbd->rx_bd_len, rxbd->rx_bd_flags); 6209 } 6210 6211 6212 static void 6213 bce_dump_l2fhdr(struct bce_softc *sc, int idx, struct l2_fhdr *l2fhdr) 6214 { 6215 BCE_PRINTF(sc, "l2_fhdr[0x%04X]: status = 0x%08X, " 6216 "pkt_len = 0x%04X, vlan = 0x%04x, ip_xsum = 0x%04X, " 6217 "tcp_udp_xsum = 0x%04X\n", idx, 6218 l2fhdr->l2_fhdr_status, l2fhdr->l2_fhdr_pkt_len, 6219 l2fhdr->l2_fhdr_vlan_tag, l2fhdr->l2_fhdr_ip_xsum, 6220 l2fhdr->l2_fhdr_tcp_udp_xsum); 6221 } 6222 6223 6224 /* 6225 * This routine prints the TX chain. 6226 */ 6227 static void 6228 bce_dump_tx_chain(struct bce_softc *sc, int tx_prod, int count) 6229 { 6230 struct tx_bd *txbd; 6231 6232 /* First some info about the tx_bd chain structure. */ 6233 BCE_PRINTF(sc, 6234 "----------------------------" 6235 " tx_bd chain " 6236 "----------------------------\n"); 6237 6238 BCE_PRINTF(sc, "page size = 0x%08X, tx chain pages = 0x%08X\n", 6239 (u32) BCM_PAGE_SIZE, (u32) TX_PAGES); 6240 6241 BCE_PRINTF(sc, "tx_bd per page = 0x%08X, usable tx_bd per page = 0x%08X\n", 6242 (u32) TOTAL_TX_BD_PER_PAGE, (u32) USABLE_TX_BD_PER_PAGE); 6243 6244 BCE_PRINTF(sc, "total tx_bd = 0x%08X\n", (u32) TOTAL_TX_BD); 6245 6246 BCE_PRINTF(sc, "" 6247 "-----------------------------" 6248 " tx_bd data " 6249 "-----------------------------\n"); 6250 6251 /* Now print out the tx_bd's themselves. */ 6252 for (int i = 0; i < count; i++) { 6253 txbd = &sc->tx_bd_chain[TX_PAGE(tx_prod)][TX_IDX(tx_prod)]; 6254 bce_dump_txbd(sc, tx_prod, txbd); 6255 tx_prod = TX_CHAIN_IDX(NEXT_TX_BD(tx_prod)); 6256 } 6257 6258 BCE_PRINTF(sc, 6259 "-----------------------------" 6260 "--------------" 6261 "-----------------------------\n"); 6262 } 6263 6264 6265 /* 6266 * This routine prints the RX chain. 6267 */ 6268 static void 6269 bce_dump_rx_chain(struct bce_softc *sc, int rx_prod, int count) 6270 { 6271 struct rx_bd *rxbd; 6272 6273 /* First some info about the tx_bd chain structure. */ 6274 BCE_PRINTF(sc, 6275 "----------------------------" 6276 " rx_bd chain " 6277 "----------------------------\n"); 6278 6279 BCE_PRINTF(sc, "----- RX_BD Chain -----\n"); 6280 6281 BCE_PRINTF(sc, "page size = 0x%08X, rx chain pages = 0x%08X\n", 6282 (u32) BCM_PAGE_SIZE, (u32) RX_PAGES); 6283 6284 BCE_PRINTF(sc, "rx_bd per page = 0x%08X, usable rx_bd per page = 0x%08X\n", 6285 (u32) TOTAL_RX_BD_PER_PAGE, (u32) USABLE_RX_BD_PER_PAGE); 6286 6287 BCE_PRINTF(sc, "total rx_bd = 0x%08X\n", (u32) TOTAL_RX_BD); 6288 6289 BCE_PRINTF(sc, 6290 "----------------------------" 6291 " rx_bd data " 6292 "----------------------------\n"); 6293 6294 /* Now print out the rx_bd's themselves. */ 6295 for (int i = 0; i < count; i++) { 6296 rxbd = &sc->rx_bd_chain[RX_PAGE(rx_prod)][RX_IDX(rx_prod)]; 6297 bce_dump_rxbd(sc, rx_prod, rxbd); 6298 rx_prod = RX_CHAIN_IDX(NEXT_RX_BD(rx_prod)); 6299 } 6300 6301 BCE_PRINTF(sc, 6302 "----------------------------" 6303 "--------------" 6304 "----------------------------\n"); 6305 } 6306 6307 6308 /* 6309 * This routine prints the status block. 6310 */ 6311 static void 6312 bce_dump_status_block(struct bce_softc *sc) 6313 { 6314 struct status_block *sblk; 6315 6316 sblk = sc->status_block; 6317 6318 BCE_PRINTF(sc, "----------------------------- Status Block " 6319 "-----------------------------\n"); 6320 6321 BCE_PRINTF(sc, "attn_bits = 0x%08X, attn_bits_ack = 0x%08X, index = 0x%04X\n", 6322 sblk->status_attn_bits, sblk->status_attn_bits_ack, 6323 sblk->status_idx); 6324 6325 BCE_PRINTF(sc, "rx_cons0 = 0x%08X, tx_cons0 = 0x%08X\n", 6326 sblk->status_rx_quick_consumer_index0, 6327 sblk->status_tx_quick_consumer_index0); 6328 6329 BCE_PRINTF(sc, "status_idx = 0x%04X\n", sblk->status_idx); 6330 6331 /* Theses indices are not used for normal L2 drivers. */ 6332 if (sblk->status_rx_quick_consumer_index1 || 6333 sblk->status_tx_quick_consumer_index1) 6334 BCE_PRINTF(sc, "rx_cons1 = 0x%08X, tx_cons1 = 0x%08X\n", 6335 sblk->status_rx_quick_consumer_index1, 6336 sblk->status_tx_quick_consumer_index1); 6337 6338 if (sblk->status_rx_quick_consumer_index2 || 6339 sblk->status_tx_quick_consumer_index2) 6340 BCE_PRINTF(sc, "rx_cons2 = 0x%08X, tx_cons2 = 0x%08X\n", 6341 sblk->status_rx_quick_consumer_index2, 6342 sblk->status_tx_quick_consumer_index2); 6343 6344 if (sblk->status_rx_quick_consumer_index3 || 6345 sblk->status_tx_quick_consumer_index3) 6346 BCE_PRINTF(sc, "rx_cons3 = 0x%08X, tx_cons3 = 0x%08X\n", 6347 sblk->status_rx_quick_consumer_index3, 6348 sblk->status_tx_quick_consumer_index3); 6349 6350 if (sblk->status_rx_quick_consumer_index4 || 6351 sblk->status_rx_quick_consumer_index5) 6352 BCE_PRINTF(sc, "rx_cons4 = 0x%08X, rx_cons5 = 0x%08X\n", 6353 sblk->status_rx_quick_consumer_index4, 6354 sblk->status_rx_quick_consumer_index5); 6355 6356 if (sblk->status_rx_quick_consumer_index6 || 6357 sblk->status_rx_quick_consumer_index7) 6358 BCE_PRINTF(sc, "rx_cons6 = 0x%08X, rx_cons7 = 0x%08X\n", 6359 sblk->status_rx_quick_consumer_index6, 6360 sblk->status_rx_quick_consumer_index7); 6361 6362 if (sblk->status_rx_quick_consumer_index8 || 6363 sblk->status_rx_quick_consumer_index9) 6364 BCE_PRINTF(sc, "rx_cons8 = 0x%08X, rx_cons9 = 0x%08X\n", 6365 sblk->status_rx_quick_consumer_index8, 6366 sblk->status_rx_quick_consumer_index9); 6367 6368 if (sblk->status_rx_quick_consumer_index10 || 6369 sblk->status_rx_quick_consumer_index11) 6370 BCE_PRINTF(sc, "rx_cons10 = 0x%08X, rx_cons11 = 0x%08X\n", 6371 sblk->status_rx_quick_consumer_index10, 6372 sblk->status_rx_quick_consumer_index11); 6373 6374 if (sblk->status_rx_quick_consumer_index12 || 6375 sblk->status_rx_quick_consumer_index13) 6376 BCE_PRINTF(sc, "rx_cons12 = 0x%08X, rx_cons13 = 0x%08X\n", 6377 sblk->status_rx_quick_consumer_index12, 6378 sblk->status_rx_quick_consumer_index13); 6379 6380 if (sblk->status_rx_quick_consumer_index14 || 6381 sblk->status_rx_quick_consumer_index15) 6382 BCE_PRINTF(sc, "rx_cons14 = 0x%08X, rx_cons15 = 0x%08X\n", 6383 sblk->status_rx_quick_consumer_index14, 6384 sblk->status_rx_quick_consumer_index15); 6385 6386 if (sblk->status_completion_producer_index || 6387 sblk->status_cmd_consumer_index) 6388 BCE_PRINTF(sc, "com_prod = 0x%08X, cmd_cons = 0x%08X\n", 6389 sblk->status_completion_producer_index, 6390 sblk->status_cmd_consumer_index); 6391 6392 BCE_PRINTF(sc, "-------------------------------------------" 6393 "-----------------------------\n"); 6394 } 6395 6396 6397 /* 6398 * This routine prints the statistics block. 6399 */ 6400 static void 6401 bce_dump_stats_block(struct bce_softc *sc) 6402 { 6403 struct statistics_block *sblk; 6404 6405 sblk = sc->stats_block; 6406 6407 BCE_PRINTF(sc, "" 6408 "-----------------------------" 6409 " Stats Block " 6410 "-----------------------------\n"); 6411 6412 BCE_PRINTF(sc, "IfHcInOctets = 0x%08X:%08X, " 6413 "IfHcInBadOctets = 0x%08X:%08X\n", 6414 sblk->stat_IfHCInOctets_hi, sblk->stat_IfHCInOctets_lo, 6415 sblk->stat_IfHCInBadOctets_hi, sblk->stat_IfHCInBadOctets_lo); 6416 6417 BCE_PRINTF(sc, "IfHcOutOctets = 0x%08X:%08X, " 6418 "IfHcOutBadOctets = 0x%08X:%08X\n", 6419 sblk->stat_IfHCOutOctets_hi, sblk->stat_IfHCOutOctets_lo, 6420 sblk->stat_IfHCOutBadOctets_hi, sblk->stat_IfHCOutBadOctets_lo); 6421 6422 BCE_PRINTF(sc, "IfHcInUcastPkts = 0x%08X:%08X, " 6423 "IfHcInMulticastPkts = 0x%08X:%08X\n", 6424 sblk->stat_IfHCInUcastPkts_hi, sblk->stat_IfHCInUcastPkts_lo, 6425 sblk->stat_IfHCInMulticastPkts_hi, sblk->stat_IfHCInMulticastPkts_lo); 6426 6427 BCE_PRINTF(sc, "IfHcInBroadcastPkts = 0x%08X:%08X, " 6428 "IfHcOutUcastPkts = 0x%08X:%08X\n", 6429 sblk->stat_IfHCInBroadcastPkts_hi, sblk->stat_IfHCInBroadcastPkts_lo, 6430 sblk->stat_IfHCOutUcastPkts_hi, sblk->stat_IfHCOutUcastPkts_lo); 6431 6432 BCE_PRINTF(sc, "IfHcOutMulticastPkts = 0x%08X:%08X, IfHcOutBroadcastPkts = 0x%08X:%08X\n", 6433 sblk->stat_IfHCOutMulticastPkts_hi, sblk->stat_IfHCOutMulticastPkts_lo, 6434 sblk->stat_IfHCOutBroadcastPkts_hi, sblk->stat_IfHCOutBroadcastPkts_lo); 6435 6436 if (sblk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors) 6437 BCE_PRINTF(sc, "0x%08X : " 6438 "emac_tx_stat_dot3statsinternalmactransmiterrors\n", 6439 sblk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors); 6440 6441 if (sblk->stat_Dot3StatsCarrierSenseErrors) 6442 BCE_PRINTF(sc, "0x%08X : Dot3StatsCarrierSenseErrors\n", 6443 sblk->stat_Dot3StatsCarrierSenseErrors); 6444 6445 if (sblk->stat_Dot3StatsFCSErrors) 6446 BCE_PRINTF(sc, "0x%08X : Dot3StatsFCSErrors\n", 6447 sblk->stat_Dot3StatsFCSErrors); 6448 6449 if (sblk->stat_Dot3StatsAlignmentErrors) 6450 BCE_PRINTF(sc, "0x%08X : Dot3StatsAlignmentErrors\n", 6451 sblk->stat_Dot3StatsAlignmentErrors); 6452 6453 if (sblk->stat_Dot3StatsSingleCollisionFrames) 6454 BCE_PRINTF(sc, "0x%08X : Dot3StatsSingleCollisionFrames\n", 6455 sblk->stat_Dot3StatsSingleCollisionFrames); 6456 6457 if (sblk->stat_Dot3StatsMultipleCollisionFrames) 6458 BCE_PRINTF(sc, "0x%08X : Dot3StatsMultipleCollisionFrames\n", 6459 sblk->stat_Dot3StatsMultipleCollisionFrames); 6460 6461 if (sblk->stat_Dot3StatsDeferredTransmissions) 6462 BCE_PRINTF(sc, "0x%08X : Dot3StatsDeferredTransmissions\n", 6463 sblk->stat_Dot3StatsDeferredTransmissions); 6464 6465 if (sblk->stat_Dot3StatsExcessiveCollisions) 6466 BCE_PRINTF(sc, "0x%08X : Dot3StatsExcessiveCollisions\n", 6467 sblk->stat_Dot3StatsExcessiveCollisions); 6468 6469 if (sblk->stat_Dot3StatsLateCollisions) 6470 BCE_PRINTF(sc, "0x%08X : Dot3StatsLateCollisions\n", 6471 sblk->stat_Dot3StatsLateCollisions); 6472 6473 if (sblk->stat_EtherStatsCollisions) 6474 BCE_PRINTF(sc, "0x%08X : EtherStatsCollisions\n", 6475 sblk->stat_EtherStatsCollisions); 6476 6477 if (sblk->stat_EtherStatsFragments) 6478 BCE_PRINTF(sc, "0x%08X : EtherStatsFragments\n", 6479 sblk->stat_EtherStatsFragments); 6480 6481 if (sblk->stat_EtherStatsJabbers) 6482 BCE_PRINTF(sc, "0x%08X : EtherStatsJabbers\n", 6483 sblk->stat_EtherStatsJabbers); 6484 6485 if (sblk->stat_EtherStatsUndersizePkts) 6486 BCE_PRINTF(sc, "0x%08X : EtherStatsUndersizePkts\n", 6487 sblk->stat_EtherStatsUndersizePkts); 6488 6489 if (sblk->stat_EtherStatsOverrsizePkts) 6490 BCE_PRINTF(sc, "0x%08X : EtherStatsOverrsizePkts\n", 6491 sblk->stat_EtherStatsOverrsizePkts); 6492 6493 if (sblk->stat_EtherStatsPktsRx64Octets) 6494 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx64Octets\n", 6495 sblk->stat_EtherStatsPktsRx64Octets); 6496 6497 if (sblk->stat_EtherStatsPktsRx65Octetsto127Octets) 6498 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx65Octetsto127Octets\n", 6499 sblk->stat_EtherStatsPktsRx65Octetsto127Octets); 6500 6501 if (sblk->stat_EtherStatsPktsRx128Octetsto255Octets) 6502 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx128Octetsto255Octets\n", 6503 sblk->stat_EtherStatsPktsRx128Octetsto255Octets); 6504 6505 if (sblk->stat_EtherStatsPktsRx256Octetsto511Octets) 6506 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx256Octetsto511Octets\n", 6507 sblk->stat_EtherStatsPktsRx256Octetsto511Octets); 6508 6509 if (sblk->stat_EtherStatsPktsRx512Octetsto1023Octets) 6510 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx512Octetsto1023Octets\n", 6511 sblk->stat_EtherStatsPktsRx512Octetsto1023Octets); 6512 6513 if (sblk->stat_EtherStatsPktsRx1024Octetsto1522Octets) 6514 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx1024Octetsto1522Octets\n", 6515 sblk->stat_EtherStatsPktsRx1024Octetsto1522Octets); 6516 6517 if (sblk->stat_EtherStatsPktsRx1523Octetsto9022Octets) 6518 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx1523Octetsto9022Octets\n", 6519 sblk->stat_EtherStatsPktsRx1523Octetsto9022Octets); 6520 6521 if (sblk->stat_EtherStatsPktsTx64Octets) 6522 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx64Octets\n", 6523 sblk->stat_EtherStatsPktsTx64Octets); 6524 6525 if (sblk->stat_EtherStatsPktsTx65Octetsto127Octets) 6526 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx65Octetsto127Octets\n", 6527 sblk->stat_EtherStatsPktsTx65Octetsto127Octets); 6528 6529 if (sblk->stat_EtherStatsPktsTx128Octetsto255Octets) 6530 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx128Octetsto255Octets\n", 6531 sblk->stat_EtherStatsPktsTx128Octetsto255Octets); 6532 6533 if (sblk->stat_EtherStatsPktsTx256Octetsto511Octets) 6534 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx256Octetsto511Octets\n", 6535 sblk->stat_EtherStatsPktsTx256Octetsto511Octets); 6536 6537 if (sblk->stat_EtherStatsPktsTx512Octetsto1023Octets) 6538 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx512Octetsto1023Octets\n", 6539 sblk->stat_EtherStatsPktsTx512Octetsto1023Octets); 6540 6541 if (sblk->stat_EtherStatsPktsTx1024Octetsto1522Octets) 6542 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx1024Octetsto1522Octets\n", 6543 sblk->stat_EtherStatsPktsTx1024Octetsto1522Octets); 6544 6545 if (sblk->stat_EtherStatsPktsTx1523Octetsto9022Octets) 6546 BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx1523Octetsto9022Octets\n", 6547 sblk->stat_EtherStatsPktsTx1523Octetsto9022Octets); 6548 6549 if (sblk->stat_XonPauseFramesReceived) 6550 BCE_PRINTF(sc, "0x%08X : XonPauseFramesReceived\n", 6551 sblk->stat_XonPauseFramesReceived); 6552 6553 if (sblk->stat_XoffPauseFramesReceived) 6554 BCE_PRINTF(sc, "0x%08X : XoffPauseFramesReceived\n", 6555 sblk->stat_XoffPauseFramesReceived); 6556 6557 if (sblk->stat_OutXonSent) 6558 BCE_PRINTF(sc, "0x%08X : OutXonSent\n", 6559 sblk->stat_OutXonSent); 6560 6561 if (sblk->stat_OutXoffSent) 6562 BCE_PRINTF(sc, "0x%08X : OutXoffSent\n", 6563 sblk->stat_OutXoffSent); 6564 6565 if (sblk->stat_FlowControlDone) 6566 BCE_PRINTF(sc, "0x%08X : FlowControlDone\n", 6567 sblk->stat_FlowControlDone); 6568 6569 if (sblk->stat_MacControlFramesReceived) 6570 BCE_PRINTF(sc, "0x%08X : MacControlFramesReceived\n", 6571 sblk->stat_MacControlFramesReceived); 6572 6573 if (sblk->stat_XoffStateEntered) 6574 BCE_PRINTF(sc, "0x%08X : XoffStateEntered\n", 6575 sblk->stat_XoffStateEntered); 6576 6577 if (sblk->stat_IfInFramesL2FilterDiscards) 6578 BCE_PRINTF(sc, "0x%08X : IfInFramesL2FilterDiscards\n", 6579 sblk->stat_IfInFramesL2FilterDiscards); 6580 6581 if (sblk->stat_IfInRuleCheckerDiscards) 6582 BCE_PRINTF(sc, "0x%08X : IfInRuleCheckerDiscards\n", 6583 sblk->stat_IfInRuleCheckerDiscards); 6584 6585 if (sblk->stat_IfInFTQDiscards) 6586 BCE_PRINTF(sc, "0x%08X : IfInFTQDiscards\n", 6587 sblk->stat_IfInFTQDiscards); 6588 6589 if (sblk->stat_IfInMBUFDiscards) 6590 BCE_PRINTF(sc, "0x%08X : IfInMBUFDiscards\n", 6591 sblk->stat_IfInMBUFDiscards); 6592 6593 if (sblk->stat_IfInRuleCheckerP4Hit) 6594 BCE_PRINTF(sc, "0x%08X : IfInRuleCheckerP4Hit\n", 6595 sblk->stat_IfInRuleCheckerP4Hit); 6596 6597 if (sblk->stat_CatchupInRuleCheckerDiscards) 6598 BCE_PRINTF(sc, "0x%08X : CatchupInRuleCheckerDiscards\n", 6599 sblk->stat_CatchupInRuleCheckerDiscards); 6600 6601 if (sblk->stat_CatchupInFTQDiscards) 6602 BCE_PRINTF(sc, "0x%08X : CatchupInFTQDiscards\n", 6603 sblk->stat_CatchupInFTQDiscards); 6604 6605 if (sblk->stat_CatchupInMBUFDiscards) 6606 BCE_PRINTF(sc, "0x%08X : CatchupInMBUFDiscards\n", 6607 sblk->stat_CatchupInMBUFDiscards); 6608 6609 if (sblk->stat_CatchupInRuleCheckerP4Hit) 6610 BCE_PRINTF(sc, "0x%08X : CatchupInRuleCheckerP4Hit\n", 6611 sblk->stat_CatchupInRuleCheckerP4Hit); 6612 6613 BCE_PRINTF(sc, 6614 "-----------------------------" 6615 "--------------" 6616 "-----------------------------\n"); 6617 } 6618 6619 6620 static void 6621 bce_dump_driver_state(struct bce_softc *sc) 6622 { 6623 u32 val_hi, val_lo; 6624 6625 BCE_PRINTF(sc, 6626 "-----------------------------" 6627 " Driver State " 6628 "-----------------------------\n"); 6629 6630 val_hi = BCE_ADDR_HI(sc); 6631 val_lo = BCE_ADDR_LO(sc); 6632 BCE_PRINTF(sc, "0x%08X:%08X - (sc) driver softc structure virtual address\n", 6633 val_hi, val_lo); 6634 6635 val_hi = BCE_ADDR_HI(sc->bce_vhandle); 6636 val_lo = BCE_ADDR_LO(sc->bce_vhandle); 6637 BCE_PRINTF(sc, "0x%08X:%08X - (sc->bce_vhandle) PCI BAR virtual address\n", 6638 val_hi, val_lo); 6639 6640 val_hi = BCE_ADDR_HI(sc->status_block); 6641 val_lo = BCE_ADDR_LO(sc->status_block); 6642 BCE_PRINTF(sc, "0x%08X:%08X - (sc->status_block) status block virtual address\n", 6643 val_hi, val_lo); 6644 6645 val_hi = BCE_ADDR_HI(sc->stats_block); 6646 val_lo = BCE_ADDR_LO(sc->stats_block); 6647 BCE_PRINTF(sc, "0x%08X:%08X - (sc->stats_block) statistics block virtual address\n", 6648 val_hi, val_lo); 6649 6650 val_hi = BCE_ADDR_HI(sc->tx_bd_chain); 6651 val_lo = BCE_ADDR_LO(sc->tx_bd_chain); 6652 BCE_PRINTF(sc, 6653 "0x%08X:%08X - (sc->tx_bd_chain) tx_bd chain virtual adddress\n", 6654 val_hi, val_lo); 6655 6656 val_hi = BCE_ADDR_HI(sc->rx_bd_chain); 6657 val_lo = BCE_ADDR_LO(sc->rx_bd_chain); 6658 BCE_PRINTF(sc, 6659 "0x%08X:%08X - (sc->rx_bd_chain) rx_bd chain virtual address\n", 6660 val_hi, val_lo); 6661 6662 val_hi = BCE_ADDR_HI(sc->tx_mbuf_ptr); 6663 val_lo = BCE_ADDR_LO(sc->tx_mbuf_ptr); 6664 BCE_PRINTF(sc, 6665 "0x%08X:%08X - (sc->tx_mbuf_ptr) tx mbuf chain virtual address\n", 6666 val_hi, val_lo); 6667 6668 val_hi = BCE_ADDR_HI(sc->rx_mbuf_ptr); 6669 val_lo = BCE_ADDR_LO(sc->rx_mbuf_ptr); 6670 BCE_PRINTF(sc, 6671 "0x%08X:%08X - (sc->rx_mbuf_ptr) rx mbuf chain virtual address\n", 6672 val_hi, val_lo); 6673 6674 BCE_PRINTF(sc, " 0x%08X - (sc->interrupts_generated) h/w intrs\n", 6675 sc->interrupts_generated); 6676 6677 BCE_PRINTF(sc, " 0x%08X - (sc->rx_interrupts) rx interrupts handled\n", 6678 sc->rx_interrupts); 6679 6680 BCE_PRINTF(sc, " 0x%08X - (sc->tx_interrupts) tx interrupts handled\n", 6681 sc->tx_interrupts); 6682 6683 BCE_PRINTF(sc, " 0x%08X - (sc->last_status_idx) status block index\n", 6684 sc->last_status_idx); 6685 6686 BCE_PRINTF(sc, " 0x%08X - (sc->tx_prod) tx producer index\n", 6687 sc->tx_prod); 6688 6689 BCE_PRINTF(sc, " 0x%08X - (sc->tx_cons) tx consumer index\n", 6690 sc->tx_cons); 6691 6692 BCE_PRINTF(sc, " 0x%08X - (sc->tx_prod_bseq) tx producer bseq index\n", 6693 sc->tx_prod_bseq); 6694 6695 BCE_PRINTF(sc, " 0x%08X - (sc->rx_prod) rx producer index\n", 6696 sc->rx_prod); 6697 6698 BCE_PRINTF(sc, " 0x%08X - (sc->rx_cons) rx consumer index\n", 6699 sc->rx_cons); 6700 6701 BCE_PRINTF(sc, " 0x%08X - (sc->rx_prod_bseq) rx producer bseq index\n", 6702 sc->rx_prod_bseq); 6703 6704 BCE_PRINTF(sc, " 0x%08X - (sc->rx_mbuf_alloc) rx mbufs allocated\n", 6705 sc->rx_mbuf_alloc); 6706 6707 BCE_PRINTF(sc, " 0x%08X - (sc->free_rx_bd) free rx_bd's\n", 6708 sc->free_rx_bd); 6709 6710 BCE_PRINTF(sc, "0x%08X/%08X - (sc->rx_low_watermark) rx low watermark\n", 6711 sc->rx_low_watermark, (u32) USABLE_RX_BD); 6712 6713 BCE_PRINTF(sc, " 0x%08X - (sc->txmbuf_alloc) tx mbufs allocated\n", 6714 sc->tx_mbuf_alloc); 6715 6716 BCE_PRINTF(sc, " 0x%08X - (sc->rx_mbuf_alloc) rx mbufs allocated\n", 6717 sc->rx_mbuf_alloc); 6718 6719 BCE_PRINTF(sc, " 0x%08X - (sc->used_tx_bd) used tx_bd's\n", 6720 sc->used_tx_bd); 6721 6722 BCE_PRINTF(sc, "0x%08X/%08X - (sc->tx_hi_watermark) tx hi watermark\n", 6723 sc->tx_hi_watermark, (u32) USABLE_TX_BD); 6724 6725 BCE_PRINTF(sc, " 0x%08X - (sc->mbuf_alloc_failed) failed mbuf alloc\n", 6726 sc->mbuf_alloc_failed); 6727 6728 BCE_PRINTF(sc, 6729 "-----------------------------" 6730 "--------------" 6731 "-----------------------------\n"); 6732 } 6733 6734 6735 static void 6736 bce_dump_hw_state(struct bce_softc *sc) 6737 { 6738 u32 val1; 6739 6740 BCE_PRINTF(sc, 6741 "----------------------------" 6742 " Hardware State " 6743 "----------------------------\n"); 6744 6745 BCE_PRINTF(sc, "0x%08X : bootcode version\n", sc->bce_fw_ver); 6746 6747 val1 = REG_RD(sc, BCE_MISC_ENABLE_STATUS_BITS); 6748 BCE_PRINTF(sc, "0x%08X : (0x%04X) misc_enable_status_bits\n", 6749 val1, BCE_MISC_ENABLE_STATUS_BITS); 6750 6751 val1 = REG_RD(sc, BCE_DMA_STATUS); 6752 BCE_PRINTF(sc, "0x%08X : (0x%04X) dma_status\n", val1, BCE_DMA_STATUS); 6753 6754 val1 = REG_RD(sc, BCE_CTX_STATUS); 6755 BCE_PRINTF(sc, "0x%08X : (0x%04X) ctx_status\n", val1, BCE_CTX_STATUS); 6756 6757 val1 = REG_RD(sc, BCE_EMAC_STATUS); 6758 BCE_PRINTF(sc, "0x%08X : (0x%04X) emac_status\n", val1, BCE_EMAC_STATUS); 6759 6760 val1 = REG_RD(sc, BCE_RPM_STATUS); 6761 BCE_PRINTF(sc, "0x%08X : (0x%04X) rpm_status\n", val1, BCE_RPM_STATUS); 6762 6763 val1 = REG_RD(sc, BCE_TBDR_STATUS); 6764 BCE_PRINTF(sc, "0x%08X : (0x%04X) tbdr_status\n", val1, BCE_TBDR_STATUS); 6765 6766 val1 = REG_RD(sc, BCE_TDMA_STATUS); 6767 BCE_PRINTF(sc, "0x%08X : (0x%04X) tdma_status\n", val1, BCE_TDMA_STATUS); 6768 6769 val1 = REG_RD(sc, BCE_HC_STATUS); 6770 BCE_PRINTF(sc, "0x%08X : (0x%04X) hc_status\n", val1, BCE_HC_STATUS); 6771 6772 BCE_PRINTF(sc, 6773 "----------------------------" 6774 "----------------" 6775 "----------------------------\n"); 6776 6777 BCE_PRINTF(sc, 6778 "----------------------------" 6779 " Register Dump " 6780 "----------------------------\n"); 6781 6782 for (int i = 0x400; i < 0x8000; i += 0x10) 6783 BCE_PRINTF(sc, "0x%04X: 0x%08X 0x%08X 0x%08X 0x%08X\n", 6784 i, REG_RD(sc, i), REG_RD(sc, i + 0x4), 6785 REG_RD(sc, i + 0x8), REG_RD(sc, i + 0xC)); 6786 6787 BCE_PRINTF(sc, 6788 "----------------------------" 6789 "----------------" 6790 "----------------------------\n"); 6791 } 6792 6793 6794 static void 6795 bce_breakpoint(struct bce_softc *sc) 6796 { 6797 6798 /* Unreachable code to shut the compiler up about unused functions. */ 6799 if (0) { 6800 bce_dump_txbd(sc, 0, NULL); 6801 bce_dump_rxbd(sc, 0, NULL); 6802 bce_dump_tx_mbuf_chain(sc, 0, USABLE_TX_BD); 6803 bce_dump_rx_mbuf_chain(sc, 0, USABLE_RX_BD); 6804 bce_dump_l2fhdr(sc, 0, NULL); 6805 bce_dump_tx_chain(sc, 0, USABLE_TX_BD); 6806 bce_dump_rx_chain(sc, 0, USABLE_RX_BD); 6807 bce_dump_status_block(sc); 6808 bce_dump_stats_block(sc); 6809 bce_dump_driver_state(sc); 6810 bce_dump_hw_state(sc); 6811 } 6812 6813 bce_dump_driver_state(sc); 6814 /* Print the important status block fields. */ 6815 bce_dump_status_block(sc); 6816 6817 /* Call the debugger. */ 6818 breakpoint(); 6819 6820 return; 6821 } 6822 #endif 6823