Skip to content

Commit

Permalink
mmc: bcm2835-host: Fix wait_transfer_complete
Browse files Browse the repository at this point in the history
Function bcm_2835_wait_transfer_complete() is not waiting long enough.
The previous code was claiming to wait for ~1 seconds, but as it depends
on register reads it's time actually varies.
Some cards require wait times of up to ~56 ms to perform
the command 'saveenv' on an EXT4 partition.

Re-implement the loop exit condition to use get_timer() which allows
to specify the wait time in more reliable manner. Set the maximum wait
time to the originally intended 1 second.

Signed-off by: Raul Benet <raul.benet_at_kaptivo.com>
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
  • Loading branch information
Raul Benet authored and mbgg committed Sep 6, 2019
1 parent 4982244 commit b112580
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/mmc/bcm2835_sdhost.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ static void bcm2835_reset_internal(struct bcm2835_host *host)

static int bcm2835_wait_transfer_complete(struct bcm2835_host *host)
{
int timediff = 0;
ulong tstart_ms = get_timer(0);

while (1) {
u32 edm, fsm;
Expand All @@ -254,11 +254,13 @@ static int bcm2835_wait_transfer_complete(struct bcm2835_host *host)
break;
}

/* Error out after 100000 register reads (~1s) */
if (timediff++ == 100000) {
/* Error out after ~1s */
ulong tlapse_ms = get_timer(tstart_ms);
if ( tlapse_ms > 1000 /* ms */ ) {

dev_err(host->dev,
"wait_transfer_complete - still waiting after %d retries\n",
timediff);
"wait_transfer_complete - still waiting after %lu ms\n",
tlapse_ms);
bcm2835_dumpregs(host);
return -ETIMEDOUT;
}
Expand Down

0 comments on commit b112580

Please sign in to comment.