]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mtd: spi-nor: Fix retlen handling in sst_write()
authorTudor Ambarus <tudor.ambarus@microchip.com>
Fri, 25 Oct 2019 07:36:16 +0000 (10:36 +0300)
committerTudor Ambarus <tudor.ambarus@microchip.com>
Fri, 1 Nov 2019 08:20:44 +0000 (10:20 +0200)
In case the write of the first byte failed, retlen was incorrectly
incremented to *retlen += actual; on the exit path. retlen should be
incremented when actual data was written to the flash.

Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
drivers/mtd/spi-nor/spi-nor.c

index 3e58650967244b0a0b699352072af4cbb7bd4dc3..2012883dbbff445b1bf46a3e68d16f99d2324fba 100644 (file)
@@ -2584,7 +2584,7 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
                size_t *retlen, const u_char *buf)
 {
        struct spi_nor *nor = mtd_to_spi_nor(mtd);
-       size_t actual;
+       size_t actual = 0;
        int ret;
 
        dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len);
@@ -2597,9 +2597,8 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
 
        nor->sst_write_second = false;
 
-       actual = to % 2;
        /* Start write from odd address. */
-       if (actual) {
+       if (to % 2) {
                nor->program_opcode = SPINOR_OP_BP;
 
                /* write one byte. */
@@ -2610,8 +2609,10 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
                ret = spi_nor_wait_till_ready(nor);
                if (ret)
                        goto sst_write_err;
+
+               to++;
+               actual++;
        }
-       to += actual;
 
        /* Write out most of the data here. */
        for (; actual < len - 1; actual += 2) {