diff --git a/sys/dev/ep/if_ep.c b/sys/dev/ep/if_ep.c index 1201e8b590b7..67785ab6c4bc 100644 --- a/sys/dev/ep/if_ep.c +++ b/sys/dev/ep/if_ep.c @@ -26,8 +26,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * if_ep.c,v 1.19 1995/01/24 20:53:45 davidg Exp */ /* @@ -38,8 +36,6 @@ */ /* - * $FreeBSD$ - * * Promiscuous mode added and interrupt logic slightly changed * to reduce the number of adapter failures. Transceiver select * logic changed to use value from EEPROM. Autoconfiguration @@ -61,71 +57,67 @@ * */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include #include #include - #include #include #include -#include +#include #include #include -#include +#include #include #include - #include #include /* Exported variables */ devclass_t ep_devclass; -#if 0 -static char * ep_conn_type[] = {"UTP", "AUI", "???", "BNC"}; -static int if_media2ep_media[] = { 0, 0, 0, UTP, BNC, AUI }; -#endif - -static int ep_media2if_media[] = - { IFM_10_T, IFM_10_5, IFM_NONE, IFM_10_2, IFM_NONE }; +static int ep_media2if_media[] = +{IFM_10_T, IFM_10_5, IFM_NONE, IFM_10_2, IFM_NONE}; /* if functions */ -static void ep_if_init (void *); -static int ep_if_ioctl (struct ifnet *, u_long, caddr_t); -static void ep_if_start (struct ifnet *); -static void ep_if_watchdog (struct ifnet *); +static void ep_if_init(void *); +static int ep_if_ioctl(struct ifnet *, u_long, caddr_t); +static void ep_if_start(struct ifnet *); +static void ep_if_watchdog(struct ifnet *); /* if_media functions */ -static int ep_ifmedia_upd (struct ifnet *); -static void ep_ifmedia_sts (struct ifnet *, struct ifmediareq *); +static int ep_ifmedia_upd(struct ifnet *); +static void ep_ifmedia_sts(struct ifnet *, struct ifmediareq *); -static void epstop (struct ep_softc *); -static void epread (struct ep_softc *); -static int eeprom_rdy (struct ep_softc *); +static void epstop(struct ep_softc *); +static void epread(struct ep_softc *); +static int eeprom_rdy(struct ep_softc *); #define EP_FTST(sc, f) (sc->stat & (f)) #define EP_FSET(sc, f) (sc->stat |= (f)) #define EP_FRST(sc, f) (sc->stat &= ~(f)) static int -eeprom_rdy(sc) - struct ep_softc *sc; +eeprom_rdy(struct ep_softc *sc) { - int i; + int i; - for (i = 0; is_eeprom_busy(BASE) && i < MAX_EEPROMBUSY; i++) { - DELAY(100); - } - if (i >= MAX_EEPROMBUSY) { - printf("ep%d: eeprom failed to come ready.\n", sc->unit); - return (ENXIO); - } - return (0); + for (i = 0; is_eeprom_busy(BASE) && i < MAX_EEPROMBUSY; i++) + DELAY(100); + + if (i >= MAX_EEPROMBUSY) { + printf("ep%d: eeprom failed to come ready.\n", sc->unit); + return (ENXIO); + } + + return (0); } /* @@ -133,42 +125,40 @@ eeprom_rdy(sc) * before */ int -get_e(sc, offset, result) - struct ep_softc *sc; - u_int16_t offset; - u_int16_t *result; +get_e(struct ep_softc *sc, u_int16_t offset, u_int16_t *result) { if (eeprom_rdy(sc)) return (ENXIO); + outw(BASE + EP_W0_EEPROM_COMMAND, - (EEPROM_CMD_RD << sc->epb.cmd_off) | offset); + (EEPROM_CMD_RD << sc->epb.cmd_off) | offset); + if (eeprom_rdy(sc)) return (ENXIO); + (*result) = inw(BASE + EP_W0_EEPROM_DATA); return (0); } int -ep_get_macaddr(sc, addr) - struct ep_softc * sc; - u_char * addr; +ep_get_macaddr(struct ep_softc *sc, u_char *addr) { - int i; - u_int16_t result; - int error; - u_int16_t * macaddr; + int i; + u_int16_t result; + int error; + u_int16_t *macaddr; - macaddr = (u_int16_t *)addr; + macaddr = (u_int16_t *) addr; GO_WINDOW(0); - for(i = EEPROM_NODE_ADDR_0; i <= EEPROM_NODE_ADDR_2; i++) { + for (i = EEPROM_NODE_ADDR_0; i <= EEPROM_NODE_ADDR_2; i++) { error = get_e(sc, i, &result); if (error) return (error); macaddr[i] = htons(result); - } + } return (0); } @@ -176,42 +166,40 @@ ep_get_macaddr(sc, addr) int ep_alloc(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); - int rid; - int error = 0; - u_int16_t result; + struct ep_softc *sc = device_get_softc(dev); + int rid; + int error = 0; + u_int16_t result; - rid = 0; - sc->iobase = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - 0, ~0, 1, RF_ACTIVE); - if (!sc->iobase) { - device_printf(dev, "No I/O space?!\n"); + rid = 0; + sc->iobase = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, 1, RF_ACTIVE); + if (!sc->iobase) { + device_printf(dev, "No I/O space?!\n"); error = ENXIO; - goto bad; - } - - rid = 0; - sc->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, - 0, ~0, 1, RF_ACTIVE); - if (!sc->irq) { - device_printf(dev, "No irq?!\n"); + goto bad; + } + rid = 0; + sc->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, + 0, ~0, 1, RF_ACTIVE); + if (!sc->irq) { + device_printf(dev, "No irq?!\n"); error = ENXIO; - goto bad; - } + goto bad; + } + sc->dev = dev; + sc->unit = device_get_unit(dev); + sc->stat = 0; /* 16 bit access */ - sc->dev = dev; - sc->unit = device_get_unit(dev); - sc->stat = 0; /* 16 bit access */ + sc->ep_io_addr = rman_get_start(sc->iobase); - sc->ep_io_addr = rman_get_start(sc->iobase); - - sc->ep_btag = rman_get_bustag(sc->iobase); - sc->ep_bhandle = rman_get_bushandle(sc->iobase); + sc->ep_btag = rman_get_bustag(sc->iobase); + sc->ep_bhandle = rman_get_bushandle(sc->iobase); sc->ep_connectors = 0; sc->ep_connector = 0; - GO_WINDOW(0); + GO_WINDOW(0); sc->epb.cmd_off = 0; error = get_e(sc, EEPROM_PROD_ID, &result); @@ -229,24 +217,22 @@ ep_alloc(device_t dev) } void -ep_get_media(sc) - struct ep_softc * sc; +ep_get_media(struct ep_softc *sc) { - u_int16_t config; - - GO_WINDOW(0); - config = inw(BASE + EP_W0_CONFIG_CTRL); - if (config & IS_AUI) - sc->ep_connectors |= AUI; - if (config & IS_BNC) - sc->ep_connectors |= BNC; - if (config & IS_UTP) - sc->ep_connectors |= UTP; + u_int16_t config; - if (!(sc->ep_connectors & 7)) { + GO_WINDOW(0); + config = inw(BASE + EP_W0_CONFIG_CTRL); + if (config & IS_AUI) + sc->ep_connectors |= AUI; + if (config & IS_BNC) + sc->ep_connectors |= BNC; + if (config & IS_UTP) + sc->ep_connectors |= UTP; + + if (!(sc->ep_connectors & 7)) if (bootverbose) - device_printf(sc->dev, "no connectors!\n"); - } + device_printf(sc->dev, "no connectors!\n"); /* * This works for most of the cards so we'll do it here. @@ -254,14 +240,12 @@ ep_get_media(sc) * this later on. */ sc->ep_connector = inw(BASE + EP_W0_ADDRESS_CFG) >> ACF_CONNECTOR_BITS; - - return; } void ep_free(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); + struct ep_softc *sc = device_get_softc(dev); if (sc->ep_intrhand) bus_teardown_intr(dev, sc->irq, sc->ep_intrhand); @@ -269,20 +253,17 @@ ep_free(device_t dev) bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->iobase); if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq); - - return; } - + int -ep_attach(sc) - struct ep_softc * sc; +ep_attach(struct ep_softc *sc) { - struct ifnet * ifp = NULL; - struct ifmedia * ifm = NULL; - u_short * p; - int i; - int attached; - int error; + struct ifnet *ifp = NULL; + struct ifmedia *ifm = NULL; + u_short *p; + int i; + int attached; + int error; sc->gone = 0; @@ -291,19 +272,17 @@ ep_attach(sc) device_printf(sc->dev, "Unable to retrieve Ethernet address!\n"); return (ENXIO); } - /* * Setup the station address */ p = (u_short *)&sc->arpcom.ac_enaddr; GO_WINDOW(2); - for (i = 0; i < 3; i++) { + for (i = 0; i < 3; i++) outw(BASE + EP_W2_ADDR_0 + (i * 2), ntohs(p[i])); - } device_printf(sc->dev, "Ethernet address %6D\n", - sc->arpcom.ac_enaddr, ":"); - + sc->arpcom.ac_enaddr, ":"); + ifp = &sc->arpcom.ac_if; attached = (ifp->if_softc != 0); @@ -323,34 +302,33 @@ ep_attach(sc) ifmedia_init(&sc->ifmedia, 0, ep_ifmedia_upd, ep_ifmedia_sts); if (sc->ep_connectors & AUI) - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_5, 0, NULL); + ifmedia_add(&sc->ifmedia, IFM_ETHER | IFM_10_5, 0, NULL); if (sc->ep_connectors & UTP) - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T, 0, NULL); + ifmedia_add(&sc->ifmedia, IFM_ETHER | IFM_10_T, 0, NULL); if (sc->ep_connectors & BNC) - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_2, 0, NULL); + ifmedia_add(&sc->ifmedia, IFM_ETHER | IFM_10_2, 0, NULL); if (!sc->ep_connectors) - ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_NONE, 0, NULL); - - ifmedia_set(&sc->ifmedia, IFM_ETHER|ep_media2if_media[sc->ep_connector]); - + ifmedia_add(&sc->ifmedia, IFM_ETHER | IFM_NONE, 0, NULL); + + ifmedia_set(&sc->ifmedia, IFM_ETHER | ep_media2if_media[sc->ep_connector]); + ifm = &sc->ifmedia; ifm->ifm_media = ifm->ifm_cur->ifm_media; ep_ifmedia_upd(ifp); } - if (!attached) ether_ifattach(ifp, sc->arpcom.ac_enaddr); #ifdef EP_LOCAL_STATS sc->rx_no_first = sc->rx_no_mbuf = sc->rx_bpf_disc = - sc->rx_overrunf = sc->rx_overrunl = sc->tx_underrun = 0; + sc->rx_overrunf = sc->rx_overrunl = sc->tx_underrun = 0; #endif EP_FSET(sc, F_RX_FIRST); sc->top = sc->mcur = 0; epstop(sc); - return 0; + return (0); } int @@ -366,7 +344,6 @@ ep_detach(device_t dev) device_printf(dev, "already unloaded\n"); return (0); } - epstop(sc); ifp->if_flags &= ~IFF_RUNNING; @@ -383,458 +360,449 @@ ep_detach(device_t dev) * interrupts. ?! */ static void -ep_if_init(xsc) - void *xsc; +ep_if_init(void *xsc) { - struct ep_softc *sc = xsc; - register struct ifnet *ifp = &sc->arpcom.ac_if; - int s, i; + struct ep_softc *sc = xsc; + struct ifnet *ifp = &sc->arpcom.ac_if; + int s, i; - if (sc->gone) - return; + if (sc->gone) + return; - /* - if (ifp->if_addrlist == (struct ifaddr *) 0) - return; - */ + s = splimp(); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - s = splimp(); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + GO_WINDOW(0); + outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); + GO_WINDOW(4); + outw(BASE + EP_W4_MEDIA_TYPE, DISABLE_UTP); + GO_WINDOW(0); - GO_WINDOW(0); - outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); - GO_WINDOW(4); - outw(BASE + EP_W4_MEDIA_TYPE, DISABLE_UTP); - GO_WINDOW(0); + /* Disable the card */ + outw(BASE + EP_W0_CONFIG_CTRL, 0); - /* Disable the card */ - outw(BASE + EP_W0_CONFIG_CTRL, 0); + /* Enable the card */ + outw(BASE + EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ); - /* Enable the card */ - outw(BASE + EP_W0_CONFIG_CTRL, ENABLE_DRQ_IRQ); + GO_WINDOW(2); - GO_WINDOW(2); + /* Reload the ether_addr. */ + for (i = 0; i < 6; i++) + outb(BASE + EP_W2_ADDR_0 + i, sc->arpcom.ac_enaddr[i]); - /* Reload the ether_addr. */ - for (i = 0; i < 6; i++) - outb(BASE + EP_W2_ADDR_0 + i, sc->arpcom.ac_enaddr[i]); + outw(BASE + EP_COMMAND, RX_RESET); + outw(BASE + EP_COMMAND, TX_RESET); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - outw(BASE + EP_COMMAND, RX_RESET); - outw(BASE + EP_COMMAND, TX_RESET); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + /* Window 1 is operating window */ + GO_WINDOW(1); + for (i = 0; i < 31; i++) + inb(BASE + EP_W1_TX_STATUS); - /* Window 1 is operating window */ - GO_WINDOW(1); - for (i = 0; i < 31; i++) - inb(BASE + EP_W1_TX_STATUS); + /* get rid of stray intr's */ + outw(BASE + EP_COMMAND, ACK_INTR | 0xff); - /* get rid of stray intr's */ - outw(BASE + EP_COMMAND, ACK_INTR | 0xff); + outw(BASE + EP_COMMAND, SET_RD_0_MASK | S_5_INTS); - outw(BASE + EP_COMMAND, SET_RD_0_MASK | S_5_INTS); + outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); - outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); + if (ifp->if_flags & IFF_PROMISC) + outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | + FIL_GROUP | FIL_BRDCST | FIL_ALL); + else + outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | + FIL_GROUP | FIL_BRDCST); - if (ifp->if_flags & IFF_PROMISC) - outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | - FIL_GROUP | FIL_BRDCST | FIL_ALL); - else - outw(BASE + EP_COMMAND, SET_RX_FILTER | FIL_INDIVIDUAL | - FIL_GROUP | FIL_BRDCST); + if (!sc->epb.mii_trans) + ep_ifmedia_upd(ifp); - if (!sc->epb.mii_trans) { - ep_ifmedia_upd(ifp); - } + outw(BASE + EP_COMMAND, RX_ENABLE); + outw(BASE + EP_COMMAND, TX_ENABLE); - outw(BASE + EP_COMMAND, RX_ENABLE); - outw(BASE + EP_COMMAND, TX_ENABLE); - - ifp->if_flags |= IFF_RUNNING; - ifp->if_flags &= ~IFF_OACTIVE; /* just in case */ + ifp->if_flags |= IFF_RUNNING; + ifp->if_flags &= ~IFF_OACTIVE; /* just in case */ #ifdef EP_LOCAL_STATS - sc->rx_no_first = sc->rx_no_mbuf = - sc->rx_overrunf = sc->rx_overrunl = sc->tx_underrun = 0; + sc->rx_no_first = sc->rx_no_mbuf = + sc->rx_overrunf = sc->rx_overrunl = sc->tx_underrun = 0; #endif - EP_FSET(sc, F_RX_FIRST); - if (sc->top) { - m_freem(sc->top); - sc->top = sc->mcur = 0; - } - outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); - outw(BASE + EP_COMMAND, SET_TX_START_THRESH | 16); + EP_FSET(sc, F_RX_FIRST); + if (sc->top) { + m_freem(sc->top); + sc->top = sc->mcur = 0; + } + outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); + outw(BASE + EP_COMMAND, SET_TX_START_THRESH | 16); - /* - * Store up a bunch of mbuf's for use later. (MAX_MBS). First we free up - * any that we had in case we're being called from intr or somewhere - * else. - */ + /* + * Store up a bunch of mbuf's for use later. (MAX_MBS). First we free up + * any that we had in case we're being called from intr or somewhere + * else. + */ - GO_WINDOW(1); - ep_if_start(ifp); + GO_WINDOW(1); + ep_if_start(ifp); - splx(s); + splx(s); } static void -ep_if_start(ifp) - struct ifnet *ifp; +ep_if_start(struct ifnet *ifp) { - struct ep_softc *sc; - u_int len; - struct mbuf *m, *m0; - int s, pad; + struct ep_softc *sc; + u_int len; + struct mbuf *m, *m0; + int s, pad; - sc = ifp->if_softc; - if (sc->gone) - return; + sc = ifp->if_softc; + if (sc->gone) + return; - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - if (ifp->if_flags & IFF_OACTIVE) - return; + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + if (ifp->if_flags & IFF_OACTIVE) + return; startagain: - /* Sneak a peek at the next packet */ - IF_DEQUEUE(&ifp->if_snd, m0); - if (m0 == NULL) - return; - for (len = 0, m = m0; m != NULL; m = m->m_next) - len += m->m_len; + /* Sneak a peek at the next packet */ + IF_DEQUEUE(&ifp->if_snd, m0); + if (m0 == NULL) + return; + for (len = 0, m = m0; m != NULL; m = m->m_next) + len += m->m_len; - pad = (4 - len) & 3; + pad = (4 - len) & 3; - /* - * The 3c509 automatically pads short packets to minimum ethernet length, - * but we drop packets that are too large. Perhaps we should truncate - * them instead? - */ - if (len + pad > ETHER_MAX_LEN) { - /* packet is obviously too large: toss it */ - ifp->if_oerrors++; - m_freem(m0); - goto readcheck; - } - if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { - /* no room in FIFO */ - outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); - /* make sure */ - if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { - ifp->if_flags |= IFF_OACTIVE; - IF_PREPEND(&ifp->if_snd, m0); - return; - } - } else { - outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | EP_THRESH_DISABLE); - } - - s = splhigh(); - - outw(BASE + EP_W1_TX_PIO_WR_1, len); - outw(BASE + EP_W1_TX_PIO_WR_1, 0x0); /* Second dword meaningless */ - - if (EP_FTST(sc, F_ACCESS_32_BITS)) { - for (m = m0; m != NULL; m = m->m_next) { - if (m->m_len > 3) - outsl(BASE + EP_W1_TX_PIO_WR_1, - mtod(m, caddr_t), m->m_len / 4); - if (m->m_len & 3) - outsb(BASE + EP_W1_TX_PIO_WR_1, - mtod(m, caddr_t) + (m->m_len & (~3)), m->m_len & 3); - } - } else { - for (m = m0; m != NULL; m = m->m_next) { - if (m->m_len > 1) - outsw(BASE + EP_W1_TX_PIO_WR_1, - mtod(m, caddr_t), m->m_len / 2); - if (m->m_len & 1) - outb(BASE + EP_W1_TX_PIO_WR_1, - *(mtod(m, caddr_t) + m->m_len - 1)); - } - } - - while (pad--) - outb(BASE + EP_W1_TX_PIO_WR_1, 0); /* Padding */ - - splx(s); - - BPF_MTAP(ifp, m0); - - ifp->if_timer = 2; - ifp->if_opackets++; - m_freem(m0); - - /* - * Is another packet coming in? We don't want to overflow the tiny RX - * fifo. - */ -readcheck: - if (inw(BASE + EP_W1_RX_STATUS) & RX_BYTES_MASK) { /* - * we check if we have packets left, in that case we prepare to come - * back later - */ - if (ifp->if_snd.ifq_head) - outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); - return; - } - goto startagain; + * The 3c509 automatically pads short packets to minimum ethernet length, + * but we drop packets that are too large. Perhaps we should truncate + * them instead? + */ + if (len + pad > ETHER_MAX_LEN) { + /* packet is obviously too large: toss it */ + ifp->if_oerrors++; + m_freem(m0); + goto readcheck; + } + if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { + /* no room in FIFO */ + outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4)); + /* make sure */ + if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) { + ifp->if_flags |= IFF_OACTIVE; + IF_PREPEND(&ifp->if_snd, m0); + return; + } + } else + outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | EP_THRESH_DISABLE); + + s = splhigh(); + + outw(BASE + EP_W1_TX_PIO_WR_1, len); + outw(BASE + EP_W1_TX_PIO_WR_1, 0x0); /* Second dword meaningless */ + + if (EP_FTST(sc, F_ACCESS_32_BITS)) { + for (m = m0; m != NULL; m = m->m_next) { + if (m->m_len > 3) + outsl(BASE + EP_W1_TX_PIO_WR_1, + mtod(m, caddr_t), m->m_len / 4); + if (m->m_len & 3) + outsb(BASE + EP_W1_TX_PIO_WR_1, + mtod(m, caddr_t)+(m->m_len & (~3)), m->m_len & 3); + } + } else { + for (m = m0; m != NULL; m = m->m_next) { + if (m->m_len > 1) + outsw(BASE + EP_W1_TX_PIO_WR_1, + mtod(m, caddr_t), m->m_len / 2); + if (m->m_len & 1) + outb(BASE + EP_W1_TX_PIO_WR_1, + *(mtod(m, caddr_t)+m->m_len - 1)); + } + } + + while (pad--) + outb(BASE + EP_W1_TX_PIO_WR_1, 0); /* Padding */ + + splx(s); + + BPF_MTAP(ifp, m0); + + ifp->if_timer = 2; + ifp->if_opackets++; + m_freem(m0); + + /* + * Is another packet coming in? We don't want to overflow the tiny RX + * fifo. + */ +readcheck: + if (inw(BASE + EP_W1_RX_STATUS) & RX_BYTES_MASK) { + /* + * we check if we have packets left, in that case we prepare to come + * back later + */ + if (ifp->if_snd.ifq_head) + outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); + return; + } + goto startagain; } void -ep_intr(arg) - void *arg; +ep_intr(void *arg) { - struct ep_softc *sc; - register int status; - struct ifnet *ifp; - int x; + struct ep_softc *sc; + int status; + struct ifnet *ifp; + int x; - x = splbio(); + x = splbio(); - sc = (struct ep_softc *)arg; + sc = (struct ep_softc *) arg; - /* - * quick fix: Try to detect an interrupt when the card goes away. - */ - if (sc->gone || inw(BASE + EP_STATUS) == 0xffff) { - splx(x); - return; - } + /* + * quick fix: Try to detect an interrupt when the card goes away. + */ + if (sc->gone || inw(BASE + EP_STATUS) == 0xffff) { + splx(x); + return; + } + ifp = &sc->arpcom.ac_if; - ifp = &sc->arpcom.ac_if; - - outw(BASE + EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ + outw(BASE + EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ rescan: - while ((status = inw(BASE + EP_STATUS)) & S_5_INTS) { + while ((status = inw(BASE + EP_STATUS)) & S_5_INTS) { - /* first acknowledge all interrupt sources */ - outw(BASE + EP_COMMAND, ACK_INTR | (status & S_MASK)); + /* first acknowledge all interrupt sources */ + outw(BASE + EP_COMMAND, ACK_INTR | (status & S_MASK)); - if (status & (S_RX_COMPLETE | S_RX_EARLY)) - epread(sc); - if (status & S_TX_AVAIL) { - /* we need ACK */ - ifp->if_timer = 0; - ifp->if_flags &= ~IFF_OACTIVE; - GO_WINDOW(1); - inw(BASE + EP_W1_FREE_TX); - ep_if_start(ifp); - } - if (status & S_CARD_FAILURE) { - ifp->if_timer = 0; + if (status & (S_RX_COMPLETE | S_RX_EARLY)) + epread(sc); + if (status & S_TX_AVAIL) { + /* we need ACK */ + ifp->if_timer = 0; + ifp->if_flags &= ~IFF_OACTIVE; + GO_WINDOW(1); + inw(BASE + EP_W1_FREE_TX); + ep_if_start(ifp); + } + if (status & S_CARD_FAILURE) { + ifp->if_timer = 0; #ifdef EP_LOCAL_STATS - printf("\nep%d:\n\tStatus: %x\n", sc->unit, status); - GO_WINDOW(4); - printf("\tFIFO Diagnostic: %x\n", inw(BASE + EP_W4_FIFO_DIAG)); - printf("\tStat: %x\n", sc->stat); - printf("\tIpackets=%d, Opackets=%d\n", - ifp->if_ipackets, ifp->if_opackets); - printf("\tNOF=%d, NOMB=%d, RXOF=%d, RXOL=%d, TXU=%d\n", - sc->rx_no_first, sc->rx_no_mbuf, sc->rx_overrunf, - sc->rx_overrunl, sc->tx_underrun); + printf("\nep%d:\n\tStatus: %x\n", sc->unit, status); + GO_WINDOW(4); + printf("\tFIFO Diagnostic: %x\n", inw(BASE + EP_W4_FIFO_DIAG)); + printf("\tStat: %x\n", sc->stat); + printf("\tIpackets=%d, Opackets=%d\n", + ifp->if_ipackets, ifp->if_opackets); + printf("\tNOF=%d, NOMB=%d, RXOF=%d, RXOL=%d, TXU=%d\n", + sc->rx_no_first, sc->rx_no_mbuf, sc->rx_overrunf, + sc->rx_overrunl, sc->tx_underrun); #else #ifdef DIAGNOSTIC - printf("ep%d: Status: %x (input buffer overflow)\n", sc->unit, status); + printf("ep%d: Status: %x (input buffer overflow)\n", sc->unit, status); #else - ++ifp->if_ierrors; + ++ifp->if_ierrors; #endif #endif - ep_if_init(sc); - splx(x); - return; - } - if (status & S_TX_COMPLETE) { - ifp->if_timer = 0; - /* we need ACK. we do it at the end */ - /* - * We need to read TX_STATUS until we get a 0 status in order to - * turn off the interrupt flag. - */ - while ((status = inb(BASE + EP_W1_TX_STATUS)) & TXS_COMPLETE) { - if (status & TXS_SUCCES_INTR_REQ); - else if (status & (TXS_UNDERRUN | TXS_JABBER | TXS_MAX_COLLISION)) { - outw(BASE + EP_COMMAND, TX_RESET); - if (status & TXS_UNDERRUN) { -#ifdef EP_LOCAL_STATS - sc->tx_underrun++; -#endif - } else { - if (status & TXS_JABBER); - else /* TXS_MAX_COLLISION - we shouldn't get here */ - ++ifp->if_collisions; - } - ++ifp->if_oerrors; - outw(BASE + EP_COMMAND, TX_ENABLE); - /* - * To have a tx_avail_int but giving the chance to the - * Reception - */ - if (ifp->if_snd.ifq_head) { - outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); - } + ep_if_init(sc); + splx(x); + return; } - outb(BASE + EP_W1_TX_STATUS, 0x0); /* pops up the next - * status */ - } /* while */ - ifp->if_flags &= ~IFF_OACTIVE; - GO_WINDOW(1); - inw(BASE + EP_W1_FREE_TX); - ep_if_start(ifp); - } /* end TX_COMPLETE */ - } + if (status & S_TX_COMPLETE) { + ifp->if_timer = 0; + /* we need ACK. we do it at the end */ + /* + * We need to read TX_STATUS until we get a 0 status in order to + * turn off the interrupt flag. + */ + while ((status = inb(BASE + EP_W1_TX_STATUS)) & TXS_COMPLETE) { + if (status & TXS_SUCCES_INTR_REQ); + else if (status & (TXS_UNDERRUN | TXS_JABBER | TXS_MAX_COLLISION)) { + outw(BASE + EP_COMMAND, TX_RESET); + if (status & TXS_UNDERRUN) { +#ifdef EP_LOCAL_STATS + sc->tx_underrun++; +#endif + } else { + if (status & TXS_JABBER); + else /* TXS_MAX_COLLISION - + * we shouldn't get here */ + ++ifp->if_collisions; + } + ++ifp->if_oerrors; + outw(BASE + EP_COMMAND, TX_ENABLE); + /* + * To have a tx_avail_int but giving the chance to the + * Reception + */ + if (ifp->if_snd.ifq_head) + outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | 8); + } + outb(BASE + EP_W1_TX_STATUS, 0x0); /* pops up the next + * status */ + } /* while */ + ifp->if_flags &= ~IFF_OACTIVE; + GO_WINDOW(1); + inw(BASE + EP_W1_FREE_TX); + ep_if_start(ifp); + } /* end TX_COMPLETE */ + } - outw(BASE + EP_COMMAND, C_INTR_LATCH); /* ACK int Latch */ + outw(BASE + EP_COMMAND, C_INTR_LATCH); /* ACK int Latch */ - if ((status = inw(BASE + EP_STATUS)) & S_5_INTS) - goto rescan; + if ((status = inw(BASE + EP_STATUS)) & S_5_INTS) + goto rescan; - /* re-enable Ints */ - outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); + /* re-enable Ints */ + outw(BASE + EP_COMMAND, SET_INTR_MASK | S_5_INTS); - splx(x); + splx(x); } static void -epread(sc) - register struct ep_softc *sc; +epread(struct ep_softc *sc) { - struct mbuf *top, *mcur, *m; - struct ifnet *ifp; - int lenthisone; + struct mbuf *top, *mcur, *m; + struct ifnet *ifp; + int lenthisone; - short rx_fifo2, status; - register short rx_fifo; + short rx_fifo2, status; + short rx_fifo; - ifp = &sc->arpcom.ac_if; - status = inw(BASE + EP_W1_RX_STATUS); + ifp = &sc->arpcom.ac_if; + status = inw(BASE + EP_W1_RX_STATUS); read_again: - if (status & ERR_RX) { - ++ifp->if_ierrors; - if (status & ERR_RX_OVERRUN) { - /* - * we can think the rx latency is actually greather than we - * expect - */ + if (status & ERR_RX) { + ++ifp->if_ierrors; + if (status & ERR_RX_OVERRUN) { + /* + * we can think the rx latency is actually greather than we + * expect + */ #ifdef EP_LOCAL_STATS - if (EP_FTST(sc, F_RX_FIRST)) - sc->rx_overrunf++; - else - sc->rx_overrunl++; + if (EP_FTST(sc, F_RX_FIRST)) + sc->rx_overrunf++; + else + sc->rx_overrunl++; #endif + } + goto out; } - goto out; - } - rx_fifo = rx_fifo2 = status & RX_BYTES_MASK; + rx_fifo = rx_fifo2 = status & RX_BYTES_MASK; - if (EP_FTST(sc, F_RX_FIRST)) { - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (!m) - goto out; - if (rx_fifo >= MINCLSIZE) - MCLGET(m, M_DONTWAIT); - sc->top = sc->mcur = top = m; + if (EP_FTST(sc, F_RX_FIRST)) { + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (!m) + goto out; + if (rx_fifo >= MINCLSIZE) + MCLGET(m, M_DONTWAIT); + sc->top = sc->mcur = top = m; #define EROUND ((sizeof(struct ether_header) + 3) & ~3) #define EOFF (EROUND - sizeof(struct ether_header)) - top->m_data += EOFF; + top->m_data += EOFF; - /* Read what should be the header. */ - insw(BASE + EP_W1_RX_PIO_RD_1, - mtod(top, caddr_t), sizeof(struct ether_header) / 2); - top->m_len = sizeof(struct ether_header); - rx_fifo -= sizeof(struct ether_header); - sc->cur_len = rx_fifo2; - } else { - /* come here if we didn't have a complete packet last time */ - top = sc->top; - m = sc->mcur; - sc->cur_len += rx_fifo2; - } - - /* Reads what is left in the RX FIFO */ - while (rx_fifo > 0) { - lenthisone = min(rx_fifo, M_TRAILINGSPACE(m)); - if (lenthisone == 0) { /* no room in this one */ - mcur = m; - MGET(m, M_DONTWAIT, MT_DATA); - if (!m) - goto out; - if (rx_fifo >= MINCLSIZE) - MCLGET(m, M_DONTWAIT); - m->m_len = 0; - mcur->m_next = m; - lenthisone = min(rx_fifo, M_TRAILINGSPACE(m)); - } - if (EP_FTST(sc, F_ACCESS_32_BITS)) { /* default for EISA configured cards*/ - insl(BASE + EP_W1_RX_PIO_RD_1, mtod(m, caddr_t) + m->m_len, - lenthisone / 4); - m->m_len += (lenthisone & ~3); - if (lenthisone & 3) - insb(BASE + EP_W1_RX_PIO_RD_1, - mtod(m, caddr_t) + m->m_len, - lenthisone & 3); - m->m_len += (lenthisone & 3); + /* Read what should be the header. */ + insw(BASE + EP_W1_RX_PIO_RD_1, + mtod(top, caddr_t), sizeof(struct ether_header) / 2); + top->m_len = sizeof(struct ether_header); + rx_fifo -= sizeof(struct ether_header); + sc->cur_len = rx_fifo2; } else { - insw(BASE + EP_W1_RX_PIO_RD_1, mtod(m, caddr_t) + m->m_len, - lenthisone / 2); - m->m_len += lenthisone; - if (lenthisone & 1) - *(mtod(m, caddr_t) + m->m_len - 1) = inb(BASE + EP_W1_RX_PIO_RD_1); + /* come here if we didn't have a complete packet last time */ + top = sc->top; + m = sc->mcur; + sc->cur_len += rx_fifo2; } - rx_fifo -= lenthisone; - } - if (status & ERR_RX_INCOMPLETE) { /* we haven't received the complete - * packet */ - sc->mcur = m; + /* Reads what is left in the RX FIFO */ + while (rx_fifo > 0) { + lenthisone = min(rx_fifo, M_TRAILINGSPACE(m)); + if (lenthisone == 0) { /* no room in this one */ + mcur = m; + MGET(m, M_DONTWAIT, MT_DATA); + if (!m) + goto out; + if (rx_fifo >= MINCLSIZE) + MCLGET(m, M_DONTWAIT); + m->m_len = 0; + mcur->m_next = m; + lenthisone = min(rx_fifo, M_TRAILINGSPACE(m)); + } + if (EP_FTST(sc, F_ACCESS_32_BITS)) { /* default for EISA + * configured cards */ + insl(BASE + EP_W1_RX_PIO_RD_1, mtod(m, caddr_t)+m->m_len, + lenthisone / 4); + m->m_len += (lenthisone & ~3); + if (lenthisone & 3) + insb(BASE + EP_W1_RX_PIO_RD_1, + mtod(m, caddr_t)+m->m_len, + lenthisone & 3); + m->m_len += (lenthisone & 3); + } else { + insw(BASE + EP_W1_RX_PIO_RD_1, mtod(m, caddr_t)+m->m_len, + lenthisone / 2); + m->m_len += lenthisone; + if (lenthisone & 1) + *(mtod(m, caddr_t)+m->m_len - 1) = inb(BASE + EP_W1_RX_PIO_RD_1); + } + rx_fifo -= lenthisone; + } + + if (status & ERR_RX_INCOMPLETE) { /* we haven't received the + * complete packet */ + sc->mcur = m; #ifdef EP_LOCAL_STATS - sc->rx_no_first++; /* to know how often we come here */ + sc->rx_no_first++; /* to know how often we come here */ #endif - EP_FRST(sc, F_RX_FIRST); - if (!((status = inw(BASE + EP_W1_RX_STATUS)) & ERR_RX_INCOMPLETE)) { - /* we see if by now, the packet has completly arrived */ - goto read_again; + EP_FRST(sc, F_RX_FIRST); + if (!((status = inw(BASE + EP_W1_RX_STATUS)) & ERR_RX_INCOMPLETE)) { + /* + * we see if by now, the packet has completly + * arrived + */ + goto read_again; + } + outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_NEXT_EARLY_THRESH); + return; } - outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_NEXT_EARLY_THRESH); - return; - } - outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); - ++ifp->if_ipackets; - EP_FSET(sc, F_RX_FIRST); - top->m_pkthdr.rcvif = &sc->arpcom.ac_if; - top->m_pkthdr.len = sc->cur_len; + outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); + ++ifp->if_ipackets; + EP_FSET(sc, F_RX_FIRST); + top->m_pkthdr.rcvif = &sc->arpcom.ac_if; + top->m_pkthdr.len = sc->cur_len; - (*ifp->if_input)(ifp, top); - sc->top = 0; - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); - return; + (*ifp->if_input) (ifp, top); + sc->top = 0; + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); + return; out: - outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); - if (sc->top) { - m_freem(sc->top); - sc->top = 0; + outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); + if (sc->top) { + m_freem(sc->top); + sc->top = 0; #ifdef EP_LOCAL_STATS - sc->rx_no_mbuf++; + sc->rx_no_mbuf++; #endif - } - EP_FSET(sc, F_RX_FIRST); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); + } + EP_FSET(sc, F_RX_FIRST); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH); } -static int -ep_ifmedia_upd(ifp) - struct ifnet * ifp; +static int +ep_ifmedia_upd(struct ifnet *ifp) { - struct ep_softc * sc = ifp->if_softc; - int i = 0, j; + struct ep_softc *sc = ifp->if_softc; + int i = 0, j; GO_WINDOW(0); outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); @@ -843,28 +811,28 @@ ep_ifmedia_upd(ifp) GO_WINDOW(0); switch (IFM_SUBTYPE(sc->ifmedia.ifm_media)) { - case IFM_10_T: - if (sc->ep_connectors & UTP) { - i = ACF_CONNECTOR_UTP; - GO_WINDOW(4); - outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP); - } - break; - case IFM_10_2: - if (sc->ep_connectors & BNC) { - i = ACF_CONNECTOR_BNC; - outw(BASE + EP_COMMAND, START_TRANSCEIVER); - DELAY(DELAY_MULTIPLE * 1000); - } - break; - case IFM_10_5: - if (sc->ep_connectors & AUI) - i = ACF_CONNECTOR_AUI; - break; - default: - i = sc->ep_connector; - device_printf(sc->dev, - "strange connector type in EEPROM: assuming AUI\n"); + case IFM_10_T: + if (sc->ep_connectors & UTP) { + i = ACF_CONNECTOR_UTP; + GO_WINDOW(4); + outw(BASE + EP_W4_MEDIA_TYPE, ENABLE_UTP); + } + break; + case IFM_10_2: + if (sc->ep_connectors & BNC) { + i = ACF_CONNECTOR_BNC; + outw(BASE + EP_COMMAND, START_TRANSCEIVER); + DELAY(DELAY_MULTIPLE * 1000); + } + break; + case IFM_10_5: + if (sc->ep_connectors & AUI) + i = ACF_CONNECTOR_AUI; + break; + default: + i = sc->ep_connector; + device_printf(sc->dev, + "strange connector type in EEPROM: assuming AUI\n"); } GO_WINDOW(0); @@ -875,25 +843,18 @@ ep_ifmedia_upd(ifp) } static void -ep_ifmedia_sts(ifp, ifmr) - struct ifnet * ifp; - struct ifmediareq * ifmr; +ep_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) { - struct ep_softc * sc = ifp->if_softc; + struct ep_softc *sc = ifp->if_softc; ifmr->ifm_active = sc->ifmedia.ifm_media; - - return; } static int -ep_if_ioctl(ifp, cmd, data) - struct ifnet * ifp; - u_long cmd; - caddr_t data; +ep_if_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { - struct ep_softc * sc = ifp->if_softc; - struct ifreq * ifr = (struct ifreq *)data; + struct ep_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *) data; int s, error = 0; s = splimp(); @@ -904,15 +865,14 @@ ep_if_ioctl(ifp, cmd, data) (ifp->if_flags & IFF_RUNNING)) { ifp->if_flags &= ~IFF_RUNNING; epstop(sc); - } else { + } else /* reinitialize card on any parameter change */ ep_if_init(sc); - } break; #ifdef notdef case SIOCGHWADDR: - bcopy((caddr_t) sc->sc_addr, (caddr_t) & ifr->ifr_data, - sizeof(sc->sc_addr)); + bcopy((caddr_t)sc->sc_addr, (caddr_t)&ifr->ifr_data, + sizeof(sc->sc_addr)); break; #endif case SIOCADDMULTI: @@ -928,11 +888,10 @@ ep_if_ioctl(ifp, cmd, data) break; case SIOCSIFMEDIA: case SIOCGIFMEDIA: - if (!sc->epb.mii_trans) { + if (!sc->epb.mii_trans) error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, cmd); - } else { + else error = EINVAL; - } break; default: error = ether_ioctl(ifp, cmd, data); @@ -945,50 +904,44 @@ ep_if_ioctl(ifp, cmd, data) } static void -ep_if_watchdog(ifp) - struct ifnet *ifp; +ep_if_watchdog(struct ifnet *ifp) { - struct ep_softc *sc = ifp->if_softc; + struct ep_softc *sc = ifp->if_softc; - /* - printf("ep: watchdog\n"); +/* + printf("ep: watchdog\n"); - log(LOG_ERR, "ep%d: watchdog\n", ifp->if_unit); - ifp->if_oerrors++; - */ + log(LOG_ERR, "ep%d: watchdog\n", ifp->if_unit); + ifp->if_oerrors++; +*/ - if (sc->gone) { - return; - } - - ifp->if_flags &= ~IFF_OACTIVE; - ep_if_start(ifp); - ep_intr(ifp->if_softc); + if (sc->gone) + return; + ifp->if_flags &= ~IFF_OACTIVE; + ep_if_start(ifp); + ep_intr(ifp->if_softc); } static void -epstop(sc) - struct ep_softc *sc; +epstop(struct ep_softc *sc) { - if (sc->gone) { - return; - } + if (sc->gone) + return; + outw(BASE + EP_COMMAND, RX_DISABLE); + outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - outw(BASE + EP_COMMAND, RX_DISABLE); - outw(BASE + EP_COMMAND, RX_DISCARD_TOP_PACK); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + outw(BASE + EP_COMMAND, TX_DISABLE); + outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); + DELAY(800); - outw(BASE + EP_COMMAND, TX_DISABLE); - outw(BASE + EP_COMMAND, STOP_TRANSCEIVER); - DELAY(800); + outw(BASE + EP_COMMAND, RX_RESET); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); + outw(BASE + EP_COMMAND, TX_RESET); + while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - outw(BASE + EP_COMMAND, RX_RESET); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - outw(BASE + EP_COMMAND, TX_RESET); - while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); - - outw(BASE + EP_COMMAND, C_INTR_LATCH); - outw(BASE + EP_COMMAND, SET_RD_0_MASK); - outw(BASE + EP_COMMAND, SET_INTR_MASK); - outw(BASE + EP_COMMAND, SET_RX_FILTER); + outw(BASE + EP_COMMAND, C_INTR_LATCH); + outw(BASE + EP_COMMAND, SET_RD_0_MASK); + outw(BASE + EP_COMMAND, SET_INTR_MASK); + outw(BASE + EP_COMMAND, SET_RX_FILTER); } diff --git a/sys/dev/ep/if_ep_eisa.c b/sys/dev/ep/if_ep_eisa.c index e9b8348edd91..f80fa8afef93 100644 --- a/sys/dev/ep/if_ep_eisa.c +++ b/sys/dev/ep/if_ep_eisa.c @@ -18,26 +18,25 @@ * Justin T. Gibbs. * 4. Modifications may be freely made to this file if the above conditions * are met. - * - * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include #include - #include #include #include #include -#include +#include #include #include -#include - +#include #include @@ -72,32 +71,25 @@ static const char *ep_match(eisa_id_t type); -static const char* +static const char * ep_match(eisa_id_t type) { - switch(type) { - case EISA_DEVICE_ID_3COM_3C509_TP: - return "3Com 3C509-TP Network Adapter"; - break; - case EISA_DEVICE_ID_3COM_3C509_BNC: - return "3Com 3C509-BNC Network Adapter"; - break; - case EISA_DEVICE_ID_3COM_3C579_TP: - return "3Com 3C579-TP EISA Network Adapter"; - break; - case EISA_DEVICE_ID_3COM_3C579_BNC: - return "3Com 3C579-BNC EISA Network Adapter"; - break; - case EISA_DEVICE_ID_3COM_3C509_COMBO: - return "3Com 3C509-Combo Network Adapter"; - break; - case EISA_DEVICE_ID_3COM_3C509_TPO: - return "3Com 3C509-TPO Network Adapter"; - break; - default: - break; + switch (type) { + case EISA_DEVICE_ID_3COM_3C509_TP: + return ("3Com 3C509-TP Network Adapter"); + case EISA_DEVICE_ID_3COM_3C509_BNC: + return ("3Com 3C509-BNC Network Adapter"); + case EISA_DEVICE_ID_3COM_3C579_TP: + return ("3Com 3C579-TP EISA Network Adapter"); + case EISA_DEVICE_ID_3COM_3C579_BNC: + return ("3Com 3C579-BNC EISA Network Adapter"); + case EISA_DEVICE_ID_3COM_3C509_COMBO: + return ("3Com 3C509-Combo Network Adapter"); + case EISA_DEVICE_ID_3COM_3C509_TPO: + return ("3Com 3C509-TPO Network Adapter"); + default: + return (NULL); } - return (NULL); } static int @@ -120,7 +112,7 @@ ep_eisa_probe(device_t dev) /* We must be in EISA configuration mode */ if ((inw(iobase + EP_W0_ADDRESS_CFG) & 0x1f) != 0x1f) - return ENXIO; + return ENXIO; eisa_add_iospace(dev, iobase, EP_EISA_IOSIZE, RESVADDR_NONE); eisa_add_iospace(dev, port, EP_IOSIZE, RESVADDR_NONE); @@ -129,66 +121,66 @@ ep_eisa_probe(device_t dev) /* Determine our IRQ */ switch (conf & IRQ_CHANNEL) { case INT_3: - irq = 3; - break; + irq = 3; + break; case INT_5: - irq = 5; - break; + irq = 5; + break; case INT_7: - irq = 7; - break; + irq = 7; + break; case INT_9: - irq = 9; - break; + irq = 9; + break; case INT_10: - irq = 10; - break; + irq = 10; + break; case INT_11: - irq = 11; - break; + irq = 11; + break; case INT_12: - irq = 12; - break; + irq = 12; + break; case INT_15: - irq = 15; - break; + irq = 15; + break; default: - /* Disabled */ - printf("ep: 3COM Network Adapter at " - "slot %d has its IRQ disabled. " - "Probe failed.\n", - eisa_get_slot(dev)); - return ENXIO; + /* Disabled */ + printf("ep: 3COM Network Adapter at " + "slot %d has its IRQ disabled. " + "Probe failed.\n", + eisa_get_slot(dev)); + return (ENXIO); } - switch(eisa_get_id(dev)) { - case EISA_DEVICE_ID_3COM_3C579_BNC: - case EISA_DEVICE_ID_3COM_3C579_TP: - int_trig = EISA_TRIGGER_LEVEL; - break; - default: - int_trig = EISA_TRIGGER_EDGE; - break; + switch (eisa_get_id(dev)) { + case EISA_DEVICE_ID_3COM_3C579_BNC: + case EISA_DEVICE_ID_3COM_3C579_TP: + int_trig = EISA_TRIGGER_LEVEL; + break; + default: + int_trig = EISA_TRIGGER_EDGE; + break; } - + eisa_add_intr(dev, irq, int_trig); - return 0; + return (0); } static int ep_eisa_attach(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); - struct resource * eisa_io = NULL; - u_int32_t eisa_iobase; - int irq; - int error = 0; - int rid; + struct ep_softc *sc = device_get_softc(dev); + struct resource *eisa_io = NULL; + u_int32_t eisa_iobase; + int irq; + int error = 0; + int rid; rid = 1; eisa_io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, - 0, ~0, 1, RF_ACTIVE); + 0, ~0, 1, RF_ACTIVE); if (!eisa_io) { device_printf(dev, "No I/O space?!\n"); error = ENXIO; @@ -198,7 +190,7 @@ ep_eisa_attach(device_t dev) /* Reset and Enable the card */ outb(eisa_iobase + EP_W0_CONFIG_CTRL, W0_P4_CMD_RESET_ADAPTER); - DELAY(1000); /* we must wait at least 1 ms */ + DELAY(1000); /* we must wait at least 1 ms */ outb(eisa_iobase + EP_W0_CONFIG_CTRL, W0_P4_CMD_ENABLE_ADAPTER); /* Now the registers are availible through the lower ioport */ @@ -206,14 +198,11 @@ ep_eisa_attach(device_t dev) device_printf(dev, "ep_alloc() failed! (%d)\n", error); goto bad; } - - switch(eisa_get_id(dev)) { - case EISA_DEVICE_ID_3COM_3C579_BNC: - case EISA_DEVICE_ID_3COM_3C579_TP: - sc->stat = F_ACCESS_32_BITS; - break; - default: - break; + switch (eisa_get_id(dev)) { + case EISA_DEVICE_ID_3COM_3C579_BNC: + case EISA_DEVICE_ID_3COM_3C579_TP: + sc->stat = F_ACCESS_32_BITS; + break; } ep_get_media(sc); @@ -229,16 +218,14 @@ ep_eisa_attach(device_t dev) device_printf(dev, "ep_attach() failed! (%d)\n", error); goto bad; } - if ((error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, ep_intr, - sc, &sc->ep_intrhand))) { + sc, &sc->ep_intrhand))) { device_printf(dev, "bus_setup_intr() failed! (%d)\n", error); goto bad; } - return (0); - bad: +bad: if (eisa_io) bus_release_resource(dev, SYS_RES_IOPORT, 0, eisa_io); @@ -248,11 +235,11 @@ ep_eisa_attach(device_t dev) static device_method_t ep_eisa_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, ep_eisa_probe), - DEVMETHOD(device_attach, ep_eisa_attach), - DEVMETHOD(device_detach, ep_detach), + DEVMETHOD(device_probe, ep_eisa_probe), + DEVMETHOD(device_attach, ep_eisa_attach), + DEVMETHOD(device_detach, ep_detach), - { 0, 0 } + {0, 0} }; static driver_t ep_eisa_driver = { diff --git a/sys/dev/ep/if_ep_isa.c b/sys/dev/ep/if_ep_isa.c index 1bef9080868c..f1ba8f69c6c5 100644 --- a/sys/dev/ep/if_ep_isa.c +++ b/sys/dev/ep/if_ep_isa.c @@ -26,25 +26,25 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include #include - #include #include #include #include -#include +#include #include #include -#include +#include #include @@ -56,18 +56,19 @@ #endif #ifdef __i386__ -static u_int16_t get_eeprom_data (int, int); -static void ep_isa_identify (driver_t *, device_t); +static u_int16_t get_eeprom_data(int, int); +static void ep_isa_identify(driver_t *, device_t); #endif -static int ep_isa_probe (device_t); -static int ep_isa_attach (device_t); -static int ep_eeprom_cksum (struct ep_softc *); + +static int ep_isa_probe(device_t); +static int ep_isa_attach(device_t); +static int ep_eeprom_cksum(struct ep_softc *); struct isa_ident { - u_int32_t id; - char * name; + u_int32_t id; + char *name; }; -const char * ep_isa_match_id (u_int32_t, struct isa_ident *); +const char *ep_isa_match_id(u_int32_t, struct isa_ident *); #define ISA_ID_3C509_XXX 0x0506d509 #define ISA_ID_3C509_TP 0x506d5090 @@ -82,27 +83,27 @@ const char * ep_isa_match_id (u_int32_t, struct isa_ident *); #ifdef __i386__ static struct isa_ident ep_isa_devs[] = { - { ISA_ID_3C509_TP, "3Com 3C509-TP EtherLink III" }, - { ISA_ID_3C509_BNC, "3Com 3C509-BNC EtherLink III" }, - { ISA_ID_3C509_COMBO, "3Com 3C509-Combo EtherLink III" }, - { ISA_ID_3C509_TPO, "3Com 3C509-TPO EtherLink III" }, - { ISA_ID_3C509_TPC, "3Com 3C509-TPC EtherLink III" }, + {ISA_ID_3C509_TP, "3Com 3C509-TP EtherLink III"}, + {ISA_ID_3C509_BNC, "3Com 3C509-BNC EtherLink III"}, + {ISA_ID_3C509_COMBO, "3Com 3C509-Combo EtherLink III"}, + {ISA_ID_3C509_TPO, "3Com 3C509-TPO EtherLink III"}, + {ISA_ID_3C509_TPC, "3Com 3C509-TPC EtherLink III"}, #ifdef PC98 - { ISA_ID_3C569B_COMBO, "3Com 3C569B-J-Combo EtherLink III" }, - { ISA_ID_3C569B_TPO, "3Com 3C569B-J-TPO EtherLink III" }, + {ISA_ID_3C569B_COMBO, "3Com 3C569B-J-Combo EtherLink III"}, + {ISA_ID_3C569B_TPO, "3Com 3C569B-J-TPO EtherLink III"}, #endif - { 0, NULL }, + {0, NULL}, }; #endif static struct isa_pnp_id ep_ids[] = { - { 0x90506d50, "3Com 3C509B-TP EtherLink III (PnP)" }, /* TCM5090 */ - { 0x91506d50, "3Com 3C509B-BNC EtherLink III (PnP)" },/* TCM5091 */ - { 0x94506d50, "3Com 3C509B-Combo EtherLink III (PnP)" },/* TCM5094 */ - { 0x95506d50, "3Com 3C509B-TPO EtherLink III (PnP)" },/* TCM5095 */ - { 0x98506d50, "3Com 3C509B-TPC EtherLink III (PnP)" },/* TCM5098 */ - { 0xf780d041, NULL }, /* PNP80f7 */ - { 0, NULL }, + {0x90506d50, "3Com 3C509B-TP EtherLink III (PnP)"}, /* TCM5090 */ + {0x91506d50, "3Com 3C509B-BNC EtherLink III (PnP)"}, /* TCM5091 */ + {0x94506d50, "3Com 3C509B-Combo EtherLink III (PnP)"}, /* TCM5094 */ + {0x95506d50, "3Com 3C509B-TPO EtherLink III (PnP)"}, /* TCM5095 */ + {0x98506d50, "3Com 3C509B-TPC EtherLink III (PnP)"}, /* TCM5098 */ + {0xf780d041, NULL}, /* PNP80f7 */ + {0, NULL}, }; /* @@ -119,14 +120,12 @@ static struct isa_pnp_id ep_ids[] = { */ #ifdef __i386__ static u_int16_t -get_eeprom_data(id_port, offset) - int id_port; - int offset; +get_eeprom_data(int id_port, int offset) { - int i; - u_int16_t data = 0; + int i; + u_int16_t data = 0; - outb(id_port, EEPROM_CMD_RD|offset); + outb(id_port, EEPROM_CMD_RD | offset); DELAY(BIT_DELAY_MULTIPLE * 1000); for (i = 0; i < 16; i++) { DELAY(50); @@ -137,41 +136,39 @@ get_eeprom_data(id_port, offset) #endif const char * -ep_isa_match_id (id, isa_devs) - u_int32_t id; - struct isa_ident * isa_devs; +ep_isa_match_id(u_int32_t id, struct isa_ident *isa_devs) { - struct isa_ident * i = isa_devs; - while(i->name != NULL) { - if (id == i->id) - return (i->name); - i++; + struct isa_ident *i = isa_devs; + + while (i->name != NULL) { + if (id == i->id) + return (i->name); + i++; } /* * If we see a card that is likely to be a 3c509 * return something so that it will work; be annoying * so that the user will tell us about it though. */ - if ((id >> 4) == ISA_ID_3C509_XXX) { + if ((id >> 4) == ISA_ID_3C509_XXX) return ("Unknown 3c509; notify maintainer!"); - } return (NULL); } #ifdef __i386__ static void -ep_isa_identify (driver_t *driver, device_t parent) +ep_isa_identify(driver_t * driver, device_t parent) { - int tag = EP_LAST_TAG; - int found = 0; - int i; - int j; - const char * desc; - u_int16_t data; - u_int32_t irq; - u_int32_t ioport; - u_int32_t isa_id; - device_t child; + int tag = EP_LAST_TAG; + int found = 0; + int i; + int j; + const char *desc; + u_int16_t data; + u_int32_t irq; + u_int32_t ioport; + u_int32_t isa_id; + device_t child; outb(ELINK_ID_PORT, 0); outb(ELINK_ID_PORT, 0); @@ -187,27 +184,22 @@ ep_isa_identify (driver_t *driver, device_t parent) elink_idseq(ELINK_509_POLY); DELAY(400); - /* For the first probe, clear all - * board's tag registers. - * Otherwise kill off already-found - * boards. -- linux 3c509.c + /* + * For the first probe, clear all board's tag registers. + * Otherwise kill off already-found boards. -- linux 3c509.c */ - if (i == 0) { + if (i == 0) outb(ELINK_ID_PORT, 0xd0); - } else { + else outb(ELINK_ID_PORT, 0xd8); - } /* Get out of loop if we're out of cards. */ data = get_eeprom_data(ELINK_ID_PORT, EEPROM_MFG_ID); - if (data != MFG_ID) { + if (data != MFG_ID) break; - } - /* resolve contention using the Ethernet address */ - for (j = 0; j < 3; j++) { + for (j = 0; j < 3; j++) (void)get_eeprom_data(ELINK_ID_PORT, j); - } /* * Construct an 'isa_id' in 'EISA' @@ -221,13 +213,11 @@ ep_isa_identify (driver_t *driver, device_t parent) /* Find known ISA boards */ desc = ep_isa_match_id(isa_id, ep_isa_devs); if (!desc) { - if (bootverbose) { + if (bootverbose) device_printf(parent, "if_ep: unknown ID 0x%08x\n", - isa_id); - } + isa_id); continue; } - /* Retreive IRQ */ data = get_eeprom_data(ELINK_ID_PORT, EEPROM_RESOURCE_CFG); irq = (data >> 12); @@ -242,27 +232,30 @@ ep_isa_identify (driver_t *driver, device_t parent) if ((data & ADDR_CFG_MASK) == ADDR_CFG_EISA) { device_printf(parent, "if_ep: <%s> at port 0x%03x in EISA mode!\n", - desc, ioport); - /* Set the adaptor tag so that the next card can be found. */ + desc, ioport); + /* + * Set the adaptor tag so that the next card can be + * found. + */ outb(ELINK_ID_PORT, tag--); continue; } - /* Test for an adapter with PnP support. */ data = get_eeprom_data(ELINK_ID_PORT, EEPROM_CAP); if (data == CAP_ISA) { data = get_eeprom_data(ELINK_ID_PORT, EEPROM_INT_CONFIG_1); if (data & ICW1_IAS_PNP) { - if (bootverbose) { + if (bootverbose) device_printf(parent, "if_ep: <%s> at 0x%03x in PnP mode!\n", - desc, ioport); - } - /* Set the adaptor tag so that the next card can be found. */ + desc, ioport); + /* + * Set the adaptor tag so that the next card + * can be found. + */ outb(ELINK_ID_PORT, tag--); continue; } } - /* Set the adaptor tag so that the next card can be found. */ outb(ELINK_ID_PORT, tag--); @@ -274,66 +267,57 @@ ep_isa_identify (driver_t *driver, device_t parent) data = inw(ioport + EP_W0_EEPROM_COMMAND); if (data & EEPROM_TST_MODE) { device_printf(parent, "if_ep: <%s> at port 0x%03x in TEST mode! Erase pencil mark.\n", - desc, ioport); + desc, ioport); continue; } - child = BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, "ep", -1); device_set_desc_copy(child, desc); device_set_driver(child, driver); bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1); bus_set_resource(child, SYS_RES_IOPORT, 0, ioport, EP_IOSIZE); - if (bootverbose) { + if (bootverbose) device_printf(parent, "if_ep: <%s> at port 0x%03x-0x%03x irq %d\n", - desc, ioport, ioport + EP_IOSIZE, irq); - } - + desc, ioport, ioport + EP_IOSIZE, irq); found++; } - - return; } #endif static int -ep_isa_probe (device_t dev) +ep_isa_probe(device_t dev) { - int error = 0; + int error = 0; /* Check isapnp ids */ error = ISA_PNP_PROBE(device_get_parent(dev), dev, ep_ids); /* If the card had a PnP ID that didn't match any we know about */ - if (error == ENXIO) { - return (error); - } + if (error == ENXIO) + return (error); /* If we had some other problem. */ - if (!(error == 0 || error == ENOENT)) { + if (!(error == 0 || error == ENOENT)) return (error); - } /* If we have the resources we need then we're good to go. */ if ((bus_get_resource_start(dev, SYS_RES_IOPORT, 0) != 0) && - (bus_get_resource_start(dev, SYS_RES_IRQ, 0) != 0)) { + (bus_get_resource_start(dev, SYS_RES_IRQ, 0) != 0)) return (0); - } return (ENXIO); } static int -ep_isa_attach (device_t dev) +ep_isa_attach(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); - int error = 0; + struct ep_softc *sc = device_get_softc(dev); + int error = 0; if ((error = ep_alloc(dev))) { device_printf(dev, "ep_alloc() failed! (%d)\n", error); goto bad; } - ep_get_media(sc); GO_WINDOW(0); @@ -343,19 +327,16 @@ ep_isa_attach (device_t dev) device_printf(dev, "ep_attach() failed! (%d)\n", error); goto bad; } - error = ep_eeprom_cksum(sc); if (error) { device_printf(sc->dev, "Invalid EEPROM checksum!\n"); goto bad; } - if ((error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, ep_intr, - sc, &sc->ep_intrhand))) { + sc, &sc->ep_intrhand))) { device_printf(dev, "bus_setup_intr() failed! (%d)\n", error); goto bad; } - return (0); bad: ep_free(dev); @@ -363,19 +344,18 @@ ep_isa_attach (device_t dev) } static int -ep_eeprom_cksum (sc) - struct ep_softc * sc; +ep_eeprom_cksum(struct ep_softc *sc) { - int i; - int error; - u_int16_t val; - u_int16_t cksum; - u_int8_t cksum_high = 0; - u_int8_t cksum_low = 0; + int i; + int error; + u_int16_t val; + u_int16_t cksum; + u_int8_t cksum_high = 0; + u_int8_t cksum_low = 0; error = get_e(sc, 0x0f, &val); if (error) - return (ENXIO); + return (ENXIO); cksum = val; for (i = 0; i < 0x0f; i++) { @@ -383,31 +363,31 @@ ep_eeprom_cksum (sc) if (error) return (ENXIO); switch (i) { - case 0x08: - case 0x09: - case 0x0d: - cksum_low ^= (u_int8_t)(val & 0x00ff) ^ - (u_int8_t)((val & 0xff00) >> 8); - break; - default: - cksum_high ^= (u_int8_t)(val & 0x00ff) ^ - (u_int8_t)((val & 0xff00) >> 8); - break; + case 0x08: + case 0x09: + case 0x0d: + cksum_low ^= (u_int8_t) (val & 0x00ff) ^ + (u_int8_t) ((val & 0xff00) >> 8); + break; + default: + cksum_high ^= (u_int8_t) (val & 0x00ff) ^ + (u_int8_t) ((val & 0xff00) >> 8); + break; } } - return (cksum != ((u_int16_t)cksum_low | (u_int16_t)(cksum_high << 8))); + return (cksum != ((u_int16_t) cksum_low | (u_int16_t) (cksum_high << 8))); } static device_method_t ep_isa_methods[] = { /* Device interface */ #ifdef __i386__ - DEVMETHOD(device_identify, ep_isa_identify), + DEVMETHOD(device_identify, ep_isa_identify), #endif - DEVMETHOD(device_probe, ep_isa_probe), - DEVMETHOD(device_attach, ep_isa_attach), - DEVMETHOD(device_detach, ep_detach), + DEVMETHOD(device_probe, ep_isa_probe), + DEVMETHOD(device_attach, ep_isa_attach), + DEVMETHOD(device_detach, ep_detach), - { 0, 0 } + {0, 0} }; static driver_t ep_isa_driver = { diff --git a/sys/dev/ep/if_ep_mca.c b/sys/dev/ep/if_ep_mca.c index b3a05067697e..2a0e870f01a5 100644 --- a/sys/dev/ep/if_ep_mca.c +++ b/sys/dev/ep/if_ep_mca.c @@ -22,22 +22,22 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include - #include #include #include #include #include - -#include + +#include #include #include @@ -54,22 +54,22 @@ #define EP_MCA_62F7 0x62f7 static struct mca_ident ep_mca_devs[] = { - { EP_MCA_627C, "3Com 3C529 Network Adapter" }, - { EP_MCA_627D, "3Com 3C529-TP Network Adapter" }, + {EP_MCA_627C, "3Com 3C529 Network Adapter"}, + {EP_MCA_627D, "3Com 3C529-TP Network Adapter"}, /* * These are from the linux 3c509 driver. - * I have not seen the ADFs for them and have + * I have not seen the ADFs for them and have * not tested or even seen the hardware. * Someone with the ADFs should replace the names with * whatever is in the AdapterName field of the ADF. * (and fix the media setup for the cards as well.) */ - { EP_MCA_62DB, "3Com 3c529 EtherLink III (test mode)" }, - { EP_MCA_62F6, "3Com 3c529 EtherLink III (TP or coax)" }, - { EP_MCA_62F7, "3Com 3c529 EtherLink III (TP)" }, + {EP_MCA_62DB, "3Com 3c529 EtherLink III (test mode)"}, + {EP_MCA_62F6, "3Com 3c529 EtherLink III (TP or coax)"}, + {EP_MCA_62F7, "3Com 3c529 EtherLink III (TP)"}, - { 0, NULL }, + {0, NULL}, }; #define EP_MCA_IOPORT_POS MCA_ADP_POS(MCA_POS2) @@ -87,12 +87,12 @@ static struct mca_ident ep_mca_devs[] = { #define EP_MCA_MEDIA(pos) (pos & EP_MCA_MEDIA_MASK) static int -ep_mca_probe (device_t dev) +ep_mca_probe(device_t dev) { - const char * desc; - u_int32_t iobase = 0; - u_int8_t irq = 0; - u_int8_t pos; + const char *desc; + u_int32_t iobase = 0; + u_int8_t irq = 0; + u_int8_t pos; desc = mca_match_id(mca_get_id(dev), ep_mca_devs); if (!desc) @@ -112,10 +112,10 @@ ep_mca_probe (device_t dev) } static int -ep_mca_attach (device_t dev) +ep_mca_attach(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); - int error = 0; + struct ep_softc *sc = device_get_softc(dev); + int error = 0; if ((error = ep_alloc(dev))) { device_printf(dev, "ep_alloc() failed! (%d)\n", error); @@ -132,13 +132,11 @@ ep_mca_attach (device_t dev) device_printf(dev, "ep_attach() failed! (%d)\n", error); goto bad; } - if ((error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, ep_intr, - sc, &sc->ep_intrhand))) { + sc, &sc->ep_intrhand))) { device_printf(dev, "bus_setup_intr() failed! (%d)\n", error); goto bad; } - return (0); bad: ep_free(dev); @@ -147,11 +145,11 @@ ep_mca_attach (device_t dev) static device_method_t ep_mca_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, ep_mca_probe), - DEVMETHOD(device_attach, ep_mca_attach), - DEVMETHOD(device_detach, ep_detach), + DEVMETHOD(device_probe, ep_mca_probe), + DEVMETHOD(device_attach, ep_mca_attach), + DEVMETHOD(device_detach, ep_detach), - { 0, 0 } + {0, 0} }; static driver_t ep_mca_driver = { diff --git a/sys/dev/ep/if_ep_pccard.c b/sys/dev/ep/if_ep_pccard.c index 5a3e70a9bf1d..5e459c707380 100644 --- a/sys/dev/ep/if_ep_pccard.c +++ b/sys/dev/ep/if_ep_pccard.c @@ -26,8 +26,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* @@ -36,28 +34,30 @@ * nao@tom-yam.or.jp */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include #include - #include #include #include #include - + #include -#include +#include #include #include - #include #include #include #include + #include "card_if.h" static const char *ep_pccard_identify(u_short id); @@ -68,22 +68,22 @@ static const char *ep_pccard_identify(u_short id); static int ep_pccard_probe(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); - struct ep_board * epb = &sc->epb; - const char * desc; - u_int16_t result; - int error; + struct ep_softc *sc = device_get_softc(dev); + struct ep_board *epb = &sc->epb; + const char *desc; + u_int16_t result; + int error; error = ep_alloc(dev); if (error) - return error; + return (error); /* * XXX - Certain (newer?) 3Com cards need epb->cmd_off == * 2. Sadly, you need to have a correct cmd_off in order to * identify the card. So we have to hit it with both and * cross our virtual fingers. There's got to be a better way - * to do this. jyoung@accessus.net 09/11/1999 + * to do this. jyoung@accessus.net 09/11/1999 */ epb->cmd_off = 0; @@ -92,7 +92,7 @@ ep_pccard_probe(device_t dev) epb->prod_id = result; if ((desc = ep_pccard_identify(epb->prod_id)) == NULL) { - if (bootverbose) + if (bootverbose) device_printf(dev, "Pass 1 of 2 detection " "failed (nonfatal) id 0x%x\n", epb->prod_id); epb->cmd_off = 2; @@ -121,57 +121,58 @@ ep_pccard_identify(u_short id) { /* Determine device type and associated MII capabilities */ switch (id) { - case 0x6055: /* 3C556 */ + case 0x6055: /* 3C556 */ return ("3Com 3C556"); - case 0x4057: /* 3C574 */ + case 0x4057: /* 3C574 */ return ("3Com 3C574"); - case 0x4b57: /* 3C574B */ + case 0x4b57: /* 3C574B */ return ("3Com 3C574B, Megahertz 3CCFE574BT or " "Fast Etherlink 3C574-TX"); - case 0x2b57: /* 3CXSH572BT */ + case 0x2b57: /* 3CXSH572BT */ return ("3Com OfficeConnect 572BT"); - case 0x9058: /* 3C589 */ + case 0x9058: /* 3C589 */ return ("3Com Etherlink III 3C589"); - case 0x2056: /* 3C562/3C563 */ + case 0x2056: /* 3C562/3C563 */ return ("3Com 3C562D/3C563D"); - case 0x0010: /* 3C1 */ + case 0x0010: /* 3C1 */ return ("3Com Megahertz C1"); + default: + return (NULL); } - return (NULL); } static int -ep_pccard_card_attach(struct ep_board *epb) +ep_pccard_card_attach(struct ep_board * epb) { /* Determine device type and associated MII capabilities */ switch (epb->prod_id) { - case 0x6055: /* 3C556 */ - case 0x2b57: /* 3C572BT */ - case 0x4057: /* 3C574 */ - case 0x4b57: /* 3C574B */ - case 0x0010: /* 3C1 */ + case 0x6055: /* 3C556 */ + case 0x2b57: /* 3C572BT */ + case 0x4057: /* 3C574 */ + case 0x4b57: /* 3C574B */ + case 0x0010: /* 3C1 */ epb->mii_trans = 1; return (1); - case 0x2056: /* 3C562D/3C563D */ - case 0x9058: /* 3C589 */ + case 0x2056: /* 3C562D/3C563D */ + case 0x9058: /* 3C589 */ epb->mii_trans = 0; return (1); + default: + return (0); } - return (0); } static int ep_pccard_attach(device_t dev) { - struct ep_softc * sc = device_get_softc(dev); - u_int16_t result; - int error = 0; + struct ep_softc *sc = device_get_softc(dev); + u_int16_t result; + int error = 0; if ((error = ep_alloc(dev))) { device_printf(dev, "ep_alloc() failed! (%d)\n", error); goto bad; } - sc->epb.cmd_off = 0; error = get_e(sc, EEPROM_PROD_ID, &result); /* XXX check return */ @@ -190,7 +191,6 @@ ep_pccard_attach(device_t dev) goto bad; } } - error = get_e(sc, EEPROM_ADDR_CFG, &result); /* ROM size = 0, ROM base = 0 */ @@ -215,21 +215,18 @@ ep_pccard_attach(device_t dev) while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS); DELAY(1000); outw(BASE + EP_W3_OPTIONS, 0x8040); - } else { + } else ep_get_media(sc); - } if ((error = ep_attach(sc))) { device_printf(dev, "ep_attach() failed! (%d)\n", error); goto bad; } - if ((error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, ep_intr, - sc, &sc->ep_intrhand))) { + sc, &sc->ep_intrhand))) { device_printf(dev, "bus_setup_intr() failed! (%d)\n", error); goto bad; } - return (0); bad: ep_free(dev); @@ -239,12 +236,12 @@ ep_pccard_attach(device_t dev) static const struct pccard_product ep_pccard_products[] = { PCMCIA_CARD(3COM, 3C1, 0), PCMCIA_CARD(3COM, 3C562, 0), - PCMCIA_CARD(3COM, 3C574, 0), /* ROADRUNNER */ + PCMCIA_CARD(3COM, 3C574, 0), /* ROADRUNNER */ PCMCIA_CARD(3COM, 3C589, 0), PCMCIA_CARD(3COM, 3CCFEM556BI, 0), /* ROADRUNNER */ PCMCIA_CARD(3COM, 3CXEM556, 0), PCMCIA_CARD(3COM, 3CXEM556INT, 0), - { NULL } + {NULL} }; static int @@ -253,7 +250,7 @@ ep_pccard_match(device_t dev) const struct pccard_product *pp; if ((pp = pccard_product_lookup(dev, ep_pccard_products, - sizeof(ep_pccard_products[0]), NULL)) != NULL) { + sizeof(ep_pccard_products[0]), NULL)) != NULL) { if (pp->pp_name != NULL) device_set_desc(dev, pp->pp_name); return 0; @@ -263,16 +260,16 @@ ep_pccard_match(device_t dev) static device_method_t ep_pccard_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, pccard_compat_probe), - DEVMETHOD(device_attach, pccard_compat_attach), - DEVMETHOD(device_detach, ep_detach), + DEVMETHOD(device_probe, pccard_compat_probe), + DEVMETHOD(device_attach, pccard_compat_attach), + DEVMETHOD(device_detach, ep_detach), /* Card interface */ - DEVMETHOD(card_compat_match, ep_pccard_match), - DEVMETHOD(card_compat_probe, ep_pccard_probe), - DEVMETHOD(card_compat_attach, ep_pccard_attach), + DEVMETHOD(card_compat_match, ep_pccard_match), + DEVMETHOD(card_compat_probe, ep_pccard_probe), + DEVMETHOD(card_compat_attach, ep_pccard_attach), - { 0, 0 } + {0, 0} }; static driver_t ep_pccard_driver = { diff --git a/sys/dev/ep/if_epreg.h b/sys/dev/ep/if_epreg.h index 9fb95f5b6449..986dacfe4c1c 100644 --- a/sys/dev/ep/if_epreg.h +++ b/sys/dev/ep/if_epreg.h @@ -35,7 +35,7 @@ #define TX_INIT_RATE 16 #define TX_INIT_MAX_RATE 64 #define RX_INIT_LATENCY 64 -#define RX_INIT_EARLY_THRESH 208 /* not less than MINCLSIZE */ +#define RX_INIT_EARLY_THRESH 208/* not less than MINCLSIZE */ #define RX_NEXT_EARLY_THRESH 500 #define EEPROMSIZE 0x40 @@ -94,13 +94,13 @@ #define EEPROM_NODE_ADDR_1 0x1 /* Word */ #define EEPROM_NODE_ADDR_2 0x2 /* Word */ #define EEPROM_PROD_ID 0x3 /* 0x9[0-f]50 */ -#define EEPROM_MFG_DATE 0x4 /* Manufacturing date */ -#define EEPROM_MFG_DIVSION 0x5 /* Manufacturing division */ -#define EEPROM_MFG_PRODUCT 0x6 /* Product code */ +#define EEPROM_MFG_DATE 0x4 /* Manufacturing date */ +#define EEPROM_MFG_DIVSION 0x5 /* Manufacturing division */ +#define EEPROM_MFG_PRODUCT 0x6 /* Product code */ #define EEPROM_MFG_ID 0x7 /* 0x6d50 */ #define EEPROM_ADDR_CFG 0x8 /* Base addr */ -# define ADDR_CFG_EISA 0x1f -# define ADDR_CFG_MASK 0x1f +#define ADDR_CFG_EISA 0x1f +#define ADDR_CFG_MASK 0x1f #define EEPROM_RESOURCE_CFG 0x9 /* IRQ. Bits 12-15 */ #define EEPROM_OEM_ADDR0 0xa #define EEPROM_OEM_ADDR1 0xb @@ -109,22 +109,24 @@ #define EEPROM_COMPAT 0xe #define EEPROM_SOFTINFO2 0xf #define EEPROM_CAP 0x10 -# define CAP_ISA 0x2083 -# define CAP_PCMCIA 0x2082 +#define CAP_ISA 0x2083 +#define CAP_PCMCIA 0x2082 #define EEPROM_INT_CONFIG_0 0x12 #define EEPROM_INT_CONFIG_1 0x13 /* RAM Partition TX FIFO/RX FIFO */ -# define ICW1_RAM_PART_MASK 0x03 -# define ICW1_RAM_PART_35 0x00 /* 2:5 (only legal if RAM size == 000b default power-up/reset */ -# define ICW1_RAM_PART_13 0x01 /* 1:3 (only legal if RAM size == 000b) */ -# define ICW1_RAM_PART_11 0x10 /* 1:1 */ -# define ICW1_RAM_PART_RESV 0x11 /* Reserved */ +#define ICW1_RAM_PART_MASK 0x03 +#define ICW1_RAM_PART_35 0x00 /* 2:5 (only legal if RAM size == 000b + * default power-up/reset */ +#define ICW1_RAM_PART_13 0x01 /* 1:3 (only legal if RAM size == + * 000b) */ +#define ICW1_RAM_PART_11 0x10 /* 1:1 */ +#define ICW1_RAM_PART_RESV 0x11 /* Reserved */ /* ISA Adapter Selection */ -# define ICW1_IAS_MASK 0x0c -# define ICW1_IAS_DIS 0x00 /* Both mechanisms disabled (default) */ -# define ICW1_IAS_ISA 0x04 /* ISA contention only */ -# define ICW1_IAS_PNP 0x08 /* ISA Plug and Play only */ -# define ICW1_IAS_BOTH 0x0c /* Both mechanisms enabled */ +#define ICW1_IAS_MASK 0x0c +#define ICW1_IAS_DIS 0x00 /* Both mechanisms disabled (default) */ +#define ICW1_IAS_ISA 0x04 /* ISA contention only */ +#define ICW1_IAS_PNP 0x08 /* ISA Plug and Play only */ +#define ICW1_IAS_BOTH 0x0c /* Both mechanisms enabled */ #define EEPROM_CHECKSUM_EL3 0x17 @@ -233,13 +235,13 @@ * ****************************************/ -/* +/* * Command parameter that disables threshold interrupts * PIO (3c509) cards use 2044. The fifo word-oriented and 2044--2047 work. * "busmastering" cards need 8188. * The implicit two-bit upshift done by busmastering cards means * a value of 2047 disables threshold interrupts on both. - */ + */ #define EP_THRESH_DISABLE 2047 /* @@ -294,7 +296,7 @@ #define C_RX_EARLY (u_short) (ACK_INTR|0x20) #define C_INT_RQD (u_short) (ACK_INTR|0x40) #define C_UPD_STATS (u_short) (ACK_INTR|0x80) -#define C_MASK (u_short) 0xFF /* mask of C_* */ +#define C_MASK (u_short) 0xFF /* mask of C_* */ /* * Status register. All windows. @@ -322,7 +324,7 @@ #define S_RX_EARLY (u_short) (0x20) #define S_INT_RQD (u_short) (0x40) #define S_UPD_STATS (u_short) (0x80) -#define S_MASK (u_short) 0xFF /* mask of S_* */ +#define S_MASK (u_short) 0xFF /* mask of S_* */ #define S_5_INTS (S_CARD_FAILURE|S_TX_COMPLETE|\ S_TX_AVAIL|S_RX_COMPLETE|S_RX_EARLY) #define S_COMMAND_IN_PROGRESS (u_short) (0x1000) @@ -343,7 +345,7 @@ #define SET_IRQ(base,irq) outw((base) + EP_W0_RESOURCE_CFG, \ ((inw((base) + EP_W0_RESOURCE_CFG) & 0x0fff) | \ - ((u_short)(irq)<<12)) ) /* set IRQ i */ + ((u_short)(irq)<<12)) ) /* set IRQ i */ /* * FIFO Registers. @@ -418,8 +420,9 @@ /* * Misc defines for various things. */ -#define ACTIVATE_ADAPTER_TO_CONFIG 0xff /* to the id_port */ -#define MFG_ID 0x6d50 /* in EEPROM and W0 ADDR_CONFIG */ +#define ACTIVATE_ADAPTER_TO_CONFIG 0xff /* to the id_port */ +#define MFG_ID 0x6d50 /* in EEPROM and W0 + * ADDR_CONFIG */ #define PROD_ID 0x9150 #define AUI 0x1 diff --git a/sys/dev/ep/if_epvar.h b/sys/dev/ep/if_epvar.h index b9d410783bdd..ca0fef3c119c 100644 --- a/sys/dev/ep/if_epvar.h +++ b/sys/dev/ep/if_epvar.h @@ -23,62 +23,62 @@ */ struct ep_board { - u_short prod_id; /* product ID */ - int cmd_off; /* command offset (bit shift) */ - int mii_trans; /* activate MII transiever */ - u_short res_cfg; /* resource configuration */ + u_short prod_id; /* product ID */ + int cmd_off; /* command offset (bit shift) */ + int mii_trans; /* activate MII transiever */ + u_short res_cfg; /* resource configuration */ }; /* * Ethernet software status per interface. */ struct ep_softc { - struct arpcom arpcom; /* Ethernet common part */ - struct ifmedia ifmedia; /* media info */ + struct arpcom arpcom; /* Ethernet common part */ + struct ifmedia ifmedia; /* media info */ - device_t dev; + device_t dev; - struct resource * iobase; - struct resource * irq; + struct resource *iobase; + struct resource *irq; - bus_space_handle_t ep_bhandle; - bus_space_tag_t ep_btag; - void * ep_intrhand; + bus_space_handle_t ep_bhandle; + bus_space_tag_t ep_btag; + void *ep_intrhand; - int ep_io_addr; /* i/o bus address */ + int ep_io_addr; /* i/o bus address */ - u_short ep_connectors; /* Connectors on this card. */ - u_char ep_connector; /* Configured connector.*/ + u_short ep_connectors; /* Connectors on this card. */ + u_char ep_connector; /* Configured connector. */ - struct mbuf * top; - struct mbuf * mcur; - short cur_len; + struct mbuf *top; + struct mbuf *mcur; + short cur_len; - int stat; /* some flags */ + int stat; /* some flags */ #define F_RX_FIRST 0x001 #define F_PROMISC 0x008 #define F_ACCESS_32_BITS 0x100 - int gone; /* adapter is not present (for PCCARD) */ + int gone; /* adapter is not present (for PCCARD) */ - struct ep_board epb; + struct ep_board epb; - int unit; + int unit; #ifdef EP_LOCAL_STATS - short tx_underrun; - short rx_no_first; - short rx_no_mbuf; - short rx_overrunf; - short rx_overrunl; + short tx_underrun; + short rx_no_first; + short rx_no_mbuf; + short rx_overrunf; + short rx_overrunl; #endif }; -int ep_alloc (device_t); -void ep_free (device_t); -int ep_detach (device_t); -void ep_get_media (struct ep_softc *); -int ep_attach (struct ep_softc *); -void ep_intr (void *); -int get_e (struct ep_softc *, u_int16_t, u_int16_t *); -int ep_get_macaddr (struct ep_softc *, u_char *); +int ep_alloc(device_t); +void ep_free(device_t); +int ep_detach(device_t); +void ep_get_media(struct ep_softc *); +int ep_attach(struct ep_softc *); +void ep_intr(void *); +int get_e(struct ep_softc *, u_int16_t, u_int16_t *); +int ep_get_macaddr(struct ep_softc *, u_char *);