mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
mmc: bcm2835: reset host on timeout
[ Upstream commitf6000a4eb3] 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:660fc733bd("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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b84daf000c
commit
f569566a1f
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user