[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAK7LNARTE9z=mb6jA9RU-tvZOOedQDTjjqeSanp-yyOoo78xpg@mail.gmail.com>
Date: Fri, 2 Dec 2016 13:26:27 +0900
From: Masahiro Yamada <yamada.masahiro@...ionext.com>
To: Boris Brezillon <boris.brezillon@...e-electrons.com>
Cc: linux-mtd@...ts.infradead.org,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Marek Vasut <marek.vasut@...il.com>,
Brian Norris <computersforpeace@...il.com>,
Richard Weinberger <richard@....at>,
David Woodhouse <dwmw2@...radead.org>,
Cyrille Pitchen <cyrille.pitchen@...el.com>
Subject: Re: [PATCH 15/39] mtd: nand: denali: improve readability of handle_ecc()
Hi Boris,
2016-11-28 0:42 GMT+09:00 Boris Brezillon <boris.brezillon@...e-electrons.com>:
>> + if (err_byte < ECC_SECTOR_SIZE) {
>> + struct mtd_info *mtd =
>> + nand_to_mtd(&denali->nand);
>> + int offset;
>> +
>> + offset = (err_sector * ECC_SECTOR_SIZE + err_byte) *
>> + denali->devnum + err_device;
>> + /* correct the ECC error */
>> + buf[offset] ^= err_correction_value;
>> + mtd->ecc_stats.corrected++;
>> + bitflips++;
>
> Hm, bitflips is what is set in max_bitflips, and apparently the
> implementation (which is not yours) is not doing what the core expects.
>
> You should first count bitflips per sector with something like that:
>
> bitflips[err_sector]++;
>
>
> And then once you've iterated over all errors do:
>
> for (i = 0; i < nsectors; i++)
> max_bitflips = max(bitflips[err_sector], max_bitflips);
I see.
For soft ECC fixup, we can calculate bitflips
for each ECC sector, so I can fix the max_bitflips
as the core framework expects.
For hard ECC fixup, the register only reports
the number of corrected bit-flips
in the whole page (sum from all ECC sectors).
We cannot calculate max_bitflips, I think.
BTW, I noticed another problem of the current code.
buf[offset] ^= err_correction_value;
mtd->ecc_stats.corrected++;
bitflips++;
This code is counting the number of corrected bytes,
not the number of corrected bits.
I think multiple bit-flips within one byte can happen.
Perhaps, we should add
hweight8(buf[offset] ^ err_correction_value)
to ecc_stats.corrected and bitflips.
--
Best Regards
Masahiro Yamada
Powered by blists - more mailing lists