layerscape: add 64b/32b target for ls1012ardb device
[openwrt/openwrt.git] / target / linux / layerscape / patches-4.4 / 1096-mtd-spi-nor-add-read-loop.patch
diff --git a/target/linux/layerscape/patches-4.4/1096-mtd-spi-nor-add-read-loop.patch b/target/linux/layerscape/patches-4.4/1096-mtd-spi-nor-add-read-loop.patch
new file mode 100644 (file)
index 0000000..db557e9
--- /dev/null
@@ -0,0 +1,46 @@
+From b5929f91416d64afacf46c649f38cc8f0eea50d2 Mon Sep 17 00:00:00 2001
+From: Michal Suchanek <hramrach@gmail.com>
+Date: Wed, 2 Dec 2015 10:38:20 +0000
+Subject: [PATCH 096/113] mtd: spi-nor: add read loop
+
+mtdblock and ubi do not handle the situation when read returns less data
+than requested. Loop in spi-nor until buffer is filled or an error is
+returned.
+
+Signed-off-by: Michal Suchanek <hramrach@gmail.com>
+Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@freescale.com>
+---
+ drivers/mtd/spi-nor/spi-nor.c |   20 ++++++++++++++------
+ 1 file changed, 14 insertions(+), 6 deletions(-)
+
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -919,14 +919,22 @@ static int spi_nor_read(struct mtd_info
+       if (ret)
+               return ret;
+-      ret = nor->read(nor, from, len, buf);
++      while (len) {
++              ret = nor->read(nor, from, len, buf);
++              if (ret <= 0)
++                      goto read_err;
+-      spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
+-      if (ret < 0)
+-              return ret;
++              WARN_ON(ret > len);
++              *retlen += ret;
++              buf += ret;
++              from += ret;
++              len -= ret;
++      }
++      ret = 0;
+-      *retlen += ret;
+-      return 0;
++read_err:
++      spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
++      return ret;
+ }
+ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,