There is support for building proper images for Edimax devices which do have 20 
bytes long header before
uImage but those images are not bootable without adding extra kernel parameters 
as firmware partition is
not automatically split into kernel, rootfs and rootfs_data. Attached patch is 
corrects this issue (at
least for kernel 3.10.58).


--- a/drivers/mtd/mtdsplit_uimage.c
+++ b/drivers/mtd/mtdsplit_uimage.c
@@ -121,6 +121,31 @@
                break;
        }
 
+       if (uimage_size == 0 ) {
+
+               /* find uImage on 20 bytes past erase block boundary (Edimax 
header is 20 bytes long) */
+               for (offset = 20; offset < master->size; offset += 
master->erasesize) {
+
+                       ret = read_uimage_header(master, offset, header);
+                       if (ret)
+                               continue;
+
+                       if (!verify(header)) {
+                               pr_debug("no valid uImage found in \"%s\" at 
offset %llx\n",
+                                        master->name, (unsigned long long) 
offset);
+                               continue;
+                       }
+
+                       uimage_size = sizeof(*header) + 
be32_to_cpu(header->ih_size);
+                       if ((offset + uimage_size) > master->size) {
+                               pr_debug("uImage exceeds MTD device \"%s\"\n",
+                                        master->name);
+                               continue;
+                       }
+                       break;
+               }
+       }
+
        if (uimage_size == 0) {
                pr_debug("no uImage found in \"%s\"\n", master->name);
                ret = -ENODEV;
@@ -129,7 +154,7 @@
 
        uimage_offset = offset;
 
-       if (uimage_offset == 0) {
+       if (uimage_offset == 0 || uimage_offset == 20) {
                uimage_part = 0;
                rf_part = 1;
 
@@ -271,10 +296,45 @@
        .type = MTD_PARSER_TYPE_FIRMWARE,
 };
 
+#define FW_MAGIC_EDIMAX                0x43535953
+
+static bool uimage_verify_edimax(struct uimage_header *header)
+{
+       switch be32_to_cpu(header->ih_magic) {
+       case FW_MAGIC_EDIMAX:
+               break;
+       default:
+               return false;
+       }
+
+       if (header->ih_os != IH_OS_LINUX ||
+           header->ih_type != IH_TYPE_FILESYSTEM)
+               return false;
+
+       return true;
+}
+
+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_verify_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,
+};
+
 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;
 }
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to