Re: [PATCH v2 10/53] mtd: nand: denali: fix erased page checking

From: Boris Brezillon
Date: Wed Mar 22 2017 - 16:56:39 EST


On Wed, 22 Mar 2017 23:07:17 +0900
Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx> wrote:
> dev_err(denali->dev,
> @@ -1148,12 +1136,15 @@ static int denali_read_page(struct mtd_info *mtd, struct nand_chip *chip,
> if (check_erased_page) {
> read_oob_data(mtd, chip->oob_poi, denali->page);
>
> - /* check ECC failures that may have occurred on erased pages */
> - if (check_erased_page) {
> - if (!is_erased(buf, mtd->writesize))
> - mtd->ecc_stats.failed++;
> - if (!is_erased(buf, mtd->oobsize))
> - mtd->ecc_stats.failed++;
> + stat = nand_check_erased_ecc_chunk(
> + buf, mtd->writesize,
> + chip->oob_poi, mtd->oobsize,
> + NULL, 0,
> + chip->ecc.strength * chip->ecc.steps);

That's not how it's supposed to be done. Each chunk should be checked
independently. Here is a simple example explaining why this is
important:

Let's consider the following setup:
- 4k pages
- 16bits/1024bytes ECC

With your approach, you turn this into:
- 4k pages
- 64bits/4096bytes ECC

Now suppose you have 32 bitflips in the first 1024 bytes. The real ECC
config is expected to report uncorrectable errors, but your approach
will just report that 32 bits have been fixed, which is wrong.