diff --git a/target/linux/adm5120/files/arch/mips/adm5120/Makefile b/target/linux/adm5120/files/arch/mips/adm5120/Makefile index 583d1d12c..2a5f391f2 100644 --- a/target/linux/adm5120/files/arch/mips/adm5120/Makefile +++ b/target/linux/adm5120/files/arch/mips/adm5120/Makefile @@ -9,5 +9,3 @@ obj-y += gpio.o obj-y += platform.o obj-y += reset.o obj-y += time.o - -obj-y += trxsplit.o diff --git a/target/linux/adm5120/files/arch/mips/adm5120/trxsplit.c b/target/linux/adm5120/files/drivers/mtd/trxsplit.c similarity index 79% rename from target/linux/adm5120/files/arch/mips/adm5120/trxsplit.c rename to target/linux/adm5120/files/drivers/mtd/trxsplit.c index 941f30695..ad0e25a11 100644 --- a/target/linux/adm5120/files/arch/mips/adm5120/trxsplit.c +++ b/target/linux/adm5120/files/drivers/mtd/trxsplit.c @@ -59,7 +59,9 @@ static int trx_nr_parts = 0; static struct mtd_partition trx_parts[TRX_MAX_OFFSET]; static struct trx_header trx_hdr; -static int __init trxsplit_checktrx(struct mtd_info *mtd, unsigned long offset) +static int trxsplit_refresh_partitions(struct mtd_info *mtd); + +static int trxsplit_checktrx(struct mtd_info *mtd, unsigned long offset) { size_t retlen; int err; @@ -98,18 +100,40 @@ err_out: return -1; } -static int __init trxsplit_create_partitions(void) +static void trxsplit_findtrx(struct mtd_info *mtd) +{ + unsigned long offset; + unsigned long blocklen; + int err; + + blocklen = mtd->erasesize; + if (blocklen < BLOCK_LEN_MIN) + blocklen = BLOCK_LEN_MIN; + + printk(KERN_INFO PFX "searching TRX header in '%s'\n", mtd->name); + + err = 0; + for (offset=0; offset < mtd->size; offset+=blocklen) { + err = trxsplit_checktrx(mtd, offset); + if (err == 0) + break; + } + + if (err) + return; + + printk(KERN_INFO PFX "TRX header found at 0x%lX\n", offset); + + trx_mtd = mtd; + trx_offset = offset; +} + +static void trxsplit_create_partitions(struct mtd_info *mtd) { struct mtd_partition *part = trx_parts; - int ret = 0; + int err; int i; - if (trx_mtd == NULL) - goto out; - - printk(KERN_INFO PFX "creating TRX partitions in '%s' (%d,%d)\n", - trx_mtd->name, MTD_BLOCK_MAJOR, trx_mtd->index); - for (i=0; isize - trx_parts[i].offset; + trx_parts[i].size = mtd->size - trx_parts[i].offset; i=0; part = &trx_parts[i]; @@ -137,46 +161,38 @@ static int __init trxsplit_create_partitions(void) part = &trx_parts[i]; part->name = "rootfs"; - ret = add_mtd_partitions(trx_mtd, trx_parts, trx_nr_parts); - if (ret) { - printk(KERN_ALERT PFX "creating TRX partitions failed\n"); + err = add_mtd_partitions(mtd, trx_parts, trx_nr_parts); + if (err) { + printk(KERN_ALERT PFX "adding TRX partitions failed\n"); + return; } -out: - return ret; + mtd->refresh_device = trxsplit_refresh_partitions; +} + +static int trxsplit_refresh_partitions(struct mtd_info *mtd) +{ + printk(KERN_INFO PFX "refreshing TRX partitions in '%s' (%d,%d)\n", + mtd->name, MTD_BLOCK_MAJOR, mtd->index); + + /* remove old partitions */ + del_mtd_partitions(mtd); + + trxsplit_findtrx(mtd); + if (!trx_mtd) + goto err; + + trxsplit_create_partitions(trx_mtd); + return 1; + +err: + return 0; } static void __init trxsplit_add_mtd(struct mtd_info *mtd) { - unsigned long offset; - unsigned long blocklen; - int err; - - if (trx_mtd) - return; - - blocklen = mtd->erasesize; - if (blocklen < BLOCK_LEN_MIN) - blocklen = BLOCK_LEN_MIN; - - printk(KERN_INFO PFX "searching TRX header in '%s'\n", mtd->name); - - err = 0; - for (offset=0; offset < mtd->size; offset+=blocklen) { - err = trxsplit_checktrx(mtd, offset); - if (err == 0) - break; - } - - if (err) { - printk(KERN_ALERT PFX "no TRX header found\n"); - return; - } - - printk(KERN_INFO PFX "TRX header found at 0x%lX\n", offset); - - trx_mtd = mtd; - trx_offset = offset; + if (!trx_mtd) + trxsplit_findtrx(mtd); } static void __init trxsplit_remove_mtd(struct mtd_info *mtd) @@ -189,7 +205,7 @@ static struct mtd_notifier trxsplit_notifier __initdata = { .remove = trxsplit_remove_mtd, }; -static void __init trxsplit_find_trx(void) +static void __init trxsplit_scan(void) { register_mtd_user(&trxsplit_notifier); unregister_mtd_user(&trxsplit_notifier); @@ -197,12 +213,15 @@ static void __init trxsplit_find_trx(void) static int __init trxsplit_init(void) { - int ret; + trxsplit_scan(); - trxsplit_find_trx(); + if (trx_mtd) { + printk(KERN_INFO PFX "creating TRX partitions in '%s' (%d,%d)\n", + trx_mtd->name, MTD_BLOCK_MAJOR, trx_mtd->index); + trxsplit_create_partitions(trx_mtd); + } - ret = trxsplit_create_partitions(); - return ret; + return 0; } late_initcall(trxsplit_init); diff --git a/target/linux/adm5120/patches-2.6.22/103-mtd_trxsplit.patch b/target/linux/adm5120/patches-2.6.22/103-mtd_trxsplit.patch new file mode 100644 index 000000000..c623bc42e --- /dev/null +++ b/target/linux/adm5120/patches-2.6.22/103-mtd_trxsplit.patch @@ -0,0 +1,28 @@ +Index: linux-2.6.22.4/drivers/mtd/Kconfig +=================================================================== +--- linux-2.6.22.4.orig/drivers/mtd/Kconfig ++++ linux-2.6.22.4/drivers/mtd/Kconfig +@@ -57,6 +57,11 @@ config MTD_ROOTFS_SPLIT + depends on MTD_PARTITIONS + default y + ++config MTD_TRXSPLIT ++ bool "Automatically find and split TRX partitions" ++ depends on MTD_PARTITIONS ++ default n ++ + config MTD_REDBOOT_PARTS + tristate "RedBoot partition table parsing" + depends on MTD_PARTITIONS +Index: linux-2.6.22.4/drivers/mtd/Makefile +=================================================================== +--- linux-2.6.22.4.orig/drivers/mtd/Makefile ++++ linux-2.6.22.4/drivers/mtd/Makefile +@@ -8,6 +8,7 @@ mtd-$(CONFIG_MTD_PARTITIONS) += mtdpart. + obj-$(CONFIG_MTD) += $(mtd-y) + + obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o ++obj-$(CONFIG_MTD_TRXSPLIT) += trxsplit.o + obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o + obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o + obj-$(CONFIG_MTD_AFS_PARTS) += afs.o diff --git a/target/linux/adm5120/router_be/config-2.6.22 b/target/linux/adm5120/router_be/config-2.6.22 index 85aad4ea7..43476e232 100644 --- a/target/linux/adm5120/router_be/config-2.6.22 +++ b/target/linux/adm5120/router_be/config-2.6.22 @@ -164,6 +164,7 @@ CONFIG_MTD_PARTITIONS=y # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_SLRAM is not set +CONFIG_MTD_TRXSPLIT=y CONFIG_NETDEV_1000=y CONFIG_NET_KEY=y # CONFIG_NET_PCI is not set diff --git a/target/linux/adm5120/router_le/config-2.6.22 b/target/linux/adm5120/router_le/config-2.6.22 index c67e1404c..a331c2a13 100644 --- a/target/linux/adm5120/router_le/config-2.6.22 +++ b/target/linux/adm5120/router_le/config-2.6.22 @@ -123,7 +123,7 @@ CONFIG_MTD=y CONFIG_MTD_ADM5120=y CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y -CONFIG_MTD_BLOCK2MTD=y +# CONFIG_MTD_BLOCK2MTD is not set CONFIG_MTD_CFI=y # CONFIG_MTD_CFI_ADV_OPTIONS is not set CONFIG_MTD_CFI_AMDSTD=y @@ -174,6 +174,7 @@ CONFIG_MTD_PARTITIONS=y # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_ROM is not set # CONFIG_MTD_SLRAM is not set +CONFIG_MTD_TRXSPLIT=y # CONFIG_NETDEV_1000 is not set CONFIG_NET_KEY=y # CONFIG_NET_PCI is not set