| From b4591640fb834e3a9717b3972c8cca5e8889b97b Mon Sep 17 00:00:00 2001 |
| From: Michal Suchanek <msuchanek@suse.de> |
| Date: Sun, 11 Nov 2018 21:23:53 +0100 |
| Subject: mmc: bcm2835: reset host on timeout |
| |
| [ Upstream commit f6000a4eb34e6462bc0dd39809c1bb99f9633269 ] |
| |
| The bcm2835 mmc host tends to lock up for unknown reason so reset it on |
| timeout. The upper mmc block layer tries retransimitting with single |
| blocks which tends to work out after a long wait. |
| |
| This is better than giving up and leaving the machine broken for no |
| obvious reason. |
| |
| Fixes: 660fc733bd74 ("mmc: bcm2835: Add new driver for the sdhost controller.") |
| Signed-off-by: Michal Suchanek <msuchanek@suse.de> |
| Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> |
| Acked-by: Eric Anholt <eric@anholt.net> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mmc/host/bcm2835.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c |
| index abf1f3c8b0c3..5301302fb531 100644 |
| --- a/drivers/mmc/host/bcm2835.c |
| +++ b/drivers/mmc/host/bcm2835.c |
| @@ -286,6 +286,7 @@ static void bcm2835_reset(struct mmc_host *mmc) |
| |
| if (host->dma_chan) |
| dmaengine_terminate_sync(host->dma_chan); |
| + host->dma_chan = NULL; |
| bcm2835_reset_internal(host); |
| } |
| |
| @@ -846,6 +847,8 @@ static void bcm2835_timeout(struct work_struct *work) |
| dev_err(dev, "timeout waiting for hardware interrupt.\n"); |
| bcm2835_dumpregs(host); |
| |
| + bcm2835_reset(host->mmc); |
| + |
| if (host->data) { |
| host->data->error = -ETIMEDOUT; |
| bcm2835_finish_data(host); |
| -- |
| 2.19.1 |
| |