mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-28 08:02:54 +00:00
- Migrated IPMI fix from RELENG_6.
- Added additional debug code.
This commit is contained in:
parent
f8c94cec4b
commit
ca4c7b3b75
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=170810
@ -230,6 +230,7 @@ static void bce_dump_status_block (struct bce_softc *);
|
||||
static void bce_dump_stats_block (struct bce_softc *);
|
||||
static void bce_dump_driver_state (struct bce_softc *);
|
||||
static void bce_dump_hw_state (struct bce_softc *);
|
||||
static void bce_dump_bc_state (struct bce_softc *);
|
||||
static void bce_breakpoint (struct bce_softc *);
|
||||
#endif
|
||||
|
||||
@ -320,6 +321,7 @@ static void bce_intr (void *);
|
||||
static void bce_set_rx_mode (struct bce_softc *);
|
||||
static void bce_stats_update (struct bce_softc *);
|
||||
static void bce_tick (void *);
|
||||
static void bce_pulse (void *);
|
||||
static void bce_add_sysctls (struct bce_softc *);
|
||||
|
||||
|
||||
@ -437,9 +439,6 @@ bce_probe(device_t dev)
|
||||
t++;
|
||||
}
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_LOAD, "%s(%d): No IOCTL match found!\n",
|
||||
__FILE__, __LINE__);
|
||||
|
||||
return(ENXIO);
|
||||
}
|
||||
|
||||
@ -501,10 +500,11 @@ bce_attach(device_t dev)
|
||||
if (count == 1 && pci_alloc_msi(dev, &count) == 0 && count == 1) {
|
||||
rid = 1;
|
||||
sc->bce_flags |= BCE_USING_MSI_FLAG;
|
||||
DBPRINT(sc, BCE_INFO, "Allocating %d MSI interrupt(s).\n", count);
|
||||
DBPRINT(sc, BCE_VERBOSE_LOAD,
|
||||
"Allocating %d MSI interrupt(s)\n", count);
|
||||
} else {
|
||||
rid = 0;
|
||||
DBPRINT(sc, BCE_INFO, "Allocating IRQ interrupt.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_LOAD, "Allocating IRQ interrupt\n");
|
||||
}
|
||||
|
||||
sc->bce_res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
|
||||
@ -568,7 +568,21 @@ bce_attach(device_t dev)
|
||||
else
|
||||
sc->bce_shmem_base = HOST_VIEW_SHMEM_BASE;
|
||||
|
||||
DBPRINT(sc, BCE_INFO, "bce_shmem_base = 0x%08X\n", sc->bce_shmem_base);
|
||||
DBPRINT(sc, BCE_VERBOSE_FIRMWARE, "%s(): bce_shmem_base = 0x%08X\n",
|
||||
__FUNCTION__, sc->bce_shmem_base);
|
||||
|
||||
sc->bce_fw_ver = REG_RD_IND(sc, sc->bce_shmem_base +
|
||||
BCE_DEV_INFO_BC_REV);
|
||||
DBPRINT(sc, BCE_INFO_FIRMWARE, "%s(): bce_fw_ver = 0x%08X\n",
|
||||
__FUNCTION__, sc->bce_fw_ver);
|
||||
|
||||
/* Check if any management firmware is running. */
|
||||
val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_PORT_FEATURE);
|
||||
if (val & (BCE_PORT_FEATURE_ASF_ENABLED | BCE_PORT_FEATURE_IMD_ENABLED)) {
|
||||
sc->bce_flags |= BCE_MFW_ENABLE_FLAG;
|
||||
DBPRINT(sc, BCE_INFO_LOAD, "%s(): BCE_MFW_ENABLE_FLAG\n",
|
||||
__FUNCTION__);
|
||||
}
|
||||
|
||||
/* Get PCI bus information (speed and type). */
|
||||
val = REG_RD(sc, BCE_PCICFG_MISC_STATUS);
|
||||
@ -615,16 +629,10 @@ bce_attach(device_t dev)
|
||||
if (val & BCE_PCICFG_MISC_STATUS_32BIT_DET)
|
||||
sc->bce_flags |= BCE_PCI_32BIT_FLAG;
|
||||
|
||||
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),
|
||||
((sc->bce_flags & BCE_PCIX_FLAG) ? "-X" : ""),
|
||||
((sc->bce_flags & BCE_PCI_32BIT_FLAG) ? "32-bit" : "64-bit"),
|
||||
sc->bus_speed_mhz);
|
||||
|
||||
/* Reset the controller. */
|
||||
/* Reset the controller and announce to bootcde that driver is present. */
|
||||
if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) {
|
||||
BCE_PRINTF("%s(%d): Controller reset failed!\n",
|
||||
__FILE__, __LINE__);
|
||||
rc = ENXIO;
|
||||
goto bce_attach_fail;
|
||||
}
|
||||
@ -654,10 +662,10 @@ bce_attach(device_t dev)
|
||||
* interrupt while ticks control how long
|
||||
* a BD can sit in the chain before
|
||||
* generating an interrupt. Set the default
|
||||
* values for the RX and TX rings.
|
||||
* values for the RX and TX chains.
|
||||
*/
|
||||
|
||||
#ifdef BCE_DRBUG
|
||||
#ifdef BCE_DEBUG
|
||||
/* Force more frequent interrupts. */
|
||||
sc->bce_tx_quick_cons_trip_int = 1;
|
||||
sc->bce_tx_quick_cons_trip = 1;
|
||||
@ -669,6 +677,7 @@ bce_attach(device_t dev)
|
||||
sc->bce_rx_ticks_int = 0;
|
||||
sc->bce_rx_ticks = 0;
|
||||
#else
|
||||
/* Improve throughput at the expense of increased latency. */
|
||||
sc->bce_tx_quick_cons_trip_int = 20;
|
||||
sc->bce_tx_quick_cons_trip = 20;
|
||||
sc->bce_tx_ticks_int = 80;
|
||||
@ -700,12 +709,12 @@ bce_attach(device_t dev)
|
||||
BCE_SHARED_HW_CFG_CONFIG);
|
||||
if (val & BCE_SHARED_HW_CFG_PHY_2_5G) {
|
||||
sc->bce_phy_flags |= BCE_PHY_2_5G_CAPABLE_FLAG;
|
||||
DBPRINT(sc, BCE_WARN, "Found 2.5Gb capable adapter\n");
|
||||
DBPRINT(sc, BCE_INFO_LOAD, "Found 2.5Gb capable adapter\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Store config data needed by the PHY driver for backplane applications */
|
||||
/* Store data needed by PHY driver for backplane applications */
|
||||
sc->bce_shared_hw_cfg = REG_RD_IND(sc, sc->bce_shmem_base +
|
||||
BCE_SHARED_HW_CFG_CONFIG);
|
||||
sc->bce_port_hw_cfg = REG_RD_IND(sc, sc->bce_shmem_base +
|
||||
@ -754,18 +763,18 @@ bce_attach(device_t dev)
|
||||
#endif
|
||||
|
||||
ifp->if_snd.ifq_drv_maxlen = USABLE_TX_BD;
|
||||
IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
|
||||
IFQ_SET_READY(&ifp->if_snd);
|
||||
|
||||
if (sc->bce_phy_flags & BCE_PHY_2_5G_CAPABLE_FLAG)
|
||||
ifp->if_baudrate = IF_Mbps(2500ULL);
|
||||
else
|
||||
ifp->if_baudrate = IF_Mbps(1000);
|
||||
|
||||
IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen);
|
||||
IFQ_SET_READY(&ifp->if_snd);
|
||||
|
||||
/* Look for our PHY. */
|
||||
/* Check for an MII child bus by probing the PHY. */
|
||||
if (mii_phy_probe(dev, &sc->bce_miibus, bce_ifmedia_upd,
|
||||
bce_ifmedia_sts)) {
|
||||
BCE_PRINTF("%s(%d): PHY probe failed!\n",
|
||||
BCE_PRINTF("%s(%d): No PHY found on child MII bus!\n",
|
||||
__FILE__, __LINE__);
|
||||
rc = ENXIO;
|
||||
goto bce_attach_fail;
|
||||
@ -775,9 +784,11 @@ bce_attach(device_t dev)
|
||||
ether_ifattach(ifp, sc->eaddr);
|
||||
|
||||
#if __FreeBSD_version < 500000
|
||||
callout_init(&sc->bce_stat_ch);
|
||||
callout_init(&sc->bce_tick_callout);
|
||||
callout_init(&sc->bce_pulse_callout);
|
||||
#else
|
||||
callout_init_mtx(&sc->bce_stat_ch, &sc->bce_mtx, 0);
|
||||
callout_init_mtx(&sc->bce_tick_callout, &sc->bce_mtx, 0);
|
||||
callout_init_mtx(&sc->bce_pulse_callout, &sc->bce_mtx, 0);
|
||||
#endif
|
||||
|
||||
/* Hookup IRQ last. */
|
||||
@ -791,17 +802,47 @@ bce_attach(device_t dev)
|
||||
goto bce_attach_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* At this point we've acquired all the resources
|
||||
* we need to run so there's no turning back, we're
|
||||
* cleared for launch.
|
||||
*/
|
||||
|
||||
/* Print some important debugging info. */
|
||||
DBRUN(BCE_INFO, bce_dump_driver_state(sc));
|
||||
|
||||
/* Add the supported sysctls to the kernel. */
|
||||
bce_add_sysctls(sc);
|
||||
|
||||
/* Get the firmware running so IPMI still works */
|
||||
BCE_LOCK(sc);
|
||||
BCE_LOCK(sc);
|
||||
/*
|
||||
* The chip reset earlier notified the bootcode that
|
||||
* a driver is present. We now need to start our pulse
|
||||
* routine so that the bootcode is reminded that we're
|
||||
* still running.
|
||||
*/
|
||||
bce_pulse(sc);
|
||||
|
||||
bce_mgmt_init_locked(sc);
|
||||
BCE_UNLOCK(sc);
|
||||
|
||||
/* Finally, print some useful adapter info */
|
||||
BCE_PRINTF("ASIC (0x%08X); ", sc->bce_chipid);
|
||||
printf("Rev (%c%d); ", ((BCE_CHIP_ID(sc) & 0xf000) >> 12) + 'A',
|
||||
((BCE_CHIP_ID(sc) & 0x0ff0) >> 4));
|
||||
printf("Bus (PCI%s, %s, %dMHz); ",
|
||||
((sc->bce_flags & BCE_PCIX_FLAG) ? "-X" : ""),
|
||||
((sc->bce_flags & BCE_PCI_32BIT_FLAG) ? "32-bit" : "64-bit"),
|
||||
sc->bus_speed_mhz);
|
||||
printf("F/W (0x%08X); Flags( ", sc->bce_fw_ver);
|
||||
if (sc->bce_flags & BCE_MFW_ENABLE_FLAG)
|
||||
printf("MFW ");
|
||||
if (sc->bce_flags & BCE_USING_MSI_FLAG)
|
||||
printf("MSI ");
|
||||
if (sc->bce_phy_flags & BCE_PHY_2_5G_CAPABLE_FLAG)
|
||||
printf("2.5G ");
|
||||
printf(")\n");
|
||||
|
||||
goto bce_attach_exit;
|
||||
|
||||
bce_attach_fail:
|
||||
@ -826,10 +867,9 @@ bce_attach(device_t dev)
|
||||
static int
|
||||
bce_detach(device_t dev)
|
||||
{
|
||||
struct bce_softc *sc;
|
||||
struct bce_softc *sc = device_get_softc(dev);
|
||||
struct ifnet *ifp;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
u32 msg;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
|
||||
|
||||
@ -840,10 +880,17 @@ bce_detach(device_t dev)
|
||||
ether_poll_deregister(ifp);
|
||||
#endif
|
||||
|
||||
/* Stop the pulse so the bootcode can go to driver absent state. */
|
||||
callout_stop(&sc->bce_pulse_callout);
|
||||
|
||||
/* Stop and reset the controller. */
|
||||
BCE_LOCK(sc);
|
||||
bce_stop(sc);
|
||||
bce_reset(sc, BCE_DRV_MSG_CODE_RESET);
|
||||
if (sc->bce_flags & BCE_NO_WOL_FLAG)
|
||||
msg = BCE_DRV_MSG_CODE_UNLOAD_LNK_DN;
|
||||
else
|
||||
msg = BCE_DRV_MSG_CODE_UNLOAD;
|
||||
bce_reset(sc, msg);
|
||||
BCE_UNLOCK(sc);
|
||||
|
||||
ether_ifdetach(ifp);
|
||||
@ -873,11 +920,20 @@ static void
|
||||
bce_shutdown(device_t dev)
|
||||
{
|
||||
struct bce_softc *sc = device_get_softc(dev);
|
||||
u32 msg;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_SPECIAL, "Entering %s()\n", __FUNCTION__);
|
||||
|
||||
BCE_LOCK(sc);
|
||||
bce_stop(sc);
|
||||
bce_reset(sc, BCE_DRV_MSG_CODE_RESET);
|
||||
if (sc->bce_flags & BCE_NO_WOL_FLAG)
|
||||
msg = BCE_DRV_MSG_CODE_UNLOAD_LNK_DN;
|
||||
else
|
||||
msg = BCE_DRV_MSG_CODE_UNLOAD;
|
||||
bce_reset(sc, msg);
|
||||
BCE_UNLOCK(sc);
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_SPECIAL, "Exiting %s()\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
|
||||
@ -977,7 +1033,7 @@ bce_miibus_read_reg(device_t dev, int phy, int reg)
|
||||
|
||||
/* Make sure we are accessing the correct PHY address. */
|
||||
if (phy != sc->bce_phy_addr) {
|
||||
DBPRINT(sc, BCE_VERBOSE, "Invalid PHY address %d for PHY read!\n", phy);
|
||||
DBPRINT(sc, BCE_EXCESSIVE_PHY, "Invalid PHY address %d for PHY read!\n", phy);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -1055,7 +1111,7 @@ bce_miibus_write_reg(device_t dev, int phy, int reg, int val)
|
||||
|
||||
/* Make sure we are accessing the correct PHY address. */
|
||||
if (phy != sc->bce_phy_addr) {
|
||||
DBPRINT(sc, BCE_VERBOSE, "Invalid PHY address %d for PHY write!\n", phy);
|
||||
DBPRINT(sc, BCE_EXCESSIVE_PHY, "Invalid PHY address %d for PHY write!\n", phy);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -1149,10 +1205,11 @@ bce_miibus_statchg(device_t dev)
|
||||
/* fall-through */
|
||||
case IFM_1000_T:
|
||||
case IFM_1000_SX:
|
||||
DBPRINT(sc, BCE_INFO, "Enablinb GMII interface.\n");
|
||||
DBPRINT(sc, BCE_INFO, "Enabling GMII interface.\n");
|
||||
val |= BCE_EMAC_MODE_PORT_GMII;
|
||||
break;
|
||||
default:
|
||||
DBPRINT(sc, BCE_INFO, "Enabling default GMII interface.\n");
|
||||
val |= BCE_EMAC_MODE_PORT_GMII;
|
||||
}
|
||||
|
||||
@ -1166,7 +1223,7 @@ bce_miibus_statchg(device_t dev)
|
||||
REG_WR(sc, BCE_EMAC_MODE, val);
|
||||
|
||||
#if 0
|
||||
/* Todo: Enable this support in brgphy and bge. */
|
||||
/* Todo: Enable flow control support in brgphy and bge. */
|
||||
/* FLAG0 is set if RX is enabled and FLAG1 if TX is enabled */
|
||||
if (mii->mii_media_active & IFM_FLAG0)
|
||||
BCE_SETBIT(sc, BCE_EMAC_RX_MODE, BCE_EMAC_RX_MODE_FLOW_EN);
|
||||
@ -1193,7 +1250,7 @@ bce_acquire_nvram_lock(struct bce_softc *sc)
|
||||
u32 val;
|
||||
int j;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Acquiring NVRAM lock.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Acquiring NVRAM lock.\n");
|
||||
|
||||
/* Request access to the flash interface. */
|
||||
REG_WR(sc, BCE_NVM_SW_ARB, BCE_NVM_SW_ARB_ARB_REQ_SET2);
|
||||
@ -1230,7 +1287,7 @@ bce_release_nvram_lock(struct bce_softc *sc)
|
||||
int j;
|
||||
u32 val;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Releasing NVRAM lock.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Releasing NVRAM lock.\n");
|
||||
|
||||
/*
|
||||
* Relinquish nvram interface.
|
||||
@ -1268,7 +1325,7 @@ bce_enable_nvram_write(struct bce_softc *sc)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Enabling NVRAM write.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Enabling NVRAM write.\n");
|
||||
|
||||
val = REG_RD(sc, BCE_MISC_CFG);
|
||||
REG_WR(sc, BCE_MISC_CFG, val | BCE_MISC_CFG_NVM_WR_EN_PCI);
|
||||
@ -1310,7 +1367,7 @@ bce_disable_nvram_write(struct bce_softc *sc)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Disabling NVRAM write.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Disabling NVRAM write.\n");
|
||||
|
||||
val = REG_RD(sc, BCE_MISC_CFG);
|
||||
REG_WR(sc, BCE_MISC_CFG, val & ~BCE_MISC_CFG_NVM_WR_EN);
|
||||
@ -1332,7 +1389,7 @@ bce_enable_nvram_access(struct bce_softc *sc)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Enabling NVRAM access.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Enabling NVRAM access.\n");
|
||||
|
||||
val = REG_RD(sc, BCE_NVM_ACCESS_ENABLE);
|
||||
/* Enable both bits, even on read. */
|
||||
@ -1354,7 +1411,7 @@ bce_disable_nvram_access(struct bce_softc *sc)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Disabling NVRAM access.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Disabling NVRAM access.\n");
|
||||
|
||||
val = REG_RD(sc, BCE_NVM_ACCESS_ENABLE);
|
||||
|
||||
@ -1385,7 +1442,7 @@ bce_nvram_erase_page(struct bce_softc *sc, u32 offset)
|
||||
if (sc->bce_flash_info->buffered)
|
||||
return 0;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Erasing NVRAM page.\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Erasing NVRAM page.\n");
|
||||
|
||||
/* Build an erase command. */
|
||||
cmd = BCE_NVM_COMMAND_ERASE | BCE_NVM_COMMAND_WR |
|
||||
@ -1554,7 +1611,7 @@ bce_init_nvram(struct bce_softc *sc)
|
||||
int j, entry_count, rc;
|
||||
struct flash_spec *flash;
|
||||
|
||||
DBPRINT(sc,BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Entering %s()\n", __FUNCTION__);
|
||||
|
||||
/* Determine the selected interface. */
|
||||
val = REG_RD(sc, BCE_NVM_CFG1);
|
||||
@ -1641,7 +1698,7 @@ bce_init_nvram(struct bce_softc *sc)
|
||||
DBPRINT(sc, BCE_INFO_LOAD, "bce_init_nvram() flash->total_size = 0x%08X\n",
|
||||
sc->bce_flash_info->total_size);
|
||||
|
||||
DBPRINT(sc,BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
|
||||
DBPRINT(sc, BCE_VERBOSE_NVRAM, "Exiting %s()\n", __FUNCTION__);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -2620,7 +2677,7 @@ bce_fw_sync(struct bce_softc *sc, u32 msg_data)
|
||||
sc->bce_fw_wr_seq++;
|
||||
msg_data |= sc->bce_fw_wr_seq;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "bce_fw_sync(): msg_data = 0x%08X\n", msg_data);
|
||||
DBPRINT(sc, BCE_VERBOSE_FIRMWARE, "bce_fw_sync(): msg_data = 0x%08X\n", msg_data);
|
||||
|
||||
/* Send the message to the bootcode driver mailbox. */
|
||||
REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_MB, msg_data);
|
||||
@ -3061,7 +3118,7 @@ bce_get_mac_addr(struct bce_softc *sc)
|
||||
sc->eaddr[5] = (u_char)(mac_lo >> 0);
|
||||
}
|
||||
|
||||
DBPRINT(sc, BCE_INFO, "Permanent Ethernet address = %6D\n", sc->eaddr, ":");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Permanent Ethernet address = %6D\n", sc->eaddr, ":");
|
||||
}
|
||||
|
||||
|
||||
@ -3077,7 +3134,7 @@ bce_set_mac_addr(struct bce_softc *sc)
|
||||
u32 val;
|
||||
u8 *mac_addr = sc->eaddr;
|
||||
|
||||
DBPRINT(sc, BCE_INFO, "Setting Ethernet address = %6D\n", sc->eaddr, ":");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Setting Ethernet address = %6D\n", sc->eaddr, ":");
|
||||
|
||||
val = (mac_addr[0] << 8) | mac_addr[1];
|
||||
|
||||
@ -3112,7 +3169,7 @@ bce_stop(struct bce_softc *sc)
|
||||
|
||||
mii = device_get_softc(sc->bce_miibus);
|
||||
|
||||
callout_stop(&sc->bce_stat_ch);
|
||||
callout_stop(&sc->bce_tick_callout);
|
||||
|
||||
/* Disable the transmit/receive blocks. */
|
||||
REG_WR(sc, BCE_MISC_ENABLE_CLR_BITS, 0x5ffffff);
|
||||
@ -3121,9 +3178,6 @@ bce_stop(struct bce_softc *sc)
|
||||
|
||||
bce_disable_intr(sc);
|
||||
|
||||
/* Tell firmware that the driver is going away. */
|
||||
bce_reset(sc, BCE_DRV_MSG_CODE_SUSPEND_NO_WOL);
|
||||
|
||||
/* Free the RX lists. */
|
||||
bce_free_rx_chain(sc);
|
||||
|
||||
@ -3138,9 +3192,8 @@ bce_stop(struct bce_softc *sc)
|
||||
|
||||
itmp = ifp->if_flags;
|
||||
ifp->if_flags |= IFF_UP;
|
||||
/*
|
||||
* If we are called from bce_detach(), mii is already NULL.
|
||||
*/
|
||||
|
||||
/* If we are called from bce_detach(), mii is already NULL. */
|
||||
if (mii != NULL) {
|
||||
ifm = mii->mii_media.ifm_cur;
|
||||
mtmp = ifm->ifm_media;
|
||||
@ -3157,8 +3210,6 @@ bce_stop(struct bce_softc *sc)
|
||||
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
|
||||
|
||||
bce_mgmt_init_locked(sc);
|
||||
}
|
||||
|
||||
|
||||
@ -3168,7 +3219,8 @@ bce_reset(struct bce_softc *sc, u32 reset_code)
|
||||
u32 val;
|
||||
int i, rc = 0;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "%s(): reset_code = 0x%08X\n",
|
||||
__FUNCTION__, reset_code);
|
||||
|
||||
/* Wait for pending PCI transactions to complete. */
|
||||
REG_WR(sc, BCE_MISC_ENABLE_CLR_BITS,
|
||||
@ -3238,8 +3290,6 @@ bce_reset(struct bce_softc *sc, u32 reset_code)
|
||||
__FILE__, __LINE__);
|
||||
|
||||
bce_reset_exit:
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
|
||||
|
||||
return (rc);
|
||||
}
|
||||
|
||||
@ -3423,16 +3473,6 @@ bce_blockinit(struct bce_softc *sc)
|
||||
goto bce_blockinit_exit;
|
||||
}
|
||||
|
||||
/* Check if any management firmware is running. */
|
||||
reg = REG_RD_IND(sc, sc->bce_shmem_base + BCE_PORT_FEATURE);
|
||||
if (reg & (BCE_PORT_FEATURE_ASF_ENABLED | BCE_PORT_FEATURE_IMD_ENABLED)) {
|
||||
DBPRINT(sc, BCE_INFO, "Management F/W Enabled.\n");
|
||||
sc->bce_flags |= BCE_MFW_ENABLE_FLAG;
|
||||
}
|
||||
|
||||
sc->bce_fw_ver = REG_RD_IND(sc, sc->bce_shmem_base + BCE_DEV_INFO_BC_REV);
|
||||
DBPRINT(sc, BCE_INFO, "bootcode rev = 0x%08X\n", sc->bce_fw_ver);
|
||||
|
||||
/* Allow bootcode to apply any additional fixes before enabling MAC. */
|
||||
rc = bce_fw_sync(sc, BCE_DRV_MSG_DATA_WAIT2 | BCE_DRV_MSG_CODE_RESET);
|
||||
|
||||
@ -3939,19 +3979,19 @@ bce_phy_intr(struct bce_softc *sc)
|
||||
DBRUN(BCE_VERBOSE_INTR, bce_dump_status_block(sc));
|
||||
|
||||
sc->bce_link = 0;
|
||||
callout_stop(&sc->bce_stat_ch);
|
||||
callout_stop(&sc->bce_tick_callout);
|
||||
bce_tick(sc);
|
||||
|
||||
/* Update the status_attn_bits_ack field in the status block. */
|
||||
if (new_link_state) {
|
||||
REG_WR(sc, BCE_PCICFG_STATUS_BIT_SET_CMD,
|
||||
STATUS_ATTN_BITS_LINK_STATE);
|
||||
DBPRINT(sc, BCE_INFO, "Link is now UP.\n");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Link is now UP.\n");
|
||||
}
|
||||
else {
|
||||
REG_WR(sc, BCE_PCICFG_STATUS_BIT_CLEAR_CMD,
|
||||
STATUS_ATTN_BITS_LINK_STATE);
|
||||
DBPRINT(sc, BCE_INFO, "Link is now DOWN.\n");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Link is now DOWN.\n");
|
||||
}
|
||||
|
||||
}
|
||||
@ -4163,7 +4203,7 @@ bce_rx_intr(struct bce_softc *sc)
|
||||
if ((l2fhdr->l2_fhdr_ip_xsum ^ 0xffff) == 0)
|
||||
m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
|
||||
else
|
||||
DBPRINT(sc, BCE_WARN_RECV,
|
||||
DBPRINT(sc, BCE_WARN_SEND,
|
||||
"%s(): Invalid IP checksum = 0x%04X!\n",
|
||||
__FUNCTION__, l2fhdr->l2_fhdr_ip_xsum);
|
||||
}
|
||||
@ -4180,7 +4220,7 @@ bce_rx_intr(struct bce_softc *sc)
|
||||
m->m_pkthdr.csum_flags |= (CSUM_DATA_VALID
|
||||
| CSUM_PSEUDO_HDR);
|
||||
} else
|
||||
DBPRINT(sc, BCE_WARN_RECV,
|
||||
DBPRINT(sc, BCE_WARN_SEND,
|
||||
"%s(): Invalid TCP/UDP checksum = 0x%04X!\n",
|
||||
__FUNCTION__, l2fhdr->l2_fhdr_tcp_udp_xsum);
|
||||
}
|
||||
@ -4224,7 +4264,7 @@ bce_rx_intr(struct bce_softc *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;
|
||||
@ -4370,7 +4410,7 @@ bce_tx_intr(struct bce_softc *sc)
|
||||
/* Clear the tx hardware queue full flag. */
|
||||
if (sc->used_tx_bd < sc->max_tx_bd) {
|
||||
DBRUNIF((ifp->if_drv_flags & IFF_DRV_OACTIVE),
|
||||
DBPRINT(sc, BCE_WARN_SEND,
|
||||
DBPRINT(sc, BCE_INFO_SEND,
|
||||
"%s(): Open TX chain! %d/%d (used/total)\n",
|
||||
__FUNCTION__, sc->used_tx_bd, sc->max_tx_bd));
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
@ -4468,7 +4508,7 @@ bce_init_locked(struct bce_softc *sc)
|
||||
ether_mtu = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ifp->if_mtu +
|
||||
ETHER_CRC_LEN;
|
||||
|
||||
DBPRINT(sc, BCE_INFO, "%s(): setting mtu = %d\n",__FUNCTION__, ether_mtu);
|
||||
DBPRINT(sc, BCE_INFO_MISC, "%s(): setting mtu = %d\n",__FUNCTION__, ether_mtu);
|
||||
|
||||
/*
|
||||
* Program the mtu, enabling jumbo frame
|
||||
@ -4487,7 +4527,7 @@ bce_init_locked(struct bce_softc *sc)
|
||||
/* Calculate the RX Ethernet frame size for rx_bd's. */
|
||||
sc->max_frame_size = sizeof(struct l2_fhdr) + 2 + ether_mtu + 8;
|
||||
|
||||
DBPRINT(sc, BCE_INFO,
|
||||
DBPRINT(sc, BCE_INFO_RECV,
|
||||
"%s(): mclbytes = %d, mbuf_alloc_size = %d, "
|
||||
"max_frame_size = %d\n",
|
||||
__FUNCTION__, (int) MCLBYTES, sc->mbuf_alloc_size, sc->max_frame_size);
|
||||
@ -4520,7 +4560,7 @@ bce_init_locked(struct bce_softc *sc)
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
|
||||
callout_reset(&sc->bce_stat_ch, hz, bce_tick, sc);
|
||||
callout_reset(&sc->bce_tick_callout, hz, bce_tick, sc);
|
||||
|
||||
bce_init_locked_exit:
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
|
||||
@ -4531,7 +4571,7 @@ bce_init_locked(struct bce_softc *sc)
|
||||
|
||||
/****************************************************************************/
|
||||
/* Initialize the controller just enough so that any management firmware */
|
||||
/* running on the device will continue to operate corectly. */
|
||||
/* running on the device will continue to operate correctly. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
@ -4539,31 +4579,23 @@ bce_init_locked(struct bce_softc *sc)
|
||||
static void
|
||||
bce_mgmt_init_locked(struct bce_softc *sc)
|
||||
{
|
||||
u32 val;
|
||||
struct ifnet *ifp;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
|
||||
|
||||
BCE_LOCK_ASSERT(sc);
|
||||
|
||||
/* Bail out if management firmware is not running. */
|
||||
if (!(sc->bce_flags & BCE_MFW_ENABLE_FLAG)) {
|
||||
DBPRINT(sc, BCE_VERBOSE_SPECIAL,
|
||||
"No management firmware running...\n");
|
||||
goto bce_mgmt_init_locked_exit;
|
||||
}
|
||||
|
||||
ifp = sc->bce_ifp;
|
||||
|
||||
/* Check if the driver is still running and bail out if it is. */
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
|
||||
goto bce_mgmt_init_locked_exit;
|
||||
|
||||
/* 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);
|
||||
|
||||
/* Enable all critical blocks in the MAC. */
|
||||
REG_WR(sc, BCE_MISC_ENABLE_SET_BITS,
|
||||
BCE_MISC_ENABLE_SET_BITS_RX_V2P_ENABLE |
|
||||
BCE_MISC_ENABLE_SET_BITS_RX_DMA_ENABLE |
|
||||
BCE_MISC_ENABLE_SET_BITS_COMPLETION_ENABLE);
|
||||
REG_WR(sc, BCE_MISC_ENABLE_SET_BITS, 0x5ffffff);
|
||||
REG_RD(sc, BCE_MISC_ENABLE_SET_BITS);
|
||||
DELAY(20);
|
||||
|
||||
@ -4943,11 +4975,9 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
struct mii_data *mii;
|
||||
int mask, error = 0;
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
|
||||
|
||||
switch(command) {
|
||||
|
||||
/* Set the MTU. */
|
||||
/* Set the interface MTU. */
|
||||
case SIOCSIFMTU:
|
||||
/* Check that the MTU setting is supported. */
|
||||
if ((ifr->ifr_mtu < BCE_MIN_MTU) ||
|
||||
@ -4956,7 +4986,9 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
}
|
||||
|
||||
DBPRINT(sc, BCE_INFO, "Setting new MTU of %d\n", ifr->ifr_mtu);
|
||||
DBPRINT(sc, BCE_INFO_MISC,
|
||||
"SIOCSIFMTU: Changing MTU from %d to %d\n",
|
||||
(int) ifp->if_mtu, (int) ifr->ifr_mtu);
|
||||
|
||||
BCE_LOCK(sc);
|
||||
ifp->if_mtu = ifr->ifr_mtu;
|
||||
@ -4965,25 +4997,32 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
BCE_UNLOCK(sc);
|
||||
break;
|
||||
|
||||
/* Set interface. */
|
||||
/* Set interface flags. */
|
||||
case SIOCSIFFLAGS:
|
||||
DBPRINT(sc, BCE_VERBOSE, "Received SIOCSIFFLAGS\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_SPECIAL, "Received SIOCSIFFLAGS\n");
|
||||
|
||||
BCE_LOCK(sc);
|
||||
|
||||
/* Check if the interface is up. */
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
/* Change the promiscuous/multicast flags as necessary. */
|
||||
/* Change promiscuous/multicast flags as necessary. */
|
||||
bce_set_rx_mode(sc);
|
||||
} else {
|
||||
/* Start the HW */
|
||||
bce_init_locked(sc);
|
||||
}
|
||||
} else {
|
||||
/* The interface is down. Check if the driver is running. */
|
||||
/* The interface is down, check if driver is running. */
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
bce_stop(sc);
|
||||
|
||||
/* If MFW is running, restart the controller a bit. */
|
||||
if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) {
|
||||
bce_reset(sc, BCE_DRV_MSG_CODE_RESET);
|
||||
bce_chipinit(sc);
|
||||
bce_mgmt_init_locked(sc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4995,7 +5034,7 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
/* Add/Delete multicast address */
|
||||
case SIOCADDMULTI:
|
||||
case SIOCDELMULTI:
|
||||
DBPRINT(sc, BCE_VERBOSE, "Received SIOCADDMULTI/SIOCDELMULTI\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_MISC, "Received SIOCADDMULTI/SIOCDELMULTI\n");
|
||||
|
||||
BCE_LOCK(sc);
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
@ -5009,12 +5048,8 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
/* Set/Get Interface media */
|
||||
case SIOCSIFMEDIA:
|
||||
case SIOCGIFMEDIA:
|
||||
DBPRINT(sc, BCE_VERBOSE, "Received SIOCSIFMEDIA/SIOCGIFMEDIA\n");
|
||||
DBPRINT(sc, BCE_VERBOSE_MISC, "Received SIOCSIFMEDIA/SIOCGIFMEDIA\n");
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "bce_phy_flags = 0x%08X\n",
|
||||
sc->bce_phy_flags);
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE, "Copper media set/get\n");
|
||||
mii = device_get_softc(sc->bce_miibus);
|
||||
error = ifmedia_ioctl(ifp, ifr,
|
||||
&mii->mii_media, command);
|
||||
@ -5023,7 +5058,7 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
/* Set interface capability */
|
||||
case SIOCSIFCAP:
|
||||
mask = ifr->ifr_reqcap ^ ifp->if_capenable;
|
||||
DBPRINT(sc, BCE_INFO, "Received SIOCSIFCAP = 0x%08X\n", (u32) mask);
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Received SIOCSIFCAP = 0x%08X\n", (u32) mask);
|
||||
|
||||
#ifdef DEVICE_POLLING
|
||||
if (mask & IFCAP_POLLING) {
|
||||
@ -5115,9 +5150,6 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
|
||||
break;
|
||||
default:
|
||||
DBPRINT(sc, BCE_INFO, "Received unsupported IOCTL: 0x%08X\n",
|
||||
(u32) command);
|
||||
|
||||
/* We don't know how to handle the IOCTL, pass it on. */
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
@ -5126,9 +5158,6 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
#ifdef DEVICE_POLLING
|
||||
bce_ioctl_exit:
|
||||
#endif
|
||||
|
||||
DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
|
||||
|
||||
return(error);
|
||||
}
|
||||
|
||||
@ -5143,10 +5172,6 @@ static void
|
||||
bce_watchdog(struct bce_softc *sc)
|
||||
{
|
||||
|
||||
DBRUN(BCE_VERBOSE_SEND,
|
||||
bce_dump_driver_state(sc);
|
||||
bce_dump_status_block(sc));
|
||||
|
||||
BCE_LOCK_ASSERT(sc);
|
||||
|
||||
if (sc->watchdog_timer == 0 || --sc->watchdog_timer)
|
||||
@ -5162,6 +5187,10 @@ bce_watchdog(struct bce_softc *sc)
|
||||
BCE_PRINTF("%s(%d): Watchdog timeout occurred, resetting!\n",
|
||||
__FILE__, __LINE__);
|
||||
|
||||
DBRUN(BCE_VERBOSE_SEND,
|
||||
bce_dump_driver_state(sc);
|
||||
bce_dump_status_block(sc));
|
||||
|
||||
/* DBRUN(BCE_FATAL, bce_breakpoint(sc)); */
|
||||
|
||||
sc->bce_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||
@ -5262,7 +5291,7 @@ bce_intr(void *xsc)
|
||||
|
||||
#ifdef DEVICE_POLLING
|
||||
if (ifp->if_capenable & IFCAP_POLLING) {
|
||||
DBPRINT(sc, BCE_INFO, "Polling enabled!\n");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Polling enabled!\n");
|
||||
goto bce_intr_exit;
|
||||
}
|
||||
#endif
|
||||
@ -5395,13 +5424,13 @@ bce_set_rx_mode(struct bce_softc *sc)
|
||||
* multicast address filtering.
|
||||
*/
|
||||
if (ifp->if_flags & IFF_PROMISC) {
|
||||
DBPRINT(sc, BCE_INFO, "Enabling promiscuous mode.\n");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Enabling promiscuous mode.\n");
|
||||
|
||||
/* Enable promiscuous mode. */
|
||||
rx_mode |= BCE_EMAC_RX_MODE_PROMISCUOUS;
|
||||
sort_mode |= BCE_RPM_SORT_USER0_PROM_EN;
|
||||
} else if (ifp->if_flags & IFF_ALLMULTI) {
|
||||
DBPRINT(sc, BCE_INFO, "Enabling all multicast mode.\n");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Enabling all multicast mode.\n");
|
||||
|
||||
/* Enable all multicast addresses. */
|
||||
for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
|
||||
@ -5410,7 +5439,7 @@ bce_set_rx_mode(struct bce_softc *sc)
|
||||
sort_mode |= BCE_RPM_SORT_USER0_MC_EN;
|
||||
} else {
|
||||
/* Accept one or more multicast(s). */
|
||||
DBPRINT(sc, BCE_INFO, "Enabling selective multicast mode.\n");
|
||||
DBPRINT(sc, BCE_INFO_MISC, "Enabling selective multicast mode.\n");
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
@ -5430,7 +5459,7 @@ bce_set_rx_mode(struct bce_softc *sc)
|
||||
|
||||
/* Only make changes if the recive mode has actually changed. */
|
||||
if (rx_mode != sc->rx_mode) {
|
||||
DBPRINT(sc, BCE_VERBOSE, "Enabling new receive mode: 0x%08X\n",
|
||||
DBPRINT(sc, BCE_VERBOSE_MISC, "Enabling new receive mode: 0x%08X\n",
|
||||
rx_mode);
|
||||
|
||||
sc->rx_mode = rx_mode;
|
||||
@ -5670,6 +5699,34 @@ bce_stats_update(struct bce_softc *sc)
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Periodic function to notify the bootcode that the driver is still */
|
||||
/* present. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
/****************************************************************************/
|
||||
static void
|
||||
bce_pulse(void *xsc)
|
||||
{
|
||||
struct bce_softc *sc = xsc;
|
||||
u32 msg;
|
||||
|
||||
DBPRINT(sc, BCE_EXCESSIVE_MISC, "pulse\n");
|
||||
|
||||
BCE_LOCK_ASSERT(sc);
|
||||
|
||||
/* Tell the firmware that the driver is still running. */
|
||||
msg = (u32) ++sc->bce_fw_drv_pulse_wr_seq;
|
||||
REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_PULSE_MB, msg);
|
||||
|
||||
/* Schedule the next pulse. */
|
||||
callout_reset(&sc->bce_pulse_callout, hz, bce_pulse, sc);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Periodic function to perform maintenance tasks. */
|
||||
/* */
|
||||
@ -5682,20 +5739,11 @@ bce_tick(void *xsc)
|
||||
struct bce_softc *sc = xsc;
|
||||
struct mii_data *mii;
|
||||
struct ifnet *ifp;
|
||||
u32 msg;
|
||||
|
||||
ifp = sc->bce_ifp;
|
||||
|
||||
BCE_LOCK_ASSERT(sc);
|
||||
|
||||
/* Tell the firmware that the driver is still running. */
|
||||
#ifdef BCE_DEBUG
|
||||
msg = (u32) BCE_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE;
|
||||
#else
|
||||
msg = (u32) ++sc->bce_fw_drv_pulse_wr_seq;
|
||||
#endif
|
||||
REG_WR_IND(sc, sc->bce_shmem_base + BCE_DRV_PULSE_MB, msg);
|
||||
|
||||
/* Update the statistics from the hardware statistics block. */
|
||||
bce_stats_update(sc);
|
||||
|
||||
@ -5703,11 +5751,7 @@ bce_tick(void *xsc)
|
||||
bce_watchdog(sc);
|
||||
|
||||
/* Schedule the next tick. */
|
||||
callout_reset(
|
||||
&sc->bce_stat_ch, /* callout */
|
||||
hz, /* ticks */
|
||||
bce_tick, /* function */
|
||||
sc); /* function argument */
|
||||
callout_reset(&sc->bce_tick_callout, hz, bce_tick, sc);
|
||||
|
||||
/* If link is up already up then we're done. */
|
||||
if (sc->bce_link)
|
||||
@ -5792,7 +5836,35 @@ bce_sysctl_hw_state(SYSCTL_HANDLER_ARGS)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Provides a sysctl interface to allows dumping the RX chain. */
|
||||
/* Allows the bootcode state to be dumped through the sysctl interface. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* 0 for success, positive value for failure. */
|
||||
/****************************************************************************/
|
||||
static int
|
||||
bce_sysctl_bc_state(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_bc_state(sc);
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Provides a sysctl interface to allow dumping the RX chain. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* 0 for success, positive value for failure. */
|
||||
@ -5820,7 +5892,7 @@ bce_sysctl_dump_rx_chain(SYSCTL_HANDLER_ARGS)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Provides a sysctl interface to allows dumping the TX chain. */
|
||||
/* Provides a sysctl interface to allow dumping the TX chain. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* 0 for success, positive value for failure. */
|
||||
@ -5859,13 +5931,13 @@ bce_sysctl_reg_read(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
struct bce_softc *sc;
|
||||
int error;
|
||||
uint32_t val, result;
|
||||
|
||||
u32 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;
|
||||
@ -5876,11 +5948,11 @@ bce_sysctl_reg_read(SYSCTL_HANDLER_ARGS)
|
||||
val = REG_RD_IND(sc, result);
|
||||
BCE_PRINTF("reg 0x%08X = 0x%08X\n", result, val);
|
||||
}
|
||||
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Provides a sysctl interface to allow reading arbitrary PHY registers in */
|
||||
/* the device. DO NOT ENABLE ON PRODUCTION SYSTEMS! */
|
||||
@ -6290,6 +6362,11 @@ bce_add_sysctls(struct bce_softc *sc)
|
||||
(void *)sc, 0,
|
||||
bce_sysctl_hw_state, "I", "Hardware state information");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
|
||||
"bc_state", CTLTYPE_INT | CTLFLAG_RW,
|
||||
(void *)sc, 0,
|
||||
bce_sysctl_bc_state, "I", "Bootcode state information");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO,
|
||||
"dump_rx_chain", CTLTYPE_INT | CTLFLAG_RW,
|
||||
(void *)sc, 0,
|
||||
@ -6612,7 +6689,7 @@ bce_dump_rxbd(struct bce_softc *sc, int idx, struct rx_bd *rxbd)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out a l2_fhdr structure. */
|
||||
/* Prints out a l2_fhdr structure. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
@ -6620,7 +6697,6 @@ bce_dump_rxbd(struct bce_softc *sc, int idx, struct rx_bd *rxbd)
|
||||
static void
|
||||
bce_dump_l2fhdr(struct bce_softc *sc, int idx, struct l2_fhdr *l2fhdr)
|
||||
{
|
||||
|
||||
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,
|
||||
@ -6631,7 +6707,7 @@ bce_dump_l2fhdr(struct bce_softc *sc, int idx, struct l2_fhdr *l2fhdr)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out the tx chain. */
|
||||
/* Prints out the TX chain. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
@ -6655,7 +6731,7 @@ bce_dump_tx_chain(struct bce_softc *sc, int tx_prod, int count)
|
||||
|
||||
BCE_PRINTF("total tx_bd = 0x%08X\n", (u32) TOTAL_TX_BD);
|
||||
|
||||
BCE_PRINTF(""
|
||||
BCE_PRINTF(
|
||||
"----------------------------"
|
||||
" tx_bd data "
|
||||
"----------------------------\n");
|
||||
@ -6675,7 +6751,7 @@ bce_dump_tx_chain(struct bce_softc *sc, int tx_prod, int count)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out the rx chain. */
|
||||
/* Prints out the RX chain. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
@ -6833,7 +6909,7 @@ bce_dump_status_block(struct bce_softc *sc)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out the statistics block. */
|
||||
/* Prints out the statistics block from host memory. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
@ -7226,7 +7302,7 @@ bce_dump_driver_state(struct bce_softc *sc)
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out the hardware state through a summary of important registers, */
|
||||
/* Prints out the hardware state through a summary of important register, */
|
||||
/* followed by a complete register dump. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
@ -7309,6 +7385,47 @@ bce_dump_hw_state(struct bce_softc *sc)
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out the bootcode state. */
|
||||
/* */
|
||||
/* Returns: */
|
||||
/* Nothing. */
|
||||
/****************************************************************************/
|
||||
static void
|
||||
bce_dump_bc_state(struct bce_softc *sc)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
BCE_PRINTF(
|
||||
"----------------------------"
|
||||
" Bootcode State "
|
||||
"----------------------------\n");
|
||||
|
||||
BCE_PRINTF("0x%08X - bootcode version\n", sc->bce_fw_ver);
|
||||
|
||||
val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_BC_RESET_TYPE);
|
||||
BCE_PRINTF("0x%08X - (0x%06X) reset_type\n",
|
||||
val, BCE_BC_RESET_TYPE);
|
||||
|
||||
val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_BC_STATE);
|
||||
BCE_PRINTF("0x%08X - (0x%06X) state\n",
|
||||
val, BCE_BC_STATE);
|
||||
|
||||
val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_BC_CONDITION);
|
||||
BCE_PRINTF("0x%08X - (0x%06X) condition\n",
|
||||
val, BCE_BC_CONDITION);
|
||||
|
||||
val = REG_RD_IND(sc, sc->bce_shmem_base + BCE_BC_STATE_DEBUG_CMD);
|
||||
BCE_PRINTF("0x%08X - (0x%06X) debug_cmd\n",
|
||||
val, BCE_BC_STATE_DEBUG_CMD);
|
||||
|
||||
BCE_PRINTF(
|
||||
"----------------------------"
|
||||
"----------------"
|
||||
"----------------------------\n");
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Prints out the TXP state. */
|
||||
/* */
|
||||
@ -7469,6 +7586,7 @@ bce_breakpoint(struct bce_softc *sc)
|
||||
bce_dump_stats_block(sc);
|
||||
bce_dump_driver_state(sc);
|
||||
bce_dump_hw_state(sc);
|
||||
bce_dump_bc_state(sc);
|
||||
bce_dump_txp_state(sc);
|
||||
bce_dump_rxp_state(sc);
|
||||
bce_dump_tpat_state(sc);
|
||||
@ -7488,3 +7606,4 @@ bce_breakpoint(struct bce_softc *sc)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -106,6 +106,11 @@
|
||||
#define BCE_CP_INTR 0x00000008
|
||||
#define BCE_CP_UNLOAD 0x00000010
|
||||
#define BCE_CP_RESET 0x00000020
|
||||
#define BCE_CP_PHY 0x00000040
|
||||
#define BCE_CP_NVRAM 0x00000080
|
||||
#define BCE_CP_FIRMWARE 0x00000100
|
||||
#define BCE_CP_MISC 0x00400000
|
||||
#define BCE_CP_SPECIAL 0x00800000
|
||||
#define BCE_CP_ALL 0x00FFFFFF
|
||||
|
||||
#define BCE_CP_MASK 0x00FFFFFF
|
||||
@ -148,6 +153,31 @@
|
||||
#define BCE_VERBOSE_RESET (BCE_CP_RESET | BCE_LEVEL_VERBOSE)
|
||||
#define BCE_EXCESSIVE_RESET (BCE_CP_RESET | BCE_LEVEL_EXCESSIVE)
|
||||
|
||||
#define BCE_WARN_PHY (BCE_CP_PHY | BCE_LEVEL_WARN)
|
||||
#define BCE_INFO_PHY (BCE_CP_PHY | BCE_LEVEL_INFO)
|
||||
#define BCE_VERBOSE_PHY (BCE_CP_PHY | BCE_LEVEL_VERBOSE)
|
||||
#define BCE_EXCESSIVE_PHY (BCE_CP_PHY | BCE_LEVEL_EXCESSIVE)
|
||||
|
||||
#define BCE_WARN_NVRAM (BCE_CP_NVRAM | BCE_LEVEL_WARN)
|
||||
#define BCE_INFO_NVRAM (BCE_CP_NVRAM | BCE_LEVEL_INFO)
|
||||
#define BCE_VERBOSE_NVRAM (BCE_CP_NVRAM | BCE_LEVEL_VERBOSE)
|
||||
#define BCE_EXCESSIVE_NVRAM (BCE_CP_NVRAM | BCE_LEVEL_EXCESSIVE)
|
||||
|
||||
#define BCE_WARN_FIRMWARE (BCE_CP_FIRMWARE | BCE_LEVEL_WARN)
|
||||
#define BCE_INFO_FIRMWARE (BCE_CP_FIRMWARE | BCE_LEVEL_INFO)
|
||||
#define BCE_VERBOSE_FIRMWARE (BCE_CP_FIRMWARE | BCE_LEVEL_VERBOSE)
|
||||
#define BCE_EXCESSIVE_FIRMWARE (BCE_CP_FIRMWARE | BCE_LEVEL_EXCESSIVE)
|
||||
|
||||
#define BCE_WARN_MISC (BCE_CP_MISC | BCE_LEVEL_WARN)
|
||||
#define BCE_INFO_MISC (BCE_CP_MISC | BCE_LEVEL_INFO)
|
||||
#define BCE_VERBOSE_MISC (BCE_CP_MISC | BCE_LEVEL_VERBOSE)
|
||||
#define BCE_EXCESSIVE_MISC (BCE_CP_MISC | BCE_LEVEL_EXCESSIVE)
|
||||
|
||||
#define BCE_WARN_SPECIAL (BCE_CP_SPECIAL | BCE_LEVEL_WARN)
|
||||
#define BCE_INFO_SPECIAL (BCE_CP_SPECIAL | BCE_LEVEL_INFO)
|
||||
#define BCE_VERBOSE_SPECIAL (BCE_CP_SPECIAL | BCE_LEVEL_VERBOSE)
|
||||
#define BCE_EXCESSIVE_SPECIAL (BCE_CP_SPECIAL | BCE_LEVEL_EXCESSIVE)
|
||||
|
||||
#define BCE_FATAL (BCE_CP_ALL | BCE_LEVEL_FATAL)
|
||||
#define BCE_WARN (BCE_CP_ALL | BCE_LEVEL_WARN)
|
||||
#define BCE_INFO (BCE_CP_ALL | BCE_LEVEL_INFO)
|
||||
@ -406,6 +436,8 @@ struct flash_spec {
|
||||
#define BCE_DRV_MSG_CODE_PULSE 0x06000000
|
||||
#define BCE_DRV_MSG_CODE_DIAG 0x07000000
|
||||
#define BCE_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000
|
||||
#define BCE_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000
|
||||
#define BCE_DRV_MSG_CODE_CMD_SET_LINK 0x10000000
|
||||
|
||||
#define BCE_DRV_MSG_DATA 0x00ff0000
|
||||
#define BCE_DRV_MSG_DATA_WAIT0 0x00010000
|
||||
@ -647,41 +679,45 @@ struct flash_spec {
|
||||
#define BCE_BC_STATE_RESET_TYPE_VALUE(msg) (BCE_BC_STATE_RESET_TYPE_SIG | \
|
||||
(msg))
|
||||
|
||||
#define BCE_BC_STATE 0x000001c4
|
||||
#define BCE_BC_STATE_ERR_MASK 0x0000ff00
|
||||
#define BCE_BC_STATE_SIGN 0x42530000
|
||||
#define BCE_BC_STATE_SIGN_MASK 0xffff0000
|
||||
#define BCE_BC_STATE_BC1_START (BCE_BC_STATE_SIGN | 0x1)
|
||||
#define BCE_BC_STATE_GET_NVM_CFG1 (BCE_BC_STATE_SIGN | 0x2)
|
||||
#define BCE_BC_STATE_PROG_BAR (BCE_BC_STATE_SIGN | 0x3)
|
||||
#define BCE_BC_STATE_INIT_VID (BCE_BC_STATE_SIGN | 0x4)
|
||||
#define BCE_BC_STATE_GET_NVM_CFG2 (BCE_BC_STATE_SIGN | 0x5)
|
||||
#define BCE_BC_STATE_APPLY_WKARND (BCE_BC_STATE_SIGN | 0x6)
|
||||
#define BCE_BC_STATE_LOAD_BC2 (BCE_BC_STATE_SIGN | 0x7)
|
||||
#define BCE_BC_STATE_GOING_BC2 (BCE_BC_STATE_SIGN | 0x8)
|
||||
#define BCE_BC_STATE_GOING_DIAG (BCE_BC_STATE_SIGN | 0x9)
|
||||
#define BCE_BC_STATE_RT_FINAL_INIT (BCE_BC_STATE_SIGN | 0x81)
|
||||
#define BCE_BC_STATE_RT_WKARND (BCE_BC_STATE_SIGN | 0x82)
|
||||
#define BCE_BC_STATE_RT_DRV_PULSE (BCE_BC_STATE_SIGN | 0x83)
|
||||
#define BCE_BC_STATE_RT_FIOEVTS (BCE_BC_STATE_SIGN | 0x84)
|
||||
#define BCE_BC_STATE_RT_DRV_CMD (BCE_BC_STATE_SIGN | 0x85)
|
||||
#define BCE_BC_STATE_RT_LOW_POWER (BCE_BC_STATE_SIGN | 0x86)
|
||||
#define BCE_BC_STATE_RT_SET_WOL (BCE_BC_STATE_SIGN | 0x87)
|
||||
#define BCE_BC_STATE_RT_OTHER_FW (BCE_BC_STATE_SIGN | 0x88)
|
||||
#define BCE_BC_STATE_RT_GOING_D3 (BCE_BC_STATE_SIGN | 0x89)
|
||||
#define BCE_BC_STATE_ERR_BAD_VERSION (BCE_BC_STATE_SIGN | 0x0100)
|
||||
#define BCE_BC_STATE_ERR_BAD_BC2_CRC (BCE_BC_STATE_SIGN | 0x0200)
|
||||
#define BCE_BC_STATE_ERR_BC1_LOOP (BCE_BC_STATE_SIGN | 0x0300)
|
||||
#define BCE_BC_STATE_ERR_UNKNOWN_CMD (BCE_BC_STATE_SIGN | 0x0400)
|
||||
#define BCE_BC_STATE_ERR_DRV_DEAD (BCE_BC_STATE_SIGN | 0x0500)
|
||||
#define BCE_BC_STATE_ERR_NO_RXP (BCE_BC_STATE_SIGN | 0x0600)
|
||||
#define BCE_BC_STATE_ERR_TOO_MANY_RBUF (BCE_BC_STATE_SIGN | 0x0700)
|
||||
#define BCE_BC_RESET_TYPE 0x000001c0
|
||||
|
||||
#define BCE_BC_STATE_DEBUG_CMD 0x1dc
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_SIGNATURE 0x42440000
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_SIGNATURE_MASK 0xffff0000
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_LOOP_CNT_MASK 0xffff
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_LOOP_INFINITE 0xffff
|
||||
#define BCE_BC_STATE 0x000001c4
|
||||
#define BCE_BC_STATE_ERR_MASK 0x0000ff00
|
||||
#define BCE_BC_STATE_SIGN 0x42530000
|
||||
#define BCE_BC_STATE_SIGN_MASK 0xffff0000
|
||||
#define BCE_BC_STATE_BC1_START (BCE_BC_STATE_SIGN | 0x1)
|
||||
#define BCE_BC_STATE_GET_NVM_CFG1 (BCE_BC_STATE_SIGN | 0x2)
|
||||
#define BCE_BC_STATE_PROG_BAR (BCE_BC_STATE_SIGN | 0x3)
|
||||
#define BCE_BC_STATE_INIT_VID (BCE_BC_STATE_SIGN | 0x4)
|
||||
#define BCE_BC_STATE_GET_NVM_CFG2 (BCE_BC_STATE_SIGN | 0x5)
|
||||
#define BCE_BC_STATE_APPLY_WKARND (BCE_BC_STATE_SIGN | 0x6)
|
||||
#define BCE_BC_STATE_LOAD_BC2 (BCE_BC_STATE_SIGN | 0x7)
|
||||
#define BCE_BC_STATE_GOING_BC2 (BCE_BC_STATE_SIGN | 0x8)
|
||||
#define BCE_BC_STATE_GOING_DIAG (BCE_BC_STATE_SIGN | 0x9)
|
||||
#define BCE_BC_STATE_RT_FINAL_INIT (BCE_BC_STATE_SIGN | 0x81)
|
||||
#define BCE_BC_STATE_RT_WKARND (BCE_BC_STATE_SIGN | 0x82)
|
||||
#define BCE_BC_STATE_RT_DRV_PULSE (BCE_BC_STATE_SIGN | 0x83)
|
||||
#define BCE_BC_STATE_RT_FIOEVTS (BCE_BC_STATE_SIGN | 0x84)
|
||||
#define BCE_BC_STATE_RT_DRV_CMD (BCE_BC_STATE_SIGN | 0x85)
|
||||
#define BCE_BC_STATE_RT_LOW_POWER (BCE_BC_STATE_SIGN | 0x86)
|
||||
#define BCE_BC_STATE_RT_SET_WOL (BCE_BC_STATE_SIGN | 0x87)
|
||||
#define BCE_BC_STATE_RT_OTHER_FW (BCE_BC_STATE_SIGN | 0x88)
|
||||
#define BCE_BC_STATE_RT_GOING_D3 (BCE_BC_STATE_SIGN | 0x89)
|
||||
#define BCE_BC_STATE_ERR_BAD_VERSION (BCE_BC_STATE_SIGN | 0x0100)
|
||||
#define BCE_BC_STATE_ERR_BAD_BC2_CRC (BCE_BC_STATE_SIGN | 0x0200)
|
||||
#define BCE_BC_STATE_ERR_BC1_LOOP (BCE_BC_STATE_SIGN | 0x0300)
|
||||
#define BCE_BC_STATE_ERR_UNKNOWN_CMD (BCE_BC_STATE_SIGN | 0x0400)
|
||||
#define BCE_BC_STATE_ERR_DRV_DEAD (BCE_BC_STATE_SIGN | 0x0500)
|
||||
#define BCE_BC_STATE_ERR_NO_RXP (BCE_BC_STATE_SIGN | 0x0600)
|
||||
#define BCE_BC_STATE_ERR_TOO_MANY_RBUF (BCE_BC_STATE_SIGN | 0x0700)
|
||||
|
||||
#define BCE_BC_CONDITION 0x000001c8
|
||||
|
||||
#define BCE_BC_STATE_DEBUG_CMD 0x1dc
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_SIGNATURE 0x42440000
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_SIGNATURE_MASK 0xffff0000
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_LOOP_CNT_MASK 0xffff
|
||||
#define BCE_BC_STATE_BC_DBG_CMD_LOOP_INFINITE 0xffff
|
||||
|
||||
#define HOST_VIEW_SHMEM_BASE 0x167c00
|
||||
|
||||
@ -4468,7 +4504,7 @@ 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_BITS PAGE_SHIFT
|
||||
#define BCM_PAGE_SIZE PAGE_SIZE
|
||||
|
||||
#define TX_PAGES 2
|
||||
@ -4681,23 +4717,23 @@ struct bce_softc
|
||||
|
||||
/* General controller flags. */
|
||||
u32 bce_flags;
|
||||
#define BCE_PCIX_FLAG 0x01
|
||||
#define BCE_PCI_32BIT_FLAG 0x02
|
||||
#define BCE_ONE_TDMA_FLAG 0x04 /* Deprecated */
|
||||
#define BCE_NO_WOL_FLAG 0x08
|
||||
#define BCE_USING_DAC_FLAG 0x10
|
||||
#define BCE_USING_MSI_FLAG 0x20
|
||||
#define BCE_MFW_ENABLE_FLAG 0x40 /* Management F/W is enabled */
|
||||
#define BCE_PCIX_FLAG 0x00000001
|
||||
#define BCE_PCI_32BIT_FLAG 0x00000002
|
||||
#define BCE_ONE_TDMA_FLAG 0x00000004 /* Deprecated */
|
||||
#define BCE_NO_WOL_FLAG 0x00000008
|
||||
#define BCE_USING_DAC_FLAG 0x00000010
|
||||
#define BCE_USING_MSI_FLAG 0x00000020
|
||||
#define BCE_MFW_ENABLE_FLAG 0x00000040
|
||||
|
||||
/* PHY specific flags. */
|
||||
u32 bce_phy_flags;
|
||||
#define BCE_PHY_SERDES_FLAG 0x001
|
||||
#define BCE_PHY_CRC_FIX_FLAG 0x002
|
||||
#define BCE_PHY_PARALLEL_DETECT_FLAG 0x004
|
||||
#define BCE_PHY_2_5G_CAPABLE_FLAG 0x008
|
||||
#define BCE_PHY_INT_MODE_MASK_FLAG 0x300
|
||||
#define BCE_PHY_INT_MODE_AUTO_POLLING_FLAG 0x100
|
||||
#define BCE_PHY_INT_MODE_LINK_READY_FLAG 0x200
|
||||
#define BCE_PHY_SERDES_FLAG 0x00000001
|
||||
#define BCE_PHY_CRC_FIX_FLAG 0x00000002
|
||||
#define BCE_PHY_PARALLEL_DETECT_FLAG 0x00000004
|
||||
#define BCE_PHY_2_5G_CAPABLE_FLAG 0x00000008
|
||||
#define BCE_PHY_INT_MODE_MASK_FLAG 0x00000300
|
||||
#define BCE_PHY_INT_MODE_AUTO_POLLING_FLAG 0x00000100
|
||||
#define BCE_PHY_INT_MODE_LINK_READY_FLAG 0x00000200
|
||||
|
||||
/* Values that need to be shared with the PHY driver. */
|
||||
u32 bce_shared_hw_cfg;
|
||||
@ -4763,7 +4799,8 @@ struct bce_softc
|
||||
u32 tx_prod_bseq; /* Counts the bytes used. */
|
||||
|
||||
int bce_link;
|
||||
struct callout bce_stat_ch;
|
||||
struct callout bce_tick_callout;
|
||||
struct callout bce_pulse_callout;
|
||||
|
||||
int watchdog_timer; /* ticks until chip reset */
|
||||
|
||||
@ -4913,3 +4950,4 @@ struct bce_softc
|
||||
};
|
||||
|
||||
#endif /* #ifndef _BCE_H_DEFINED */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user