summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/nand/nand_bbt.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index 11185aa6273..e7976c7a7bb 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -909,11 +909,9 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
writeops = 0x03;
} else if (td->pages[i] == -1) {
rd = md;
- td->version[i] = md->version[i];
writeops = 0x01;
} else if (md->pages[i] == -1) {
rd = td;
- md->version[i] = td->version[i];
writeops = 0x02;
} else if (td->version[i] == md->version[i]) {
rd = td;
@@ -921,11 +919,9 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
rd2 = md;
} else if (((int8_t)(td->version[i] - md->version[i])) > 0) {
rd = td;
- md->version[i] = td->version[i];
writeops = 0x02;
} else {
rd = md;
- td->version[i] = md->version[i];
writeops = 0x01;
}
} else {
@@ -957,6 +953,7 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
if (mtd_is_eccerr(res)) {
/* Mark table as invalid */
rd->pages[i] = -1;
+ rd->version[i] = 0;
i--;
continue;
}
@@ -967,6 +964,7 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
if (mtd_is_eccerr(res2)) {
/* Mark table as invalid */
rd2->pages[i] = -1;
+ rd2->version[i] = 0;
i--;
continue;
}
@@ -976,6 +974,12 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
if (mtd_is_bitflip(res) || mtd_is_bitflip(res2))
writeops = 0x03;
+ /* Update version numbers before writing */
+ if (md) {
+ td->version[i] = max(td->version[i], md->version[i]);
+ md->version[i] = td->version[i];
+ }
+
/* Write the bad block table to the device? */
if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
res = write_bbt(mtd, buf, td, md, chipsel);