diff options
author | Michal Suchanek <hramrach@gmail.com> | 2016-05-05 17:31:52 -0700 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2016-06-01 17:22:46 -0700 |
commit | 0bad7b9304d543dd7627f4cd564aea5d7338b950 (patch) | |
tree | 482740397ef86cbcee68ffba8beb544a4ae65ab1 | |
parent | bc418cd2652f47a327e27f978caa3d85f9558b09 (diff) | |
download | blackbird-op-linux-0bad7b9304d543dd7627f4cd564aea5d7338b950.tar.gz blackbird-op-linux-0bad7b9304d543dd7627f4cd564aea5d7338b950.zip |
mtd: spi-nor: check return value from write
SPI NOR hardware drivers now return useful value from their write
functions so check them.
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>
-rw-r--r-- | drivers/mtd/spi-nor/spi-nor.c | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 6c92b9524c8b..f204d29d1139 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -1063,10 +1063,14 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, nor->program_opcode = SPINOR_OP_BP; /* write one byte. */ - nor->write(nor, to, 1, retlen, buf); + ret = nor->write(nor, to, 1, retlen, buf); + if (ret < 0) + goto sst_write_err; + WARN(ret != 1, "While writing 1 byte written %i bytes\n", + (int)ret); ret = spi_nor_wait_till_ready(nor); if (ret) - goto time_out; + goto sst_write_err; } to += actual; @@ -1075,10 +1079,14 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, nor->program_opcode = SPINOR_OP_AAI_WP; /* write two bytes. */ - nor->write(nor, to, 2, retlen, buf + actual); + ret = nor->write(nor, to, 2, retlen, buf + actual); + if (ret < 0) + goto sst_write_err; + WARN(ret != 2, "While writing 2 bytes written %i bytes\n", + (int)ret); ret = spi_nor_wait_till_ready(nor); if (ret) - goto time_out; + goto sst_write_err; to += 2; nor->sst_write_second = true; } @@ -1087,21 +1095,24 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, write_disable(nor); ret = spi_nor_wait_till_ready(nor); if (ret) - goto time_out; + goto sst_write_err; /* Write out trailing byte if it exists. */ if (actual != len) { write_enable(nor); nor->program_opcode = SPINOR_OP_BP; - nor->write(nor, to, 1, retlen, buf + actual); - + ret = nor->write(nor, to, 1, retlen, buf + actual); + if (ret < 0) + goto sst_write_err; + WARN(ret != 1, "While writing 1 byte written %i bytes\n", + (int)ret); ret = spi_nor_wait_till_ready(nor); if (ret) - goto time_out; + goto sst_write_err; write_disable(nor); } -time_out: +sst_write_err: spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); return ret; } @@ -1130,14 +1141,18 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len, /* do all the bytes fit onto one page? */ if (page_offset + len <= nor->page_size) { - nor->write(nor, to, len, retlen, buf); + ret = nor->write(nor, to, len, retlen, buf); + if (ret < 0) + goto write_err; } else { /* the size of data remaining on the first page */ page_size = nor->page_size - page_offset; - nor->write(nor, to, page_size, retlen, buf); + ret = nor->write(nor, to, page_size, retlen, buf); + if (ret < 0) + goto write_err; /* write everything in nor->page_size chunks */ - for (i = page_size; i < len; i += page_size) { + for (i = ret; i < len; ) { page_size = len - i; if (page_size > nor->page_size) page_size = nor->page_size; @@ -1148,7 +1163,11 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len, write_enable(nor); - nor->write(nor, to + i, page_size, retlen, buf + i); + ret = nor->write(nor, to + i, page_size, retlen, + buf + i); + if (ret < 0) + goto write_err; + i += ret; } } |