diff options
Diffstat (limited to 'drivers/mtd/nand/nand_bbt.c')
| -rw-r--r-- | drivers/mtd/nand/nand_bbt.c | 51 | 
1 files changed, 10 insertions, 41 deletions
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c index bc06196d573..7f0c3b4c2a4 100644 --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c @@ -412,25 +412,6 @@ static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,  	}  } -/* Scan a given block full */ -static int scan_block_full(struct mtd_info *mtd, struct nand_bbt_descr *bd, -			   loff_t offs, uint8_t *buf, size_t readlen, -			   int scanlen, int numpages) -{ -	int ret, j; - -	ret = scan_read_oob(mtd, buf, offs, readlen); -	/* Ignore ECC errors when checking for BBM */ -	if (ret && !mtd_is_bitflip_or_eccerr(ret)) -		return ret; - -	for (j = 0; j < numpages; j++, buf += scanlen) { -		if (check_pattern(buf, scanlen, mtd->writesize, bd)) -			return 1; -	} -	return 0; -} -  /* Scan a given block partially */  static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,  			   loff_t offs, uint8_t *buf, int numpages) @@ -477,24 +458,17 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,  	struct nand_bbt_descr *bd, int chip)  {  	struct nand_chip *this = mtd->priv; -	int i, numblocks, numpages, scanlen; +	int i, numblocks, numpages;  	int startblock;  	loff_t from; -	size_t readlen;  	pr_info("Scanning device for bad blocks\n"); -	if (bd->options & NAND_BBT_SCANALLPAGES) -		numpages = 1 << (this->bbt_erase_shift - this->page_shift); -	else if (bd->options & NAND_BBT_SCAN2NDPAGE) +	if (bd->options & NAND_BBT_SCAN2NDPAGE)  		numpages = 2;  	else  		numpages = 1; -	/* We need only read few bytes from the OOB area */ -	scanlen = 0; -	readlen = bd->len; -  	if (chip == -1) {  		numblocks = mtd->size >> this->bbt_erase_shift;  		startblock = 0; @@ -519,12 +493,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,  		BUG_ON(bd->options & NAND_BBT_NO_OOB); -		if (bd->options & NAND_BBT_SCANALLPAGES) -			ret = scan_block_full(mtd, bd, from, buf, readlen, -					      scanlen, numpages); -		else -			ret = scan_block_fast(mtd, bd, from, buf, numpages); - +		ret = scan_block_fast(mtd, bd, from, buf, numpages);  		if (ret < 0)  			return ret; @@ -559,7 +528,7 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr  {  	struct nand_chip *this = mtd->priv;  	int i, chips; -	int bits, startblock, block, dir; +	int startblock, block, dir;  	int scanlen = mtd->writesize + mtd->oobsize;  	int bbtblocks;  	int blocktopage = this->bbt_erase_shift - this->page_shift; @@ -583,9 +552,6 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr  		bbtblocks = mtd->size >> this->bbt_erase_shift;  	} -	/* Number of bits for each erase block in the bbt */ -	bits = td->options & NAND_BBT_NRBITS_MSK; -  	for (i = 0; i < chips; i++) {  		/* Reset version information */  		td->version[i] = 0; @@ -1316,6 +1282,7 @@ static int nand_create_badblock_pattern(struct nand_chip *this)  int nand_default_bbt(struct mtd_info *mtd)  {  	struct nand_chip *this = mtd->priv; +	int ret;  	/* Is a flash based bad block table requested? */  	if (this->bbt_options & NAND_BBT_USE_FLASH) { @@ -1334,8 +1301,11 @@ int nand_default_bbt(struct mtd_info *mtd)  		this->bbt_md = NULL;  	} -	if (!this->badblock_pattern) -		nand_create_badblock_pattern(this); +	if (!this->badblock_pattern) { +		ret = nand_create_badblock_pattern(this); +		if (ret) +			return ret; +	}  	return nand_scan_bbt(mtd, this->badblock_pattern);  } @@ -1392,4 +1362,3 @@ int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)  }  EXPORT_SYMBOL(nand_scan_bbt); -EXPORT_SYMBOL(nand_default_bbt);  | 
