Module Name: src Committed By: jmcneill Date: Sun Sep 1 14:14:57 UTC 2019
Modified Files: src/sys/arch/arm/sunxi: sunxi_mmc.c Log Message: Instead of delaying ack of sdio card interrupts, ack them immediately and disable card interrupts until the sdio layer acks them later. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/sys/arch/arm/sunxi/sunxi_mmc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/sunxi/sunxi_mmc.c diff -u src/sys/arch/arm/sunxi/sunxi_mmc.c:1.34 src/sys/arch/arm/sunxi/sunxi_mmc.c:1.35 --- src/sys/arch/arm/sunxi/sunxi_mmc.c:1.34 Sun Sep 1 11:44:23 2019 +++ src/sys/arch/arm/sunxi/sunxi_mmc.c Sun Sep 1 14:14:57 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_mmc.c,v 1.34 2019/09/01 11:44:23 jmcneill Exp $ */ +/* $NetBSD: sunxi_mmc.c,v 1.35 2019/09/01 14:14:57 jmcneill Exp $ */ /*- * Copyright (c) 2014-2017 Jared McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_sunximmc.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_mmc.c,v 1.34 2019/09/01 11:44:23 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_mmc.c,v 1.35 2019/09/01 14:14:57 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -176,6 +176,7 @@ struct sunxi_mmc_softc { size_t sc_dmabounce_buflen; uint32_t sc_intr_rint; + uint32_t sc_intr_card; uint32_t sc_idma_idst; struct clk *sc_clk_ahb; @@ -607,7 +608,7 @@ sunxi_mmc_intr(void *priv) return 0; } MMC_WRITE(sc, SUNXI_MMC_IDST, idst); - MMC_WRITE(sc, SUNXI_MMC_RINT, rint & ~SUNXI_MMC_INT_SDIO_INT); + MMC_WRITE(sc, SUNXI_MMC_RINT, rint); DPRINTF(sc->sc_dev, "mmc intr idst=%08X rint=%08X\n", idst, rint); @@ -626,6 +627,8 @@ sunxi_mmc_intr(void *priv) } if ((rint & SUNXI_MMC_INT_SDIO_INT) != 0) { + imask = MMC_READ(sc, SUNXI_MMC_IMASK); + MMC_WRITE(sc, SUNXI_MMC_IMASK, imask & ~SUNXI_MMC_INT_SDIO_INT); sdmmc_card_intr(sc->sc_sdmmc_dev); } @@ -1218,7 +1221,8 @@ sunxi_mmc_exec_command(sdmmc_chipset_han done: cmd->c_flags |= SCF_ITSDONE; - MMC_WRITE(sc, SUNXI_MMC_IMASK, oimask); + MMC_WRITE(sc, SUNXI_MMC_IMASK, + (oimask & ~SUNXI_MMC_INT_SDIO_INT) | sc->sc_intr_card); MMC_WRITE(sc, SUNXI_MMC_RINT, 0xffff); MMC_WRITE(sc, SUNXI_MMC_IDST, 0x337); mutex_exit(&sc->sc_intr_lock); @@ -1246,18 +1250,25 @@ sunxi_mmc_card_enable_intr(sdmmc_chipset struct sunxi_mmc_softc *sc = sch; uint32_t imask; + mutex_enter(&sc->sc_intr_lock); imask = MMC_READ(sc, SUNXI_MMC_IMASK); if (enable) imask |= SUNXI_MMC_INT_SDIO_INT; else imask &= ~SUNXI_MMC_INT_SDIO_INT; + sc->sc_intr_card = imask & SUNXI_MMC_INT_SDIO_INT; MMC_WRITE(sc, SUNXI_MMC_IMASK, imask); + mutex_exit(&sc->sc_intr_lock); } static void sunxi_mmc_card_intr_ack(sdmmc_chipset_handle_t sch) { struct sunxi_mmc_softc *sc = sch; + uint32_t imask; - MMC_WRITE(sc, SUNXI_MMC_RINT, SUNXI_MMC_INT_SDIO_INT); + mutex_enter(&sc->sc_intr_lock); + imask = MMC_READ(sc, SUNXI_MMC_IMASK); + MMC_WRITE(sc, SUNXI_MMC_IMASK, imask | sc->sc_intr_card); + mutex_exit(&sc->sc_intr_lock); }