/* * Initialize the device - called from Slot manager. */ static int fe_pccard_probe(device_t dev) { struct fe_softc *sc; int error; /* Prepare for the device probe process. */ sc = device_get_softc(dev); sc->sc_unit = device_get_unit(dev); pccard_get_ether(dev, sc->sc_enaddr); /* Probe for supported cards. */ if ((error = fe_probe_mbh(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_tdk(dev)) == 0) goto end; fe_release_resource(dev); end: if (error == 0) error = fe_alloc_irq(dev, 0); fe_release_resource(dev); return (error); }
static int fe_pccard_attach(device_t dev) { struct fe_softc *sc; const struct fe_pccard_product *pp; int error; /* Prepare for the device probe process. */ sc = device_get_softc(dev); sc->sc_unit = device_get_unit(dev); pp = (const struct fe_pccard_product *) pccard_product_lookup(dev, (const struct pccard_product *)fe_pccard_products, sizeof(fe_pccard_products[0]), NULL); if (pp == NULL) return (ENXIO); if (pp->mpp_flags & MPP_MBH10302) error = fe_probe_mbh(dev, pp); else error = fe_probe_tdk(dev, pp); if (error != 0) { fe_release_resource(dev); return (error); } error = fe_alloc_irq(dev, 0); if (error != 0) { fe_release_resource(dev); return (error); } return (fe_attach(dev)); }
/* * Initialize the device - called from Slot manager. */ static int fe_pccard_probe(device_t dev) { struct fe_softc *sc; int i, error; uint8_t sum; const uint8_t *ether_addr; /* Prepare for the device probe process. */ sc = device_get_softc(dev); sc->sc_unit = device_get_unit(dev); ether_addr = pccard_get_ether(dev); for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) sum |= ether_addr[i]; if (sum) bcopy(ether_addr, sc->sc_enaddr, ETHER_ADDR_LEN); /* Probe for supported cards. */ if ((error = fe_probe_mbh(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_tdk(dev)) == 0) goto end; fe_release_resource(dev); end: if (error == 0) error = fe_alloc_irq(dev, 0); fe_release_resource(dev); return (error); }
static int fe_isa_probe(device_t dev) { struct fe_softc * sc; int error; /* Check isapnp ids */ if (isa_get_vendorid(dev)) return (ENXIO); /* Prepare for the softc struct. */ sc = device_get_softc(dev); sc->sc_unit = device_get_unit(dev); /* Probe for supported boards. */ #ifdef PC98 if ((error = fe_probe_re1000(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_cnet9ne(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_rex(dev)) == 0) goto end; fe_release_resource(dev); #endif if ((error = fe_probe_ssi(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_jli(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_lnx(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_ubn(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_gwy(dev)) == 0) goto end; fe_release_resource(dev); end: if (error == 0) error = fe_alloc_irq(dev, 0); fe_release_resource(dev); return (error); }
/* * feunload - unload the driver and clear the table. * XXX TODO: * This is usually called when the card is ejected, but * can be caused by a modunload of a controller driver. * The idea is to reset the driver's view of the device * and ensure that any driver entry points such as * read and write do not hang. */ static int fe_pccard_detach(device_t dev) { struct fe_softc *sc = device_get_softc(dev); struct ifnet *ifp = &sc->arpcom.ac_if; fe_stop(sc); ether_ifdetach(ifp); bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); fe_release_resource(dev); return 0; }
/* * feunload - unload the driver and clear the table. */ static int fe_pccard_detach(device_t dev) { struct fe_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->ifp; FE_LOCK(sc); fe_stop(sc); FE_UNLOCK(sc); callout_drain(&sc->timer); ether_ifdetach(ifp); bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); if_free(ifp); fe_release_resource(dev); mtx_destroy(&sc->lock); return 0; }
/* * Determine if the device is present at a specified I/O address. The * main entry to the driver. */ static int fe_isa_probe(device_t dev) { struct fe_softc *sc; int error; /* Prepare for the softc struct. */ sc = device_get_softc(dev); sc->sc_unit = device_get_unit(dev); /* Check isapnp ids */ error = ISA_PNP_PROBE(device_get_parent(dev), dev, fe_ids); /* If the card had a PnP ID that didn't match any we know about */ if (error == ENXIO) goto end; /* If we had some other problem. */ if (!(error == 0 || error == ENOENT)) goto end; /* Probe for supported boards. */ if ((error = fe_probe_re1000(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_cnet9ne(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_rex(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_ssi(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_jli(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_lnx(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_ubn(dev)) == 0) goto end; fe_release_resource(dev); if ((error = fe_probe_gwy(dev)) == 0) goto end; fe_release_resource(dev); end: if (error == 0) error = fe_alloc_irq(dev, 0); fe_release_resource(dev); return (error); }