@ -182,16 +182,19 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
if ( tmp = = msk )
continue ;
if ( reserved_block_code & & ( tmp = = reserved_block_code ) ) {
printk ( KERN_DEBUG " nand_read_bbt: Reserved block at 0x%08x \n " ,
( ( offs < < 2 ) + ( act > > 1 ) ) < < this - > bbt_erase_shift ) ;
printk ( KERN_DEBUG " nand_read_bbt: Reserved block at 0x%012llx \n " ,
( loff_t ) ( ( offs < < 2 ) +
( act > > 1 ) ) < <
this - > bbt_erase_shift ) ;
this - > bbt [ offs + ( act > > 3 ) ] | = 0x2 < < ( act & 0x06 ) ;
mtd - > ecc_stats . bbtblocks + + ;
continue ;
}
/* Leave it for now, if its matured we can move this
* message to MTD_DEBUG_LEVEL0 */
printk ( KERN_DEBUG " nand_read_bbt: Bad block at 0x%08x \n " ,
( ( offs < < 2 ) + ( act > > 1 ) ) < < this - > bbt_erase_shift ) ;
printk ( KERN_DEBUG " nand_read_bbt: Bad block at 0x%012llx \n " ,
( loff_t ) ( ( offs < < 2 ) + ( act > > 1 ) ) < <
this - > bbt_erase_shift ) ;
/* Factory marked bad or worn out ? */
if ( tmp = = 0 )
this - > bbt [ offs + ( act > > 3 ) ] | = 0x3 < < ( act & 0x06 ) ;
@ -295,8 +298,8 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
/* Read the primary version, if available */
if ( td - > options & NAND_BBT_VERSION ) {
scan_read_raw ( mtd , buf , td - > pages [ 0 ] < < this - > page_shift ,
mtd - > writesize ) ;
scan_read_raw ( mtd , buf , ( loff_t ) td - > pages [ 0 ] < <
this - > page_shift , mtd - > writesize ) ;
td - > version [ 0 ] = buf [ mtd - > writesize + td - > veroffs ] ;
printk ( KERN_DEBUG " Bad block table at page %d, version 0x%02X \n " ,
td - > pages [ 0 ] , td - > version [ 0 ] ) ;
@ -304,8 +307,8 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
/* Read the mirror version, if available */
if ( md & & ( md - > options & NAND_BBT_VERSION ) ) {
scan_read_raw ( mtd , buf , md - > pages [ 0 ] < < this - > page_shift ,
mtd - > writesize ) ;
scan_read_raw ( mtd , buf , ( loff_t ) md - > pages [ 0 ] < <
this - > page_shift , mtd - > writesize ) ;
md - > version [ 0 ] = buf [ mtd - > writesize + md - > veroffs ] ;
printk ( KERN_DEBUG " Bad block table at page %d, version 0x%02X \n " ,
md - > pages [ 0 ] , md - > version [ 0 ] ) ;
@ -422,7 +425,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
numblocks = this - > chipsize > > ( this - > bbt_erase_shift - 1 ) ;
startblock = chip * numblocks ;
numblocks + = startblock ;
from = startblock < < ( this - > bbt_erase_shift - 1 ) ;
from = ( loff_t ) startblock < < ( this - > bbt_erase_shift - 1 ) ;
}
for ( i = startblock ; i < numblocks ; ) {
@ -440,8 +443,8 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
if ( ret ) {
this - > bbt [ i > > 3 ] | = 0x03 < < ( i & 0x6 ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 ,
" Bad eraseblock %d at 0x%08 x \n " ,
i > > 1 , ( unsigned int ) from ) ;
" Bad eraseblock %d at 0x%012ll x \n " ,
i > > 1 , ( unsigned long long ) from ) ;
mtd - > ecc_stats . badblocks + + ;
}
@ -507,7 +510,7 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
for ( block = 0 ; block < td - > maxblocks ; block + + ) {
int actblock = startblock + dir * block ;
loff_t offs = actblock < < this - > bbt_erase_shift ;
loff_t offs = ( loff_t ) actblock < < this - > bbt_erase_shift ;
/* Read first page */
scan_read_raw ( mtd , buf , offs , mtd - > writesize ) ;
@ -731,7 +734,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
memset ( & einfo , 0 , sizeof ( einfo ) ) ;
einfo . mtd = mtd ;
einfo . addr = ( unsigned long ) to ;
einfo . addr = to ;
einfo . len = 1 < < this - > bbt_erase_shift ;
res = nand_erase_nand ( mtd , & einfo , 1 ) ;
if ( res < 0 )
@ -741,8 +744,9 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
if ( res < 0 )
goto outerr ;
printk ( KERN_DEBUG " Bad block table written to 0x%08x, version "
" 0x%02X \n " , ( unsigned int ) to , td - > version [ chip ] ) ;
printk ( KERN_DEBUG " Bad block table written to 0x%012llx, "
" version 0x%02X \n " , ( unsigned long long ) to ,
td - > version [ chip ] ) ;
/* Mark it as used */
td - > pages [ chip ] = page ;
@ -922,7 +926,8 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
newval = oldval | ( 0x2 < < ( block & 0x06 ) ) ;
this - > bbt [ ( block > > 3 ) ] = newval ;
if ( ( oldval ! = newval ) & & td - > reserved_block_code )
nand_update_bbt ( mtd , block < < ( this - > bbt_erase_shift - 1 ) ) ;
nand_update_bbt ( mtd , ( loff_t ) block < <
( this - > bbt_erase_shift - 1 ) ) ;
continue ;
}
update = 0 ;
@ -943,7 +948,8 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
new ones have been marked , then we need to update the stored
bbts . This should only happen once . */
if ( update & & td - > reserved_block_code )
nand_update_bbt ( mtd , ( block - 2 ) < < ( this - > bbt_erase_shift - 1 ) ) ;
nand_update_bbt ( mtd , ( loff_t ) ( block - 2 ) < <
( this - > bbt_erase_shift - 1 ) ) ;
}
}
@ -1039,7 +1045,6 @@ int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
if ( ! this - > bbt | | ! td )
return - EINVAL ;
len = mtd - > size > > ( this - > bbt_erase_shift + 2 ) ;
/* Allocate a temporary buffer for one eraseblock incl. oob */
len = ( 1 < < this - > bbt_erase_shift ) ;
len + = ( len > > this - > page_shift ) * mtd - > oobsize ;