Re: [Yaffs] Re: bit error rates

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Claudio Lanconelli
Date:  
To: yaffs mail list
Subject: Re: [Yaffs] Re: bit error rates
Peter Barada wrote:

>On Thu, 2006-02-09 at 23:13 +0000, Sergei Sharonov wrote:
>
>
>Yes, I have. I use a YAFFS1 NOR-based system, and in the writes, we lay
>down the data chunk, and then the tag. In the unlikely event that a
>power-cycle occurs while writing the data, the tag is still empty, but
>some of the data chunk is not erased, and then next time a write occurs
>into that chunk, YAFFS sees that the write fails since the previous data
>was written(and retires the whole block), even though the tag indicated
>the chunk is empty.
>
>To fix this, I used two bits in the pageStatus byte in the tag, and
>write the tag first, then the data, and then update the tag. Assuming
>that the pageStatus starts out as 0xff, then the first tag write puts in
>the value of the tag, but writes a pageStatus byte of 0xfe to indicate
>that a write is in progress, then writes the chunk data, and then comes
>back an re-writes the tag with the same data, and a pageStatus of 0xfc.
>In the rest of the code, the chunk is assumed to be valid if the
>pageStatus is 0xff(and objectId is non-0xfffff) or if 0xfc, empty if the
>objectId is 0xfffff, and deleted if the pageStatus is either 0xfe, or
>0x00(the value written to delete a tag).
>
>This solved the problem for me. I assume an approach like this would
>work for NAND...
>
>

If works for NAND only if the additional partial page programming
fits NAND specifications.
I have looked at Samsung datasheet and it say:
"The number of consecutive partial page programming
operation within the same page without an intervening erase
operation should not exceed 2 for main array and 3 for spare array."
So it should be ok for Samsung since in this case is 1 + 2.
However Toshiba say: "Multiple partial page programming attempts
in a block can aggravate this error symptom" referring to Program
disturb soft error.

I think a better solution is to check the power fail flag before any
erase/programming cycle as suggested by Charles.
Unfortunately this means modify the MTD driver, something like this:

static int my_nand_erase(struct mtd_info *mtd, struct erase_info *instr)
{
    if ( check_powerfail() )
        return -EIO;
    else
        return nand_erase_nand (mtd, instr, 0);
}


and in nand_write_ecc()

    /* Check, if it is write protected or power fail */
    if ( nand_check_wp(mtd) || check_powerfail() )
        goto out;


Cheers,
Claudio Lanconelli