diff options
Diffstat (limited to 'nand_spl/nand_boot.c')
| -rw-r--r-- | nand_spl/nand_boot.c | 42 | 
1 files changed, 16 insertions, 26 deletions
| diff --git a/nand_spl/nand_boot.c b/nand_spl/nand_boot.c index 2326962b2..bfaabd319 100644 --- a/nand_spl/nand_boot.c +++ b/nand_spl/nand_boot.c @@ -24,6 +24,11 @@  static int nand_ecc_pos[] = CONFIG_SYS_NAND_ECCPOS; +#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) @@ -139,29 +144,21 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)  static int nand_read_page(struct mtd_info *mtd, 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(mtd, block, page, 0, NAND_CMD_READOOB);  	this->read_buf(mtd, oob_data, CONFIG_SYS_NAND_OOBSIZE);  	nand_command(mtd, 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]]; @@ -178,24 +175,17 @@ static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *dst)  static int nand_read_page(struct mtd_info *mtd, 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;  	nand_command(mtd, 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) {  		this->ecc.hwctl(mtd, NAND_ECC_READ);  		this->read_buf(mtd, p, eccsize); @@ -204,10 +194,10 @@ static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *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) { |