
On Wed, 2010-11-17 at 16:08 -0600, Scott Wood wrote:
On Wed, 17 Nov 2010 22:40:49 +0100 Wolfgang Denk wd@denx.de wrote:
Dear Steve Sakoman,
In message AANLkTimrfQ5+AWfdFy_fueTMH=x=xrkaZGNtK8fiSD48@mail.gmail.com you wrote:
readenv: offset = 240000 readenv: nand_read failure = -117 *** Warning - readenv() failed, using default environment
I then immediately tried to use the nand read command to read the same block, and it was successful!
Hm... any chance that - for example - your timers are not working correctly before relocation (maybe because they try to write to the not yet available data segment) ? This could cause timeouts or delays to be too short, so the NAND driver is misbehaving?
The NAND driver only works after relocation.
It looks like the problem is that -EUCLEAN is a non-fatal error (indicates a correctable ECC error). The code invoked by the "nand read" command succeeds if nand_read() returns either 0 or -EUCLEAN, but readenv() is missing this check.
OK, we seem to be peeling back the layers of the onion now.
I patched readenv to use the same nand_read_skip_bad function used in the command line "nand read" tool. I no longer get the -EUCLEAN errors when reading the environment after using fw_setenv to write from linux. Now I get:
*** Warning - bad CRC, using default environment
Checking the data with the "nand read" command line shows that the changes I made in linux are indeed there, so I suspect that there is also some mismatch in the CRC computation between the fw tools and the u-boot code (i.e. I'm pretty sure this error does *not* refer to the nand CRC)
Steve