]> git.sur5r.net Git - u-boot/blobdiff - common/cmd_mtdparts.c
Merge branch 'master' of ssh://gemini/home/wd/git/u-boot/master
[u-boot] / common / cmd_mtdparts.c
index c8bf2c6392e8e9e99551455186c02ce80b60ef0b..116e637d57b0d5aa256e912a6d5f8f63bb2f1d35 100644 (file)
  *
  */
 
-/*
- * JFFS2/CRAMFS support
- */
 #include <common.h>
 #include <command.h>
 #include <malloc.h>
-#include <jffs2/jffs2.h>
+#include <jffs2/load_kernel.h>
 #include <linux/list.h>
 #include <linux/ctype.h>
-#include <cramfs/cramfs_fs.h>
+#include <linux/err.h>
+#include <linux/mtd/mtd.h>
 
 #if defined(CONFIG_CMD_NAND)
-#ifdef CONFIG_NAND_LEGACY
-#include <linux/mtd/nand_legacy.h>
-#else /* !CONFIG_NAND_LEGACY */
 #include <linux/mtd/nand.h>
 #include <nand.h>
-#endif /* !CONFIG_NAND_LEGACY */
 #endif
 
 #if defined(CONFIG_CMD_ONENAND)
-#include <linux/mtd/mtd.h>
 #include <linux/mtd/onenand.h>
 #include <onenand_uboot.h>
 #endif
 
-/* enable/disable debugging messages */
-#define        DEBUG_MTDPARTS
-#undef DEBUG_MTDPARTS
-
-#ifdef  DEBUG_MTDPARTS
-# define DEBUGF(fmt, args...)  printf(fmt ,##args)
-#else
-# define DEBUGF(fmt, args...)
-#endif
-
 /* special size referring to all the remaining space in a partition */
 #define SIZE_REMAINING         0xFFFFFFFF
 
 #if defined(MTDIDS_DEFAULT)
 static const char *const mtdids_default = MTDIDS_DEFAULT;
 #else
-#warning "MTDIDS_DEFAULT not defined!"
 static const char *const mtdids_default = NULL;
 #endif
 
 #if defined(MTDPARTS_DEFAULT)
 static const char *const mtdparts_default = MTDPARTS_DEFAULT;
 #else
-#warning "MTDPARTS_DEFAULT not defined!"
 static const char *const mtdparts_default = NULL;
 #endif
 
@@ -169,8 +150,8 @@ struct list_head mtdids;
 struct list_head devices;
 
 /* current active device and partition number */
-static struct mtd_device *current_dev = NULL;
-static u8 current_partnum = 0;
+struct mtd_device *current_mtd_dev = NULL;
+u8 current_mtd_partnum = 0;
 
 static struct part_info* mtd_part_info(struct mtd_device *dev, unsigned int part_num);
 
@@ -252,14 +233,14 @@ static void index_partitions(void)
        struct list_head *dentry;
        struct mtd_device *dev;
 
-       DEBUGF("--- index partitions ---\n");
+       debug("--- index partitions ---\n");
 
