Re: tango_nand: is logic right in error cases? (was Re: fsl_ifc_nand: are blank pages protected by ECC?)

From: Boris Brezillon
Date: Mon Apr 24 2017 - 03:13:13 EST


On Sun, 23 Apr 2017 11:58:45 +0200
Pavel Machek <pavel@xxxxxx> wrote:

> Hi!
>
> > > Maybe I figured it out. Unfortunately, it is only compile tested. Does
> > > it look approximately right?
> >
> > Yep that's definitely better. Just one thing missing (see below),
> > otherwise it looks good.
>
> I'm copying from tango_nand, therefore I had to check tango_nand, too.
>
> static int check_erased_page(struct nand_chip *chip, u8 *buf)
> {
> ...
> res = nand_check_erased_ecc_chunk(buf, pkt_size, ecc, ecc_size,
> meta, meta_len,
> chip->ecc.strength);
> if (res < 0)
> mtd->ecc_stats.failed++;
> else
> mtd->ecc_stats.corrected += res;
>
> bitflips = max(res, bitflips);
> ...
> return bitflips;
> }
>
> static int tango_read_page(struct mtd_info *mtd, struct nand_chip *chip,
> u8 *buf, int oob_required, int page)
> {
> ...
> res = decode_error_report(nfc);
> if (res < 0) {
> chip->ecc.read_oob_raw(mtd, chip, page);
> res = check_erased_page(chip, buf);
> }
>
> return res;
> }
>
>
> So nand_check_erased_ecc_chunk() returns < 0 (failed ECC), but then we
> perform max() with bitflips (lets say 1, correctable ECC) and return
> 1? tango_read_page then returns 1 (correctable ECC) forgetting about
> failed ECC...?

Yep, that's expected, see what's done in the core to detect
uncorrectable errors and return EBADMSG when appropriate [1].

[1]http://lxr.free-electrons.com/source/drivers/mtd/nand/nand_base.c#L2033