Example #1
0
static int
aic_isa_probe(struct isa_device *dev)
{
	struct aic_softc _aic, *aic = &_aic;
	int numports, i;
	u_int port, *ports;
	u_int8_t porta;

	port = dev->id_iobase;
	if (port != -1) {
		ports = &port;
		numports = 1;
	} else {
		ports = aic_isa_ports;
		numports = AIC_ISA_NUMPORTS;
	}

	for (i = 0; i < numports; i++) {
#ifdef PC98
		aic->bsh_iat = aicport_generic;
		if (AIC_TYPE98(dev->id_flags) == AIC98_NEC100) {
			/* PC-9801-100 */
			aic->bsh_iat = aicport_100;
		}
#endif
		aic->unit = aic_unit;
		aic->tag = I386_BUS_SPACE_IO;
		aic->bsh = ports[i];
		if (!aic_probe(aic))
			break;
	}

	if (i == numports)
		return (0);

	porta = aic_inb(aic, PORTA);
	if (dev->id_irq <= 0)
		dev->id_irq = 1 << PORTA_IRQ(porta);
	if ((aic->flags & AIC_DMA_ENABLE) && dev->id_drq == -1)
		dev->id_drq = PORTA_DRQ(porta);
	dev->id_iobase = aic->bsh;
	dev->id_intr = aic_isa_intr;
	dev->id_unit = aic_unit++;
#ifdef PC98
	if (AIC_TYPE98(dev->id_flags) == AIC98_NEC100)
		return (AIC_ISA_PORTSIZE * 2);
#endif
	return (AIC_ISA_PORTSIZE);
}
Example #2
0
static int
aic_isa_alloc_resources(device_t dev)
{
	struct aic_isa_softc *sc = device_get_softc(dev);
	int rid;
	bus_addr_t *bs_iat;

	if ((isa_get_logicalid(dev) == 0xa180a3b8) ||
	    (AIC_TYPE98(device_get_flags(dev)) == AIC98_NEC100))
		bs_iat = aicport_100;
	else
		bs_iat = aicport_generic;

	sc->sc_port = sc->sc_irq = sc->sc_drq = NULL;

	rid = 0;
	sc->sc_port = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid,
					  bs_iat, AIC_ISA_PORTSIZE, RF_ACTIVE);
	if (!sc->sc_port) {
		device_printf(dev, "I/O port allocation failed\n");
		return (ENOMEM);
	}
	isa_load_resourcev(sc->sc_port, bs_iat, AIC_ISA_PORTSIZE);
	mtx_init(&sc->sc_aic.lock, "aic", NULL, MTX_DEF);

	if (isa_get_irq(dev) != -1) {
		rid = 0;
		sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
						    RF_ACTIVE);
		if (!sc->sc_irq) {
			device_printf(dev, "IRQ allocation failed\n");
			aic_isa_release_resources(dev);
			return (ENOMEM);
		}
	}

	if (isa_get_drq(dev) != -1) {
		rid = 0;
		sc->sc_drq = bus_alloc_resource_any(dev, SYS_RES_DRQ, &rid,
						    RF_ACTIVE);
		if (!sc->sc_drq) {
			device_printf(dev, "DRQ allocation failed\n");
			aic_isa_release_resources(dev);
			return (ENOMEM);
		}
	}

	sc->sc_aic.dev = dev;
	sc->sc_aic.res = sc->sc_port;
	return (0);
}
Example #3
0
static int
aic_isa_attach(struct isa_device *dev)
{
	struct aic_softc *aic = &aic_softcs[dev->id_unit];

	aic->unit = dev->id_unit;
	aic->tag = I386_BUS_SPACE_IO;
	aic->bsh = dev->id_iobase;
#ifdef PC98
	aic->bsh_iat = aicport_generic;
	if (AIC_TYPE98(dev->id_flags) == AIC98_NEC100) {
		/* PC-9801-100 */
		aic->bsh_iat = aicport_100;
	}
#endif

	return (aic_attach(aic) == 0);
}