Example #1
0
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);
}