Przeglądaj źródła

kernel: mtdsplit: split by WRG header

Support splitting WRG images, which can be found in older
D-Link devices.

Signed-off-by: George Hopkins <[email protected]>
George Hopkins 8 lat temu
rodzic
commit
5c7a58764e

+ 18 - 3
target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_wrgg.c

@@ -22,6 +22,7 @@
 #define WRGG_NR_PARTS		2
 #define WRGG_MIN_ROOTFS_OFFS	0x80000	/* 512KiB */
 #define WRGG03_MAGIC		0x20080321
+#define WRG_MAGIC		0x20040220
 
 struct wrgg03_header {
 	char		signature[32];
@@ -38,6 +39,16 @@ struct wrgg03_header {
 	char		digest[16];
 } __attribute__ ((packed));
 
+struct wrg_header {
+	char		signature[32];
+	uint32_t	magic1;
+	uint32_t	magic2;
+	uint32_t	size;
+	uint32_t	offset;
+	char		devname[32];
+	char		digest[16];
+} __attribute__ ((packed));
+
 
 static int mtdsplit_parse_wrgg(struct mtd_info *master,
 			       const struct mtd_partition **pparts,
@@ -59,10 +70,14 @@ static int mtdsplit_parse_wrgg(struct mtd_info *master,
 		return -EIO;
 
 	/* sanity checks */
-	if (le32_to_cpu(hdr.magic1) != WRGG03_MAGIC)
+	if (le32_to_cpu(hdr.magic1) == WRGG03_MAGIC) {
+		kernel_ent_size = hdr_len + be32_to_cpu(hdr.size);
+	} else if (le32_to_cpu(hdr.magic1) == WRG_MAGIC) {
+		kernel_ent_size = sizeof(struct wrg_header) + le32_to_cpu(
+		                  ((struct wrg_header*)&hdr)->size);
+	} else {
 		return -EINVAL;
-
-	kernel_ent_size = hdr_len + be32_to_cpu(hdr.size);
+	}
 
 	if (kernel_ent_size > master->size)
 		return -EINVAL;