[U-Boot] [PATCH v4 4/4] mtdparts: new add.spread: add part skipping bad blocks

Ben Gardiner
2010-08-09T20:44:00Z

This patch adds a new 'mtdparts add' variant: add.spread. This command variant
adds a new partition to the mtdparts variable but also increases the partitions
size by skipping bad blocks and aggregating any additional bad blocks found at
the end of the partition.

Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca>
CC: Wolfgang Denk <wd@denx.de>
CC: Scott Wood <scottwood@freescale.com>

---

V2:
* formatting: spaces after 'if' and 'for'
* trailing whitespace removed

V3:
* rebased to 54841ab50c20d6fa6c9cc3eb826989da3a22d934 of
git://git.denx.de/u-boot.git
* fix more checkpatch errors
* updating copyright to include addition of add.e command

V4:
* rebased to b417260d871d4d8d336c160d95ed40cc8c0fb0fa of
git://git.denx.de/u-boot.git
* removed changelog from file header
* check for s == NULL when looking for '.' in command
* do not include support for the '.i' synonym
* rename to 'add.spread' to match 'mtdparts spread' as per Scott Wood's
suggestion.
---
common/cmd_mtdparts.c | 36 +++++++++++++++++++++++++++++++++++-
1 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/common/cmd_mtdparts.c b/common/cmd_mtdparts.c
index 7e2e232..6e42eff 100644
--- a/common/cmd_mtdparts.c
+++ b/common/cmd_mtdparts.c
@@ -1959,9 +1959,14 @@ int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
}

/* mtdparts add <mtd-dev> <size>[@<offset>] <name> [ro] */
- if (((argc == 5) || (argc == 6)) && (strcmp(argv[1], "add") == 0)) {
+ if (((argc == 5) || (argc == 6)) && (strncmp(argv[1], "add", 3) == 0)) {
#define PART_ADD_DESC_MAXLEN 64
char tmpbuf[PART_ADD_DESC_MAXLEN];
+#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
+ char *s;
+ struct mtd_info *mtd;
+ u32 next_offset;
+#endif
u8 type, num, len;
struct mtd_device *dev;
struct mtd_device *dev_tmp;
@@ -1996,11 +2001,36 @@ int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
debug("+ %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type),
dev->id->num, dev->id->mtd_id);

+#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
+ s = strchr(argv[1], '.');
+
+ if (get_mtd_info(dev->id->type, dev->id->num, &mtd))
+ return 1;
+#endif
+
if ((dev_tmp = device_find(dev->id->type, dev->id->num)) == NULL) {
+#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
+ if (s && !strcmp(s, ".spread")) {
+ p = list_entry(dev->parts.next,
+ struct part_info, link);
+ spread_partition(mtd, p, &next_offset);
+
+ debug("increased %s to %d bytes\n", p->name,
+ p->size);
+ }
+#endif
device_add(dev);
} else {
/* merge new partition with existing ones*/
p = list_entry(dev->parts.next, struct part_info, link);
+#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
+ if (s && !strcmp(s, ".spread")) {
+ spread_partition(mtd, p, &next_offset);
+
+ debug("increased %s to %d bytes\n", p->name,
+ p->size);
+ }
+#endif
if (part_add(dev_tmp, p) != 0) {
device_del(dev);
return 1;
@@ -2049,6 +2079,10 @@ U_BOOT_CMD(
" - delete partition (e.g. part-id = nand0,1)\n"
"mtdparts add <mtd-dev> <size>[@<offset>] [<name>] [ro]\n"
" - add partition\n"
+#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
+ "mtdparts add.spread <mtd-dev> <size>[@<offset>] [<name>] [ro]\n"
+ " - add partition, padding size by skipping bad blocks\n"
+#endif
"mtdparts default\n"
" - reset partition table to defaults\n"
#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
--
1.7.0.4