mtd: docg4: fix status polling loop
authorMike Dunn <mikedunn@newsguy.com>
Thu, 10 Oct 2013 17:25:27 +0000 (10:25 -0700)
committerBrian Norris <computersforpeace@gmail.com>
Thu, 7 Nov 2013 07:32:52 +0000 (23:32 -0800)
The loop that polls the status register waiting for an operation to complete
foolishly bases the timeout simply on the number of loop iterations that have
ocurred.  When I increased the processor clock speed, timeouts started to appear
for long block erasure operations.  This patch measures the timeout using
jiffies.

Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/nand/docg4.c

index 7c38b8ad4404407650b1290b6dbff894f352547a..bd1cb672034fe770d2db2b986caa1821c1f63f58 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/mtd/nand.h>
 #include <linux/bch.h>
 #include <linux/bitrev.h>
+#include <linux/jiffies.h>
 
 /*
  * In "reliable mode" consecutive 2k pages are used in parallel (in some
@@ -269,7 +270,7 @@ static int poll_status(struct docg4_priv *doc)
         */
 
        uint16_t flash_status;
-       unsigned int timeo;
+       unsigned long timeo;
        void __iomem *docptr = doc->virtadr;
 
        dev_dbg(doc->dev, "%s...\n", __func__);
@@ -277,22 +278,18 @@ static int poll_status(struct docg4_priv *doc)
        /* hardware quirk requires reading twice initially */
        flash_status = readw(docptr + DOC_FLASHCONTROL);
 
-       timeo = 1000;
+       timeo = jiffies + msecs_to_jiffies(200); /* generous timeout */
        do {
                cpu_relax();
                flash_status = readb(docptr + DOC_FLASHCONTROL);
-       } while (!(flash_status & DOC_CTRL_FLASHREADY) && --timeo);
+       } while (!(flash_status & DOC_CTRL_FLASHREADY) &&
+                time_before(jiffies, timeo));
 
-
-       if (!timeo) {
+       if (unlikely(!(flash_status & DOC_CTRL_FLASHREADY))) {
                dev_err(doc->dev, "%s: timed out!\n", __func__);
                return NAND_STATUS_FAIL;
        }
 
-       if (unlikely(timeo < 50))
-               dev_warn(doc->dev, "%s: nearly timed out; %d remaining\n",
-                        __func__, timeo);
-
        return 0;
 }