diff options
Diffstat (limited to 'drivers/mmc/host/mmc_spi.c')
-rw-r--r-- | drivers/mmc/host/mmc_spi.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index f48349d18c92..240608cc7ae9 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c | |||
@@ -97,6 +97,14 @@ | |||
97 | */ | 97 | */ |
98 | #define r1b_timeout (HZ * 3) | 98 | #define r1b_timeout (HZ * 3) |
99 | 99 | ||
100 | /* One of the critical speed parameters is the amount of data which may | ||
101 | * be transfered in one command. If this value is too low, the SD card | ||
102 | * controller has to do multiple partial block writes (argggh!). With | ||
103 | * today (2008) SD cards there is little speed gain if we transfer more | ||
104 | * than 64 KBytes at a time. So use this value until there is any indication | ||
105 | * that we should do more here. | ||
106 | */ | ||
107 | #define MMC_SPI_BLOCKSATONCE 128 | ||
100 | 108 | ||
101 | /****************************************************************************/ | 109 | /****************************************************************************/ |
102 | 110 | ||
@@ -327,15 +335,16 @@ checkstatus: | |||
327 | 335 | ||
328 | /* Status byte: the entire seven-bit R1 response. */ | 336 | /* Status byte: the entire seven-bit R1 response. */ |
329 | if (cmd->resp[0] != 0) { | 337 | if (cmd->resp[0] != 0) { |
330 | if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS | 338 | if ((R1_SPI_PARAMETER | R1_SPI_ADDRESS) |
331 | | R1_SPI_ILLEGAL_COMMAND) | ||
332 | & cmd->resp[0]) | 339 | & cmd->resp[0]) |
333 | value = -EINVAL; | 340 | value = -EFAULT; /* Bad address */ |
341 | else if (R1_SPI_ILLEGAL_COMMAND & cmd->resp[0]) | ||
342 | value = -ENOSYS; /* Function not implemented */ | ||
334 | else if (R1_SPI_COM_CRC & cmd->resp[0]) | 343 | else if (R1_SPI_COM_CRC & cmd->resp[0]) |
335 | value = -EILSEQ; | 344 | value = -EILSEQ; /* Illegal byte sequence */ |
336 | else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET) | 345 | else if ((R1_SPI_ERASE_SEQ | R1_SPI_ERASE_RESET) |
337 | & cmd->resp[0]) | 346 | & cmd->resp[0]) |
338 | value = -EIO; | 347 | value = -EIO; /* I/O error */ |
339 | /* else R1_SPI_IDLE, "it's resetting" */ | 348 | /* else R1_SPI_IDLE, "it's resetting" */ |
340 | } | 349 | } |
341 | 350 | ||
@@ -1366,6 +1375,10 @@ static int mmc_spi_probe(struct spi_device *spi) | |||
1366 | 1375 | ||
1367 | mmc->ops = &mmc_spi_ops; | 1376 | mmc->ops = &mmc_spi_ops; |
1368 | mmc->max_blk_size = MMC_SPI_BLOCKSIZE; | 1377 | mmc->max_blk_size = MMC_SPI_BLOCKSIZE; |
1378 | mmc->max_hw_segs = MMC_SPI_BLOCKSATONCE; | ||
1379 | mmc->max_phys_segs = MMC_SPI_BLOCKSATONCE; | ||
1380 | mmc->max_req_size = MMC_SPI_BLOCKSATONCE * MMC_SPI_BLOCKSIZE; | ||
1381 | mmc->max_blk_count = MMC_SPI_BLOCKSATONCE; | ||
1369 | 1382 | ||
1370 | mmc->caps = MMC_CAP_SPI; | 1383 | mmc->caps = MMC_CAP_SPI; |
1371 | 1384 | ||