mmc: bcm2835-host: Fix wait_transfer_complete
authorRaul Benet <raul.benet@kaptivo.com>
Thu, 13 Jun 2019 13:59:57 +0000 (14:59 +0100)
committerMatthias Brugger <mbrugger@suse.com>
Fri, 6 Sep 2019 16:16:59 +0000 (18:16 +0200)
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>
drivers/mmc/bcm2835_sdhost.c

index 1ce019a..7f70aca 100644 (file)
@@ -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;
@@ -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;
                }