summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2016-02-23 14:41:48 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2016-03-15 08:56:53 +0100
commit172af2a30c4fbd71087103e4cf9b6c9f585d8602 (patch)
tree1e5c8022adfcb2191064a50d155f9239311924e3 /commands
parenta0fa6e1d2b6ac59ecb0cf531fb3b37fab636e336 (diff)
downloadbarebox-172af2a30c4fbd71087103e4cf9b6c9f585d8602.tar.gz
barebox-172af2a30c4fbd71087103e4cf9b6c9f585d8602.tar.xz
mtd: Add support for marking blocks as good
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r--commands/nand.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/commands/nand.c b/commands/nand.c
index c330ad1dc4..1807c92313 100644
--- a/commands/nand.c
+++ b/commands/nand.c
@@ -32,6 +32,7 @@
#define NAND_ADD 1
#define NAND_DEL 2
#define NAND_MARKBAD 3
+#define NAND_MARKGOOD 4
static int do_nand(int argc, char *argv[])
{
@@ -39,7 +40,7 @@ static int do_nand(int argc, char *argv[])
int command = 0;
loff_t badblock = 0;
- while((opt = getopt(argc, argv, "adb:")) > 0) {
+ while((opt = getopt(argc, argv, "adb:g:")) > 0) {
if (command) {
printf("only one command may be given\n");
return 1;
@@ -55,12 +56,24 @@ static int do_nand(int argc, char *argv[])
case 'b':
command = NAND_MARKBAD;
badblock = strtoull_suffix(optarg, NULL, 0);
+ break;
+ case 'g':
+ command = NAND_MARKGOOD;
+ badblock = strtoull_suffix(optarg, NULL, 0);
+ break;
+ default:
+ return COMMAND_ERROR_USAGE;
}
}
if (optind >= argc)
return COMMAND_ERROR_USAGE;
+ if (!command) {
+ printf("No action given\n");
+ return COMMAND_ERROR_USAGE;
+ }
+
if (command == NAND_ADD) {
while (optind < argc) {
if (dev_add_bb_dev(basename(argv[optind]), NULL))
@@ -77,11 +90,21 @@ static int do_nand(int argc, char *argv[])
}
}
- if (command == NAND_MARKBAD) {
+ if (command == NAND_MARKBAD || command == NAND_MARKGOOD) {
int ret = 0, fd;
+ const char *str;
+ int ctl;
+
+ if (command == NAND_MARKBAD) {
+ str = "bad";
+ ctl = MEMSETBADBLOCK;
+ } else {
+ str = "good";
+ ctl = MEMSETGOODBLOCK;
+ }
- printf("marking block at 0x%08llx on %s as bad\n",
- badblock, argv[optind]);
+ printf("marking block at 0x%08llx on %s as %s\n",
+ badblock, argv[optind], str);
fd = open(argv[optind], O_RDWR);
if (fd < 0) {
@@ -89,7 +112,7 @@ static int do_nand(int argc, char *argv[])
return 1;
}
- ret = ioctl(fd, MEMSETBADBLOCK, &badblock);
+ ret = ioctl(fd, ctl, &badblock);
if (ret) {
if (ret == -EINVAL)
printf("Maybe offset %lld is out of range.\n",
@@ -110,6 +133,7 @@ BAREBOX_CMD_HELP_TEXT("Options:")
BAREBOX_CMD_HELP_OPT ("-a", "register a bad block aware device ontop of a normal NAND device")
BAREBOX_CMD_HELP_OPT ("-d", "deregister a bad block aware device")
BAREBOX_CMD_HELP_OPT ("-b OFFS", "mark block at OFFSet as bad")
+BAREBOX_CMD_HELP_OPT ("-g OFFS", "mark block at OFFSet as good")
BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(nand)