-       if (current_dev) {
+       if (current_mtd_dev) {
                mtddevnum = 0;
                list_for_each(dentry, &devices) {
                        dev = list_entry(dentry, struct mtd_device, link);
-                       if (dev == current_dev) {
-                               mtddevnum += current_partnum;
+                       if (dev == current_mtd_dev) {
+                               mtddevnum += current_mtd_partnum;
                                sprintf(buf, "%d", mtddevnum);
                                setenv("mtddevnum", buf);
                                break;
@@ -267,15 +248,15 @@ static void index_partitions(void)
                        mtddevnum += dev->num_parts;
                }
 
-               part = mtd_part_info(current_dev, current_partnum);
+               part = mtd_part_info(current_mtd_dev, current_mtd_partnum);
                setenv("mtddevname", part->name);
 
-               DEBUGF("=> mtddevnum %d,\n=> mtddevname %s\n", mtddevnum, part->name);
+               debug("=> mtddevnum %d,\n=> mtddevname %s\n", mtddevnum, part->name);
        } else {
                setenv("mtddevnum", NULL);
                setenv("mtddevname", NULL);
 
-               DEBUGF("=> mtddevnum NULL\n=> mtddevname NULL\n");
+               debug("=> mtddevnum NULL\n=> mtddevname NULL\n");
        }
 }
 
@@ -286,157 +267,111 @@ static void current_save(void)
 {
        char buf[16];
 
-       DEBUGF("--- current_save ---\n");
+       debug("--- current_save ---\n");
 
-       if (current_dev) {
-               sprintf(buf, "%s%d,%d", MTD_DEV_TYPE(current_dev->id->type),
-                                       current_dev->id->num, current_partnum);
+       if (current_mtd_dev) {
+               sprintf(buf, "%s%d,%d", MTD_DEV_TYPE(current_mtd_dev->id->type),
+                                       current_mtd_dev->id->num, current_mtd_partnum);
 
                setenv("partition", buf);
                strncpy(last_partition, buf, 16);
 
-               DEBUGF("=> partition %s\n", buf);
+               debug("=> partition %s\n", buf);
        } else {
                setenv("partition", NULL);
                last_partition[0] = '\0';
 
-               DEBUGF("=> partition NULL\n");
+               debug("=> partition NULL\n");
        }
        index_partitions();
 }
 
 /**
- * Performs sanity check for supplied NOR flash partition. Table of existing
- * NOR flash devices is searched and partition device is located. Alignment
- * with the granularity of NOR flash sectors is verified.
+ * Performs sanity check for supplied flash partition.
+ * Table of existing MTD flash devices is searched and partition device
+ * is located. Alignment with the granularity of nand erasesize is verified.
  *
  * @param id of the parent device
  * @param part partition to validate
  * @return 0 if partition is valid, 1 otherwise
  */
-static int part_validate_nor(struct mtdids *id, struct part_info *part)
+static int part_validate_eraseblock(struct mtdids *id, struct part_info *part)
 {
-#if defined(CONFIG_CMD_FLASH)
-       /* info for FLASH chips */
-       extern flash_info_t flash_info[];
-       flash_info_t *flash;
-       int offset_aligned;
-       u32 end_offset, sector_size = 0;
-       int i;
-
-       flash = &flash_info[id->num];
-
-       /* size of last sector */
-       part->sector_size = flash->size -
-               (flash->start[flash->sector_count-1] - flash->start[0]);
-
-       offset_aligned = 0;
-       for (i = 0; i < flash->sector_count; i++) {
-               if ((flash->start[i] - flash->start[0]) == part->offset) {
-                       offset_aligned = 1;
-                       break;
-               }
-       }
-       if (offset_aligned == 0) {
-               printf("%s%d: partition (%s) start offset alignment incorrect\n",
-                               MTD_DEV_TYPE(id->type), id->num, part->name);
+       struct mtd_info *mtd;
+       char mtd_dev[16];
+       int i, j;
+       ulong start;
+
+       sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(id->type), id->num);
+       mtd = get_mtd_device_nm(mtd_dev);
+       if (IS_ERR(mtd)) {
+               printf("Partition %s not found on device %s!\n", part->name, mtd_dev);
                return 1;
        }
 
-       end_offset = part->offset + part->size;
-       offset_aligned = 0;
-       for (i = 0; i < flash->sector_count; i++) {
-               if (i) {
-                       sector_size = flash->start[i] - flash->start[i-1];
-                       if (part->sector_size < sector_size)
-                               part->sector_size = sector_size;
-               }
-               if ((flash->start[i] - flash->start[0]) == end_offset)
-                       offset_aligned = 1;
-       }
-
-       if (offset_aligned || flash->size == end_offset)
-               return 0;
-
-       printf("%s%d: partition (%s) size alignment incorrect\n",
-                       MTD_DEV_TYPE(id->type), id->num, part->name);
-#endif
-       return 1;
-}
-
-/**
- * Performs sanity check for supplied NAND flash partition. Table of existing
- * NAND flash devices is searched and partition device is located. Alignment
- * with the granularity of nand erasesize is verified.
- *
- * @param id of the parent device
- * @param part partition to validate
- * @return 0 if partition is valid, 1 otherwise
- */
-static int part_validate_nand(struct mtdids *id, struct part_info *part)
-{
-#if defined(CONFIG_JFFS2_NAND) && defined(CONFIG_CMD_NAND)
-       /* info for NAND chips */
-       nand_info_t *nand;
+       part->sector_size = mtd->erasesize;
 
-       nand = &nand_info[id->num];
+       if (!mtd->numeraseregions) {
+               /*
+                * Only one eraseregion (NAND, OneNAND or uniform NOR),
+                * checking for alignment is easy here
+                */
+               if ((unsigned long)part->offset % mtd->erasesize) {
+                       printf("%s%d: partition (%s) start offset"
+                              "alignment incorrect\n",
+                              MTD_DEV_TYPE(id->type), id->num, part->name);
+                       return 1;
+               }
 
-       part->sector_size = nand->erasesize;
+               if (part->size % mtd->erasesize) {
+                       printf("%s%d: partition (%s) size alignment incorrect\n",
+                              MTD_DEV_TYPE(id->type), id->num, part->name);
+                       return 1;
+               }
+       } else {
+               /*
+                * Multiple eraseregions (non-uniform NOR),
+                * checking for alignment is more complex here
+                */
+
+               /* Check start alignment */
+               for (i = 0; i < mtd->numeraseregions; i++) {
+                       start = mtd->eraseregions[i].offset;
+                       for (j = 0; j < mtd->eraseregions[i].numblocks; j++) {
+                               if (part->offset == start)
+                                       goto start_ok;
+                               start += mtd->eraseregions[i].erasesize;
+                       }
+               }
 
-       if ((unsigned long)(part->offset) % nand->erasesize) {
                printf("%s%d: partition (%s) start offset alignment incorrect\n",
-                               MTD_DEV_TYPE(id->type), id->num, part->name);
+                      MTD_DEV_TYPE(id->type), id->num, part->name);
                return 1;
-       }
 
-       if (part->size % nand->erasesize) {
-               printf("%s%d: partition (%s) size alignment incorrect\n",
-                               MTD_DEV_TYPE(id->type), id->num, part->name);
-               return 1;
-       }
+       start_ok:
 
-       return 0;
-#else
-       return 1;
-#endif
-}
-
-/**
- * Performs sanity check for supplied OneNAND flash partition.
- * Table of existing OneNAND flash devices is searched and partition device
- * is located. Alignment with the granularity of nand erasesize is verified.
- *
- * @param id of the parent device
- * @param part partition to validate
- * @return 0 if partition is valid, 1 otherwise
- */
-static int part_validate_onenand(struct mtdids *id, struct part_info *part)
-{
-#if defined(CONFIG_CMD_ONENAND)
-       /* info for OneNAND chips */
-       struct mtd_info *mtd;
-
-       mtd = &onenand_mtd;
-
-       part->sector_size = mtd->erasesize;
-
-       if ((unsigned long)(part->offset) % mtd->erasesize) {
-               printf("%s%d: partition (%s) start offset"
-                       "alignment incorrect\n",
-                               MTD_DEV_TYPE(id->type), id->num, part->name);
-               return 1;
-       }
+               /* Check end/size alignment */
+               for (i = 0; i < mtd->numeraseregions; i++) {
+                       start = mtd->eraseregions[i].offset;
+                       for (j = 0; j < mtd->eraseregions[i].numblocks; j++) {
+                               if ((part->offset + part->size) == start)
+                                       goto end_ok;
+                               start += mtd->eraseregions[i].erasesize;
+                       }
+               }
+               /* Check last sector alignment */
+               if ((part->offset + part->size) == start)
+                       goto end_ok;
 
-       if (part->size % mtd->erasesize) {
                printf("%s%d: partition (%s) size alignment incorrect\n",
-                               MTD_DEV_TYPE(id->type), id->num, part->name);
+                      MTD_DEV_TYPE(id->type), id->num, part->name);
                return 1;
+
+       end_ok:
+               return 0;
        }
 
        return 0;
-#else
-       return 1;
-#endif
 }
 
 
@@ -472,16 +407,11 @@ static int part_validate(struct mtdids *id, struct part_info *part)
                return 1;
        }
 
-       if (id->type == MTD_DEV_TYPE_NAND)
-               return part_validate_nand(id, part);
-       else if (id->type == MTD_DEV_TYPE_NOR)
-               return part_validate_nor(id, part);
-       else if (id->type == MTD_DEV_TYPE_ONENAND)
-               return part_validate_onenand(id, part);
-       else
-               DEBUGF("part_validate: invalid dev type\n");
-
-       return 1;
+       /*
+        * Now we need to check if the partition starts and ends on
+        * sector (eraseblock) regions
+        */
+       return part_validate_eraseblock(id, part);
 }
 
 /**
@@ -501,26 +431,23 @@ static int part_del(struct mtd_device *dev, struct part_info *part)
 
        /* otherwise just delete this partition */
 
