Browse Source

Merge branch 'master' of git+ssh://openadk.org/git/openadk

Waldemar Brodkorb 14 years ago
parent
commit
38b2911d5e

+ 4 - 0
mk/modules.mk

@@ -70,6 +70,10 @@ $(eval $(call KMOD_template,P54_COMMON,p54-common,\
 	$(MODULES_DIR)/kernel/drivers/net/wireless/p54/p54common \
 ,68))
 
+$(eval $(call KMOD_template,B43,b43,\
+	$(MODULES_DIR)/kernel/drivers/net/wireless/b43/b43 \
+,70))
+
 $(eval $(call KMOD_template,P54_USB,p54-usb,\
 	$(MODULES_DIR)/kernel/drivers/net/wireless/p54/p54usb \
 ,70))

+ 2 - 0
package/Config.in

@@ -536,6 +536,7 @@ source "package/make/Config.in"
 source "package/microperl/Config.in"
 source "package/perl/Config.in"
 source "package/php/Config.in"
+source "package/pkg-config/Config.in"
 source "package/python/Config.in"
 source "package/python2/Config.in"
 source "package/ruby/Config.in"
@@ -593,6 +594,7 @@ endmenu
 
 menu "Wireless"
 source "package/aircrack-ng/Config.in"
+source "package/b43-firmware/Config.in"
 source "package/chillispot/Config.in"
 source "package/hostapd/Config.in"
 source "package/iw/Config.in"

+ 26 - 0
package/b43-firmware/Makefile

