autodetect atm, pci, usb, pcmcia features from kernel config file
[openwrt.git] / target / linux / brcm-2.4 / patches / 001-bcm47xx.patch
index af82c3c..9c954fa 100644 (file)
@@ -1,59 +1,7 @@
-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 @@
++++ linux.dev/arch/mips/bcm947xx/bcmsrom.c     2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,1213 @@
 +/*
 + *  Misc useful routines to access NIC SROM/OTP .
 + *
@@ -200,12 +148,12 @@ diff -urN linux.old/arch/mips/bcm947xx/bcmsrom.c linux.dev/arch/mips/bcm947xx/bc
 +
 +              nw = crc_range / 2;
 +              /* read first 64 words from srom */
-+              if (srom_read(bustype, curmap, osh, 0, nw * 2, image))
++              if (srom_read(bustype, curmap, osh, 0, crc_range, 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))
++                      if (srom_read(bustype, curmap, osh, 0, crc_range, image))
 +                              return 1;
 +              }
 +              /* make changes */
@@ -748,18 +696,17 @@ diff -urN linux.old/arch/mips/bcm947xx/bcmsrom.c linux.dev/arch/mips/bcm947xx/bc
 +
 +      err = sprom_read_pci(osh, (void*)((int8*)curmap + PCI_BAR0_SPROM_OFFSET), 0, b,
 +                           64, TRUE);
