diff options
author | Saugata Das <saugata.das@linaro.org> | 2012-05-17 07:02:21 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2012-05-17 09:35:21 -0400 |
commit | a5075eb94837edde6833fd5e0277fc2370cf8b39 (patch) | |
tree | e37957d108c9a01fc78dc9bdc4d914b382905a34 /drivers/mmc/card/block.c | |
parent | 6801c41a77123712accfde898820972a1f6fc117 (diff) |
mmc: block: Allow disabling 512B sector size emulation
This patch adds support for large sector size of 4KB by disabling
emulation. This patch passes eMMC DATA_SECTOR_SIZE as the logical
block size during mmc_blk_alloc_req.
In order to use this patch for 4KB sector size, ensure that
USE_NATIVE_SECTOR is enabled, partition table is 4KB sector size
aligned and file system block and sector size are 4KB multiples.
Signed-off-by: Saugata Das <saugata.das@linaro.org>
Reviewed-by: Subhash Jadavani <subhashj@codeaurora.org>
Reviewed-by: Namjae Jeon <linkinjeon@gmail.com>
Reviewed-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc/card/block.c')
-rw-r--r-- | drivers/mmc/card/block.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 91cda7551a60..dd2d374dcc7a 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
@@ -1284,7 +1284,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) | |||
1284 | int ret = 1, disable_multi = 0, retry = 0, type; | 1284 | int ret = 1, disable_multi = 0, retry = 0, type; |
1285 | enum mmc_blk_status status; | 1285 | enum mmc_blk_status status; |
1286 | struct mmc_queue_req *mq_rq; | 1286 | struct mmc_queue_req *mq_rq; |
1287 | struct request *req; | 1287 | struct request *req = rqc; |
1288 | struct mmc_async_req *areq; | 1288 | struct mmc_async_req *areq; |
1289 | 1289 | ||
1290 | if (!rqc && !mq->mqrq_prev->req) | 1290 | if (!rqc && !mq->mqrq_prev->req) |
@@ -1292,6 +1292,16 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) | |||
1292 | 1292 | ||
1293 | do { | 1293 | do { |
1294 | if (rqc) { | 1294 | if (rqc) { |
1295 | /* | ||
1296 | * When 4KB native sector is enabled, only 8 blocks | ||
1297 | * multiple read or write is allowed | ||
1298 | */ | ||
1299 | if ((brq->data.blocks & 0x07) && | ||
1300 | (card->ext_csd.data_sector_size == 4096)) { | ||
1301 | pr_err("%s: Transfer size is not 4KB sector size aligned\n", | ||
1302 | req->rq_disk->disk_name); | ||
1303 | goto cmd_abort; | ||
1304 | } | ||
1295 | mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq); | 1305 | mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq); |
1296 | areq = &mq->mqrq_cur->mmc_active; | 1306 | areq = &mq->mqrq_cur->mmc_active; |
1297 | } else | 1307 | } else |
@@ -1539,7 +1549,12 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, | |||
1539 | snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), | 1549 | snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), |
1540 | "mmcblk%d%s", md->name_idx, subname ? subname : ""); | 1550 | "mmcblk%d%s", md->name_idx, subname ? subname : ""); |
1541 | 1551 | ||
1542 | blk_queue_logical_block_size(md->queue.queue, 512); | 1552 | if (mmc_card_mmc(card)) |
1553 | blk_queue_logical_block_size(md->queue.queue, | ||
1554 | card->ext_csd.data_sector_size); | ||
1555 | else | ||
1556 | blk_queue_logical_block_size(md->queue.queue, 512); | ||
1557 | |||
1543 | set_capacity(md->disk, size); | 1558 | set_capacity(md->disk, size); |
1544 | 1559 | ||
1545 | if (mmc_host_cmd23(card->host)) { | 1560 | if (mmc_host_cmd23(card->host)) { |