aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorMichal Suchanek <hramrach@gmail.com>2016-05-05 20:31:55 -0400
committerBrian Norris <computersforpeace@gmail.com>2016-06-01 20:23:02 -0400
commit26f9bcad29a6c240881bd4efc90f16a9990dd6c2 (patch)
tree957d294b0b1c4ec2e56f686a8e99837fe7d20216 /drivers/mtd
parente5d05cbd6d8b01f08c95c427a36c66aac769af4f (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.c25
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; 1052read_err:
1041 return 0; 1053 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
1054 return ret;
1042} 1055}
1043 1056
1044static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, 1057static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,