-+      if (err == 0) {
++      if (b[SROM4_SIGN] == SROM4_SIGNATURE) {
++              /* 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;
++      } else 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) {
@@ -869,11 +816,13 @@ diff -urN linux.old/arch/mips/bcm947xx/bcmsrom.c linux.dev/arch/mips/bcm947xx/bc
 +                      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++;
++              if (w != 0xffff) {
++                      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++;
++              }
 +
 +              w = b[SROM4_AA];
 +              vp += sprintf(vp, "aa2g=%d", w & SROM4_AA2G_MASK);
@@ -1268,7 +1217,7 @@ diff -urN linux.old/arch/mips/bcm947xx/bcmsrom.c linux.dev/arch/mips/bcm947xx/bc
 +
 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
++++ linux.dev/arch/mips/bcm947xx/bcmutils.c    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,247 @@
 +/*
 + * Misc useful OS-independent routines.
@@ -1519,7 +1468,7 @@ diff -urN linux.old/arch/mips/bcm947xx/bcmutils.c linux.dev/arch/mips/bcm947xx/b
 +
 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
++++ linux.dev/arch/mips/bcm947xx/cfe_env.c     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,234 @@
 +/*
 + * NVRAM variable manipulation (Linux kernel half)
@@ -1757,7 +1706,7 @@ diff -urN linux.old/arch/mips/bcm947xx/cfe_env.c linux.dev/arch/mips/bcm947xx/cf
 +
 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
++++ linux.dev/arch/mips/bcm947xx/compressed/Makefile   2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,33 @@
 +#
 +# Makefile for Broadcom BCM947XX boards
@@ -1794,8 +1743,8 @@ diff -urN linux.old/arch/mips/bcm947xx/compressed/Makefile linux.dev/arch/mips/b
 +      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 @@
++++ linux.dev/arch/mips/bcm947xx/export.c      2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,71 @@
 +#include <linux/module.h>
 +
 +#define _export(n) \
@@ -1805,6 +1754,7 @@ diff -urN linux.old/arch/mips/bcm947xx/export.c linux.dev/arch/mips/bcm947xx/exp
 +_export(bcm947xx_sbh)
 +
 +_export(sb_attach)
++_export(sb_kattach)
 +_export(sb_boardtype)
 +_export(sb_boardvendor)
 +_export(sb_btcgpiowar)
@@ -1823,16 +1773,21 @@ diff -urN linux.old/arch/mips/bcm947xx/export.c linux.dev/arch/mips/bcm947xx/exp
 +_export(sb_coreflags)
 +_export(sb_coreflagshi)
 +_export(sb_coreidx)
++_export(sb_coreregs)
 +_export(sb_corerev)
 +_export(sb_coreunit)
 +_export(sb_detach)
 +_export(sb_deviceremoved)
++_export(sb_gpiosetcore)
 +_export(sb_gpiocontrol)
++_export(sb_gpiointmask)
++_export(sb_gpiointpolarity)
 +_export(sb_gpioled)
 +_export(sb_gpioin)
 +_export(sb_gpioout)
 +_export(sb_gpioouten)
 +_export(sb_gpiotimerval)
++_export(sb_irq)
 +_export(sb_iscoreup)
 +_export(sb_pci_setup)
 +_export(sb_pcirev)
@@ -1840,7 +1795,9 @@ diff -urN linux.old/arch/mips/bcm947xx/export.c linux.dev/arch/mips/bcm947xx/exp
 +_export(sb_pcmciarev)
 +_export(sb_register_intr_callback)
 +_export(sb_setcore)
++_export(sb_setcoreidx)
 +_export(sb_war16165)
++_export(sb_war32414_forceHT)
 +_export(sb_osh)
 +              
 +_export(getvar)
@@ -1858,28 +1815,10 @@ diff -urN linux.old/arch/mips/bcm947xx/export.c linux.dev/arch/mips/bcm947xx/exp
 +
 +_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
++++ linux.dev/arch/mips/bcm947xx/generic/int-handler.S 2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,51 @@
 +/*
 + * Generic interrupt handler for Broadcom MIPS boards
@@ -1934,7 +1873,7 @@ diff -urN linux.old/arch/mips/bcm947xx/generic/int-handler.S linux.dev/arch/mips
 +      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
++++ linux.dev/arch/mips/bcm947xx/generic/irq.c 2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,130 @@
 +/*
 + * Generic interrupt control functions for Broadcom MIPS boards
@@ -2066,9 +2005,25 @@ diff -urN linux.old/arch/mips/bcm947xx/generic/irq.c linux.dev/arch/mips/bcm947x
 +      breakpoint(); 
 +#endif
 +}
+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-10-02 21:26:29.000000000 +0200
+@@ -0,0 +1,12 @@
++#
++# Makefile for the BCM947xx specific kernel interface routines
++# under Linux.
++#
++EXTRA_CFLAGS += -fno-delayed-branch
++USE_STANDARD_AS_RULE := true
++
++O_TARGET        := brcm.o
++
++obj-y := int-handler.o irq.o
++
++include $(TOPDIR)/Rules.make
 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
++++ linux.dev/arch/mips/bcm947xx/gpio.c        2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,159 @@
 +/*
 + * GPIO char driver
@@ -2231,7 +2186,7 @@ diff -urN linux.old/arch/mips/bcm947xx/gpio.c linux.dev/arch/mips/bcm947xx/gpio.
 +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
++++ linux.dev/arch/mips/bcm947xx/hndchipc.c    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,158 @@
 +/*
 + * BCM47XX support code for some chipcommon (old extif) facilities (uart)
@@ -2393,7 +2348,7 @@ diff -urN linux.old/arch/mips/bcm947xx/hndchipc.c linux.dev/arch/mips/bcm947xx/h
 +
 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
++++ linux.dev/arch/mips/bcm947xx/include/bcm4710.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,91 @@
 +/*
 + * BCM4710 address space map and definitions
@@ -2488,7 +2443,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcm4710.h linux.dev/arch/mips/bcm
 +#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
++++ linux.dev/arch/mips/bcm947xx/include/bcmdefs.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,106 @@
 +/*
 + * Misc system wide definitions
@@ -2596,27 +2551,26 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdefs.h linux.dev/arch/mips/bcm
 +
 +
 +#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 @@
+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-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,391 @@
 +/*
 + * Broadcom device-specific manifest constants.
 + *
-+ * 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: bcmdevs.h,v 1.1.1.17 2006/04/15 01:29:08 michael Exp $
++ * 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$
 + */
 +
 +#ifndef       _BCMDEVS_H
 +#define       _BCMDEVS_H
 +
-+#include "bcm4710.h"
 +
 +/* Known PCI vendor Id's */
 +#define       VENDOR_EPIGRAM          0xfeda
@@ -2656,22 +2610,30 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +#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) */
 +
-+#define BCM47XX_SMBUS_EMU_ID  0x47fe          /* 47xx emulated SMBus device */
-+#define       BCM47XX_XOR_EMU_ID      0x47ff          /* 47xx emulated XOR engine */
-+
-+#define       BCM4710_CHIP_ID         0x4710          /* 4710 chipid returned by sb_chip() */
 +#define       BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
 +
-+#define       BCM4402_CHIP_ID         0x4402          /* 4402 chipid */
++#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 */
++
++#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 */
 +
-+#define       BCM4306_CHIP_ID         0x4306          /* 4306 chipcommon chipid */
++#define       BCM4301_DEVICE_ID       0x4301          /* 4301 primary function 0 */
++#define       BCM4301_D11B_ID         0x4301          /* 4301 802.11b */
++
++#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 */
++
++#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 */
@@ -2681,63 +2643,77 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +
 +#define       BCM4309_PKG_ID          1               /* 4309 package id */
 +
-+#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 */
-+
 +#define       BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
 +#define       BCM4303_PKG_ID          2               /* 4303 package id */
 +
++#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_CHIP_ID         0x4704          /* 4704 chipcommon chipid */
++
++#define       BCM4704_DEVICE_ID       0x4704          /* 4704 chipcommon chipid */
 +#define       BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
 +
-+#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 */
++#define       BCM4317_DEVICE_ID       0x4317          /* 4317 chip common chipid */
 +
-+#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 */
++#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 */
 +
-+#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 */
++#define FPGA_JTAGM_ID         0x4330          /* ??? */
 +
-+#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 */
++/* 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 */
 +
-+#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 */
++/* 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 BCM5365_CHIP_ID               0x5365          /* 5365 chipcommon chipid */
-+#define       BCM5350_CHIP_ID         0x5350          /* bcm5350 chipcommon chipid */
-+#define       BCM5352_CHIP_ID         0x5352          /* bcm5352 chipcommon chipid */
++#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       BCM4320_CHIP_ID         0x4320          /* bcm4320 chipcommon chipid */
++#define BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
 +
-+#define BCM4328_CHIP_ID               0x4328          /* bcm4328 chipcommon chipid */
++#define BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
 +
-+#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 */
++#define BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
++#define BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
 +
-+#define SDIOH_FPGA_ID         0x43f2          /* sdio host fpga */
-+#define SDIOD_FPGA_ID         0x43f4          /* sdio device fpga */
++#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 */
 +
-+#define MIMO_FPGA_ID          0x43f8          /* FPGA mimo minimacphy device id */
++#define       SDIOH_FPGA_ID           0x4380          /* sdio host fpga */
 +
-+#define BCM4785_CHIP_ID               0x4785          /* 4785 chipcommon chipid */
++#define BCM5365_DEVICE_ID       0x5365          /* 5365 chipcommon chipid */
++#define       BCM5350_DEVICE_ID       0x5350          /* bcm5350 chipcommon chipid */
++#define       BCM5352_DEVICE_ID       0x5352          /* bcm5352 chipcommon chipid */
++
++#define       BCM4320_DEVICE_ID       0x4320          /* bcm4320 chipcommon chipid */
 +
 +/* PCMCIA vendor Id's */
 +
@@ -2763,12 +2739,8 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +#define       BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
 +#define       BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
 +
-+/* 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 */
-+
 +/* 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 */
@@ -2779,6 +2751,20 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +#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 */
 +
++/* 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 */
++
++/* Allows optimization for single-bus support */
++#ifdef BCMBUSTYPE
++#define BUSTYPE(bus) (BCMBUSTYPE)
++#else
++#define BUSTYPE(bus) (bus)
++#endif
++
 +/* power control defines */
 +#define PLL_DELAY             150             /* us pll on delay */
 +#define FREF_DELAY            200             /* us fref change delay */
@@ -2791,6 +2777,16 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +#define       VSIM4710_BOARD          0x0401
 +#define       QT4710_BOARD            0x0402
 +
++#define       BU4610_BOARD            0x0403
++#define       VSIM4610_BOARD          0x0404
++
++#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
++
 +#define       BU4309_BOARD            0x040a
 +#define       BCM94309CB_BOARD        0x040b
 +#define       BCM94309MP_BOARD        0x040c
@@ -2798,6 +2794,12 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +
 +#define       BCM94302MP_BOARD        0x040e
 +
++#define       VSIM4310_BOARD          0x040f
++#define       BU4711_BOARD            0x0410
++#define       BCM94310U_BOARD         0x0411
++#define       BCM94310AP_BOARD        0x0412
++#define       BCM94310MP_BOARD        0x0414
++
 +#define       BU4306_BOARD            0x0416
 +#define       BCM94306CB_BOARD        0x0417
 +#define       BCM94306MP_BOARD        0x0418
@@ -2807,16 +2809,21 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +#define       BCM94710R4_BOARD        0x041c
 +#define       BCM94710AP_BOARD        0x041d
 +
++
 +#define       BU2050_BOARD            0x041f
 +
 +
 +#define       BCM94309G_BOARD         0x0421
 +
++#define       BCM94301PC3_BOARD       0x0422          /* Pcmcia 3.3v card */
++
 +#define       BU4704_BOARD            0x0423
 +#define       BU4702_BOARD            0x0424
 +
 +#define       BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
 +
++#define       BU4317_BOARD            0x0426
++
 +
 +#define       BCM94702MN_BOARD        0x0428
 +
@@ -2829,6 +2836,9 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +/* cb4306 with SiGe PA */
 +#define       BCM94306CBSG_BOARD      0x042b
 +
++/* mp4301 with 2050 radio */
++#define       BCM94301MPL_BOARD       0x042c
++
 +/* cb4306 with SiGe PA */
 +#define       PCSG94306_BOARD         0x042d
 +
@@ -2843,6 +2853,12 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +
 +
 +
++/* BCM94317 boards */
++#define BCM94317CB_BOARD      0x0440
++#define BCM94317MP_BOARD      0x0441
++#define BCM94317PCMCIA_BOARD  0x0442
++#define BCM94317SDIO_BOARD    0x0443
++
 +#define BU4712_BOARD          0x0444
 +#define       BU4712SD_BOARD          0x045d
 +#define       BU4712L_BOARD           0x045f
@@ -2860,11 +2876,15 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +
 +/* BCM63XX boards */
 +#define BCM96338_BOARD                0x6338
++#define BCM96345_BOARD                0x6345
 +#define BCM96348_BOARD                0x6348
 +
 +/* Another mp4306 with SiGe */
 +#define       BCM94306P_BOARD         0x044c
 +
++/* CF-like 4317 modules */
++#define       BCM94317CF_BOARD        0x044d
++
 +/* mp4303 */
 +#define       BCM94303MP_BOARD        0x044e
 +
@@ -2878,6 +2898,9 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +/* 4712agr */
 +#define       BCM94712AGR_BOARD       0x0451
 +
++/* The real CF 4317 board */
++#define       CFI4317_BOARD           0x0452
++
 +/* pcmcia 4303 */
 +#define       PC4303_BOARD            0x0454
 +
@@ -2913,82 +2936,37 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm
 +
 +#define       BCM94318MPGH_BOARD      0x0463
 +
-+#define       BU4311_BOARD            0x0464
-+#define       BCM94311MC_BOARD        0x0465
-+#define       BCM94311MCAG_BOARD      0x0466
 +
 +#define       BCM95352GR_BOARD        0x0467
 +
 +/* bcm95351agr */
 +#define       BCM95351AGR_BOARD       0x0470
 +
-+/* bcm94704mpcb */
-+#define       BCM94704MPCB_BOARD      0x0472
-+
-+/* 4785 boards */
-+#define BU4785_BOARD          0x0478
-+
-+/* 4321 boards */
-+#define BU4321_BOARD          0x046b
-+#define BU4321E_BOARD         0x047c
-+#define MP4321_BOARD          0x046c
-+#define CB2_4321_BOARD                0x046d
-+#define MC4321_BOARD          0x046e
-+
 +/* # of GPIO pins */
 +#define GPIO_NUMPINS          16
 +
-+/* radio ID codes */
-+#define       NORADIO_ID              0xe4f5
-+#define       NORADIO_IDCODE          0x4e4f5246
-+
-+#define       BCM2050_ID              0x2050
-+#define       BCM2050_IDCODE          0x02050000
-+#define       BCM2050A0_IDCODE        0x1205017f
-+#define       BCM2050A1_IDCODE        0x2205017f
-+#define       BCM2050R8_IDCODE        0x8205017f
-+
-+#define BCM2055_ID            0x2055
-+#define BCM2055_IDCODE                0x02055000
-+#define BCM2055A0_IDCODE      0x1205517f
-+
-+#define       BCM2060_ID              0x2060
-+#define       BCM2060_IDCODE          0x02060000
-+#define       BCM2060WW_IDCODE        0x1206017f
-+
-+#define BCM2062_ID            0x2062
-+#define BCM2062_IDCODE                0x02062000
-+#define BCM2062A0_IDCODE      0x0206217f
-+
-+/* 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 @@
+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-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,369 @@
 +/*
 + * 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$
++ * 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: bcmdevs.h,v 1.1.1.17 2006/04/15 01:29:08 michael Exp $
 + */
 +
 +#ifndef       _BCMDEVS_H
 +#define       _BCMDEVS_H
 +
++#include "bcm4710.h"
 +
 +/* Known PCI vendor Id's */
 +#define       VENDOR_EPIGRAM          0xfeda
@@ -3028,30 +3006,22 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +#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) */
 +
-+#define       BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
++#define BCM47XX_SMBUS_EMU_ID  0x47fe          /* 47xx emulated SMBus device */
++#define       BCM47XX_XOR_EMU_ID      0x47ff          /* 47xx emulated XOR engine */
 +
-+#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 */
++#define       BCM4710_CHIP_ID         0x4710          /* 4710 chipid returned by sb_chip() */
++#define       BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
 +
-+#define       BCM4402_DEVICE_ID       0x4402          /* 4402 primary function 0 */
++#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 */
 +
-+#define       BCM4301_DEVICE_ID       0x4301          /* 4301 primary function 0 */
-+#define       BCM4301_D11B_ID         0x4301          /* 4301 802.11b */
-+
-+#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 */
-+
-+#define       BCM4306_DEVICE_ID       0x4306          /* 4306 chipcommon chipid */
++#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 */
@@ -3061,77 +3031,63 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +
 +#define       BCM4309_PKG_ID          1               /* 4309 package id */
 +
++#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 */
++
 +#define       BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
 +#define       BCM4303_PKG_ID          2               /* 4303 package id */
 +
-+#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_CHIP_ID         0x4704          /* 4704 chipcommon chipid */
 +#define       BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
 +
-+#define       BCM4317_DEVICE_ID       0x4317          /* 4317 chip common chipid */
-+
-+#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 */
-+
-+#define FPGA_JTAGM_ID         0x4330          /* ??? */
-+
-+/* 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 */
-+
-+/* 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       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 */
 +
-+#define BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
++#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 */
 +
-+#define BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
++#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 */
 +
-+#define BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
-+#define BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
++#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       BCM4712_DEVICE_ID       0x4712          /* 4712 chipcommon chipid */
++#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 */
 +
-+#define       SDIOH_FPGA_ID           0x4380          /* sdio host fpga */
++#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 BCM5365_DEVICE_ID       0x5365          /* 5365 chipcommon chipid */
-+#define       BCM5350_DEVICE_ID       0x5350          /* bcm5350 chipcommon chipid */
-+#define       BCM5352_DEVICE_ID       0x5352          /* bcm5352 chipcommon chipid */
++#define       BCM4320_CHIP_ID         0x4320          /* bcm4320 chipcommon chipid */
 +
-+#define       BCM4320_DEVICE_ID       0x4320          /* bcm4320 chipcommon chipid */
++#define BCM4328_CHIP_ID               0x4328          /* bcm4328 chipcommon chipid */
++
++#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 */
++
++#define SDIOH_FPGA_ID         0x43f2          /* sdio host fpga */
++#define SDIOD_FPGA_ID         0x43f4          /* sdio device fpga */
++
++#define MIMO_FPGA_ID          0x43f8          /* FPGA mimo minimacphy device id */
++
++#define BCM4785_CHIP_ID               0x4785          /* 4785 chipcommon chipid */
 +
 +/* PCMCIA vendor Id's */
 +
@@ -3157,8 +3113,12 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +#define       BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
 +#define       BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
 +
++/* 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 */
++
 +/* 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 */
@@ -3169,20 +3129,6 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +#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 */
 +
-+/* 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 */
-+
-+/* Allows optimization for single-bus support */
-+#ifdef BCMBUSTYPE
-+#define BUSTYPE(bus) (BCMBUSTYPE)
-+#else
-+#define BUSTYPE(bus) (bus)
-+#endif
-+
 +/* power control defines */
 +#define PLL_DELAY             150             /* us pll on delay */
 +#define FREF_DELAY            200             /* us fref change delay */
@@ -3195,16 +3141,6 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +#define       VSIM4710_BOARD          0x0401
 +#define       QT4710_BOARD            0x0402
 +
-+#define       BU4610_BOARD            0x0403
-+#define       VSIM4610_BOARD          0x0404
-+
-+#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
-+
 +#define       BU4309_BOARD            0x040a
 +#define       BCM94309CB_BOARD        0x040b
 +#define       BCM94309MP_BOARD        0x040c
@@ -3212,12 +3148,6 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +
 +#define       BCM94302MP_BOARD        0x040e
 +
-+#define       VSIM4310_BOARD          0x040f
-+#define       BU4711_BOARD            0x0410
-+#define       BCM94310U_BOARD         0x0411
-+#define       BCM94310AP_BOARD        0x0412
-+#define       BCM94310MP_BOARD        0x0414
-+
 +#define       BU4306_BOARD            0x0416
 +#define       BCM94306CB_BOARD        0x0417
 +#define       BCM94306MP_BOARD        0x0418
@@ -3227,21 +3157,16 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +#define       BCM94710R4_BOARD        0x041c
 +#define       BCM94710AP_BOARD        0x041d
 +
-+
 +#define       BU2050_BOARD            0x041f
 +
 +
 +#define       BCM94309G_BOARD         0x0421
 +
-+#define       BCM94301PC3_BOARD       0x0422          /* Pcmcia 3.3v card */
-+
 +#define       BU4704_BOARD            0x0423
 +#define       BU4702_BOARD            0x0424
 +
 +#define       BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
 +
-+#define       BU4317_BOARD            0x0426
-+
 +
 +#define       BCM94702MN_BOARD        0x0428
 +
@@ -3254,9 +3179,6 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +/* cb4306 with SiGe PA */
 +#define       BCM94306CBSG_BOARD      0x042b
 +
-+/* mp4301 with 2050 radio */
-+#define       BCM94301MPL_BOARD       0x042c
-+
 +/* cb4306 with SiGe PA */
 +#define       PCSG94306_BOARD         0x042d
 +
@@ -3271,12 +3193,6 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +
 +
 +
-+/* BCM94317 boards */
-+#define BCM94317CB_BOARD      0x0440
-+#define BCM94317MP_BOARD      0x0441
-+#define BCM94317PCMCIA_BOARD  0x0442
-+#define BCM94317SDIO_BOARD    0x0443
-+
 +#define BU4712_BOARD          0x0444
 +#define       BU4712SD_BOARD          0x045d
 +#define       BU4712L_BOARD           0x045f
@@ -3294,15 +3210,11 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +
 +/* BCM63XX boards */
 +#define BCM96338_BOARD                0x6338
-+#define BCM96345_BOARD                0x6345
 +#define BCM96348_BOARD                0x6348
 +
 +/* Another mp4306 with SiGe */
 +#define       BCM94306P_BOARD         0x044c
 +
-+/* CF-like 4317 modules */
-+#define       BCM94317CF_BOARD        0x044d
-+
 +/* mp4303 */
 +#define       BCM94303MP_BOARD        0x044e
 +
@@ -3316,9 +3228,6 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +/* 4712agr */
 +#define       BCM94712AGR_BOARD       0x0451
 +
-+/* The real CF 4317 board */
-+#define       CFI4317_BOARD           0x0452
-+
 +/* pcmcia 4303 */
 +#define       PC4303_BOARD            0x0454
 +
@@ -3354,19 +3263,65 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmdevs1.h linux.dev/arch/mips/bc
 +
 +#define       BCM94318MPGH_BOARD      0x0463
 +
++#define       BU4311_BOARD            0x0464
++#define       BCM94311MC_BOARD        0x0465
++#define       BCM94311MCAG_BOARD      0x0466
 +
 +#define       BCM95352GR_BOARD        0x0467
 +
 +/* bcm95351agr */
 +#define       BCM95351AGR_BOARD       0x0470
 +
++/* bcm94704mpcb */
++#define       BCM94704MPCB_BOARD      0x0472
++
++/* 4785 boards */
++#define BU4785_BOARD          0x0478
++
++/* 4321 boards */
++#define BU4321_BOARD          0x046b
++#define BU4321E_BOARD         0x047c
++#define MP4321_BOARD          0x046c
++#define CB2_4321_BOARD                0x046d
++#define MC4321_BOARD          0x046e
++
 +/* # of GPIO pins */
 +#define GPIO_NUMPINS          16
 +
++/* radio ID codes */
++#define       NORADIO_ID              0xe4f5
++#define       NORADIO_IDCODE          0x4e4f5246
++
++#define       BCM2050_ID              0x2050
++#define       BCM2050_IDCODE          0x02050000
++#define       BCM2050A0_IDCODE        0x1205017f
++#define       BCM2050A1_IDCODE        0x2205017f
++#define       BCM2050R8_IDCODE        0x8205017f
++
++#define BCM2055_ID            0x2055
++#define BCM2055_IDCODE                0x02055000
++#define BCM2055A0_IDCODE      0x1205517f
++
++#define       BCM2060_ID              0x2060
++#define       BCM2060_IDCODE          0x02060000
++#define       BCM2060WW_IDCODE        0x1206017f
++
++#define BCM2062_ID            0x2062
++#define BCM2062_IDCODE                0x02062000
++#define BCM2062A0_IDCODE      0x0206217f
++
++/* 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/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
++++ linux.dev/arch/mips/bcm947xx/include/bcmendian.h   2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,198 @@
 +/*
 + * local version of endian.h - byte order defines
@@ -3568,7 +3523,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmendian.h linux.dev/arch/mips/b
 +#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
++++ linux.dev/arch/mips/bcm947xx/include/bcmnvram.h    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,159 @@
 +/*
 + * NVRAM variable manipulation
@@ -3731,7 +3686,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmnvram.h linux.dev/arch/mips/bc
 +#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
++++ linux.dev/arch/mips/bcm947xx/include/bcmsrom.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,108 @@
 +/*
 + * Misc useful routines to access NIC local SROM/OTP .
@@ -3843,7 +3798,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmsrom.h linux.dev/arch/mips/bcm
 +#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
++++ linux.dev/arch/mips/bcm947xx/include/bcmutils.h    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,433 @@
 +/*
 + * Misc useful os-independent macros and functions.
@@ -4280,7 +4235,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/bcmutils.h linux.dev/arch/mips/bc
 +#endif        /* _bcmutils_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/hndcpu.h linux.dev/arch/mips/bcm947xx/include/hndcpu.h
 --- linux.old/arch/mips/bcm947xx/include/hndcpu.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/hndcpu.h      2006-04-27 22:14:38.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/hndcpu.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,28 @@
 +/*
 + * HND SiliconBackplane MIPS/ARM cores software interface.
@@ -4312,7 +4267,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/hndcpu.h linux.dev/arch/mips/bcm9
 +#endif /* _hndcpu_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/hndmips.h linux.dev/arch/mips/bcm947xx/include/hndmips.h
 --- linux.old/arch/mips/bcm947xx/include/hndmips.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/hndmips.h     2006-04-27 20:43:42.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/hndmips.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,45 @@
 +/*
 + * HND SiliconBackplane MIPS core software interface.
@@ -4361,7 +4316,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/hndmips.h linux.dev/arch/mips/bcm
 +#endif /* _hndmips_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/hndpci.h linux.dev/arch/mips/bcm947xx/include/hndpci.h
 --- linux.old/arch/mips/bcm947xx/include/hndpci.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/hndpci.h      2006-04-27 20:36:48.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/hndpci.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,30 @@
 +/*
 + * HND SiliconBackplane PCI core software interface.
@@ -4395,7 +4350,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/hndpci.h linux.dev/arch/mips/bcm9
 +#endif /* _hndpci_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/linuxver.h linux.dev/arch/mips/bcm947xx/include/linuxver.h
 --- linux.old/arch/mips/bcm947xx/include/linuxver.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/linuxver.h    2006-04-27 20:10:08.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/linuxver.h    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,417 @@
 +/*
 + * Linux-specific abstractions to gain some independence from linux kernel versions.
@@ -4816,7 +4771,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/linuxver.h linux.dev/arch/mips/bc
 +#endif /* _linuxver_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/mipsinc.h linux.dev/arch/mips/bcm947xx/include/mipsinc.h
 --- linux.old/arch/mips/bcm947xx/include/mipsinc.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/mipsinc.h     2006-04-27 22:12:20.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/mipsinc.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,541 @@
 +/*
 + * HND Run Time Environment for standalone MIPS programs.
@@ -5361,8 +5316,8 @@ diff -urN linux.old/arch/mips/bcm947xx/include/mipsinc.h linux.dev/arch/mips/bcm
 +#endif        /* _MISPINC_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/osl.h linux.dev/arch/mips/bcm947xx/include/osl.h
 --- linux.old/arch/mips/bcm947xx/include/osl.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/osl.h 2006-05-02 17:40:43.000000000 +0200
-@@ -0,0 +1,179 @@
++++ linux.dev/arch/mips/bcm947xx/include/osl.h 2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,181 @@
 +#ifndef __osl_h
 +#define __osl_h
 +
@@ -5375,13 +5330,15 @@ diff -urN linux.old/arch/mips/bcm947xx/include/osl.h linux.dev/arch/mips/bcm947x
 +#define ASSERT(n)
 +
 +/* Pkttag flag should be part of public information */
-+struct osl_pubinfo {
++typedef struct {
 +      bool pkttag;
 +      uint pktalloced; /* Number of allocated packet buffers */
-+};
++      void *tx_fn;
++      void *tx_ctx;
++} osl_pubinfo_t;
 +
 +struct osl_info {
-+      struct osl_pubinfo pub;
++      osl_pubinfo_t pub;
 +      uint magic;
 +      void *pdev;
 +      uint malloced;
@@ -5544,7 +5501,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/osl.h linux.dev/arch/mips/bcm947x
 +#endif
 diff -urN linux.old/arch/mips/bcm947xx/include/pcicfg.h linux.dev/arch/mips/bcm947xx/include/pcicfg.h
 --- linux.old/arch/mips/bcm947xx/include/pcicfg.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/pcicfg.h      2006-04-27 20:31:41.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/pcicfg.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,495 @@
 +/*
 + * pcicfg.h: PCI configuration constants and structures.
@@ -6043,7 +6000,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/pcicfg.h linux.dev/arch/mips/bcm9
 +#endif        /* _h_pcicfg_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbchipc.h linux.dev/arch/mips/bcm947xx/include/sbchipc.h
 --- linux.old/arch/mips/bcm947xx/include/sbchipc.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbchipc.h     2006-04-27 22:11:01.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbchipc.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,516 @@
 +/*
 + * SiliconBackplane Chipcommon core hardware definitions.
@@ -6563,7 +6520,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbchipc.h linux.dev/arch/mips/bcm
 +#endif        /* _SBCHIPC_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbconfig.h linux.dev/arch/mips/bcm947xx/include/sbconfig.h
 --- linux.old/arch/mips/bcm947xx/include/sbconfig.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbconfig.h    2006-04-27 22:14:11.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbconfig.h    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,369 @@
 +/*
 + * Broadcom SiliconBackplane hardware register definitions.
@@ -6936,7 +6893,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbconfig.h linux.dev/arch/mips/bc
 +#endif        /* _SBCONFIG_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbextif.h linux.dev/arch/mips/bcm947xx/include/sbextif.h
 --- linux.old/arch/mips/bcm947xx/include/sbextif.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbextif.h     2006-04-27 22:13:03.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbextif.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,243 @@
 +/*
 + * Hardware-specific External Interface I/O core definitions
@@ -7183,7 +7140,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbextif.h linux.dev/arch/mips/bcm
 +#endif        /* _SBEXTIF_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbhndmips.h linux.dev/arch/mips/bcm947xx/include/sbhndmips.h
 --- linux.old/arch/mips/bcm947xx/include/sbhndmips.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbhndmips.h   2006-04-27 20:43:56.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbhndmips.h   2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,47 @@
 +/*
 + * Broadcom SiliconBackplane MIPS definitions
@@ -7234,7 +7191,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbhndmips.h linux.dev/arch/mips/b
 +#endif        /* _sbhndmips_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbmemc.h linux.dev/arch/mips/bcm947xx/include/sbmemc.h
 --- linux.old/arch/mips/bcm947xx/include/sbmemc.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbmemc.h      2006-04-27 22:12:41.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbmemc.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,147 @@
 +/*
 + * BCM47XX Sonics SiliconBackplane DDR/SDRAM controller core hardware definitions.
@@ -7383,127 +7340,9 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbmemc.h linux.dev/arch/mips/bcm9
 +#define MEMC_CONFIG_DDR               0x00000001
 +
 +#endif        /* _SBMEMC_H */
-diff -urN linux.old/arch/mips/bcm947xx/include/sbpci.h linux.dev/arch/mips/bcm947xx/include/sbpci.h
---- linux.old/arch/mips/bcm947xx/include/sbpci.h       1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbpci.h       2006-05-02 17:20:14.000000000 +0200
-@@ -0,0 +1,114 @@
-+/*
-+ * HND SiliconBackplane PCI core hardware definitions.
-+ *
-+ * 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: sbpci.h,v 1.1.1.11 2006/02/27 03:43:16 honor Exp $
-+ */
-+
-+#ifndef       _sbpci_h_
-+#define       _sbpci_h_
-+
-+#ifndef _LANGUAGE_ASSEMBLY
-+
-+/* cpp contortions to concatenate w/arg prescan */
-+#ifndef PAD
-+#define       _PADLINE(line)  pad ## line
-+#define       _XSTR(line)     _PADLINE(line)
-+#define       PAD             _XSTR(__LINE__)
-+#endif
-+
-+/* Sonics side: PCI core and host control registers */
-+typedef struct sbpciregs {
-+      uint32 control;         /* PCI control */
-+      uint32 PAD[3];
-+      uint32 arbcontrol;      /* PCI arbiter control */
-+      uint32 PAD[3];
-+      uint32 intstatus;       /* Interrupt status */
-+      uint32 intmask;         /* Interrupt mask */
-+      uint32 sbtopcimailbox;  /* Sonics to PCI mailbox */
-+      uint32 PAD[9];
-+      uint32 bcastaddr;       /* Sonics broadcast address */
-+      uint32 bcastdata;       /* Sonics broadcast data */
-+      uint32 PAD[2];
-+      uint32 gpioin;          /* ro: gpio input (>=rev2) */
-+      uint32 gpioout;         /* rw: gpio output (>=rev2) */
-+      uint32 gpioouten;       /* rw: gpio output enable (>= rev2) */
-+      uint32 gpiocontrol;     /* rw: gpio control (>= rev2) */
-+      uint32 PAD[36];
-+      uint32 sbtopci0;        /* Sonics to PCI translation 0 */
-+      uint32 sbtopci1;        /* Sonics to PCI translation 1 */
-+      uint32 sbtopci2;        /* Sonics to PCI translation 2 */
-+      uint32 PAD[189];
-+      uint32 pcicfg[4][64];   /* 0x400 - 0x7FF, PCI Cfg Space (>=rev8) */
-+      uint16 sprom[36];       /* SPROM shadow Area */
-+      uint32 PAD[46];
-+} sbpciregs_t;
-+
-+#endif        /* _LANGUAGE_ASSEMBLY */
-+
-+/* PCI control */
-+#define PCI_RST_OE    0x01    /* When set, drives PCI_RESET out to pin */
-+#define PCI_RST               0x02    /* Value driven out to pin */
-+#define PCI_CLK_OE    0x04    /* When set, drives clock as gated by PCI_CLK out to pin */
-+#define PCI_CLK               0x08    /* Gate for clock driven out to pin */
-+
-+/* PCI arbiter control */
-+#define PCI_INT_ARB   0x01    /* When set, use an internal arbiter */
-+#define PCI_EXT_ARB   0x02    /* When set, use an external arbiter */
-+/* ParkID - for PCI corerev >= 8 */
-+#define PCI_PARKID_MASK               0x1c    /* Selects which agent is parked on an idle bus */
-+#define PCI_PARKID_SHIFT      2
-+#define PCI_PARKID_EXT0               0       /* External master 0 */
-+#define PCI_PARKID_EXT1               1       /* External master 1 */
-+#define PCI_PARKID_EXT2               2       /* External master 2 */
-+#define PCI_PARKID_INT                3       /* Internal master */
-+#define PCI_PARKID_LAST               4       /* Last active master */
-+
-+/* Interrupt status/mask */
-+#define PCI_INTA      0x01    /* PCI INTA# is asserted */
-+#define PCI_INTB      0x02    /* PCI INTB# is asserted */
-+#define PCI_SERR      0x04    /* PCI SERR# has been asserted (write one to clear) */
-+#define PCI_PERR      0x08    /* PCI PERR# has been asserted (write one to clear) */
-+#define PCI_PME               0x10    /* PCI PME# is asserted */
-+
-+/* (General) PCI/SB mailbox interrupts, two bits per pci function */
-+#define       MAILBOX_F0_0    0x100   /* function 0, int 0 */
-+#define       MAILBOX_F0_1    0x200   /* function 0, int 1 */
-+#define       MAILBOX_F1_0    0x400   /* function 1, int 0 */
-+#define       MAILBOX_F1_1    0x800   /* function 1, int 1 */
-+#define       MAILBOX_F2_0    0x1000  /* function 2, int 0 */
-+#define       MAILBOX_F2_1    0x2000  /* function 2, int 1 */
-+#define       MAILBOX_F3_0    0x4000  /* function 3, int 0 */
-+#define       MAILBOX_F3_1    0x8000  /* function 3, int 1 */
-+
-+/* Sonics broadcast address */
-+#define BCAST_ADDR_MASK       0xff    /* Broadcast register address */
-+
-+/* Sonics to PCI translation types */
-+#define SBTOPCI0_MASK 0xfc000000
-+#define SBTOPCI1_MASK 0xfc000000
-+#define SBTOPCI2_MASK 0xc0000000
-+#define SBTOPCI_MEM   0
-+#define SBTOPCI_IO    1
-+#define SBTOPCI_CFG0  2
-+#define SBTOPCI_CFG1  3
-+#define       SBTOPCI_PREF    0x4             /* prefetch enable */
-+#define       SBTOPCI_BURST   0x8             /* burst enable */
-+#define       SBTOPCI_RC_MASK         0x30    /* read command (>= rev11) */
-+#define       SBTOPCI_RC_READ         0x00    /* memory read */
-+#define       SBTOPCI_RC_READLINE     0x10    /* memory read line */
-+#define       SBTOPCI_RC_READMULTI    0x20    /* memory read multiple */
-+
-+/* PCI core index in SROM shadow area */
-+#define SRSH_PI_OFFSET        0       /* first word */
-+#define SRSH_PI_MASK  0xf000  /* bit 15:12 */
-+#define SRSH_PI_SHIFT 12      /* bit 15:12 */
-+
-+#endif        /* _sbpci_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbpcie.h linux.dev/arch/mips/bcm947xx/include/sbpcie.h
 --- linux.old/arch/mips/bcm947xx/include/sbpcie.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbpcie.h      2006-04-27 20:42:22.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbpcie.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,200 @@
 +/*
 + * BCM43XX SiliconBackplane PCIE core hardware definitions.
@@ -7705,12 +7544,12 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbpcie.h linux.dev/arch/mips/bcm9
 +#define SERDES_RX_CDRBW                       7       /* CDR BW */
 +
 +#endif        /* _SBPCIE_H */
-diff -urN linux.old/arch/mips/bcm947xx/include/sbpcmcia.h linux.dev/arch/mips/bcm947xx/include/sbpcmcia.h
---- linux.old/arch/mips/bcm947xx/include/sbpcmcia.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbpcmcia.h    2006-04-27 20:29:47.000000000 +0200
-@@ -0,0 +1,147 @@
+diff -urN linux.old/arch/mips/bcm947xx/include/sbpci.h linux.dev/arch/mips/bcm947xx/include/sbpci.h
+--- linux.old/arch/mips/bcm947xx/include/sbpci.h       1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/sbpci.h       2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,114 @@
 +/*
-+ * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions.
++ * HND SiliconBackplane PCI core hardware definitions.
 + *
 + * Copyright 2006, Broadcom Corporation
 + * All Rights Reserved.
@@ -7720,41 +7559,159 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbpcmcia.h linux.dev/arch/mips/bc
 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
 + *
-+ * $Id: sbpcmcia.h,v 1.1.1.9 2006/02/27 03:43:16 honor Exp $
++ * $Id: sbpci.h,v 1.1.1.11 2006/02/27 03:43:16 honor Exp $
 + */
 +
-+#ifndef       _SBPCMCIA_H
-+#define       _SBPCMCIA_H
-+
++#ifndef       _sbpci_h_
++#define       _sbpci_h_
 +
-+/* All the addresses that are offsets in attribute space are divided
-+ * by two to account for the fact that odd bytes are invalid in
-+ * attribute space and our read/write routines make the space appear
-+ * as if they didn't exist. Still we want to show the original numbers
-+ * as documented in the hnd_pcmcia core manual.
-+ */
++#ifndef _LANGUAGE_ASSEMBLY
 +
-+/* PCMCIA Function Configuration Registers */
-+#define       PCMCIA_FCR              (0x700 / 2)
++/* cpp contortions to concatenate w/arg prescan */
++#ifndef PAD
++#define       _PADLINE(line)  pad ## line
++#define       _XSTR(line)     _PADLINE(line)
++#define       PAD             _XSTR(__LINE__)
++#endif
 +
-+#define       FCR0_OFF                0
-+#define       FCR1_OFF                (0x40 / 2)
-+#define       FCR2_OFF                (0x80 / 2)
-+#define       FCR3_OFF                (0xc0 / 2)
++/* Sonics side: PCI core and host control registers */
++typedef struct sbpciregs {
++      uint32 control;         /* PCI control */
++      uint32 PAD[3];
++      uint32 arbcontrol;      /* PCI arbiter control */
++      uint32 PAD[3];
++      uint32 intstatus;       /* Interrupt status */
++      uint32 intmask;         /* Interrupt mask */
++      uint32 sbtopcimailbox;  /* Sonics to PCI mailbox */
++      uint32 PAD[9];
++      uint32 bcastaddr;       /* Sonics broadcast address */
++      uint32 bcastdata;       /* Sonics broadcast data */
++      uint32 PAD[2];
++      uint32 gpioin;          /* ro: gpio input (>=rev2) */
++      uint32 gpioout;         /* rw: gpio output (>=rev2) */
++      uint32 gpioouten;       /* rw: gpio output enable (>= rev2) */
++      uint32 gpiocontrol;     /* rw: gpio control (>= rev2) */
++      uint32 PAD[36];
++      uint32 sbtopci0;        /* Sonics to PCI translation 0 */
++      uint32 sbtopci1;        /* Sonics to PCI translation 1 */
++      uint32 sbtopci2;        /* Sonics to PCI translation 2 */
++      uint32 PAD[189];
++      uint32 pcicfg[4][64];   /* 0x400 - 0x7FF, PCI Cfg Space (>=rev8) */
++      uint16 sprom[36];       /* SPROM shadow Area */
++      uint32 PAD[46];
++} sbpciregs_t;
 +
-+#define       PCMCIA_FCR0             (0x700 / 2)
-+#define       PCMCIA_FCR1             (0x740 / 2)
-+#define       PCMCIA_FCR2             (0x780 / 2)
-+#define       PCMCIA_FCR3             (0x7c0 / 2)
++#endif        /* _LANGUAGE_ASSEMBLY */
 +
-+/* Standard PCMCIA FCR registers */
++/* PCI control */
++#define PCI_RST_OE    0x01    /* When set, drives PCI_RESET out to pin */
++#define PCI_RST               0x02    /* Value driven out to pin */
++#define PCI_CLK_OE    0x04    /* When set, drives clock as gated by PCI_CLK out to pin */
++#define PCI_CLK               0x08    /* Gate for clock driven out to pin */
 +
-+#define       PCMCIA_COR              0
++/* PCI arbiter control */
++#define PCI_INT_ARB   0x01    /* When set, use an internal arbiter */
++#define PCI_EXT_ARB   0x02    /* When set, use an external arbiter */
++/* ParkID - for PCI corerev >= 8 */
++#define PCI_PARKID_MASK               0x1c    /* Selects which agent is parked on an idle bus */
++#define PCI_PARKID_SHIFT      2
++#define PCI_PARKID_EXT0               0       /* External master 0 */
++#define PCI_PARKID_EXT1               1       /* External master 1 */
++#define PCI_PARKID_EXT2               2       /* External master 2 */
++#define PCI_PARKID_INT                3       /* Internal master */
++#define PCI_PARKID_LAST               4       /* Last active master */
 +
-+#define       COR_RST                 0x80
-+#define       COR_LEV                 0x40
-+#define       COR_IRQEN               0x04
-+#define       COR_BLREN               0x01
++/* Interrupt status/mask */
++#define PCI_INTA      0x01    /* PCI INTA# is asserted */
++#define PCI_INTB      0x02    /* PCI INTB# is asserted */
++#define PCI_SERR      0x04    /* PCI SERR# has been asserted (write one to clear) */
++#define PCI_PERR      0x08    /* PCI PERR# has been asserted (write one to clear) */
++#define PCI_PME               0x10    /* PCI PME# is asserted */
++
++/* (General) PCI/SB mailbox interrupts, two bits per pci function */
++#define       MAILBOX_F0_0    0x100   /* function 0, int 0 */
++#define       MAILBOX_F0_1    0x200   /* function 0, int 1 */
++#define       MAILBOX_F1_0    0x400   /* function 1, int 0 */
++#define       MAILBOX_F1_1    0x800   /* function 1, int 1 */
++#define       MAILBOX_F2_0    0x1000  /* function 2, int 0 */
++#define       MAILBOX_F2_1    0x2000  /* function 2, int 1 */
++#define       MAILBOX_F3_0    0x4000  /* function 3, int 0 */
++#define       MAILBOX_F3_1    0x8000  /* function 3, int 1 */
++
++/* Sonics broadcast address */
++#define BCAST_ADDR_MASK       0xff    /* Broadcast register address */
++
++/* Sonics to PCI translation types */
++#define SBTOPCI0_MASK 0xfc000000
++#define SBTOPCI1_MASK 0xfc000000
++#define SBTOPCI2_MASK 0xc0000000
++#define SBTOPCI_MEM   0
++#define SBTOPCI_IO    1
++#define SBTOPCI_CFG0  2
++#define SBTOPCI_CFG1  3
++#define       SBTOPCI_PREF    0x4             /* prefetch enable */
++#define       SBTOPCI_BURST   0x8             /* burst enable */
++#define       SBTOPCI_RC_MASK         0x30    /* read command (>= rev11) */
++#define       SBTOPCI_RC_READ         0x00    /* memory read */
++#define       SBTOPCI_RC_READLINE     0x10    /* memory read line */
++#define       SBTOPCI_RC_READMULTI    0x20    /* memory read multiple */
++
++/* PCI core index in SROM shadow area */
++#define SRSH_PI_OFFSET        0       /* first word */
++#define SRSH_PI_MASK  0xf000  /* bit 15:12 */
++#define SRSH_PI_SHIFT 12      /* bit 15:12 */
++
++#endif        /* _sbpci_h_ */
+diff -urN linux.old/arch/mips/bcm947xx/include/sbpcmcia.h linux.dev/arch/mips/bcm947xx/include/sbpcmcia.h
+--- linux.old/arch/mips/bcm947xx/include/sbpcmcia.h    1970-01-01 01:00:00.000000000 +0100
++++ linux.dev/arch/mips/bcm947xx/include/sbpcmcia.h    2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,147 @@
++/*
++ * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions.
++ *
++ * 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: sbpcmcia.h,v 1.1.1.9 2006/02/27 03:43:16 honor Exp $
++ */
++
++#ifndef       _SBPCMCIA_H
++#define       _SBPCMCIA_H
++
++
++/* All the addresses that are offsets in attribute space are divided
++ * by two to account for the fact that odd bytes are invalid in
++ * attribute space and our read/write routines make the space appear
++ * as if they didn't exist. Still we want to show the original numbers
++ * as documented in the hnd_pcmcia core manual.
++ */
++
++/* PCMCIA Function Configuration Registers */
++#define       PCMCIA_FCR              (0x700 / 2)
++
++#define       FCR0_OFF                0
++#define       FCR1_OFF                (0x40 / 2)
++#define       FCR2_OFF                (0x80 / 2)
++#define       FCR3_OFF                (0xc0 / 2)
++
++#define       PCMCIA_FCR0             (0x700 / 2)
++#define       PCMCIA_FCR1             (0x740 / 2)
++#define       PCMCIA_FCR2             (0x780 / 2)
++#define       PCMCIA_FCR3             (0x7c0 / 2)
++
++/* Standard PCMCIA FCR registers */
++
++#define       PCMCIA_COR              0
++
++#define       COR_RST                 0x80
++#define       COR_LEV                 0x40
++#define       COR_IRQEN               0x04
++#define       COR_BLREN               0x01
 +#define       COR_FUNEN               0x01
 +
 +
@@ -7858,7 +7815,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbpcmcia.h linux.dev/arch/mips/bc
 +#endif        /* _SBPCMCIA_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbsdram.h linux.dev/arch/mips/bcm947xx/include/sbsdram.h
 --- linux.old/arch/mips/bcm947xx/include/sbsdram.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbsdram.h     2006-04-27 20:36:08.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbsdram.h     2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,85 @@
 +/*
 + * BCM47XX Sonics SiliconBackplane SDRAM controller core hardware definitions.
@@ -7947,7 +7904,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbsdram.h linux.dev/arch/mips/bcm
 +#endif        /* _SBSDRAM_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbsocram.h linux.dev/arch/mips/bcm947xx/include/sbsocram.h
 --- linux.old/arch/mips/bcm947xx/include/sbsocram.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbsocram.h    2006-04-27 22:13:19.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sbsocram.h    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,64 @@
 +/*
 + * BCM47XX Sonics SiliconBackplane embedded ram core
@@ -8015,8 +7972,8 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbsocram.h linux.dev/arch/mips/bc
 +#endif        /* _SBSOCRAM_H */
 diff -urN linux.old/arch/mips/bcm947xx/include/sbutils.h linux.dev/arch/mips/bcm947xx/include/sbutils.h
 --- linux.old/arch/mips/bcm947xx/include/sbutils.h     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sbutils.h     2006-04-27 23:09:25.000000000 +0200
-@@ -0,0 +1,150 @@
++++ linux.dev/arch/mips/bcm947xx/include/sbutils.h     2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,151 @@
 +/*
 + * Misc utility routines for accessing chip-specific features
 + * of Broadcom HNBU SiliconBackplane-based chips.
@@ -8162,6 +8119,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbutils.h linux.dev/arch/mips/bcm
 +/* GPIO usage priorities */
 +#define GPIO_DRV_PRIORITY     0               /* Driver */
 +#define GPIO_APP_PRIORITY     1               /* Application */
++#define GPIO_HI_PRIORITY   2          /* Highest priority. Ignore GPIO reservation */
 +
 +/* device path */
 +#define SB_DEVPATH_BUFSZ      16              /* min buffer size in bytes */
@@ -8169,7 +8127,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sbutils.h linux.dev/arch/mips/bcm
 +#endif        /* _sbutils_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/sflash.h linux.dev/arch/mips/bcm947xx/include/sflash.h
 --- linux.old/arch/mips/bcm947xx/include/sflash.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/sflash.h      2006-04-27 22:13:51.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/sflash.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,36 @@
 +/*
 + * Broadcom SiliconBackplane chipcommon serial flash interface
@@ -8209,7 +8167,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/sflash.h linux.dev/arch/mips/bcm9
 +#endif /* _sflash_h_ */
 diff -urN linux.old/arch/mips/bcm947xx/include/trxhdr.h linux.dev/arch/mips/bcm947xx/include/trxhdr.h
 --- linux.old/arch/mips/bcm947xx/include/trxhdr.h      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/trxhdr.h      2006-04-27 19:24:19.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/trxhdr.h      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,33 @@
 +/*
 + * TRX image file header format.
@@ -8246,7 +8204,7 @@ diff -urN linux.old/arch/mips/bcm947xx/include/trxhdr.h linux.dev/arch/mips/bcm9
 +typedef struct trx_header TRXHDR, *PTRXHDR;
 diff -urN linux.old/arch/mips/bcm947xx/include/typedefs.h linux.dev/arch/mips/bcm947xx/include/typedefs.h
 --- linux.old/arch/mips/bcm947xx/include/typedefs.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/include/typedefs.h    2006-04-27 23:47:30.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/include/typedefs.h    2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,361 @@
 +/*
 + * Copyright 2006, Broadcom Corporation
@@ -8609,9 +8567,30 @@ diff -urN linux.old/arch/mips/bcm947xx/include/typedefs.h linux.dev/arch/mips/bc
 +#include "bcmdefs.h"
 +
 +#endif /* _TYPEDEFS_H_ */
+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-10-02 21:26:08.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 -fno-delayed-branch
++
++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/nvram.c linux.dev/arch/mips/bcm947xx/nvram.c
 --- linux.old/arch/mips/bcm947xx/nvram.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/nvram.c       2006-04-27 23:11:58.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/nvram.c       2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,315 @@
 +/*
 + * NVRAM variable manipulation (common)
@@ -8930,7 +8909,7 @@ diff -urN linux.old/arch/mips/bcm947xx/nvram.c linux.dev/arch/mips/bcm947xx/nvra
 +}
 diff -urN linux.old/arch/mips/bcm947xx/nvram_linux.c linux.dev/arch/mips/bcm947xx/nvram_linux.c
 --- linux.old/arch/mips/bcm947xx/nvram_linux.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/nvram_linux.c 2006-04-27 23:30:07.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/nvram_linux.c 2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,723 @@
 +/*
 + * NVRAM variable manipulation (Linux kernel half)
@@ -9657,7 +9636,7 @@ diff -urN linux.old/arch/mips/bcm947xx/nvram_linux.c linux.dev/arch/mips/bcm947x
 +module_exit(dev_nvram_exit);
 diff -urN linux.old/arch/mips/bcm947xx/pcibios.c linux.dev/arch/mips/bcm947xx/pcibios.c
 --- linux.old/arch/mips/bcm947xx/pcibios.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/pcibios.c     2006-04-27 23:42:50.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/pcibios.c     2006-10-02 21:22:56.000000000 +0200
 @@ -0,0 +1,380 @@
 +/*
 + * Low-Level PCI and SB support for BCM47xx (Linux support code)
@@ -10041,7 +10020,7 @@ diff -urN linux.old/arch/mips/bcm947xx/pcibios.c linux.dev/arch/mips/bcm947xx/pc
 +
 diff -urN linux.old/arch/mips/bcm947xx/prom.c linux.dev/arch/mips/bcm947xx/prom.c
 --- linux.old/arch/mips/bcm947xx/prom.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/prom.c        2006-04-27 19:24:19.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/prom.c        2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,41 @@
 +/*
 + * Early initialization code for BCM94710 boards
@@ -10086,7 +10065,7 @@ diff -urN linux.old/arch/mips/bcm947xx/prom.c linux.dev/arch/mips/bcm947xx/prom.
 +}
 diff -urN linux.old/arch/mips/bcm947xx/sbmips.c linux.dev/arch/mips/bcm947xx/sbmips.c
 --- linux.old/arch/mips/bcm947xx/sbmips.c      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/sbmips.c      2006-05-02 04:43:13.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/sbmips.c      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,1132 @@
 +/*
 + * BCM47XX Sonics SiliconBackplane MIPS core routines
@@ -11222,7 +11201,7 @@ diff -urN linux.old/arch/mips/bcm947xx/sbmips.c linux.dev/arch/mips/bcm947xx/sbm
 +#endif /* BCMINTERNAL | BCMPERFSTATS */
 diff -urN linux.old/arch/mips/bcm947xx/sbpci.c linux.dev/arch/mips/bcm947xx/sbpci.c
 --- linux.old/arch/mips/bcm947xx/sbpci.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/sbpci.c       2006-05-02 17:37:13.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/sbpci.c       2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,768 @@
 +/*
 + * Low-Level PCI and SB support for BCM47xx
@@ -11723,7 +11702,7 @@ diff -urN linux.old/arch/mips/bcm947xx/sbpci.c linux.dev/arch/mips/bcm947xx/sbpc
 +              return -1;
 +      }
 +
-+      if ((chip == 0x4710) && (chiprev == 0))
++      if ((chip == 0x4310) && (chiprev == 0))
 +              pci_disabled = TRUE;
 +      
 +      sb = (sbconfig_t *)((ulong) pci + SBCONFIGOFF);
@@ -11994,8 +11973,8 @@ diff -urN linux.old/arch/mips/bcm947xx/sbpci.c linux.dev/arch/mips/bcm947xx/sbpc
 +
 diff -urN linux.old/arch/mips/bcm947xx/sbutils.c linux.dev/arch/mips/bcm947xx/sbutils.c
 --- linux.old/arch/mips/bcm947xx/sbutils.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/sbutils.c     2006-05-02 04:33:16.000000000 +0200
-@@ -0,0 +1,3081 @@
++++ linux.dev/arch/mips/bcm947xx/sbutils.c     2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,3103 @@
 +/*
 + * Misc utility routines for accessing chip-specific features
 + * of the SiliconBackplane-based Broadcom chips.
@@ -12140,6 +12119,11 @@ diff -urN linux.old/arch/mips/bcm947xx/sbutils.c linux.dev/arch/mips/bcm947xx/sb
 +#define PCIE_CONFIGREGS       1               /* Access to config space */
 +#define PCIE_PCIEREGS                 2               /* Access to pcie registers */
 +
++/* force HT war check */
++#define FORCEHT_WAR32414(si)   \
++   ((PCIE(si)) && (((si->sb.chip == BCM4311_CHIP_ID) && (si->sb.chiprev == 1)) ||  \
++   ((si->sb.chip == BCM4321_CHIP_ID) && (si->sb.chiprev <= 3))))
++
 +/* GPIO Based LED powersave defines */
 +#define DEFAULT_GPIO_ONTIME   10              /* Default: 10% on */
 +#define DEFAULT_GPIO_OFFTIME  90              /* Default: 10% on */
@@ -12293,6 +12277,23 @@ diff -urN linux.old/arch/mips/bcm947xx/sbutils.c linux.dev/arch/mips/bcm947xx/sb
 +}
 +#endif        /* !BCMBUSTYPE || (BCMBUSTYPE == SB_BUS) */
 +
++void
++BCMINITFN(sb_war32414_forceHT)(sb_t *sbh, bool forceHT)
++{
++   sb_info_t *si;
++
++   si = SB_INFO(sbh);
++
++   
++   if (FORCEHT_WAR32414(si)) {
++       uint32 val = 0;
++       if (forceHT)
++           val = SYCC_HR;
++       sb_corereg((void*)si, SB_CC_IDX, OFFSETOF(chipcregs_t, system_clk_ctl),
++           SYCC_HR, val);
++   }
++}
++
 +static sb_info_t  *
 +BCMINITFN(sb_doattach)(sb_info_t *si, uint devid, osl_t *osh, void *regs,
 +                       uint bustype, void *sdh, char **vars, uint *varsz)
@@ -12475,17 +12476,17 @@ diff -urN linux.old/arch/mips/bcm947xx/sbutils.c linux.dev/arch/mips/bcm947xx/sb
 +                      w = DEFAULT_GPIOTIMERVAL;
 +              sb_corereg(si, 0, OFFSETOF(chipcregs_t, gpiotimerval), ~0, w);
 +      }
-+      if ((si->sb.chip == BCM4311_CHIP_ID) && (si->sb.chiprev <= 1)) {
++      if (FORCEHT_WAR32414(si)) {
 +              /* set proper clk setup delays before forcing HT */
 +              sb_clkctl_init((void *)si);
-+              sb_corereg((void*)si, SB_CC_IDX, OFFSETOF(chipcregs_t, system_clk_ctl),
-+                         SYCC_HR, SYCC_HR);
++              sb_war32414_forceHT((void *)si, 1);
 +      }
 +
 +
 +      return (si);
 +}
 +
++
 +uint
 +sb_coreid(sb_t *sbh)
 +{
@@ -12794,7 +12795,7 @@ diff -urN linux.old/arch/mips/bcm947xx/sbutils.c linux.dev/arch/mips/bcm947xx/sb
 +#define read_pci_cfg_byte(a) \
 +      (BYTE_VAL(OSL_PCI_READ_CONFIG(si->osh, DWORD_ALIGN(a), 4), a) & 0xff)
 +
-+#define read_pci_cfg_write(a) \
++#define read_pci_cfg_word(a) \
 +      (WORD_VAL(OSL_PCI_READ_CONFIG(si->osh, DWORD_ALIGN(a), 4), a) & 0xffff)
 +
 +
@@ -15079,7 +15080,7 @@ diff -urN linux.old/arch/mips/bcm947xx/sbutils.c linux.dev/arch/mips/bcm947xx/sb
 +
 diff -urN linux.old/arch/mips/bcm947xx/setup.c linux.dev/arch/mips/bcm947xx/setup.c
 --- linux.old/arch/mips/bcm947xx/setup.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/setup.c       2006-04-27 23:22:53.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/setup.c       2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,241 @@
 +/*
 + *  Generic setup routines for Broadcom MIPS boards
@@ -15324,7 +15325,7 @@ diff -urN linux.old/arch/mips/bcm947xx/setup.c linux.dev/arch/mips/bcm947xx/setu
 +
 diff -urN linux.old/arch/mips/bcm947xx/sflash.c linux.dev/arch/mips/bcm947xx/sflash.c
 --- linux.old/arch/mips/bcm947xx/sflash.c      1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/sflash.c      2006-04-27 22:11:27.000000000 +0200
++++ linux.dev/arch/mips/bcm947xx/sflash.c      2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,422 @@
 +/*
 + * Broadcom SiliconBackplane chipcommon serial flash interface
@@ -15750,8 +15751,8 @@ diff -urN linux.old/arch/mips/bcm947xx/sflash.c linux.dev/arch/mips/bcm947xx/sfl
 +}
 diff -urN linux.old/arch/mips/bcm947xx/time.c linux.dev/arch/mips/bcm947xx/time.c
 --- linux.old/arch/mips/bcm947xx/time.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/arch/mips/bcm947xx/time.c        2006-04-28 00:45:40.000000000 +0200
-@@ -0,0 +1,119 @@
++++ linux.dev/arch/mips/bcm947xx/time.c        2006-10-02 21:19:59.000000000 +0200
+@@ -0,0 +1,104 @@
 +/*
 + * Copyright 2006, Broadcom Corporation
 + * All Rights Reserved.
@@ -15828,13 +15829,6 @@ diff -urN linux.old/arch/mips/bcm947xx/time.c linux.dev/arch/mips/bcm947xx/time.
 +
 +      /* Set panic timeout in seconds */
 +      panic_timeout = watchdog / 1000;
-+
-+      /* Setup blink */
-+      if ((eir = sb_setcore(sbh, SB_EXTIF, 0))) {
-+              sbconfig_t *sb = (sbconfig_t *)((unsigned int) eir + SBCONFIGOFF);
-+              unsigned long base = EXTIF_CFGIF_BASE(sb_base(readl(&sb->sbadmatch1)));
-+              mcr = (u8 *) ioremap_nocache(base + UART_MCR, 1);
-+      }
 +}
 +
 +static void
@@ -15846,14 +15840,6 @@ diff -urN linux.old/arch/mips/bcm947xx/time.c linux.dev/arch/mips/bcm947xx/time.
 +      /* Set the watchdog timer to reset after the specified number of ms */
 +      if (watchdog > 0)
 +              sb_watchdog(sbh, WATCHDOG_CLOCK / 1000 * watchdog);
-+
-+#ifdef        CONFIG_HWSIM
-+      (*((int *)0xa0000f1c))++;
-+#else
-+      /* Blink one of the LEDs in the external UART */
-+      if (mcr && !(jiffies % (HZ/2)))
-+              writeb(readb(mcr) ^ UART_MCR_OUT2, mcr);
-+#endif
 +}
 +
 +static struct irqaction bcm947xx_timer_irqaction = {
@@ -15872,8 +15858,8 @@ diff -urN linux.old/arch/mips/bcm947xx/time.c linux.dev/arch/mips/bcm947xx/time.
 +      setup_irq(7, &bcm947xx_timer_irqaction);
 +}
 diff -urN linux.old/arch/mips/config-shared.in linux.dev/arch/mips/config-shared.in
