All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
@ 2017-04-17  8:09 ` jiajie.hao
  0 siblings, 0 replies; 9+ messages in thread
From: jiajie.hao @ 2017-04-17  8:09 UTC (permalink / raw)
  To: ulf.hansson
  Cc: linus.walleij, chaotian.jing, yong.mao, eddie.huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

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.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
@ 2017-04-17  8:09 ` jiajie.hao
  0 siblings, 0 replies; 9+ messages in thread
From: jiajie.hao @ 2017-04-17  8:09 UTC (permalink / raw)
  To: ulf.hansson
  Cc: linus.walleij, chaotian.jing, yong.mao, eddie.huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

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.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
  2017-04-17  8:09 ` jiajie.hao
@ 2017-04-17  8:09   ` jiajie.hao
  -1 siblings, 0 replies; 9+ messages in thread
From: jiajie.hao @ 2017-04-17  8:09 UTC (permalink / raw)
  To: ulf.hansson
  Cc: linus.walleij, chaotian.jing, yong.mao, eddie.huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel, Jiajie Hao

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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
@ 2017-04-17  8:09   ` jiajie.hao
  0 siblings, 0 replies; 9+ messages in thread
From: jiajie.hao @ 2017-04-17  8:09 UTC (permalink / raw)
  To: ulf.hansson
  Cc: linus.walleij, chaotian.jing, yong.mao, eddie.huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel, Jiajie Hao

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


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* 答复: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
  2017-04-17  8:09   ` jiajie.hao
@ 2017-04-17  8:36     ` Jiajie Hao (郝加节)
  -1 siblings, 0 replies; 9+ messages in thread
From: Jiajie Hao (郝加节) @ 2017-04-17  8:36 UTC (permalink / raw)
  To: Jiajie Hao (郝加节), ulf.hansson
  Cc: linus.walleij, Chaotian Jing (井朝天),
	Yong Mao (毛勇),
	Eddie Huang (黃智傑),
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

CC: linux-arm-kernel


Many thanks
Jiajie.

-----邮件原件-----
发件人: jiajie.hao@mediatek.com [mailto:jiajie.hao@mediatek.com] 
发送时间: 2017年4月17日 16:10
收件人: ulf.hansson@linaro.org
抄送: linus.walleij@linaro.org; Chaotian Jing (井朝天) <Chaotian.Jing@mediatek.com>; Yong Mao (毛勇) <yong.mao@mediatek.com>; Eddie Huang (黃智傑) <eddie.huang@mediatek.com>; srv_heupstream <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>
主题: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation

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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* 答复: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
@ 2017-04-17  8:36     ` Jiajie Hao (郝加节)
  0 siblings, 0 replies; 9+ messages in thread
From: Jiajie Hao (郝加节) @ 2017-04-17  8:36 UTC (permalink / raw)
  To: Jiajie Hao (郝加节), ulf.hansson
  Cc: linus.walleij, Chaotian Jing (井朝天),
	Yong Mao (毛勇),
	Eddie Huang (黃智傑),
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

CC: linux-arm-kernel


Many thanks
Jiajie.

-----邮件原件-----
发件人: jiajie.hao@mediatek.com [mailto:jiajie.hao@mediatek.com] 
发送时间: 2017年4月17日 16:10
收件人: ulf.hansson@linaro.org
抄送: linus.walleij@linaro.org; Chaotian Jing (井朝天) <Chaotian.Jing@mediatek.com>; Yong Mao (毛勇) <yong.mao@mediatek.com>; Eddie Huang (黃智傑) <eddie.huang@mediatek.com>; srv_heupstream <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>
主题: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation

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


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
  2017-04-17  8:09   ` jiajie.hao
  (?)
  (?)
@ 2017-04-20 13:27   ` Ulf Hansson
  2017-04-23  6:42       ` Jiajie Hao
  -1 siblings, 1 reply; 9+ messages in thread
From: Ulf Hansson @ 2017-04-20 13:27 UTC (permalink / raw)
  To: jiajie.hao
  Cc: Linus Walleij, Chaotian Jing, Yong Mao, Eddie Huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

On 17 April 2017 at 10:09,  <jiajie.hao@mediatek.com> wrote:
> 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

Please remove this.

> 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)) {

Instead of adding yet another function, let's extend the existing
mmc_is_io_op() to cover this new cases as well.

Moreover, to be reflect the purpose of the function, I suggest we
rename it from mmc_is_io_op() to sdio_is_op_busy().

>                 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
>

Kind regards
Uffe

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
  2017-04-20 13:27   ` Ulf Hansson
@ 2017-04-23  6:42       ` Jiajie Hao
  0 siblings, 0 replies; 9+ messages in thread
From: Jiajie Hao @ 2017-04-23  6:42 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Linus Walleij, Chaotian Jing, Yong Mao, Eddie Huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

Hi Ulf,

Very appreciated for your comment.
> On Thu, 2017-04-20 at 15:27 +0200, Ulf Hansson wrote:
> On 17 April 2017 at 10:09,  <jiajie.hao@mediatek.com> wrote:
> > 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
> 
> Please remove this.
OK.
> > 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)) {
> 
> Instead of adding yet another function, let's extend the existing
> mmc_is_io_op() to cover this new cases as well.
> 
> Moreover, to be reflect the purpose of the function, I suggest we
> rename it from mmc_is_io_op() to sdio_is_op_busy().
It's a good suggestion. I'll resend patch in v2 for review.
> >                 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
> >
> 
> Kind regards
> Uffe

Best regards
Jiajie

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] mmc: sdio: Fix sdio wait busy implement limitation
@ 2017-04-23  6:42       ` Jiajie Hao
  0 siblings, 0 replies; 9+ messages in thread
From: Jiajie Hao @ 2017-04-23  6:42 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Linus Walleij, Chaotian Jing, Yong Mao, Eddie Huang,
	srv_heupstream, linux-mmc, linux-kernel, linux-mediatek,
	linux-arm-kernel

Hi Ulf,

Very appreciated for your comment.
> On Thu, 2017-04-20 at 15:27 +0200, Ulf Hansson wrote:
> On 17 April 2017 at 10:09,  <jiajie.hao@mediatek.com> wrote:
> > 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
> 
> Please remove this.
OK.
> > 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)) {
> 
> Instead of adding yet another function, let's extend the existing
> mmc_is_io_op() to cover this new cases as well.
> 
> Moreover, to be reflect the purpose of the function, I suggest we
> rename it from mmc_is_io_op() to sdio_is_op_busy().
It's a good suggestion. I'll resend patch in v2 for review.
> >                 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
> >
> 
> Kind regards
> Uffe

Best regards
Jiajie

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-04-23  6:42 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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.