|
@@ -18,10 +18,12 @@
|
|
|
|
|
|
#define TPLINK_NUM_PARTS 5
|
|
|
#define TPLINK_HEADER_V1 0x01000000
|
|
|
+#define TPLINK_HEADER_V2 0x02000000
|
|
|
#define MD5SUM_LEN 16
|
|
|
|
|
|
#define TPLINK_ART_LEN 0x10000
|
|
|
#define TPLINK_KERNEL_OFFS 0x20000
|
|
|
+#define TPLINK_64K_KERNEL_OFFS 0x10000
|
|
|
|
|
|
struct tplink_fw_header {
|
|
|
uint32_t version; /* header version */
|
|
@@ -70,7 +72,7 @@ tplink_read_header(struct mtd_info *mtd, size_t offset)
|
|
|
|
|
|
/* sanity checks */
|
|
|
t = be32_to_cpu(header->version);
|
|
|
- if (t != TPLINK_HEADER_V1)
|
|
|
+ if ((t != TPLINK_HEADER_V1) && (t != TPLINK_HEADER_V2))
|
|
|
goto err_free_header;
|
|
|
|
|
|
t = be32_to_cpu(header->kernel_ofs);
|
|
@@ -106,14 +108,14 @@ static int tplink_check_rootfs_magic(struct mtd_info *mtd, size_t offset)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int tplink_parse_partitions(struct mtd_info *master,
|
|
|
+static int tplink_parse_partitions_offset(struct mtd_info *master,
|
|
|
struct mtd_partition **pparts,
|
|
|
- struct mtd_part_parser_data *data)
|
|
|
+ struct mtd_part_parser_data *data,
|
|
|
+ size_t offset)
|
|
|
{
|
|
|
struct mtd_partition *parts;
|
|
|
struct tplink_fw_header *header;
|
|
|
int nr_parts;
|
|
|
- size_t offset;
|
|
|
size_t art_offset;
|
|
|
size_t rootfs_offset;
|
|
|
size_t squashfs_offset;
|
|
@@ -126,8 +128,6 @@ static int tplink_parse_partitions(struct mtd_info *master,
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- offset = TPLINK_KERNEL_OFFS;
|
|
|
-
|
|
|
header = tplink_read_header(master, offset);
|
|
|
if (!header) {
|
|
|
pr_notice("%s: no TP-Link header found\n", master->name);
|
|
@@ -180,15 +180,38 @@ err:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int tplink_parse_partitions(struct mtd_info *master,
|
|
|
+ struct mtd_partition **pparts,
|
|
|
+ struct mtd_part_parser_data *data)
|
|
|
+{
|
|
|
+ return tplink_parse_partitions_offset(master, pparts, data,
|
|
|
+ TPLINK_KERNEL_OFFS);
|
|
|
+}
|
|
|
+
|
|
|
+static int tplink_parse_64k_partitions(struct mtd_info *master,
|
|
|
+ struct mtd_partition **pparts,
|
|
|
+ struct mtd_part_parser_data *data)
|
|
|
+{
|
|
|
+ return tplink_parse_partitions_offset(master, pparts, data,
|
|
|
+ TPLINK_64K_KERNEL_OFFS);
|
|
|
+}
|
|
|
+
|
|
|
static struct mtd_part_parser tplink_parser = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.parse_fn = tplink_parse_partitions,
|
|
|
.name = "tp-link",
|
|
|
};
|
|
|
|
|
|
+static struct mtd_part_parser tplink_64k_parser = {
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .parse_fn = tplink_parse_64k_partitions,
|
|
|
+ .name = "tp-link-64k",
|
|
|
+};
|
|
|
+
|
|
|
static int __init tplink_parser_init(void)
|
|
|
{
|
|
|
register_mtd_parser(&tplink_parser);
|
|
|
+ register_mtd_parser(&tplink_64k_parser);
|
|
|
|
|
|
return 0;
|
|
|
}
|