All of lore.kernel.org
 help / color / mirror / Atom feed
From: <jiajie.hao@mediatek.com>
To: <ulf.hansson@linaro.org>
Cc: <linus.walleij@linaro.org>, <chaotian.jing@mediatek.com>,
	<yong.mao@mediatek.com>, <eddie.huang@mediatek.com>,
	<srv_heupstream@mediatek.com>, <linux-mmc@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	<linux-mediatek@lists.infradead.org>,
	<linux-arm-kernel@mediatek.com>,
	Jiajie Hao <jiajie.hao@mediatek.com>
Subject: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
Date: Mon, 17 Apr 2017 16:09:31 +0800	[thread overview]
Message-ID: <1492416571-28843-2-git-send-email-jiajie.hao@mediatek.com> (raw)
In-Reply-To: <1492416571-28843-1-git-send-email-jiajie.hao@mediatek.com>

From: Jiajie Hao <jiajie.hao@mediatek.com>

The host may issue an I/O abort by writing to the CCCR at any time
during I/O read operation via CMD52. And host may need suspend
transcation during write busy stage in SDIO suspend/resume scenario.
>From other side, a card may accept CMD52 during data transfer phase.

Previous implement would block issuing above command in busy stage.
It cause function driver can't implement as proper way and has no
opportunity to do some coverage in error case via I/O abort etc.

We need bypass some necessary operation during busy check stage.

Change-Id: Ib5a4599a2a98cbcf441b564f5f6fbb10c8a59e1b
Signed-off-by: Jiajie Hao <jiajie.hao@mediatek.com>
---
 drivers/mmc/core/core.c     |    4 +++-
 drivers/mmc/core/sdio_ops.h |   10 ++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 926e0fd..9c9a4bc 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -234,8 +234,10 @@ static void __mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
 	/*
 	 * For sdio rw commands we must wait for card busy otherwise some
 	 * sdio devices won't work properly.
+	 * And bypass I/O abort, reset and bus suspend operations.
 	 */
-	if (mmc_is_io_op(mrq->cmd->opcode) && host->ops->card_busy) {
+	if (mmc_is_io_op(mrq->cmd->opcode) && host->ops->card_busy &&
+	    !mmc_is_io_bypass(mrq->cmd->opcode, mrq->cmd->arg)) {
 		int tries = 500; /* Wait aprox 500ms at maximum */
 
 		while (host->ops->card_busy(host) && --tries)
diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h
index bed8a83..9896696 100644
--- a/drivers/mmc/core/sdio_ops.h
+++ b/drivers/mmc/core/sdio_ops.h
@@ -31,5 +31,15 @@ static inline bool mmc_is_io_op(u32 opcode)
 	return opcode == SD_IO_RW_DIRECT || opcode == SD_IO_RW_EXTENDED;
 }
 
+static inline bool mmc_is_io_bypass(u32 opcode, u32 arg)
+{
+	u32 addr;
+
+	addr = (arg >> 9) & 0x1FFFF;
+
+	return ((opcode == SD_IO_RW_DIRECT) &&
+		(addr == SDIO_CCCR_ABORT || addr == SDIO_CCCR_SUSPEND));
+}
+
 #endif
 
-- 
1.7.9.5

WARNING: multiple messages have this Message-ID (diff)
From: <jiajie.hao@mediatek.com>
To: ulf.hansson@linaro.org
Cc: linus.walleij@linaro.org, chaotian.jing@mediatek.com,
	yong.mao@mediatek.com, eddie.huang@mediatek.com,
	srv_heupstream@mediatek.com, linux-mmc@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-arm-kernel@mediatek.com,
	Jiajie Hao <jiajie.hao@mediatek.com>
Subject: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
Date: Mon, 17 Apr 2017 16:09:31 +0800	[thread overview]
Message-ID: <1492416571-28843-2-git-send-email-jiajie.hao@mediatek.com> (raw)
In-Reply-To: <1492416571-28843-1-git-send-email-jiajie.hao@mediatek.com>

From: Jiajie Hao <jiajie.hao@mediatek.com>

The host may issue an I/O abort by writing to the CCCR at any time
during I/O read operation via CMD52. And host may need suspend
transcation during write busy stage in SDIO suspend/resume scenario.
>From other side, a card may accept CMD52 during data transfer phase.

Previous implement would block issuing above command in busy stage.
It cause function driver can't implement as proper way and has no
opportunity to do some coverage in error case via I/O abort etc.

We need bypass some necessary operation during busy check stage.

Change-Id: Ib5a4599a2a98cbcf441b564f5f6fbb10c8a59e1b
Signed-off-by: Jiajie Hao <jiajie.hao@mediatek.com>
---
 drivers/mmc/core/core.c     |    4 +++-
 drivers/mmc/core/sdio_ops.h |   10 ++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 926e0fd..9c9a4bc 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -234,8 +234,10 @@ static void __mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
 	/*
 	 * For sdio rw commands we must wait for card busy otherwise some
 	 * sdio devices won't work properly.
+	 * And bypass I/O abort, reset and bus suspend operations.
 	 */
-	if (mmc_is_io_op(mrq->cmd->opcode) && host->ops->card_busy) {
+	if (mmc_is_io_op(mrq->cmd->opcode) && host->ops->card_busy &&
+	    !mmc_is_io_bypass(mrq->cmd->opcode, mrq->cmd->arg)) {
 		int tries = 500; /* Wait aprox 500ms at maximum */
 
 		while (host->ops->card_busy(host) && --tries)
diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h
index bed8a83..9896696 100644
--- a/drivers/mmc/core/sdio_ops.h
+++ b/drivers/mmc/core/sdio_ops.h
@@ -31,5 +31,15 @@ static inline bool mmc_is_io_op(u32 opcode)
 	return opcode == SD_IO_RW_DIRECT || opcode == SD_IO_RW_EXTENDED;
 }
 
+static inline bool mmc_is_io_bypass(u32 opcode, u32 arg)
+{
+	u32 addr;
+
+	addr = (arg >> 9) & 0x1FFFF;
+
+	return ((opcode == SD_IO_RW_DIRECT) &&
+		(addr == SDIO_CCCR_ABORT || addr == SDIO_CCCR_SUSPEND));
+}
+
 #endif
 
-- 
1.7.9.5


  reply	other threads:[~2017-04-17  8:10 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-17  8:09 [PATCH] mmc: sdio: Fix sdio wait busy implement limitation jiajie.hao
2017-04-17  8:09 ` jiajie.hao
2017-04-17  8:09 ` jiajie.hao [this message]
2017-04-17  8:09   ` jiajie.hao
2017-04-17  8:36   ` 答复: " Jiajie Hao (郝加节)
2017-04-17  8:36     ` Jiajie Hao (郝加节)
2017-04-20 13:27   ` Ulf Hansson
2017-04-23  6:42     ` Jiajie Hao
2017-04-23  6:42       ` Jiajie Hao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1492416571-28843-2-git-send-email-jiajie.hao@mediatek.com \
    --to=jiajie.hao@mediatek.com \
    --cc=chaotian.jing@mediatek.com \
    --cc=eddie.huang@mediatek.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@mediatek.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=srv_heupstream@mediatek.com \
    --cc=ulf.hansson@linaro.org \
    --cc=yong.mao@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.