mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
mmc: Allow host drivers to specify a max block size
Most controllers have an upper limit on the block size. Allow the host drivers to specify this and make sure we avoid hitting this limit. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
This commit is contained in:
parent
dba4accab1
commit
fe4a3c7a20
12 changed files with 44 additions and 12 deletions
|
@ -823,6 +823,8 @@ static int __init at91_mci_probe(struct platform_device *pdev)
|
|||
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
|
||||
mmc->caps = MMC_CAP_BYTEBLOCK;
|
||||
|
||||
mmc->max_blk_size = 4095;
|
||||
|
||||
host = mmc_priv(mmc);
|
||||
host->mmc = mmc;
|
||||
host->buffer = NULL;
|
||||
|
|
|
@ -922,6 +922,8 @@ static int __devinit au1xmmc_probe(struct platform_device *pdev)
|
|||
mmc->max_seg_size = AU1XMMC_DESCRIPTOR_SIZE;
|
||||
mmc->max_phys_segs = AU1XMMC_DESCRIPTOR_COUNT;
|
||||
|
||||
mmc->max_blk_size = 2048;
|
||||
|
||||
mmc->ocr_avail = AU1XMMC_OCR;
|
||||
|
||||
host = mmc_priv(mmc);
|
||||
|
|
|
@ -960,6 +960,7 @@ static int imxmci_probe(struct platform_device *pdev)
|
|||
mmc->max_phys_segs = 64;
|
||||
mmc->max_sectors = 64; /* default 1 << (PAGE_CACHE_SHIFT - 9) */
|
||||
mmc->max_seg_size = 64*512; /* default PAGE_CACHE_SIZE */
|
||||
mmc->max_blk_size = 2048;
|
||||
|
||||
host = mmc_priv(mmc);
|
||||
host->mmc = mmc;
|
||||
|
|
|
@ -108,6 +108,8 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
|
|||
mrq->cmd->error = 0;
|
||||
mrq->cmd->mrq = mrq;
|
||||
if (mrq->data) {
|
||||
BUG_ON(mrq->data->blksz > host->max_blk_size);
|
||||
|
||||
mrq->cmd->data = mrq->data;
|
||||
mrq->data->error = 0;
|
||||
mrq->data->mrq = mrq;
|
||||
|
@ -1605,6 +1607,8 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
|
|||
host->max_phys_segs = 1;
|
||||
host->max_sectors = 1 << (PAGE_CACHE_SHIFT - 9);
|
||||
host->max_seg_size = PAGE_CACHE_SIZE;
|
||||
|
||||
host->max_blk_size = 512;
|
||||
}
|
||||
|
||||
return host;
|
||||
|
|
|
@ -534,6 +534,11 @@ static int mmci_probe(struct amba_device *dev, void *id)
|
|||
*/
|
||||
mmc->max_seg_size = mmc->max_sectors << 9;
|
||||
|
||||
/*
|
||||
* Block size can be up to 2048 bytes, but must be a power of two.
|
||||
*/
|
||||
mmc->max_blk_size = 2048;
|
||||
|
||||
spin_lock_init(&host->lock);
|
||||
|
||||
writel(0, host->base + MMCIMASK0);
|
||||
|
|
|
@ -1099,6 +1099,7 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
|
|||
*/
|
||||
mmc->max_phys_segs = 32;
|
||||
mmc->max_hw_segs = 32;
|
||||
mmc->max_blk_size = 2048; /* BLEN is 11 bits (+1) */
|
||||
mmc->max_sectors = 256; /* NBLK max 11-bits, OMAP also limited by DMA */
|
||||
mmc->max_seg_size = mmc->max_sectors * 512;
|
||||
|
||||
|
|
|
@ -450,6 +450,11 @@ static int pxamci_probe(struct platform_device *pdev)
|
|||
*/
|
||||
mmc->max_seg_size = PAGE_SIZE;
|
||||
|
||||
/*
|
||||
* Block length register is 10 bits.
|
||||
*/
|
||||
mmc->max_blk_size = 1023;
|
||||
|
||||
host = mmc_priv(mmc);
|
||||
host->mmc = mmc;
|
||||
host->dma = -1;
|
||||
|
|
|
@ -381,7 +381,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
|
|||
|
||||
/* Sanity checks */
|
||||
BUG_ON(data->blksz * data->blocks > 524288);
|
||||
BUG_ON(data->blksz > host->max_block);
|
||||
BUG_ON(data->blksz > host->mmc->max_blk_size);
|
||||
BUG_ON(data->blocks > 65535);
|
||||
|
||||
/* timeout in us */
|
||||
|
@ -1290,15 +1290,6 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
|
|||
if (caps & SDHCI_TIMEOUT_CLK_UNIT)
|
||||
host->timeout_clk *= 1000;
|
||||
|
||||
host->max_block = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT;
|
||||
if (host->max_block >= 3) {
|
||||
printk(KERN_ERR "%s: Invalid maximum block size.\n",
|
||||
host->slot_descr);
|
||||
ret = -ENODEV;
|
||||
goto unmap;
|
||||
}
|
||||
host->max_block = 512 << host->max_block;
|
||||
|
||||
/*
|
||||
* Set host parameters.
|
||||
*/
|
||||
|
@ -1352,6 +1343,19 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
|
|||
*/
|
||||
mmc->max_seg_size = mmc->max_sectors * 512;
|
||||
|
||||
/*
|
||||
* Maximum block size. This varies from controller to controller and
|
||||
* is specified in the capabilities register.
|
||||
*/
|
||||
mmc->max_blk_size = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT;
|
||||
if (mmc->max_blk_size >= 3) {
|
||||
printk(KERN_ERR "%s: Invalid maximum block size.\n",
|
||||
host->slot_descr);
|
||||
ret = -ENODEV;
|
||||
goto unmap;
|
||||
}
|
||||
mmc->max_blk_size = 512 << mmc->max_blk_size;
|
||||
|
||||
/*
|
||||
* Init tasklets.
|
||||
*/
|
||||
|
|
|
@ -174,7 +174,6 @@ struct sdhci_host {
|
|||
|
||||
unsigned int max_clk; /* Max possible freq (MHz) */
|
||||
unsigned int timeout_clk; /* Timeout freq (KHz) */
|
||||
unsigned int max_block; /* Max block size (bytes) */
|
||||
|
||||
unsigned int clock; /* Current clock (MHz) */
|
||||
unsigned short power; /* Current voltage */
|
||||
|
|
|
@ -886,7 +886,9 @@ static int tifm_sd_probe(struct tifm_dev *sock)
|
|||
mmc->max_hw_segs = 1;
|
||||
mmc->max_phys_segs = 1;
|
||||
mmc->max_sectors = 127;
|
||||
mmc->max_seg_size = mmc->max_sectors << 11; //2k maximum hw block length
|
||||
//2k maximum hw block length
|
||||
mmc->max_seg_size = mmc->max_sectors << 11;
|
||||
mmc->max_blk_size = 2048;
|
||||
sock->signal_irq = tifm_sd_signal_irq;
|
||||
rc = tifm_sd_initialize_host(host);
|
||||
|
||||
|
|
|
@ -1354,6 +1354,12 @@ static int __devinit wbsd_alloc_mmc(struct device *dev)
|
|||
*/
|
||||
mmc->max_seg_size = mmc->max_sectors * 512;
|
||||
|
||||
/*
|
||||
* Maximum block size. We have 12 bits (= 4095) but have to subtract
|
||||
* space for CRC. So the maximum is 4095 - 4*2 = 4087.
|
||||
*/
|
||||
mmc->max_blk_size = 4087;
|
||||
|
||||
dev_set_drvdata(dev, mmc);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -94,6 +94,7 @@ struct mmc_host {
|
|||
unsigned short max_phys_segs; /* see blk_queue_max_phys_segments */
|
||||
unsigned short max_sectors; /* see blk_queue_max_sectors */
|
||||
unsigned short unused;
|
||||
unsigned int max_blk_size; /* maximum size of one mmc block */
|
||||
|
||||
/* private data */
|
||||
struct mmc_ios ios; /* current io bus settings */
|
||||
|
|
Loading…
Reference in a new issue