[U-Boot] [PATCH 2/5] mmc: Tegra2: Add data transfer completion timeout
Anton Staaf
robotboy at chromium.org
Fri Oct 28 19:54:27 CEST 2011
On Thu, Oct 13, 2011 at 2:57 PM, Anton Staaf <robotboy at 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 at chromium.org>
> Cc: Tom Warren <twarren at nvidia.com>
> Cc: Stephen Warren <swarren at 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
>
>
More information about the U-Boot
mailing list