| From ba2d139b02ba684c6c101de42fed782d6cd2b997 Mon Sep 17 00:00:00 2001 |
| From: Douglas Anderson <dianders@chromium.org> |
| Date: Mon, 8 Jul 2019 12:56:13 -0700 |
| Subject: mmc: dw_mmc: Fix occasional hang after tuning on eMMC |
| |
| From: Douglas Anderson <dianders@chromium.org> |
| |
| commit ba2d139b02ba684c6c101de42fed782d6cd2b997 upstream. |
| |
| In commit 46d179525a1f ("mmc: dw_mmc: Wait for data transfer after |
| response errors.") we fixed a tuning-induced hang that I saw when |
| stress testing tuning on certain SD cards. I won't re-hash that whole |
| commit, but the summary is that as a normal part of tuning you need to |
| deal with transfer errors and there were cases where these transfer |
| errors was putting my system into a bad state causing all future |
| transfers to fail. That commit fixed handling of the transfer errors |
| for me. |
| |
| In downstream Chrome OS my fix landed and had the same behavior for |
| all SD/MMC commands. However, it looks like when the commit landed |
| upstream we limited it to only SD tuning commands. Presumably this |
| was to try to get around problems that Alim Akhtar reported on exynos |
| [1]. |
| |
| Unfortunately while stress testing reboots (and suspend/resume) on |
| some rk3288-based Chromebooks I found the same problem on the eMMC on |
| some of my Chromebooks (the ones with Hynix eMMC). Since the eMMC |
| tuning command is different (MMC_SEND_TUNING_BLOCK_HS200 |
| vs. MMC_SEND_TUNING_BLOCK) we were basically getting back into the |
| same situation. |
| |
| I'm hoping that whatever problems exynos was having in the past are |
| somehow magically fixed now and we can make the behavior the same for |
| all commands. |
| |
| [1] https://lkml.kernel.org/r/CAGOxZ53WfNbaMe0_AM0qBqU47kAfgmPBVZC8K8Y-_J3mDMqW4A@mail.gmail.com |
| |
| Fixes: 46d179525a1f ("mmc: dw_mmc: Wait for data transfer after response errors.") |
| Signed-off-by: Douglas Anderson <dianders@chromium.org> |
| Cc: Marek Szyprowski <m.szyprowski@samsung.com> |
| Cc: Alim Akhtar <alim.akhtar@gmail.com> |
| Cc: Enric Balletbo i Serra <enric.balletbo@collabora.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/dw_mmc.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/mmc/host/dw_mmc.c |
| +++ b/drivers/mmc/host/dw_mmc.c |
| @@ -1864,8 +1864,7 @@ static void dw_mci_tasklet_func(unsigned |
| * delayed. Allowing the transfer to take place |
| * avoids races and keeps things simple. |
| */ |
| - if ((err != -ETIMEDOUT) && |
| - (cmd->opcode == MMC_SEND_TUNING_BLOCK)) { |
| + if (err != -ETIMEDOUT) { |
| state = STATE_SENDING_DATA; |
| continue; |
| } |