Commit 07604686 authored by Masahiro Yamada's avatar Masahiro Yamada Committed by Boris Brezillon

mtd: nand: relax ecc.read_page() return value for uncorrectable ECC

The comment for ecc.read_page() requires that it should return
"0 if bitflips uncorrectable".

Actually, drivers could return positive values when uncorrectable
bitflips occur.  For example, nand_read_page_swecc() is the case.
If ecc.correct() returns -EBADMSG for the first ECC sector, and
a positive value for the second one, nand_read_page_swecc() returns
a positive max_bitflips and increments ecc_stats.failed for the same
page.

The requirement can be relaxed by tweaking nand_do_read_ops().
Move the max_bitflips calculation below the retry.
Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
Suggested-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
parent f107d7a4
...@@ -1993,8 +1993,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, ...@@ -1993,8 +1993,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
break; break;
} }
max_bitflips = max_t(unsigned int, max_bitflips, ret);
/* Transfer not aligned data */ /* Transfer not aligned data */
if (use_bufpoi) { if (use_bufpoi) {
if (!NAND_HAS_SUBPAGE_READ(chip) && !oob && if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
...@@ -2045,6 +2043,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, ...@@ -2045,6 +2043,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
} }
buf += bytes; buf += bytes;
max_bitflips = max_t(unsigned int, max_bitflips, ret);
} else { } else {
memcpy(buf, chip->buffers->databuf + col, bytes); memcpy(buf, chip->buffers->databuf + col, bytes);
buf += bytes; buf += bytes;
......
...@@ -516,7 +516,7 @@ static inline void nand_hw_control_init(struct nand_hw_control *nfc) ...@@ -516,7 +516,7 @@ static inline void nand_hw_control_init(struct nand_hw_control *nfc)
* out-of-band data). * out-of-band data).
* @read_page: function to read a page according to the ECC generator * @read_page: function to read a page according to the ECC generator
* requirements; returns maximum number of bitflips corrected in * requirements; returns maximum number of bitflips corrected in
* any single ECC step, 0 if bitflips uncorrectable, -EIO hw error * any single ECC step, -EIO hw error
* @read_subpage: function to read parts of the page covered by ECC; * @read_subpage: function to read parts of the page covered by ECC;
* returns same as read_page() * returns same as read_page()
* @write_subpage: function to write parts of the page covered by ECC. * @write_subpage: function to write parts of the page covered by ECC.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment