When the data has been partially written into the NAND Flash, returning the written length instead of 0. The written length may be useful when the upper level decides to continue the writing after skipping the block causing the write failure.
Signed-off-by: Tao Hou <[email protected]> Cc: Scott Wood <[email protected]> Cc: Ben Gardiner <[email protected]> Cc: Lei Wen <[email protected]> --- drivers/mtd/nand/nand_util.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index de1d13e..f57d723 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -496,8 +496,10 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, #ifdef CONFIG_CMD_NAND_YAFFS if (flags & WITH_YAFFS_OOB) { - if (flags & ~WITH_YAFFS_OOB) + if (flags & ~WITH_YAFFS_OOB) { + *length = 0; return -EINVAL; + } int pages; pages = nand->erasesize / nand->writesize; @@ -505,6 +507,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, if (*length % (nand->writesize + nand->oobsize)) { printf("Attempt to write incomplete page" " in yaffs mode\n"); + *length = 0; return -EINVAL; } } else @@ -542,7 +545,6 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, if (rval == 0) return 0; - *length = 0; printf("NAND write to offset %llx failed %d\n", offset, rval); return rval; @@ -550,7 +552,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, while (left_to_write > 0) { size_t block_offset = offset & (nand->erasesize - 1); - size_t write_size, truncated_write_size; + size_t write_size, truncated_write_size, written_size; WATCHDOG_RESET(); @@ -586,8 +588,10 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, ops.oobbuf = ops.datbuf + pagesize; rval = nand->write_oob(nand, offset, &ops); - if (rval != 0) + if (rval != 0) { + written_size = pagesize_oob * page; break; + } offset += pagesize; p_buffer += pagesize_oob; @@ -605,14 +609,18 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, rval = nand_write(nand, offset, &truncated_write_size, p_buffer); - offset += write_size; - p_buffer += write_size; + if (rval == 0) { + offset += write_size; + p_buffer += write_size; + } else { + written_size = truncated_write_size; + } } if (rval != 0) { printf("NAND write to offset %llx failed %d\n", offset, rval); - *length -= left_to_write; + *length -= left_to_write - written_size; return rval; } -- 1.7.9.5 _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

