Re: [PATCH] OMAP: MMC: recover from transfer failures

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for the suggestion, it works great (stress tested) and is a cleaner 
fix.
Here is a patch the latest linux-omap-2.6 tree. Is this OK?

Regards,
Jean

From d143f6b2e705aa4e9d2b032097fd1c82f8163262 Mon Sep 17 00:00:00 2001
From: Jean Pihet <jpihet@xxxxxxxxxx>
Date: Thu, 8 Jan 2009 12:35:21 +0100
Subject: [PATCH] OMAP: MMC: recover from transfer failures

Timeouts during a command that has a data phase can result in the
next command issued after the command that failed not being processed,
i.e. no interrupt ever occurs to indicate the command has completed.
This failure can result in a deadlock.

This patch resets the data state machine to clear the error in
case of a command timeout.

Tested on OMAP3430 chip and intensive MMC/SD device removal while
transferring data.

Signed-off-by: Andy Lowe <alowe@xxxxxxxxxx>
Signed-off-by: Jean Pihet <jpihet@xxxxxxxxxx>
Signed-off-by: Adrian Hunter <ext-adrian.hunter@xxxxxxxxx>
---
 drivers/mmc/host/omap_hsmmc.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d5c1e9d..97150c0 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -464,8 +464,15 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
                                }
                                end_cmd = 1;
                        }
-                       if (host->data)
+                       if (host->data) {
                                mmc_dma_cleanup(host);
+                               OMAP_HSMMC_WRITE(host->base, SYSCTL,
+                                       OMAP_HSMMC_READ(host->base,
+                                                       SYSCTL) | SRD);
+                               while (OMAP_HSMMC_READ(host->base,
+                                               SYSCTL) & SRD)
+                                       ;
+                       }
                }
                if ((status & DATA_TIMEOUT) ||
                        (status & DATA_CRC)) {
--
1.5.4.4.21.gc4a6c



On Thursday 08 January 2009 10:02:24 Adrian Hunter wrote:
> Why not do the reset in mmc_omap_irq() like the other resets?
> e.g.
>
> static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
> ...
>                 if ((status & CMD_TIMEOUT) ||
>                         (status & CMD_CRC)) {
>                         if (host->cmd) {
>                                 if (status & CMD_TIMEOUT) {
>                                         OMAP_HSMMC_WRITE(host->base,
> SYSCTL, OMAP_HSMMC_READ(host->base, SYSCTL) | SRC); while
> (OMAP_HSMMC_READ(host->base, SYSCTL) & SRC) ;
>
>                                         host->cmd->error = -ETIMEDOUT;
>                                 } else {
>                                         host->cmd->error = -EILSEQ;
>                                 }
>                                 end_cmd = 1;
>                         }
> -                       if (host->data)
> +                       if (host->data) {
>                                 mmc_dma_cleanup(host);
> +                               OMAP_HSMMC_WRITE(host->base, SYSCTL,
> +                                       OMAP_HSMMC_READ(host->base,
> +                                                       SYSCTL) | SRD);
> +                               while (OMAP_HSMMC_READ(host->base,
> +                                               SYSCTL) & SRD)
> +                                       ;
> +                       }
>                 }
>                 if ((status & DATA_TIMEOUT) ||
>                         (status & DATA_CRC)) {


From d143f6b2e705aa4e9d2b032097fd1c82f8163262 Mon Sep 17 00:00:00 2001
From: Jean Pihet <jpihet@xxxxxxxxxx>
Date: Thu, 8 Jan 2009 12:35:21 +0100
Subject: [PATCH] OMAP: MMC: recover from transfer failures

Timeouts during a command that has a data phase can result in the
next command issued after the command that failed not being processed,
i.e. no interrupt ever occurs to indicate the command has completed.
This failure can result in a deadlock.

This patch resets the data state machine to clear the error in
case of a command timeout.

Tested on OMAP3430 chip and intensive MMC/SD device removal while
transferring data.

Signed-off-by: Andy Lowe <alowe@xxxxxxxxxx>
Signed-off-by: Jean Pihet <jpihet@xxxxxxxxxx>
Signed-off-by: Adrian Hunter <ext-adrian.hunter@xxxxxxxxx>
---
 drivers/mmc/host/omap_hsmmc.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d5c1e9d..97150c0 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -464,8 +464,15 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
 				}
 				end_cmd = 1;
 			}
-			if (host->data)
+			if (host->data) {
 				mmc_dma_cleanup(host);
+				OMAP_HSMMC_WRITE(host->base, SYSCTL,
+					OMAP_HSMMC_READ(host->base,
+							SYSCTL) | SRD);
+				while (OMAP_HSMMC_READ(host->base,
+						SYSCTL) & SRD)
+					;
+			}
 		}
 		if ((status & DATA_TIMEOUT) ||
 			(status & DATA_CRC)) {
-- 
1.5.4.4.21.gc4a6c


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux