Exemplo n.º 1
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);
}
Exemplo n.º 2
0
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);
}