]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/mtd/onenand/onenand_bbt.c
Merge git://git.infradead.org/~kmpark/onenand-mtd-2.6
[mv-sheeva.git] / drivers / mtd / onenand / onenand_bbt.c
index 4510d3361eaa82f77ddca510bb4fa460a26cb3f1..6cceeca405679fd2b2cd25b8c43ffc3c322923a4 100644 (file)
@@ -17,6 +17,9 @@
 #include <linux/mtd/onenand.h>
 #include <linux/mtd/compatmac.h>
 
+extern int onenand_do_read_oob(struct mtd_info *mtd, loff_t from, size_t len,
+                              size_t *retlen, u_char *buf);
+
 /**
  * check_short_pattern - [GENERIC] check if a pattern is in the buffer
  * @param buf          the buffer to search
@@ -87,16 +90,17 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
 
                        /* No need to read pages fully,
                         * just read required OOB bytes */
-                       ret = mtd->read_oob(mtd, from + j * mtd->oobblock + bd->offs,
-                                               readlen, &retlen, &buf[0]);
+                       ret = onenand_do_read_oob(mtd, from + j * mtd->writesize + bd->offs,
+                                                 readlen, &retlen, &buf[0]);
 
                        if (ret)
                                return ret;
 
-                       if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->oobblock, bd)) {
+                       if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) {
                                bbm->bbt[i >> 3] |= 0x03 << (i & 0x6);
                                printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n",
                                        i >> 1, (unsigned int) from);
+                               mtd->ecc_stats.badblocks++;
                                break;
                        }
                }
@@ -174,14 +178,12 @@ int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        int len, ret = 0;
 
        len = mtd->size >> (this->erase_shift + 2);
-       /* Allocate memory (2bit per block) */
-       bbm->bbt = kmalloc(len, GFP_KERNEL);
+       /* Allocate memory (2bit per block) and clear the memory bad block table */
+       bbm->bbt = kzalloc(len, GFP_KERNEL);
        if (!bbm->bbt) {
                printk(KERN_ERR "onenand_scan_bbt: Out of memory\n");
                return -ENOMEM;
        }
-       /* Clear the memory bad block table */
-       memset(bbm->bbt, 0x00, len);
 
        /* Set the bad block position */
        bbm->badblockpos = ONENAND_BADBLOCK_POS;
@@ -227,14 +229,12 @@ int onenand_default_bbt(struct mtd_info *mtd)
        struct onenand_chip *this = mtd->priv;
        struct bbm_info *bbm;
 
-       this->bbm = kmalloc(sizeof(struct bbm_info), GFP_KERNEL);
+       this->bbm = kzalloc(sizeof(struct bbm_info), GFP_KERNEL);
        if (!this->bbm)
                return -ENOMEM;
 
        bbm = this->bbm;
 
-       memset(bbm, 0, sizeof(struct bbm_info));
-
        /* 1KB page has same configuration as 2KB page */
        if (!bbm->badblock_pattern)
                bbm->badblock_pattern = &largepage_memorybased;