summaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorMing Lei <ming.lei@redhat.com>2019-02-27 11:02:11 -0500
committerUlf Hansson <ulf.hansson@linaro.org>2019-02-27 12:01:25 -0500
commitc53336c8f5f29043fded57912cc06c24e12613d7 (patch)
treec498a37b659a6e2de273832fd990a2314d28f67d /drivers/mmc
parentd07e9fadf3a6b466ca3ae90fa4859089ff20530f (diff)
mmc: core: align max segment size with logical block size
Logical block size is the lowest possible block size that the storage device can address. Max segment size is often related with controller's DMA capability. And it is reasonable to align max segment size with logical block size. SDHCI sets un-aligned max segment size, and causes ADMA error, so fix it by aligning max segment size with logical block size. Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> Cc: Christoph Hellwig <hch@lst.de> Cc: Naresh Kamboju <naresh.kamboju@linaro.org> Cc: Faiz Abbas <faiz_abbas@ti.com> Cc: linux-block@vger.kernel.org Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/core/block.c6
-rw-r--r--drivers/mmc/core/queue.c9
2 files changed, 8 insertions, 7 deletions
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 14f3fdb8c6bb..9ce8eb51a60f 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -2380,12 +2380,6 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
2380 snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), 2380 snprintf(md->disk->disk_name, sizeof(md->disk->disk_name),
2381 "mmcblk%u%s", card->host->index, subname ? subname : ""); 2381 "mmcblk%u%s", card->host->index, subname ? subname : "");
2382 2382
2383 if (mmc_card_mmc(card))
2384 blk_queue_logical_block_size(md->queue.queue,
2385 card->ext_csd.data_sector_size);
2386 else
2387 blk_queue_logical_block_size(md->queue.queue, 512);
2388
2389 set_capacity(md->disk, size); 2383 set_capacity(md->disk, size);
2390 2384
2391 if (mmc_host_cmd23(card->host)) { 2385 if (mmc_host_cmd23(card->host)) {
diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c
index 35cc138b096d..15a45ec6518d 100644
--- a/drivers/mmc/core/queue.c
+++ b/drivers/mmc/core/queue.c
@@ -355,6 +355,7 @@ static void mmc_setup_queue(struct mmc_queue *mq, struct mmc_card *card)
355{ 355{
356 struct mmc_host *host = card->host; 356 struct mmc_host *host = card->host;
357 u64 limit = BLK_BOUNCE_HIGH; 357 u64 limit = BLK_BOUNCE_HIGH;
358 unsigned block_size = 512;
358 359
359 if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask) 360 if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask)
360 limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT; 361 limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT;
@@ -368,7 +369,13 @@ static void mmc_setup_queue(struct mmc_queue *mq, struct mmc_card *card)
368 blk_queue_max_hw_sectors(mq->queue, 369 blk_queue_max_hw_sectors(mq->queue,
369 min(host->max_blk_count, host->max_req_size / 512)); 370 min(host->max_blk_count, host->max_req_size / 512));
370 blk_queue_max_segments(mq->queue, host->max_segs); 371 blk_queue_max_segments(mq->queue, host->max_segs);
371 blk_queue_max_segment_size(mq->queue, host->max_seg_size); 372
373 if (mmc_card_mmc(card))
374 block_size = card->ext_csd.data_sector_size;
375
376 blk_queue_logical_block_size(mq->queue, block_size);
377 blk_queue_max_segment_size(mq->queue,
378 round_down(host->max_seg_size, block_size));
372 379
373 INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler); 380 INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler);
374 INIT_WORK(&mq->complete_work, mmc_blk_mq_complete_work); 381 INIT_WORK(&mq->complete_work, mmc_blk_mq_complete_work);