[PATCH 4/4] mtd: nand: omap2: Add data correction support
avinashphilip at ti.com
Thu Oct 11 01:27:13 EDT 2012
On Wed, Oct 10, 2012 at 22:38:06, Ivan Djelic wrote:
> On Tue, Oct 09, 2012 at 01:36:50PM +0100, Philip, Avinash wrote:
> > > There are at least 2 potential problems when reading an erased page with bitflips:
> > >
> > > 1. bitflip in data area and no bitflip in spare area (all 0xff)
> > > Your code will not perform any ECC correction.
> > > UBIFS does not like finding bitflips in empty pages, see for instance
> > > http://lists.infradead.org/pipermail/linux-mtd/2012-March/040328.html.
> > In case of error correction using ELM, syndrome vector calculated after reading
> > Data area & OOB area. So handling of erased page requires a software workaround.
> > I am planning something as follows.
> > I will first check calculated ecc, which would be zero for non error pages.
> > Then I would check 0xFF in OOB area (for erased page) by checking number of
> > bit zeros in OOB area. If it is 0xFF (number of bit zero count is zero),
> > set entire page as 0xFF if number of bit zeros is less than max bit flips
> > (8 or 4) by counting the number of bit zero's in data area.
> > This logic is implemented in fsmc_nand.c
> > See commit
> > mtd: fsmc: Newly erased page read algorithm implemented
> > >
> > > 2. bitflip in ECC bytes in spare area
> > > Your code will report an uncorrectable error upon reading; if this happens while reading a partially programmed UBI block,
> > > I guess you will lose data.
> > In case of uncorrectable errors due to bit flips in spare area,
> > I can go on checking number of bit zero's in data area + OOB area
> > are less than max bit flips (8 or 4), I can go on setting the entire
> > page as 0xFF.
> OK, sounds reasonable.
> Another simple strategy could use the fact that you add a 14th zero byte to
> the 13 BCH bytes for RBL compatibility:
RBL compatibility (14th byte) is applicable only for BCH8 ecc scheme.
So I am planning adding an extra byte (0) for BCH4 ecc scheme. So with this
we can go for same approaches in BCH4 & BCH8 ecc scheme.
If I understood correctly, software BCH ecc scheme is modifying calculated
ecc data to handle bit flips in erased pages.
If that is the only reason, whether same logic can go for same ECC calculation
(remove modification of calculated ecc in case of software ecc correction)
by adding an extra byte (0) in spare area to handle erased pages.
So can you share if I am missing something?
> Upon reading:
> - if this 14th byte is zero (*) => page was programmed: perform ECC
> correction as usual
> - else, page was not programmed: do not perform ECC, read entire data+spare
> area, and set it to 0xff if less than 8 or 4 (max bitflips) zero bits
> were found
> (*) for robustness to bitflip in 14th byte, replace condition
> "14th byte is zero" by e.g. "14th byte has less than 4 bits set to 1".
> What do you think ?
This seems logically good.
More information about the linux-arm-kernel