static int sbni_probe_isa(device_t dev) { struct sbni_softc *sc; int error; error = ISA_PNP_PROBE(device_get_parent(dev), dev, sbni_ids); if (error && error != ENOENT) return (error); sc = device_get_softc(dev); sc->io_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->io_rid, 0ul, ~0ul, SBNI_PORTS, RF_ACTIVE); if (!sc->io_res) { printf("sbni: cannot allocate io ports!\n"); return (ENOENT); } if (sbni_probe(sc) != 0) { sbni_release_resources(sc); return (ENXIO); } device_set_desc(dev, "Granch SBNI12/ISA adapter"); return (0); }
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_detach(device_t dev) { struct sbni_softc *sc; sc = device_get_softc(dev); sbni_detach(sc); if (sc->slave_sc) sbni_detach(sc); sbni_release_resources(sc); if (sc->slave_sc) free(sc->slave_sc, M_DEVBUF); return (0); }
static int sbni_pci_probe(device_t dev) { struct sbni_softc *sc; u_int32_t ports; ports = SBNI_PORTS; if (pci_get_vendor(dev) != SBNI_PCI_VENDOR || pci_get_device(dev) != SBNI_PCI_DEVICE) return (ENXIO); sc = device_get_softc(dev); if (pci_get_subdevice(dev) == 2) { ports <<= 1; sc->slave_sc = malloc(sizeof(struct sbni_softc), M_DEVBUF, M_NOWAIT | M_ZERO); if (!sc->slave_sc) return (ENOMEM); device_set_desc(dev, "Granch SBNI12/PCI Dual adapter"); } else device_set_desc(dev, "Granch SBNI12/PCI adapter"); sc->io_rid = PCIR_BAR(0); sc->io_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->io_rid, 0ul, ~0ul, ports, RF_ACTIVE); if (!sc->io_res) { device_printf(dev, "cannot allocate io ports!\n"); if (sc->slave_sc) free(sc->slave_sc, M_DEVBUF); return (ENOENT); } if (sc->slave_sc) { sc->slave_sc->io_res = sc->io_res; sc->slave_sc->io_off = 4; } if (sbni_probe(sc) != 0) { sbni_release_resources(sc); if (sc->slave_sc) free(sc->slave_sc, M_DEVBUF); return (ENXIO); } return (0); }
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); }