diff options
Diffstat (limited to 'drivers/mtd/onenand/onenand_bbt.c')
| -rw-r--r-- | drivers/mtd/onenand/onenand_bbt.c | 14 | 
1 files changed, 10 insertions, 4 deletions
| diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c index d538f9582..135487772 100644 --- a/drivers/mtd/onenand/onenand_bbt.c +++ b/drivers/mtd/onenand/onenand_bbt.c @@ -69,6 +69,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t * buf,  	loff_t from;  	size_t readlen, ooblen;  	struct mtd_oob_ops ops; +	int rgn;  	printk(KERN_INFO "Scanning device for bad blocks\n"); @@ -82,7 +83,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t * buf,  	/* Note that numblocks is 2 * (real numblocks) here;  	 * see i += 2 below as it makses shifting and masking less painful  	 */ -	numblocks = mtd->size >> (bbm->bbt_erase_shift - 1); +	numblocks = this->chipsize >> (bbm->bbt_erase_shift - 1);  	startblock = 0;  	from = 0; @@ -115,7 +116,12 @@ static int create_bbt(struct mtd_info *mtd, uint8_t * buf,  			}  		}  		i += 2; -		from += (1 << bbm->bbt_erase_shift); + +		if (FLEXONENAND(this)) { +			rgn = flexonenand_region(mtd, from); +			from += mtd->eraseregions[rgn].erasesize; +		} else +			from += (1 << bbm->bbt_erase_shift);  	}  	return 0; @@ -152,7 +158,7 @@ static int onenand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)  	uint8_t res;  	/* Get block number * 2 */ -	block = (int)(offs >> (bbm->bbt_erase_shift - 1)); +	block = (int) (onenand_block(this, offs) << 1);  	res = (bbm->bbt[block >> 3] >> (block & 0x06)) & 0x03;  	MTDDEBUG (MTD_DEBUG_LEVEL2, @@ -191,7 +197,7 @@ int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)  	struct bbm_info *bbm = this->bbm;  	int len, ret = 0; -	len = mtd->size >> (this->erase_shift + 2); +	len = this->chipsize >> (this->erase_shift + 2);  	/* Allocate memory (2bit per block) */  	bbm->bbt = malloc(len);  	if (!bbm->bbt) { |