aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/nand_bbt.c
diff options
context:
space:
mode:
authorBrian Norris <norris@broadcom.com>2010-07-13 18:13:00 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2010-08-02 04:08:52 -0400
commitc7b28e25cb9beb943aead770ff14551b55fa8c79 (patch)
treee51adab05413609c059daa827b454c66f1a207b7 /drivers/mtd/nand/nand_bbt.c
parent78d1022439e501bc4a1a32bfaad5a321b8a9d5d6 (diff)
mtd: nand: refactor BB marker detection
Some level of support for various scanning locations was already built in, but this required clean-up. First, BB marker location cannot be determined _only_ by the page size. Instead, I implemented some heuristic detection based on data sheets from various manufacturers (all found in nand_base.c:nand_get_flash_type()). Second, once these options were identified, they were not handled properly by nand_bbt.c:nand_default_bbt(). I updated the static nand_bbt_desc structs to reflect the need for more combinations of detection. The memory allocation here probably needs to be done dynamically in the very near future (see next patches). Signed-off-by: Brian Norris <norris@broadcom.com> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/nand/nand_bbt.c')
-rw-r--r--drivers/mtd/nand/nand_bbt.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index 71d83be24ff6..ec1700eaf198 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -1093,29 +1093,50 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
1093static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; 1093static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
1094 1094
1095static struct nand_bbt_descr smallpage_memorybased = { 1095static struct nand_bbt_descr smallpage_memorybased = {
1096 .options = NAND_BBT_SCAN2NDPAGE, 1096 .options = 0,
1097 .offs = 5, 1097 .offs = NAND_SMALL_BADBLOCK_POS,
1098 .len = 1, 1098 .len = 1,
1099 .pattern = scan_ff_pattern 1099 .pattern = scan_ff_pattern
1100}; 1100};
1101 1101
1102static struct nand_bbt_descr smallpage_scan2nd_memorybased = {
1103 .options = NAND_BBT_SCAN2NDPAGE,
1104 .offs = NAND_SMALL_BADBLOCK_POS,
1105 .len = 2,
1106 .pattern = scan_ff_pattern
1107};
1108
1102static struct nand_bbt_descr largepage_memorybased = { 1109static struct nand_bbt_descr largepage_memorybased = {
1103 .options = 0, 1110 .options = 0,
1104 .offs = 0, 1111 .offs = NAND_LARGE_BADBLOCK_POS,
1112 .len = 1,
1113 .pattern = scan_ff_pattern
1114};
1115
1116static struct nand_bbt_descr largepage_scan2nd_memorybased = {
1117 .options = NAND_BBT_SCAN2NDPAGE,
1118 .offs = NAND_LARGE_BADBLOCK_POS,
1105 .len = 2, 1119 .len = 2,
1106 .pattern = scan_ff_pattern 1120 .pattern = scan_ff_pattern
1107}; 1121};
1108 1122
1123static struct nand_bbt_descr lastpage_memorybased = {
1124 .options = NAND_BBT_SCANLASTPAGE,
1125 .offs = 0,
1126 .len = 1,
1127 .pattern = scan_ff_pattern
1128};
1129
1109static struct nand_bbt_descr smallpage_flashbased = { 1130static struct nand_bbt_descr smallpage_flashbased = {
1110 .options = NAND_BBT_SCAN2NDPAGE, 1131 .options = NAND_BBT_SCAN2NDPAGE,
1111 .offs = 5, 1132 .offs = NAND_SMALL_BADBLOCK_POS,
1112 .len = 1, 1133 .len = 1,
1113 .pattern = scan_ff_pattern 1134 .pattern = scan_ff_pattern
1114}; 1135};
1115 1136
1116static struct nand_bbt_descr largepage_flashbased = { 1137static struct nand_bbt_descr largepage_flashbased = {
1117 .options = NAND_BBT_SCAN2NDPAGE, 1138 .options = NAND_BBT_SCAN2NDPAGE,
1118 .offs = 0, 1139 .offs = NAND_LARGE_BADBLOCK_POS,
1119 .len = 2, 1140 .len = 2,
1120 .pattern = scan_ff_pattern 1141 .pattern = scan_ff_pattern
1121}; 1142};
@@ -1197,8 +1218,18 @@ int nand_default_bbt(struct mtd_info *mtd)
1197 this->bbt_td = NULL; 1218 this->bbt_td = NULL;
1198 this->bbt_md = NULL; 1219 this->bbt_md = NULL;
1199 if (!this->badblock_pattern) { 1220 if (!this->badblock_pattern) {
1200 this->badblock_pattern = (mtd->writesize > 512) ? 1221 if (this->options & NAND_BBT_SCANLASTPAGE)
1201 &largepage_memorybased : &smallpage_memorybased; 1222 this->badblock_pattern = &lastpage_memorybased;
1223 else if (this->options & NAND_BBT_SCAN2NDPAGE)
1224 this->badblock_pattern = this->badblockpos ==
1225 NAND_SMALL_BADBLOCK_POS ?
1226 &smallpage_scan2nd_memorybased :
1227 &largepage_scan2nd_memorybased;
1228 else
1229 this->badblock_pattern = this->badblockpos ==
1230 NAND_SMALL_BADBLOCK_POS ?
1231 &smallpage_memorybased :
1232 &largepage_memorybased;
1202 } 1233 }
1203 } 1234 }
1204 return nand_scan_bbt(mtd, this->badblock_pattern); 1235 return nand_scan_bbt(mtd, this->badblock_pattern);