[U-Boot] [PATCH] mtd: nand: fix the written length when nand_write_skip_bad failed
htbegin
hotforest at gmail.com
Wed Mar 6 15:56:56 CET 2013
Hi, Scott
Thanks for your review.
On Tue, Mar 5, 2013 at 9:58 AM, Scott Wood <scottwood at freescale.com> wrote:
> On 03/02/2013 03:01:10 AM, Tao Hou wrote:
>>
>> 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.
>
>
> We already do that in some code paths.
>
>
>> Signed-off-by: Tao Hou <hotforest at gmail.com>
>> Cc: Scott Wood <scottwood at freescale.com>
>> Cc: Ben Gardiner <bengardiner at nanometrics.ca>
>> Cc: Lei Wen <leiwen at marvell.com>
>> ---
>> drivers/mtd/nand/nand_util.c | 22 +++++++++++++++-------
>> 1 file changed, 15 insertions(+), 7 deletions(-)
>
>
> Could you rebase this on top of this patch:
> http://patchwork.ozlabs.org/patch/224842/
Do you mean a V2 patch ?
> BTW, are you actually using WITH_YAFFS_OOB? I think there are some other
> things wrong with it at the moment, as mentioned here:
> http://lists.denx.de/pipermail/u-boot/2013-March/148378.html
No, I don't use it.
>
>
>> 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;
>
>
> OK so far...
>
>
>> @@ -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;
>> }
>
>
> ...but I don't see why this part is needed (or correct). Why doesn't
> "*length -= left_to_write" already get you what you want?
>
> -Scott
I just use "*length -= left_to_write - written_size" to tell the upper
level that what
had been actually happened. For the current block, "written_size" has
been written to the NAND Flash yet, so left_to_write should be
subtracted by "written_size".
Cheers,
Hou.
More information about the U-Boot
mailing list