Skip to content
Snippets Groups Projects
Commit a9da2b41 authored by Kyungmin Park's avatar Kyungmin Park Committed by Wolfgang Denk
Browse files

Fix OneNAND erase command


It mis-calculates the block address.
Also fix DECLARE_GLOBAL_DATA_PTR in env_onenand.

Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
parent 61525f2f
No related branches found
No related tags found
No related merge requests found
...@@ -44,15 +44,29 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ...@@ -44,15 +44,29 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
default: default:
/* At least 4 args */ /* At least 4 args */
if (strncmp(argv[1], "erase", 5) == 0) { if (strncmp(argv[1], "erase", 5) == 0) {
struct erase_info instr; struct erase_info instr = {
.callback = NULL,
};
ulong start, end; ulong start, end;
ulong block; ulong block;
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); start = simple_strtoul(argv[2], NULL, 10);
end = simple_strtoul(argv[3], NULL, 10); end = simple_strtoul(argv[3], NULL, 10);
start -= (unsigned long)onenand_chip.base; start -= (unsigned long)onenand_chip.base;
end -= (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) if (!end || end < 0)
end = start; end = start;
......
...@@ -52,16 +52,15 @@ static unsigned char onenand_env[MAX_ONENAND_PAGESIZE]; ...@@ -52,16 +52,15 @@ static unsigned char onenand_env[MAX_ONENAND_PAGESIZE];
env_t *env_ptr = (env_t *) onenand_env; env_t *env_ptr = (env_t *) onenand_env;
#endif /* ENV_IS_EMBEDDED */ #endif /* ENV_IS_EMBEDDED */
uchar env_get_char_spec(int index)
{
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
uchar env_get_char_spec(int index)
{
return (*((uchar *) (gd->env_addr + index))); return (*((uchar *) (gd->env_addr + index)));
} }
void env_relocate_spec(void) void env_relocate_spec(void)
{ {
DECLARE_GLOBAL_DATA_PTR;
unsigned long env_addr; unsigned long env_addr;
int use_default = 0; int use_default = 0;
size_t retlen; size_t retlen;
...@@ -95,7 +94,9 @@ void env_relocate_spec(void) ...@@ -95,7 +94,9 @@ void env_relocate_spec(void)
int saveenv(void) int saveenv(void)
{ {
unsigned long env_addr = CFG_ENV_ADDR; unsigned long env_addr = CFG_ENV_ADDR;
struct erase_info instr; struct erase_info instr = {
.callback = NULL,
};
size_t retlen; size_t retlen;
instr.len = CFG_ENV_SIZE; instr.len = CFG_ENV_SIZE;
...@@ -108,7 +109,7 @@ int saveenv(void) ...@@ -108,7 +109,7 @@ int saveenv(void)
/* update crc */ /* update crc */
env_ptr->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; env_addr -= (unsigned long)onenand_chip.base;
if (onenand_write(&onenand_mtd, env_addr, onenand_mtd.oobblock, &retlen, if (onenand_write(&onenand_mtd, env_addr, onenand_mtd.oobblock, &retlen,
...@@ -122,8 +123,6 @@ int saveenv(void) ...@@ -122,8 +123,6 @@ int saveenv(void)
int env_init(void) int env_init(void)
{ {
DECLARE_GLOBAL_DATA_PTR;
/* use default */ /* use default */
gd->env_addr = (ulong) & default_environment[0]; gd->env_addr = (ulong) & default_environment[0];
gd->env_valid = 1; gd->env_valid = 1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment