コード例 #1
0
ファイル: if_vx_eisa.c プロジェクト: UnitedMarsupials/kame
static int
vx_eisa_attach(device_t dev)
{
    struct vx_softc *sc;
    int             unit = device_get_unit(dev);
    struct resource *io = 0;
    struct resource *eisa_io = 0;
    struct resource *irq = 0;
    int		    rid;
    void	    *ih;

    /*
     * The addresses are sorted in increasing order
     * so we know the port to pass to the core ep
     * driver comes first.
     */
    rid = 0;
    io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
			    0, ~0, 1, RF_ACTIVE);
    if (!io) {
	device_printf(dev, "No I/O space?!\n");
	goto bad;
    }

    rid = 1;
    eisa_io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
				 0, ~0, 1, RF_ACTIVE);
    if (!eisa_io) {
	device_printf(dev, "No I/O space?!\n");
	goto bad;
    }

    if ((sc = vxalloc(unit)) == NULL)
	goto bad;

    sc->vx_io_addr = rman_get_start(io);

    rid = 0;
    irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid,
			     0, ~0, 1, RF_ACTIVE);
    if (!irq) {
	device_printf(dev, "No irq?!\n");
	vxfree(sc);
	goto bad;
    }

    /* Now the registers are availible through the lower ioport */

    vxattach(sc);

    if (bus_setup_intr(dev, irq, INTR_TYPE_NET, vxintr, sc, &ih)) {
	vxfree(sc);
	goto bad;
    }

    return 0;

 bad:
    if (io)
	bus_release_resource(dev, SYS_RES_IOPORT, 0, io);
    if (eisa_io)
	bus_release_resource(dev, SYS_RES_IOPORT, 0, eisa_io);
    if (irq)
	bus_release_resource(dev, SYS_RES_IRQ, 0, irq);
    return -1;
}
コード例 #2
0
ファイル: if_vx_pci.c プロジェクト: mihaicarabas/dragonfly
static int 
vx_pci_attach(device_t dev)
{
    struct vx_softc *sc = device_get_softc(dev);
    struct ifnet *ifp = &sc->arpcom.ac_if;
    int rid;

    rid = PCIR_MAPS;
    sc->vx_res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid,
	RF_ACTIVE);

    if (sc->vx_res == NULL)
	goto bad;

    sc->vx_btag = rman_get_bustag(sc->vx_res);
    sc->vx_bhandle = rman_get_bushandle(sc->vx_res);

    rid = 0;
    sc->vx_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
	RF_SHAREABLE | RF_ACTIVE);

    if (sc->vx_irq == NULL)
	goto bad;

    if (vxattach(dev) == 0) {
	goto bad;
    }

    /* defect check for 3C590 */
    if (pci_get_device(dev) == PCI_PRODUCT_3COM_3C590) {
	GO_WINDOW(0);
	if (vxbusyeeprom(sc))
	    goto bad;
	CSR_WRITE_2(sc, VX_W0_EEPROM_COMMAND,
	    EEPROM_CMD_RD | EEPROM_SOFT_INFO_2);
	if (vxbusyeeprom(sc))
	    goto bad;
	if (!(CSR_READ_2(sc, VX_W0_EEPROM_DATA) & NO_RX_OVN_ANOMALY)) {
	    kprintf("Warning! Defective early revision adapter!\n");
	}
    }

    ifq_set_cpuid(&ifp->if_snd, rman_get_cpuid(sc->vx_irq));

    if (bus_setup_intr(dev, sc->vx_irq, INTR_MPSAFE,
		       vxintr, sc, &sc->vx_intrhand, 
		       ifp->if_serializer)
    ) {
	ether_ifdetach(&sc->arpcom.ac_if);
	goto bad;
    }

    return(0);

bad:
    if (sc->vx_res != NULL)
	bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->vx_res);
    if (sc->vx_irq != NULL)
	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vx_irq);
    return(ENXIO);
}