@@ -0,0 +1,26 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+PKG_NAME:=		b43-firmware
+PKG_VERSION:=		1.0
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		37c8d2c029a7e5b82f4433a6fa1e2ee5
+PKG_DESCR:=		firmware for b43 wireless cards
+PKG_SECTION:=		sys
+PKG_SITES:=		http://openadk.org/distfiles/
+
+include ${TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,B43_FIRMWARE,b43-firmware,${PKG_VERSION}-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION}))
+
+CONFIG_STYLE:=          manual
+BUILD_STYLE:=           manual
+INSTALL_STYLE:=         manual
+
+do-install:
+	${INSTALL_DIR} ${IDIR_B43_FIRMWARE}/lib/firmware
+	${CP} ${WRKBUILD}/* ${IDIR_B43_FIRMWARE}/lib/firmware/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 29 - 0
package/pkg-config/Makefile

@@ -0,0 +1,29 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=		pkg-config
+PKG_VERSION:=		0.25
+PKG_RELEASE:=		1
+PKG_MD5SUM:=		a3270bab3f4b69b7dc6dbdacbcae9745
+PKG_DESCR:=		a helper tool used when compiling applications and libraries.
+PKG_SECTION:=		libs
+PKG_BUILDDEP+=		glib popt
+PKG_DEPENDS:=		glib libpopt
+PKG_URL:=		http://pkg-config.freedesktop.org/wiki/
+PKG_SITES:=		http://pkgconfig.freedesktop.org/releases/
+
+include $(TOPDIR)/mk/package.mk
+
+$(eval $(call PKG_template,PKG_CONFIG,$(PKG_NAME),$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION}))
+
+CONFIGURE_ARGS+=	--with-installed-glib \
+			--with-installed-popt
+
+post-install:
+	$(INSTALL_DIR) $(IDIR_PKG_CONFIG)/usr/bin
+	$(INSTALL_BIN) $(WRKINST)/usr/bin/pkg-config \
+		$(IDIR_PKG_CONFIG)/usr/bin
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 6 - 2
target/Config.in

@@ -11,6 +11,9 @@ config ADK_TARGET_WITH_USB
 config ADK_TARGET_WITH_PCI
 	bool
 
+config ADK_TARGET_WITH_SSB
+	bool
+
 config ADK_TARGET_WITH_MINIPCI
 	bool
 
@@ -329,14 +332,15 @@ config ADK_LINUX_MIPS_AG241
 	  Status: stable
 
 config ADK_LINUX_MIPS_BRCM
-	bool "Linksys/Asus Broadcom 47xx Routers"
+	bool "Broadcom BCM47xx based routers"
+	select ADK_TARGET_WITH_SSB
 	select ADK_KERNEL_NETDEVICES
 	select ADK_KERNEL_NET_PCI
 	select ADK_KERNEL_NET_ETHERNET
 	select ADK_KERNEL_MII
 	select ADK_brcm
 	help
-	  Linksys/Asus Broadcom 47xx based router.
+	  Broadcom bcm47xx based router.
 	  Status: development
 
 config ADK_LINUX_XSCALE_ZAURUS

+ 87 - 2
target/brcm/kernel.config

@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.34
-# Tue Jun  1 20:03:59 2010
+# Thu Jun  3 22:53:49 2010
 #
 CONFIG_MIPS=y
 
@@ -410,7 +410,90 @@ CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_FW_LOADER is not set
 # CONFIG_SYS_HYPERVISOR is not set
 # CONFIG_CONNECTOR is not set
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_TESTS is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_ROOTFS_ROOT_DEV=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_INTEL_VR_NOR is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
 # CONFIG_PARPORT is not set
 CONFIG_BLK_DEV=y
 # CONFIG_BLK_CPQ_DA is not set
@@ -788,6 +871,8 @@ CONFIG_MISC_FILESYSTEMS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+# CONFIG_YAFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_LOGFS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_SQUASHFS is not set

+ 323 - 0
target/brcm/patches/brcm.patch

@@ -0,0 +1,323 @@
+diff -Nur linux-2.6.34.orig/arch/mips/bcm47xx/Makefile linux-2.6.34/arch/mips/bcm47xx/Makefile
+--- linux-2.6.34.orig/arch/mips/bcm47xx/Makefile	2010-05-16 23:17:36.000000000 +0200
++++ linux-2.6.34/arch/mips/bcm47xx/Makefile	2010-06-03 22:38:03.501617275 +0200
+@@ -3,4 +3,5 @@
+ # under Linux.
+ #
+ 
+-obj-y := gpio.o irq.o prom.o serial.o setup.o time.o wgt634u.o
++obj-y := gpio.o irq.o nvram.o platform.o prom.o \
++         serial.o setup.o time.o wgt634u.o
+diff -Nur linux-2.6.34.orig/arch/mips/bcm47xx/nvram.c linux-2.6.34/arch/mips/bcm47xx/nvram.c
+--- linux-2.6.34.orig/arch/mips/bcm47xx/nvram.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.34/arch/mips/bcm47xx/nvram.c	2010-06-03 22:37:52.471617640 +0200
+@@ -0,0 +1,100 @@
++/*
++ * BCM947xx nvram variable access
++ *
++ * Copyright (C) 2005 Broadcom Corporation
++ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
++ *
++ * 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.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/ssb/ssb.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/interrupt.h>
++#include <linux/spinlock.h>
++#include <linux/slab.h>
++#include <asm/byteorder.h>
++#include <asm/bootinfo.h>
++#include <asm/addrspace.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/mach-bcm47xx/nvram.h>
++#include <asm/mach-bcm47xx/bcm47xx.h>
++
++static char nvram_buf[NVRAM_SPACE];
++
++/* Probe for NVRAM header */
++static void __init early_nvram_init(void)
++{
++	struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore;
++	struct nvram_header *header;
++	int i;
++	u32 base, lim, off;
++	u32 *src, *dst;
++
++	base = mcore->flash_window;
++	lim = mcore->flash_window_size;
++
++	off = FLASH_MIN;
++	while (off <= lim) {
++		/* Windowed flash access */
++		header = (struct nvram_header *)
++			KSEG1ADDR(base + off - NVRAM_SPACE);
++		if (header->magic == NVRAM_HEADER)
++			goto found;
++		off <<= 1;
++	}
++
++	/* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
++	header = (struct nvram_header *) KSEG1ADDR(base + 4096);
++	if (header->magic == NVRAM_HEADER)
++		goto found;
++
++	header = (struct nvram_header *) KSEG1ADDR(base + 1024);
++	if (header->magic == NVRAM_HEADER)
++		goto found;
++
++	return;
++
++found:
++	src = (u32 *) header;
++	dst = (u32 *) nvram_buf;
++	for (i = 0; i < sizeof(struct nvram_header); i += 4)
++		*dst++ = *src++;
++	for (; i < header->len && i < NVRAM_SPACE; i += 4)
++		*dst++ = le32_to_cpu(*src++);
++}
++
++int nvram_getenv(char *name, char *val, size_t val_len)
++{
++	char *var, *value, *end, *eq;
++
++	if (!name)
++		return 1;
++
++	if (!nvram_buf[0])
++		early_nvram_init();
++
++	/* Look for name=value and return value */
++	var = &nvram_buf[sizeof(struct nvram_header)];
++	end = nvram_buf + sizeof(nvram_buf) - 2;
++	end[0] = end[1] = '\0';
++	for (; *var; var = value + strlen(value) + 1) {
++		eq = strchr(var, '=');
++		if (!eq)
++			break;
++		value = eq + 1;
++		if ((eq - var) == strlen(name) &&
++			strncmp(var, name, (eq - var)) == 0) {
++			snprintf(val, val_len, "%s", value);
++			return 0;
++		}
++	}
++	return 1;
++}
++EXPORT_SYMBOL(nvram_getenv);
+diff -Nur linux-2.6.34.orig/arch/mips/bcm47xx/platform.c linux-2.6.34/arch/mips/bcm47xx/platform.c
+--- linux-2.6.34.orig/arch/mips/bcm47xx/platform.c	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.34/arch/mips/bcm47xx/platform.c	2010-06-03 22:38:03.501617275 +0200
+@@ -0,0 +1,79 @@
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org>
++ */
++
++#include <linux/platform_device.h>
++#include <linux/module.h>
++#include <linux/mtd/physmap.h>
++#include <linux/ssb/ssb.h>
++
++#include <asm/mach-bcm47xx/bcm47xx.h>
++#include <asm/mach-bcm47xx/nvram.h>
++
++static struct mtd_partition bcm47xx_partitions[] = {
++	{
++		.name       = "cfe",
++		.offset     = 0,
++		.size       = 0x40000,		/* 256k */
++		.mask_flags = MTD_WRITEABLE	/* force read-only */
++	},
++	{
++		.name   = "linux",
++		.offset = 0,
++		.size   = 0,
++	},
++	{
++		.name   = "nvram",
++		.offset = 0,
++		.size   = 0,
++	},
++};
++
++static struct physmap_flash_data bcm47xx_flash_data = {
++	.parts    = bcm47xx_partitions,
++	.nr_parts = ARRAY_SIZE(bcm47xx_partitions)
++};
++
++static struct resource bcm47xx_flash_resource = {
++	.flags = IORESOURCE_MEM,
++};
++
++static struct platform_device bcm47xx_flash = {
++	.name          = "physmap-flash",
++	.id            = 0,
++	.dev           = { .platform_data = &bcm47xx_flash_data, },
++	.resource      = &bcm47xx_flash_resource,
++	.num_resources = 1,
++};
++
++static struct platform_device *bcm47xx_devices[] __initdata = {
++	&bcm47xx_flash,
++};
++
++static int __init bcm47xx_register_devices(void)
++{
++	u32 flash_size;
++	struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore;
++
++	/* devices might have 2, 4 or 8 MB flash size */
++	flash_size = mcore->flash_window_size;
++	printk(KERN_INFO "FLASH SIZE: %x\n", flash_size);
++	bcm47xx_partitions[1].offset = 0x40000;
++	bcm47xx_partitions[1].size = flash_size - NVRAM_FLASH_SIZE - 0x40000;
++	bcm47xx_partitions[2].offset = flash_size - NVRAM_FLASH_SIZE;
++	bcm47xx_partitions[2].size = NVRAM_FLASH_SIZE;
++
++	bcm47xx_flash_data.width = mcore->flash_buswidth;
++	bcm47xx_flash_resource.start = mcore->flash_window;
++	bcm47xx_flash_resource.end = mcore->flash_window
++				   + mcore->flash_window_size
++				   - 1;
++	return platform_add_devices(bcm47xx_devices,
++			    ARRAY_SIZE(bcm47xx_devices));
++}
++
++device_initcall(bcm47xx_register_devices);
+diff -Nur linux-2.6.34.orig/arch/mips/bcm47xx/setup.c linux-2.6.34/arch/mips/bcm47xx/setup.c
+--- linux-2.6.34.orig/arch/mips/bcm47xx/setup.c	2010-05-16 23:17:36.000000000 +0200
++++ linux-2.6.34/arch/mips/bcm47xx/setup.c	2010-06-03 22:37:52.481613327 +0200
+@@ -1,8 +1,8 @@
+ /*
+  *  Copyright (C) 2004 Florian Schirmer <jolt@tuxbox.org>
+- *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org>
+  *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
+  *  Copyright (C) 2006 Michael Buesch <mb@bu3sch.de>
++ *  Copyright (C) 2010 Waldemar Brodkorb <wbx@openadk.org>
+  *
+  *  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
+@@ -33,6 +33,7 @@
+ #include <asm/time.h>
+ #include <bcm47xx.h>
+ #include <asm/fw/cfe/cfe_api.h>
++#include <asm/mach-bcm47xx/nvram.h>
+ 
+ struct ssb_bus ssb_bcm47xx;
+ EXPORT_SYMBOL(ssb_bcm47xx);
+@@ -81,28 +82,42 @@
+ 	/* Fill boardinfo structure */
+ 	memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo));
+ 
+-	if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0)
++	if (cfe_getenv("boardvendor", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("boardvendor", buf, sizeof(buf)) >= 0)
+ 		iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0);
+-	if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0)
++	if (cfe_getenv("boardtype", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("boardtype", buf, sizeof(buf)) >= 0)
+ 		iv->boardinfo.type = (u16)simple_strtoul(buf, NULL, 0);
+-	if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0)
++	if (cfe_getenv("boardrev", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("boardrev", buf, sizeof(buf)) >= 0)
+ 		iv->boardinfo.rev = (u16)simple_strtoul(buf, NULL, 0);
+ 
+ 	/* Fill sprom structure */
+ 	memset(&(iv->sprom), 0, sizeof(struct ssb_sprom));
+ 	iv->sprom.revision = 3;
+ 
+-	if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0)
++	if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("et0macaddr", buf, sizeof(buf)) >= 0)
+ 		str2eaddr(buf, iv->sprom.et0mac);
+-	if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0)
++
++	if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("et1macaddr", buf, sizeof(buf)) >= 0)
+ 		str2eaddr(buf, iv->sprom.et1mac);
+-	if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0)
+-		iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 10);
+-	if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0)
+-		iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 10);
+-	if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0)
++
++	if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("et0phyaddr", buf, sizeof(buf)) >= 0)
++		iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 0);
++
++	if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("et1phyaddr", buf, sizeof(buf)) >= 0)
++		iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 0);
++
++	if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("et0mdcport", buf, sizeof(buf)) >= 0)
+ 		iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10);
+-	if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0)
++
++	if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0 ||
++	    nvram_getenv("et1mdcport", buf, sizeof(buf)) >= 0)
+ 		iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10);
+ 
+ 	return 0;
+diff -Nur linux-2.6.34.orig/arch/mips/include/asm/mach-bcm47xx/nvram.h linux-2.6.34/arch/mips/include/asm/mach-bcm47xx/nvram.h
+--- linux-2.6.34.orig/arch/mips/include/asm/mach-bcm47xx/nvram.h	1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.34/arch/mips/include/asm/mach-bcm47xx/nvram.h	2010-06-03 22:38:03.501617275 +0200
+@@ -0,0 +1,35 @@
++/*
++ *  Copyright (C) 2005, Broadcom Corporation
++ *  Copyright (C) 2006, Felix Fietkau <nbd@openwrt.org>
++ *
++ *  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.
++ */
++
++#ifndef __NVRAM_H
++#define __NVRAM_H
++
++struct nvram_header {
++	u32 magic;
++	u32 len;
++	u32 crc_ver_init;	/* 0:7 crc, 8:15 ver, 16:31 sdram_init */
++	u32 config_refresh;	/* 0:15 sdram_config, 16:31 sdram_refresh */
++	u32 config_ncdl;	/* ncdl values for memc */
++};
++
++#define NVRAM_HEADER		0x48534C46	/* 'FLSH' */
++#define NVRAM_VERSION		1
++#define NVRAM_HEADER_SIZE	20
++#define NVRAM_SPACE		0x8000
++#define NVRAM_FLASH_SIZE	0x20000
++
++#define FLASH_MIN		0x00020000	/* Minimum flash size */
++
++#define NVRAM_MAX_VALUE_LEN 255
++#define NVRAM_MAX_PARAM_LEN 64
++
++int nvram_getenv(char *name, char *val, size_t val_len);
++
++#endif
+diff -Nur linux-2.6.34.orig/drivers/ssb/driver_mipscore.c linux-2.6.34/drivers/ssb/driver_mipscore.c
+--- linux-2.6.34.orig/drivers/ssb/driver_mipscore.c	2010-05-16 23:17:36.000000000 +0200
++++ linux-2.6.34/drivers/ssb/driver_mipscore.c	2010-06-03 22:38:03.501617275 +0200
+@@ -193,7 +193,7 @@
+ 	mcore->flash_buswidth = 2;
+ 	if (bus->chipco.dev) {
+ 		mcore->flash_window = 0x1c000000;
+-		mcore->flash_window_size = 0x02000000;
++		mcore->flash_window_size = 0x00800000;
+ 		if ((ssb_read32(bus->chipco.dev, SSB_CHIPCO_FLASH_CFG)
+ 		               & SSB_CHIPCO_CFG_DS16) == 0)
+ 			mcore->flash_buswidth = 1;

+ 0 - 433
target/brcm/patches/flash-map.patch

@@ -1,433 +0,0 @@
-diff -Nur linux-2.6.34.orig/drivers/mtd/maps/bcm47xx-flash.c linux-2.6.34/drivers/mtd/maps/bcm47xx-flash.c
---- linux-2.6.34.orig/drivers/mtd/maps/bcm47xx-flash.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.34/drivers/mtd/maps/bcm47xx-flash.c	2010-05-30 15:50:20.921614063 +0200
-@@ -0,0 +1,402 @@
-+/*
-+ *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
-+ *  Copyright (C) 2005 Waldemar Brodkorb <wbx@openwrt.org>
-+ *  Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org)
-+ *
-+ *  original functions for finding root filesystem from Mike Baker 
-+ *
-+ *  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.
-+ *
-+ *  Flash mapping for BCM947XX boards
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/wait.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#ifdef CONFIG_MTD_PARTITIONS
-+#include <linux/mtd/partitions.h>
-+#endif
-+#include <linux/crc32.h>
-+#ifdef CONFIG_SSB
-+#include <linux/ssb/ssb.h>
-+#endif
-+#include <asm/io.h>
-+
-+
-+#define TRX_MAGIC	0x30524448	/* "HDR0" */
-+#define TRX_VERSION	1
-+#define TRX_MAX_LEN	0x3A0000
-+#define TRX_NO_HEADER	1		/* Do not write TRX header */	
-+#define TRX_GZ_FILES	0x2     /* Contains up to TRX_MAX_OFFSET individual gzip files */
-+#define TRX_MAX_OFFSET	3
-+
-+struct trx_header {
-+	u32 magic;		/* "HDR0" */
-+	u32 len;		/* Length of file including header */
-+	u32 crc32;		/* 32-bit CRC from flag_version to end of file */
-+	u32 flag_version;	/* 0:15 flags, 16:31 version */
-+	u32 offsets[TRX_MAX_OFFSET];	/* Offsets of partitions from start of header */
-+};
-+
-+#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
-+#define NVRAM_SPACE 0x8000
-+#define WINDOW_ADDR 0x1fc00000
-+#define WINDOW_SIZE 0x400000
-+#define BUSWIDTH 2
-+
-+#ifdef CONFIG_SSB
-+extern struct ssb_bus ssb_bcm47xx;
-+#endif
-+static struct mtd_info *bcm47xx_mtd;
-+
-+static void bcm47xx_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
-+{
-+	if (len==1) {
-+		memcpy_fromio(to, map->virt + from, len);
-+	} else {
-+		int i;
-+		u16 *dest = (u16 *) to;
-+		u16 *src  = (u16 *) (map->virt + from);
-+		for (i = 0; i < (len / 2); i++) {
-+			dest[i] = src[i];
-+		}
-+		if (len & 1)
-+			*((u8 *)dest+len-1) = src[i] & 0xff;
-+	}
-+}
-+
-+static struct map_info bcm47xx_map = {
-+	name: "Physically mapped flash",
-+	size: WINDOW_SIZE,
-+	bankwidth: BUSWIDTH,
-+	phys: WINDOW_ADDR,
-+};
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+
-+static struct mtd_partition bcm47xx_parts[] = {
-+	{ 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: NULL, },
-+};
-+
-+static int __init
-+find_cfe_size(struct mtd_info *mtd, size_t size)
-+{
-+	struct trx_header *trx;
-+	unsigned char buf[512];
-+	int off;
-+	size_t len;
-+	int blocksize;
-+
-+	trx = (struct trx_header *) buf;
-+
-+	blocksize = mtd->erasesize;
-+	if (blocksize < 0x10000)
-+		blocksize = 0x10000;
-+
-+	for (off = (128*1024); off < size; off += blocksize) {
-+		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) {
-+			goto found;
-+		}
-+	}
-+
-+	printk(KERN_NOTICE
-+	       "%s: Couldn't find bootloader size\n",
-+	       mtd->name);
-+	return -1;
-+
-+ found:
-+	printk(KERN_NOTICE "bootloader size: %d\n", off);
-+	return off;
-+
-+}
-+
-+/*
-+ * Copied from mtdblock.c
-+ *
-+ * Cache stuff...
-+ * 
-+ * Since typical flash erasable sectors are much larger than what Linux's
-+ * buffer cache can handle, we must implement read-modify-write on flash
-+ * sectors for each block write requests.  To avoid over-erasing flash sectors
-+ * and to speed things up, we locally cache a whole flash sector while it is
-+ * being written to until a different sector is required.
-+ */
-+
-+static void erase_callback(struct erase_info *done)
-+{
-+	wait_queue_head_t *wait_q = (wait_queue_head_t *)done->priv;
-+	wake_up(wait_q);
-+}
-+
-+static int erase_write (struct mtd_info *mtd, unsigned long pos, 
-+			int len, const char *buf)
-+{
-+	struct erase_info erase;
-+	DECLARE_WAITQUEUE(wait, current);
-+	wait_queue_head_t wait_q;
-+	size_t retlen;
-+	int ret;
-+
-+	/*
-+	 * First, let's erase the flash block.
-+	 */
-+
-+	init_waitqueue_head(&wait_q);
-+	erase.mtd = mtd;
-+	erase.callback = erase_callback;
-+	erase.addr = pos;
-+	erase.len = len;
-+	erase.priv = (u_long)&wait_q;
-+
-+	set_current_state(TASK_INTERRUPTIBLE);
-+	add_wait_queue(&wait_q, &wait);
-+
-+	ret = mtd->erase(mtd, &erase);
-+	if (ret) {
-+		set_current_state(TASK_RUNNING);
-+		remove_wait_queue(&wait_q, &wait);
-+		printk (KERN_WARNING "erase of region [0x%lx, 0x%x] "
-+				     "on \"%s\" failed\n",
-+			pos, len, mtd->name);
-+		return ret;
-+	}
-+
-+	schedule();  /* Wait for erase to finish. */
-+	remove_wait_queue(&wait_q, &wait);
-+
-+	/*
-+	 * Next, writhe data to flash.
-+	 */
-+
-+	ret = mtd->write (mtd, pos, len, &retlen, buf);
-+	if (ret)
-+		return ret;
-+	if (retlen != len)
-+		return -EIO;
-+	return 0;
-+}
-+
-+
-+
-+
-+static int __init
-+find_root(struct mtd_info *mtd, size_t size, struct mtd_partition *part)
-+{
-+	struct trx_header trx, *trx2;
-+	unsigned char buf[512], *block;
-+	int off, blocksize;
-+	u32 i, crc = ~0;
-+	size_t len;
-+	struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
-+
-+	blocksize = mtd->erasesize;
-+	if (blocksize < 0x10000)
-+		blocksize = 0x10000;
-+
-+	for (off = (128*1024); off < size; off += blocksize) {
-+		memset(&trx, 0xe5, sizeof(trx));
-+
-+		/*
-+		 * Read into buffer 
-+		 */
-+		if (mtd->read(mtd, off, sizeof(trx), &len, (char *) &trx) ||
-+		    len != sizeof(trx))
-+			continue;
-+
-+		/* found a TRX header */
-+		if (le32_to_cpu(trx.magic) == TRX_MAGIC) {
-+			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 found;
-+		}
-+	}
-+
-+	printk(KERN_NOTICE
-+	       "%s: Couldn't find root filesystem\n",
-+	       mtd->name);
-+	return -1;
-+
-+ found:
-+	if (part->size == 0)
-+		return 0;
-+	
-+	if (mtd->read(mtd, part->offset, sizeof(buf), &len, buf) || len != sizeof(buf))
-+		return 0;
-+
-+	return part->size;
-+}
-+
-+struct mtd_partition * __init
-+init_mtd_partitions(struct mtd_info *mtd, size_t size)
-+{
-+	int cfe_size;
-+
-+	if ((cfe_size = find_cfe_size(mtd,size)) < 0)
-+		return NULL;
-+
-+	/* boot loader */
-+	bcm47xx_parts[0].offset = 0;
-+	bcm47xx_parts[0].size   = cfe_size;
-+
-+	/* nvram */
-+	if (cfe_size != 384 * 1024) {
-+		bcm47xx_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize);
-+		bcm47xx_parts[3].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize);
-+	} else {
-+		/* nvram (old 128kb config partition on netgear wgt634u) */
-+		bcm47xx_parts[3].offset = bcm47xx_parts[0].size;
-+		bcm47xx_parts[3].size   = ROUNDUP(NVRAM_SPACE, mtd->erasesize);
-+	}
-+
-+	/* linux (kernel and rootfs) */
-+	if (cfe_size != 384 * 1024) {
-+		bcm47xx_parts[1].offset = bcm47xx_parts[0].size;
-+		bcm47xx_parts[1].size   = bcm47xx_parts[3].offset - 
-+			bcm47xx_parts[1].offset;
-+	} else {
-+		/* do not count the elf loader, which is on one block */
-+		bcm47xx_parts[1].offset = bcm47xx_parts[0].size + 
-+			bcm47xx_parts[3].size + mtd->erasesize;
-+		bcm47xx_parts[1].size   = size - 
-+			bcm47xx_parts[0].size - 
-+			(2*bcm47xx_parts[3].size) - 
-+			mtd->erasesize;
-+	}
-+
-+	/* find and size rootfs */
-+	find_root(mtd,size,&bcm47xx_parts[2]);
-+	bcm47xx_parts[2].size = size - bcm47xx_parts[2].offset - bcm47xx_parts[3].size;
-+
-+	return bcm47xx_parts;
-+}
-+#endif
-+
-+int __init init_bcm47xx_map(void)
-+{
-+#ifdef CONFIG_SSB
-+	struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore;
-+#endif
-+	size_t size;
-+	int ret = 0;
-+#ifdef CONFIG_MTD_PARTITIONS
-+	struct mtd_partition *parts;
-+	int i;
-+#endif
-+
-+#ifdef CONFIG_SSB
-+	u32 window = mcore->flash_window;
-+	u32 window_size = mcore->flash_window_size;
-+
-+	printk("flash init: 0x%08x 0x%08x\n", window, window_size);
-+	bcm47xx_map.phys = window;
-+	bcm47xx_map.size = window_size;
-+	bcm47xx_map.bankwidth = mcore->flash_buswidth;
-+	bcm47xx_map.virt = ioremap_nocache(window, window_size);
-+#else
-+	printk("flash init: 0x%08x 0x%08x\n", WINDOW_ADDR, WINDOW_SIZE);
-+	bcm47xx_map.virt = ioremap_nocache(WINDOW_ADDR, WINDOW_SIZE);
-+#endif
-+
-+	if (!bcm47xx_map.virt) {
-+		printk("Failed to ioremap\n");
-+		return -EIO;
-+	}
-+
-+	simple_map_init(&bcm47xx_map);
-+	
-+	if (!(bcm47xx_mtd = do_map_probe("cfi_probe", &bcm47xx_map))) {
-+		printk("Failed to do_map_probe\n");
-+		iounmap((void *)bcm47xx_map.virt);
-+		return -ENXIO;
-+	}
-+
-+	/* override copy_from routine */
-+ 	//bcm47xx_map.copy_from = bcm47xx_map_copy_from;
-+
-+	bcm47xx_mtd->owner = THIS_MODULE;
-+
-+	size = bcm47xx_mtd->size;
-+
-+	printk(KERN_NOTICE "Flash device: 0x%x at 0x%x\n", size, WINDOW_ADDR);
-+
-+#ifdef CONFIG_MTD_PARTITIONS
-+	parts = init_mtd_partitions(bcm47xx_mtd, size);
-+	for (i = 0; parts[i].name; i++);
-+	ret = add_mtd_partitions(bcm47xx_mtd, parts, i);
-+	if (ret) {
-+		printk(KERN_ERR "Flash: add_mtd_partitions failed\n");
-+		goto fail;
-+	}
-+#endif
-+	return 0;
-+
-+ fail:
-+	if (bcm47xx_mtd)
-+		map_destroy(bcm47xx_mtd);
-+	if (bcm47xx_map.virt)
-+		iounmap((void *)bcm47xx_map.virt);
-+	bcm47xx_map.virt = 0;
-+	return ret;
-+}
-+
-+void __exit cleanup_bcm47xx_map(void)
-+{
-+#ifdef CONFIG_MTD_PARTITIONS
-+	del_mtd_partitions(bcm47xx_mtd);
-+#endif
-+	map_destroy(bcm47xx_mtd);
-+	iounmap((void *)bcm47xx_map.virt);
-+}
-+
-+module_init(init_bcm47xx_map);
-+module_exit(cleanup_bcm47xx_map);
-diff -Nur linux-2.6.34.orig/drivers/mtd/maps/Kconfig linux-2.6.34/drivers/mtd/maps/Kconfig
---- linux-2.6.34.orig/drivers/mtd/maps/Kconfig	2010-05-16 23:17:36.000000000 +0200
-+++ linux-2.6.34/drivers/mtd/maps/Kconfig	2010-05-30 15:13:31.141614159 +0200
-@@ -319,6 +319,12 @@
- 	  Mapping for the Flaga digital module. If you don't have one, ignore
- 	  this setting.
- 
-+config MTD_BCM47XX
-+	tristate "BCM47xx flash device"
-+	depends on MIPS && MTD_CFI && BCM47XX
-+	help
-+	  Support for the flash chips on the BCM947xx board.
-+
- config MTD_REDWOOD
- 	tristate "CFI Flash devices mapped on IBM Redwood"
- 	depends on MTD_CFI && ( REDWOOD_4 || REDWOOD_5 || REDWOOD_6 )
-diff -Nur linux-2.6.34.orig/drivers/mtd/maps/Makefile linux-2.6.34/drivers/mtd/maps/Makefile
---- linux-2.6.34.orig/drivers/mtd/maps/Makefile	2010-05-16 23:17:36.000000000 +0200
-+++ linux-2.6.34/drivers/mtd/maps/Makefile	2010-05-30 15:13:31.141614159 +0200
-@@ -29,6 +29,7 @@
- obj-$(CONFIG_MTD_PCMCIA)	+= pcmciamtd.o
- obj-$(CONFIG_MTD_RPXLITE)	+= rpxlite.o
- obj-$(CONFIG_MTD_TQM8XXL)	+= tqm8xxl.o
-+obj-$(CONFIG_MTD_BCM47XX)	+= bcm47xx-flash.o
- obj-$(CONFIG_MTD_SA1100)	+= sa1100-flash.o
- obj-$(CONFIG_MTD_SBC_GXX)	+= sbc_gxx.o
- obj-$(CONFIG_MTD_SC520CDP)	+= sc520cdp.o

