X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/fd1d9b77699626016ec835dd15e9fc27c54ecbca..03df8a20d5501cf38f868e9a3c5f25167023b335:/sys/dev/netif/de/if_de.c diff --git a/sys/dev/netif/de/if_de.c b/sys/dev/netif/de/if_de.c index 94e202e9f3..a6ff7c8dea 100644 --- a/sys/dev/netif/de/if_de.c +++ b/sys/dev/netif/de/if_de.c @@ -1,7 +1,7 @@ /* $NetBSD: if_de.c,v 1.86 1999/06/01 19:17:59 thorpej Exp $ */ /* $FreeBSD: src/sys/pci/if_de.c,v 1.123.2.4 2000/08/04 23:25:09 peter Exp $ */ -/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.23 2005/02/21 04:58:34 joerg Exp $ */ +/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.39 2005/06/20 15:10:40 joerg Exp $ */ /*- * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com) @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include #include @@ -93,63 +93,53 @@ #define TULIP_IOMAPPED #endif -#if 0 -/* - * This turns on all sort of debugging stuff and make the - * driver much larger. - */ -#define TULIP_DEBUG -#endif - -#if 0 -#define TULIP_PERFSTATS -#endif - #define TULIP_HZ 10 #include "if_devar.h" +static tulip_softc_t *tulips[TULIP_MAX_DEVICES]; + /* * This module supports * the DEC 21040 PCI Ethernet Controller. * the DEC 21041 PCI Ethernet Controller. * the DEC 21140 PCI Fast Ethernet Controller. */ -static void tulip_mii_autonegotiate(tulip_softc_t * const sc, const unsigned phyaddr); -static void tulip_intr_shared(void *arg); -static void tulip_intr_normal(void *arg); -static void tulip_init(tulip_softc_t * const sc); -static void tulip_reset(tulip_softc_t * const sc); -static void tulip_ifstart(struct ifnet *ifp); -static struct mbuf *tulip_txput(tulip_softc_t * const sc, struct mbuf *m); -static void tulip_txput_setup(tulip_softc_t * const sc); -static void tulip_rx_intr(tulip_softc_t * const sc); -static void tulip_addr_filter(tulip_softc_t * const sc); -static unsigned tulip_mii_readreg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno); -static void tulip_mii_writereg(tulip_softc_t * const sc, unsigned devaddr, unsigned regno, unsigned data); -static int tulip_mii_map_abilities(tulip_softc_t * const sc, unsigned abilities); -static tulip_media_t tulip_mii_phy_readspecific(tulip_softc_t * const sc); -static int tulip_srom_decode(tulip_softc_t * const sc); -static int tulip_ifmedia_change(struct ifnet * const ifp); -static void tulip_ifmedia_status(struct ifnet * const ifp, struct ifmediareq *req); +static void tulip_mii_autonegotiate(tulip_softc_t *, u_int); +static void tulip_intr_shared(void *); +static void tulip_intr_normal(void *); +static void tulip_init(tulip_softc_t *); +static void tulip_reset(tulip_softc_t *); +static void tulip_ifstart(struct ifnet *); +static struct mbuf *tulip_txput(tulip_softc_t *, struct mbuf *); +static void tulip_txput_setup(tulip_softc_t *); +static void tulip_rx_intr(tulip_softc_t *); +static void tulip_addr_filter(tulip_softc_t *); +static u_int tulip_mii_readreg(tulip_softc_t *, u_int, u_int); +static void tulip_mii_writereg(tulip_softc_t *, u_int, u_int, u_int); +static int tulip_mii_map_abilities(tulip_softc_t * const sc, unsigned abilities); +static tulip_media_t tulip_mii_phy_readspecific(tulip_softc_t *); +static int tulip_srom_decode(tulip_softc_t *); +static int tulip_ifmedia_change(struct ifnet *); +static void tulip_ifmedia_status(struct ifnet *, struct ifmediareq *); /* static void tulip_21140_map_media(tulip_softc_t *sc); */ - + static void -tulip_timeout_callback( - void *arg) +tulip_timeout_callback(void *arg) { - tulip_softc_t * const sc = arg; - int s = splimp(); + tulip_softc_t *sc = arg; + + crit_enter(); sc->tulip_flags &= ~TULIP_TIMEOUTPENDING; sc->tulip_probe_timeout -= 1000 / TULIP_HZ; (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_TIMER); - splx(s); + + crit_exit(); } static void -tulip_timeout( - tulip_softc_t * const sc) +tulip_timeout(tulip_softc_t *sc) { if (sc->tulip_flags & TULIP_TIMEOUTPENDING) return; @@ -158,33 +148,8 @@ tulip_timeout( tulip_timeout_callback, sc); } -#if defined(TULIP_NEED_FASTTIMEOUT) -static void -tulip_fasttimeout_callback( - void *arg) -{ - tulip_softc_t * const sc = arg; - int s = splimp(); - - sc->tulip_flags &= ~TULIP_FASTTIMEOUTPENDING; - (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_FASTTIMER); - splx(s); -} - -static void -tulip_fasttimeout( - tulip_softc_t * const sc) -{ - if (sc->tulip_flags & TULIP_FASTTIMEOUTPENDING) - return; - sc->tulip_flags |= TULIP_FASTTIMEOUTPENDING; - callout_reset(&sc->tulip_fast_timer, 1, tulip_fasttimeout_callback, sc); -} -#endif - static int -tulip_txprobe( - tulip_softc_t * const sc) +tulip_txprobe(tulip_softc_t *sc) { struct mbuf *m; /* @@ -220,7 +185,7 @@ tulip_txprobe( sc->tulip_probe.probe_txprobes++; return 1; } - + #ifdef BIG_PACKET #define TULIP_SIAGEN_WATCHDOG (sc->tulip_if.if_mtu > ETHERMTU ? TULIP_WATCHDOG_RXDISABLE|TULIP_WATCHDOG_TXDISABLE : 0) #else @@ -228,9 +193,7 @@ tulip_txprobe( #endif static void -tulip_media_set( - tulip_softc_t * const sc, - tulip_media_t media) +tulip_media_set(tulip_softc_t *sc, tulip_media_t media) { const tulip_media_info_t *mi = sc->tulip_mediums[media]; @@ -320,11 +283,9 @@ tulip_media_set( } } } - + static void -tulip_linkup( - tulip_softc_t * const sc, - tulip_media_t media) +tulip_linkup(tulip_softc_t *sc, tulip_media_t media) { if ((sc->tulip_flags & TULIP_LINKUP) == 0) sc->tulip_flags |= TULIP_PRINTLINKUP; @@ -344,9 +305,6 @@ tulip_linkup( } #endif if (sc->tulip_media != media) { -#ifdef TULIP_DEBUG - sc->tulip_dbg.dbg_last_media = sc->tulip_media; -#endif sc->tulip_media = media; sc->tulip_flags |= TULIP_PRINTMEDIA; if (TULIP_IS_MEDIA_FD(sc->tulip_media)) { @@ -374,28 +332,25 @@ tulip_linkup( } tulip_init(sc); } - + static void -tulip_media_print( - tulip_softc_t * const sc) +tulip_media_print(tulip_softc_t *sc) { if ((sc->tulip_flags & TULIP_LINKUP) == 0) return; if (sc->tulip_flags & TULIP_PRINTMEDIA) { - printf("%s%d: enabling %s port\n", - sc->tulip_name, sc->tulip_unit, - tulip_mediums[sc->tulip_media]); + if_printf(&sc->tulip_if, "enabling %s port\n", + tulip_mediums[sc->tulip_media]); sc->tulip_flags &= ~(TULIP_PRINTMEDIA|TULIP_PRINTLINKUP); } else if (sc->tulip_flags & TULIP_PRINTLINKUP) { - printf("%s%d: link up\n", sc->tulip_name, sc->tulip_unit); + if_printf(&sc->tulip_if, "link up\n"); sc->tulip_flags &= ~TULIP_PRINTLINKUP; } } - + #if defined(TULIP_DO_GPR_SENSE) static tulip_media_t -tulip_21140_gpr_media_sense( - tulip_softc_t * const sc) +tulip_21140_gpr_media_sense(tulip_softc_t *sc) { tulip_media_t maybe_media = TULIP_MEDIA_UNKNOWN; tulip_media_t last_media = TULIP_MEDIA_UNKNOWN; @@ -433,12 +388,6 @@ tulip_21140_gpr_media_sense( if ((TULIP_CSR_READ(sc, csr_gp) & mi->mi_actmask) != mi->mi_actdata) continue; -#if defined(TULIP_DEBUG) - printf("%s%d: gpr_media_sense: %s: 0x%02x & 0x%02x == 0x%02x\n", - sc->tulip_name, sc->tulip_unit, tulip_mediums[media], - TULIP_CSR_READ(sc, csr_gp) & 0xFF, - mi->mi_actmask, mi->mi_actdata); -#endif /* * It does! If this is the first media we detected, then * remember this media. If isn't the first, then there were @@ -454,16 +403,15 @@ tulip_21140_gpr_media_sense( return (last_media != TULIP_MEDIA_UNKNOWN) ? last_media : maybe_media; } #endif /* TULIP_DO_GPR_SENSE */ - + static tulip_link_status_t -tulip_media_link_monitor( - tulip_softc_t * const sc) +tulip_media_link_monitor(tulip_softc_t *sc) { - const tulip_media_info_t * const mi = sc->tulip_mediums[sc->tulip_media]; + const tulip_media_info_t *mi = sc->tulip_mediums[sc->tulip_media]; tulip_link_status_t linkup = TULIP_LINK_DOWN; if (mi == NULL) { -#if defined(DIAGNOSTIC) || defined(TULIP_DEBUG) +#if defined(DIAGNOSTIC) panic("tulip_media_link_monitor: %s: botch at line %d\n", tulip_mediums[sc->tulip_media],__LINE__); #endif @@ -496,11 +444,6 @@ tulip_media_link_monitor( u_int32_t abilities = tulip_mii_readreg(sc, sc->tulip_phyaddr, PHYREG_AUTONEG_ABILITIES); abilities = (abilities << 6) & status; if (abilities != sc->tulip_abilities) { -#if defined(TULIP_DEBUG) - loudprintf("%s%d(phy%d): autonegotiation changed: 0x%04x -> 0x%04x\n", - sc->tulip_name, sc->tulip_unit, sc->tulip_phyaddr, - sc->tulip_abilities, abilities); -#endif if (tulip_mii_map_abilities(sc, abilities)) { tulip_linkup(sc, sc->tulip_probe_media); return TULIP_LINK_UP; @@ -538,11 +481,6 @@ tulip_media_link_monitor( return TULIP_LINK_UNKNOWN; if ((TULIP_CSR_READ(sc, csr_sia_status) & TULIP_SIASTS_LINKFAIL) == 0) linkup = TULIP_LINK_UP; -#if defined(TULIP_DEBUG) - if (sc->tulip_probe_timeout <= 0) - printf("%s%d: sia status = 0x%08x\n", sc->tulip_name, - sc->tulip_unit, TULIP_CSR_READ(sc, csr_sia_status)); -#endif } else if (mi->mi_type == TULIP_MEDIAINFO_SYM) { return TULIP_LINK_UNKNOWN; } @@ -556,22 +494,14 @@ tulip_media_link_monitor( return TULIP_LINK_UP; sc->tulip_flags &= ~TULIP_LINKUP; - printf("%s%d: link down: cable problem?\n", sc->tulip_name, sc->tulip_unit); + if_printf(&sc->tulip_if, "link down: cable problem?\n"); } -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_link_downed++; -#endif return TULIP_LINK_DOWN; } - + static void -tulip_media_poll( - tulip_softc_t * const sc, - tulip_mediapoll_event_t event) +tulip_media_poll(tulip_softc_t *sc, tulip_mediapoll_event_t event) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_events[event]++; -#endif if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE && event == TULIP_MEDIAPOLL_TIMER) { switch (tulip_media_link_monitor(sc)) { @@ -601,18 +531,12 @@ tulip_media_poll( if (event == TULIP_MEDIAPOLL_LINKFAIL) { if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE) { if (TULIP_DO_AUTOSENSE(sc)) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_link_failures++; -#endif sc->tulip_media = TULIP_MEDIA_UNKNOWN; if (sc->tulip_if.if_flags & IFF_UP) tulip_reset(sc); /* restart probe */ } return; } -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_link_pollintrs++; -#endif } if (event == TULIP_MEDIAPOLL_START) { @@ -621,9 +545,6 @@ tulip_media_poll( return; sc->tulip_probe_mediamask = 0; sc->tulip_probe_passes = 0; -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_media_probes++; -#endif /* * If the SROM contained an explicit media to use, use it. */ @@ -666,10 +587,6 @@ tulip_media_poll( if (event == TULIP_MEDIAPOLL_LINKPASS) { /* XXX Check media status just to be sure */ sc->tulip_probe_media = TULIP_MEDIA_10BASET; -#if defined(TULIP_DEBUG) - } else { - sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++; -#endif } tulip_linkup(sc, sc->tulip_probe_media); tulip_timeout(sc); @@ -686,10 +603,6 @@ tulip_media_poll( */ if (sc->tulip_probe_timeout > 0) { tulip_media_t new_probe_media = tulip_21140_gpr_media_sense(sc); -#if defined(TULIP_DEBUG) - printf("%s%d: media_poll: gpr sensing = %s\n", - sc->tulip_name, sc->tulip_unit, tulip_mediums[new_probe_media]); -#endif if (new_probe_media != TULIP_MEDIA_UNKNOWN) { if (new_probe_media == sc->tulip_probe_media) { if (--sc->tulip_probe_count == 0) @@ -752,7 +665,7 @@ tulip_media_poll( return; } default: { -#if defined(DIAGNOSTIC) || defined(TULIP_DEBUG) +#if defined(DIAGNOSTIC) panic("tulip_media_poll: botch at line %d\n", __LINE__); #endif break; @@ -761,9 +674,6 @@ tulip_media_poll( } if (event == TULIP_MEDIAPOLL_TXPROBE_FAILED) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_txprobes_failed[sc->tulip_probe_media]++; -#endif sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE; return; } @@ -772,13 +682,6 @@ tulip_media_poll( * switch to another media if we tried this one enough. */ if (/* event == TULIP_MEDIAPOLL_TXPROBE_FAILED || */ sc->tulip_probe_timeout <= 0) { -#if defined(TULIP_DEBUG) - if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) { - printf("%s%d: poll media unknown!\n", - sc->tulip_name, sc->tulip_unit); - sc->tulip_probe_media = TULIP_MEDIA_MAX; - } -#endif /* * Find the next media type to check for. Full Duplex * types are not allowed. @@ -787,8 +690,7 @@ tulip_media_poll( sc->tulip_probe_media -= 1; if (sc->tulip_probe_media == TULIP_MEDIA_UNKNOWN) { if (++sc->tulip_probe_passes == 3) { - printf("%s%d: autosense failed: cable problem?\n", - sc->tulip_name, sc->tulip_unit); + if_printf(&sc->tulip_if, "autosense failed: cable problem?\n"); if ((sc->tulip_if.if_flags & IFF_UP) == 0) { sc->tulip_if.if_flags &= ~IFF_RUNNING; sc->tulip_probe_state = TULIP_PROBE_INACTIVE; @@ -803,11 +705,6 @@ tulip_media_poll( || (sc->tulip_probe_mediamask & TULIP_BIT(sc->tulip_probe_media)) || TULIP_IS_MEDIA_FD(sc->tulip_probe_media)); -#if defined(TULIP_DEBUG) - printf("%s%d: %s: probing %s\n", sc->tulip_name, sc->tulip_unit, - event == TULIP_MEDIAPOLL_TXPROBE_FAILED ? "txprobe failed" : "timeout", - tulip_mediums[sc->tulip_probe_media]); -#endif sc->tulip_probe_timeout = TULIP_IS_MEDIA_TP(sc->tulip_probe_media) ? 2500 : 1000; sc->tulip_probe_state = TULIP_PROBE_MEDIATEST; sc->tulip_probe.probe_txprobes = 0; @@ -853,10 +750,9 @@ tulip_media_poll( */ tulip_txprobe(sc); } - + static void -tulip_media_select( - tulip_softc_t * const sc) +tulip_media_select(tulip_softc_t *sc) { if (sc->tulip_features & TULIP_HAVE_GPR) { TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET|sc->tulip_gpinit); @@ -876,11 +772,9 @@ tulip_media_select( tulip_media_set(sc, sc->tulip_media); } } - + static void -tulip_21040_mediainfo_init( - tulip_softc_t * const sc, - tulip_media_t media) +tulip_21040_mediainfo_init(tulip_softc_t *sc, tulip_media_t media) { sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_THRSHLD160 |TULIP_CMD_BACKOFFCTR; @@ -902,16 +796,13 @@ tulip_21040_mediainfo_init( } static void -tulip_21040_media_probe( - tulip_softc_t * const sc) +tulip_21040_media_probe(tulip_softc_t *sc) { tulip_21040_mediainfo_init(sc, TULIP_MEDIA_UNKNOWN); - return; } static void -tulip_21040_10baset_only_media_probe( - tulip_softc_t * const sc) +tulip_21040_10baset_only_media_probe(tulip_softc_t *sc) { tulip_21040_mediainfo_init(sc, TULIP_MEDIA_10BASET); tulip_media_set(sc, TULIP_MEDIA_10BASET); @@ -919,8 +810,7 @@ tulip_21040_10baset_only_media_probe( } static void -tulip_21040_10baset_only_media_select( - tulip_softc_t * const sc) +tulip_21040_10baset_only_media_select(tulip_softc_t *sc) { sc->tulip_flags |= TULIP_LINKUP; if (sc->tulip_media == TULIP_MEDIA_10BASET_FD) { @@ -934,8 +824,7 @@ tulip_21040_10baset_only_media_select( } static void -tulip_21040_auibnc_only_media_probe( - tulip_softc_t * const sc) +tulip_21040_auibnc_only_media_probe(tulip_softc_t *sc) { tulip_21040_mediainfo_init(sc, TULIP_MEDIA_AUIBNC); sc->tulip_flags |= TULIP_SQETEST|TULIP_LINKUP; @@ -944,8 +833,7 @@ tulip_21040_auibnc_only_media_probe( } static void -tulip_21040_auibnc_only_media_select( - tulip_softc_t * const sc) +tulip_21040_auibnc_only_media_select(tulip_softc_t *sc) { tulip_media_set(sc, TULIP_MEDIA_AUIBNC); sc->tulip_cmdmode &= ~TULIP_CMD_FULLDUPLEX; @@ -971,12 +859,11 @@ static const tulip_boardsw_t tulip_21040_auibnc_only_boardsw = { tulip_21040_auibnc_only_media_select, NULL, }; - + static void -tulip_21041_mediainfo_init( - tulip_softc_t * const sc) +tulip_21041_mediainfo_init(tulip_softc_t *sc) { - tulip_media_info_t * const mi = sc->tulip_mediainfo; + tulip_media_info_t *mi = sc->tulip_mediainfo; #ifdef notyet if (sc->tulip_revinfo >= 0x20) { @@ -992,10 +879,9 @@ tulip_21041_mediainfo_init( TULIP_MEDIAINFO_SIA_INIT(sc, &mi[2], 21041, AUI); TULIP_MEDIAINFO_SIA_INIT(sc, &mi[3], 21041, BNC); } - + static void -tulip_21041_media_probe( - tulip_softc_t * const sc) +tulip_21041_media_probe(tulip_softc_t *sc) { sc->tulip_if.if_baudrate = 10000000; sc->tulip_cmdmode |= TULIP_CMD_CAPTREFFCT|TULIP_CMD_ENHCAPTEFFCT @@ -1005,15 +891,9 @@ tulip_21041_media_probe( } static void -tulip_21041_media_poll( - tulip_softc_t * const sc, - const tulip_mediapoll_event_t event) +tulip_21041_media_poll(tulip_softc_t *sc, tulip_mediapoll_event_t event) { - u_int32_t sia_status; - -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_events[event]++; -#endif + uint32_t sia_status; if (event == TULIP_MEDIAPOLL_LINKFAIL) { if (sc->tulip_probe_state != TULIP_PROBE_INACTIVE @@ -1050,9 +930,6 @@ tulip_21041_media_poll( return; if (event == TULIP_MEDIAPOLL_TXPROBE_OK) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_txprobes_ok[sc->tulip_probe_media]++; -#endif tulip_linkup(sc, sc->tulip_probe_media); return; } @@ -1133,8 +1010,7 @@ tulip_21041_media_poll( sc->tulip_flags &= ~TULIP_WANTRXACT; sc->tulip_probe_timeout = TULIP_21041_PROBE_AUIBNC_TIMEOUT; } else { - printf("%s%d: autosense failed: cable problem?\n", - sc->tulip_name, sc->tulip_unit); + if_printf(&sc->tulip_if, "autosense failed: cable problem?\n"); if ((sc->tulip_if.if_flags & IFF_UP) == 0) { sc->tulip_if.if_flags &= ~IFF_RUNNING; sc->tulip_probe_state = TULIP_PROBE_INACTIVE; @@ -1164,16 +1040,13 @@ static const tulip_boardsw_t tulip_21041_boardsw = { tulip_media_select, tulip_21041_media_poll }; - + static const tulip_phy_attr_t tulip_mii_phy_attrlist[] = { { 0x20005c00, 0, /* 08-00-17 */ { { 0x19, 0x0040, 0x0040 }, /* 10TX */ { 0x19, 0x0040, 0x0000 }, /* 100TX */ }, -#if defined(TULIP_DEBUG) - "NS DP83840", -#endif }, { 0x0281F400, 0, /* 00-A0-7D */ { @@ -1182,9 +1055,6 @@ static const tulip_phy_attr_t tulip_mii_phy_attrlist[] = { { 0x12, 0x0010, 0x0010 }, /* 100T4 */ { 0x12, 0x0008, 0x0008 }, /* FULL_DUPLEX */ }, -#if defined(TULIP_DEBUG) - "Seeq 80C240" -#endif }, #if 0 { 0x0015F420, 0, /* 00-A0-7D */ @@ -1194,9 +1064,6 @@ static const tulip_phy_attr_t tulip_mii_phy_attrlist[] = { { 0x12, 0x0010, 0x0010 }, /* 100T4 */ { 0x12, 0x0008, 0x0008 }, /* FULL_DUPLEX */ }, -#if defined(TULIP_DEBUG) - "Broadcom BCM5000" -#endif }, #endif { 0x0281F400, 0, /* 00-A0-BE */ @@ -1206,16 +1073,12 @@ static const tulip_phy_attr_t tulip_mii_phy_attrlist[] = { { }, /* 100T4 */ { 0x11, 0x4000, 0x4000 }, /* FULL_DUPLEX */ }, -#if defined(TULIP_DEBUG) - "ICS 1890" -#endif }, { 0 } }; - + static tulip_media_t -tulip_mii_phy_readspecific( - tulip_softc_t * const sc) +tulip_mii_phy_readspecific(tulip_softc_t *sc) { const tulip_phy_attr_t *attr; u_int16_t data; @@ -1249,40 +1112,38 @@ tulip_mii_phy_readspecific( } if (attr->attr_modes[PHY_MODE_100TX].pm_regno) { - const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_100TX]; + const tulip_phy_modedata_t *pm = &attr->attr_modes[PHY_MODE_100TX]; data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno); if ((data & pm->pm_mask) == pm->pm_value) idx = 2; } if (idx == 0 && attr->attr_modes[PHY_MODE_100T4].pm_regno) { - const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_100T4]; + const tulip_phy_modedata_t *pm = &attr->attr_modes[PHY_MODE_100T4]; data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno); if ((data & pm->pm_mask) == pm->pm_value) idx = 3; } if (idx == 0 && attr->attr_modes[PHY_MODE_10T].pm_regno) { - const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_10T]; + const tulip_phy_modedata_t *pm = &attr->attr_modes[PHY_MODE_10T]; data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno); if ((data & pm->pm_mask) == pm->pm_value) idx = 1; } if (idx != 0 && attr->attr_modes[PHY_MODE_FULLDUPLEX].pm_regno) { - const tulip_phy_modedata_t * const pm = &attr->attr_modes[PHY_MODE_FULLDUPLEX]; + const tulip_phy_modedata_t *pm = &attr->attr_modes[PHY_MODE_FULLDUPLEX]; data = tulip_mii_readreg(sc, sc->tulip_phyaddr, pm->pm_regno); idx += ((data & pm->pm_mask) == pm->pm_value ? 4 : 0); } return table[idx]; } - -static unsigned -tulip_mii_get_phyaddr( - tulip_softc_t * const sc, - unsigned offset) + +static u_int +tulip_mii_get_phyaddr(tulip_softc_t *sc, u_int offset) { - unsigned phyaddr; + u_int phyaddr; for (phyaddr = 1; phyaddr < 32; phyaddr++) { - unsigned status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); + u_int status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); if (status == 0 || status == 0xFFFF || status < PHYSTS_10BASET) continue; if (offset == 0) @@ -1290,18 +1151,16 @@ tulip_mii_get_phyaddr( offset--; } if (offset == 0) { - unsigned status = tulip_mii_readreg(sc, 0, PHYREG_STATUS); + u_int status = tulip_mii_readreg(sc, 0, PHYREG_STATUS); if (status == 0 || status == 0xFFFF || status < PHYSTS_10BASET) return TULIP_MII_NOPHY; return 0; } return TULIP_MII_NOPHY; } - + static int -tulip_mii_map_abilities( - tulip_softc_t * const sc, - unsigned abilities) +tulip_mii_map_abilities(tulip_softc_t *sc, u_int abilities) { sc->tulip_abilities = abilities; if (abilities & PHYSTS_100BASETX_FD) { @@ -1323,9 +1182,7 @@ tulip_mii_map_abilities( } static void -tulip_mii_autonegotiate( - tulip_softc_t * const sc, - const unsigned phyaddr) +tulip_mii_autonegotiate(tulip_softc_t *sc, u_int phyaddr) { switch (sc->tulip_probe_state) { case TULIP_PROBE_MEDIATEST: @@ -1338,15 +1195,15 @@ tulip_mii_autonegotiate( /* FALL THROUGH */ } case TULIP_PROBE_PHYRESET: { - u_int32_t status; - u_int32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL); + uint32_t status; + uint32_t data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL); if (data & PHYCTL_RESET) { if (sc->tulip_probe_timeout > 0) { tulip_timeout(sc); return; } - printf("%s%d(phy%d): error: reset of PHY never completed!\n", - sc->tulip_name, sc->tulip_unit, phyaddr); + if_printf(&sc->tulip_if, + "(phy%d): error: reset of PHY never completed!\n", phyaddr); sc->tulip_flags &= ~TULIP_TXPROBE_ACTIVE; sc->tulip_probe_state = TULIP_PROBE_FAILED; sc->tulip_if.if_flags &= ~(IFF_UP|IFF_RUNNING); @@ -1354,10 +1211,6 @@ tulip_mii_autonegotiate( } status = tulip_mii_readreg(sc, phyaddr, PHYREG_STATUS); if ((status & PHYSTS_CAN_AUTONEG) == 0) { -#if defined(TULIP_DEBUG) - loudprintf("%s%d(phy%d): autonegotiation disabled\n", - sc->tulip_name, sc->tulip_unit, phyaddr); -#endif sc->tulip_flags &= ~TULIP_DIDNWAY; sc->tulip_probe_state = TULIP_PROBE_MEDIATEST; return; @@ -1366,15 +1219,6 @@ tulip_mii_autonegotiate( tulip_mii_writereg(sc, phyaddr, PHYREG_AUTONEG_ADVERTISEMENT, (status >> 6) | 0x01); tulip_mii_writereg(sc, phyaddr, PHYREG_CONTROL, data|PHYCTL_AUTONEG_RESTART|PHYCTL_AUTONEG_ENABLE); data = tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL); -#if defined(TULIP_DEBUG) - if ((data & PHYCTL_AUTONEG_ENABLE) == 0) - loudprintf("%s%d(phy%d): oops: enable autonegotiation failed: 0x%04x\n", - sc->tulip_name, sc->tulip_unit, phyaddr, data); - else - loudprintf("%s%d(phy%d): autonegotiation restarted: 0x%04x\n", - sc->tulip_name, sc->tulip_unit, phyaddr, data); - sc->tulip_dbg.dbg_nway_starts++; -#endif sc->tulip_probe_state = TULIP_PROBE_PHYAUTONEG; sc->tulip_probe_timeout = 3000; /* FALL THROUGH */ @@ -1387,20 +1231,11 @@ tulip_mii_autonegotiate( tulip_timeout(sc); return; } -#if defined(TULIP_DEBUG) - loudprintf("%s%d(phy%d): autonegotiation timeout: sts=0x%04x, ctl=0x%04x\n", - sc->tulip_name, sc->tulip_unit, phyaddr, status, - tulip_mii_readreg(sc, phyaddr, PHYREG_CONTROL)); -#endif sc->tulip_flags &= ~TULIP_DIDNWAY; sc->tulip_probe_state = TULIP_PROBE_MEDIATEST; return; } data = tulip_mii_readreg(sc, phyaddr, PHYREG_AUTONEG_ABILITIES); -#if defined(TULIP_DEBUG) - loudprintf("%s%d(phy%d): autonegotiation complete: 0x%04x\n", - sc->tulip_name, sc->tulip_unit, phyaddr, data); -#endif data = (data << 6) & status; if (!tulip_mii_map_abilities(sc, data)) sc->tulip_flags &= ~TULIP_DIDNWAY; @@ -1413,16 +1248,10 @@ tulip_mii_autonegotiate( break; } } -#if defined(TULIP_DEBUG) - loudprintf("%s%d(phy%d): autonegotiation failure: state = %d\n", - sc->tulip_name, sc->tulip_unit, phyaddr, sc->tulip_probe_state); - sc->tulip_dbg.dbg_nway_failures++; -#endif } - + static void -tulip_2114x_media_preset( - tulip_softc_t * const sc) +tulip_2114x_media_preset(tulip_softc_t *sc) { const tulip_media_info_t *mi = NULL; tulip_media_t media = sc->tulip_media; @@ -1435,9 +1264,6 @@ tulip_2114x_media_preset( sc->tulip_cmdmode &= ~TULIP_CMD_PORTSELECT; sc->tulip_flags &= ~TULIP_SQETEST; if (media != TULIP_MEDIA_UNKNOWN && media != TULIP_MEDIA_MAX) { -#if defined(TULIP_DEBUG) - if (media < TULIP_MEDIA_MAX && sc->tulip_mediums[media] != NULL) { -#endif mi = sc->tulip_mediums[media]; if (mi->mi_type == TULIP_MEDIAINFO_MII) { sc->tulip_cmdmode |= TULIP_CMD_PORTSELECT; @@ -1448,12 +1274,6 @@ tulip_2114x_media_preset( } else if (mi->mi_type == TULIP_MEDIAINFO_SIA) { TULIP_CSR_WRITE(sc, csr_sia_connectivity, TULIP_SIACONN_RESET); } -#if defined(TULIP_DEBUG) - } else { - printf("%s%d: preset: bad media %d!\n", - sc->tulip_name, sc->tulip_unit, media); - } -#endif } switch (media) { case TULIP_MEDIA_BNC: @@ -1491,43 +1311,32 @@ tulip_2114x_media_preset( } TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode); } - + /* ******************************************************************** * Start of 21140/21140A support which does not use the MII interface */ - + static void -tulip_null_media_poll( - tulip_softc_t * const sc, - tulip_mediapoll_event_t event) +tulip_null_media_poll(tulip_softc_t *sc, tulip_mediapoll_event_t event) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_events[event]++; -#endif #if defined(DIAGNOSTIC) - printf("%s%d: botch(media_poll) at line %d\n", - sc->tulip_name, sc->tulip_unit, __LINE__); + if_printf(&sc->tulip_if, "botch(media_poll) at line %d\n", __LINE__); #endif } -__inline__ static void -tulip_21140_mediainit( - tulip_softc_t * const sc, - tulip_media_info_t * const mip, - tulip_media_t const media, - unsigned gpdata, - unsigned cmdmode) +static void +tulip_21140_mediainit(tulip_softc_t *sc, tulip_media_info_t *mip, + tulip_media_t media, u_int gpdata, u_int cmdmode) { sc->tulip_mediums[media] = mip; mip->mi_type = TULIP_MEDIAINFO_GPR; mip->mi_cmdmode = cmdmode; mip->mi_gpdata = gpdata; } - + static void -tulip_21140_evalboard_media_probe( - tulip_softc_t * const sc) +tulip_21140_evalboard_media_probe(tulip_softc_t *sc) { tulip_media_info_t *mip = sc->tulip_mediainfo; @@ -1569,13 +1378,12 @@ static const tulip_boardsw_t tulip_21140_eb_boardsw = { tulip_null_media_poll, tulip_2114x_media_preset, }; - + static void -tulip_21140_accton_media_probe( - tulip_softc_t * const sc) +tulip_21140_accton_media_probe(tulip_softc_t *sc) { tulip_media_info_t *mip = sc->tulip_mediainfo; - unsigned gpdata; + u_int gpdata; sc->tulip_gpinit = TULIP_GP_EB_PINS; sc->tulip_gpdata = TULIP_GP_EB_INIT; @@ -1623,10 +1431,9 @@ static const tulip_boardsw_t tulip_21140_accton_boardsw = { tulip_null_media_poll, tulip_2114x_media_preset, }; - + static void -tulip_21140_smc9332_media_probe( - tulip_softc_t * const sc) +tulip_21140_smc9332_media_probe(tulip_softc_t *sc) { tulip_media_info_t *mip = sc->tulip_mediainfo; int idx, cnt = 0; @@ -1679,13 +1486,12 @@ static const tulip_boardsw_t tulip_21140_smc9332_boardsw = { tulip_null_media_poll, tulip_2114x_media_preset, }; - + static void -tulip_21140_cogent_em100_media_probe( - tulip_softc_t * const sc) +tulip_21140_cogent_em100_media_probe(tulip_softc_t *sc) { tulip_media_info_t *mip = sc->tulip_mediainfo; - u_int32_t cmdmode = TULIP_CSR_READ(sc, csr_command); + uint32_t cmdmode = TULIP_CSR_READ(sc, csr_command); sc->tulip_gpinit = TULIP_GP_EM100_PINS; sc->tulip_gpdata = TULIP_GP_EM100_INIT; @@ -1726,10 +1532,9 @@ static const tulip_boardsw_t tulip_21140_cogent_em100_boardsw = { tulip_null_media_poll, tulip_2114x_media_preset }; - + static void -tulip_21140_znyx_zx34x_media_probe( - tulip_softc_t * const sc) +tulip_21140_znyx_zx34x_media_probe(tulip_softc_t *sc) { tulip_media_info_t *mip = sc->tulip_mediainfo; int cnt10 = 0, cnt100 = 0, idx; @@ -1746,7 +1551,7 @@ tulip_21140_znyx_zx34x_media_probe( DELAY(200000); for (idx = 1000; idx > 0; idx--) { - u_int32_t csr = TULIP_CSR_READ(sc, csr_gp); + uint32_t csr = TULIP_CSR_READ(sc, csr_gp); if ((csr & (TULIP_GP_ZX34X_LNKFAIL|TULIP_GP_ZX34X_SYMDET|TULIP_GP_ZX34X_SIGDET)) == (TULIP_GP_ZX34X_LNKFAIL|TULIP_GP_ZX34X_SYMDET|TULIP_GP_ZX34X_SIGDET)) { if (++cnt100 > 100) break; @@ -1783,13 +1588,12 @@ static const tulip_boardsw_t tulip_21140_znyx_zx34x_boardsw = { tulip_null_media_poll, tulip_2114x_media_preset, }; - + static void -tulip_2114x_media_probe( - tulip_softc_t * const sc) +tulip_2114x_media_probe(tulip_softc_t *sc) { - sc->tulip_cmdmode |= TULIP_CMD_MUSTBEONE - |TULIP_CMD_BACKOFFCTR|TULIP_CMD_THRSHLD72; + sc->tulip_cmdmode |= TULIP_CMD_MUSTBEONE | TULIP_CMD_BACKOFFCTR | + TULIP_CMD_THRSHLD72; } static const tulip_boardsw_t tulip_2114x_isv_boardsw = { @@ -1799,21 +1603,23 @@ static const tulip_boardsw_t tulip_2114x_isv_boardsw = { tulip_media_poll, tulip_2114x_media_preset, }; - + /* * ******** END of chip-specific handlers. *********** */ - + /* * Code the read the SROM and MII bit streams (I2C) */ -#define EMIT do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); DELAY(1); } while (0) +#define EMIT do { \ + TULIP_CSR_WRITE(sc, csr_srom_mii, csr); \ + DELAY(1); \ +} while (0) static void -tulip_srom_idle( - tulip_softc_t * const sc) +tulip_srom_idle(tulip_softc_t *sc) { - unsigned bit, csr; + u_int bit, csr; csr = SROMSEL ; EMIT; csr = SROMSEL | SROMRD; EMIT; @@ -1834,19 +1640,17 @@ tulip_srom_idle( static void -tulip_srom_read( - tulip_softc_t * const sc) +tulip_srom_read(tulip_softc_t *sc) { - unsigned idx; - const unsigned bitwidth = SROM_BITWIDTH; - const unsigned cmdmask = (SROMCMD_RD << bitwidth); - const unsigned msb = 1 << (bitwidth + 3 - 1); - unsigned lastidx = (1 << bitwidth) - 1; + const u_int bitwidth = SROM_BITWIDTH; + const u_int cmdmask = (SROMCMD_RD << bitwidth); + const u_int msb = 1 << (bitwidth + 3 - 1); + u_int idx, lastidx = (1 << bitwidth) - 1; tulip_srom_idle(sc); for (idx = 0; idx <= lastidx; idx++) { - unsigned lastbit, data, bits, bit, csr; + u_int lastbit, data, bits, bit, csr; csr = SROMSEL ; EMIT; csr = SROMSEL | SROMRD; EMIT; csr ^= SROMCSON; EMIT; @@ -1854,7 +1658,7 @@ tulip_srom_read( lastbit = 0; for (bits = idx|cmdmask, bit = bitwidth + 3; bit > 0; bit--, bits <<= 1) { - const unsigned thisbit = bits & msb; + u_int thisbit = bits & msb; csr ^= SROMCLKOFF; EMIT; /* clock low; data not valid */ if (thisbit != lastbit) { csr ^= SROMDOUT; EMIT; /* clock low; invert data */ @@ -1879,19 +1683,20 @@ tulip_srom_read( } tulip_srom_idle(sc); } - -#define MII_EMIT do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); DELAY(1); } while (0) + +#define MII_EMIT do { \ + TULIP_CSR_WRITE(sc, csr_srom_mii, csr); \ + DELAY(1); \ +} while (0) static void -tulip_mii_writebits( - tulip_softc_t * const sc, - unsigned data, - unsigned bits) +tulip_mii_writebits(tulip_softc_t *sc, u_int data, u_int bits) { - unsigned msb = 1 << (bits - 1); - unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); - unsigned lastbit = (csr & MII_DOUT) ? msb : 0; + u_int csr, msb, lastbit; + msb = 1 << (bits - 1); + csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); + lastbit = (csr & MII_DOUT) ? msb : 0; csr |= MII_WR; MII_EMIT; /* clock low; assert write */ for (; bits > 0; bits--, data <<= 1) { @@ -1906,11 +1711,11 @@ tulip_mii_writebits( } static void -tulip_mii_turnaround( - tulip_softc_t * const sc, - unsigned cmd) +tulip_mii_turnaround(tulip_softc_t *sc, u_int cmd) { - unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); + u_int csr; + + csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); if (cmd == MII_WRCMD) { csr |= MII_DOUT; MII_EMIT; /* clock low; change data */ @@ -1924,13 +1729,12 @@ tulip_mii_turnaround( csr ^= MII_CLKOFF; MII_EMIT; /* clock low; data not valid */ } -static unsigned -tulip_mii_readbits( - tulip_softc_t * const sc) +static u_int +tulip_mii_readbits(tulip_softc_t *sc) { - unsigned data; - unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); - int idx; + u_int csr, data, idx; + + csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); for (idx = 0, data = 0; idx < 16; idx++) { data <<= 1; /* this is NOOP on the first pass through */ @@ -1944,15 +1748,13 @@ tulip_mii_readbits( return data; } -static unsigned -tulip_mii_readreg( - tulip_softc_t * const sc, - unsigned devaddr, - unsigned regno) +static u_int +tulip_mii_readreg(tulip_softc_t *sc, u_int devaddr, u_int regno) { - unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); - unsigned data; + u_int csr; + u_int data; + csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); csr &= ~(MII_RD|MII_CLK); MII_EMIT; tulip_mii_writebits(sc, MII_PREAMBLE, 32); tulip_mii_writebits(sc, MII_RDCMD, 8); @@ -1961,21 +1763,15 @@ tulip_mii_readreg( tulip_mii_turnaround(sc, MII_RDCMD); data = tulip_mii_readbits(sc); -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_phyregs[regno][0] = data; - sc->tulip_dbg.dbg_phyregs[regno][1]++; -#endif return data; } static void -tulip_mii_writereg( - tulip_softc_t * const sc, - unsigned devaddr, - unsigned regno, - unsigned data) +tulip_mii_writereg(tulip_softc_t *sc, u_int devaddr, u_int regno, u_int data) { - unsigned csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); + u_int csr; + + csr = TULIP_CSR_READ(sc, csr_srom_mii) & (MII_RD|MII_DOUT|MII_CLK); csr &= ~(MII_RD|MII_CLK); MII_EMIT; tulip_mii_writebits(sc, MII_PREAMBLE, 32); tulip_mii_writebits(sc, MII_WRCMD, 8); @@ -1983,20 +1779,15 @@ tulip_mii_writereg( tulip_mii_writebits(sc, regno, 5); tulip_mii_turnaround(sc, MII_WRCMD); tulip_mii_writebits(sc, data, 16); -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_phyregs[regno][2] = data; - sc->tulip_dbg.dbg_phyregs[regno][3]++; -#endif } - + #define tulip_mchash(mca) (ether_crc32_le(mca, 6) & 0x1FF) #define tulip_srom_crcok(databuf) ( \ ((ether_crc32_le(databuf, 126) & 0xFFFFU) ^ 0xFFFFU) == \ ((databuf)[126] | ((databuf)[127] << 8))) static void -tulip_identify_dec_nic( - tulip_softc_t * const sc) +tulip_identify_dec_nic(tulip_softc_t *sc) { strcpy(sc->tulip_boardid, "DEC "); #define D0 4 @@ -2009,15 +1800,14 @@ tulip_identify_dec_nic( } #undef D0 } - + static void -tulip_identify_znyx_nic( - tulip_softc_t * const sc) +tulip_identify_znyx_nic(tulip_softc_t * const sc) { - unsigned id = 0; + u_int id = 0; strcpy(sc->tulip_boardid, "ZNYX ZX3XX "); if (sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) { - unsigned znyx_ptr; + u_int znyx_ptr; sc->tulip_boardid[8] = '4'; znyx_ptr = sc->tulip_rombuf[124] + 256 * sc->tulip_rombuf[125]; if (znyx_ptr < 26 || znyx_ptr > 116) { @@ -2102,12 +1892,11 @@ tulip_identify_znyx_nic( } } } - + static void -tulip_identify_smc_nic( - tulip_softc_t * const sc) +tulip_identify_smc_nic(tulip_softc_t * const sc) { - u_int32_t id1, id2, ei; + uint32_t id1, id2, ei; int auibnc = 0, utp = 0; char *cp; @@ -2151,10 +1940,9 @@ tulip_identify_smc_nic( else if (!utp && auibnc) sc->tulip_boardsw = &tulip_21040_auibnc_only_boardsw; } - + static void -tulip_identify_cogent_nic( - tulip_softc_t * const sc) +tulip_identify_cogent_nic(tulip_softc_t * const sc) { strcpy(sc->tulip_boardid, "Cogent "); if (sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) { @@ -2174,7 +1962,7 @@ tulip_identify_cogent_nic( * Magic number (0x24001109U) is the SubVendor (0x2400) and * SubDevId (0x1109) for the ANA6944TX (EM440TX). */ - if (*(u_int32_t *) sc->tulip_rombuf == 0x24001109U + if (*(uint32_t *) sc->tulip_rombuf == 0x24001109U && (sc->tulip_features & TULIP_HAVE_BASEROM)) { /* * Cogent (Adaptec) is still mapping all INTs to INTA of @@ -2187,10 +1975,9 @@ tulip_identify_cogent_nic( sc->tulip_features |= TULIP_HAVE_SHAREDINTR|TULIP_HAVE_BASEROM; } } - + static void -tulip_identify_accton_nic( - tulip_softc_t * const sc) +tulip_identify_accton_nic(tulip_softc_t * const sc) { strcpy(sc->tulip_boardid, "ACCTON "); switch (sc->tulip_chipid) { @@ -2217,10 +2004,9 @@ tulip_identify_accton_nic( break; } } - + static void -tulip_identify_asante_nic( - tulip_softc_t * const sc) +tulip_identify_asante_nic(tulip_softc_t * const sc) { strcpy(sc->tulip_boardid, "Asante "); if ((sc->tulip_chipid == TULIP_21140 || sc->tulip_chipid == TULIP_21140A) @@ -2253,7 +2039,7 @@ tulip_identify_asante_nic( mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, 0); } if (mi->mi_phyaddr == TULIP_MII_NOPHY) { - printf("%s%d: can't find phy 0\n", sc->tulip_name, sc->tulip_unit); + if_printf(&sc->tulip_if, "can't find phy 0\n"); return; } @@ -2273,10 +2059,9 @@ tulip_identify_asante_nic( sc->tulip_boardsw = &tulip_2114x_isv_boardsw; } } - + static void -tulip_identify_compex_nic( - tulip_softc_t * const sc) +tulip_identify_compex_nic(tulip_softc_t *sc) { strcpy(sc->tulip_boardid, "COMPEX "); if (sc->tulip_chipid == TULIP_21140A) { @@ -2289,7 +2074,7 @@ tulip_identify_compex_nic( * copied from tulip_read_macaddr. */ sc->tulip_features |= TULIP_HAVE_SHAREDINTR; - for (root_unit = sc->tulip_unit - 1; root_unit >= 0; root_unit--) { + for (root_unit = device_get_unit(sc->tulip_dev) - 1; root_unit >= 0; root_unit--) { root_sc = tulips[root_unit]; if (root_sc == NULL || !(root_sc->tulip_features & TULIP_HAVE_SLAVEDINTR)) @@ -2303,8 +2088,7 @@ tulip_identify_compex_nic( sc->tulip_slaves = root_sc->tulip_slaves; root_sc->tulip_slaves = sc; } else if(sc->tulip_features & TULIP_HAVE_SLAVEDINTR) { - printf("\nCannot find master device for de%d interrupts", - sc->tulip_unit); + if_printf(&sc->tulip_if, "can't find master device for interrupts"); } } else { strcat(sc->tulip_boardid, "unknown "); @@ -2314,17 +2098,16 @@ tulip_identify_compex_nic( } static int -tulip_srom_decode( - tulip_softc_t * const sc) +tulip_srom_decode(tulip_softc_t *sc) { - unsigned idx1, idx2, idx3; + u_int idx1, idx2, idx3; const tulip_srom_header_t *shp = (const tulip_srom_header_t *) &sc->tulip_rombuf[0]; const tulip_srom_adapter_info_t *saip = (const tulip_srom_adapter_info_t *) (shp + 1); tulip_srom_media_t srom_media; tulip_media_info_t *mi = sc->tulip_mediainfo; - const u_int8_t *dp; - u_int32_t leaf_offset, blocks, data; + const uint8_t *dp; + uint32_t leaf_offset, blocks, data; for (idx1 = 0; idx1 < shp->sh_adapter_count; idx1++, saip++) { if (shp->sh_adapter_count == 1) @@ -2427,7 +2210,7 @@ tulip_srom_decode( sc->tulip_gpinit = *dp++; blocks = *dp++; for (idx2 = 0; idx2 < blocks; idx2++) { - const u_int8_t *ep; + const uint8_t *ep; if ((*dp & 0x80) == 0) { length = 4; type = 0; @@ -2469,7 +2252,7 @@ tulip_srom_decode( break; } case 1: { /* 21140[A] MII block */ - const unsigned phyno = *dp++; + const u_int phyno = *dp++; mi->mi_type = TULIP_MEDIAINFO_MII; mi->mi_gpr_length = *dp++; mi->mi_gpr_offset = dp - sc->tulip_rombuf; @@ -2504,13 +2287,8 @@ tulip_srom_decode( DELAY(10000); mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, phyno); } - if (mi->mi_phyaddr == TULIP_MII_NOPHY) { -#if defined(TULIP_DEBUG) - printf("%s%d: can't find phy %d\n", - sc->tulip_name, sc->tulip_unit, phyno); -#endif + if (mi->mi_phyaddr == TULIP_MII_NOPHY) break; - } sc->tulip_features |= TULIP_HAVE_MII; mi->mi_capabilities = dp[0] + dp[1] * 256; dp += 2; mi->mi_advertisement = dp[0] + dp[1] * 256; dp += 2; @@ -2575,8 +2353,8 @@ tulip_srom_decode( break; } case 3: { /* 2114[23] MII PHY block */ - const unsigned phyno = *dp++; - const u_int8_t *dp0; + const u_int phyno = *dp++; + const uint8_t *dp0; mi->mi_type = TULIP_MEDIAINFO_MII; mi->mi_gpr_length = *dp++; mi->mi_gpr_offset = dp - sc->tulip_rombuf; @@ -2605,13 +2383,8 @@ tulip_srom_decode( DELAY(10000); mi->mi_phyaddr = tulip_mii_get_phyaddr(sc, phyno); } - if (mi->mi_phyaddr == TULIP_MII_NOPHY) { -#if defined(TULIP_DEBUG) - printf("%s%d: can't find phy %d\n", - sc->tulip_name, sc->tulip_unit, phyno); -#endif + if (mi->mi_phyaddr == TULIP_MII_NOPHY) break; - } sc->tulip_features |= TULIP_HAVE_MII; mi->mi_capabilities = dp[0] + dp[1] * 256; dp += 2; mi->mi_advertisement = dp[0] + dp[1] * 256; dp += 2; @@ -2697,11 +2470,10 @@ static const struct { * brain-deadness that various vendors commit in using them. */ static int -tulip_read_macaddr( - tulip_softc_t * const sc) +tulip_read_macaddr(tulip_softc_t *sc) { - unsigned cksum, rom_cksum, idx; - u_int32_t csr; + u_int cksum, rom_cksum, idx; + uint32_t csr; unsigned char tmpbuf[8]; static const u_char testpat[] = { 0xFF, 0, 0x55, 0xAA, 0xFF, 0, 0x55, 0xAA }; @@ -2814,7 +2586,7 @@ tulip_read_macaddr( if (idx == sizeof(sc->tulip_rombuf)) { int root_unit; tulip_softc_t *root_sc = NULL; - for (root_unit = sc->tulip_unit - 1; root_unit >= 0; root_unit--) { + for (root_unit = device_get_unit(sc->tulip_dev) - 1; root_unit >= 0; root_unit--) { root_sc = tulips[root_unit]; if (root_sc == NULL || (root_sc->tulip_features & (TULIP_HAVE_OKROM|TULIP_HAVE_SLAVEDROM)) == TULIP_HAVE_OKROM) break; @@ -2833,7 +2605,7 @@ tulip_read_macaddr( return -5; } else { bcopy(root_sc->tulip_enaddr, sc->tulip_enaddr, 6); - sc->tulip_enaddr[5] += sc->tulip_unit - root_sc->tulip_unit; + sc->tulip_enaddr[5] += device_get_unit(sc->tulip_dev) - device_get_unit(root_sc->tulip_dev); } /* * Now for a truly disgusting kludge: all 4 21040s on @@ -2897,10 +2669,9 @@ tulip_read_macaddr( sc->tulip_features |= TULIP_HAVE_OKROM; return 0; } - + static void -tulip_ifmedia_add( - tulip_softc_t * const sc) +tulip_ifmedia_add(tulip_softc_t * const sc) { tulip_media_t media; int medias = 0; @@ -2927,10 +2698,9 @@ tulip_ifmedia_add( } static int -tulip_ifmedia_change( - struct ifnet * const ifp) +tulip_ifmedia_change(struct ifnet *ifp) { - tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; + tulip_softc_t *sc = (tulip_softc_t *)ifp->if_softc; sc->tulip_flags |= TULIP_NEEDRESET; sc->tulip_probe_state = TULIP_PROBE_INACTIVE; @@ -2952,14 +2722,12 @@ tulip_ifmedia_change( tulip_init(sc); return 0; } - + /* * Media status callback */ static void -tulip_ifmedia_status( - struct ifnet * const ifp, - struct ifmediareq *req) +tulip_ifmedia_status(struct ifnet *ifp, struct ifmediareq *req) { tulip_softc_t *sc = (tulip_softc_t *)ifp->if_softc; @@ -2972,10 +2740,9 @@ tulip_ifmedia_status( req->ifm_active = tulip_media_to_ifmedia[sc->tulip_media]; } - + static void -tulip_addr_filter( - tulip_softc_t * const sc) +tulip_addr_filter(tulip_softc_t *sc) { struct ifmultiaddr *ifma; u_char *addrp; @@ -2991,17 +2758,15 @@ tulip_addr_filter( #endif multicnt = 0; - for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma != NULL; - ifma = ifma->ifma_link.le_next) { - + LIST_FOREACH(ifma, &sc->tulip_if.if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family == AF_LINK) multicnt++; } sc->tulip_if.if_start = tulip_ifstart; /* so the setup packet gets queued */ if (multicnt > 14) { - u_int32_t *sp = sc->tulip_setupdata; - unsigned hash; + uint32_t *sp = sc->tulip_setupdata; + u_int hash; /* * Some early passes of the 21140 have broken implementations of * hash-perfect mode. When we get too many multicasts for perfect @@ -3020,9 +2785,7 @@ tulip_addr_filter( */ bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata)); - for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma != NULL; - ifma = ifma->ifma_link.le_next) { - + LIST_FOREACH(ifma, &sc->tulip_if.if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; @@ -3065,14 +2828,13 @@ tulip_addr_filter( } } if ((sc->tulip_flags & (TULIP_WANTHASHPERFECT|TULIP_WANTHASHONLY)) == 0) { - u_int32_t *sp = sc->tulip_setupdata; + uint32_t *sp = sc->tulip_setupdata; int idx = 0; if ((sc->tulip_flags & TULIP_ALLMULTI) == 0) { /* * Else can get perfect filtering for 16 addresses. */ - for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma != NULL; - ifma = ifma->ifma_link.le_next) { + LIST_FOREACH(ifma, &sc->tulip_if.if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; addrp = LLADDR((struct sockaddr_dl *)ifma->ifma_addr); @@ -3123,12 +2885,11 @@ tulip_addr_filter( } static void -tulip_reset( - tulip_softc_t * const sc) +tulip_reset(tulip_softc_t *sc) { tulip_ringinfo_t *ri; tulip_desc_t *di; - u_int32_t inreset = (sc->tulip_flags & TULIP_INRESET); + uint32_t inreset = (sc->tulip_flags & TULIP_INRESET); /* * Brilliant. Simply brilliant. When switching modes/speeds @@ -3167,13 +2928,7 @@ tulip_reset( /* * Free all the mbufs that were on the transmit ring. */ - for (;;) { - struct mbuf *m; - IF_DEQUEUE(&sc->tulip_txq, m); - if (m == NULL) - break; - m_freem(m); - } + IF_DRAIN(&sc->tulip_txq); ri = &sc->tulip_txinfo; ri->ri_nextin = ri->ri_nextout = ri->ri_first; @@ -3195,13 +2950,7 @@ tulip_reset( di->d_length1 = 0; di->d_addr1 = 0; di->d_length2 = 0; di->d_addr2 = 0; } - for (;;) { - struct mbuf *m; - IF_DEQUEUE(&sc->tulip_rxq, m); - if (m == NULL) - break; - m_freem(m); - } + IF_DRAIN(&sc->tulip_rxq); /* * If tulip_reset is being called recurisvely, exit quickly knowing @@ -3218,11 +2967,6 @@ tulip_reset( if ((sc->tulip_flags & TULIP_DEVICEPROBE) == 0) (*sc->tulip_boardsw->bd_media_select)(sc); -#if defined(TULIP_DEBUG) - if ((sc->tulip_flags & TULIP_NEEDRESET) == TULIP_NEEDRESET) - printf("%s%d: tulip_reset: additional reset needed?!?\n", - sc->tulip_name, sc->tulip_unit); -#endif tulip_media_print(sc); if (sc->tulip_features & TULIP_HAVE_DUALSENSE) TULIP_CSR_WRITE(sc, csr_sia_status, TULIP_CSR_READ(sc, csr_sia_status)); @@ -3231,10 +2975,9 @@ tulip_reset( |TULIP_RXACT); tulip_addr_filter(sc); } - + static void -tulip_init( - tulip_softc_t * const sc) +tulip_init(tulip_softc_t * const sc) { if (sc->tulip_if.if_flags & IFF_UP) { if ((sc->tulip_if.if_flags & IFF_RUNNING) == 0) { @@ -3274,17 +3017,13 @@ tulip_init( tulip_reset(sc); } } - + static void -tulip_rx_intr( - tulip_softc_t * const sc) +tulip_rx_intr(tulip_softc_t *sc) { - tulip_ringinfo_t * const ri = &sc->tulip_rxinfo; - struct ifnet * const ifp = &sc->tulip_if; + tulip_ringinfo_t *ri = &sc->tulip_rxinfo; + struct ifnet *ifp = &sc->tulip_if; int fillok = 1; -#if defined(TULIP_DEBUG) - int cnt = 0; -#endif for (;;) { struct ether_header eh; @@ -3296,10 +3035,6 @@ tulip_rx_intr( if (fillok && sc->tulip_rxq.ifq_len < TULIP_RXQ_TARGET) goto queue_mbuf; -#if defined(TULIP_DEBUG) - if (cnt == ri->ri_max) - break; -#endif /* * If the TULIP has no descriptors, there can't be any receive * descriptors to process. @@ -3332,10 +3067,6 @@ tulip_rx_intr( eop = ri->ri_first; TULIP_RXDESC_POSTSYNC(sc, eop, sizeof(*eop)); if (eop == ri->ri_nextout || ((((volatile tulip_desc_t *) eop)->d_status & TULIP_DSTS_OWNER))) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_rxintrs++; - sc->tulip_dbg.dbg_rxpktsperintr[cnt]++; -#endif return; } total_len++; @@ -3376,14 +3107,6 @@ tulip_rx_intr( me->m_len = total_len - last_offset; eh = *mtod(ms, struct ether_header *); -#if !defined(__DragonFly__) && !defined(__FreeBSD__) - if (sc->tulip_if.if_bpf != NULL) { - if (me == ms) - bpf_tap(&sc->tulip_if, mtod(ms, caddr_t), total_len); - else - bpf_mtap(&sc->tulip_if, ms); - } -#endif sc->tulip_flags |= TULIP_RXACT; accept = 1; } else { @@ -3391,42 +3114,18 @@ tulip_rx_intr( if (eop->d_status & (TULIP_DSTS_RxBADLENGTH|TULIP_DSTS_RxOVERFLOW|TULIP_DSTS_RxWATCHDOG)) { sc->tulip_dot3stats.dot3StatsInternalMacReceiveErrors++; } else { -#if defined(TULIP_VERBOSE) - const char *error = NULL; -#endif if (eop->d_status & TULIP_DSTS_RxTOOLONG) { sc->tulip_dot3stats.dot3StatsFrameTooLongs++; -#if defined(TULIP_VERBOSE) - error = "frame too long"; -#endif } if (eop->d_status & TULIP_DSTS_RxBADCRC) { if (eop->d_status & TULIP_DSTS_RxDRBBLBIT) { sc->tulip_dot3stats.dot3StatsAlignmentErrors++; -#if defined(TULIP_VERBOSE) - error = "alignment error"; -#endif } else { sc->tulip_dot3stats.dot3StatsFCSErrors++; -#if defined(TULIP_VERBOSE) - error = "bad crc"; -#endif } } -#if defined(TULIP_VERBOSE) - if (error != NULL && (sc->tulip_flags & TULIP_NOMESSAGES) == 0) { - printf("%s%d: receive: %6D: %s\n", - sc->tulip_name, sc->tulip_unit, - mtod(ms, u_char *) + 6, ":", - error); - sc->tulip_flags |= TULIP_NOMESSAGES; - } -#endif } } -#if defined(TULIP_DEBUG) - cnt++; -#endif ifp->if_ipackets++; if (++eop == ri->ri_last) eop = ri->ri_first; @@ -3447,20 +3146,16 @@ tulip_rx_intr( */ if (accept || ms == NULL) { struct mbuf *m0; - MGETHDR(m0, MB_DONTWAIT, MT_DATA); - if (m0 != NULL) { -#if defined(TULIP_COPY_RXDATA) - if (!accept || total_len >= (MHLEN - 2)) { -#endif - MCLGET(m0, MB_DONTWAIT); - if ((m0->m_flags & M_EXT) == 0) { - m_freem(m0); - m0 = NULL; - } + #if defined(TULIP_COPY_RXDATA) - } + if (!accept || total_len >= (MHLEN - 2)) + m0 = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR); + else + m0 = m_gethdr(MB_DONTWAIT, MT_DATA); +#else + m0 = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR); #endif - } + if (accept #if defined(TULIP_COPY_RXDATA) && m0 != NULL @@ -3493,9 +3188,6 @@ tulip_rx_intr( */ fillok = 0; sc->tulip_flags |= TULIP_RXBUFSLOW; -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_rxlowbufs++; -#endif continue; } /* @@ -3518,24 +3210,18 @@ tulip_rx_intr( if (sc->tulip_rxq.ifq_len >= TULIP_RXQ_TARGET) sc->tulip_flags &= ~TULIP_RXBUFSLOW; } - -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_rxintrs++; - sc->tulip_dbg.dbg_rxpktsperintr[cnt]++; -#endif } - + static int -tulip_tx_intr( - tulip_softc_t * const sc) +tulip_tx_intr(tulip_softc_t *sc) { - tulip_ringinfo_t * const ri = &sc->tulip_txinfo; + tulip_ringinfo_t *ri = &sc->tulip_txinfo; struct mbuf *m; int xmits = 0; int descs = 0; while (ri->ri_free < ri->ri_max) { - u_int32_t d_flag; + uint32_t d_flag; TULIP_TXDESC_POSTSYNC(sc, ri->ri_nextin, sizeof(*ri->ri_nextin)); if (((volatile tulip_desc_t *) ri->ri_nextin)->d_status & TULIP_DSTS_OWNER) @@ -3566,25 +3252,14 @@ tulip_tx_intr( TULIP_CSR_WRITE(sc, csr_command, sc->tulip_cmdmode); } } else { - const u_int32_t d_status = ri->ri_nextin->d_status; + const uint32_t d_status = ri->ri_nextin->d_status; IF_DEQUEUE(&sc->tulip_txq, m); if (m != NULL) { m_freem(m); -#if defined(TULIP_DEBUG) - } else { - printf("%s%d: tx_intr: failed to dequeue mbuf?!?\n", - sc->tulip_name, sc->tulip_unit); -#endif } if (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) { tulip_mediapoll_event_t event = TULIP_MEDIAPOLL_TXPROBE_OK; if (d_status & (TULIP_DSTS_TxNOCARR|TULIP_DSTS_TxEXCCOLL)) { -#if defined(TULIP_DEBUG) - if (d_status & TULIP_DSTS_TxNOCARR) - sc->tulip_dbg.dbg_txprobe_nocarr++; - if (d_status & TULIP_DSTS_TxEXCCOLL) - sc->tulip_dbg.dbg_txprobe_exccoll++; -#endif event = TULIP_MEDIAPOLL_TXPROBE_FAILED; } (*sc->tulip_boardsw->bd_media_poll)(sc, event); @@ -3649,19 +3324,17 @@ tulip_tx_intr( sc->tulip_if.if_opackets += xmits; return descs; } - + static void -tulip_print_abnormal_interrupt( - tulip_softc_t * const sc, - u_int32_t csr) +tulip_print_abnormal_interrupt(tulip_softc_t *sc, uint32_t csr) { const char * const *msgp = tulip_status_bits; const char *sep; - u_int32_t mask; + uint32_t mask; const char thrsh[] = "72|128\0\0\0" "96|256\0\0\0" "128|512\0\0" "160|1024"; csr &= (1 << (sizeof(tulip_status_bits)/sizeof(tulip_status_bits[0]))) - 1; - printf("%s%d: abnormal interrupt:", sc->tulip_name, sc->tulip_unit); + if_printf(&sc->tulip_if, "abnormal interrupt:"); for (sep = " ", mask = 1; mask <= csr; mask <<= 1, msgp++) { if ((csr & mask) && *msgp != NULL) { printf("%s%s", sep, *msgp); @@ -3681,14 +3354,11 @@ tulip_print_abnormal_interrupt( } static void -tulip_intr_handler( - tulip_softc_t * const sc, - int *progress_p) +tulip_intr_handler(tulip_softc_t *sc) { - u_int32_t csr; + uint32_t csr; while ((csr = TULIP_CSR_READ(sc, csr_status)) & sc->tulip_intrmask) { - *progress_p = 1; TULIP_CSR_WRITE(sc, csr_status, csr); if (csr & TULIP_STS_SYSERROR) { @@ -3696,8 +3366,7 @@ tulip_intr_handler( if (sc->tulip_flags & TULIP_NOMESSAGES) { sc->tulip_flags |= TULIP_SYSTEMERROR; } else { - printf("%s%d: system error: %s\n", - sc->tulip_name, sc->tulip_unit, + if_printf(&sc->tulip_if, "system error: %s\n", tulip_system_errors[sc->tulip_last_system_error]); } sc->tulip_flags |= TULIP_NEEDRESET; @@ -3705,9 +3374,6 @@ tulip_intr_handler( break; } if (csr & (TULIP_STS_LINKPASS|TULIP_STS_LINKFAIL) & sc->tulip_intrmask) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_link_intrs++; -#endif if (sc->tulip_boardsw->bd_media_poll != NULL) { (*sc->tulip_boardsw->bd_media_poll)(sc, csr & TULIP_STS_LINKFAIL ? TULIP_MEDIAPOLL_LINKFAIL @@ -3778,112 +3444,31 @@ tulip_intr_handler( } static void -tulip_intr_shared( - void *arg) +tulip_intr_shared(void *arg) { - tulip_softc_t * sc = arg; - int progress = 0; + tulip_softc_t *sc; - for (; sc != NULL; sc = sc->tulip_slaves) { -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_intrs++; -#endif - tulip_intr_handler(sc, &progress); - } + for (sc = arg; sc != NULL; sc = sc->tulip_slaves) + tulip_intr_handler(sc); } static void -tulip_intr_normal( - void *arg) +tulip_intr_normal(void *arg) { - tulip_softc_t * sc = (tulip_softc_t *) arg; - int progress = 0; + tulip_softc_t *sc = (tulip_softc_t *)arg; -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_intrs++; -#endif - tulip_intr_handler(sc, &progress); + tulip_intr_handler(sc); } - -static struct mbuf * -tulip_mbuf_compress( - struct mbuf *m) -{ - struct mbuf *m0; -#if MCLBYTES >= ETHERMTU + 18 && !defined(BIG_PACKET) - MGETHDR(m0, MB_DONTWAIT, MT_DATA); - if (m0 != NULL) { - if (m->m_pkthdr.len > MHLEN) { - MCLGET(m0, MB_DONTWAIT); - if ((m0->m_flags & M_EXT) == 0) { - m_freem(m); - m_freem(m0); - return NULL; - } - } - m_copydata(m, 0, m->m_pkthdr.len, mtod(m0, caddr_t)); - m0->m_pkthdr.len = m0->m_len = m->m_pkthdr.len; - } -#else - int mlen = MHLEN; - int len = m->m_pkthdr.len; - struct mbuf **mp = &m0; - while (len > 0) { - if (mlen == MHLEN) { - MGETHDR(*mp, MB_DONTWAIT, MT_DATA); - } else { - MGET(*mp, MB_DONTWAIT, MT_DATA); - } - if (*mp == NULL) { - m_freem(m0); - m0 = NULL; - break; - } - if (len > MLEN) { - MCLGET(*mp, MB_DONTWAIT); - if (((*mp)->m_flags & M_EXT) == 0) { - m_freem(m0); - m0 = NULL; - break; - } - (*mp)->m_len = len <= MCLBYTES ? len : MCLBYTES; - } else { - (*mp)->m_len = len <= mlen ? len : mlen; - } - m_copydata(m, m->m_pkthdr.len - len, - (*mp)->m_len, mtod((*mp), caddr_t)); - len -= (*mp)->m_len; - mp = &(*mp)->m_next; - mlen = MLEN; - } -#endif - m_freem(m); - return m0; -} - static struct mbuf * -tulip_txput( - tulip_softc_t * const sc, - struct mbuf *m) +tulip_txput(tulip_softc_t *sc, struct mbuf *m) { - tulip_ringinfo_t * const ri = &sc->tulip_txinfo; + tulip_ringinfo_t *ri = &sc->tulip_txinfo; tulip_desc_t *eop, *nextout; int segcnt, free; - u_int32_t d_status; + uint32_t d_status; struct mbuf *m0; -#if defined(TULIP_DEBUG) - if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) { - printf("%s%d: txput%s: tx not running\n", - sc->tulip_name, sc->tulip_unit, - (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) ? "(probe)" : ""); - sc->tulip_flags |= TULIP_WANTTXSTART; - sc->tulip_dbg.dbg_txput_finishes[0]++; - goto finish; - } -#endif - /* * Now we try to fill in our transmit descriptors. This is * a bit reminiscent of going on the Ark two by two @@ -3927,9 +3512,10 @@ tulip_txput( * entries that we can use for one packet, so we have * recopy it into one mbuf and then try again. */ - m = tulip_mbuf_compress(m); - if (m == NULL) + m0 = m_defrag(m, MB_DONTWAIT); + if (m0 == NULL) goto finish; + m = m0; goto again; } if (segcnt & 1) { @@ -3946,9 +3532,6 @@ tulip_txput( * mbuf and return. */ sc->tulip_flags |= TULIP_WANTTXSTART; -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_txput_finishes[1]++; -#endif goto finish; } } @@ -4037,9 +3620,6 @@ tulip_txput( sc->tulip_flags &= ~TULIP_WANTTXSTART; if (sc->tulip_txtimer == 0) sc->tulip_txtimer = TULIP_TXTIMER; -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_txput_finishes[5]++; -#endif /* * If we want a txstart, there must be not enough space in the @@ -4051,9 +3631,6 @@ tulip_txput( * WANTTXSTART thereby causing TXINTR to be cleared. */ finish: -#if defined(TULIP_DEBUG) - sc->tulip_dbg.dbg_txput_finishes[6]++; -#endif if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_DOINGSETUP)) { sc->tulip_if.if_flags |= IFF_OACTIVE; sc->tulip_if.if_start = tulip_ifstart; @@ -4070,27 +3647,17 @@ tulip_txput( TULIP_CSR_WRITE(sc, csr_txpoll, 1); return m; } - + static void -tulip_txput_setup( - tulip_softc_t * const sc) +tulip_txput_setup(tulip_softc_t *sc) { - tulip_ringinfo_t * const ri = &sc->tulip_txinfo; + tulip_ringinfo_t *ri = &sc->tulip_txinfo; tulip_desc_t *nextout; /* * We will transmit, at most, one setup packet per call to ifstart. */ -#if defined(TULIP_DEBUG) - if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) { - printf("%s%d: txput_setup: tx not running\n", - sc->tulip_name, sc->tulip_unit); - sc->tulip_flags |= TULIP_WANTTXSTART; - sc->tulip_if.if_start = tulip_ifstart; - return; - } -#endif /* * Try to reclaim some free descriptors.. */ @@ -4148,21 +3715,16 @@ tulip_txput_setup( } } - static int -tulip_ifioctl( - struct ifnet * ifp, - u_long cmd, - caddr_t data, - struct ucred * cr) +tulip_ifioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred * cr) { - tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; + tulip_softc_t *sc = (tulip_softc_t *)ifp->if_softc; struct ifaddr *ifa = (struct ifaddr *)data; - struct ifreq *ifr = (struct ifreq *) data; - int s; + struct ifreq *ifr = (struct ifreq *)data; int error = 0; - s = splimp(); + crit_enter(); + switch (cmd) { case SIOCSIFADDR: { ifp->if_flags |= IFF_UP; @@ -4288,15 +3850,15 @@ tulip_ifioctl( } } - splx(s); + crit_exit(); + return error; } - + static void -tulip_ifstart( - struct ifnet * const ifp) +tulip_ifstart(struct ifnet *ifp) { - tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; + tulip_softc_t *sc = (tulip_softc_t *)ifp->if_softc; if (sc->tulip_if.if_flags & IFF_RUNNING) { @@ -4313,20 +3875,12 @@ tulip_ifstart( } } } - + static void -tulip_ifwatchdog( - struct ifnet *ifp) +tulip_ifwatchdog(struct ifnet *ifp) { tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; -#if defined(TULIP_DEBUG) - u_int32_t rxintrs = sc->tulip_dbg.dbg_rxintrs - sc->tulip_dbg.dbg_last_rxintrs; - if (rxintrs > sc->tulip_dbg.dbg_high_rxintrs_hz) - sc->tulip_dbg.dbg_high_rxintrs_hz = rxintrs; - sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs; -#endif /* TULIP_DEBUG */ - sc->tulip_if.if_timer = 1; /* * These should be rare so do a bulk test up front so we can just skip @@ -4340,9 +3894,9 @@ tulip_ifwatchdog( tulip_rx_intr(sc); if (sc->tulip_flags & TULIP_SYSTEMERROR) { - printf("%s%d: %d system errors: last was %s\n", - sc->tulip_name, sc->tulip_unit, sc->tulip_system_errors, - tulip_system_errors[sc->tulip_last_system_error]); + if_printf(ifp, "%d system errors: last was %s\n", + sc->tulip_system_errors, + tulip_system_errors[sc->tulip_last_system_error]); } if (sc->tulip_statusbits) { tulip_print_abnormal_interrupt(sc, sc->tulip_statusbits); @@ -4355,7 +3909,7 @@ tulip_ifwatchdog( if (sc->tulip_txtimer) tulip_tx_intr(sc); if (sc->tulip_txtimer && --sc->tulip_txtimer == 0) { - printf("%s%d: transmission timeout\n", sc->tulip_name, sc->tulip_unit); + if_printf(ifp, "transmission timeout\n"); if (TULIP_DO_AUTOSENSE(sc)) { sc->tulip_media = TULIP_MEDIA_UNKNOWN; sc->tulip_probe_state = TULIP_PROBE_INACTIVE; @@ -4365,32 +3919,22 @@ tulip_ifwatchdog( tulip_init(sc); } } - -/* - * All printf's are real as of now! - */ -#ifdef printf -#undef printf -#endif static void -tulip_attach( - tulip_softc_t * const sc) +tulip_attach(tulip_softc_t *sc) { - struct ifnet * const ifp = &sc->tulip_if; + struct ifnet *ifp = &sc->tulip_if; callout_init(&sc->tulip_timer); callout_init(&sc->tulip_fast_timer); - if_initname(ifp, sc->tulip_name, sc->tulip_unit); ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST; ifp->if_ioctl = tulip_ifioctl; ifp->if_start = tulip_ifstart; ifp->if_watchdog = tulip_ifwatchdog; ifp->if_timer = 1; - printf("%s%d: %s%s pass %d.%d%s\n", - sc->tulip_name, sc->tulip_unit, + if_printf(ifp, "%s%s pass %d.%d%s\n", sc->tulip_boardid, tulip_chipdescs[sc->tulip_chipid], (sc->tulip_revinfo & 0xF0) >> 4, @@ -4410,12 +3954,9 @@ tulip_attach( ether_ifattach(&(sc)->tulip_if, sc->tulip_enaddr); ifp->if_snd.ifq_maxlen = ifqmaxlen; } - + static void -tulip_initcsrs( - tulip_softc_t * const sc, - tulip_csrptr_t csr_base, - size_t csr_size) +tulip_initcsrs(tulip_softc_t *sc, tulip_csrptr_t csr_base, size_t csr_size) { sc->tulip_csrs.csr_busmode = csr_base + 0 * csr_size; sc->tulip_csrs.csr_txpoll = csr_base + 1 * csr_size; @@ -4434,13 +3975,10 @@ tulip_initcsrs( sc->tulip_csrs.csr_14 = csr_base + 14 * csr_size; sc->tulip_csrs.csr_15 = csr_base + 15 * csr_size; } - + static void -tulip_initring( - tulip_softc_t * const sc, - tulip_ringinfo_t * const ri, - tulip_desc_t *descs, - int ndescs) +tulip_initring(tulip_softc_t *sc, tulip_ringinfo_t *ri, tulip_desc_t *descs, + int ndescs) { ri->ri_max = ndescs; ri->ri_first = descs; @@ -4448,7 +3986,7 @@ tulip_initring( bzero((caddr_t) ri->ri_first, sizeof(ri->ri_first[0]) * ri->ri_max); ri->ri_last[-1].d_flag = TULIP_DFLAG_ENDRING; } - + /* * This is the PCI configuration support. */ @@ -4502,7 +4040,7 @@ tulip_pci_probe(device_t dev) static int tulip_shutdown(device_t dev) { - tulip_softc_t * const sc = device_get_softc(dev); + tulip_softc_t *sc = device_get_softc(dev); TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET); DELAY(10); /* Wait 10 microseconds (actually 50 PCI cycles but at 33MHz that comes to two microseconds but wait a @@ -4515,19 +4053,16 @@ tulip_pci_attach(device_t dev) { tulip_softc_t *sc; int retval, idx; - u_int32_t revinfo, cfdainfo, cfcsinfo; - unsigned csroffset = TULIP_PCI_CSROFFSET; - unsigned csrsize = TULIP_PCI_CSRSIZE; + uint32_t revinfo, cfdainfo, cfcsinfo; + u_int csroffset = TULIP_PCI_CSROFFSET; + u_int csrsize = TULIP_PCI_CSRSIZE; tulip_csrptr_t csr_base; tulip_chipid_t chipid = TULIP_CHIPID_UNKNOWN; struct resource *res; - int rid, unit; - - unit = device_get_unit(dev); + int rid; - if (unit >= TULIP_MAX_DEVICES) { - printf("de%d", unit); - printf(": not configured; limit of %d reached or exceeded\n", + if (device_get_unit(dev) >= TULIP_MAX_DEVICES) { + device_printf(dev, "not configured; limit of %d reached or exceeded\n", TULIP_MAX_DEVICES); return ENXIO; } @@ -4537,10 +4072,7 @@ tulip_pci_attach(device_t dev) cfcsinfo = pci_read_config(dev, PCIR_COMMAND, 4); /* turn busmaster on in case BIOS doesn't set it */ - if(!(cfcsinfo & PCIM_CMD_BUSMASTEREN)) { - cfcsinfo |= PCIM_CMD_BUSMASTEREN; - pci_write_config(dev, PCIR_COMMAND, cfcsinfo, 4); - } + pci_enable_busmaster(dev); if (pci_get_vendor(dev) == DEC_VENDORID) { if (pci_get_device(dev) == CHIPID_21040) @@ -4556,17 +4088,17 @@ tulip_pci_attach(device_t dev) return ENXIO; if (chipid == TULIP_21040 && revinfo < 0x20) { - printf("de%d", unit); - printf(": not configured; 21040 pass 2.0 required (%d.%d found)\n", + device_printf(dev, "not configured; 21040 pass 2.0 required (%d.%d found)\n", revinfo >> 4, revinfo & 0x0f); return ENXIO; } else if (chipid == TULIP_21140 && revinfo < 0x11) { - printf("de%d: not configured; 21140 pass 1.1 required (%d.%d found)\n", - unit, revinfo >> 4, revinfo & 0x0f); + device_printf(dev, "not configured; 21140 pass 1.1 required (%d.%d found)\n", + revinfo >> 4, revinfo & 0x0f); return ENXIO; } sc = device_get_softc(dev); + sc->tulip_dev = dev; sc->tulip_pci_busno = pci_get_bus(dev); sc->tulip_pci_devno = pci_get_slot(dev); sc->tulip_chipid = chipid; @@ -4595,18 +4127,15 @@ tulip_pci_attach(device_t dev) pci_write_config(dev, PCI_CFDA, cfdainfo, 4); DELAY(11*1000); } - sc->tulip_unit = unit; - sc->tulip_name = "de"; + if_initname(&sc->tulip_if, device_get_name(dev), device_get_unit(dev)); sc->tulip_revinfo = revinfo; sc->tulip_if.if_softc = sc; #if defined(TULIP_IOMAPPED) rid = PCI_CBIO; - res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - 0, ~0, 1, RF_ACTIVE); + res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE); #else rid = PCI_CBMA; - res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0, ~0, 1, RF_ACTIVE); + res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); #endif if (!res) return ENXIO; @@ -4614,7 +4143,7 @@ tulip_pci_attach(device_t dev) sc->tulip_csrs_bsh = rman_get_bushandle(res); csr_base = 0; - tulips[unit] = sc; + tulips[device_get_unit(dev)] = sc; tulip_initcsrs(sc, csr_base + csroffset, csrsize); @@ -4635,18 +4164,15 @@ tulip_pci_attach(device_t dev) bit longer anyways) */ if ((retval = tulip_read_macaddr(sc)) < 0) { - printf("%s%d", sc->tulip_name, sc->tulip_unit); - printf(": can't read ENET ROM (why=%d) (", retval); + device_printf(dev, "can't read ENET ROM (why=%d) (", retval); for (idx = 0; idx < 32; idx++) printf("%02x", sc->tulip_rombuf[idx]); printf("\n"); - printf("%s%d: %s%s pass %d.%d\n", - sc->tulip_name, sc->tulip_unit, + device_printf(dev, "%s%s pass %d.%d\n", sc->tulip_boardid, tulip_chipdescs[sc->tulip_chipid], (sc->tulip_revinfo & 0xF0) >> 4, sc->tulip_revinfo & 0x0F); - printf("%s%d: address unknown\n", sc->tulip_name, sc->tulip_unit); + device_printf(dev, "address unknown\n"); } else { - int s; void (*intr_rtn)(void *) = tulip_intr_normal; if (sc->tulip_features & TULIP_HAVE_SHAREDINTR) @@ -4656,21 +4182,20 @@ tulip_pci_attach(device_t dev) void *ih; rid = 0; - res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, - 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE); + res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_SHAREABLE | RF_ACTIVE); if (res == 0 || bus_setup_intr(dev, res, INTR_TYPE_NET, - intr_rtn, sc, &ih)) { - printf("%s%d: couldn't map interrupt\n", - sc->tulip_name, sc->tulip_unit); + intr_rtn, sc, &ih, NULL)) { + device_printf(dev, "couldn't map interrupt\n"); free((caddr_t) sc->tulip_rxdescs, M_DEVBUF); free((caddr_t) sc->tulip_txdescs, M_DEVBUF); return ENXIO; } } - s = splimp(); + crit_enter(); tulip_attach(sc); - splx(s); + crit_exit(); } return 0; }