[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <200905141324.27908.wolfgang.mues@auerswald.de>
Date: Thu, 14 May 2009 12:24:27 +0100
From: Wolfgang Mües <wolfgang.mues@...rswald.de>
To: Pierre Ossman <drzeus@...eus.cx>
Cc: "Andrew Morton" <akpm@...ux-foundation.org>,
"Matt Fleming" <matt@...sole-pimps.org>,
"David Brownell" <dbrownell@...rs.sourceforge.net>,
"Mike Frysinger" <vapier.adi@...il.com>,
linux-kernel@...r.kernel.org
Subject: [PATCH] mmc_spi: use EILSEQ for possible transmission errors
From: Wolfgang Muees <wolfgang.mues@...rswald.de>
o This patch changes the reported error code for the responses
to a command from EINVAL/EIO to EILSEQ, as EINVAL is reserved
for non-recoverable host errors, and the responses from
the SD/MMC card may be because of recoverable transmission
errors in the command or in the response. Response codes
are NOT protected by a checksum, so don't trust them.
Signed-off-by: Wolfgang Muees <wolfgang.mues@...rswald.de>
---
diff -uprN 2_6_29_rc7_patch_wearout_speedup/drivers/mmc/host/mmc_spi.c 2_6_29_rc7_patch_EILSEQ/drivers/mmc/host/mmc_spi.c
--- 2_6_29_rc7_patch_wearout_speedup/drivers/mmc/host/mmc_spi.c 2009-04-08 11:11:20.000000000 +0200
+++ 2_6_29_rc7_patch_EILSEQ/drivers/mmc/host/mmc_spi.c 2009-05-14 12:49:42.000000000 +0200
@@ -334,17 +334,18 @@ checkstatus:
cmd->error = 0;
/* Status byte: the entire seven-bit R1 response. */
- if (cmd->resp[0] != 0) {
- if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS
- | R1_SPI_ILLEGAL_COMMAND)
- & cmd->resp[0])
- value = -EINVAL;
- else if (R1_SPI_COM_CRC & cmd->resp[0])
- value = -EILSEQ;
- else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET)
- & cmd->resp[0])
- value = -EIO;
- /* else R1_SPI_IDLE, "it's resetting" */
+ /*
+ * Note that we have a problem here: as the response is NOT protected
+ * by a CRC or checksum, a transmission error in the response will
+ * be interpreted as an error code. So we map all error codes to
+ * EILSEQ here, to allow for the upper layer to retry the command.
+ * If one of these error codes is a non-recoverable error, retries
+ * will do no harm.
+ */
+
+ /* Allow only 0 and R1_SPI_IDLE here */
+ if (cmd->resp[0] & ~R1_SPI_IDLE) {
+ value = -EILSEQ;
}
switch (mmc_spi_resp_type(cmd)) {
---
regards
i. A. Wolfgang Mües
--
Auerswald GmbH & Co. KG
Hardware Development
Telefon: +49 (0)5306 9219 0
Telefax: +49 (0)5306 9219 94
E-Mail: Wolfgang.Mues@...rswald.de
Web: http://www.auerswald.de
--------------------------------------------------------------
Auerswald GmbH & Co. KG, Vor den Grashöfen 1, 38162 Cremlingen
Registriert beim AG Braunschweig HRA 13289
p.h.G Auerswald Geschäftsführungsges. mbH
Registriert beim AG Braunschweig HRB 7463
Geschäftsführer: Dipl-Ing. Gerhard Auerswald
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists