kernel: mtdsplit_uimage: add parser for Edimax devices

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>

SVN-Revision: 44413
This commit is contained in:
Rafał Miłecki 2015-02-12 07:23:40 +00:00
parent 1aed104c80
commit 5673e0b703

View file

@ -295,10 +295,63 @@ static struct mtd_part_parser uimage_netgear_parser = {
.type = MTD_PARSER_TYPE_FIRMWARE, .type = MTD_PARSER_TYPE_FIRMWARE,
}; };
/**************************************************
* Edimax
**************************************************/
#define FW_EDIMAX_OFFSET 20
#define FW_MAGIC_EDIMAX 0x43535953
static ssize_t uimage_find_edimax(u_char *buf, size_t len)
{
struct uimage_header *header;
if (len < FW_EDIMAX_OFFSET + sizeof(*header)) {
pr_err("Buffer too small for checking Edimax header\n");
return -ENOSPC;
}
header = (struct uimage_header *)(buf + FW_EDIMAX_OFFSET);
switch be32_to_cpu(header->ih_magic) {
case FW_MAGIC_EDIMAX:
break;
default:
return -EINVAL;
}
if (header->ih_os != IH_OS_LINUX ||
header->ih_type != IH_TYPE_FILESYSTEM)
return -EINVAL;
return FW_EDIMAX_OFFSET;
}
static int
mtdsplit_uimage_parse_edimax(struct mtd_info *master,
struct mtd_partition **pparts,
struct mtd_part_parser_data *data)
{
return __mtdsplit_parse_uimage(master, pparts, data,
uimage_find_edimax);
}
static struct mtd_part_parser uimage_edimax_parser = {
.owner = THIS_MODULE,
.name = "edimax-fw",
.parse_fn = mtdsplit_uimage_parse_edimax,
.type = MTD_PARSER_TYPE_FIRMWARE,
};
/**************************************************
* Init
**************************************************/
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_netgear_parser);
register_mtd_parser(&uimage_edimax_parser);
return 0; return 0;
} }