]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - common/cmd_jffs2.c
Standardize command usage messages with cmd_usage()
[people/ms/u-boot.git] / common / cmd_jffs2.c
index 791a572cc51a60986cdc21681dea5924b3fb0e3b..4c63f51c104f9a8562a7d06eb2595ae9a51c3131 100644 (file)
@@ -339,11 +339,15 @@ static int part_validate_nor(struct mtdids *id, struct part_info *part)
        extern flash_info_t flash_info[];
        flash_info_t *flash;
        int offset_aligned;
-       u32 end_offset;
+       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) {
@@ -358,12 +362,18 @@ static int part_validate_nor(struct mtdids *id, struct part_info *part)
        }
 
        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)
-                       return 0;
+                       offset_aligned = 1;
        }
 
-       if (flash->size == end_offset)
+       if (offset_aligned || flash->size == end_offset)
                return 0;
 
        printf("%s%d: partition (%s) size alignment incorrect\n",
@@ -389,6 +399,8 @@ static int part_validate_nand(struct mtdids *id, struct part_info *part)
 
        nand = &nand_info[id->num];
 
+       part->sector_size = nand->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);
@@ -424,6 +436,8 @@ static int part_validate_onenand(struct mtdids *id, struct part_info *part)
 
        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",
@@ -1056,7 +1070,7 @@ static int device_parse(const char *const mtd_dev, const char **ret, struct mtd_
  *
  * @return 0 on success, 1 otherwise
  */
-static int devices_init(void)
+static int jffs2_devices_init(void)
 {
        last_parts[0] = '\0';
        current_dev = NULL;
@@ -1471,12 +1485,12 @@ static int parse_mtdparts(const char *const mtdparts)
        DEBUGF("\n---parse_mtdparts---\nmtdparts = %s\n\n", p);
 
        /* delete all devices and partitions */
-       if (devices_init() != 0) {
+       if (jffs2_devices_init() != 0) {
                printf("could not initialise device list\n");
                return err;
        }
 
-       /* re-read 'mtdparts' variable, devices_init may be updating env */
+       /* re-read 'mtdparts' variable, jffs2_devices_init may be updating env */
        p = getenv("mtdparts");
 
        if (strncmp(p, "mtdparts=", 9) != 0) {
@@ -1698,7 +1712,7 @@ int mtdparts_init(void)
                ids_changed = 1;
 
                if (parse_mtdids(ids) != 0) {
-                       devices_init();
+                       jffs2_devices_init();
                        return 1;
                }
 
@@ -1731,7 +1745,7 @@ int mtdparts_init(void)
 
        /* mtdparts variable was reset to NULL, delete all devices/partitions */
        if (!parts && (last_parts[0] != '\0'))
-               return devices_init();
+               return jffs2_devices_init();
 
        /* do not process current partition if mtdparts variable is null */
        if (!parts)
@@ -1763,6 +1777,96 @@ int mtdparts_init(void)
  * a single device configuration.
  */
 
+/**
+ * Calculate sector size.
+ *
+ * @return sector size
+ */
+static inline u32 get_part_sector_size_nand(struct mtdids *id)
+{
+#if defined(CONFIG_JFFS2_NAND) && defined(CONFIG_CMD_NAND)
+#if defined(CONFIG_NAND_LEGACY)
+       extern struct nand_chip nand_dev_desc[CONFIG_SYS_MAX_NAND_DEVICE];
+
+       return nand_dev_desc[id->num].erasesize;
+#else
+       nand_info_t *nand;
+
+       nand = &nand_info[id->num];
+
+       return nand->erasesize;
+#endif
+#else
+       BUG();
+       return 0;
+#endif
+}
+
+static inline u32 get_part_sector_size_nor(struct mtdids *id, struct part_info *part)
+{
+#if defined(CONFIG_CMD_FLASH)
+       extern flash_info_t flash_info[];
+
+       u32 end_phys, start_phys, sector_size = 0, size = 0;
+       int i;
+       flash_info_t *flash;
+
+       flash = &flash_info[id->num];
+
+       start_phys = flash->start[0] + part->offset;
+       end_phys = start_phys + part->size;
+
+       for (i = 0; i < flash->sector_count; i++) {
+               if (flash->start[i] >= end_phys)
+                       break;
+
+               if (flash->start[i] >= start_phys) {
+                       if (i == flash->sector_count - 1) {
+                               size = flash->start[0] + flash->size - flash->start[i];
+                       } else {
+                               size = flash->start[i+1] - flash->start[i];
+                       }
+
+                       if (sector_size < size)
+                               sector_size = size;
+               }
+       }
+
+       return sector_size;
+#else
+       BUG();
+       return 0;
+#endif
+}
+
+static inline u32 get_part_sector_size_onenand(void)
+{
+#if defined(CONFIG_CMD_ONENAND)
+       struct mtd_info *mtd;
+
+       mtd = &onenand_mtd;
+
+       return mtd->erasesize;
+#else
+       BUG();
+       return 0;
+#endif
+}
+
+static inline u32 get_part_sector_size(struct mtdids *id, struct part_info *part)
+{
+       if (id->type == MTD_DEV_TYPE_NAND)
+               return get_part_sector_size_nand(id);
+       else if (id->type == MTD_DEV_TYPE_NOR)
+               return get_part_sector_size_nor(id, part);
+       else if (id->type == MTD_DEV_TYPE_ONENAND)
+               return get_part_sector_size_onenand();
+       else
+               DEBUGF("Error: Unknown device type.\n");
+
+       return 0;
+}
+
 /**
  * Parse and initialize global mtdids mapping and create global
  * device/partition list.
@@ -1832,6 +1936,8 @@ int mtdparts_init(void)
                part->offset = 0x00000000;
 #endif
 
+               part->sector_size = get_part_sector_size(id, part);
+
                part->dev = current_dev;
                INIT_LIST_HEAD(&part->link);
 
@@ -2105,8 +2211,8 @@ int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
                        setenv("mtdparts", NULL);
 
-                       /* devices_init() calls current_save() */
-                       return devices_init();
+                       /* jffs2_devices_init() calls current_save() */
+                       return jffs2_devices_init();
                }
        }
 
@@ -2183,7 +2289,7 @@ int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                return delete_partition(argv[2]);
        }
 
-       printf ("Usage:\n%s\n", cmdtp->usage);
+       cmd_usage(cmdtp);
        return 1;
 }
 #endif /* #ifdef CONFIG_JFFS2_CMDLINE */