| From 51b72656bb39fdcb8f3174f4007bcc83ad1d275f Mon Sep 17 00:00:00 2001 |
| From: Takeshi Saito <takeshi.saito.xv@renesas.com> |
| Date: Wed, 15 May 2019 20:23:46 +0200 |
| Subject: mmc: tmio: fix SCC error handling to avoid false positive CRC error |
| |
| From: Takeshi Saito <takeshi.saito.xv@renesas.com> |
| |
| commit 51b72656bb39fdcb8f3174f4007bcc83ad1d275f upstream. |
| |
| If an SCC error occurs during a read/write command execution, a false |
| positive CRC error message is output. |
| |
| mmcblk0: response CRC error sending r/w cmd command, card status 0x900 |
| |
| check_scc_error() checks SCC_RVSREQ.RVSERR bit. RVSERR detects a |
| correction error in the next (up or down) delay tap position. However, |
| since the command is successful, only retuning needs to be executed. |
| This has been confirmed by HW engineers. |
| |
| Thus, on SCC error, set retuning flag instead of setting an error code. |
| |
| Fixes: b85fb0a1c8ae ("mmc: tmio: Fix SCC error detection") |
| Signed-off-by: Takeshi Saito <takeshi.saito.xv@renesas.com> |
| [wsa: updated comment and commit message, removed some braces] |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Reviewed-by: Simon Horman <horms+renesas@verge.net.au> |
| Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mmc/host/tmio_mmc_core.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/mmc/host/tmio_mmc_core.c |
| +++ b/drivers/mmc/host/tmio_mmc_core.c |
| @@ -842,8 +842,9 @@ static void tmio_mmc_finish_request(stru |
| if (mrq->cmd->error || (mrq->data && mrq->data->error)) |
| tmio_mmc_abort_dma(host); |
| |
| + /* SCC error means retune, but executed command was still successful */ |
| if (host->check_scc_error && host->check_scc_error(host)) |
| - mrq->cmd->error = -EILSEQ; |
| + mmc_retune_needed(host->mmc); |
| |
| /* If SET_BLOCK_COUNT, continue with main command */ |
| if (host->mrq && !mrq->cmd->error) { |