ar71xx: Add kernel 4.9 support
[openwrt/staging/stintel.git] / target / linux / ar71xx / patches-4.9 / 403-mtd_fix_cfi_cmdset_0002_status_check.patch
diff --git a/target/linux/ar71xx/patches-4.9/403-mtd_fix_cfi_cmdset_0002_status_check.patch b/target/linux/ar71xx/patches-4.9/403-mtd_fix_cfi_cmdset_0002_status_check.patch
new file mode 100644 (file)
index 0000000..415d835
--- /dev/null
@@ -0,0 +1,69 @@
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -1630,8 +1630,8 @@ static int __xipram do_write_oneword(str
+                       break;
+               }
+-              if (chip_ready(map, adr))
+-                      break;
++              if (chip_good(map, adr, datum))
++                      goto enable_xip;
+               /* Latency issues. Drop the lock, wait a while and retry */
+               UDELAY(map, chip, adr, 1);
+@@ -1647,6 +1647,8 @@ static int __xipram do_write_oneword(str
+               ret = -EIO;
+       }
++
++ enable_xip:
+       xip_enable(map, chip, adr);
+  op_done:
+       if (mode == FL_OTP_WRITE)
+@@ -2225,7 +2227,6 @@ static int cfi_amdstd_panic_write(struct
+       return 0;
+ }
+-
+ /*
+  * Handle devices with one erase region, that only implement
+  * the chip erase command.
+@@ -2289,8 +2290,8 @@ static int __xipram do_erase_chip(struct
+                       chip->erase_suspended = 0;
+               }
+-              if (chip_ready(map, adr))
+-                      break;
++              if (chip_good(map, adr, map_word_ff(map)))
++                      goto op_done;
+               if (time_after(jiffies, timeo)) {
+                       printk(KERN_WARNING "MTD %s(): software timeout\n",
+@@ -2310,6 +2311,7 @@ static int __xipram do_erase_chip(struct
+               ret = -EIO;
+       }
++ op_done:
+       chip->state = FL_READY;
+       xip_enable(map, chip, adr);
+       DISABLE_VPP(map);
+@@ -2378,9 +2380,9 @@ static int __xipram do_erase_oneblock(st
+                       chip->erase_suspended = 0;
+               }
+-              if (chip_ready(map, adr)) {
++              if (chip_good(map, adr, map_word_ff(map))) {
+                       xip_enable(map, chip, adr);
+-                      break;
++                      goto op_done;
+               }
+               if (time_after(jiffies, timeo)) {
+@@ -2402,6 +2404,7 @@ static int __xipram do_erase_oneblock(st
+               ret = -EIO;
+       }
++ op_done:
+       chip->state = FL_READY;
+       DISABLE_VPP(map);
+       put_chip(map, chip, adr);