mmc_spi: don't use EINVAL for possible transmission errors
Wolfgang Muees [Tue, 26 May 2009 07:56:19 +0000 (08:56 +0100)]
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>

drivers/mmc/host/mmc_spi.c

index a789db8..240608c 100644 (file)
@@ -335,15 +335,16 @@ checkstatus:
 
        /* Status byte: the entire seven-bit R1 response.  */
        if (cmd->resp[0] != 0) {
-               if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS
-                                     | R1_SPI_ILLEGAL_COMMAND)
+               if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS)
                                & cmd->resp[0])
-                       value = -EINVAL;
+                       value = -EFAULT; /* Bad address */
+               else if (R1_SPI_ILLEGAL_COMMAND & cmd->resp[0])
+                       value = -ENOSYS; /* Function not implemented */
                else if (R1_SPI_COM_CRC & cmd->resp[0])
-                       value = -EILSEQ;
+                       value = -EILSEQ; /* Illegal byte sequence */
                else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET)
                                & cmd->resp[0])
-                       value = -EIO;
+                       value = -EIO;    /* I/O error */
                /* else R1_SPI_IDLE, "it's resetting" */
        }