kernel: mtdsplit_uimage: add parser for Edimax devices

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


git-svn-id: svn://svn.openwrt.org/openwrt/trunk@44413 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
Rafał Miłecki 2015-02-12 07:23:40 +00:00
parent f43fbf2496
commit 8f970a79ae
1 changed files with 53 additions and 0 deletions

View File

@ -295,10 +295,63 @@ static struct mtd_part_parser uimage_netgear_parser = {
.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)
{
register_mtd_parser(&uimage_generic_parser);
register_mtd_parser(&uimage_netgear_parser);
register_mtd_parser(&uimage_edimax_parser);
return 0;
}