append a table with offsets for the no-ack and slot timing code to wl.o
[openwrt/svn-archive/archive.git] / openwrt / target / linux / brcm-2.4 / patches / 001-bcm47xx.patch
index 9d91915..a67c567 100644 (file)
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/cfe_env.c linux-2.4.32-brcm/arch/mips/bcm947xx/cfe_env.c
---- linux-2.4.32/arch/mips/bcm947xx/cfe_env.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/cfe_env.c     2005-12-19 01:56:35.104829500 +0100
-@@ -0,0 +1,234 @@
+diff -urN linux.old/arch/mips/Makefile linux.dev/arch/mips/Makefile
+--- linux.old/arch/mips/Makefile       2006-04-27 18:04:37.000000000 +0200
++++ linux.dev/arch/mips/Makefile       2006-04-27 19:24:19.000000000 +0200
+@@ -726,6 +726,19 @@
+ endif
+ #
++# Broadcom BCM947XX variants
++#
++ifdef CONFIG_BCM947XX
++LIBS          += arch/mips/bcm947xx/generic/brcm.o arch/mips/bcm947xx/bcm947xx.o 
++SUBDIRS               += arch/mips/bcm947xx/generic arch/mips/bcm947xx 
++LOADADDR      := 0x80001000
++
++zImage: vmlinux
++      $(MAKE) -C arch/$(ARCH)/bcm947xx/compressed
++export LOADADDR
++endif
++
++#
+ # Choosing incompatible machines durings configuration will result in
+ # error messages during linking.  Select a default linkscript if
+ # none has been choosen above.
+@@ -778,6 +791,7 @@
+       $(MAKE) -C arch/$(ARCH)/tools clean
+       $(MAKE) -C arch/mips/baget clean
+       $(MAKE) -C arch/mips/lasat clean
++      $(MAKE) -C arch/mips/bcm947xx/compressed clean
+ archmrproper:
+       @$(MAKEBOOT) mrproper
+diff -urN linux.old/arch/mips/bcm947xx/Makefile linux.dev/arch/mips/bcm947xx/Makefile
+--- linux.old/arch/mips/bcm947xx/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/Makefile      2006-05-02 17:46:22.000000000 +0200
+@@ -0,0 +1,17 @@
++#
++# Makefile for the BCM947xx specific kernel interface routines
++# under Linux.
++#
++
++EXTRA_CFLAGS+=-I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER
++
++O_TARGET        := bcm947xx.o
++
++export-objs     := export.o
++obj-y         := prom.o setup.o time.o sbmips.o gpio.o
++obj-y         += nvram.o nvram_linux.o sflash.o cfe_env.o
++obj-y         += sbutils.o bcmutils.o bcmsrom.o hndchipc.o
++obj-$(CONFIG_PCI) += sbpci.o pcibios.o
++obj-y                 += export.o
++
++include $(TOPDIR)/Rules.make
+diff -urN linux.old/arch/mips/bcm947xx/bcmsrom.c linux.dev/arch/mips/bcm947xx/bcmsrom.c
+--- linux.old/arch/mips/bcm947xx/bcmsrom.c     1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/bcmsrom.c     2006-04-27 20:32:48.000000000 +0200
+@@ -0,0 +1,1212 @@
 +/*
-+ * NVRAM variable manipulation (Linux kernel half)
++ *  Misc useful routines to access NIC SROM/OTP .
 + *
-+ * Copyright 2001-2003, Broadcom Corporation
++ * Copyright 2006, 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$
++ * $Id: bcmsrom.c,v 1.1.1.14 2006/04/15 01:28:25 michael Exp $
 + */
 +
-+#include <linux/config.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+
 +#include <typedefs.h>
++#include <bcmdefs.h>
 +#include <osl.h>
-+#include <bcmendian.h>
 +#include <bcmutils.h>
++#include <bcmsrom.h>
++#include <bcmdevs.h>
++#include <bcmendian.h>
++#include <sbpcmcia.h>
++#include <pcicfg.h>
++#include <sbutils.h>
++#include <bcmnvram.h>
 +
-+#define NVRAM_SIZE       (0x1ff0)
-+static char _nvdata[NVRAM_SIZE] __initdata;
-+static char _valuestr[256] __initdata;
-+
-+/*
-+ * TLV types.  These codes are used in the "type-length-value"
-+ * encoding of the items stored in the NVRAM device (flash or EEPROM)
-+ *
-+ * The layout of the flash/nvram is as follows:
-+ *
-+ * <type> <length> <data ...> <type> <length> <data ...> <type_end>
-+ *
-+ * The type code of "ENV_TLV_TYPE_END" marks the end of the list.
-+ * The "length" field marks the length of the data section, not
-+ * including the type and length fields.
-+ *
-+ * Environment variables are stored as follows:
-+ *
-+ * <type_env> <length> <flags> <name> = <value>
-+ *
-+ * If bit 0 (low bit) is set, the length is an 8-bit value.
-+ * If bit 0 (low bit) is clear, the length is a 16-bit value
-+ * 
-+ * Bit 7 set indicates "user" TLVs.  In this case, bit 0 still
-+ * indicates the size of the length field.  
-+ *
-+ * Flags are from the constants below:
-+ *
-+ */
-+#define ENV_LENGTH_16BITS     0x00    /* for low bit */
-+#define ENV_LENGTH_8BITS      0x01
++/* debug/trace */
++#if defined(WLTEST)
++#define       BS_ERROR(args)  printf args
++#else
++#define       BS_ERROR(args)
++#endif        /* BCMDBG_ERR || WLTEST */
 +
-+#define ENV_TYPE_USER         0x80
++#define       VARS_MAX        4096    /* should be reduced */
 +
-+#define ENV_CODE_SYS(n,l) (((n)<<1)|(l))
-+#define ENV_CODE_USER(n,l) ((((n)<<1)|(l)) | ENV_TYPE_USER)
++#define WRITE_ENABLE_DELAY    500     /* 500 ms after write enable/disable toggle */
++#define WRITE_WORD_DELAY      20      /* 20 ms between each word write */
 +
-+/*
-+ * The actual TLV types we support
-+ */
++static int initvars_srom_pci(void *sbh, void *curmap, char **vars, uint *count);
++static int initvars_cis_pcmcia(void *sbh, osl_t *osh, char **vars, uint *count);
++static int initvars_flash_sb(void *sbh, char **vars, uint *count);
++static int srom_parsecis(osl_t *osh, uint8 **pcis, uint ciscnt, char **vars, uint *count);
++static int sprom_cmd_pcmcia(osl_t *osh, uint8 cmd);
++static int sprom_read_pcmcia(osl_t *osh, uint16 addr, uint16 *data);
++static int sprom_write_pcmcia(osl_t *osh, uint16 addr, uint16 data);
++static int sprom_read_pci(osl_t *osh, uint16 *sprom, uint wordoff, uint16 *buf, uint nwords,
++                          bool check_crc);
 +
-+#define ENV_TLV_TYPE_END      0x00    
-+#define ENV_TLV_TYPE_ENV      ENV_CODE_SYS(0,ENV_LENGTH_8BITS)
++static int initvars_table(osl_t *osh, char *start, char *end, char **vars, uint *count);
++static int initvars_flash(osl_t *osh, char **vp, uint len, char *devpath);
 +
 +/*
-+ * Environment variable flags 
++ * Initialize local vars from the right source for this platform.
++ * Return 0 on success, nonzero on error.
 + */
++int
++srom_var_init(void *sbh, uint bustype, void *curmap, osl_t *osh, char **vars, uint *count)
++{
++      ASSERT(bustype == BUSTYPE(bustype));
++      if (vars == NULL || count == NULL)
++              return (0);
 +
-+#define ENV_FLG_NORMAL                0x00    /* normal read/write */
-+#define ENV_FLG_BUILTIN               0x01    /* builtin - not stored in flash */
-+#define ENV_FLG_READONLY      0x02    /* read-only - cannot be changed */
++      switch (BUSTYPE(bustype)) {
++      case SB_BUS:
++      case JTAG_BUS:
++              return initvars_flash_sb(sbh, vars, count);
 +
-+#define ENV_FLG_MASK          0xFF    /* mask of attributes we keep */
-+#define ENV_FLG_ADMIN         0x100   /* lets us internally override permissions */
++      case PCI_BUS:
++              ASSERT(curmap); /* can not be NULL */
++              return initvars_srom_pci(sbh, curmap, vars, count);
 +
++      case PCMCIA_BUS:
++              return initvars_cis_pcmcia(sbh, osh, vars, count);
 +
-+/*  *********************************************************************
-+    *  _nvram_read(buffer,offset,length)
-+    *  
-+    *  Read data from the NVRAM device
-+    *  
-+    *  Input parameters: 
-+    *            buffer - destination buffer
-+    *            offset - offset of data to read
-+    *            length - number of bytes to read
-+    *            
-+    *  Return value:
-+    *            number of bytes read, or <0 if error occured
-+    ********************************************************************* */
-+static int
-+_nvram_read(unsigned char *nv_buf, unsigned char *buffer, int offset, int length)
-+{
-+    int i;
-+    if (offset > NVRAM_SIZE)
-+      return -1; 
 +
-+    for ( i = 0; i < length; i++) {
-+      buffer[i] = ((volatile unsigned char*)nv_buf)[offset + i];
-+    }
-+    return length;
++      default:
++              ASSERT(0);
++      }
++      return (-1);
 +}
 +
-+
-+static char*
-+_strnchr(const char *dest,int c,size_t cnt)
++/* support only 16-bit word read from srom */
++int
++srom_read(uint bustype, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf)
 +{
-+      while (*dest && (cnt > 0)) {
-+      if (*dest == c) return (char *) dest;
-+      dest++;
-+      cnt--;
-+      }
-+      return NULL;
-+}
++      void *srom;
++      uint i, off, nw;
 +
++      ASSERT(bustype == BUSTYPE(bustype));
 +
++      /* check input - 16-bit access only */
++      if (byteoff & 1 || nbytes & 1 || (byteoff + nbytes) > (SPROM_SIZE * 2))
++              return 1;
 +
-+/*
-+ * Core support API: Externally visible.
-+ */
++      off = byteoff / 2;
++      nw = nbytes / 2;
 +
-+/*
-+ * Get the value of an NVRAM variable
-+ * @param     name    name of variable to get
-+ * @return    value of variable or NULL if undefined
-+ */
++      if (BUSTYPE(bustype) == PCI_BUS) {
++              if (!curmap)
++                      return 1;
++              srom = (uchar*)curmap + PCI_BAR0_SPROM_OFFSET;
++              if (sprom_read_pci(osh, srom, off, buf, nw, FALSE))
++                      return 1;
++      } else if (BUSTYPE(bustype) == PCMCIA_BUS) {
++              for (i = 0; i < nw; i++) {
++                      if (sprom_read_pcmcia(osh, (uint16)(off + i), (uint16*)(buf + i)))
++                              return 1;
++              }
++      } else {
++              return 1;
++      }
 +
-+char* 
-+cfe_env_get(unsigned char *nv_buf, char* name)
++      return 0;
++}
++
++/* support only 16-bit word write into srom */
++int
++srom_write(uint bustype, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf)
 +{
-+    int size;
-+    unsigned char *buffer;
-+    unsigned char *ptr;
-+    unsigned char *envval;
-+    unsigned int reclen;
-+    unsigned int rectype;
-+    int offset;
-+    int flg;
-+    
-+    size = NVRAM_SIZE;
-+    buffer = &_nvdata[0];
++      uint16 *srom;
++      uint i, nw, crc_range;
++      uint16 image[SPROM_SIZE];
++      uint8 crc;
++      volatile uint32 val32;
 +
-+    ptr = buffer;
-+    offset = 0;
++      ASSERT(bustype == BUSTYPE(bustype));
 +
-+    /* Read the record type and length */
-+    if (_nvram_read(nv_buf, ptr,offset,1) != 1) {
-+      goto error;
-+    }
-+    
-+    while ((*ptr != ENV_TLV_TYPE_END)  && (size > 1)) {
++      /* check input - 16-bit access only */
++      if (byteoff & 1 || nbytes & 1 || (byteoff + nbytes) > (SPROM_SIZE * 2))
++              return 1;
 +
-+      /* Adjust pointer for TLV type */
-+      rectype = *(ptr);
-+      offset++;
-+      size--;
++      /* Are we writing the whole thing at once? */
++      if ((byteoff == 0) &&
++          ((nbytes == SPROM_SIZE) ||
++           (nbytes == (SPROM_CRC_RANGE * 2)) ||
++           (nbytes == (SROM4_WORDS * 2)))) {
++              crc_range = nbytes;
++              bcopy((void*)buf, (void*)image, nbytes);
++              nw = nbytes / 2;
++      } else {
++              if ((BUSTYPE(bustype) == PCMCIA_BUS) || (BUSTYPE(bustype) == SDIO_BUS))
++                      crc_range = SPROM_SIZE;
++              else
++                      crc_range = SPROM_CRC_RANGE * 2;        /* Tentative */
 +
-+      /* 
-+       * Read the length.  It can be either 1 or 2 bytes
-+       * depending on the code 
-+       */
-+      if (rectype & ENV_LENGTH_8BITS) {
-+          /* Read the record type and length - 8 bits */
-+          if (_nvram_read(nv_buf, ptr,offset,1) != 1) {
-+              goto error;
-+          }
-+          reclen = *(ptr);
-+          size--;
-+          offset++;
-+      }
-+      else {
-+          /* Read the record type and length - 16 bits, MSB first */
-+          if (_nvram_read(nv_buf, ptr,offset,2) != 2) {
-+              goto error;
-+          }
-+          reclen = (((unsigned int) *(ptr)) << 8) + (unsigned int) *(ptr+1);
-+          size -= 2;
-+          offset += 2;
++              nw = crc_range / 2;
++              /* read first 64 words from srom */
++              if (srom_read(bustype, curmap, osh, 0, nw * 2, image))
++                      return 1;
++              if (image[SROM4_SIGN] == SROM4_SIGNATURE) {
++                      crc_range = SROM4_WORDS;
++                      nw = crc_range / 2;
++                      if (srom_read(bustype, curmap, osh, 0, nw * 2, image))
++                              return 1;
++              }
++              /* make changes */
++              bcopy((void*)buf, (void*)&image[byteoff / 2], nbytes);
 +      }
 +
-+      if (reclen > size)
-+          break;      /* should not happen, bad NVRAM */
++      /* calculate crc */
++      htol16_buf(image, crc_range);
++      crc = ~hndcrc8((uint8 *)image, crc_range - 1, CRC8_INIT_VALUE);
++      ltoh16_buf(image, crc_range);
++      image[(crc_range / 2) - 1] = (crc << 8) | (image[(crc_range / 2) - 1] & 0xff);
 +
-+      switch (rectype) {
-+          case ENV_TLV_TYPE_ENV:
-+              /* Read the TLV data */
-+              if (_nvram_read(nv_buf, ptr,offset,reclen) != reclen)
-+                  goto error;
-+              flg = *ptr++;
-+              envval = (unsigned char *) _strnchr(ptr,'=',(reclen-1));
-+              if (envval) {
-+                  *envval++ = '\0';
-+                  memcpy(_valuestr,envval,(reclen-1)-(envval-ptr));
-+                  _valuestr[(reclen-1)-(envval-ptr)] = '\0';
-+#if 0                 
-+                  printk(KERN_INFO "NVRAM:%s=%s\n", ptr, _valuestr);
-+#endif
-+                  if(!strcmp(ptr, name)){
-+                      return _valuestr;
-+                  }
-+                  if((strlen(ptr) > 1) && !strcmp(&ptr[1], name))
-+                      return _valuestr;
++      if (BUSTYPE(bustype) == PCI_BUS) {
++              srom = (uint16*)((uchar*)curmap + PCI_BAR0_SPROM_OFFSET);
++              /* enable writes to the SPROM */
++              val32 = OSL_PCI_READ_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32));
++              val32 |= SPROM_WRITEEN;
++              OSL_PCI_WRITE_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32), val32);
++              bcm_mdelay(WRITE_ENABLE_DELAY);
++              /* write srom */
++              for (i = 0; i < nw; i++) {
++                      W_REG(osh, &srom[i], image[i]);
++                      bcm_mdelay(WRITE_WORD_DELAY);
 +              }
-+              break;
-+              
-+          default: 
-+              /* Unknown TLV type, skip it. */
-+              break;
-+          }
-+
-+      /*
-+       * Advance to next TLV 
-+       */
-+              
-+      size -= (int)reclen;
-+      offset += reclen;
-+
-+      /* Read the next record type */
-+      ptr = buffer;
-+      if (_nvram_read(nv_buf, ptr,offset,1) != 1)
-+          goto error;
++              /* disable writes to the SPROM */
++              OSL_PCI_WRITE_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32), val32 &
++                                   ~SPROM_WRITEEN);
++      } else if (BUSTYPE(bustype) == PCMCIA_BUS) {
++              /* enable writes to the SPROM */
++              if (sprom_cmd_pcmcia(osh, SROM_WEN))
++                      return 1;
++              bcm_mdelay(WRITE_ENABLE_DELAY);
++              /* write srom */
++              for (i = 0; i < nw; i++) {
++                      sprom_write_pcmcia(osh, (uint16)(i), image[i]);
++                      bcm_mdelay(WRITE_WORD_DELAY);
++              }
++              /* disable writes to the SPROM */
++              if (sprom_cmd_pcmcia(osh, SROM_WDS))
++                      return 1;
++      } else {
++              return 1;
 +      }
 +
-+error:
-+    return NULL;
-+
++      bcm_mdelay(WRITE_ENABLE_DELAY);
++      return 0;
 +}
 +
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/compressed/Makefile linux-2.4.32-brcm/arch/mips/bcm947xx/compressed/Makefile
---- linux-2.4.32/arch/mips/bcm947xx/compressed/Makefile        1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/compressed/Makefile   2005-12-16 23:39:10.668819500 +0100
-@@ -0,0 +1,33 @@
-+#
-+# Makefile for Broadcom BCM947XX boards
-+#
-+# 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: Makefile,v 1.2 2005/04/02 12:12:57 wbx Exp $
-+#
 +
-+OBJCOPY_ARGS  = -O binary -R .reginfo -R .note -R .comment -R .mdebug -S
-+SYSTEM                ?= $(TOPDIR)/vmlinux
++static int
++srom_parsecis(osl_t *osh, uint8 **pcis, uint ciscnt, char **vars, uint *count)
++{
++      char eabuf[32];
++      char *vp, *base;
++      uint8 *cis, tup, tlen, sromrev = 1;
++      int i, j;
++      uint varsize;
++      bool ag_init = FALSE;
++      uint32 w32;
 +
-+all: vmlinuz
++      ASSERT(vars);
++      ASSERT(count);
 +
-+# Don't build dependencies, this may die if $(CC) isn't gcc
-+dep:
++      base = vp = MALLOC(osh, VARS_MAX);
++      ASSERT(vp);
++      if (!vp)
++              return -2;
 +
-+# Create a gzipped version named vmlinuz for compatibility
-+vmlinuz: piggy
-+      gzip -c9 $< > $@
++      while (ciscnt--) {
++              cis = *pcis++;
++              i = 0;
++              do {
++                      tup = cis[i++];
++                      tlen = cis[i++];
++                      if ((i + tlen) >= CIS_SIZE)
++                              break;
 +
-+piggy: $(SYSTEM)
-+      $(OBJCOPY) $(OBJCOPY_ARGS) $< $@
++                      switch (tup) {
++                      case CISTPL_MANFID:
++                              vp += sprintf(vp, "manfid=%d", (cis[i + 1] << 8) + cis[i]);
++                              vp++;
++                              vp += sprintf(vp, "prodid=%d", (cis[i + 3] << 8) + cis[i + 2]);
++                              vp++;
++                              break;
 +
-+mrproper: clean
++                      case CISTPL_FUNCE:
++                              switch (cis[i]) {
++                              case LAN_NID:
++                                      ASSERT(cis[i + 1] == 6);
++                                      bcm_ether_ntoa((struct ether_addr *)&cis[i + 2], eabuf);
++                                      vp += sprintf(vp, "il0macaddr=%s", eabuf);
++                                      vp++;
++                                      break;
++                              case 1:         /* SDIO Extended Data */
++                                      vp += sprintf(vp, "sdmaxblk=%d",
++                                                    (cis[i + 13] << 8) | cis[i + 12]);
++                                      vp++;
++                                      break;
++                              }
++                              break;
 +
-+clean:
-+      rm -f vmlinuz piggy
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/generic/int-handler.S linux-2.4.32-brcm/arch/mips/bcm947xx/generic/int-handler.S
---- linux-2.4.32/arch/mips/bcm947xx/generic/int-handler.S      1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/generic/int-handler.S 2005-12-16 23:39:10.668819500 +0100
-@@ -0,0 +1,51 @@
-+/*
-+ * Generic interrupt handler for Broadcom MIPS boards
-+ *
-+ * Copyright 2004, 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: int-handler.S,v 1.1 2005/03/16 13:50:00 wbx Exp $
-+ */
++                      case CISTPL_CFTABLE:
++                              vp += sprintf(vp, "regwindowsz=%d", (cis[i + 7] << 8) | cis[i + 6]);
++                              vp++;
++                              break;
 +
-+#include <linux/config.h>
++                      case CISTPL_BRCM_HNBU:
++                              switch (cis[i]) {
++                              case HNBU_SROMREV:
++                                      sromrev = cis[i + 1];
++                                      break;
 +
-+#include <asm/asm.h>
-+#include <asm/mipsregs.h>
-+#include <asm/regdef.h>
-+#include <asm/stackframe.h>
++                              case HNBU_CHIPID:
++                                      vp += sprintf(vp, "vendid=%d", (cis[i + 2] << 8) +
++                                                    cis[i + 1]);
++                                      vp++;
++                                      vp += sprintf(vp, "devid=%d", (cis[i + 4] << 8) +
++                                                    cis[i + 3]);
++                                      vp++;
++                                      if (tlen == 7) {
++                                              vp += sprintf(vp, "chiprev=%d",
++                                                            (cis[i + 6] << 8) + cis[i + 5]);
++                                              vp++;
++                                      }
++                                      break;
 +
-+/*
-+ *    MIPS IRQ        Source
-+ *      --------        ------
-+ *             0      Software (ignored)
-+ *             1        Software (ignored)
-+ *             2        Combined hardware interrupt (hw0)
-+ *             3        Hardware
-+ *             4        Hardware
-+ *             5        Hardware
-+ *             6        Hardware
-+ *             7        R4k timer
-+ */
++                              case HNBU_BOARDREV:
++                                      vp += sprintf(vp, "boardrev=%d", cis[i + 1]);
++                                      vp++;
++                                      break;
 +
-+      .text
-+      .set    noreorder
-+      .set    noat
-+      .align  5
-+      NESTED(brcmIRQ, PT_SIZE, sp)
-+      SAVE_ALL
-+      CLI
-+      .set    at
-+    .set    noreorder
++                              case HNBU_AA:
++                                      vp += sprintf(vp, "aa2g=%d", cis[i + 1]);
++                                      vp++;
++                                      break;
 +
-+      jal         brcm_irq_dispatch
-+       move   a0, sp
++                              case HNBU_AG:
++                                      vp += sprintf(vp, "ag0=%d", cis[i + 1]);
++                                      vp++;
++                                      ag_init = TRUE;
++                                      break;
 +
-+      j           ret_from_irq
-+       nop
-+              
-+      END(brcmIRQ)
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/generic/irq.c linux-2.4.32-brcm/arch/mips/bcm947xx/generic/irq.c
---- linux-2.4.32/arch/mips/bcm947xx/generic/irq.c      1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/generic/irq.c 2005-12-16 23:39:10.668819500 +0100
-@@ -0,0 +1,130 @@
-+/*
-+ * Generic interrupt control functions for Broadcom MIPS boards
-+ *
-+ * Copyright 2004, 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: irq.c,v 1.1 2005/03/16 13:50:00 wbx Exp $
-+ */
++                              case HNBU_CC:
++                                      ASSERT(sromrev == 1);
++                                      vp += sprintf(vp, "cc=%d", cis[i + 1]);
++                                      vp++;
++                                      break;
 +
-+#include <linux/config.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/interrupt.h>
-+#include <linux/irq.h>
++                              case HNBU_PAPARMS:
++                                      if (tlen == 2) {
++                                              ASSERT(sromrev == 1);
++                                              vp += sprintf(vp, "pa0maxpwr=%d", cis[i + 1]);
++                                              vp++;
++                                      } else if (tlen >= 9) {
++                                              if (tlen == 10) {
++                                                      ASSERT(sromrev == 2);
++                                                      vp += sprintf(vp, "opo=%d", cis[i + 9]);
++                                                      vp++;
++                                              } else
++                                                      ASSERT(tlen == 9);
++
++                                              for (j = 0; j < 3; j++) {
++                                                      vp += sprintf(vp, "pa0b%d=%d", j,
++                                                                    (cis[i + (j * 2) + 2] << 8) +
++                                                                    cis[i + (j * 2) + 1]);
++                                                      vp++;
++                                              }
++                                              vp += sprintf(vp, "pa0itssit=%d", cis[i + 7]);
++                                              vp++;
++                                              vp += sprintf(vp, "pa0maxpwr=%d", cis[i + 8]);
++                                              vp++;
++                                      } else
++                                              ASSERT(tlen >= 9);
++                                      break;
 +
-+#include <asm/irq.h>
-+#include <asm/mipsregs.h>
-+#include <asm/gdb-stub.h>
++                              case HNBU_OEM:
++                                      ASSERT(sromrev == 1);
++                                      vp += sprintf(vp, "oem=%02x%02x%02x%02x%02x%02x%02x%02x",
++                                                    cis[i + 1], cis[i + 2],
++                                                    cis[i + 3], cis[i + 4],
++                                                    cis[i + 5], cis[i + 6],
++                                                    cis[i + 7], cis[i + 8]);
++                                      vp++;
++                                      break;
 +
-+#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
++                              case HNBU_BOARDFLAGS:
++                                      w32 = (cis[i + 2] << 8) + cis[i + 1];
++                                      if (tlen == 5)
++                                              w32 |= (cis[i + 4] << 24) + (cis[i + 3] << 16);
++                                      vp += sprintf(vp, "boardflags=0x%x", w32);
++                                      vp++;
++                                      break;
 +
-+extern asmlinkage void brcmIRQ(void);
-+extern asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs);
++                              case HNBU_LEDS:
++                                      if (cis[i + 1] != 0xff) {
++                                              vp += sprintf(vp, "ledbh0=%d", cis[i + 1]);
++                                              vp++;
++                                      }
++                                      if (cis[i + 2] != 0xff) {
++                                              vp += sprintf(vp, "ledbh1=%d", cis[i + 2]);
++                                              vp++;
++                                      }
++                                      if (cis[i + 3] != 0xff) {
++                                              vp += sprintf(vp, "ledbh2=%d", cis[i + 3]);
++                                              vp++;
++                                      }
++                                      if (cis[i + 4] != 0xff) {
++                                              vp += sprintf(vp, "ledbh3=%d", cis[i + 4]);
++                                              vp++;
++                                      }
++                                      break;
 +
-+void
-+brcm_irq_dispatch(struct pt_regs *regs)
-+{
-+      u32 cause;
++                              case HNBU_CCODE:
++                              {
++                                      char str[3];
++                                      ASSERT(sromrev > 1);
++                                      str[0] = cis[i + 1];
++                                      str[1] = cis[i + 2];
++                                      str[2] = 0;
++                                      vp += sprintf(vp, "ccode=%s", str);
++                                      vp++;
++                                      vp += sprintf(vp, "cctl=0x%x", cis[i + 3]);
++                                      vp++;
++                                      break;
++                              }
 +
-+      cause = read_c0_cause() &
-+              read_c0_status() &
-+              CAUSEF_IP;
++                              case HNBU_CCKPO:
++                                      ASSERT(sromrev > 2);
++                                      vp += sprintf(vp, "cckpo=0x%x",
++                                                    (cis[i + 2] << 8) | cis[i + 1]);
++                                      vp++;
++                                      break;
 +
-+#ifdef CONFIG_KERNPROF
-+      change_c0_status(cause | 1, 1);
-+#else
-+      clear_c0_status(cause);
-+#endif
++                              case HNBU_OFDMPO:
++                                      ASSERT(sromrev > 2);
++                                      vp += sprintf(vp, "ofdmpo=0x%x",
++                                                    (cis[i + 4] << 24) |
++                                                    (cis[i + 3] << 16) |
++                                                    (cis[i + 2] << 8) |
++                                                    cis[i + 1]);
++                                      vp++;
++                                      break;
++                              }
++                              break;
 +
-+      if (cause & CAUSEF_IP7)
-+              do_IRQ(7, regs);
-+      if (cause & CAUSEF_IP2)
-+              do_IRQ(2, regs);
-+      if (cause & CAUSEF_IP3)
-+              do_IRQ(3, regs);
-+      if (cause & CAUSEF_IP4)
-+              do_IRQ(4, regs);
-+      if (cause & CAUSEF_IP5)
-+              do_IRQ(5, regs);
-+      if (cause & CAUSEF_IP6)
-+              do_IRQ(6, regs);
-+}
++                      }
++                      i += tlen;
++              } while (tup != 0xff);
++      }
 +
-+static void
-+enable_brcm_irq(unsigned int irq)
-+{
-+      if (irq < 8)
-+              set_c0_status(1 << (irq + 8));
-+      else
-+              set_c0_status(IE_IRQ0);
-+}
++      /* Set the srom version */
++      vp += sprintf(vp, "sromrev=%d", sromrev);
++      vp++;
 +
-+static void
-+disable_brcm_irq(unsigned int irq)
-+{
-+      if (irq < 8)
-+              clear_c0_status(1 << (irq + 8));
-+      else
-+              clear_c0_status(IE_IRQ0);
-+}
++      /* if there is no antenna gain field, set default */
++      if (ag_init == FALSE) {
++              ASSERT(sromrev == 1);
++              vp += sprintf(vp, "ag0=%d", 0xff);
++              vp++;
++      }
 +
-+static void
-+ack_brcm_irq(unsigned int irq)
-+{
-+      /* Already done in brcm_irq_dispatch */
-+}
++      /* final nullbyte terminator */
++      *vp++ = '\0';
++      varsize = (uint)(vp - base);
 +
-+static unsigned int
-+startup_brcm_irq(unsigned int irq)
-+{ 
-+      enable_brcm_irq(irq);
++      ASSERT((vp - base) < VARS_MAX);
 +
-+      return 0; /* never anything pending */
-+}
++      if (varsize == VARS_MAX) {
++              *vars = base;
++      } else {
++              vp = MALLOC(osh, varsize);
++              ASSERT(vp);
++              if (vp)
++                      bcopy(base, vp, varsize);
++              MFREE(osh, base, VARS_MAX);
++              *vars = vp;
++              if (!vp) {
++                      *count = 0;
++                      return -2;
++              }
++      }
++      *count = varsize;
 +
-+static void
-+end_brcm_irq(unsigned int irq)
-+{
-+      if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-+              enable_brcm_irq(irq);
++      return (0);
 +}
 +
-+static struct hw_interrupt_type brcm_irq_type = {
-+      typename: "MIPS",
-+      startup: startup_brcm_irq,
-+      shutdown: disable_brcm_irq,
-+      enable: enable_brcm_irq,
-+      disable: disable_brcm_irq,
-+      ack: ack_brcm_irq,
-+      end: end_brcm_irq,
-+      NULL
-+};
 +
-+void __init
-+init_IRQ(void)
++/* set PCMCIA sprom command register */
++static int
++sprom_cmd_pcmcia(osl_t *osh, uint8 cmd)
 +{
-+      int i;
++      uint8 status = 0;
++      uint wait_cnt = 1000;
 +
-+      for (i = 0; i < NR_IRQS; i++) {
-+              irq_desc[i].status = IRQ_DISABLED;
-+              irq_desc[i].action = 0;
-+              irq_desc[i].depth = 1;
-+              irq_desc[i].handler = &brcm_irq_type;
-+      }
++      /* write sprom command register */
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_CS, &cmd, 1);
 +
-+      set_except_vector(0, brcmIRQ);
-+      change_c0_status(ST0_IM, ALLINTS);
++      /* wait status */
++      while (wait_cnt--) {
++              OSL_PCMCIA_READ_ATTR(osh, SROM_CS, &status, 1);
++              if (status & SROM_DONE)
++                      return 0;
++      }
 +
-+#ifdef CONFIG_REMOTE_DEBUG
-+      printk("Breaking into debugger...\n");
-+      set_debug_traps();
-+      breakpoint(); 
-+#endif
++      return 1;
 +}
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/generic/Makefile linux-2.4.32-brcm/arch/mips/bcm947xx/generic/Makefile
---- linux-2.4.32/arch/mips/bcm947xx/generic/Makefile   1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/generic/Makefile      2005-12-16 23:39:10.668819500 +0100
-@@ -0,0 +1,15 @@
-+#
-+# Makefile for the BCM947xx specific kernel interface routines
-+# under Linux.
-+#
 +
-+.S.s:
-+      $(CPP) $(AFLAGS) $< -o $*.s
-+.S.o:
-+      $(CC) $(AFLAGS) -c $< -o $*.o
-+
-+O_TARGET        := brcm.o
-+
-+obj-y := int-handler.o irq.o
-+
-+include $(TOPDIR)/Rules.make
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/gpio.c linux-2.4.32-brcm/arch/mips/bcm947xx/gpio.c
---- linux-2.4.32/arch/mips/bcm947xx/gpio.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/gpio.c        2005-12-16 23:39:10.668819500 +0100
-@@ -0,0 +1,158 @@
-+/*
-+ * GPIO char driver
-+ *
-+ * Copyright 2005, 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$
-+ */
++/* read a word from the PCMCIA srom */
++static int
++sprom_read_pcmcia(osl_t *osh, uint16 addr, uint16 *data)
++{
++      uint8 addr_l, addr_h, data_l, data_h;
 +
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/fs.h>
-+#include <linux/miscdevice.h>
-+#include <asm/uaccess.h>
++      addr_l = (uint8)((addr * 2) & 0xff);
++      addr_h = (uint8)(((addr * 2) >> 8) & 0xff);
 +
-+#include <typedefs.h>
-+#include <bcmutils.h>
-+#include <sbutils.h>
-+#include <bcmdevs.h>
++      /* set address */
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRH, &addr_h, 1);
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRL, &addr_l, 1);
 +
-+static sb_t *gpio_sbh;
-+static int gpio_major;
-+static devfs_handle_t gpio_dir;
-+static struct {
-+      char *name;
-+      devfs_handle_t handle;
-+} gpio_file[] = {
-+      { "in", NULL },
-+      { "out", NULL },
-+      { "outen", NULL },
-+      { "control", NULL }
-+};
++      /* do read */
++      if (sprom_cmd_pcmcia(osh, SROM_READ))
++              return 1;
 +
-+static int
-+gpio_open(struct inode *inode, struct file * file)
-+{
-+      if (MINOR(inode->i_rdev) > ARRAYSIZE(gpio_file))
-+              return -ENODEV;
++      /* read data */
++      data_h = data_l = 0;
++      OSL_PCMCIA_READ_ATTR(osh, SROM_DATAH, &data_h, 1);
++      OSL_PCMCIA_READ_ATTR(osh, SROM_DATAL, &data_l, 1);
 +
-+      MOD_INC_USE_COUNT;
++      *data = (data_h << 8) | data_l;
 +      return 0;
 +}
 +
++/* write a word to the PCMCIA srom */
 +static int
-+gpio_release(struct inode *inode, struct file * file)
++sprom_write_pcmcia(osl_t *osh, uint16 addr, uint16 data)
 +{
-+      MOD_DEC_USE_COUNT;
-+      return 0;
-+}
++      uint8 addr_l, addr_h, data_l, data_h;
 +
-+static ssize_t
-+gpio_read(struct file *file, char *buf, size_t count, loff_t *ppos)
-+{
-+      u32 val;
++      addr_l = (uint8)((addr * 2) & 0xff);
++      addr_h = (uint8)(((addr * 2) >> 8) & 0xff);
++      data_l = (uint8)(data & 0xff);
++      data_h = (uint8)((data >> 8) & 0xff);
 +
-+      switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
-+      case 0:
-+              val = sb_gpioin(gpio_sbh);
-+              break;
-+      case 1:
-+              val = sb_gpioout(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
-+              break;
-+      case 2:
-+              val = sb_gpioouten(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
-+              break;
-+      case 3:
-+              val = sb_gpiocontrol(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
-+              break;
-+      default:
-+              return -ENODEV;
-+      }
++      /* set address */
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRH, &addr_h, 1);
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRL, &addr_l, 1);
 +
-+      if (put_user(val, (u32 *) buf))
-+              return -EFAULT;
++      /* write data */
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_DATAH, &data_h, 1);
++      OSL_PCMCIA_WRITE_ATTR(osh, SROM_DATAL, &data_l, 1);
 +
-+      return sizeof(val);
++      /* do write */
++      return sprom_cmd_pcmcia(osh, SROM_WRITE);
 +}
 +
-+static ssize_t
-+gpio_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
++/*
++ * Read in and validate sprom.
++ * Return 0 on success, nonzero on error.
++ */
++static int
++sprom_read_pci(osl_t *osh, uint16 *sprom, uint wordoff, uint16 *buf, uint nwords, bool check_crc)
 +{
-+      u32 val;
++      int err = 0;
++      uint i;
 +
-+      if (get_user(val, (u32 *) buf))
-+              return -EFAULT;
++      /* read the sprom */
++      for (i = 0; i < nwords; i++)
++              buf[i] = R_REG(osh, &sprom[wordoff + i]);
 +
-+      switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
-+      case 0:
-+              return -EACCES;
-+      case 1:
-+              sb_gpioout(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
-+              break;
-+      case 2:
-+              sb_gpioouten(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
-+              break;
-+      case 3:
-+              sb_gpiocontrol(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
-+              break;
-+      default:
-+              return -ENODEV;
++      if (check_crc) {
++              /* fixup the endianness so crc8 will pass */
++              htol16_buf(buf, nwords * 2);
++              if (hndcrc8((uint8*)buf, nwords * 2, CRC8_INIT_VALUE) != CRC8_GOOD_VALUE)
++                      err = 1;
++              /* now correct the endianness of the byte array */
++              ltoh16_buf(buf, nwords * 2);
 +      }
 +
-+      return sizeof(val);
++      return err;
 +}
 +
-+static struct file_operations gpio_fops = {
-+      owner:          THIS_MODULE,
-+      open:           gpio_open,
-+      release:        gpio_release,
-+      read:           gpio_read,
-+      write:          gpio_write,
-+};
++/*
++* Create variable table from memory.
++* Return 0 on success, nonzero on error.
++*/
++static int
++initvars_table(osl_t *osh, char *start, char *end, char **vars, uint *count)
++{
++      int c = (int)(end - start);
 +
-+static int __init
-+gpio_init(void)
++      /* do it only when there is more than just the null string */
++      if (c > 1) {
++              char *vp = MALLOC(osh, c);
++              ASSERT(vp);
++              if (!vp)
++                      return BCME_NOMEM;
++              bcopy(start, vp, c);
++              *vars = vp;
++              *count = c;
++      }
++      else {
++              *vars = NULL;
++              *count = 0;
++      }
++
++      return 0;
++}
++
++/*
++ * Find variables with <devpath> from flash. 'base' points to the beginning
++ * of the table upon enter and to the end of the table upon exit when success.
++ * Return 0 on success, nonzero on error.
++ */
++static int
++initvars_flash(osl_t *osh, char **base, uint len, char *devpath)
 +{
-+      int i;
++      char *vp = *base;
++      char *flash;
++      int err;
++      char *s;
++      uint l, dl, copy_len;
 +
-+      if (!(gpio_sbh = sb_kattach()))
-+              return -ENODEV;
++      /* allocate memory and read in flash */
++      if (!(flash = MALLOC(osh, NVRAM_SPACE)))
++              return BCME_NOMEM;
++      if ((err = nvram_getall(flash, NVRAM_SPACE)))
++              goto exit;
 +
-+      sb_gpiosetcore(gpio_sbh);
++      /* grab vars with the <devpath> prefix in name */
++      dl = strlen(devpath);
++      for (s = flash; s && *s; s += l + 1) {
++              l = strlen(s);
 +
-+      if ((gpio_major = devfs_register_chrdev(0, "gpio", &gpio_fops)) < 0)
-+              return gpio_major;
++              /* skip non-matching variable */
++              if (strncmp(s, devpath, dl))
++                      continue;
 +
-+      gpio_dir = devfs_mk_dir(NULL, "gpio", NULL);
++              /* is there enough room to copy? */
++              copy_len = l - dl + 1;
++              if (len < copy_len) {
++                      err = BCME_BUFTOOSHORT;
++                      goto exit;
++              }
 +
-+      for (i = 0; i < ARRAYSIZE(gpio_file); i++) {
-+              gpio_file[i].handle = devfs_register(gpio_dir,
-+                                                   gpio_file[i].name,
-+                                                   DEVFS_FL_DEFAULT, gpio_major, i,
-+                                                   S_IFCHR | S_IRUGO | S_IWUGO,
-+                                                   &gpio_fops, NULL);
++              /* no prefix, just the name=value */
++              strcpy(vp, &s[dl]);
++              vp += copy_len;
++              len -= copy_len;
 +      }
 +
-+      return 0;
-+}
++      /* add null string as terminator */
++      if (len < 1) {
++              err = BCME_BUFTOOSHORT;
++              goto exit;
++      }
++      *vp++ = '\0';
 +
-+static void __exit
-+gpio_exit(void)
-+{
-+      int i;
++      *base = vp;
 +
-+      for (i = 0; i < ARRAYSIZE(gpio_file); i++)
-+              devfs_unregister(gpio_file[i].handle);
-+      devfs_unregister(gpio_dir);
-+      devfs_unregister_chrdev(gpio_major, "gpio");
-+      sb_detach(gpio_sbh);
++exit: MFREE(osh, flash, NVRAM_SPACE);
++      return err;
 +}
 +
-+module_init(gpio_init);
-+module_exit(gpio_exit);
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmdevs.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmdevs.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmdevs.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmdevs.h     2005-12-16 23:39:10.672819750 +0100
-@@ -0,0 +1,391 @@
 +/*
-+ * Broadcom device-specific manifest constants.
-+ *
-+ * Copyright 2005, 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$
++ * Initialize nonvolatile variable table from flash.
++ * Return 0 on success, nonzero on error.
 + */
++static int
++initvars_flash_sb(void *sbh, char **vars, uint *count)
++{
++      osl_t *osh = sb_osh(sbh);
++      char devpath[SB_DEVPATH_BUFSZ];
++      char *vp, *base;
++      int err;
 +
-+#ifndef       _BCMDEVS_H
-+#define       _BCMDEVS_H
++      ASSERT(vars);
++      ASSERT(count);
 +
++      if ((err = sb_devpath(sbh, devpath, sizeof(devpath))))
++              return err;
 +
-+/* Known PCI vendor Id's */
-+#define       VENDOR_EPIGRAM          0xfeda
-+#define       VENDOR_BROADCOM         0x14e4
-+#define       VENDOR_3COM             0x10b7
-+#define       VENDOR_NETGEAR          0x1385
-+#define       VENDOR_DIAMOND          0x1092
-+#define       VENDOR_DELL             0x1028
-+#define       VENDOR_HP               0x0e11
-+#define       VENDOR_APPLE            0x106b
++      base = vp = MALLOC(osh, VARS_MAX);
++      ASSERT(vp);
++      if (!vp)
++              return BCME_NOMEM;
 +
-+/* PCI Device Id's */
-+#define       BCM4210_DEVICE_ID       0x1072          /* never used */
-+#define       BCM4211_DEVICE_ID       0x4211
-+#define       BCM4230_DEVICE_ID       0x1086          /* never used */
-+#define       BCM4231_DEVICE_ID       0x4231
++      if ((err = initvars_flash(osh, &vp, VARS_MAX, devpath)))
++              goto err;
 +
-+#define       BCM4410_DEVICE_ID       0x4410          /* bcm44xx family pci iline */
-+#define       BCM4430_DEVICE_ID       0x4430          /* bcm44xx family cardbus iline */
-+#define       BCM4412_DEVICE_ID       0x4412          /* bcm44xx family pci enet */
-+#define       BCM4432_DEVICE_ID       0x4432          /* bcm44xx family cardbus enet */
++      err = initvars_table(osh, base, vp, vars, count);
 +
-+#define       BCM3352_DEVICE_ID       0x3352          /* bcm3352 device id */
-+#define       BCM3360_DEVICE_ID       0x3360          /* bcm3360 device id */
++err:  MFREE(osh, base, VARS_MAX);
++      return err;
++}
 +
-+#define       EPI41210_DEVICE_ID      0xa0fa          /* bcm4210 */
-+#define       EPI41230_DEVICE_ID      0xa10e          /* bcm4230 */
++#ifdef WLTEST
++char mfgsromvars[256];
++char *defaultsromvars = "il0macaddr=00:11:22:33:44:51\0"
++              "et0macaddr=00:11:22:33:44:52\0"
++              "et1macaddr=00:11:22:33:44:53\0"
++              "boardtype=0xffff\0"
++              "boardrev=0x10\0"
++              "boardflags=8\0"
++              "sromrev=2\0"
++              "aa2g=3";
++#define       MFGSROM_DEFVARSLEN      147 /* default srom len */
++#endif /* WL_TEST */
 +
-+#define       BCM47XX_ILINE_ID        0x4711          /* 47xx iline20 */
-+#define       BCM47XX_V90_ID          0x4712          /* 47xx v90 codec */
-+#define       BCM47XX_ENET_ID         0x4713          /* 47xx enet */
-+#define       BCM47XX_EXT_ID          0x4714          /* 47xx external i/f */
-+#define       BCM47XX_USB_ID          0x4715          /* 47xx usb */
-+#define       BCM47XX_USBH_ID         0x4716          /* 47xx usb host */
-+#define       BCM47XX_USBD_ID         0x4717          /* 47xx usb device */
-+#define       BCM47XX_IPSEC_ID        0x4718          /* 47xx ipsec */
-+#define       BCM47XX_ROBO_ID         0x4719          /* 47xx/53xx roboswitch core */
-+#define       BCM47XX_USB20H_ID       0x471a          /* 47xx usb 2.0 host */
-+#define       BCM47XX_USB20D_ID       0x471b          /* 47xx usb 2.0 device */
++/*
++ * Initialize nonvolatile variable table from sprom.
++ * Return 0 on success, nonzero on error.
++ */
++static int
++initvars_srom_pci(void *sbh, void *curmap, char **vars, uint *count)
++{
++      uint16 w, *b;
++      uint8 sromrev = 0;
++      struct ether_addr ea;
++      char eabuf[32];
++      uint32 w32;
++      int woff, i;
++      char *vp, *base;
++      osl_t *osh = sb_osh(sbh);
++      bool flash = FALSE;
++      char name[SB_DEVPATH_BUFSZ+16], *value;
++      char devpath[SB_DEVPATH_BUFSZ];
++      int err;
 +
-+#define       BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
++      /*
++       * Apply CRC over SROM content regardless SROM is present or not,
++       * and use variable <devpath>sromrev's existance in flash to decide
++       * if we should return an error when CRC fails or read SROM variables
++       * from flash.
++       */
++      b = MALLOC(osh, SROM_MAX);
++      ASSERT(b);
++      if (!b)
++              return -2;
 +
-+#define       BCM4610_DEVICE_ID       0x4610          /* 4610 primary function 0 */
-+#define       BCM4610_ILINE_ID        0x4611          /* 4610 iline100 */
-+#define       BCM4610_V90_ID          0x4612          /* 4610 v90 codec */
-+#define       BCM4610_ENET_ID         0x4613          /* 4610 enet */
-+#define       BCM4610_EXT_ID          0x4614          /* 4610 external i/f */
-+#define       BCM4610_USB_ID          0x4615          /* 4610 usb */
++      err = sprom_read_pci(osh, (void*)((int8*)curmap + PCI_BAR0_SPROM_OFFSET), 0, b,
++                           64, TRUE);
++      if (err == 0) {
++              /* srom is good and is rev < 4 */
++              /* top word of sprom contains version and crc8 */
++              sromrev = b[63] & 0xff;
++              /* bcm4401 sroms misprogrammed */
++              if (sromrev == 0x10)
++                      sromrev = 1;
++      } else if (b[SROM4_SIGN] == SROM4_SIGNATURE) {
++              /* If sromrev >= 4, read more */
++              err = sprom_read_pci(osh, (void*)((int8*)curmap + PCI_BAR0_SPROM_OFFSET), 0, b,
++                                   SROM4_WORDS, TRUE);
++              sromrev = b[SROM4_WORDS - 1] & 0xff;
++      }
++
++      if (err) {
++#ifdef WLTEST
++              BS_ERROR(("SROM Crc Error, so see if we could use a default\n"));
++              w32 = OSL_PCI_READ_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32));
++              if (w32 & SPROM_OTPIN_USE) {
++                      BS_ERROR(("srom crc failed with OTP, use default vars....\n"));
++                      vp = base =  mfgsromvars;
++                      if (sb_chip(sbh) == BCM4311_CHIP_ID) {
++                              BS_ERROR(("setting the devid to be 4311\n"));
++                              vp += sprintf(vp, "devid=0x4311");
++                              vp++;
++                      }
++                      bcopy(defaultsromvars,  vp, MFGSROM_DEFVARSLEN);
++                      vp += MFGSROM_DEFVARSLEN;
++                      goto varsdone;
++              } else {
++                      BS_ERROR(("srom crc failed with SPROM....\n"));
++#endif /* WLTEST */
++                      if ((err = sb_devpath(sbh, devpath, sizeof(devpath))))
++                              return err;
++                      sprintf(name, "%ssromrev", devpath);
++                      if (!(value = getvar(NULL, name)))
++                              return (-1);
++                      sromrev = (uint8)bcm_strtoul(value, NULL, 0);
++                      flash = TRUE;
++#ifdef WLTEST
++              }
++#endif /* WLTEST */
++      }
 +
-+#define       BCM4402_DEVICE_ID       0x4402          /* 4402 primary function 0 */
-+#define       BCM4402_ENET_ID         0x4402          /* 4402 enet */
-+#define       BCM4402_V90_ID          0x4403          /* 4402 v90 codec */
-+#define       BCM4401_ENET_ID         0x170c          /* 4401b0 production enet cards */
++      /* srom version check */
++      if (sromrev > 4)
++              return (-2);
 +
-+#define       BCM4301_DEVICE_ID       0x4301          /* 4301 primary function 0 */
-+#define       BCM4301_D11B_ID         0x4301          /* 4301 802.11b */
++      ASSERT(vars);
++      ASSERT(count);
 +
-+#define       BCM4307_DEVICE_ID       0x4307          /* 4307 primary function 0 */
-+#define       BCM4307_V90_ID          0x4305          /* 4307 v90 codec */
-+#define       BCM4307_ENET_ID         0x4306          /* 4307 enet */
-+#define       BCM4307_D11B_ID         0x4307          /* 4307 802.11b */
++      base = vp = MALLOC(osh, VARS_MAX);
++      ASSERT(vp);
++      if (!vp)
++              return -2;
 +
-+#define       BCM4306_DEVICE_ID       0x4306          /* 4306 chipcommon chipid */
-+#define       BCM4306_D11G_ID         0x4320          /* 4306 802.11g */
-+#define       BCM4306_D11G_ID2        0x4325          
-+#define       BCM4306_D11A_ID         0x4321          /* 4306 802.11a */
-+#define       BCM4306_UART_ID         0x4322          /* 4306 uart */
-+#define       BCM4306_V90_ID          0x4323          /* 4306 v90 codec */
-+#define       BCM4306_D11DUAL_ID      0x4324          /* 4306 dual A+B */
++      /* read variables from flash */
++      if (flash) {
++              if ((err = initvars_flash(osh, &vp, VARS_MAX, devpath)))
++                      goto err;
++              goto varsdone;
++      }
 +
-+#define       BCM4309_PKG_ID          1               /* 4309 package id */
++      vp += sprintf(vp, "sromrev=%d", sromrev);
++      vp++;
 +
-+#define       BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
-+#define       BCM4303_PKG_ID          2               /* 4303 package id */
++      if (sromrev >= 4) {
++              uint path, pathbase;
++              const uint pathbases[MAX_PATH] = {SROM4_PATH0, SROM4_PATH1,
++                                                SROM4_PATH2, SROM4_PATH3};
 +
-+#define       BCM4310_DEVICE_ID       0x4310          /* 4310 chipcommon chipid */
-+#define       BCM4310_D11B_ID         0x4311          /* 4310 802.11b */
-+#define       BCM4310_UART_ID         0x4312          /* 4310 uart */
-+#define       BCM4310_ENET_ID         0x4313          /* 4310 enet */
-+#define       BCM4310_USB_ID          0x4315          /* 4310 usb */
-+
-+#define       BCMGPRS_UART_ID         0x4333          /* Uart id used by 4306/gprs card */
-+#define       BCMGPRS2_UART_ID        0x4344          /* Uart id used by 4306/gprs card */
-+
-+
-+#define       BCM4704_DEVICE_ID       0x4704          /* 4704 chipcommon chipid */
-+#define       BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
++              vp += sprintf(vp, "boardrev=%d", b[SROM4_BREV]);
++              vp++;
 +
-+#define       BCM4317_DEVICE_ID       0x4317          /* 4317 chip common chipid */
++              vp += sprintf(vp, "boardflags=%d", (b[SROM4_BFL1] << 16) | b[SROM4_BFL0]);
++              vp++;
 +
-+#define       BCM4318_DEVICE_ID       0x4318          /* 4318 chip common chipid */
-+#define       BCM4318_D11G_ID         0x4318          /* 4318 801.11b/g id */
-+#define       BCM4318_D11DUAL_ID      0x4319          /* 4318 801.11a/b/g id */
-+#define BCM4318_JTAGM_ID      0x4331          /* 4318 jtagm device id */
++              vp += sprintf(vp, "boardflags2=%d", (b[SROM4_BFL3] << 16) | b[SROM4_BFL2]);
++              vp++;
 +
-+#define FPGA_JTAGM_ID         0x4330          /* ??? */
++              /* The macaddr */
++              ea.octet[0] = (b[SROM4_MACHI] >> 8) & 0xff;
++              ea.octet[1] = b[SROM4_MACHI] & 0xff;
++              ea.octet[2] = (b[SROM4_MACMID] >> 8) & 0xff;
++              ea.octet[3] = b[SROM4_MACMID] & 0xff;
++              ea.octet[4] = (b[SROM4_MACLO] >> 8) & 0xff;
++              ea.octet[5] = b[SROM4_MACLO] & 0xff;
++              bcm_ether_ntoa(&ea, eabuf);
++              vp += sprintf(vp, "macaddr=%s", eabuf);
++              vp++;
 +
-+/* Address map */
-+#define BCM4710_SDRAM           0x00000000      /* Physical SDRAM */
-+#define BCM4710_PCI_MEM         0x08000000      /* Host Mode PCI memory access space (64 MB) */
-+#define BCM4710_PCI_CFG         0x0c000000      /* Host Mode PCI configuration space (64 MB) */
-+#define BCM4710_PCI_DMA         0x40000000      /* Client Mode PCI memory access space (1 GB) */
-+#define BCM4710_SDRAM_SWAPPED   0x10000000      /* Byteswapped Physical SDRAM */
-+#define BCM4710_ENUM            0x18000000      /* Beginning of core enumeration space */
++              w = b[SROM4_CCODE];
++              if (w == 0)
++                      vp += sprintf(vp, "ccode=");
++              else
++                      vp += sprintf(vp, "ccode=%c%c", (w >> 8), (w & 0xff));
++              vp++;
++              vp += sprintf(vp, "regrev=%d", b[SROM4_REGREV]);
++              vp++;
 +
-+/* Core register space */
-+#define BCM4710_REG_SDRAM       0x18000000      /* SDRAM core registers */
-+#define BCM4710_REG_ILINE20     0x18001000      /* InsideLine20 core registers */
-+#define BCM4710_REG_EMAC0       0x18002000      /* Ethernet MAC 0 core registers */
-+#define BCM4710_REG_CODEC       0x18003000      /* Codec core registers */
-+#define BCM4710_REG_USB         0x18004000      /* USB core registers */
-+#define BCM4710_REG_PCI         0x18005000      /* PCI core registers */
-+#define BCM4710_REG_MIPS        0x18006000      /* MIPS core registers */
-+#define BCM4710_REG_EXTIF       0x18007000      /* External Interface core registers */
-+#define BCM4710_REG_EMAC1       0x18008000      /* Ethernet MAC 1 core registers */
++              w = b[SROM4_LEDBH10];
++              if ((w != 0) && (w != 0xffff)) {
++                      /* ledbh0 */
++                      vp += sprintf(vp, "ledbh0=%d", (w & 0xff));
++                      vp++;
 +
-+#define BCM4710_EXTIF           0x1f000000      /* External Interface base address */
-+#define BCM4710_PCMCIA_MEM      0x1f000000      /* External Interface PCMCIA memory access */
-+#define BCM4710_PCMCIA_IO       0x1f100000      /* PCMCIA I/O access */
-+#define BCM4710_PCMCIA_CONF     0x1f200000      /* PCMCIA configuration */
-+#define BCM4710_PROG            0x1f800000      /* Programable interface */
-+#define BCM4710_FLASH           0x1fc00000      /* Flash */
++                      /* ledbh1 */
++                      vp += sprintf(vp, "ledbh1=%d", (w >> 8) & 0xff);
++                      vp++;
++              }
++              w = b[SROM4_LEDBH32];
++              if ((w != 0) && (w != 0xffff)) {
++                      /* ledbh2 */
++                      vp += sprintf(vp, "ledbh2=%d", w & 0xff);
++                      vp++;
 +
-+#define BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
++                      /* ledbh3 */
++                      vp += sprintf(vp, "ledbh3=%d", (w >> 8) & 0xff);
++                      vp++;
++              }
++              /* LED Powersave duty cycle (oncount >> 24) (offcount >> 8) */
++              w = b[SROM4_LEDDC];
++              w32 = ((uint32)((unsigned char)(w >> 8) & 0xff) << 24) |  /* oncount */
++                      ((uint32)((unsigned char)(w & 0xff)) << 8); /* offcount */
++              vp += sprintf(vp, "leddc=%d", w32);
++              vp++;
 +
-+#define BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
++              w = b[SROM4_AA];
++              vp += sprintf(vp, "aa2g=%d", w & SROM4_AA2G_MASK);
++              vp++;
++              vp += sprintf(vp, "aa5g=%d", w >> SROM4_AA5G_SHIFT);
++              vp++;
 +
-+#define BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
-+#define BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
++              w = b[SROM4_AG10];
++              vp += sprintf(vp, "ag0=%d", w & 0xff);
++              vp++;
++              vp += sprintf(vp, "ag1=%d", (w >> 8) & 0xff);
++              vp++;
++              w = b[SROM4_AG32];
++              vp += sprintf(vp, "ag2=%d", w & 0xff);
++              vp++;
++              vp += sprintf(vp, "ag3=%d", (w >> 8) & 0xff);
++              vp++;
 +
-+#define       BCM4712_DEVICE_ID       0x4712          /* 4712 chipcommon chipid */
-+#define       BCM4712_MIPS_ID         0x4720          /* 4712 base devid */
-+#define       BCM4712LARGE_PKG_ID     0               /* 340pin 4712 package id */
-+#define       BCM4712SMALL_PKG_ID     1               /* 200pin 4712 package id */
-+#define       BCM4712MID_PKG_ID       2               /* 225pin 4712 package id */
++              /* Fixed power indices when power control is disabled */
++              for (i = 0; i < 2; i++) {
++                      w = b[SROM4_TXPID2G + i];
++                      vp += sprintf(vp, "txpid2ga%d=%d", 2 * i, w & 0xff);
++                      vp++;
++                      vp += sprintf(vp, "txpid2ga%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
++                      vp++;
++                      w = b[SROM4_TXPID5G + i];
++                      vp += sprintf(vp, "txpid5ga%d=%d", 2 * i, w & 0xff);
++                      vp++;
++                      vp += sprintf(vp, "txpid5ga%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
++                      vp++;
++                      w = b[SROM4_TXPID5GL + i];
++                      vp += sprintf(vp, "txpid5gla%d=%d", 2 * i, w & 0xff);
++                      vp++;
++                      vp += sprintf(vp, "txpid5gla%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
++                      vp++;
++                      w = b[SROM4_TXPID5GH + i];
++                      vp += sprintf(vp, "txpid5gha%d=%d", 2 * i, w & 0xff);
++                      vp++;
++                      vp += sprintf(vp, "txpid5gha%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
++                      vp++;
++              }
 +
-+#define       SDIOH_FPGA_ID           0x4380          /* sdio host fpga */
++              /* Per path variables */
++              for (path = 0; path < MAX_PATH; path++) {
++                      pathbase = pathbases[path];
++                      w = b[pathbase + SROM4_2G_ITT_MAXP];
++                      vp += sprintf(vp, "itt2ga%d=%d", path, w >> B2G_ITT_SHIFT);
++                      vp++;
++                      vp += sprintf(vp, "maxp2ga%d=%d", path, w & B2G_MAXP_MASK);
++                      vp++;
 +
-+#define BCM5365_DEVICE_ID       0x5365          /* 5365 chipcommon chipid */
-+#define       BCM5350_DEVICE_ID       0x5350          /* bcm5350 chipcommon chipid */
-+#define       BCM5352_DEVICE_ID       0x5352          /* bcm5352 chipcommon chipid */
++                      for (i = 0; i < 4; i++) {
++                              vp += sprintf(vp, "pa2gw%da%d=%d", i, path,
++                                            b[pathbase + SROM4_2G_PA + i]);
++                              vp++;
++                      }
 +
-+#define       BCM4320_DEVICE_ID       0x4320          /* bcm4320 chipcommon chipid */
++                      w = b[pathbase + SROM4_5G_ITT_MAXP];
++                      vp += sprintf(vp, "itt5ga%d=%d", path, w >> B5G_ITT_SHIFT);
++                      vp++;
++                      vp += sprintf(vp, "maxp5ga%d=%d", path, w & B5G_MAXP_MASK);
++                      vp++;
 +
-+/* PCMCIA vendor Id's */
++                      w = b[pathbase + SROM4_5GLH_MAXP];
++                      vp += sprintf(vp, "maxp5lga%d=%d", path, w >> B5GL_MAXP_SHIFT);
++                      vp++;
++                      vp += sprintf(vp, "maxp5gha%d=%d", path, w & B5GH_MAXP_MASK);
++                      vp++;
 +
-+#define       VENDOR_BROADCOM_PCMCIA  0x02d0
++                      for (i = 0; i < 4; i++) {
++                              vp += sprintf(vp, "pa5gw%da%d=%d", i, path,
++                                            b[pathbase + SROM4_5G_PA + i]);
++                              vp++;
++                              vp += sprintf(vp, "pa5glw%da%d=%d", i, path,
++                                            b[pathbase + SROM4_5GL_PA + i]);
++                              vp++;
++                              vp += sprintf(vp, "pa5hgw%da%d=%d", i, path,
++                                            b[pathbase + SROM4_5GH_PA + i]);
++                              vp++;
++                      }
++              }
 +
-+/* SDIO vendor Id's */
-+#define       VENDOR_BROADCOM_SDIO    0x00BF
++              vp += sprintf(vp, "cck2gpo=%d", b[SROM4_2G_CCKPO]);
++              vp++;
 +
++              w32 = ((uint32)b[SROM4_2G_OFDMPO + 1] << 16) | b[SROM4_2G_OFDMPO];
++              vp += sprintf(vp, "ofdm2gpo=%d", w32);
++              vp++;
 +
-+/* boardflags */
-+#define       BFL_BTCOEXIST           0x0001  /* This board implements Bluetooth coexistance */
-+#define       BFL_PACTRL              0x0002  /* This board has gpio 9 controlling the PA */
-+#define       BFL_AIRLINEMODE         0x0004  /* This board implements gpio13 radio disable indication */
-+#define       BFL_ENETROBO            0x0010  /* This board has robo switch or core */
-+#define       BFL_CCKHIPWR            0x0040  /* Can do high-power CCK transmission */
-+#define       BFL_ENETADM             0x0080  /* This board has ADMtek switch */
-+#define       BFL_ENETVLAN            0x0100  /* This board has vlan capability */
-+#define       BFL_AFTERBURNER         0x0200  /* This board supports Afterburner mode */
-+#define BFL_NOPCI             0x0400  /* This board leaves PCI floating */
-+#define BFL_FEM                       0x0800  /* This board supports the Front End Module */
-+#define BFL_EXTLNA            0x1000  /* This board has an external LNA */
-+#define BFL_HGPA              0x2000  /* This board has a high gain PA */
-+#define       BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
-+#define       BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
++              w32 = ((uint32)b[SROM4_5G_OFDMPO + 1] << 16) | b[SROM4_5G_OFDMPO];
++              vp += sprintf(vp, "ofdm5gpo=%d", w32);
++              vp++;
 +
-+/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */
-+#define BOARD_GPIO_HWRAD_B    0x010   /* bit 4 is HWRAD input on 4301 */
-+#define       BOARD_GPIO_BTCMOD_IN    0x010   /* bit 4 is the alternate BT Coexistance Input */
-+#define       BOARD_GPIO_BTCMOD_OUT   0x020   /* bit 5 is the alternate BT Coexistance Out */
-+#define       BOARD_GPIO_BTC_IN       0x080   /* bit 7 is BT Coexistance Input */
-+#define       BOARD_GPIO_BTC_OUT      0x100   /* bit 8 is BT Coexistance Out */
-+#define       BOARD_GPIO_PACTRL       0x200   /* bit 9 controls the PA on new 4306 boards */
-+#define       PCI_CFG_GPIO_SCS        0x10    /* PCI config space bit 4 for 4306c0 slow clock source */
-+#define PCI_CFG_GPIO_HWRAD    0x20    /* PCI config space GPIO 13 for hw radio disable */
-+#define PCI_CFG_GPIO_XTAL     0x40    /* PCI config space GPIO 14 for Xtal powerup */
-+#define PCI_CFG_GPIO_PLL      0x80    /* PCI config space GPIO 15 for PLL powerdown */
++              w32 = ((uint32)b[SROM4_5GL_OFDMPO + 1] << 16) | b[SROM4_5GL_OFDMPO];
++              vp += sprintf(vp, "ofdm5glpo=%d", w32);
++              vp++;
 +
-+/* Bus types */
-+#define       SB_BUS                  0       /* Silicon Backplane */
-+#define       PCI_BUS                 1       /* PCI target */
-+#define       PCMCIA_BUS              2       /* PCMCIA target */
-+#define SDIO_BUS              3       /* SDIO target */
-+#define JTAG_BUS              4       /* JTAG */
++              w32 = ((uint32)b[SROM4_5GH_OFDMPO + 1] << 16) | b[SROM4_5GH_OFDMPO];
++              vp += sprintf(vp, "ofdm5ghpo=%d", w32);
++              vp++;
 +
-+/* Allows optimization for single-bus support */
-+#ifdef BCMBUSTYPE
-+#define BUSTYPE(bus) (BCMBUSTYPE)
-+#else
-+#define BUSTYPE(bus) (bus)
-+#endif
++              for (i = 0; i < 8; i++) {
++                      vp += sprintf(vp, "mcs2gpo%d=%d", i, b[SROM4_2G_MCSPO]);
++                      vp++;
++                      vp += sprintf(vp, "mcs5gpo%d=%d", i, b[SROM4_5G_MCSPO]);
++                      vp++;
++                      vp += sprintf(vp, "mcs5glpo%d=%d", i, b[SROM4_5GL_MCSPO]);
++                      vp++;
++                      vp += sprintf(vp, "mcs5ghpo%d=%d", i, b[SROM4_5GH_MCSPO]);
++                      vp++;
++              }
 +
-+/* power control defines */
-+#define PLL_DELAY             150             /* us pll on delay */
-+#define FREF_DELAY            200             /* us fref change delay */
-+#define MIN_SLOW_CLK          32              /* us Slow clock period */
-+#define       XTAL_ON_DELAY           1000            /* us crystal power-on delay */
++              vp += sprintf(vp, "ccdpo%d=%d", i, b[SROM4_CCDPO]);
++              vp++;
++              vp += sprintf(vp, "stbcpo%d=%d", i, b[SROM4_STBCPO]);
++              vp++;
++              vp += sprintf(vp, "bw40po%d=%d", i, b[SROM4_BW40PO]);
++              vp++;
++              vp += sprintf(vp, "bwduppo%d=%d", i, b[SROM4_BWDUPPO]);
++              vp++;
 +
-+/* Reference Board Types */
++              goto done;
++      }
++      if (sromrev >= 3) {
++              /* New section takes over the 3th hardware function space */
 +
-+#define       BU4710_BOARD            0x0400
-+#define       VSIM4710_BOARD          0x0401
-+#define       QT4710_BOARD            0x0402
++              /* Words 22+23 are 11a (mid) ofdm power offsets */
++              w32 = ((uint32)b[23] << 16) | b[22];
++              vp += sprintf(vp, "ofdmapo=%d", w32);
++              vp++;
 +
-+#define       BU4610_BOARD            0x0403
-+#define       VSIM4610_BOARD          0x0404
++              /* Words 24+25 are 11a (low) ofdm power offsets */
++              w32 = ((uint32)b[25] << 16) | b[24];
++              vp += sprintf(vp, "ofdmalpo=%d", w32);
++              vp++;
 +
-+#define       BU4307_BOARD            0x0405
-+#define       BCM94301CB_BOARD        0x0406
-+#define       BCM94301PC_BOARD        0x0406          /* Pcmcia 5v card */
-+#define       BCM94301MP_BOARD        0x0407
-+#define       BCM94307MP_BOARD        0x0408
-+#define       BCMAP4307_BOARD         0x0409
++              /* Words 26+27 are 11a (high) ofdm power offsets */
++              w32 = ((uint32)b[27] << 16) | b[26];
++              vp += sprintf(vp, "ofdmahpo=%d", w32);
++              vp++;
 +
-+#define       BU4309_BOARD            0x040a
-+#define       BCM94309CB_BOARD        0x040b
-+#define       BCM94309MP_BOARD        0x040c
-+#define       BCM4309AP_BOARD         0x040d
++              /* LED Powersave duty cycle (oncount >> 24) (offcount >> 8) */
++              w32 = ((uint32)((unsigned char)(b[21] >> 8) & 0xff) << 24) |  /* oncount */
++                      ((uint32)((unsigned char)(b[21] & 0xff)) << 8); /* offcount */
++              vp += sprintf(vp, "leddc=%d", w32);
 +
-+#define       BCM94302MP_BOARD        0x040e
++              vp++;
++      }
 +
-+#define       VSIM4310_BOARD          0x040f
-+#define       BU4711_BOARD            0x0410
-+#define       BCM94310U_BOARD         0x0411
-+#define       BCM94310AP_BOARD        0x0412
-+#define       BCM94310MP_BOARD        0x0414
++      if (sromrev >= 2) {
++              /* New section takes over the 4th hardware function space */
 +
-+#define       BU4306_BOARD            0x0416
-+#define       BCM94306CB_BOARD        0x0417
-+#define       BCM94306MP_BOARD        0x0418
++              /* Word 29 is max power 11a high/low */
++              w = b[29];
++              vp += sprintf(vp, "pa1himaxpwr=%d", w & 0xff);
++              vp++;
++              vp += sprintf(vp, "pa1lomaxpwr=%d", (w >> 8) & 0xff);
++              vp++;
 +
-+#define       BCM94710D_BOARD         0x041a
-+#define       BCM94710R1_BOARD        0x041b
-+#define       BCM94710R4_BOARD        0x041c
-+#define       BCM94710AP_BOARD        0x041d
++              /* Words 30-32 set the 11alow pa settings,
++               * 33-35 are the 11ahigh ones.
++               */
++              for (i = 0; i < 3; i++) {
++                      vp += sprintf(vp, "pa1lob%d=%d", i, b[30 + i]);
++                      vp++;
++                      vp += sprintf(vp, "pa1hib%d=%d", i, b[33 + i]);
++                      vp++;
++              }
++              w = b[59];
++              if (w == 0)
++                      vp += sprintf(vp, "ccode=");
++              else
++                      vp += sprintf(vp, "ccode=%c%c", (w >> 8), (w & 0xff));
++              vp++;
 +
++      }
 +
-+#define       BU2050_BOARD            0x041f
++      /* parameter section of sprom starts at byte offset 72 */
++      woff = 72/2;
 +
++      /* first 6 bytes are il0macaddr */
++      ea.octet[0] = (b[woff] >> 8) & 0xff;
++      ea.octet[1] = b[woff] & 0xff;
++      ea.octet[2] = (b[woff+1] >> 8) & 0xff;
++      ea.octet[3] = b[woff+1] & 0xff;
++      ea.octet[4] = (b[woff+2] >> 8) & 0xff;
++      ea.octet[5] = b[woff+2] & 0xff;
++      woff += 3;
++      bcm_ether_ntoa(&ea, eabuf);
++      vp += sprintf(vp, "il0macaddr=%s", eabuf);
++      vp++;
 +
-+#define       BCM94309G_BOARD         0x0421
++      /* next 6 bytes are et0macaddr */
++      ea.octet[0] = (b[woff] >> 8) & 0xff;
++      ea.octet[1] = b[woff] & 0xff;
++      ea.octet[2] = (b[woff+1] >> 8) & 0xff;
++      ea.octet[3] = b[woff+1] & 0xff;
++      ea.octet[4] = (b[woff+2] >> 8) & 0xff;
++      ea.octet[5] = b[woff+2] & 0xff;
++      woff += 3;
++      bcm_ether_ntoa(&ea, eabuf);
++      vp += sprintf(vp, "et0macaddr=%s", eabuf);
++      vp++;
 +
-+#define       BCM94301PC3_BOARD       0x0422          /* Pcmcia 3.3v card */
-+
-+#define       BU4704_BOARD            0x0423
-+#define       BU4702_BOARD            0x0424
++      /* next 6 bytes are et1macaddr */
++      ea.octet[0] = (b[woff] >> 8) & 0xff;
++      ea.octet[1] = b[woff] & 0xff;
++      ea.octet[2] = (b[woff+1] >> 8) & 0xff;
++      ea.octet[3] = b[woff+1] & 0xff;
++      ea.octet[4] = (b[woff+2] >> 8) & 0xff;
++      ea.octet[5] = b[woff+2] & 0xff;
++      woff += 3;
++      bcm_ether_ntoa(&ea, eabuf);
++      vp += sprintf(vp, "et1macaddr=%s", eabuf);
++      vp++;
 +
-+#define       BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
++      /*
++       * Enet phy settings one or two singles or a dual
++       * Bits 4-0 : MII address for enet0 (0x1f for not there)
++       * Bits 9-5 : MII address for enet1 (0x1f for not there)
++       * Bit 14   : Mdio for enet0
++       * Bit 15   : Mdio for enet1
++       */
++      w = b[woff];
++      vp += sprintf(vp, "et0phyaddr=%d", (w & 0x1f));
++      vp++;
++      vp += sprintf(vp, "et1phyaddr=%d", ((w >> 5) & 0x1f));
++      vp++;
++      vp += sprintf(vp, "et0mdcport=%d", ((w >> 14) & 0x1));
++      vp++;
++      vp += sprintf(vp, "et1mdcport=%d", ((w >> 15) & 0x1));
++      vp++;
 +
-+#define       BU4317_BOARD            0x0426
++      /* Word 46 has board rev, antennas 0/1 & Country code/control */
++      w = b[46];
++      vp += sprintf(vp, "boardrev=%d", w & 0xff);
++      vp++;
 +
++      if (sromrev > 1)
++              vp += sprintf(vp, "cctl=%d", (w >> 8) & 0xf);
++      else
++              vp += sprintf(vp, "cc=%d", (w >> 8) & 0xf);
++      vp++;
 +
-+#define       BCM94702MN_BOARD        0x0428
++      vp += sprintf(vp, "aa2g=%d", (w >> 12) & 0x3);
++      vp++;
 +
-+/* BCM4702 1U CompactPCI Board */
-+#define       BCM94702CPCI_BOARD      0x0429
++      vp += sprintf(vp, "aa5g=%d", (w >> 14) & 0x3);
++      vp++;
 +
-+/* BCM4702 with BCM95380 VLAN Router */
-+#define       BCM95380RR_BOARD        0x042a
++      /* Words 47-49 set the (wl) pa settings */
++      woff = 47;
 +
-+/* cb4306 with SiGe PA */
-+#define       BCM94306CBSG_BOARD      0x042b
++      for (i = 0; i < 3; i++) {
++              vp += sprintf(vp, "pa0b%d=%d", i, b[woff+i]);
++              vp++;
++              vp += sprintf(vp, "pa1b%d=%d", i, b[woff+i+6]);
++              vp++;
++      }
 +
-+/* mp4301 with 2050 radio */
-+#define       BCM94301MPL_BOARD       0x042c
++      /*
++       * Words 50-51 set the customer-configured wl led behavior.
++       * 8 bits/gpio pin.  High bit:  activehi=0, activelo=1;
++       * LED behavior values defined in wlioctl.h .
++       */
++      w = b[50];
++      if ((w != 0) && (w != 0xffff)) {
++              /* ledbh0 */
++              vp += sprintf(vp, "ledbh0=%d", (w & 0xff));
++              vp++;
 +
-+/* cb4306 with SiGe PA */
-+#define       PCSG94306_BOARD         0x042d
++              /* ledbh1 */
++              vp += sprintf(vp, "ledbh1=%d", (w >> 8) & 0xff);
++              vp++;
++      }
++      w = b[51];
++      if ((w != 0) && (w != 0xffff)) {
++              /* ledbh2 */
++              vp += sprintf(vp, "ledbh2=%d", w & 0xff);
++              vp++;
 +
-+/* bu4704 with sdram */
-+#define       BU4704SD_BOARD          0x042e
++              /* ledbh */
++              vp += sprintf(vp, "ledbh3=%d", (w >> 8) & 0xff);
++              vp++;
++      }
 +
-+/* Dual 11a/11g Router */
-+#define       BCM94704AGR_BOARD       0x042f
++      /* Word 52 is max power 0/1 */
++      w = b[52];
++      vp += sprintf(vp, "pa0maxpwr=%d", w & 0xff);
++      vp++;
++      vp += sprintf(vp, "pa1maxpwr=%d", (w >> 8) & 0xff);
++      vp++;
 +
-+/* 11a-only minipci */
-+#define       BCM94308MP_BOARD        0x0430
++      /* Word 56 is idle tssi target 0/1 */
++      w = b[56];
++      vp += sprintf(vp, "pa0itssit=%d", w & 0xff);
++      vp++;
++      vp += sprintf(vp, "pa1itssit=%d", (w >> 8) & 0xff);
++      vp++;
 +
++      /* Word 57 is boardflags, if not programmed make it zero */
++      w32 = (uint32)b[57];
++      if (w32 == 0xffff) w32 = 0;
++      if (sromrev > 1) {
++              /* Word 28 is the high bits of boardflags */
++              w32 |= (uint32)b[28] << 16;
++      }
++      vp += sprintf(vp, "boardflags=%d", w32);
++      vp++;
 +
++      /* Word 58 is antenna gain 0/1 */
++      w = b[58];
++      vp += sprintf(vp, "ag0=%d", w & 0xff);
++      vp++;
 +
-+/* BCM94317 boards */
-+#define BCM94317CB_BOARD      0x0440
-+#define BCM94317MP_BOARD      0x0441
-+#define BCM94317PCMCIA_BOARD  0x0442
-+#define BCM94317SDIO_BOARD    0x0443
++      vp += sprintf(vp, "ag1=%d", (w >> 8) & 0xff);
++      vp++;
 +
-+#define BU4712_BOARD          0x0444
-+#define       BU4712SD_BOARD          0x045d
-+#define       BU4712L_BOARD           0x045f
++      if (sromrev == 1) {
++              /* set the oem string */
++              vp += sprintf(vp, "oem=%02x%02x%02x%02x%02x%02x%02x%02x",
++                            ((b[59] >> 8) & 0xff), (b[59] & 0xff),
++                            ((b[60] >> 8) & 0xff), (b[60] & 0xff),
++                            ((b[61] >> 8) & 0xff), (b[61] & 0xff),
++                            ((b[62] >> 8) & 0xff), (b[62] & 0xff));
++              vp++;
++      } else if (sromrev == 2) {
++              /* Word 60 OFDM tx power offset from CCK level */
++              /* OFDM Power Offset - opo */
++              vp += sprintf(vp, "opo=%d", b[60] & 0xff);
++              vp++;
++      } else {
++              /* Word 60: cck power offsets */
++              vp += sprintf(vp, "cckpo=%d", b[60]);
++              vp++;
 +
-+/* BCM4712 boards */
-+#define BCM94712AP_BOARD      0x0445
-+#define BCM94712P_BOARD               0x0446
++              /* Words 61+62: 11g ofdm power offsets */
++              w32 = ((uint32)b[62] << 16) | b[61];
++              vp += sprintf(vp, "ofdmgpo=%d", w32);
++              vp++;
++      }
 +
-+/* BCM4318 boards */
-+#define BU4318_BOARD          0x0447
-+#define CB4318_BOARD          0x0448
-+#define MPG4318_BOARD         0x0449
-+#define MP4318_BOARD          0x044a
-+#define SD4318_BOARD          0x044b
++      /* final nullbyte terminator */
++done: *vp++ = '\0';
 +
-+/* BCM63XX boards */
-+#define BCM96338_BOARD                0x6338
-+#define BCM96345_BOARD                0x6345
-+#define BCM96348_BOARD                0x6348
++      ASSERT((vp - base) <= VARS_MAX);
 +
-+/* Another mp4306 with SiGe */
-+#define       BCM94306P_BOARD         0x044c
++varsdone:
++      err = initvars_table(osh, base, vp, vars, count);
 +
-+/* CF-like 4317 modules */
-+#define       BCM94317CF_BOARD        0x044d
++err:
++#ifdef WLTEST
++      if (base != mfgsromvars)
++#endif
++              MFREE(osh, base, VARS_MAX);
++      MFREE(osh, b, SROM_MAX);
++      return err;
++}
 +
-+/* mp4303 */
-+#define       BCM94303MP_BOARD        0x044e
++/*
++ * Read the cis and call parsecis to initialize the vars.
++ * Return 0 on success, nonzero on error.
++ */
++static int
++initvars_cis_pcmcia(void *sbh, osl_t *osh, char **vars, uint *count)
++{
++      uint8 *cis = NULL;
++      int rc;
++      uint data_sz;
 +
-+/* mpsgh4306 */
-+#define       BCM94306MPSGH_BOARD     0x044f
++      data_sz = (sb_pcmciarev(sbh) == 1) ? (SPROM_SIZE * 2) : CIS_SIZE;
 +
-+/* BRCM 4306 w/ Front End Modules */
-+#define BCM94306MPM           0x0450
-+#define BCM94306MPL           0x0453
++      if ((cis = MALLOC(osh, data_sz)) == NULL)
++              return (-2);
 +
-+/* 4712agr */
-+#define       BCM94712AGR_BOARD       0x0451
++      if (sb_pcmciarev(sbh) == 1) {
++              if (srom_read(PCMCIA_BUS, (void *)NULL, osh, 0, data_sz, (uint16 *)cis)) {
++                      MFREE(osh, cis, data_sz);
++                      return (-1);
++              }
++              /* fix up endianess for 16-bit data vs 8-bit parsing */
++              ltoh16_buf((uint16 *)cis, data_sz);
++      } else
++              OSL_PCMCIA_READ_ATTR(osh, 0, cis, data_sz);
 +
-+/* The real CF 4317 board */
-+#define       CFI4317_BOARD           0x0452
++      rc = srom_parsecis(osh, &cis, 1, vars, count);
 +
-+/* pcmcia 4303 */
-+#define       PC4303_BOARD            0x0454
++      MFREE(osh, cis, data_sz);
 +
-+/* 5350K */
-+#define       BCM95350K_BOARD         0x0455
++      return (rc);
++}
 +
-+/* 5350R */
-+#define       BCM95350R_BOARD         0x0456
+diff -urN linux.old/arch/mips/bcm947xx/bcmutils.c linux.dev/arch/mips/bcm947xx/bcmutils.c
+--- linux.old/arch/mips/bcm947xx/bcmutils.c    1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/bcmutils.c    2006-04-28 00:34:02.000000000 +0200
+@@ -0,0 +1,247 @@
++/*
++ * Misc useful OS-independent routines.
++ *
++ * Copyright 2006, 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: bcmutils.c,v 1.1.1.12 2006/02/27 03:43:16 honor Exp $
++ */
 +
-+/* 4306mplna */
-+#define       BCM94306MPLNA_BOARD     0x0457
++#include <typedefs.h>
++#include <bcmdefs.h>
++#include <stdarg.h>
++#include <bcmutils.h>
++#include <osl.h>
++#include <sbutils.h>
++#include <bcmnvram.h>
++#include <bcmendian.h>
++#include <bcmdevs.h>
 +
-+/* 4320 boards */
-+#define       BU4320_BOARD            0x0458
-+#define       BU4320S_BOARD           0x0459
-+#define       BCM94320PH_BOARD        0x045a
++unsigned char bcm_ctype[] = {
++      _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 0-7 */
++      _BCM_C, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C,
++      _BCM_C, /* 8-15 */
++      _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 16-23 */
++      _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 24-31 */
++      _BCM_S|_BCM_SP,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                /* 32-39 */
++      _BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                        /* 40-47 */
++      _BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,                        /* 48-55 */
++      _BCM_D,_BCM_D,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                        /* 56-63 */
++      _BCM_P, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X,
++      _BCM_U|_BCM_X, _BCM_U, /* 64-71 */
++      _BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,                        /* 72-79 */
++      _BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,                        /* 80-87 */
++      _BCM_U,_BCM_U,_BCM_U,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                        /* 88-95 */
++      _BCM_P, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X,
++      _BCM_L|_BCM_X, _BCM_L, /* 96-103 */
++      _BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L, /* 104-111 */
++      _BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L, /* 112-119 */
++      _BCM_L,_BCM_L,_BCM_L,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_C, /* 120-127 */
++      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,         /* 128-143 */
++      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,         /* 144-159 */
++      _BCM_S|_BCM_SP, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,
++      _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, /* 160-175 */
++      _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,
++      _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, /* 176-191 */
++      _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U,
++      _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, /* 192-207 */
++      _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_P, _BCM_U, _BCM_U, _BCM_U,
++      _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_L, /* 208-223 */
++      _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L,
++      _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, /* 224-239 */
++      _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_P, _BCM_L, _BCM_L, _BCM_L,
++      _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L /* 240-255 */
++};
 +
-+/* 4306mph */
-+#define       BCM94306MPH_BOARD       0x045b
 +
-+/* 4306pciv */
-+#define       BCM94306PCIV_BOARD      0x045c
++ulong
++bcm_strtoul(char *cp, char **endp, uint base)
++{
++      ulong result, value;
++      bool minus;
 +
-+#define       BU4712SD_BOARD          0x045d
++      minus = FALSE;
 +
-+#define       BCM94320PFLSH_BOARD     0x045e
++      while (bcm_isspace(*cp))
++              cp++;
 +
-+#define       BU4712L_BOARD           0x045f
-+#define       BCM94712LGR_BOARD       0x0460
-+#define       BCM94320R_BOARD         0x0461
++      if (cp[0] == '+')
++              cp++;
++      else if (cp[0] == '-') {
++              minus = TRUE;
++              cp++;
++      }
 +
-+#define       BU5352_BOARD            0x0462
-+
-+#define       BCM94318MPGH_BOARD      0x0463
-+
-+
-+#define       BCM95352GR_BOARD        0x0467
-+
-+/* bcm95351agr */
-+#define       BCM95351AGR_BOARD       0x0470
-+
-+/* # of GPIO pins */
-+#define GPIO_NUMPINS          16
++      if (base == 0) {
++              if (cp[0] == '0') {
++                      if ((cp[1] == 'x') || (cp[1] == 'X')) {
++                              base = 16;
++                              cp = &cp[2];
++                      } else {
++                              base = 8;
++                              cp = &cp[1];
++                      }
++              } else
++                      base = 10;
++      } else if (base == 16 && (cp[0] == '0') && ((cp[1] == 'x') || (cp[1] == 'X'))) {
++              cp = &cp[2];
++      }
 +
-+#endif /* _BCMDEVS_H */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmendian.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmendian.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmendian.h        1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmendian.h   2005-12-16 23:39:10.672819750 +0100
-@@ -0,0 +1,152 @@
-+/*
-+ * local version of endian.h - byte order defines
-+ *
-+ * Copyright 2005, 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$
-+*/
++      result = 0;
 +
-+#ifndef _BCMENDIAN_H_
-+#define _BCMENDIAN_H_
++      while (bcm_isxdigit(*cp) &&
++             (value = bcm_isdigit(*cp) ? *cp-'0' : bcm_toupper(*cp)-'A'+10) < base) {
++              result = result*base + value;
++              cp++;
++      }
 +
-+#include <typedefs.h>
++      if (minus)
++              result = (ulong)(result * -1);
 +
-+/* Byte swap a 16 bit value */
-+#define BCMSWAP16(val) \
-+      ((uint16)( \
-+              (((uint16)(val) & (uint16)0x00ffU) << 8) | \
-+              (((uint16)(val) & (uint16)0xff00U) >> 8) ))
-+      
-+/* Byte swap a 32 bit value */
-+#define BCMSWAP32(val) \
-+      ((uint32)( \
-+              (((uint32)(val) & (uint32)0x000000ffUL) << 24) | \
-+              (((uint32)(val) & (uint32)0x0000ff00UL) <<  8) | \
-+              (((uint32)(val) & (uint32)0x00ff0000UL) >>  8) | \
-+              (((uint32)(val) & (uint32)0xff000000UL) >> 24) ))
-+              
-+/* 2 Byte swap a 32 bit value */
-+#define BCMSWAP32BY16(val) \
-+      ((uint32)( \
-+              (((uint32)(val) & (uint32)0x0000ffffUL) << 16) | \
-+              (((uint32)(val) & (uint32)0xffff0000UL) >> 16) ))
-+              
++      if (endp)
++              *endp = (char *)cp;
 +
-+static INLINE uint16
-+bcmswap16(uint16 val)
-+{
-+      return BCMSWAP16(val);
++      return (result);
 +}
 +
-+static INLINE uint32
-+bcmswap32(uint32 val)
++uchar
++bcm_toupper(uchar c)
 +{
-+      return BCMSWAP32(val);
++      if (bcm_islower(c))
++              c -= 'a'-'A';
++      return (c);
 +}
 +
-+static INLINE uint32
-+bcmswap32by16(uint32 val)
++char*
++bcm_ether_ntoa(struct ether_addr *ea, char *buf)
 +{
-+      return BCMSWAP32BY16(val);
++      sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
++              ea->octet[0]&0xff, ea->octet[1]&0xff, ea->octet[2]&0xff,
++              ea->octet[3]&0xff, ea->octet[4]&0xff, ea->octet[5]&0xff);
++      return (buf);
 +}
 +
-+/* buf        - start of buffer of shorts to swap */
-+/* len  - byte length of buffer */
-+static INLINE void
-+bcmswap16_buf(uint16 *buf, uint len)
++
++/*
++ * Search the name=value vars for a specific one and return its value.
++ * Returns NULL if not found.
++ */
++char*
++getvar(char *vars, char *name)
 +{
-+      len = len/2;
++      char *s;
++      int len;
 +
-+      while(len--){
-+              *buf = bcmswap16(*buf);
-+              buf++;
-+      }
-+}
++      len = strlen(name);
 +
-+#ifndef hton16
-+#ifndef IL_BIGENDIAN
-+#define HTON16(i) BCMSWAP16(i)
-+#define       hton16(i) bcmswap16(i)
-+#define       hton32(i) bcmswap32(i)
-+#define       ntoh16(i) bcmswap16(i)
-+#define       ntoh32(i) bcmswap32(i)
-+#define ltoh16(i) (i)
-+#define ltoh32(i) (i)
-+#define htol16(i) (i)
-+#define htol32(i) (i)
-+#else
-+#define HTON16(i) (i)
-+#define       hton16(i) (i)
-+#define       hton32(i) (i)
-+#define       ntoh16(i) (i)
-+#define       ntoh32(i) (i)
-+#define       ltoh16(i) bcmswap16(i)
-+#define       ltoh32(i) bcmswap32(i)
-+#define htol16(i) bcmswap16(i)
-+#define htol32(i) bcmswap32(i)
-+#endif
-+#endif
++      /* first look in vars[] */
++      for (s = vars; s && *s;) {
++              /* CSTYLED */
++              if ((memcmp(s, name, len) == 0) && (s[len] == '='))
++                      return (&s[len+1]);
 +
-+#ifndef IL_BIGENDIAN
-+#define ltoh16_buf(buf, i)
-+#define htol16_buf(buf, i)
-+#else
-+#define ltoh16_buf(buf, i) bcmswap16_buf((uint16*)buf, i)
-+#define htol16_buf(buf, i) bcmswap16_buf((uint16*)buf, i)
-+#endif
++              while (*s++)
++                      ;
++      }
 +
-+/*
-+* load 16-bit value from unaligned little endian byte array.
-+*/
-+static INLINE uint16
-+ltoh16_ua(uint8 *bytes)
-+{
-+      return (bytes[1]<<8)+bytes[0];
++      /* then query nvram */
++      return (nvram_get(name));
 +}
 +
 +/*
-+* load 32-bit value from unaligned little endian byte array.
-+*/
-+static INLINE uint32
-+ltoh32_ua(uint8 *bytes)
++ * Search the vars for a specific one and return its value as
++ * an integer. Returns 0 if not found.
++ */
++int
++getintvar(char *vars, char *name)
 +{
-+      return (bytes[3]<<24)+(bytes[2]<<16)+(bytes[1]<<8)+bytes[0];
-+}
++      char *val;
 +
-+/*
-+* load 16-bit value from unaligned big(network) endian byte array.
-+*/
-+static INLINE uint16
-+ntoh16_ua(uint8 *bytes)
-+{
-+      return (bytes[0]<<8)+bytes[1];
-+}
++      if ((val = getvar(vars, name)) == NULL)
++              return (0);
 +
-+/*
-+* load 32-bit value from unaligned big(network) endian byte array.
-+*/
-+static INLINE uint32
-+ntoh32_ua(uint8 *bytes)
-+{
-+      return (bytes[0]<<24)+(bytes[1]<<16)+(bytes[2]<<8)+bytes[3];
++      return (bcm_strtoul(val, NULL, 0));
 +}
 +
-+#define ltoh_ua(ptr) ( \
-+      sizeof(*(ptr)) == sizeof(uint8) ?  *(uint8 *)ptr : \
-+      sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] : \
-+      (((uint8 *)ptr)[3]<<24)+(((uint8 *)ptr)[2]<<16)+(((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] \
-+)
-+
-+#define ntoh_ua(ptr) ( \
-+      sizeof(*(ptr)) == sizeof(uint8) ?  *(uint8 *)ptr : \
-+      sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[0]<<8)+((uint8 *)ptr)[1] : \
-+      (((uint8 *)ptr)[0]<<24)+(((uint8 *)ptr)[1]<<16)+(((uint8 *)ptr)[2]<<8)+((uint8 *)ptr)[3] \
-+)
 +
-+#endif /* _BCMENDIAN_H_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmenet47xx.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenet47xx.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmenet47xx.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenet47xx.h 2005-12-16 23:39:10.700821500 +0100
-@@ -0,0 +1,229 @@
-+/*
-+ * Hardware-specific definitions for
-+ * Broadcom BCM47XX 10/100 Mbps Ethernet cores.
++/*******************************************************************************
++ * crc8
 + *
-+ * Copyright 2005, Broadcom Corporation
-+ * All Rights Reserved.                
-+ *                                     
-+ * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;   
-+ * the contents of this file may not be disclosed to third parties, copied
-+ * or duplicated in any form, in whole or in part, without the prior      
-+ * written permission of Broadcom Corporation.                            
-+ * $Id$
++ * Computes a crc8 over the input data using the polynomial:
++ *
++ *       x^8 + x^7 +x^6 + x^4 + x^2 + 1
++ *
++ * The caller provides the initial value (either CRC8_INIT_VALUE
++ * or the previous returned value) to allow for processing of
++ * discontiguous blocks of data.  When generating the CRC the
++ * caller is responsible for complementing the final return value
++ * and inserting it into the byte stream.  When checking, a final
++ * return value of CRC8_GOOD_VALUE indicates a valid CRC.
++ *
++ * Reference: Dallas Semiconductor Application Note 27
++ *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
++ *     ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd.,
++ *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
++ *
++ * ****************************************************************************
 + */
 +
-+#ifndef       _bcmenet_47xx_h_
-+#define       _bcmenet_47xx_h_
++static uint8 crc8_table[256] = {
++    0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B,
++    0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21,
++    0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF,
++    0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5,
++    0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14,
++    0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E,
++    0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80,
++    0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA,
++    0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95,
++    0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF,
++    0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01,
++    0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B,
++    0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA,
++    0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0,
++    0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E,
++    0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34,
++    0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0,
++    0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A,
++    0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54,
++    0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E,
++    0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF,
++    0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5,
++    0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B,
++    0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61,
++    0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E,
++    0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74,
++    0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA,
++    0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0,
++    0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41,
++    0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B,
++    0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5,
++    0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F
++};
 +
-+#include <bcmenetmib.h>
-+#include <bcmenetrxh.h>
-+#include <bcmenetphy.h>
++#define CRC_INNER_LOOP(n, c, x) \
++      (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
 +
-+#define       BCMENET_NFILTERS        64              /* # ethernet address filter entries */
-+#define       BCMENET_MCHASHBASE      0x200           /* multicast hash filter base address */
-+#define       BCMENET_MCHASHSIZE      256             /* multicast hash filter size in bytes */
-+#define       BCMENET_MAX_DMA         4096            /* chip has 12 bits of DMA addressing */
++uint8
++hndcrc8(
++      uint8 *pdata,   /* pointer to array of data to process */
++      uint  nbytes,   /* number of input data bytes to process */
++      uint8 crc       /* either CRC8_INIT_VALUE or previous return value */
++)
++{
++      /* hard code the crc loop instead of using CRC_INNER_LOOP macro
++       * to avoid the undefined and unnecessary (uint8 >> 8) operation.
++       */
++      while (nbytes-- > 0)
++              crc = crc8_table[(crc ^ *pdata++) & 0xff];
 +
-+/* power management event wakeup pattern constants */
-+#define       BCMENET_NPMP            4               /* chip supports 4 wakeup patterns */
-+#define       BCMENET_PMPBASE         0x400           /* wakeup pattern base address */
-+#define       BCMENET_PMPSIZE         0x80            /* 128bytes each pattern */
-+#define       BCMENET_PMMBASE         0x600           /* wakeup mask base address */
-+#define       BCMENET_PMMSIZE         0x10            /* 128bits each mask */
++      return crc;
++}
 +
-+/* cpp contortions to concatenate w/arg prescan */
-+#ifndef PAD
-+#define       _PADLINE(line)  pad ## line
-+#define       _XSTR(line)     _PADLINE(line)
-+#define       PAD             _XSTR(__LINE__)
-+#endif        /* PAD */
 +
+diff -urN linux.old/arch/mips/bcm947xx/cfe_env.c linux.dev/arch/mips/bcm947xx/cfe_env.c
+--- linux.old/arch/mips/bcm947xx/cfe_env.c     1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/cfe_env.c     2006-04-27 19:24:19.000000000 +0200
+@@ -0,0 +1,234 @@
 +/*
-+ * Host Interface Registers
-+ */
-+typedef volatile struct _bcmenettregs {
-+      /* Device and Power Control */
-+      uint32  devcontrol;
-+      uint32  PAD[2];
-+      uint32  biststatus;
-+      uint32  wakeuplength;
-+      uint32  PAD[3];
-+
-+      /* Interrupt Control */
-+      uint32  intstatus;
-+      uint32  intmask;
-+      uint32  gptimer;
-+      uint32  PAD[23];
-+
-+      /* Ethernet MAC Address Filtering Control */
-+      uint32  PAD[2];
-+      uint32  enetftaddr;
-+      uint32  enetftdata;
-+      uint32  PAD[2];
-+
-+      /* Ethernet MAC Control */
-+      uint32  emactxmaxburstlen;
-+      uint32  emacrxmaxburstlen;
-+      uint32  emaccontrol;
-+      uint32  emacflowcontrol;
-+
-+      uint32  PAD[20];
-+
-+      /* DMA Lazy Interrupt Control */
-+      uint32  intrecvlazy;
-+      uint32  PAD[63];
-+
-+      /* DMA engine */
-+      dma32regp_t     dmaregs;
-+      dma32diag_t     dmafifo;
-+      uint32  PAD[116];
-+
-+      /* EMAC Registers */
-+      uint32 rxconfig;
-+      uint32 rxmaxlength;
-+      uint32 txmaxlength;
-+      uint32 PAD;
-+      uint32 mdiocontrol;
-+      uint32 mdiodata;
-+      uint32 emacintmask;
-+      uint32 emacintstatus;
-+      uint32 camdatalo;
-+      uint32 camdatahi;
-+      uint32 camcontrol;
-+      uint32 enetcontrol;
-+      uint32 txcontrol;
-+      uint32 txwatermark;
-+      uint32 mibcontrol;
-+      uint32 PAD[49];
-+
-+      /* EMAC MIB counters */
-+      bcmenetmib_t    mib;
-+
-+      uint32  PAD[585];
-+
-+      /* Sonics SiliconBackplane config registers */
-+      sbconfig_t      sbconfig;
-+} bcmenetregs_t;
-+
-+/* device control */
-+#define       DC_PM           ((uint32)1 << 7)        /* pattern filtering enable */
-+#define       DC_IP           ((uint32)1 << 10)       /* internal ephy present (rev >= 1) */
-+#define       DC_ER           ((uint32)1 << 15)       /* ephy reset */
-+#define       DC_MP           ((uint32)1 << 16)       /* mii phy mode enable */
-+#define       DC_CO           ((uint32)1 << 17)       /* mii phy mode: enable clocks */
-+#define       DC_PA_MASK      0x7c0000                /* mii phy mode: mdc/mdio phy address */
-+#define       DC_PA_SHIFT     18
-+#define       DC_FS_MASK      0x03800000              /* fifo size (rev >= 8) */
-+#define       DC_FS_SHIFT     23
-+#define       DC_FS_4K        0                       /* 4Kbytes */
-+#define       DC_FS_512       1                       /* 512bytes */
-+
-+/* wakeup length */
-+#define       WL_P0_MASK      0x7f                    /* pattern 0 */
-+#define       WL_D0           ((uint32)1 << 7)
-+#define       WL_P1_MASK      0x7f00                  /* pattern 1 */
-+#define       WL_P1_SHIFT     8
-+#define       WL_D1           ((uint32)1 << 15)
-+#define       WL_P2_MASK      0x7f0000                /* pattern 2 */
-+#define       WL_P2_SHIFT     16
-+#define       WL_D2           ((uint32)1 << 23)
-+#define       WL_P3_MASK      0x7f000000              /* pattern 3 */
-+#define       WL_P3_SHIFT     24
-+#define       WL_D3           ((uint32)1 << 31)
-+
-+/* intstatus and intmask */
-+#define       I_PME           ((uint32)1 << 6)        /* power management event */
-+#define       I_TO            ((uint32)1 << 7)        /* general purpose timeout */
-+#define       I_PC            ((uint32)1 << 10)       /* descriptor error */
-+#define       I_PD            ((uint32)1 << 11)       /* data error */
-+#define       I_DE            ((uint32)1 << 12)       /* descriptor protocol error */
-+#define       I_RU            ((uint32)1 << 13)       /* receive descriptor underflow */
-+#define       I_RO            ((uint32)1 << 14)       /* receive fifo overflow */
-+#define       I_XU            ((uint32)1 << 15)       /* transmit fifo underflow */
-+#define       I_RI            ((uint32)1 << 16)       /* receive interrupt */
-+#define       I_XI            ((uint32)1 << 24)       /* transmit interrupt */
-+#define       I_EM            ((uint32)1 << 26)       /* emac interrupt */
-+#define       I_MW            ((uint32)1 << 27)       /* mii write */
-+#define       I_MR            ((uint32)1 << 28)       /* mii read */
-+
-+/* emaccontrol */
-+#define       EMC_CG          ((uint32)1 << 0)        /* crc32 generation enable */
-+#define       EMC_EP          ((uint32)1 << 2)        /* onchip ephy: powerdown (rev >= 1) */
-+#define       EMC_ED          ((uint32)1 << 3)        /* onchip ephy: energy detected (rev >= 1) */
-+#define       EMC_LC_MASK     0xe0                    /* onchip ephy: led control (rev >= 1) */
-+#define       EMC_LC_SHIFT    5
-+
-+/* emacflowcontrol */
-+#define       EMF_RFH_MASK    0xff                    /* rx fifo hi water mark */
-+#define       EMF_PG          ((uint32)1 << 15)       /* enable pause frame generation */
-+
-+/* interrupt receive lazy */
-+#define       IRL_TO_MASK     0x00ffffff              /* timeout */
-+#define       IRL_FC_MASK     0xff000000              /* frame count */
-+#define       IRL_FC_SHIFT    24                      /* frame count */
-+
-+/* emac receive config */
-+#define       ERC_DB          ((uint32)1 << 0)        /* disable broadcast */
-+#define       ERC_AM          ((uint32)1 << 1)        /* accept all multicast */
-+#define       ERC_RDT         ((uint32)1 << 2)        /* receive disable while transmitting */
-+#define       ERC_PE          ((uint32)1 << 3)        /* promiscuous enable */
-+#define       ERC_LE          ((uint32)1 << 4)        /* loopback enable */
-+#define       ERC_FE          ((uint32)1 << 5)        /* enable flow control */
-+#define       ERC_UF          ((uint32)1 << 6)        /* accept unicast flow control frame */
-+#define       ERC_RF          ((uint32)1 << 7)        /* reject filter */
-+#define       ERC_CA          ((uint32)1 << 8)        /* cam absent */
-+
-+/* emac mdio control */
-+#define       MC_MF_MASK      0x7f                    /* mdc frequency */
-+#define       MC_PE           ((uint32)1 << 7)        /* mii preamble enable */
-+
-+/* emac mdio data */
-+#define       MD_DATA_MASK    0xffff                  /* r/w data */
-+#define       MD_TA_MASK      0x30000                 /* turnaround value */
-+#define       MD_TA_SHIFT     16
-+#define       MD_TA_VALID     (2 << MD_TA_SHIFT)      /* valid ta */
-+#define       MD_RA_MASK      0x7c0000                /* register address */
-+#define       MD_RA_SHIFT     18
-+#define       MD_PMD_MASK     0xf800000               /* physical media device */
-+#define       MD_PMD_SHIFT    23
-+#define       MD_OP_MASK      0x30000000              /* opcode */
-+#define       MD_OP_SHIFT     28
-+#define       MD_OP_WRITE     (1 << MD_OP_SHIFT)      /* write op */
-+#define       MD_OP_READ      (2 << MD_OP_SHIFT)      /* read op */
-+#define       MD_SB_MASK      0xc0000000              /* start bits */
-+#define       MD_SB_SHIFT     30
-+#define       MD_SB_START     (0x1 << MD_SB_SHIFT)    /* start of frame */
-+
-+/* emac intstatus and intmask */
-+#define       EI_MII          ((uint32)1 << 0)        /* mii mdio interrupt */
-+#define       EI_MIB          ((uint32)1 << 1)        /* mib interrupt */
-+#define       EI_FLOW         ((uint32)1 << 2)        /* flow control interrupt */
-+
-+/* emac cam data high */
-+#define       CD_V            ((uint32)1 << 16)       /* valid bit */
-+
-+/* emac cam control */
-+#define       CC_CE           ((uint32)1 << 0)        /* cam enable */
-+#define       CC_MS           ((uint32)1 << 1)        /* mask select */
-+#define       CC_RD           ((uint32)1 << 2)        /* read */
-+#define       CC_WR           ((uint32)1 << 3)        /* write */
-+#define       CC_INDEX_MASK   0x3f0000                /* index */
-+#define       CC_INDEX_SHIFT  16
-+#define       CC_CB           ((uint32)1 << 31)       /* cam busy */
-+
-+/* emac ethernet control */
-+#define       EC_EE           ((uint32)1 << 0)        /* emac enable */
-+#define       EC_ED           ((uint32)1 << 1)        /* emac disable */
-+#define       EC_ES           ((uint32)1 << 2)        /* emac soft reset */
-+#define       EC_EP           ((uint32)1 << 3)        /* external phy select */
-+
-+/* emac transmit control */
-+#define       EXC_FD          ((uint32)1 << 0)        /* full duplex */
-+#define       EXC_FM          ((uint32)1 << 1)        /* flowmode */
-+#define       EXC_SB          ((uint32)1 << 2)        /* single backoff enable */
-+#define       EXC_SS          ((uint32)1 << 3)        /* small slottime */
-+
-+/* emac mib control */
-+#define       EMC_RZ          ((uint32)1 << 0)        /* autoclear on read */
-+
-+#endif        /* _bcmenet_47xx_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmenetmib.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenetmib.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmenetmib.h       1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenetmib.h  2005-12-16 23:39:10.700821500 +0100
-@@ -0,0 +1,81 @@
-+/*
-+ * Hardware-specific MIB definition for
-+ * Broadcom Home Networking Division
-+ * BCM44XX and BCM47XX 10/100 Mbps Ethernet cores.
-+ * 
-+ * Copyright 2005, Broadcom Corporation
-+ * All Rights Reserved.                
-+ *                                     
-+ * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;   
-+ * the contents of this file may not be disclosed to third parties, copied
-+ * or duplicated in any form, in whole or in part, without the prior      
-+ * written permission of Broadcom Corporation.                            
-+ * $Id$
-+ */
-+
-+#ifndef _bcmenetmib_h_
-+#define _bcmenetmib_h_
-+
-+/* cpp contortions to concatenate w/arg prescan */
-+#ifndef PAD
-+#define       _PADLINE(line)  pad ## line
-+#define       _XSTR(line)     _PADLINE(line)
-+#define       PAD             _XSTR(__LINE__)
-+#endif        /* PAD */
-+
-+/*
-+ * EMAC MIB Registers
-+ */
-+typedef volatile struct {
-+      uint32 tx_good_octets;
-+      uint32 tx_good_pkts;
-+      uint32 tx_octets;
-+      uint32 tx_pkts;
-+      uint32 tx_broadcast_pkts;
-+      uint32 tx_multicast_pkts;
-+      uint32 tx_len_64;
-+      uint32 tx_len_65_to_127;
-+      uint32 tx_len_128_to_255;
-+      uint32 tx_len_256_to_511;
-+      uint32 tx_len_512_to_1023;
-+      uint32 tx_len_1024_to_max;
-+      uint32 tx_jabber_pkts;
-+      uint32 tx_oversize_pkts;
-+      uint32 tx_fragment_pkts;
-+      uint32 tx_underruns;
-+      uint32 tx_total_cols;
-+      uint32 tx_single_cols;
-+      uint32 tx_multiple_cols;
-+      uint32 tx_excessive_cols;
-+      uint32 tx_late_cols;
-+      uint32 tx_defered;
-+      uint32 tx_carrier_lost;
-+      uint32 tx_pause_pkts;
-+      uint32 PAD[8];
-+
-+      uint32 rx_good_octets;
-+      uint32 rx_good_pkts;
-+      uint32 rx_octets;
-+      uint32 rx_pkts;
-+      uint32 rx_broadcast_pkts;
-+      uint32 rx_multicast_pkts;
-+      uint32 rx_len_64;
-+      uint32 rx_len_65_to_127;
-+      uint32 rx_len_128_to_255;
-+      uint32 rx_len_256_to_511;
-+      uint32 rx_len_512_to_1023;
-+      uint32 rx_len_1024_to_max;
-+      uint32 rx_jabber_pkts;
-+      uint32 rx_oversize_pkts;
-+      uint32 rx_fragment_pkts;
-+      uint32 rx_missed_pkts;
-+      uint32 rx_crc_align_errs;
-+      uint32 rx_undersize;
-+      uint32 rx_crc_errs;
-+      uint32 rx_align_errs;
-+      uint32 rx_symbol_errs;
-+      uint32 rx_pause_pkts;
-+      uint32 rx_nonpause_pkts;
-+} bcmenetmib_t;
-+
-+#endif        /* _bcmenetmib_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmenetphy.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenetphy.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmenetphy.h       1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenetphy.h  2005-12-16 23:39:10.700821500 +0100
-@@ -0,0 +1,58 @@
-+/*
-+ * Misc Broadcom BCM47XX MDC/MDIO enet phy definitions.
-+ *
-+ * Copyright 2005, Broadcom Corporation
-+ * All Rights Reserved.                
-+ *                                     
-+ * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;   
-+ * the contents of this file may not be disclosed to third parties, copied
-+ * or duplicated in any form, in whole or in part, without the prior      
-+ * written permission of Broadcom Corporation.                            
-+ * $Id$
-+ */
-+
-+#ifndef       _bcmenetphy_h_
-+#define       _bcmenetphy_h_
-+
-+/* phy address */
-+#define       MAXEPHY         32                      /* mdio phy addresses are 5bit quantities */
-+#define       EPHY_MASK       0x1f
-+#define       EPHY_NONE       31                      /* nvram: no phy present at all */
-+#define       EPHY_NOREG      30                      /* nvram: no local phy regs */
-+
-+/* just a few phy registers */
-+#define       CTL_RESET       (1 << 15)               /* reset */
-+#define       CTL_LOOP        (1 << 14)               /* loopback */
-+#define       CTL_SPEED       (1 << 13)               /* speed selection 0=10, 1=100 */
-+#define       CTL_ANENAB      (1 << 12)               /* autonegotiation enable */
-+#define       CTL_RESTART     (1 << 9)                /* restart autonegotiation */
-+#define       CTL_DUPLEX      (1 << 8)                /* duplex mode 0=half, 1=full */
-+
-+#define       ADV_10FULL      (1 << 6)                /* autonegotiate advertise 10full */
-+#define       ADV_10HALF      (1 << 5)                /* autonegotiate advertise 10half */
-+#define       ADV_100FULL     (1 << 8)                /* autonegotiate advertise 100full */
-+#define       ADV_100HALF     (1 << 7)                /* autonegotiate advertise 100half */
-+
-+/* link partner ability register */
-+#define LPA_SLCT      0x001f                  /* same as advertise selector */
-+#define LPA_10HALF    0x0020                  /* can do 10mbps half-duplex */
-+#define LPA_10FULL    0x0040                  /* can do 10mbps full-duplex */
-+#define LPA_100HALF   0x0080                  /* can do 100mbps half-duplex */
-+#define LPA_100FULL   0x0100                  /* can do 100mbps full-duplex */
-+#define LPA_100BASE4  0x0200                  /* can do 100mbps 4k packets */
-+#define LPA_RESV      0x1c00                  /* unused */
-+#define LPA_RFAULT    0x2000                  /* link partner faulted */
-+#define LPA_LPACK     0x4000                  /* link partner acked us */
-+#define LPA_NPAGE     0x8000                  /* next page bit */
-+
-+#define LPA_DUPLEX    (LPA_10FULL | LPA_100FULL)
-+#define LPA_100               (LPA_100FULL | LPA_100HALF | LPA_100BASE4)
-+
-+#define       STAT_REMFAULT   (1 << 4)                /* remote fault */
-+#define       STAT_LINK       (1 << 2)                /* link status */
-+#define       STAT_JAB        (1 << 1)                /* jabber detected */
-+#define       AUX_FORCED      (1 << 2)                /* forced 10/100 */
-+#define       AUX_SPEED       (1 << 1)                /* speed 0=10mbps 1=100mbps */
-+#define       AUX_DUPLEX      (1 << 0)                /* duplex 0=half 1=full */
-+
-+#endif        /* _bcmenetphy_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmenetrxh.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenetrxh.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmenetrxh.h       1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmenetrxh.h  2005-12-16 23:39:10.700821500 +0100
-@@ -0,0 +1,43 @@
-+/*
-+ * Hardware-specific Receive Data Header for the
-+ * Broadcom Home Networking Division
-+ * BCM44XX and BCM47XX 10/100 Mbps Ethernet cores.
-+ *
-+ * Copyright 2005, Broadcom Corporation
-+ * All Rights Reserved.                
-+ *                                     
-+ * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;   
-+ * the contents of this file may not be disclosed to third parties, copied
-+ * or duplicated in any form, in whole or in part, without the prior      
-+ * written permission of Broadcom Corporation.                            
-+ * $Id$
-+ */
-+
-+#ifndef _bcmenetrxh_h_
-+#define       _bcmenetrxh_h_
-+
-+/*
-+ * The Ethernet MAC core returns an 8-byte Receive Frame Data Header
-+ * with every frame consisting of
-+ * 16bits of frame length, followed by
-+ * 16bits of EMAC rx descriptor info, followed by 32bits of undefined.
-+ */
-+typedef volatile struct {
-+      uint16  len;
-+      uint16  flags;
-+      uint16  pad[12];
-+} bcmenetrxh_t;
-+
-+#define       RXHDR_LEN       28
-+
-+#define       RXF_L           ((uint16)1 << 11)       /* last buffer in a frame */
-+#define       RXF_MISS        ((uint16)1 << 7)        /* received due to promisc mode */
-+#define       RXF_BRDCAST     ((uint16)1 << 6)        /* dest is broadcast address */
-+#define       RXF_MULT        ((uint16)1 << 5)        /* dest is multicast address */
-+#define       RXF_LG          ((uint16)1 << 4)        /* frame length > rxmaxlength */
-+#define       RXF_NO          ((uint16)1 << 3)        /* odd number of nibbles */
-+#define       RXF_RXER        ((uint16)1 << 2)        /* receive symbol error */
-+#define       RXF_CRC         ((uint16)1 << 1)        /* crc error */
-+#define       RXF_OV          ((uint16)1 << 0)        /* fifo overflow */
-+
-+#endif        /* _bcmenetrxh_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmnvram.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmnvram.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmnvram.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmnvram.h    2005-12-16 23:39:10.700821500 +0100
-@@ -0,0 +1,141 @@
-+/*
-+ * NVRAM variable manipulation
++ * NVRAM variable manipulation (Linux kernel half)
 + *
-+ * Copyright 2005, Broadcom Corporation
++ * Copyright 2001-2003, Broadcom Corporation
 + * All Rights Reserved.
 + * 
 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
@@ -1639,170 +1535,356 @@ diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmnvram.h linux-2.4.32-brcm/a
 + * $Id$
 + */
 +
-+#ifndef _bcmnvram_h_
-+#define _bcmnvram_h_
-+
-+#ifndef _LANGUAGE_ASSEMBLY
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
 +
 +#include <typedefs.h>
++#include <osl.h>
++#include <bcmendian.h>
++#include <bcmutils.h>
 +
-+struct nvram_header {
-+      uint32 magic;
-+      uint32 len;
-+      uint32 crc_ver_init;    /* 0:7 crc, 8:15 ver, 16:31 sdram_init */
-+      uint32 config_refresh;  /* 0:15 sdram_config, 16:31 sdram_refresh */
-+      uint32 config_ncdl;     /* ncdl values for memc */
-+};
-+
-+struct nvram_tuple {
-+      char *name;
-+      char *value;
-+      struct nvram_tuple *next;
-+};
++#define NVRAM_SIZE       (0x1ff0)
++static char _nvdata[NVRAM_SIZE] __initdata;
++static char _valuestr[256] __initdata;
 +
 +/*
-+ * Initialize NVRAM access. May be unnecessary or undefined on certain
-+ * platforms.
++ * TLV types.  These codes are used in the "type-length-value"
++ * encoding of the items stored in the NVRAM device (flash or EEPROM)
++ *
++ * The layout of the flash/nvram is as follows:
++ *
++ * <type> <length> <data ...> <type> <length> <data ...> <type_end>
++ *
++ * The type code of "ENV_TLV_TYPE_END" marks the end of the list.
++ * The "length" field marks the length of the data section, not
++ * including the type and length fields.
++ *
++ * Environment variables are stored as follows:
++ *
++ * <type_env> <length> <flags> <name> = <value>
++ *
++ * If bit 0 (low bit) is set, the length is an 8-bit value.
++ * If bit 0 (low bit) is clear, the length is a 16-bit value
++ * 
++ * Bit 7 set indicates "user" TLVs.  In this case, bit 0 still
++ * indicates the size of the length field.  
++ *
++ * Flags are from the constants below:
++ *
 + */
-+extern int BCMINIT(nvram_init)(void *sbh);
++#define ENV_LENGTH_16BITS     0x00    /* for low bit */
++#define ENV_LENGTH_8BITS      0x01
++
++#define ENV_TYPE_USER         0x80
++
++#define ENV_CODE_SYS(n,l) (((n)<<1)|(l))
++#define ENV_CODE_USER(n,l) ((((n)<<1)|(l)) | ENV_TYPE_USER)
 +
 +/*
-+ * Disable NVRAM access. May be unnecessary or undefined on certain
-+ * platforms.
++ * The actual TLV types we support
 + */
-+extern void BCMINIT(nvram_exit)(void *sbh);
++
++#define ENV_TLV_TYPE_END      0x00    
++#define ENV_TLV_TYPE_ENV      ENV_CODE_SYS(0,ENV_LENGTH_8BITS)
 +
 +/*
-+ * Get the value of an NVRAM variable. The pointer returned may be
-+ * invalid after a set.
-+ * @param     name    name of variable to get
-+ * @return    value of variable or NULL if undefined
++ * Environment variable flags 
 + */
-+extern char * BCMINIT(nvram_get)(const char *name);
 +
-+/* 
-+ * Read the reset GPIO value from the nvram and set the GPIO
-+ * as input
-+ */
-+extern int BCMINITFN(nvram_resetgpio_init)(void *sbh);
++#define ENV_FLG_NORMAL                0x00    /* normal read/write */
++#define ENV_FLG_BUILTIN               0x01    /* builtin - not stored in flash */
++#define ENV_FLG_READONLY      0x02    /* read-only - cannot be changed */
 +
-+/* 
-+ * Get the value of an NVRAM variable.
-+ * @param     name    name of variable to get
-+ * @return    value of variable or NUL if undefined
-+ */
-+#define nvram_safe_get(name) (BCMINIT(nvram_get)(name) ? : "")
++#define ENV_FLG_MASK          0xFF    /* mask of attributes we keep */
++#define ENV_FLG_ADMIN         0x100   /* lets us internally override permissions */
 +
-+/*
-+ * Match an NVRAM variable.
-+ * @param     name    name of variable to match
-+ * @param     match   value to compare against value of variable
-+ * @return    TRUE if variable is defined and its value is string equal
-+ *            to match or FALSE otherwise
-+ */
-+static INLINE int
-+nvram_match(char *name, char *match) {
-+      const char *value = BCMINIT(nvram_get)(name);
-+      return (value && !strcmp(value, match));
++
++/*  *********************************************************************
++    *  _nvram_read(buffer,offset,length)
++    *  
++    *  Read data from the NVRAM device
++    *  
++    *  Input parameters: 
++    *            buffer - destination buffer
++    *            offset - offset of data to read
++    *            length - number of bytes to read
++    *            
++    *  Return value:
++    *            number of bytes read, or <0 if error occured
++    ********************************************************************* */
++static int
++_nvram_read(unsigned char *nv_buf, unsigned char *buffer, int offset, int length)
++{
++    int i;
++    if (offset > NVRAM_SIZE)
++      return -1; 
++
++    for ( i = 0; i < length; i++) {
++      buffer[i] = ((volatile unsigned char*)nv_buf)[offset + i];
++    }
++    return length;
 +}
 +
-+/*
-+ * Inversely match an NVRAM variable.
-+ * @param     name    name of variable to match
-+ * @param     match   value to compare against value of variable
-+ * @return    TRUE if variable is defined and its value is not string
-+ *            equal to invmatch or FALSE otherwise
-+ */
-+static INLINE int
-+nvram_invmatch(char *name, char *invmatch) {
-+      const char *value = BCMINIT(nvram_get)(name);
-+      return (value && strcmp(value, invmatch));
++
++static char*
++_strnchr(const char *dest,int c,size_t cnt)
++{
++      while (*dest && (cnt > 0)) {
++      if (*dest == c) return (char *) dest;
++      dest++;
++      cnt--;
++      }
++      return NULL;
 +}
 +
-+/*
-+ * Set the value of an NVRAM variable. The name and value strings are
-+ * copied into private storage. Pointers to previously set values
-+ * may become invalid. The new value may be immediately
-+ * retrieved but will not be permanently stored until a commit.
-+ * @param     name    name of variable to set
-+ * @param     value   value of variable
-+ * @return    0 on success and errno on failure
-+ */
-+extern int BCMINIT(nvram_set)(const char *name, const char *value);
 +
-+/*
-+ * Unset an NVRAM variable. Pointers to previously set values
-+ * remain valid until a set.
-+ * @param     name    name of variable to unset
-+ * @return    0 on success and errno on failure
-+ * NOTE: use nvram_commit to commit this change to flash.
-+ */
-+extern int BCMINIT(nvram_unset)(const char *name);
 +
 +/*
-+ * Commit NVRAM variables to permanent storage. All pointers to values
-+ * may be invalid after a commit.
-+ * NVRAM values are undefined after a commit.
-+ * @return    0 on success and errno on failure
++ * Core support API: Externally visible.
 + */
-+extern int BCMINIT(nvram_commit)(void);
 +
 +/*
-+ * Get all NVRAM variables (format name=value\0 ... \0\0).
-+ * @param     buf     buffer to store variables
-+ * @param     count   size of buffer in bytes
-+ * @return    0 on success and errno on failure
++ * Get the value of an NVRAM variable
++ * @param     name    name of variable to get
++ * @return    value of variable or NULL if undefined
 + */
-+extern int BCMINIT(nvram_getall)(char *buf, int count);
 +
-+#endif /* _LANGUAGE_ASSEMBLY */
++char* 
++cfe_env_get(unsigned char *nv_buf, char* name)
++{
++    int size;
++    unsigned char *buffer;
++    unsigned char *ptr;
++    unsigned char *envval;
++    unsigned int reclen;
++    unsigned int rectype;
++    int offset;
++    int flg;
++    
++    size = NVRAM_SIZE;
++    buffer = &_nvdata[0];
 +
-+#define NVRAM_MAGIC           0x48534C46      /* 'FLSH' */
-+#define NVRAM_VERSION         1
-+#define NVRAM_HEADER_SIZE     20
-+#define NVRAM_SPACE           0x8000
++    ptr = buffer;
++    offset = 0;
 +
-+#define NVRAM_MAX_VALUE_LEN 255
-+#define NVRAM_MAX_PARAM_LEN 64
++    /* Read the record type and length */
++    if (_nvram_read(nv_buf, ptr,offset,1) != 1) {
++      goto error;
++    }
++    
++    while ((*ptr != ENV_TLV_TYPE_END)  && (size > 1)) {
 +
-+#endif /* _bcmnvram_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmparams.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmparams.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmparams.h        1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmparams.h   2005-12-16 23:39:10.700821500 +0100
-@@ -0,0 +1,25 @@
-+/*
-+ * Misc system wide parameters.
-+ *
-+ * Copyright 2005, 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$
-+ */
++      /* Adjust pointer for TLV type */
++      rectype = *(ptr);
++      offset++;
++      size--;
++
++      /* 
++       * Read the length.  It can be either 1 or 2 bytes
++       * depending on the code 
++       */
++      if (rectype & ENV_LENGTH_8BITS) {
++          /* Read the record type and length - 8 bits */
++          if (_nvram_read(nv_buf, ptr,offset,1) != 1) {
++              goto error;
++          }
++          reclen = *(ptr);
++          size--;
++          offset++;
++      }
++      else {
++          /* Read the record type and length - 16 bits, MSB first */
++          if (_nvram_read(nv_buf, ptr,offset,2) != 2) {
++              goto error;
++          }
++          reclen = (((unsigned int) *(ptr)) << 8) + (unsigned int) *(ptr+1);
++          size -= 2;
++          offset += 2;
++      }
++
++      if (reclen > size)
++          break;      /* should not happen, bad NVRAM */
++
++      switch (rectype) {
++          case ENV_TLV_TYPE_ENV:
++              /* Read the TLV data */
++              if (_nvram_read(nv_buf, ptr,offset,reclen) != reclen)
++                  goto error;
++              flg = *ptr++;
++              envval = (unsigned char *) _strnchr(ptr,'=',(reclen-1));
++              if (envval) {
++                  *envval++ = '\0';
++                  memcpy(_valuestr,envval,(reclen-1)-(envval-ptr));
++                  _valuestr[(reclen-1)-(envval-ptr)] = '\0';
++#if 0                 
++                  printk(KERN_INFO "NVRAM:%s=%s\n", ptr, _valuestr);
++#endif
++                  if(!strcmp(ptr, name)){
++                      return _valuestr;
++                  }
++                  if((strlen(ptr) > 1) && !strcmp(&ptr[1], name))
++                      return _valuestr;
++              }
++              break;
++              
++          default: 
++              /* Unknown TLV type, skip it. */
++              break;
++          }
++
++      /*
++       * Advance to next TLV 
++       */
++              
++      size -= (int)reclen;
++      offset += reclen;
++
++      /* Read the next record type */
++      ptr = buffer;
++      if (_nvram_read(nv_buf, ptr,offset,1) != 1)
++          goto error;
++      }
++
++error:
++    return NULL;
 +
-+#ifndef       _bcmparams_h_
-+#define       _bcmparams_h_
++}
 +
-+#define VLAN_MAXVID   15      /* Max. VLAN ID supported/allowed */
+diff -urN linux.old/arch/mips/bcm947xx/compressed/Makefile linux.dev/arch/mips/bcm947xx/compressed/Makefile
+--- linux.old/arch/mips/bcm947xx/compressed/Makefile   1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/compressed/Makefile   2006-04-27 19:24:19.000000000 +0200
+@@ -0,0 +1,33 @@
++#
++# Makefile for Broadcom BCM947XX boards
++#
++# 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: Makefile,v 1.2 2005/04/02 12:12:57 wbx Exp $
++#
 +
-+#define VLAN_NUMPRIS  8       /* # of prio, start from 0 */
++OBJCOPY_ARGS  = -O binary -R .reginfo -R .note -R .comment -R .mdebug -S
++SYSTEM                ?= $(TOPDIR)/vmlinux
 +
-+#define DEV_NUMIFS    16      /* Max. # of devices/interfaces supported */
++all: vmlinuz
 +
-+#define WL_MAXBSSCFG  16      /* maximum number of BSS Configs we can configure */
++# Don't build dependencies, this may die if $(CC) isn't gcc
++dep:
 +
-+#endif
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmsrom.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmsrom.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmsrom.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmsrom.h     2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,23 @@
++# Create a gzipped version named vmlinuz for compatibility
++vmlinuz: piggy
++      gzip -c9 $< > $@
++
++piggy: $(SYSTEM)
++      $(OBJCOPY) $(OBJCOPY_ARGS) $< $@
++
++mrproper: clean
++
++clean:
++      rm -f vmlinuz piggy
+diff -urN linux.old/arch/mips/bcm947xx/export.c linux.dev/arch/mips/bcm947xx/export.c
+--- linux.old/arch/mips/bcm947xx/export.c      1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/export.c      2006-04-28 02:57:34.000000000 +0200
+@@ -0,0 +1,62 @@
++#include <linux/module.h>
++
++#define _export(n) \
++              void n(void); \
++              EXPORT_SYMBOL(n);
++
++_export(bcm947xx_sbh)
++
++_export(sb_attach)
++_export(sb_boardtype)
++_export(sb_boardvendor)
++_export(sb_btcgpiowar)
++_export(sb_bus)
++_export(sb_chip)
++_export(sb_chiprev)
++_export(sb_chipcrev)
++_export(sb_chippkg)
++_export(sb_clkctl_clk)
++_export(sb_clkctl_fast_pwrup_delay)
++_export(sb_clkctl_init)
++_export(sb_clkctl_xtal)
++_export(sb_core_disable)
++_export(sb_core_reset)
++_export(sb_core_tofixup)
++_export(sb_coreflags)
++_export(sb_coreflagshi)
++_export(sb_coreidx)
++_export(sb_corerev)
++_export(sb_coreunit)
++_export(sb_detach)
++_export(sb_deviceremoved)
++_export(sb_gpiocontrol)
++_export(sb_gpioled)
++_export(sb_gpioin)
++_export(sb_gpioout)
++_export(sb_gpioouten)
++_export(sb_gpiotimerval)
++_export(sb_iscoreup)
++_export(sb_pci_setup)
++_export(sb_pcirev)
++_export(sb_pcmcia_init)
++_export(sb_pcmciarev)
++_export(sb_register_intr_callback)
++_export(sb_setcore)
++_export(sb_war16165)
++_export(sb_osh)
++              
++_export(getvar)
++_export(getintvar)
++_export(bcm_strtoul)
++_export(bcm_ctype)
++_export(bcm_toupper)
++_export(bcm_ether_ntoa)
++
++_export(nvram_get)
++_export(nvram_getall)
++_export(nvram_set)
++_export(nvram_unset)
++_export(nvram_commit)
++
++_export(srom_read)
++_export(srom_write)
+diff -urN linux.old/arch/mips/bcm947xx/generic/Makefile linux.dev/arch/mips/bcm947xx/generic/Makefile
+--- linux.old/arch/mips/bcm947xx/generic/Makefile      1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/generic/Makefile      2006-04-27 19:24:19.000000000 +0200
+@@ -0,0 +1,15 @@
++#
++# Makefile for the BCM947xx specific kernel interface routines
++# under Linux.
++#
++
++.S.s:
++      $(CPP) $(AFLAGS) $< -o $*.s
++.S.o:
++      $(CC) $(AFLAGS) -c $< -o $*.o
++
++O_TARGET        := brcm.o
++
++obj-y := int-handler.o irq.o
++
++include $(TOPDIR)/Rules.make
+diff -urN linux.old/arch/mips/bcm947xx/generic/int-handler.S linux.dev/arch/mips/bcm947xx/generic/int-handler.S
+--- linux.old/arch/mips/bcm947xx/generic/int-handler.S 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/generic/int-handler.S 2006-04-27 19:24:19.000000000 +0200
+@@ -0,0 +1,51 @@
 +/*
-+ * Misc useful routines to access NIC local SROM/OTP .
++ * Generic interrupt handler for Broadcom MIPS boards
 + *
-+ * Copyright 2005, Broadcom Corporation
++ * Copyright 2004, Broadcom Corporation
 + * All Rights Reserved.
 + * 
 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
@@ -1810,341 +1892,186 @@ diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmsrom.h linux-2.4.32-brcm/ar
 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
 + *
-+ * $Id$
++ * $Id: int-handler.S,v 1.1 2005/03/16 13:50:00 wbx Exp $
 + */
 +
-+#ifndef       _bcmsrom_h_
-+#define       _bcmsrom_h_
++#include <linux/config.h>
 +
-+extern int srom_var_init(void *sbh, uint bus, void *curmap, osl_t *osh, char **vars, int *count);
++#include <asm/asm.h>
++#include <asm/mipsregs.h>
++#include <asm/regdef.h>
++#include <asm/stackframe.h>
 +
-+extern int srom_read(uint bus, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf);
-+extern int srom_write(uint bus, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf);
++/*
++ *    MIPS IRQ        Source
++ *      --------        ------
++ *             0      Software (ignored)
++ *             1        Software (ignored)
++ *             2        Combined hardware interrupt (hw0)
++ *             3        Hardware
++ *             4        Hardware
++ *             5        Hardware
++ *             6        Hardware
++ *             7        R4k timer
++ */
 +
-+#endif        /* _bcmsrom_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmutils.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmutils.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bcmutils.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmutils.h    2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,313 @@
++      .text
++      .set    noreorder
++      .set    noat
++      .align  5
++      NESTED(brcmIRQ, PT_SIZE, sp)
++      SAVE_ALL
++      CLI
++      .set    at
++    .set    noreorder
++
++      jal         brcm_irq_dispatch
++       move   a0, sp
++
++      j           ret_from_irq
++       nop
++              
++      END(brcmIRQ)
+diff -urN linux.old/arch/mips/bcm947xx/generic/irq.c linux.dev/arch/mips/bcm947xx/generic/irq.c
+--- linux.old/arch/mips/bcm947xx/generic/irq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/generic/irq.c 2006-04-27 19:24:19.000000000 +0200
+@@ -0,0 +1,130 @@
 +/*
-+ * Misc useful os-independent macros and functions.
++ * Generic interrupt control functions for Broadcom MIPS boards
 + *
-+ * Copyright 2005, Broadcom Corporation
++ * Copyright 2004, 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$
++ *
++ * $Id: irq.c,v 1.1 2005/03/16 13:50:00 wbx Exp $
 + */
 +
-+#ifndef       _bcmutils_h_
-+#define       _bcmutils_h_
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
 +
-+/*** driver-only section ***/
-+#ifdef BCMDRIVER
-+#include <osl.h>
++#include <asm/irq.h>
++#include <asm/mipsregs.h>
++#include <asm/gdb-stub.h>
 +
-+#define _BCM_U        0x01    /* upper */
-+#define _BCM_L        0x02    /* lower */
-+#define _BCM_D        0x04    /* digit */
-+#define _BCM_C        0x08    /* cntrl */
-+#define _BCM_P        0x10    /* punct */
-+#define _BCM_S        0x20    /* white space (space/lf/tab) */
-+#define _BCM_X        0x40    /* hex digit */
-+#define _BCM_SP       0x80    /* hard space (0x20) */
++#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
 +
-+#define GPIO_PIN_NOTDEFINED   0x20 
++extern asmlinkage void brcmIRQ(void);
++extern asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs);
 +
-+extern unsigned char bcm_ctype[];
-+#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
++void
++brcm_irq_dispatch(struct pt_regs *regs)
++{
++      u32 cause;
 +
-+#define bcm_isalnum(c)        ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
-+#define bcm_isalpha(c)        ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
-+#define bcm_iscntrl(c)        ((bcm_ismask(c)&(_BCM_C)) != 0)
-+#define bcm_isdigit(c)        ((bcm_ismask(c)&(_BCM_D)) != 0)
-+#define bcm_isgraph(c)        ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
-+#define bcm_islower(c)        ((bcm_ismask(c)&(_BCM_L)) != 0)
-+#define bcm_isprint(c)        ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
-+#define bcm_ispunct(c)        ((bcm_ismask(c)&(_BCM_P)) != 0)
-+#define bcm_isspace(c)        ((bcm_ismask(c)&(_BCM_S)) != 0)
-+#define bcm_isupper(c)        ((bcm_ismask(c)&(_BCM_U)) != 0)
-+#define bcm_isxdigit(c)       ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
++      cause = read_c0_cause() &
++              read_c0_status() &
++              CAUSEF_IP;
 +
-+/*
-+ * Spin at most 'us' microseconds while 'exp' is true.
-+ * Caller should explicitly test 'exp' when this completes
-+ * and take appropriate error action if 'exp' is still true.
-+ */
-+#define SPINWAIT(exp, us) { \
-+      uint countdown = (us) + 9; \
-+      while ((exp) && (countdown >= 10)) {\
-+              OSL_DELAY(10); \
-+              countdown -= 10; \
-+      } \
-+}
++#ifdef CONFIG_KERNPROF
++      change_c0_status(cause | 1, 1);
++#else
++      clear_c0_status(cause);
++#endif
 +
-+/* generic osl packet queue */
-+struct pktq {
-+      void *head;     /* first packet to dequeue */
-+      void *tail;     /* last packet to dequeue */
-+      uint len;       /* number of queued packets */
-+      uint maxlen;    /* maximum number of queued packets */
-+      bool priority;  /* enqueue by packet priority */
-+      uint8 prio_map[MAXPRIO+1]; /* user priority to packet enqueue policy map */
-+};
-+#define DEFAULT_QLEN  128
++      if (cause & CAUSEF_IP7)
++              do_IRQ(7, regs);
++      if (cause & CAUSEF_IP2)
++              do_IRQ(2, regs);
++      if (cause & CAUSEF_IP3)
++              do_IRQ(3, regs);
++      if (cause & CAUSEF_IP4)
++              do_IRQ(4, regs);
++      if (cause & CAUSEF_IP5)
++              do_IRQ(5, regs);
++      if (cause & CAUSEF_IP6)
++              do_IRQ(6, regs);
++}
 +
-+#define       pktq_len(q)     ((q)->len)
-+#define       pktq_avail(q)   ((q)->maxlen - (q)->len)
-+#define       pktq_head(q)    ((q)->head)
-+#define       pktq_full(q)    ((q)->len >= (q)->maxlen)
-+#define       _pktq_pri(q, pri)       ((q)->prio_map[pri])
-+#define       pktq_tailpri(q) ((q)->tail ? _pktq_pri(q, PKTPRIO((q)->tail)) : _pktq_pri(q, 0))
-+
-+/* externs */
-+/* packet */
-+extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
-+extern uint pkttotlen(osl_t *osh, void *);
-+extern void pktq_init(struct pktq *q, uint maxlen, const uint8 prio_map[]);
-+extern void pktenq(struct pktq *q, void *p, bool lifo);
-+extern void *pktdeq(struct pktq *q);
-+extern void *pktdeqtail(struct pktq *q);
-+/* string */
-+extern uint bcm_atoi(char *s);
-+extern uchar bcm_toupper(uchar c);
-+extern ulong bcm_strtoul(char *cp, char **endp, uint base);
-+extern char *bcmstrstr(char *haystack, char *needle);
-+extern char *bcmstrcat(char *dest, const char *src);
-+extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
-+/* ethernet address */
-+extern char *bcm_ether_ntoa(char *ea, char *buf);
-+extern int bcm_ether_atoe(char *p, char *ea);
-+/* delay */
-+extern void bcm_mdelay(uint ms);
-+/* variable access */
-+extern char *getvar(char *vars, char *name);
-+extern int getintvar(char *vars, char *name);
-+extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
-+#define       bcmlog(fmt, a1, a2)
-+#define       bcmdumplog(buf, size)   *buf = '\0'
-+#define       bcmdumplogent(buf, idx) -1
-+
-+#endif        /* #ifdef BCMDRIVER */
-+
-+/*** driver/apps-shared section ***/
-+
-+#define BCME_STRLEN           64
-+#define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
-+
-+
-+/* 
-+ * error codes could be added but the defined ones shouldn't be changed/deleted 
-+ * these error codes are exposed to the user code 
-+ * when ever a new error code is added to this list 
-+ * please update errorstring table with the related error string and 
-+ * update osl files with os specific errorcode map   
-+*/
-+
-+#define BCME_ERROR                    -1      /* Error generic */
-+#define BCME_BADARG                   -2      /* Bad Argument */
-+#define BCME_BADOPTION                        -3      /* Bad option */
-+#define BCME_NOTUP                    -4      /* Not up */
-+#define BCME_NOTDOWN                  -5      /* Not down */
-+#define BCME_NOTAP                    -6      /* Not AP */
-+#define BCME_NOTSTA                   -7      /* Not STA  */
-+#define BCME_BADKEYIDX                        -8      /* BAD Key Index */
-+#define BCME_RADIOOFF                         -9      /* Radio Off */
-+#define BCME_NOTBANDLOCKED            -10     /* Not  bandlocked */
-+#define BCME_NOCLK                    -11     /* No Clock*/
-+#define BCME_BADRATESET                       -12     /* BAD RateSet*/
-+#define BCME_BADBAND                  -13     /* BAD Band */
-+#define BCME_BUFTOOSHORT              -14     /* Buffer too short */  
-+#define BCME_BUFTOOLONG                       -15     /* Buffer too Long */   
-+#define BCME_BUSY                     -16     /* Busy*/       
-+#define BCME_NOTASSOCIATED            -17     /* Not associated*/
-+#define BCME_BADSSIDLEN                       -18     /* BAD SSID Len */
-+#define BCME_OUTOFRANGECHAN           -19     /* Out of Range Channel*/
-+#define BCME_BADCHAN                  -20     /* BAD Channel */
-+#define BCME_BADADDR                  -21     /* BAD Address*/
-+#define BCME_NORESOURCE                       -22     /* No resources*/
-+#define BCME_UNSUPPORTED              -23     /* Unsupported*/
-+#define BCME_BADLEN                   -24     /* Bad Length*/
-+#define BCME_NOTREADY                 -25     /* Not ready Yet*/
-+#define BCME_EPERM                    -26     /* Not Permitted */
-+#define BCME_NOMEM                    -27     /* No Memory */
-+#define BCME_ASSOCIATED                       -28     /* Associated */
-+#define BCME_RANGE                    -29     /* Range Error*/
-+#define BCME_NOTFOUND                 -30     /* Not found */
-+#define BCME_LAST                     BCME_NOTFOUND   
-+
-+#ifndef ABS
-+#define       ABS(a)                  (((a)<0)?-(a):(a))
-+#endif
-+
-+#ifndef MIN
-+#define       MIN(a, b)               (((a)<(b))?(a):(b))
-+#endif
-+
-+#ifndef MAX
-+#define       MAX(a, b)               (((a)>(b))?(a):(b))
-+#endif
-+
-+#define CEIL(x, y)            (((x) + ((y)-1)) / (y))
-+#define       ROUNDUP(x, y)           ((((x)+((y)-1))/(y))*(y))
-+#define       ISALIGNED(a, x)         (((a) & ((x)-1)) == 0)
-+#define       ISPOWEROF2(x)           ((((x)-1)&(x))==0)
-+#define VALID_MASK(mask)      !((mask) & ((mask) + 1))
-+#define       OFFSETOF(type, member)  ((uint)(uintptr)&((type *)0)->member)
-+#define ARRAYSIZE(a)          (sizeof(a)/sizeof(a[0]))
-+
-+/* bit map related macros */
-+#ifndef setbit
-+#define       NBBY    8       /* 8 bits per byte */
-+#define       setbit(a,i)     (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
-+#define       clrbit(a,i)     (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
-+#define       isset(a,i)      (((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
-+#define       isclr(a,i)      ((((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
-+#endif
-+
-+#define       NBITS(type)     (sizeof(type) * 8)
-+#define NBITVAL(bits) (1 << (bits))
-+#define MAXBITVAL(bits)       ((1 << (bits)) - 1)
-+
-+/* crc defines */
-+#define CRC8_INIT_VALUE  0xff         /* Initial CRC8 checksum value */
-+#define CRC8_GOOD_VALUE  0x9f         /* Good final CRC8 checksum value */
-+#define CRC16_INIT_VALUE 0xffff               /* Initial CRC16 checksum value */
-+#define CRC16_GOOD_VALUE 0xf0b8               /* Good final CRC16 checksum value */
-+#define CRC32_INIT_VALUE 0xffffffff   /* Initial CRC32 checksum value */
-+#define CRC32_GOOD_VALUE 0xdebb20e3   /* Good final CRC32 checksum value */
-+
-+/* bcm_format_flags() bit description structure */
-+typedef struct bcm_bit_desc {
-+      uint32  bit;
-+      char*   name;
-+} bcm_bit_desc_t;
-+
-+/* tag_ID/length/value_buffer tuple */
-+typedef struct bcm_tlv {
-+      uint8   id;
-+      uint8   len;
-+      uint8   data[1];
-+} bcm_tlv_t;
-+
-+/* Check that bcm_tlv_t fits into the given buflen */
-+#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
-+
-+/* buffer length for ethernet address from bcm_ether_ntoa() */
-+#define ETHER_ADDR_STR_LEN    18
-+
-+/* unaligned load and store macros */
-+#ifdef IL_BIGENDIAN
-+static INLINE uint32
-+load32_ua(uint8 *a)
-+{
-+      return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]);
-+}
-+
-+static INLINE void
-+store32_ua(uint8 *a, uint32 v)
++static void
++enable_brcm_irq(unsigned int irq)
 +{
-+      a[0] = (v >> 24) & 0xff;
-+      a[1] = (v >> 16) & 0xff;
-+      a[2] = (v >> 8) & 0xff;
-+      a[3] = v & 0xff;
++      if (irq < 8)
++              set_c0_status(1 << (irq + 8));
++      else
++              set_c0_status(IE_IRQ0);
 +}
 +
-+static INLINE uint16
-+load16_ua(uint8 *a)
++static void
++disable_brcm_irq(unsigned int irq)
 +{
-+      return ((a[0] << 8) | a[1]);
++      if (irq < 8)
++              clear_c0_status(1 << (irq + 8));
++      else
++              clear_c0_status(IE_IRQ0);
 +}
 +
-+static INLINE void
-+store16_ua(uint8 *a, uint16 v)
++static void
++ack_brcm_irq(unsigned int irq)
 +{
-+      a[0] = (v >> 8) & 0xff;
-+      a[1] = v & 0xff;
++      /* Already done in brcm_irq_dispatch */
 +}
 +
-+#else
++static unsigned int
++startup_brcm_irq(unsigned int irq)
++{ 
++      enable_brcm_irq(irq);
 +
-+static INLINE uint32
-+load32_ua(uint8 *a)
-+{
-+      return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]);
++      return 0; /* never anything pending */
 +}
 +
-+static INLINE void
-+store32_ua(uint8 *a, uint32 v)
++static void
++end_brcm_irq(unsigned int irq)
 +{
-+      a[3] = (v >> 24) & 0xff;
-+      a[2] = (v >> 16) & 0xff;
-+      a[1] = (v >> 8) & 0xff;
-+      a[0] = v & 0xff;
++      if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
++              enable_brcm_irq(irq);
 +}
 +
-+static INLINE uint16
-+load16_ua(uint8 *a)
-+{
-+      return ((a[1] << 8) | a[0]);
-+}
++static struct hw_interrupt_type brcm_irq_type = {
++      typename: "MIPS",
++      startup: startup_brcm_irq,
++      shutdown: disable_brcm_irq,
++      enable: enable_brcm_irq,
++      disable: disable_brcm_irq,
++      ack: ack_brcm_irq,
++      end: end_brcm_irq,
++      NULL
++};
 +
-+static INLINE void
-+store16_ua(uint8 *a, uint16 v)
++void __init
++init_IRQ(void)
 +{
-+      a[1] = (v >> 8) & 0xff;
-+      a[0] = v & 0xff;
-+}
-+
-+#endif
-+
-+/* externs */
-+/* crc */
-+extern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc);
-+extern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc);
-+extern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc);
-+/* format/print */
-+/* IE parsing */
-+extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
-+extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
-+extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
-+
-+/* bcmerror*/
-+extern const char *bcmerrorstr(int bcmerror);
-+
-+/* multi-bool data type: set of bools, mbool is true if any is set */
-+typedef uint32 mbool;
-+#define mboolset(mb, bit)             (mb |= bit)             /* set one bool */
-+#define mboolclr(mb, bit)             (mb &= ~bit)            /* clear one bool */
-+#define mboolisset(mb, bit)           ((mb & bit) != 0)       /* TRUE if one bool is set */
-+#define       mboolmaskset(mb, mask, val)     ((mb) = (((mb) & ~(mask)) | (val)))
-+
-+/* power conversion */
-+extern uint16 bcm_qdbm_to_mw(uint8 qdbm);
-+extern uint8 bcm_mw_to_qdbm(uint16 mw);
-+
-+/* generic datastruct to help dump routines */
-+struct fielddesc {
-+      char    *nameandfmt;
-+      uint32  offset;
-+      uint32  len;
-+};
++      int i;
 +
-+typedef  uint32 (*readreg_rtn)(void *arg0, void *arg1, uint32 offset);
-+extern uint bcmdumpfields(readreg_rtn func_ptr, void *arg0, void *arg1, struct fielddesc *str, char *buf, uint32 bufsize);
++      for (i = 0; i < NR_IRQS; i++) {
++              irq_desc[i].status = IRQ_DISABLED;
++              irq_desc[i].action = 0;
++              irq_desc[i].depth = 1;
++              irq_desc[i].handler = &brcm_irq_type;
++      }
 +
-+extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
++      set_except_vector(0, brcmIRQ);
++      change_c0_status(ST0_IM, ALLINTS);
 +
-+#endif        /* _bcmutils_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bitfuncs.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bitfuncs.h
---- linux-2.4.32/arch/mips/bcm947xx/include/bitfuncs.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bitfuncs.h    2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,85 @@
++#ifdef CONFIG_REMOTE_DEBUG
++      printk("Breaking into debugger...\n");
++      set_debug_traps();
++      breakpoint(); 
++#endif
++}
+diff -urN linux.old/arch/mips/bcm947xx/gpio.c linux.dev/arch/mips/bcm947xx/gpio.c
+--- linux.old/arch/mips/bcm947xx/gpio.c        1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/gpio.c        2006-04-27 23:09:33.000000000 +0200
+@@ -0,0 +1,159 @@
 +/*
-+ * bit manipulation utility functions
++ * GPIO char driver
 + *
 + * Copyright 2005, Broadcom Corporation
 + * All Rights Reserved.
@@ -2153,282 +2080,163 @@ diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bitfuncs.h linux-2.4.32-brcm/a
 + * 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$
 + */
 +
-+#ifndef _BITFUNCS_H
-+#define _BITFUNCS_H
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/miscdevice.h>
++#include <asm/uaccess.h>
 +
 +#include <typedefs.h>
++#include <osl.h>
++#include <bcmutils.h>
++#include <sbutils.h>
++#include <bcmdevs.h>
 +
-+/* local prototypes */
-+static INLINE uint32 find_msbit(uint32 x);
-+
++static sb_t *gpio_sbh;
++static int gpio_major;
++static devfs_handle_t gpio_dir;
++static struct {
++      char *name;
++      devfs_handle_t handle;
++} gpio_file[] = {
++      { "in", NULL },
++      { "out", NULL },
++      { "outen", NULL },
++      { "control", NULL }
++};
 +
-+/*
-+ * find_msbit: returns index of most significant set bit in x, with index
-+ *   range defined as 0-31.  NOTE: returns zero if input is zero.
-+ */
++static int
++gpio_open(struct inode *inode, struct file * file)
++{
++      if (MINOR(inode->i_rdev) > ARRAYSIZE(gpio_file))
++              return -ENODEV;
 +
-+#if defined(USE_PENTIUM_BSR) && defined(__GNUC__)
++      MOD_INC_USE_COUNT;
++      return 0;
++}
 +
-+/*
-+ * Implementation for Pentium processors and gcc.  Note that this
-+ * instruction is actually very slow on some processors (e.g., family 5,
-+ * model 2, stepping 12, "Pentium 75 - 200"), so we use the generic
-+ * implementation instead.
-+ */
-+static INLINE uint32 find_msbit(uint32 x)
++static int
++gpio_release(struct inode *inode, struct file * file)
 +{
-+      uint msbit;
-+        __asm__("bsrl %1,%0"
-+                :"=r" (msbit)
-+                :"r" (x));
-+        return msbit;
++      MOD_DEC_USE_COUNT;
++      return 0;
 +}
 +
-+#else
-+
-+/*
-+ * Generic Implementation
-+ */
-+
-+#define DB_POW_MASK16 0xffff0000
-+#define DB_POW_MASK8  0x0000ff00
-+#define DB_POW_MASK4  0x000000f0
-+#define DB_POW_MASK2  0x0000000c
-+#define DB_POW_MASK1  0x00000002
-+
-+static INLINE uint32 find_msbit(uint32 x)
++static ssize_t
++gpio_read(struct file *file, char *buf, size_t count, loff_t *ppos)
 +{
-+      uint32 temp_x = x;
-+      uint msbit = 0;
-+      if (temp_x & DB_POW_MASK16) {
-+              temp_x >>= 16;
-+              msbit = 16;
-+      }
-+      if (temp_x & DB_POW_MASK8) {
-+              temp_x >>= 8;
-+              msbit += 8;
-+      }
-+      if (temp_x & DB_POW_MASK4) {
-+              temp_x >>= 4;
-+              msbit += 4;
-+      }
-+      if (temp_x & DB_POW_MASK2) {
-+              temp_x >>= 2;
-+              msbit += 2;
-+      }
-+      if (temp_x & DB_POW_MASK1) {
-+              msbit += 1;
-+      }
-+      return(msbit);
-+}
-+
-+#endif
-+
-+#endif /* _BITFUNCS_H */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/cfe_osl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/cfe_osl.h
---- linux-2.4.32/arch/mips/bcm947xx/include/cfe_osl.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/cfe_osl.h     2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,191 @@
-+/*
-+ * CFE boot loader OS Abstraction Layer.
-+ *
-+ * Copyright 2005, Broadcom Corporation
-+ * All Rights Reserved.                
-+ *                                     
-+ * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;   
-+ * the contents of this file may not be disclosed to third parties, copied
-+ * or duplicated in any form, in whole or in part, without the prior      
-+ * written permission of Broadcom Corporation.                            
-+ *
-+ * $Id$
-+ */
-+
-+#ifndef _cfe_osl_h_
-+#define _cfe_osl_h_
-+
-+#include <lib_types.h>
-+#include <lib_string.h>
-+#include <lib_printf.h>
-+#include <lib_malloc.h>
-+#include <cpu_config.h>
-+#include <cfe_timer.h>
-+#include <cfe_iocb.h>
-+#include <cfe_devfuncs.h>
-+#include <addrspace.h>
-+
-+#include <typedefs.h>
-+
-+/* dump string */
-+extern int (*xprinthook)(const char *str);
-+#define puts(str) do { if (xprinthook) xprinthook(str); } while (0)
-+
-+/* assert and panic */
-+#define       ASSERT(exp)             do {} while (0)
-+
-+/* PCMCIA attribute space access macros */
-+#define       OSL_PCMCIA_READ_ATTR(osh, offset, buf, size) \
-+      bzero(buf, size)
-+#define       OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size) \
-+      do {} while (0)
-+
-+/* PCI configuration space access macros */
-+#define       OSL_PCI_READ_CONFIG(loc, offset, size) \
-+      (offset == 8 ? 0 : 0xffffffff)
-+#define       OSL_PCI_WRITE_CONFIG(loc, offset, size, val) \
-+      do {} while (0)
++      u32 val;
 +
-+/* PCI device bus # and slot # */
-+#define OSL_PCI_BUS(osh)      (0)
-+#define OSL_PCI_SLOT(osh)     (0)
++      switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
++      case 0:
++              val = sb_gpioin(gpio_sbh);
++              break;
++      case 1:
++              val = sb_gpioout(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
++              break;
++      case 2:
++              val = sb_gpioouten(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
++              break;
++      case 3:
++              val = sb_gpiocontrol(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
++              break;
++      default:
++              return -ENODEV;
++      }
 +
-+/* register access macros */
-+#define wreg32(r, v)          (*(volatile uint32*)(r) = (uint32)(v))
-+#define rreg32(r)             (*(volatile uint32*)(r))
-+#ifdef IL_BIGENDIAN
-+#define wreg16(r, v)          (*(volatile uint16*)((ulong)(r)^2) = (uint16)(v))
-+#define rreg16(r)             (*(volatile uint16*)((ulong)(r)^2))
-+#define wreg8(r, v)           (*(volatile uint8*)((ulong)(r)^3) = (uint8)(v))
-+#define rreg8(r)              (*(volatile uint8*)((ulong)(r)^3))
-+#else
-+#define wreg16(r, v)          (*(volatile uint16*)(r) = (uint16)(v))
-+#define rreg16(r)             (*(volatile uint16*)(r))
-+#define wreg8(r, v)           (*(volatile uint8*)(r) = (uint8)(v))
-+#define rreg8(r)              (*(volatile uint8*)(r))
-+#endif
-+#define R_REG(r) ({ \
-+      __typeof(*(r)) __osl_v; \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     __osl_v = rreg8((r)); break; \
-+      case sizeof(uint16):    __osl_v = rreg16((r)); break; \
-+      case sizeof(uint32):    __osl_v = rreg32((r)); break; \
-+      } \
-+      __osl_v; \
-+})
-+#define W_REG(r, v) do { \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     wreg8((r), (v)); break; \
-+      case sizeof(uint16):    wreg16((r), (v)); break; \
-+      case sizeof(uint32):    wreg32((r), (v)); break; \
-+      } \
-+} while (0)
-+#define       AND_REG(r, v)           W_REG((r), R_REG(r) & (v))
-+#define       OR_REG(r, v)            W_REG((r), R_REG(r) | (v))
++      if (put_user(val, (u32 *) buf))
++              return -EFAULT;
 +
-+/* bcopy, bcmp, and bzero */
-+#define bcmp(b1, b2, len)     lib_memcmp((b1), (b2), (len))
++      return sizeof(val);
++}
 +
-+#define osl_attach(pdev)      ((osl_t*)pdev)
-+#define osl_detach(osh)               
++static ssize_t
++gpio_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
++{
++      u32 val;
 +
-+/* general purpose memory allocation */
-+#define       MALLOC(osh, size)       KMALLOC((size),0)
-+#define       MFREE(osh, addr, size)  KFREE((addr))
-+#define       MALLOCED(osh)           (0)
-+#define       MALLOC_DUMP(osh, buf, sz)
-+#define       MALLOC_FAILED(osh)      (0)
++      if (get_user(val, (u32 *) buf))
++              return -EFAULT;
 +
-+/* uncached virtual address */
-+#define       OSL_UNCACHED(va)        ((void*)UNCADDR((ulong)(va)))
++      switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
++      case 0:
++              return -EACCES;
++      case 1:
++              sb_gpioout(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
++              break;
++      case 2:
++              sb_gpioouten(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
++              break;
++      case 3:
++              sb_gpiocontrol(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
++              break;
++      default:
++              return -ENODEV;
++      }
 +
-+/* host/bus architecture-specific address byte swap */
-+#define BUS_SWAP32(v)         (v)
++      return sizeof(val);
++}
 +
-+/* get processor cycle count */
-+#define OSL_GETCYCLES(x)      ((x) = 0)
++static struct file_operations gpio_fops = {
++      owner:          THIS_MODULE,
++      open:           gpio_open,
++      release:        gpio_release,
++      read:           gpio_read,
++      write:          gpio_write,
++};
 +
-+/* microsecond delay */
-+#define       OSL_DELAY(usec)         cfe_usleep((cfe_cpu_speed/CPUCFG_CYCLESPERCPUTICK/1000000*(usec)))
++static int __init
++gpio_init(void)
++{
++      int i;
 +
-+#define OSL_ERROR(bcmerror)   osl_error(bcmerror)
++      if (!(gpio_sbh = sb_kattach()))
++              return -ENODEV;
 +
-+/* map/unmap physical to virtual I/O */
-+#define       REG_MAP(pa, size)       ((void*)UNCADDR((ulong)(pa)))
-+#define       REG_UNMAP(va)           do {} while (0)
++      sb_gpiosetcore(gpio_sbh);
 +
-+/* dereference an address that may cause a bus exception */
-+#define       BUSPROBE(val, addr)     osl_busprobe(&(val), (uint32)(addr))
-+extern int osl_busprobe(uint32 *val, uint32 addr);
-+
-+/* allocate/free shared (dma-able) consistent (uncached) memory */
-+#define       DMA_CONSISTENT_ALIGN    4096
-+#define       DMA_ALLOC_CONSISTENT(osh, size, pap) \
-+      osl_dma_alloc_consistent((size), (pap))
-+#define       DMA_FREE_CONSISTENT(osh, va, size, pa) \
-+      osl_dma_free_consistent((void*)(va))
-+extern void *osl_dma_alloc_consistent(uint size, ulong *pap);
-+extern void osl_dma_free_consistent(void *va);
++      if ((gpio_major = devfs_register_chrdev(0, "gpio", &gpio_fops)) < 0)
++              return gpio_major;
 +
-+/* map/unmap direction */
-+#define       DMA_TX                  1
-+#define       DMA_RX                  2
++      gpio_dir = devfs_mk_dir(NULL, "gpio", NULL);
 +
-+/* map/unmap shared (dma-able) memory */
-+#define       DMA_MAP(osh, va, size, direction, lb) ({ \
-+      cfe_flushcache(CFE_CACHE_FLUSH_D); \
-+      PHYSADDR((ulong)(va)); \
-+})
-+#define       DMA_UNMAP(osh, pa, size, direction, p) \
-+      do {} while (0)
++      for (i = 0; i < ARRAYSIZE(gpio_file); i++) {
++              gpio_file[i].handle = devfs_register(gpio_dir,
++                                                   gpio_file[i].name,
++                                                   DEVFS_FL_DEFAULT, gpio_major, i,
++                                                   S_IFCHR | S_IRUGO | S_IWUGO,
++                                                   &gpio_fops, NULL);
++      }
 +
-+/* shared (dma-able) memory access macros */
-+#define       R_SM(r)                 *(r)
-+#define       W_SM(r, v)              (*(r) = (v))
-+#define       BZERO_SM(r, len)        lib_memset((r), '\0', (len))
-+
-+/* generic packet structure */
-+#define LBUFSZ                4096
-+#define LBDATASZ      (LBUFSZ - sizeof(struct lbuf))
-+struct lbuf { 
-+      struct lbuf     *next;          /* pointer to next lbuf if in a chain */
-+      struct lbuf     *link;          /* pointer to next lbuf if in a list */
-+      uchar           *head;          /* start of buffer */
-+      uchar           *end;           /* end of buffer */
-+      uchar           *data;          /* start of data */
-+      uchar           *tail;          /* end of data */
-+      uint            len;            /* nbytes of data */
-+      void            *cookie;        /* generic cookie */
-+};
++      return 0;
++}
 +
-+/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
-+#define       PKTBUFSZ        2048
++static void __exit
++gpio_exit(void)
++{
++      int i;
 +
-+/* packet primitives */
-+#define       PKTGET(osh, len, send)          ((void*)osl_pktget((len)))
-+#define       PKTFREE(osh, lb, send)          osl_pktfree((struct lbuf*)(lb))
-+#define       PKTDATA(osh, lb)                (((struct lbuf*)(lb))->data)
-+#define       PKTLEN(osh, lb)                 (((struct lbuf*)(lb))->len)
-+#define PKTHEADROOM(osh, lb)          (PKTDATA(osh,lb)-(((struct lbuf*)(lb))->head))
-+#define PKTTAILROOM(osh, lb)          ((((struct lbuf*)(lb))->end)-(((struct lbuf*)(lb))->tail))
-+#define       PKTNEXT(osh, lb)                (((struct lbuf*)(lb))->next)
-+#define       PKTSETNEXT(lb, x)               (((struct lbuf*)(lb))->next = (struct lbuf*)(x))
-+#define       PKTSETLEN(osh, lb, len)         osl_pktsetlen((struct lbuf*)(lb), (len))
-+#define       PKTPUSH(osh, lb, bytes)         osl_pktpush((struct lbuf*)(lb), (bytes))
-+#define       PKTPULL(osh, lb, bytes)         osl_pktpull((struct lbuf*)(lb), (bytes))
-+#define       PKTDUP(osh, lb)                 osl_pktdup((struct lbuf*)(lb))
-+#define       PKTCOOKIE(lb)                   (((struct lbuf*)(lb))->cookie)
-+#define       PKTSETCOOKIE(lb, x)             (((struct lbuf*)(lb))->cookie = (void*)(x))
-+#define       PKTLINK(lb)                     (((struct lbuf*)(lb))->link)
-+#define       PKTSETLINK(lb, x)               (((struct lbuf*)(lb))->link = (struct lbuf*)(x))
-+#define       PKTPRIO(lb)                     (0)
-+#define       PKTSETPRIO(lb, x)               do {} while (0)
-+extern struct lbuf *osl_pktget(uint len);
-+extern void osl_pktfree(struct lbuf *lb);
-+extern void osl_pktsetlen(struct lbuf *lb, uint len);
-+extern uchar *osl_pktpush(struct lbuf *lb, uint bytes);
-+extern uchar *osl_pktpull(struct lbuf *lb, uint bytes);
-+extern struct lbuf *osl_pktdup(struct lbuf *lb);
-+extern int osl_error(int bcmerror);
++      for (i = 0; i < ARRAYSIZE(gpio_file); i++)
++              devfs_unregister(gpio_file[i].handle);
++      devfs_unregister(gpio_dir);
++      devfs_unregister_chrdev(gpio_major, "gpio");
++      sb_detach(gpio_sbh);
++}
 +
-+#endif        /* _cfe_osl_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/epivers.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/epivers.h
---- linux-2.4.32/arch/mips/bcm947xx/include/epivers.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/epivers.h     2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,69 @@
++module_init(gpio_init);
++module_exit(gpio_exit);
+diff -urN linux.old/arch/mips/bcm947xx/hndchipc.c linux.dev/arch/mips/bcm947xx/hndchipc.c
+--- linux.old/arch/mips/bcm947xx/hndchipc.c    1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/hndchipc.c    2006-04-28 00:33:05.000000000 +0200
+@@ -0,0 +1,158 @@
 +/*
-+ * Copyright 2005, Broadcom Corporation
++ * BCM47XX support code for some chipcommon (old extif) facilities (uart)
++ *
++ * Copyright 2006, Broadcom Corporation
 + * All Rights Reserved.
 + * 
 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
@@ -2436,2109 +2244,1336 @@ diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/epivers.h linux-2.4.32-brcm/ar
 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
 + *
-+ * $Id$
-+ *
-+*/
-+
-+#ifndef _epivers_h_
-+#define _epivers_h_
-+
-+#ifdef        linux
-+#include <linux/config.h>
-+#endif
-+
-+/* Vendor Name, ASCII, 32 chars max */
-+#ifdef COMPANYNAME
-+#define       HPNA_VENDOR             COMPANYNAME
-+#else
-+#define       HPNA_VENDOR             "Broadcom Corporation"
-+#endif
++ * $Id: hndchipc.c,v 1.1.1.1 2006/02/27 03:43:16 honor Exp $
++ */
 +
-+/* Driver Date, ASCII, 32 chars max */
-+#define HPNA_DRV_BUILD_DATE   __DATE__
++#include <typedefs.h>
++#include <bcmdefs.h>
++#include <osl.h>
++#include <bcmutils.h>
++#include <sbutils.h>
++#include <bcmdevs.h>
++#include <bcmnvram.h>
++#include <sbconfig.h>
++#include <sbextif.h>
++#include <sbchipc.h>
++#include <hndcpu.h>
 +
-+/* Hardware Manufacture Date, ASCII, 32 chars max */
-+#define HPNA_HW_MFG_DATE      "Not Specified"
++/*
++ * Returns TRUE if an external UART exists at the given base
++ * register.
++ */
++static bool
++BCMINITFN(serial_exists)(osl_t *osh, uint8 *regs)
++{
++      uint8 save_mcr, status1;
 +
-+/* See documentation for Device Type values, 32 values max */
-+#ifndef       HPNA_DEV_TYPE
++      save_mcr = R_REG(osh, &regs[UART_MCR]);
++      W_REG(osh, &regs[UART_MCR], UART_MCR_LOOP | 0x0a);
++      status1 = R_REG(osh, &regs[UART_MSR]) & 0xf0;
++      W_REG(osh, &regs[UART_MCR], save_mcr);
 +
-+#if   defined(CONFIG_BRCM_VJ)
-+#define HPNA_DEV_TYPE         { CDCF_V0_DEVICE_DISPLAY }
++      return (status1 == 0x90);
++}
 +
-+#elif defined(CONFIG_BCRM_93725)
-+#define HPNA_DEV_TYPE         { CDCF_V0_DEVICE_CM_BRIDGE, CDCF_V0_DEVICE_DISPLAY }
++/*
++ * Initializes UART access. The callback function will be called once
++ * per found UART.
++ */
++void
++BCMINITFN(sb_serial_init)(sb_t *sbh, void (*add)(void *regs, uint irq, uint baud_base,
++                                                 uint reg_shift))
++{
++      osl_t *osh;
++      void *regs;
++      ulong base;
++      uint irq;
++      int i, n;
 +
-+#else
-+#define HPNA_DEV_TYPE         { CDCF_V0_DEVICE_PCINIC }
++      osh = sb_osh(sbh);
 +
-+#endif
++      if ((regs = sb_setcore(sbh, SB_EXTIF, 0))) {
++              extifregs_t *eir = (extifregs_t *) regs;
++              sbconfig_t *sb;
 +
-+#endif        /* !HPNA_DEV_TYPE */
++              /* Determine external UART register base */
++              sb = (sbconfig_t *)((ulong) eir + SBCONFIGOFF);
++              base = EXTIF_CFGIF_BASE(sb_base(R_REG(osh, &sb->sbadmatch1)));
 +
++              /* Determine IRQ */
++              irq = sb_irq(sbh);
 +
-+#define       EPI_MAJOR_VERSION       3
++              /* Disable GPIO interrupt initially */
++              W_REG(osh, &eir->gpiointpolarity, 0);
++              W_REG(osh, &eir->gpiointmask, 0);
 +
-+#define       EPI_MINOR_VERSION       130
++              /* Search for external UARTs */
++              n = 2;
++              for (i = 0; i < 2; i++) {
++                      regs = (void *) REG_MAP(base + (i * 8), 8);
++                      if (serial_exists(osh, regs)) {
++                              /* Set GPIO 1 to be the external UART IRQ */
++                              W_REG(osh, &eir->gpiointmask, 2);
++                              /* XXXDetermine external UART clock */
++                              if (add)
++                                      add(regs, irq, 13500000, 0);
++                      }
++              }
 +
-+#define       EPI_RC_NUMBER           20
++              /* Add internal UART if enabled */
++              if (R_REG(osh, &eir->corecontrol) & CC_UE)
++                      if (add)
++                              add((void *) &eir->uartdata, irq, sb_clock(sbh), 2);
++      } else if ((regs = sb_setcore(sbh, SB_CC, 0))) {
++              chipcregs_t *cc = (chipcregs_t *) regs;
++              uint32 rev, cap, pll, baud_base, div;
 +
-+#define       EPI_INCREMENTAL_NUMBER  0
++              /* Determine core revision and capabilities */
++              rev = sb_corerev(sbh);
++              cap = R_REG(osh, &cc->capabilities);
++              pll = cap & CAP_PLL_MASK;
 +
-+#define       EPI_BUILD_NUMBER        0
++              /* Determine IRQ */
++              irq = sb_irq(sbh);
 +
-+#define       EPI_VERSION             3,130,20,0
++              if (pll == PLL_TYPE1) {
++                      /* PLL clock */
++                      baud_base = sb_clock_rate(pll,
++                                                R_REG(osh, &cc->clockcontrol_n),
++                                                R_REG(osh, &cc->clockcontrol_m2));
++                      div = 1;
++              } else {
++                      /* Fixed ALP clock */
++                      if (rev >= 11 && rev != 15) {
++                              baud_base = 20000000;
++                              div = 1;
++                              /* Set the override bit so we don't divide it */
++                              W_REG(osh, &cc->corecontrol, CC_UARTCLKO);
++                      }
++                      /* Internal backplane clock */
++                      else if (rev >= 3) {
++                              baud_base = sb_clock(sbh);
++                              div = 2;        /* Minimum divisor */
++                              W_REG(osh, &cc->clkdiv,
++                                    ((R_REG(osh, &cc->clkdiv) & ~CLKD_UART) | div));
++                      }
++                      /* Fixed internal backplane clock */
++                      else {
++                              baud_base = 88000000;
++                              div = 48;
++                      }
 +
-+#define       EPI_VERSION_NUM         0x03821400
++                      /* Clock source depends on strapping if UartClkOverride is unset */
++                      if ((rev > 0) &&
++                          ((R_REG(osh, &cc->corecontrol) & CC_UARTCLKO) == 0)) {
++                              if ((cap & CAP_UCLKSEL) == CAP_UINTCLK) {
++                                      /* Internal divided backplane clock */
++                                      baud_base /= div;
++                              } else {
++                                      /* Assume external clock of 1.8432 MHz */
++                                      baud_base = 1843200;
++                              }
++                      }
++              }
 +
-+/* Driver Version String, ASCII, 32 chars max */
-+#define       EPI_VERSION_STR         "3.130.20.0"
-+#define       EPI_ROUTER_VERSION_STR  "3.131.20.0"
++              /* Add internal UARTs */
++              n = cap & CAP_UARTS_MASK;
++              for (i = 0; i < n; i++) {
++                      /* Register offset changed after revision 0 */
++                      if (rev)
++                              regs = (void *)((ulong) &cc->uart0data + (i * 256));
++                      else
++                              regs = (void *)((ulong) &cc->uart0data + (i * 8));
 +
-+#endif /* _epivers_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/epivers.h.in linux-2.4.32-brcm/arch/mips/bcm947xx/include/epivers.h.in
---- linux-2.4.32/arch/mips/bcm947xx/include/epivers.h.in       1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/epivers.h.in  2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,69 @@
-+/*
-+ * Copyright 2005, 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.
++                      if (add)
++                              add(regs, irq, baud_base, 0);
++              }
++      }
++}
++
+diff -urN linux.old/arch/mips/bcm947xx/include/bcm4710.h linux.dev/arch/mips/bcm947xx/include/bcm4710.h
+--- linux.old/arch/mips/bcm947xx/include/bcm4710.h     1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcm4710.h     2006-04-27 22:30:01.000000000 +0200
+@@ -0,0 +1,91 @@
++/*
++ * BCM4710 address space map and definitions
++ * Think twice before adding to this file, this is not the kitchen sink
++ * These definitions are not guaranteed for all 47xx chips, only the 4710
 + *
-+ * $Id$
++ * Copyright 2004, 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.   
 + *
-+*/
-+
-+#ifndef _epivers_h_
-+#define _epivers_h_
-+
-+#ifdef        linux
-+#include <linux/config.h>
-+#endif
-+
-+/* Vendor Name, ASCII, 32 chars max */
-+#ifdef COMPANYNAME
-+#define       HPNA_VENDOR             COMPANYNAME
-+#else
-+#define       HPNA_VENDOR             "Broadcom Corporation"
-+#endif
-+
-+/* Driver Date, ASCII, 32 chars max */
-+#define HPNA_DRV_BUILD_DATE   __DATE__
-+
-+/* Hardware Manufacture Date, ASCII, 32 chars max */
-+#define HPNA_HW_MFG_DATE      "Not Specified"
++ * $Id: bcm4710.h,v 1.3 2004/09/27 07:23:30 tallest Exp $
++ */
 +
-+/* See documentation for Device Type values, 32 values max */
-+#ifndef       HPNA_DEV_TYPE
++#ifndef _bcm4710_h_
++#define _bcm4710_h_
 +
-+#if   defined(CONFIG_BRCM_VJ)
-+#define HPNA_DEV_TYPE         { CDCF_V0_DEVICE_DISPLAY }
++/* Address map */
++#define BCM4710_SDRAM         0x00000000      /* Physical SDRAM */
++#define BCM4710_PCI_MEM               0x08000000      /* Host Mode PCI memory access space (64 MB) */
++#define BCM4710_PCI_CFG               0x0c000000      /* Host Mode PCI configuration space (64 MB) */
++#define BCM4710_PCI_DMA               0x40000000      /* Client Mode PCI memory access space (1 GB) */
++#define       BCM4710_SDRAM_SWAPPED   0x10000000      /* Byteswapped Physical SDRAM */
++#define BCM4710_ENUM          0x18000000      /* Beginning of core enumeration space */
 +
-+#elif defined(CONFIG_BCRM_93725)
-+#define HPNA_DEV_TYPE         { CDCF_V0_DEVICE_CM_BRIDGE, CDCF_V0_DEVICE_DISPLAY }
++/* Core register space */
++#define BCM4710_REG_SDRAM     0x18000000      /* SDRAM core registers */
++#define BCM4710_REG_ILINE20   0x18001000      /* InsideLine20 core registers */
++#define BCM4710_REG_EMAC0     0x18002000      /* Ethernet MAC 0 core registers */
++#define BCM4710_REG_CODEC     0x18003000      /* Codec core registers */
++#define BCM4710_REG_USB               0x18004000      /* USB core registers */
++#define BCM4710_REG_PCI               0x18005000      /* PCI core registers */
++#define BCM4710_REG_MIPS      0x18006000      /* MIPS core registers */
++#define BCM4710_REG_EXTIF     0x18007000      /* External Interface core registers */
++#define BCM4710_REG_EMAC1     0x18008000      /* Ethernet MAC 1 core registers */
++
++#define       BCM4710_EXTIF           0x1f000000      /* External Interface base address */
++#define BCM4710_PCMCIA_MEM    0x1f000000      /* External Interface PCMCIA memory access */
++#define BCM4710_PCMCIA_IO     0x1f100000      /* PCMCIA I/O access */
++#define BCM4710_PCMCIA_CONF   0x1f200000      /* PCMCIA configuration */
++#define BCM4710_PROG          0x1f800000      /* Programable interface */
++#define BCM4710_FLASH         0x1fc00000      /* Flash */
++
++#define       BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
++
++#define       BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
++
++#define       BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
++#define       BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
++
++#define       SBFLAG_PCI      0
++#define       SBFLAG_ENET0    1
++#define       SBFLAG_ILINE20  2
++#define       SBFLAG_CODEC    3
++#define       SBFLAG_USB      4
++#define       SBFLAG_EXTIF    5
++#define       SBFLAG_ENET1    6
 +
++#ifdef        CONFIG_HWSIM
++#define       BCM4710_TRACE(trval)        do { *((int *)0xa0000f18) = (trval); } while (0)
 +#else
-+#define HPNA_DEV_TYPE         { CDCF_V0_DEVICE_PCINIC }
-+
++#define       BCM4710_TRACE(trval)
 +#endif
 +
-+#endif        /* !HPNA_DEV_TYPE */
-+
-+
-+#define       EPI_MAJOR_VERSION       @EPI_MAJOR_VERSION@
-+
-+#define       EPI_MINOR_VERSION       @EPI_MINOR_VERSION@
-+
-+#define       EPI_RC_NUMBER           @EPI_RC_NUMBER@
 +
-+#define       EPI_INCREMENTAL_NUMBER  @EPI_INCREMENTAL_NUMBER@
++/* BCM94702 CPCI -ExtIF used for LocalBus devs */
 +
-+#define       EPI_BUILD_NUMBER        @EPI_BUILD_NUMBER@
++#define BCM94702_CPCI_RESET_ADDR       BCM4710_EXTIF
++#define BCM94702_CPCI_BOARDID_ADDR    (BCM4710_EXTIF | 0x4000)
++#define BCM94702_CPCI_DOC_ADDR        (BCM4710_EXTIF | 0x6000)
++#define BCM94702_DOC_ADDR                BCM94702_CPCI_DOC_ADDR
++#define BCM94702_CPCI_LED_ADDR        (BCM4710_EXTIF | 0xc000)
++#define BCM94702_CPCI_NVRAM_ADDR      (BCM4710_EXTIF | 0xe000)
++#define BCM94702_CPCI_NVRAM_SIZE         0x1ff0 /* 8K NVRAM : DS1743/STM48txx*/
++#define BCM94702_CPCI_TOD_REG_BASE       (BCM94702_CPCI_NVRAM_ADDR | 0x1ff0)
 +
-+#define       EPI_VERSION             @EPI_VERSION@
++#define LED_REG(x)      \
++ (*(volatile unsigned char *) (KSEG1ADDR(BCM94702_CPCI_LED_ADDR) + (x)))
 +
-+#define       EPI_VERSION_NUM         @EPI_VERSION_NUM@
-+
-+/* Driver Version String, ASCII, 32 chars max */
-+#define       EPI_VERSION_STR         "@EPI_VERSION_STR@"
-+#define       EPI_ROUTER_VERSION_STR  "@EPI_ROUTER_VERSION_STR@"
++/* 
++ * Reset function implemented in PLD.  Read or write should trigger hard reset 
++ */
++#define SYS_HARD_RESET()   \
++    { for (;;) \
++     *( (volatile unsigned char *)\
++      KSEG1ADDR(BCM94702_CPCI_RESET_ADDR) ) = 0x80; \
++    }
 +
-+#endif /* _epivers_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/etsockio.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/etsockio.h
---- linux-2.4.32/arch/mips/bcm947xx/include/etsockio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/etsockio.h    2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,59 @@
++#endif /* _bcm4710_h_ */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmdefs.h linux.dev/arch/mips/bcm947xx/include/bcmdefs.h
+--- linux.old/arch/mips/bcm947xx/include/bcmdefs.h     1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmdefs.h     2006-04-27 20:12:21.000000000 +0200
+@@ -0,0 +1,106 @@
 +/*
-+ * Driver-specific socket ioctls
-+ * used by BSD, Linux, and PSOS
-+ * Broadcom BCM44XX 10/100Mbps Ethernet Device Driver
++ * Misc system wide definitions
 + *
-+ * Copyright 2005, Broadcom Corporation
++ * Copyright 2006, 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$
++ * $Id: bcmdefs.h,v 1.1.1.3 2006/04/08 06:13:39 honor Exp $
 + */
 +
-+#ifndef _etsockio_h_
-+#define _etsockio_h_
-+
-+/* THESE MUST BE CONTIGUOUS AND CONSISTENT WITH VALUES IN ETC.H */
++#ifndef       _bcmdefs_h_
++#define       _bcmdefs_h_
 +
-+
-+#if defined(linux)
-+#define SIOCSETCUP            (SIOCDEVPRIVATE + 0)
-+#define SIOCSETCDOWN          (SIOCDEVPRIVATE + 1)
-+#define SIOCSETCLOOP          (SIOCDEVPRIVATE + 2)
-+#define SIOCGETCDUMP          (SIOCDEVPRIVATE + 3)
-+#define SIOCSETCSETMSGLEVEL   (SIOCDEVPRIVATE + 4)
-+#define SIOCSETCPROMISC               (SIOCDEVPRIVATE + 5)
-+#define SIOCSETCTXDOWN                (SIOCDEVPRIVATE + 6)    /* obsolete */
-+#define SIOCSETCSPEED         (SIOCDEVPRIVATE + 7)
-+#define SIOCTXGEN             (SIOCDEVPRIVATE + 8)
-+#define SIOCGETCPHYRD         (SIOCDEVPRIVATE + 9)
-+#define SIOCSETCPHYWR         (SIOCDEVPRIVATE + 10)
-+#define SIOCSETCQOS           (SIOCDEVPRIVATE + 11)
-+
-+#else /* !linux */
-+
-+#define SIOCSETCUP            _IOWR('e', 130 + 0, struct ifreq)
-+#define SIOCSETCDOWN          _IOWR('e', 130 + 1, struct ifreq)
-+#define SIOCSETCLOOP          _IOWR('e', 130 + 2, struct ifreq)
-+#define SIOCGETCDUMP          _IOWR('e', 130 + 3, struct ifreq)
-+#define SIOCSETCSETMSGLEVEL   _IOWR('e', 130 + 4, struct ifreq)
-+#define SIOCSETCPROMISC               _IOWR('e', 130 + 5, struct ifreq)
-+#define SIOCSETCTXDOWN                _IOWR('e', 130 + 6, struct ifreq)       /* obsolete */
-+#define SIOCSETCSPEED         _IOWR('e', 130 + 7, struct ifreq)
-+#define SIOCTXGEN             _IOWR('e', 130 + 8, struct ifreq)
-+
-+#endif
-+
-+/* arg to SIOCTXGEN */
-+struct txg {
-+      uint32 num;             /* number of frames to send */
-+      uint32 delay;           /* delay in microseconds between sending each */
-+      uint32 size;            /* size of ether frame to send */
-+      uchar buf[1514];        /* starting ether frame data */
-+};
-+
-+#endif
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/flash.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/flash.h
---- linux-2.4.32/arch/mips/bcm947xx/include/flash.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/flash.h       2005-12-16 23:39:10.704821750 +0100
-@@ -0,0 +1,188 @@
 +/*
-+ * flash.h: Common definitions for flash access.
-+ *
-+ * Copyright 2005, 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$
++ * One doesn't need to include this file explicitly, gets included automatically if
++ * typedefs.h is included.
 + */
 +
-+/* Types of flashes we know about */
-+typedef enum _flash_type {OLD, BSC, SCS, AMD, SST, SFLASH} flash_type_t;
-+
-+/* Commands to write/erase the flases */
-+typedef struct _flash_cmds{
-+      flash_type_t    type;
-+      bool            need_unlock;
-+      uint16          pre_erase;
-+      uint16          erase_block;
-+      uint16          erase_chip;
-+      uint16          write_word;
-+      uint16          write_buf;
-+      uint16          clear_csr;
-+      uint16          read_csr;
-+      uint16          read_id;
-+      uint16          confirm;
-+      uint16          read_array;
-+} flash_cmds_t;
-+
-+#define       UNLOCK_CMD_WORDS        2
-+
-+typedef struct _unlock_cmd {
-+  uint                addr[UNLOCK_CMD_WORDS];
-+  uint16      cmd[UNLOCK_CMD_WORDS];
-+} unlock_cmd_t;
-+
-+/* Flash descriptors */
-+typedef struct _flash_desc {
-+      uint16          mfgid;          /* Manufacturer Id */
-+      uint16          devid;          /* Device Id */
-+      uint            size;           /* Total size in bytes */
-+      uint            width;          /* Device width in bytes */
-+      flash_type_t    type;           /* Device type old, S, J */
-+      uint            bsize;          /* Block size */
-+      uint            nb;             /* Number of blocks */
-+      uint            ff;             /* First full block */
-+      uint            lf;             /* Last full block */
-+      uint            nsub;           /* Number of subblocks */
-+      uint            *subblocks;     /* Offsets for subblocks */
-+      char            *desc;          /* Description */
-+} flash_desc_t;
-+
-+
-+#ifdef        DECLARE_FLASHES
-+flash_cmds_t sflash_cmd_t = 
-+      { SFLASH,       0,      0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00 };
-+
-+flash_cmds_t flash_cmds[] = {
-+/*      type          needu   preera  eraseb  erasech write   wbuf    clcsr   rdcsr   rdid    confrm  read */
-+      { BSC,          0,      0x00,   0x20,   0x00,   0x40,   0x00,   0x50,   0x70,   0x90,   0xd0,   0xff },
-+      { SCS,          0,      0x00,   0x20,   0x00,   0x40,   0xe8,   0x50,   0x70,   0x90,   0xd0,   0xff },
-+      { AMD,          1,      0x80,   0x30,   0x10,   0xa0,   0x00,   0x00,   0x00,   0x90,   0x00,   0xf0 },
-+      { SST,          1,      0x80,   0x50,   0x10,   0xa0,   0x00,   0x00,   0x00,   0x90,   0x00,   0xf0 },
-+      { 0 }
-+};
++/* Reclaiming text and data :
++ * The following macros specify special linker sections that can be reclaimed
++ * after a system is considered 'up'.
++ */
++#if defined(__GNUC__) && defined(BCMRECLAIM)
++extern bool   bcmreclaimed;
++#define BCMINITDATA(_data)    __attribute__ ((__section__ (".dataini." #_data))) _data
++#define BCMINITFN(_fn)                __attribute__ ((__section__ (".textini." #_fn))) _fn
++#else /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
++#define BCMINITDATA(_data)    _data
++#define BCMINITFN(_fn)                _fn
++#define bcmreclaimed          0
++#endif /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
 +
-+unlock_cmd_t unlock_cmd_amd = {
-+#ifdef MIPSEB
-+/* addr: */   { 0x0aa8,       0x0556},
++/* Reclaim uninit functions if BCMNODOWN is defined           */
++/* and if they are not already removed by -gc-sections        */
++#ifdef BCMNODOWN
++#define BCMUNINITFN(_fn)              BCMINITFN(_fn)
 +#else
-+/* addr: */   { 0x0aaa,       0x0554},
++#define BCMUNINITFN(_fn)              _fn
 +#endif
-+/* data: */   { 0xaa,         0x55}
-+};
 +
-+unlock_cmd_t unlock_cmd_sst = {
-+#ifdef MIPSEB
-+/* addr: */   { 0xaaa8,       0x5556},
++#ifdef BCMRECLAIM
++#define CONST
 +#else
-+/* addr: */   { 0xaaaa,       0x5554},
-+#endif
-+/* data: */   { 0xaa,         0x55}
-+};
++#define CONST const
++#endif /* BCMRECLAIM */
 +
-+#define AMD_CMD 0xaaa
-+#define SST_CMD 0xaaaa
++/* Compatibility with old-style BCMRECLAIM */
++#define BCMINIT(_id)          _id
 +
-+/* intel unlock block cmds */
-+#define INTEL_UNLOCK1 0x60
-+#define INTEL_UNLOCK2 0xD0
 +
-+/* Just eight blocks of 8KB byte each */
++/* Put some library data/code into ROM to reduce RAM requirements */
++#if defined(__GNUC__) && defined(BCMROMOFFLOAD)
++#define BCMROMDATA(_data)     __attribute__ ((__section__ (".datarom." #_data))) _data
++#define BCMROMFN(_fn)         __attribute__ ((__section__ (".textrom." #_fn))) _fn
++#else
++#define BCMROMDATA(_data)     _data
++#define BCMROMFN(_fn)         _fn
++#endif
 +
-+uint blk8x8k[] = { 0x00000000,
-+                 0x00002000,
-+                 0x00004000,
-+                 0x00006000,
-+                 0x00008000,
-+                 0x0000a000,
-+                 0x0000c000,
-+                 0x0000e000,
-+                 0x00010000
-+};
++/* Bus types */
++#define       SB_BUS                  0       /* Silicon Backplane */
++#define       PCI_BUS                 1       /* PCI target */
++#define       PCMCIA_BUS              2       /* PCMCIA target */
++#define SDIO_BUS              3       /* SDIO target */
++#define JTAG_BUS              4       /* JTAG */
++#define NO_BUS                        0xFF    /* Bus that does not support R/W REG */
 +
-+/* Funky AMD arrangement for 29xx800's */
-+uint amd800[] = { 0x00000000,         /* 16KB */
-+                0x00004000,           /* 32KB */
-+                0x0000c000,           /* 8KB */
-+                0x0000e000,           /* 8KB */
-+                0x00010000,           /* 8KB */
-+                0x00012000,           /* 8KB */
-+                0x00014000,           /* 32KB */
-+                0x0001c000,           /* 16KB */
-+                0x00020000
-+};
++/* Allows optimization for single-bus support */
++#ifdef BCMBUSTYPE
++#define BUSTYPE(bus) (BCMBUSTYPE)
++#else
++#define BUSTYPE(bus) (bus)
++#endif
 +
-+/* AMD arrangement for 29xx160's */
-+uint amd4112[] = { 0x00000000,                /* 32KB */
-+                 0x00008000,          /* 8KB */
-+                 0x0000a000,          /* 8KB */
-+                 0x0000c000,          /* 16KB */
-+                 0x00010000
-+};
-+uint amd2114[] = { 0x00000000,                /* 16KB */
-+                 0x00004000,          /* 8KB */
-+                 0x00006000,          /* 8KB */
-+                 0x00008000,          /* 32KB */
-+                 0x00010000
-+};
++/* Defines for DMA Address Width - Shared between OSL and HNDDMA */
++#define DMADDR_MASK_32 0x0            /* Address mask for 32-bits */
++#define DMADDR_MASK_30 0xc0000000     /* Address mask for 30-bits */
++#define DMADDR_MASK_0  0xffffffff     /* Address mask for 0-bits (hi-part) */
 +
++#define       DMADDRWIDTH_30  30 /* 30-bit addressing capability */
++#define       DMADDRWIDTH_32  32 /* 32-bit addressing capability */
++#define       DMADDRWIDTH_63  63 /* 64-bit addressing capability */
++#define       DMADDRWIDTH_64  64 /* 64-bit addressing capability */
 +
-+flash_desc_t sflash_desc =  
-+      { 0, 0, 0, 0,   SFLASH, 0, 0,  0, 0,  0, NULL,    "SFLASH" };
-+
-+flash_desc_t flashes[] = {
-+      { 0x00b0, 0x00d0, 0x0200000, 2, SCS, 0x10000, 32,  0, 31,  0, NULL,    "Intel 28F160S3/5 1Mx16" },
-+      { 0x00b0, 0x00d4, 0x0400000, 2, SCS, 0x10000, 64,  0, 63,  0, NULL,    "Intel 28F320S3/5 2Mx16" },
-+      { 0x0089, 0x8890, 0x0200000, 2, BSC, 0x10000, 32,  0, 30,  8, blk8x8k, "Intel 28F160B3 1Mx16 TopB" },
-+      { 0x0089, 0x8891, 0x0200000, 2, BSC, 0x10000, 32,  1, 31,  8, blk8x8k, "Intel 28F160B3 1Mx16 BotB" },
-+      { 0x0089, 0x8896, 0x0400000, 2, BSC, 0x10000, 64,  0, 62,  8, blk8x8k, "Intel 28F320B3 2Mx16 TopB" },
-+      { 0x0089, 0x8897, 0x0400000, 2, BSC, 0x10000, 64,  1, 63,  8, blk8x8k, "Intel 28F320B3 2Mx16 BotB" },
-+      { 0x0089, 0x8898, 0x0800000, 2, BSC, 0x10000, 128, 0, 126, 8, blk8x8k, "Intel 28F640B3 4Mx16 TopB" },
-+      { 0x0089, 0x8899, 0x0800000, 2, BSC, 0x10000, 128, 1, 127, 8, blk8x8k, "Intel 28F640B3 4Mx16 BotB" },
-+      { 0x0089, 0x88C2, 0x0200000, 2, BSC, 0x10000, 32,  0, 30,  8, blk8x8k, "Intel 28F160C3 1Mx16 TopB" },
-+      { 0x0089, 0x88C3, 0x0200000, 2, BSC, 0x10000, 32,  1, 31,  8, blk8x8k, "Intel 28F160C3 1Mx16 BotB" },
-+      { 0x0089, 0x88C4, 0x0400000, 2, BSC, 0x10000, 64,  0, 62,  8, blk8x8k, "Intel 28F320C3 2Mx16 TopB" },
-+      { 0x0089, 0x88C5, 0x0400000, 2, BSC, 0x10000, 64,  1, 63,  8, blk8x8k, "Intel 28F320C3 2Mx16 BotB" },
-+      { 0x0089, 0x88CC, 0x0800000, 2, BSC, 0x10000, 128, 0, 126, 8, blk8x8k, "Intel 28F640C3 4Mx16 TopB" },
-+      { 0x0089, 0x88CD, 0x0800000, 2, BSC, 0x10000, 128, 1, 127, 8, blk8x8k, "Intel 28F640C3 4Mx16 BotB" },
-+      { 0x0089, 0x0014, 0x0400000, 2, SCS, 0x20000, 32,  0, 31,  0, NULL,    "Intel 28F320J5 2Mx16" },
-+      { 0x0089, 0x0015, 0x0800000, 2, SCS, 0x20000, 64,  0, 63,  0, NULL,    "Intel 28F640J5 4Mx16" },
-+      { 0x0089, 0x0016, 0x0400000, 2, SCS, 0x20000, 32,  0, 31,  0, NULL,    "Intel 28F320J3 2Mx16" },
-+      { 0x0089, 0x0017, 0x0800000, 2, SCS, 0x20000, 64,  0, 63,  0, NULL,    "Intel 28F640J3 4Mx16" },
-+      { 0x0089, 0x0018, 0x1000000, 2, SCS, 0x20000, 128, 0, 127, 0, NULL,    "Intel 28F128J3 8Mx16" },
-+      { 0x00b0, 0x00e3, 0x0400000, 2, BSC, 0x10000, 64,  1, 63,  8, blk8x8k, "Sharp 28F320BJE 2Mx16 BotB" },
-+      { 0x0001, 0x224a, 0x0100000, 2, AMD, 0x10000, 16,  0, 13,  8, amd800,  "AMD 29DL800BT 512Kx16 TopB" },
-+      { 0x0001, 0x22cb, 0x0100000, 2, AMD, 0x10000, 16,  2, 15,  8, amd800,  "AMD 29DL800BB 512Kx16 BotB" },
-+      { 0x0001, 0x22c4, 0x0200000, 2, AMD, 0x10000, 32,  0, 30,  4, amd2114, "AMD 29lv160DT 1Mx16 TopB" },
-+      { 0x0001, 0x2249, 0x0200000, 2, AMD, 0x10000, 32,  1, 31,  4, amd4112, "AMD 29lv160DB 1Mx16 BotB" },
-+      { 0x0001, 0x22f6, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  8, blk8x8k, "AMD 29lv320DT 2Mx16 TopB" },
-+      { 0x0001, 0x22f9, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  8, blk8x8k, "AMD 29lv320DB 2Mx16 BotB" },
-+      { 0x0001, 0x227e, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  8, blk8x8k, "AMD 29lv320MT 2Mx16 TopB" },
-+      { 0x0001, 0x2200, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  8, blk8x8k, "AMD 29lv320MB 2Mx16 BotB" },
-+      { 0x0020, 0x22CA, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  4, amd4112, "ST 29w320DT 2Mx16 TopB" },
-+      { 0x0020, 0x22CB, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  4, amd2114, "ST 29w320DB 2Mx16 BotB" },
-+      { 0x00C2, 0x00A7, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  4, amd4112, "MX29LV320T 2Mx16 TopB" },
-+      { 0x00C2, 0x00A8, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  4, amd2114, "MX29LV320B 2Mx16 BotB" },
-+      { 0x0004, 0x22F6, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  4, amd4112, "MBM29LV320TE 2Mx16 TopB" },
-+      { 0x0004, 0x22F9, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  4, amd2114, "MBM29LV320BE 2Mx16 BotB" },
-+      { 0x0098, 0x009A, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  4, amd4112, "TC58FVT321 2Mx16 TopB" },
-+      { 0x0098, 0x009C, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  4, amd2114, "TC58FVB321 2Mx16 BotB" }, 
-+      { 0x00C2, 0x22A7, 0x0400000, 2, AMD, 0x10000, 64,  0, 62,  4, amd4112, "MX29LV320T 2Mx16 TopB" },
-+      { 0x00C2, 0x22A8, 0x0400000, 2, AMD, 0x10000, 64,  1, 63,  4, amd2114, "MX29LV320B 2Mx16 BotB" },
-+      { 0x00BF, 0x2783, 0x0400000, 2, SST, 0x10000, 64,  0, 63,  0, NULL,    "SST39VF320 2Mx16" },
-+      { 0,      0,      0,         0, OLD, 0,       0,   0, 0,   0, NULL,    NULL },
-+};
++/* packet headroom necessary to accomodate the largest header in the system, (i.e TXOFF).
++ * By doing, we avoid the need  to allocate an extra buffer for the header when bridging to WL.
++ * There is a compile time check in wlc.c which ensure that this value is at least as big
++ * as TXOFF. This value is used in dma_rxfill (hnddma.c).
++ */
++#define BCMEXTRAHDROOM 160
++
++/* Headroom required for dongle-to-host communication.  Packets allocated
++ * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
++ * leave this much room in front for low-level message headers which may
++ * be needed to get across the dongle bus to the host.  (These messages
++ * don't go over the network, so room for the full WL header above would
++ * be a waste.)
++ */
++#define BCMDONGLEHDRSZ 8
 +
-+#else
 +
-+extern flash_cmds_t flash_cmds[];
-+extern unlock_cmd_t unlock_cmd;
-+extern flash_desc_t flashes[];
 +
-+#endif
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/flashutl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/flashutl.h
---- linux-2.4.32/arch/mips/bcm947xx/include/flashutl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/flashutl.h    2005-12-16 23:39:10.708822000 +0100
-@@ -0,0 +1,27 @@
++#endif /* _bcmdefs_h_ */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm947xx/include/bcmdevs.h
+--- linux.old/arch/mips/bcm947xx/include/bcmdevs.h     1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmdevs.h     2006-04-27 22:30:25.000000000 +0200
+@@ -0,0 +1,369 @@
 +/*
-+ * BCM47XX FLASH driver interface
++ * Broadcom device-specific manifest constants.
 + *
-+ * Copyright 2005, Broadcom Corporation
++ * Copyright 2006, 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$
++ * $Id: bcmdevs.h,v 1.1.1.17 2006/04/15 01:29:08 michael Exp $
 + */
 +
-+#ifndef _flashutl_h_
-+#define _flashutl_h_
-+
-+
-+#ifndef _LANGUAGE_ASSEMBLY
-+
-+int   sysFlashInit(char *flash_str);
-+int sysFlashRead(uint off, uchar *dst, uint bytes);
-+int sysFlashWrite(uint off, uchar *src, uint bytes);
-+void nvWrite(unsigned short *data, unsigned int len);
-+
-+#endif        /* _LANGUAGE_ASSEMBLY */
++#ifndef       _BCMDEVS_H
++#define       _BCMDEVS_H
 +
-+#endif /* _flashutl_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/hnddma.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/hnddma.h
---- linux-2.4.32/arch/mips/bcm947xx/include/hnddma.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/hnddma.h      2005-12-16 23:39:10.708822000 +0100
-@@ -0,0 +1,71 @@
-+/*
-+ * Generic Broadcom Home Networking Division (HND) DMA engine SW interface
-+ * This supports the following chips: BCM42xx, 44xx, 47xx .
-+ *
-+ * Copyright 2005, 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$
-+ */
++#include "bcm4710.h"
 +
-+#ifndef       _hnddma_h_
-+#define       _hnddma_h_
++/* Known PCI vendor Id's */
++#define       VENDOR_EPIGRAM          0xfeda
++#define       VENDOR_BROADCOM         0x14e4
++#define       VENDOR_3COM             0x10b7
++#define       VENDOR_NETGEAR          0x1385
++#define       VENDOR_DIAMOND          0x1092
++#define       VENDOR_DELL             0x1028
++#define       VENDOR_HP               0x0e11
++#define       VENDOR_APPLE            0x106b
 +
-+/* export structure */
-+typedef volatile struct {
-+      /* rx error counters */
-+      uint            rxgiants;       /* rx giant frames */
-+      uint            rxnobuf;        /* rx out of dma descriptors */
-+      /* tx error counters */
-+      uint            txnobuf;        /* tx out of dma descriptors */
-+} hnddma_t;
++/* PCI Device Id's */
++#define       BCM4210_DEVICE_ID       0x1072          /* never used */
++#define       BCM4211_DEVICE_ID       0x4211
++#define       BCM4230_DEVICE_ID       0x1086          /* never used */
++#define       BCM4231_DEVICE_ID       0x4231
 +
-+#ifndef di_t
-+#define       di_t    void
-+#endif
++#define       BCM4410_DEVICE_ID       0x4410          /* bcm44xx family pci iline */
++#define       BCM4430_DEVICE_ID       0x4430          /* bcm44xx family cardbus iline */
++#define       BCM4412_DEVICE_ID       0x4412          /* bcm44xx family pci enet */
++#define       BCM4432_DEVICE_ID       0x4432          /* bcm44xx family cardbus enet */
 +
-+#ifndef osl_t 
-+#define osl_t void
-+#endif
++#define       BCM3352_DEVICE_ID       0x3352          /* bcm3352 device id */
++#define       BCM3360_DEVICE_ID       0x3360          /* bcm3360 device id */
 +
-+/* externs */
-+extern void * dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx, void *dmaregsrx, 
-+                       uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset, uint *msg_level);
-+extern void dma_detach(di_t *di);
-+extern void dma_txreset(di_t *di);
-+extern void dma_rxreset(di_t *di);
-+extern void dma_txinit(di_t *di);
-+extern bool dma_txenabled(di_t *di);
-+extern void dma_rxinit(di_t *di);
-+extern void dma_rxenable(di_t *di);
-+extern bool dma_rxenabled(di_t *di);
-+extern void dma_txsuspend(di_t *di);
-+extern void dma_txresume(di_t *di);
-+extern bool dma_txsuspended(di_t *di);
-+extern bool dma_txsuspendedidle(di_t *di);
-+extern bool dma_txstopped(di_t *di);
-+extern bool dma_rxstopped(di_t *di);
-+extern int dma_txfast(di_t *di, void *p, uint32 coreflags);
-+extern void dma_fifoloopbackenable(di_t *di);
-+extern void *dma_rx(di_t *di);
-+extern void dma_rxfill(di_t *di);
-+extern void dma_txreclaim(di_t *di, bool forceall);
-+extern void dma_rxreclaim(di_t *di);
-+extern uintptr dma_getvar(di_t *di, char *name);
-+extern void *dma_getnexttxp(di_t *di, bool forceall);
-+extern void *dma_peeknexttxp(di_t *di);
-+extern void *dma_getnextrxp(di_t *di, bool forceall);
-+extern void dma_txblock(di_t *di);
-+extern void dma_txunblock(di_t *di);
-+extern uint dma_txactive(di_t *di);
-+extern void dma_txrotate(di_t *di);
-+
-+extern void dma_rxpiomode(dma32regs_t *);
-+extern void dma_txpioloopback(dma32regs_t *);
++#define       EPI41210_DEVICE_ID      0xa0fa          /* bcm4210 */
++#define       EPI41230_DEVICE_ID      0xa10e          /* bcm4230 */
 +
++#define       BCM47XX_ILINE_ID        0x4711          /* 47xx iline20 */
++#define       BCM47XX_V90_ID          0x4712          /* 47xx v90 codec */
++#define       BCM47XX_ENET_ID         0x4713          /* 47xx enet */
++#define       BCM47XX_EXT_ID          0x4714          /* 47xx external i/f */
++#define       BCM47XX_USB_ID          0x4715          /* 47xx usb */
++#define       BCM47XX_USBH_ID         0x4716          /* 47xx usb host */
++#define       BCM47XX_USBD_ID         0x4717          /* 47xx usb device */
++#define       BCM47XX_IPSEC_ID        0x4718          /* 47xx ipsec */
++#define       BCM47XX_ROBO_ID         0x4719          /* 47xx/53xx roboswitch core */
++#define       BCM47XX_USB20H_ID       0x471a          /* 47xx usb 2.0 host */
++#define       BCM47XX_USB20D_ID       0x471b          /* 47xx usb 2.0 device */
++#define       BCM47XX_ATA100_ID       0x471d          /* 47xx parallel ATA */
++#define       BCM47XX_SATAXOR_ID      0x471e          /* 47xx serial ATA & XOR DMA */
++#define       BCM47XX_GIGETH_ID       0x471f          /* 47xx GbE (5700) */
 +
-+#endif        /* _hnddma_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/hndmips.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/hndmips.h
---- linux-2.4.32/arch/mips/bcm947xx/include/hndmips.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/hndmips.h     2005-12-16 23:39:10.708822000 +0100
-@@ -0,0 +1,16 @@
-+/*
-+ * Alternate include file for HND sbmips.h since CFE also ships with
-+ * a sbmips.h.
-+ *
-+ * Copyright 2005, 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$
-+ */
++#define BCM47XX_SMBUS_EMU_ID  0x47fe          /* 47xx emulated SMBus device */
++#define       BCM47XX_XOR_EMU_ID      0x47ff          /* 47xx emulated XOR engine */
 +
-+#include "sbmips.h"
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/linux_osl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/linux_osl.h
---- linux-2.4.32/arch/mips/bcm947xx/include/linux_osl.h        1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/linux_osl.h   2005-12-16 23:39:10.708822000 +0100
-@@ -0,0 +1,371 @@
-+/*
-+ * Linux OS Independent Layer
-+ *
-+ * Copyright 2005, 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$
-+ */
++#define       BCM4710_CHIP_ID         0x4710          /* 4710 chipid returned by sb_chip() */
++#define       BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
 +
-+#ifndef _linux_osl_h_
-+#define _linux_osl_h_
++#define       BCM4402_CHIP_ID         0x4402          /* 4402 chipid */
++#define       BCM4402_ENET_ID         0x4402          /* 4402 enet */
++#define       BCM4402_V90_ID          0x4403          /* 4402 v90 codec */
++#define       BCM4401_ENET_ID         0x170c          /* 4401b0 production enet cards */
 +
-+#include <typedefs.h>
++#define       BCM4306_CHIP_ID         0x4306          /* 4306 chipcommon chipid */
++#define       BCM4306_D11G_ID         0x4320          /* 4306 802.11g */
++#define       BCM4306_D11G_ID2        0x4325          
++#define       BCM4306_D11A_ID         0x4321          /* 4306 802.11a */
++#define       BCM4306_UART_ID         0x4322          /* 4306 uart */
++#define       BCM4306_V90_ID          0x4323          /* 4306 v90 codec */
++#define       BCM4306_D11DUAL_ID      0x4324          /* 4306 dual A+B */
 +
-+/* use current 2.4.x calling conventions */
-+#include <linuxver.h>
++#define       BCM4309_PKG_ID          1               /* 4309 package id */
 +
-+/* assert and panic */
-+#ifdef __GNUC__
-+#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
-+#if GCC_VERSION > 30100
-+#define       ASSERT(exp)             do {} while (0)
-+#else
-+/* ASSERT could causes segmentation fault on GCC3.1, use empty instead*/
-+#define       ASSERT(exp)             
-+#endif
-+#endif
++#define       BCM4311_CHIP_ID         0x4311          /* 4311 PCIe 802.11a/b/g */
++#define       BCM4311_D11G_ID         0x4311          /* 4311 802.11b/g id */
++#define       BCM4311_D11DUAL_ID      0x4312          /* 4311 802.11a/b/g id */
++#define       BCM4311_D11A_ID         0x4313          /* 4311 802.11a id */
 +
-+/* microsecond delay */
-+#define       OSL_DELAY(usec)         osl_delay(usec)
-+extern void osl_delay(uint usec);
++#define       BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
++#define       BCM4303_PKG_ID          2               /* 4303 package id */
 +
-+/* PCMCIA attribute space access macros */
-+#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
-+struct pcmcia_dev {
-+      dev_link_t link;        /* PCMCIA device pointer */
-+      dev_node_t node;        /* PCMCIA node structure */
-+      void *base;             /* Mapped attribute memory window */
-+      size_t size;            /* Size of window */
-+      void *drv;              /* Driver data */
-+};
-+#endif
-+#define       OSL_PCMCIA_READ_ATTR(osh, offset, buf, size) \
-+      osl_pcmcia_read_attr((osh), (offset), (buf), (size))
-+#define       OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size) \
-+      osl_pcmcia_write_attr((osh), (offset), (buf), (size))
-+extern void osl_pcmcia_read_attr(osl_t *osh, uint offset, void *buf, int size);
-+extern void osl_pcmcia_write_attr(osl_t *osh, uint offset, void *buf, int size);
-+
-+/* PCI configuration space access macros */
-+#define       OSL_PCI_READ_CONFIG(osh, offset, size) \
-+      osl_pci_read_config((osh), (offset), (size))
-+#define       OSL_PCI_WRITE_CONFIG(osh, offset, size, val) \
-+      osl_pci_write_config((osh), (offset), (size), (val))
-+extern uint32 osl_pci_read_config(osl_t *osh, uint size, uint offset);
-+extern void osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val);
++#define       BCMGPRS_UART_ID         0x4333          /* Uart id used by 4306/gprs card */
++#define       BCMGPRS2_UART_ID        0x4344          /* Uart id used by 4306/gprs card */
 +
-+/* PCI device bus # and slot # */
-+#define OSL_PCI_BUS(osh)      osl_pci_bus(osh)
-+#define OSL_PCI_SLOT(osh)     osl_pci_slot(osh)
-+extern uint osl_pci_bus(osl_t *osh);
-+extern uint osl_pci_slot(osl_t *osh);
++#define       BCM4704_CHIP_ID         0x4704          /* 4704 chipcommon chipid */
++#define       BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
 +
-+/* OSL initialization */
-+extern osl_t *osl_attach(void *pdev);
-+extern void osl_detach(osl_t *osh);
++#define       BCM4318_CHIP_ID         0x4318          /* 4318 chip common chipid */
++#define       BCM4318_D11G_ID         0x4318          /* 4318 802.11b/g id */
++#define       BCM4318_D11DUAL_ID      0x4319          /* 4318 802.11a/b/g id */
++#define       BCM4318_D11A_ID         0x431a          /* 4318 802.11a id */
 +
-+/* host/bus architecture-specific byte swap */
-+#define BUS_SWAP32(v)         (v)
++#define       BCM4321_CHIP_ID         0x4321          /* 4321 chip common chipid */
++#define       BCM4321_D11N_ID         0x4328          /* 4321 802.11n dualband id */
++#define       BCM4321_D11N2G_ID       0x4329          /* 4321 802.11n 2.4Hgz band id */
++#define       BCM4321_D11N5G_ID       0x432a          /* 4321 802.11n 5Ghz band id */
 +
-+/* general purpose memory allocation */
++#define BCM4331_CHIP_ID               0x4331          /* 4331 chip common chipid */
++#define BCM4331_D11N2G_ID     0x4330          /* 4331 802.11n 2.4Ghz band id */
++#define BCM4331_D11N_ID               0x4331          /* 4331 802.11n dualband id */
++#define BCM4331_D11N5G_ID     0x4332          /* 4331 802.11n 5Ghz band id */
 +
-+#if defined(BCMDBG_MEM)
++#define HDLSIM5350_PKG_ID     1               /* HDL simulator package id for a 5350 */
++#define HDLSIM_PKG_ID         14              /* HDL simulator package id */
++#define HWSIM_PKG_ID          15              /* Hardware simulator package id */
 +
-+#define       MALLOC(osh, size)       osl_debug_malloc((osh), (size), __LINE__, __FILE__)
-+#define       MFREE(osh, addr, size)  osl_debug_mfree((osh), (addr), (size), __LINE__, __FILE__)
-+#define MALLOCED(osh)         osl_malloced((osh))
-+#define       MALLOC_DUMP(osh, buf, sz) osl_debug_memdump((osh), (buf), (sz))
-+extern void *osl_debug_malloc(osl_t *osh, uint size, int line, char* file);
-+extern void osl_debug_mfree(osl_t *osh, void *addr, uint size, int line, char* file);
-+extern char *osl_debug_memdump(osl_t *osh, char *buf, uint sz);
++#define       BCM4712_CHIP_ID         0x4712          /* 4712 chipcommon chipid */
++#define       BCM4712_MIPS_ID         0x4720          /* 4712 base devid */
++#define       BCM4712LARGE_PKG_ID     0               /* 340pin 4712 package id */
++#define       BCM4712SMALL_PKG_ID     1               /* 200pin 4712 package id */
++#define       BCM4712MID_PKG_ID       2               /* 225pin 4712 package id */
 +
-+#else
++#define BCM5365_CHIP_ID               0x5365          /* 5365 chipcommon chipid */
++#define       BCM5350_CHIP_ID         0x5350          /* bcm5350 chipcommon chipid */
++#define       BCM5352_CHIP_ID         0x5352          /* bcm5352 chipcommon chipid */
 +
-+#define       MALLOC(osh, size)       osl_malloc((osh), (size))
-+#define       MFREE(osh, addr, size)  osl_mfree((osh), (addr), (size))
-+#define MALLOCED(osh)         osl_malloced((osh))
++#define       BCM4320_CHIP_ID         0x4320          /* bcm4320 chipcommon chipid */
 +
-+#endif        /* BCMDBG_MEM */
++#define BCM4328_CHIP_ID               0x4328          /* bcm4328 chipcommon chipid */
 +
-+#define       MALLOC_FAILED(osh)      osl_malloc_failed((osh))
++#define FPGA_JTAGM_ID         0x43f0          /* FPGA jtagm device id */
++#define BCM43XX_JTAGM_ID      0x43f1          /* 43xx jtagm device id */
++#define BCM43XXOLD_JTAGM_ID   0x4331          /* 43xx old jtagm device id */
 +
-+extern void *osl_malloc(osl_t *osh, uint size);
-+extern void osl_mfree(osl_t *osh, void *addr, uint size);
-+extern uint osl_malloced(osl_t *osh);
-+extern uint osl_malloc_failed(osl_t *osh);
++#define SDIOH_FPGA_ID         0x43f2          /* sdio host fpga */
++#define SDIOD_FPGA_ID         0x43f4          /* sdio device fpga */
 +
-+/* allocate/free shared (dma-able) consistent memory */
-+#define       DMA_CONSISTENT_ALIGN    PAGE_SIZE
-+#define       DMA_ALLOC_CONSISTENT(osh, size, pap) \
-+      osl_dma_alloc_consistent((osh), (size), (pap))
-+#define       DMA_FREE_CONSISTENT(osh, va, size, pa) \
-+      osl_dma_free_consistent((osh), (void*)(va), (size), (pa))
-+extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap);
-+extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa);
++#define MIMO_FPGA_ID          0x43f8          /* FPGA mimo minimacphy device id */
 +
-+/* map/unmap direction */
-+#define       DMA_TX  1
-+#define       DMA_RX  2
++#define BCM4785_CHIP_ID               0x4785          /* 4785 chipcommon chipid */
 +
-+/* map/unmap shared (dma-able) memory */
-+#define       DMA_MAP(osh, va, size, direction, p) \
-+      osl_dma_map((osh), (va), (size), (direction))
-+#define       DMA_UNMAP(osh, pa, size, direction, p) \
-+      osl_dma_unmap((osh), (pa), (size), (direction))
-+extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction);
-+extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction);
++/* PCMCIA vendor Id's */
 +
-+/* register access macros */
-+#if defined(BCMJTAG)
-+#include <bcmjtag.h>
-+#define       R_REG(r)        bcmjtag_read(NULL, (uint32)(r), sizeof (*(r)))
-+#define       W_REG(r, v)     bcmjtag_write(NULL, (uint32)(r), (uint32)(v), sizeof (*(r)))
-+#endif
++#define       VENDOR_BROADCOM_PCMCIA  0x02d0
 +
-+/*
-+ * BINOSL selects the slightly slower function-call-based binary compatible osl.
-+ * Macros expand to calls to functions defined in linux_osl.c .
-+ */
-+#ifndef BINOSL
++/* SDIO vendor Id's */
++#define       VENDOR_BROADCOM_SDIO    0x00BF
 +
-+/* string library, kernel mode */
-+#define       printf(fmt, args...)    printk(fmt, ## args)
-+#include <linux/kernel.h>
-+#include <linux/string.h>
 +
-+/* register access macros */
-+#if !defined(BCMJTAG)
-+#ifndef IL_BIGENDIAN   
-+#define R_REG(r) ( \
-+      sizeof(*(r)) == sizeof(uint8) ? readb((volatile uint8*)(r)) : \
-+      sizeof(*(r)) == sizeof(uint16) ? readw((volatile uint16*)(r)) : \
-+      readl((volatile uint32*)(r)) \
-+)
-+#define W_REG(r, v) do { \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     writeb((uint8)(v), (volatile uint8*)(r)); break; \
-+      case sizeof(uint16):    writew((uint16)(v), (volatile uint16*)(r)); break; \
-+      case sizeof(uint32):    writel((uint32)(v), (volatile uint32*)(r)); break; \
-+      } \
-+} while (0)
-+#else /* IL_BIGENDIAN */
-+#define R_REG(r) ({ \
-+      __typeof(*(r)) __osl_v; \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     __osl_v = readb((volatile uint8*)((uint32)r^3)); break; \
-+      case sizeof(uint16):    __osl_v = readw((volatile uint16*)((uint32)r^2)); break; \
-+      case sizeof(uint32):    __osl_v = readl((volatile uint32*)(r)); break; \
-+      } \
-+      __osl_v; \
-+})
-+#define W_REG(r, v) do { \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     writeb((uint8)(v), (volatile uint8*)((uint32)r^3)); break; \
-+      case sizeof(uint16):    writew((uint16)(v), (volatile uint16*)((uint32)r^2)); break; \
-+      case sizeof(uint32):    writel((uint32)(v), (volatile uint32*)(r)); break; \
-+      } \
-+} while (0)
-+#endif
-+#endif
-+
-+#define       AND_REG(r, v)           W_REG((r), R_REG(r) & (v))
-+#define       OR_REG(r, v)            W_REG((r), R_REG(r) | (v))
++/* boardflags */
++#define       BFL_BTCOEXIST           0x0001  /* This board implements Bluetooth coexistance */
++#define       BFL_PACTRL              0x0002  /* This board has gpio 9 controlling the PA */
++#define       BFL_AIRLINEMODE         0x0004  /* This board implements gpio13 radio disable indication */
++#define       BFL_ENETROBO            0x0010  /* This board has robo switch or core */
++#define       BFL_CCKHIPWR            0x0040  /* Can do high-power CCK transmission */
++#define       BFL_ENETADM             0x0080  /* This board has ADMtek switch */
++#define       BFL_ENETVLAN            0x0100  /* This board has vlan capability */
++#define       BFL_AFTERBURNER         0x0200  /* This board supports Afterburner mode */
++#define BFL_NOPCI             0x0400  /* This board leaves PCI floating */
++#define BFL_FEM                       0x0800  /* This board supports the Front End Module */
++#define BFL_EXTLNA            0x1000  /* This board has an external LNA */
++#define BFL_HGPA              0x2000  /* This board has a high gain PA */
++#define       BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
++#define       BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
 +
-+/* bcopy, bcmp, and bzero */
-+#define       bcopy(src, dst, len)    memcpy((dst), (src), (len))
-+#define       bcmp(b1, b2, len)       memcmp((b1), (b2), (len))
-+#define       bzero(b, len)           memset((b), '\0', (len))
++/* boardflags2 */
++#define BFL2_RXBB_INT_REG_DIS 0x00000001      /* This board has an external rxbb regulator */
++#define BFL2_SSWITCH_AVAIL    0x00000002      /* This board has a superswitch for > 2 antennas */
++#define BFL2_TXPWRCTRL_EN     0x00000004      /* This board permits TX Power Control to be enabled */
 +
-+/* uncached virtual address */
-+#ifdef mips
-+#define OSL_UNCACHED(va)      KSEG1ADDR((va))
-+#include <asm/addrspace.h>
-+#else
-+#define OSL_UNCACHED(va)      (va)
-+#endif
++/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */
++#define       BOARD_GPIO_BTCMOD_IN    0x010   /* bit 4 is the alternate BT Coexistance Input */
++#define       BOARD_GPIO_BTCMOD_OUT   0x020   /* bit 5 is the alternate BT Coexistance Out */
++#define       BOARD_GPIO_BTC_IN       0x080   /* bit 7 is BT Coexistance Input */
++#define       BOARD_GPIO_BTC_OUT      0x100   /* bit 8 is BT Coexistance Out */
++#define       BOARD_GPIO_PACTRL       0x200   /* bit 9 controls the PA on new 4306 boards */
++#define       PCI_CFG_GPIO_SCS        0x10    /* PCI config space bit 4 for 4306c0 slow clock source */
++#define PCI_CFG_GPIO_HWRAD    0x20    /* PCI config space GPIO 13 for hw radio disable */
++#define PCI_CFG_GPIO_XTAL     0x40    /* PCI config space GPIO 14 for Xtal powerup */
++#define PCI_CFG_GPIO_PLL      0x80    /* PCI config space GPIO 15 for PLL powerdown */
 +
-+/* get processor cycle count */
-+#if defined(mips)
-+#define       OSL_GETCYCLES(x)        ((x) = read_c0_count() * 2)
-+#elif defined(__i386__)
-+#define       OSL_GETCYCLES(x)        rdtscl((x))
-+#else
-+#define OSL_GETCYCLES(x)      ((x) = 0)
-+#endif
++/* power control defines */
++#define PLL_DELAY             150             /* us pll on delay */
++#define FREF_DELAY            200             /* us fref change delay */
++#define MIN_SLOW_CLK          32              /* us Slow clock period */
++#define       XTAL_ON_DELAY           1000            /* us crystal power-on delay */
 +
-+/* dereference an address that may cause a bus exception */
-+#ifdef mips
-+#if defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,17))
-+#define BUSPROBE(val, addr)   panic("get_dbe() will not fixup a bus exception when compiled into a module")
-+#else
-+#define       BUSPROBE(val, addr)     get_dbe((val), (addr))
-+#include <asm/paccess.h>
-+#endif
-+#else
-+#define       BUSPROBE(val, addr)     ({ (val) = R_REG((addr)); 0; })
-+#endif
++/* Reference Board Types */
 +
-+/* map/unmap physical to virtual I/O */
-+#define       REG_MAP(pa, size)       ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
-+#define       REG_UNMAP(va)           iounmap((void *)(va))
++#define       BU4710_BOARD            0x0400
++#define       VSIM4710_BOARD          0x0401
++#define       QT4710_BOARD            0x0402
 +
-+/* shared (dma-able) memory access macros */
-+#define       R_SM(r)                 *(r)
-+#define       W_SM(r, v)              (*(r) = (v))
-+#define       BZERO_SM(r, len)        memset((r), '\0', (len))
++#define       BU4309_BOARD            0x040a
++#define       BCM94309CB_BOARD        0x040b
++#define       BCM94309MP_BOARD        0x040c
++#define       BCM4309AP_BOARD         0x040d
 +
-+/* packet primitives */
-+#define       PKTGET(osh, len, send)          osl_pktget((osh), (len), (send))
-+#define       PKTFREE(osh, skb, send)         osl_pktfree((skb))
-+#define       PKTDATA(osh, skb)               (((struct sk_buff*)(skb))->data)
-+#define       PKTLEN(osh, skb)                (((struct sk_buff*)(skb))->len)
-+#define PKTHEADROOM(osh, skb)         (PKTDATA(osh,skb)-(((struct sk_buff*)(skb))->head))
-+#define PKTTAILROOM(osh, skb)         ((((struct sk_buff*)(skb))->end)-(((struct sk_buff*)(skb))->tail))
-+#define       PKTNEXT(osh, skb)               (((struct sk_buff*)(skb))->next)
-+#define       PKTSETNEXT(skb, x)              (((struct sk_buff*)(skb))->next = (struct sk_buff*)(x))
-+#define       PKTSETLEN(osh, skb, len)        __skb_trim((struct sk_buff*)(skb), (len))
-+#define       PKTPUSH(osh, skb, bytes)        skb_push((struct sk_buff*)(skb), (bytes))
-+#define       PKTPULL(osh, skb, bytes)        skb_pull((struct sk_buff*)(skb), (bytes))
-+#define       PKTDUP(osh, skb)                skb_clone((struct sk_buff*)(skb), GFP_ATOMIC)
-+#define       PKTCOOKIE(skb)                  ((void*)((struct sk_buff*)(skb))->csum)
-+#define       PKTSETCOOKIE(skb, x)            (((struct sk_buff*)(skb))->csum = (uint)(x))
-+#define       PKTLINK(skb)                    (((struct sk_buff*)(skb))->prev)
-+#define       PKTSETLINK(skb, x)              (((struct sk_buff*)(skb))->prev = (struct sk_buff*)(x))
-+#define       PKTPRIO(skb)                    (((struct sk_buff*)(skb))->priority)
-+#define       PKTSETPRIO(skb, x)              (((struct sk_buff*)(skb))->priority = (x))
-+extern void *osl_pktget(osl_t *osh, uint len, bool send);
-+extern void osl_pktfree(void *skb);
-+
-+#else /* BINOSL */                                    
-+
-+/* string library */
-+#ifndef LINUX_OSL
-+#undef printf
-+#define       printf(fmt, args...)            osl_printf((fmt), ## args)
-+#undef sprintf
-+#define sprintf(buf, fmt, args...)    osl_sprintf((buf), (fmt), ## args)
-+#undef strcmp
-+#define       strcmp(s1, s2)                  osl_strcmp((s1), (s2))
-+#undef strncmp
-+#define       strncmp(s1, s2, n)              osl_strncmp((s1), (s2), (n))
-+#undef strlen
-+#define strlen(s)                     osl_strlen((s))
-+#undef strcpy
-+#define       strcpy(d, s)                    osl_strcpy((d), (s))
-+#undef strncpy
-+#define       strncpy(d, s, n)                osl_strncpy((d), (s), (n))
-+#endif
-+extern int osl_printf(const char *format, ...);
-+extern int osl_sprintf(char *buf, const char *format, ...);
-+extern int osl_strcmp(const char *s1, const char *s2);
-+extern int osl_strncmp(const char *s1, const char *s2, uint n);
-+extern int osl_strlen(const char *s);
-+extern char* osl_strcpy(char *d, const char *s);
-+extern char* osl_strncpy(char *d, const char *s, uint n);
++#define       BCM94302MP_BOARD        0x040e
 +
-+/* register access macros */
-+#if !defined(BCMJTAG)
-+#define R_REG(r) ( \
-+      sizeof(*(r)) == sizeof(uint8) ? osl_readb((volatile uint8*)(r)) : \
-+      sizeof(*(r)) == sizeof(uint16) ? osl_readw((volatile uint16*)(r)) : \
-+      osl_readl((volatile uint32*)(r)) \
-+)
-+#define W_REG(r, v) do { \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     osl_writeb((uint8)(v), (volatile uint8*)(r)); break; \
-+      case sizeof(uint16):    osl_writew((uint16)(v), (volatile uint16*)(r)); break; \
-+      case sizeof(uint32):    osl_writel((uint32)(v), (volatile uint32*)(r)); break; \
-+      } \
-+} while (0)
-+#endif
++#define       BU4306_BOARD            0x0416
++#define       BCM94306CB_BOARD        0x0417
++#define       BCM94306MP_BOARD        0x0418
 +
-+#define       AND_REG(r, v)           W_REG((r), R_REG(r) & (v))
-+#define       OR_REG(r, v)            W_REG((r), R_REG(r) | (v))
-+extern uint8 osl_readb(volatile uint8 *r);
-+extern uint16 osl_readw(volatile uint16 *r);
-+extern uint32 osl_readl(volatile uint32 *r);
-+extern void osl_writeb(uint8 v, volatile uint8 *r);
-+extern void osl_writew(uint16 v, volatile uint16 *r);
-+extern void osl_writel(uint32 v, volatile uint32 *r);
++#define       BCM94710D_BOARD         0x041a
++#define       BCM94710R1_BOARD        0x041b
++#define       BCM94710R4_BOARD        0x041c
++#define       BCM94710AP_BOARD        0x041d
 +
-+/* bcopy, bcmp, and bzero */
-+extern void bcopy(const void *src, void *dst, int len);
-+extern int bcmp(const void *b1, const void *b2, int len);
-+extern void bzero(void *b, int len);
++#define       BU2050_BOARD            0x041f
 +
-+/* uncached virtual address */
-+#define OSL_UNCACHED(va)      osl_uncached((va))
-+extern void *osl_uncached(void *va);
 +
-+/* get processor cycle count */
-+#define OSL_GETCYCLES(x)      ((x) = osl_getcycles())
-+extern uint osl_getcycles(void);
++#define       BCM94309G_BOARD         0x0421
 +
-+/* dereference an address that may target abort */
-+#define       BUSPROBE(val, addr)     osl_busprobe(&(val), (addr))
-+extern int osl_busprobe(uint32 *val, uint32 addr);
++#define       BU4704_BOARD            0x0423
++#define       BU4702_BOARD            0x0424
 +
-+/* map/unmap physical to virtual */
-+#define       REG_MAP(pa, size)       osl_reg_map((pa), (size))
-+#define       REG_UNMAP(va)           osl_reg_unmap((va))
-+extern void *osl_reg_map(uint32 pa, uint size);
-+extern void osl_reg_unmap(void *va);
++#define       BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
 +
-+/* shared (dma-able) memory access macros */
-+#define       R_SM(r)                 *(r)
-+#define       W_SM(r, v)              (*(r) = (v))
-+#define       BZERO_SM(r, len)        bzero((r), (len))
 +
-+/* packet primitives */
-+#define       PKTGET(osh, len, send)          osl_pktget((osh), (len), (send))
-+#define       PKTFREE(osh, skb, send)         osl_pktfree((skb))
-+#define       PKTDATA(osh, skb)               osl_pktdata((osh), (skb))
-+#define       PKTLEN(osh, skb)                osl_pktlen((osh), (skb))
-+#define PKTHEADROOM(osh, skb)         osl_pktheadroom((osh), (skb))
-+#define PKTTAILROOM(osh, skb)         osl_pkttailroom((osh), (skb))
-+#define       PKTNEXT(osh, skb)               osl_pktnext((osh), (skb))
-+#define       PKTSETNEXT(skb, x)              osl_pktsetnext((skb), (x))
-+#define       PKTSETLEN(osh, skb, len)        osl_pktsetlen((osh), (skb), (len))
-+#define       PKTPUSH(osh, skb, bytes)        osl_pktpush((osh), (skb), (bytes))
-+#define       PKTPULL(osh, skb, bytes)        osl_pktpull((osh), (skb), (bytes))
-+#define       PKTDUP(osh, skb)                osl_pktdup((osh), (skb))
-+#define       PKTCOOKIE(skb)                  osl_pktcookie((skb))
-+#define       PKTSETCOOKIE(skb, x)            osl_pktsetcookie((skb), (x))
-+#define       PKTLINK(skb)                    osl_pktlink((skb))
-+#define       PKTSETLINK(skb, x)              osl_pktsetlink((skb), (x))
-+#define       PKTPRIO(skb)                    osl_pktprio((skb))
-+#define       PKTSETPRIO(skb, x)              osl_pktsetprio((skb), (x))
-+extern void *osl_pktget(osl_t *osh, uint len, bool send);
-+extern void osl_pktfree(void *skb);
-+extern uchar *osl_pktdata(osl_t *osh, void *skb);
-+extern uint osl_pktlen(osl_t *osh, void *skb);
-+extern uint osl_pktheadroom(osl_t *osh, void *skb);
-+extern uint osl_pkttailroom(osl_t *osh, void *skb);
-+extern void *osl_pktnext(osl_t *osh, void *skb);
-+extern void osl_pktsetnext(void *skb, void *x);
-+extern void osl_pktsetlen(osl_t *osh, void *skb, uint len);
-+extern uchar *osl_pktpush(osl_t *osh, void *skb, int bytes);
-+extern uchar *osl_pktpull(osl_t *osh, void *skb, int bytes);
-+extern void *osl_pktdup(osl_t *osh, void *skb);
-+extern void *osl_pktcookie(void *skb);
-+extern void osl_pktsetcookie(void *skb, void *x);
-+extern void *osl_pktlink(void *skb);
-+extern void osl_pktsetlink(void *skb, void *x);
-+extern uint osl_pktprio(void *skb);
-+extern void osl_pktsetprio(void *skb, uint x);
++#define       BCM94702MN_BOARD        0x0428
 +
-+#endif        /* BINOSL */
++/* BCM4702 1U CompactPCI Board */
++#define       BCM94702CPCI_BOARD      0x0429
 +
-+#define OSL_ERROR(bcmerror)   osl_error(bcmerror)
-+extern int osl_error(int bcmerror);
++/* BCM4702 with BCM95380 VLAN Router */
++#define       BCM95380RR_BOARD        0x042a
 +
-+/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
-+#define       PKTBUFSZ        2048
++/* cb4306 with SiGe PA */
++#define       BCM94306CBSG_BOARD      0x042b
 +
-+#endif        /* _linux_osl_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/linuxver.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/linuxver.h
---- linux-2.4.32/arch/mips/bcm947xx/include/linuxver.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/linuxver.h    2005-12-16 23:39:10.748824500 +0100
-@@ -0,0 +1,411 @@
-+/*
-+ * Linux-specific abstractions to gain some independence from linux kernel versions.
-+ * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences.
-+ *
-+ * Copyright 2005, 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$
-+ */
++/* cb4306 with SiGe PA */
++#define       PCSG94306_BOARD         0x042d
 +
-+#ifndef _linuxver_h_
-+#define _linuxver_h_
++/* bu4704 with sdram */
++#define       BU4704SD_BOARD          0x042e
 +
-+#include <linux/config.h>
-+#include <linux/version.h>
++/* Dual 11a/11g Router */
++#define       BCM94704AGR_BOARD       0x042f
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
-+/* __NO_VERSION__ must be defined for all linkables except one in 2.2 */
-+#ifdef __UNDEF_NO_VERSION__
-+#undef __NO_VERSION__
-+#else
-+#define __NO_VERSION__
-+#endif
-+#endif
++/* 11a-only minipci */
++#define       BCM94308MP_BOARD        0x0430
 +
-+#if defined(MODULE) && defined(MODVERSIONS)
-+#include <linux/modversions.h>
-+#endif
 +
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+#include <linux/moduleparam.h>
-+#endif
 +
++#define BU4712_BOARD          0x0444
++#define       BU4712SD_BOARD          0x045d
++#define       BU4712L_BOARD           0x045f
 +
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) 
-+#define module_param(_name_, _type_, _perm_)  MODULE_PARM(_name_, "i")        
-+#define module_param_string(_name_, _string_, _size_, _perm_) MODULE_PARM(_string_, "c" __MODULE_STRING(_size_))
-+#endif
++/* BCM4712 boards */
++#define BCM94712AP_BOARD      0x0445
++#define BCM94712P_BOARD               0x0446
 +
-+/* linux/malloc.h is deprecated, use linux/slab.h instead. */
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,9))
-+#include <linux/malloc.h>
-+#else
-+#include <linux/slab.h>
-+#endif
++/* BCM4318 boards */
++#define BU4318_BOARD          0x0447
++#define CB4318_BOARD          0x0448
++#define MPG4318_BOARD         0x0449
++#define MP4318_BOARD          0x044a
++#define SD4318_BOARD          0x044b
 +
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/pci.h>
-+#include <linux/interrupt.h>
-+#include <linux/netdevice.h>
-+#include <asm/io.h>
++/* BCM63XX boards */
++#define BCM96338_BOARD                0x6338
++#define BCM96348_BOARD                0x6348
 +
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41))
-+#include <linux/workqueue.h>
-+#else
-+#include <linux/tqueue.h>
-+#ifndef work_struct
-+#define work_struct tq_struct
-+#endif
-+#ifndef INIT_WORK
-+#define INIT_WORK(_work, _func, _data) INIT_TQUEUE((_work), (_func), (_data))
-+#endif
-+#ifndef schedule_work
-+#define schedule_work(_work) schedule_task((_work))
-+#endif
-+#ifndef flush_scheduled_work
-+#define flush_scheduled_work() flush_scheduled_tasks()
-+#endif
-+#endif
++/* Another mp4306 with SiGe */
++#define       BCM94306P_BOARD         0x044c
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
-+/* Some distributions have their own 2.6.x compatibility layers */
-+#ifndef IRQ_NONE
-+typedef void irqreturn_t;
-+#define IRQ_NONE
-+#define IRQ_HANDLED
-+#define IRQ_RETVAL(x)
-+#endif
-+#else
-+typedef irqreturn_t (*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs);
-+#endif
++/* mp4303 */
++#define       BCM94303MP_BOARD        0x044e
 +
-+#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
++/* mpsgh4306 */
++#define       BCM94306MPSGH_BOARD     0x044f
 +
-+#include <pcmcia/version.h>
-+#include <pcmcia/cs_types.h>
-+#include <pcmcia/cs.h>
-+#include <pcmcia/cistpl.h>
-+#include <pcmcia/cisreg.h>
-+#include <pcmcia/ds.h>
++/* BRCM 4306 w/ Front End Modules */
++#define BCM94306MPM           0x0450
++#define BCM94306MPL           0x0453
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69))
-+/* In 2.5 (as of 2.5.69 at least) there is a cs_error exported which
-+ * does this, but it's not in 2.4 so we do our own for now. */
-+static inline void
-+cs_error(client_handle_t handle, int func, int ret)
-+{
-+      error_info_t err = { func, ret };
-+      CardServices(ReportError, handle, &err);
-+}
-+#endif
-+
-+#endif /* CONFIG_PCMCIA */
-+
-+#ifndef __exit
-+#define __exit
-+#endif
-+#ifndef __devexit
-+#define __devexit
-+#endif
-+#ifndef __devinit
-+#define __devinit     __init
-+#endif
-+#ifndef __devinitdata
-+#define __devinitdata
-+#endif
-+#ifndef __devexit_p
-+#define __devexit_p(x)        x
-+#endif
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
++/* 4712agr */
++#define       BCM94712AGR_BOARD       0x0451
 +
-+#define pci_get_drvdata(dev)          (dev)->sysdata
-+#define pci_set_drvdata(dev, value)   (dev)->sysdata=(value)
++/* pcmcia 4303 */
++#define       PC4303_BOARD            0x0454
 +
-+/*
-+ * New-style (2.4.x) PCI/hot-pluggable PCI/CardBus registration
-+ */
++/* 5350K */
++#define       BCM95350K_BOARD         0x0455
 +
-+struct pci_device_id {
-+      unsigned int vendor, device;            /* Vendor and device ID or PCI_ANY_ID */
-+      unsigned int subvendor, subdevice;      /* Subsystem ID's or PCI_ANY_ID */
-+      unsigned int class, class_mask;         /* (class,subclass,prog-if) triplet */
-+      unsigned long driver_data;              /* Data private to the driver */
-+};
++/* 5350R */
++#define       BCM95350R_BOARD         0x0456
 +
-+struct pci_driver {
-+      struct list_head node;
-+      char *name;
-+      const struct pci_device_id *id_table;   /* NULL if wants all devices */
-+      int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);      /* New device inserted */
-+      void (*remove)(struct pci_dev *dev);    /* Device removed (NULL if not a hot-plug capable driver) */
-+      void (*suspend)(struct pci_dev *dev);   /* Device suspended */
-+      void (*resume)(struct pci_dev *dev);    /* Device woken up */
-+};
++/* 4306mplna */
++#define       BCM94306MPLNA_BOARD     0x0457
 +
-+#define MODULE_DEVICE_TABLE(type, name)
-+#define PCI_ANY_ID (~0)
++/* 4320 boards */
++#define       BU4320_BOARD            0x0458
++#define       BU4320S_BOARD           0x0459
++#define       BCM94320PH_BOARD        0x045a
 +
-+/* compatpci.c */
-+#define pci_module_init pci_register_driver
-+extern int pci_register_driver(struct pci_driver *drv);
-+extern void pci_unregister_driver(struct pci_driver *drv);
++/* 4306mph */
++#define       BCM94306MPH_BOARD       0x045b
 +
-+#endif /* PCI registration */
++/* 4306pciv */
++#define       BCM94306PCIV_BOARD      0x045c
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,2,18))
-+#ifdef MODULE
-+#define module_init(x) int init_module(void) { return x(); }
-+#define module_exit(x) void cleanup_module(void) { x(); }
-+#else
-+#define module_init(x)        __initcall(x);
-+#define module_exit(x)        __exitcall(x);
-+#endif
-+#endif
++#define       BU4712SD_BOARD          0x045d
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,48))
-+#define list_for_each(pos, head) \
-+      for (pos = (head)->next; pos != (head); pos = pos->next)
-+#endif
++#define       BCM94320PFLSH_BOARD     0x045e
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,13))
-+#define pci_resource_start(dev, bar)  ((dev)->base_address[(bar)])
-+#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,44))
-+#define pci_resource_start(dev, bar)  ((dev)->resource[(bar)].start)
-+#endif
++#define       BU4712L_BOARD           0x045f
++#define       BCM94712LGR_BOARD       0x0460
++#define       BCM94320R_BOARD         0x0461
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,23))
-+#define pci_enable_device(dev) do { } while (0)
-+#endif
++#define       BU5352_BOARD            0x0462
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,14))
-+#define net_device device
-+#endif
++#define       BCM94318MPGH_BOARD      0x0463
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,42))
++#define       BU4311_BOARD            0x0464
++#define       BCM94311MC_BOARD        0x0465
++#define       BCM94311MCAG_BOARD      0x0466
 +
-+/*
-+ * DMA mapping
-+ *
-+ * See linux/Documentation/DMA-mapping.txt
-+ */
++#define       BCM95352GR_BOARD        0x0467
 +
-+#ifndef PCI_DMA_TODEVICE
-+#define       PCI_DMA_TODEVICE        1
-+#define       PCI_DMA_FROMDEVICE      2
-+#endif
++/* bcm95351agr */
++#define       BCM95351AGR_BOARD       0x0470
 +
-+typedef u32 dma_addr_t;
++/* bcm94704mpcb */
++#define       BCM94704MPCB_BOARD      0x0472
 +
-+/* Pure 2^n version of get_order */
-+static inline int get_order(unsigned long size)
-+{
-+      int order;
++/* 4785 boards */
++#define BU4785_BOARD          0x0478
 +
-+      size = (size-1) >> (PAGE_SHIFT-1);
-+      order = -1;
-+      do {
-+              size >>= 1;
-+              order++;
-+      } while (size);
-+      return order;
-+}
++/* 4321 boards */
++#define BU4321_BOARD          0x046b
++#define BU4321E_BOARD         0x047c
++#define MP4321_BOARD          0x046c
++#define CB2_4321_BOARD                0x046d
++#define MC4321_BOARD          0x046e
 +
-+static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
-+                                       dma_addr_t *dma_handle)
-+{
-+      void *ret;
-+      int gfp = GFP_ATOMIC | GFP_DMA;
++/* # of GPIO pins */
++#define GPIO_NUMPINS          16
 +
-+      ret = (void *)__get_free_pages(gfp, get_order(size));
++/* radio ID codes */
++#define       NORADIO_ID              0xe4f5
++#define       NORADIO_IDCODE          0x4e4f5246
 +
-+      if (ret != NULL) {
-+              memset(ret, 0, size);
-+              *dma_handle = virt_to_bus(ret);
-+      }
-+      return ret;
-+}
-+static inline void pci_free_consistent(struct pci_dev *hwdev, size_t size,
-+                                     void *vaddr, dma_addr_t dma_handle)
-+{
-+      free_pages((unsigned long)vaddr, get_order(size));
-+}
-+#ifdef ILSIM
-+extern uint pci_map_single(void *dev, void *va, uint size, int direction);
-+extern void pci_unmap_single(void *dev, uint pa, uint size, int direction);
-+#else
-+#define pci_map_single(cookie, address, size, dir)    virt_to_bus(address)
-+#define pci_unmap_single(cookie, address, size, dir)
-+#endif
++#define       BCM2050_ID              0x2050
++#define       BCM2050_IDCODE          0x02050000
++#define       BCM2050A0_IDCODE        0x1205017f
++#define       BCM2050A1_IDCODE        0x2205017f
++#define       BCM2050R8_IDCODE        0x8205017f
 +
-+#endif /* DMA mapping */
++#define BCM2055_ID            0x2055
++#define BCM2055_IDCODE                0x02055000
++#define BCM2055A0_IDCODE      0x1205517f
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,43))
++#define       BCM2060_ID              0x2060
++#define       BCM2060_IDCODE          0x02060000
++#define       BCM2060WW_IDCODE        0x1206017f
 +
-+#define dev_kfree_skb_any(a)          dev_kfree_skb(a)
-+#define netif_down(dev)                       do { (dev)->start = 0; } while(0)
++#define BCM2062_ID            0x2062
++#define BCM2062_IDCODE                0x02062000
++#define BCM2062A0_IDCODE      0x0206217f
 +
-+/* pcmcia-cs provides its own netdevice compatibility layer */
-+#ifndef _COMPAT_NETDEVICE_H
++/* parts of an idcode: */
++#define       IDCODE_MFG_MASK         0x00000fff
++#define       IDCODE_MFG_SHIFT        0
++#define       IDCODE_ID_MASK          0x0ffff000
++#define       IDCODE_ID_SHIFT         12
++#define       IDCODE_REV_MASK         0xf0000000
++#define       IDCODE_REV_SHIFT        28
 +
++#endif /* _BCMDEVS_H */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bcm947xx/include/bcmdevs1.h
+--- linux.old/arch/mips/bcm947xx/include/bcmdevs1.h    1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmdevs1.h    2006-05-02 04:32:03.000000000 +0200
+@@ -0,0 +1,391 @@
 +/*
-+ * SoftNet
++ * Broadcom device-specific manifest constants.
 + *
-+ * For pre-softnet kernels we need to tell the upper layer not to
-+ * re-enter start_xmit() while we are in there. However softnet
-+ * guarantees not to enter while we are in there so there is no need
-+ * to do the netif_stop_queue() dance unless the transmit queue really
-+ * gets stuck. This should also improve performance according to tests
-+ * done by Aman Singla.
++ * Copyright 2005, 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$
 + */
 +
-+#define dev_kfree_skb_irq(a)          dev_kfree_skb(a)
-+#define netif_wake_queue(dev)         do { clear_bit(0, &(dev)->tbusy); mark_bh(NET_BH); } while(0)
-+#define netif_stop_queue(dev)         set_bit(0, &(dev)->tbusy)
++#ifndef       _BCMDEVS_H
++#define       _BCMDEVS_H
 +
-+static inline void netif_start_queue(struct net_device *dev)
-+{
-+      dev->tbusy = 0;
-+      dev->interrupt = 0;
-+      dev->start = 1;
-+}
 +
-+#define netif_queue_stopped(dev)      (dev)->tbusy
-+#define netif_running(dev)            (dev)->start
++/* Known PCI vendor Id's */
++#define       VENDOR_EPIGRAM          0xfeda
++#define       VENDOR_BROADCOM         0x14e4
++#define       VENDOR_3COM             0x10b7
++#define       VENDOR_NETGEAR          0x1385
++#define       VENDOR_DIAMOND          0x1092
++#define       VENDOR_DELL             0x1028
++#define       VENDOR_HP               0x0e11
++#define       VENDOR_APPLE            0x106b
 +
-+#endif /* _COMPAT_NETDEVICE_H */
++/* PCI Device Id's */
++#define       BCM4210_DEVICE_ID       0x1072          /* never used */
++#define       BCM4211_DEVICE_ID       0x4211
++#define       BCM4230_DEVICE_ID       0x1086          /* never used */
++#define       BCM4231_DEVICE_ID       0x4231
 +
-+#define netif_device_attach(dev)      netif_start_queue(dev)
-+#define netif_device_detach(dev)      netif_stop_queue(dev)
++#define       BCM4410_DEVICE_ID       0x4410          /* bcm44xx family pci iline */
++#define       BCM4430_DEVICE_ID       0x4430          /* bcm44xx family cardbus iline */
++#define       BCM4412_DEVICE_ID       0x4412          /* bcm44xx family pci enet */
++#define       BCM4432_DEVICE_ID       0x4432          /* bcm44xx family cardbus enet */
 +
-+/* 2.4.x renamed bottom halves to tasklets */
-+#define tasklet_struct                                tq_struct
-+static inline void tasklet_schedule(struct tasklet_struct *tasklet)
-+{
-+      queue_task(tasklet, &tq_immediate);
-+      mark_bh(IMMEDIATE_BH);
-+}
++#define       BCM3352_DEVICE_ID       0x3352          /* bcm3352 device id */
++#define       BCM3360_DEVICE_ID       0x3360          /* bcm3360 device id */
 +
-+static inline void tasklet_init(struct tasklet_struct *tasklet,
-+                              void (*func)(unsigned long),
-+                              unsigned long data)
-+{
-+      tasklet->next = NULL;
-+      tasklet->sync = 0;
-+      tasklet->routine = (void (*)(void *))func;
-+      tasklet->data = (void *)data;
-+}
-+#define tasklet_kill(tasklet)                 {do{} while(0);}
++#define       EPI41210_DEVICE_ID      0xa0fa          /* bcm4210 */
++#define       EPI41230_DEVICE_ID      0xa10e          /* bcm4230 */
 +
-+/* 2.4.x introduced del_timer_sync() */
-+#define del_timer_sync(timer) del_timer(timer)
++#define       BCM47XX_ILINE_ID        0x4711          /* 47xx iline20 */
++#define       BCM47XX_V90_ID          0x4712          /* 47xx v90 codec */
++#define       BCM47XX_ENET_ID         0x4713          /* 47xx enet */
++#define       BCM47XX_EXT_ID          0x4714          /* 47xx external i/f */
++#define       BCM47XX_USB_ID          0x4715          /* 47xx usb */
++#define       BCM47XX_USBH_ID         0x4716          /* 47xx usb host */
++#define       BCM47XX_USBD_ID         0x4717          /* 47xx usb device */
++#define       BCM47XX_IPSEC_ID        0x4718          /* 47xx ipsec */
++#define       BCM47XX_ROBO_ID         0x4719          /* 47xx/53xx roboswitch core */
++#define       BCM47XX_USB20H_ID       0x471a          /* 47xx usb 2.0 host */
++#define       BCM47XX_USB20D_ID       0x471b          /* 47xx usb 2.0 device */
 +
-+#else
++#define       BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
 +
-+#define netif_down(dev)
++#define       BCM4610_DEVICE_ID       0x4610          /* 4610 primary function 0 */
++#define       BCM4610_ILINE_ID        0x4611          /* 4610 iline100 */
++#define       BCM4610_V90_ID          0x4612          /* 4610 v90 codec */
++#define       BCM4610_ENET_ID         0x4613          /* 4610 enet */
++#define       BCM4610_EXT_ID          0x4614          /* 4610 external i/f */
++#define       BCM4610_USB_ID          0x4615          /* 4610 usb */
 +
-+#endif /* SoftNet */
++#define       BCM4402_DEVICE_ID       0x4402          /* 4402 primary function 0 */
++#define       BCM4402_ENET_ID         0x4402          /* 4402 enet */
++#define       BCM4402_V90_ID          0x4403          /* 4402 v90 codec */
++#define       BCM4401_ENET_ID         0x170c          /* 4401b0 production enet cards */
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,3))
++#define       BCM4301_DEVICE_ID       0x4301          /* 4301 primary function 0 */
++#define       BCM4301_D11B_ID         0x4301          /* 4301 802.11b */
 +
-+/*
-+ * Emit code to initialise a tq_struct's routine and data pointers
-+ */
-+#define PREPARE_TQUEUE(_tq, _routine, _data)                  \
-+      do {                                                    \
-+              (_tq)->routine = _routine;                      \
-+              (_tq)->data = _data;                            \
-+      } while (0)
++#define       BCM4307_DEVICE_ID       0x4307          /* 4307 primary function 0 */
++#define       BCM4307_V90_ID          0x4305          /* 4307 v90 codec */
++#define       BCM4307_ENET_ID         0x4306          /* 4307 enet */
++#define       BCM4307_D11B_ID         0x4307          /* 4307 802.11b */
 +
-+/*
-+ * Emit code to initialise all of a tq_struct
-+ */
-+#define INIT_TQUEUE(_tq, _routine, _data)                     \
-+      do {                                                    \
-+              INIT_LIST_HEAD(&(_tq)->list);                   \
-+              (_tq)->sync = 0;                                \
-+              PREPARE_TQUEUE((_tq), (_routine), (_data));     \
-+      } while (0)
++#define       BCM4306_DEVICE_ID       0x4306          /* 4306 chipcommon chipid */
++#define       BCM4306_D11G_ID         0x4320          /* 4306 802.11g */
++#define       BCM4306_D11G_ID2        0x4325          
++#define       BCM4306_D11A_ID         0x4321          /* 4306 802.11a */
++#define       BCM4306_UART_ID         0x4322          /* 4306 uart */
++#define       BCM4306_V90_ID          0x4323          /* 4306 v90 codec */
++#define       BCM4306_D11DUAL_ID      0x4324          /* 4306 dual A+B */
 +
-+#endif
++#define       BCM4309_PKG_ID          1               /* 4309 package id */
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6))
++#define       BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
++#define       BCM4303_PKG_ID          2               /* 4303 package id */
 +
-+/* Power management related routines */
++#define       BCM4310_DEVICE_ID       0x4310          /* 4310 chipcommon chipid */
++#define       BCM4310_D11B_ID         0x4311          /* 4310 802.11b */
++#define       BCM4310_UART_ID         0x4312          /* 4310 uart */
++#define       BCM4310_ENET_ID         0x4313          /* 4310 enet */
++#define       BCM4310_USB_ID          0x4315          /* 4310 usb */
 +
-+static inline int
-+pci_save_state(struct pci_dev *dev, u32 *buffer)
-+{
-+      int i;
-+      if (buffer) {
-+              for (i = 0; i < 16; i++)
-+                      pci_read_config_dword(dev, i * 4,&buffer[i]);
-+      }
-+      return 0;
-+}
++#define       BCMGPRS_UART_ID         0x4333          /* Uart id used by 4306/gprs card */
++#define       BCMGPRS2_UART_ID        0x4344          /* Uart id used by 4306/gprs card */
 +
-+static inline int 
-+pci_restore_state(struct pci_dev *dev, u32 *buffer)
-+{
-+      int i;
 +
-+      if (buffer) {
-+              for (i = 0; i < 16; i++)
-+                      pci_write_config_dword(dev,i * 4, buffer[i]);
-+      }
-+      /*
-+       * otherwise, write the context information we know from bootup.
-+       * This works around a problem where warm-booting from Windows
-+       * combined with a D3(hot)->D0 transition causes PCI config
-+       * header data to be forgotten.
-+       */     
-+      else {
-+              for (i = 0; i < 6; i ++)
-+                      pci_write_config_dword(dev,
-+                                             PCI_BASE_ADDRESS_0 + (i * 4),
-+                                             pci_resource_start(dev, i));
-+              pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
-+      }
-+      return 0;
-+}
++#define       BCM4704_DEVICE_ID       0x4704          /* 4704 chipcommon chipid */
++#define       BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
 +
-+#endif /* PCI power management */
++#define       BCM4317_DEVICE_ID       0x4317          /* 4317 chip common chipid */
 +
-+/* Old cp0 access macros deprecated in 2.4.19 */
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19))
-+#define read_c0_count() read_32bit_cp0_register(CP0_COUNT)
-+#endif
++#define       BCM4318_DEVICE_ID       0x4318          /* 4318 chip common chipid */
++#define       BCM4318_D11G_ID         0x4318          /* 4318 801.11b/g id */
++#define       BCM4318_D11DUAL_ID      0x4319          /* 4318 801.11a/b/g id */
++#define BCM4318_JTAGM_ID      0x4331          /* 4318 jtagm device id */
 +
-+/* Module refcount handled internally in 2.6.x */
-+#ifndef SET_MODULE_OWNER
-+#define SET_MODULE_OWNER(dev)         do {} while (0)
-+#define OLD_MOD_INC_USE_COUNT         MOD_INC_USE_COUNT
-+#define OLD_MOD_DEC_USE_COUNT         MOD_DEC_USE_COUNT
-+#else
-+#define OLD_MOD_INC_USE_COUNT         do {} while (0)
-+#define OLD_MOD_DEC_USE_COUNT         do {} while (0)
-+#endif
++#define FPGA_JTAGM_ID         0x4330          /* ??? */
 +
-+#ifndef SET_NETDEV_DEV
-+#define SET_NETDEV_DEV(net, pdev)     do {} while (0)
-+#endif
++/* Address map */
++#define BCM4710_SDRAM           0x00000000      /* Physical SDRAM */
++#define BCM4710_PCI_MEM         0x08000000      /* Host Mode PCI memory access space (64 MB) */
++#define BCM4710_PCI_CFG         0x0c000000      /* Host Mode PCI configuration space (64 MB) */
++#define BCM4710_PCI_DMA         0x40000000      /* Client Mode PCI memory access space (1 GB) */
++#define BCM4710_SDRAM_SWAPPED   0x10000000      /* Byteswapped Physical SDRAM */
++#define BCM4710_ENUM            0x18000000      /* Beginning of core enumeration space */
 +
-+#ifndef HAVE_FREE_NETDEV
-+#define free_netdev(dev)              kfree(dev)
-+#endif
++/* Core register space */
++#define BCM4710_REG_SDRAM       0x18000000      /* SDRAM core registers */
++#define BCM4710_REG_ILINE20     0x18001000      /* InsideLine20 core registers */
++#define BCM4710_REG_EMAC0       0x18002000      /* Ethernet MAC 0 core registers */
++#define BCM4710_REG_CODEC       0x18003000      /* Codec core registers */
++#define BCM4710_REG_USB         0x18004000      /* USB core registers */
++#define BCM4710_REG_PCI         0x18005000      /* PCI core registers */
++#define BCM4710_REG_MIPS        0x18006000      /* MIPS core registers */
++#define BCM4710_REG_EXTIF       0x18007000      /* External Interface core registers */
++#define BCM4710_REG_EMAC1       0x18008000      /* Ethernet MAC 1 core registers */
 +
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
-+/* struct packet_type redefined in 2.6.x */
-+#define af_packet_priv                        data
-+#endif
++#define BCM4710_EXTIF           0x1f000000      /* External Interface base address */
++#define BCM4710_PCMCIA_MEM      0x1f000000      /* External Interface PCMCIA memory access */
++#define BCM4710_PCMCIA_IO       0x1f100000      /* PCMCIA I/O access */
++#define BCM4710_PCMCIA_CONF     0x1f200000      /* PCMCIA configuration */
++#define BCM4710_PROG            0x1f800000      /* Programable interface */
++#define BCM4710_FLASH           0x1fc00000      /* Flash */
 +
-+#endif /* _linuxver_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/min_osl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/min_osl.h
---- linux-2.4.32/arch/mips/bcm947xx/include/min_osl.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/min_osl.h     2005-12-16 23:39:10.748824500 +0100
-@@ -0,0 +1,126 @@
-+/*
-+ * HND Minimal OS Abstraction Layer.
-+ *
-+ * Copyright 2005, 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$
-+ */
++#define BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
 +
-+#ifndef _min_osl_h_
-+#define _min_osl_h_
++#define BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
 +
-+#include <typedefs.h>
-+#include <sbconfig.h>
-+#include <mipsinc.h>
++#define BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
++#define BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
 +
-+/* Cache support */
-+extern void caches_on(void);
-+extern void blast_dcache(void);
-+extern void blast_icache(void);
-+
-+/* uart output */
-+extern void putc(int c);
-+
-+/* lib functions */
-+extern int printf(const char *fmt, ...);
-+extern int sprintf(char *buf, const char *fmt, ...);
-+extern int strcmp(const char *s1, const char *s2);
-+extern int strncmp(const char *s1, const char *s2, uint n);
-+extern char *strcpy(char *dest, const char *src);
-+extern char *strncpy(char *dest, const char *src, uint n);
-+extern uint strlen(const char *s);
-+extern char *strchr(const char *str,int c);
-+extern char *strrchr(const char *str, int c);
-+extern char *strcat(char *d, const char *s);
-+extern void *memset(void *dest, int c, uint n);
-+extern void *memcpy(void *dest, const void *src, uint n);
-+extern int memcmp(const void *s1, const void *s2, uint n);
-+#define       bcopy(src, dst, len)    memcpy((dst), (src), (len))
-+#define       bcmp(b1, b2, len)       memcmp((b1), (b2), (len))
-+#define       bzero(b, len)           memset((b), '\0', (len))
++#define       BCM4712_DEVICE_ID       0x4712          /* 4712 chipcommon chipid */
++#define       BCM4712_MIPS_ID         0x4720          /* 4712 base devid */
++#define       BCM4712LARGE_PKG_ID     0               /* 340pin 4712 package id */
++#define       BCM4712SMALL_PKG_ID     1               /* 200pin 4712 package id */
++#define       BCM4712MID_PKG_ID       2               /* 225pin 4712 package id */
 +
-+/* assert & debugging */
-+#define       ASSERT(exp)             do {} while (0)
++#define       SDIOH_FPGA_ID           0x4380          /* sdio host fpga */
 +
-+/* PCMCIA attribute space access macros */
-+#define       OSL_PCMCIA_READ_ATTR(osh, offset, buf, size) \
-+      ASSERT(0)
-+#define       OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size) \
-+      ASSERT(0)
++#define BCM5365_DEVICE_ID       0x5365          /* 5365 chipcommon chipid */
++#define       BCM5350_DEVICE_ID       0x5350          /* bcm5350 chipcommon chipid */
++#define       BCM5352_DEVICE_ID       0x5352          /* bcm5352 chipcommon chipid */
 +
-+/* PCI configuration space access macros */
-+#define       OSL_PCI_READ_CONFIG(loc, offset, size) \
-+      (offset == 8 ? 0 : 0xffffffff)
-+#define       OSL_PCI_WRITE_CONFIG(loc, offset, size, val) \
-+      do {} while (0)
++#define       BCM4320_DEVICE_ID       0x4320          /* bcm4320 chipcommon chipid */
 +
-+/* PCI device bus # and slot # */
-+#define OSL_PCI_BUS(osh)      (0)
-+#define OSL_PCI_SLOT(osh)     (0)
++/* PCMCIA vendor Id's */
 +
-+/* register access macros */
-+#define wreg32(r, v)          (*(volatile uint32*)(r) = (uint32)(v))
-+#define rreg32(r)             (*(volatile uint32*)(r))
-+#define wreg16(r, v)          (*(volatile uint16*)(r) = (uint16)(v))
-+#define rreg16(r)             (*(volatile uint16*)(r))
-+#define wreg8(r, v)           (*(volatile uint8*)(r) = (uint8)(v))
-+#define rreg8(r)              (*(volatile uint8*)(r))
-+#define R_REG(r) ({ \
-+      __typeof(*(r)) __osl_v; \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     __osl_v = rreg8((r)); break; \
-+      case sizeof(uint16):    __osl_v = rreg16((r)); break; \
-+      case sizeof(uint32):    __osl_v = rreg32((r)); break; \
-+      } \
-+      __osl_v; \
-+})
-+#define W_REG(r, v) do { \
-+      switch (sizeof(*(r))) { \
-+      case sizeof(uint8):     wreg8((r), (v)); break; \
-+      case sizeof(uint16):    wreg16((r), (v)); break; \
-+      case sizeof(uint32):    wreg32((r), (v)); break; \
-+      } \
-+} while (0)
-+#define       AND_REG(r, v)           W_REG((r), R_REG(r) & (v))
-+#define       OR_REG(r, v)            W_REG((r), R_REG(r) | (v))
-+
-+/* general purpose memory allocation */
-+#define       MALLOC(osh, size)       malloc(size)
-+#define       MFREE(osh, addr, size)  free(addr)
-+#define       MALLOCED(osh)           0
-+#define       MALLOC_FAILED(osh)      0
-+#define       MALLOC_DUMP(osh, buf, sz)
-+extern int free(void *ptr);
-+extern void *malloc(uint size);
++#define       VENDOR_BROADCOM_PCMCIA  0x02d0
 +
-+/* uncached virtual address */
-+#define       OSL_UNCACHED(va)        ((void*)KSEG1ADDR((ulong)(va)))
++/* SDIO vendor Id's */
++#define       VENDOR_BROADCOM_SDIO    0x00BF
 +
-+/* host/bus architecture-specific address byte swap */
-+#define BUS_SWAP32(v)         (v)
 +
-+/* microsecond delay */
-+#define       OSL_DELAY(usec)         udelay(usec)
-+extern void udelay(uint32 usec);
++/* boardflags */
++#define       BFL_BTCOEXIST           0x0001  /* This board implements Bluetooth coexistance */
++#define       BFL_PACTRL              0x0002  /* This board has gpio 9 controlling the PA */
++#define       BFL_AIRLINEMODE         0x0004  /* This board implements gpio13 radio disable indication */
++#define       BFL_ENETROBO            0x0010  /* This board has robo switch or core */
++#define       BFL_CCKHIPWR            0x0040  /* Can do high-power CCK transmission */
++#define       BFL_ENETADM             0x0080  /* This board has ADMtek switch */
++#define       BFL_ENETVLAN            0x0100  /* This board has vlan capability */
++#define       BFL_AFTERBURNER         0x0200  /* This board supports Afterburner mode */
++#define BFL_NOPCI             0x0400  /* This board leaves PCI floating */
++#define BFL_FEM                       0x0800  /* This board supports the Front End Module */
++#define BFL_EXTLNA            0x1000  /* This board has an external LNA */
++#define BFL_HGPA              0x2000  /* This board has a high gain PA */
++#define       BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
++#define       BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
 +
-+/* map/unmap physical to virtual I/O */
-+#define       REG_MAP(pa, size)       ((void*)KSEG1ADDR((ulong)(pa)))
-+#define       REG_UNMAP(va)           do {} while (0)
++/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */
++#define BOARD_GPIO_HWRAD_B    0x010   /* bit 4 is HWRAD input on 4301 */
++#define       BOARD_GPIO_BTCMOD_IN    0x010   /* bit 4 is the alternate BT Coexistance Input */
++#define       BOARD_GPIO_BTCMOD_OUT   0x020   /* bit 5 is the alternate BT Coexistance Out */
++#define       BOARD_GPIO_BTC_IN       0x080   /* bit 7 is BT Coexistance Input */
++#define       BOARD_GPIO_BTC_OUT      0x100   /* bit 8 is BT Coexistance Out */
++#define       BOARD_GPIO_PACTRL       0x200   /* bit 9 controls the PA on new 4306 boards */
++#define       PCI_CFG_GPIO_SCS        0x10    /* PCI config space bit 4 for 4306c0 slow clock source */
++#define PCI_CFG_GPIO_HWRAD    0x20    /* PCI config space GPIO 13 for hw radio disable */
++#define PCI_CFG_GPIO_XTAL     0x40    /* PCI config space GPIO 14 for Xtal powerup */
++#define PCI_CFG_GPIO_PLL      0x80    /* PCI config space GPIO 15 for PLL powerdown */
 +
-+/* dereference an address that may cause a bus exception */
-+#define       BUSPROBE(val, addr)     (uint32 *)(addr) = (val)
++/* Bus types */
++#define       SB_BUS                  0       /* Silicon Backplane */
++#define       PCI_BUS                 1       /* PCI target */
++#define       PCMCIA_BUS              2       /* PCMCIA target */
++#define SDIO_BUS              3       /* SDIO target */
++#define JTAG_BUS              4       /* JTAG */
 +
-+/* Misc stubs */
-+#define osl_attach(pdev)      ((osl_t*)pdev)
-+#define osl_detach(osh)
-+extern void *osl_init(void);
-+#define OSL_ERROR(bcmerror)   osl_error(bcmerror)
-+extern int osl_error(int);
++/* Allows optimization for single-bus support */
++#ifdef BCMBUSTYPE
++#define BUSTYPE(bus) (BCMBUSTYPE)
++#else
++#define BUSTYPE(bus) (bus)
++#endif
 +
-+#endif        /* _min_osl_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/mipsinc.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/mipsinc.h
---- linux-2.4.32/arch/mips/bcm947xx/include/mipsinc.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/mipsinc.h     2005-12-16 23:39:10.748824500 +0100
-@@ -0,0 +1,552 @@
-+/*
-+ * HND Run Time Environment for standalone MIPS programs.
-+ *
-+ * Copyright 2005, 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$
-+ */
++/* power control defines */
++#define PLL_DELAY             150             /* us pll on delay */
++#define FREF_DELAY            200             /* us fref change delay */
++#define MIN_SLOW_CLK          32              /* us Slow clock period */
++#define       XTAL_ON_DELAY           1000            /* us crystal power-on delay */
 +
-+#ifndef       _MISPINC_H
-+#define _MISPINC_H
++/* Reference Board Types */
 +
++#define       BU4710_BOARD            0x0400
++#define       VSIM4710_BOARD          0x0401
++#define       QT4710_BOARD            0x0402
 +
-+/* MIPS defines */
++#define       BU4610_BOARD            0x0403
++#define       VSIM4610_BOARD          0x0404
 +
-+#ifdef        _LANGUAGE_ASSEMBLY
++#define       BU4307_BOARD            0x0405
++#define       BCM94301CB_BOARD        0x0406
++#define       BCM94301PC_BOARD        0x0406          /* Pcmcia 5v card */
++#define       BCM94301MP_BOARD        0x0407
++#define       BCM94307MP_BOARD        0x0408
++#define       BCMAP4307_BOARD         0x0409
 +
-+/*
-+ * Symbolic register names for 32 bit ABI
-+ */
-+#define zero  $0      /* wired zero */
-+#define AT    $1      /* assembler temp - uppercase because of ".set at" */
-+#define v0    $2      /* return value */
-+#define v1    $3
-+#define a0    $4      /* argument registers */
-+#define a1    $5
-+#define a2    $6
-+#define a3    $7
-+#define t0    $8      /* caller saved */
-+#define t1    $9
-+#define t2    $10
-+#define t3    $11
-+#define t4    $12
-+#define t5    $13
-+#define t6    $14
-+#define t7    $15
-+#define s0    $16     /* callee saved */
-+#define s1    $17
-+#define s2    $18
-+#define s3    $19
-+#define s4    $20
-+#define s5    $21
-+#define s6    $22
-+#define s7    $23
-+#define t8    $24     /* caller saved */
-+#define t9    $25
-+#define jp    $25     /* PIC jump register */
-+#define k0    $26     /* kernel scratch */
-+#define k1    $27
-+#define gp    $28     /* global pointer */
-+#define sp    $29     /* stack pointer */
-+#define fp    $30     /* frame pointer */
-+#define s8    $30     /* same like fp! */
-+#define ra    $31     /* return address */
++#define       BU4309_BOARD            0x040a
++#define       BCM94309CB_BOARD        0x040b
++#define       BCM94309MP_BOARD        0x040c
++#define       BCM4309AP_BOARD         0x040d
 +
++#define       BCM94302MP_BOARD        0x040e
 +
-+/*
-+ * CP0 Registers 
-+ */
++#define       VSIM4310_BOARD          0x040f
++#define       BU4711_BOARD            0x0410
++#define       BCM94310U_BOARD         0x0411
++#define       BCM94310AP_BOARD        0x0412
++#define       BCM94310MP_BOARD        0x0414
 +
-+#define C0_INX                $0
-+#define C0_RAND               $1
-+#define C0_TLBLO0     $2
-+#define C0_TLBLO      C0_TLBLO0
-+#define C0_TLBLO1     $3
-+#define C0_CTEXT      $4
-+#define C0_PGMASK     $5
-+#define C0_WIRED      $6
-+#define C0_BADVADDR   $8
-+#define C0_COUNT      $9
-+#define C0_TLBHI      $10
-+#define C0_COMPARE    $11
-+#define C0_SR         $12
-+#define C0_STATUS     C0_SR
-+#define C0_CAUSE      $13
-+#define C0_EPC                $14
-+#define C0_PRID               $15
-+#define C0_CONFIG     $16
-+#define C0_LLADDR     $17
-+#define C0_WATCHLO    $18
-+#define C0_WATCHHI    $19
-+#define C0_XCTEXT     $20
-+#define C0_DIAGNOSTIC $22
-+#define C0_BROADCOM   C0_DIAGNOSTIC
-+#define       C0_PERFORMANCE  $25
-+#define C0_ECC                $26
-+#define C0_CACHEERR   $27
-+#define C0_TAGLO      $28
-+#define C0_TAGHI      $29
-+#define C0_ERREPC     $30
-+#define C0_DESAVE     $31
++#define       BU4306_BOARD            0x0416
++#define       BCM94306CB_BOARD        0x0417
++#define       BCM94306MP_BOARD        0x0418
 +
-+/*
-+ * LEAF - declare leaf routine
-+ */
-+#define LEAF(symbol)                          \
-+              .globl  symbol;                 \
-+              .align  2;                      \
-+              .type   symbol,@function;       \
-+              .ent    symbol,0;               \
-+symbol:               .frame  sp,0,ra
++#define       BCM94710D_BOARD         0x041a
++#define       BCM94710R1_BOARD        0x041b
++#define       BCM94710R4_BOARD        0x041c
++#define       BCM94710AP_BOARD        0x041d
 +
-+/*
-+ * END - mark end of function
-+ */
-+#define END(function)                         \
-+              .end    function;               \
-+              .size   function,.-function
 +
-+#define _ULCAST_
++#define       BU2050_BOARD            0x041f
 +
-+#else
 +
-+/*
-+ * The following macros are especially useful for __asm__
-+ * inline assembler.
-+ */
-+#ifndef __STR
-+#define __STR(x) #x
-+#endif
-+#ifndef STR
-+#define STR(x) __STR(x)
-+#endif
++#define       BCM94309G_BOARD         0x0421
 +
-+#define _ULCAST_ (unsigned long)
++#define       BCM94301PC3_BOARD       0x0422          /* Pcmcia 3.3v card */
 +
++#define       BU4704_BOARD            0x0423
++#define       BU4702_BOARD            0x0424
 +
-+/*
-+ * CP0 Registers 
-+ */
++#define       BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
 +
-+#define C0_INX                0               /* CP0: TLB Index */
-+#define C0_RAND               1               /* CP0: TLB Random */
-+#define C0_TLBLO0     2               /* CP0: TLB EntryLo0 */
-+#define C0_TLBLO      C0_TLBLO0       /* CP0: TLB EntryLo0 */
-+#define C0_TLBLO1     3               /* CP0: TLB EntryLo1 */
-+#define C0_CTEXT      4               /* CP0: Context */
-+#define C0_PGMASK     5               /* CP0: TLB PageMask */
-+#define C0_WIRED      6               /* CP0: TLB Wired */
-+#define C0_BADVADDR   8               /* CP0: Bad Virtual Address */
-+#define C0_COUNT      9               /* CP0: Count */
-+#define C0_TLBHI      10              /* CP0: TLB EntryHi */
-+#define C0_COMPARE    11              /* CP0: Compare */
-+#define C0_SR         12              /* CP0: Processor Status */
-+#define C0_STATUS     C0_SR           /* CP0: Processor Status */
-+#define C0_CAUSE      13              /* CP0: Exception Cause */
-+#define C0_EPC                14              /* CP0: Exception PC */
-+#define C0_PRID               15              /* CP0: Processor Revision Indentifier */
-+#define C0_CONFIG     16              /* CP0: Config */
-+#define C0_LLADDR     17              /* CP0: LLAddr */
-+#define C0_WATCHLO    18              /* CP0: WatchpointLo */
-+#define C0_WATCHHI    19              /* CP0: WatchpointHi */
-+#define C0_XCTEXT     20              /* CP0: XContext */
-+#define C0_DIAGNOSTIC 22              /* CP0: Diagnostic */
-+#define C0_BROADCOM   C0_DIAGNOSTIC   /* CP0: Broadcom Register */
-+#define       C0_PERFORMANCE  25              /* CP0: Performance Counter/Control Registers */
-+#define C0_ECC                26              /* CP0: ECC */
-+#define C0_CACHEERR   27              /* CP0: CacheErr */
-+#define C0_TAGLO      28              /* CP0: TagLo */
-+#define C0_TAGHI      29              /* CP0: TagHi */
-+#define C0_ERREPC     30              /* CP0: ErrorEPC */
-+#define C0_DESAVE     31              /* CP0: DebugSave */
++#define       BU4317_BOARD            0x0426
 +
-+#endif        /* _LANGUAGE_ASSEMBLY */
 +
-+/*
-+ * Memory segments (32bit kernel mode addresses)
-+ */
-+#undef KUSEG
-+#undef KSEG0
-+#undef KSEG1
-+#undef KSEG2
-+#undef KSEG3
-+#define KUSEG         0x00000000
-+#define KSEG0         0x80000000
-+#define KSEG1         0xa0000000
-+#define KSEG2         0xc0000000
-+#define KSEG3         0xe0000000
-+#define PHYSADDR_MASK 0x1fffffff
++#define       BCM94702MN_BOARD        0x0428
 +
-+/*
-+ * Map an address to a certain kernel segment
-+ */
-+#undef PHYSADDR
-+#undef KSEG0ADDR
-+#undef KSEG1ADDR
-+#undef KSEG2ADDR
-+#undef KSEG3ADDR
++/* BCM4702 1U CompactPCI Board */
++#define       BCM94702CPCI_BOARD      0x0429
 +
-+#define PHYSADDR(a)   (_ULCAST_(a) & PHYSADDR_MASK)
-+#define KSEG0ADDR(a)  ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG0)
-+#define KSEG1ADDR(a)  ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG1)
-+#define KSEG2ADDR(a)  ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG2)
-+#define KSEG3ADDR(a)  ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG3)
++/* BCM4702 with BCM95380 VLAN Router */
++#define       BCM95380RR_BOARD        0x042a
 +
++/* cb4306 with SiGe PA */
++#define       BCM94306CBSG_BOARD      0x042b
 +
-+#ifndef       Index_Invalidate_I
-+/*
-+ * Cache Operations
-+ */
-+#define Index_Invalidate_I    0x00
-+#define Index_Writeback_Inv_D 0x01
-+#define Index_Invalidate_SI   0x02
-+#define Index_Writeback_Inv_SD        0x03
-+#define Index_Load_Tag_I      0x04
-+#define Index_Load_Tag_D      0x05
-+#define Index_Load_Tag_SI     0x06
-+#define Index_Load_Tag_SD     0x07
-+#define Index_Store_Tag_I     0x08
-+#define Index_Store_Tag_D     0x09
-+#define Index_Store_Tag_SI    0x0A
-+#define Index_Store_Tag_SD    0x0B
-+#define Create_Dirty_Excl_D   0x0d
-+#define Create_Dirty_Excl_SD  0x0f
-+#define Hit_Invalidate_I      0x10
-+#define Hit_Invalidate_D      0x11
-+#define Hit_Invalidate_SI     0x12
-+#define Hit_Invalidate_SD     0x13
-+#define Fill_I                        0x14
-+#define Hit_Writeback_Inv_D   0x15
-+                                      /* 0x16 is unused */
-+#define Hit_Writeback_Inv_SD  0x17
-+#define R5K_Page_Invalidate_S 0x17
-+#define Hit_Writeback_I               0x18
-+#define Hit_Writeback_D               0x19
-+                                      /* 0x1a is unused */
-+#define Hit_Writeback_SD      0x1b
-+                                      /* 0x1c is unused */
-+                                      /* 0x1e is unused */
-+#define Hit_Set_Virtual_SI    0x1e
-+#define Hit_Set_Virtual_SD    0x1f
-+#endif
++/* mp4301 with 2050 radio */
++#define       BCM94301MPL_BOARD       0x042c
 +
++/* cb4306 with SiGe PA */
++#define       PCSG94306_BOARD         0x042d
 +
-+/*
-+ * R4x00 interrupt enable / cause bits
-+ */
-+#define IE_SW0                        (_ULCAST_(1) <<  8)
-+#define IE_SW1                        (_ULCAST_(1) <<  9)
-+#define IE_IRQ0                       (_ULCAST_(1) << 10)
-+#define IE_IRQ1                       (_ULCAST_(1) << 11)
-+#define IE_IRQ2                       (_ULCAST_(1) << 12)
-+#define IE_IRQ3                       (_ULCAST_(1) << 13)
-+#define IE_IRQ4                       (_ULCAST_(1) << 14)
-+#define IE_IRQ5                       (_ULCAST_(1) << 15)
++/* bu4704 with sdram */
++#define       BU4704SD_BOARD          0x042e
 +
-+#ifndef       ST0_UM
-+/*
-+ * Bitfields in the mips32 cp0 status register
-+ */
-+#define ST0_IE                        0x00000001
-+#define ST0_EXL                       0x00000002
-+#define ST0_ERL                       0x00000004
-+#define ST0_UM                        0x00000010
-+#define ST0_SWINT0            0x00000100
-+#define ST0_SWINT1            0x00000200
-+#define ST0_HWINT0            0x00000400
-+#define ST0_HWINT1            0x00000800
-+#define ST0_HWINT2            0x00001000
-+#define ST0_HWINT3            0x00002000
-+#define ST0_HWINT4            0x00004000
-+#define ST0_HWINT5            0x00008000
-+#define ST0_IM                        0x0000ff00
-+#define ST0_NMI                       0x00080000
-+#define ST0_SR                        0x00100000
-+#define ST0_TS                        0x00200000
-+#define ST0_BEV                       0x00400000
-+#define ST0_RE                        0x02000000
-+#define ST0_RP                        0x08000000
-+#define ST0_CU                        0xf0000000
-+#define ST0_CU0                       0x10000000
-+#define ST0_CU1                       0x20000000
-+#define ST0_CU2                       0x40000000
-+#define ST0_CU3                       0x80000000
-+#endif
++/* Dual 11a/11g Router */
++#define       BCM94704AGR_BOARD       0x042f
 +
++/* 11a-only minipci */
++#define       BCM94308MP_BOARD        0x0430
 +
-+/*
-+ * Bitfields in the mips32 cp0 cause register
-+ */
-+#define C_EXC                 0x0000007c
-+#define C_EXC_SHIFT           2
-+#define C_INT                 0x0000ff00
-+#define C_INT_SHIFT           8
-+#define C_SW0                 (_ULCAST_(1) <<  8)
-+#define C_SW1                 (_ULCAST_(1) <<  9)
-+#define C_IRQ0                        (_ULCAST_(1) << 10)
-+#define C_IRQ1                        (_ULCAST_(1) << 11)
-+#define C_IRQ2                        (_ULCAST_(1) << 12)
-+#define C_IRQ3                        (_ULCAST_(1) << 13)
-+#define C_IRQ4                        (_ULCAST_(1) << 14)
-+#define C_IRQ5                        (_ULCAST_(1) << 15)
-+#define C_WP                  0x00400000
-+#define C_IV                  0x00800000
-+#define C_CE                  0x30000000
-+#define C_CE_SHIFT            28
-+#define C_BD                  0x80000000
 +
-+/* Values in C_EXC */
-+#define EXC_INT                       0
-+#define EXC_TLBM              1
-+#define EXC_TLBL              2
-+#define EXC_TLBS              3
-+#define EXC_AEL                       4
-+#define EXC_AES                       5
-+#define EXC_IBE                       6
-+#define EXC_DBE                       7
-+#define EXC_SYS                       8
-+#define EXC_BPT                       9
-+#define EXC_RI                        10
-+#define EXC_CU                        11
-+#define EXC_OV                        12
-+#define EXC_TR                        13
-+#define EXC_WATCH             23
-+#define EXC_MCHK              24
 +
++/* BCM94317 boards */
++#define BCM94317CB_BOARD      0x0440
++#define BCM94317MP_BOARD      0x0441
++#define BCM94317PCMCIA_BOARD  0x0442
++#define BCM94317SDIO_BOARD    0x0443
 +
-+/*
-+ * Bits in the cp0 config register.
-+ */
-+#define CONF_CM_CACHABLE_NO_WA                0
-+#define CONF_CM_CACHABLE_WA           1
-+#define CONF_CM_UNCACHED              2
-+#define CONF_CM_CACHABLE_NONCOHERENT  3
-+#define CONF_CM_CACHABLE_CE           4
-+#define CONF_CM_CACHABLE_COW          5
-+#define CONF_CM_CACHABLE_CUW          6
-+#define CONF_CM_CACHABLE_ACCELERATED  7
-+#define CONF_CM_CMASK                 7
-+#define CONF_CU                               (_ULCAST_(1) <<  3)
-+#define CONF_DB                               (_ULCAST_(1) <<  4)
-+#define CONF_IB                               (_ULCAST_(1) <<  5)
-+#define CONF_SE                               (_ULCAST_(1) << 12)
-+#define CONF_SC                               (_ULCAST_(1) << 17)
-+#define CONF_AC                               (_ULCAST_(1) << 23)
-+#define CONF_HALT                     (_ULCAST_(1) << 25)
++#define BU4712_BOARD          0x0444
++#define       BU4712SD_BOARD          0x045d
++#define       BU4712L_BOARD           0x045f
 +
++/* BCM4712 boards */
++#define BCM94712AP_BOARD      0x0445
++#define BCM94712P_BOARD               0x0446
 +
-+/*
-+ * Bits in the cp0 config register select 1.
-+ */
-+#define CONF1_FP              0x00000001      /* FPU present */
-+#define CONF1_EP              0x00000002      /* EJTAG present */
-+#define CONF1_CA              0x00000004      /* mips16 implemented */
-+#define CONF1_WR              0x00000008      /* Watch registers present */
-+#define CONF1_PC              0x00000010      /* Performance counters present */
-+#define CONF1_DA_SHIFT                7               /* D$ associativity */
-+#define CONF1_DA_MASK         0x00000380
-+#define CONF1_DA_BASE         1
-+#define CONF1_DL_SHIFT                10              /* D$ line size */
-+#define CONF1_DL_MASK         0x00001c00
-+#define CONF1_DL_BASE         2
-+#define CONF1_DS_SHIFT                13              /* D$ sets/way */
-+#define CONF1_DS_MASK         0x0000e000
-+#define CONF1_DS_BASE         64
-+#define CONF1_IA_SHIFT                16              /* I$ associativity */
-+#define CONF1_IA_MASK         0x00070000
-+#define CONF1_IA_BASE         1
-+#define CONF1_IL_SHIFT                19              /* I$ line size */
-+#define CONF1_IL_MASK         0x00380000
-+#define CONF1_IL_BASE         2
-+#define CONF1_IS_SHIFT                22              /* Instruction cache sets/way */
-+#define CONF1_IS_MASK         0x01c00000
-+#define CONF1_IS_BASE         64
-+#define CONF1_MS_MASK         0x7e000000      /* Number of tlb entries */
-+#define CONF1_MS_SHIFT                25
++/* BCM4318 boards */
++#define BU4318_BOARD          0x0447
++#define CB4318_BOARD          0x0448
++#define MPG4318_BOARD         0x0449
++#define MP4318_BOARD          0x044a
++#define SD4318_BOARD          0x044b
 +
-+/* PRID register */
-+#define PRID_COPT_MASK                0xff000000
-+#define PRID_COMP_MASK                0x00ff0000
-+#define PRID_IMP_MASK         0x0000ff00
-+#define PRID_REV_MASK         0x000000ff
++/* BCM63XX boards */
++#define BCM96338_BOARD                0x6338
++#define BCM96345_BOARD                0x6345
++#define BCM96348_BOARD                0x6348
 +
-+#define PRID_COMP_LEGACY      0x000000
-+#define PRID_COMP_MIPS                0x010000
-+#define PRID_COMP_BROADCOM    0x020000
-+#define PRID_COMP_ALCHEMY     0x030000
-+#define PRID_COMP_SIBYTE      0x040000
-+#define PRID_IMP_BCM4710      0x4000
-+#define PRID_IMP_BCM3302      0x9000
-+#define PRID_IMP_BCM3303      0x9100
++/* Another mp4306 with SiGe */
++#define       BCM94306P_BOARD         0x044c
 +
-+#define PRID_IMP_UNKNOWN      0xff00
++/* CF-like 4317 modules */
++#define       BCM94317CF_BOARD        0x044d
 +
-+#define BCM330X(id) \
-+      (((id & (PRID_COMP_MASK | PRID_IMP_MASK)) == (PRID_COMP_BROADCOM | PRID_IMP_BCM3302)) \
-+      || ((id & (PRID_COMP_MASK | PRID_IMP_MASK)) == (PRID_COMP_BROADCOM | PRID_IMP_BCM3303)))
++/* mp4303 */
++#define       BCM94303MP_BOARD        0x044e
 +
-+/* Bits in C0_BROADCOM */
-+#define BRCM_PFC_AVAIL                0x20000000      /* PFC is available */
-+#define BRCM_DC_ENABLE                0x40000000      /* Enable Data $ */
-+#define BRCM_IC_ENABLE                0x80000000      /* Enable Instruction $ */
-+#define BRCM_PFC_ENABLE               0x00400000      /* Obsolete? Enable PFC (at least on 4310) */
++/* mpsgh4306 */
++#define       BCM94306MPSGH_BOARD     0x044f
 +
-+/* PreFetch Cache aka Read Ahead Cache */
++/* BRCM 4306 w/ Front End Modules */
++#define BCM94306MPM           0x0450
++#define BCM94306MPL           0x0453
 +
-+#define PFC_CR0                       0xff400000      /* control reg 0 */
-+#define PFC_CR1                       0xff400004      /* control reg 1 */
++/* 4712agr */
++#define       BCM94712AGR_BOARD       0x0451
 +
-+/* PFC operations */
-+#define PFC_I                 0x00000001      /* Enable PFC use for instructions */
-+#define PFC_D                 0x00000002      /* Enable PFC use for data */
-+#define PFC_PFI                       0x00000004      /* Enable seq. prefetch for instructions */
-+#define PFC_PFD                       0x00000008      /* Enable seq. prefetch for data */
-+#define PFC_CINV              0x00000010      /* Enable selective (i/d) cacheop flushing */
-+#define PFC_NCH                       0x00000020      /* Disable flushing based on cacheops */
-+#define PFC_DPF                       0x00000040      /* Enable directional prefetching */
-+#define PFC_FLUSH             0x00000100      /* Flush the PFC */
-+#define PFC_BRR                       0x40000000      /* Bus error indication */
-+#define PFC_PWR                       0x80000000      /* Disable power saving (clock gating) */
++/* The real CF 4317 board */
++#define       CFI4317_BOARD           0x0452
 +
-+/* Handy defaults */
-+#define PFC_DISABLED          0
-+#define PFC_AUTO                      0xffffffff      /* auto select the default mode */
-+#define PFC_INST              (PFC_I | PFC_PFI | PFC_CINV)
-+#define PFC_INST_NOPF         (PFC_I | PFC_CINV)
-+#define PFC_DATA              (PFC_D | PFC_PFD | PFC_CINV)
-+#define PFC_DATA_NOPF         (PFC_D | PFC_CINV)
-+#define PFC_I_AND_D           (PFC_INST | PFC_DATA)
-+#define PFC_I_AND_D_NOPF      (PFC_INST_NOPF | PFC_DATA_NOPF)
++/* pcmcia 4303 */
++#define       PC4303_BOARD            0x0454
 +
++/* 5350K */
++#define       BCM95350K_BOARD         0x0455
 +
-+/* 
-+ * These are the UART port assignments, expressed as offsets from the base
-+ * register.  These assignments should hold for any serial port based on
-+ * a 8250, 16450, or 16550(A).
-+ */
++/* 5350R */
++#define       BCM95350R_BOARD         0x0456
 +
-+#define UART_RX               0       /* In:  Receive buffer (DLAB=0) */
-+#define UART_TX               0       /* Out: Transmit buffer (DLAB=0) */
-+#define UART_DLL      0       /* Out: Divisor Latch Low (DLAB=1) */
-+#define UART_DLM      1       /* Out: Divisor Latch High (DLAB=1) */
-+#define UART_LCR      3       /* Out: Line Control Register */
-+#define UART_MCR      4       /* Out: Modem Control Register */
-+#define UART_LSR      5       /* In:  Line Status Register */
-+#define UART_MSR      6       /* In:  Modem Status Register */
-+#define UART_SCR      7       /* I/O: Scratch Register */
-+#define UART_LCR_DLAB 0x80    /* Divisor latch access bit */
-+#define UART_LCR_WLEN8        0x03    /* Wordlength: 8 bits */
-+#define UART_MCR_LOOP 0x10    /* Enable loopback test mode */
-+#define UART_LSR_THRE 0x20    /* Transmit-hold-register empty */
-+#define UART_LSR_RXRDY        0x01    /* Receiver ready */
++/* 4306mplna */
++#define       BCM94306MPLNA_BOARD     0x0457
 +
++/* 4320 boards */
++#define       BU4320_BOARD            0x0458
++#define       BU4320S_BOARD           0x0459
++#define       BCM94320PH_BOARD        0x045a
 +
-+#ifndef       _LANGUAGE_ASSEMBLY
++/* 4306mph */
++#define       BCM94306MPH_BOARD       0x045b
 +
-+/*
-+ * Macros to access the system control coprocessor
-+ */
++/* 4306pciv */
++#define       BCM94306PCIV_BOARD      0x045c
 +
-+#define MFC0(source, sel)                                     \
-+({                                                            \
-+      int __res;                                              \
-+      __asm__ __volatile__(                                   \
-+      ".set\tnoreorder\n\t"                                   \
-+      ".set\tnoat\n\t"                                        \
-+      ".word\t"STR(0x40010000 | ((source)<<11) | (sel))"\n\t" \
-+      "move\t%0,$1\n\t"                                       \
-+      ".set\tat\n\t"                                          \
-+      ".set\treorder"                                         \
-+      :"=r" (__res)                                           \
-+      :                                                       \
-+      :"$1");                                                 \
-+      __res;                                                  \
-+})
++#define       BU4712SD_BOARD          0x045d
 +
-+#define MTC0(source, sel, value)                              \
-+do {                                                          \
-+      __asm__ __volatile__(                                   \
-+      ".set\tnoreorder\n\t"                                   \
-+      ".set\tnoat\n\t"                                        \
-+      "move\t$1,%z0\n\t"                                      \
-+      ".word\t"STR(0x40810000 | ((source)<<11) | (sel))"\n\t" \
-+      ".set\tat\n\t"                                          \
-+      ".set\treorder"                                         \
-+      :                                                       \
-+      :"jr" (value)                                           \
-+      :"$1");                                                 \
-+} while (0)
++#define       BCM94320PFLSH_BOARD     0x045e
 +
-+#define get_c0_count()                                                \
-+({                                                            \
-+      int __res;                                              \
-+      __asm__ __volatile__(                                   \
-+      ".set\tnoreorder\n\t"                                   \
-+      ".set\tnoat\n\t"                                        \
-+      "mfc0\t%0,$9\n\t"                                       \
-+      ".set\tat\n\t"                                          \
-+      ".set\treorder"                                         \
-+      :"=r" (__res));                                         \
-+      __res;                                                  \
-+})
++#define       BU4712L_BOARD           0x045f
++#define       BCM94712LGR_BOARD       0x0460
++#define       BCM94320R_BOARD         0x0461
 +
-+static INLINE void icache_probe(uint32 config1, uint *size, uint *lsize)
-+{
-+      uint lsz, sets, ways;
++#define       BU5352_BOARD            0x0462
 +
-+      /* Instruction Cache Size = Associativity * Line Size * Sets Per Way */
-+      if ((lsz = ((config1 & CONF1_IL_MASK) >> CONF1_IL_SHIFT)))
-+              lsz = CONF1_IL_BASE << lsz;
-+      sets = CONF1_IS_BASE << ((config1 & CONF1_IS_MASK) >> CONF1_IS_SHIFT);
-+      ways = CONF1_IA_BASE + ((config1 & CONF1_IA_MASK) >> CONF1_IA_SHIFT);
-+      *size = lsz * sets * ways;
-+      *lsize = lsz;
-+}
++#define       BCM94318MPGH_BOARD      0x0463
 +
-+static INLINE void dcache_probe(uint32 config1, uint *size, uint *lsize)
-+{
-+      uint lsz, sets, ways;
 +
-+      /* Data Cache Size = Associativity * Line Size * Sets Per Way */
-+      if ((lsz = ((config1 & CONF1_DL_MASK) >> CONF1_DL_SHIFT)))
-+              lsz = CONF1_DL_BASE << lsz;
-+      sets = CONF1_DS_BASE << ((config1 & CONF1_DS_MASK) >> CONF1_DS_SHIFT);
-+      ways = CONF1_DA_BASE + ((config1 & CONF1_DA_MASK) >> CONF1_DA_SHIFT);
-+      *size = lsz * sets * ways;
-+      *lsize = lsz;
-+}
++#define       BCM95352GR_BOARD        0x0467
 +
-+#define cache_op(base, op)                    \
-+      __asm__ __volatile__("                  \
-+              .set noreorder;                 \
-+              .set mips3;                     \
-+              cache %1, (%0);                 \
-+              .set mips0;                     \
-+              .set reorder"                   \
-+              :                               \
-+              : "r" (base),                   \
-+                "i" (op));
++/* bcm95351agr */
++#define       BCM95351AGR_BOARD       0x0470
 +
-+#define cache_unroll4(base, delta, op)                \
-+      __asm__ __volatile__("                  \
-+              .set noreorder;                 \
-+              .set mips3;                     \
-+              cache %1,0(%0);                 \
-+              cache %1,delta(%0);             \
-+              cache %1,(2 * delta)(%0);       \
-+              cache %1,(3 * delta)(%0);       \
-+              .set mips0;                     \
-+              .set reorder"                   \
-+              :                               \
-+              : "r" (base),                   \
-+                "i" (op));
-+
-+#endif /* !_LANGUAGE_ASSEMBLY */
++/* # of GPIO pins */
++#define GPIO_NUMPINS          16
 +
-+#endif        /* _MISPINC_H */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/nvports.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/nvports.h
---- linux-2.4.32/arch/mips/bcm947xx/include/nvports.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/nvports.h     2005-12-16 23:39:10.748824500 +0100
-@@ -0,0 +1,55 @@
++#endif /* _BCMDEVS_H */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmendian.h linux.dev/arch/mips/bcm947xx/include/bcmendian.h
+--- linux.old/arch/mips/bcm947xx/include/bcmendian.h   1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmendian.h   2006-04-27 20:08:35.000000000 +0200
+@@ -0,0 +1,198 @@
 +/*
-+ * BCM53xx RoboSwitch utility functions
++ * local version of endian.h - byte order defines
 + *
-+ * Copyright (C) 2002 Broadcom Corporation
-+ * $Id$
-+ */
++ * Copyright 2006, 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: bcmendian.h,v 1.1.1.10 2006/02/27 03:43:16 honor Exp $
++*/
++
++#ifndef _BCMENDIAN_H_
++#define _BCMENDIAN_H_
++
++#include <typedefs.h>
++
++/* Byte swap a 16 bit value */
++#define BCMSWAP16(val) \
++      ((uint16)(\
++              (((uint16)(val) & (uint16)0x00ffU) << 8) | \
++              (((uint16)(val) & (uint16)0xff00U) >> 8)))
++
++/* Byte swap a 32 bit value */
++#define BCMSWAP32(val) \
++      ((uint32)(\
++              (((uint32)(val) & (uint32)0x000000ffUL) << 24) | \
++              (((uint32)(val) & (uint32)0x0000ff00UL) <<  8) | \
++              (((uint32)(val) & (uint32)0x00ff0000UL) >>  8) | \
++              (((uint32)(val) & (uint32)0xff000000UL) >> 24)))
++
++/* 2 Byte swap a 32 bit value */
++#define BCMSWAP32BY16(val) \
++      ((uint32)(\
++              (((uint32)(val) & (uint32)0x0000ffffUL) << 16) | \
++              (((uint32)(val) & (uint32)0xffff0000UL) >> 16)))
 +
-+#ifndef _nvports_h_
-+#define _nvports_h_
-+
-+#define uint32 unsigned long
-+#define uint16 unsigned short
-+#define uint unsigned int
-+#define uint8 unsigned char
-+#define uint64 unsigned long long
-+
-+enum FORCE_PORT {
-+      FORCE_OFF,
-+      FORCE_10H,
-+      FORCE_10F,
-+      FORCE_100H,
-+      FORCE_100F,
-+      FORCE_DOWN,
-+      POWER_OFF
-+};
 +
-+typedef struct _PORT_ATTRIBS
++static INLINE uint16
++bcmswap16(uint16 val)
 +{
-+      uint    autoneg;
-+      uint    force;
-+      uint    native; 
-+} PORT_ATTRIBS;
++      return BCMSWAP16(val);
++}
 +
-+extern uint
-+nvExistsPortAttrib(char *attrib, uint portno);
++static INLINE uint32
++bcmswap32(uint32 val)
++{
++      return BCMSWAP32(val);
++}
 +
-+extern int
-+nvExistsAnyForcePortAttrib(uint portno);
++static INLINE uint32
++bcmswap32by16(uint32 val)
++{
++      return BCMSWAP32BY16(val);
++}
 +
-+extern void
-+nvSetPortAttrib(char *attrib, uint portno);
++/* buf        - start of buffer of shorts to swap */
++/* len  - byte length of buffer */
++static INLINE void
++bcmswap16_buf(uint16 *buf, uint len)
++{
++      len = len/2;
 +
-+extern void
-+nvUnsetPortAttrib(char *attrib, uint portno);
++      while (len--) {
++              *buf = bcmswap16(*buf);
++              buf++;
++      }
++}
 +
-+extern void
-+nvUnsetAllForcePortAttrib(uint portno);
++#ifndef hton16
++#ifndef IL_BIGENDIAN
++#define HTON16(i) BCMSWAP16(i)
++#define       hton16(i) bcmswap16(i)
++#define       hton32(i) bcmswap32(i)
++#define       ntoh16(i) bcmswap16(i)
++#define       ntoh32(i) bcmswap32(i)
++#define ltoh16(i) (i)
++#define ltoh32(i) (i)
++#define htol16(i) (i)
++#define htol32(i) (i)
++#else
++#define HTON16(i) (i)
++#define       hton16(i) (i)
++#define       hton32(i) (i)
++#define       ntoh16(i) (i)
++#define       ntoh32(i) (i)
++#define       ltoh16(i) bcmswap16(i)
++#define       ltoh32(i) bcmswap32(i)
++#define htol16(i) bcmswap16(i)
++#define htol32(i) bcmswap32(i)
++#endif /* IL_BIGENDIAN */
++#endif /* hton16 */
 +
-+extern PORT_ATTRIBS
-+nvGetSwitchPortAttribs(uint portno);
++#ifndef IL_BIGENDIAN
++#define ltoh16_buf(buf, i)
++#define htol16_buf(buf, i)
++#else
++#define ltoh16_buf(buf, i) bcmswap16_buf((uint16*)buf, i)
++#define htol16_buf(buf, i) bcmswap16_buf((uint16*)buf, i)
++#endif /* IL_BIGENDIAN */
 +
-+#endif /* _nvports_h_ */
++/*
++* store 16-bit value to unaligned little endian byte array.
++*/
++static INLINE void
++htol16_ua_store(uint16 val, uint8 *bytes)
++{
++      bytes[0] = val&0xff;
++      bytes[1] = val>>8;
++}
 +
++/*
++* store 32-bit value to unaligned little endian byte array.
++*/
++static INLINE void
++htol32_ua_store(uint32 val, uint8 *bytes)
++{
++      bytes[0] = val&0xff;
++      bytes[1] = (val>>8)&0xff;
++      bytes[2] = (val>>16)&0xff;
++      bytes[3] = val>>24;
++}
 +
++/*
++* store 16-bit value to unaligned network(big) endian byte array.
++*/
++static INLINE void
++hton16_ua_store(uint16 val, uint8 *bytes)
++{
++      bytes[1] = val&0xff;
++      bytes[0] = val>>8;
++}
 +
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/osl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/osl.h
---- linux-2.4.32/arch/mips/bcm947xx/include/osl.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/osl.h 2005-12-16 23:39:10.748824500 +0100
-@@ -0,0 +1,42 @@
 +/*
-+ * OS Abstraction Layer
-+ * 
-+ * Copyright 2005, 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$
-+ */
++* store 32-bit value to unaligned network(big) endian byte array.
++*/
++static INLINE void
++hton32_ua_store(uint32 val, uint8 *bytes)
++{
++      bytes[3] = val&0xff;
++      bytes[2] = (val>>8)&0xff;
++      bytes[1] = (val>>16)&0xff;
++      bytes[0] = val>>24;
++}
 +
-+#ifndef _osl_h_
-+#define _osl_h_
++/*
++* load 16-bit value from unaligned little endian byte array.
++*/
++static INLINE uint16
++ltoh16_ua(void *bytes)
++{
++      return (((uint8*)bytes)[1]<<8)+((uint8 *)bytes)[0];
++}
 +
-+/* osl handle type forward declaration */
-+typedef struct os_handle osl_t;
++/*
++* load 32-bit value from unaligned little endian byte array.
++*/
++static INLINE uint32
++ltoh32_ua(void *bytes)
++{
++      return (((uint8*)bytes)[3]<<24)+(((uint8*)bytes)[2]<<16)+
++             (((uint8*)bytes)[1]<<8)+((uint8*)bytes)[0];
++}
 +
-+#if defined(linux)
-+#include <linux_osl.h>
-+#elif defined(NDIS)
-+#include <ndis_osl.h>
-+#elif defined(_CFE_)
-+#include <cfe_osl.h>
-+#elif defined(_HNDRTE_)
-+#include <hndrte_osl.h>
-+#elif defined(_MINOSL_)
-+#include <min_osl.h>
-+#elif PMON
-+#include <pmon_osl.h>
-+#elif defined(MACOSX)
-+#include <macosx_osl.h>
-+#else
-+#error "Unsupported OSL requested"
-+#endif
++/*
++* load 16-bit value from unaligned big(network) endian byte array.
++*/
++static INLINE uint16
++ntoh16_ua(void *bytes)
++{
++      return (((uint8*)bytes)[0]<<8)+((uint8*)bytes)[1];
++}
++
++/*
++* load 32-bit value from unaligned big(network) endian byte array.
++*/
++static INLINE uint32
++ntoh32_ua(void *bytes)
++{
++      return (((uint8*)bytes)[0]<<24)+(((uint8*)bytes)[1]<<16)+
++             (((uint8*)bytes)[2]<<8)+((uint8*)bytes)[3];
++}
++
++#define ltoh_ua(ptr) (\
++      sizeof(*(ptr)) == sizeof(uint8) ?  *(uint8 *)ptr : \
++      sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] : \
++      (((uint8 *)ptr)[3]<<24)+(((uint8 *)ptr)[2]<<16)+(((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] \
++)
 +
-+/* handy */
-+#define       SET_REG(r, mask, val)   W_REG((r), ((R_REG(r) & ~(mask)) | (val)))
-+#define       MAXPRIO         7       /* 0-7 */
++#define ntoh_ua(ptr) (\
++      sizeof(*(ptr)) == sizeof(uint8) ?  *(uint8 *)ptr : \
++      sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[0]<<8)+((uint8 *)ptr)[1] : \
++      (((uint8 *)ptr)[0]<<24)+(((uint8 *)ptr)[1]<<16)+(((uint8 *)ptr)[2]<<8)+((uint8 *)ptr)[3] \
++)
 +
-+#endif        /* _osl_h_ */
-diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/pcicfg.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/pcicfg.h
---- linux-2.4.32/arch/mips/bcm947xx/include/pcicfg.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/pcicfg.h      2005-12-16 23:39:10.752824750 +0100
-@@ -0,0 +1,451 @@
++#endif /* _BCMENDIAN_H_ */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmnvram.h linux.dev/arch/mips/bcm947xx/include/bcmnvram.h
+--- linux.old/arch/mips/bcm947xx/include/bcmnvram.h    1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmnvram.h    2006-04-27 23:29:18.000000000 +0200
+@@ -0,0 +1,159 @@
 +/*
-+ * pcicfg.h: PCI configuration  constants and structures.
++ * NVRAM variable manipulation
 + *
-+ * Copyright 2005, Broadcom Corporation
++ * Copyright 2006, Broadcom Corporation
 + * All Rights Reserved.
 + * 
 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
@@ -4546,1518 +3581,743 @@ diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/pcicfg.h linux-2.4.32-brcm/arc
 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
 + *
-+ * $Id$
++ * $Id: bcmnvram.h,v 1.17 2006/03/02 12:33:44 honor Exp $
 + */
 +
-+#ifndef       _h_pci_
-+#define       _h_pci_
-+
-+/* The following inside ifndef's so we don't collide with NTDDK.H */
-+#ifndef PCI_MAX_BUS
-+#define PCI_MAX_BUS           0x100
-+#endif
-+#ifndef PCI_MAX_DEVICES
-+#define PCI_MAX_DEVICES               0x20
-+#endif
-+#ifndef PCI_MAX_FUNCTION
-+#define PCI_MAX_FUNCTION      0x8
-+#endif
-+
-+#ifndef PCI_INVALID_VENDORID
-+#define PCI_INVALID_VENDORID  0xffff
-+#endif
-+#ifndef PCI_INVALID_DEVICEID
-+#define PCI_INVALID_DEVICEID  0xffff
-+#endif
++#ifndef _bcmnvram_h_
++#define _bcmnvram_h_
 +
++#ifndef _LANGUAGE_ASSEMBLY
 +
-+/* Convert between bus-slot-function-register and config addresses */
++#include <typedefs.h>
++#include <bcmdefs.h>
 +
-+#define       PCICFG_BUS_SHIFT        16      /* Bus shift */
-+#define       PCICFG_SLOT_SHIFT       11      /* Slot shift */
-+#define       PCICFG_FUN_SHIFT        8       /* Function shift */
-+#define       PCICFG_OFF_SHIFT        0       /* Register shift */
++struct nvram_header {
++      uint32 magic;
++      uint32 len;
++      uint32 crc_ver_init;    /* 0:7 crc, 8:15 ver, 16:31 sdram_init */
++      uint32 config_refresh;  /* 0:15 sdram_config, 16:31 sdram_refresh */
++      uint32 config_ncdl;     /* ncdl values for memc */
++};
 +
-+#define       PCICFG_BUS_MASK         0xff    /* Bus mask */
-+#define       PCICFG_SLOT_MASK        0x1f    /* Slot mask */
-+#define       PCICFG_FUN_MASK         7       /* Function mask */
-+#define       PCICFG_OFF_MASK         0xff    /* Bus mask */
++struct nvram_tuple {
++      char *name;
++      char *value;
++      struct nvram_tuple *next;
++};
 +
-+#define       PCI_CONFIG_ADDR(b, s, f, o)                                     \
-+              ((((b) & PCICFG_BUS_MASK) << PCICFG_BUS_SHIFT)          \
-+               | (((s) & PCICFG_SLOT_MASK) << PCICFG_SLOT_SHIFT)      \
-+               | (((f) & PCICFG_FUN_MASK) << PCICFG_FUN_SHIFT)        \
-+               | (((o) & PCICFG_OFF_MASK) << PCICFG_OFF_SHIFT))
++/*
++ * Initialize NVRAM access. May be unnecessary or undefined on certain
++ * platforms.
++ */
++extern int nvram_init(void *sbh);
 +
-+#define       PCI_CONFIG_BUS(a)       (((a) >> PCICFG_BUS_SHIFT) & PCICFG_BUS_MASK)
-+#define       PCI_CONFIG_SLOT(a)      (((a) >> PCICFG_SLOT_SHIFT) & PCICFG_SLOT_MASK)
-+#define       PCI_CONFIG_FUN(a)       (((a) >> PCICFG_FUN_SHIFT) & PCICFG_FUN_MASK)
-+#define       PCI_CONFIG_OFF(a)       (((a) >> PCICFG_OFF_SHIFT) & PCICFG_OFF_MASK)
++/*
++ * Disable NVRAM access. May be unnecessary or undefined on certain
++ * platforms.
++ */
++extern void nvram_exit(void *sbh);
 +
-+/* PCIE Config space accessing MACROS*/
++/*
++ * Get the value of an NVRAM variable. The pointer returned may be
++ * invalid after a set.
++ * @param     name    name of variable to get
++ * @return    value of variable or NULL if undefined
++ */
++extern char * nvram_get(const char *name);
 +
-+#define       PCIECFG_BUS_SHIFT       24      /* Bus shift */
-+#define       PCIECFG_SLOT_SHIFT      19      /* Slot/Device shift */
-+#define       PCIECFG_FUN_SHIFT       16      /* Function shift */
-+#define       PCIECFG_OFF_SHIFT       0       /* Register shift */
++/* 
++ * Read the reset GPIO value from the nvram and set the GPIO
++ * as input
++ */
++extern int BCMINITFN(nvram_resetgpio_init)(void *sbh);
++extern int BCMINITFN(nvram_gpio_init)(const char *name, void *sbh);
++extern int BCMINITFN(nvram_gpio_set)(const char *name, void *sbh, int type);
 +
-+#define       PCIECFG_BUS_MASK        0xff    /* Bus mask */
-+#define       PCIECFG_SLOT_MASK       0x1f    /* Slot/Device mask */
-+#define       PCIECFG_FUN_MASK        7       /* Function mask */
-+#define       PCIECFG_OFF_MASK        0x3ff   /* Register mask */
++/* 
++ * Get the value of an NVRAM variable.
++ * @param     name    name of variable to get
++ * @return    value of variable or NUL if undefined
++ */
++#define nvram_safe_get(name) (nvram_get(name) ? : "")
 +
-+#define       PCIE_CONFIG_ADDR(b, s, f, o)                                    \
-+              ((((b) & PCIECFG_BUS_MASK) << PCIECFG_BUS_SHIFT)                \
-+               | (((s) & PCIECFG_SLOT_MASK) << PCIECFG_SLOT_SHIFT)    \
-+               | (((f) & PCIECFG_FUN_MASK) << PCIECFG_FUN_SHIFT)      \
-+               | (((o) & PCIECFG_OFF_MASK) << PCIECFG_OFF_SHIFT))
++#define nvram_safe_unset(name) ({ \
++      if(nvram_get(name)) \
++              nvram_unset(name); \
++})
 +
-+#define       PCIE_CONFIG_BUS(a)      (((a) >> PCIECFG_BUS_SHIFT) & PCIECFG_BUS_MASK)
-+#define       PCIE_CONFIG_SLOT(a)     (((a) >> PCIECFG_SLOT_SHIFT) & PCIECFG_SLOT_MASK)
-+#define       PCIE_CONFIG_FUN(a)      (((a) >> PCIECFG_FUN_SHIFT) & PCIECFG_FUN_MASK)
-+#define       PCIE_CONFIG_OFF(a)      (((a) >> PCIECFG_OFF_SHIFT) & PCIECFG_OFF_MASK)
++#define nvram_safe_set(name, value) ({ \
++      if(!nvram_get(name) || strcmp(nvram_get(name), value)) \
++              nvram_set(name, value); \
++})
 +
-+      
-+/* The actual config space */
++/*
++ * Match an NVRAM variable.
++ * @param     name    name of variable to match
++ * @param     match   value to compare against value of variable
++ * @return    TRUE if variable is defined and its value is string equal
++ *            to match or FALSE otherwise
++ */
++static INLINE int
++nvram_match(char *name, char *match) {
++      const char *value = nvram_get(name);
++      return (value && !strcmp(value, match));
++}
 +
-+#define       PCI_BAR_MAX             6
++/*
++ * Inversely match an NVRAM variable.
++ * @param     name    name of variable to match
++ * @param     match   value to compare against value of variable
++ * @return    TRUE if variable is defined and its value is not string
++ *            equal to invmatch or FALSE otherwise
++ */
++static INLINE int
++nvram_invmatch(char *name, char *invmatch) {
++      const char *value = nvram_get(name);
++      return (value && strcmp(value, invmatch));
++}
 +
-+#define       PCI_ROM_BAR             8
++/*
++ * Set the value of an NVRAM variable. The name and value strings are
++ * copied into private storage. Pointers to previously set values
++ * may become invalid. The new value may be immediately
++ * retrieved but will not be permanently stored until a commit.
++ * @param     name    name of variable to set
++ * @param     value   value of variable
++ * @return    0 on success and errno on failure
++ */
++extern int nvram_set(const char *name, const char *value);
 +
-+#define       PCR_RSVDA_MAX           2
++/*
++ * Unset an NVRAM variable. Pointers to previously set values
++ * remain valid until a set.
++ * @param     name    name of variable to unset
++ * @return    0 on success and errno on failure
++ * NOTE: use nvram_commit to commit this change to flash.
++ */
++extern int nvram_unset(const char *name);
 +
-+/* pci config status reg has a bit to indicate that capability ptr is present*/
++/*
++ * Commit NVRAM variables to permanent storage. All pointers to values
++ * may be invalid after a commit.
++ * NVRAM values are undefined after a commit.
++ * @return    0 on success and errno on failure
++ */
++extern int nvram_commit(void);
 +
-+#define PCI_CAPPTR_PRESENT    0x0010
++/*
++ * Get all NVRAM variables (format name=value\0 ... \0\0).
++ * @param     buf     buffer to store variables
++ * @param     count   size of buffer in bytes
++ * @return    0 on success and errno on failure
++ */
++extern int nvram_getall(char *buf, int count);
 +
-+typedef struct _pci_config_regs {
-+    unsigned short    vendor;
-+    unsigned short    device;
-+    unsigned short    command;
-+    unsigned short    status;
-+    unsigned char     rev_id;
-+    unsigned char     prog_if;
-+    unsigned char     sub_class;
-+    unsigned char     base_class;
-+    unsigned char     cache_line_size;
-+    unsigned char     latency_timer;
-+    unsigned char     header_type;
-+    unsigned char     bist;
-+    unsigned long     base[PCI_BAR_MAX];
-+    unsigned long     cardbus_cis;
-+    unsigned short    subsys_vendor;
-+    unsigned short    subsys_id;
-+    unsigned long     baserom;
-+    unsigned long     rsvd_a[PCR_RSVDA_MAX];
-+    unsigned char     int_line;
-+    unsigned char     int_pin;
-+    unsigned char     min_gnt;
-+    unsigned char     max_lat;
-+    unsigned char     dev_dep[192];
-+} pci_config_regs;
++extern int file2nvram(char *filename, char *varname);
++extern int nvram2file(char *varname, char *filename);
 +
-+#define       SZPCR           (sizeof (pci_config_regs))
-+#define       MINSZPCR        64              /* offsetof (dev_dep[0] */
++#endif /* _LANGUAGE_ASSEMBLY */
 +
-+/* A structure for the config registers is nice, but in most
-+ * systems the config space is not memory mapped, so we need
-+ * filed offsetts. :-(
-+ */
-+#define       PCI_CFG_VID             0
-+#define       PCI_CFG_DID             2
-+#define       PCI_CFG_CMD             4
-+#define       PCI_CFG_STAT            6
-+#define       PCI_CFG_REV             8
-+#define       PCI_CFG_PROGIF          9
-+#define       PCI_CFG_SUBCL           0xa
-+#define       PCI_CFG_BASECL          0xb
-+#define       PCI_CFG_CLSZ            0xc
-+#define       PCI_CFG_LATTIM          0xd
-+#define       PCI_CFG_HDR             0xe
-+#define       PCI_CFG_BIST            0xf
-+#define       PCI_CFG_BAR0            0x10
-+#define       PCI_CFG_BAR1            0x14
-+#define       PCI_CFG_BAR2            0x18
-+#define       PCI_CFG_BAR3            0x1c
-+#define       PCI_CFG_BAR4            0x20
-+#define       PCI_CFG_BAR5            0x24
-+#define       PCI_CFG_CIS             0x28
-+#define       PCI_CFG_SVID            0x2c
-+#define       PCI_CFG_SSID            0x2e
-+#define       PCI_CFG_ROMBAR          0x30
-+#define PCI_CFG_CAPPTR                0x34
-+#define       PCI_CFG_INT             0x3c
-+#define       PCI_CFG_PIN             0x3d
-+#define       PCI_CFG_MINGNT          0x3e
-+#define       PCI_CFG_MAXLAT          0x3f
++#define NVRAM_MAGIC           0x48534C46      /* 'FLSH' */
++#define NVRAM_CLEAR_MAGIC             0x0
++#define NVRAM_INVALID_MAGIC   0xFFFFFFFF
++#define NVRAM_VERSION         1
++#define NVRAM_HEADER_SIZE     20
++#define NVRAM_SPACE           0x8000
 +
-+/* Classes and subclasses */
++#define NVRAM_MAX_VALUE_LEN 255
++#define NVRAM_MAX_PARAM_LEN 64
 +
-+typedef enum {
-+    PCI_CLASS_OLD = 0,
-+    PCI_CLASS_DASDI,
-+    PCI_CLASS_NET,
-+    PCI_CLASS_DISPLAY,
-+    PCI_CLASS_MMEDIA,
-+    PCI_CLASS_MEMORY,
-+    PCI_CLASS_BRIDGE,
-+    PCI_CLASS_COMM,
-+    PCI_CLASS_BASE,
-+    PCI_CLASS_INPUT,
-+    PCI_CLASS_DOCK,
-+    PCI_CLASS_CPU,
-+    PCI_CLASS_SERIAL,
-+    PCI_CLASS_INTELLIGENT = 0xe,
-+    PCI_CLASS_SATELLITE,
-+    PCI_CLASS_CRYPT,
-+    PCI_CLASS_DSP,
-+    PCI_CLASS_MAX
-+} pci_classes;
++#endif /* _bcmnvram_h_ */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmsrom.h linux.dev/arch/mips/bcm947xx/include/bcmsrom.h
+--- linux.old/arch/mips/bcm947xx/include/bcmsrom.h     1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmsrom.h     2006-04-27 20:27:33.000000000 +0200
+@@ -0,0 +1,108 @@
++/*
++ * Misc useful routines to access NIC local SROM/OTP .
++ *
++ * Copyright 2006, 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: bcmsrom.h,v 1.1.1.13 2006/04/15 01:29:08 michael Exp $
++ */
 +
-+typedef enum {
-+    PCI_DASDI_SCSI,
-+    PCI_DASDI_IDE,
-+    PCI_DASDI_FLOPPY,
-+    PCI_DASDI_IPI,
-+    PCI_DASDI_RAID,
-+    PCI_DASDI_OTHER = 0x80
-+} pci_dasdi_subclasses;
++#ifndef       _bcmsrom_h_
++#define       _bcmsrom_h_
 +
-+typedef enum {
-+    PCI_NET_ETHER,
-+    PCI_NET_TOKEN,
-+    PCI_NET_FDDI,
-+    PCI_NET_ATM,
-+    PCI_NET_OTHER = 0x80
-+} pci_net_subclasses;
++/* Maximum srom: 4 Kilobits == 512 bytes */
++#define       SROM_MAX        512
 +
-+typedef enum {
-+    PCI_DISPLAY_VGA,
-+    PCI_DISPLAY_XGA,
-+    PCI_DISPLAY_3D,
-+    PCI_DISPLAY_OTHER = 0x80
-+} pci_display_subclasses;
++/* SROM Rev 4: Reallocate the software part of the srom to accomodate
++ * MIMO features. It assumes up to two PCIE functions and 440 bytes
++ * of useable srom i.e. the useable storage in chips with OTP that
++ * implements hardware redundancy.
++ */
 +
-+typedef enum {
-+    PCI_MMEDIA_VIDEO,
-+    PCI_MMEDIA_AUDIO,
-+    PCI_MMEDIA_PHONE,
-+    PCI_MEDIA_OTHER = 0x80
-+} pci_mmedia_subclasses;
++#define       SROM4_WORDS             220
++
++#define       SROM4_SIGN              32
++#define       SROM4_SIGNATURE         0x5372
++
++#define       SROM4_BREV              33
++
++#define       SROM4_BFL0              34
++#define       SROM4_BFL1              35
++#define       SROM4_BFL2              36
++#define       SROM4_BFL3              37
++
++#define       SROM4_MACHI             38
++#define       SROM4_MACMID            39
++#define       SROM4_MACLO             40
++
++#define       SROM4_CCODE             41
++#define       SROM4_REGREV            42
++
++#define       SROM4_LEDBH10           43
++#define       SROM4_LEDBH32           44
++
++#define       SROM4_LEDDC             45
++
++#define       SROM4_AA                46
++#define       SROM4_AA2G_MASK         0x00ff
++#define       SROM4_AA2G_SHIFT        0
++#define       SROM4_AA5G_MASK         0xff00
++#define       SROM4_AA5G_SHIFT        8
++
++#define       SROM4_AG10              47
++#define       SROM4_AG32              48
++
++#define       SROM4_TXPID2G           49
++#define       SROM4_TXPID5G           51
++#define       SROM4_TXPID5GL          53
++#define       SROM4_TXPID5GH          55
++
++/* Per-path fields */
++#define       MAX_PATH                4
++#define       SROM4_PATH0             64
++#define       SROM4_PATH1             87
++#define       SROM4_PATH2             110
++#define       SROM4_PATH3             133
++
++#define       SROM4_2G_ITT_MAXP       0
++#define       SROM4_2G_PA             1
++#define       SROM4_5G_ITT_MAXP       5
++#define       SROM4_5GLH_MAXP         6
++#define       SROM4_5G_PA             7
++#define       SROM4_5GL_PA            11
++#define       SROM4_5GH_PA            15
++
++/* Fields in the ITT_MAXP and 5GLH_MAXP words */
++#define       B2G_MAXP_MASK           0xff
++#define       B2G_ITT_SHIFT           8
++#define       B5G_MAXP_MASK           0xff
++#define       B5G_ITT_SHIFT           8
++#define       B5GH_MAXP_MASK          0xff
++#define       B5GL_MAXP_SHIFT         8
++
++/* All the miriad power offsets */
++#define       SROM4_2G_CCKPO          156
++#define       SROM4_2G_OFDMPO         157
++#define       SROM4_5G_OFDMPO         159
++#define       SROM4_5GL_OFDMPO        161
++#define       SROM4_5GH_OFDMPO        163
++#define       SROM4_2G_MCSPO          165
++#define       SROM4_5G_MCSPO          173
++#define       SROM4_5GL_MCSPO         181
++#define       SROM4_5GH_MCSPO         189
++#define       SROM4_CCDPO             197
++#define       SROM4_STBCPO            198
++#define       SROM4_BW40PO            199
++#define       SROM4_BWDUPPO           200
++
++extern int srom_var_init(void *sbh, uint bus, void *curmap, osl_t *osh, char **vars, uint *count);
 +
-+typedef enum {
-+    PCI_MEMORY_RAM,
-+    PCI_MEMORY_FLASH,
-+    PCI_MEMORY_OTHER = 0x80
-+} pci_memory_subclasses;
++extern int srom_read(uint bus, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf);
++extern int srom_write(uint bus, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf);
 +
-+typedef enum {
-+    PCI_BRIDGE_HOST,
-+    PCI_BRIDGE_ISA,
-+    PCI_BRIDGE_EISA,
-+    PCI_BRIDGE_MC,
-+    PCI_BRIDGE_PCI,
-+    PCI_BRIDGE_PCMCIA,
-+    PCI_BRIDGE_NUBUS,
-+    PCI_BRIDGE_CARDBUS,
-+    PCI_BRIDGE_RACEWAY,
-+    PCI_BRIDGE_OTHER = 0x80
-+} pci_bridge_subclasses;
++#endif        /* _bcmsrom_h_ */
+diff -urN linux.old/arch/mips/bcm947xx/include/bcmutils.h linux.dev/arch/mips/bcm947xx/include/bcmutils.h
+--- linux.old/arch/mips/bcm947xx/include/bcmutils.h    1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/bcmutils.h    2006-05-02 01:52:12.000000000 +0200
+@@ -0,0 +1,433 @@
++/*
++ * Misc useful os-independent macros and functions.
++ *
++ * Copyright 2006, 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: bcmutils.h,v 1.1.1.16 2006/04/08 06:13:39 honor Exp $
++ */
 +
-+typedef enum {
-+    PCI_COMM_UART,
-+    PCI_COMM_PARALLEL,
-+    PCI_COMM_MULTIUART,
-+    PCI_COMM_MODEM,
-+    PCI_COMM_OTHER = 0x80
-+} pci_comm_subclasses;
++#ifndef       _bcmutils_h_
++#define       _bcmutils_h_
 +
-+typedef enum {
-+    PCI_BASE_PIC,
-+    PCI_BASE_DMA,
-+    PCI_BASE_TIMER,
-+    PCI_BASE_RTC,
-+    PCI_BASE_PCI_HOTPLUG,
-+    PCI_BASE_OTHER = 0x80
-+} pci_base_subclasses;
++/* ** driver-only section ** */
++#ifdef BCMDRIVER
 +
-+typedef enum {
-+    PCI_INPUT_KBD,
-+    PCI_INPUT_PEN,
-+    PCI_INPUT_MOUSE,
-+    PCI_INPUT_SCANNER,
-+    PCI_INPUT_GAMEPORT,
-+    PCI_INPUT_OTHER = 0x80
-+} pci_input_subclasses;
++#define _BCM_U        0x01    /* upper */
++#define _BCM_L        0x02    /* lower */
++#define _BCM_D        0x04    /* digit */
++#define _BCM_C        0x08    /* cntrl */
++#define _BCM_P        0x10    /* punct */
++#define _BCM_S        0x20    /* white space (space/lf/tab) */
++#define _BCM_X        0x40    /* hex digit */
++#define _BCM_SP       0x80    /* hard space (0x20) */
 +
-+typedef enum {
-+    PCI_DOCK_GENERIC,
-+    PCI_DOCK_OTHER = 0x80
-+} pci_dock_subclasses;
++#define GPIO_PIN_NOTDEFINED   0x20    /* Pin not defined */
 +
-+typedef enum {
-+    PCI_CPU_386,
-+    PCI_CPU_486,
-+    PCI_CPU_PENTIUM,
-+    PCI_CPU_ALPHA = 0x10,
-+    PCI_CPU_POWERPC = 0x20,
-+    PCI_CPU_MIPS = 0x30,
-+    PCI_CPU_COPROC = 0x40,
-+    PCI_CPU_OTHER = 0x80
-+} pci_cpu_subclasses;
++extern unsigned char bcm_ctype[];
++#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
 +
-+typedef enum {
-+    PCI_SERIAL_IEEE1394,
-+    PCI_SERIAL_ACCESS,
-+    PCI_SERIAL_SSA,
-+    PCI_SERIAL_USB,
-+    PCI_SERIAL_FIBER,
-+    PCI_SERIAL_SMBUS,
-+    PCI_SERIAL_OTHER = 0x80
-+} pci_serial_subclasses;
++#define bcm_isalnum(c)        ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
++#define bcm_isalpha(c)        ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
++#define bcm_iscntrl(c)        ((bcm_ismask(c)&(_BCM_C)) != 0)
++#define bcm_isdigit(c)        ((bcm_ismask(c)&(_BCM_D)) != 0)
++#define bcm_isgraph(c)        ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
++#define bcm_islower(c)        ((bcm_ismask(c)&(_BCM_L)) != 0)
++#define bcm_isprint(c)        ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
++#define bcm_ispunct(c)        ((bcm_ismask(c)&(_BCM_P)) != 0)
++#define bcm_isspace(c)        ((bcm_ismask(c)&(_BCM_S)) != 0)
++#define bcm_isupper(c)        ((bcm_ismask(c)&(_BCM_U)) != 0)
++#define bcm_isxdigit(c)       ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
 +
-+typedef enum {
-+    PCI_INTELLIGENT_I2O,
-+} pci_intelligent_subclasses;
++/*
++ * Spin at most 'us' microseconds while 'exp' is true.
++ * Caller should explicitly test 'exp' when this completes
++ * and take appropriate error action if 'exp' is still true.
++ */
++#define SPINWAIT(exp, us) { \
++      uint countdown = (us) + 9; \
++      while ((exp) && (countdown >= 10)) {\
++              OSL_DELAY(10); \
++              countdown -= 10; \
++      } \
++}
 +
-+typedef enum {
-+    PCI_SATELLITE_TV,
-+    PCI_SATELLITE_AUDIO,
-+    PCI_SATELLITE_VOICE,
-+    PCI_SATELLITE_DATA,
-+    PCI_SATELLITE_OTHER = 0x80
-+} pci_satellite_subclasses;
++struct  ether_addr {
++      uint8 octet[6];
++} __attribute__((packed));
 +
-+typedef enum {
-+    PCI_CRYPT_NETWORK,
-+    PCI_CRYPT_ENTERTAINMENT,
-+    PCI_CRYPT_OTHER = 0x80
-+} pci_crypt_subclasses;
++/* string */
++extern uchar bcm_toupper(uchar c);
++extern ulong bcm_strtoul(char *cp, char **endp, uint base);
++extern char *bcmstrstr(char *haystack, char *needle);
++extern char *bcmstrcat(char *dest, const char *src);
++extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
++/* ethernet address */
++extern char *bcm_ether_ntoa(struct ether_addr *ea, char *buf);
++/* variable access */
++extern char *getvar(char *vars, char *name);
++extern int getintvar(char *vars, char *name);
++extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
++#ifdef BCMPERFSTATS
++extern void bcm_perf_enable(void);
++extern void bcmstats(char *fmt);
++extern void bcmlog(char *fmt, uint a1, uint a2);
++extern void bcmdumplog(char *buf, int size);
++extern int bcmdumplogent(char *buf, uint idx);
++#else
++#define bcm_perf_enable()
++#define bcmstats(fmt)
++#define       bcmlog(fmt, a1, a2)
++#define       bcmdumplog(buf, size)   *buf = '\0'
++#define       bcmdumplogent(buf, idx) -1
++#endif /* BCMPERFSTATS */
++extern char *bcm_nvram_vars(uint *length);
++extern int bcm_nvram_cache(void *sbh);
++
++/* Support for sharing code across in-driver iovar implementations.
++ * The intent is that a driver use this structure to map iovar names
++ * to its (private) iovar identifiers, and the lookup function to
++ * find the entry.  Macros are provided to map ids and get/set actions
++ * into a single number space for a switch statement.
++ */
 +
-+typedef enum {
-+    PCI_DSP_DPIO,
-+    PCI_DSP_OTHER = 0x80
-+} pci_dsp_subclasses;
++/* iovar structure */
++typedef struct bcm_iovar {
++      const char *name;       /* name for lookup and display */
++      uint16 varid;           /* id for switch */
++      uint16 flags;           /* driver-specific flag bits */
++      uint16 type;            /* base type of argument */
++      uint16 minlen;          /* min length for buffer vars */
++} bcm_iovar_t;
++
++/* varid definitions are per-driver, may use these get/set bits */
++
++/* IOVar action bits for id mapping */
++#define IOV_GET 0 /* Get an iovar */
++#define IOV_SET 1 /* Set an iovar */
++
++/* Varid to actionid mapping */
++#define IOV_GVAL(id)          ((id)*2)
++#define IOV_SVAL(id)          (((id)*2)+IOV_SET)
++#define IOV_ISSET(actionid)   ((actionid & IOV_SET) == IOV_SET)
++
++/* flags are per-driver based on driver attributes */
++
++/* Base type definitions */
++#define IOVT_VOID     0       /* no value (implictly set only) */
++#define IOVT_BOOL     1       /* any value ok (zero/nonzero) */
++#define IOVT_INT8     2       /* integer values are range-checked */
++#define IOVT_UINT8    3       /* unsigned int 8 bits */
++#define IOVT_INT16    4       /* int 16 bits */
++#define IOVT_UINT16   5       /* unsigned int 16 bits */
++#define IOVT_INT32    6       /* int 32 bits */
++#define IOVT_UINT32   7       /* unsigned int 32 bits */
++#define IOVT_BUFFER   8       /* buffer is size-checked as per minlen */
++
++extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
++extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
 +
-+/* Header types */
-+typedef enum {
-+      PCI_HEADER_NORMAL,
-+      PCI_HEADER_BRIDGE,
-+      PCI_HEADER_CARDBUS
-+} pci_header_types;
++#endif        /* #ifdef BCMDRIVER */
 +
++/* ** driver/apps-shared section ** */
 +
-+/* Overlay for a PCI-to-PCI bridge */
++#define BCME_STRLEN           64      /* Max string length for BCM errors */
++#define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
 +
-+#define       PPB_RSVDA_MAX           2
-+#define       PPB_RSVDD_MAX           8
 +
-+typedef struct _ppb_config_regs {
-+    unsigned short    vendor;
-+    unsigned short    device;
-+    unsigned short    command;
-+    unsigned short    status;
-+    unsigned char     rev_id;
-+    unsigned char     prog_if;
-+    unsigned char     sub_class;
-+    unsigned char     base_class;
-+    unsigned char     cache_line_size;
-+    unsigned char     latency_timer;
-+    unsigned char     header_type;
-+    unsigned char     bist;
-+    unsigned long     rsvd_a[PPB_RSVDA_MAX];
-+    unsigned char     prim_bus;
-+    unsigned char     sec_bus;
-+    unsigned char     sub_bus;
-+    unsigned char     sec_lat;
-+    unsigned char     io_base;
-+    unsigned char     io_lim;
-+    unsigned short    sec_status;
-+    unsigned short    mem_base;
-+    unsigned short    mem_lim;
-+    unsigned short    pf_mem_base;
-+    unsigned short    pf_mem_lim;
-+    unsigned long     pf_mem_base_hi;
-+    unsigned long     pf_mem_lim_hi;
-+    unsigned short    io_base_hi;
-+    unsigned short    io_lim_hi;
-+    unsigned short    subsys_vendor;
-+    unsigned short    subsys_id;
-+    unsigned long     rsvd_b;
-+    unsigned char     rsvd_c;
-+    unsigned char     int_pin;
-+    unsigned short    bridge_ctrl;
-+    unsigned char     chip_ctrl;
-+    unsigned char     diag_ctrl;
-+    unsigned short    arb_ctrl;
-+    unsigned long     rsvd_d[PPB_RSVDD_MAX];
-+    unsigned char     dev_dep[192];
-+} ppb_config_regs;
++/*
++ * error codes could be added but the defined ones shouldn't be changed/deleted
++ * these error codes are exposed to the user code
++ * when ever a new error code is added to this list
++ * please update errorstring table with the related error string and
++ * update osl files with os specific errorcode map
++*/
 +
++#define BCME_OK                               0       /* Success */
++#define BCME_ERROR                    -1      /* Error generic */
++#define BCME_BADARG                   -2      /* Bad Argument */
++#define BCME_BADOPTION                        -3      /* Bad option */
++#define BCME_NOTUP                    -4      /* Not up */
++#define BCME_NOTDOWN                  -5      /* Not down */
++#define BCME_NOTAP                    -6      /* Not AP */
++#define BCME_NOTSTA                   -7      /* Not STA  */
++#define BCME_BADKEYIDX                        -8      /* BAD Key Index */
++#define BCME_RADIOOFF                         -9      /* Radio Off */
++#define BCME_NOTBANDLOCKED            -10     /* Not  band locked */
++#define BCME_NOCLK                    -11     /* No Clock */
++#define BCME_BADRATESET                       -12     /* BAD Rate valueset */
++#define BCME_BADBAND                  -13     /* BAD Band */
++#define BCME_BUFTOOSHORT              -14     /* Buffer too short */
++#define BCME_BUFTOOLONG                       -15     /* Buffer too long */
++#define BCME_BUSY                     -16     /* Busy */
++#define BCME_NOTASSOCIATED            -17     /* Not Associated */
++#define BCME_BADSSIDLEN                       -18     /* Bad SSID len */
++#define BCME_OUTOFRANGECHAN           -19     /* Out of Range Channel */
++#define BCME_BADCHAN                  -20     /* Bad Channel */
++#define BCME_BADADDR                  -21     /* Bad Address */
++#define BCME_NORESOURCE                       -22     /* Not Enough Resources */
++#define BCME_UNSUPPORTED              -23     /* Unsupported */
++#define BCME_BADLEN                   -24     /* Bad length */
++#define BCME_NOTREADY                 -25     /* Not Ready */
++#define BCME_EPERM                    -26     /* Not Permitted */
++#define BCME_NOMEM                    -27     /* No Memory */
++#define BCME_ASSOCIATED                       -28     /* Associated */
++#define BCME_RANGE                    -29     /* Not In Range */
++#define BCME_NOTFOUND                 -30     /* Not Found */
++#define BCME_WME_NOT_ENABLED          -31     /* WME Not Enabled */
++#define BCME_TSPEC_NOTFOUND           -32     /* TSPEC Not Found */
++#define BCME_ACM_NOTSUPPORTED         -33     /* ACM Not Supported */
++#define BCME_NOT_WME_ASSOCIATION      -34     /* Not WME Association */
++#define BCME_SDIO_ERROR                       -35     /* SDIO Bus Error */
++#define BCME_DONGLE_DOWN              -36     /* Dongle Not Accessible */
++#define BCME_LAST                     BCME_DONGLE_DOWN
++
++/* These are collection of BCME Error strings */
++#define BCMERRSTRINGTABLE {           \
++      "OK",                           \
++      "Undefined error",              \
++      "Bad Argument",                 \
++      "Bad Option",                   \
++      "Not up",                       \
++      "Not down",                     \
++      "Not AP",                       \
++      "Not STA",                      \
++      "Bad Key Index",                \
++      "Radio Off",                    \
++      "Not band locked",              \
++      "No clock",                     \
++      "Bad Rate valueset",            \
++      "Bad Band",