Skip to content

Commit

Permalink
mmc: bcm2835: reset host on timeout
Browse files Browse the repository at this point in the history
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: 660fc73 ("mmc: bcm2835: Add new driver for the sdhost controller.")
Signed-off-by: Michal Suchanek <[email protected]>
Signed-off-by: Stefan Wahren <[email protected]>
Acked-by: Eric Anholt <[email protected]>
Signed-off-by: Ulf Hansson <[email protected]>
  • Loading branch information
hramrach authored and storulf committed Dec 17, 2018
1 parent 74ff81e commit f6000a4
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions drivers/mmc/host/bcm2835.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,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);
}

Expand Down Expand Up @@ -826,6 +827,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);
Expand Down

0 comments on commit f6000a4

Please sign in to comment.