int rtk_intr(void *arg) { struct rtk_softc *sc; struct ifnet *ifp; uint16_t status; int handled; sc = arg; ifp = &sc->ethercom.ec_if; if (!device_has_power(sc->sc_dev)) return 0; /* Disable interrupts. */ CSR_WRITE_2(sc, RTK_IMR, 0x0000); handled = 0; for (;;) { status = CSR_READ_2(sc, RTK_ISR); if (status == 0xffff) break; /* Card is gone... */ if (status) CSR_WRITE_2(sc, RTK_ISR, status); if ((status & RTK_INTRS) == 0) break; handled = 1; if (status & RTK_ISR_RX_OK) rtk_rxeof(sc); if (status & RTK_ISR_RX_ERR) rtk_rxeof(sc); if (status & (RTK_ISR_TX_OK|RTK_ISR_TX_ERR)) rtk_txeof(sc); if (status & RTK_ISR_SYSTEM_ERR) { rtk_reset(sc); rtk_init(ifp); } } /* Re-enable interrupts. */ CSR_WRITE_2(sc, RTK_IMR, RTK_INTRS); if (IFQ_IS_EMPTY(&ifp->if_snd) == 0) rtk_start(ifp); rnd_add_uint32(&sc->rnd_source, status); return handled; }
static int auich_intr(void *v) { struct auich_softc *sc; int ret, gsts; #ifdef DIAGNOSTIC int csts; #endif sc = v; if (!device_has_power(sc->sc_dev)) return (0); mutex_spin_enter(&sc->sc_intr_lock); ret = 0; #ifdef DIAGNOSTIC csts = pci_conf_read(sc->sc_pc, sc->sc_pt, PCI_COMMAND_STATUS_REG); if (csts & PCI_STATUS_MASTER_ABORT) { printf("auich_intr: PCI master abort\n"); } #endif gsts = bus_space_read_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset); DPRINTF(ICH_DEBUG_INTR, ("auich_intr: gsts=0x%x\n", gsts)); if ((sc->sc_codectype == AC97_CODEC_TYPE_AUDIO && gsts & ICH_POINT) || (sc->sc_codectype == AC97_CODEC_TYPE_MODEM && gsts & ICH_MOINT)) { int sts; sts = bus_space_read_2(sc->iot, sc->aud_ioh, ICH_PCMO + sc->sc_sts_reg); DPRINTF(ICH_DEBUG_INTR, ("auich_intr: osts=0x%x\n", sts)); if (sts & ICH_FIFOE) printf("%s: fifo underrun\n", device_xname(sc->sc_dev)); if (sts & ICH_BCIS) auich_intr_pipe(sc, ICH_PCMO, &sc->pcmo); /* int ack */ bus_space_write_2(sc->iot, sc->aud_ioh, ICH_PCMO + sc->sc_sts_reg, sts & (ICH_BCIS | ICH_FIFOE)); if (sc->sc_codectype == AC97_CODEC_TYPE_AUDIO) bus_space_write_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset, ICH_POINT); else bus_space_write_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset, ICH_MOINT); ret++; } if ((sc->sc_codectype == AC97_CODEC_TYPE_AUDIO && gsts & ICH_PIINT) || (sc->sc_codectype == AC97_CODEC_TYPE_MODEM && gsts & ICH_MIINT)) { int sts; sts = bus_space_read_2(sc->iot, sc->aud_ioh, ICH_PCMI + sc->sc_sts_reg); DPRINTF(ICH_DEBUG_INTR, ("auich_intr: ists=0x%x\n", sts)); if (sts & ICH_FIFOE) printf("%s: fifo overrun\n", device_xname(sc->sc_dev)); if (sts & ICH_BCIS) auich_intr_pipe(sc, ICH_PCMI, &sc->pcmi); /* int ack */ bus_space_write_2(sc->iot, sc->aud_ioh, ICH_PCMI + sc->sc_sts_reg, sts & (ICH_BCIS | ICH_FIFOE)); if (sc->sc_codectype == AC97_CODEC_TYPE_AUDIO) bus_space_write_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset, ICH_PIINT); else bus_space_write_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset, ICH_MIINT); ret++; } if (sc->sc_codectype == AC97_CODEC_TYPE_AUDIO && gsts & ICH_MINT) { int sts; sts = bus_space_read_2(sc->iot, sc->aud_ioh, ICH_MICI + sc->sc_sts_reg); DPRINTF(ICH_DEBUG_INTR, ("auich_intr: ists=0x%x\n", sts)); if (sts & ICH_FIFOE) printf("%s: fifo overrun\n", device_xname(sc->sc_dev)); if (sts & ICH_BCIS) auich_intr_pipe(sc, ICH_MICI, &sc->mici); /* int ack */ bus_space_write_2(sc->iot, sc->aud_ioh, ICH_MICI + sc->sc_sts_reg, sts & (ICH_BCIS | ICH_FIFOE)); bus_space_write_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset, ICH_MINT); ret++; } #ifdef AUICH_MODEM_DEBUG if (sc->sc_codectype == AC97_CODEC_TYPE_MODEM && gsts & ICH_GSCI) { printf("%s: gsts=0x%x\n", device_xname(sc->sc_dev), gsts); /* int ack */ bus_space_write_4(sc->iot, sc->aud_ioh, ICH_GSTS + sc->sc_modem_offset, ICH_GSCI); ret++; } #endif mutex_spin_exit(&sc->sc_intr_lock); return ret; }