diff options
Diffstat (limited to 'common/cmd_mtdparts.c')
| -rw-r--r-- | common/cmd_mtdparts.c | 34 | 
1 files changed, 26 insertions, 8 deletions
| diff --git a/common/cmd_mtdparts.c b/common/cmd_mtdparts.c index 347e40997..17865b756 100644 --- a/common/cmd_mtdparts.c +++ b/common/cmd_mtdparts.c @@ -1949,9 +1949,13 @@ 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) +		struct mtd_info *mtd; +		uint64_t next_offset; +#endif  		u8 type, num, len;  		struct mtd_device *dev;  		struct mtd_device *dev_tmp; @@ -1986,15 +1990,25 @@ 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 ((dev_tmp = device_find(dev->id->type, dev->id->num)) == NULL) { +		p = list_entry(dev->parts.next, struct part_info, link); + +#if defined(CONFIG_CMD_MTDPARTS_SPREAD) +		if (get_mtd_info(dev->id->type, dev->id->num, &mtd)) +			return 1; + +		if (!strcmp(&argv[1][3], ".spread")) { +			spread_partition(mtd, p, &next_offset); +			debug("increased %s to %d bytes\n", p->name, p->size); +		} +#endif + +		dev_tmp = device_find(dev->id->type, dev->id->num); +		if (dev_tmp == NULL) {  			device_add(dev); -		} else { +		} else if (part_add(dev_tmp, p) != 0) {  			/* merge new partition with existing ones*/ -			p = list_entry(dev->parts.next, struct part_info, link); -			if (part_add(dev_tmp, p) != 0) { -				device_del(dev); -				return 1; -			} +			device_del(dev); +			return 1;  		}  		if (generate_mtdparts_save(last_parts, MTDPARTS_MAXLEN) != 0) { @@ -2039,6 +2053,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) |