]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/mtd/nand/nand_bbt.c
mtd: nand: refactor BB marker detection
[net-next-2.6.git] / drivers / mtd / nand / nand_bbt.c
index 71d83be24ff6757195cade3074f59208bb8b8c4b..ec1700eaf198dd7a737ac07c381ce4a0848af944 100644 (file)
@@ -1093,29 +1093,50 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
 
 static struct nand_bbt_descr smallpage_memorybased = {
-       .options = NAND_BBT_SCAN2NDPAGE,
-       .offs = 5,
+       .options = 0,
+       .offs = NAND_SMALL_BADBLOCK_POS,
        .len = 1,
        .pattern = scan_ff_pattern
 };
 
+static struct nand_bbt_descr smallpage_scan2nd_memorybased = {
+       .options = NAND_BBT_SCAN2NDPAGE,
+       .offs = NAND_SMALL_BADBLOCK_POS,
+       .len = 2,
+       .pattern = scan_ff_pattern
+};
+
 static struct nand_bbt_descr largepage_memorybased = {
        .options = 0,
-       .offs = 0,
+       .offs = NAND_LARGE_BADBLOCK_POS,
+       .len = 1,
+       .pattern = scan_ff_pattern
+};
+
+static struct nand_bbt_descr largepage_scan2nd_memorybased = {
+       .options = NAND_BBT_SCAN2NDPAGE,
+       .offs = NAND_LARGE_BADBLOCK_POS,
        .len = 2,
        .pattern = scan_ff_pattern
 };
 
+static struct nand_bbt_descr lastpage_memorybased = {
+       .options = NAND_BBT_SCANLASTPAGE,
+       .offs = 0,
+       .len = 1,
+       .pattern = scan_ff_pattern
+};
+
 static struct nand_bbt_descr smallpage_flashbased = {
        .options = NAND_BBT_SCAN2NDPAGE,
-       .offs = 5,
+       .offs = NAND_SMALL_BADBLOCK_POS,
        .len = 1,
        .pattern = scan_ff_pattern
 };
 
 static struct nand_bbt_descr largepage_flashbased = {
        .options = NAND_BBT_SCAN2NDPAGE,
-       .offs = 0,
+       .offs = NAND_LARGE_BADBLOCK_POS,
        .len = 2,
        .pattern = scan_ff_pattern
 };
@@ -1197,8 +1218,18 @@ int nand_default_bbt(struct mtd_info *mtd)
                this->bbt_td = NULL;
                this->bbt_md = NULL;
                if (!this->badblock_pattern) {
-                       this->badblock_pattern = (mtd->writesize > 512) ?
-                           &largepage_memorybased : &smallpage_memorybased;
+                       if (this->options & NAND_BBT_SCANLASTPAGE)
+                               this->badblock_pattern = &lastpage_memorybased;
+                       else if (this->options & NAND_BBT_SCAN2NDPAGE)
+                               this->badblock_pattern = this->badblockpos ==
+                                       NAND_SMALL_BADBLOCK_POS ?
+                                       &smallpage_scan2nd_memorybased :
+                                       &largepage_scan2nd_memorybased;
+                       else
+                               this->badblock_pattern = this->badblockpos ==
+                                       NAND_SMALL_BADBLOCK_POS ?
+                                       &smallpage_memorybased :
+                                       &largepage_memorybased;
                }
        }
        return nand_scan_bbt(mtd, this->badblock_pattern);