kernel: mtdsplit_uimage: replace "netgear, uimage" parser
The "netgear,uimage" parser can be replaced by the generic parser using device specific openwrt,ih-magic and openwrt,ih-type properties. Device tree properties for the following devices have not been set, as they have been dropped from OpenWrt with the removal of the ar71xx target: FW_MAGIC_WNR2000V1 0x32303031 FW_MAGIC_WNR2000V4 0x32303034 FW_MAGIC_WNR1000V2_VC 0x31303030 FW_MAGIC_WPN824N 0x31313030 Tested-by: Sander Vanheule <sander@svanheule.net> # WNDR3700v2 Tested-by: Stijn Segers <foss@volatilesystems.org> # WNDR3700v1 Signed-off-by: Bjørn Mork <bjorn@mork.no>
This commit is contained in:
		@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <dt-bindings/gpio/gpio.h>
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/mtd/partitions/uimage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	aliases {
 | 
						aliases {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,9 @@
 | 
				
			|||||||
	partition@70000 {
 | 
						partition@70000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x070000 0xf80000>;
 | 
							reg = <0x070000 0xf80000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x33373031>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@ff0000 {
 | 
						art: partition@ff0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,9 @@
 | 
				
			|||||||
	partition@70000 {
 | 
						partition@70000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x070000 0x780000>;
 | 
							reg = <0x070000 0x780000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x33373030>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@7f0000 {
 | 
						art: partition@7f0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,9 @@
 | 
				
			|||||||
	partition@70000 {
 | 
						partition@70000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x070000 0xf80000>;
 | 
							reg = <0x070000 0xf80000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x33373031>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@ff0000 {
 | 
						art: partition@ff0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,9 @@
 | 
				
			|||||||
	partition@70000 {
 | 
						partition@70000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x070000 0xf80000>;
 | 
							reg = <0x070000 0xf80000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x33373031>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@ff0000 {
 | 
						art: partition@ff0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,9 @@
 | 
				
			|||||||
	partition@70000 {
 | 
						partition@70000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x070000 0xf80000>;
 | 
							reg = <0x070000 0xf80000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x33373031>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@ff0000 {
 | 
						art: partition@ff0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,9 @@
 | 
				
			|||||||
	partition@70000 {
 | 
						partition@70000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x070000 0xf80000>;
 | 
							reg = <0x070000 0xf80000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x33373031>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@ff0000 {
 | 
						art: partition@ff0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <dt-bindings/gpio/gpio.h>
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/mtd/partitions/uimage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	compatible = "netgear,wnr1000-v2", "qca,ar7240";
 | 
						compatible = "netgear,wnr1000-v2", "qca,ar7240";
 | 
				
			||||||
@@ -158,7 +159,9 @@
 | 
				
			|||||||
			partition@50000 {
 | 
								partition@50000 {
 | 
				
			||||||
				label = "firmware";
 | 
									label = "firmware";
 | 
				
			||||||
				reg = <0x50000 0x3a0000>;
 | 
									reg = <0x50000 0x3a0000>;
 | 
				
			||||||
				compatible = "netgear,uimage";
 | 
									compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
									openwrt,ih-magic = <0x31303031>;
 | 
				
			||||||
 | 
									openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			art: partition@3f0000 {
 | 
								art: partition@3f0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <dt-bindings/gpio/gpio.h>
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/mtd/partitions/uimage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	aliases {
 | 
						aliases {
 | 
				
			||||||
@@ -89,7 +90,9 @@
 | 
				
			|||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			partition@50000 {
 | 
								partition@50000 {
 | 
				
			||||||
				compatible = "netgear,uimage";
 | 
									compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
									openwrt,ih-magic = <0x32303631>;
 | 
				
			||||||
 | 
									openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
				reg = <0x50000 0x3a0000>;
 | 
									reg = <0x50000 0x3a0000>;
 | 
				
			||||||
				label = "firmware";
 | 
									label = "firmware";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <dt-bindings/gpio/gpio.h>
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/mtd/partitions/uimage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	compatible = "netgear,wnr2000-v3", "qca,ar7241";
 | 
						compatible = "netgear,wnr2000-v3", "qca,ar7241";
 | 
				
			||||||
@@ -161,7 +162,9 @@
 | 
				
			|||||||
			partition@50000 {
 | 
								partition@50000 {
 | 
				
			||||||
				label = "firmware";
 | 
									label = "firmware";
 | 
				
			||||||
				reg = <0x50000 0x3a0000>;
 | 
									reg = <0x50000 0x3a0000>;
 | 
				
			||||||
				compatible = "netgear,uimage";
 | 
									compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
									openwrt,ih-magic = <0x32303033>;
 | 
				
			||||||
 | 
									openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			art: partition@3f0000 {
 | 
								art: partition@3f0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,9 @@
 | 
				
			|||||||
	partition@50000 {
 | 
						partition@50000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x50000 0xfa0000>;
 | 
							reg = <0x50000 0xfa0000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x32323030>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@ff0000 {
 | 
						art: partition@ff0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,9 @@
 | 
				
			|||||||
	partition@50000 {
 | 
						partition@50000 {
 | 
				
			||||||
		label = "firmware";
 | 
							label = "firmware";
 | 
				
			||||||
		reg = <0x50000 0x7a0000>;
 | 
							reg = <0x50000 0x7a0000>;
 | 
				
			||||||
		compatible = "netgear,uimage";
 | 
							compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
							openwrt,ih-magic = <0x32323030>;
 | 
				
			||||||
 | 
							openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	art: partition@7f0000 {
 | 
						art: partition@7f0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <dt-bindings/gpio/gpio.h>
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/mtd/partitions/uimage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	chosen {
 | 
						chosen {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <dt-bindings/gpio/gpio.h>
 | 
					#include <dt-bindings/gpio/gpio.h>
 | 
				
			||||||
#include <dt-bindings/input/input.h>
 | 
					#include <dt-bindings/input/input.h>
 | 
				
			||||||
 | 
					#include <dt-bindings/mtd/partitions/uimage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	chosen {
 | 
						chosen {
 | 
				
			||||||
@@ -161,7 +162,9 @@
 | 
				
			|||||||
		partition@6c0000 {
 | 
							partition@6c0000 {
 | 
				
			||||||
			label = "firmware";
 | 
								label = "firmware";
 | 
				
			||||||
			reg = <0x6c0000 0x1900000>;
 | 
								reg = <0x6c0000 0x1900000>;
 | 
				
			||||||
			compatible = "netgear,uimage";
 | 
								compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
								openwrt,ih-magic = <0x33373033>;
 | 
				
			||||||
 | 
								openwrt,ih-type = <IH_TYPE_FILESYSTEM>;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		partition@1fc0000 {
 | 
							partition@1fc0000 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -271,72 +271,6 @@ static struct mtd_part_parser uimage_generic_parser = {
 | 
				
			|||||||
	.type = MTD_PARSER_TYPE_FIRMWARE,
 | 
						.type = MTD_PARSER_TYPE_FIRMWARE,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FW_MAGIC_GS110TPPV1	0x4e474520
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR2000V1	0x32303031
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR2000V3	0x32303033
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR2000V4	0x32303034
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR2200	0x32323030
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR612V2	0x32303631
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR1000V2	0x31303031
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNR1000V2_VC	0x31303030
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNDR3700	0x33373030
 | 
					 | 
				
			||||||
#define FW_MAGIC_WNDR3700V2	0x33373031
 | 
					 | 
				
			||||||
#define FW_MAGIC_WPN824N	0x31313030
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static ssize_t uimage_verify_wndr3700(u_char *buf, size_t len, u32 ih_magic, u32 ih_type)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct uimage_header *header = (struct uimage_header *)buf;
 | 
					 | 
				
			||||||
	uint8_t expected_type = IH_TYPE_FILESYSTEM;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch (be32_to_cpu(header->ih_magic)) {
 | 
					 | 
				
			||||||
	case FW_MAGIC_GS110TPPV1:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR2000V4:
 | 
					 | 
				
			||||||
		expected_type = IH_TYPE_KERNEL;
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR612V2:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR1000V2:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR1000V2_VC:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR2000V1:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR2000V3:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNR2200:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNDR3700:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WNDR3700V2:
 | 
					 | 
				
			||||||
	case FW_MAGIC_WPN824N:
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (header->ih_os != IH_OS_LINUX ||
 | 
					 | 
				
			||||||
	    header->ih_type != expected_type)
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int
 | 
					 | 
				
			||||||
mtdsplit_uimage_parse_netgear(struct mtd_info *master,
 | 
					 | 
				
			||||||
			      const struct mtd_partition **pparts,
 | 
					 | 
				
			||||||
			      struct mtd_part_parser_data *data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return __mtdsplit_parse_uimage(master, pparts, data,
 | 
					 | 
				
			||||||
				      uimage_verify_wndr3700);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct of_device_id mtdsplit_uimage_netgear_of_match_table[] = {
 | 
					 | 
				
			||||||
	{ .compatible = "netgear,uimage" },
 | 
					 | 
				
			||||||
	{},
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static struct mtd_part_parser uimage_netgear_parser = {
 | 
					 | 
				
			||||||
	.owner = THIS_MODULE,
 | 
					 | 
				
			||||||
	.name = "netgear-fw",
 | 
					 | 
				
			||||||
	.of_match_table = mtdsplit_uimage_netgear_of_match_table,
 | 
					 | 
				
			||||||
	.parse_fn = mtdsplit_uimage_parse_netgear,
 | 
					 | 
				
			||||||
	.type = MTD_PARSER_TYPE_FIRMWARE,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**************************************************
 | 
					/**************************************************
 | 
				
			||||||
 * Edimax
 | 
					 * Edimax
 | 
				
			||||||
 **************************************************/
 | 
					 **************************************************/
 | 
				
			||||||
@@ -393,7 +327,6 @@ static struct mtd_part_parser uimage_edimax_parser = {
 | 
				
			|||||||
static int __init mtdsplit_uimage_init(void)
 | 
					static int __init mtdsplit_uimage_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	register_mtd_parser(&uimage_generic_parser);
 | 
						register_mtd_parser(&uimage_generic_parser);
 | 
				
			||||||
	register_mtd_parser(&uimage_netgear_parser);
 | 
					 | 
				
			||||||
	register_mtd_parser(&uimage_edimax_parser);
 | 
						register_mtd_parser(&uimage_edimax_parser);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,7 +70,8 @@
 | 
				
			|||||||
			};
 | 
								};
 | 
				
			||||||
			partition@300000{
 | 
								partition@300000{
 | 
				
			||||||
				label = "firmware";
 | 
									label = "firmware";
 | 
				
			||||||
				compatible = "netgear,uimage";
 | 
									compatible = "openwrt,uimage", "denx,uimage";
 | 
				
			||||||
 | 
									openwrt,ih-magic = <0x4e474520>;
 | 
				
			||||||
				reg = <0x0300000 0x1d00000>;
 | 
									reg = <0x0300000 0x1d00000>;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user