Hello,
I wrote earlier trying to figure out why I was losing data with YAFFS2,
thinking I had the settings wrong. Instead it appears that there are a
couple bugs in the code that interfaces to MTD (assuming that I
understand everything correctly of course ;) .)
Anyhow, the two issues I was experiencing were that data would be lost
because all blocks written to would become bad blocks if I reset the
system (i.e. updated the bad block table), and after solving that, my
data would be minorly corrupted. Number one was caused by the code in
nandmtd2_WriteChunkWithTagsToNAND() and
nandmtd2_ReadChunkWithTagsToNAND() which write and read the tags struct
from position 0 in the OOB--thus overwriting the bad block marker. The
second issue (data corruption) was being caused by these same two
functions which when writing out the tag, write it out as oobsize, so it
overwrites the MTD ECC with random data that's past the end of the tag
in memory.
In nandmtd2_WriteChunkWithTagsToNAND()
- if(tags)
- retval = mtd->write_oob(mtd,addr, mtd->oobsize,&dummy,(__u8 *)&pt);
+ if(tags)
+ retval = mtd->write_oob(mtd,addr + 2, sizeof(pt),&dummy,(__u8
*)&pt); /* skip two bytes so we don't have to worry about the bad
block marker */
In nandmtd2_ReadChunkWithTagsToNAND()
- if(tags)
- retval =
mtd->read_oob(mtd,addr,mtd->oobsize,&dummy,dev->spareBuffer);
+ if(tags)
+ retval = mtd->read_oob(mtd,addr +
2,sizeof(pt),&dummy,dev->spareBuffer); /* tag data begins two bytes
into the OOB */
Also, I noticed that the tag ecc is, according to the reference
material, only supposed to be three bytes, however the structure is
defined as:
typedef struct
{
unsigned char colParity;
unsigned lineParity; //int
unsigned lineParityPrime; //int
} yaffs_ECCOther;
So it is actually being written out as 9 bytes in the OOB, I believe.
-Chris