summaryrefslogtreecommitdiffstats
path: root/sys/dev/bce
diff options
context:
space:
mode:
authordavidch <davidch@FreeBSD.org>2007-05-04 23:14:19 +0000
committerdavidch <davidch@FreeBSD.org>2007-05-04 23:14:19 +0000
commit6ab1aa7971bd4c712b1c6f75118c2dd8d2745ed6 (patch)
tree9667834905b8e7d39ae580f02918f82d54ef6fb2 /sys/dev/bce
parentf0941ae8a011ae317ba818e20f8e612832d540ee (diff)
downloadFreeBSD-src-6ab1aa7971bd4c712b1c6f75118c2dd8d2745ed6.zip
FreeBSD-src-6ab1aa7971bd4c712b1c6f75118c2dd8d2745ed6.tar.gz
MFC after: 2 weeks
Updated copyright date to 2007. Tested with BCM5706 A3. Added ID for BCM5708 B2. Removed unused driver version string. Modified BCE_PRINTF macro to automatically fill-in the sc pointer. Fixed a kernel panic when the driver was loaded as a module from the command-line because the MII bus pointer was null (i.e. the MII bus hadn't been enumerated yet). Added fix proposed by Vladimir Ivanov <wawa@yandex-team.ru> to prevent driver state corruption when releasing the lock during the ISR in bce_rx_intr() to send packets up the stack. Added new TX chain and register read sysctl interfaces for debugging. Cleaned up formatting for various other debug routines. Added a new statistic maintained by firmware which tracks the number of received packets dropped because no receive buffers are available.
Diffstat (limited to 'sys/dev/bce')
-rw-r--r--sys/dev/bce/if_bce.c802
-rw-r--r--sys/dev/bce/if_bcefw.h2
-rw-r--r--sys/dev/bce/if_bcereg.h23
3 files changed, 515 insertions, 312 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c
index 020d302..eb6b310 100644
--- a/sys/dev/bce/if_bce.c
+++ b/sys/dev/bce/if_bce.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2006 Broadcom Corporation
+ * Copyright (c) 2006-2007 Broadcom Corporation
* David Christensen <davidch@broadcom.com>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -34,15 +34,13 @@ __FBSDID("$FreeBSD$");
/*
* The following controllers are supported by this driver:
* BCM5706C A2, A3
- * BCM5708C B1
+ * BCM5708C B1, B2
*
* The following controllers are not supported by this driver:
- * (These are not "Production" versions of the controller.)
- *
* BCM5706C A0, A1
* BCM5706S A0, A1, A2, A3
* BCM5708C A0, B0
- * BCM5708S A0, B0, B1
+ * BCM5708S A0, B0, B1, B2
*/
#include "opt_bce.h"
@@ -51,12 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/bce/if_bcefw.h>
/****************************************************************************/
-/* BCE Driver Version */
-/****************************************************************************/
-char bce_driver_version[] = "v0.9.6";
-
-
-/****************************************************************************/
/* BCE Debug Options */
/****************************************************************************/
#ifdef BCE_DEBUG
@@ -416,11 +408,10 @@ bce_probe(device_t dev)
return(ENOMEM);
/* Print out the device identity. */
- snprintf(descbuf, BCE_DEVDESC_MAX, "%s (%c%d), %s",
+ snprintf(descbuf, BCE_DEVDESC_MAX, "%s (%c%d)",
t->bce_name,
(((pci_read_config(dev, PCIR_REVID, 4) & 0xf0) >> 4) + 'A'),
- (pci_read_config(dev, PCIR_REVID, 4) & 0xf),
- bce_driver_version);
+ (pci_read_config(dev, PCIR_REVID, 4) & 0xf));
device_set_desc_copy(dev, descbuf);
free(descbuf, M_TEMP);
@@ -473,7 +464,7 @@ bce_attach(device_t dev)
RF_ACTIVE | PCI_RF_DENSE); /* flags */
if (sc->bce_res == NULL) {
- BCE_PRINTF(sc, "%s(%d): PCI memory allocation failed\n",
+ BCE_PRINTF("%s(%d): PCI memory allocation failed\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -495,7 +486,7 @@ bce_attach(device_t dev)
RF_SHAREABLE | RF_ACTIVE);
if (sc->bce_irq == NULL) {
- BCE_PRINTF(sc, "%s(%d): PCI map interrupt failed\n",
+ BCE_PRINTF("%s(%d): PCI map interrupt failed\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -523,7 +514,7 @@ bce_attach(device_t dev)
case BCE_CHIP_ID_5706_A1:
case BCE_CHIP_ID_5708_A0:
case BCE_CHIP_ID_5708_B0:
- BCE_PRINTF(sc, "%s(%d): Unsupported controller revision (%c%d)!\n",
+ BCE_PRINTF("%s(%d): Unsupported controller revision (%c%d)!\n",
__FILE__, __LINE__,
(((pci_read_config(dev, PCIR_REVID, 4) & 0xf0) >> 4) + 'A'),
(pci_read_config(dev, PCIR_REVID, 4) & 0xf));
@@ -603,7 +594,7 @@ bce_attach(device_t dev)
if (val & BCE_PCICFG_MISC_STATUS_32BIT_DET)
sc->bce_flags |= BCE_PCI_32BIT_FLAG;
- BCE_PRINTF(sc, "ASIC ID 0x%08X; Revision (%c%d); PCI%s %s %dMHz\n",
+ BCE_PRINTF("ASIC ID 0x%08X; Revision (%c%d); PCI%s %s %dMHz\n",
sc->bce_chipid,
((BCE_CHIP_ID(sc) & 0xf000) >> 12) + 'A',
((BCE_CHIP_ID(sc) & 0x0ff0) >> 4),
@@ -619,7 +610,7 @@ bce_attach(device_t dev)
/* Initialize the controller. */
if (bce_chipinit(sc)) {
- BCE_PRINTF(sc, "%s(%d): Controller initialization failed!\n",
+ BCE_PRINTF("%s(%d): Controller initialization failed!\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -627,7 +618,7 @@ bce_attach(device_t dev)
/* Perform NVRAM test. */
if (bce_nvram_test(sc)) {
- BCE_PRINTF(sc, "%s(%d): NVRAM test failed!\n",
+ BCE_PRINTF("%s(%d): NVRAM test failed!\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -693,7 +684,7 @@ bce_attach(device_t dev)
/* Allocate DMA memory resources. */
if (bce_dma_alloc(dev)) {
- BCE_PRINTF(sc, "%s(%d): DMA resource allocation failed!\n",
+ BCE_PRINTF("%s(%d): DMA resource allocation failed!\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -702,7 +693,7 @@ bce_attach(device_t dev)
/* Allocate an ifnet structure. */
ifp = sc->bce_ifp = if_alloc(IFT_ETHER);
if (ifp == NULL) {
- BCE_PRINTF(sc, "%s(%d): Interface allocation failed!\n",
+ BCE_PRINTF("%s(%d): Interface allocation failed!\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -738,7 +729,7 @@ bce_attach(device_t dev)
/* Look for our PHY. */
if (mii_phy_probe(dev, &sc->bce_miibus, bce_ifmedia_upd,
bce_ifmedia_sts)) {
- BCE_PRINTF(sc, "%s(%d): PHY probe failed!\n",
+ BCE_PRINTF("%s(%d): PHY probe failed!\n",
__FILE__, __LINE__);
rc = ENXIO;
goto bce_attach_fail;
@@ -758,7 +749,7 @@ bce_attach(device_t dev)
bce_intr, sc, &sc->bce_intrhand);
if (rc) {
- BCE_PRINTF(sc, "%s(%d): Failed to setup IRQ!\n",
+ BCE_PRINTF("%s(%d): Failed to setup IRQ!\n",
__FILE__, __LINE__);
bce_detach(dev);
goto bce_attach_exit;
@@ -771,9 +762,9 @@ bce_attach(device_t dev)
bce_add_sysctls(sc);
/* Get the firmware running so IPMI still works */
- BCE_LOCK(sc);
+ BCE_LOCK(sc);
bce_mgmt_init_locked(sc);
- BCE_UNLOCK(sc);
+ BCE_UNLOCK(sc);
goto bce_attach_exit;
@@ -984,7 +975,7 @@ bce_miibus_read_reg(device_t dev, int phy, int reg)
}
if (val & BCE_EMAC_MDIO_COMM_START_BUSY) {
- BCE_PRINTF(sc, "%s(%d): Error: PHY read timeout! phy = %d, reg = 0x%04X\n",
+ BCE_PRINTF("%s(%d): Error: PHY read timeout! phy = %d, reg = 0x%04X\n",
__FILE__, __LINE__, phy, reg);
val = 0x0;
} else {
@@ -1061,7 +1052,7 @@ bce_miibus_write_reg(device_t dev, int phy, int reg, int val)
}
if (val1 & BCE_EMAC_MDIO_COMM_START_BUSY)
- BCE_PRINTF(sc, "%s(%d): PHY write timeout!\n",
+ BCE_PRINTF("%s(%d): PHY write timeout!\n",
__FILE__, __LINE__);
if (sc->bce_phy_flags & BCE_PHY_INT_MODE_AUTO_POLLING_FLAG) {
@@ -1415,7 +1406,7 @@ bce_nvram_read_dword(struct bce_softc *sc, u32 offset, u8 *ret_val,
/* Check for errors. */
if (i >= NVRAM_TIMEOUT_COUNT) {
- BCE_PRINTF(sc, "%s(%d): Timeout error reading NVRAM at offset 0x%08X!\n",
+ BCE_PRINTF("%s(%d): Timeout error reading NVRAM at offset 0x%08X!\n",
__FILE__, __LINE__, offset);
rc = EBUSY;
}
@@ -1471,7 +1462,7 @@ bce_nvram_write_dword(struct bce_softc *sc, u32 offset, u8 *val,
break;
}
if (j >= NVRAM_TIMEOUT_COUNT) {
- BCE_PRINTF(sc, "%s(%d): Timeout error writing NVRAM at offset 0x%08X\n",
+ BCE_PRINTF("%s(%d): Timeout error writing NVRAM at offset 0x%08X\n",
__FILE__, __LINE__, offset);
return EBUSY;
}
@@ -1568,7 +1559,7 @@ bce_init_nvram(struct bce_softc *sc)
/* Check if a matching device was found. */
if (j == entry_count) {
sc->bce_flash_info = NULL;
- BCE_PRINTF(sc, "%s(%d): Unknown Flash NVRAM found!\n",
+ BCE_PRINTF("%s(%d): Unknown Flash NVRAM found!\n",
__FILE__, __LINE__);
rc = ENODEV;
}
@@ -1926,7 +1917,7 @@ bce_nvram_test(struct bce_softc *sc)
magic = bce_be32toh(buf[0]);
if (magic != BCE_NVRAM_MAGIC) {
rc = ENODEV;
- BCE_PRINTF(sc, "%s(%d): Invalid NVRAM magic value! Expected: 0x%08X, "
+ BCE_PRINTF("%s(%d): Invalid NVRAM magic value! Expected: 0x%08X, "
"Found: 0x%08X\n",
__FILE__, __LINE__, BCE_NVRAM_MAGIC, magic);
goto bce_nvram_test_done;
@@ -1942,7 +1933,7 @@ bce_nvram_test(struct bce_softc *sc)
csum = ether_crc32_le(data, 0x100);
if (csum != BCE_CRC32_RESIDUAL) {
rc = ENODEV;
- BCE_PRINTF(sc, "%s(%d): Invalid Manufacturing Information NVRAM CRC! "
+ BCE_PRINTF("%s(%d): Invalid Manufacturing Information NVRAM CRC! "
"Expected: 0x%08X, Found: 0x%08X\n",
__FILE__, __LINE__, BCE_CRC32_RESIDUAL, csum);
goto bce_nvram_test_done;
@@ -1950,7 +1941,7 @@ bce_nvram_test(struct bce_softc *sc)
csum = ether_crc32_le(data + 0x100, 0x100);
if (csum != BCE_CRC32_RESIDUAL) {
- BCE_PRINTF(sc, "%s(%d): Invalid Feature Configuration Information "
+ BCE_PRINTF("%s(%d): Invalid Feature Configuration Information "
"NVRAM CRC! Expected: 0x%08X, Found: 08%08X\n",
__FILE__, __LINE__, BCE_CRC32_RESIDUAL, csum);
rc = ENODEV;
@@ -2174,7 +2165,7 @@ bce_dma_alloc(device_t dev)
NULL, /* locfunc */
NULL, /* lockarg */
&sc->parent_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate parent DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate parent DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2200,7 +2191,7 @@ bce_dma_alloc(device_t dev)
NULL, /* lockfunc */
NULL, /* lockarg */
&sc->status_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate status block DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate status block DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2211,7 +2202,7 @@ bce_dma_alloc(device_t dev)
(void **)&sc->status_block, /* vaddr */
BUS_DMA_NOWAIT, /* flags */
&sc->status_map)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate status block DMA memory!\n",
+ BCE_PRINTF("%s(%d): Could not allocate status block DMA memory!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2229,7 +2220,7 @@ bce_dma_alloc(device_t dev)
BUS_DMA_NOWAIT); /* flags */
if (error) {
- BCE_PRINTF(sc, "%s(%d): Could not map status block DMA memory!\n",
+ BCE_PRINTF("%s(%d): Could not map status block DMA memory!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2260,7 +2251,7 @@ bce_dma_alloc(device_t dev)
NULL, /* lockfunc */
NULL, /* lockarg */
&sc->stats_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate statistics block DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate statistics block DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2271,7 +2262,7 @@ bce_dma_alloc(device_t dev)
(void **)&sc->stats_block, /* vaddr */
BUS_DMA_NOWAIT, /* flags */
&sc->stats_map)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate statistics block DMA memory!\n",
+ BCE_PRINTF("%s(%d): Could not allocate statistics block DMA memory!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2289,7 +2280,7 @@ bce_dma_alloc(device_t dev)
BUS_DMA_NOWAIT); /* flags */
if(error) {
- BCE_PRINTF(sc, "%s(%d): Could not map statistics block DMA memory!\n",
+ BCE_PRINTF("%s(%d): Could not map statistics block DMA memory!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2320,7 +2311,7 @@ bce_dma_alloc(device_t dev)
NULL, /* lockfunc */
NULL, /* lockarg */
&sc->tx_bd_chain_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate TX descriptor chain DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate TX descriptor chain DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2333,7 +2324,7 @@ bce_dma_alloc(device_t dev)
(void **)&sc->tx_bd_chain[i], /* vaddr */
BUS_DMA_NOWAIT, /* flags */
&sc->tx_bd_chain_map[i])) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate TX descriptor "
+ BCE_PRINTF("%s(%d): Could not allocate TX descriptor "
"chain DMA memory!\n", __FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2349,7 +2340,7 @@ bce_dma_alloc(device_t dev)
BUS_DMA_NOWAIT); /* flags */
if (error) {
- BCE_PRINTF(sc, "%s(%d): Could not map TX descriptor chain DMA memory!\n",
+ BCE_PRINTF("%s(%d): Could not map TX descriptor chain DMA memory!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2377,7 +2368,7 @@ bce_dma_alloc(device_t dev)
NULL, /* lockfunc */
NULL, /* lockarg */
&sc->tx_mbuf_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate TX mbuf DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate TX mbuf DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2387,7 +2378,7 @@ bce_dma_alloc(device_t dev)
for (i = 0; i < TOTAL_TX_BD; i++) {
if (bus_dmamap_create(sc->tx_mbuf_tag, BUS_DMA_NOWAIT,
&sc->tx_mbuf_map[i])) {
- BCE_PRINTF(sc, "%s(%d): Unable to create TX mbuf DMA map!\n",
+ BCE_PRINTF("%s(%d): Unable to create TX mbuf DMA map!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2414,7 +2405,7 @@ bce_dma_alloc(device_t dev)
NULL, /* lockfunc */
NULL, /* lockarg */
&sc->rx_bd_chain_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate RX descriptor chain DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate RX descriptor chain DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2427,7 +2418,7 @@ bce_dma_alloc(device_t dev)
(void **)&sc->rx_bd_chain[i], /* vaddr */
BUS_DMA_NOWAIT, /* flags */
&sc->rx_bd_chain_map[i])) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate RX descriptor chain "
+ BCE_PRINTF("%s(%d): Could not allocate RX descriptor chain "
"DMA memory!\n", __FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2445,7 +2436,7 @@ bce_dma_alloc(device_t dev)
BUS_DMA_NOWAIT); /* flags */
if (error) {
- BCE_PRINTF(sc, "%s(%d): Could not map RX descriptor chain DMA memory!\n",
+ BCE_PRINTF("%s(%d): Could not map RX descriptor chain DMA memory!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2475,7 +2466,7 @@ bce_dma_alloc(device_t dev)
NULL, /* lockfunc */
NULL, /* lockarg */
&sc->rx_mbuf_tag)) {
- BCE_PRINTF(sc, "%s(%d): Could not allocate RX mbuf DMA tag!\n",
+ BCE_PRINTF("%s(%d): Could not allocate RX mbuf DMA tag!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2485,7 +2476,7 @@ bce_dma_alloc(device_t dev)
for (i = 0; i < TOTAL_RX_BD; i++) {
if (bus_dmamap_create(sc->rx_mbuf_tag, BUS_DMA_NOWAIT,
&sc->rx_mbuf_map[i])) {
- BCE_PRINTF(sc, "%s(%d): Unable to create RX mbuf DMA map!\n",
+ BCE_PRINTF("%s(%d): Unable to create RX mbuf DMA map!\n",
__FILE__, __LINE__);
rc = ENOMEM;
goto bce_dma_alloc_exit;
@@ -2592,7 +2583,7 @@ bce_fw_sync(struct bce_softc *sc, u32 msg_data)
if (((val & BCE_FW_MSG_ACK) != (msg_data & BCE_DRV_MSG_SEQ)) &&
((msg_data & BCE_DRV_MSG_DATA) != BCE_DRV_MSG_DATA_WAIT0)) {
- BCE_PRINTF(sc, "%s(%d): Firmware synchronization timeout! "
+ BCE_PRINTF("%s(%d): Firmware synchronization timeout! "
"msg_data = 0x%08X\n",
__FILE__, __LINE__, msg_data);
@@ -3004,7 +2995,7 @@ bce_get_mac_addr(struct bce_softc *sc)
BCE_PORT_HW_CFG_MAC_LOWER);
if ((mac_lo == 0) && (mac_hi == 0)) {
- BCE_PRINTF(sc, "%s(%d): Invalid Ethernet address!\n",
+ BCE_PRINTF("%s(%d): Invalid Ethernet address!\n",
__FILE__, __LINE__);
} else {
sc->eaddr[0] = (u_char)(mac_hi >> 8);
@@ -3167,7 +3158,7 @@ bce_reset(struct bce_softc *sc, u32 reset_code)
/* Check that reset completed successfully. */
if (val & (BCE_PCICFG_MISC_CONFIG_CORE_RST_REQ |
BCE_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
- BCE_PRINTF(sc, "%s(%d): Reset failed!\n",
+ BCE_PRINTF("%s(%d): Reset failed!\n",
__FILE__, __LINE__);
rc = EBUSY;
goto bce_reset_exit;
@@ -3176,7 +3167,7 @@ bce_reset(struct bce_softc *sc, u32 reset_code)
/* Make sure byte swapping is properly configured. */
val = REG_RD(sc, BCE_PCI_SWAP_DIAG0);
if (val != 0x01020304) {
- BCE_PRINTF(sc, "%s(%d): Byte swap is incorrect!\n",
+ BCE_PRINTF("%s(%d): Byte swap is incorrect!\n",
__FILE__, __LINE__);
rc = ENODEV;
goto bce_reset_exit;
@@ -3188,7 +3179,7 @@ bce_reset(struct bce_softc *sc, u32 reset_code)
/* Wait for the firmware to finish its initialization. */
rc = bce_fw_sync(sc, BCE_DRV_MSG_DATA_WAIT1 | reset_code);
if (rc)
- BCE_PRINTF(sc, "%s(%d): Firmware did not complete initialization!\n",
+ BCE_PRINTF("%s(%d): Firmware did not complete initialization!\n",
__FILE__, __LINE__);
bce_reset_exit:
@@ -3272,7 +3263,8 @@ bce_chipinit(struct bce_softc *sc)
val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
REG_WR(sc, BCE_MQ_KNL_BYP_WIND_START, val);
REG_WR(sc, BCE_MQ_KNL_WIND_END, val);
-
+
+ /* Set the page size and clear the RV2P processor stall bits. */
val = (BCM_PAGE_BITS - 8) << 24;
REG_WR(sc, BCE_RV2P_CONFIG, val);
@@ -3360,13 +3352,13 @@ bce_blockinit(struct bce_softc *sc)
reg = REG_RD_IND(sc, sc->bce_shmem_base + BCE_DEV_INFO_SIGNATURE);
DBRUNIF(DB_RANDOMTRUE(bce_debug_bootcode_running_failure),
- BCE_PRINTF(sc, "%s(%d): Simulating bootcode failure.\n",
+ BCE_PRINTF("%s(%d): Simulating bootcode failure.\n",
__FILE__, __LINE__);
reg = 0);
if ((reg & BCE_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
BCE_DEV_INFO_SIGNATURE_MAGIC) {
- BCE_PRINTF(sc, "%s(%d): Bootcode not running! Found: 0x%08X, "
+ BCE_PRINTF("%s(%d): Bootcode not running! Found: 0x%08X, "
"Expected: 08%08X\n", __FILE__, __LINE__,
(reg & BCE_DEV_INFO_SIGNATURE_MAGIC_MASK),
BCE_DEV_INFO_SIGNATURE_MAGIC);
@@ -3430,7 +3422,7 @@ bce_get_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, u16 *chain_prod,
/* Make sure the inputs are valid. */
DBRUNIF((*chain_prod > MAX_RX_BD),
- BCE_PRINTF(sc, "%s(%d): RX producer out of range: 0x%04X > 0x%04X\n",
+ BCE_PRINTF("%s(%d): RX producer out of range: 0x%04X > 0x%04X\n",
__FILE__, __LINE__, *chain_prod, (u16) MAX_RX_BD));
DBPRINT(sc, BCE_VERBOSE_RECV, "%s(enter): prod = 0x%04X, chain_prod = 0x%04X, "
@@ -3439,7 +3431,7 @@ bce_get_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, u16 *chain_prod,
if (m == NULL) {
DBRUNIF(DB_RANDOMTRUE(bce_debug_mbuf_allocation_failure),
- BCE_PRINTF(sc, "%s(%d): Simulating mbuf allocation failure.\n",
+ BCE_PRINTF("%s(%d): Simulating mbuf allocation failure.\n",
__FILE__, __LINE__);
sc->mbuf_alloc_failed++;
rc = ENOBUFS;
@@ -3487,7 +3479,7 @@ bce_get_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, u16 *chain_prod,
segs, &nsegs, BUS_DMA_NOWAIT);
if (error) {
- BCE_PRINTF(sc, "%s(%d): Error mapping mbuf into RX chain!\n",
+ BCE_PRINTF("%s(%d): Error mapping mbuf into RX chain!\n",
__FILE__, __LINE__);
m_freem(m_new);
@@ -3500,7 +3492,7 @@ bce_get_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, u16 *chain_prod,
/* Watch for overflow. */
DBRUNIF((sc->free_rx_bd > USABLE_RX_BD),
- BCE_PRINTF(sc, "%s(%d): Too many free rx_bd (0x%04X > 0x%04X)!\n",
+ BCE_PRINTF("%s(%d): Too many free rx_bd (0x%04X > 0x%04X)!\n",
__FILE__, __LINE__, sc->free_rx_bd, (u16) USABLE_RX_BD));
DBRUNIF((sc->free_rx_bd < sc->rx_low_watermark),
@@ -3652,7 +3644,7 @@ bce_free_tx_chain(struct bce_softc *sc)
/* Check if we lost any mbufs in the process. */
DBRUNIF((sc->tx_mbuf_alloc),
- BCE_PRINTF(sc, "%s(%d): Memory leak! Lost %d mbufs "
+ BCE_PRINTF("%s(%d): Memory leak! Lost %d mbufs "
"from tx chain!\n",
__FILE__, __LINE__, sc->tx_mbuf_alloc));
@@ -3717,7 +3709,7 @@ bce_init_rx_chain(struct bce_softc *sc)
while (prod < BCE_RX_SLACK_SPACE) {
chain_prod = RX_CHAIN_IDX(prod);
if (bce_get_buf(sc, NULL, &prod, &chain_prod, &prod_bseq)) {
- BCE_PRINTF(sc, "%s(%d): Error filling RX chain: rx_bd[0x%04X]!\n",
+ BCE_PRINTF("%s(%d): Error filling RX chain: rx_bd[0x%04X]!\n",
__FILE__, __LINE__, chain_prod);
rc = ENOBUFS;
break;
@@ -3737,7 +3729,7 @@ bce_init_rx_chain(struct bce_softc *sc)
}
/* Tell the chip about the waiting rx_bd's. */
- REG_WR16(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BDIDX, sc->rx_prod);
+ REG_WR16(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BDIDX, sc->rx_prod);
REG_WR(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BSEQ, sc->rx_prod_bseq);
DBRUN(BCE_VERBOSE_RECV, bce_dump_rx_chain(sc, 0, TOTAL_RX_BD));
@@ -3779,7 +3771,7 @@ bce_free_rx_chain(struct bce_softc *sc)
/* Check if we lost any mbufs in the process. */
DBRUNIF((sc->rx_mbuf_alloc),
- BCE_PRINTF(sc, "%s(%d): Memory leak! Lost %d mbufs from rx chain!\n",
+ BCE_PRINTF("%s(%d): Memory leak! Lost %d mbufs from rx chain!\n",
__FILE__, __LINE__, sc->rx_mbuf_alloc));
DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
@@ -3810,20 +3802,24 @@ bce_ifmedia_upd_locked(struct ifnet *ifp)
struct bce_softc *sc;
struct mii_data *mii;
struct ifmedia *ifm;
-
+
sc = ifp->if_softc;
ifm = &sc->bce_ifmedia;
BCE_LOCK_ASSERT(sc);
mii = device_get_softc(sc->bce_miibus);
- sc->bce_link = 0;
- if (mii->mii_instance) {
- struct mii_softc *miisc;
+
+ /* Make sure the MII bus has been enumerated. */
+ if (mii) {
+ sc->bce_link = 0;
+ if (mii->mii_instance) {
+ struct mii_softc *miisc;
- LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
- mii_phy_reset(miisc);
+ LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
+ mii_phy_reset(miisc);
+ }
+ mii_mediachg(mii);
}
- mii_mediachg(mii);
}
@@ -3951,6 +3947,9 @@ bce_rx_intr(struct bce_softc *sc)
unsigned int len;
u32 status;
+ /* Clear the mbuf pointer. */
+ m = NULL;
+
/* Convert the producer/consumer indices to an actual rx_bd index. */
sw_chain_cons = RX_CHAIN_IDX(sw_cons);
sw_chain_prod = RX_CHAIN_IDX(sw_prod);
@@ -3960,7 +3959,7 @@ bce_rx_intr(struct bce_softc *sc)
sc->free_rx_bd++;
DBRUN(BCE_VERBOSE_RECV,
- BCE_PRINTF(sc, "%s(): ", __FUNCTION__);
+ BCE_PRINTF("%s(): ", __FUNCTION__);
bce_dump_rxbd(sc, sw_chain_cons, rxbd));
#ifdef DEVICE_POLLING
@@ -3976,7 +3975,7 @@ bce_rx_intr(struct bce_softc *sc)
/* Validate that this is the last rx_bd. */
DBRUNIF((!(rxbd->rx_bd_flags & RX_BD_FLAGS_END)),
- BCE_PRINTF(sc, "%s(%d): Unexpected mbuf found in rx_bd[0x%04X]!\n",
+ BCE_PRINTF("%s(%d): Unexpected mbuf found in rx_bd[0x%04X]!\n",
__FILE__, __LINE__, sw_chain_cons);
bce_breakpoint(sc));
@@ -4011,12 +4010,12 @@ bce_rx_intr(struct bce_softc *sc)
status = l2fhdr->l2_fhdr_status;
DBRUNIF(DB_RANDOMTRUE(bce_debug_l2fhdr_status_check),
- BCE_PRINTF(sc, "Simulating l2_fhdr status error.\n");
+ BCE_PRINTF("Simulating l2_fhdr status error.\n");
status = status | L2_FHDR_ERRORS_PHY_DECODE);
/* Watch for unusual sized frames. */
DBRUNIF(((len < BCE_MIN_MTU) || (len > BCE_MAX_JUMBO_ETHER_MTU_VLAN)),
- BCE_PRINTF(sc, "%s(%d): Unusual frame size found. "
+ BCE_PRINTF("%s(%d): Unusual frame size found. "
"Min(%d), Actual(%d), Max(%d)\n",
__FILE__, __LINE__, (int) BCE_MIN_MTU,
len, (int) BCE_MAX_JUMBO_ETHER_MTU_VLAN);
@@ -4052,7 +4051,7 @@ bce_rx_intr(struct bce_softc *sc)
if (bce_get_buf(sc, NULL, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) {
DBRUN(BCE_WARN,
- BCE_PRINTF(sc, "%s(%d): Failed to allocate "
+ BCE_PRINTF("%s(%d): Failed to allocate "
"new mbuf, incoming frame dropped!\n",
__FILE__, __LINE__));
@@ -4080,7 +4079,7 @@ bce_rx_intr(struct bce_softc *sc)
DBRUN(BCE_VERBOSE_RECV,
struct ether_header *eh;
eh = mtod(m, struct ether_header *);
- BCE_PRINTF(sc, "%s(): to: %6D, from: %6D, type: 0x%04X\n",
+ BCE_PRINTF("%s(): to: %6D, from: %6D, type: 0x%04X\n",
__FUNCTION__, eh->ether_dhost, ":",
eh->ether_shost, ":", htons(eh->ether_type)));
@@ -4136,19 +4135,36 @@ bce_rx_intr(struct bce_softc *sc)
/* Pass the mbuf off to the upper layers. */
ifp->if_ipackets++;
- DBPRINT(sc, BCE_VERBOSE_RECV, "%s(): Passing received frame up.\n",
- __FUNCTION__);
- BCE_UNLOCK(sc);
- (*ifp->if_input)(ifp, m);
- DBRUNIF(1, sc->rx_mbuf_alloc--);
- BCE_LOCK(sc);
bce_rx_int_next_rx:
sw_prod = NEXT_RX_BD(sw_prod);
}
sw_cons = NEXT_RX_BD(sw_cons);
+
+ /* If we have a packet, pass it up the stack */
+ if (m) {
+ /* Make sure we don't lose our place when we release the lock. */
+ sc->rx_cons = sw_cons;
+ sc->rx_prod = sw_prod;
+ sc->rx_prod_bseq = sw_prod_bseq;
+ DBPRINT(sc, BCE_VERBOSE_RECV, "%s(): Passing received frame up.\n",
+ __FUNCTION__);
+ BCE_UNLOCK(sc);
+ (*ifp->if_input)(ifp, m);
+ DBRUNIF(1, sc->rx_mbuf_alloc--);
+ BCE_LOCK(sc);
+
+ /* Recover our place. */
+ sw_cons = sc->rx_cons;
+ sw_prod = sc->rx_prod;
+ sw_prod_bseq = sc->rx_prod_bseq;
+ hw_cons = sc->hw_rx_cons = sblk->status_rx_quick_consumer_index0;
+ if ((hw_cons & USABLE_RX_BD_PER_PAGE) == USABLE_RX_BD_PER_PAGE)
+ hw_cons++;
+ }
+
/* Refresh hw_cons to see if there's new work */
if (sw_cons == hw_cons) {
hw_cons = sc->hw_rx_cons = sblk->status_rx_quick_consumer_index0;
@@ -4221,7 +4237,7 @@ bce_tx_intr(struct bce_softc *sc)
__FUNCTION__, hw_tx_cons, sw_tx_cons, sw_tx_chain_cons);
DBRUNIF((sw_tx_chain_cons > MAX_TX_BD),
- BCE_PRINTF(sc, "%s(%d): TX chain consumer out of range! "
+ BCE_PRINTF("%s(%d): TX chain consumer out of range! "
" 0x%04X > 0x%04X\n",
__FILE__, __LINE__, sw_tx_chain_cons,
(int) MAX_TX_BD);
@@ -4232,12 +4248,12 @@ bce_tx_intr(struct bce_softc *sc)
[TX_IDX(sw_tx_chain_cons)]);
DBRUNIF((txbd == NULL),
- BCE_PRINTF(sc, "%s(%d): Unexpected NULL tx_bd[0x%04X]!\n",
+ BCE_PRINTF("%s(%d): Unexpected NULL tx_bd[0x%04X]!\n",
__FILE__, __LINE__, sw_tx_chain_cons);
bce_breakpoint(sc));
DBRUN(BCE_INFO_SEND,
- BCE_PRINTF(sc, "%s(): ", __FUNCTION__);
+ BCE_PRINTF("%s(): ", __FUNCTION__);
bce_dump_txbd(sc, sw_tx_chain_cons, txbd));
/*
@@ -4249,12 +4265,12 @@ bce_tx_intr(struct bce_softc *sc)
/* Validate that this is the last tx_bd. */
DBRUNIF((!(txbd->tx_bd_flags & TX_BD_FLAGS_END)),
- BCE_PRINTF(sc, "%s(%d): tx_bd END flag not set but "
+ BCE_PRINTF("%s(%d): tx_bd END flag not set but "
"txmbuf == NULL!\n", __FILE__, __LINE__);
bce_breakpoint(sc));
DBRUN(BCE_INFO_SEND,
- BCE_PRINTF(sc, "%s(): Unloading map/freeing mbuf "
+ BCE_PRINTF("%s(): Unloading map/freeing mbuf "
"from tx_bd[0x%04X]\n", __FUNCTION__, sw_tx_chain_cons));
/* Unmap the mbuf. */
@@ -4287,9 +4303,9 @@ bce_tx_intr(struct bce_softc *sc)
/* Clear the tx hardware queue full flag. */
if ((sc->used_tx_bd + BCE_TX_SLACK_SPACE) < USABLE_TX_BD) {
- DBRUNIF((ifp->if_drv_flags & IFF_DRV_OACTIVE),
- BCE_PRINTF(sc, "%s(): TX chain is open for business! Used tx_bd = %d\n",
- __FUNCTION__, sc->used_tx_bd));
+/* DBRUNIF((ifp->if_drv_flags & IFF_DRV_OACTIVE),
+ BCE_PRINTF("%s(): TX chain is open for business! Used tx_bd = %d\n",
+ __FUNCTION__, sc->used_tx_bd)); */
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
}
@@ -4338,8 +4354,6 @@ bce_enable_intr(struct bce_softc *sc)
/****************************************************************************/
/* Handles controller initialization. */
/* */
-/* Must be called from a locked routine. */
-/* */
/* Returns: */
/* Nothing. */
/****************************************************************************/
@@ -4362,19 +4376,19 @@ bce_init_locked(struct bce_softc *sc)
bce_stop(sc);
if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) {
- BCE_PRINTF(sc, "%s(%d): Controller reset failed!\n",
+ BCE_PRINTF("%s(%d): Controller reset failed!\n",
__FILE__, __LINE__);
goto bce_init_locked_exit;
}
if (bce_chipinit(sc)) {
- BCE_PRINTF(sc, "%s(%d): Controller initialization failed!\n",
+ BCE_PRINTF("%s(%d): Controller initialization failed!\n",
__FILE__, __LINE__);
goto bce_init_locked_exit;
}
if (bce_blockinit(sc)) {
- BCE_PRINTF(sc, "%s(%d): Block initialization failed!\n",
+ BCE_PRINTF("%s(%d): Block initialization failed!\n",
__FILE__, __LINE__);
goto bce_init_locked_exit;
}
@@ -4447,6 +4461,14 @@ bce_init_locked_exit:
return;
}
+
+/****************************************************************************/
+/* Initialize the controller just enough so that any management firmware */
+/* running on the device will continue to operate corectly. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_mgmt_init_locked(struct bce_softc *sc)
{
@@ -4466,6 +4488,7 @@ bce_mgmt_init_locked(struct bce_softc *sc)
/* Initialize the on-boards CPUs */
bce_init_cpus(sc);
+ /* Set the page size and clear the RV2P processor stall bits. */
val = (BCM_PAGE_BITS - 8) << 24;
REG_WR(sc, BCE_RV2P_CONFIG, val);
@@ -4570,7 +4593,7 @@ bce_tx_encap(struct bce_softc *sc, struct mbuf **m_head)
if (error == ENOMEM) {
return (error);
} else if (error != 0) {
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"%s(%d): Error mapping mbuf into TX chain!\n",
__FILE__, __LINE__);
m_freem(m0);
@@ -4876,7 +4899,7 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
/* Setup the poll routine to call. */
error = ether_poll_register(bce_poll, ifp);
if (error) {
- BCE_PRINTF(sc, "%s(%d): Error registering poll function!\n",
+ BCE_PRINTF("%s(%d): Error registering poll function!\n",
__FILE__, __LINE__);
goto bce_ioctl_exit;
}
@@ -4933,18 +4956,18 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
/* Toggle VLAN_MTU capabilities enable flag. */
if (mask & IFCAP_VLAN_MTU) {
- BCE_PRINTF(sc, "%s(%d): Changing VLAN_MTU not supported.\n",
+ BCE_PRINTF("%s(%d): Changing VLAN_MTU not supported.\n",
__FILE__, __LINE__);
}
/* Toggle VLANHWTAG capabilities enabled flag. */
if (mask & IFCAP_VLAN_HWTAGGING) {
if (sc->bce_flags & BCE_MFW_ENABLE_FLAG)
- BCE_PRINTF(sc, "%s(%d): Cannot change VLAN_HWTAGGING while "
+ BCE_PRINTF("%s(%d): Cannot change VLAN_HWTAGGING while "
"management firmware (ASF/IPMI/UMP) is running!\n",
__FILE__, __LINE__);
else
- BCE_PRINTF(sc, "%s(%d): Changing VLAN_HWTAGGING not supported!\n",
+ BCE_PRINTF("%s(%d): Changing VLAN_HWTAGGING not supported!\n",
__FILE__, __LINE__);
}
@@ -4978,7 +5001,7 @@ static void
bce_watchdog(struct bce_softc *sc)
{
- DBRUN(BCE_WARN_SEND,
+ DBRUN(BCE_VERBOSE_SEND,
bce_dump_driver_state(sc);
bce_dump_status_block(sc));
@@ -4994,7 +5017,7 @@ bce_watchdog(struct bce_softc *sc)
if (REG_RD(sc, BCE_EMAC_TX_STATUS) & BCE_EMAC_TX_STATUS_XOFFED)
return;
- BCE_PRINTF(sc, "%s(%d): Watchdog timeout occurred, resetting!\n",
+ BCE_PRINTF("%s(%d): Watchdog timeout occurred, resetting!\n",
__FILE__, __LINE__);
/* DBRUN(BCE_FATAL, bce_breakpoint(sc)); */
@@ -5090,6 +5113,7 @@ bce_intr(void *xsc)
sc = xsc;
ifp = sc->bce_ifp;
+ DBPRINT(sc, BCE_EXCESSIVE, "Entering %s()\n", __FUNCTION__);
BCE_LOCK(sc);
DBRUNIF(1, sc->interrupts_generated++);
@@ -5125,7 +5149,7 @@ bce_intr(void *xsc)
status_attn_bits = sc->status_block->status_attn_bits;
DBRUNIF(DB_RANDOMTRUE(bce_debug_unexpected_attention),
- BCE_PRINTF(sc, "Simulating unexpected status attention bit set.");
+ BCE_PRINTF("Simulating unexpected status attention bit set.");
status_attn_bits = status_attn_bits | STATUS_ATTN_BITS_PARITY_ERROR);
/* Was it a link change interrupt? */
@@ -5140,7 +5164,7 @@ bce_intr(void *xsc)
DBRUN(1, sc->unexpected_attentions++);
- BCE_PRINTF(sc, "%s(%d): Fatal attention detected: 0x%08X\n",
+ BCE_PRINTF("%s(%d): Fatal attention detected: 0x%08X\n",
__FILE__, __LINE__, sc->status_block->status_attn_bits);
DBRUN(BCE_FATAL,
@@ -5498,15 +5522,23 @@ bce_stats_update(struct bce_softc *sc)
sc->stat_CatchupInRuleCheckerP4Hit =
stats->stat_CatchupInRuleCheckerP4Hit;
+ sc->com_no_buffers = REG_RD_IND(sc, 0x120084);
+
DBPRINT(sc, BCE_EXCESSIVE, "Exiting %s()\n", __FUNCTION__);
}
+/****************************************************************************/
+/* Periodic function to perform maintenance tasks. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_tick(void *xsc)
{
struct bce_softc *sc = xsc;
- struct mii_data *mii = NULL;
+ struct mii_data *mii;
struct ifnet *ifp;
u32 msg;
@@ -5525,12 +5557,12 @@ bce_tick(void *xsc)
/* Update the statistics from the hardware statistics block. */
bce_stats_update(sc);
- /* Check that chip hasn't hang. */
+ /* Check that chip hasn't hung. */
bce_watchdog(sc);
/* Schedule the next tick. */
callout_reset(
- &sc->bce_stat_ch, /* callout */
+ &sc->bce_stat_ch, /* callout */
hz, /* ticks */
bce_tick, /* function */
sc); /* function argument */
@@ -5549,7 +5581,7 @@ bce_tick(void *xsc)
if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T ||
IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX) &&
bootverbose)
- BCE_PRINTF(sc, "Gigabit link up\n");
+ BCE_PRINTF("Gigabit link up\n");
/* Now that link is up, handle any outstanding TX traffic. */
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
bce_start_locked(ifp);
@@ -5618,7 +5650,7 @@ bce_sysctl_hw_state(SYSCTL_HANDLER_ARGS)
/****************************************************************************/
-/* */
+/* Provides a sysctl interface to allows dumping the RX chain. */
/* */
/* Returns: */
/* 0 for success, positive value for failure. */
@@ -5646,7 +5678,69 @@ bce_sysctl_dump_rx_chain(SYSCTL_HANDLER_ARGS)
/****************************************************************************/
+/* Provides a sysctl interface to allows dumping the TX chain. */
+/* */
+/* Returns: */
+/* 0 for success, positive value for failure. */
+/****************************************************************************/
+static int
+bce_sysctl_dump_tx_chain(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+ int result;
+ struct bce_softc *sc;
+
+ result = -1;
+ error = sysctl_handle_int(oidp, &result, 0, req);
+
+ if (error || !req->newptr)
+ return (error);
+
+ if (result == 1) {
+ sc = (struct bce_softc *)arg1;
+ bce_dump_tx_chain(sc, 0, USABLE_TX_BD);
+ }
+
+ return error;
+}
+
+
+/****************************************************************************/
+/* Provides a sysctl interface to allow reading arbitrary registers in the */
+/* device. DO NOT ENABLE ON PRODUCTION SYSTEMS! */
/* */
+/* Returns: */
+/* 0 for success, positive value for failure. */
+/****************************************************************************/
+static int
+bce_sysctl_reg_read(SYSCTL_HANDLER_ARGS)
+{
+ struct bce_softc *sc;
+ int error;
+ uint32_t val, result;
+
+ result = -1;
+ error = sysctl_handle_int(oidp, &result, 0, req);
+ if (error || (req->newptr == NULL))
+ return (error);
+
+ /* Make sure the register is accessible. */
+ if (result < 0x8000) {
+ sc = (struct bce_softc *)arg1;
+ val = REG_RD(sc, result);
+ BCE_PRINTF("reg 0x%08X = 0x%08X\n", result, val);
+ } else if (result < 0x0280000) {
+ sc = (struct bce_softc *)arg1;
+ val = REG_RD_IND(sc, result);
+ BCE_PRINTF("reg 0x%08X = 0x%08X\n", result, val);
+ }
+
+ return (error);
+}
+
+/****************************************************************************/
+/* Provides a sysctl interface to forcing the driver to dump state and */
+/* enter the debugger. DO NOT ENABLE ON PRODUCTION SYSTEMS! */
/* */
/* Returns: */
/* 0 for success, positive value for failure. */
@@ -5689,11 +5783,6 @@ bce_add_sysctls(struct bce_softc *sc)
ctx = device_get_sysctl_ctx(sc->bce_dev);
children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->bce_dev));
- SYSCTL_ADD_STRING(ctx, children, OID_AUTO,
- "driver_version",
- CTLFLAG_RD, &bce_driver_version,
- 0, "bce driver version");
-
#ifdef BCE_DEBUG
SYSCTL_ADD_INT(ctx, children, OID_AUTO,
"rx_low_watermark",
@@ -5996,6 +6085,11 @@ bce_add_sysctls(struct bce_softc *sc)
CTLFLAG_RD, &sc->stat_CatchupInRuleCheckerP4Hit,
0, "Received packets rule checker hits in Catchup path");
+ SYSCTL_ADD_UINT(ctx, children, OID_AUTO,
+ "com_no_buffers",
+ CTLFLAG_RD, &sc->com_no_buffers,
+ 0, "Valid packets received but no RX buffers available");
+
#ifdef BCE_DEBUG
SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
"driver_state", CTLTYPE_INT | CTLFLAG_RW,
@@ -6013,9 +6107,20 @@ bce_add_sysctls(struct bce_softc *sc)
bce_sysctl_dump_rx_chain, "I", "Dump rx_bd chain");
SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
+ "dump_tx_chain", CTLTYPE_INT | CTLFLAG_RW,
+ (void *)sc, 0,
+ bce_sysctl_dump_tx_chain, "I", "Dump tx_bd chain");
+
+ SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
"breakpoint", CTLTYPE_INT | CTLFLAG_RW,
(void *)sc, 0,
bce_sysctl_breakpoint, "I", "Driver breakpoint");
+
+ SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
+ "reg_read", CTLTYPE_INT | CTLFLAG_RW,
+ (void *)sc, 0,
+ bce_sysctl_reg_read, "I", "Register Read");
+
#endif
}
@@ -6047,7 +6152,7 @@ bce_dump_mbuf(struct bce_softc *sc, struct mbuf *m)
while (mp) {
val_hi = BCE_ADDR_HI(mp);
val_lo = BCE_ADDR_LO(mp);
- BCE_PRINTF(sc, "mbuf: vaddr = 0x%08X:%08X, m_len = %d, m_flags = ",
+ BCE_PRINTF("mbuf: vaddr = 0x%08X:%08X, m_len = %d, m_flags = ",
val_hi, val_lo, mp->m_len);
if (mp->m_flags & M_EXT)
@@ -6059,14 +6164,12 @@ bce_dump_mbuf(struct bce_softc *sc, struct mbuf *m)
if (mp->m_flags & M_EXT) {
val_hi = BCE_ADDR_HI(mp->m_ext.ext_buf);
val_lo = BCE_ADDR_LO(mp->m_ext.ext_buf);
- BCE_PRINTF(sc, "- m_ext: vaddr = 0x%08X:%08X, ext_size = 0x%04X\n",
+ BCE_PRINTF("- m_ext: vaddr = 0x%08X:%08X, ext_size = 0x%04X\n",
val_hi, val_lo, mp->m_ext.ext_size);
}
mp = mp->m_next;
}
-
-
}
@@ -6081,96 +6184,158 @@ bce_dump_tx_mbuf_chain(struct bce_softc *sc, int chain_prod, int count)
{
struct mbuf *m;
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" tx mbuf data "
"----------------------------\n");
for (int i = 0; i < count; i++) {
m = sc->tx_mbuf_ptr[chain_prod];
- BCE_PRINTF(sc, "txmbuf[%d]\n", chain_prod);
+ BCE_PRINTF("txmbuf[%d]\n", chain_prod);
bce_dump_mbuf(sc, m);
chain_prod = TX_CHAIN_IDX(NEXT_TX_BD(chain_prod));
}
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
"----------------"
"----------------------------\n");
}
-/*
- * This routine prints the RX mbuf chain.
- */
+/****************************************************************************/
+/* Prints out the mbufs in the RX mbuf chain. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_rx_mbuf_chain(struct bce_softc *sc, int chain_prod, int count)
{
struct mbuf *m;
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" rx mbuf data "
"----------------------------\n");
for (int i = 0; i < count; i++) {
m = sc->rx_mbuf_ptr[chain_prod];
- BCE_PRINTF(sc, "rxmbuf[0x%04X]\n", chain_prod);
+ BCE_PRINTF("rxmbuf[0x%04X]\n", chain_prod);
bce_dump_mbuf(sc, m);
chain_prod = RX_CHAIN_IDX(NEXT_RX_BD(chain_prod));
}
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
"----------------"
"----------------------------\n");
}
+/****************************************************************************/
+/* Prints out a tx_bd structure. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_txbd(struct bce_softc *sc, int idx, struct tx_bd *txbd)
{
if (idx > MAX_TX_BD)
/* Index out of range. */
- BCE_PRINTF(sc, "tx_bd[0x%04X]: Invalid tx_bd index!\n", idx);
+ BCE_PRINTF("tx_bd[0x%04X]: Invalid tx_bd index!\n", idx);
else if ((idx & USABLE_TX_BD_PER_PAGE) == USABLE_TX_BD_PER_PAGE)
/* TX Chain page pointer. */
- BCE_PRINTF(sc, "tx_bd[0x%04X]: haddr = 0x%08X:%08X, chain page pointer\n",
+ BCE_PRINTF("tx_bd[0x%04X]: haddr = 0x%08X:%08X, chain page pointer\n",
idx, txbd->tx_bd_haddr_hi, txbd->tx_bd_haddr_lo);
- else
- /* Normal tx_bd entry. */
- BCE_PRINTF(sc, "tx_bd[0x%04X]: haddr = 0x%08X:%08X, nbytes = 0x%08X, "
- "vlan tag= 0x%4X, flags = 0x%04X\n", idx,
- txbd->tx_bd_haddr_hi, txbd->tx_bd_haddr_lo,
- txbd->tx_bd_mss_nbytes, txbd->tx_bd_vlan_tag,
- txbd->tx_bd_flags);
+ else {
+ /* Normal tx_bd entry. */
+ BCE_PRINTF("tx_bd[0x%04X]: haddr = 0x%08X:%08X, nbytes = 0x%08X, "
+ "vlan tag= 0x%04X, flags = 0x%04X (", idx,
+ txbd->tx_bd_haddr_hi, txbd->tx_bd_haddr_lo,
+ txbd->tx_bd_mss_nbytes, txbd->tx_bd_vlan_tag,
+ txbd->tx_bd_flags);
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_CONN_FAULT)
+ printf(" CONN_FAULT");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_TCP_UDP_CKSUM)
+ printf(" TCP_UDP_CKSUM");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_IP_CKSUM)
+ printf(" IP_CKSUM");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_VLAN_TAG)
+ printf(" VLAN");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_COAL_NOW)
+ printf(" COAL_NOW");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_DONT_GEN_CRC)
+ printf(" DONT_GEN_CRC");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_START)
+ printf(" START");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_END)
+ printf(" END");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_SW_OPTION_WORD)
+ printf(" OPTION_WORD");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_SW_FLAGS)
+ printf(" FLAGS");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_SW_SNAP)
+ printf(" SNAP");
+
+ if (txbd->tx_bd_flags & TX_BD_FLAGS_SW_LSO)
+ printf(" LSO");
+
+ printf(" )\n");
+ }
+
}
+/****************************************************************************/
+/* Prints out a rx_bd structure. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_rxbd(struct bce_softc *sc, int idx, struct rx_bd *rxbd)
{
if (idx > MAX_RX_BD)
/* Index out of range. */
- BCE_PRINTF(sc, "rx_bd[0x%04X]: Invalid rx_bd index!\n", idx);
+ BCE_PRINTF("rx_bd[0x%04X]: Invalid rx_bd index!\n", idx);
else if ((idx & USABLE_RX_BD_PER_PAGE) == USABLE_RX_BD_PER_PAGE)
/* TX Chain page pointer. */
- BCE_PRINTF(sc, "rx_bd[0x%04X]: haddr = 0x%08X:%08X, chain page pointer\n",
+ BCE_PRINTF("rx_bd[0x%04X]: haddr = 0x%08X:%08X, chain page pointer\n",
idx, rxbd->rx_bd_haddr_hi, rxbd->rx_bd_haddr_lo);
else
/* Normal tx_bd entry. */
- BCE_PRINTF(sc, "rx_bd[0x%04X]: haddr = 0x%08X:%08X, nbytes = 0x%08X, "
+ BCE_PRINTF("rx_bd[0x%04X]: haddr = 0x%08X:%08X, nbytes = 0x%08X, "
"flags = 0x%08X\n", idx,
rxbd->rx_bd_haddr_hi, rxbd->rx_bd_haddr_lo,
rxbd->rx_bd_len, rxbd->rx_bd_flags);
}
+/****************************************************************************/
+/* Prints out a l2_fhdr structure. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_l2fhdr(struct bce_softc *sc, int idx, struct l2_fhdr *l2fhdr)
{
- BCE_PRINTF(sc, "l2_fhdr[0x%04X]: status = 0x%08X, "
+
+ BCE_PRINTF("l2_fhdr[0x%04X]: status = 0x%08X, "
"pkt_len = 0x%04X, vlan = 0x%04x, ip_xsum = 0x%04X, "
"tcp_udp_xsum = 0x%04X\n", idx,
l2fhdr->l2_fhdr_status, l2fhdr->l2_fhdr_pkt_len,
@@ -6179,32 +6344,35 @@ bce_dump_l2fhdr(struct bce_softc *sc, int idx, struct l2_fhdr *l2fhdr)
}
-/*
- * This routine prints the TX chain.
- */
+/****************************************************************************/
+/* Prints out the tx chain. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_tx_chain(struct bce_softc *sc, int tx_prod, int count)
{
struct tx_bd *txbd;
/* First some info about the tx_bd chain structure. */
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" tx_bd chain "
"----------------------------\n");
- BCE_PRINTF(sc, "page size = 0x%08X, tx chain pages = 0x%08X\n",
+ BCE_PRINTF("page size = 0x%08X, tx chain pages = 0x%08X\n",
(u32) BCM_PAGE_SIZE, (u32) TX_PAGES);
- BCE_PRINTF(sc, "tx_bd per page = 0x%08X, usable tx_bd per page = 0x%08X\n",
+ BCE_PRINTF("tx_bd per page = 0x%08X, usable tx_bd per page = 0x%08X\n",
(u32) TOTAL_TX_BD_PER_PAGE, (u32) USABLE_TX_BD_PER_PAGE);
- BCE_PRINTF(sc, "total tx_bd = 0x%08X\n", (u32) TOTAL_TX_BD);
+ BCE_PRINTF("total tx_bd = 0x%08X\n", (u32) TOTAL_TX_BD);
- BCE_PRINTF(sc, ""
- "-----------------------------"
- " tx_bd data "
- "-----------------------------\n");
+ BCE_PRINTF(""
+ "----------------------------"
+ " tx_bd data "
+ "----------------------------\n");
/* Now print out the tx_bd's themselves. */
for (int i = 0; i < count; i++) {
@@ -6213,38 +6381,39 @@ bce_dump_tx_chain(struct bce_softc *sc, int tx_prod, int count)
tx_prod = TX_CHAIN_IDX(NEXT_TX_BD(tx_prod));
}
- BCE_PRINTF(sc,
- "-----------------------------"
- "--------------"
- "-----------------------------\n");
+ BCE_PRINTF(
+ "----------------------------"
+ "----------------"
+ "----------------------------\n");
}
-/*
- * This routine prints the RX chain.
- */
+/****************************************************************************/
+/* Prints out the rx chain. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_rx_chain(struct bce_softc *sc, int rx_prod, int count)
{
struct rx_bd *rxbd;
/* First some info about the tx_bd chain structure. */
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" rx_bd chain "
"----------------------------\n");
- BCE_PRINTF(sc, "----- RX_BD Chain -----\n");
-
- BCE_PRINTF(sc, "page size = 0x%08X, rx chain pages = 0x%08X\n",
+ BCE_PRINTF("page size = 0x%08X, rx chain pages = 0x%08X\n",
(u32) BCM_PAGE_SIZE, (u32) RX_PAGES);
- BCE_PRINTF(sc, "rx_bd per page = 0x%08X, usable rx_bd per page = 0x%08X\n",
+ BCE_PRINTF("rx_bd per page = 0x%08X, usable rx_bd per page = 0x%08X\n",
(u32) TOTAL_RX_BD_PER_PAGE, (u32) USABLE_RX_BD_PER_PAGE);
- BCE_PRINTF(sc, "total rx_bd = 0x%08X\n", (u32) TOTAL_RX_BD);
+ BCE_PRINTF("total rx_bd = 0x%08X\n", (u32) TOTAL_RX_BD);
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" rx_bd data "
"----------------------------\n");
@@ -6256,16 +6425,19 @@ bce_dump_rx_chain(struct bce_softc *sc, int rx_prod, int count)
rx_prod = RX_CHAIN_IDX(NEXT_RX_BD(rx_prod));
}
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
- "--------------"
+ "----------------"
"----------------------------\n");
}
-/*
- * This routine prints the status block.
- */
+/****************************************************************************/
+/* Prints out the status block from host memory. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_status_block(struct bce_softc *sc)
{
@@ -6273,482 +6445,508 @@ bce_dump_status_block(struct bce_softc *sc)
sblk = sc->status_block;
- BCE_PRINTF(sc, "----------------------------- Status Block "
- "-----------------------------\n");
-
- BCE_PRINTF(sc, "attn_bits = 0x%08X, attn_bits_ack = 0x%08X, index = 0x%04X\n",
+ BCE_PRINTF(
+ "----------------------------"
+ " Status Block "
+ "----------------------------\n");
+
+ BCE_PRINTF("attn_bits = 0x%08X, attn_bits_ack = 0x%08X, index = 0x%04X\n",
sblk->status_attn_bits, sblk->status_attn_bits_ack,
sblk->status_idx);
- BCE_PRINTF(sc, "rx_cons0 = 0x%08X, tx_cons0 = 0x%08X\n",
+ BCE_PRINTF("rx_cons0 = 0x%08X, tx_cons0 = 0x%08X\n",
sblk->status_rx_quick_consumer_index0,
sblk->status_tx_quick_consumer_index0);
- BCE_PRINTF(sc, "status_idx = 0x%04X\n", sblk->status_idx);
+ BCE_PRINTF("status_idx = 0x%04X\n", sblk->status_idx);
/* Theses indices are not used for normal L2 drivers. */
if (sblk->status_rx_quick_consumer_index1 ||
sblk->status_tx_quick_consumer_index1)
- BCE_PRINTF(sc, "rx_cons1 = 0x%08X, tx_cons1 = 0x%08X\n",
+ BCE_PRINTF("rx_cons1 = 0x%08X, tx_cons1 = 0x%08X\n",
sblk->status_rx_quick_consumer_index1,
sblk->status_tx_quick_consumer_index1);
if (sblk->status_rx_quick_consumer_index2 ||
sblk->status_tx_quick_consumer_index2)
- BCE_PRINTF(sc, "rx_cons2 = 0x%08X, tx_cons2 = 0x%08X\n",
+ BCE_PRINTF("rx_cons2 = 0x%08X, tx_cons2 = 0x%08X\n",
sblk->status_rx_quick_consumer_index2,
sblk->status_tx_quick_consumer_index2);
if (sblk->status_rx_quick_consumer_index3 ||
sblk->status_tx_quick_consumer_index3)
- BCE_PRINTF(sc, "rx_cons3 = 0x%08X, tx_cons3 = 0x%08X\n",
+ BCE_PRINTF("rx_cons3 = 0x%08X, tx_cons3 = 0x%08X\n",
sblk->status_rx_quick_consumer_index3,
sblk->status_tx_quick_consumer_index3);
if (sblk->status_rx_quick_consumer_index4 ||
sblk->status_rx_quick_consumer_index5)
- BCE_PRINTF(sc, "rx_cons4 = 0x%08X, rx_cons5 = 0x%08X\n",
+ BCE_PRINTF("rx_cons4 = 0x%08X, rx_cons5 = 0x%08X\n",
sblk->status_rx_quick_consumer_index4,
sblk->status_rx_quick_consumer_index5);
if (sblk->status_rx_quick_consumer_index6 ||
sblk->status_rx_quick_consumer_index7)
- BCE_PRINTF(sc, "rx_cons6 = 0x%08X, rx_cons7 = 0x%08X\n",
+ BCE_PRINTF("rx_cons6 = 0x%08X, rx_cons7 = 0x%08X\n",
sblk->status_rx_quick_consumer_index6,
sblk->status_rx_quick_consumer_index7);
if (sblk->status_rx_quick_consumer_index8 ||
sblk->status_rx_quick_consumer_index9)
- BCE_PRINTF(sc, "rx_cons8 = 0x%08X, rx_cons9 = 0x%08X\n",
+ BCE_PRINTF("rx_cons8 = 0x%08X, rx_cons9 = 0x%08X\n",
sblk->status_rx_quick_consumer_index8,
sblk->status_rx_quick_consumer_index9);
if (sblk->status_rx_quick_consumer_index10 ||
sblk->status_rx_quick_consumer_index11)
- BCE_PRINTF(sc, "rx_cons10 = 0x%08X, rx_cons11 = 0x%08X\n",
+ BCE_PRINTF("rx_cons10 = 0x%08X, rx_cons11 = 0x%08X\n",
sblk->status_rx_quick_consumer_index10,
sblk->status_rx_quick_consumer_index11);
if (sblk->status_rx_quick_consumer_index12 ||
sblk->status_rx_quick_consumer_index13)
- BCE_PRINTF(sc, "rx_cons12 = 0x%08X, rx_cons13 = 0x%08X\n",
+ BCE_PRINTF("rx_cons12 = 0x%08X, rx_cons13 = 0x%08X\n",
sblk->status_rx_quick_consumer_index12,
sblk->status_rx_quick_consumer_index13);
if (sblk->status_rx_quick_consumer_index14 ||
sblk->status_rx_quick_consumer_index15)
- BCE_PRINTF(sc, "rx_cons14 = 0x%08X, rx_cons15 = 0x%08X\n",
+ BCE_PRINTF("rx_cons14 = 0x%08X, rx_cons15 = 0x%08X\n",
sblk->status_rx_quick_consumer_index14,
sblk->status_rx_quick_consumer_index15);
if (sblk->status_completion_producer_index ||
sblk->status_cmd_consumer_index)
- BCE_PRINTF(sc, "com_prod = 0x%08X, cmd_cons = 0x%08X\n",
+ BCE_PRINTF("com_prod = 0x%08X, cmd_cons = 0x%08X\n",
sblk->status_completion_producer_index,
sblk->status_cmd_consumer_index);
-
- BCE_PRINTF(sc, "-------------------------------------------"
- "-----------------------------\n");
+
+ BCE_PRINTF(
+ "----------------------------"
+ "----------------"
+ "----------------------------\n");
}
-/*
- * This routine prints the statistics block.
- */
+/****************************************************************************/
+/* Prints out the statistics block. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_stats_block(struct bce_softc *sc)
{
struct statistics_block *sblk;
sblk = sc->stats_block;
+
+ BCE_PRINTF(
+ "----------------------------"
+ " Stats Block "
+ "----------------------------\n");
- BCE_PRINTF(sc, ""
- "-----------------------------"
- " Stats Block "
- "-----------------------------\n");
-
- BCE_PRINTF(sc, "IfHcInOctets = 0x%08X:%08X, "
+ BCE_PRINTF("IfHcInOctets = 0x%08X:%08X, "
"IfHcInBadOctets = 0x%08X:%08X\n",
sblk->stat_IfHCInOctets_hi, sblk->stat_IfHCInOctets_lo,
sblk->stat_IfHCInBadOctets_hi, sblk->stat_IfHCInBadOctets_lo);
- BCE_PRINTF(sc, "IfHcOutOctets = 0x%08X:%08X, "
+ BCE_PRINTF("IfHcOutOctets = 0x%08X:%08X, "
"IfHcOutBadOctets = 0x%08X:%08X\n",
sblk->stat_IfHCOutOctets_hi, sblk->stat_IfHCOutOctets_lo,
sblk->stat_IfHCOutBadOctets_hi, sblk->stat_IfHCOutBadOctets_lo);
- BCE_PRINTF(sc, "IfHcInUcastPkts = 0x%08X:%08X, "
+ BCE_PRINTF("IfHcInUcastPkts = 0x%08X:%08X, "
"IfHcInMulticastPkts = 0x%08X:%08X\n",
sblk->stat_IfHCInUcastPkts_hi, sblk->stat_IfHCInUcastPkts_lo,
sblk->stat_IfHCInMulticastPkts_hi, sblk->stat_IfHCInMulticastPkts_lo);
- BCE_PRINTF(sc, "IfHcInBroadcastPkts = 0x%08X:%08X, "
+ BCE_PRINTF("IfHcInBroadcastPkts = 0x%08X:%08X, "
"IfHcOutUcastPkts = 0x%08X:%08X\n",
sblk->stat_IfHCInBroadcastPkts_hi, sblk->stat_IfHCInBroadcastPkts_lo,
sblk->stat_IfHCOutUcastPkts_hi, sblk->stat_IfHCOutUcastPkts_lo);
- BCE_PRINTF(sc, "IfHcOutMulticastPkts = 0x%08X:%08X, IfHcOutBroadcastPkts = 0x%08X:%08X\n",
+ BCE_PRINTF("IfHcOutMulticastPkts = 0x%08X:%08X, IfHcOutBroadcastPkts = 0x%08X:%08X\n",
sblk->stat_IfHCOutMulticastPkts_hi, sblk->stat_IfHCOutMulticastPkts_lo,
sblk->stat_IfHCOutBroadcastPkts_hi, sblk->stat_IfHCOutBroadcastPkts_lo);
if (sblk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors)
- BCE_PRINTF(sc, "0x%08X : "
+ BCE_PRINTF("0x%08X : "
"emac_tx_stat_dot3statsinternalmactransmiterrors\n",
sblk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors);
if (sblk->stat_Dot3StatsCarrierSenseErrors)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsCarrierSenseErrors\n",
+ BCE_PRINTF("0x%08X : Dot3StatsCarrierSenseErrors\n",
sblk->stat_Dot3StatsCarrierSenseErrors);
if (sblk->stat_Dot3StatsFCSErrors)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsFCSErrors\n",
+ BCE_PRINTF("0x%08X : Dot3StatsFCSErrors\n",
sblk->stat_Dot3StatsFCSErrors);
if (sblk->stat_Dot3StatsAlignmentErrors)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsAlignmentErrors\n",
+ BCE_PRINTF("0x%08X : Dot3StatsAlignmentErrors\n",
sblk->stat_Dot3StatsAlignmentErrors);
if (sblk->stat_Dot3StatsSingleCollisionFrames)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsSingleCollisionFrames\n",
+ BCE_PRINTF("0x%08X : Dot3StatsSingleCollisionFrames\n",
sblk->stat_Dot3StatsSingleCollisionFrames);
if (sblk->stat_Dot3StatsMultipleCollisionFrames)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsMultipleCollisionFrames\n",
+ BCE_PRINTF("0x%08X : Dot3StatsMultipleCollisionFrames\n",
sblk->stat_Dot3StatsMultipleCollisionFrames);
if (sblk->stat_Dot3StatsDeferredTransmissions)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsDeferredTransmissions\n",
+ BCE_PRINTF("0x%08X : Dot3StatsDeferredTransmissions\n",
sblk->stat_Dot3StatsDeferredTransmissions);
if (sblk->stat_Dot3StatsExcessiveCollisions)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsExcessiveCollisions\n",
+ BCE_PRINTF("0x%08X : Dot3StatsExcessiveCollisions\n",
sblk->stat_Dot3StatsExcessiveCollisions);
if (sblk->stat_Dot3StatsLateCollisions)
- BCE_PRINTF(sc, "0x%08X : Dot3StatsLateCollisions\n",
+ BCE_PRINTF("0x%08X : Dot3StatsLateCollisions\n",
sblk->stat_Dot3StatsLateCollisions);
if (sblk->stat_EtherStatsCollisions)
- BCE_PRINTF(sc, "0x%08X : EtherStatsCollisions\n",
+ BCE_PRINTF("0x%08X : EtherStatsCollisions\n",
sblk->stat_EtherStatsCollisions);
if (sblk->stat_EtherStatsFragments)
- BCE_PRINTF(sc, "0x%08X : EtherStatsFragments\n",
+ BCE_PRINTF("0x%08X : EtherStatsFragments\n",
sblk->stat_EtherStatsFragments);
if (sblk->stat_EtherStatsJabbers)
- BCE_PRINTF(sc, "0x%08X : EtherStatsJabbers\n",
+ BCE_PRINTF("0x%08X : EtherStatsJabbers\n",
sblk->stat_EtherStatsJabbers);
if (sblk->stat_EtherStatsUndersizePkts)
- BCE_PRINTF(sc, "0x%08X : EtherStatsUndersizePkts\n",
+ BCE_PRINTF("0x%08X : EtherStatsUndersizePkts\n",
sblk->stat_EtherStatsUndersizePkts);
if (sblk->stat_EtherStatsOverrsizePkts)
- BCE_PRINTF(sc, "0x%08X : EtherStatsOverrsizePkts\n",
+ BCE_PRINTF("0x%08X : EtherStatsOverrsizePkts\n",
sblk->stat_EtherStatsOverrsizePkts);
if (sblk->stat_EtherStatsPktsRx64Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx64Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx64Octets\n",
sblk->stat_EtherStatsPktsRx64Octets);
if (sblk->stat_EtherStatsPktsRx65Octetsto127Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx65Octetsto127Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx65Octetsto127Octets\n",
sblk->stat_EtherStatsPktsRx65Octetsto127Octets);
if (sblk->stat_EtherStatsPktsRx128Octetsto255Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx128Octetsto255Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx128Octetsto255Octets\n",
sblk->stat_EtherStatsPktsRx128Octetsto255Octets);
if (sblk->stat_EtherStatsPktsRx256Octetsto511Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx256Octetsto511Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx256Octetsto511Octets\n",
sblk->stat_EtherStatsPktsRx256Octetsto511Octets);
if (sblk->stat_EtherStatsPktsRx512Octetsto1023Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx512Octetsto1023Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx512Octetsto1023Octets\n",
sblk->stat_EtherStatsPktsRx512Octetsto1023Octets);
if (sblk->stat_EtherStatsPktsRx1024Octetsto1522Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx1024Octetsto1522Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx1024Octetsto1522Octets\n",
sblk->stat_EtherStatsPktsRx1024Octetsto1522Octets);
if (sblk->stat_EtherStatsPktsRx1523Octetsto9022Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsRx1523Octetsto9022Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsRx1523Octetsto9022Octets\n",
sblk->stat_EtherStatsPktsRx1523Octetsto9022Octets);
if (sblk->stat_EtherStatsPktsTx64Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx64Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx64Octets\n",
sblk->stat_EtherStatsPktsTx64Octets);
if (sblk->stat_EtherStatsPktsTx65Octetsto127Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx65Octetsto127Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx65Octetsto127Octets\n",
sblk->stat_EtherStatsPktsTx65Octetsto127Octets);
if (sblk->stat_EtherStatsPktsTx128Octetsto255Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx128Octetsto255Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx128Octetsto255Octets\n",
sblk->stat_EtherStatsPktsTx128Octetsto255Octets);
if (sblk->stat_EtherStatsPktsTx256Octetsto511Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx256Octetsto511Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx256Octetsto511Octets\n",
sblk->stat_EtherStatsPktsTx256Octetsto511Octets);
if (sblk->stat_EtherStatsPktsTx512Octetsto1023Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx512Octetsto1023Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx512Octetsto1023Octets\n",
sblk->stat_EtherStatsPktsTx512Octetsto1023Octets);
if (sblk->stat_EtherStatsPktsTx1024Octetsto1522Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx1024Octetsto1522Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx1024Octetsto1522Octets\n",
sblk->stat_EtherStatsPktsTx1024Octetsto1522Octets);
if (sblk->stat_EtherStatsPktsTx1523Octetsto9022Octets)
- BCE_PRINTF(sc, "0x%08X : EtherStatsPktsTx1523Octetsto9022Octets\n",
+ BCE_PRINTF("0x%08X : EtherStatsPktsTx1523Octetsto9022Octets\n",
sblk->stat_EtherStatsPktsTx1523Octetsto9022Octets);
if (sblk->stat_XonPauseFramesReceived)
- BCE_PRINTF(sc, "0x%08X : XonPauseFramesReceived\n",
+ BCE_PRINTF("0x%08X : XonPauseFramesReceived\n",
sblk->stat_XonPauseFramesReceived);
if (sblk->stat_XoffPauseFramesReceived)
- BCE_PRINTF(sc, "0x%08X : XoffPauseFramesReceived\n",
+ BCE_PRINTF("0x%08X : XoffPauseFramesReceived\n",
sblk->stat_XoffPauseFramesReceived);
if (sblk->stat_OutXonSent)
- BCE_PRINTF(sc, "0x%08X : OutXonSent\n",
+ BCE_PRINTF("0x%08X : OutXonSent\n",
sblk->stat_OutXonSent);
if (sblk->stat_OutXoffSent)
- BCE_PRINTF(sc, "0x%08X : OutXoffSent\n",
+ BCE_PRINTF("0x%08X : OutXoffSent\n",
sblk->stat_OutXoffSent);
if (sblk->stat_FlowControlDone)
- BCE_PRINTF(sc, "0x%08X : FlowControlDone\n",
+ BCE_PRINTF("0x%08X : FlowControlDone\n",
sblk->stat_FlowControlDone);
if (sblk->stat_MacControlFramesReceived)
- BCE_PRINTF(sc, "0x%08X : MacControlFramesReceived\n",
+ BCE_PRINTF("0x%08X : MacControlFramesReceived\n",
sblk->stat_MacControlFramesReceived);
if (sblk->stat_XoffStateEntered)
- BCE_PRINTF(sc, "0x%08X : XoffStateEntered\n",
+ BCE_PRINTF("0x%08X : XoffStateEntered\n",
sblk->stat_XoffStateEntered);
if (sblk->stat_IfInFramesL2FilterDiscards)
- BCE_PRINTF(sc, "0x%08X : IfInFramesL2FilterDiscards\n",
+ BCE_PRINTF("0x%08X : IfInFramesL2FilterDiscards\n",
sblk->stat_IfInFramesL2FilterDiscards);
if (sblk->stat_IfInRuleCheckerDiscards)
- BCE_PRINTF(sc, "0x%08X : IfInRuleCheckerDiscards\n",
+ BCE_PRINTF("0x%08X : IfInRuleCheckerDiscards\n",
sblk->stat_IfInRuleCheckerDiscards);
if (sblk->stat_IfInFTQDiscards)
- BCE_PRINTF(sc, "0x%08X : IfInFTQDiscards\n",
+ BCE_PRINTF("0x%08X : IfInFTQDiscards\n",
sblk->stat_IfInFTQDiscards);
if (sblk->stat_IfInMBUFDiscards)
- BCE_PRINTF(sc, "0x%08X : IfInMBUFDiscards\n",
+ BCE_PRINTF("0x%08X : IfInMBUFDiscards\n",
sblk->stat_IfInMBUFDiscards);
if (sblk->stat_IfInRuleCheckerP4Hit)
- BCE_PRINTF(sc, "0x%08X : IfInRuleCheckerP4Hit\n",
+ BCE_PRINTF("0x%08X : IfInRuleCheckerP4Hit\n",
sblk->stat_IfInRuleCheckerP4Hit);
if (sblk->stat_CatchupInRuleCheckerDiscards)
- BCE_PRINTF(sc, "0x%08X : CatchupInRuleCheckerDiscards\n",
+ BCE_PRINTF("0x%08X : CatchupInRuleCheckerDiscards\n",
sblk->stat_CatchupInRuleCheckerDiscards);
if (sblk->stat_CatchupInFTQDiscards)
- BCE_PRINTF(sc, "0x%08X : CatchupInFTQDiscards\n",
+ BCE_PRINTF("0x%08X : CatchupInFTQDiscards\n",
sblk->stat_CatchupInFTQDiscards);
if (sblk->stat_CatchupInMBUFDiscards)
- BCE_PRINTF(sc, "0x%08X : CatchupInMBUFDiscards\n",
+ BCE_PRINTF("0x%08X : CatchupInMBUFDiscards\n",
sblk->stat_CatchupInMBUFDiscards);
if (sblk->stat_CatchupInRuleCheckerP4Hit)
- BCE_PRINTF(sc, "0x%08X : CatchupInRuleCheckerP4Hit\n",
+ BCE_PRINTF("0x%08X : CatchupInRuleCheckerP4Hit\n",
sblk->stat_CatchupInRuleCheckerP4Hit);
- BCE_PRINTF(sc,
- "-----------------------------"
- "--------------"
- "-----------------------------\n");
+ BCE_PRINTF(
+ "----------------------------"
+ "----------------"
+ "----------------------------\n");
}
+/****************************************************************************/
+/* Prints out a summary of the driver state. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_driver_state(struct bce_softc *sc)
{
u32 val_hi, val_lo;
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"-----------------------------"
" Driver State "
"-----------------------------\n");
val_hi = BCE_ADDR_HI(sc);
val_lo = BCE_ADDR_LO(sc);
- BCE_PRINTF(sc, "0x%08X:%08X - (sc) driver softc structure virtual address\n",
+ BCE_PRINTF("0x%08X:%08X - (sc) driver softc structure virtual address\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->bce_vhandle);
val_lo = BCE_ADDR_LO(sc->bce_vhandle);
- BCE_PRINTF(sc, "0x%08X:%08X - (sc->bce_vhandle) PCI BAR virtual address\n",
+ BCE_PRINTF("0x%08X:%08X - (sc->bce_vhandle) PCI BAR virtual address\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->status_block);
val_lo = BCE_ADDR_LO(sc->status_block);
- BCE_PRINTF(sc, "0x%08X:%08X - (sc->status_block) status block virtual address\n",
+ BCE_PRINTF("0x%08X:%08X - (sc->status_block) status block virtual address\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->stats_block);
val_lo = BCE_ADDR_LO(sc->stats_block);
- BCE_PRINTF(sc, "0x%08X:%08X - (sc->stats_block) statistics block virtual address\n",
+ BCE_PRINTF("0x%08X:%08X - (sc->stats_block) statistics block virtual address\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->tx_bd_chain);
val_lo = BCE_ADDR_LO(sc->tx_bd_chain);
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"0x%08X:%08X - (sc->tx_bd_chain) tx_bd chain virtual adddress\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->rx_bd_chain);
val_lo = BCE_ADDR_LO(sc->rx_bd_chain);
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"0x%08X:%08X - (sc->rx_bd_chain) rx_bd chain virtual address\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->tx_mbuf_ptr);
val_lo = BCE_ADDR_LO(sc->tx_mbuf_ptr);
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"0x%08X:%08X - (sc->tx_mbuf_ptr) tx mbuf chain virtual address\n",
val_hi, val_lo);
val_hi = BCE_ADDR_HI(sc->rx_mbuf_ptr);
val_lo = BCE_ADDR_LO(sc->rx_mbuf_ptr);
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"0x%08X:%08X - (sc->rx_mbuf_ptr) rx mbuf chain virtual address\n",
val_hi, val_lo);
- BCE_PRINTF(sc, " 0x%08X - (sc->interrupts_generated) h/w intrs\n",
+ BCE_PRINTF(" 0x%08X - (sc->interrupts_generated) h/w intrs\n",
sc->interrupts_generated);
- BCE_PRINTF(sc, " 0x%08X - (sc->rx_interrupts) rx interrupts handled\n",
+ BCE_PRINTF(" 0x%08X - (sc->rx_interrupts) rx interrupts handled\n",
sc->rx_interrupts);
- BCE_PRINTF(sc, " 0x%08X - (sc->tx_interrupts) tx interrupts handled\n",
+ BCE_PRINTF(" 0x%08X - (sc->tx_interrupts) tx interrupts handled\n",
sc->tx_interrupts);
- BCE_PRINTF(sc, " 0x%08X - (sc->last_status_idx) status block index\n",
+ BCE_PRINTF(" 0x%08X - (sc->last_status_idx) status block index\n",
sc->last_status_idx);
- BCE_PRINTF(sc, " 0x%08X - (sc->tx_prod) tx producer index\n",
+ BCE_PRINTF(" 0x%08X - (sc->tx_prod) tx producer index\n",
sc->tx_prod);
- BCE_PRINTF(sc, " 0x%08X - (sc->tx_cons) tx consumer index\n",
+ BCE_PRINTF(" 0x%08X - (sc->tx_cons) tx consumer index\n",
sc->tx_cons);
- BCE_PRINTF(sc, " 0x%08X - (sc->tx_prod_bseq) tx producer bseq index\n",
+ BCE_PRINTF(" 0x%08X - (sc->tx_prod_bseq) tx producer bseq index\n",
sc->tx_prod_bseq);
- BCE_PRINTF(sc, " 0x%08X - (sc->rx_prod) rx producer index\n",
+ BCE_PRINTF(" 0x%08X - (sc->rx_prod) rx producer index\n",
sc->rx_prod);
- BCE_PRINTF(sc, " 0x%08X - (sc->rx_cons) rx consumer index\n",
+ BCE_PRINTF(" 0x%08X - (sc->rx_cons) rx consumer index\n",
sc->rx_cons);
- BCE_PRINTF(sc, " 0x%08X - (sc->rx_prod_bseq) rx producer bseq index\n",
+ BCE_PRINTF(" 0x%08X - (sc->rx_prod_bseq) rx producer bseq index\n",
sc->rx_prod_bseq);
- BCE_PRINTF(sc, " 0x%08X - (sc->rx_mbuf_alloc) rx mbufs allocated\n",
+ BCE_PRINTF(" 0x%08X - (sc->rx_mbuf_alloc) rx mbufs allocated\n",
sc->rx_mbuf_alloc);
- BCE_PRINTF(sc, " 0x%08X - (sc->free_rx_bd) free rx_bd's\n",
+ BCE_PRINTF(" 0x%08X - (sc->free_rx_bd) free rx_bd's\n",
sc->free_rx_bd);
- BCE_PRINTF(sc, "0x%08X/%08X - (sc->rx_low_watermark) rx low watermark\n",
+ BCE_PRINTF("0x%08X/%08X - (sc->rx_low_watermark) rx low watermark\n",
sc->rx_low_watermark, (u32) USABLE_RX_BD);
- BCE_PRINTF(sc, " 0x%08X - (sc->txmbuf_alloc) tx mbufs allocated\n",
+ BCE_PRINTF(" 0x%08X - (sc->txmbuf_alloc) tx mbufs allocated\n",
sc->tx_mbuf_alloc);
- BCE_PRINTF(sc, " 0x%08X - (sc->rx_mbuf_alloc) rx mbufs allocated\n",
+ BCE_PRINTF(" 0x%08X - (sc->rx_mbuf_alloc) rx mbufs allocated\n",
sc->rx_mbuf_alloc);
- BCE_PRINTF(sc, " 0x%08X - (sc->used_tx_bd) used tx_bd's\n",
+ BCE_PRINTF(" 0x%08X - (sc->used_tx_bd) used tx_bd's\n",
sc->used_tx_bd);
- BCE_PRINTF(sc, "0x%08X/%08X - (sc->tx_hi_watermark) tx hi watermark\n",
+ BCE_PRINTF("0x%08X/%08X - (sc->tx_hi_watermark) tx hi watermark\n",
sc->tx_hi_watermark, (u32) USABLE_TX_BD);
- BCE_PRINTF(sc, " 0x%08X - (sc->mbuf_alloc_failed) failed mbuf alloc\n",
+ BCE_PRINTF(" 0x%08X - (sc->mbuf_alloc_failed) failed mbuf alloc\n",
sc->mbuf_alloc_failed);
- BCE_PRINTF(sc,
- "-----------------------------"
- "--------------"
- "-----------------------------\n");
+ BCE_PRINTF(
+ "----------------------------"
+ "----------------"
+ "----------------------------\n");
}
+
-
+/****************************************************************************/
+/* Prints out the hardware state through a summary of important registers, */
+/* followed by a complete register dump. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_dump_hw_state(struct bce_softc *sc)
{
u32 val1;
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" Hardware State "
"----------------------------\n");
- BCE_PRINTF(sc, "0x%08X : bootcode version\n", sc->bce_fw_ver);
+ BCE_PRINTF("0x%08X : bootcode version\n", sc->bce_fw_ver);
val1 = REG_RD(sc, BCE_MISC_ENABLE_STATUS_BITS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) misc_enable_status_bits\n",
+ BCE_PRINTF("0x%08X : (0x%04X) misc_enable_status_bits\n",
val1, BCE_MISC_ENABLE_STATUS_BITS);
val1 = REG_RD(sc, BCE_DMA_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) dma_status\n", val1, BCE_DMA_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) dma_status\n", val1, BCE_DMA_STATUS);
val1 = REG_RD(sc, BCE_CTX_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) ctx_status\n", val1, BCE_CTX_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) ctx_status\n", val1, BCE_CTX_STATUS);
val1 = REG_RD(sc, BCE_EMAC_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) emac_status\n", val1, BCE_EMAC_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) emac_status\n", val1, BCE_EMAC_STATUS);
val1 = REG_RD(sc, BCE_RPM_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) rpm_status\n", val1, BCE_RPM_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) rpm_status\n", val1, BCE_RPM_STATUS);
val1 = REG_RD(sc, BCE_TBDR_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) tbdr_status\n", val1, BCE_TBDR_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) tbdr_status\n", val1, BCE_TBDR_STATUS);
val1 = REG_RD(sc, BCE_TDMA_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) tdma_status\n", val1, BCE_TDMA_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) tdma_status\n", val1, BCE_TDMA_STATUS);
val1 = REG_RD(sc, BCE_HC_STATUS);
- BCE_PRINTF(sc, "0x%08X : (0x%04X) hc_status\n", val1, BCE_HC_STATUS);
+ BCE_PRINTF("0x%08X : (0x%04X) hc_status\n", val1, BCE_HC_STATUS);
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
"----------------"
"----------------------------\n");
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
" Register Dump "
"----------------------------\n");
-
+
for (int i = 0x400; i < 0x8000; i += 0x10)
- BCE_PRINTF(sc, "0x%04X: 0x%08X 0x%08X 0x%08X 0x%08X\n",
+ BCE_PRINTF("0x%04X: 0x%08X 0x%08X 0x%08X 0x%08X\n",
i, REG_RD(sc, i), REG_RD(sc, i + 0x4),
REG_RD(sc, i + 0x8), REG_RD(sc, i + 0xC));
- BCE_PRINTF(sc,
+ BCE_PRINTF(
"----------------------------"
"----------------"
"----------------------------\n");
}
+/****************************************************************************/
+/* Prints out the driver state and then enters the debugger. */
+/* */
+/* Returns: */
+/* Nothing. */
+/****************************************************************************/
static void
bce_breakpoint(struct bce_softc *sc)
{
@@ -6769,7 +6967,7 @@ bce_breakpoint(struct bce_softc *sc)
}
bce_dump_driver_state(sc);
- /* Print the important status block fields. */
+
bce_dump_status_block(sc);
/* Call the debugger. */
diff --git a/sys/dev/bce/if_bcefw.h b/sys/dev/bce/if_bcefw.h
index b7c38ba..bc90303 100644
--- a/sys/dev/bce/if_bcefw.h
+++ b/sys/dev/bce/if_bcefw.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2006 Broadcom Corporation
+ * Copyright (c) 2006-2007 Broadcom Corporation
* David Christensen <davidch@broadcom.com>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/bce/if_bcereg.h b/sys/dev/bce/if_bcereg.h
index e268dc8..384eadc 100644
--- a/sys/dev/bce/if_bcereg.h
+++ b/sys/dev/bce/if_bcereg.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2006 Broadcom Corporation
+ * Copyright (c) 2006-2007 Broadcom Corporation
* David Christensen <davidch@broadcom.com>. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -96,7 +96,7 @@
/****************************************************************************/
/* Debugging macros and definitions. */
-/****************************************************************************/
+/****************************************************************************/
#define BCE_CP_LOAD 0x00000001
#define BCE_CP_SEND 0x00000002
#define BCE_CP_RECV 0x00000004
@@ -248,9 +248,11 @@
#define BCE_CHIP_ID_5706_A0 0x57060000
#define BCE_CHIP_ID_5706_A1 0x57060010
#define BCE_CHIP_ID_5706_A2 0x57060020
+#define BCE_CHIP_ID_5706_A3 0x57060030
#define BCE_CHIP_ID_5708_A0 0x57080000
#define BCE_CHIP_ID_5708_B0 0x57081000
#define BCE_CHIP_ID_5708_B1 0x57081010
+#define BCE_CHIP_ID_5708_B2 0x57081020
#define BCE_CHIP_BOND_ID(sc) (((sc)->bce_chipid) & 0xf)
@@ -689,7 +691,7 @@ struct flash_spec {
/****************************************************************************/
/* Convenience definitions. */
/****************************************************************************/
-#define BCE_PRINTF(sc, fmt, args...) device_printf(sc->bce_dev, fmt, ##args)
+#define BCE_PRINTF(fmt, args...) device_printf(sc->bce_dev, fmt, ##args)
#define BCE_LOCK_INIT(_sc, _name) mtx_init(&(_sc)->bce_mtx, _name, MTX_NETWORK_LOCK, MTX_DEF)
#define BCE_LOCK(_sc) mtx_lock(&(_sc)->bce_mtx)
@@ -4463,18 +4465,18 @@ struct l2_fhdr {
/* Use the natural page size of the host CPU. */
/* XXX: This has only been tested on amd64/i386 systems using 4KB pages. */
-#define BCM_PAGE_BITS PAGE_SHIFT
-#define BCM_PAGE_SIZE PAGE_SIZE
+#define BCM_PAGE_BITS PAGE_SHIFT
+#define BCM_PAGE_SIZE PAGE_SIZE
-#define TX_PAGES 2
+#define TX_PAGES 2
#define TOTAL_TX_BD_PER_PAGE (BCM_PAGE_SIZE / sizeof(struct tx_bd))
#define USABLE_TX_BD_PER_PAGE (TOTAL_TX_BD_PER_PAGE - 1)
#define TOTAL_TX_BD (TOTAL_TX_BD_PER_PAGE * TX_PAGES)
#define USABLE_TX_BD (USABLE_TX_BD_PER_PAGE * TX_PAGES)
#define MAX_TX_BD (TOTAL_TX_BD - 1)
#define BCE_TX_SLACK_SPACE 16
-
-#define RX_PAGES 2
+
+#define RX_PAGES 2
#define TOTAL_RX_BD_PER_PAGE (BCM_PAGE_SIZE / sizeof(struct rx_bd))
#define USABLE_RX_BD_PER_PAGE (TOTAL_RX_BD_PER_PAGE - 1)
#define TOTAL_RX_BD (TOTAL_RX_BD_PER_PAGE * RX_PAGES)
@@ -4871,7 +4873,10 @@ struct bce_softc
u32 stat_CatchupInRuleCheckerDiscards;
u32 stat_CatchupInFTQDiscards;
u32 stat_CatchupInMBUFDiscards;
- u32 stat_CatchupInRuleCheckerP4Hit;
+ u32 stat_CatchupInRuleCheckerP4Hit;
+
+ /* Provides access to certain firmware statistics. */
+ u32 com_no_buffers;
#ifdef BCE_DEBUG
/* Track the number of enqueued mbufs. */
OpenPOWER on IntegriCloud