Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp2824357pxb; Mon, 1 Nov 2021 02:34:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx5B94JP1NM7Th8cdiaCdZIZrVu2Vj011t4AcMvO5D4xwXU1rCARVEAsFrXa1fEcLwwsLxL X-Received: by 2002:a05:6402:4245:: with SMTP id g5mr40536284edb.64.1635759291332; Mon, 01 Nov 2021 02:34:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635759291; cv=none; d=google.com; s=arc-20160816; b=p3rElhd6Ecl5GSSfUuaTFurVF2/STk8bfiL6R3VQoJMKKFvDxSfnygkiONbyna9NyI iG22V1WhuOHpWiJU4TmRXQskIaOkgaLHjFdbjheS6GRJ82DDvs+hcspii9auddF2Mpxf M7LAjqLu25vT8/Fshrexpt57PDE/pdLpiAaFrQ2W0zb/mOyqJimWNEGEW5+/gfJcIfD8 wi468lL1Mh8aABB/Y5ouSoyC6kFtvdNqEg3XEgnMxORrILMAnQMjd3PpGR6mv5yEUAgf ij+RQ0YjtC/0JtbO7kDU0WtqP26E/q2/NjnGqM8SD4v4byp+FTKbuo6m5epo50Fkhf37 oy6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=pmaI++BBpl7zvwMHfjpFePnlRCvND1LR5HADSVeqYFs=; b=zJ2UKYEdE6fkxTo2zAz1/XCDPecu71UX9POcZsYXtS8zU88LpltuTrbdZltzayUGDT B+HakYMkVEvSCREL9LAFFHgd2O3j6U/rXg4Rdf5oYEf4lmzlKygukjmIzyVCs4GS2jzE GmIXBYrREX7EapdVVTGS2JzuUUgqwQcpNXRewsmKu07Puhmbc/9W7eg80IUuoW/0cVlj uZVS94V3m9y1rego9eXY3T7UDotV56Wt56pcdWq6fjTCfPvRoxfWqrCIlLX+0iuf7DGP jpstv906LVhgtH6Hed5hsGB34/tgUGic6tbbRrCP8WkihhzJOUmw7WF2xBGmcDsaqK6X lBcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=AojKr87m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a1si18404796edx.506.2021.11.01.02.34.27; Mon, 01 Nov 2021 02:34:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=AojKr87m; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231830AbhKAJc5 (ORCPT + 99 others); Mon, 1 Nov 2021 05:32:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:37006 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232583AbhKAJaM (ORCPT ); Mon, 1 Nov 2021 05:30:12 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5D3F961214; Mon, 1 Nov 2021 09:23:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1635758613; bh=eCQRd3ZL0WHiRsKpA6Ixl+nEBE0TOxsOBsLvd7cc/Fo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AojKr87mMsrdnWCb+9qAtbTOURHEuXhjSZzNaGYQiLOzMtLpXvpTkFtnnJaV260+H l1GTGheZwOiGZWDXzfBEZyUp928o27CdQyUyCuQrEqFtCY2jBQ94F+NiYZHL3DjMt2 onjt8WwGNeSUWmwYYWMfk1esWE7Jl593HQ6kgIOE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Haibo Chen , Adrian Hunter , Ulf Hansson Subject: [PATCH 5.4 19/51] mmc: sdhci-esdhc-imx: clear the buffer_read_ready to reset standard tuning circuit Date: Mon, 1 Nov 2021 10:17:23 +0100 Message-Id: <20211101082504.980349230@linuxfoundation.org> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211101082500.203657870@linuxfoundation.org> References: <20211101082500.203657870@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Haibo Chen commit 9af372dc70e9fdcbb70939dac75365e7b88580b4 upstream. To reset standard tuning circuit completely, after clear ESDHC_MIX_CTRL_EXE_TUNE, also need to clear bit buffer_read_ready, this operation will finally clear the USDHC IP internal logic flag execute_tuning_with_clr_buf, make sure the following normal data transfer will not be impacted by standard tuning logic used before. Find this issue when do quick SD card insert/remove stress test. During standard tuning prodedure, if remove SD card, USDHC standard tuning logic can't clear the internal flag execute_tuning_with_clr_buf. Next time when insert SD card, all data related commands can't get any data related interrupts, include data transfer complete interrupt, data timeout interrupt, data CRC interrupt, data end bit interrupt. Always trigger software timeout issue. Even reset the USDHC through bits in register SYS_CTRL (0x2C, bit28 reset tuning, bit26 reset data, bit 25 reset command, bit 24 reset all) can't recover this. From the user's point of view, USDHC stuck, SD can't be recognized any more. Fixes: d9370424c948 ("mmc: sdhci-esdhc-imx: reset tuning circuit when power on mmc card") Signed-off-by: Haibo Chen Acked-by: Adrian Hunter Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/1634263236-6111-1-git-send-email-haibo.chen@nxp.com Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/sdhci-esdhc-imx.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -1022,6 +1022,7 @@ static void esdhc_reset_tuning(struct sd struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host); u32 ctrl; + int ret; /* Reset the tuning circuit */ if (esdhc_is_usdhc(imx_data)) { @@ -1034,7 +1035,22 @@ static void esdhc_reset_tuning(struct sd } else if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) { ctrl = readl(host->ioaddr + SDHCI_AUTO_CMD_STATUS); ctrl &= ~ESDHC_MIX_CTRL_SMPCLK_SEL; + ctrl &= ~ESDHC_MIX_CTRL_EXE_TUNE; writel(ctrl, host->ioaddr + SDHCI_AUTO_CMD_STATUS); + /* Make sure ESDHC_MIX_CTRL_EXE_TUNE cleared */ + ret = readl_poll_timeout(host->ioaddr + SDHCI_AUTO_CMD_STATUS, + ctrl, !(ctrl & ESDHC_MIX_CTRL_EXE_TUNE), 1, 50); + if (ret == -ETIMEDOUT) + dev_warn(mmc_dev(host->mmc), + "Warning! clear execute tuning bit failed\n"); + /* + * SDHCI_INT_DATA_AVAIL is W1C bit, set this bit will clear the + * usdhc IP internal logic flag execute_tuning_with_clr_buf, which + * will finally make sure the normal data transfer logic correct. + */ + ctrl = readl(host->ioaddr + SDHCI_INT_STATUS); + ctrl |= SDHCI_INT_DATA_AVAIL; + writel(ctrl, host->ioaddr + SDHCI_INT_STATUS); } } }