[Yaffs-archive] Re: [YAFFS] Latest CVS ==> Interaction with mtd

Thomas Gleixner tglx@linutronix.de
Wed, 11 Dec 2002 23:52:53 +0100


On Wednesday 11 December 2002 21:17, Christian Gan wrote:
> Ah.... just found this in an old yaffslist email.  There are actually two
> ints tagged onto the end of each read obb, so that makes it 16+4+4 bytes. 
> A snippet is included below.
>
> The easiest method around this is probably to have a temp oobbuf in the
> dev->ReadChunkFromNand function that is 24 bytes, then copy the first 16
> bytes to the original buffer supplied.  The eccstatus is only useful for
> system calling read_ecc for multiple pages at a time, i.e. the return value
> will tell you at least one ECC failed but the eccstatus will tell you which
> page failed.  But in YAFFS's case, since only one page is read a a time, we
> can probably ignore eccstatus and just look at the return value.
>
> From Thomas:
> "read_ecc, write_ecc extended for different oob-layout selections:
> Implemented NAND_NONE_OOB, NAND_JFFS2_OOB, NAND_YAFFS_OOB.
> fs-driver gives one of these constants to select the oob-layout fitting
> the filesystem.I have added int oobsel as parameter to each function.
> oobdata can be read together with the raw data, when the fs-driver
> supplies a big enough buffer.
> size = 12 * number of pages to read (256B pagesize)
>        24 * number of pages to read (512B pagesize)
> The buffer contains 8/16 byte oobdata and 4/8 byte returncode from
> correct_ecc
> oobbuf [0-15] oob-data 1st read page
> oobbuf [16-19] return code from correct_ecc byte 0-255
> oobbuf [20-23] return code from correct_ecc byte 256-511
> oobbuf [24-39] oob-data 2nd read page
> oobbuf [40-31] return code from correct_ecc byte 0-255

This was done on a request of Charles - if I understood him right - as he 
wants to have control over the ecc results in YAFFS.
In my patch "yaffs.diff", submitted on 11-24-2002 to this list, I took care of 
this 16 + x buffer issue.
Citation tglx : " A penalty is that I have to copy oob data around on read, 
because NAND driver  returns 16Byte OOB data and 2 x 4 Byte ECC correction 
result. This was a request of Charles, when we discussed some YAFFS issues 
before I did the big nand.c overhaul. This behaviour is a subject, which 
could be changed, as the only user would be YAFFS at the moment, AFAIK. "

> The returnvalue of read_ecc is -EIO, if any correct_ecc returned -1. But
> retlen is equal to the requested length, so fs-driver can decide what to
> do.
The result value in combination withhretlen gives you a hint, if ECC failed or 
a severe I/O problem was detected.
-EIO && retlen == requested length -> no I/O problem, just ECC failure
-EIO && retlen != requested length -> severe I/O problem

> oobdata can be given from filesystem to program them in one go together
> with the raw data. ECC codes are filled in at the place selected by
> oobsel.
> This supports multipage programming.
> oobbuf[0-15] 1st page to write
> oobbuf[16-31] 2nd page to write
> ECC is filled in at the selected place."
That means that the fs layer provides a oob buffer, where the nand layer fills 
in the ecc data at the appropriate place. See also patch "yaffs.diff" 
submitted on 11-24-2002 to this list 
 
Thomas
____________________________________________________
linutronix - competence in embedded & realtime linux
http://www.linutronix.de
mail: tglx@linutronix.de

---------------------------------------------------------------------------------------
This mailing list is hosted by Toby Churchill open software (www.toby-churchill.org).
If mailing list membership is no longer wanted you can remove yourself from the list by 
sending an email to yaffs-request@toby-churchill.org with the text "unsubscribe" 
(without the quotes) as the subject.