From patchwork Tue Aug 12 04:01:30 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gao, Yunpeng" X-Patchwork-Id: 4710641 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D35AC9F38D for ; Tue, 12 Aug 2014 03:59:55 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EB1D520115 for ; Tue, 12 Aug 2014 03:59:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A117620125 for ; Tue, 12 Aug 2014 03:59:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754810AbaHLD7s (ORCPT ); Mon, 11 Aug 2014 23:59:48 -0400 Received: from mga01.intel.com ([192.55.52.88]:7200 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753033AbaHLD7r (ORCPT ); Mon, 11 Aug 2014 23:59:47 -0400 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 11 Aug 2014 20:59:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.01,847,1400050800"; d="scan'208";a="583529905" Received: from spark-hp-compaq-8000-elite-cmt-pc.bj.intel.com ([172.16.181.71]) by fmsmga002.fm.intel.com with ESMTP; 11 Aug 2014 20:59:43 -0700 From: Yunpeng Gao To: linux-mmc@vger.kernel.org Cc: Chuanxiao Dong , Yunpeng Gao Subject: [PATCH] mmc: card: not access RPMB partition for normal read and write Date: Tue, 12 Aug 2014 12:01:30 +0800 Message-Id: <1407816090-7671-1-git-send-email-yunpeng.gao@intel.com> X-Mailer: git-send-email 1.7.9.5 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Chuanxiao Dong 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: ... <3>[ 4.890052] mmc0: Got data interrupt 0x00000002 even though no data operation was in progress. <3>[ 4.892160] mmcblk0rpmb: error -110 transferring data, sector 0, nr 32, cmd response 0x900, card status 0xb00 <4>[ 4.892165] mmcblk0rpmb: retrying using single block read <3>[ 4.895727] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 <3>[ 4.899269] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 <3>[ 4.901466] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 <3>[ 4.905106] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 <3>[ 4.907166] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 <3>[ 4.909235] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 <3>[ 4.909241] end_request: I/O error, dev mmcblk0rpmb, sector 0 <3>[ 4.909247] Buffer I/O error on device mmcblk0rpmb, logical block 0 <3>[ 4.909263] end_request: I/O error, dev mmcblk0rpmb, sector 8 <3>[ 4.909267] Buffer I/O error on device mmcblk0rpmb, logical block 1 <3>[ 4.909272] end_request: I/O error, dev mmcblk0rpmb, sector 16 <3>[ 4.909275] Buffer I/O error on device mmcblk0rpmb, logical block 2 <3>[ 4.909280] end_request: I/O error, dev mmcblk0rpmb, sector 24 <3>[ 4.909283] 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. Signed-off-by: Yunpeng Gao Signed-off-by: Chuanxiao Dong --- drivers/mmc/card/block.c | 13 +++++++++++++ drivers/mmc/card/queue.c | 2 +- drivers/mmc/card/queue.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 452782b..4b79592 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1025,6 +1025,19 @@ static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type) 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; +} +EXPORT_SYMBOL_GPL(mmc_access_rpmb); + static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) { struct mmc_blk_data *md = mq->data; diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index 3e049c1..6ceede0 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -38,7 +38,7 @@ static int mmc_prep_request(struct request_queue *q, struct request *req) 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; diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h index 5752d50..99e6521 100644 --- a/drivers/mmc/card/queue.h +++ b/drivers/mmc/card/queue.h @@ -73,4 +73,6 @@ extern void mmc_queue_bounce_post(struct mmc_queue_req *); 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