From patchwork Sun Apr 2 08:24:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Deymo X-Patchwork-Id: 746823 X-Patchwork-Delegate: jh80.chung@samsung.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3vy9mw2K13z9sCX for ; Wed, 5 Apr 2017 00:08:32 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="P9cEFuww"; dkim-atps=neutral Received: by lists.denx.de (Postfix, from userid 105) id 16F20C21CF5; Tue, 4 Apr 2017 13:58:58 +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=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, 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 0AF02C21DBA; Tue, 4 Apr 2017 13:29:36 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id C5277C21C44; Sun, 2 Apr 2017 08:24:56 +0000 (UTC) Received: from mail-pg0-f51.google.com (mail-pg0-f51.google.com [74.125.83.51]) by lists.denx.de (Postfix) with ESMTPS id 31D0BC21C3F for ; Sun, 2 Apr 2017 08:24:56 +0000 (UTC) Received: by mail-pg0-f51.google.com with SMTP id g2so95369167pge.3 for ; Sun, 02 Apr 2017 01:24:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=n6WXK/n+5T2sk0zXE1piHbYO09BCDFQJdgh/xnNctak=; b=P9cEFuwwxHHGmFYxDK9ZEt5l20rlfX3cZHj9W/lqwi1Je1KKujSwjvRVifQHgpkf2n EuIjo3cVcKuAzsyeg79g2BtuQV+jqTgZeIVVjHLsp/5Tyd+EF9eTc289EwkSsP3LAN+3 /pfltkptyJorjQ4pPQquUyTB/ECmdzdfExnUqE7/cz6aLaLyApVUE1vSlptbtEJL2M60 yuyEwdHkUjExe1fLdxp4+MXAcqXZIYIBn2DfwwF93AgxHyCMdSuz61O5RjOBMM1Vl0ca DmAfM9FHHqo5Na6BLEaeEeAAkQ1GVU8hAsajHoI4jddC7J/nyIfgW89D47nEVZ7wph14 viEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=n6WXK/n+5T2sk0zXE1piHbYO09BCDFQJdgh/xnNctak=; b=ZWd6uEBSz46cOLj7rvzAERHiTXrYmhilh2srza1AfZfmKFWbcq2sMr4MNYMefLCvVu 4ymzDDw1b/MZm7DV2lf36wWnieMvwrCX5JpaNLTbYzZVWyhM7T6xymxjVYE5VOYguQ0h +9wR9OJ0WW5WfEfstbOXEgHRq9bAwmwXOLIhynkrjNg4pt62mssBm1YJrYLeWgAm5b0b I1Tw1iNr8yFMeBb0gIUyx9BApP6HHpMfuCcFnhoq2/RcZHkZ2CDNjGsI4VlSbZCoWKeX +I3VaewfrOBHvlp0+K1vhO7sKBmr85KJYQxqRubS21Pm2nMtioxYIFNy9hRKfOQxaDZw +QMw== X-Gm-Message-State: AFeK/H2AmL8ak1Dinm5pYkvKMABEI197X6YbsbUzbTB1CRyw5XCAxgGjQubc0uBOjI2g4oDP X-Received: by 10.98.150.196 with SMTP id s65mr11091335pfk.220.1491121494425; Sun, 02 Apr 2017 01:24:54 -0700 (PDT) Received: from deymo-glaptop.corp.google.com ([172.26.50.106]) by smtp.gmail.com with ESMTPSA id 67sm12933918pgg.12.2017.04.02.01.24.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 02 Apr 2017 01:24:53 -0700 (PDT) From: Alex Deymo To: sjg@chromium.org, swarren@wwwdotorg.org, u-boot@lists.denx.de, deymo@google.com Date: Sun, 2 Apr 2017 01:24:34 -0700 Message-Id: <20170402082434.32078-3-deymo@google.com> X-Mailer: git-send-email 2.12.2.564.g063fe858b8-goog In-Reply-To: <20170402082434.32078-2-deymo@google.com> References: <20170402082434.32078-1-deymo@google.com> <20170402082434.32078-2-deymo@google.com> X-Mailman-Approved-At: Tue, 04 Apr 2017 13:27:34 +0000 Subject: [U-Boot] [PATCH 2/2] mmc: sdhci: Wait for SDHCI_INT_DATA_END when transferring. 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: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" sdhci_transfer_data() function transfers the blocks passed up to the number of blocks defined in mmc_data, but returns immediately once all the blocks are transferred, even if the loop exit condition is not met (bit SDHCI_INT_DATA_END set in the STATUS word). When doing multiple writes to mmc, returning right after the last block is transferred can cause the write to fail when sending the MMC_CMD_STOP_TRANSMISSION command right after the MMC_CMD_WRITE_MULTIPLE_BLOCK command, leaving the mmc driver in an unconsistent state until reboot. This error was observed in the rpi3 board. This patch waits for the SDHCI_INT_DATA_END bit to be set even after sending all the blocks. Test: Reliably wrote 2GiB of data to mmc in a rpi3. Signed-off-by: Alex Deymo Reviewed-by: Simon Glass --- drivers/mmc/sdhci.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index c94d58db65..b745977b3f 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -72,6 +72,7 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data, unsigned int start_addr) { unsigned int stat, rdy, mask, timeout, block = 0; + bool transfer_done = false; #ifdef CONFIG_MMC_SDHCI_SDMA unsigned char ctrl; ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); @@ -89,17 +90,23 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data, __func__, stat); return -EIO; } - if (stat & rdy) { + if (!transfer_done && (stat & rdy)) { if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & mask)) continue; sdhci_writel(host, rdy, SDHCI_INT_STATUS); sdhci_transfer_pio(host, data); data->dest += data->blocksize; - if (++block >= data->blocks) - break; + if (++block >= data->blocks) { + /* Keep looping until the SDHCI_INT_DATA_END is + * cleared, even if we finished sending all the + * blocks. + */ + transfer_done = true; + continue; + } } #ifdef CONFIG_MMC_SDHCI_SDMA - if (stat & SDHCI_INT_DMA_END) { + if (!transfer_done && (stat & SDHCI_INT_DMA_END)) { sdhci_writel(host, SDHCI_INT_DMA_END, SDHCI_INT_STATUS); start_addr &= ~(SDHCI_DEFAULT_BOUNDARY_SIZE - 1); start_addr += SDHCI_DEFAULT_BOUNDARY_SIZE;