diff options
Diffstat (limited to 'target/linux/generic')
5 files changed, 192 insertions, 0 deletions
diff --git a/target/linux/generic/config-3.10 b/target/linux/generic/config-3.10 index 46ac8c0..9e1b100 100644 --- a/target/linux/generic/config-3.10 +++ b/target/linux/generic/config-3.10 @@ -1932,6 +1932,7 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 CONFIG_MTD_ROOTFS_ROOT_DEV=y CONFIG_MTD_ROOTFS_SPLIT=y # CONFIG_MTD_SLRAM is not set +CONFIG_MTD_SPLIT=y # CONFIG_MTD_SPLIT_FIRMWARE is not set CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware" # CONFIG_MTD_SST25L is not set diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit.c b/target/linux/generic/files/drivers/mtd/mtdsplit.c new file mode 100644 index 0000000..0ba35fe --- /dev/null +++ b/target/linux/generic/files/drivers/mtd/mtdsplit.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2009-2013 Felix Fietkau <nbd@openwrt.org> + * Copyright (C) 2009-2013 Gabor Juhos <juhosg@openwrt.org> + * Copyright (C) 2012 Jonas Gorski <jogo@openwrt.org> + * Copyright (C) 2013 Hauke Mehrtens <hauke@hauke-m.de> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#define pr_fmt(fmt) "mtdsplit: " fmt + +#include <linux/export.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/magic.h> +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> +#include <linux/byteorder/generic.h> + +#include "mtdsplit.h" + +struct squashfs_super_block { + __le32 s_magic; + __le32 pad0[9]; + __le64 bytes_used; +}; + +int mtd_get_squashfs_len(struct mtd_info *master, + size_t offset, + size_t *squashfs_len) +{ + struct squashfs_super_block sb; + size_t retlen; + int err; + + err = mtd_read(master, offset, sizeof(sb), &retlen, (void *)&sb); + if (err || (retlen != sizeof(sb))) { + pr_alert("error occured while reading from \"%s\"\n", + master->name); + return -EIO; + } + + if (le32_to_cpu(sb.s_magic) != SQUASHFS_MAGIC) { + pr_alert("no squashfs found in \"%s\"\n", master->name); + return -EINVAL; + } + + retlen = le64_to_cpu(sb.bytes_used); + if (retlen <= 0) { + pr_alert("squashfs is empty in \"%s\"\n", master->name); + return -ENODEV; + } + + if (offset + retlen > master->size) { + pr_alert("squashfs has invalid size in \"%s\"\n", + master->name); + return -EINVAL; + } + + *squashfs_len = retlen; + return 0; +} +EXPORT_SYMBOL_GPL(mtd_get_squashfs_len); diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit.h b/target/linux/generic/files/drivers/mtd/mtdsplit.h new file mode 100644 index 0000000..8ba6c8b --- /dev/null +++ b/target/linux/generic/files/drivers/mtd/mtdsplit.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2009-2013 Felix Fietkau <nbd@openwrt.org> + * Copyright (C) 2009-2013 Gabor Juhos <juhosg@openwrt.org> + * Copyright (C) 2012 Jonas Gorski <jogo@openwrt.org> + * Copyright (C) 2013 Hauke Mehrtens <hauke@hauke-m.de> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#ifndef _MTDSPLIT_H +#define _MTDSPLIT_H + +#define ROOTFS_SPLIT_NAME "rootfs_data" + +#ifdef CONFIG_MTD_SPLIT +int mtd_get_squashfs_len(struct mtd_info *master, + size_t offset, + size_t *squashfs_len); +#else +static inline int mtd_get_squashfs_len(struct mtd_info *master, + size_t offset, + size_t *squashfs_len) +{ + return -ENODEV; +} +#endif + +#endif /* _MTDSPLIT_H */ diff --git a/target/linux/generic/patches-3.10/403-mtd-hook-mtdsplit-to-Kbuild.patch b/target/linux/generic/patches-3.10/403-mtd-hook-mtdsplit-to-Kbuild.patch new file mode 100644 index 0000000..c24f34c --- /dev/null +++ b/target/linux/generic/patches-3.10/403-mtd-hook-mtdsplit-to-Kbuild.patch @@ -0,0 +1,25 @@ +--- a/drivers/mtd/Kconfig ++++ b/drivers/mtd/Kconfig +@@ -36,6 +36,11 @@ config MTD_UIMAGE_SPLIT + depends on MTD_SPLIT_FIRMWARE + default y + ++config MTD_SPLIT ++ def_bool n ++ help ++ Generic MTD split support. ++ + endmenu + + config MTD_TESTS +--- a/drivers/mtd/Makefile ++++ b/drivers/mtd/Makefile +@@ -6,6 +6,8 @@ + obj-$(CONFIG_MTD) += mtd.o + mtd-y := mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o mtdchar.o + ++mtd-$(CONFIG_MTD_SPLIT) += mtdsplit.o ++ + obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o + obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o + obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o diff --git a/target/linux/generic/patches-3.10/404-mtd-use-mtd_get_squashfs_len-in-split_squasfh.patch b/target/linux/generic/patches-3.10/404-mtd-use-mtd_get_squashfs_len-in-split_squasfh.patch new file mode 100644 index 0000000..43960b3 --- /dev/null +++ b/target/linux/generic/patches-3.10/404-mtd-use-mtd_get_squashfs_len-in-split_squasfh.patch @@ -0,0 +1,69 @@ +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -34,6 +34,7 @@ + #include <linux/err.h> + + #include "mtdcore.h" ++#include "mtdsplit.h" + + /* Our partition linked list */ + static LIST_HEAD(mtd_partitions); +@@ -669,43 +670,16 @@ mtd_pad_erasesize(struct mtd_info *mtd, + return len; + } + +-#define ROOTFS_SPLIT_NAME "rootfs_data" +- +-struct squashfs_super_block { +- __le32 s_magic; +- __le32 pad0[9]; +- __le64 bytes_used; +-}; +- +- + static int split_squashfs(struct mtd_info *master, int offset, int *split_offset) + { +- struct squashfs_super_block sb; ++ size_t squashfs_len; + int len, ret; + +- ret = mtd_read(master, offset, sizeof(sb), &len, (void *) &sb); +- if (ret || (len != sizeof(sb))) { +- printk(KERN_ALERT "split_squashfs: error occured while reading " +- "from \"%s\"\n", master->name); +- return -EINVAL; +- } +- +- if (SQUASHFS_MAGIC != le32_to_cpu(sb.s_magic) ) { +- printk(KERN_ALERT "split_squashfs: no squashfs found in \"%s\"\n", +- master->name); +- *split_offset = 0; +- return 0; +- } +- +- if (le64_to_cpu((sb.bytes_used)) <= 0) { +- printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n", +- master->name); +- *split_offset = 0; +- return 0; +- } ++ ret = mtd_get_squashfs_len(master, offset, &squashfs_len); ++ if (ret) ++ return ret; + +- len = (u32) le64_to_cpu(sb.bytes_used); +- len = mtd_pad_erasesize(master, offset, len); ++ len = mtd_pad_erasesize(master, offset, squashfs_len); + *split_offset = offset + len; + + return 0; +--- a/drivers/mtd/Kconfig ++++ b/drivers/mtd/Kconfig +@@ -20,6 +20,7 @@ config MTD_ROOTFS_ROOT_DEV + + config MTD_ROOTFS_SPLIT + bool "Automatically split 'rootfs' partition for squashfs" ++ select MTD_SPLIT + default y + + config MTD_SPLIT_FIRMWARE |