aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/nand_bbt.c
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2011-09-20 21:36:42 -0400
committerArtem Bityutskiy <artem.bityutskiy@intel.com>2011-09-21 02:19:08 -0400
commit752ed6c5f8c0ee182219ff8682f5a98e47ee866f (patch)
treeaa7333340bff8c91d31202e46c52d0b104723f23 /drivers/mtd/nand/nand_bbt.c
parentdadc17a3e34810ed411a62e6b4cafdf3e5e1d5c8 (diff)
mtd: nand: do not scan bad blocks with NAND_BBT_NO_OOB set
Updates to our default function for creating bad block patterns have broken the "no OOB" feature. The NAND_BBT_NO_OOB option should not be set while scanning for bad blocks, but we've been passing all BBT options from nand_chip.bbt_options to the bad block scan. This causes us to hit the: BUG_ON(bd->options & NAND_BBT_NO_OOB); in create_bbt() when we scan the flash for bad blocks. Thus, while it can be legal to set NAND_BBT_NO_OOB in a custom badblock pattern descriptor (presumably with NAND_BBT_CREATE disabled?), we should not pass it through in our default function. Also, to help clarify and emphasize that the function creates bad block patterns only (not, for example, table descriptors for locating flash-based BBT), I renamed `nand_create_default_bbt_descr' to `nand_create_badblock_pattern'. Signed-off-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@intel.com>
Diffstat (limited to 'drivers/mtd/nand/nand_bbt.c')
-rw-r--r--drivers/mtd/nand/nand_bbt.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index e7976c7a7bb0..783093d1a2e5 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -1294,26 +1294,27 @@ static struct nand_bbt_descr bbt_mirror_no_bbt_descr = {
1294 .pattern = mirror_pattern 1294 .pattern = mirror_pattern
1295}; 1295};
1296 1296
1297#define BADBLOCK_SCAN_MASK (~NAND_BBT_NO_OOB)
1297/** 1298/**
1298 * nand_create_default_bbt_descr - [INTERN] Creates a BBT descriptor structure 1299 * nand_create_badblock_pattern - [INTERN] Creates a BBT descriptor structure
1299 * @this: NAND chip to create descriptor for 1300 * @this: NAND chip to create descriptor for
1300 * 1301 *
1301 * This function allocates and initializes a nand_bbt_descr for BBM detection 1302 * This function allocates and initializes a nand_bbt_descr for BBM detection
1302 * based on the properties of "this". The new descriptor is stored in 1303 * based on the properties of @this. The new descriptor is stored in
1303 * this->badblock_pattern. Thus, this->badblock_pattern should be NULL when 1304 * this->badblock_pattern. Thus, this->badblock_pattern should be NULL when
1304 * passed to this function. 1305 * passed to this function.
1305 */ 1306 */
1306static int nand_create_default_bbt_descr(struct nand_chip *this) 1307static int nand_create_badblock_pattern(struct nand_chip *this)
1307{ 1308{
1308 struct nand_bbt_descr *bd; 1309 struct nand_bbt_descr *bd;
1309 if (this->badblock_pattern) { 1310 if (this->badblock_pattern) {
1310 pr_warn("BBT descr already allocated; not replacing\n"); 1311 pr_warn("Bad block pattern already allocated; not replacing\n");
1311 return -EINVAL; 1312 return -EINVAL;
1312 } 1313 }
1313 bd = kzalloc(sizeof(*bd), GFP_KERNEL); 1314 bd = kzalloc(sizeof(*bd), GFP_KERNEL);
1314 if (!bd) 1315 if (!bd)
1315 return -ENOMEM; 1316 return -ENOMEM;
1316 bd->options = this->bbt_options; 1317 bd->options = this->bbt_options & BADBLOCK_SCAN_MASK;
1317 bd->offs = this->badblockpos; 1318 bd->offs = this->badblockpos;
1318 bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1; 1319 bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1;
1319 bd->pattern = scan_ff_pattern; 1320 bd->pattern = scan_ff_pattern;
@@ -1367,7 +1368,7 @@ int nand_default_bbt(struct mtd_info *mtd)
1367 } 1368 }
1368 1369
1369 if (!this->badblock_pattern) 1370 if (!this->badblock_pattern)
1370 nand_create_default_bbt_descr(this); 1371 nand_create_badblock_pattern(this);
1371 1372
1372 return nand_scan_bbt(mtd, this->badblock_pattern); 1373 return nand_scan_bbt(mtd, this->badblock_pattern);
1373} 1374}