Module Name: src Committed By: jmcneill Date: Fri Sep 12 21:00:11 UTC 2014
Modified Files: src/sys/arch/arm/broadcom: bcm2835_emmc.c Log Message: cv_wait -> cv_timedwait for dma transfers, just to be safe To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/broadcom/bcm2835_emmc.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/broadcom/bcm2835_emmc.c diff -u src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.12 src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.13 --- src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.12 Fri Sep 12 20:55:48 2014 +++ src/sys/arch/arm/broadcom/bcm2835_emmc.c Fri Sep 12 21:00:11 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_emmc.c,v 1.12 2014/09/12 20:55:48 jmcneill Exp $ */ +/* $NetBSD: bcm2835_emmc.c,v 1.13 2014/09/12 21:00:11 jmcneill Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.12 2014/09/12 20:55:48 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.13 2014/09/12 21:00:11 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -38,6 +38,7 @@ __KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc #include <sys/bus.h> #include <sys/condvar.h> #include <sys/mutex.h> +#include <sys/kernel.h> #include <arm/broadcom/bcm2835reg.h> #include <arm/broadcom/bcm_amba.h> @@ -233,6 +234,7 @@ bcmemmc_xfer_data_dma(struct sdhc_host * { struct bcmemmc_softc * const sc = *(void **)hp; /* XXX XXX XXX */ size_t seg; + int error; for (seg = 0; seg < cmd->c_dmamap->dm_nsegs; seg++) { sc->sc_cblk[seg].cb_ti = @@ -275,20 +277,30 @@ bcmemmc_xfer_data_dma(struct sdhc_host * bus_dmamap_sync(sc->sc.sc_dmat, sc->sc_dmamap, 0, sc->sc_dmamap->dm_mapsize, BUS_DMASYNC_PREWRITE); + error = 0; + mutex_enter(&sc->sc_lock); KASSERT(sc->sc_state == EMMC_DMA_STATE_IDLE); sc->sc_state = EMMC_DMA_STATE_BUSY; bcm_dmac_set_conblk_addr(sc->sc_dmac, sc->sc_dmamap->dm_segs[0].ds_addr); bcm_dmac_transfer(sc->sc_dmac); - while (sc->sc_state == EMMC_DMA_STATE_BUSY) - cv_wait(&sc->sc_cv, &sc->sc_lock); + while (sc->sc_state == EMMC_DMA_STATE_BUSY) { + error = cv_timedwait(&sc->sc_cv, &sc->sc_lock, hz * 10); + if (error == EWOULDBLOCK) { + device_printf(sc->sc.sc_dev, "transfer timeout!\n"); + bcm_dmac_halt(sc->sc_dmac); + sc->sc_state = EMMC_DMA_STATE_IDLE; + error = ETIMEDOUT; + break; + } + } mutex_exit(&sc->sc_lock); bus_dmamap_sync(sc->sc.sc_dmat, sc->sc_dmamap, 0, sc->sc_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE); - return 0; + return error; } static void