summaryrefslogtreecommitdiffstats
path: root/patches/mtd-utils-2.1.1/0001-nandmarkbad-new-util-to-mark-blocks-as-bad.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/mtd-utils-2.1.1/0001-nandmarkbad-new-util-to-mark-blocks-as-bad.patch')
-rw-r--r--patches/mtd-utils-2.1.1/0001-nandmarkbad-new-util-to-mark-blocks-as-bad.patch158
1 files changed, 158 insertions, 0 deletions
diff --git a/patches/mtd-utils-2.1.1/0001-nandmarkbad-new-util-to-mark-blocks-as-bad.patch b/patches/mtd-utils-2.1.1/0001-nandmarkbad-new-util-to-mark-blocks-as-bad.patch
new file mode 100644
index 000000000..1cea5f238
--- /dev/null
+++ b/patches/mtd-utils-2.1.1/0001-nandmarkbad-new-util-to-mark-blocks-as-bad.patch
@@ -0,0 +1,158 @@
+From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
+Date: Wed, 30 Aug 2017 13:31:46 +0200
+Subject: [PATCH] nandmarkbad: new util to mark blocks as bad
+
+---
+ nand-utils/Makemodule.am | 5 +-
+ nand-utils/nandmarkbad.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 123 insertions(+), 1 deletion(-)
+ create mode 100644 nand-utils/nandmarkbad.c
+
+diff --git a/nand-utils/Makemodule.am b/nand-utils/Makemodule.am
+index d75b0cb3e36c..c31dcb01f06e 100644
+--- a/nand-utils/Makemodule.am
++++ b/nand-utils/Makemodule.am
+@@ -7,6 +7,9 @@ nandwrite_LDADD = libmtd.a
+ nandtest_SOURCES = nand-utils/nandtest.c
+ nandtest_LDADD = libmtd.a
+
++nandmarkbad_SOURCES = nand-utils/nandmarkbad.c
++nandmarkbad_LDADD = libmtd.a
++
+ nftldump_SOURCES = nand-utils/nftldump.c
+ nftldump_LDADD = libmtd.a
+
+@@ -14,7 +17,7 @@ nftl_format_SOURCES = nand-utils/nftl_format.c
+ nftl_format_LDADD = libmtd.a
+
+ NAND_BINS = \
+- nanddump nandwrite nandtest nftldump nftl_format
++ nanddump nandwrite nandtest nandmarkbad nftldump nftl_format
+
+ NAND_SH = \
+ nand-utils/load_nandsim.sh
+diff --git a/nand-utils/nandmarkbad.c b/nand-utils/nandmarkbad.c
+new file mode 100644
+index 000000000000..cf05698c3609
+--- /dev/null
++++ b/nand-utils/nandmarkbad.c
+@@ -0,0 +1,119 @@
++#define PROGRAM_NAME "nandmarkbad"
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <getopt.h>
++
++#include "common.h"
++#include <libmtd.h>
++
++static void usage(int status)
++{
++ fprintf(status ? stderr : stdout,
++ "usage: %s [OPTIONS] <device>\n\n"
++ " -b, --markbad=blockno Mark block bad\n"
++ " -h, --help Display this help and exit\n"
++ " -V, --version Output version information and exit\n"
++ " -y, --i-know-what-i-do really do mark blocks as bad\n",
++ PROGRAM_NAME);
++ exit(status);
++}
++
++/*
++ * Main program
++ */
++int main(int argc, char **argv)
++{
++ loff_t mark_bad[32];
++ unsigned cnt_bad = 0;
++ struct mtd_dev_info mtd;
++ libmtd_t mtd_desc;
++ int fd;
++ int error = 0;
++ int ret;
++ unsigned int i;
++ int iknowwhatido = 0;
++
++ for (;;) {
++ static const char short_options[] = "b:hVy";
++ static const struct option long_options[] = {
++ { "help", no_argument, 0, 'h' },
++ { "markbad", required_argument, 0, 'b' },
++ { "version", no_argument, 0, 'V'},
++ { "i-know-what-i-do", no_argument, 0, 'y' },
++ {0, 0, 0, 0},
++ };
++ int option_index = 0;
++ int c = getopt_long(argc, argv, short_options, long_options,
++ &option_index);
++ if (c == EOF)
++ break;
++
++ switch (c) {
++ case '?':
++ usage(EXIT_FAILURE);
++ break;
++
++ case 'b':
++ if (cnt_bad < ARRAY_SIZE(mark_bad)) {
++ mark_bad[cnt_bad] =
++ simple_strtoll(optarg, &error);
++ ++cnt_bad;
++ } else {
++ errmsg_die("Can't handle so many bad blocks\n");
++ }
++
++ break;
++
++ case 'h':
++ usage(EXIT_SUCCESS);
++ break;
++
++ case 'V':
++ common_print_version();
++ return EXIT_SUCCESS;
++
++ case 'y':
++ iknowwhatido = 1;
++ break;
++ }
++ }
++
++ argc -= optind;
++ argv += optind;
++
++ if (error)
++ usage(EXIT_FAILURE);
++
++ if (argc != 1)
++ errmsg_die("You must specify a device to operate on\n");
++
++ if (!cnt_bad)
++ errmsg_die("You must specify at least one block to mark bad\n");
++
++ if (!iknowwhatido)
++ errmsg_die(PROGRAM_NAME " does things that are hard to undo.\n"
++ "\tPlease convince yourself you understand the risks,\n"
++ "\tthen add --i-know-what-i-do to the options.\n");
++
++ fd = open(argv[0], O_RDWR);
++ if (fd < 0)
++ sys_errmsg_die("Failed to open mtd device\n");
++
++ mtd_desc = libmtd_open();
++ if (!mtd_desc)
++ errmsg_die("Can't initialize libmtd");
++
++ if (mtd_get_dev_info(mtd_desc, argv[0], &mtd) < 0)
++ errmsg_die("mtd_get_dev_info failed");
++
++ for (i = 0; i < cnt_bad; ++i) {
++ ret = mtd_mark_bad(&mtd, fd, mark_bad[i]);
++ if (ret)
++ sys_errmsg_die("%s: MTD Mark bad block failure",
++ argv[0]);
++ }
++
++ return EXIT_SUCCESS;
++}