Module Name:    src
Committed By:   skrll
Date:           Sun Sep 14 08:47:08 UTC 2014

Modified Files:
        src/sys/dev/sdmmc: sdhc.c

Log Message:
When doing vendor dma transfer wait for SDHC_TRANSFER_COMPLETE.

>From jmcneill@ with some layout changes from me.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/dev/sdmmc/sdhc.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/dev/sdmmc/sdhc.c
diff -u src/sys/dev/sdmmc/sdhc.c:1.46 src/sys/dev/sdmmc/sdhc.c:1.47
--- src/sys/dev/sdmmc/sdhc.c:1.46	Fri Sep 12 19:47:40 2014
+++ src/sys/dev/sdmmc/sdhc.c	Sun Sep 14 08:47:08 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sdhc.c,v 1.46 2014/09/12 19:47:40 jakllsch Exp $	*/
+/*	$NetBSD: sdhc.c,v 1.47 2014/09/14 08:47:08 skrll Exp $	*/
 /*	$OpenBSD: sdhc.c,v 1.25 2009/01/13 19:44:20 grange Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sdhc.c,v 1.46 2014/09/12 19:47:40 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdhc.c,v 1.47 2014/09/14 08:47:08 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_sdmmc.h"
@@ -222,7 +222,7 @@ sdhc_cfprint(void *aux, const char *pnp)
 {
 	const struct sdmmcbus_attach_args * const saa = aux;
 	const struct sdhc_host * const hp = saa->saa_sch;
-	
+
 	if (pnp) {
 		aprint_normal("sdmmc at %s", pnp);
 	}
@@ -1031,7 +1031,7 @@ sdhc_card_enable_intr(sdmmc_chipset_hand
 	}
 }
 
-static void 
+static void
 sdhc_card_intr_ack(sdmmc_chipset_handle_t sch)
 {
 	struct sdhc_host *hp = (struct sdhc_host *)sch;
@@ -1074,7 +1074,7 @@ sdhc_exec_command(sdmmc_chipset_handle_t
 		} else {
 			HSET2(hp, SDHC_NINTR_SIGNAL_EN, ready);
 			HSET2(hp, SDHC_NINTR_STATUS_EN, ready);
-		}  
+		}
 		mutex_exit(&hp->intr_mtx);
 	}
 
@@ -1285,12 +1285,17 @@ sdhc_transfer_data(struct sdhc_host *hp,
 	}
 #endif
 
-	if (hp->sc->sc_vendor_transfer_data_dma != NULL &&
-	    cmd->c_dmamap != NULL)
-		error = hp->sc->sc_vendor_transfer_data_dma(hp, cmd);
-	else if (cmd->c_dmamap != NULL)
-		error = sdhc_transfer_data_dma(hp, cmd);
-	else
+	if (cmd->c_dmamap != NULL) {
+		if (hp->sc->sc_vendor_transfer_data_dma != NULL) {
+			error = hp->sc->sc_vendor_transfer_data_dma(hp, cmd);
+			if (error == 0 && !sdhc_wait_intr(hp,
+			    SDHC_TRANSFER_COMPLETE, SDHC_TRANSFER_TIMEOUT)) {
+				error = ETIMEDOUT;
+			}
+		} else {
+			error = sdhc_transfer_data_dma(hp, cmd);
+		}
+	} else
 		error = sdhc_transfer_data_pio(hp, cmd);
 	if (error)
 		cmd->c_error = error;
@@ -1644,7 +1649,7 @@ sdhc_wait_intr(struct sdhc_host *hp, int
 
 	DPRINTF(2,("%s: intr status %#x error %#x\n", HDEVNAME(hp), status,
 	    hp->intr_error_status));
-	
+
 	/* Command timeout has higher priority than command complete. */
 	if (ISSET(status, SDHC_ERROR_INTERRUPT) || hp->intr_error_status) {
 		hp->intr_error_status = 0;
@@ -1702,7 +1707,7 @@ sdhc_intr(void *arg)
 				HWRITE2(hp, SDHC_EINTR_STATUS, error);
 			}
 		}
-	
+
 		DPRINTF(2,("%s: interrupt status=%x error=%x\n", HDEVNAME(hp),
 		    status, error));
 

Reply via email to