diff options
Diffstat (limited to 'openwrt/target/linux/linux-2.6/patches/brcm')
-rw-r--r-- | openwrt/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch | 206 |
1 files changed, 161 insertions, 45 deletions
diff --git a/openwrt/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch b/openwrt/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch index 3a4f78fc9..225e1c044 100644 --- a/openwrt/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch +++ b/openwrt/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch @@ -13123,14 +13123,45 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/Makefile linux-2.6.12.5-brcm/drivers/m obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/drivers/mtd/maps/bcm47xx-flash.c --- linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-2.6.12.5-brcm/drivers/mtd/maps/bcm47xx-flash.c 2005-08-28 17:01:50.948899632 +0200 -@@ -0,0 +1,131 @@ ++++ linux-2.6.12.5-brcm/drivers/mtd/maps/bcm47xx-flash.c 2005-09-03 18:50:05.090478752 +0200 +@@ -0,0 +1,247 @@ +/* -+ * Flash mapping for BCM947XX boards ++ * Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org) ++ * Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org> + * -+ * Copyright (C) 2001 Broadcom Corporation ++ * original functions for finding root filesystem from Mike Baker + * -+ * $Id: bcm47xx-flash.c,v 1.1 2004/10/21 07:18:31 jolt Exp $ ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN ++ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ++ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ++ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ * Copyright 2001-2003, Broadcom Corporation ++ * All Rights Reserved. ++ * ++ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY ++ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM ++ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS ++ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. ++ * ++ * $Id: bcm47xx-flash.c,v 1.1 2004/10/21 07:18:31 jolt Exp $ ++ * ++ * Flash mapping for BCM947XX boards + */ + +#include <linux/init.h> @@ -13142,6 +13173,14 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/dr +#include <linux/mtd/map.h> +#include <linux/mtd/partitions.h> +#include <linux/config.h> ++#include <typedefs.h> ++#include <bcmutils.h> ++#include <bcmnvram.h> ++#include <trxhdr.h> ++ ++#ifdef CONFIG_MTD_PARTITIONS ++extern struct mtd_partition * init_mtd_partitions(struct mtd_info *mtd, size_t size); ++#endif + +#define WINDOW_ADDR 0x1c000000 +#define WINDOW_SIZE (0x400000*2) @@ -13176,49 +13215,110 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/dr + phys: WINDOW_ADDR, +}; + -+#define SECTORS *64*1024 -+ +#ifdef CONFIG_MTD_PARTITIONS -+#if 0 -+static struct mtd_partition bcm947xx_parts[] = { -+// 64 - 4 - 14 - 1 = 45 = 8 + 37 -+ { name: "pmon", offset: 0, size: 4 SECTORS, mask_flags: MTD_WRITEABLE }, -+ { name: "linux", offset: MTDPART_OFS_APPEND, size: 14 SECTORS }, -+ { name: "rescue", offset: MTDPART_OFS_APPEND, size: 8 SECTORS }, -+ { name: "rootfs", offset: MTDPART_OFS_APPEND, size: 37 SECTORS }, -+ { name: "nvram", offset: MTDPART_OFS_APPEND, size: 1 SECTORS, mask_flags: MTD_WRITEABLE }, -+}; -+#else ++ +static struct mtd_partition bcm947xx_parts[] = { -+ { name: "cfe", -+ offset: 0, -+ size: 384*1024, -+ mask_flags: MTD_WRITEABLE -+ }, -+ { name: "config", -+ offset: MTDPART_OFS_APPEND, -+ size: 128*1024 -+ }, -+ { name: "linux", -+ offset: MTDPART_OFS_APPEND, -+ size: 10*128*1024 -+ }, -+ { name: "jffs", -+ offset: MTDPART_OFS_APPEND, -+ size: (8*1024*1024)-((384*1024)+(128*1024)+(10*128*1024)+(128*1024)), -+ }, -+ { name: "nvram", -+ offset: MTDPART_OFS_APPEND, -+ size: 128*1024, -+ mask_flags: MTD_WRITEABLE -+ }, ++ { name: "cfe", offset: 0, size: 0, mask_flags: MTD_WRITEABLE, }, ++ { name: "linux", offset: 0, size: 0, }, ++ { name: "rootfs", offset: 0, size: 0, }, ++ { name: "nvram", offset: 0, size: 0, }, ++ { name: "OpenWrt", offset: 0, size: 0, }, ++ { name: NULL, }, +}; -+#endif ++ ++static int __init ++find_root(struct mtd_info *mtd, size_t size, struct mtd_partition *part) ++{ ++ struct trx_header *trx; ++ unsigned char buf[512]; ++ int off; ++ size_t len; ++ ++ trx = (struct trx_header *) buf; ++ ++ printk(KERN_NOTICE ++ "MTD erasesize: %d, Size: %d\n", ++ mtd->erasesize, size); ++ ++ for (off = (384*1024); off < size; off += mtd->erasesize) { ++ memset(buf, 0xe5, sizeof(buf)); ++ ++ /* ++ * Read into buffer ++ */ ++ if (MTD_READ(mtd, off, sizeof(buf), &len, buf) || ++ len != sizeof(buf)) ++ continue; ++ ++ /* found a TRX header */ ++ if (le32_to_cpu(trx->magic) == TRX_MAGIC) { ++ printk(KERN_NOTICE "Found TRX Header!\n"); ++ ++ part->offset = le32_to_cpu(trx->offsets[2]) ? : ++ le32_to_cpu(trx->offsets[1]); ++ part->size = le32_to_cpu(trx->len); ++ ++ part->size -= part->offset; ++ part->offset += off; ++ ++ goto done; ++ } ++ } ++ ++ printk(KERN_NOTICE ++ "%s: Couldn't find root filesystem\n", ++ mtd->name); ++ return -1; ++ ++ done: ++ return part->size; ++} ++ ++struct mtd_partition * __init ++init_mtd_partitions(struct mtd_info *mtd, size_t size) ++{ ++ ++ /* boot loader */ ++ bcm947xx_parts[0].offset=0; ++ bcm947xx_parts[0].size=384*1024; ++ ++ /* nvram */ ++ bcm947xx_parts[3].offset = size - (128*1024); ++ bcm947xx_parts[3].size = size - bcm947xx_parts[3].offset; ++ ++ /* Size linux (kernel and rootfs) */ ++ bcm947xx_parts[1].offset = bcm947xx_parts[0].size; ++ bcm947xx_parts[1].size = bcm947xx_parts[3].offset - bcm947xx_parts[1].offset; ++ ++ /* Find and size rootfs */ ++ if (find_root(mtd,size,&bcm947xx_parts[2])==0) { ++ /* entirely jffs2 */ ++ bcm947xx_parts[2].size = bcm947xx_parts[3].offset - bcm947xx_parts[2].offset; ++ bcm947xx_parts[4].name = NULL; ++ } else { ++ /* legacy setup */ ++ /* calculate leftover flash, and assign it to the jffs2 partition */ ++ bcm947xx_parts[4].offset = bcm947xx_parts[2].offset + bcm947xx_parts[2].size; ++ bcm947xx_parts[4].offset = ROUNDUP(bcm947xx_parts[4].offset, mtd->erasesize); ++ bcm947xx_parts[4].size = bcm947xx_parts[3].offset - bcm947xx_parts[4].offset; ++ } ++ ++ return bcm947xx_parts; ++} ++ ++EXPORT_SYMBOL(init_mtd_partitions); +#endif + +int __init init_bcm947xx_map(void) +{ -+ bcm947xx_map.virt = (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE); ++ size_t size; ++ int ret = 0; ++#ifdef CONFIG_MTD_PARTITIONS ++ struct mtd_partition *parts; ++ int i; ++#endif ++ ++ bcm947xx_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE); + + if (!bcm947xx_map.virt) { + printk("Failed to ioremap\n"); @@ -13236,13 +13336,29 @@ diff -Nur linux-2.6.12.5/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.12.5-brcm/dr + + bcm947xx_mtd->owner = THIS_MODULE; + -+ printk(KERN_NOTICE "flash device: %x at %x\n", bcm947xx_mtd->size, WINDOW_ADDR); ++ size = bcm947xx_mtd->size; ++ ++ printk(KERN_NOTICE "Flash device: 0x%x at 0x%x\n", bcm947xx_mtd->size, WINDOW_ADDR); + +#ifdef CONFIG_MTD_PARTITIONS -+ return add_mtd_partitions(bcm947xx_mtd, bcm947xx_parts, sizeof(bcm947xx_parts)/sizeof(bcm947xx_parts[0])); -+#else -+ return 0; ++ parts = init_mtd_partitions(bcm947xx_mtd, size); ++ for (i = 0; parts[i].name; i++); ++ ret = add_mtd_partitions(bcm947xx_mtd, parts, i); ++ if (ret) { ++ printk(KERN_ERR "Flash: add_mtd_partitions failed\n"); ++ goto fail; ++ } +#endif ++ ++ return 0; ++ ++ fail: ++ if (bcm947xx_mtd) ++ map_destroy(bcm947xx_mtd); ++ if (bcm947xx_map.map_priv_1) ++ iounmap((void *) bcm947xx_map.map_priv_1); ++ bcm947xx_map.map_priv_1 = 0; ++ return ret; +} + +void __exit cleanup_bcm947xx_map(void) |