mtd: onenand: bugfix for 2x mode bad block handling
authorRoman Tereshonkov <roman.tereshonkov@nokia.com>
Thu, 2 Dec 2010 13:28:38 +0000 (15:28 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 3 Dec 2010 16:36:07 +0000 (16:36 +0000)
This bug becomes visible in 2x mode when chip->writesize
is different from mtd->writesize (= 2 * chip->writesize).
At this case the bad block information is read from
the first and the third physical pages instead of
the first and the second as specification states.

Signed-off-by: Roman Tereshonkov <roman.tereshonkov@nokia.com>
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/onenand/onenand_bbt.c

index 01ab5b3c453bec598380a79cc2594fc70b760d89..905209bf94653c7f2e283e583a05ad92d1bf68fe 100644 (file)
@@ -91,13 +91,15 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
                for (j = 0; j < len; j++) {
                        /* No need to read pages fully,
                         * just read required OOB bytes */
-                       ret = onenand_bbt_read_oob(mtd, from + j * mtd->writesize + bd->offs, &ops);
+                       ret = onenand_bbt_read_oob(mtd,
+                               from + j * this->writesize + bd->offs, &ops);
 
                        /* If it is a initial bad block, just ignore it */
                        if (ret == ONENAND_BBT_READ_FATAL_ERROR)
                                return -EIO;
 
-                       if (ret || check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) {
+                       if (ret || check_short_pattern(&buf[j * scanlen],
+                                              scanlen, this->writesize, bd)) {
                                bbm->bbt[i >> 3] |= 0x03 << (i & 0x6);
                                printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n",
                                        i >> 1, (unsigned int) from);