aboutsummaryrefslogtreecommitdiffstats
path: root/target
diff options
context:
space:
mode:
Diffstat (limited to 'target')
-rw-r--r--target/linux/generic/patches-3.14/400-mtd-add-rootfs-split-support.patch50
-rw-r--r--target/linux/generic/patches-3.14/401-mtd-add-support-for-different-partition-parser-types.patch4
-rw-r--r--target/linux/generic/patches-3.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch21
-rw-r--r--target/linux/generic/patches-3.14/403-mtd-hook-mtdsplit-to-Kbuild.patch4
-rw-r--r--target/linux/generic/patches-3.14/405-mtd-add-more-helper-functions.patch20
-rw-r--r--target/linux/generic/patches-3.14/406-mtd-hook-mtdsplit-into-Kbuild.patch4
-rw-r--r--target/linux/generic/patches-3.14/407-mtd-old-firmware-uimage-splitter.patch65
-rw-r--r--target/linux/generic/patches-3.18/400-mtd-add-rootfs-split-support.patch50
-rw-r--r--target/linux/generic/patches-3.18/401-mtd-add-support-for-different-partition-parser-types.patch4
-rw-r--r--target/linux/generic/patches-3.18/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch21
-rw-r--r--target/linux/generic/patches-3.18/403-mtd-hook-mtdsplit-to-Kbuild.patch4
-rw-r--r--target/linux/generic/patches-3.18/405-mtd-add-more-helper-functions.patch20
-rw-r--r--target/linux/generic/patches-3.18/406-mtd-hook-mtdsplit-into-Kbuild.patch4
-rw-r--r--target/linux/generic/patches-3.18/407-mtd-old-firmware-uimage-splitter.patch65
14 files changed, 202 insertions, 134 deletions
diff --git a/target/linux/generic/patches-3.14/400-mtd-add-rootfs-split-support.patch b/target/linux/generic/patches-3.14/400-mtd-add-rootfs-split-support.patch
index ede59104b3..5ffacaf642 100644
--- a/target/linux/generic/patches-3.14/400-mtd-add-rootfs-split-support.patch
+++ b/target/linux/generic/patches-3.14/400-mtd-add-rootfs-split-support.patch
@@ -1,6 +1,6 @@
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -12,6 +12,28 @@ menuconfig MTD
+@@ -12,6 +12,23 @@ menuconfig MTD
if MTD
@@ -19,11 +19,6 @@
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
-+config MTD_UIMAGE_SPLIT
-+ bool "Enable split support for firmware partitions containing a uImage"
-+ depends on MTD_SPLIT_FIRMWARE
-+ default y
-+
+endmenu
+
config MTD_TESTS
@@ -120,47 +115,10 @@
int mtd_del_partition(struct mtd_info *master, int partno)
{
struct mtd_part *slave, *next;
-@@ -614,6 +628,74 @@ int mtd_del_partition(struct mtd_info *m
+@@ -614,6 +628,35 @@ int mtd_del_partition(struct mtd_info *m
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
-+static inline unsigned long
-+mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
-+{
-+ unsigned long mask = mtd->erasesize - 1;
-+
-+ len += offset & mask;
-+ len = (len + mask) & ~mask;
-+ len -= offset & mask;
-+ return len;
-+}
-+
-+#define UBOOT_MAGIC 0x27051956
-+
-+static void split_uimage(struct mtd_info *master, struct mtd_part *part)
-+{
-+ struct {
-+ __be32 magic;
-+ __be32 pad[2];
-+ __be32 size;
-+ } hdr;
-+ size_t len;
-+
-+ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
-+ return;
-+
-+ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
-+ return;
-+
-+ len = be32_to_cpu(hdr.size) + 0x40;
-+ len = mtd_pad_erasesize(master, part->offset, len);
-+ if (len + master->erasesize > part->mtd.size)
-+ return;
-+
-+ __mtd_add_partition(master, "rootfs", part->offset + len,
-+ part->mtd.size - len, false);
-+}
-+
+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#else
@@ -169,8 +127,6 @@
+
+static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+{
-+ if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
-+ split_uimage(master, part);
+}
+
+void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
@@ -195,7 +151,7 @@
/*
* This function, given a master MTD object and a partition table, creates
* and registers slave MTD objects which are bound to the master according to
-@@ -643,6 +725,7 @@ int add_mtd_partitions(struct mtd_info *
+@@ -643,6 +686,7 @@ int add_mtd_partitions(struct mtd_info *
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&slave->mtd);
diff --git a/target/linux/generic/patches-3.14/401-mtd-add-support-for-different-partition-parser-types.patch b/target/linux/generic/patches-3.14/401-mtd-add-support-for-different-partition-parser-types.patch
index d996b60eb5..cf35024119 100644
--- a/target/linux/generic/patches-3.14/401-mtd-add-support-for-different-partition-parser-types.patch
+++ b/target/linux/generic/patches-3.14/401-mtd-add-support-for-different-partition-parser-types.patch
@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -755,6 +755,30 @@ static struct mtd_part_parser *get_parti
+@@ -716,6 +716,30 @@ static struct mtd_part_parser *get_parti
#define put_partition_parser(p) do { module_put((p)->owner); } while (0)
@@ -42,7 +42,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
void register_mtd_parser(struct mtd_part_parser *p)
{
spin_lock(&part_parser_lock);
-@@ -828,6 +852,38 @@ int parse_mtd_partitions(struct mtd_info
+@@ -789,6 +813,38 @@ int parse_mtd_partitions(struct mtd_info
return ret;
}
diff --git a/target/linux/generic/patches-3.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch b/target/linux/generic/patches-3.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
index 242d957667..6eef4cb093 100644
--- a/target/linux/generic/patches-3.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
+++ b/target/linux/generic/patches-3.14/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
@@ -35,23 +35,18 @@
+ return nr_parts;
+}
+
- static inline unsigned long
- mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
- {
-@@ -673,6 +704,12 @@ static void split_uimage(struct mtd_info
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -636,6 +667,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition);
static void split_firmware(struct mtd_info *master, struct mtd_part *part)
{
-+ int ret;
-+
-+ ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
-+ if (ret > 0)
-+ return;
-+
- if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
- split_uimage(master, part);
++ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
}
-@@ -689,6 +726,12 @@ static void mtd_partition_split(struct m
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
+@@ -650,6 +682,12 @@ static void mtd_partition_split(struct m
if (rootfs_found)
return;
diff --git a/target/linux/generic/patches-3.14/403-mtd-hook-mtdsplit-to-Kbuild.patch b/target/linux/generic/patches-3.14/403-mtd-hook-mtdsplit-to-Kbuild.patch
index a70f81828c..d897034abd 100644
--- a/target/linux/generic/patches-3.14/403-mtd-hook-mtdsplit-to-Kbuild.patch
+++ b/target/linux/generic/patches-3.14/403-mtd-hook-mtdsplit-to-Kbuild.patch
@@ -1,8 +1,8 @@
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,11 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+config MTD_SPLIT
+ def_bool n
diff --git a/target/linux/generic/patches-3.14/405-mtd-add-more-helper-functions.patch b/target/linux/generic/patches-3.14/405-mtd-add-more-helper-functions.patch
index 30292e9316..f3f957b33f 100644
--- a/target/linux/generic/patches-3.14/405-mtd-add-more-helper-functions.patch
+++ b/target/linux/generic/patches-3.14/405-mtd-add-more-helper-functions.patch
@@ -18,7 +18,25 @@
}
if (slave->offset == MTDPART_OFS_RETAIN) {
slave->offset = cur_offset;
-@@ -944,6 +942,24 @@ int mtd_is_partition(const struct mtd_in
+@@ -659,6 +657,17 @@ run_parsers_by_type(struct mtd_part *sla
+ return nr_parts;
+ }
+
++static inline unsigned long
++mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
++{
++ unsigned long mask = mtd->erasesize - 1;
++
++ len += offset & mask;
++ len = (len + mask) & ~mask;
++ len -= offset & mask;
++ return len;
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -900,6 +909,24 @@ int mtd_is_partition(const struct mtd_in
}
EXPORT_SYMBOL_GPL(mtd_is_partition);
diff --git a/target/linux/generic/patches-3.14/406-mtd-hook-mtdsplit-into-Kbuild.patch b/target/linux/generic/patches-3.14/406-mtd-hook-mtdsplit-into-Kbuild.patch
index f022405be4..008714bd15 100644
--- a/target/linux/generic/patches-3.14/406-mtd-hook-mtdsplit-into-Kbuild.patch
+++ b/target/linux/generic/patches-3.14/406-mtd-hook-mtdsplit-into-Kbuild.patch
@@ -1,8 +1,8 @@
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,8 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+source "drivers/mtd/mtdsplit/Kconfig"
+
diff --git a/target/linux/generic/patches-3.14/407-mtd-old-firmware-uimage-splitter.patch b/target/linux/generic/patches-3.14/407-mtd-old-firmware-uimage-splitter.patch
new file mode 100644
index 0000000000..9d8d975dde
--- /dev/null
+++ b/target/linux/generic/patches-3.14/407-mtd-old-firmware-uimage-splitter.patch
@@ -0,0 +1,65 @@
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
++config MTD_UIMAGE_SPLIT
++ bool "Enable split support for firmware partitions containing a uImage"
++ depends on MTD_SPLIT_FIRMWARE
++ default y
++
+ source "drivers/mtd/mtdsplit/Kconfig"
+
+ config MTD_SPLIT
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -668,6 +668,32 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+ return len;
+ }
+
++#define UBOOT_MAGIC 0x27051956
++
++static void split_uimage(struct mtd_info *master, struct mtd_part *part)
++{
++ struct {
++ __be32 magic;
++ __be32 pad[2];
++ __be32 size;
++ } hdr;
++ size_t len;
++
++ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
++ return;
++
++ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
++ return;
++
++ len = be32_to_cpu(hdr.size) + 0x40;
++ len = mtd_pad_erasesize(master, part->offset, len);
++ if (len + master->erasesize > part->mtd.size)
++ return;
++
++ __mtd_add_partition(master, "rootfs", part->offset + len,
++ part->mtd.size - len, false);
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -676,7 +702,14 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+
+ static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+ {
+- run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++ int ret;
++
++ ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++ if (ret > 0)
++ return;
++
++ if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
++ split_uimage(master, part);
+ }
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
diff --git a/target/linux/generic/patches-3.18/400-mtd-add-rootfs-split-support.patch b/target/linux/generic/patches-3.18/400-mtd-add-rootfs-split-support.patch
index 6ec19b119b..597adf5445 100644
--- a/target/linux/generic/patches-3.18/400-mtd-add-rootfs-split-support.patch
+++ b/target/linux/generic/patches-3.18/400-mtd-add-rootfs-split-support.patch
@@ -1,6 +1,6 @@
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -12,6 +12,28 @@ menuconfig MTD
+@@ -12,6 +12,23 @@ menuconfig MTD
if MTD
@@ -19,11 +19,6 @@
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
-+config MTD_UIMAGE_SPLIT
-+ bool "Enable split support for firmware partitions containing a uImage"
-+ depends on MTD_SPLIT_FIRMWARE
-+ default y
-+
+endmenu
+
config MTD_TESTS
@@ -120,47 +115,10 @@
int mtd_del_partition(struct mtd_info *master, int partno)
{
struct mtd_part *slave, *next;
-@@ -627,6 +641,74 @@ int mtd_del_partition(struct mtd_info *m
+@@ -627,6 +641,35 @@ int mtd_del_partition(struct mtd_info *m
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
-+static inline unsigned long
-+mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
-+{
-+ unsigned long mask = mtd->erasesize - 1;
-+
-+ len += offset & mask;
-+ len = (len + mask) & ~mask;
-+ len -= offset & mask;
-+ return len;
-+}
-+
-+#define UBOOT_MAGIC 0x27051956
-+
-+static void split_uimage(struct mtd_info *master, struct mtd_part *part)
-+{
-+ struct {
-+ __be32 magic;
-+ __be32 pad[2];
-+ __be32 size;
-+ } hdr;
-+ size_t len;
-+
-+ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
-+ return;
-+
-+ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
-+ return;
-+
-+ len = be32_to_cpu(hdr.size) + 0x40;
-+ len = mtd_pad_erasesize(master, part->offset, len);
-+ if (len + master->erasesize > part->mtd.size)
-+ return;
-+
-+ __mtd_add_partition(master, "rootfs", part->offset + len,
-+ part->mtd.size - len, false);
-+}
-+
+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+#else
@@ -169,8 +127,6 @@
+
+static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+{
-+ if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
-+ split_uimage(master, part);
+}
+
+void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
@@ -195,7 +151,7 @@
/*
* This function, given a master MTD object and a partition table, creates
* and registers slave MTD objects which are bound to the master according to
-@@ -656,6 +738,7 @@ int add_mtd_partitions(struct mtd_info *
+@@ -656,6 +699,7 @@ int add_mtd_partitions(struct mtd_info *
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&slave->mtd);
diff --git a/target/linux/generic/patches-3.18/401-mtd-add-support-for-different-partition-parser-types.patch b/target/linux/generic/patches-3.18/401-mtd-add-support-for-different-partition-parser-types.patch
index 4102453998..2ddcbff011 100644
--- a/target/linux/generic/patches-3.18/401-mtd-add-support-for-different-partition-parser-types.patch
+++ b/target/linux/generic/patches-3.18/401-mtd-add-support-for-different-partition-parser-types.patch
@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -768,6 +768,30 @@ static struct mtd_part_parser *get_parti
+@@ -729,6 +729,30 @@ static struct mtd_part_parser *get_parti
#define put_partition_parser(p) do { module_put((p)->owner); } while (0)
@@ -42,7 +42,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
void register_mtd_parser(struct mtd_part_parser *p)
{
spin_lock(&part_parser_lock);
-@@ -841,6 +865,38 @@ int parse_mtd_partitions(struct mtd_info
+@@ -802,6 +826,38 @@ int parse_mtd_partitions(struct mtd_info
return ret;
}
diff --git a/target/linux/generic/patches-3.18/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch b/target/linux/generic/patches-3.18/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
index 0c335683ca..4d994221c5 100644
--- a/target/linux/generic/patches-3.18/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
+++ b/target/linux/generic/patches-3.18/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
@@ -35,23 +35,18 @@
+ return nr_parts;
+}
+
- static inline unsigned long
- mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
- {
-@@ -686,6 +717,12 @@ static void split_uimage(struct mtd_info
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -649,6 +680,7 @@ EXPORT_SYMBOL_GPL(mtd_del_partition);
static void split_firmware(struct mtd_info *master, struct mtd_part *part)
{
-+ int ret;
-+
-+ ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
-+ if (ret > 0)
-+ return;
-+
- if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
- split_uimage(master, part);
++ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
}
-@@ -702,6 +739,12 @@ static void mtd_partition_split(struct m
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
+@@ -663,6 +695,12 @@ static void mtd_partition_split(struct m
if (rootfs_found)
return;
diff --git a/target/linux/generic/patches-3.18/403-mtd-hook-mtdsplit-to-Kbuild.patch b/target/linux/generic/patches-3.18/403-mtd-hook-mtdsplit-to-Kbuild.patch
index a70f81828c..d897034abd 100644
--- a/target/linux/generic/patches-3.18/403-mtd-hook-mtdsplit-to-Kbuild.patch
+++ b/target/linux/generic/patches-3.18/403-mtd-hook-mtdsplit-to-Kbuild.patch
@@ -1,8 +1,8 @@
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,11 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+config MTD_SPLIT
+ def_bool n
diff --git a/target/linux/generic/patches-3.18/405-mtd-add-more-helper-functions.patch b/target/linux/generic/patches-3.18/405-mtd-add-more-helper-functions.patch
index b59166c489..d7c38011ec 100644
--- a/target/linux/generic/patches-3.18/405-mtd-add-more-helper-functions.patch
+++ b/target/linux/generic/patches-3.18/405-mtd-add-more-helper-functions.patch
@@ -18,7 +18,25 @@
}
if (slave->offset == MTDPART_OFS_RETAIN) {
slave->offset = cur_offset;
-@@ -957,6 +955,24 @@ int mtd_is_partition(const struct mtd_in
+@@ -672,6 +670,17 @@ run_parsers_by_type(struct mtd_part *sla
+ return nr_parts;
+ }
+
++static inline unsigned long
++mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
++{
++ unsigned long mask = mtd->erasesize - 1;
++
++ len += offset & mask;
++ len = (len + mask) & ~mask;
++ len -= offset & mask;
++ return len;
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -913,6 +922,24 @@ int mtd_is_partition(const struct mtd_in
}
EXPORT_SYMBOL_GPL(mtd_is_partition);
diff --git a/target/linux/generic/patches-3.18/406-mtd-hook-mtdsplit-into-Kbuild.patch b/target/linux/generic/patches-3.18/406-mtd-hook-mtdsplit-into-Kbuild.patch
index f022405be4..008714bd15 100644
--- a/target/linux/generic/patches-3.18/406-mtd-hook-mtdsplit-into-Kbuild.patch
+++ b/target/linux/generic/patches-3.18/406-mtd-hook-mtdsplit-into-Kbuild.patch
@@ -1,8 +1,8 @@
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -32,6 +32,8 @@ config MTD_UIMAGE_SPLIT
+@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
- default y
+ default "firmware"
+source "drivers/mtd/mtdsplit/Kconfig"
+
diff --git a/target/linux/generic/patches-3.18/407-mtd-old-firmware-uimage-splitter.patch b/target/linux/generic/patches-3.18/407-mtd-old-firmware-uimage-splitter.patch
new file mode 100644
index 0000000000..b63690a1d4
--- /dev/null
+++ b/target/linux/generic/patches-3.18/407-mtd-old-firmware-uimage-splitter.patch
@@ -0,0 +1,65 @@
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -27,6 +27,11 @@ config MTD_SPLIT_FIRMWARE_NAME
+ depends on MTD_SPLIT_FIRMWARE
+ default "firmware"
+
++config MTD_UIMAGE_SPLIT
++ bool "Enable split support for firmware partitions containing a uImage"
++ depends on MTD_SPLIT_FIRMWARE
++ default y
++
+ source "drivers/mtd/mtdsplit/Kconfig"
+
+ config MTD_SPLIT
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -681,6 +681,32 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+ return len;
+ }
+
++#define UBOOT_MAGIC 0x27051956
++
++static void split_uimage(struct mtd_info *master, struct mtd_part *part)
++{
++ struct {
++ __be32 magic;
++ __be32 pad[2];
++ __be32 size;
++ } hdr;
++ size_t len;
++
++ if (mtd_read(master, part->offset, sizeof(hdr), &len, (void *) &hdr))
++ return;
++
++ if (len != sizeof(hdr) || hdr.magic != cpu_to_be32(UBOOT_MAGIC))
++ return;
++
++ len = be32_to_cpu(hdr.size) + 0x40;
++ len = mtd_pad_erasesize(master, part->offset, len);
++ if (len + master->erasesize > part->mtd.size)
++ return;
++
++ __mtd_add_partition(master, "rootfs", part->offset + len,
++ part->mtd.size - len, false);
++}
++
+ #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
+ #else
+@@ -689,7 +715,14 @@ mtd_pad_erasesize(struct mtd_info *mtd,
+
+ static void split_firmware(struct mtd_info *master, struct mtd_part *part)
+ {
+- run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++ int ret;
++
++ ret = run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++ if (ret > 0)
++ return;
++
++ if (config_enabled(CONFIG_MTD_UIMAGE_SPLIT))
++ split_uimage(master, part);
+ }
+
+ void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,