diff options
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
-rw-r--r-- | drivers/mmc/host/sdhci.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index b413aa6c246b..9b06c6042d97 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -567,7 +567,6 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host, | |||
567 | static void sdhci_finish_data(struct sdhci_host *host) | 567 | static void sdhci_finish_data(struct sdhci_host *host) |
568 | { | 568 | { |
569 | struct mmc_data *data; | 569 | struct mmc_data *data; |
570 | u16 blocks; | ||
571 | 570 | ||
572 | BUG_ON(!host->data); | 571 | BUG_ON(!host->data); |
573 | 572 | ||
@@ -580,20 +579,16 @@ static void sdhci_finish_data(struct sdhci_host *host) | |||
580 | } | 579 | } |
581 | 580 | ||
582 | /* | 581 | /* |
583 | * Controller doesn't count down when in single block mode. | 582 | * The specification states that the block count register must |
583 | * be updated, but it does not specify at what point in the | ||
584 | * data flow. That makes the register entirely useless to read | ||
585 | * back so we have to assume that nothing made it to the card | ||
586 | * in the event of an error. | ||
584 | */ | 587 | */ |
585 | if (data->blocks == 1) | 588 | if (data->error) |
586 | blocks = (data->error == 0) ? 0 : 1; | 589 | data->bytes_xfered = 0; |
587 | else | 590 | else |
588 | blocks = readw(host->ioaddr + SDHCI_BLOCK_COUNT); | 591 | data->bytes_xfered = data->blksz * data->blocks; |
589 | data->bytes_xfered = data->blksz * (data->blocks - blocks); | ||
590 | |||
591 | if (!data->error && blocks) { | ||
592 | printk(KERN_ERR "%s: Controller signalled completion even " | ||
593 | "though there were blocks left.\n", | ||
594 | mmc_hostname(host->mmc)); | ||
595 | data->error = -EIO; | ||
596 | } | ||
597 | 592 | ||
598 | if (data->stop) { | 593 | if (data->stop) { |
599 | /* | 594 | /* |
@@ -1466,7 +1461,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot) | |||
1466 | mmc->ops = &sdhci_ops; | 1461 | mmc->ops = &sdhci_ops; |
1467 | mmc->f_min = host->max_clk / 256; | 1462 | mmc->f_min = host->max_clk / 256; |
1468 | mmc->f_max = host->max_clk; | 1463 | mmc->f_max = host->max_clk; |
1469 | mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE | MMC_CAP_SDIO_IRQ; | 1464 | mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ; |
1470 | 1465 | ||
1471 | if (caps & SDHCI_CAN_DO_HISPD) | 1466 | if (caps & SDHCI_CAN_DO_HISPD) |
1472 | mmc->caps |= MMC_CAP_SD_HIGHSPEED; | 1467 | mmc->caps |= MMC_CAP_SD_HIGHSPEED; |