Rebased from upstream / out of band repository.
[librecmc/librecmc.git] / target / linux / generic / files / drivers / mtd / mtdsplit / mtdsplit_tplink.c
index d0cb381363da611c12a7481653b72631b2df3744..a6ae1440db310f9b65e6d56ed0e5600a83ee8da2 100644 (file)
@@ -83,8 +83,8 @@ struct tplink_fw_header {
 };
 
 static int mtdsplit_parse_tplink(struct mtd_info *master,
-                               struct mtd_partition **pparts,
-                               struct mtd_part_parser_data *data)
+                                const struct mtd_partition **pparts,
+                                struct mtd_part_parser_data *data)
 {
        struct tplink_fw_header hdr;
        size_t hdr_len, retlen, kernel_size;
@@ -106,6 +106,7 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
                        return -EINVAL;
 
                kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v1.kernel_len);
+               rootfs_offset = be32_to_cpu(hdr.v1.rootfs_ofs);
                break;
        case 2:
        case 3:
@@ -113,6 +114,7 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
                        return -EINVAL;
 
                kernel_size = sizeof(hdr) + be32_to_cpu(hdr.v2.kernel_len);
+               rootfs_offset = be32_to_cpu(hdr.v2.rootfs_ofs);
                break;
        default:
                return -EINVAL;
@@ -121,11 +123,9 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
        if (kernel_size > master->size)
                return -EINVAL;
 
-       /* Find the rootfs after the kernel. */
-       err = mtd_check_rootfs_magic(master, kernel_size, NULL);
-       if (!err) {
-               rootfs_offset = kernel_size;
-       } else {
+       /* Find the rootfs */
+       err = mtd_check_rootfs_magic(master, rootfs_offset, NULL);
+       if (err) {
                /*
                 * The size in the header might cover the rootfs as well.
                 * Start the search from an arbitrary offset.
@@ -142,7 +142,7 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
 
        parts[0].name = KERNEL_PART_NAME;
        parts[0].offset = 0;
-       parts[0].size = rootfs_offset;
+       parts[0].size = kernel_size;
 
        parts[1].name = ROOTFS_PART_NAME;
        parts[1].offset = rootfs_offset;
@@ -152,9 +152,15 @@ static int mtdsplit_parse_tplink(struct mtd_info *master,
        return TPLINK_NR_PARTS;
 }
 
+static const struct of_device_id mtdsplit_tplink_of_match_table[] = {
+       { .compatible = "tplink,firmware" },
+       {},
+};
+
 static struct mtd_part_parser mtdsplit_tplink_parser = {
        .owner = THIS_MODULE,
        .name = "tplink-fw",
+       .of_match_table = mtdsplit_tplink_of_match_table,
        .parse_fn = mtdsplit_parse_tplink,
        .type = MTD_PARSER_TYPE_FIRMWARE,
 };