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);
 }

Reply via email to