X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=cmd%2Fmtdparts.c;h=3275eb919bfb2a561364570de2c8a2c6dd0212ea;hb=74a4818415852560b43ee990ce47c68582bef4ca;hp=7860ed9f52003b9cd34733d3a0560be9329f2e20;hpb=1c2a262a9d6132e52108a1b6bd36499ee1f06377;p=u-boot diff --git a/cmd/mtdparts.c b/cmd/mtdparts.c index 7860ed9f52..3275eb919b 100644 --- a/cmd/mtdparts.c +++ b/cmd/mtdparts.c @@ -109,25 +109,33 @@ DECLARE_GLOBAL_DATA_PTR; #define MTD_WRITEABLE_CMD 1 /* default values for mtdids and mtdparts variables */ -#if defined(MTDIDS_DEFAULT) -static const char *const mtdids_default = MTDIDS_DEFAULT; +#if !defined(MTDIDS_DEFAULT) +#ifdef CONFIG_MTDIDS_DEFAULT +#define MTDIDS_DEFAULT CONFIG_MTDIDS_DEFAULT #else -static const char *const mtdids_default = NULL; +#define MTDIDS_DEFAULT NULL #endif - -#if defined(MTDPARTS_DEFAULT) -static const char *const mtdparts_default = MTDPARTS_DEFAULT; +#endif +#if !defined(MTDPARTS_DEFAULT) +#ifdef CONFIG_MTDPARTS_DEFAULT +#define MTDPARTS_DEFAULT CONFIG_MTDPARTS_DEFAULT #else -static const char *const mtdparts_default = NULL; +#define MTDPARTS_DEFAULT NULL +#endif #endif +#if defined(CONFIG_SYS_MTDPARTS_RUNTIME) +extern void board_mtdparts_default(const char **mtdids, const char **mtdparts); +#endif +static const char *mtdids_default = MTDIDS_DEFAULT; +static const char *mtdparts_default = MTDPARTS_DEFAULT; /* copies of last seen 'mtdids', 'mtdparts' and 'partition' env variables */ #define MTDIDS_MAXLEN 128 #define MTDPARTS_MAXLEN 512 #define PARTITION_MAXLEN 16 -static char last_ids[MTDIDS_MAXLEN]; -static char last_parts[MTDPARTS_MAXLEN]; -static char last_partition[PARTITION_MAXLEN]; +static char last_ids[MTDIDS_MAXLEN + 1]; +static char last_parts[MTDPARTS_MAXLEN + 1]; +static char last_partition[PARTITION_MAXLEN + 1]; /* low level jffs2 cache cleaning routine */ extern void jffs2_free_cache(struct part_info *part); @@ -142,6 +150,8 @@ static struct list_head devices; struct mtd_device *current_mtd_dev = NULL; u8 current_mtd_partnum = 0; +u8 use_defaults; + static struct part_info* mtd_part_info(struct mtd_device *dev, unsigned int part_num); /* command line only routines */ @@ -229,19 +239,26 @@ static void index_partitions(void) dev = list_entry(dentry, struct mtd_device, link); if (dev == current_mtd_dev) { mtddevnum += current_mtd_partnum; - setenv_ulong("mtddevnum", mtddevnum); + env_set_ulong("mtddevnum", mtddevnum); + debug("=> mtddevnum %d,\n", mtddevnum); break; } mtddevnum += dev->num_parts; } part = mtd_part_info(current_mtd_dev, current_mtd_partnum); - setenv("mtddevname", part->name); + if (part) { + env_set("mtddevname", part->name); + + debug("=> mtddevname %s\n", part->name); + } else { + env_set("mtddevname", NULL); - debug("=> mtddevnum %d,\n=> mtddevname %s\n", mtddevnum, part->name); + debug("=> mtddevname NULL\n"); + } } else { - setenv("mtddevnum", NULL); - setenv("mtddevname", NULL); + env_set("mtddevnum", NULL); + env_set("mtddevname", NULL); debug("=> mtddevnum NULL\n=> mtddevname NULL\n"); } @@ -260,12 +277,12 @@ static void current_save(void) sprintf(buf, "%s%d,%d", MTD_DEV_TYPE(current_mtd_dev->id->type), current_mtd_dev->id->num, current_mtd_partnum); - setenv("partition", buf); + env_set("partition", buf); strncpy(last_partition, buf, 16); debug("=> partition %s\n", buf); } else { - setenv("partition", NULL); + env_set("partition", NULL); last_partition[0] = '\0'; debug("=> partition NULL\n"); @@ -902,12 +919,6 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_ return 1; } - if (num_parts == 0) { - printf("no partitions for device %s%d (%s)\n", - MTD_DEV_TYPE(id->type), id->num, id->mtd_id); - return 1; - } - debug("\ntotal partitions: %d\n", num_parts); /* check for next device presence */ @@ -1203,9 +1214,9 @@ static int generate_mtdparts_save(char *buf, u32 buflen) ret = generate_mtdparts(buf, buflen); if ((buf[0] != '\0') && (ret == 0)) - setenv("mtdparts", buf); + env_set("mtdparts", buf); else - setenv("mtdparts", NULL); + env_set("mtdparts", NULL); return ret; } @@ -1491,7 +1502,7 @@ static int spread_partitions(void) part = list_entry(pentry, struct part_info, link); debug("spread_partitions: device = %s%d, partition %d =" - " (%s) 0x%08x@0x%08x\n", + " (%s) 0x%08llx@0x%08llx\n", MTD_DEV_TYPE(dev->id->type), dev->id->num, part_num, part->name, part->size, part->offset); @@ -1523,11 +1534,11 @@ static int spread_partitions(void) * @param buf temporary buffer pointer MTDPARTS_MAXLEN long * @return mtdparts variable string, NULL if not found */ -static const char *getenv_mtdparts(char *buf) +static const char *env_get_mtdparts(char *buf) { if (gd->flags & GD_FLG_ENV_READY) - return getenv("mtdparts"); - if (getenv_f("mtdparts", buf, MTDPARTS_MAXLEN) != -1) + return env_get("mtdparts"); + if (env_get_f("mtdparts", buf, MTDPARTS_MAXLEN) != -1) return buf; return NULL; } @@ -1546,7 +1557,7 @@ static int parse_mtdparts(const char *const mtdparts) int err = 1; char tmp_parts[MTDPARTS_MAXLEN]; - debug("\n---parse_mtdparts---\nmtdparts = %s\n\n", p); + debug("\n---parse_mtdparts---\nmtdparts = %s\n\n", mtdparts); /* delete all devices and partitions */ if (mtd_devices_init() != 0) { @@ -1555,7 +1566,7 @@ static int parse_mtdparts(const char *const mtdparts) } /* re-read 'mtdparts' variable, mtd_devices_init may be updating env */ - p = getenv_mtdparts(tmp_parts); + p = env_get_mtdparts(tmp_parts); if (!p) p = mtdparts; @@ -1583,8 +1594,10 @@ static int parse_mtdparts(const char *const mtdparts) list_add_tail(&dev->link, &devices); err = 0; } - if (err == 1) + if (err == 1) { + free(dev); device_delall(&devices); + } return err; } @@ -1713,27 +1726,32 @@ int mtdparts_init(void) const char *ids, *parts; const char *current_partition; int ids_changed; - char tmp_ep[PARTITION_MAXLEN]; + char tmp_ep[PARTITION_MAXLEN + 1]; char tmp_parts[MTDPARTS_MAXLEN]; debug("\n---mtdparts_init---\n"); if (!initialized) { INIT_LIST_HEAD(&mtdids); INIT_LIST_HEAD(&devices); - memset(last_ids, 0, MTDIDS_MAXLEN); - memset(last_parts, 0, MTDPARTS_MAXLEN); - memset(last_partition, 0, PARTITION_MAXLEN); + memset(last_ids, 0, sizeof(last_ids)); + memset(last_parts, 0, sizeof(last_parts)); + memset(last_partition, 0, sizeof(last_partition)); +#if defined(CONFIG_SYS_MTDPARTS_RUNTIME) + board_mtdparts_default(&mtdids_default, &mtdparts_default); +#endif + use_defaults = 1; initialized = 1; } /* get variables */ - ids = getenv("mtdids"); - parts = getenv_mtdparts(tmp_parts); - current_partition = getenv("partition"); + ids = env_get("mtdids"); + parts = env_get_mtdparts(tmp_parts); + current_partition = env_get("partition"); /* save it for later parsing, cannot rely on current partition pointer * as 'partition' variable may be updated during init */ - tmp_ep[0] = '\0'; + memset(tmp_parts, 0, sizeof(tmp_parts)); + memset(tmp_ep, 0, sizeof(tmp_ep)); if (current_partition) strncpy(tmp_ep, current_partition, PARTITION_MAXLEN); @@ -1750,7 +1768,7 @@ int mtdparts_init(void) if (mtdids_default) { debug("mtdids variable not defined, using default\n"); ids = mtdids_default; - setenv("mtdids", (char *)ids); + env_set("mtdids", (char *)ids); } else { printf("mtdids not defined, no default present\n"); return 1; @@ -1761,10 +1779,16 @@ int mtdparts_init(void) return 1; } - /* do no try to use defaults when mtdparts variable is not defined, - * just check the length */ - if (!parts) - printf("mtdparts variable not set, see 'help mtdparts'\n"); + /* use defaults when mtdparts variable is not defined + * once mtdparts is saved environment, drop use_defaults flag */ + if (!parts) { + if (mtdparts_default && use_defaults) { + parts = mtdparts_default; + if (env_set("mtdparts", (char *)parts) == 0) + use_defaults = 0; + } else + printf("mtdparts variable not set, see 'help mtdparts'\n"); + } if (parts && (strlen(parts) > MTDPARTS_MAXLEN - 1)) { printf("mtdparts too long (> %d)\n", MTDPARTS_MAXLEN); @@ -1830,7 +1854,7 @@ int mtdparts_init(void) current_mtd_partnum = pnum; current_save(); } - } else if (getenv("partition") == NULL) { + } else if (env_get("partition") == NULL) { debug("no partition variable set, setting...\n"); current_save(); } @@ -1936,9 +1960,10 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, { if (argc == 2) { if (strcmp(argv[1], "default") == 0) { - setenv("mtdids", (char *)mtdids_default); - setenv("mtdparts", (char *)mtdparts_default); - setenv("partition", NULL); + env_set("mtdids", NULL); + env_set("mtdparts", NULL); + env_set("partition", NULL); + use_defaults = 1; mtdparts_init(); return 0; @@ -1946,7 +1971,7 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, /* this may be the first run, initialize lists if needed */ mtdparts_init(); - setenv("mtdparts", NULL); + env_set("mtdparts", NULL); /* mtd_devices_init() calls current_save() */ return mtd_devices_init(); @@ -2012,7 +2037,7 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, if (!strcmp(&argv[1][3], ".spread")) { spread_partition(mtd, p, &next_offset); - debug("increased %s to %d bytes\n", p->name, p->size); + debug("increased %s to %llu bytes\n", p->name, p->size); } #endif