int iavc_b1dma_detect(iavc_softc_t *sc) { AMCC_WRITE(sc, AMCC_MCSR, 0); DELAY(10*1000); AMCC_WRITE(sc, AMCC_MCSR, 0x0f000000); DELAY(10*1000); AMCC_WRITE(sc, AMCC_MCSR, 0); DELAY(42*1000); AMCC_WRITE(sc, AMCC_RXLEN, 0); AMCC_WRITE(sc, AMCC_TXLEN, 0); sc->sc_csr = 0; AMCC_WRITE(sc, AMCC_INTCSR, sc->sc_csr); if (AMCC_READ(sc, AMCC_INTCSR) != 0) return 1; AMCC_WRITE(sc, AMCC_RXPTR, 0xffffffff); AMCC_WRITE(sc, AMCC_TXPTR, 0xffffffff); if ((AMCC_READ(sc, AMCC_RXPTR) != 0xfffffffc) || (AMCC_READ(sc, AMCC_TXPTR) != 0xfffffffc)) return 2; AMCC_WRITE(sc, AMCC_RXPTR, 0); AMCC_WRITE(sc, AMCC_TXPTR, 0); if ((AMCC_READ(sc, AMCC_RXPTR) != 0) || (AMCC_READ(sc, AMCC_TXPTR) != 0)) return 3; iavc_write_port(sc, 0x10, 0x00); iavc_write_port(sc, 0x07, 0x00); iavc_write_port(sc, 0x02, 0x02); iavc_write_port(sc, 0x03, 0x02); if (((iavc_read_port(sc, 0x02) & 0xfe) != 0x02) || (iavc_read_port(sc, 0x03) != 0x03)) return 4; iavc_write_port(sc, 0x02, 0x00); iavc_write_port(sc, 0x03, 0x00); if (((iavc_read_port(sc, 0x02) & 0xfe) != 0x00) || (iavc_read_port(sc, 0x03) != 0x01)) return 5; return (0); /* found */ }
int b1_detect(iavc_softc_t *sc) { if ((iavc_read_port(sc, B1_INSTAT) & 0xfc) || (iavc_read_port(sc, B1_OUTSTAT) & 0xfc)) return (1); b1io_outp(sc, B1_INSTAT, 0x02); b1io_outp(sc, B1_OUTSTAT, 0x02); if ((iavc_read_port(sc, B1_INSTAT) & 0xfe) != 2 || (iavc_read_port(sc, B1_OUTSTAT) & 0xfe) != 2) return (2); b1io_outp(sc, B1_INSTAT, 0x00); b1io_outp(sc, B1_OUTSTAT, 0x00); if ((iavc_read_port(sc, B1_INSTAT) & 0xfe) || (iavc_read_port(sc, B1_OUTSTAT) & 0xfe)) return (3); return (0); /* found */ }
static int iavc_isa_probe(device_t dev) { struct iavc_softc *sc; int ret = ENXIO; int unit = device_get_unit(dev); if(isa_get_vendorid(dev)) /* no PnP probes here */ return ENXIO; /* check max unit range */ if (unit >= IAVC_MAXUNIT) { kprintf("iavc%d: too many units\n", unit); return(ENXIO); } sc = iavc_find_sc(unit); /* get softc */ sc->sc_unit = unit; if (!(sc->sc_resources.io_base[0] = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->sc_resources.io_rid[0], 0UL, ~0UL, B1_IOLENGTH, RF_ACTIVE))) { kprintf("iavc%d: can't allocate io region\n", unit); return(ENXIO); } sc->sc_iobase = rman_get_start(sc->sc_resources.io_base[0]); switch(sc->sc_iobase) { case 0x150: case 0x250: case 0x300: case 0x340: break; default: kprintf("iavc%d: ERROR, invalid i/o base addr 0x%x configured!\n", sc->sc_unit, sc->sc_iobase); bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_resources.io_rid[0], sc->sc_resources.io_base[0]); return(ENXIO); } sc->sc_io_bt = rman_get_bustag(sc->sc_resources.io_base[0]); sc->sc_io_bh = rman_get_bushandle(sc->sc_resources.io_base[0]); /* setup characteristics */ sc->sc_t1 = FALSE; sc->sc_dma = FALSE; sc->sc_capi.card_type = CARD_TYPEC_AVM_B1_ISA; sc->sc_capi.sc_nbch = 2; b1_reset(sc); DELAY(100); ret = b1_detect(sc); if(ret) { kprintf("iavc%d: no card ? b1_detect returns %0x02x\n", sc->sc_unit, ret); return(ENXIO); } DELAY(100); b1_reset(sc); DELAY(100); if(bootverbose) { kprintf("iavc%d: class = 0x%02x, rev = 0x%02x\n", sc->sc_unit, iavc_read_port(sc, B1_ANALYSE), iavc_read_port(sc, B1_REVISION)); } device_set_desc(dev, "AVM B1 ISA"); return(0); }