]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mtd: bcm47xxpart: support TRX data partition being UBI
authorRafał Miłecki <zajec5@gmail.com>
Mon, 1 Dec 2014 17:50:20 +0000 (18:50 +0100)
committerBrian Norris <computersforpeace@gmail.com>
Wed, 7 Jan 2015 20:24:15 +0000 (12:24 -0800)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/bcm47xxpart.c

index cc13ea5ce4d58f6cb532d151d5f22d9aa46e8c2c..26a4a4a4e8ab043b2f6695c4b91e63bce615305b 100644 (file)
@@ -40,6 +40,7 @@
 #define ML_MAGIC2                      0x26594131
 #define TRX_MAGIC                      0x30524448
 #define SQSH_MAGIC                     0x71736873      /* shsq */
+#define UBI_EC_MAGIC                   0x23494255      /* UBI# */
 
 struct trx_header {
        uint32_t magic;
@@ -50,7 +51,7 @@ struct trx_header {
        uint32_t offset[3];
 } __packed;
 
-static void bcm47xxpart_add_part(struct mtd_partition *part, char *name,
+static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name,
                                 u64 offset, uint32_t mask_flags)
 {
        part->name = name;
@@ -58,6 +59,26 @@ static void bcm47xxpart_add_part(struct mtd_partition *part, char *name,
        part->mask_flags = mask_flags;
 }
 
+static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
+                                                 size_t offset)
+{
+       uint32_t buf;
+       size_t bytes_read;
+
+       if (mtd_read(master, offset, sizeof(buf), &bytes_read,
+                    (uint8_t *)&buf) < 0) {
+               pr_err("mtd_read error while parsing (offset: 0x%X)!\n",
+                       offset);
+               goto out_default;
+       }
+
+       if (buf == UBI_EC_MAGIC)
+               return "ubi";
+
+out_default:
+       return "rootfs";
+}
+
 static int bcm47xxpart_parse(struct mtd_info *master,
                             struct mtd_partition **pparts,
                             struct mtd_part_parser_data *data)
@@ -186,8 +207,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
                         * we want to have jffs2 (overlay) in the same mtd.
                         */
                        if (trx->offset[i]) {
+                               const char *name;
+
+                               name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]);
                                bcm47xxpart_add_part(&parts[curr_part++],
-                                                    "rootfs",
+                                                    name,
                                                     offset + trx->offset[i],
                                                     0);
                                i++;