RE: [PATCH RESEND] mmc:sdhci: handle busy-end interrupt during command

2014-03-15 Thread Youssef TRIKI
Hi Guys,

It is not specific to Toshiba devices, and happens with eMMC  devices as well 
as SD card which support Auto-CMD12 rather than CMD23.
This warning is seen in read operation and the cause is well explained below. 
Thanks Chanho Min for the patch.
And Thanks to add it to the mainline.

Regards,
Youssef. 

-Original Message-
From: Chanho Min [mailto:chanho@lge.com] 
Sent: samedi 15 mars 2014 07:23
To: Chris Ball; Chris Ball
Cc: Hankyung Yu; Shawn Guo; Dong Aisheng; Kevin Liu; linux-...@vger.kernel.org; 
linux-kernel@vger.kernel.org; HyoJun Im; Gunho Lee; Youssef TRIKI; Chanho Min
Subject: [PATCH RESEND] mmc:sdhci: handle busy-end interrupt during command

It is fully legal for a controller to start handling busy-end interrupt before 
it has signaled that the command has completed. So make sure we do things in 
the proper order, Or it results that command interrupt is ignored so it can 
cause unexpected operations. This is founded at some toshiba emmc with the 
bellow warning.

"mmc0: Got command interrupt 0x0001 even though no command operation was in 
progress."

Can anyone ACK/NACK of this patch? Any comment will be appreciated.

Signed-off-by: Hankyung Yu 
Signed-off-by: Chanho Min 
Tested-by: Youssef TRIKI 
---
 drivers/mmc/host/sdhci.c  |   17 +++--
 include/linux/mmc/sdhci.h |1 +
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 
bd8a098..21f98e7 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1016,6 +1016,7 @@ void sdhci_send_command(struct sdhci_host *host, struct 
mmc_command *cmd)
mod_timer(>timer, jiffies + 10 * HZ);
 
host->cmd = cmd;
+   host->busy_handle = 0;
 
sdhci_prepare_data(host, cmd);
 
@@ -2271,8 +2272,12 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 
intmask)
if (host->cmd->data)
DBG("Cannot wait for busy signal when also "
"doing a data transfer");
-   else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ))
+   else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ)
+   && !host->busy_handle) {
+   /* Mark that command complete before busy is ended */
+   host->busy_handle = 1;
return;
+   }
 
/* The controller does not support the end-of-busy IRQ,
 * fall through and take the SDHCI_INT_RESPONSE */ @@ -2335,7 
+2340,15 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 */
if (host->cmd && (host->cmd->flags & MMC_RSP_BUSY)) {
if (intmask & SDHCI_INT_DATA_END) {
-   sdhci_finish_command(host);
+   /*
+* Some cards handle busy-end interrupt
+* before the command completed, so make
+* sure we do things in the proper order.
+*/
+   if (host->busy_handle)
+   sdhci_finish_command(host);
+   else
+   host->busy_handle = 1;
return;
}
}
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 
3e781b8..0118020 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -148,6 +148,7 @@ struct sdhci_host {
struct mmc_command *cmd;/* Current command */
struct mmc_data *data;  /* Current data request */
unsigned int data_early:1;  /* Data finished before cmd */
+   unsigned int busy_handle:1; /* Handling the order of Busy-end */
 
struct sg_mapping_iter sg_miter;/* SG state for PIO */
unsigned int blocks;/* remaining PIO blocks */
--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH RESEND] mmc:sdhci: handle busy-end interrupt during command

2014-03-15 Thread Youssef TRIKI
Hi Guys,

It is not specific to Toshiba devices, and happens with eMMC  devices as well 
as SD card which support Auto-CMD12 rather than CMD23.
This warning is seen in read operation and the cause is well explained below. 
Thanks Chanho Min for the patch.
And Thanks to add it to the mainline.

Regards,
Youssef. 

-Original Message-
From: Chanho Min [mailto:chanho@lge.com] 
Sent: samedi 15 mars 2014 07:23
To: Chris Ball; Chris Ball
Cc: Hankyung Yu; Shawn Guo; Dong Aisheng; Kevin Liu; linux-...@vger.kernel.org; 
linux-kernel@vger.kernel.org; HyoJun Im; Gunho Lee; Youssef TRIKI; Chanho Min
Subject: [PATCH RESEND] mmc:sdhci: handle busy-end interrupt during command

It is fully legal for a controller to start handling busy-end interrupt before 
it has signaled that the command has completed. So make sure we do things in 
the proper order, Or it results that command interrupt is ignored so it can 
cause unexpected operations. This is founded at some toshiba emmc with the 
bellow warning.

mmc0: Got command interrupt 0x0001 even though no command operation was in 
progress.

Can anyone ACK/NACK of this patch? Any comment will be appreciated.

Signed-off-by: Hankyung Yu hankyung...@lge.com
Signed-off-by: Chanho Min chanho@lge.com
Tested-by: Youssef TRIKI youssef.tr...@st.com
---
 drivers/mmc/host/sdhci.c  |   17 +++--
 include/linux/mmc/sdhci.h |1 +
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 
bd8a098..21f98e7 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1016,6 +1016,7 @@ void sdhci_send_command(struct sdhci_host *host, struct 
mmc_command *cmd)
mod_timer(host-timer, jiffies + 10 * HZ);
 
host-cmd = cmd;
+   host-busy_handle = 0;
 
sdhci_prepare_data(host, cmd);
 
@@ -2271,8 +2272,12 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 
intmask)
if (host-cmd-data)
DBG(Cannot wait for busy signal when also 
doing a data transfer);
-   else if (!(host-quirks  SDHCI_QUIRK_NO_BUSY_IRQ))
+   else if (!(host-quirks  SDHCI_QUIRK_NO_BUSY_IRQ)
+!host-busy_handle) {
+   /* Mark that command complete before busy is ended */
+   host-busy_handle = 1;
return;
+   }
 
/* The controller does not support the end-of-busy IRQ,
 * fall through and take the SDHCI_INT_RESPONSE */ @@ -2335,7 
+2340,15 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 */
if (host-cmd  (host-cmd-flags  MMC_RSP_BUSY)) {
if (intmask  SDHCI_INT_DATA_END) {
-   sdhci_finish_command(host);
+   /*
+* Some cards handle busy-end interrupt
+* before the command completed, so make
+* sure we do things in the proper order.
+*/
+   if (host-busy_handle)
+   sdhci_finish_command(host);
+   else
+   host-busy_handle = 1;
return;
}
}
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 
3e781b8..0118020 100644
--- a/include/linux/mmc/sdhci.h
+++ b/include/linux/mmc/sdhci.h
@@ -148,6 +148,7 @@ struct sdhci_host {
struct mmc_command *cmd;/* Current command */
struct mmc_data *data;  /* Current data request */
unsigned int data_early:1;  /* Data finished before cmd */
+   unsigned int busy_handle:1; /* Handling the order of Busy-end */
 
struct sg_mapping_iter sg_miter;/* SG state for PIO */
unsigned int blocks;/* remaining PIO blocks */
--
1.7.9.5

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/