[PATCH v2] mtd: nand: Add driver for M-sys / Sandisk diskonchip G4
Matthieu CASTET
matthieu.castet at parrot.com
Thu Nov 3 05:14:10 EDT 2011
Hi,
Ivan Djelic a écrit :
> On Wed, Nov 02, 2011 at 11:00:59PM +0000, Mike Dunn wrote:
>
> Hi Mike,
> A few comments below:
>
>> +
>> +/* value generated by the HW ecc generator upon reading blank page */
>> +static uint8_t blank_read_hwecc[7] = {
>> + 0xcf, 0x72, 0xfc, 0x1b, 0xa9, 0xc7, 0xb9 };
>
> Using this blank ecc value to detect blank pages after reading them is not that
> reliable, because if a bitflip appears in an erased page, the HW ecc generator
> will generate a completely different sequence of bytes. Your driver will think
> the page is not blank, it will try to correct errors and fail. And UBIFS will
> not appreciate that.
>
> I can see two cleaner alternatives to solve this issue:
>
> 1. When you program a page, before writing hwecc to oob, adjust it like this:
>
> hwecc[i] ^= blank_read_hwecc[i]^0xff;
>
> The effect of this is that you now get 0xffs as ecc for blank pages, and bitflip
> correction on erased pages for free. This is transparent to your controller,
> because this "adjustment" cancels itself upon reading when calc_ecc^recv_ecc is
> computed.
>
> 2. Use unprotected spare oob byte 15 as a programmming marker: remove it from
> the oob_free list, and force it to 0 when you program a page. Now, you can
> easily detect if a page is blank or has been programmed by checking this byte.
> You can for instance count the number of bits set to 1 in the byte, and decide
> it is blank if that number is greater than 4; this ensures you are robust to
> bitflips in the marker byte itself.
>
> My preference would go to option 2 in your case.
>
Note that UBIFS except blank page to be 0xff.
With option 1 you have nothing to do (ecc correct bit-flips), with option 2 you
have to memset the page (data+spare) to 0xff to clear bit-flips.
Also with option 2 you don't know how many bit-flip there are in the blank page.
Because UBIFS (or mtd) don't check the page after a write , you can end writting
a page with too many bit-flips without any error.
Matthieu
More information about the linux-mtd
mailing list