diff -urN linux.old/drivers/mtd/maps/bcm47xx-flash.c linux.dev/drivers/mtd/maps/bcm47xx-flash.c
--- linux.old/drivers/mtd/maps/bcm47xx-flash.c 1970-01-01 01:00:00.000000000 +0100
+++ linux.dev/drivers/mtd/maps/bcm47xx-flash.c 2006-06-23 19:54:06.000000000 +0200
-@@ -0,0 +1,451 @@
+@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org>
+#include <linux/crc32.h>
+#include <asm/io.h>
+
++#include <typedefs.h>
++#include <osl.h>
++#include <bcmnvram.h>
++#include <bcmutils.h>
++#include <sbconfig.h>
++#include <sbchipc.h>
++#include <sbutils.h>
+#include <trxhdr.h>
+
+#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
+#define NVRAM_SPACE 0x8000
-+#define WINDOW_ADDR 0x1c000000
-+#define WINDOW_SIZE 0x800000
++#define WINDOW_ADDR 0x1fc00000
++#define WINDOW_SIZE 0x400000
+#define BUSWIDTH 2
+
++extern sb_t *sbh;
+static struct mtd_info *bcm947xx_mtd;
+
+static void bcm947xx_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
+{
+ int cfe_size;
+
-+ cfe_size = find_cfe_size(mtd,size);
++ if ((cfe_size = find_cfe_size(mtd,size)) < 0)
++ return NULL;
+
+ /* boot loader */
+ bcm947xx_parts[0].offset = 0;
+
+int __init init_bcm947xx_map(void)
+{
++ uint coreidx;
++ chipcregs_t *cc;
++ uint32 fltype;
++ uint window_addr = 0, window_size = 0;
+ size_t size;
+ int ret = 0;
+#ifdef CONFIG_MTD_PARTITIONS
+ int i;
+#endif
+
-+ bcm947xx_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
++ coreidx = sb_coreidx(sbh);
++
++ /* Check strapping option if chipcommon exists */
++ if ((cc = sb_setcore(sbh, SB_CC, 0))) {
++ fltype = readl(&cc->capabilities) & CAP_FLASH_MASK;
++ if (fltype == PFLASH) {
++ bcm947xx_map.map_priv_2 = 1;
++ window_addr = 0x1c000000;
++ bcm947xx_map.size = window_size = 32 * 1024 * 1024;
++ if ((readl(&cc->flash_config) & CC_CFG_DS) == 0)
++ bcm947xx_map.bankwidth = 1;
++ }
++ } else {
++ fltype = PFLASH;
++ bcm947xx_map.map_priv_2 = 0;
++ window_addr = WINDOW_ADDR;
++ window_size = WINDOW_SIZE;
++ }
++
++ sb_setcoreidx(sbh, coreidx);
++
++ if (fltype != PFLASH) {
++ printk(KERN_ERR "pflash: found no supported devices\n");
++ ret = -ENODEV;
++ goto fail;
++ }
++ bcm947xx_map.virt = ioremap(window_addr, window_size);
+
+ if (!bcm947xx_map.virt) {
+ printk("Failed to ioremap\n");