Commit 23af6039 authored by Pierre Ossman's avatar Pierre Ossman

mmc: remove multiwrite capability

Relax requirements on host controllers and only require that they do not
report a transfer count than is larger than the actual one (i.e. a lower
value is okay). This is how many other parts of the kernel behaves so
upper layers should already be prepared to handle that scenario. This
gives us a performance boost on MMC cards.
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 97067d55
...@@ -237,17 +237,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ...@@ -237,17 +237,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
if (brq.data.blocks > card->host->max_blk_count) if (brq.data.blocks > card->host->max_blk_count)
brq.data.blocks = card->host->max_blk_count; brq.data.blocks = card->host->max_blk_count;
/*
* If the host doesn't support multiple block writes, force
* block writes to single block. SD cards are excepted from
* this rule as they support querying the number of
* successfully written sectors.
*/
if (rq_data_dir(req) != READ &&
!(card->host->caps & MMC_CAP_MULTIWRITE) &&
!mmc_card_sd(card))
brq.data.blocks = 1;
if (brq.data.blocks > 1) { if (brq.data.blocks > 1) {
/* SPI multiblock writes terminate using a special /* SPI multiblock writes terminate using a special
* token, not a STOP_TRANSMISSION request. * token, not a STOP_TRANSMISSION request.
...@@ -367,12 +356,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ...@@ -367,12 +356,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
* mark the known good sectors as ok. * mark the known good sectors as ok.
* *
* If the card is not SD, we can still ok written sectors * If the card is not SD, we can still ok written sectors
* if the controller can do proper error reporting. * as reported by the controller (which might be less than
* the real number of written sectors, but never more).
* *
* For reads we just fail the entire chunk as that should * For reads we just fail the entire chunk as that should
* be safe in all cases. * be safe in all cases.
*/ */
if (rq_data_dir(req) != READ && mmc_card_sd(card)) { if (rq_data_dir(req) != READ) {
if (mmc_card_sd(card)) {
u32 blocks; u32 blocks;
unsigned int bytes; unsigned int bytes;
...@@ -386,12 +377,12 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ...@@ -386,12 +377,12 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
ret = __blk_end_request(req, 0, bytes); ret = __blk_end_request(req, 0, bytes);
spin_unlock_irq(&md->lock); spin_unlock_irq(&md->lock);
} }
} else if (rq_data_dir(req) != READ && } else {
(card->host->caps & MMC_CAP_MULTIWRITE)) {
spin_lock_irq(&md->lock); spin_lock_irq(&md->lock);
ret = __blk_end_request(req, 0, brq.data.bytes_xfered); ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
spin_unlock_irq(&md->lock); spin_unlock_irq(&md->lock);
} }
}
mmc_release_host(card->host); mmc_release_host(card->host);
......
...@@ -995,7 +995,7 @@ static int __init at91_mci_probe(struct platform_device *pdev) ...@@ -995,7 +995,7 @@ static int __init at91_mci_probe(struct platform_device *pdev)
mmc->f_min = 375000; mmc->f_min = 375000;
mmc->f_max = 25000000; mmc->f_max = 25000000;
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
mmc->caps = MMC_CAP_MULTIWRITE | MMC_CAP_SDIO_IRQ; mmc->caps = MMC_CAP_SDIO_IRQ;
mmc->max_blk_size = 4095; mmc->max_blk_size = 4095;
mmc->max_blk_count = mmc->max_req_size; mmc->max_blk_count = mmc->max_req_size;
......
...@@ -849,7 +849,7 @@ static int __init atmci_probe(struct platform_device *pdev) ...@@ -849,7 +849,7 @@ static int __init atmci_probe(struct platform_device *pdev)
mmc->f_min = (host->bus_hz + 511) / 512; mmc->f_min = (host->bus_hz + 511) / 512;
mmc->f_max = host->bus_hz / 2; mmc->f_max = host->bus_hz / 2;
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE; mmc->caps |= MMC_CAP_4_BIT_DATA;
mmc->max_hw_segs = 64; mmc->max_hw_segs = 64;
mmc->max_phys_segs = 64; mmc->max_phys_segs = 64;
......
...@@ -1252,10 +1252,7 @@ static int mmc_spi_probe(struct spi_device *spi) ...@@ -1252,10 +1252,7 @@ static int mmc_spi_probe(struct spi_device *spi)
mmc->ops = &mmc_spi_ops; mmc->ops = &mmc_spi_ops;
mmc->max_blk_size = MMC_SPI_BLOCKSIZE; mmc->max_blk_size = MMC_SPI_BLOCKSIZE;
/* As long as we keep track of the number of successfully mmc->caps = MMC_CAP_SPI;
* transmitted blocks, we're good for multiwrite.
*/
mmc->caps = MMC_CAP_SPI | MMC_CAP_MULTIWRITE;
/* SPI doesn't need the lowspeed device identification thing for /* SPI doesn't need the lowspeed device identification thing for
* MMC or SD cards, since it never comes up in open drain mode. * MMC or SD cards, since it never comes up in open drain mode.
......
...@@ -535,7 +535,6 @@ static int mmci_probe(struct amba_device *dev, void *id) ...@@ -535,7 +535,6 @@ static int mmci_probe(struct amba_device *dev, void *id)
mmc->f_min = (host->mclk + 511) / 512; mmc->f_min = (host->mclk + 511) / 512;
mmc->f_max = min(host->mclk, fmax); mmc->f_max = min(host->mclk, fmax);
mmc->ocr_avail = plat->ocr_mask; mmc->ocr_avail = plat->ocr_mask;
mmc->caps = MMC_CAP_MULTIWRITE;
/* /*
* We can do SGIO * We can do SGIO
......
...@@ -1317,7 +1317,7 @@ static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id) ...@@ -1317,7 +1317,7 @@ static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id)
host->slots[id] = slot; host->slots[id] = slot;
mmc->caps = MMC_CAP_MULTIWRITE; mmc->caps = 0;
if (host->pdata->conf.wire4) if (host->pdata->conf.wire4)
mmc->caps |= MMC_CAP_4_BIT_DATA; mmc->caps |= MMC_CAP_4_BIT_DATA;
......
...@@ -973,7 +973,7 @@ static int tifm_sd_probe(struct tifm_dev *sock) ...@@ -973,7 +973,7 @@ static int tifm_sd_probe(struct tifm_dev *sock)
mmc->ops = &tifm_sd_ops; mmc->ops = &tifm_sd_ops;
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE; mmc->caps = MMC_CAP_4_BIT_DATA;
mmc->f_min = 20000000 / 60; mmc->f_min = 20000000 / 60;
mmc->f_max = 24000000; mmc->f_max = 24000000;
......
...@@ -1219,7 +1219,7 @@ static int __devinit wbsd_alloc_mmc(struct device *dev) ...@@ -1219,7 +1219,7 @@ static int __devinit wbsd_alloc_mmc(struct device *dev)
mmc->f_min = 375000; mmc->f_min = 375000;
mmc->f_max = 24000000; mmc->f_max = 24000000;
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_MULTIWRITE; mmc->caps = MMC_CAP_4_BIT_DATA;
spin_lock_init(&host->lock); spin_lock_init(&host->lock);
......
...@@ -111,12 +111,11 @@ struct mmc_host { ...@@ -111,12 +111,11 @@ struct mmc_host {
unsigned long caps; /* Host capabilities */ unsigned long caps; /* Host capabilities */
#define MMC_CAP_4_BIT_DATA (1 << 0) /* Can the host do 4 bit transfers */ #define MMC_CAP_4_BIT_DATA (1 << 0) /* Can the host do 4 bit transfers */
#define MMC_CAP_MULTIWRITE (1 << 1) /* Can accurately report bytes sent to card on error */ #define MMC_CAP_MMC_HIGHSPEED (1 << 1) /* Can do MMC high-speed timing */
#define MMC_CAP_MMC_HIGHSPEED (1 << 2) /* Can do MMC high-speed timing */ #define MMC_CAP_SD_HIGHSPEED (1 << 2) /* Can do SD high-speed timing */
#define MMC_CAP_SD_HIGHSPEED (1 << 3) /* Can do SD high-speed timing */ #define MMC_CAP_SDIO_IRQ (1 << 3) /* Can signal pending SDIO IRQs */
#define MMC_CAP_SDIO_IRQ (1 << 4) /* Can signal pending SDIO IRQs */ #define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */
#define MMC_CAP_SPI (1 << 5) /* Talks only SPI protocols */ #define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */
#define MMC_CAP_NEEDS_POLL (1 << 6) /* Needs polling for card-detection */
/* host specific block data */ /* host specific block data */
unsigned int max_seg_size; /* see blk_queue_max_segment_size */ unsigned int max_seg_size; /* see blk_queue_max_segment_size */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment