diff mbox

[U-Boot,2/5] mmc: Tegra2: Add data transfer completion timeout

Message ID 1318543028-22720-3-git-send-email-robotboy@chromium.org
State Accepted, archived
Commit 9b3d1873c8c829debe8e8ab487783577285530d3
Delegated to: Andy Fleming
Headers show

Commit Message

Anton staaf Oct. 13, 2011, 9:57 p.m. UTC
Currently when no expected completion condition occures in the
mmc_send_cmd while loop that is waiting for a data transfer to
complete the MMC driver just hangs.

This patch adds an arbitrary 2 second timeout.  If nothing we
recognize occures within 2 seconds some diagnostic information
is printed and we fail out.

Signed-off-by: Anton Staaf <robotboy@chromium.org>
Cc: Tom Warren <twarren@nvidia.com>
Cc: Stephen Warren <swarren@nvidia.com>
---
 drivers/mmc/tegra2_mmc.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

Comments

Anton staaf Oct. 28, 2011, 5:54 p.m. UTC | #1
On Thu, Oct 13, 2011 at 2:57 PM, Anton Staaf <robotboy@chromium.org> wrote:
> Currently when no expected completion condition occures in the
> mmc_send_cmd while loop that is waiting for a data transfer to
> complete the MMC driver just hangs.
>
> This patch adds an arbitrary 2 second timeout.  If nothing we
> recognize occures within 2 seconds some diagnostic information
> is printed and we fail out.
>
> Signed-off-by: Anton Staaf <robotboy@chromium.org>
> Cc: Tom Warren <twarren@nvidia.com>
> Cc: Stephen Warren <swarren@nvidia.com>

Adding Albert to CC.

-Anton

> ---
>  drivers/mmc/tegra2_mmc.c |   14 ++++++++++++++
>  1 files changed, 14 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/tegra2_mmc.c b/drivers/mmc/tegra2_mmc.c
> index 195f89d..27564b0 100644
> --- a/drivers/mmc/tegra2_mmc.c
> +++ b/drivers/mmc/tegra2_mmc.c
> @@ -246,6 +246,8 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
>        }
>
>        if (data) {
> +               unsigned long   start = get_timer(0);
> +
>                while (1) {
>                        mask = readl(&host->reg->norintsts);
>
> @@ -269,6 +271,18 @@ static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
>                                /* Transfer Complete */
>                                debug("r/w is done\n");
>                                break;
> +                       } else if (get_timer(start) > 2000UL) {
> +                               writel(mask, &host->reg->norintsts);
> +                               printf("%s: MMC Timeout\n"
> +                                      "    Interrupt status        0x%08x\n"
> +                                      "    Interrupt status enable 0x%08x\n"
> +                                      "    Interrupt signal enable 0x%08x\n"
> +                                      "    Present status          0x%08x\n",
> +                                      __func__, mask,
> +                                      readl(&host->reg->norintstsen),
> +                                      readl(&host->reg->norintsigen),
> +                                      readl(&host->reg->prnsts));
> +                               return -1;
>                        }
>                }
>                writel(mask, &host->reg->norintsts);
> --
> 1.7.3.1
>
>
diff mbox

Patch

diff --git a/drivers/mmc/tegra2_mmc.c b/drivers/mmc/tegra2_mmc.c
index 195f89d..27564b0 100644
--- a/drivers/mmc/tegra2_mmc.c
+++ b/drivers/mmc/tegra2_mmc.c
@@ -246,6 +246,8 @@  static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
 	}
 
 	if (data) {
+		unsigned long	start = get_timer(0);
+
 		while (1) {
 			mask = readl(&host->reg->norintsts);
 
@@ -269,6 +271,18 @@  static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
 				/* Transfer Complete */
 				debug("r/w is done\n");
 				break;
+			} else if (get_timer(start) > 2000UL) {
+				writel(mask, &host->reg->norintsts);
+				printf("%s: MMC Timeout\n"
+				       "    Interrupt status        0x%08x\n"
+				       "    Interrupt status enable 0x%08x\n"
+				       "    Interrupt signal enable 0x%08x\n"
+				       "    Present status          0x%08x\n",
+				       __func__, mask,
+				       readl(&host->reg->norintstsen),
+				       readl(&host->reg->norintsigen),
+				       readl(&host->reg->prnsts));
+				return -1;
 			}
 		}
 		writel(mask, &host->reg->norintsts);