kernel: mtdsplit_uimage: add parser for Edimax devices
authorrmilecki <rmilecki@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 12 Feb 2015 07:23:40 +0000 (07:23 +0000)
committerrmilecki <rmilecki@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 12 Feb 2015 07:23:40 +0000 (07:23 +0000)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44413 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_uimage.c

index fa89f33..04a0eb4 100644 (file)
@@ -295,10 +295,63 @@ static struct mtd_part_parser uimage_netgear_parser = {
        .type = MTD_PARSER_TYPE_FIRMWARE,
 };
 
+/**************************************************
+ * Edimax
+ **************************************************/
+
+#define FW_EDIMAX_OFFSET       20
+#define FW_MAGIC_EDIMAX                0x43535953
+
+static ssize_t uimage_find_edimax(u_char *buf, size_t len)
+{
+       struct uimage_header *header;
+
+       if (len < FW_EDIMAX_OFFSET + sizeof(*header)) {
+               pr_err("Buffer too small for checking Edimax header\n");
+               return -ENOSPC;
+       }
+
+       header = (struct uimage_header *)(buf + FW_EDIMAX_OFFSET);
+
+       switch be32_to_cpu(header->ih_magic) {
+       case FW_MAGIC_EDIMAX:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (header->ih_os != IH_OS_LINUX ||
+           header->ih_type != IH_TYPE_FILESYSTEM)
+               return -EINVAL;
+
+       return FW_EDIMAX_OFFSET;
+}
+
+static int
+mtdsplit_uimage_parse_edimax(struct mtd_info *master,
+                             struct mtd_partition **pparts,
+                             struct mtd_part_parser_data *data)
+{
+       return __mtdsplit_parse_uimage(master, pparts, data,
+                                      uimage_find_edimax);
+}
+
+static struct mtd_part_parser uimage_edimax_parser = {
+       .owner = THIS_MODULE,
+       .name = "edimax-fw",
+       .parse_fn = mtdsplit_uimage_parse_edimax,
+       .type = MTD_PARSER_TYPE_FIRMWARE,
+};
+
+/**************************************************
+ * Init
+ **************************************************/
+
 static int __init mtdsplit_uimage_init(void)
 {
        register_mtd_parser(&uimage_generic_parser);
        register_mtd_parser(&uimage_netgear_parser);
+       register_mtd_parser(&uimage_edimax_parser);
 
        return 0;
 }