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 ede59104b3cca8f8a791ed848d01fc0db7e5a5e8..5ffacaf6424ad3ffd1b62ef44f2a2127f33c2dac 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 d996b60eb5f655d37bf2176b3d6761fd3585fdce..cf3502411996054dae4f25ab7832af98978ffb4f 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 242d9576674c8bde01694fbb36d3c267bbfaa4db..6eef4cb093c56d3a2edbd026e90cf91e993a7a51 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 a70f81828cac69f00af4c97530f58713ad944c3f..d897034abd37f82a05c773e81bd8706a4ba85b8d 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 30292e9316bd415dbe02937c726032262353163e..f3f957b33f59fd80311ea9fafc490b8f1891e5ca 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 f022405be4b1a6c7659fe1a7f0f212f27a848664..008714bd157c4a6e2cd56164f70b1fc9b0cdf78f 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 0000000000000000000000000000000000000000..9d8d975dde4cf94e6ad516002856ba0104759e94
--- /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 6ec19b119b1262cebb8094209a1a5d3552ec04f6..597adf5445506bbe7faaa3a3dc40d44af703b7c1 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 4102453998a82088566053602a20268723776b26..2ddcbff011c2a1aeccdc0f3cd1e115a09baca595 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 0c335683ca3dfab06f9c7207c5beb4238fd99703..4d994221c52da6692695b6970dddc7f8a6a4b914 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 a70f81828cac69f00af4c97530f58713ad944c3f..d897034abd37f82a05c773e81bd8706a4ba85b8d 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 b59166c489bc5e5ea95a31b7de0400c4700c7e2b..d7c38011ec7f09950c6a80b006c93834063ce5e7 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 f022405be4b1a6c7659fe1a7f0f212f27a848664..008714bd157c4a6e2cd56164f70b1fc9b0cdf78f 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 0000000000000000000000000000000000000000..b63690a1d4ed166df3b3888a863b9c5717dcbef9
--- /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,