Fix OneNAND erase command
PATCH 1/1 Fix OneNAND erase command
It mis-calculates the block address.
Also fix DECLARE_GLOBAL_DATA_PTR in env_onenand.
Signed-off-by Kyungmin Park <[email protected]>
---
common/cmd_onenand.c +20 -6
@@ -44,14 +44,28 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])default :/* At least 4 args */ if (strncmp (argv[1 ],"erase" ,5 ) ==0 ) { -struct erase_info instr; +struct erase_info instr = { + .callback =NULL , + };ulong start, end;ulong block; - - start =simple_strtoul (argv[2 ],NULL ,10 ); - end =simple_strtoul (argv[3 ],NULL ,10 ); - start -= (unsigned long )onenand_chip.base; - end -= (unsigned long )onenand_chip.base; +char *endtail; + +if (strncmp (argv[2 ],"block" ,5 ) ==0 ) { + start =simple_strtoul (argv[3 ],NULL ,10 ); + endtail =strchr (argv[3 ],'-' ); + end =simple_strtoul (endtail +1 ,NULL ,10 ); + }else { + start =simple_strtoul (argv[2 ],NULL ,10 ); + end =simple_strtoul (argv[3 ],NULL ,10 ); + start -= (unsigned long )onenand_chip.base; + end -= (unsigned long )onenand_chip.base; + + start >>= onenand_chip.erase_shift; + end >>= onenand_chip.erase_shift; +/* Don't include the end block */ + end--; + }if (!end || end <0 ) end = start;
common/env_onenand.c +7 -8
@@ -52,22 +52,21 @@ static unsigned char onenand_env[MAX_ONENAND_PAGESIZE];env_t *env_ptr = (env_t *) onenand_env;#endif /* ENV_IS_EMBEDDED */ +DECLARE_GLOBAL_DATA_PTR ; +uchar env_get_char_spec (int index) { -DECLARE_GLOBAL_DATA_PTR ; -return (*((uchar *) (gd->env_addr + index))); }void env_relocate_spec (void ) { -DECLARE_GLOBAL_DATA_PTR ;unsigned long env_addr;int use_default =0 ;size_t retlen; env_addr =CFG_ENV_ADDR ; - env_addr -= (unsigned long )onenand_chip.base; + env_addr -= (unsigned long ) onenand_chip.base;/* Check OneNAND exist */ if (onenand_mtd.oobblock)
@@ -95,7 +94,9 @@ void env_relocate_spec(void)int saveenv (void ) {unsigned long env_addr =CFG_ENV_ADDR ; -struct erase_info instr; +struct erase_info instr = { + .callback =NULL , + };size_t retlen; instr.len =CFG_ENV_SIZE ;
@@ -108,7 +109,7 @@ int saveenv(void)/* update crc */ env_ptr->crc = -crc32 (0 , env_ptr->data, onenand_mtd.oobblock -ENV_HEADER_SIZE ); +crc32 (0 , env_ptr->data,ONENAND_ENV_SIZE (onenand_mtd)); env_addr -= (unsigned long )onenand_chip.base; if (onenand_write(&onenand_mtd, env_addr, onenand_mtd.oobblock, &retlen,
@@ -122,8 +123,6 @@ int saveenv(void)int env_init (void ) { -DECLARE_GLOBAL_DATA_PTR ; -/* use default */ gd->env_addr = (ulong) & default_environment[0 ]; gd->env_valid =1 ;
Wolfgang Denk
AppliedPATCH 1/1 Fix OneNAND erase command
common/cmd_onenand.c
Quoted 6 lines · In message <20080331014019.GA30858@party> you wrote:
It mis-calculates the block address.
Also fixDECLARE_GLOBAL_DATA_PTRinenv_onenand.Signed-off-by Kyungmin Park <[email protected]>---
common/cmd_onenand.c +0
-0
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 6 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Our OS who art in CPU, UNIX be thy name. Thy programs run, thy syscalls done, In kernel as it is in user!