diff options
author | mdodd <mdodd@FreeBSD.org> | 2003-03-29 21:44:46 +0000 |
---|---|---|
committer | mdodd <mdodd@FreeBSD.org> | 2003-03-29 21:44:46 +0000 |
commit | 69599b7cf6d34034513d579e54a174262ac93d39 (patch) | |
tree | 659d70beaef943197e4a69f5bddce46afd064a32 /sys/dev/ep | |
parent | f932a709c1ab4f02d50cfaef926ad44c6bb48597 (diff) | |
download | FreeBSD-src-69599b7cf6d34034513d579e54a174262ac93d39.zip FreeBSD-src-69599b7cf6d34034513d579e54a174262ac93d39.tar.gz |
- Return error status instead of value in get_e().
- Modify ep_get_macaddr() to return an error status.
- Reverse the return value logic of eeprom_rdy().
Diffstat (limited to 'sys/dev/ep')
-rw-r--r-- | sys/dev/ep/if_ep.c | 62 | ||||
-rw-r--r-- | sys/dev/ep/if_ep_eisa.c | 10 | ||||
-rw-r--r-- | sys/dev/ep/if_ep_pccard.c | 27 | ||||
-rw-r--r-- | sys/dev/ep/if_epvar.h | 4 |
4 files changed, 71 insertions, 32 deletions
diff --git a/sys/dev/ep/if_ep.c b/sys/dev/ep/if_ep.c index 749fa58..7d49e76 100644 --- a/sys/dev/ep/if_ep.c +++ b/sys/dev/ep/if_ep.c @@ -123,42 +123,54 @@ eeprom_rdy(sc) } if (i >= MAX_EEPROMBUSY) { printf("ep%d: eeprom failed to come ready.\n", sc->unit); - return (0); + return (ENXIO); } - return (1); + return (0); } /* * get_e: gets a 16 bits word from the EEPROM. we must have set the window * before */ -u_int16_t -get_e(sc, offset) - struct ep_softc *sc; - u_int16_t offset; +int +get_e(sc, offset, result) + struct ep_softc *sc; + u_int16_t offset; + u_int16_t *result; { - if (!eeprom_rdy(sc)) - return (0); - outw(BASE + EP_W0_EEPROM_COMMAND, (EEPROM_CMD_RD << sc->epb.cmd_off) | offset); - if (!eeprom_rdy(sc)) + + if (eeprom_rdy(sc)) + return (ENXIO); + outw(BASE + EP_W0_EEPROM_COMMAND, + (EEPROM_CMD_RD << sc->epb.cmd_off) | offset); + if (eeprom_rdy(sc)) + return (ENXIO); + (*result) = inw(BASE + EP_W0_EEPROM_DATA); + return (0); - return (inw(BASE + EP_W0_EEPROM_DATA)); } -void +int ep_get_macaddr(sc, addr) struct ep_softc * sc; u_char * addr; { int i; - u_int16_t * macaddr = (u_int16_t *)addr; + u_int16_t result; + int error; + u_int16_t * macaddr; + + macaddr = (u_int16_t *)addr; GO_WINDOW(0); for(i = EEPROM_NODE_ADDR_0; i <= EEPROM_NODE_ADDR_2; i++) { - macaddr[i] = htons(get_e(sc, i)); + error = get_e(sc, i, &result); + if (error) + return (error); + macaddr[i] = htons(result); } - return; + return (0); } int @@ -167,6 +179,7 @@ ep_alloc(device_t dev) 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, @@ -200,8 +213,16 @@ ep_alloc(device_t dev) GO_WINDOW(0); sc->epb.cmd_off = 0; - sc->epb.prod_id = get_e(sc, EEPROM_PROD_ID); - sc->epb.res_cfg = get_e(sc, EEPROM_RESOURCE_CFG); + + error = get_e(sc, EEPROM_PROD_ID, &result); + if (error) + goto bad; + sc->epb.prod_id = result; + + error = get_e(sc, EEPROM_RESOURCE_CFG, &result); + if (error) + goto bad; + sc->epb.res_cfg = result; bad: return (error); @@ -259,10 +280,15 @@ ep_attach(sc) u_short * p; int i; int attached; + int error; sc->gone = 0; - ep_get_macaddr(sc, (u_char *)&sc->arpcom.ac_enaddr); + error = ep_get_macaddr(sc, (u_char *)&sc->arpcom.ac_enaddr); + if (error) { + device_printf(sc->dev, "Unable to retrieve Ethernet address!\n"); + return (ENXIO); + } /* * Setup the station address diff --git a/sys/dev/ep/if_ep_eisa.c b/sys/dev/ep/if_ep_eisa.c index f0bef6d..ac6738a 100644 --- a/sys/dev/ep/if_ep_eisa.c +++ b/sys/dev/ep/if_ep_eisa.c @@ -38,8 +38,8 @@ #include <net/if_arp.h> #include <net/if_media.h> - -#include <dev/eisa/eisaconf.h> +#include <dev/eisa/eisa_busreg.h> +#include <dev/eisa/eisa_busvar.h> #include <dev/ep/if_epreg.h> #include <dev/ep/if_epvar.h> @@ -122,8 +122,8 @@ ep_eisa_probe(device_t dev) if ((inw(iobase + EP_W0_ADDRESS_CFG) & 0x1f) != 0x1f) return ENXIO; - eisa_add_iospace(dev, iobase, EP_EISA_IOSIZE, RESVADDR_NONE); - eisa_add_iospace(dev, port, EP_IOSIZE, RESVADDR_NONE); + eisa_add_iospace(dev, iobase, EP_EISA_IOSIZE); + eisa_add_iospace(dev, port, EP_IOSIZE); conf = inw(iobase + EISA_IOCONF); /* Determine our IRQ */ @@ -171,7 +171,7 @@ ep_eisa_probe(device_t dev) break; } - eisa_add_intr(dev, irq, int_trig); + eisa_add_irq(dev, irq, int_trig); return 0; } diff --git a/sys/dev/ep/if_ep_pccard.c b/sys/dev/ep/if_ep_pccard.c index 8406f16..a4be882 100644 --- a/sys/dev/ep/if_ep_pccard.c +++ b/sys/dev/ep/if_ep_pccard.c @@ -71,6 +71,7 @@ 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; error = ep_alloc(dev); @@ -86,13 +87,17 @@ ep_pccard_probe(device_t dev) */ epb->cmd_off = 0; - epb->prod_id = get_e(sc, EEPROM_PROD_ID); + + error = get_e(sc, EEPROM_PROD_ID, &result); /* XXX check return */ + epb->prod_id = result; + if ((desc = ep_pccard_identify(epb->prod_id)) == NULL) { if (bootverbose) device_printf(dev, "Pass 1 of 2 detection " "failed (nonfatal) id 0x%x\n", epb->prod_id); epb->cmd_off = 2; - epb->prod_id = get_e(sc, EEPROM_PROD_ID); + error = get_e(sc, EEPROM_PROD_ID, &result); /* XXX check return */ + epb->prod_id = result; if ((desc = ep_pccard_identify(epb->prod_id)) == NULL) { device_printf(dev, "Unit failed to come ready or " "product ID unknown! (id 0x%x)\n", epb->prod_id); @@ -105,7 +110,7 @@ ep_pccard_probe(device_t dev) /* * For some reason the 3c574 needs this. */ - ep_get_macaddr(sc, (u_char *)&sc->arpcom.ac_enaddr); + error = ep_get_macaddr(sc, (u_char *)&sc->arpcom.ac_enaddr); ep_free(dev); return (0); @@ -159,6 +164,7 @@ static int ep_pccard_attach(device_t dev) { struct ep_softc * sc = device_get_softc(dev); + u_int16_t result; int error = 0; if ((error = ep_alloc(dev))) { @@ -167,11 +173,16 @@ ep_pccard_attach(device_t dev) } sc->epb.cmd_off = 0; - sc->epb.prod_id = get_e(sc, EEPROM_PROD_ID); + + error = get_e(sc, EEPROM_PROD_ID, &result); /* XXX check return */ + sc->epb.prod_id = result; + if (!ep_pccard_card_attach(&sc->epb)) { sc->epb.cmd_off = 2; - sc->epb.prod_id = get_e(sc, EEPROM_PROD_ID); - sc->epb.res_cfg = get_e(sc, EEPROM_RESOURCE_CFG); + error = get_e(sc, EEPROM_PROD_ID, &result); + sc->epb.prod_id = result; + error = get_e(sc, EEPROM_RESOURCE_CFG, &result); + sc->epb.res_cfg = result; if (!ep_pccard_card_attach(&sc->epb)) { device_printf(dev, "Probe found ID, attach failed so ignore card!\n"); @@ -180,9 +191,11 @@ ep_pccard_attach(device_t dev) } } + error = get_e(sc, EEPROM_ADDR_CFG, &result); + /* ROM size = 0, ROM base = 0 */ /* For now, ignore AUTO SELECT feature of 3C589B and later. */ - outw(BASE + EP_W0_ADDRESS_CFG, get_e(sc, EEPROM_ADDR_CFG) & 0xc000); + outw(BASE + EP_W0_ADDRESS_CFG, result & 0xc000); /* Fake IRQ must be 3 */ outw(BASE + EP_W0_RESOURCE_CFG, (sc->epb.res_cfg & 0x0fff) | 0x3000); diff --git a/sys/dev/ep/if_epvar.h b/sys/dev/ep/if_epvar.h index 21cceae..f32a801 100644 --- a/sys/dev/ep/if_epvar.h +++ b/sys/dev/ep/if_epvar.h @@ -79,5 +79,5 @@ void ep_free (device_t); void ep_get_media (struct ep_softc *); int ep_attach (struct ep_softc *); void ep_intr (void *); -u_int16_t get_e (struct ep_softc *, int); -void ep_get_macaddr (struct ep_softc *, u_char *); +int get_e (struct ep_softc *, u_int16_t, u_int16_t *); +int ep_get_macaddr (struct ep_softc *, u_char *); |