From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45116C47082 for ; Sun, 23 May 2021 22:18:40 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EA5E461159 for ; Sun, 23 May 2021 22:18:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EA5E461159 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=posteo.net Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CB43A82E6A; Mon, 24 May 2021 00:18:34 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=posteo.net Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; secure) header.d=posteo.net header.i=@posteo.net header.b="evZKGbWD"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 36A0582E73; Mon, 24 May 2021 00:18:33 +0200 (CEST) Received: from mout01.posteo.de (mout01.posteo.de [185.67.36.65]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 40E6382E65 for ; Mon, 24 May 2021 00:18:30 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=posteo.net Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=daniil.stas@posteo.net Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id D0330240027 for ; Mon, 24 May 2021 00:18:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1621808309; bh=lxOaR7WUJ4c0J3rksFD6HU3ANJGFDKchUrf+1GttP00=; h=From:To:Cc:Subject:Date:From; b=evZKGbWD0arX7V55CinekpH0HgkkdRO3vCElSaC8oiE9hZQfmXXR5k/0J56FdPMNT 9lysz4Kg/x+3M1ulXJpeWj+1BXcADw9SzCloWlndofbmjvVAk9enAP0fzKPLn/6/q1 ci3+03AMYN+ezZDIAEwWH7AOzMJ4cVeVKYkUSUAkg01b9B1RxrU/vX3l0Z/RqO3mtL Q9j7QBfMWEVlaP5Yw3U+CONyW4+UWO5vaBXWbAnC+ZvAE7PeDCkYCdRFgtAm05V5lc nzzC0vhdDpsyiJrPhVwGDSb+tgNB2rLdON4lWdVmULx/QiuGoLY4Qe8eYDuU4Z/ucA y/nBNVTony3OA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4FpF9K0lT3z9rxN; Mon, 24 May 2021 00:18:29 +0200 (CEST) From: Daniil Stas To: u-boot@lists.denx.de Cc: Daniil Stas , Patrick Delaunay , Patrice Chotard Subject: [PATCH] spi: stm32_qspi: Fix short data write operation Date: Sun, 23 May 2021 22:24:49 +0000 Message-Id: <20210523222449.1495352-2-daniil.stas@posteo.net> In-Reply-To: <20210523222449.1495352-1-daniil.stas@posteo.net> References: <20210523222449.1495352-1-daniil.stas@posteo.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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" X-Virus-Scanned: clamav-milter 0.102.4 at phobos.denx.de X-Virus-Status: Clean TCF flag only means that all data was sent to FIFO. To check if the data was sent out of FIFO we should also wait for the BUSY flag to be cleared. Otherwise there is a race condition which can lead to inability to write short (one byte long) data. Signed-off-by: Daniil Stas Cc: Patrick Delaunay Cc: Patrice Chotard --- drivers/spi/stm32_qspi.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/spi/stm32_qspi.c b/drivers/spi/stm32_qspi.c index 4acc9047b9..8f4aabc3d1 100644 --- a/drivers/spi/stm32_qspi.c +++ b/drivers/spi/stm32_qspi.c @@ -148,23 +148,24 @@ static int _stm32_qspi_wait_cmd(struct stm32_qspi_priv *priv, const struct spi_mem_op *op) { u32 sr; - int ret; - - if (!op->data.nbytes) - return _stm32_qspi_wait_for_not_busy(priv); + int ret = 0; - ret = readl_poll_timeout(&priv->regs->sr, sr, - sr & STM32_QSPI_SR_TCF, - STM32_QSPI_CMD_TIMEOUT_US); - if (ret) { - log_err("cmd timeout (stat:%#x)\n", sr); - } else if (readl(&priv->regs->sr) & STM32_QSPI_SR_TEF) { - log_err("transfer error (stat:%#x)\n", sr); - ret = -EIO; + if (op->data.nbytes) { + ret = readl_poll_timeout(&priv->regs->sr, sr, + sr & STM32_QSPI_SR_TCF, + STM32_QSPI_CMD_TIMEOUT_US); + if (ret) { + log_err("cmd timeout (stat:%#x)\n", sr); + } else if (readl(&priv->regs->sr) & STM32_QSPI_SR_TEF) { + log_err("transfer error (stat:%#x)\n", sr); + ret = -EIO; + } + /* clear flags */ + writel(STM32_QSPI_FCR_CTCF | STM32_QSPI_FCR_CTEF, &priv->regs->fcr); } - /* clear flags */ - writel(STM32_QSPI_FCR_CTCF | STM32_QSPI_FCR_CTEF, &priv->regs->fcr); + if (!ret) + ret = _stm32_qspi_wait_for_not_busy(priv); return ret; } -- 2.31.0