@ -71,7 +71,7 @@ static struct nand_ecclayout nand_oob_8 = {
{ . offset = 3 ,
. length = 2 } ,
{ . offset = 6 ,
. length = 2 } }
. length = 2 } }
} ;
static struct nand_ecclayout nand_oob_16 = {
@ -79,7 +79,7 @@ static struct nand_ecclayout nand_oob_16 = {
. eccpos = { 0 , 1 , 2 , 3 , 6 , 7 } ,
. oobfree = {
{ . offset = 8 ,
. length = 8 } }
. length = 8 } }
} ;
static struct nand_ecclayout nand_oob_64 = {
@ -90,24 +90,23 @@ static struct nand_ecclayout nand_oob_64 = {
56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 } ,
. oobfree = {
{ . offset = 2 ,
. length = 38 } }
. length = 38 } }
} ;
static struct nand_ecclayout nand_oob_128 = {
. eccbytes = 48 ,
. eccpos = {
80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 ,
88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 ,
96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 ,
80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 ,
88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 ,
96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 ,
104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 ,
112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 ,
120 , 121 , 122 , 123 , 124 , 125 , 126 , 127 } ,
. oobfree = {
{ . offset = 2 ,
. length = 78 } }
. length = 78 } }
} ;
static int nand_get_device ( struct nand_chip * chip , struct mtd_info * mtd ,
int new_state ) ;
@ -122,7 +121,7 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *this);
*
* Deselect , release chip lock and wake up anyone waiting on the device
*/
static void nand_release_device ( struct mtd_info * mtd )
static void nand_release_device ( struct mtd_info * mtd )
{
struct nand_chip * this = mtd - > priv ;
this - > select_chip ( mtd , - 1 ) ; /* De-select the NAND device */
@ -769,8 +768,9 @@ static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
*
* We need a special oob layout and handling even when OOB isn ' t used .
*/
static int nand_read_page_raw_syndrome ( struct mtd_info * mtd , struct nand_chip * chip ,
uint8_t * buf , int page )
static int nand_read_page_raw_syndrome ( struct mtd_info * mtd ,
struct nand_chip * chip ,
uint8_t * buf , int page )
{
int eccsize = chip - > ecc . size ;
int eccbytes = chip - > ecc . bytes ;
@ -851,7 +851,8 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
* @ readlen : data length
* @ bufpoi : buffer to store read data
*/
static int nand_read_subpage ( struct mtd_info * mtd , struct nand_chip * chip , uint32_t data_offs , uint32_t readlen , uint8_t * bufpoi )
static int nand_read_subpage ( struct mtd_info * mtd , struct nand_chip * chip ,
uint32_t data_offs , uint32_t readlen , uint8_t * bufpoi )
{
int start_step , end_step , num_steps ;
uint32_t * eccpos = chip - > ecc . layout - > eccpos ;
@ -1083,7 +1084,7 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
static uint8_t * nand_transfer_oob ( struct nand_chip * chip , uint8_t * oob ,
struct mtd_oob_ops * ops , size_t len )
{
switch ( ops - > mode ) {
switch ( ops - > mode ) {
case MTD_OOB_PLACE :
case MTD_OOB_RAW :
@ -1095,7 +1096,7 @@ static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
uint32_t boffs = 0 , roffs = ops - > ooboffs ;
size_t bytes = 0 ;
for ( ; free - > length & & len ; free + + , len - = bytes ) {
for ( ; free - > length & & len ; free + + , len - = bytes ) {
/* Read request not from offset 0 ? */
if ( unlikely ( roffs ) ) {
if ( roffs > = free - > length ) {
@ -1156,7 +1157,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
buf = ops - > datbuf ;
oob = ops - > oobbuf ;
while ( 1 ) {
while ( 1 ) {
WATCHDOG_RESET ( ) ;
bytes = min ( mtd - > writesize - col , readlen ) ;
@ -1174,12 +1175,13 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
/* Now read the page into the buffer */
if ( unlikely ( ops - > mode = = MTD_OOB_RAW ) )
ret = chip - > ecc . read_page_raw ( mtd , chip ,
bufpoi , page ) ;
bufpoi , page ) ;
else if ( ! aligned & & NAND_SUBPAGE_READ ( chip ) & & ! oob )
ret = chip - > ecc . read_subpage ( mtd , chip , col , bytes , bufpoi ) ;
ret = chip - > ecc . read_subpage ( mtd , chip ,
col , bytes , bufpoi ) ;
else
ret = chip - > ecc . read_page ( mtd , chip , bufpoi ,
page ) ;
page ) ;
if ( ret < 0 )
break ;
@ -1260,11 +1262,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
if ( mtd - > ecc_stats . failed - stats . failed )
return - EBADMSG ;
return mtd - > ecc_stats . corrected - stats . corrected ? - EUCLEAN : 0 ;
return mtd - > ecc_stats . corrected - stats . corrected ? - EUCLEAN : 0 ;
}
/**
* nand_read - [ MTD Interface ] MTD compability function for nand_do_read_ecc
* nand_read - [ MTD Interface ] MTD compati bility function for nand_do_read_ecc
* @ mtd : MTD device structure
* @ from : offset to read from
* @ len : number of bytes to read
@ -1457,8 +1459,8 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
int len ;
uint8_t * buf = ops - > oobbuf ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " nand_read_oob : from = 0x%08Lx, len = %i\n " ,
( unsigned long long ) from , readlen ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " %s : from = 0x%08Lx, len = %i\n " ,
__func__ , ( unsigned long long ) from , readlen ) ;
if ( ops - > mode = = MTD_OOB_AUTO )
len = chip - > ecc . layout - > oobavail ;
@ -1466,8 +1468,8 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
len = mtd - > oobsize ;
if ( unlikely ( ops - > ooboffs > = len ) ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_read_oob: "
" Attempt to start read outside oob\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt to start read "
" outside oob \n " , __func__ ) ;
return - EINVAL ;
}
@ -1475,8 +1477,8 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
if ( unlikely ( from > = mtd - > size | |
ops - > ooboffs + readlen > ( ( mtd - > size > > chip - > page_shift ) -
( from > > chip - > page_shift ) ) * len ) ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_read_oob: "
" Attempt read beyond end of device\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt read beyond end "
" of device \n " , __func__ ) ;
return - EINVAL ;
}
@ -1487,7 +1489,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
realpage = ( int ) ( from > > chip - > page_shift ) ;
page = realpage & chip - > pagemask ;
while ( 1 ) {
while ( 1 ) {
WATCHDOG_RESET ( ) ;
sndcmd = chip - > ecc . read_oob ( mtd , chip , page , sndcmd ) ;
@ -1551,14 +1553,14 @@ static int nand_read_oob(struct mtd_info *mtd, loff_t from,
/* Do not allow reads past end of device */
if ( ops - > datbuf & & ( from + ops - > len ) > mtd - > size ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_read_oob: "
" Attempt read beyond end of device\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt read "
" beyond end of device \n " , __func__ ) ;
return - EINVAL ;
}
nand_get_device ( chip , mtd , FL_READING ) ;
switch ( ops - > mode ) {
switch ( ops - > mode ) {
case MTD_OOB_PLACE :
case MTD_OOB_AUTO :
case MTD_OOB_RAW :
@ -1573,7 +1575,7 @@ static int nand_read_oob(struct mtd_info *mtd, loff_t from,
else
ret = nand_do_read_ops ( mtd , from , ops ) ;
out :
out :
nand_release_device ( mtd ) ;
return ret ;
}
@ -1602,8 +1604,9 @@ static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
*
* We need a special oob layout and handling even when ECC isn ' t checked .
*/
static void nand_write_page_raw_syndrome ( struct mtd_info * mtd , struct nand_chip * chip ,
const uint8_t * buf )
static void nand_write_page_raw_syndrome ( struct mtd_info * mtd ,
struct nand_chip * chip ,
const uint8_t * buf )
{
int eccsize = chip - > ecc . size ;
int eccbytes = chip - > ecc . bytes ;
@ -1797,7 +1800,7 @@ static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob,
{
size_t len = ops - > ooblen ;
switch ( ops - > mode ) {
switch ( ops - > mode ) {
case MTD_OOB_PLACE :
case MTD_OOB_RAW :
@ -1809,7 +1812,7 @@ static uint8_t *nand_fill_oob(struct nand_chip *chip, uint8_t *oob,
uint32_t boffs = 0 , woffs = ops - > ooboffs ;
size_t bytes = 0 ;
for ( ; free - > length & & len ; free + + , len - = bytes ) {
for ( ; free - > length & & len ; free + + , len - = bytes ) {
/* Write request not from offset 0 ? */
if ( unlikely ( woffs ) ) {
if ( woffs > = free - > length ) {
@ -1887,7 +1890,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
if ( likely ( ! oob ) )
memset ( chip - > oob_poi , 0xff , mtd - > oobsize ) ;
while ( 1 ) {
while ( 1 ) {
WATCHDOG_RESET ( ) ;
int bytes = mtd - > writesize ;
@ -1986,8 +1989,8 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
int chipnr , page , status , len ;
struct nand_chip * chip = mtd - > priv ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " nand_write_oob : to = 0x%08x, len = %i\n " ,
( unsigned int ) to , ( int ) ops - > ooblen ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " %s : to = 0x%08x, len = %i\n " ,
__func__ , ( unsigned int ) to , ( int ) ops - > ooblen ) ;
if ( ops - > mode = = MTD_OOB_AUTO )
len = chip - > ecc . layout - > oobavail ;
@ -1996,24 +1999,24 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
/* Do not allow write past end of page */
if ( ( ops - > ooboffs + ops - > ooblen ) > len ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_write_oob: "
" Attempt to write past end of page\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt to write "
" past end of page \n " , __func__ ) ;
return - EINVAL ;
}
if ( unlikely ( ops - > ooboffs > = len ) ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_read_oob: "
" Attempt to start write outside oob\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt to start "
" write outside oob \n " , __func__ ) ;
return - EINVAL ;
}
/* Do not allow reads past end of device */
/* Do not allow w rit e past end of device */
if ( unlikely ( to > = mtd - > size | |
ops - > ooboffs + ops - > ooblen >
( ( mtd - > size > > chip - > page_shift ) -
( to > > chip - > page_shift ) ) * len ) ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_read_oob: "
" Attempt write beyond end of device\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt write beyond "
" end of device \n " , __func__ ) ;
return - EINVAL ;
}
@ -2068,14 +2071,14 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to,
/* Do not allow writes past end of device */
if ( ops - > datbuf & & ( to + ops - > len ) > mtd - > size ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_read_oob: "
" Attempt read beyond end of device\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Attempt write beyond "
" end of device \n " , __func__ ) ;
return - EINVAL ;
}
nand_get_device ( chip , mtd , FL_WRITING ) ;
switch ( ops - > mode ) {
switch ( ops - > mode ) {
case MTD_OOB_PLACE :
case MTD_OOB_AUTO :
case MTD_OOB_RAW :
@ -2090,7 +2093,7 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to,
else
ret = nand_do_write_ops ( mtd , to , ops ) ;
out :
out :
nand_release_device ( mtd ) ;
return ret ;
}
@ -2159,9 +2162,9 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
unsigned int bbt_masked_page = 0xffffffff ;
loff_t len ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " nand_erase: start = 0x%012llx, "
" len = %llu \n " , ( unsigned long long ) instr - > addr ,
( unsigned long long ) instr - > len ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " %s: start = 0x%012llx, len = %llu \n " ,
__func__ , ( 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 ) ) {
@ -2200,8 +2203,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
/* Check, if it is write protected */
if ( nand_check_wp ( mtd ) ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 ,
" nand_erase: Device is write protected!!! \n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Device is write protected!!! \n " ,
__func__ ) ;
instr - > state = MTD_ERASE_FAILED ;
goto erase_exit ;
}
@ -2227,8 +2230,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
*/
if ( ! instr - > scrub & & nand_block_checkbad ( mtd , ( ( loff_t ) page ) < <
chip - > page_shift , 0 , allowbbt ) ) {
printk ( KERN_WARNING " nand_erase: attempt to erase a "
" bad block at page 0x%08x\n " , page ) ;
printk ( KERN_WARNING " %s: attempt to erase a bad block "
" at page 0x%08x \n " , __func__ , page ) ;
instr - > state = MTD_ERASE_FAILED ;
goto erase_exit ;
}
@ -2255,10 +2258,11 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
/* See if block erase succeeded */
if ( status & NAND_STATUS_FAIL ) {
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_erase: "
" Failed erase, page 0x%08x\n " , page ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s: Failed erase, "
" page 0x%08x \n " , __func__ , page ) ;
instr - > state = MTD_ERASE_FAILED ;
instr - > fail_addr = ( ( loff_t ) page < < chip - > page_shift ) ;
instr - > fail_addr =
( ( loff_t ) page < < chip - > page_shift ) ;
goto erase_exit ;
}
@ -2293,7 +2297,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
}
instr - > state = MTD_ERASE_DONE ;
erase_exit :
erase_exit :
ret = instr - > state = = MTD_ERASE_DONE ? 0 : - EIO ;
@ -2315,9 +2319,9 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
if ( ! rewrite_bbt [ chipnr ] )
continue ;
/* update the BBT for chip */
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " nand_erase_nand : nand_update_bbt "
" (%d:0x%0llx 0x%0x) \n " , chipnr , rewrite_bbt [ chipnr ] ,
chip - > bbt_td - > pages [ chipnr ] ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL0 , " %s : nand_update_bbt "
" (%d:0x%0llx 0x%0x) \n " , __func__ , chipnr ,
rewrite_bbt [ chipnr ] , chip - > bbt_td - > pages [ chipnr ] ) ;
nand_update_bbt ( mtd , rewrite_bbt [ chipnr ] ) ;
}
@ -2335,7 +2339,7 @@ static void nand_sync(struct mtd_info *mtd)
{
struct nand_chip * chip = mtd - > priv ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " nand_sync : called\n " ) ;
MTDDEBUG ( MTD_DEBUG_LEVEL3 , " %s : called\n " , __func__ ) ;
/* Grab the lock and see if the device is available */
nand_get_device ( chip , mtd , FL_SYNCING ) ;
@ -2433,8 +2437,7 @@ static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)
/*
* Check if the NAND chip is ONFI compliant , returns 1 if it is , 0 otherwise
*/
static int nand_flash_detect_onfi ( struct mtd_info * mtd ,
struct nand_chip * chip ,
static int nand_flash_detect_onfi ( struct mtd_info * mtd , struct nand_chip * chip ,
int * busw )
{
struct nand_onfi_params * p = & chip - > onfi_params ;
@ -2451,7 +2454,7 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd,
for ( i = 0 ; i < 3 ; i + + ) {
chip - > read_buf ( mtd , ( uint8_t * ) p , sizeof ( * p ) ) ;
if ( onfi_crc16 ( ONFI_CRC_BASE , ( uint8_t * ) p , 254 ) = =
le16_to_cpu ( p - > crc ) ) {
le16_to_cpu ( p - > crc ) ) {
printk ( KERN_INFO " ONFI param page %d valid \n " , i ) ;
break ;
}
@ -2476,8 +2479,8 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd,
chip - > onfi_version = 0 ;
if ( ! chip - > onfi_version ) {
printk ( KERN_INFO " %s: unsupported ONFI "
" version: %d \n " , __func__ , val ) ;
printk ( KERN_INFO " %s: unsupported ONFI version: %d \n " ,
__func__ , val ) ;
return 0 ;
}
@ -2705,7 +2708,8 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
nand_set_defaults ( chip , busw ) ;
/* Read the flash type */
type = nand_get_flash_type ( mtd , chip , busw , & nand_maf_id , & nand_dev_id , table ) ;
type = nand_get_flash_type ( mtd , chip , busw ,
& nand_maf_id , & nand_dev_id , table ) ;
if ( IS_ERR ( type ) ) {
# ifndef CONFIG_SYS_NAND_QUIET_TEST
@ -2797,7 +2801,7 @@ int nand_scan_tail(struct mtd_info *mtd)
/* Similar to NAND_ECC_HW, but a separate read_page handle */
if ( ! chip - > ecc . calculate | | ! chip - > ecc . correct | |
! chip - > ecc . hwctl ) {
printk ( KERN_WARNING " No ECC functions supplied, "
printk ( KERN_WARNING " No ECC functions supplied; "
" Hardware ECC not possible \n " ) ;
BUG ( ) ;
}
@ -2826,7 +2830,7 @@ int nand_scan_tail(struct mtd_info *mtd)
chip - > ecc . read_page = = nand_read_page_hwecc | |
! chip - > ecc . write_page | |
chip - > ecc . write_page = = nand_write_page_hwecc ) ) {
printk ( KERN_WARNING " No ECC functions supplied, "
printk ( KERN_WARNING " No ECC functions supplied; "
" Hardware ECC not possible \n " ) ;
BUG ( ) ;
}
@ -2933,7 +2937,7 @@ int nand_scan_tail(struct mtd_info *mtd)
* mode
*/
chip - > ecc . steps = mtd - > writesize / chip - > ecc . size ;
if ( chip - > ecc . steps * chip - > ecc . size ! = mtd - > writesize ) {
if ( chip - > ecc . steps * chip - > ecc . size ! = mtd - > writesize ) {
printk ( KERN_WARNING " Invalid ecc parameters \n " ) ;
BUG ( ) ;
}
@ -2945,7 +2949,7 @@ int nand_scan_tail(struct mtd_info *mtd)
*/
if ( ! ( chip - > options & NAND_NO_SUBPAGE_WRITE ) & &
! ( chip - > cellinfo & NAND_CI_CELLTYPE_MSK ) ) {
switch ( chip - > ecc . steps ) {
switch ( chip - > ecc . steps ) {
case 2 :
mtd - > subpage_sft = 1 ;
break ;