diff options
Diffstat (limited to 'drivers/mtd/nand/nand_base.c')
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 26 | 
1 files changed, 16 insertions, 10 deletions
| diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 426bb95e9..30a3e9e74 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2211,13 +2211,15 @@ static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)  int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  		    int allowbbt)  { -	int page, len, status, pages_per_block, ret, chipnr; +	int page, status, pages_per_block, ret, chipnr;  	struct nand_chip *chip = mtd->priv; -	int rewrite_bbt[CONFIG_SYS_NAND_MAX_CHIPS]={0}; +	loff_t rewrite_bbt[CONFIG_SYS_NAND_MAX_CHIPS] = {0};  	unsigned int bbt_masked_page = 0xffffffff; +	loff_t len; -	MTDDEBUG (MTD_DEBUG_LEVEL3, "nand_erase: start = 0x%08x, len = %i\n", -	          (unsigned int) instr->addr, (unsigned int) instr->len); +	MTDDEBUG(MTD_DEBUG_LEVEL3, "nand_erase: start = 0x%012llx, " +		 "len = %llu\n", (unsigned long long) instr->addr, +		 (unsigned long long) instr->len);  	/* Start address must align on block boundary */  	if (instr->addr & ((1 << chip->phys_erase_shift) - 1)) { @@ -2313,7 +2315,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  			MTDDEBUG (MTD_DEBUG_LEVEL0, "nand_erase: "  			          "Failed erase, page 0x%08x\n", page);  			instr->state = MTD_ERASE_FAILED; -			instr->fail_addr = (page << chip->page_shift); +			instr->fail_addr = ((loff_t)page << chip->page_shift);  			goto erase_exit;  		} @@ -2323,7 +2325,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  		 */  		if (bbt_masked_page != 0xffffffff &&  		    (page & BBT_PAGE_MASK) == bbt_masked_page) -			    rewrite_bbt[chipnr] = (page << chip->page_shift); +			rewrite_bbt[chipnr] = +				((loff_t)page << chip->page_shift);  		/* Increment page address and decrement length */  		len -= (1 << chip->phys_erase_shift); @@ -2370,8 +2373,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,  			continue;  		/* update the BBT for chip */  		MTDDEBUG (MTD_DEBUG_LEVEL0, "nand_erase_nand: nand_update_bbt " -		          "(%d:0x%0x 0x%0x)\n", chipnr, rewrite_bbt[chipnr], -		          chip->bbt_td->pages[chipnr]); +			  "(%d:0x%0llx 0x%0x)\n", chipnr, rewrite_bbt[chipnr], +			  chip->bbt_td->pages[chipnr]);  		nand_update_bbt(mtd, rewrite_bbt[chipnr]);  	} @@ -2566,7 +2569,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	if (!mtd->name)  		mtd->name = type->name; -	chip->chipsize = type->chipsize << 20; +	chip->chipsize = (uint64_t)type->chipsize << 20;  	/* Newer devices have all the information in additional id bytes */  	if (!type->pagesize) { @@ -2624,7 +2627,10 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  	chip->bbt_erase_shift = chip->phys_erase_shift =  		ffs(mtd->erasesize) - 1; -	chip->chip_shift = ffs(chip->chipsize) - 1; +	if (chip->chipsize & 0xffffffff) +		chip->chip_shift = ffs(chip->chipsize) - 1; +	else +		chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32)) + 31;  	/* Set the bad block position */  	chip->badblockpos = mtd->writesize > 512 ? |