From: Scott Wood <scottwood@freescale.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] mtd: nand: fix the written length when nand_write_skip_bad failed
Date: Mon, 4 Mar 2013 19:58:17 -0600 [thread overview]
Message-ID: <1362448697.16575.13@snotra> (raw)
In-Reply-To: <1362214870-7464-1-git-send-email-hotforest@gmail.com> (from hotforest@gmail.com on Sat Mar 2 03:01:10 2013)
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@gmail.com>
> Cc: Scott Wood <scottwood@freescale.com>
> Cc: Ben Gardiner <bengardiner@nanometrics.ca>
> Cc: Lei Wen <leiwen@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/
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
> 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
next prev parent reply other threads:[~2013-03-05 1:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-02 9:01 [U-Boot] [PATCH] mtd: nand: fix the written length when nand_write_skip_bad failed Tao Hou
2013-03-05 1:58 ` Scott Wood [this message]
2013-03-06 14:56 ` htbegin
2013-03-06 18:22 ` Scott Wood
2013-03-07 15:02 ` htbegin
2013-03-07 22:27 ` Scott Wood
2013-03-10 1:06 ` htbegin
2013-03-11 16:43 ` Scott Wood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1362448697.16575.13@snotra \
--to=scottwood@freescale.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox