Re: [Yaffs] Problem with Yaffs on Routerboard RB112 and kern…

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: David Goodenough
Date:  
To: yaffs
Subject: Re: [Yaffs] Problem with Yaffs on Routerboard RB112 and kernel 2.6.19
On Thursday 10 May 2007, Ian McDonnell wrote:
> On Wednesday 09 May 2007 18:38, Andrea Conti wrote:
> > Anyway, the two implementations are clearly working together,
> > so they must share the same oob layout. We can get that from
> > the kernel patches, and it is the the exact same
> > yaffs_oob_layout you posted above.
>
> Yes, this is a good point.
>
> The OOB/Spare data for the first page in your dump file is:
>
> 00000200 00 00 10 00 00 ff 7f 01 ff f0 0f 70 81 aa 5a 97
>
> If I compute the ECC (using MTD's nand_calculate_ecc function)
> I get the following 6 ECC bytes:
>
> ff f0 0f aa 5a 97
>
> So it looks like the ECC is at bytes (starting at 0):
> 8, 9, 10, 13, 14, 15.
>
> Byte 5 (6th byte) is the block-status (this is known/fixed).
>
> This looks like the old Yaffs(1) layout:
>
> typedef struct
> {
>     __u8  tagByte0;
>     __u8  tagByte1;
>     __u8  tagByte2;
>     __u8  tagByte3;
>     __u8  pageStatus;   // set to 0 to delete the chunk
>     __u8  blockStatus;
>     __u8  tagByte4;
>     __u8  tagByte5;
>     __u8  ecc1[3];
>     __u8  tagByte6;
>     __u8  tagByte7;
>     __u8  ecc2[3];
> } yaffs_Spare;

>
>
> So that would translate to an MTD layout like this:
>
> static struct nand_ecclayout nand_oob_16 = {
>     .eccbytes = 6,
>     .eccpos = { 8, 9, 10, 13, 14, 15 },
>     .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 } }
> };

>
> BUT: there's a problem with getting access to the pageStatus
> and blockStatus bytes. You need to know some history here,
> and it's a long story. Yaffs used to read and write all 16 bytes
> of spare using the MTD api, and they cooperated in handling the 6
> ECC bytes. These days, with the improved MTD API, that's not so
> easy. You might need to modify the code that packs and unpacks
> the Yaffs1 tags into and out of the 'oobfree' data as stored and
> retrieved by mtd. If you are using an old kernel (old MTD) you
> can probably just use the old code in Yaffs, with the old MTD
> api.
>
> If you use the newer MTD API, where nand_ecclayout is present,
> you will probably have to include the 'pageStatus' byte in the
> oobfree list:
>
> static struct nand_ecclayout nand_oob_16 = {
>     .eccbytes = 6,
>     .eccpos = { 8, 9, 10, 13, 14, 15 },
>     .oobfree = { { 0, 5 }, { 6, 2 }, { 11, 2 } }
> };

>
> AND fix up the yaffs pack/unpack funcs and calls to MTD
> read/write to understand this. The block status can be gotten
> the same way, but this should only be needed by the scan step
> and can be retrieved from the (new) mtd using the bad-block test
> call.
>
> There is probably enough known now that someone else on the list
> can help.
>
> -imcd
>

Do I read this correctly to say that there are no changes needed to
the MTD code in order to achieve this? If so that is great, otherwise
I will go over to their list and campain for whatever is needed.

David