-       if (dev == current_dev) {
+       if (dev == current_mtd_dev) {
                /* we are modyfing partitions for the current device,
                 * update current */
                struct part_info *curr_pi;
-               curr_pi = mtd_part_info(current_dev, current_partnum);
+               curr_pi = mtd_part_info(current_mtd_dev, current_mtd_partnum);
 
                if (curr_pi) {
                        if (curr_pi == part) {
                                printf("current partition deleted, resetting current to 0\n");
-                               current_partnum = 0;
+                               current_mtd_partnum = 0;
                        } else if (part->offset <= curr_pi->offset) {
-                               current_partnum--;
+                               current_mtd_partnum--;
                        }
                        current_save_needed = 1;
                }
        }
 
-#ifdef CONFIG_NAND_LEGACY
-       jffs2_free_cache(part);
-#endif
        list_del(&part->link);
        free(part);
        dev->num_parts--;
@@ -547,9 +474,6 @@ static void part_delall(struct list_head *head)
        list_for_each_safe(entry, n, head) {
                part_tmp = list_entry(entry, struct part_info, link);
 
-#ifdef CONFIG_NAND_LEGACY
-               jffs2_free_cache(part_tmp);
-#endif
                list_del(entry);
                free(part_tmp);
        }
@@ -571,7 +495,7 @@ static int part_sort_add(struct mtd_device *dev, struct part_info *part)
        part->dev = dev;
 
        if (list_empty(&dev->parts)) {
-               DEBUGF("part_sort_add: list empty\n");
+               debug("part_sort_add: list empty\n");
                list_add(&part->link, &dev->parts);
                dev->num_parts++;
                index_partitions();
@@ -582,8 +506,8 @@ static int part_sort_add(struct mtd_device *dev, struct part_info *part)
 
        /* get current partition info if we are updating current device */
        curr_pi = NULL;
-       if (dev == current_dev)
-               curr_pi = mtd_part_info(current_dev, current_partnum);
+       if (dev == current_mtd_dev)
+               curr_pi = mtd_part_info(current_mtd_dev, current_mtd_partnum);
 
        list_for_each(entry, &dev->parts) {
                struct part_info *pi;
@@ -603,7 +527,7 @@ static int part_sort_add(struct mtd_device *dev, struct part_info *part)
                        if (curr_pi && (pi->offset <= curr_pi->offset)) {
                                /* we are modyfing partitions for the current
                                 * device, update current */
-                               current_partnum++;
+                               current_mtd_partnum++;
                                current_save();
                        } else {
                                index_partitions();
@@ -664,7 +588,7 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i
        /* fetch the partition size */
        if (*p == '-') {
                /* assign all remaining space to this partition */
-               DEBUGF("'-': remaining size assigned\n");
+               debug("'-': remaining size assigned\n");
                size = SIZE_REMAINING;
                p++;
        } else {
@@ -749,7 +673,7 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i
        part->name[name_len - 1] = '\0';
        INIT_LIST_HEAD(&part->link);
 
-       DEBUGF("+ partition: name %-22s size 0x%08x offset 0x%08x mask flags %d\n",
+       debug("+ partition: name %-22s size 0x%08x offset 0x%08x mask flags %d\n",
                        part->name, part->size,
                        part->offset, part->mask_flags);
 
@@ -765,48 +689,19 @@ static int part_parse(const char *const partdef, const char **ret, struct part_i
  */
 int mtd_device_validate(u8 type, u8 num, u32 *size)
 {
-       if (type == MTD_DEV_TYPE_NOR) {
-#if defined(CONFIG_CMD_FLASH)
-               if (num < CONFIG_SYS_MAX_FLASH_BANKS) {
-                       extern flash_info_t flash_info[];
-                       *size = flash_info[num].size;
-
-                       return 0;
-               }
+       struct mtd_info *mtd;
+       char mtd_dev[16];
 
-               printf("no such FLASH device: %s%d (valid range 0 ... %d\n",
-                               MTD_DEV_TYPE(type), num, CONFIG_SYS_MAX_FLASH_BANKS - 1);
-#else
-               printf("support for FLASH devices not present\n");
-#endif
-       } else if (type == MTD_DEV_TYPE_NAND) {
-#if defined(CONFIG_JFFS2_NAND) && defined(CONFIG_CMD_NAND)
-               if (num < CONFIG_SYS_MAX_NAND_DEVICE) {
-#ifndef CONFIG_NAND_LEGACY
-                       *size = nand_info[num].size;
-#else
-                       extern struct nand_chip nand_dev_desc[CONFIG_SYS_MAX_NAND_DEVICE];
-                       *size = nand_dev_desc[num].totlen;
-#endif
-                       return 0;
-               }
+       sprintf(mtd_dev, "%s%d", MTD_DEV_TYPE(type), num);
+       mtd = get_mtd_device_nm(mtd_dev);
+       if (IS_ERR(mtd)) {
+               printf("Device %s not found!\n", mtd_dev);
+               return 1;
+       }
 
-               printf("no such NAND device: %s%d (valid range 0 ... %d)\n",
-                               MTD_DEV_TYPE(type), num, CONFIG_SYS_MAX_NAND_DEVICE - 1);
-#else
-               printf("support for NAND devices not present\n");
-#endif
-       } else if (type == MTD_DEV_TYPE_ONENAND) {
-#if defined(CONFIG_CMD_ONENAND)
-               *size = onenand_mtd.size;
-               return 0;
-#else
-               printf("support for OneNAND devices not present\n");
-#endif
-       } else
-               printf("Unknown defice type %d\n", type);
+       *size = mtd->size;
 
-       return 1;
+       return 0;
 }
 
 /**
@@ -845,15 +740,15 @@ static int device_del(struct mtd_device *dev)
        list_del(&dev->link);
        free(dev);
 
-       if (dev == current_dev) {
+       if (dev == current_mtd_dev) {
                /* we just deleted current device */
                if (list_empty(&devices)) {
-                       current_dev = NULL;
+                       current_mtd_dev = NULL;
                } else {
                        /* reset first partition from first dev from the
                         * devices list as current */
-                       current_dev = list_entry(devices.next, struct mtd_device, link);
-                       current_partnum = 0;
+                       current_mtd_dev = list_entry(devices.next, struct mtd_device, link);
+                       current_mtd_partnum = 0;
                }
                current_save();
                return 0;
@@ -871,7 +766,7 @@ static int device_del(struct mtd_device *dev)
  * @param num device number
  * @return NULL if requested device does not exist
  */
-static struct mtd_device* device_find(u8 type, u8 num)
+struct mtd_device *device_find(u8 type, u8 num)
 {
        struct list_head *entry;
        struct mtd_device *dev_tmp;
@@ -896,8 +791,8 @@ static void device_add(struct mtd_device *dev)
        u8 current_save_needed = 0;
 
        if (list_empty(&devices)) {
-               current_dev = dev;
-               current_partnum = 0;
+               current_mtd_dev = dev;
+               current_mtd_partnum = 0;
                current_save_needed = 1;
        }
 
@@ -932,14 +827,16 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
        u32 offset;
        int err = 1;
 
-       p = mtd_dev;
+       debug("===device_parse===\n");
+
+       assert(retdev);
        *retdev = NULL;
-       *ret = NULL;
 
-       DEBUGF("===device_parse===\n");
+       if (ret)
+               *ret = NULL;
 
        /* fetch <mtd-id> */
-       mtd_id = p;
+       mtd_id = p = mtd_dev;
        if (!(p = strchr(mtd_id, ':'))) {
                printf("no <mtd-id> identifier\n");
                return 1;
@@ -953,11 +850,11 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
                return 1;
        }
 
-       DEBUGF("dev type = %d (%s), dev num = %d, mtd-id = %s\n",
+       debug("dev type = %d (%s), dev num = %d, mtd-id = %s\n",
                        id->type, MTD_DEV_TYPE(id->type),
                        id->num, id->mtd_id);
        pend = strchr(p, ';');
-       DEBUGF("parsing partitions %.*s\n", (pend ? pend - p : strlen(p)), p);
+       debug("parsing partitions %.*s\n", (pend ? pend - p : strlen(p)), p);
 
 
        /* parse partitions */
@@ -1003,17 +900,20 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
                return 1;
        }
 
-       DEBUGF("\ntotal partitions: %d\n", num_parts);
+       debug("\ntotal partitions: %d\n", num_parts);
 
        /* check for next device presence */
        if (p) {
                if (*p == ';') {
-                       *ret = ++p;
+                       if (ret)
+                               *ret = ++p;
                } else if (*p == '\0') {
-                       *ret = p;
+                       if (ret)
+                               *ret = p;
                } else {
                        printf("unexpected character '%c' at the end of device\n", *p);
-                       *ret = NULL;
+                       if (ret)
+                               *ret = NULL;
                        return 1;
                }
        }
@@ -1041,7 +941,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
 
        *retdev = dev;
 
-       DEBUGF("===\n\n");
+       debug("===\n\n");
        return 0;
 }
 
@@ -1053,7 +953,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
 static int mtd_devices_init(void)
 {
        last_parts[0] = '\0';
-       current_dev = NULL;
+       current_mtd_dev = NULL;
        current_save();
 
        return device_delall(&devices);
@@ -1093,13 +993,13 @@ static struct mtdids* id_find_by_mtd_id(const char *mtd_id, unsigned int mtd_id_
        struct list_head *entry;
        struct mtdids *id;
 
-       DEBUGF("--- id_find_by_mtd_id: '%.*s' (len = %d)\n",
+       debug("--- id_find_by_mtd_id: '%.*s' (len = %d)\n",
                        mtd_id_len, mtd_id, mtd_id_len);
 
        list_for_each(entry, &mtdids) {
                id = list_entry(entry, struct mtdids, link);
 
-               DEBUGF("entry: '%s' (len = %d)\n",
+               debug("entry: '%s' (len = %d)\n",
                                id->mtd_id, strlen(id->mtd_id));
 
                if (mtd_id_len != strlen(id->mtd_id))
@@ -1169,7 +1069,7 @@ static int generate_mtdparts(char *buf, u32 buflen)
        u32 size, offset, len, part_cnt;
        u32 maxlen = buflen - 1;
 
-       DEBUGF("--- generate_mtdparts ---\n");
+       debug("--- generate_mtdparts ---\n");
 
        if (list_empty(&devices)) {
                buf[0] = '\0';
@@ -1311,13 +1211,13 @@ static void list_partitions(void)
        struct mtd_device *dev;
        int part_num;
 
-       DEBUGF("\n---list_partitions---\n");
+       debug("\n---list_partitions---\n");
        list_for_each(dentry, &devices) {
                dev = list_entry(dentry, struct mtd_device, link);
                printf("\ndevice %s%d <%s>, # parts = %d\n",
                                MTD_DEV_TYPE(dev->id->type), dev->id->num,
                                dev->id->mtd_id, dev->num_parts);
-               printf(" #: name\t\t\tsize\t\toffset\t\tmask_flags\n");
+               printf(" #: name\t\tsize\t\toffset\t\tmask_flags\n");
 
                /* list partitions for given device */
                part_num = 0;
@@ -1333,13 +1233,13 @@ static void list_partitions(void)
        if (list_empty(&devices))
                printf("no partitions defined\n");
 
-       /* current_dev is not NULL only when we have non empty device list */
-       if (current_dev) {
-               part = mtd_part_info(current_dev, current_partnum);
+       /* current_mtd_dev is not NULL only when we have non empty device list */
+       if (current_mtd_dev) {
+               part = mtd_part_info(current_mtd_dev, current_mtd_partnum);
                if (part) {
                        printf("\nactive partition: %s%d,%d - (%s) 0x%08x @ 0x%08x\n",
-                                       MTD_DEV_TYPE(current_dev->id->type),
-                                       current_dev->id->num, current_partnum,
+                                       MTD_DEV_TYPE(current_mtd_dev->id->type),
+                                       current_mtd_dev->id->num, current_mtd_partnum,
                                        part->name, part->size, part->offset);
                } else {
                        printf("could not get current partition info\n\n");
@@ -1347,8 +1247,16 @@ static void list_partitions(void)
        }
 
        printf("\ndefaults:\n");
-       printf("mtdids  : %s\n", mtdids_default);
-       printf("mtdparts: %s\n", mtdparts_default);
+       printf("mtdids  : %s\n",
+               mtdids_default ? mtdids_default : "none");
+       /*
+        * Using printf() here results in printbuffer overflow
+        * if default mtdparts string is greater than console
+        * printbuffer. Use puts() to prevent system crashes.
+        */
+       puts("mtdparts: ");
+       puts(mtdparts_default ? mtdparts_default : "none");
+       puts("\n");
 }
 
 /**
@@ -1368,7 +1276,7 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,
        u8 type, dnum, pnum;
        const char *p;
 
-       DEBUGF("--- find_dev_and_part ---\nid = %s\n", id);
+       debug("--- find_dev_and_part ---\nid = %s\n", id);
 
        list_for_each(dentry, &devices) {
                *part_num = 0;
@@ -1429,7 +1337,7 @@ static int delete_partition(const char *id)
 
        if (find_dev_and_part(id, &dev, &pnum, &part) == 0) {
 
-               DEBUGF("delete_partition: device = %s%d, partition %d = (%s) 0x%08lx@0x%08lx\n",
+               debug("delete_partition: device = %s%d, partition %d = (%s) 0x%08x@0x%08x\n",
                                MTD_DEV_TYPE(dev->id->type), dev->id->num, pnum,
                                part->name, part->size, part->offset);
 
@@ -1460,7 +1368,7 @@ static int parse_mtdparts(const char *const mtdparts)
        struct mtd_device *dev;
        int err = 1;
 
-       DEBUGF("\n---parse_mtdparts---\nmtdparts = %s\n\n", p);
+       debug("\n---parse_mtdparts---\nmtdparts = %s\n\n", p);
 
        /* delete all devices and partitions */
        if (mtd_devices_init() != 0) {
@@ -1482,7 +1390,7 @@ static int parse_mtdparts(const char *const mtdparts)
                if ((device_parse(p, &p, &dev) != 0) || (!dev))
                        break;
 
-               DEBUGF("+ device: %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type),
+               debug("+ device: %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type),
                                dev->id->num, dev->id->mtd_id);
 
                /* check if parsed device is already on the list */
@@ -1523,12 +1431,12 @@ static int parse_mtdids(const char *const ids)
        u32 size;
        int ret = 1;
 
-       DEBUGF("\n---parse_mtdids---\nmtdids = %s\n\n", ids);
+       debug("\n---parse_mtdids---\nmtdids = %s\n\n", ids);
 
        /* clean global mtdids list */
        list_for_each_safe(entry, n, &mtdids) {
                id_tmp = list_entry(entry, struct mtdids, link);
-               DEBUGF("mtdids del: %d %d\n", id_tmp->type, id_tmp->num);
+               debug("mtdids del: %d %d\n", id_tmp->type, id_tmp->num);
                list_del(entry);
                free(id_tmp);
        }
@@ -1594,7 +1502,7 @@ static int parse_mtdids(const char *const ids)
                id->mtd_id[mtd_id_len - 1] = '\0';
                INIT_LIST_HEAD(&id->link);
 
-               DEBUGF("+ id %s%d\t%16d bytes\t%s\n",
+               debug("+ id %s%d\t%16d bytes\t%s\n",
                                MTD_DEV_TYPE(id->type), id->num,
                                id->size, id->mtd_id);
 
@@ -1628,7 +1536,7 @@ int mtdparts_init(void)
        int ids_changed;
        char tmp_ep[PARTITION_MAXLEN];
 
-       DEBUGF("\n---mtdparts_init---\n");
+       debug("\n---mtdparts_init---\n");
        if (!initialized) {
                INIT_LIST_HEAD(&mtdids);
                INIT_LIST_HEAD(&devices);
@@ -1649,18 +1557,18 @@ int mtdparts_init(void)
        if (current_partition)
                strncpy(tmp_ep, current_partition, PARTITION_MAXLEN);
 
-       DEBUGF("last_ids  : %s\n", last_ids);
-       DEBUGF("env_ids   : %s\n", ids);
-       DEBUGF("last_parts: %s\n", last_parts);
-       DEBUGF("env_parts : %s\n\n", parts);
+       debug("last_ids  : %s\n", last_ids);
+       debug("env_ids   : %s\n", ids);
+       debug("last_parts: %s\n", last_parts);
+       debug("env_parts : %s\n\n", parts);
 
-       DEBUGF("last_partition : %s\n", last_partition);
-       DEBUGF("env_partition  : %s\n", current_partition);
+       debug("last_partition : %s\n", last_partition);
+       debug("env_partition  : %s\n", current_partition);
 
        /* if mtdids varible is empty try to use defaults */
        if (!ids) {
                if (mtdids_default) {
-                       DEBUGF("mtdids variable not defined, using default\n");
+                       debug("mtdids variable not defined, using default\n");
                        ids = mtdids_default;
                        setenv("mtdids", (char *)ids);
                } else {
@@ -1712,13 +1620,13 @@ int mtdparts_init(void)
                strncpy(last_parts, parts, MTDPARTS_MAXLEN);
 
                /* reset first partition from first dev from the list as current */
-               current_dev = list_entry(devices.next, struct mtd_device, link);
-               current_partnum = 0;
+               current_mtd_dev = list_entry(devices.next, struct mtd_device, link);
+               current_mtd_partnum = 0;
                current_save();
 
-               DEBUGF("mtdparts_init: current_dev  = %s%d, current_partnum = %d\n",
-                               MTD_DEV_TYPE(current_dev->id->type),
-                               current_dev->id->num, current_partnum);
+               debug("mtdparts_init: current_mtd_dev  = %s%d, current_mtd_partnum = %d\n",
+                               MTD_DEV_TYPE(current_mtd_dev->id->type),
+                               current_mtd_dev->id->num, current_mtd_partnum);
        }
 
        /* mtdparts variable was reset to NULL, delete all devices/partitions */
@@ -1735,15 +1643,15 @@ int mtdparts_init(void)
                struct mtd_device *cdev;
                u8 pnum;
 
-               DEBUGF("--- getting current partition: %s\n", tmp_ep);
+               debug("--- getting current partition: %s\n", tmp_ep);
 
                if (find_dev_and_part(tmp_ep, &cdev, &pnum, &p) == 0) {
-                       current_dev = cdev;
-                       current_partnum = pnum;
+                       current_mtd_dev = cdev;
+                       current_mtd_partnum = pnum;
                        current_save();
                }
        } else if (getenv("partition") == NULL) {
-               DEBUGF("no partition variable set, setting...\n");
+               debug("no partition variable set, setting...\n");
                current_save();
        }
 
@@ -1767,7 +1675,7 @@ static struct part_info* mtd_part_info(struct mtd_device *dev, unsigned int part
        if (!dev)
                return NULL;
 
-       DEBUGF("\n--- mtd_part_info: partition number %d for device %s%d (%s)\n",
+       debug("\n--- mtd_part_info: partition number %d for device %s%d (%s)\n",
                        part_num, MTD_DEV_TYPE(dev->id->type),
                        dev->id->num, dev->id->mtd_id);
 
@@ -1823,8 +1731,8 @@ int do_chpart(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        if (find_dev_and_part(argv[1], &dev, &pnum, &part) != 0)
                return 1;
 
-       current_dev = dev;
-       current_partnum = pnum;
+       current_mtd_dev = dev;
+       current_mtd_partnum = pnum;
        current_save();
 
        printf("partition changed to %s%d,%d\n",
@@ -1903,12 +1811,12 @@ int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                }
                sprintf(tmpbuf, "%s:%s(%s)%s",
                                id->mtd_id, argv[3], argv[4], argv[5] ? argv[5] : "");
-               DEBUGF("add tmpbuf: %s\n", tmpbuf);
+               debug("add tmpbuf: %s\n", tmpbuf);
 
                if ((device_parse(tmpbuf, NULL, &dev) != 0) || (!dev))
                        return 1;
 
-               DEBUGF("+ %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type),
+               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) {
@@ -1932,7 +1840,7 @@ int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        /* mtdparts del part-id */
        if ((argc == 3) && (strcmp(argv[1], "del") == 0)) {
-               DEBUGF("del: part-id = %s\n", argv[2]);
+               debug("del: part-id = %s\n", argv[2]);
 
                return delete_partition(argv[2]);
        }
@@ -1946,7 +1854,7 @@ U_BOOT_CMD(
        chpart, 2,      0,      do_chpart,
        "change active partition",
        "part-id\n"
-       "    - change active partition (e.g. part-id = nand0,1)\n"
+       "    - change active partition (e.g. part-id = nand0,1)"
 );
 
 U_BOOT_CMD(
@@ -1981,6 +1889,6 @@ U_BOOT_CMD(
        "<size>     := standard linux memsize OR '-' to denote all remaining space\n"
        "<offset>   := partition start offset within the device\n"
        "<name>     := '(' NAME ')'\n"
-       "<ro-flag>  := when set to 'ro' makes partition read-only (not used, passed to kernel)\n"
+       "<ro-flag>  := when set to 'ro' makes partition read-only (not used, passed to kernel)"
 );
 /***************************************************/