コード例 #1
0
ファイル: rtl81x9.c プロジェクト: yazshel/netbsd-kernel
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;
}
コード例 #2
0
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;
}