+ 0 - 223
target/brcm/patches/nvram.patch

@@ -1,223 +0,0 @@
---- a/arch/mips/bcm47xx/Makefile
-+++ b/arch/mips/bcm47xx/Makefile
-@@ -3,4 +3,4 @@
- # under Linux.
- #
- 
--obj-y := gpio.o irq.o prom.o serial.o setup.o time.o wgt634u.o
-+obj-y := gpio.o irq.o nvram.o prom.o serial.o setup.o time.o wgt634u.o
---- /dev/null
-+++ b/arch/mips/bcm47xx/nvram.c
-@@ -0,0 +1,98 @@
-+/*
-+ * BCM947xx nvram variable access
-+ *
-+ * Copyright 2005, Broadcom Corporation
-+ * Copyright 2006, Felix Fietkau <nbd@openwrt.org>
-+ * 
-+ * 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.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/ssb/ssb.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/interrupt.h>
-+#include <linux/spinlock.h>
-+#include <linux/slab.h>
-+#include <asm/byteorder.h>
-+#include <asm/bootinfo.h>
-+#include <asm/addrspace.h>
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/mach-bcm47xx/nvram.h>
-+#include <asm/mach-bcm47xx/bcm47xx.h>
-+
-+static char nvram_buf[NVRAM_SPACE];
-+		
-+/* Probe for NVRAM header */
-+static void __init early_nvram_init(void)
-+{
-+	struct ssb_mipscore *mcore = &ssb_bcm47xx.mipscore;
-+	struct nvram_header *header;
-+	int i;
-+	u32 base, lim, off;
-+	u32 *src, *dst;
-+	
-+	base = mcore->flash_window;
-+	lim = mcore->flash_window_size;
-+
-+	off = 0x20000;
-+	while (off <= lim) {
-+		/* Windowed flash access */
-+		header = (struct nvram_header *) KSEG1ADDR(base + off - NVRAM_SPACE);
-+		if (header->magic == NVRAM_HEADER)
-+			goto found;
-+		off <<= 1;
-+	}
-+
-+	/* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
-+	header = (struct nvram_header *) KSEG1ADDR(base + 4096);
-+	if (header->magic == NVRAM_HEADER)
-+		goto found;
-+	
-+	header = (struct nvram_header *) KSEG1ADDR(base + 1024);
-+	if (header->magic == NVRAM_HEADER)
-+		goto found;
-+	
-+	return;
-+
-+found:
-+	src = (u32 *) header;
-+	dst = (u32 *) nvram_buf;
-+	for (i = 0; i < sizeof(struct nvram_header); i += 4)
-+		*dst++ = *src++;
-+	for (; i < header->len && i < NVRAM_SPACE; i += 4)
-+		*dst++ = le32_to_cpu(*src++);
-+}
-+
-+char *nvram_get(const char *name)
-+{
-+	char *var, *value, *end, *eq;
-+
-+	if (!name)
-+		return NULL;
-+
-+	if (!nvram_buf[0])
-+		early_nvram_init();
-+
-+	/* Look for name=value and return value */
-+	var = &nvram_buf[sizeof(struct nvram_header)];
-+	end = nvram_buf + sizeof(nvram_buf) - 2;
-+	end[0] = end[1] = '\0';
-+	for (; *var; var = value + strlen(value) + 1) {
-+		if (!(eq = strchr(var, '=')))
-+			break;
-+		value = eq + 1;
-+		if ((eq - var) == strlen(name) &&
-+			strncmp(var, name, (eq - var)) == 0)
-+			return value;
-+	}
-+
-+	return NULL;
-+}
-+
-+EXPORT_SYMBOL(nvram_get);
---- a/arch/mips/bcm47xx/setup.c
-+++ b/arch/mips/bcm47xx/setup.c
-@@ -33,6 +33,7 @@
- #include <asm/time.h>
- #include <bcm47xx.h>
- #include <asm/fw/cfe/cfe_api.h>
-+#include <asm/mach-bcm47xx/nvram.h>
- 
- struct ssb_bus ssb_bcm47xx;
- EXPORT_SYMBOL(ssb_bcm47xx);
-@@ -77,6 +78,7 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,
- 				   struct ssb_init_invariants *iv)
- {
- 	char buf[100];
-+	char *s;
- 
- 	/* Fill boardinfo structure */
- 	memset(&(iv->boardinfo), 0 , sizeof(struct ssb_boardinfo));
-@@ -92,18 +94,47 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,
- 	memset(&(iv->sprom), 0, sizeof(struct ssb_sprom));
- 	iv->sprom.revision = 3;
- 
--	if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0)
-+	if (cfe_getenv("et0macaddr", buf, sizeof(buf)) >= 0) {
- 		str2eaddr(buf, iv->sprom.et0mac);
--	if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0)
-+	} else {
-+		if ((s = nvram_get("et0macaddr")))
-+			str2eaddr(s, iv->sprom.et0mac);
-+	}
-+
-+	if (cfe_getenv("et1macaddr", buf, sizeof(buf)) >= 0) {
- 		str2eaddr(buf, iv->sprom.et1mac);
--	if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0)
--		iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 10);
--	if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0)
--		iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 10);
--	if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0)
-+	} else {
-+		if ((s = nvram_get("et1macaddr")))
-+			str2eaddr(s, iv->sprom.et1mac);
-+	}
-+
-+	if (cfe_getenv("et0phyaddr", buf, sizeof(buf)) >= 0) {
-+		iv->sprom.et0phyaddr = simple_strtoul(buf, NULL, 0);
-+	} else {
-+		if ((s = nvram_get("et0phyaddr")))
-+			iv->sprom.et0phyaddr = simple_strtoul(s, NULL, 0);
-+	}
-+
-+	if (cfe_getenv("et1phyaddr", buf, sizeof(buf)) >= 0) {
-+		iv->sprom.et1phyaddr = simple_strtoul(buf, NULL, 0);
-+	} else {
-+		if ((s = nvram_get("et1phyaddr")))
-+			iv->sprom.et1phyaddr = simple_strtoul(s, NULL, 0);
-+	}
-+
-+	if (cfe_getenv("et0mdcport", buf, sizeof(buf)) >= 0) {
- 		iv->sprom.et0mdcport = simple_strtoul(buf, NULL, 10);
--	if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0)
-+	} else {
-+		if ((s = nvram_get("et0mdcport")))
-+			iv->sprom.et0mdcport = simple_strtoul(s, NULL, 10);
-+	}
-+
-+	if (cfe_getenv("et1mdcport", buf, sizeof(buf)) >= 0) {
- 		iv->sprom.et1mdcport = simple_strtoul(buf, NULL, 10);
-+	} else { 
-+		if ((s = nvram_get("et1mdcport")))
-+			iv->sprom.et1mdcport = simple_strtoul(s, NULL, 10);
-+	}
- 
- 	return 0;
- }
---- /dev/null
-+++ b/arch/mips/include/asm/mach-bcm47xx/nvram.h
-@@ -0,0 +1,37 @@
-+/*
-+ *  Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ *  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.
-+ */
-+
-+#ifndef __NVRAM_H
-+#define __NVRAM_H
-+
-+struct nvram_header {
-+	u32 magic;
-+	u32 len;
-+	u32 crc_ver_init;	/* 0:7 crc, 8:15 ver, 16:31 sdram_init */
-+	u32 config_refresh;	/* 0:15 sdram_config, 16:31 sdram_refresh */
-+	u32 config_ncdl;	/* ncdl values for memc */
-+};
-+
-+struct nvram_tuple {
-+	char *name;
-+	char *value;
-+	struct nvram_tuple *next;
-+};
-+
-+#define NVRAM_HEADER		0x48534C46	/* 'FLSH' */
-+#define NVRAM_VERSION		1
-+#define NVRAM_HEADER_SIZE	20
-+#define NVRAM_SPACE		0x8000
-+
-+#define NVRAM_MAX_VALUE_LEN 255
-+#define NVRAM_MAX_PARAM_LEN 64
-+
-+char *nvram_get(const char *name);
-+
-+#endif

