|
@@ -1426,6 +1426,16 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
|
|
|
stat = chip->ecc.correct(mtd, p,
|
|
|
&chip->buffers->ecccode[i], &chip->buffers->ecccalc[i]);
|
|
|
+ if (stat == -EBADMSG &&
|
|
|
+ (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
|
|
|
+ /* check for empty pages with bitflips */
|
|
|
+ stat = nand_check_erased_ecc_chunk(p, chip->ecc.size,
|
|
|
+ &chip->buffers->ecccode[i],
|
|
|
+ chip->ecc.bytes,
|
|
|
+ NULL, 0,
|
|
|
+ chip->ecc.strength);
|
|
|
+ }
|
|
|
+
|
|
|
if (stat < 0) {
|
|
|
mtd->ecc_stats.failed++;
|
|
|
} else {
|
|
@@ -1475,6 +1485,15 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
int stat;
|
|
|
|
|
|
stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
|
|
|
+ if (stat == -EBADMSG &&
|
|
|
+ (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
|
|
|
+ /* check for empty pages with bitflips */
|
|
|
+ stat = nand_check_erased_ecc_chunk(p, eccsize,
|
|
|
+ &ecc_code[i], eccbytes,
|
|
|
+ NULL, 0,
|
|
|
+ chip->ecc.strength);
|
|
|
+ }
|
|
|
+
|
|
|
if (stat < 0) {
|
|
|
mtd->ecc_stats.failed++;
|
|
|
} else {
|
|
@@ -1527,6 +1546,15 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
|
|
|
chip->ecc.calculate(mtd, p, &ecc_calc[i]);
|
|
|
|
|
|
stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
|
|
|
+ if (stat == -EBADMSG &&
|
|
|
+ (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
|
|
|
+ /* check for empty pages with bitflips */
|
|
|
+ stat = nand_check_erased_ecc_chunk(p, eccsize,
|
|
|
+ &ecc_code[i], eccbytes,
|
|
|
+ NULL, 0,
|
|
|
+ chip->ecc.strength);
|
|
|
+ }
|
|
|
+
|
|
|
if (stat < 0) {
|
|
|
mtd->ecc_stats.failed++;
|
|
|
} else {
|
|
@@ -1554,6 +1582,7 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
int i, eccsize = chip->ecc.size;
|
|
|
int eccbytes = chip->ecc.bytes;
|
|
|
int eccsteps = chip->ecc.steps;
|
|
|
+ int eccpadbytes = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
|
|
|
uint8_t *p = buf;
|
|
|
uint8_t *oob = chip->oob_poi;
|
|
|
unsigned int max_bitflips = 0;
|
|
@@ -1573,19 +1602,29 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
chip->read_buf(mtd, oob, eccbytes);
|
|
|
stat = chip->ecc.correct(mtd, p, oob, NULL);
|
|
|
|
|
|
- if (stat < 0) {
|
|
|
- mtd->ecc_stats.failed++;
|
|
|
- } else {
|
|
|
- mtd->ecc_stats.corrected += stat;
|
|
|
- max_bitflips = max_t(unsigned int, max_bitflips, stat);
|
|
|
- }
|
|
|
-
|
|
|
oob += eccbytes;
|
|
|
|
|
|
if (chip->ecc.postpad) {
|
|
|
chip->read_buf(mtd, oob, chip->ecc.postpad);
|
|
|
oob += chip->ecc.postpad;
|
|
|
}
|
|
|
+
|
|
|
+ if (stat == -EBADMSG &&
|
|
|
+ (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) {
|
|
|
+ /* check for empty pages with bitflips */
|
|
|
+ stat = nand_check_erased_ecc_chunk(p, chip->ecc.size,
|
|
|
+ oob - eccpadbytes,
|
|
|
+ eccpadbytes,
|
|
|
+ NULL, 0,
|
|
|
+ chip->ecc.strength);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (stat < 0) {
|
|
|
+ mtd->ecc_stats.failed++;
|
|
|
+ } else {
|
|
|
+ mtd->ecc_stats.corrected += stat;
|
|
|
+ max_bitflips = max_t(unsigned int, max_bitflips, stat);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Calculate remaining oob bytes */
|