summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoruwe <uwe@openbsd.org>2007-03-18 22:07:16 +0000
committeruwe <uwe@openbsd.org>2007-03-18 22:07:16 +0000
commit1b5fa04a2d459e68de79684cfb85d78b29d28fba (patch)
tree9ebccb575086c41d8941298f850be6a24412ad8a
parentEnable pxammc and sdmmc in RAMDISK, too. (diff)
downloadwireguard-openbsd-1b5fa04a2d459e68de79684cfb85d78b29d28fba.tar.xz
wireguard-openbsd-1b5fa04a2d459e68de79684cfb85d78b29d28fba.zip
DHC automatically sends a CMD12 after multiple-block transfers, but other
controllers don't. Put in a temporary hack for pxammc on Zaurus.
-rw-r--r--sys/dev/sdmmc/sdmmc_mem.c27
-rw-r--r--sys/dev/sdmmc/sdmmcvar.h3
2 files changed, 28 insertions, 2 deletions
diff --git a/sys/dev/sdmmc/sdmmc_mem.c b/sys/dev/sdmmc/sdmmc_mem.c
index 3ec17a1a5c3..a6354363de6 100644
--- a/sys/dev/sdmmc/sdmmc_mem.c
+++ b/sys/dev/sdmmc/sdmmc_mem.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmc_mem.c,v 1.6 2006/11/29 14:16:43 uwe Exp $ */
+/* $OpenBSD: sdmmc_mem.c,v 1.7 2007/03/18 22:07:16 uwe Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -410,6 +410,19 @@ sdmmc_mem_read_block(struct sdmmc_function *sf, int blkno, u_char *data,
if (error != 0)
goto err;
+ /* XXX sdhc(4) does not need this */
+#ifdef __zaurus__
+ if (cmd.c_opcode == MMC_READ_BLOCK_MULTIPLE) {
+ bzero(&cmd, sizeof cmd);
+ cmd.c_opcode = MMC_STOP_TRANSMISSION;
+ cmd.c_arg = MMC_ARG_RCA(sf->rca);
+ cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B;
+ error = sdmmc_mmc_command(sc, &cmd);
+ if (error != 0)
+ goto err;
+ }
+#endif
+
do {
bzero(&cmd, sizeof cmd);
cmd.c_opcode = MMC_SEND_STATUS;
@@ -452,6 +465,18 @@ sdmmc_mem_write_block(struct sdmmc_function *sf, int blkno, u_char *data,
if (error != 0)
goto err;
+ /* XXX sdhc(4) does not need this */
+#ifdef __zaurus__
+ if (cmd.c_opcode == MMC_WRITE_BLOCK_MULTIPLE) {
+ bzero(&cmd, sizeof cmd);
+ cmd.c_opcode = MMC_STOP_TRANSMISSION;
+ cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1B;
+ error = sdmmc_mmc_command(sc, &cmd);
+ if (error != 0)
+ goto err;
+ }
+#endif
+
do {
bzero(&cmd, sizeof cmd);
cmd.c_opcode = MMC_SEND_STATUS;
diff --git a/sys/dev/sdmmc/sdmmcvar.h b/sys/dev/sdmmc/sdmmcvar.h
index 13041d85368..2acf37c483d 100644
--- a/sys/dev/sdmmc/sdmmcvar.h
+++ b/sys/dev/sdmmc/sdmmcvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdmmcvar.h,v 1.6 2007/03/18 20:53:10 uwe Exp $ */
+/* $OpenBSD: sdmmcvar.h,v 1.7 2007/03/18 22:07:16 uwe Exp $ */
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -90,6 +90,7 @@ struct sdmmc_command {
/* response types */
#define SCF_RSP_R0 0 /* none */
#define SCF_RSP_R1 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
+#define SCF_RSP_R1B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY)
#define SCF_RSP_R2 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_136)
#define SCF_RSP_R3 (SCF_RSP_PRESENT)
#define SCF_RSP_R4 (SCF_RSP_PRESENT)