[U-Boot-Users] IMPORTANT NOTE to all maintainers with NAND flash

Hello,
this is a "heads up" note to all maintainers of boards with NAND flash:
I am going to drop support for the old NAND flash code and replace it by Ladislav Michl's rewrite, which is available in the "testing-NAND" branch of our git repository.
This new code has been available for testing for 6 months, and I have not received any negative feedback (I did not receive any positive feedback, either - but if you did not care until now you should not complain later).
Dropping the support for the old code means that the build for all boards that use NAND currently will *break*. I am aware that this is not a nice thing to do, but I see no other way to get the attention of the board maintainers and force them to update their code to the new way for their boards. This should be not be very hard, though. Since the new implementation is borrowed from Linux, it is quite likely that the said boards could use the new NAND support already present for them in the Linux source.
We will now merge the "testing-NAND" branch back into the main tree; once this is done, I will allow for a transition period of 4 weeks. After this, the old code will be removed, even if it breaks support for some boards.
Best regards,
Wolfgang Denk

On Tuesday 28 February 2006 11:21, Wolfgang Denk wrote:
Hello,
this is a "heads up" note to all maintainers of boards with NAND flash:
I am going to drop support for the old NAND flash code and replace it by Ladislav Michl's rewrite, which is available in the "testing-NAND" branch of our git repository.
This new code has been available for testing for 6 months, and I have not received any negative feedback (I did not receive any positive feedback, either - but if you did not care until now you should not complain later).
Dropping the support for the old code means that the build for all boards that use NAND currently will *break*. I am aware that this is not a nice thing to do, but I see no other way to get the attention of the board maintainers and force them to update their code to the new way for their boards. This should be not be very hard, though. Since the new implementation is borrowed from Linux, it is quite likely that the said boards could use the new NAND support already present for them in the Linux source.
We will now merge the "testing-NAND" branch back into the main tree; once this is done, I will allow for a transition period of 4 weeks. After this, the old code will be removed, even if it breaks support for some boards.
I did test it, it works.
A few things are missing but most are doable.
Best regards,
Wolfgang Denk
Regards
Pantelis

On Tue, Feb 28, 2006 at 12:05:32PM +0200, Pantelis Antoniou wrote:
Hi Wolfgang & Pantelis,
A few things are missing but most are doable.
Here is one of those 'few' things - erasing OOB area...
Signed-off-by Ladislav Michl ladis@linux-mips.org
CHANGELOG * Implement NAND OOB erase command Patch by Ladislav Michl, 17 Mar 2006
diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 21adb1b..bf4173f 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -198,13 +198,15 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, }
if (strcmp(cmd, "erase") == 0) { - arg_off_size(argc - 2, argv + 2, &off, &size, nand->size); + int clean = (argc > 2 && strcmp(argv[2], "clean") == 0) ? 1 : 0; + int o = clean ? 3 : 2; + arg_off_size(argc - o, argv + o, &off, &size, nand->size); if (off == 0 && size == 0) - return 1; + size = nand->size;
printf("\nNAND erase: device %d offset 0x%x, size 0x%x ", nand_curr_device, off, size); - ret = nand_erase(nand, off, size); + ret = nand_erase(nand, off, size, clean); printf("%s\n", ret ? "ERROR" : "OK");
return ret == 0 ? 0 : 1; @@ -275,7 +277,6 @@ U_BOOT_CMD(nand, 5, 1, do_nand, " offset `off' (entire device if not specified)\n" "nand bad - show bad blocks\n" "nand dump[.oob] off - dump page\n" - "nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n" "nand markbad off - mark bad block at offset (UNSAFE)\n" "nand biterr off - make a bit error at offset (UNSAFE)\n");
diff --git a/common/env_nand.c b/common/env_nand.c index dd27f7b..97371e9 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -116,7 +116,7 @@ int saveenv(void) int ret = 0;
puts ("Erasing Nand..."); - if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE)) + if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE, 0)) return 1;
puts ("Writing to Nand... "); diff --git a/include/nand.h b/include/nand.h index 905115b..ccac9c1 100644 --- a/include/nand.h +++ b/include/nand.h @@ -48,7 +48,7 @@ static inline int nand_block_isbad(nand_ return info->block_isbad(info, ofs); }
-static inline int nand_erase(nand_info_t *info, ulong off, ulong size) +static inline int nand_erase(nand_info_t *info, ulong off, ulong size, int clean) { struct erase_info instr;
@@ -57,7 +57,7 @@ static inline int nand_erase(nand_info_t instr.len = size; instr.callback = 0;
- return info->erase(info, &instr); + return nand_erase_nand(info, &instr, clean); }
#endif

Dear Ladislav,
in message 20060317185016.GA10588@orphique you wrote:
Here is one of those 'few' things - erasing OOB area...
Thanks a lot, but...
int clean = (argc > 2 && strcmp(argv[2], "clean") == 0) ? 1 : 0;
int o = clean ? 3 : 2;
arg_off_size(argc - o, argv + o, &off, &size, nand->size);
Can you please re-implement this in a bit a less cryptic way? I will not complain if it takes 6 lines instead of 3. LoC are cheap these days ;-)
Best regards,
Wolfgang Denk