---- linux.old/arch/mips/config-shared.in       2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/config-shared.in       2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/config-shared.in       2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/config-shared.in       2006-10-02 21:19:59.000000000 +0200
 @@ -208,6 +208,14 @@
     fi
     define_bool CONFIG_MIPS_RTC y
@@ -15901,7 +15887,7 @@ diff -urN linux.old/arch/mips/config-shared.in linux.dev/arch/mips/config-shared
  # Select some configuration options automatically based on user selections.
  #
  if [ "$CONFIG_ACER_PICA_61" = "y" ]; then
-@@ -554,6 +567,13 @@
+@@ -554,6 +567,12 @@
     define_bool CONFIG_SWAP_IO_SPACE_L y
     define_bool CONFIG_BOOT_ELF32 y
  fi
@@ -15910,12 +15896,11 @@ diff -urN linux.old/arch/mips/config-shared.in linux.dev/arch/mips/config-shared
 +   define_bool CONFIG_NONCOHERENT_IO y
 +   define_bool CONFIG_NEW_TIME_C y
 +   define_bool CONFIG_NEW_IRQ y
-+   define_bool CONFIG_HND y
 +fi
  if [ "$CONFIG_SNI_RM200_PCI" = "y" ]; then
     define_bool CONFIG_ARC32 y
     define_bool CONFIG_ARC_MEMORY y
-@@ -1042,7 +1062,11 @@
+@@ -1042,7 +1061,11 @@
  
  bool 'Are you using a crosscompiler' CONFIG_CROSSCOMPILE
  bool 'Enable run-time debugging' CONFIG_RUNTIME_DEBUG
@@ -15929,8 +15914,8 @@ diff -urN linux.old/arch/mips/config-shared.in linux.dev/arch/mips/config-shared
  if [ "$CONFIG_KGDB" = "y" ]; then
     define_bool CONFIG_DEBUG_INFO y
 diff -urN linux.old/arch/mips/kernel/cpu-probe.c linux.dev/arch/mips/kernel/cpu-probe.c
---- linux.old/arch/mips/kernel/cpu-probe.c     2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/kernel/cpu-probe.c     2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/kernel/cpu-probe.c     2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/kernel/cpu-probe.c     2006-10-02 21:19:59.000000000 +0200
 @@ -162,7 +162,7 @@
  
  static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
@@ -16051,8 +16036,8 @@ diff -urN linux.old/arch/mips/kernel/cpu-probe.c linux.dev/arch/mips/kernel/cpu-
                cpu_probe_sibyte(c);
                break;
 diff -urN linux.old/arch/mips/kernel/head.S linux.dev/arch/mips/kernel/head.S
---- linux.old/arch/mips/kernel/head.S  2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/kernel/head.S  2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/kernel/head.S  2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/kernel/head.S  2006-10-02 21:19:59.000000000 +0200
 @@ -28,12 +28,20 @@
  #include <asm/mipsregs.h>
  #include <asm/stackframe.h>
@@ -16076,8 +16061,8 @@ diff -urN linux.old/arch/mips/kernel/head.S linux.dev/arch/mips/kernel/head.S
                /* The following two symbols are used for kernel profiling. */
                EXPORT(stext)
 diff -urN linux.old/arch/mips/kernel/proc.c linux.dev/arch/mips/kernel/proc.c
---- linux.old/arch/mips/kernel/proc.c  2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/kernel/proc.c  2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/kernel/proc.c  2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/kernel/proc.c  2006-10-02 21:19:59.000000000 +0200
 @@ -78,9 +78,10 @@
        [CPU_AU1550]    "Au1550",
        [CPU_24K]       "MIPS 24K",
@@ -16091,8 +16076,8 @@ diff -urN linux.old/arch/mips/kernel/proc.c linux.dev/arch/mips/kernel/proc.c
  {
        unsigned int version = current_cpu_data.processor_id;
 diff -urN linux.old/arch/mips/kernel/setup.c linux.dev/arch/mips/kernel/setup.c
---- linux.old/arch/mips/kernel/setup.c 2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/kernel/setup.c 2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/kernel/setup.c 2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/kernel/setup.c 2006-10-02 21:19:59.000000000 +0200
 @@ -493,6 +493,7 @@
        void swarm_setup(void);
        void hp_setup(void);
@@ -16114,8 +16099,8 @@ diff -urN linux.old/arch/mips/kernel/setup.c linux.dev/arch/mips/kernel/setup.c
                panic("Unsupported architecture");
        }
 diff -urN linux.old/arch/mips/kernel/traps.c linux.dev/arch/mips/kernel/traps.c