+ 11 - 1
target/linux/config/Config.in.netdevice

@@ -160,7 +160,7 @@ config ADK_MOD_KERNEL_MAC80211
 	default n
 
 menu "Wireless card support"
-depends on ADK_TARGET_WITH_MINIPCI || ADK_TARGET_WITH_PCI || ADK_TARGET_WITH_USB
+depends on ADK_TARGET_WITH_MINIPCI || ADK_TARGET_WITH_PCI || ADK_TARGET_WITH_USB || ADK_TARGET_WITH_SSB
 
 config ADK_KERNEL_MAC80211_DEBUG_MENU
 	boolean
@@ -227,6 +227,16 @@ config ADK_KERNEL_ATH5K_DEBUG
 	  parameter. For example:
 	   insmod ath5k.ko debug=0x00000400
 
+config ADK_KPACKAGE_KMOD_B43
+	prompt "kmod-b43..................... Broadcom B43xx wireless cards"
+	tristate
+	depends on ADK_KPACKAGE_KMOD_MAC80211
+	select ADK_KPACKAGE_KMOD_FW_LOADER
+	depends on ADK_TARGET_WITH_SSB || ADK_TARGET_WITH_MINIPCI
+	default n
+	help
+	  Driver for Broadcom B43xx wireless chips.
+
 config ADK_KPACKAGE_KMOD_P54_USB
 	prompt "kmod-p54-usb................. Prism54 USB support"
 	tristate