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); }
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); }
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); }