aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/host/mmc_spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/host/mmc_spi.c')
-rw-r--r--drivers/mmc/host/mmc_spi.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 62a35822003e..7c1e16aaf17f 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -99,7 +99,7 @@
99#define r1b_timeout (HZ * 3) 99#define r1b_timeout (HZ * 3)
100 100
101/* One of the critical speed parameters is the amount of data which may 101/* One of the critical speed parameters is the amount of data which may
102 * be transfered in one command. If this value is too low, the SD card 102 * be transferred in one command. If this value is too low, the SD card
103 * controller has to do multiple partial block writes (argggh!). With 103 * controller has to do multiple partial block writes (argggh!). With
104 * today (2008) SD cards there is little speed gain if we transfer more 104 * today (2008) SD cards there is little speed gain if we transfer more
105 * than 64 KBytes at a time. So use this value until there is any indication 105 * than 64 KBytes at a time. So use this value until there is any indication
@@ -1055,6 +1055,8 @@ static void mmc_spi_request(struct mmc_host *mmc, struct mmc_request *mrq)
1055{ 1055{
1056 struct mmc_spi_host *host = mmc_priv(mmc); 1056 struct mmc_spi_host *host = mmc_priv(mmc);
1057 int status = -EINVAL; 1057 int status = -EINVAL;
1058 int crc_retry = 5;
1059 struct mmc_command stop;
1058 1060
1059#ifdef DEBUG 1061#ifdef DEBUG
1060 /* MMC core and layered drivers *MUST* issue SPI-aware commands */ 1062 /* MMC core and layered drivers *MUST* issue SPI-aware commands */
@@ -1087,10 +1089,29 @@ static void mmc_spi_request(struct mmc_host *mmc, struct mmc_request *mrq)
1087 /* request exclusive bus access */ 1089 /* request exclusive bus access */
1088 spi_bus_lock(host->spi->master); 1090 spi_bus_lock(host->spi->master);
1089 1091
1092crc_recover:
1090 /* issue command; then optionally data and stop */ 1093 /* issue command; then optionally data and stop */
1091 status = mmc_spi_command_send(host, mrq, mrq->cmd, mrq->data != NULL); 1094 status = mmc_spi_command_send(host, mrq, mrq->cmd, mrq->data != NULL);
1092 if (status == 0 && mrq->data) { 1095 if (status == 0 && mrq->data) {
1093 mmc_spi_data_do(host, mrq->cmd, mrq->data, mrq->data->blksz); 1096 mmc_spi_data_do(host, mrq->cmd, mrq->data, mrq->data->blksz);
1097
1098 /*
1099 * The SPI bus is not always reliable for large data transfers.
1100 * If an occasional crc error is reported by the SD device with
1101 * data read/write over SPI, it may be recovered by repeating
1102 * the last SD command again. The retry count is set to 5 to
1103 * ensure the driver passes stress tests.
1104 */
1105 if (mrq->data->error == -EILSEQ && crc_retry) {
1106 stop.opcode = MMC_STOP_TRANSMISSION;
1107 stop.arg = 0;
1108 stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
1109 status = mmc_spi_command_send(host, mrq, &stop, 0);
1110 crc_retry--;
1111 mrq->data->error = 0;
1112 goto crc_recover;
1113 }
1114
1094 if (mrq->stop) 1115 if (mrq->stop)
1095 status = mmc_spi_command_send(host, mrq, mrq->stop, 0); 1116 status = mmc_spi_command_send(host, mrq, mrq->stop, 0);
1096 else 1117 else
@@ -1345,8 +1366,7 @@ static int mmc_spi_probe(struct spi_device *spi)
1345 1366
1346 mmc->ops = &mmc_spi_ops; 1367 mmc->ops = &mmc_spi_ops;
1347 mmc->max_blk_size = MMC_SPI_BLOCKSIZE; 1368 mmc->max_blk_size = MMC_SPI_BLOCKSIZE;
1348 mmc->max_hw_segs = MMC_SPI_BLOCKSATONCE; 1369 mmc->max_segs = MMC_SPI_BLOCKSATONCE;
1349 mmc->max_phys_segs = MMC_SPI_BLOCKSATONCE;
1350 mmc->max_req_size = MMC_SPI_BLOCKSATONCE * MMC_SPI_BLOCKSIZE; 1370 mmc->max_req_size = MMC_SPI_BLOCKSATONCE * MMC_SPI_BLOCKSIZE;
1351 mmc->max_blk_count = MMC_SPI_BLOCKSATONCE; 1371 mmc->max_blk_count = MMC_SPI_BLOCKSATONCE;
1352 1372
@@ -1496,21 +1516,17 @@ static int __devexit mmc_spi_remove(struct spi_device *spi)
1496 return 0; 1516 return 0;
1497} 1517}
1498 1518
1499#if defined(CONFIG_OF)
1500static struct of_device_id mmc_spi_of_match_table[] __devinitdata = { 1519static struct of_device_id mmc_spi_of_match_table[] __devinitdata = {
1501 { .compatible = "mmc-spi-slot", }, 1520 { .compatible = "mmc-spi-slot", },
1502 {}, 1521 {},
1503}; 1522};
1504#endif
1505 1523
1506static struct spi_driver mmc_spi_driver = { 1524static struct spi_driver mmc_spi_driver = {
1507 .driver = { 1525 .driver = {
1508 .name = "mmc_spi", 1526 .name = "mmc_spi",
1509 .bus = &spi_bus_type, 1527 .bus = &spi_bus_type,
1510 .owner = THIS_MODULE, 1528 .owner = THIS_MODULE,
1511#if defined(CONFIG_OF)
1512 .of_match_table = mmc_spi_of_match_table, 1529 .of_match_table = mmc_spi_of_match_table,
1513#endif
1514 }, 1530 },
1515 .probe = mmc_spi_probe, 1531 .probe = mmc_spi_probe,
1516 .remove = __devexit_p(mmc_spi_remove), 1532 .remove = __devexit_p(mmc_spi_remove),