diff options
author | Michal Suchanek <hramrach@gmail.com> | 2016-05-05 20:31:55 -0400 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2016-06-01 20:23:02 -0400 |
commit | 26f9bcad29a6c240881bd4efc90f16a9990dd6c2 (patch) | |
tree | 957d294b0b1c4ec2e56f686a8e99837fe7d20216 /drivers/mtd | |
parent | e5d05cbd6d8b01f08c95c427a36c66aac769af4f (diff) |
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: Brian Norris <computersforpeace@gmail.com>
Tested-by Cyrille Pitchen <cyrille.pitchen@atmel.com>
Acked-by: Michal Suchanek <hramrach@gmail.com>
Tested-by: Michal Suchanek <hramrach@gmail.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/spi-nor/spi-nor.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index fe55b48be5b3..a63922ed6385 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c | |||
@@ -1031,14 +1031,27 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len, | |||
1031 | if (ret) | 1031 | if (ret) |
1032 | return ret; | 1032 | return ret; |
1033 | 1033 | ||
1034 | ret = nor->read(nor, from, len, buf); | 1034 | while (len) { |
1035 | ret = nor->read(nor, from, len, buf); | ||
1036 | if (ret == 0) { | ||
1037 | /* We shouldn't see 0-length reads */ | ||
1038 | ret = -EIO; | ||
1039 | goto read_err; | ||
1040 | } | ||
1041 | if (ret < 0) | ||
1042 | goto read_err; | ||
1035 | 1043 | ||
1036 | spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); | 1044 | WARN_ON(ret > len); |
1037 | if (ret < 0) | 1045 | *retlen += ret; |
1038 | return ret; | 1046 | buf += ret; |
1047 | from += ret; | ||
1048 | len -= ret; | ||
1049 | } | ||
1050 | ret = 0; | ||
1039 | 1051 | ||
1040 | *retlen += ret; | 1052 | read_err: |
1041 | return 0; | 1053 | spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); |
1054 | return ret; | ||
1042 | } | 1055 | } |
1043 | 1056 | ||
1044 | static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, | 1057 | static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, |