diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/arm/xscale/pxa2x0_mmc.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/sys/arch/arm/xscale/pxa2x0_mmc.c b/sys/arch/arm/xscale/pxa2x0_mmc.c index a2dca15ded4..42cb8eff3eb 100644 --- a/sys/arch/arm/xscale/pxa2x0_mmc.c +++ b/sys/arch/arm/xscale/pxa2x0_mmc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pxa2x0_mmc.c,v 1.4 2009/02/20 19:16:34 miod Exp $ */ +/* $OpenBSD: pxa2x0_mmc.c,v 1.5 2009/02/23 18:09:55 miod Exp $ */ /* * Copyright (c) 2007 Uwe Stuehler <uwe@openbsd.org> @@ -474,11 +474,17 @@ pxammc_intr(void *arg) { struct pxammc_softc *sc = arg; int status; +#ifdef DIAGNOSTIC + int wstatus; +#endif #define MMC_I_REG_STR "\20\001DATADONE\002PRGDONE\003ENDCMDRES" \ "\004STOPCMD\005CLKISOFF\006RXFIFO\007TXFIFO" \ "\011DATERR\012RESERR\014SDIO" +#ifdef DIAGNOSTIC + wstatus = +#endif status = CSR_READ_4(sc, MMC_I_REG) & ~CSR_READ_4(sc, MMC_I_MASK); DPRINTF(1,("%s: intr %b\n", sc->sc_dev.dv_xname, status, MMC_I_REG_STR)); @@ -509,6 +515,11 @@ pxammc_intr(void *arg) pxammc_intr_cmd(sc); CSR_SET_4(sc, MMC_I_MASK, MMC_I_END_CMD_RES); CLR(status, MMC_I_END_CMD_RES); + /* ignore programming done condition */ + if (ISSET(status, MMC_I_PRG_DONE)) { + CSR_SET_4(sc, MMC_I_MASK, MMC_I_PRG_DONE); + CLR(status, MMC_I_PRG_DONE); + } if (sc->sc_cmd == NULL) goto end; } @@ -523,6 +534,11 @@ pxammc_intr(void *arg) pxammc_intr_done(sc); CSR_SET_4(sc, MMC_I_MASK, MMC_I_DAT_ERR); CLR(status, MMC_I_DAT_ERR); + /* ignore transmission done condition */ + if (ISSET(status, MMC_I_DATA_TRAN_DONE)) { + CSR_SET_4(sc, MMC_I_MASK, MMC_I_DATA_TRAN_DONE); + CLR(status, MMC_I_DATA_TRAN_DONE); + } goto end; } @@ -536,8 +552,9 @@ end: /* Avoid further unhandled interrupts. */ if (status != 0) { #ifdef DIAGNOSTIC - printf("%s: unhandled interrupt %b\n", sc->sc_dev.dv_xname, - status, MMC_I_REG_STR); + printf("%s: unhandled interrupt %b out of %b\n", + sc->sc_dev.dv_xname, status, MMC_I_REG_STR, + wstatus, MMC_I_REG_STR); #endif CSR_SET_4(sc, MMC_I_MASK, status); } |