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: Pierre Ossman <drzeus@drzeus.cx>
This commit is contained in:
parent
97067d5581
commit
23af60398a
@ -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)
|
||||
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) {
|
||||
/* SPI multiblock writes terminate using a special
|
||||
* token, not a STOP_TRANSMISSION request.
|
||||
@ -367,30 +356,32 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||
* mark the known good sectors as ok.
|
||||
*
|
||||
* 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
|
||||
* be safe in all cases.
|
||||
*/
|
||||
if (rq_data_dir(req) != READ && mmc_card_sd(card)) {
|
||||
u32 blocks;
|
||||
unsigned int bytes;
|
||||
if (rq_data_dir(req) != READ) {
|
||||
if (mmc_card_sd(card)) {
|
||||
u32 blocks;
|
||||
unsigned int bytes;
|
||||
|
||||
blocks = mmc_sd_num_wr_blocks(card);
|
||||
if (blocks != (u32)-1) {
|
||||
if (card->csd.write_partial)
|
||||
bytes = blocks << md->block_bits;
|
||||
else
|
||||
bytes = blocks << 9;
|
||||
blocks = mmc_sd_num_wr_blocks(card);
|
||||
if (blocks != (u32)-1) {
|
||||
if (card->csd.write_partial)
|
||||
bytes = blocks << md->block_bits;
|
||||
else
|
||||
bytes = blocks << 9;
|
||||
spin_lock_irq(&md->lock);
|
||||
ret = __blk_end_request(req, 0, bytes);
|
||||
spin_unlock_irq(&md->lock);
|
||||
}
|
||||
} else {
|
||||
spin_lock_irq(&md->lock);
|
||||
ret = __blk_end_request(req, 0, bytes);
|
||||
ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
|
||||
spin_unlock_irq(&md->lock);
|
||||
}
|
||||
} else if (rq_data_dir(req) != READ &&
|
||||
(card->host->caps & MMC_CAP_MULTIWRITE)) {
|
||||
spin_lock_irq(&md->lock);
|
||||
ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
|
||||
spin_unlock_irq(&md->lock);
|
||||
}
|
||||
|
||||
mmc_release_host(card->host);
|
||||
|
@ -995,7 +995,7 @@ static int __init at91_mci_probe(struct platform_device *pdev)
|
||||
mmc->f_min = 375000;
|
||||
mmc->f_max = 25000000;
|
||||
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_count = mmc->max_req_size;
|
||||
|
@ -849,7 +849,7 @@ static int __init atmci_probe(struct platform_device *pdev)
|
||||
mmc->f_min = (host->bus_hz + 511) / 512;
|
||||
mmc->f_max = host->bus_hz / 2;
|
||||
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_phys_segs = 64;
|
||||
|
@ -1252,10 +1252,7 @@ static int mmc_spi_probe(struct spi_device *spi)
|
||||
mmc->ops = &mmc_spi_ops;
|
||||
mmc->max_blk_size = MMC_SPI_BLOCKSIZE;
|
||||
|
||||
/* As long as we keep track of the number of successfully
|
||||
* transmitted blocks, we're good for multiwrite.
|
||||
*/
|
||||
mmc->caps = MMC_CAP_SPI | MMC_CAP_MULTIWRITE;
|
||||
mmc->caps = MMC_CAP_SPI;
|
||||
|
||||
/* SPI doesn't need the lowspeed device identification thing for
|
||||
* 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)
|
||||
mmc->f_min = (host->mclk + 511) / 512;
|
||||
mmc->f_max = min(host->mclk, fmax);
|
||||
mmc->ocr_avail = plat->ocr_mask;
|
||||
mmc->caps = MMC_CAP_MULTIWRITE;
|
||||
|
||||
/*
|
||||
* We can do SGIO
|
||||
|
@ -1317,7 +1317,7 @@ static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id)
|
||||
|
||||
host->slots[id] = slot;
|
||||
|
||||
mmc->caps = MMC_CAP_MULTIWRITE;
|
||||
mmc->caps = 0;
|
||||
if (host->pdata->conf.wire4)
|
||||
mmc->caps |= MMC_CAP_4_BIT_DATA;
|
||||
|
||||
|
@ -973,7 +973,7 @@ static int tifm_sd_probe(struct tifm_dev *sock)
|
||||
|
||||
mmc->ops = &tifm_sd_ops;
|
||||
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_max = 24000000;
|
||||
|
||||
|
@ -1219,7 +1219,7 @@ static int __devinit wbsd_alloc_mmc(struct device *dev)
|
||||
mmc->f_min = 375000;
|
||||
mmc->f_max = 24000000;
|
||||
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);
|
||||
|
||||
|
@ -111,12 +111,11 @@ struct mmc_host {
|
||||
unsigned long caps; /* Host capabilities */
|
||||
|
||||
#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 << 2) /* Can do MMC high-speed timing */
|
||||
#define MMC_CAP_SD_HIGHSPEED (1 << 3) /* Can do SD high-speed timing */
|
||||
#define MMC_CAP_SDIO_IRQ (1 << 4) /* Can signal pending SDIO IRQs */
|
||||
#define MMC_CAP_SPI (1 << 5) /* Talks only SPI protocols */
|
||||
#define MMC_CAP_NEEDS_POLL (1 << 6) /* Needs polling for card-detection */
|
||||
#define MMC_CAP_MMC_HIGHSPEED (1 << 1) /* Can do MMC high-speed timing */
|
||||
#define MMC_CAP_SD_HIGHSPEED (1 << 2) /* Can do SD high-speed timing */
|
||||
#define MMC_CAP_SDIO_IRQ (1 << 3) /* Can signal pending SDIO IRQs */
|
||||
#define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */
|
||||
#define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */
|
||||
|
||||
/* host specific block data */
|
||||
unsigned int max_seg_size; /* see blk_queue_max_segment_size */
|
||||
|
Loading…
Reference in New Issue
Block a user