int le_fwio_intr(void *v) { struct le_fwio_softc *lsc = (struct le_fwio_softc *)v; struct lance_softc *sc = &lsc->sc_am7990.lsc; int rc; /* * FBIC expects edge interrupts, while the LANCE does level * interrupts. To avoid missing interrupts while servicing, * we disable further device interrupts while servicing. * * However, am7990_intr() will flip the interrupt enable bit * itself; we override wrcsr with a specific version during * servicing, so as not to reenable interrupts accidentally... */ sc->sc_wrcsr = le_fwio_wrcsr_interrupt; rc = am7990_intr(v); sc->sc_wrcsr = le_fwio_wrcsr; /* * ...but we should not forget to reenable interrupts at this point! */ le_fwio_wrcsr(sc, LE_CSR0, LE_C0_INEA | le_fwio_rdcsr(sc, LE_CSR0)); return rc; }
int leintr(int unit) { struct am7990_softc *sc; if (unit >= le_cd.cd_ndevs) /* XXX */ return 0; sc = device_lookup_private(&le_cd, unit); return am7990_intr(sc); }