@ -27,6 +27,11 @@ static int nand_ecc_pos[] = CONFIG_SYS_NAND_ECCPOS;
static nand_info_t mtd ;
static struct nand_chip nand_chip ;
# define ECCSTEPS (CONFIG_SYS_NAND_PAGE_SIZE / \
CONFIG_SYS_NAND_ECCSIZE )
# define ECCTOTAL (ECCSTEPS * CONFIG_SYS_NAND_ECCBYTES)
# if (CONFIG_SYS_NAND_PAGE_SIZE <= 512)
/*
* NAND command for small page NAND devices ( 512 )
@ -145,29 +150,21 @@ static int nand_is_bad_block(int block)
static int nand_read_page ( int block , int page , uchar * dst )
{
struct nand_chip * this = mtd . priv ;
u_char * ecc_calc ;
u_char * ecc_code ;
u_char * oob_data ;
u_char ecc_calc [ ECCTOTAL ] ;
u_char ecc_code [ ECCTOTAL ] ;
u_char oob_data [ CONFIG_SYS_NAND_OOBSIZE ] ;
int i ;
int eccsize = CONFIG_SYS_NAND_ECCSIZE ;
int eccbytes = CONFIG_SYS_NAND_ECCBYTES ;
int eccsteps = CONFIG_SYS_NAND_ ECCSTEPS;
int eccsteps = ECCSTEPS ;
uint8_t * p = dst ;
/*
* No malloc available for now , just use some temporary locations
* in SDRAM
*/
ecc_calc = ( u_char * ) ( CONFIG_SYS_SDRAM_BASE + 0x10000 ) ;
ecc_code = ecc_calc + 0x100 ;
oob_data = ecc_calc + 0x200 ;
nand_command ( block , page , 0 , NAND_CMD_READOOB ) ;
this - > read_buf ( & mtd , oob_data , CONFIG_SYS_NAND_OOBSIZE ) ;
nand_command ( block , page , 0 , NAND_CMD_READ0 ) ;
/* Pick the ECC bytes out of the oob data */
for ( i = 0 ; i < CONFIG_SYS_NAND_ ECCTOTAL; i + + )
for ( i = 0 ; i < ECCTOTAL ; i + + )
ecc_code [ i ] = oob_data [ nand_ecc_pos [ i ] ] ;
@ -184,24 +181,17 @@ static int nand_read_page(int block, int page, uchar *dst)
static int nand_read_page ( int block , int page , void * dst )
{
struct nand_chip * this = mtd . priv ;
u_char * ecc_calc ;
u_char * ecc_code ;
u_char * oob_data ;
u_char ecc_calc [ ECCTOTAL ] ;
u_char ecc_code [ ECCTOTAL ] ;
u_char oob_data [ CONFIG_SYS_NAND_OOBSIZE ] ;
int i ;
int eccsize = CONFIG_SYS_NAND_ECCSIZE ;
int eccbytes = CONFIG_SYS_NAND_ECCBYTES ;
int eccsteps = CONFIG_SYS_NAND_ ECCSTEPS;
int eccsteps = ECCSTEPS ;
uint8_t * p = dst ;
nand_command ( block , page , 0 , NAND_CMD_READ0 ) ;
/* No malloc available for now, just use some temporary locations
* in SDRAM
*/
ecc_calc = ( u_char * ) ( CONFIG_SYS_SDRAM_BASE + 0x10000 ) ;
ecc_code = ecc_calc + 0x100 ;
oob_data = ecc_calc + 0x200 ;
for ( i = 0 ; eccsteps ; eccsteps - - , i + = eccbytes , p + = eccsize ) {
if ( this - > ecc . mode ! = NAND_ECC_SOFT )
this - > ecc . hwctl ( & mtd , NAND_ECC_READ ) ;
@ -211,10 +201,10 @@ static int nand_read_page(int block, int page, void *dst)
this - > read_buf ( & mtd , oob_data , CONFIG_SYS_NAND_OOBSIZE ) ;
/* Pick the ECC bytes out of the oob data */
for ( i = 0 ; i < CONFIG_SYS_NAND_ ECCTOTAL; i + + )
for ( i = 0 ; i < ECCTOTAL ; i + + )
ecc_code [ i ] = oob_data [ nand_ecc_pos [ i ] ] ;
eccsteps = CONFIG_SYS_NAND_ ECCSTEPS;
eccsteps = ECCSTEPS ;
p = dst ;
for ( i = 0 ; eccsteps ; eccsteps - - , i + = eccbytes , p + = eccsize ) {