
Hi Ashish,
Hi Vignesh
Is this taken care now, plain text version was posted here http://patchwork.ozlabs.org/patch/1090121/
A similar patch[1] was proposed in meantime which has been merged to mainline U-Boot. So this issue must now be resolved. Let me know if the issue still persists.
[1] commit 60e2bf46784ebbd30ff29b3d3c7c97e56b11e86a Author: Weijie Gao weijie.gao@mediatek.com Date: Fri Apr 26 17:22:19 2019 +0800
mtd: spi-nor: fix page program issue when using spi-mem driver
Regards Ashish
drivers/mtd/spi/spi-nor-core.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-)
diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c index c4e2f6a08f..8e754d445d 100644 --- a/drivers/mtd/spi/spi-nor-core.c +++ b/drivers/mtd/spi/spi-nor-core.c @@ -116,7 +116,6 @@ static ssize_t spi_nor_write_data(struct spi_nor
*nor, loff_t to, size_t len,
SPI_MEM_OP_ADDR(nor->addr_width, to, 1), SPI_MEM_OP_NO_DUMMY, SPI_MEM_OP_DATA_OUT(len, buf, 1));
size_t remaining = len; int ret; /* get transfer protocols. */
@@ -127,22 +126,19 @@ static ssize_t spi_nor_write_data(struct spi_nor
*nor, loff_t to, size_t len,
if (nor->program_opcode == SPINOR_OP_AAI_WP && nor-
sst_write_second) op.addr.nbytes = 0;
while (remaining) {
op.data.nbytes = remaining < UINT_MAX ? remaining : UINT_MAX;
ret = spi_mem_adjust_op_size(nor->spi, &op);
if (ret)
return ret;
op.data.nbytes = len < UINT_MAX ? len : UINT_MAX;
ret = spi_mem_adjust_op_size(nor->spi, &op);
if (ret)
return ret;
ret = spi_mem_exec_op(nor->spi, &op);
if (ret)
return ret;
ret = spi_mem_exec_op(nor->spi, &op);
if (ret)
return ret;
op.addr.val += op.data.nbytes;
remaining -= op.data.nbytes;
op.data.buf.out += op.data.nbytes;
}
op.addr.val += op.data.nbytes;
op.data.buf.out += op.data.nbytes;
return len;
return op.data.nbytes;
}
/*
@@ -1101,10 +1097,6 @@ static int spi_nor_write(struct mtd_info *mtd,
loff_t to, size_t len,
goto write_err; *retlen += written; i += written;
if (written != page_remain) {
ret = -EIO;
goto write_err;
} }
write_err: