662c73ada9ac97d2033796b82437db0bff6a1192
[openwrt/openwrt.git] / target / linux / brcm63xx / patches-4.4 / 000-4.8-09-mtd-spi-nor-add-read-loop.patch
1 From 26f9bcad29a6c240881bd4efc90f16a9990dd6c2 Mon Sep 17 00:00:00 2001
2 From: Michal Suchanek <hramrach@gmail.com>
3 Date: Thu, 5 May 2016 17:31:55 -0700
4 Subject: [PATCH 09/10] mtd: spi-nor: add read loop
5
6 mtdblock and ubi do not handle the situation when read returns less data
7 than requested. Loop in spi-nor until buffer is filled or an error is
8 returned.
9
10 Signed-off-by: Michal Suchanek <hramrach@gmail.com>
11 Signed-off-by: Brian Norris <computersforpeace@gmail.com>
12 Tested-by Cyrille Pitchen <cyrille.pitchen@atmel.com>
13 Acked-by: Michal Suchanek <hramrach@gmail.com>
14 Tested-by: Michal Suchanek <hramrach@gmail.com>
15 ---
16 drivers/mtd/spi-nor/spi-nor.c | 25 +++++++++++++++++++------
17 1 file changed, 19 insertions(+), 6 deletions(-)
18
19 --- a/drivers/mtd/spi-nor/spi-nor.c
20 +++ b/drivers/mtd/spi-nor/spi-nor.c
21 @@ -890,14 +890,27 @@ static int spi_nor_read(struct mtd_info
22 if (ret)
23 return ret;
24
25 - ret = nor->read(nor, from, len, buf);
26 + while (len) {
27 + ret = nor->read(nor, from, len, buf);
28 + if (ret == 0) {
29 + /* We shouldn't see 0-length reads */
30 + ret = -EIO;
31 + goto read_err;
32 + }
33 + if (ret < 0)
34 + goto read_err;
35
36 - spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
37 - if (ret < 0)
38 - return ret;
39 + WARN_ON(ret > len);
40 + *retlen += ret;
41 + buf += ret;
42 + from += ret;
43 + len -= ret;
44 + }
45 + ret = 0;
46
47 - *retlen += ret;
48 - return 0;
49 +read_err:
50 + spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
51 + return ret;
52 }
53
54 static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,