* [U-Boot] Possible bug in NAND driver
@ 2009-07-13 19:34 Paulraj, Sandeep
2009-07-14 9:03 ` Valeriy Glushkov
2009-07-16 17:46 ` [U-Boot] Possible bug in NAND driver Scott Wood
0 siblings, 2 replies; 6+ messages in thread
From: Paulraj, Sandeep @ 2009-07-13 19:34 UTC (permalink / raw)
To: u-boot
If we refer to the following code snippet from nand_util.c
rval = nand_read (nand, offset, &read_length, p_buffer);
if (rval != 0) {
printf ("NAND read from offset %llx failed %d\n",
offset, rval);
*length -= left_to_read;
return rval;
}
The above code will return failure even after ECC errors are corrected.
This is because of the following line of code in nand_base.c
return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
This is in the nand_do_read_ops in nand_bsae.c
I see that changing
if (rval != 0)
to
if (rval != 0 && rval != -EUCLEAN )
solves the problem.
I can submit a patch if required.
Thanks,
Sandeep
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] Possible bug in NAND driver
2009-07-13 19:34 [U-Boot] Possible bug in NAND driver Paulraj, Sandeep
@ 2009-07-14 9:03 ` Valeriy Glushkov
2009-07-14 10:51 ` [U-Boot] [PATCH] nand: fixed failed reads on corrected ECC errors in nand_util.c Valeriy Glushkov
2009-07-16 17:46 ` [U-Boot] Possible bug in NAND driver Scott Wood
1 sibling, 1 reply; 6+ messages in thread
From: Valeriy Glushkov @ 2009-07-14 9:03 UTC (permalink / raw)
To: u-boot
You are right, this is a bug.
I've already fixed it in our code tree some monthes ago but forgotten to
send the patch to the list.
Best regards,
Valeriy Glushkov
----- Original Message -----
From: "Paulraj, Sandeep" <s-paulraj@ti.com>
To: <u-boot@lists.denx.de>
Sent: 13 ???? 2009 ?. 22:34
Subject: [U-Boot] Possible bug in NAND driver
>
> If we refer to the following code snippet from nand_util.c
>
> rval = nand_read (nand, offset, &read_length, p_buffer);
>
> if (rval != 0) {
>
> printf ("NAND read from offset %llx failed %d\n",
>
> offset, rval);
>
> *length -= left_to_read;
>
> return rval;
>
> }
>
>
> The above code will return failure even after ECC errors are corrected.
>
> This is because of the following line of code in nand_base.c
>
> return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
>
> This is in the nand_do_read_ops in nand_bsae.c
>
>
> I see that changing
>
> if (rval != 0)
>
>
> to
>
> if (rval != 0 && rval != -EUCLEAN )
>
>
> solves the problem.
>
> I can submit a patch if required.
>
>
> Thanks,
> Sandeep
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] nand: fixed failed reads on corrected ECC errors in nand_util.c
@ 2009-07-14 10:51 ` Valeriy Glushkov
2009-07-16 19:50 ` Scott Wood
0 siblings, 1 reply; 6+ messages in thread
From: Valeriy Glushkov @ 2009-07-14 10:51 UTC (permalink / raw)
To: u-boot
Signed-off-by: Valeriy Glushkov <gvv@lstec.com>
Signed-off-by: Paulraj, Sandeep <s-paulraj@ti.com>
---
drivers/mtd/nand/nand_util.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c
index fc16282..694ead6 100644
--- a/drivers/mtd/nand/nand_util.c
+++ b/drivers/mtd/nand/nand_util.c
@@ -567,10 +567,10 @@ int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
if (len_incl_bad == *length) {
rval = nand_read (nand, offset, length, buffer);
- if (rval != 0)
- printf ("NAND read from offset %llx failed %d\n",
- offset, rval);
-
+ if (!rval || rval == -EUCLEAN)
+ return 0;
+ printf ("NAND read from offset %llx failed %d\n",
+ offset, rval);
return rval;
}
@@ -591,7 +591,7 @@ int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
read_length = nand->erasesize - block_offset;
rval = nand_read (nand, offset, &read_length, p_buffer);
- if (rval != 0) {
+ if (rval && rval != -EUCLEAN) {
printf ("NAND read from offset %llx failed %d\n",
offset, rval);
*length -= left_to_read;
--
1.5.2.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] Possible bug in NAND driver
2009-07-13 19:34 [U-Boot] Possible bug in NAND driver Paulraj, Sandeep
2009-07-14 9:03 ` Valeriy Glushkov
@ 2009-07-16 17:46 ` Scott Wood
1 sibling, 0 replies; 6+ messages in thread
From: Scott Wood @ 2009-07-16 17:46 UTC (permalink / raw)
To: u-boot
On Mon, Jul 13, 2009 at 02:34:42PM -0500, Paulraj, Sandeep wrote:
> I see that changing
>
> if (rval != 0)
>
>
> to
>
> if (rval != 0 && rval != -EUCLEAN )
>
>
> solves the problem.
>
> I can submit a patch if required.
Yes, please submit a patch. Thanks!
-Scott
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] nand: fixed failed reads on corrected ECC errors in nand_util.c
2009-07-14 10:51 ` [U-Boot] [PATCH] nand: fixed failed reads on corrected ECC errors in nand_util.c Valeriy Glushkov
@ 2009-07-16 19:50 ` Scott Wood
2009-07-17 8:11 ` Valeriy Glushkov
0 siblings, 1 reply; 6+ messages in thread
From: Scott Wood @ 2009-07-16 19:50 UTC (permalink / raw)
To: u-boot
On Tue, Jul 14, 2009 at 01:51:10PM +0300, Valeriy Glushkov wrote:
>
> Signed-off-by: Valeriy Glushkov <gvv@lstec.com>
> Signed-off-by: Paulraj, Sandeep <s-paulraj@ti.com>
> ---
Applied to u-boot-nand-flash.
> drivers/mtd/nand/nand_util.c | 10 +++++-----
> 1 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c
> index fc16282..694ead6 100644
> --- a/drivers/mtd/nand/nand_util.c
> +++ b/drivers/mtd/nand/nand_util.c
> @@ -567,10 +567,10 @@ int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
>
> if (len_incl_bad == *length) {
> rval = nand_read (nand, offset, length, buffer);
> - if (rval != 0)
> - printf ("NAND read from offset %llx failed %d\n",
> - offset, rval);
> -
> + if (!rval || rval == -EUCLEAN)
> + return 0;
> + printf ("NAND read from offset %llx failed %d\n",
> + offset, rval);
Out of curiosity, why invert the logic from if (error) print; return to if
(!error) return; print; return?
-Scott
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH] nand: fixed failed reads on corrected ECC errors in nand_util.c
2009-07-16 19:50 ` Scott Wood
@ 2009-07-17 8:11 ` Valeriy Glushkov
0 siblings, 0 replies; 6+ messages in thread
From: Valeriy Glushkov @ 2009-07-17 8:11 UTC (permalink / raw)
To: u-boot
Hi Scott,
>> if (len_incl_bad == *length) {
>> rval = nand_read (nand, offset, length, buffer);
>> - if (rval != 0)
>> - printf ("NAND read from offset %llx failed %d\n",
>> - offset, rval);
>> -
>> + if (!rval || rval == -EUCLEAN)
>> + return 0;
>> + printf ("NAND read from offset %llx failed %d\n",
>> + offset, rval);
>
> Out of curiosity, why invert the logic from if (error) print; return to if
> (!error) return; print; return?
Because it looks a bit better for me than 2 other versions.
And saves a line. :)
-------
if (!rval || rval == -EUCLEAN)
return 0;
printf ("NAND read from offset %llx failed %d\n",
offset, rval);
return rval;
--------
if (rval && rval != -EUCLEAN) {
printf ("NAND read from offset %llx failed %d\n",
offset, rval);
return rval;
}
return 0;
-------
if (rval && rval != -EUCLEAN)
printf ("NAND read from offset %llx failed %d\n",
offset, rval);
else
rval = 0;
return rval;
--------
Best regards,
Valeriy Glushkov
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-07-17 8:11 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-13 19:34 [U-Boot] Possible bug in NAND driver Paulraj, Sandeep
2009-07-14 9:03 ` Valeriy Glushkov
2009-07-14 10:51 ` [U-Boot] [PATCH] nand: fixed failed reads on corrected ECC errors in nand_util.c Valeriy Glushkov
2009-07-16 19:50 ` Scott Wood
2009-07-17 8:11 ` Valeriy Glushkov
2009-07-16 17:46 ` [U-Boot] Possible bug in NAND driver Scott Wood
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox