Hi, +Jagan
On 26/04/19 2:52 PM, Weijie Gao wrote: > Some SPI controllers can't write nor->page_size bytes in a single step > because their TX FIFO is too small, but when that happens we should > make sure a WRITE_EN command before each write access and READ_SR command > after each write access is issued. > > We should allow nor->write() to return a size that is smaller than the > requested write size to gracefully handle this case. > > Also, the spi_nor_write_data() should return the actual number of bytes > that were written during the spi_mem_exec_op() operation. > > This patch is a combination of two commits backported from kernel: > > commit 630d6bd8a3b4 ("mtd: spi-nor: Support controllers with limit ...") > commit 3baa8ec88c2f ("mtd: devices: m25p80: Make sure WRITE_EN is ...") > > Cc: Vignesh R <vigne...@ti.com> > Signed-off-by: Weijie Gao <weijie....@mediatek.com> Thanks for the patch. Acked-by: Vignesh R <vigne...@ti.com> Jagan This patch fixes a regression wrt writing to flash on two platforms. Could you consider queuing this patch for next -rc? Regards Vignesh > --- > drivers/mtd/spi/spi-nor-core.c | 27 ++++++++------------------- > 1 file changed, 8 insertions(+), 19 deletions(-) > > diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c > index c4e2f6a..1acff74 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,16 @@ 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; > - > - ret = spi_mem_exec_op(nor->spi, &op); > - if (ret) > - return ret; > + ret = spi_mem_adjust_op_size(nor->spi, &op); > + if (ret) > + return ret; > + op.data.nbytes = len < op.data.nbytes ? len : op.data.nbytes; > > - op.addr.val += op.data.nbytes; > - remaining -= op.data.nbytes; > - op.data.buf.out += op.data.nbytes; > - } > + ret = spi_mem_exec_op(nor->spi, &op); > + if (ret) > + return ret; > > - return len; > + return op.data.nbytes; > } > > /* > @@ -1101,10 +1094,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: > -- Regards Vignesh _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot