diff options
Diffstat (limited to 'target/linux/linux-2.6')
| -rw-r--r-- | target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch | 206 | 
1 files changed, 161 insertions, 45 deletions
diff --git a/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch b/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch index 3a4f78fc9..225e1c044 100644 --- a/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch +++ b/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)  | 