On Fri, Mar 17, 2006 at 10:14:12PM +0100, Wolfgang Denk wrote:
int clean = (argc > 2 && strcmp(argv[2], "clean") == 0) ? 1 : 0;
int o = clean ? 3 : 2;
arg_off_size(argc - o, argv + o, &off, &size, nand->size);
Can you please re-implement this in a bit a less cryptic way? I will not complain if it takes 6 lines instead of 3. LoC are cheap these days ;-)
Syntax is: 0 1 2 3 4 nand erase [clean] [off size]
So we just look if there are more that two arguments and argument at index 2 is "clean". In that case we want also erase OOB. Then we just skip first 2 or 3 argumets while looking for offset and size. Shall I try harder to reimplement it or is additional comment okay? ;-)
Best regards, ladis

In message 20060324004338.GA14228@orphique you wrote:
Syntax is: 0 1 2 3 4 nand erase [clean] [off size]
So we just look if there are more that two arguments and argument at index 2 is "clean". In that case we want also erase OOB. Then we just skip first 2 or 3 argumets while looking for offset and size. Shall I try harder to reimplement it or is additional comment okay? ;-)
Yes :-)
Meaning - the comment is IMHO necessary. Thanks.
Best regards,
Wolfgang Denk

On Fri, Mar 24, 2006 at 01:55:35AM +0100, Wolfgang Denk wrote:
Meaning - the comment is IMHO necessary. Thanks.
I hope it makes enough sense...
Best regards, ladis
Signed-off-by Ladislav Michl ladis@linux-mips.org
CHANGELOG * Implement NAND OOB erase command Patch by Ladislav Michl, 24 Mar 2006
diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 21adb1b..d443086 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -197,14 +197,23 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, return 0; }
+ /* + * Syntax is: + * 0 1 2 3 4 + * nand erase [clean] [off size] + */ if (strcmp(cmd, "erase") == 0) { - arg_off_size(argc - 2, argv + 2, &off, &size, nand->size); + /* "clean" at index 2 means request to erase OOB */ + int clean = (argc > 2 && strcmp(argv[2], "clean") == 0) ? 1 : 0; + int o = clean ? 3 : 2; + /* skip first two or three arguments, look for offset and size */ + arg_off_size(argc - o, argv + o, &off, &size, nand->size); if (off == 0 && size == 0) - return 1; + size = nand->size;
printf("\nNAND erase: device %d offset 0x%x, size 0x%x ", nand_curr_device, off, size); - ret = nand_erase(nand, off, size); + ret = nand_erase(nand, off, size, clean); printf("%s\n", ret ? "ERROR" : "OK");
return ret == 0 ? 0 : 1; @@ -275,7 +284,6 @@ U_BOOT_CMD(nand, 5, 1, do_nand, " offset `off' (entire device if not specified)\n" "nand bad - show bad blocks\n" "nand dump[.oob] off - dump page\n" - "nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n" "nand markbad off - mark bad block at offset (UNSAFE)\n" "nand biterr off - make a bit error at offset (UNSAFE)\n");
diff --git a/common/env_nand.c b/common/env_nand.c index dd27f7b..97371e9 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -116,7 +116,7 @@ int saveenv(void) int ret = 0;
puts ("Erasing Nand..."); - if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE)) + if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE, 0)) return 1;
puts ("Writing to Nand... "); diff --git a/include/nand.h b/include/nand.h index 905115b..ccac9c1 100644 --- a/include/nand.h +++ b/include/nand.h @@ -48,7 +48,7 @@ static inline int nand_block_isbad(nand_ return info->block_isbad(info, ofs); }
-static inline int nand_erase(nand_info_t *info, ulong off, ulong size) +static inline int nand_erase(nand_info_t *info, ulong off, ulong size, int clean) { struct erase_info instr;
@@ -57,7 +57,7 @@ static inline int nand_erase(nand_info_t instr.len = size; instr.callback = 0;
- return info->erase(info, &instr); + return nand_erase_nand(info, &instr, clean); }
#endif
participants (4)
-
Ladislav Michl
-
Ladislav Michl
-
Pantelis Antoniou
-
Wolfgang Denk