---- linux.old/arch/mips/kernel/traps.c 2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/kernel/traps.c 2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/kernel/traps.c 2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/kernel/traps.c 2006-10-02 21:19:59.000000000 +0200
 @@ -920,6 +920,7 @@
  void __init trap_init(void)
  {
@@ -16145,9 +16130,40 @@ diff -urN linux.old/arch/mips/kernel/traps.c linux.dev/arch/mips/kernel/traps.c
        if (cpu_has_fpu && !cpu_has_nofpuex)
                set_except_vector(15, handle_fpe);
  
+diff -urN linux.old/arch/mips/Makefile linux.dev/arch/mips/Makefile
+--- linux.old/arch/mips/Makefile       2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/Makefile       2006-10-02 21:19:59.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/mm/c-r4k.c linux.dev/arch/mips/mm/c-r4k.c
---- linux.old/arch/mips/mm/c-r4k.c     2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/mm/c-r4k.c     2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/mm/c-r4k.c     2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/mm/c-r4k.c     2006-10-02 21:19:59.000000000 +0200
 @@ -1166,3 +1166,47 @@
        build_clear_page();
        build_copy_page();
@@ -16197,8 +16213,8 @@ diff -urN linux.old/arch/mips/mm/c-r4k.c linux.dev/arch/mips/mm/c-r4k.c
 +
 +
 diff -urN linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile
---- linux.old/arch/mips/pci/Makefile   2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/arch/mips/pci/Makefile   2006-04-27 19:24:19.000000000 +0200
+--- linux.old/arch/mips/pci/Makefile   2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/arch/mips/pci/Makefile   2006-10-02 21:19:59.000000000 +0200
 @@ -13,7 +13,9 @@
  obj-$(CONFIG_MIPS_MSC)                += ops-msc.o
  obj-$(CONFIG_MIPS_NILE4)      += ops-nile4.o
@@ -16210,8 +16226,8 @@ diff -urN linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile
  
  include $(TOPDIR)/Rules.make
 diff -urN linux.old/drivers/char/serial.c linux.dev/drivers/char/serial.c
---- linux.old/drivers/char/serial.c    2006-04-27 18:04:37.000000000 +0200
-+++ linux.dev/drivers/char/serial.c    2006-04-27 19:24:19.000000000 +0200
+--- linux.old/drivers/char/serial.c    2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/drivers/char/serial.c    2006-10-02 21:19:59.000000000 +0200
 @@ -444,6 +444,10 @@
                return inb(info->port+1);
  #endif
@@ -16280,21 +16296,9 @@ diff -urN linux.old/drivers/char/serial.c linux.dev/drivers/char/serial.c
        cval = cflag & (CSIZE | CSTOPB);
  #if defined(__powerpc__) || defined(__alpha__)
        cval >>= 8;
-diff -urN linux.old/drivers/net/Config.in linux.dev/drivers/net/Config.in
---- linux.old/drivers/net/Config.in    2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/drivers/net/Config.in    2006-04-27 19:24:19.000000000 +0200
-@@ -2,6 +2,8 @@
- # Network device configuration
- #
-+tristate 'Broadcom Home Network Division' CONFIG_HND $CONFIG_PCI
-+
- source drivers/net/arcnet/Config.in
- tristate 'Dummy net driver support' CONFIG_DUMMY
 diff -urN linux.old/drivers/net/Makefile linux.dev/drivers/net/Makefile
---- linux.old/drivers/net/Makefile     2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/drivers/net/Makefile     2006-05-04 01:41:03.000000000 +0200
+--- linux.old/drivers/net/Makefile     2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/drivers/net/Makefile     2006-10-02 21:19:59.000000000 +0200
 @@ -3,6 +3,8 @@
  # Makefile for the Linux network (ethercard) device drivers.
  #
@@ -16304,3246 +16308,9 @@ diff -urN linux.old/drivers/net/Makefile linux.dev/drivers/net/Makefile
  obj-y           :=
  obj-m           :=
  obj-n           :=
-@@ -39,6 +41,7 @@
-   obj-$(CONFIG_ISDN) += slhc.o
- endif
-+subdir-$(CONFIG_WL) += wl
- subdir-$(CONFIG_NET_PCMCIA) += pcmcia
- subdir-$(CONFIG_NET_WIRELESS) += wireless
- subdir-$(CONFIG_TULIP) += tulip
-diff -urN linux.old/drivers/net/wireless/Config.in linux.dev/drivers/net/wireless/Config.in
---- linux.old/drivers/net/wireless/Config.in   2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/drivers/net/wireless/Config.in   2006-05-04 01:42:48.000000000 +0200
-@@ -13,6 +13,7 @@
- fi
- if [ "$CONFIG_PCI" = "y" ]; then
-+   dep_tristate '    Proprietary Broadcom BCM43xx 802.11 Wireless support' CONFIG_WL
-    dep_tristate '    Hermes in PLX9052 based PCI adaptor support (Netgear MA301 etc.) (EXPERIMENTAL)' CONFIG_PLX_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL
-    dep_tristate '    Hermes in TMD7160/NCP130 based PCI adaptor support (Pheecom WL-PCI etc.) (EXPERIMENTAL)' CONFIG_TMD_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL
-    dep_tristate '    Prism 2.5 PCI 802.11b adaptor support (EXPERIMENTAL)' CONFIG_PCI_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL
-diff -urN linux.old/drivers/net/wl/patchtable.pl linux.dev/drivers/net/wl/patchtable.pl
---- linux.old/drivers/net/wl/patchtable.pl     1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/patchtable.pl     2006-04-28 01:33:52.000000000 +0200
-@@ -0,0 +1,54 @@
-+#!/usr/bin/perl
-+use strict;
-+
-+my $TABLE = pack("V", 0xbadc0ded);
-+my $TABLE_SIZE = 512;
-+my $SLT1 = "\x01\x00\x00\x00";
-+my $SLT2 = "\x02\x00\x00\x00";
-+my $ACKW = "\x03\x00\x00\x00";
-+my $PTABLE_END = "\xff\xff\xff\xff";
-+
-+my $addr = "";
-+my $opcode = "";
-+my $function = "";
-+
-+sub add_entry {
-+      my $key = shift;
-+      my $value = shift;
-+      my $default = shift;
-+
-+      $TABLE .= $key;
-+      $TABLE .= pack("V", $value);
-+      $TABLE .= pack("V", $default);
-+}
-+
-+while (<>) {
-+      $addr = $opcode = "";
-+      /^\w{8}\s*<(.*)>:$/ and $function = $1;
-+      /^\s*(\w+):\s*(\w{8})\s*/ and do {
-+              $addr = $1;
-+              $opcode = $2;
-+      };
-+
-+      ($function eq 'wlc_update_slot_timing') and do {
-+              # li    a2,9    -- short slot time
-+              ($opcode eq '24060009') and add_entry($SLT1, hex($addr), hex($opcode));
-+              # li    v0,519  -- 510 + short slot time
-+              ($opcode eq '24020207') and add_entry($SLT2, hex($addr), hex($opcode));
-+              
-+              # li    a2,20   -- long slot time
-+              ($opcode eq '24060014') and add_entry($SLT1, hex($addr), hex($opcode));
-+              # li    v0,530  -- 510 + long slot time
-+              ($opcode eq '24020212') and add_entry($SLT2, hex($addr), hex($opcode));
-+      };
-+      ($function eq 'wlc_d11hdrs') and do {
-+              # ori   s6,s6,0x1 -- ack flag (new)
-+              ($opcode eq '36d60001') and add_entry($ACKW, hex($addr), hex($opcode));
-+              # ori   s3,s3,0x1 -- ack flag (old)
-+              ($opcode eq '36730001') and add_entry($ACKW, hex($addr), hex($opcode));
-+      }
-+}
-+
-+$TABLE .= $PTABLE_END;
-+$TABLE .= ("\x00" x ($TABLE_SIZE - length($TABLE)));
-+print $TABLE;
-diff -urN linux.old/drivers/net/wl/Makefile linux.dev/drivers/net/wl/Makefile
---- linux.old/drivers/net/wl/Makefile  1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/Makefile  2006-04-28 01:33:52.000000000 +0200
-@@ -0,0 +1,32 @@
-+#
-+# Makefile for the Broadcom wl driver
-+#
-+# 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: Makefile,v 1.2 2005/03/29 03:32:18 mbm Exp $
-+
-+EXTRA_CFLAGS += -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER
-+
-+O_TARGET      := wl_link.o
-+
-+obj-y         := wl_mod.o
-+obj-y         += bcmutils.o hnddma.o linux_osl.o
-+
-+obj-m         := $(O_TARGET)
-+
-+wl_mod.o: wl_apsta.o
-+      sed -e 's,eth%d,wl%d\x00,g' < $< > $@
-+
-+wl.o: wl_link.o
-+      $(OBJDUMP) -d $< | perl patchtable.pl > patchtable.bin
-+      cat wl_link.o patchtable.bin > $@
-+
-+modules: wl.o
-+
-+include $(TOPDIR)/Rules.make
-diff -urN linux.old/drivers/net/wl/bcmip.h linux.dev/drivers/net/wl/bcmip.h
---- linux.old/drivers/net/wl/bcmip.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/bcmip.h   2006-04-28 02:11:28.000000000 +0200
-@@ -0,0 +1,101 @@
-+/*
-+ * 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.
-+ *
-+ * Fundamental constants relating to IP Protocol
-+ *
-+ * $Id: bcmip.h,v 1.1.1.3 2006/02/27 03:43:16 honor Exp $
-+ */
-+
-+#ifndef _bcmip_h_
-+#define _bcmip_h_
-+
-+/* IPV4 and IPV6 common */
-+#define IP_VER_OFFSET         0x0     /* offset to version field */
-+#define IP_VER_MASK           0xf0    /* version mask */
-+#define IP_VER_SHIFT          4       /* version shift */
-+#define IP_VER_4              4       /* version number for IPV4 */
-+#define IP_VER_6              6       /* version number for IPV6 */
-+
-+#define IP_VER(ip_body) \
-+      ((((uint8 *)(ip_body))[IP_VER_OFFSET] & IP_VER_MASK) >> IP_VER_SHIFT)
-+
-+#define IP_PROT_ICMP          0x1     /* ICMP protocol */
-+#define IP_PROT_TCP           0x6     /* TCP protocol */
-+#define IP_PROT_UDP           0x11    /* UDP protocol type */
-+
-+/* IPV4 field offsets */
-+#define IPV4_VER_HL_OFFSET    0       /* version and ihl byte offset */
-+#define IPV4_TOS_OFFSET               1       /* type of service offset */
-+#define IPV4_PROT_OFFSET      9       /* protocol type offset */
-+#define IPV4_CHKSUM_OFFSET    10      /* IP header checksum offset */
-+#define IPV4_SRC_IP_OFFSET    12      /* src IP addr offset */
-+#define IPV4_DEST_IP_OFFSET   16      /* dest IP addr offset */
-+
-+/* IPV4 field decodes */
-+#define IPV4_VER_MASK         0xf0    /* IPV4 version mask */
-+#define IPV4_VER_SHIFT                4       /* IPV4 version shift */
-+
-+#define IPV4_HLEN_MASK                0x0f    /* IPV4 header length mask */
-+#define IPV4_HLEN(ipv4_body)  (4 * (((uint8 *)(ipv4_body))[IPV4_VER_HL_OFFSET] & IPV4_HLEN_MASK))
-+
-+#define IPV4_ADDR_LEN         4       /* IPV4 address length */
-+
-+#define IPV4_ADDR_NULL(a)     ((((uint8 *)(a))[0] | ((uint8 *)(a))[1] | \
-+                                ((uint8 *)(a))[2] | ((uint8 *)(a))[3]) == 0)
-+
-+#define       IPV4_TOS_DSCP_MASK      0xfc    /* DiffServ codepoint mask */
-+#define       IPV4_TOS_DSCP_SHIFT     2       /* DiffServ codepoint shift */
-+
-+#define       IPV4_TOS(ipv4_body)     (((uint8 *)(ipv4_body))[IPV4_TOS_OFFSET])
-+
-+#define       IPV4_TOS_PREC_MASK      0xe0    /* Historical precedence mask */
-+#define       IPV4_TOS_PREC_SHIFT     5       /* Historical precedence shift */
-+
-+#define IPV4_TOS_LOWDELAY     0x10    /* Lowest delay requested */
-+#define IPV4_TOS_THROUGHPUT   0x8     /* Best throughput requested */
-+#define IPV4_TOS_RELIABILITY  0x4     /* Most reliable delivery requested */
-+
-+#define IPV4_PROT(ipv4_body)  (((uint8 *)(ipv4_body))[IPV4_PROT_OFFSET])
-+
-+#define IPV4_ADDR_STR_LEN     16      /* Max IP address length in string format */
-+
-+/* IPV6 field offsets */
-+#define IPV6_PAYLOAD_LEN_OFFSET       4       /* payload length offset */
-+#define IPV6_NEXT_HDR_OFFSET  6       /* next header/protocol offset */
-+#define IPV6_HOP_LIMIT_OFFSET 7       /* hop limit offset */
-+#define IPV6_SRC_IP_OFFSET    8       /* src IP addr offset */
-+#define IPV6_DEST_IP_OFFSET   24      /* dst IP addr offset */
-+
-+/* IPV6 field decodes */
-+#define IPV6_TRAFFIC_CLASS(ipv6_body) \
-+      (((((uint8 *)(ipv6_body))[0] & 0x0f) << 4) | \
-+       ((((uint8 *)(ipv6_body))[1] & 0xf0) >> 4))
-+
-+#define IPV6_FLOW_LABEL(ipv6_body) \
-+      (((((uint8 *)(ipv6_body))[1] & 0x0f) << 16) | \
-+       (((uint8 *)(ipv6_body))[2] << 8) | \
-+       (((uint8 *)(ipv6_body))[3]))
-+
-+#define IPV6_PAYLOAD_LEN(ipv6_body) \
-+      ((((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 0] << 8) | \
-+       ((uint8 *)(ipv6_body))[IPV6_PAYLOAD_LEN_OFFSET + 1])
-+
-+#define IPV6_NEXT_HDR(ipv6_body) \
-+      (((uint8 *)(ipv6_body))[IPV6_NEXT_HDR_OFFSET])
-+
-+#define IPV6_PROT(ipv6_body)  IPV6_NEXT_HDR(ipv6_body)
-+
-+#define IPV6_ADDR_LEN         16      /* IPV6 address length */
-+
-+/* IPV4 TOS or IPV6 Traffic Classifier or 0 */
-+#define IP_TOS(ip_body) \
-+      (IP_VER(ip_body) == IP_VER_4 ? IPV4_TOS(ip_body) : \
-+       IP_VER(ip_body) == IP_VER_6 ? IPV6_TRAFFIC_CLASS(ip_body) : 0)
-+
-+#endif        /* _bcmip_h_ */
-diff -urN linux.old/drivers/net/wl/bcmutils.c linux.dev/drivers/net/wl/bcmutils.c
---- linux.old/drivers/net/wl/bcmutils.c        1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/bcmutils.c        2006-04-28 02:27:20.000000000 +0200
-@@ -0,0 +1,857 @@
-+/*
-+ * 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 $
-+ */
-+
-+#include <typedefs.h>
-+#include <bcmdefs.h>
-+#include <stdarg.h>
-+#include <osl.h>
-+#include "linux_osl.h"
-+#include "pktq.h"
-+#include <bcmutils.h>
-+#include <sbutils.h>
-+#include <bcmnvram.h>
-+#include <bcmendian.h>
-+#include <bcmdevs.h>
-+#include "bcmip.h"
-+
-+#define ETHER_TYPE_8021Q       0x8100
-+#define ETHER_TYPE_IP          0x0800
-+#define VLAN_PRI_SHIFT             13
-+#define VLAN_PRI_MASK               7
-+
-+
-+struct  ether_header {
-+      uint8   ether_dhost[6];
-+      uint8   ether_shost[6];
-+      uint16  ether_type;
-+} __attribute__((packed));
-+
-+
-+struct ethervlan_header {
-+      uint8   ether_dhost[6];
-+      uint8   ether_shost[6];
-+      uint16  vlan_type;              /* 0x8100 */
-+      uint16  vlan_tag;               /* priority, cfi and vid */
-+      uint16  ether_type;
-+};
-+
-+/* copy a pkt buffer chain into a buffer */
-+uint
-+pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf)
-+{
-+      uint n, ret = 0;
-+
-+      if (len < 0)
-+              len = 4096;     /* "infinite" */
-+
-+      /* skip 'offset' bytes */
-+      for (; p && offset; p = PKTNEXT(osh, p)) {
-+              if (offset < (uint)PKTLEN(osh, p))
-+                      break;
-+              offset -= PKTLEN(osh, p);
-+      }
-+
-+      if (!p)
-+              return 0;
-+
-+      /* copy the data */
-+      for (; p && len; p = PKTNEXT(osh, p)) {
-+              n = MIN((uint)PKTLEN(osh, p) - offset, (uint)len);
-+              bcopy(PKTDATA(osh, p) + offset, buf, n);
-+              buf += n;
-+              len -= n;
-+              ret += n;
-+              offset = 0;
-+      }
-+
-+      return ret;
-+}
-+
-+/* return total length of buffer chain */
-+uint
-+pkttotlen(osl_t *osh, void *p)
-+{
-+      uint total;
-+
-+      total = 0;
-+      for (; p; p = PKTNEXT(osh, p))
-+              total += PKTLEN(osh, p);
-+      return (total);
-+}
-+
-+/* return the last buffer of chained pkt */
-+void *
-+pktlast(osl_t *osh, void *p)
-+{
-+      for (; PKTNEXT(osh, p); p = PKTNEXT(osh, p))
-+              ;
-+
-+      return (p);
-+}
-+
-+
-+/*
-+ * osl multiple-precedence packet queue
-+ * hi_prec is always >= the number of the highest non-empty queue
-+ */
-+void *
-+pktq_penq(struct pktq *pq, int prec, void *p)
-+{
-+      struct pktq_prec *q;
-+
-+      ASSERT(prec >= 0 && prec < pq->num_prec);
-+      ASSERT(PKTLINK(p) == NULL);         /* queueing chains not allowed */
-+
-+      ASSERT(!pktq_full(pq));
-+      ASSERT(!pktq_pfull(pq, prec));
-+
-+      q = &pq->q[prec];
-+
-+      if (q->head)
-+              PKTSETLINK(q->tail, p);
-+      else
-+              q->head = p;
-+
-+      q->tail = p;
-+      q->len++;
-+
-+      pq->len++;
-+
-+      if (pq->hi_prec < prec)
-+              pq->hi_prec = (uint8)prec;
-+
-+      return p;
-+}
-+
-+void *
-+pktq_penq_head(struct pktq *pq, int prec, void *p)
-+{
-+      struct pktq_prec *q;
-+
-+      ASSERT(prec >= 0 && prec < pq->num_prec);
-+      ASSERT(PKTLINK(p) == NULL);         /* queueing chains not allowed */
-+
-+      ASSERT(!pktq_full(pq));
-+      ASSERT(!pktq_pfull(pq, prec));
-+
-+      q = &pq->q[prec];
-+
-+      if (q->head == NULL)
-+              q->tail = p;
-+
-+      PKTSETLINK(p, q->head);
-+      q->head = p;
-+      q->len++;
-+
-+      pq->len++;
-+
-+      if (pq->hi_prec < prec)
-+              pq->hi_prec = (uint8)prec;
-+
-+      return p;
-+}
-+
-+void *
-+pktq_pdeq(struct pktq *pq, int prec)
-+{
-+      struct pktq_prec *q;
-+      void *p;
-+
-+      ASSERT(prec >= 0 && prec < pq->num_prec);
-+
-+      q = &pq->q[prec];
-+
-+      if ((p = q->head) == NULL)
-+              return NULL;
-+
-+      if ((q->head = PKTLINK(p)) == NULL)
-+              q->tail = NULL;
-+
-+      q->len--;
-+
-+      pq->len--;
-+
-+      PKTSETLINK(p, NULL);
-+
-+      return p;
-+}
-+
-+void *
-+pktq_pdeq_tail(struct pktq *pq, int prec)
-+{
-+      struct pktq_prec *q;
-+      void *p, *prev;
-+
-+      ASSERT(prec >= 0 && prec < pq->num_prec);
-+
-+      q = &pq->q[prec];
-+
-+      if ((p = q->head) == NULL)
-+              return NULL;
-+
-+      for (prev = NULL; p != q->tail; p = PKTLINK(p))
-+              prev = p;
-+
-+      if (prev)
-+              PKTSETLINK(prev, NULL);
-+      else
-+              q->head = NULL;
-+
-+      q->tail = prev;
-+      q->len--;
-+
-+      pq->len--;
-+
-+      return p;
-+}
-+
-+void
-+pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir)
-+{
-+      struct pktq_prec *q;
-+      void *p;
-+
-+      q = &pq->q[prec];
-+      p = q->head;
-+      while (p) {
-+              q->head = PKTLINK(p);
-+              PKTSETLINK(p, NULL);
-+              PKTFREE(osh, p, dir);
-+              q->len--;
-+              pq->len--;
-+              p = q->head;
-+      }
-+      ASSERT(q->len == 0);
-+      q->tail = NULL;
-+}
-+
-+bool
-+pktq_pdel(struct pktq *pq, void *pktbuf, int prec)
-+{
-+      struct pktq_prec *q;
-+      void *p;
-+
-+      ASSERT(prec >= 0 && prec < pq->num_prec);
-+
-+      if (!pktbuf)
-+              return FALSE;
-+
-+      q = &pq->q[prec];
-+
-+      if (q->head == pktbuf) {
-+              if ((q->head = PKTLINK(pktbuf)) == NULL)
-+                      q->tail = NULL;
-+      } else {
-+              for (p = q->head; p && PKTLINK(p) != pktbuf; p = PKTLINK(p))
-+                      ;
-+              if (p == NULL)
-+                      return FALSE;
-+
-+              PKTSETLINK(p, PKTLINK(pktbuf));
-+              if (q->tail == pktbuf)
-+                      q->tail = p;
-+      }
-+
-+      q->len--;
-+      pq->len--;
-+      PKTSETLINK(pktbuf, NULL);
-+      return TRUE;
-+}
-+
-+void
-+pktq_init(struct pktq *pq, int num_prec, int max_len)
-+{
-+      int prec;
-+
-+      ASSERT(num_prec > 0 && num_prec <= PKTQ_MAX_PREC);
-+
-+      bzero(pq, sizeof(*pq));
-+
-+      pq->num_prec = (uint16)num_prec;
-+
-+      pq->max = (uint16)max_len;
-+
-+      for (prec = 0; prec < num_prec; prec++)
-+              pq->q[prec].max = pq->max;
-+}
-+
-+void *
-+pktq_deq(struct pktq *pq, int *prec_out)
-+{
-+      struct pktq_prec *q;
-+      void *p;
-+      int prec;
-+
-+      if (pq->len == 0)
-+              return NULL;
-+
-+      while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-+              pq->hi_prec--;
-+
-+      q = &pq->q[prec];
-+
-+      if ((p = q->head) == NULL)
-+              return NULL;
-+
-+      if ((q->head = PKTLINK(p)) == NULL)
-+              q->tail = NULL;
-+
-+      q->len--;
-+
-+      pq->len--;
-+
-+      if (prec_out)
-+              *prec_out = prec;
-+
-+      PKTSETLINK(p, NULL);
-+
-+      return p;
-+}
-+
-+void *
-+pktq_deq_tail(struct pktq *pq, int *prec_out)
-+{
-+      struct pktq_prec *q;
-+      void *p, *prev;
-+      int prec;
-+
-+      if (pq->len == 0)
-+              return NULL;
-+
-+      for (prec = 0; prec < pq->hi_prec; prec++)
-+              if (pq->q[prec].head)
-+                      break;
-+
-+      q = &pq->q[prec];
-+
-+      if ((p = q->head) == NULL)
-+              return NULL;
-+
-+      for (prev = NULL; p != q->tail; p = PKTLINK(p))
-+              prev = p;
-+
-+      if (prev)
-+              PKTSETLINK(prev, NULL);
-+      else
-+              q->head = NULL;
-+
-+      q->tail = prev;
-+      q->len--;
-+
-+      pq->len--;
-+
-+      if (prec_out)
-+              *prec_out = prec;
-+
-+      PKTSETLINK(p, NULL);
-+
-+      return p;
-+}
-+
-+void *
-+pktq_peek(struct pktq *pq, int *prec_out)
-+{
-+      int prec;
-+
-+      if (pq->len == 0)
-+              return NULL;
-+
-+      while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-+              pq->hi_prec--;
-+
-+      if (prec_out)
-+              *prec_out = prec;
-+
-+      return (pq->q[prec].head);
-+}
-+
-+void *
-+pktq_peek_tail(struct pktq *pq, int *prec_out)
-+{
-+      int prec;
-+
-+      if (pq->len == 0)
-+              return NULL;
-+
-+      for (prec = 0; prec < pq->hi_prec; prec++)
-+              if (pq->q[prec].head)
-+                      break;
-+
-+      if (prec_out)
-+              *prec_out = prec;
-+
-+      return (pq->q[prec].tail);
-+}
-+
-+void
-+pktq_flush(osl_t *osh, struct pktq *pq, bool dir)
-+{
-+      int prec;
-+      for (prec = 0; prec < pq->num_prec; prec++)
-+              pktq_pflush(osh, pq, prec, dir);
-+      ASSERT(pq->len == 0);
-+}
-+
-+/* Return sum of lengths of a specific set of precedences */
-+int
-+pktq_mlen(struct pktq *pq, uint prec_bmp)
-+{
-+      int prec, len;
-+
-+      len = 0;
-+
-+      for (prec = 0; prec <= pq->hi_prec; prec++)
-+              if (prec_bmp & (1 << prec))
-+                      len += pq->q[prec].len;
-+
-+      return len;
-+}
-+
-+/* Priority dequeue from a specific set of precedences */
-+void *
-+pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out)
-+{
-+      struct pktq_prec *q;
-+      void *p;
-+      int prec;
-+
-+      if (pq->len == 0)
-+              return NULL;
-+
-+      while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-+              pq->hi_prec--;
-+
-+      while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL)
-+              if (prec-- == 0)
-+                      return NULL;
-+
-+      q = &pq->q[prec];
-+
-+      if ((p = q->head) == NULL)
-+              return NULL;
-+
-+      if ((q->head = PKTLINK(p)) == NULL)
-+              q->tail = NULL;
-+
-+      q->len--;
-+
-+      if (prec_out)
-+              *prec_out = prec;
-+
-+      pq->len--;
-+
-+      PKTSETLINK(p, NULL);
-+
-+      return p;
-+}
-+
-+char*
-+bcmstrcat(char *dest, const char *src)
-+{
-+      strcpy(&dest[strlen(dest)], src);
-+      return (dest);
-+}
-+
-+char*
-+bcm_ether_ntoa(struct ether_addr *ea, char *buf)
-+{
-+      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);
-+}
-+
-+/* parse a xx:xx:xx:xx:xx:xx format ethernet address */
-+int
-+bcm_ether_atoe(char *p, struct ether_addr *ea)
-+{
-+      int i = 0;
-+
-+      for (;;) {
-+              ea->octet[i++] = (char) bcm_strtoul(p, &p, 16);
-+              if (!*p++ || i == 6)
-+                      break;
-+      }
-+
-+      return (i == 6);
-+}
-+
-+/* Takes an Ethernet frame and sets out-of-bound PKTPRIO
-+ * Also updates the inplace vlan tag if requested
-+ */
-+void
-+pktsetprio(void *pkt, bool update_vtag)
-+{
-+      struct ether_header *eh;
-+      struct ethervlan_header *evh;
-+      uint8 *pktdata;
-+      int priority = 0;
-+
-+      pktdata = (uint8 *) PKTDATA(NULL, pkt);
-+      ASSERT(ISALIGNED((uintptr)pktdata, sizeof(uint16)));
-+
-+      eh = (struct ether_header *) pktdata;
-+
-+      if (ntoh16(eh->ether_type) == ETHER_TYPE_8021Q) {
-+              uint16 vlan_tag;
-+              int vlan_prio, dscp_prio = 0;
-+
-+              evh = (struct ethervlan_header *)eh;
-+
-+              vlan_tag = ntoh16(evh->vlan_tag);
-+              vlan_prio = (int) (vlan_tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK;
-+
-+              if (ntoh16(evh->ether_type) == ETHER_TYPE_IP) {
-+                      uint8 *ip_body = pktdata + sizeof(struct ethervlan_header);
-+                      uint8 tos_tc = IP_TOS(ip_body);
-+                      dscp_prio = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
-+              }
-+
-+              /* DSCP priority gets precedence over 802.1P (vlan tag) */
-+              priority = (dscp_prio != 0) ? dscp_prio : vlan_prio;
-+
-+              /* 
-+               * If the DSCP priority is not the same as the VLAN priority,
-+               * then overwrite the priority field in the vlan tag, with the
-+               * DSCP priority value. This is required for Linux APs because
-+               * the VLAN driver on Linux, overwrites the skb->priority field
-+               * with the priority value in the vlan tag
-+               */
-+              if (update_vtag && (priority != vlan_prio)) {
-+                      vlan_tag &= ~(VLAN_PRI_MASK << VLAN_PRI_SHIFT);
-+                      vlan_tag |= (uint16)priority << VLAN_PRI_SHIFT;
-+                      evh->vlan_tag = hton16(vlan_tag);
-+              }
-+      } else if (ntoh16(eh->ether_type) == ETHER_TYPE_IP) {
-+              uint8 *ip_body = pktdata + sizeof(struct ether_header);
-+              uint8 tos_tc = IP_TOS(ip_body);
-+              priority = (int)(tos_tc >> IPV4_TOS_PREC_SHIFT);
-+      }
-+
-+      ASSERT(priority >= 0 && priority <= MAXPRIO);
-+      PKTSETPRIO(pkt, priority);
-+}
-+
-+static char bcm_undeferrstr[BCME_STRLEN];
-+
-+static const char *bcmerrorstrtable[] = BCMERRSTRINGTABLE;
-+
-+/* Convert the Error codes into related Error strings  */
-+const char *
-+bcmerrorstr(int bcmerror)
-+{
-+      int abs_bcmerror;
-+
-+      abs_bcmerror = ABS(bcmerror);
-+
-+      /* check if someone added a bcmerror code but forgot to add errorstring */
-+      ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(bcmerrorstrtable) - 1));
-+      if ((bcmerror > 0) || (abs_bcmerror > ABS(BCME_LAST))) {
-+              sprintf(bcm_undeferrstr, "undefined Error %d", bcmerror);
-+              return bcm_undeferrstr;
-+      }
-+
-+      ASSERT((strlen((char*)bcmerrorstrtable[abs_bcmerror])) < BCME_STRLEN);
-+
-+      return bcmerrorstrtable[abs_bcmerror];
-+}
-+
-+
-+int
-+bcm_iovar_lencheck(const bcm_iovar_t *vi, void *arg, int len, bool set)
-+{
-+      int bcmerror = 0;
-+
-+      /* length check on io buf */
-+      switch (vi->type) {
-+      case IOVT_BOOL:
-+      case IOVT_INT8:
-+      case IOVT_INT16:
-+      case IOVT_INT32:
-+      case IOVT_UINT8:
-+      case IOVT_UINT16:
-+      case IOVT_UINT32:
-+              /* all integers are int32 sized args at the ioctl interface */
-+              if (len < (int)sizeof(int)) {
-+                      bcmerror = BCME_BUFTOOSHORT;
-+              }
-+              break;
-+
-+      case IOVT_BUFFER:
-+              /* buffer must meet minimum length requirement */
-+              if (len < vi->minlen) {
-+                      bcmerror = BCME_BUFTOOSHORT;
-+              }
-+              break;
-+
-+      case IOVT_VOID:
-+              if (!set) {
-+                      /* Cannot return nil... */
-+                      bcmerror = BCME_UNSUPPORTED;
-+              } else if (len) {
-+                      /* Set is an action w/o parameters */
-+                      bcmerror = BCME_BUFTOOLONG;
-+              }
-+              break;
-+
-+      default:
-+              /* unknown type for length check in iovar info */
-+              ASSERT(0);
-+              bcmerror = BCME_UNSUPPORTED;
-+      }
-+
-+      return bcmerror;
-+}
-+
-+#define CRC_INNER_LOOP(n, c, x) \
-+                  (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
-+
-+static uint32 crc32_table[256] = {
-+    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
-+    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
-+    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
-+    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
-+    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
-+    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
-+    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
-+    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
-+    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
-+    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
-+    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
-+    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
-+    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
-+    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
-+    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
-+    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
-+    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
-+    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
-+    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
-+    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
-+    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
-+    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
-+    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
-+    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
-+    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
-+    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
-+    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
-+    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
-+    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
-+    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
-+    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
-+    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
-+    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
-+    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
-+    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
-+    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
-+    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
-+    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
-+    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
-+    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
-+    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
-+    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
-+    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
-+    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
-+    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
-+    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
-+    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
-+    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
-+    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
-+    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
-+    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
-+    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
-+    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
-+    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
-+    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
-+    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
-+    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
-+    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
-+    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
-+    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
-+    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
-+    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
-+    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
-+    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
-+};
-+
-+uint32
-+hndcrc32(
-+    uint8 *pdata,  /* pointer to array of data to process */
-+    uint   nbytes, /* number of input data bytes to process */
-+    uint32 crc     /* either CRC32_INIT_VALUE or previous return value */
-+)
-+{
-+      uint8 *pend;
-+#ifdef __mips__
-+      uint8 tmp[4];
-+      ulong *tptr = (ulong *)tmp;
-+
-+      /* in case the beginning of the buffer isn't aligned */
-+      pend = (uint8 *)((uint)(pdata + 3) & 0xfffffffc);
-+      nbytes -= (pend - pdata);
-+      while (pdata < pend)
-+              CRC_INNER_LOOP(32, crc, *pdata++);
-+
-+      /* handle bulk of data as 32-bit words */
-+      pend = pdata + (nbytes & 0xfffffffc);
-+      while (pdata < pend) {
-+              *tptr = *(ulong *)pdata;
-+              pdata += sizeof(ulong *);
-+              CRC_INNER_LOOP(32, crc, tmp[0]);
-+              CRC_INNER_LOOP(32, crc, tmp[1]);
-+              CRC_INNER_LOOP(32, crc, tmp[2]);
-+              CRC_INNER_LOOP(32, crc, tmp[3]);
-+      }
-+
-+      /* 1-3 bytes at end of buffer */
-+      pend = pdata + (nbytes & 0x03);
-+      while (pdata < pend)
-+              CRC_INNER_LOOP(32, crc, *pdata++);
-+#else
-+      pend = pdata + nbytes;
-+      while (pdata < pend)
-+              CRC_INNER_LOOP(32, crc, *pdata++);
-+#endif /* __mips__ */
-+
-+      return crc;
-+}
-+
-+
-+/*
-+ * Advance from the current 1-byte tag/1-byte length/variable-length value
-+ * triple, to the next, returning a pointer to the next.
-+ * If the current or next TLV is invalid (does not fit in given buffer length),
-+ * NULL is returned.
-+ * *buflen is not modified if the TLV elt parameter is invalid, or is decremented
-+ * by the TLV paramter's length if it is valid.
-+ */
-+bcm_tlv_t *
-+bcm_next_tlv(bcm_tlv_t *elt, int *buflen)
-+{
-+      int len;
-+
-+      /* validate current elt */
-+      if (!bcm_valid_tlv(elt, *buflen))
-+              return NULL;
-+
-+      /* advance to next elt */
-+      len = elt->len;
-+      elt = (bcm_tlv_t*)(elt->data + len);
-+      *buflen -= (2 + len);
-+
-+      /* validate next elt */
-+      if (!bcm_valid_tlv(elt, *buflen))
-+              return NULL;
-+
-+      return elt;
-+}
-+
-+/*
-+ * Traverse a string of 1-byte tag/1-byte length/variable-length value
-+ * triples, returning a pointer to the substring whose first element
-+ * matches tag
-+ */
-+bcm_tlv_t *
-+bcm_parse_tlvs(void *buf, int buflen, uint key)
-+{
-+      bcm_tlv_t *elt;
-+      int totlen;
-+
-+      elt = (bcm_tlv_t*)buf;
-+      totlen = buflen;
-+
-+      /* find tagged parameter */
-+      while (totlen >= 2) {
-+              int len = elt->len;
-+
-+              /* validate remaining totlen */
-+              if ((elt->id == key) && (totlen >= (len + 2)))
-+                      return (elt);
-+
-+              elt = (bcm_tlv_t*)((uint8*)elt + (len + 2));
-+              totlen -= (len + 2);
-+      }
-+
-+      return NULL;
-+}
-+
-+/*
-+ * Traverse a string of 1-byte tag/1-byte length/variable-length value
-+ * triples, returning a pointer to the substring whose first element
-+ * matches tag.  Stop parsing when we see an element whose ID is greater
-+ * than the target key.
-+ */
-+bcm_tlv_t *
-+bcm_parse_ordered_tlvs(void *buf, int buflen, uint key)
-+{
-+      bcm_tlv_t *elt;
-+      int totlen;
-+
-+      elt = (bcm_tlv_t*)buf;
-+      totlen = buflen;
-+
-+      /* find tagged parameter */
-+      while (totlen >= 2) {
-+              uint id = elt->id;
-+              int len = elt->len;
-+
-+              /* Punt if we start seeing IDs > than target key */
-+              if (id > key)
-+                      return (NULL);
-+
-+              /* validate remaining totlen */
-+              if ((id == key) && (totlen >= (len + 2)))
-+                      return (elt);
-+
-+              elt = (bcm_tlv_t*)((uint8*)elt + (len + 2));
-+              totlen -= (len + 2);
-+      }
-+      return NULL;
-+}
-+
-+
-+/* Initialization of bcmstrbuf structure */
-+void
-+bcm_binit(struct bcmstrbuf *b, char *buf, uint size)
-+{
-+      b->origsize = b->size = size;
-+      b->origbuf = b->buf = buf;
-+}
-+
-+/* Buffer sprintf wrapper to guard against buffer overflow */
-+int
-+bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...)
-+{
-+      va_list ap;
-+      int r;
-+
-+      va_start(ap, fmt);
-+      r = vsnprintf(b->buf, b->size, fmt, ap);
-+
-+      /* Non Ansi C99 compliant returns -1,
-+       * Ansi compliant return r >= b->size,
-+       * bcmstdlib returns 0, handle all
-+       */
-+      if ((r == -1) || (r >= (int)b->size) || (r == 0))
-+      {
-+              b->size = 0;
-+      }
-+      else
-+      {
-+              b->size -= r;
-+              b->buf += r;
-+      }
-+
-+      va_end(ap);
-+
-+      return r;
-+}
-diff -urN linux.old/drivers/net/wl/hnddma.c linux.dev/drivers/net/wl/hnddma.c
---- linux.old/drivers/net/wl/hnddma.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/hnddma.c  2006-05-02 17:42:13.000000000 +0200
-@@ -0,0 +1,1157 @@
-+/*
-+ * Generic Broadcom Home Networking Division (HND) DMA module.
-+ * This supports the following chips: BCM42xx, 44xx, 47xx .
-+ *
-+ * 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: hnddma.c,v 1.11 2006/04/08 07:12:42 honor Exp $
-+ */
-+
-+#include <typedefs.h>
-+#include <bcmdefs.h>
-+#include <osl.h>
-+#include "linux_osl.h"
-+#include <bcmendian.h>
-+#include <sbconfig.h>
-+#include <bcmutils.h>
-+#include <bcmdevs.h>
-+#include <sbutils.h>
-+
-+#include "sbhnddma.h"
-+#include "hnddma.h"
-+
-+/* debug/trace */
-+#define       DMA_ERROR(args)
-+#define       DMA_TRACE(args)
-+
-+/* default dma message level (if input msg_level pointer is null in dma_attach()) */
-+static uint dma_msg_level =
-+      0;
-+
-+#define       MAXNAMEL        8               /* 8 char names */
-+
-+#define       DI_INFO(dmah)   (dma_info_t *)dmah
-+
-+/* dma engine software state */
-+typedef struct dma_info {
-+      struct hnddma_pub hnddma;       /* exported structure, don't use hnddma_t,
-+                                       * which could be const
-+                                       */
-+      uint            *msg_level;     /* message level pointer */
-+      char            name[MAXNAMEL]; /* callers name for diag msgs */
-+
-+      void            *osh;           /* os handle */
-+      sb_t            *sbh;           /* sb handle */
-+
-+      bool            dma64;          /* dma64 enabled */
-+      bool            addrext;        /* this dma engine supports DmaExtendedAddrChanges */
-+
-+      dma32regs_t     *d32txregs;     /* 32 bits dma tx engine registers */
-+      dma32regs_t     *d32rxregs;     /* 32 bits dma rx engine registers */
-+      dma64regs_t     *d64txregs;     /* 64 bits dma tx engine registers */
-+      dma64regs_t     *d64rxregs;     /* 64 bits dma rx engine registers */
-+
-+      uint32          dma64align;     /* either 8k or 4k depends on number of dd */
-+      dma32dd_t       *txd32;         /* pointer to dma32 tx descriptor ring */
-+      dma64dd_t       *txd64;         /* pointer to dma64 tx descriptor ring */
-+      uint            ntxd;           /* # tx descriptors tunable */
-+      uint            txin;           /* index of next descriptor to reclaim */
-+      uint            txout;          /* index of next descriptor to post */
-+      void            **txp;          /* pointer to parallel array of pointers to packets */
-+      osldma_t        *tx_dmah;       /* DMA TX descriptor ring handle */
-+      osldma_t        **txp_dmah;     /* DMA TX packet data handle */
-+      ulong           txdpa;          /* physical address of descriptor ring */
-+      uint            txdalign;       /* #bytes added to alloc'd mem to align txd */
-+      uint            txdalloc;       /* #bytes allocated for the ring */
-+
-+      dma32dd_t       *rxd32;         /* pointer to dma32 rx descriptor ring */
-+      dma64dd_t       *rxd64;         /* pointer to dma64 rx descriptor ring */
-+      uint            nrxd;           /* # rx descriptors tunable */
-+      uint            rxin;           /* index of next descriptor to reclaim */
-+      uint            rxout;          /* index of next descriptor to post */
-+      void            **rxp;          /* pointer to parallel array of pointers to packets */
-+      osldma_t        *rx_dmah;       /* DMA RX descriptor ring handle */
-+      osldma_t        **rxp_dmah;     /* DMA RX packet data handle */
-+      ulong           rxdpa;          /* physical address of descriptor ring */
-+      uint            rxdalign;       /* #bytes added to alloc'd mem to align rxd */
-+      uint            rxdalloc;       /* #bytes allocated for the ring */
-+
-+      /* tunables */
-+      uint            rxbufsize;      /* rx buffer size in bytes,
-+                                         not including the extra headroom
-+                                      */
-+      uint            nrxpost;        /* # rx buffers to keep posted */
-+      uint            rxoffset;       /* rxcontrol offset */
-+      uint            ddoffsetlow;    /* add to get dma address of descriptor ring, low 32 bits */
-+      uint            ddoffsethigh;   /*   high 32 bits */
-+      uint            dataoffsetlow;  /* add to get dma address of data buffer, low 32 bits */
-+      uint            dataoffsethigh; /*   high 32 bits */
-+} dma_info_t;
-+
-+/* descriptor bumping macros */
-+#define       XXD(x, n)       ((x) & ((n) - 1))       /* faster than %, but n must be power of 2 */
-+#define       TXD(x)          XXD((x), di->ntxd)
-+#define       RXD(x)          XXD((x), di->nrxd)
-+#define       NEXTTXD(i)      TXD(i + 1)
-+#define       PREVTXD(i)      TXD(i - 1)
-+#define       NEXTRXD(i)      RXD(i + 1)
-+#define       NTXDACTIVE(h, t)        TXD(t - h)
-+#define       NRXDACTIVE(h, t)        RXD(t - h)
-+
-+/* macros to convert between byte offsets and indexes */
-+#define       B2I(bytes, type)        ((bytes) / sizeof(type))
-+#define       I2B(index, type)        ((index) * sizeof(type))
-+
-+#define       PCI32ADDR_HIGH          0xc0000000      /* address[31:30] */
-+#define       PCI32ADDR_HIGH_SHIFT    30              /* address[31:30] */
-+
-+
-+/* common prototypes */
-+static bool _dma_isaddrext(dma_info_t *di);
-+static bool dma32_alloc(dma_info_t *di, uint direction);
-+static void _dma_detach(dma_info_t *di);
-+static void _dma_ddtable_init(dma_info_t *di, uint direction, ulong pa);
-+static void _dma_rxinit(dma_info_t *di);
-+static void *_dma_rx(dma_info_t *di);
-+static void _dma_rxfill(dma_info_t *di);
-+static void _dma_rxreclaim(dma_info_t *di);
-+static void _dma_rxenable(dma_info_t *di);
-+static void * _dma_getnextrxp(dma_info_t *di, bool forceall);
-+
-+static void _dma_txblock(dma_info_t *di);
-+static void _dma_txunblock(dma_info_t *di);
-+static uint _dma_txactive(dma_info_t *di);
-+
-+static void* _dma_peeknexttxp(dma_info_t *di);
-+static uintptr _dma_getvar(dma_info_t *di, char *name);
-+static void _dma_counterreset(dma_info_t *di);
-+static void _dma_fifoloopbackenable(dma_info_t *di);
-+
-+/* ** 32 bit DMA prototypes */
-+static bool dma32_alloc(dma_info_t *di, uint direction);
-+static bool dma32_txreset(dma_info_t *di);
-+static bool dma32_rxreset(dma_info_t *di);
-+static bool dma32_txsuspendedidle(dma_info_t *di);
-+static int  dma32_txfast(dma_info_t *di, void *p0, bool commit);
-+static void *dma32_getnexttxp(dma_info_t *di, bool forceall);
-+static void *dma32_getnextrxp(dma_info_t *di, bool forceall);
-+static void dma32_txrotate(dma_info_t *di);
-+static bool dma32_rxidle(dma_info_t *di);
-+static void dma32_txinit(dma_info_t *di);
-+static bool dma32_txenabled(dma_info_t *di);
-+static void dma32_txsuspend(dma_info_t *di);
-+static void dma32_txresume(dma_info_t *di);
-+static bool dma32_txsuspended(dma_info_t *di);
-+static void dma32_txreclaim(dma_info_t *di, bool forceall);
-+static bool dma32_txstopped(dma_info_t *di);
-+static bool dma32_rxstopped(dma_info_t *di);
-+static bool dma32_rxenabled(dma_info_t *di);
-+static bool _dma32_addrext(osl_t *osh, dma32regs_t *dma32regs);
-+
-+
-+static di_fcn_t dma32proc = {
-+      (di_detach_t)_dma_detach,
-+      (di_txinit_t)dma32_txinit,
-+      (di_txreset_t)dma32_txreset,
-+      (di_txenabled_t)dma32_txenabled,
-+      (di_txsuspend_t)dma32_txsuspend,
-+      (di_txresume_t)dma32_txresume,
-+      (di_txsuspended_t)dma32_txsuspended,
-+      (di_txsuspendedidle_t)dma32_txsuspendedidle,
-+      (di_txfast_t)dma32_txfast,
-+      (di_txstopped_t)dma32_txstopped,
-+      (di_txreclaim_t)dma32_txreclaim,
-+      (di_getnexttxp_t)dma32_getnexttxp,
-+      (di_peeknexttxp_t)_dma_peeknexttxp,
-+      (di_txblock_t)_dma_txblock,
-+      (di_txunblock_t)_dma_txunblock,
-+      (di_txactive_t)_dma_txactive,
-+      (di_txrotate_t)dma32_txrotate,
-+
-+      (di_rxinit_t)_dma_rxinit,
-+      (di_rxreset_t)dma32_rxreset,
-+      (di_rxidle_t)dma32_rxidle,
-+      (di_rxstopped_t)dma32_rxstopped,
-+      (di_rxenable_t)_dma_rxenable,
-+      (di_rxenabled_t)dma32_rxenabled,
-+      (di_rx_t)_dma_rx,
-+      (di_rxfill_t)_dma_rxfill,
-+      (di_rxreclaim_t)_dma_rxreclaim,
-+      (di_getnextrxp_t)_dma_getnextrxp,
-+
-+      (di_fifoloopbackenable_t)_dma_fifoloopbackenable,
-+      (di_getvar_t)_dma_getvar,
-+      (di_counterreset_t)_dma_counterreset,
-+
-+      NULL,
-+      NULL,
-+      NULL,
-+      34
-+};
-+
-+hnddma_t *
-+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)
-+{
-+      dma_info_t *di;
-+      uint size;
-+
-+      /* allocate private info structure */
-+      if ((di = MALLOC(osh, sizeof (dma_info_t))) == NULL) {
-+              return (NULL);
-+      }
-+      bzero((char *)di, sizeof(dma_info_t));
-+
-+      di->msg_level = msg_level ? msg_level : &dma_msg_level;
-+
-+      /* old chips w/o sb is no longer supported */
-+      ASSERT(sbh != NULL);
-+
-+      /* check arguments */
-+      ASSERT(ISPOWEROF2(ntxd));
-+      ASSERT(ISPOWEROF2(nrxd));
-+      if (nrxd == 0)
-+              ASSERT(dmaregsrx == NULL);
-+      if (ntxd == 0)
-+              ASSERT(dmaregstx == NULL);
-+
-+
-+      /* init dma reg pointer */
-+      ASSERT(ntxd <= D32MAXDD);
-+      ASSERT(nrxd <= D32MAXDD);
-+      di->d32txregs = (dma32regs_t *)dmaregstx;
-+      di->d32rxregs = (dma32regs_t *)dmaregsrx;
-+
-+      DMA_TRACE(("%s: dma_attach: %s osh %p ntxd %d nrxd %d rxbufsize %d nrxpost %d "
-+                 "rxoffset %d dmaregstx %p dmaregsrx %p\n",
-+                 name, "DMA32", osh, ntxd, nrxd, rxbufsize,
-+                 nrxpost, rxoffset, dmaregstx, dmaregsrx));
-+
-+      /* make a private copy of our callers name */
-+      strncpy(di->name, name, MAXNAMEL);
-+      di->name[MAXNAMEL-1] = '\0';
-+
-+      di->osh = osh;
-+      di->sbh = sbh;
-+
-+      /* save tunables */
-+      di->ntxd = ntxd;
-+      di->nrxd = nrxd;
-+
-+      /* the actual dma size doesn't include the extra headroom */
-+      if (rxbufsize > BCMEXTRAHDROOM)
-+              di->rxbufsize = rxbufsize - BCMEXTRAHDROOM;
-+      else
-+              di->rxbufsize = rxbufsize;
-+
-+      di->nrxpost = nrxpost;
-+      di->rxoffset = rxoffset;
-+
-+      /*
-+       * figure out the DMA physical address offset for dd and data
-+       *   for old chips w/o sb, use zero
-+       *   for new chips w sb,
-+       *     PCI/PCIE: they map silicon backplace address to zero based memory, need offset
-+       *     Other bus: use zero
-+       *     SB_BUS BIGENDIAN kludge: use sdram swapped region for data buffer, not descriptor
-+       */
-+      di->ddoffsetlow = 0;
-+      di->dataoffsetlow = 0;
-+      /* for pci bus, add offset */
-+      if (sbh->bustype == PCI_BUS) {
-+              di->ddoffsetlow = SB_PCI_DMA;
-+              di->ddoffsethigh = 0;
-+              di->dataoffsetlow =  di->ddoffsetlow;
-+              di->dataoffsethigh =  di->ddoffsethigh;
-+      }
-+
-+#if defined(__mips__) && defined(IL_BIGENDIAN)
-+      di->dataoffsetlow = di->dataoffsetlow + SB_SDRAM_SWAPPED;
-+#endif
-+
-+      di->addrext = _dma_isaddrext(di);
-+
-+      /* allocate tx packet pointer vector */
-+      if (ntxd) {
-+              size = ntxd * sizeof(void *);
-+              if ((di->txp = MALLOC(osh, size)) == NULL) {
-+                      DMA_ERROR(("%s: dma_attach: out of tx memory, malloced %d bytes\n",
-+                                 di->name, MALLOCED(osh)));
-+                      goto fail;
-+              }
-+              bzero((char *)di->txp, size);
-+      }
-+
-+      /* allocate rx packet pointer vector */
-+      if (nrxd) {
-+              size = nrxd * sizeof(void *);
-+              if ((di->rxp = MALLOC(osh, size)) == NULL) {
-+                      DMA_ERROR(("%s: dma_attach: out of rx memory, malloced %d bytes\n",
-+                                 di->name, MALLOCED(osh)));
-+                      goto fail;
-+              }
-+              bzero((char *)di->rxp, size);
-+      }
-+
-+      /* allocate transmit descriptor ring, only need ntxd descriptors but it must be aligned */
-+      if (ntxd) {
-+              if (!dma32_alloc(di, DMA_TX))
-+                      goto fail;
-+      }
-+
-+      /* allocate receive descriptor ring, only need nrxd descriptors but it must be aligned */
-+      if (nrxd) {
-+              if (!dma32_alloc(di, DMA_RX))
-+                      goto fail;
-+      }
-+
-+      if ((di->ddoffsetlow == SB_PCI_DMA) && (di->txdpa > SB_PCI_DMA_SZ) && !di->addrext) {
-+              DMA_ERROR(("%s: dma_attach: txdpa 0x%lx: addrext not supported\n",
-+                         di->name, di->txdpa));
-+              goto fail;
-+      }
-+      if ((di->ddoffsetlow == SB_PCI_DMA) && (di->rxdpa > SB_PCI_DMA_SZ) && !di->addrext) {
-+              DMA_ERROR(("%s: dma_attach: rxdpa 0x%lx: addrext not supported\n",
-+                         di->name, di->rxdpa));
-+              goto fail;
-+      }
-+
-+      DMA_TRACE(("ddoffsetlow 0x%x ddoffsethigh 0x%x dataoffsetlow 0x%x dataoffsethigh "
-+                 "0x%x addrext %d\n", di->ddoffsetlow, di->ddoffsethigh, di->dataoffsetlow,
-+                 di->dataoffsethigh, di->addrext));
-+
-+      /* allocate tx packet pointer vector and DMA mapping vectors */
-+      if (ntxd) {
-+
-+              size = ntxd * sizeof(osldma_t **);
-+              if ((di->txp_dmah = (osldma_t **)MALLOC(osh, size)) == NULL)
-+                      goto fail;
-+              bzero((char*)di->txp_dmah, size);
-+      }else
-+              di->txp_dmah = NULL;
-+
-+      /* allocate rx packet pointer vector and DMA mapping vectors */
-+      if (nrxd) {
-+
-+              size = nrxd * sizeof(osldma_t **);
-+              if ((di->rxp_dmah = (osldma_t **)MALLOC(osh, size)) == NULL)
-+                      goto fail;
-+              bzero((char*)di->rxp_dmah, size);
-+
-+      } else
-+              di->rxp_dmah = NULL;
-+
-+      /* initialize opsvec of function pointers */
-+      di->hnddma.di_fn = dma32proc;
-+
-+      return ((hnddma_t *)di);
-+
-+fail:
-+      _dma_detach(di);
-+      return (NULL);
-+}
-+
-+/* init the tx or rx descriptor */
-+static INLINE void
-+dma32_dd_upd(dma_info_t *di, dma32dd_t *ddring, ulong pa, uint outidx, uint32 *flags,
-+             uint32 bufcount)
-+{
-+      /* dma32 uses 32 bits control to fit both flags and bufcounter */
-+      *flags = *flags | (bufcount & CTRL_BC_MASK);
-+
-+      if ((di->dataoffsetlow != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) {
-+              W_SM(&ddring[outidx].addr, BUS_SWAP32(pa + di->dataoffsetlow));
-+              W_SM(&ddring[outidx].ctrl, BUS_SWAP32(*flags));
-+      } else {
-+              /* address extension */
-+              uint32 ae;
-+              ASSERT(di->addrext);
-+              ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT;
-+              pa &= ~PCI32ADDR_HIGH;
-+
-+              *flags |= (ae << CTRL_AE_SHIFT);
-+              W_SM(&ddring[outidx].addr, BUS_SWAP32(pa + di->dataoffsetlow));
-+              W_SM(&ddring[outidx].ctrl, BUS_SWAP32(*flags));
-+      }
-+}
-+
-+static bool
-+_dma32_addrext(osl_t *osh, dma32regs_t *dma32regs)
-+{
-+      uint32 w;
-+
-+      OR_REG(osh, &dma32regs->control, XC_AE);
-+      w = R_REG(osh, &dma32regs->control);
-+      AND_REG(osh, &dma32regs->control, ~XC_AE);
-+      return ((w & XC_AE) == XC_AE);
-+}
-+
-+/* !! may be called with core in reset */
-+static void
-+_dma_detach(dma_info_t *di)
-+{
-+      if (di == NULL)
-+              return;
-+
-+      DMA_TRACE(("%s: dma_detach\n", di->name));
-+
-+      /* shouldn't be here if descriptors are unreclaimed */
-+      ASSERT(di->txin == di->txout);
-+      ASSERT(di->rxin == di->rxout);
-+
-+      /* free dma descriptor rings */
-+      if (di->txd32)
-+              DMA_FREE_CONSISTENT(di->osh, ((int8*)di->txd32 - di->txdalign),
-+                                  di->txdalloc, (di->txdpa - di->txdalign), &di->tx_dmah);
-+      if (di->rxd32)
-+              DMA_FREE_CONSISTENT(di->osh, ((int8*)di->rxd32 - di->rxdalign),
-+                                  di->rxdalloc, (di->rxdpa - di->rxdalign), &di->rx_dmah);
-+
-+      /* free packet pointer vectors */
-+      if (di->txp)
-+              MFREE(di->osh, (void *)di->txp, (di->ntxd * sizeof(void *)));
-+      if (di->rxp)
-+              MFREE(di->osh, (void *)di->rxp, (di->nrxd * sizeof(void *)));
-+
-+      /* free tx packet DMA handles */
-+      if (di->txp_dmah)
-+              MFREE(di->osh, (void *)di->txp_dmah, di->ntxd * sizeof(osldma_t **));
-+
-+      /* free rx packet DMA handles */
-+      if (di->rxp_dmah)
-+              MFREE(di->osh, (void *)di->rxp_dmah, di->nrxd * sizeof(osldma_t **));
-+
-+      /* free our private info structure */
-+      MFREE(di->osh, (void *)di, sizeof(dma_info_t));
-+
-+}
-+
-+/* return TRUE if this dma engine supports DmaExtendedAddrChanges, otherwise FALSE */
-+static bool
-+_dma_isaddrext(dma_info_t *di)
-+{
-+      if (di->d32txregs)
-+              return (_dma32_addrext(di->osh, di->d32txregs));
-+      else if (di->d32rxregs)
-+              return (_dma32_addrext(di->osh, di->d32rxregs));
-+      return FALSE;
-+}
-+
-+/* initialize descriptor table base address */
-+static void
-+_dma_ddtable_init(dma_info_t *di, uint direction, ulong pa)
-+{
-+      if ((di->ddoffsetlow != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) {
-+              if (direction == DMA_TX)
-+                      W_REG(di->osh, &di->d32txregs->addr, (pa + di->ddoffsetlow));
-+              else
-+                      W_REG(di->osh, &di->d32rxregs->addr, (pa + di->ddoffsetlow));
-+      } else {
-+              /* dma32 address extension */
-+              uint32 ae;
-+              ASSERT(di->addrext);
-+
-+              /* shift the high bit(s) from pa to ae */
-+              ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT;
-+              pa &= ~PCI32ADDR_HIGH;
-+
-+              if (direction == DMA_TX) {
-+                      W_REG(di->osh, &di->d32txregs->addr, (pa + di->ddoffsetlow));
-+                      SET_REG(di->osh, &di->d32txregs->control, XC_AE, ae <<XC_AE_SHIFT);
-+              } else {
-+                      W_REG(di->osh, &di->d32rxregs->addr, (pa + di->ddoffsetlow));
-+                      SET_REG(di->osh, &di->d32rxregs->control, RC_AE, ae <<RC_AE_SHIFT);
-+              }
-+      }
-+}
-+
-+static void
-+_dma_fifoloopbackenable(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_fifoloopbackenable\n", di->name));
-+      OR_REG(di->osh, &di->d32txregs->control, XC_LE);
-+}
-+
-+static void
-+_dma_rxinit(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_rxinit\n", di->name));
-+
-+      if (di->nrxd == 0)
-+              return;
-+
-+      di->rxin = di->rxout = 0;
-+
-+      /* clear rx descriptor ring */
-+      BZERO_SM((void *)di->rxd32, (di->nrxd * sizeof(dma32dd_t)));
-+      _dma_rxenable(di);
-+      _dma_ddtable_init(di, DMA_RX, di->rxdpa);
-+}
-+
-+static void
-+_dma_rxenable(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_rxenable\n", di->name));
-+
-+      W_REG(di->osh, &di->d32rxregs->control, ((di->rxoffset << RC_RO_SHIFT) | RC_RE));
-+}
-+
-+/* !! rx entry routine, returns a pointer to the next frame received,
-+ * or NULL if there are no more
-+ */
-+static void *
-+_dma_rx(dma_info_t *di)
-+{
-+      void *p;
-+      uint len;
-+      int skiplen = 0;
-+
-+      while ((p = _dma_getnextrxp(di, FALSE))) {
-+              /* skip giant packets which span multiple rx descriptors */
-+              if (skiplen > 0) {
-+                      skiplen -= di->rxbufsize;
-+                      if (skiplen < 0)
-+                              skiplen = 0;
-+                      PKTFREE(di->osh, p, FALSE);
-+                      continue;
-+              }
-+
-+              len = ltoh16(*(uint16*)(PKTDATA(di->osh, p)));
-+              DMA_TRACE(("%s: dma_rx len %d\n", di->name, len));
-+
-+              /* bad frame length check */
-+              if (len > (di->rxbufsize - di->rxoffset)) {
-+                      DMA_ERROR(("%s: dma_rx: bad frame length (%d)\n", di->name, len));
-+                      if (len > 0)
-+                              skiplen = len - (di->rxbufsize - di->rxoffset);
-+                      PKTFREE(di->osh, p, FALSE);
-+                      di->hnddma.rxgiants++;
-+                      continue;
-+              }
-+
-+              /* set actual length */
-+              PKTSETLEN(di->osh, p, (di->rxoffset + len));
-+
-+              break;
-+      }
-+
-+      return (p);
-+}
-+
-+/* post receive buffers */
-+static void
-+_dma_rxfill(dma_info_t *di)
-+{
-+      void *p;
-+      uint rxin, rxout;
-+      uint32 flags = 0;
-+      uint n;
-+      uint i;
-+      uint32 pa;
-+      uint extra_offset = 0;
-+
-+      /*
-+       * Determine how many receive buffers we're lacking
-+       * from the full complement, allocate, initialize,
-+       * and post them, then update the chip rx lastdscr.
-+       */
-+
-+      rxin = di->rxin;
-+      rxout = di->rxout;
-+
-+      n = di->nrxpost - NRXDACTIVE(rxin, rxout);
-+
-+      DMA_TRACE(("%s: dma_rxfill: post %d\n", di->name, n));
-+
-+      if (di->rxbufsize > BCMEXTRAHDROOM)
-+              extra_offset = BCMEXTRAHDROOM;
-+
-+      for (i = 0; i < n; i++) {
-+              /* the di->rxbufsize doesn't include the extra headroom, we need to add it to the
-+                 size to be allocated
-+              */
-+              if ((p = PKTGET(di->osh, di->rxbufsize + extra_offset,
-+                              FALSE)) == NULL) {
-+                      DMA_ERROR(("%s: dma_rxfill: out of rxbufs\n", di->name));
-+                      di->hnddma.rxnobuf++;
-+                      break;
-+              }
-+              /* reserve an extra headroom, if applicable */
-+              if (extra_offset)
-+                      PKTPULL(di->osh, p, extra_offset);
-+
-+              /* Do a cached write instead of uncached write since DMA_MAP
-+               * will flush the cache.
-+               */
-+              *(uint32*)(PKTDATA(di->osh, p)) = 0;
-+
-+              pa = (uint32) DMA_MAP(di->osh, PKTDATA(di->osh, p),
-+                                    di->rxbufsize, DMA_RX, p);
-+
-+              ASSERT(ISALIGNED(pa, 4));
-+
-+              /* save the free packet pointer */
-+              ASSERT(di->rxp[rxout] == NULL);
-+              di->rxp[rxout] = p;
-+
-+              /* reset flags for each descriptor */
-+              flags = 0;
-+              if (rxout == (di->nrxd - 1))
-+                      flags = CTRL_EOT;
-+              dma32_dd_upd(di, di->rxd32, pa, rxout, &flags, di->rxbufsize);
-+              rxout = NEXTRXD(rxout);
-+      }
-+
-+      di->rxout = rxout;
-+
-+      /* update the chip lastdscr pointer */
-+      W_REG(di->osh, &di->d32rxregs->ptr, I2B(rxout, dma32dd_t));
-+}
-+
-+/* like getnexttxp but no reclaim */
-+static void *
-+_dma_peeknexttxp(dma_info_t *di)
-+{
-+      uint end, i;
-+
-+      if (di->ntxd == 0)
-+              return (NULL);
-+
-+      end = B2I(R_REG(di->osh, &di->d32txregs->status) & XS_CD_MASK, dma32dd_t);
-+
-+      for (i = di->txin; i != end; i = NEXTTXD(i))
-+              if (di->txp[i])
-+                      return (di->txp[i]);
-+
-+      return (NULL);
-+}
-+
-+static void
-+_dma_rxreclaim(dma_info_t *di)
-+{
-+      void *p;
-+
-+      /* "unused local" warning suppression for OSLs that
-+       * define PKTFREE() without using the di->osh arg
-+       */
-+      di = di;
-+
-+      DMA_TRACE(("%s: dma_rxreclaim\n", di->name));
-+
-+      while ((p = _dma_getnextrxp(di, TRUE)))
-+              PKTFREE(di->osh, p, FALSE);
-+}
-+
-+static void *
-+_dma_getnextrxp(dma_info_t *di, bool forceall)
-+{
-+      if (di->nrxd == 0)
-+              return (NULL);
-+
-+      return dma32_getnextrxp(di, forceall);
-+}
-+
-+static void
-+_dma_txblock(dma_info_t *di)
-+{
-+      di->hnddma.txavail = 0;
-+}
-+
-+static void
-+_dma_txunblock(dma_info_t *di)
-+{
-+      di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
-+}
-+
-+static uint
-+_dma_txactive(dma_info_t *di)
-+{
-+      return (NTXDACTIVE(di->txin, di->txout));
-+}
-+
-+static void
-+_dma_counterreset(dma_info_t *di)
-+{
-+      /* reset all software counter */
-+      di->hnddma.rxgiants = 0;
-+      di->hnddma.rxnobuf = 0;
-+      di->hnddma.txnobuf = 0;
-+}
-+
-+/* get the address of the var in order to change later */
-+static uintptr
-+_dma_getvar(dma_info_t *di, char *name)
-+{
-+      if (!strcmp(name, "&txavail"))
-+              return ((uintptr) &(di->hnddma.txavail));
-+      else {
-+              ASSERT(0);
-+      }
-+      return (0);
-+}
-+
-+void
-+dma_txpioloopback(osl_t *osh, dma32regs_t *regs)
-+{
-+      OR_REG(osh, &regs->control, XC_LE);
-+}
-+
-+
-+
-+/* 32 bits DMA functions */
-+static void
-+dma32_txinit(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_txinit\n", di->name));
-+
-+      if (di->ntxd == 0)
-+              return;
-+
-+      di->txin = di->txout = 0;
-+      di->hnddma.txavail = di->ntxd - 1;
-+
-+      /* clear tx descriptor ring */
-+      BZERO_SM((void *)di->txd32, (di->ntxd * sizeof(dma32dd_t)));
-+      W_REG(di->osh, &di->d32txregs->control, XC_XE);
-+      _dma_ddtable_init(di, DMA_TX, di->txdpa);
-+}
-+
-+static bool
-+dma32_txenabled(dma_info_t *di)
-+{
-+      uint32 xc;
-+
-+      /* If the chip is dead, it is not enabled :-) */
-+      xc = R_REG(di->osh, &di->d32txregs->control);
-+      return ((xc != 0xffffffff) && (xc & XC_XE));
-+}
-+
-+static void
-+dma32_txsuspend(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_txsuspend\n", di->name));
-+
-+      if (di->ntxd == 0)
-+              return;
-+
-+      OR_REG(di->osh, &di->d32txregs->control, XC_SE);
-+}
-+
-+static void
-+dma32_txresume(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_txresume\n", di->name));
-+
-+      if (di->ntxd == 0)
-+              return;
-+
-+      AND_REG(di->osh, &di->d32txregs->control, ~XC_SE);
-+}
-+
-+static bool
-+dma32_txsuspended(dma_info_t *di)
-+{
-+      return (di->ntxd == 0) || ((R_REG(di->osh, &di->d32txregs->control) & XC_SE) == XC_SE);
-+}
-+
-+static void
-+dma32_txreclaim(dma_info_t *di, bool forceall)
-+{
-+      void *p;
-+
-+      DMA_TRACE(("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : ""));
-+
-+      while ((p = dma32_getnexttxp(di, forceall)))
-+              PKTFREE(di->osh, p, TRUE);
-+}
-+
-+static bool
-+dma32_txstopped(dma_info_t *di)
-+{
-+      return ((R_REG(di->osh, &di->d32txregs->status) & XS_XS_MASK) == XS_XS_STOPPED);
-+}
-+
-+static bool
-+dma32_rxstopped(dma_info_t *di)
-+{
-+      return ((R_REG(di->osh, &di->d32rxregs->status) & RS_RS_MASK) == RS_RS_STOPPED);
-+}
-+
-+static bool
-+dma32_alloc(dma_info_t *di, uint direction)
-+{
-+      uint size;
-+      uint ddlen;
-+      void *va;
-+
-+      ddlen = sizeof(dma32dd_t);
-+
-+      size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen);
-+
-+      if (!ISALIGNED(DMA_CONSISTENT_ALIGN, D32RINGALIGN))
-+              size += D32RINGALIGN;
-+
-+
-+      if (direction == DMA_TX) {
-+              if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->txdpa, &di->tx_dmah)) == NULL) {
-+                      DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(ntxd) failed\n",
-+                                 di->name));
-+                      return FALSE;
-+              }
-+
-+              di->txd32 = (dma32dd_t *) ROUNDUP((uintptr)va, D32RINGALIGN);
-+              di->txdalign = (uint)((int8*)di->txd32 - (int8*)va);
-+              di->txdpa += di->txdalign;
-+              di->txdalloc = size;
-+              ASSERT(ISALIGNED((uintptr)di->txd32, D32RINGALIGN));
-+      } else {
-+              if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->rxdpa, &di->rx_dmah)) == NULL) {
-+                      DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(nrxd) failed\n",
-+                                 di->name));
-+                      return FALSE;
-+              }
-+              di->rxd32 = (dma32dd_t *) ROUNDUP((uintptr)va, D32RINGALIGN);
-+              di->rxdalign = (uint)((int8*)di->rxd32 - (int8*)va);
-+              di->rxdpa += di->rxdalign;
-+              di->rxdalloc = size;
-+              ASSERT(ISALIGNED((uintptr)di->rxd32, D32RINGALIGN));
-+      }
-+
-+      return TRUE;
-+}
-+
-+static bool
-+dma32_txreset(dma_info_t *di)
-+{
-+      uint32 status;
-+
-+      if (di->ntxd == 0)
-+              return TRUE;
-+
-+      /* suspend tx DMA first */
-+      W_REG(di->osh, &di->d32txregs->control, XC_SE);
-+      SPINWAIT(((status = (R_REG(di->osh, &di->d32txregs->status) & XS_XS_MASK))
-+               != XS_XS_DISABLED) &&
-+               (status != XS_XS_IDLE) &&
-+               (status != XS_XS_STOPPED),
-+               (10000));
-+
-+      W_REG(di->osh, &di->d32txregs->control, 0);
-+      SPINWAIT(((status = (R_REG(di->osh,
-+               &di->d32txregs->status) & XS_XS_MASK)) != XS_XS_DISABLED),
-+               10000);
-+
-+      /* wait for the last transaction to complete */
-+      OSL_DELAY(300);
-+
-+      return (status == XS_XS_DISABLED);
-+}
-+
-+static bool
-+dma32_rxidle(dma_info_t *di)
-+{
-+      DMA_TRACE(("%s: dma_rxidle\n", di->name));
-+
-+      if (di->nrxd == 0)
-+              return TRUE;
-+
-+      return ((R_REG(di->osh, &di->d32rxregs->status) & RS_CD_MASK) ==
-+              R_REG(di->osh, &di->d32rxregs->ptr));
-+}
-+
-+static bool
-+dma32_rxreset(dma_info_t *di)
-+{
-+      uint32 status;
-+
-+      if (di->nrxd == 0)
-+              return TRUE;
-+
-+      W_REG(di->osh, &di->d32rxregs->control, 0);
-+      SPINWAIT(((status = (R_REG(di->osh,
-+               &di->d32rxregs->status) & RS_RS_MASK)) != RS_RS_DISABLED),
-+               10000);
-+
-+      return (status == RS_RS_DISABLED);
-+}
-+
-+static bool
-+dma32_rxenabled(dma_info_t *di)
-+{
-+      uint32 rc;
-+
-+      rc = R_REG(di->osh, &di->d32rxregs->control);
-+      return ((rc != 0xffffffff) && (rc & RC_RE));
-+}
-+
-+static bool
-+dma32_txsuspendedidle(dma_info_t *di)
-+{
-+      if (di->ntxd == 0)
-+              return TRUE;
-+
-+      if (!(R_REG(di->osh, &di->d32txregs->control) & XC_SE))
-+              return 0;
-+
-+      if ((R_REG(di->osh, &di->d32txregs->status) & XS_XS_MASK) != XS_XS_IDLE)
-+              return 0;
-+
-+      OSL_DELAY(2);
-+      return ((R_REG(di->osh, &di->d32txregs->status) & XS_XS_MASK) == XS_XS_IDLE);
-+}
-+
-+/* !! tx entry routine
-+ * supports full 32bit dma engine buffer addressing so
-+ * dma buffers can cross 4 Kbyte page boundaries.
-+ */
-+static int
-+dma32_txfast(dma_info_t *di, void *p0, bool commit)
-+{
-+      void *p, *next;
-+      uchar *data;
-+      uint len;
-+      uint txout;
-+      uint32 flags = 0;
-+      uint32 pa;
-+
-+      DMA_TRACE(("%s: dma_txfast\n", di->name));
-+
-+      txout = di->txout;
-+
-+      /*
-+       * Walk the chain of packet buffers
-+       * allocating and initializing transmit descriptor entries.
-+       */
-+      for (p = p0; p; p = next) {
-+              data = PKTDATA(di->osh, p);
-+              len = PKTLEN(di->osh, p);
-+              next = PKTNEXT(di->osh, p);
-+
-+              /* return nonzero if out of tx descriptors */
-+              if (NEXTTXD(txout) == di->txin)
-+                      goto outoftxd;
-+
-+              if (len == 0)
-+                      continue;
-+
-+              /* get physical address of buffer start */
-+              pa = (uint32) DMA_MAP(di->osh, data, len, DMA_TX, p);
-+
-+              flags = 0;
-+              if (p == p0)
-+                      flags |= CTRL_SOF;
-+              if (next == NULL)
-+                      flags |= (CTRL_IOC | CTRL_EOF);
-+              if (txout == (di->ntxd - 1))
-+                      flags |= CTRL_EOT;
-+
-+              dma32_dd_upd(di, di->txd32, pa, txout, &flags, len);
-+              ASSERT(di->txp[txout] == NULL);
-+
-+              txout = NEXTTXD(txout);
-+      }
-+
-+      /* if last txd eof not set, fix it */
-+      if (!(flags & CTRL_EOF))
-+              W_SM(&di->txd32[PREVTXD(txout)].ctrl, BUS_SWAP32(flags | CTRL_IOC | CTRL_EOF));
-+
-+      /* save the packet */
-+      di->txp[PREVTXD(txout)] = p0;
-+
-+      /* bump the tx descriptor index */
-+      di->txout = txout;
-+
-+      /* kick the chip */
-+      if (commit)
-+              W_REG(di->osh, &di->d32txregs->ptr, I2B(txout, dma32dd_t));
-+
-+      /* tx flow control */
-+      di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
-+
-+      return (0);
-+
-+outoftxd:
-+      DMA_ERROR(("%s: dma_txfast: out of txds\n", di->name));
-+      PKTFREE(di->osh, p0, TRUE);
-+      di->hnddma.txavail = 0;
-+      di->hnddma.txnobuf++;
-+      return (-1);
-+}
-+
-+/*
-+ * Reclaim next completed txd (txds if using chained buffers) and
-+ * return associated packet.
-+ * If 'force' is true, reclaim txd(s) and return associated packet
-+ * regardless of the value of the hardware "curr" pointer.
-+ */
-+static void *
-+dma32_getnexttxp(dma_info_t *di, bool forceall)
-+{
-+      uint start, end, i;
-+      void *txp;
-+
-+      DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : ""));
-+
-+      if (di->ntxd == 0)
-+              return (NULL);
-+
-+      txp = NULL;
-+
-+      start = di->txin;
-+      if (forceall)
-+              end = di->txout;
-+      else
-+              end = B2I(R_REG(di->osh, &di->d32txregs->status) & XS_CD_MASK, dma32dd_t);
-+
-+      if ((start == 0) && (end > di->txout))
-+              goto bogus;
-+
-+      for (i = start; i != end && !txp; i = NEXTTXD(i)) {
-+              DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->txd32[i].addr)) - di->dataoffsetlow),
-+                        (BUS_SWAP32(R_SM(&di->txd32[i].ctrl)) & CTRL_BC_MASK),
-+                        DMA_TX, di->txp[i]);
-+
-+              W_SM(&di->txd32[i].addr, 0xdeadbeef);
-+              txp = di->txp[i];
-+              di->txp[i] = NULL;
-+      }
-+
-+      di->txin = i;
-+
-+      /* tx flow control */
-+      di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
-+
-+      return (txp);
-+
-+bogus:
-+/*
-+      DMA_ERROR(("dma_getnexttxp: bogus curr: start %d end %d txout %d force %d\n",
-+              start, end, di->txout, forceall));
-+*/
-+      return (NULL);
-+}
-+
-+static void *
-+dma32_getnextrxp(dma_info_t *di, bool forceall)
-+{
-+      uint i;
-+      void *rxp;
-+
-+      /* if forcing, dma engine must be disabled */
-+      ASSERT(!forceall || !dma32_rxenabled(di));
-+
-+      i = di->rxin;
-+
-+      /* return if no packets posted */
-+      if (i == di->rxout)
-+              return (NULL);
-+
-+      /* ignore curr if forceall */
-+      if (!forceall && (i == B2I(R_REG(di->osh, &di->d32rxregs->status) & RS_CD_MASK, dma32dd_t)))
-+              return (NULL);
-+
-+      /* get the packet pointer that corresponds to the rx descriptor */
-+      rxp = di->rxp[i];
-+      ASSERT(rxp);
-+      di->rxp[i] = NULL;
-+
-+      /* clear this packet from the descriptor ring */
-+      DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->rxd32[i].addr)) - di->dataoffsetlow),
-+                di->rxbufsize, DMA_RX, rxp);
-+
-+      W_SM(&di->rxd32[i].addr, 0xdeadbeef);
-+
-+      di->rxin = NEXTRXD(i);
-+
-+      return (rxp);
-+}
-+
-+/*
-+ * Rotate all active tx dma ring entries "forward" by (ActiveDescriptor - txin).
-+ */
-+static void
-+dma32_txrotate(dma_info_t *di)
-+{
-+      uint ad;
-+      uint nactive;
-+      uint rot;
-+      uint old, new;
-+      uint32 w;
-+      uint first, last;
-+
-+      ASSERT(dma32_txsuspendedidle(di));
-+
-+      nactive = _dma_txactive(di);
-+      ad = B2I(((R_REG(di->osh, &di->d32txregs->status) & XS_AD_MASK) >> XS_AD_SHIFT), dma32dd_t);
-+      rot = TXD(ad - di->txin);
-+
-+      ASSERT(rot < di->ntxd);
-+
-+      /* full-ring case is a lot harder - don't worry about this */
-+      if (rot >= (di->ntxd - nactive)) {
-+              DMA_ERROR(("%s: dma_txrotate: ring full - punt\n", di->name));
-+              return;
-+      }
-+
-+      first = di->txin;
-+      last = PREVTXD(di->txout);
-+
-+      /* move entries starting at last and moving backwards to first */
-+      for (old = last; old != PREVTXD(first); old = PREVTXD(old)) {
-+              new = TXD(old + rot);
-+
-+              /*
-+               * Move the tx dma descriptor.
-+               * EOT is set only in the last entry in the ring.
-+               */
-+              w = BUS_SWAP32(R_SM(&di->txd32[old].ctrl)) & ~CTRL_EOT;
-+              if (new == (di->ntxd - 1))
-+                      w |= CTRL_EOT;
-+              W_SM(&di->txd32[new].ctrl, BUS_SWAP32(w));
-+              W_SM(&di->txd32[new].addr, R_SM(&di->txd32[old].addr));
-+
-+              /* zap the old tx dma descriptor address field */
-+              W_SM(&di->txd32[old].addr, BUS_SWAP32(0xdeadbeef));
-+
-+              /* move the corresponding txp[] entry */
-+              ASSERT(di->txp[new] == NULL);
-+              di->txp[new] = di->txp[old];
-+              di->txp[old] = NULL;
-+      }
-+
-+      /* update txin and txout */
-+      di->txin = ad;
-+      di->txout = TXD(di->txout + rot);
-+      di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
-+
-+      /* kick the chip */
-+      W_REG(di->osh, &di->d32txregs->ptr, I2B(di->txout, dma32dd_t));
-+}
-+
-+
-+uint
-+dma_addrwidth(sb_t *sbh, void *dmaregs)
-+{
-+      dma32regs_t *dma32regs;
-+      osl_t *osh;
-+
-+      osh = sb_osh(sbh);
-+
-+      /* Start checking for 32-bit / 30-bit addressing */
-+      dma32regs = (dma32regs_t *)dmaregs;
-+
-+      /* For System Backplane, PCIE bus or addrext feature, 32-bits ok */
-+      if ((BUSTYPE(sbh->bustype) == SB_BUS) ||
-+          ((BUSTYPE(sbh->bustype) == PCI_BUS) && sbh->buscoretype == SB_PCIE) ||
-+          (_dma32_addrext(osh, dma32regs)))
-+              return (DMADDRWIDTH_32);
-+
-+      /* Fallthru */
-+      return (DMADDRWIDTH_30);
-+}
-diff -urN linux.old/drivers/net/wl/hnddma.h linux.dev/drivers/net/wl/hnddma.h
---- linux.old/drivers/net/wl/hnddma.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/hnddma.h  2006-04-28 02:20:44.000000000 +0200
-@@ -0,0 +1,156 @@
-+/*
-+ * Generic Broadcom Home Networking Division (HND) DMA engine SW interface
-+ * This supports the following chips: BCM42xx, 44xx, 47xx .
-+ *
-+ * 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: hnddma.h,v 1.1.1.13 2006/04/08 06:13:39 honor Exp $
-+ */
-+
-+#ifndef       _hnddma_h_
-+#define       _hnddma_h_
-+
-+typedef const struct hnddma_pub hnddma_t;
-+
-+/* dma function type */
-+typedef void (*di_detach_t)(hnddma_t *dmah);
-+typedef bool (*di_txreset_t)(hnddma_t *dmah);
-+typedef bool (*di_rxreset_t)(hnddma_t *dmah);
-+typedef bool (*di_rxidle_t)(hnddma_t *dmah);
-+typedef void (*di_txinit_t)(hnddma_t *dmah);
-+typedef bool (*di_txenabled_t)(hnddma_t *dmah);
-+typedef void (*di_rxinit_t)(hnddma_t *dmah);
-+typedef void (*di_txsuspend_t)(hnddma_t *dmah);
-+typedef void (*di_txresume_t)(hnddma_t *dmah);
-+typedef bool (*di_txsuspended_t)(hnddma_t *dmah);
-+typedef bool (*di_txsuspendedidle_t)(hnddma_t *dmah);
-+typedef int (*di_txfast_t)(hnddma_t *dmah, void *p, bool commit);
-+typedef void (*di_fifoloopbackenable_t)(hnddma_t *dmah);
-+typedef bool  (*di_txstopped_t)(hnddma_t *dmah);
-+typedef bool  (*di_rxstopped_t)(hnddma_t *dmah);
-+typedef bool  (*di_rxenable_t)(hnddma_t *dmah);
-+typedef bool  (*di_rxenabled_t)(hnddma_t *dmah);
-+typedef void* (*di_rx_t)(hnddma_t *dmah);
-+typedef void (*di_rxfill_t)(hnddma_t *dmah);
-+typedef void (*di_txreclaim_t)(hnddma_t *dmah, bool forceall);
-+typedef void (*di_rxreclaim_t)(hnddma_t *dmah);
-+typedef       uintptr (*di_getvar_t)(hnddma_t *dmah, char *name);
-+typedef void* (*di_getnexttxp_t)(hnddma_t *dmah, bool forceall);
-+typedef void* (*di_getnextrxp_t)(hnddma_t *dmah, bool forceall);
-+typedef void* (*di_peeknexttxp_t)(hnddma_t *dmah);
-+typedef void (*di_txblock_t)(hnddma_t *dmah);
-+typedef void (*di_txunblock_t)(hnddma_t *dmah);
-+typedef uint (*di_txactive_t)(hnddma_t *dmah);
-+typedef void (*di_txrotate_t)(hnddma_t *dmah);
-+typedef void (*di_counterreset_t)(hnddma_t *dmah);
-+typedef char* (*di_dump_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
-+typedef char* (*di_dumptx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
-+typedef char* (*di_dumprx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
-+
-+/* dma opsvec */
-+typedef struct di_fcn_s {
-+      di_detach_t             detach;
-+      di_txinit_t             txinit;
-+      di_txreset_t            txreset;
-+      di_txenabled_t          txenabled;
-+      di_txsuspend_t          txsuspend;
-+      di_txresume_t           txresume;
-+      di_txsuspended_t        txsuspended;
-+      di_txsuspendedidle_t    txsuspendedidle;
-+      di_txfast_t             txfast;
-+      di_txstopped_t          txstopped;
-+      di_txreclaim_t          txreclaim;
-+      di_getnexttxp_t         getnexttxp;
-+      di_peeknexttxp_t        peeknexttxp;
-+      di_txblock_t            txblock;
-+      di_txunblock_t          txunblock;
-+      di_txactive_t           txactive;
-+      di_txrotate_t           txrotate;
-+
-+      di_rxinit_t             rxinit;
-+      di_rxreset_t            rxreset;
-+      di_rxidle_t             rxidle;
-+      di_rxstopped_t          rxstopped;
-+      di_rxenable_t           rxenable;
-+      di_rxenabled_t          rxenabled;
-+      di_rx_t                 rx;
-+      di_rxfill_t             rxfill;
-+      di_rxreclaim_t          rxreclaim;
-+      di_getnextrxp_t         getnextrxp;
-+
-+      di_fifoloopbackenable_t fifoloopbackenable;
-+      di_getvar_t             d_getvar;
-+      di_counterreset_t       counterreset;
-+      di_dump_t               dump;
-+      di_dumptx_t             dumptx;
-+      di_dumprx_t             dumprx;
-+      uint                    endnum;
-+} di_fcn_t;
-+
-+/*
-+ * Exported data structure (read-only)
-+ */
-+/* export structure */
-+struct hnddma_pub {
-+      di_fcn_t        di_fn;          /* DMA function pointers */
-+      uint            txavail;        /* # free tx descriptors */
-+
-+      /* 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 */
-+};
-+
-+
-+extern hnddma_t * 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);
-+#define dma_detach(di)                        ((di)->di_fn.detach(di))
-+#define dma_txreset(di)                       ((di)->di_fn.txreset(di))
-+#define dma_rxreset(di)                       ((di)->di_fn.rxreset(di))
-+#define dma_rxidle(di)                        ((di)->di_fn.rxidle(di))
-+#define dma_txinit(di)                  ((di)->di_fn.txinit(di))
-+#define dma_txenabled(di)               ((di)->di_fn.txenabled(di))
-+#define dma_rxinit(di)                  ((di)->di_fn.rxinit(di))
-+#define dma_txsuspend(di)               ((di)->di_fn.txsuspend(di))
-+#define dma_txresume(di)                ((di)->di_fn.txresume(di))
-+#define dma_txsuspended(di)             ((di)->di_fn.txsuspended(di))
-+#define dma_txsuspendedidle(di)         ((di)->di_fn.txsuspendedidle(di))
-+#define dma_txfast(di, p, commit)     ((di)->di_fn.txfast(di, p, commit))
-+#define dma_fifoloopbackenable(di)      ((di)->di_fn.fifoloopbackenable(di))
-+#define dma_txstopped(di)               ((di)->di_fn.txstopped(di))
-+#define dma_rxstopped(di)               ((di)->di_fn.rxstopped(di))
-+#define dma_rxenable(di)                ((di)->di_fn.rxenable(di))
-+#define dma_rxenabled(di)               ((di)->di_fn.rxenabled(di))
-+#define dma_rx(di)                      ((di)->di_fn.rx(di))
-+#define dma_rxfill(di)                  ((di)->di_fn.rxfill(di))
-+#define dma_txreclaim(di, forceall)   ((di)->di_fn.txreclaim(di, forceall))
-+#define dma_rxreclaim(di)               ((di)->di_fn.rxreclaim(di))
-+#define dma_getvar(di, name)          ((di)->di_fn.d_getvar(di, name))
-+#define dma_getnexttxp(di, forceall)    ((di)->di_fn.getnexttxp(di, forceall))
-+#define dma_getnextrxp(di, forceall)    ((di)->di_fn.getnextrxp(di, forceall))
-+#define dma_peeknexttxp(di)             ((di)->di_fn.peeknexttxp(di))
-+#define dma_txblock(di)                 ((di)->di_fn.txblock(di))
-+#define dma_txunblock(di)               ((di)->di_fn.txunblock(di))
-+#define dma_txactive(di)                ((di)->di_fn.txactive(di))
-+#define dma_txrotate(di)                ((di)->di_fn.txrotate(di))
-+#define dma_counterreset(di)            ((di)->di_fn.counterreset(di))
-+
-+#define DMA_DUMP_SIZE 2048
-+/* return addresswidth allowed
-+ * This needs to be done after SB attach but before dma attach.
-+ * SB attach provides ability to probe backplane and dma core capabilities
-+ * This info is needed by DMA_ALLOC_CONSISTENT in dma attach
-+ */
-+extern uint dma_addrwidth(sb_t *sbh, void *dmaregs);
-+
-+/* pio helpers */
-+void dma_txpioloopback(osl_t *osh, dma32regs_t *);
-+
-+#endif        /* _hnddma_h_ */
-diff -urN linux.old/drivers/net/wl/linux_osl.c linux.dev/drivers/net/wl/linux_osl.c
---- linux.old/drivers/net/wl/linux_osl.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/linux_osl.c       2006-04-28 02:29:46.000000000 +0200
-@@ -0,0 +1,269 @@
-+/*
-+ * Linux OS Independent Layer
-+ *
-+ * 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: linux_osl.c,v 1.1.1.14 2006/04/08 06:13:39 honor Exp $
-+ */
-+
-+#define LINUX_OSL
-+
-+#include <typedefs.h>
-+#include <bcmendian.h>
-+#include <linux/module.h>
-+#include <linuxver.h>
-+#include <bcmdefs.h>
-+#include <osl.h>
-+#include "linux_osl.h"
-+#include <bcmutils.h>
-+#include <linux/delay.h>
-+#ifdef mips
-+#include <asm/paccess.h>
-+#endif /* mips */
-+#include <pcicfg.h>
-+
-+#define PCI_CFG_RETRY                 10      
-+
-+#define OS_HANDLE_MAGIC               0x1234abcd      /* Magic # to recognise osh */
-+#define BCM_MEM_FILENAME_LEN  24              /* Mem. filename length */
-+
-+typedef struct bcm_mem_link {
-+      struct bcm_mem_link *prev;
-+      struct bcm_mem_link *next;
-+      uint    size;
-+      int     line;
-+      char    file[BCM_MEM_FILENAME_LEN];
-+} bcm_mem_link_t;
-+
-+static int16 linuxbcmerrormap[] =  \
-+{     0,                      /* 0 */
-+      -EINVAL,                /* BCME_ERROR */
-+      -EINVAL,                /* BCME_BADARG */
-+      -EINVAL,                /* BCME_BADOPTION */
-+      -EINVAL,                /* BCME_NOTUP */
-+      -EINVAL,                /* BCME_NOTDOWN */
-+      -EINVAL,                /* BCME_NOTAP */
-+      -EINVAL,                /* BCME_NOTSTA */
-+      -EINVAL,                /* BCME_BADKEYIDX */
-+      -EINVAL,                /* BCME_RADIOOFF */
-+      -EINVAL,                /* BCME_NOTBANDLOCKED */
-+      -EINVAL,                /* BCME_NOCLK */
-+      -EINVAL,                /* BCME_BADRATESET */
-+      -EINVAL,                /* BCME_BADBAND */
-+      -E2BIG,                 /* BCME_BUFTOOSHORT */
-+      -E2BIG,                 /* BCME_BUFTOOLONG */
-+      -EBUSY,                 /* BCME_BUSY */
-+      -EINVAL,                /* BCME_NOTASSOCIATED */
-+      -EINVAL,                /* BCME_BADSSIDLEN */
-+      -EINVAL,                /* BCME_OUTOFRANGECHAN */
-+      -EINVAL,                /* BCME_BADCHAN */
-+      -EFAULT,                /* BCME_BADADDR */
-+      -ENOMEM,                /* BCME_NORESOURCE */
-+      -EOPNOTSUPP,            /* BCME_UNSUPPORTED */
-+      -EMSGSIZE,              /* BCME_BADLENGTH */
-+      -EINVAL,                /* BCME_NOTREADY */
-+      -EPERM,                 /* BCME_NOTPERMITTED */
-+      -ENOMEM,                /* BCME_NOMEM */
-+      -EINVAL,                /* BCME_ASSOCIATED */
-+      -ERANGE,                /* BCME_RANGE */
-+      -EINVAL,                /* BCME_NOTFOUND */
-+      -EINVAL,                /* BCME_WME_NOT_ENABLED */
-+      -EINVAL,                /* BCME_TSPEC_NOTFOUND */
-+      -EINVAL,                /* BCME_ACM_NOTSUPPORTED */
-+      -EINVAL,                /* BCME_NOT_WME_ASSOCIATION */
-+      -EIO,                   /* BCME_SDIO_ERROR */
-+      -ENODEV                 /* BCME_DONGLE_DOWN */
-+};
-+
-+/* translate bcmerrors into linux errors */
-+int
-+osl_error(int bcmerror)
-+{
-+      int abs_bcmerror;
-+      int array_size = ARRAYSIZE(linuxbcmerrormap);
-+
-+      abs_bcmerror = ABS(bcmerror);
-+
-+      if (bcmerror > 0)
-+              abs_bcmerror = 0;
-+
-+      else if (abs_bcmerror >= array_size)
-+              abs_bcmerror = BCME_ERROR;
-+
-+      return linuxbcmerrormap[abs_bcmerror];
-+}
-+
-+osl_t *
-+osl_attach(void *pdev, bool pkttag)
-+{
-+      osl_t *osh;
-+
-+      osh = kmalloc(sizeof(osl_t), GFP_ATOMIC);
-+      ASSERT(osh);
-+
-+      bzero(osh, sizeof(osl_t));
-+
-+      /*
-+       * check the cases where
-+       * 1.Error code Added to bcmerror table, but forgot to add it to the OS
-+       * dependent error code
-+       * 2. Error code is added to the bcmerror table, but forgot to add the
-+       * corresponding errorstring(dummy call to bcmerrorstr)
-+       */
-+      bcmerrorstr(0);
-+      ASSERT(ABS(BCME_LAST) == (ARRAYSIZE(linuxbcmerrormap) - 1));
-+
-+      osh->magic = OS_HANDLE_MAGIC;
-+      osh->malloced = 0;
-+      osh->failed = 0;
-+      osh->dbgmem_list = NULL;
-+      osh->pdev = pdev;
-+      osh->pub.pkttag = pkttag;
-+
-+      return osh;
-+}
-+
-+void
-+osl_detach(osl_t *osh)
-+{
-+      if (osh == NULL)
-+              return;
-+
-+      ASSERT(osh->magic == OS_HANDLE_MAGIC);
-+      kfree(osh);
-+}
-+
-+/* Return a new packet. zero out pkttag */
-+void*
-+osl_pktget(osl_t *osh, uint len, bool send)
-+{
-+      struct sk_buff *skb;
-+
-+      if ((skb = dev_alloc_skb(len))) {
-+              skb_put(skb, len);
-+              skb->priority = 0;
-+
-+#ifdef BCMDBG_PKT
-+      pktlist_add(&(osh->pktlist), (void *) skb);
-+#endif  /* BCMDBG_PKT */
-+
-+              osh->pub.pktalloced++;
-+      }
-+
-+      return ((void*) skb);
-+}
-+
-+/* Free the driver packet. Free the tag if present */
-+void
-+osl_pktfree(osl_t *osh, void *p)
-+{
-+      struct sk_buff *skb, *nskb;
-+
-+      skb = (struct sk_buff*) p;
-+
-+      /* perversion: we use skb->next to chain multi-skb packets */
-+      while (skb) {
-+              nskb = skb->next;
-+              skb->next = NULL;
-+
-+#ifdef BCMDBG_PKT
-+              pktlist_remove(&(osh->pktlist), (void *) skb);
-+#endif  /* BCMDBG_PKT */
-+
-+              if (skb->destructor) {
-+                      /* cannot kfree_skb() on hard IRQ (net/core/skbuff.c) if destructor exists
-+                       */
-+                      dev_kfree_skb_any(skb);
-+              } else {
-+                      /* can free immediately (even in_irq()) if destructor does not exist */
-+                      dev_kfree_skb(skb);
-+              }
-+
-+              osh->pub.pktalloced--;
-+
-+              skb = nskb;
-+      }
-+}
-+
-+void*
-+osl_malloc(osl_t *osh, uint size)
-+{
-+      void *addr;
-+
-+      /* only ASSERT if osh is defined */
-+      if (osh)
-+              ASSERT(osh->magic == OS_HANDLE_MAGIC);
-+
-+      if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) {
-+              if (osh)
-+                      osh->failed++;
-+              return (NULL);
-+      }
-+      if (osh)
-+              osh->malloced += size;
-+
-+      return (addr);
-+}
-+
-+void
-+osl_mfree(osl_t *osh, void *addr, uint size)
-+{
-+      if (osh) {
-+              ASSERT(osh->magic == OS_HANDLE_MAGIC);
-+              osh->malloced -= size;
-+      }
-+      kfree(addr);
-+}
-+
-+uint
-+osl_malloced(osl_t *osh)
-+{
-+      ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
-+      return (osh->malloced);
-+}
-+
-+uint osl_malloc_failed(osl_t *osh)
-+{
-+      ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
-+      return (osh->failed);
-+}
-+
-+#undef osl_delay
-+void
-+osl_delay(uint usec)
-+{
-+      OSL_DELAY(usec);
-+}
-+
-+/* Clone a packet.
-+ * The pkttag contents are NOT cloned.
-+ */
-+void *
-+osl_pktdup(osl_t *osh, void *skb)
-+{
-+      void * p;
-+
-+      if ((p = skb_clone((struct sk_buff*)skb, GFP_ATOMIC)) == NULL)
-+              return NULL;
-+
-+      /* skb_clone copies skb->cb.. we don't want that */
-+      if (osh->pub.pkttag)
-+              bzero((void*)((struct sk_buff *)p)->cb, OSL_PKTTAG_SZ);
-+
-+      /* Increment the packet counter */
-+      osh->pub.pktalloced++;
-+      return (p);
-+}
-+
-+uint
-+osl_pktalloced(osl_t *osh)
-+{
-+      return (osh->pub.pktalloced);
-+}
-+
-diff -urN linux.old/drivers/net/wl/linux_osl.h linux.dev/drivers/net/wl/linux_osl.h
---- linux.old/drivers/net/wl/linux_osl.h       1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/linux_osl.h       2006-05-02 17:44:29.000000000 +0200
-@@ -0,0 +1,171 @@
-+/*
-+ * Linux OS Independent Layer
-+ *
-+ * 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: linux_osl.h,v 1.1.1.13 2006/04/08 06:13:39 honor Exp $
-+ */
-+
-+#ifndef _linux_osl_h_
-+#define _linux_osl_h_
-+
-+#include <typedefs.h>
-+#include <linuxver.h>
-+#include <osl.h>
-+
-+#define OSL_PKTTAG_SZ     32 /* Size of PktTag */
-+
-+/* osl handle type forward declaration */
-+typedef struct osl_dmainfo osldma_t;
-+
-+/* OSL initialization */
-+extern osl_t *osl_attach(void *pdev, bool pkttag);
-+extern void osl_detach(osl_t *osh);
-+
-+/* host/bus architecture-specific byte swap */
-+#define BUS_SWAP32(v)         (v)
-+#define       MALLOC_FAILED(osh)      osl_malloc_failed((osh))
-+
-+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);
-+
-+/* API for DMA addressing capability */
-+#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))
-+static inline uint
-+osl_dma_map(void *osh, void *va, uint size, int direction)
-+{
-+      int dir;
-+      struct pci_dev *dev;
-+
-+      dev = (osh == NULL ? NULL : ((osl_t *)osh)->pdev);
-+      dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
-+      return (pci_map_single(dev, va, size, dir));
-+}
-+
-+static inline void
-+osl_dma_unmap(void *osh, uint pa, uint size, int direction)
-+{
-+      int dir;
-+      struct pci_dev *dev;
-+
-+      dev = (osh == NULL ? NULL : ((osl_t *)osh)->pdev);
-+      dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
-+      pci_unmap_single(dev, (uint32)pa, size, dir);
-+}
-+
-+#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
-+#define       DMA_CONSISTENT_ALIGN    PAGE_SIZE
-+#define       DMA_ALLOC_CONSISTENT(osh, size, pap, dmah) \
-+      osl_dma_alloc_consistent((osh), (size), (pap))
-+#define       DMA_FREE_CONSISTENT(osh, va, size, pa, dmah) \
-+      osl_dma_free_consistent((osh), (void*)(va), (size), (pa))
-+static inline void*
-+osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap)
-+{
-+      return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap));
-+}
-+
-+static inline void
-+osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa)
-+{
-+      pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa);
-+}
-+
-+
-+/* register access macros */
-+#if defined(BCMJTAG)
-+#include <bcmjtag.h>
-+#define       R_REG(osh, r)   bcmjtag_read(NULL, (uint32)(r), sizeof(*(r)))
-+#define       W_REG(osh, r, v)        bcmjtag_write(NULL, (uint32)(r), (uint32)(v), sizeof(*(r)))
-+#endif /* defined(BCMSDIO) */
-+
-+/* packet primitives */
-+#define       PKTGET(osh, len, send)          osl_pktget((osh), (len), (send))
-+#define       PKTFREE(osh, skb, send)         osl_pktfree((osh), (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(osh, 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)                osl_pktdup((osh), (skb))
-+#define       PKTTAG(skb)                     ((void*)(((struct sk_buff*)(skb))->cb))
-+#define PKTALLOCED(osh)                       osl_pktalloced((osh))
-+#define PKTLIST_DUMP(osh, buf)
-+
-+/* Convert a native(OS) packet to driver packet.
-+ * In the process, native packet is destroyed, there is no copying
-+ * Also, a packettag is zeroed out
-+ */
-+static INLINE void *
-+osl_pkt_frmnative(struct osl_pubinfo *osh, struct sk_buff *skb)
-+{
-+      struct sk_buff *nskb;
-+
-+      if (osh->pkttag)
-+              bzero((void*)skb->cb, OSL_PKTTAG_SZ);
-+
-+      /* Increment the packet counter */
-+      for (nskb = skb; nskb; nskb = nskb->next) {
-+              osh->pktalloced++;
-+      }
-+
-+      return (void *)skb;
-+}
-+#define PKTFRMNATIVE(osh, skb)        osl_pkt_frmnative(((struct osl_pubinfo *)osh), \
-+                                                      (struct sk_buff*)(skb))
-+
-+/* Convert a driver packet to native(OS) packet
-+ * In the process, packettag is zeroed out before sending up
-+ * IP code depends on skb->cb to be setup correctly with various options
-+ * In our case, that means it should be 0
-+ */
-+static INLINE struct sk_buff *
-+osl_pkt_tonative(struct osl_pubinfo *osh, void *pkt)
-+{
-+      struct sk_buff *nskb;
-+
-+      if (osh->pkttag)
-+              bzero(((struct sk_buff*)pkt)->cb, OSL_PKTTAG_SZ);
-+
-+      /* Decrement the packet counter */
-+      for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
-+              osh->pktalloced--;
-+      }
-+
-+      return (struct sk_buff *)pkt;
-+}
-+#define PKTTONATIVE(osh, pkt)         osl_pkt_tonative((struct osl_pubinfo *)(osh), (pkt))
-+
-+#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))
-+#define PKTSHARED(skb)                  (((struct sk_buff*)(skb))->cloned)
-+
-+extern void *osl_pktget(osl_t *osh, uint len, bool send);
-+extern void osl_pktfree(osl_t *osh, void *skb);
-+extern void *osl_pktdup(osl_t *osh, void *skb);
-+extern uint osl_pktalloced(osl_t *osh);
-+
-+#define OSL_ERROR(bcmerror)   osl_error(bcmerror)
-+extern int osl_error(int bcmerror);
-+
-+/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
-+#define       PKTBUFSZ        2048   /* largest reasonable packet buffer, driver uses for ethernet MTU */
-+
-+#endif        /* _linux_osl_h_ */
-diff -urN linux.old/drivers/net/wl/pktq.h linux.dev/drivers/net/wl/pktq.h
---- linux.old/drivers/net/wl/pktq.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/pktq.h    2006-04-28 02:11:49.000000000 +0200
-@@ -0,0 +1,97 @@
-+/*
-+ * 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 $
-+ */
-+
-+#ifndef       _pktq_h_
-+#define       _pktq_h_
-+#include <osl.h>
-+
-+/* osl multi-precedence packet queue */
-+
-+#define PKTQ_LEN_DEFAULT        128   /* Max 128 packets */
-+#define PKTQ_MAX_PREC           16    /* Maximum precedence levels */
-+
-+struct pktq {
-+      struct pktq_prec {
-+              void *head;     /* first packet to dequeue */
-+              void *tail;     /* last packet to dequeue */
-+              uint16 len;     /* number of queued packets */
-+              uint16 max;     /* maximum number of queued packets */
-+      } q[PKTQ_MAX_PREC];
-+      uint16 num_prec;        /* number of precedences in use */
-+      uint16 hi_prec;         /* rapid dequeue hint (>= highest non-empty prec) */
-+      uint16 max;             /* total max packets */
-+      uint16 len;             /* total number of packets */
-+};
-+
-+#define PKTQ_PREC_ITER(pq, prec)        for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
-+
-+/* forward definition of ether_addr structure used by some function prototypes */
-+
-+struct ether_addr;
-+
-+/* operations on a specific precedence in packet queue */
-+
-+#define pktq_psetmax(pq, prec, _max)    ((pq)->q[prec].max = (_max))
-+#define pktq_plen(pq, prec)             ((pq)->q[prec].len)
-+#define pktq_pavail(pq, prec)           ((pq)->q[prec].max - (pq)->q[prec].len)
-+#define pktq_pfull(pq, prec)            ((pq)->q[prec].len >= (pq)->q[prec].max)
-+#define pktq_pempty(pq, prec)           ((pq)->q[prec].len == 0)
-+
-+#define pktq_ppeek(pq, prec)            ((pq)->q[prec].head)
-+#define pktq_ppeek_tail(pq, prec)       ((pq)->q[prec].tail)
-+
-+extern void *pktq_penq(struct pktq *pq, int prec, void *p);
-+extern void *pktq_penq_head(struct pktq *pq, int prec, void *p);
-+extern void *pktq_pdeq(struct pktq *pq, int prec);
-+extern void *pktq_pdeq_tail(struct pktq *pq, int prec);
-+/* Empty the queue at particular precedence level */
-+extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir);
-+/* Remove a specified packet from its queue */
-+extern bool pktq_pdel(struct pktq *pq, void *p, int prec);
-+
-+/* operations on a set of precedences in packet queue */
-+
-+extern int pktq_mlen(struct pktq *pq, uint prec_bmp);
-+extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);
-+
-+/* operations on packet queue as a whole */
-+
-+#define pktq_len(pq)                    ((int)(pq)->len)
-+#define pktq_max(pq)                    ((int)(pq)->max)
-+#define pktq_avail(pq)                  ((int)((pq)->max - (pq)->len))
-+#define pktq_full(pq)                   ((pq)->len >= (pq)->max)
-+#define pktq_empty(pq)                  ((pq)->len == 0)
-+
-+/* operations for single precedence queues */
-+#define pktenq(pq, p)         pktq_penq((pq), 0, (p))
-+#define pktenq_head(pq, p)    pktq_penq_head((pq), 0, (p))
-+#define pktdeq(pq)            pktq_pdeq((pq), 0)
-+#define pktdeq_tail(pq)               pktq_pdeq_tail((pq), 0)
-+
-+extern void pktq_init(struct pktq *pq, int num_prec, int max_len);
-+/* prec_out may be NULL if caller is not interested in return value */
-+extern void *pktq_deq(struct pktq *pq, int *prec_out);
-+extern void *pktq_deq_tail(struct pktq *pq, int *prec_out);
-+extern void *pktq_peek(struct pktq *pq, int *prec_out);
-+extern void *pktq_peek_tail(struct pktq *pq, int *prec_out);
-+extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir); /* Empty the entire queue */
-+
-+/* externs */
-+/* packet */
-+extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
-+extern uint pkttotlen(osl_t *osh, void *p);
-+extern void *pktlast(osl_t *osh, void *p);
-+
-+extern void pktsetprio(void *pkt, bool update_vtag);
-+
-+#endif        /* _pktq_h_ */
-diff -urN linux.old/drivers/net/wl/sbhnddma.h linux.dev/drivers/net/wl/sbhnddma.h
---- linux.old/drivers/net/wl/sbhnddma.h        1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/net/wl/sbhnddma.h        2006-04-28 02:20:47.000000000 +0200
-@@ -0,0 +1,284 @@
-+/*
-+ * Generic Broadcom Home Networking Division (HND) DMA engine HW interface
-+ * This supports the following chips: BCM42xx, 44xx, 47xx .
-+ *
-+ * 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: sbhnddma.h,v 1.1.1.2 2006/02/27 03:43:16 honor Exp $
-+ */
-+
-+#ifndef       _sbhnddma_h_
-+#define       _sbhnddma_h_
-+
-+/* DMA structure:
-+ *  support two DMA engines: 32 bits address or 64 bit addressing
-+ *  basic DMA register set is per channel(transmit or receive)
-+ *  a pair of channels is defined for convenience
-+ */
-+
-+
-+/* 32 bits addressing */
-+
-+/* dma registers per channel(xmt or rcv) */
-+typedef volatile struct {
-+      uint32  control;                /* enable, et al */
-+      uint32  addr;                   /* descriptor ring base address (4K aligned) */
-+      uint32  ptr;                    /* last descriptor posted to chip */
-+      uint32  status;                 /* current active descriptor, et al */
-+} dma32regs_t;
-+
-+typedef volatile struct {
-+      dma32regs_t     xmt;            /* dma tx channel */
-+      dma32regs_t     rcv;            /* dma rx channel */
-+} dma32regp_t;
-+
-+typedef volatile struct {     /* diag access */
-+      uint32  fifoaddr;               /* diag address */
-+      uint32  fifodatalow;            /* low 32bits of data */
-+      uint32  fifodatahigh;           /* high 32bits of data */
-+      uint32  pad;                    /* reserved */
-+} dma32diag_t;
-+
-+/*
-+ * DMA Descriptor
-+ * Descriptors are only read by the hardware, never written back.
-+ */
-+typedef volatile struct {
-+      uint32  ctrl;           /* misc control bits & bufcount */
-+      uint32  addr;           /* data buffer address */
-+} dma32dd_t;
-+
-+/*
-+ * Each descriptor ring must be 4096byte aligned, and fit within a single 4096byte page.
-+ */
-+#define       D32MAXRINGSZ    4096
-+#define       D32RINGALIGN    4096
-+#define       D32MAXDD        (D32MAXRINGSZ / sizeof (dma32dd_t))
-+
-+/* transmit channel control */
-+#define       XC_XE           ((uint32)1 << 0)        /* transmit enable */
-+#define       XC_SE           ((uint32)1 << 1)        /* transmit suspend request */
-+#define       XC_LE           ((uint32)1 << 2)        /* loopback enable */
-+#define       XC_FL           ((uint32)1 << 4)        /* flush request */
-+#define       XC_AE           ((uint32)3 << 16)       /* address extension bits */
-+#define       XC_AE_SHIFT     16
-+
-+/* transmit descriptor table pointer */
-+#define       XP_LD_MASK      0xfff                   /* last valid descriptor */
-+
-+/* transmit channel status */
-+#define       XS_CD_MASK      0x0fff                  /* current descriptor pointer */
-+#define       XS_XS_MASK      0xf000                  /* transmit state */
-+#define       XS_XS_SHIFT     12
-+#define       XS_XS_DISABLED  0x0000                  /* disabled */
-+#define       XS_XS_ACTIVE    0x1000                  /* active */
-+#define       XS_XS_IDLE      0x2000                  /* idle wait */
-+#define       XS_XS_STOPPED   0x3000                  /* stopped */
-+#define       XS_XS_SUSP      0x4000                  /* suspend pending */
-+#define       XS_XE_MASK      0xf0000                 /* transmit errors */
-+#define       XS_XE_SHIFT     16
-+#define       XS_XE_NOERR     0x00000                 /* no error */
-+#define       XS_XE_DPE       0x10000                 /* descriptor protocol error */
-+#define       XS_XE_DFU       0x20000                 /* data fifo underrun */
-+#define       XS_XE_BEBR      0x30000                 /* bus error on buffer read */
-+#define       XS_XE_BEDA      0x40000                 /* bus error on descriptor access */
-+#define       XS_AD_MASK      0xfff00000              /* active descriptor */
-+#define       XS_AD_SHIFT     20
-+
-+/* receive channel control */
-+#define       RC_RE           ((uint32)1 << 0)        /* receive enable */
-+#define       RC_RO_MASK      0xfe                    /* receive frame offset */
-+#define       RC_RO_SHIFT     1
-+#define       RC_FM           ((uint32)1 << 8)        /* direct fifo receive (pio) mode */
-+#define       RC_AE           ((uint32)3 << 16)       /* address extension bits */
-+#define       RC_AE_SHIFT     16
-+
-+/* receive descriptor table pointer */
-+#define       RP_LD_MASK      0xfff                   /* last valid descriptor */
-+
-+/* receive channel status */
-+#define       RS_CD_MASK      0x0fff                  /* current descriptor pointer */
-+#define       RS_RS_MASK      0xf000                  /* receive state */
-+#define       RS_RS_SHIFT     12
-+#define       RS_RS_DISABLED  0x0000                  /* disabled */
-+#define       RS_RS_ACTIVE    0x1000                  /* active */
-+#define       RS_RS_IDLE      0x2000                  /* idle wait */
-+#define       RS_RS_STOPPED   0x3000                  /* reserved */
-+#define       RS_RE_MASK      0xf0000                 /* receive errors */
-+#define       RS_RE_SHIFT     16
-+#define       RS_RE_NOERR     0x00000                 /* no error */
-+#define       RS_RE_DPE       0x10000                 /* descriptor protocol error */
-+#define       RS_RE_DFO       0x20000                 /* data fifo overflow */
-+#define       RS_RE_BEBW      0x30000                 /* bus error on buffer write */
-+#define       RS_RE_BEDA      0x40000                 /* bus error on descriptor access */
-+#define       RS_AD_MASK      0xfff00000              /* active descriptor */
-+#define       RS_AD_SHIFT     20
-+
-+/* fifoaddr */
-+#define       FA_OFF_MASK     0xffff                  /* offset */
-+#define       FA_SEL_MASK     0xf0000                 /* select */
-+#define       FA_SEL_SHIFT    16
-+#define       FA_SEL_XDD      0x00000                 /* transmit dma data */
-+#define       FA_SEL_XDP      0x10000                 /* transmit dma pointers */
-+#define       FA_SEL_RDD      0x40000                 /* receive dma data */
-+#define       FA_SEL_RDP      0x50000                 /* receive dma pointers */
-+#define       FA_SEL_XFD      0x80000                 /* transmit fifo data */
-+#define       FA_SEL_XFP      0x90000                 /* transmit fifo pointers */
-+#define       FA_SEL_RFD      0xc0000                 /* receive fifo data */
-+#define       FA_SEL_RFP      0xd0000                 /* receive fifo pointers */
-+#define       FA_SEL_RSD      0xe0000                 /* receive frame status data */
-+#define       FA_SEL_RSP      0xf0000                 /* receive frame status pointers */
-+
-+/* descriptor control flags */
-+#define       CTRL_BC_MASK    0x1fff                  /* buffer byte count */
-+#define       CTRL_AE         ((uint32)3 << 16)       /* address extension bits */
-+#define       CTRL_AE_SHIFT   16
-+#define       CTRL_EOT        ((uint32)1 << 28)       /* end of descriptor table */
-+#define       CTRL_IOC        ((uint32)1 << 29)       /* interrupt on completion */
-+#define       CTRL_EOF        ((uint32)1 << 30)       /* end of frame */
-+#define       CTRL_SOF        ((uint32)1 << 31)       /* start of frame */
-+
-+/* control flags in the range [27:20] are core-specific and not defined here */
-+#define       CTRL_CORE_MASK  0x0ff00000
-+
-+/* 64 bits addressing */
-+
-+/* dma registers per channel(xmt or rcv) */
-+typedef volatile struct {
-+      uint32  control;                /* enable, et al */
-+      uint32  ptr;                    /* last descriptor posted to chip */
-+      uint32  addrlow;                /* descriptor ring base address low 32-bits (8K aligned) */
-+      uint32  addrhigh;               /* descriptor ring base address bits 63:32 (8K aligned) */
-+      uint32  status0;                /* current descriptor, xmt state */
-+      uint32  status1;                /* active descriptor, xmt error */
-+} dma64regs_t;
-+
-+typedef volatile struct {
-+      dma64regs_t     tx;             /* dma64 tx channel */
-+      dma64regs_t     rx;             /* dma64 rx channel */
-+} dma64regp_t;
-+
-+typedef volatile struct {             /* diag access */
-+      uint32  fifoaddr;               /* diag address */
-+      uint32  fifodatalow;            /* low 32bits of data */
-+      uint32  fifodatahigh;           /* high 32bits of data */
-+      uint32  pad;                    /* reserved */
-+} dma64diag_t;
-+
-+/*
-+ * DMA Descriptor
-+ * Descriptors are only read by the hardware, never written back.
-+ */
-+typedef volatile struct {
-+      uint32  ctrl1;          /* misc control bits & bufcount */
-+      uint32  ctrl2;          /* buffer count and address extension */
-+      uint32  addrlow;        /* memory address of the date buffer, bits 31:0 */
-+      uint32  addrhigh;       /* memory address of the date buffer, bits 63:32 */
-+} dma64dd_t;
-+
-+/*
-+ * Each descriptor ring must be 8kB aligned, and fit within a contiguous 8kB physical addresss.
-+ */
-+#define       D64MAXRINGSZ    8192
-+#define       D64RINGALIGN    8192
-+#define       D64MAXDD        (D64MAXRINGSZ / sizeof (dma64dd_t))
-+
-+/* transmit channel control */
-+#define       D64_XC_XE               0x00000001      /* transmit enable */
-+#define       D64_XC_SE               0x00000002      /* transmit suspend request */
-+#define       D64_XC_LE               0x00000004      /* loopback enable */
-+#define       D64_XC_FL               0x00000010      /* flush request */
-+#define       D64_XC_AE               0x00030000      /* address extension bits */
-+#define       D64_XC_AE_SHIFT         16
-+
-+/* transmit descriptor table pointer */
-+#define       D64_XP_LD_MASK          0x00000fff      /* last valid descriptor */
-+
-+/* transmit channel status */
-+#define       D64_XS0_CD_MASK         0x00001fff      /* current descriptor pointer */
-+#define       D64_XS0_XS_MASK         0xf0000000      /* transmit state */
-+#define       D64_XS0_XS_SHIFT                28
-+#define       D64_XS0_XS_DISABLED     0x00000000      /* disabled */
-+#define       D64_XS0_XS_ACTIVE       0x10000000      /* active */
-+#define       D64_XS0_XS_IDLE         0x20000000      /* idle wait */
-+#define       D64_XS0_XS_STOPPED      0x30000000      /* stopped */
-+#define       D64_XS0_XS_SUSP         0x40000000      /* suspend pending */
-+
-+#define       D64_XS1_AD_MASK         0x0001ffff      /* active descriptor */
-+#define       D64_XS1_XE_MASK         0xf0000000      /* transmit errors */
-+#define       D64_XS1_XE_SHIFT                28
-+#define       D64_XS1_XE_NOERR        0x00000000      /* no error */
-+#define       D64_XS1_XE_DPE          0x10000000      /* descriptor protocol error */
-+#define       D64_XS1_XE_DFU          0x20000000      /* data fifo underrun */
-+#define       D64_XS1_XE_DTE          0x30000000      /* data transfer error */
-+#define       D64_XS1_XE_DESRE        0x40000000      /* descriptor read error */
-+#define       D64_XS1_XE_COREE        0x50000000      /* core error */
-+
-+/* receive channel control */
-+#define       D64_RC_RE               0x00000001      /* receive enable */
-+#define       D64_RC_RO_MASK          0x000000fe      /* receive frame offset */
-+#define       D64_RC_RO_SHIFT         1
-+#define       D64_RC_FM               0x00000100      /* direct fifo receive (pio) mode */
-+#define       D64_RC_AE               0x00030000      /* address extension bits */
-+#define       D64_RC_AE_SHIFT         16
-+
-+/* receive descriptor table pointer */
-+#define       D64_RP_LD_MASK          0x00000fff      /* last valid descriptor */
-+
-+/* receive channel status */
-+#define       D64_RS0_CD_MASK         0x00001fff      /* current descriptor pointer */
-+#define       D64_RS0_RS_MASK         0xf0000000      /* receive state */
-+#define       D64_RS0_RS_SHIFT                28
-+#define       D64_RS0_RS_DISABLED     0x00000000      /* disabled */
-+#define       D64_RS0_RS_ACTIVE       0x10000000      /* active */
-+#define       D64_RS0_RS_IDLE         0x20000000      /* idle wait */
-+#define       D64_RS0_RS_STOPPED      0x30000000      /* stopped */
-+#define       D64_RS0_RS_SUSP         0x40000000      /* suspend pending */
-+
-+#define       D64_RS1_AD_MASK         0x0001ffff      /* active descriptor */
-+#define       D64_RS1_RE_MASK         0xf0000000      /* receive errors */
-+#define       D64_RS1_RE_SHIFT                28
-+#define       D64_RS1_RE_NOERR        0x00000000      /* no error */
-+#define       D64_RS1_RE_DPO          0x10000000      /* descriptor protocol error */
-+#define       D64_RS1_RE_DFU          0x20000000      /* data fifo overflow */
-+#define       D64_RS1_RE_DTE          0x30000000      /* data transfer error */
-+#define       D64_RS1_RE_DESRE        0x40000000      /* descriptor read error */
-+#define       D64_RS1_RE_COREE        0x50000000      /* core error */
-+
-+/* fifoaddr */
-+#define       D64_FA_OFF_MASK         0xffff          /* offset */
-+#define       D64_FA_SEL_MASK         0xf0000         /* select */
-+#define       D64_FA_SEL_SHIFT        16
-+#define       D64_FA_SEL_XDD          0x00000         /* transmit dma data */
-+#define       D64_FA_SEL_XDP          0x10000         /* transmit dma pointers */
-+#define       D64_FA_SEL_RDD          0x40000         /* receive dma data */
-+#define       D64_FA_SEL_RDP          0x50000         /* receive dma pointers */
-+#define       D64_FA_SEL_XFD          0x80000         /* transmit fifo data */
-+#define       D64_FA_SEL_XFP          0x90000         /* transmit fifo pointers */
-+#define       D64_FA_SEL_RFD          0xc0000         /* receive fifo data */
-+#define       D64_FA_SEL_RFP          0xd0000         /* receive fifo pointers */
-+#define       D64_FA_SEL_RSD          0xe0000         /* receive frame status data */
-+#define       D64_FA_SEL_RSP          0xf0000         /* receive frame status pointers */
-+
-+/* descriptor control flags 1 */
-+#define       D64_CTRL1_EOT           ((uint32)1 << 28)       /* end of descriptor table */
-+#define       D64_CTRL1_IOC           ((uint32)1 << 29)       /* interrupt on completion */
-+#define       D64_CTRL1_EOF           ((uint32)1 << 30)       /* end of frame */
-+#define       D64_CTRL1_SOF           ((uint32)1 << 31)       /* start of frame */
-+
-+/* descriptor control flags 2 */
-+#define       D64_CTRL2_BC_MASK       0x00007fff      /* buffer byte count mask */
-+#define       D64_CTRL2_AE            0x00030000      /* address extension bits */
-+#define       D64_CTRL2_AE_SHIFT      16
-+
-+/* control flags in the range [27:20] are core-specific and not defined here */
-+#define       D64_CTRL_CORE_MASK      0x0ff00000
-+
-+
-+#endif        /* _sbhnddma_h_ */
 diff -urN linux.old/drivers/parport/Config.in linux.dev/drivers/parport/Config.in
