From patchwork Sun Oct 29 21:08:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Beno=C3=AEt_Th=C3=A9baudeau?= X-Patchwork-Id: 831807 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nwzgzP1l"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3yQ9GZ1CBZz9t3R for ; Mon, 30 Oct 2017 08:09:24 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 36077C21DA9; Sun, 29 Oct 2017 21:09:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 74974C21C71; Sun, 29 Oct 2017 21:09:15 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 8364AC21C71; Sun, 29 Oct 2017 21:09:13 +0000 (UTC) Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by lists.denx.de (Postfix) with ESMTPS id 12E97C21C4F for ; Sun, 29 Oct 2017 21:09:11 +0000 (UTC) Received: by mail-wr0-f196.google.com with SMTP id j15so10685283wre.8 for ; Sun, 29 Oct 2017 14:09:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=p3AmbmFfbR+t0HwmPuQAfQesa4Ow8P5KLbt3BqdcNYg=; b=nwzgzP1lN1gCLgFzcDZWlsebtYoZeXtG7lpr6MYicAK331lAIDVraiPUvd+h/JO0IR CMMIrSLv3ANJYbvWMVVwFNZ6a144aOLGCqs6UkDLz5hGztJpvZz5a8BK8QzfdopPhjvr OspgXBEkdjfVIo2jyQ+bnEvPYepD8mJZcdt3Z49Wd8Z8fyB7+rf/hkI4fquCridtbUQf kFsJVfPO3KvlT2lqCKdZdOuiLkjQH0j9GMc11f0SXAz8rynhiDmGgtmcow0MEDp9QHuP JjyPLMi1cVA2h2t0AcB1Js3Ok2XwFAiYY0Hr/6jFf9mvC5bSQxxL22Ukw3621/N6A9AF DlTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=p3AmbmFfbR+t0HwmPuQAfQesa4Ow8P5KLbt3BqdcNYg=; b=EeiKOf2GOFm2gOQz9p3RO8BuJzRHWBSY0Jb8BQGhg8MOaxvJYygK9f2A86TBZM+TtO GZqI6tNvINJAsmce6Hnps6+6518xv8/Cxrbafd/81SJPljsC0SiMgOAjWBp5V3R6MyFl ZbQNNKGOGMSYBDX1rclBYSCv5mzPpVR3vCbUSF+uTqJsu1kxIUScIh3UZvNVa20deSos DMXI05wR+xwkCsTRf0C2CcYVebOIZUvu167r4hGd5ney32kMnHyx7CNL6bfFi2E3QBpI Okwb45DiGLhaOrvh2ApZ7Jch60MXnogvOm26s+zjrCsR6JivqICMNtmtYvbpVlvW2w/F Nbsg== X-Gm-Message-State: AMCzsaUiJyjgJih6qvSR+Cjpbik1VZUV93sMxG9mzyfqK+jzPLhEwyc3 rmWv3Z7deXOc/xAwsoVFNZHwpw== X-Google-Smtp-Source: ABhQp+Qtbt/jIx+v5jhK7htaXECePItxl3bmB5HrOOy1nCYC8lOmrOVohgoV62DAU0LJnCbY5ax9lg== X-Received: by 10.223.139.85 with SMTP id v21mr6044487wra.70.1509311350545; Sun, 29 Oct 2017 14:09:10 -0700 (PDT) Received: from localhost.localdomain (vno44-1-88-172-188-148.fbx.proxad.net. [88.172.188.148]) by smtp.gmail.com with ESMTPSA id n2sm5485150wmd.39.2017.10.29.14.09.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 29 Oct 2017 14:09:10 -0700 (PDT) From: =?utf-8?q?Beno=C3=AEt_Th=C3=A9baudeau?= To: u-boot@lists.denx.de Date: Sun, 29 Oct 2017 22:08:58 +0100 Message-Id: <20171029210858.2956-1-benoit.thebaudeau.dev@gmail.com> X-Mailer: git-send-email 2.14.1 MIME-Version: 1.0 Cc: Fabio Estevam Subject: [U-Boot] [PATCH] mmc: fsl_esdhc: Fix PIO timeout X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The following error has been observed on i.MX25 with a high-speed SDSC card: Data Write Failed in PIO Mode. It was caused by the timeout set on PRSSTAT.BWEN, which was triggered because this bit takes 15 ms to be set after writing the first block to DATPORT with this card. Without this timeout, all the blocks are properly written. This timeout was implemented by decrementing a variable, so it was depending on the CPU frequency. Fix this issue by setting this timeout to a long enough absolute duration (500 ms). Signed-off-by: Benoît Thébaudeau Cc: Stefano Babic Cc: Fabio Estevam Cc: Jaehoon Chung Reviewed-by: Fabio Estevam Reviewed-by: Jagan Teki --- drivers/mmc/fsl_esdhc.c | 26 +++++++++++++------------- include/fsl_esdhc.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index cc188c4260..499d622c6d 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -171,20 +171,20 @@ static void esdhc_pio_read_write(struct fsl_esdhc_priv *priv, uint databuf; uint size; uint irqstat; - uint timeout; + ulong start; if (data->flags & MMC_DATA_READ) { blocks = data->blocks; buffer = data->dest; while (blocks) { - timeout = PIO_TIMEOUT; + start = get_timer(0); size = data->blocksize; irqstat = esdhc_read32(®s->irqstat); - while (!(esdhc_read32(®s->prsstat) & PRSSTAT_BREN) - && --timeout); - if (timeout <= 0) { - printf("\nData Read Failed in PIO Mode."); - return; + while (!(esdhc_read32(®s->prsstat) & PRSSTAT_BREN)) { + if (get_timer(start) > PIO_TIMEOUT) { + printf("\nData Read Failed in PIO Mode."); + return; + } } while (size && (!(irqstat & IRQSTAT_TC))) { udelay(100); /* Wait before last byte transfer complete */ @@ -200,14 +200,14 @@ static void esdhc_pio_read_write(struct fsl_esdhc_priv *priv, blocks = data->blocks; buffer = (char *)data->src; while (blocks) { - timeout = PIO_TIMEOUT; + start = get_timer(0); size = data->blocksize; irqstat = esdhc_read32(®s->irqstat); - while (!(esdhc_read32(®s->prsstat) & PRSSTAT_BWEN) - && --timeout); - if (timeout <= 0) { - printf("\nData Write Failed in PIO Mode."); - return; + while (!(esdhc_read32(®s->prsstat) & PRSSTAT_BWEN)) { + if (get_timer(start) > PIO_TIMEOUT) { + printf("\nData Write Failed in PIO Mode."); + return; + } } while (size && (!(irqstat & IRQSTAT_TC))) { udelay(100); /* Wait before last byte transfer complete */ diff --git a/include/fsl_esdhc.h b/include/fsl_esdhc.h index 02b362d5e3..de1f5e7d9f 100644 --- a/include/fsl_esdhc.h +++ b/include/fsl_esdhc.h @@ -130,7 +130,7 @@ #define XFERTYP_DMAEN 0x00000001 #define CINS_TIMEOUT 1000 -#define PIO_TIMEOUT 100000 +#define PIO_TIMEOUT 500 #define DSADDR 0x2e004