OSDN Git Service

mtd: spi-nor: improve wait-till-ready timeout loop
authorBrian Norris <computersforpeace@gmail.com>
Wed, 5 Nov 2014 10:32:03 +0000 (02:32 -0800)
committerBrian Norris <computersforpeace@gmail.com>
Wed, 26 Nov 2014 06:51:23 +0000 (22:51 -0800)
There are a few small issues with the timeout loop in
spi_nor_wait_till_ready():

 * The first operation should not be a reschedule; we should check the
   status register at least once to see if we're complete!

 * We should check the status register one last time after declaring the
   deadline has passed, to prevent a premature timeout error (this is
   theoretically possible if we sleep for a long time after the previous
   status register check).

 * Add an error message, so it's obvious if we ever hit a timeout.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Acked-by: Huang Shijie <shijie.huang@intel.com>
Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
drivers/mtd/spi-nor/spi-nor.c

index eafaeeb..2bda622 100644 (file)
@@ -202,19 +202,24 @@ static int spi_nor_ready(struct spi_nor *nor)
 static int spi_nor_wait_till_ready(struct spi_nor *nor)
 {
        unsigned long deadline;
-       int ret;
+       int timeout = 0, ret;
 
        deadline = jiffies + MAX_READY_WAIT_JIFFIES;
 
-       do {
-               cond_resched();
+       while (!timeout) {
+               if (time_after_eq(jiffies, deadline))
+                       timeout = 1;
 
                ret = spi_nor_ready(nor);
                if (ret < 0)
                        return ret;
                if (ret)
                        return 0;
-       } while (!time_after_eq(jiffies, deadline));
+
+               cond_resched();
+       }
+
+       dev_err(nor->dev, "flash operation timed out\n");
 
        return -ETIMEDOUT;
 }