---- linux.old/drivers/parport/Config.in        2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/drivers/parport/Config.in        2006-04-27 19:24:19.000000000 +0200
+--- linux.old/drivers/parport/Config.in        2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/drivers/parport/Config.in        2006-10-02 21:19:59.000000000 +0200
 @@ -11,6 +11,7 @@
  tristate 'Parallel port support' CONFIG_PARPORT
  if [ "$CONFIG_PARPORT" != "n" ]; then
@@ -19553,8 +16320,8 @@ diff -urN linux.old/drivers/parport/Config.in linux.dev/drivers/parport/Config.i
        if [ "$CONFIG_SERIAL" = "m" ]; then
           define_tristate CONFIG_PARPORT_PC_CML1 m
 diff -urN linux.old/drivers/parport/Makefile linux.dev/drivers/parport/Makefile
---- linux.old/drivers/parport/Makefile 2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/drivers/parport/Makefile 2006-04-27 19:24:19.000000000 +0200
+--- linux.old/drivers/parport/Makefile 2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/drivers/parport/Makefile 2006-10-02 21:19:59.000000000 +0200
 @@ -22,6 +22,7 @@
  
  obj-$(CONFIG_PARPORT)         += parport.o
@@ -19565,7 +16332,7 @@ diff -urN linux.old/drivers/parport/Makefile linux.dev/drivers/parport/Makefile
  obj-$(CONFIG_PARPORT_MFC3)    += parport_mfc3.o
 diff -urN linux.old/drivers/parport/parport_splink.c linux.dev/drivers/parport/parport_splink.c
 --- linux.old/drivers/parport/parport_splink.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux.dev/drivers/parport/parport_splink.c 2006-04-27 19:24:19.000000000 +0200
