static int sbni_pci_attach(device_t dev) { struct sbni_softc *sc; struct sbni_flags flags; int error; sc = device_get_softc(dev); sc->dev = dev; sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, RF_SHAREABLE); if (sc->irq_res == NULL) { device_printf(dev, "cannot claim irq!\n"); error = ENOENT; goto attach_failed; } *(u_int32_t*)&flags = 0; error = sbni_attach(sc, device_get_unit(dev) * 2, flags); if (error) { device_printf(dev, "cannot initialize driver\n"); goto attach_failed; } if (sc->slave_sc) { error = sbni_attach(sc->slave_sc, device_get_unit(dev) * 2 + 1, flags); if (error) { device_printf(dev, "cannot initialize slave\n"); sbni_detach(sc); goto attach_failed; } } if (sc->irq_res) { error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, NULL, sbni_intr, sc, &sc->irq_handle); if (error) { device_printf(dev, "bus_setup_intr\n"); sbni_detach(sc); if (sc->slave_sc) sbni_detach(sc); goto attach_failed; } } return (0); attach_failed: sbni_release_resources(sc); if (sc->slave_sc) free(sc->slave_sc, M_DEVBUF); return (error); }
static int sbni_pci_attach(device_t dev) { struct sbni_softc *sc; struct sbni_flags flags; int error; sc = device_get_softc(dev); printf("sbni%d: <Granch SBNI12/PCI%sadapter> port 0x%x", next_sbni_unit, sc->slave_sc ? " Dual " : " ", sc->base_addr); sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid, 0ul, ~0ul, 1, RF_SHAREABLE); if (sc->irq_res) { printf(" irq %ld\n", rman_get_start(sc->irq_res)); error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, sbni_intr, sc, &sc->irq_handle); if (error) { printf("sbni%d: bus_setup_intr\n", next_sbni_unit); goto attach_failed; } } else { printf("\nsbni%d: cannot claim irq!\n", next_sbni_unit); error = ENOENT; goto attach_failed; } *(u_int32_t*)&flags = 0; sbni_attach(sc, next_sbni_unit++, flags); if (sc->slave_sc) sbni_attach(sc->slave_sc, next_sbni_unit++, flags); return (0); attach_failed: bus_release_resource(dev, SYS_RES_IOPORT, sc->io_rid, sc->io_res); if (sc->slave_sc) free(sc->slave_sc, M_DEVBUF); return (error); }
static int sbni_attach_isa(device_t dev) { struct sbni_softc *sc; struct sbni_flags flags; int error; sc = device_get_softc(dev); sc->dev = dev; sc->irq_res = bus_alloc_resource_any( dev, SYS_RES_IRQ, &sc->irq_rid, RF_ACTIVE); #ifndef SBNI_DUAL_COMPOUND if (sc->irq_res == NULL) { device_printf(dev, "irq conflict!\n"); sbni_release_resources(sc); return (ENOENT); } #else /* SBNI_DUAL_COMPOUND */ if (sc->irq_res) { sbni_add(sc); } else { struct sbni_softc *master; if ((master = connect_to_master(sc)) == 0) { device_printf(dev, "failed to alloc irq\n"); sbni_release_resources(sc); return (ENXIO); } else { device_printf(dev, "shared irq with %s\n", master->ifp->if_xname); } } #endif /* SBNI_DUAL_COMPOUND */ *(u_int32_t*)&flags = device_get_flags(dev); error = sbni_attach(sc, device_get_unit(dev) * 2, flags); if (error) { device_printf(dev, "cannot initialize driver\n"); sbni_release_resources(sc); return (error); } if (sc->irq_res) { error = bus_setup_intr( dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, NULL, sbni_intr, sc, &sc->irq_handle); if (error) { device_printf(dev, "bus_setup_intr\n"); sbni_detach(sc); sbni_release_resources(sc); return (error); } } return (0); }