]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mmc: bcm2835: reset host on timeout
authorMichal Suchanek <msuchanek@suse.de>
Sun, 11 Nov 2018 20:23:53 +0000 (21:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Feb 2019 18:46:04 +0000 (19:46 +0100)
[ 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

index abf1f3c8b0c30782535d8fefc9204fa4770f56c7..5301302fb53108641c16a5c7691f96efaa1b28f1 100644 (file)
@@ -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);