++++ linux.dev/drivers/parport/parport_splink.c 2006-10-02 21:19:59.000000000 +0200
 @@ -0,0 +1,345 @@
 +/* Low-level parallel port routines for the ASUS WL-500g built-in port
 + *
@@ -19913,8 +16680,8 @@ diff -urN linux.old/drivers/parport/parport_splink.c linux.dev/drivers/parport/p
 +module_exit(parport_splink_cleanup)
 +
 diff -urN linux.old/include/asm-mips/bootinfo.h linux.dev/include/asm-mips/bootinfo.h
---- linux.old/include/asm-mips/bootinfo.h      2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/include/asm-mips/bootinfo.h      2006-04-27 19:24:19.000000000 +0200
+--- linux.old/include/asm-mips/bootinfo.h      2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/include/asm-mips/bootinfo.h      2006-10-02 21:19:59.000000000 +0200
 @@ -37,6 +37,7 @@
  #define MACH_GROUP_HP_LJ       20 /* Hewlett Packard LaserJet               */
  #define MACH_GROUP_LASAT       21
@@ -19940,8 +16707,8 @@ diff -urN linux.old/include/asm-mips/bootinfo.h linux.dev/include/asm-mips/booti
   */
  #define       MACH_TITAN_YOSEMITE     1       /* PMC-Sierra Yosemite */
 diff -urN linux.old/include/asm-mips/cpu.h linux.dev/include/asm-mips/cpu.h
