| From 06c238db53c5a3e926c248c7817c3041e7cf36a0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 16 Jul 2024 09:37:04 +0800 |
| Subject: mmc: mtk-sd: receive cmd8 data when hs400 tuning fail |
| |
| From: Mengqi Zhang <mengqi.zhang@mediatek.com> |
| |
| [ Upstream commit 9374ae912dbb1eed8139ed75fd2c0f1b30ca454d ] |
| |
| When we use cmd8 as the tuning command in hs400 mode, the command |
| response sent back by some eMMC devices cannot be correctly sampled |
| by MTK eMMC controller at some weak sample timing. In this case, |
| command timeout error may occur. So we must receive the following |
| data to make sure the next cmd8 send correctly. |
| |
| Signed-off-by: Mengqi Zhang <mengqi.zhang@mediatek.com> |
| Fixes: c4ac38c6539b ("mmc: mtk-sd: Add HS400 online tuning support") |
| Cc: stable@vger.stable.com |
| Link: https://lore.kernel.org/r/20240716013704.10578-1-mengqi.zhang@mediatek.com |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mmc/host/mtk-sd.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c |
| index efd2af2d36862..ba18e9fa64b15 100644 |
| --- a/drivers/mmc/host/mtk-sd.c |
| +++ b/drivers/mmc/host/mtk-sd.c |
| @@ -1206,7 +1206,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, |
| } |
| |
| if (!sbc_error && !(events & MSDC_INT_CMDRDY)) { |
| - if (events & MSDC_INT_CMDTMO || |
| + if ((events & MSDC_INT_CMDTMO && !host->hs400_tuning) || |
| (!mmc_op_tuning(cmd->opcode) && !host->hs400_tuning)) |
| /* |
| * should not clear fifo/interrupt as the tune data |
| @@ -1299,9 +1299,9 @@ static void msdc_start_command(struct msdc_host *host, |
| static void msdc_cmd_next(struct msdc_host *host, |
| struct mmc_request *mrq, struct mmc_command *cmd) |
| { |
| - if ((cmd->error && |
| - !(cmd->error == -EILSEQ && |
| - (mmc_op_tuning(cmd->opcode) || host->hs400_tuning))) || |
| + if ((cmd->error && !host->hs400_tuning && |
| + !(cmd->error == -EILSEQ && |
| + mmc_op_tuning(cmd->opcode))) || |
| (mrq->sbc && mrq->sbc->error)) |
| msdc_request_done(host, mrq); |
| else if (cmd == mrq->sbc) |
| -- |
| 2.43.0 |
| |