diff options
author | Wolfgang Muees <wolfgang.mues@auerswald.de> | 2009-05-26 03:56:19 -0400 |
---|---|---|
committer | Pierre Ossman <pierre@ossman.eu> | 2009-06-13 16:42:59 -0400 |
commit | fdd858db7113ca64132de390188d7ca00701013d (patch) | |
tree | cf24d0a46c06fa489730553d97279a93b0a1b9e1 /drivers/mmc | |
parent | c54f6bc67a4398243682f7438a2129906e127d21 (diff) |
mmc_spi: don't use EINVAL for possible transmission errors
This patch changes the reported error code for the responses
to a command from EINVAL to EFAULT/ENOSYS, 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
in SPI mode are NOT protected by a checksum, so don't trust them.
Signed-off-by: Wolfgang Muees <wolfgang.mues@auerswald.de>
Acked-by: Matt Fleming <matt@console-pimps.org>
Signed-off-by: Pierre Ossman <pierre@ossman.eu>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/mmc_spi.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index a789db8eed28..240608cc7ae9 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c | |||
@@ -335,15 +335,16 @@ checkstatus: | |||
335 | 335 | ||
336 | /* Status byte: the entire seven-bit R1 response. */ | 336 | /* Status byte: the entire seven-bit R1 response. */ |
337 | if (cmd->resp[0] != 0) { | 337 | if (cmd->resp[0] != 0) { |
338 | if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS | 338 | if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS) |
339 | | R1_SPI_ILLEGAL_COMMAND) | ||
340 | & cmd->resp[0]) | 339 | & cmd->resp[0]) |
341 | value = -EINVAL; | 340 | value = -EFAULT; /* Bad address */ |
341 | else if (R1_SPI_ILLEGAL_COMMAND & cmd->resp[0]) | ||
342 | value = -ENOSYS; /* Function not implemented */ | ||
342 | else if (R1_SPI_COM_CRC & cmd->resp[0]) | 343 | else if (R1_SPI_COM_CRC & cmd->resp[0]) |
343 | value = -EILSEQ; | 344 | value = -EILSEQ; /* Illegal byte sequence */ |
344 | else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET) | 345 | else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET) |
345 | & cmd->resp[0]) | 346 | & cmd->resp[0]) |
346 | value = -EIO; | 347 | value = -EIO; /* I/O error */ |
347 | /* else R1_SPI_IDLE, "it's resetting" */ | 348 | /* else R1_SPI_IDLE, "it's resetting" */ |
348 | } | 349 | } |
349 | 350 | ||