---- linux.old/include/asm-mips/cpu.h   2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/include/asm-mips/cpu.h   2006-04-27 19:24:19.000000000 +0200
+--- linux.old/include/asm-mips/cpu.h   2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/include/asm-mips/cpu.h   2006-10-02 21:19:59.000000000 +0200
 @@ -22,6 +22,11 @@
     spec.
  */
@@ -19991,8 +16758,8 @@ diff -urN linux.old/include/asm-mips/cpu.h linux.dev/include/asm-mips/cpu.h
  /*
   * ISA Level encodings
 diff -urN linux.old/include/asm-mips/r4kcache.h linux.dev/include/asm-mips/r4kcache.h
---- linux.old/include/asm-mips/r4kcache.h      2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/include/asm-mips/r4kcache.h      2006-04-27 19:24:19.000000000 +0200
+--- linux.old/include/asm-mips/r4kcache.h      2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/include/asm-mips/r4kcache.h      2006-10-02 21:19:59.000000000 +0200
 @@ -658,4 +658,17 @@
                        cache128_unroll32(addr|ws,Index_Writeback_Inv_SD);
  }
@@ -20012,8 +16779,8 @@ diff -urN linux.old/include/asm-mips/r4kcache.h linux.dev/include/asm-mips/r4kca
 +
  #endif /* __ASM_R4KCACHE_H */
 diff -urN linux.old/include/asm-mips/serial.h linux.dev/include/asm-mips/serial.h
