| From 4e93b9a6abc0d028daf3c8a00cb77b679d8a4df4 Mon Sep 17 00:00:00 2001 |
| From: Chuanxiao Dong <chuanxiao.dong@intel.com> |
| Date: Tue, 12 Aug 2014 12:01:30 +0800 |
| Subject: mmc: card: Don't access RPMB partitions for normal read/write |
| |
| From: Chuanxiao Dong <chuanxiao.dong@intel.com> |
| |
| commit 4e93b9a6abc0d028daf3c8a00cb77b679d8a4df4 upstream. |
| |
| During kernel boot, it will try to read some logical sectors |
| of each block device node for the possible partition table. |
| |
| But since RPMB partition is special and can not be accessed |
| by normal eMMC read / write CMDs, it will cause below error |
| messages during kernel boot: |
| ... |
| mmc0: Got data interrupt 0x00000002 even though no data operation was in progress. |
| mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00 |
| mmcblk0rpmb: retrying using single block read |
| mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 |
| mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 |
| mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 |
| mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 |
| mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 |
| mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 |
| end_request: I/O error, dev mmcblk0rpmb, sector 0 |
| Buffer I/O error on device mmcblk0rpmb, logical block 0 |
| end_request: I/O error, dev mmcblk0rpmb, sector 8 |
| Buffer I/O error on device mmcblk0rpmb, logical block 1 |
| end_request: I/O error, dev mmcblk0rpmb, sector 16 |
| Buffer I/O error on device mmcblk0rpmb, logical block 2 |
| end_request: I/O error, dev mmcblk0rpmb, sector 24 |
| Buffer I/O error on device mmcblk0rpmb, logical block 3 |
| ... |
| |
| This patch will discard the access request in eMMC queue if |
| it is RPMB partition access request. By this way, it avoids |
| trigger above error messages. |
| |
| Fixes: 090d25fe224c ("mmc: core: Expose access to RPMB partition") |
| Signed-off-by: Yunpeng Gao <yunpeng.gao@intel.com> |
| Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com> |
| Tested-by: Michael Shigorin <mike@altlinux.org> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mmc/card/block.c | 12 ++++++++++++ |
| drivers/mmc/card/queue.c | 2 +- |
| drivers/mmc/card/queue.h | 2 ++ |
| 3 files changed, 15 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/mmc/card/block.c |
| +++ b/drivers/mmc/card/block.c |
| @@ -908,6 +908,18 @@ static inline void mmc_blk_reset_success |
| md->reset_done &= ~type; |
| } |
| |
| +int mmc_access_rpmb(struct mmc_queue *mq) |
| +{ |
| + struct mmc_blk_data *md = mq->data; |
| + /* |
| + * If this is a RPMB partition access, return ture |
| + */ |
| + if (md && md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB) |
| + return true; |
| + |
| + return false; |
| +} |
| + |
| static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) |
| { |
| struct mmc_blk_data *md = mq->data; |
| --- a/drivers/mmc/card/queue.c |
| +++ b/drivers/mmc/card/queue.c |
| @@ -37,7 +37,7 @@ static int mmc_prep_request(struct reque |
| return BLKPREP_KILL; |
| } |
| |
| - if (mq && mmc_card_removed(mq->card)) |
| + if (mq && (mmc_card_removed(mq->card) || mmc_access_rpmb(mq))) |
| return BLKPREP_KILL; |
| |
| req->cmd_flags |= REQ_DONTPREP; |
| --- a/drivers/mmc/card/queue.h |
| +++ b/drivers/mmc/card/queue.h |
| @@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct |
| extern int mmc_packed_init(struct mmc_queue *, struct mmc_card *); |
| extern void mmc_packed_clean(struct mmc_queue *); |
| |
| +extern int mmc_access_rpmb(struct mmc_queue *); |
| + |
| #endif |