---- linux.old/include/asm-mips/serial.h        2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/include/asm-mips/serial.h        2006-04-27 19:24:19.000000000 +0200
+--- linux.old/include/asm-mips/serial.h        2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/include/asm-mips/serial.h        2006-10-02 21:19:59.000000000 +0200
 @@ -223,6 +223,13 @@
  #define TXX927_SERIAL_PORT_DEFNS
  #endif
@@ -20037,8 +16804,8 @@ diff -urN linux.old/include/asm-mips/serial.h linux.dev/include/asm-mips/serial.
        DDB5477_SERIAL_PORT_DEFNS               \
        EV96100_SERIAL_PORT_DEFNS               \
 diff -urN linux.old/init/do_mounts.c linux.dev/init/do_mounts.c
---- linux.old/init/do_mounts.c 2006-04-27 18:04:38.000000000 +0200
-+++ linux.dev/init/do_mounts.c 2006-04-27 19:24:19.000000000 +0200
+--- linux.old/init/do_mounts.c 2006-10-02 21:23:10.000000000 +0200
++++ linux.dev/init/do_mounts.c 2006-10-02 21:19:59.000000000 +0200
 @@ -254,7 +254,13 @@
        { "ftlb", 0x2c08 },
        { "ftlc", 0x2c10 },
This page took 0.138991 seconds and 4 git commands to generate.