update brcm-2.4 to 2.4.35.4, integrate new broadcom system code, update broadcom...
authorFelix Fietkau <nbd@openwrt.org>
Sun, 6 Jan 2008 19:28:07 +0000 (19:28 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 6 Jan 2008 19:28:07 +0000 (19:28 +0000)
SVN-Revision: 10137

167 files changed:
include/kernel-version.mk
package/broadcom-wl/Makefile
package/broadcom-wl/files/lib/wifi/broadcom.sh
package/broadcom-wl/src/driver/Makefile
package/broadcom-wl/src/driver/bcmutils.c
package/broadcom-wl/src/driver/bcmutils.h [new file with mode: 0644]
package/broadcom-wl/src/driver/hnddma.c
package/broadcom-wl/src/driver/hnddma.h
package/broadcom-wl/src/driver/linux_osl.c
package/broadcom-wl/src/driver/linux_osl.h
package/broadcom-wl/src/driver/patchtable.pl [deleted file]
package/broadcom-wl/src/driver/pktq.h [deleted file]
package/broadcom-wl/src/driver/proto/802.11.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/802.11e.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/802.1d.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/802.3.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmarp.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmdhcp.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmeth.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmevent.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmip.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmtcp.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/bcmudp.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/eap.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/eapol.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/ethernet.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/vlan.h [new file with mode: 0644]
package/broadcom-wl/src/driver/proto/wpa.h [new file with mode: 0644]
package/broadcom-wl/src/driver/sbhnddma.h
package/broadcom-wl/src/wlc/wlc.c
package/broadcom-wl/src/wlcompat/Makefile
package/broadcom-wl/src/wlcompat/wlcompat.c
target/linux/brcm-2.4/config-2.4.34 [deleted file]
target/linux/brcm-2.4/config-default [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/Makefile
target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmsrom.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmutils.c [deleted file]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/cfe_env.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/compressed/Makefile [deleted file]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/export.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/gpio.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/hndchipc.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/hndpmu.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdefs.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmendian.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmnvram.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmsrom.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmutils.h [deleted file]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndchipc.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndcpu.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndmips.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndpci.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndpmu.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/linux_gpio.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/linuxver.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/mipsinc.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/osl.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/pcicfg.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbchipc.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbconfig.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbextif.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbhndmips.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbmemc.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpci.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcie.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcmcia.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbsdram.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbsocram.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbsprom.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbutils.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sflash.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/trxhdr.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/typedefs.h
target/linux/brcm-2.4/files/arch/mips/bcm947xx/nvram.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/nvram_linux.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/pcibios.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sbmips.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sbpci.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sbutils.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/setup.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sflash.c [deleted file]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/time.c
target/linux/brcm-2.4/files/arch/mips/bcm947xx/utils.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/utils.h [new file with mode: 0644]
target/linux/brcm-2.4/files/drivers/mtd/devices/sflash.c
target/linux/brcm-2.4/files/drivers/mtd/maps/bcm947xx-flash.c
target/linux/brcm-2.4/patches/001-bcm47xx.patch
target/linux/brcm-2.4/patches/002-wl_fix.patch [deleted file]
target/linux/brcm-2.4/patches/003-bcm47xx_cache_fixes.patch
target/linux/brcm-2.4/patches/004-flash.patch
target/linux/brcm-2.4/patches/005-bluetooth_sco_buffer_align.patch
target/linux/brcm-2.4/patches/006-ide_workaround.patch
target/linux/brcm-2.4/patches/008-b44_bcm47xx_support.patch
target/linux/brcm-2.4/patches/009-wrt54g3g_pcmcia.patch
target/linux/brcm-2.4/patches/010-bcm47xx-cam_absent.patch
target/linux/brcm-2.4/patches/011-wl_qdisc_war.patch
target/linux/brcm-2.4/patches/012-aec62xx.patch
target/linux/brcm-2.4/patches/013-wl_hdd_pdc202xx.patch
target/linux/brcm-2.4/patches/014-bcm5354.patch [deleted file]
target/linux/generic-2.4/config-default
target/linux/generic-2.4/patches/000-linux_mips.patch
target/linux/generic-2.4/patches/001-squashfs.patch
target/linux/generic-2.4/patches/002-squashfs_lzma.patch
target/linux/generic-2.4/patches/003-jffs2_compression.patch
target/linux/generic-2.4/patches/004-exec_pagesize.patch
target/linux/generic-2.4/patches/005-mtd_flashtypes.patch
target/linux/generic-2.4/patches/008-intel_flashchip_fix.patch
target/linux/generic-2.4/patches/009-mtd_uaccess.patch
target/linux/generic-2.4/patches/010-disable_old_squashfs_compatibility.patch
target/linux/generic-2.4/patches/050-build_flags.patch
target/linux/generic-2.4/patches/051-parallel_build.patch
target/linux/generic-2.4/patches/051-remove_pcmcia_modinst_compat.patch
target/linux/generic-2.4/patches/100-wireless-extension.patch
target/linux/generic-2.4/patches/106-mppe_mppc.patch
target/linux/generic-2.4/patches/107-cifs.patch
target/linux/generic-2.4/patches/108-optional_aout_support.patch
target/linux/generic-2.4/patches/109-ipsec_nat_traversal.patch
target/linux/generic-2.4/patches/110-netdev_random_core.patch
target/linux/generic-2.4/patches/112-bridging_performance.patch
target/linux/generic-2.4/patches/113-even_more_gcc4_stuff.patch
target/linux/generic-2.4/patches/114-sched_use_tsc.patch
target/linux/generic-2.4/patches/115-branch_emul_fix.patch
target/linux/generic-2.4/patches/200-i4l.patch
target/linux/generic-2.4/patches/201-hfc_usb_backport.patch
target/linux/generic-2.4/patches/202-pl2303_backport.patch
target/linux/generic-2.4/patches/203-hfsplus_fix.patch
target/linux/generic-2.4/patches/206-gcc_3.4_fixes.patch
target/linux/generic-2.4/patches/208-usb2_fix.patch
target/linux/generic-2.4/patches/209-build_fixes.patch
target/linux/generic-2.4/patches/210-fix-irq-serial.patch
target/linux/generic-2.4/patches/212-htb_time_fix.patch
target/linux/generic-2.4/patches/213-htb_disable_hysteresis.patch
target/linux/generic-2.4/patches/222-sound.patch
target/linux/generic-2.4/patches/224-atm_hotplug.patch
target/linux/generic-2.4/patches/225-string_lib_useful_exports.patch
target/linux/generic-2.4/patches/226-atm_br2684.patch
target/linux/generic-2.4/patches/227-jffs2_eofdetect.patch
target/linux/generic-2.4/patches/228-more_usb_fixes.patch
target/linux/generic-2.4/patches/230-tun_get_user_backport.patch
target/linux/generic-2.4/patches/231-mini_fo.patch
target/linux/generic-2.4/patches/601-netfilter_ipp2p_0.8.1rc1.patch
target/linux/generic-2.4/patches/602-netfilter_layer7_2.1nbd.patch
target/linux/generic-2.4/patches/603-netfilter_nat_pptp.patch
target/linux/generic-2.4/patches/604-netfilter_maxconn.patch
target/linux/generic-2.4/patches/605-netfilter_TTL.patch
target/linux/generic-2.4/patches/606-netfilter_NETMAP.patch
target/linux/generic-2.4/patches/607-netfilter_connmark.patch
target/linux/generic-2.4/patches/608-netfilter_ipset.patch
target/linux/generic-2.4/patches/609-netfilter_string.patch
target/linux/generic-2.4/patches/610-netfilter_connbytes.patch
target/linux/generic-2.4/patches/611-netfilter_condition.patch
target/linux/generic-2.4/patches/612-netfilter_quota.patch
target/linux/generic-2.4/patches/613-netfilter_nat_h323.patch
target/linux/generic-2.4/patches/614-netfilter_nat_rtsp.patch
target/linux/generic-2.4/patches/615-netfilter_nat_mms.patch
target/linux/generic-2.4/patches/616-netfilter_imq.patch
target/linux/generic-2.4/patches/617-netfilter_time.patch
target/linux/generic-2.4/patches/618-netfilter_multiport_backport.patch
target/linux/generic-2.4/patches/619-netfilter_classify.patch
target/linux/generic-2.4/patches/620-netfilter_iprange.patch
target/linux/generic-2.4/patches/621-netfilter_random.patch
target/linux/generic-2.4/patches/621-tc_esfq.patch
target/linux/generic-2.4/patches/622-netfilter_ipset_porthash.patch
target/linux/generic-2.4/patches/700-multiple_default_gateways.patch
target/linux/generic-2.4/patches/801-usb_serial_endpoint_size.patch
target/linux/generic-2.4/patches/802-usb_serial_3g_cards.patch

index df96216..738835b 100644 (file)
@@ -1,7 +1,7 @@
 # Use the default kernel version if the Makefile doesn't override it
 
 ifeq ($(KERNEL),2.4)
-  LINUX_VERSION?=2.4.34
+  LINUX_VERSION?=2.4.35.4
 else
   LINUX_VERSION?=2.6.21.5
 endif
@@ -10,6 +10,9 @@ LINUX_RELEASE?=1
 ifeq ($(LINUX_VERSION),2.4.34)
   LINUX_KERNEL_MD5SUM:=f59665540a7f3351ea416a0dad104b55
 endif
+ifeq ($(LINUX_VERSION),2.4.35.4)
+  LINUX_KERNEL_MD5SUM:=34066faff3d8c042df1c7600b08b8070
+endif
 ifeq ($(LINUX_VERSION),2.6.22.4)
   LINUX_KERNEL_MD5SUM:=6cf83acf21e65dcea4a5170c0bbc7125
 endif
index 8c68e8e..b60d184 100644 (file)
@@ -10,13 +10,15 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=broadcom-wl
-PKG_VERSION:=4.80.53.0
+PKG_VERSION:=4.150.10.5
 PKG_RELEASE:=1
 WLC_VERSION:=0.1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://downloads.openwrt.org/sources
-PKG_MD5SUM:=a7d8dde3ce474c361143b83e1d9890b1
+PKG_MD5SUM:=0c6ba9687114c6b598e8019e262d9a60
+
+WL_WEXT=1
 
 include $(INCLUDE_DIR)/package.mk
 
@@ -107,7 +109,7 @@ endef
 define Package/wl
 $(call Package/broadcom-wl/Default)
   TITLE:=Proprietary Broadcom wl driver config utility
-  DEPENDS+=+brcm-compat-ldso
+#  DEPENDS+=+brcm-compat-ldso
 endef
 
 define Package/wl/description
@@ -118,7 +120,7 @@ endef
 define Package/nas
 $(call Package/broadcom-wl/Default)
   DEPENDS+= +nvram
-  DEPENDS+= +brcm-compat-ldso
+#  DEPENDS+= +brcm-compat-ldso
   TITLE:=Proprietary Broadcom WPA/WPA2 authenticator
 endef
 
@@ -127,20 +129,6 @@ define Package/nas/description
  proprietary Broadcom wl driver.
 endef
 
-
-define install_template
-       $(INSTALL_DIR) $(1)/lib/modules/$(LINUX_VERSION)
-       $(INSTALL_DATA) $(PKG_BUILD_DIR)/driver/wl$(2).o.patch $(1)/lib/modules/$(LINUX_VERSION)/
-endef
-
-define KernelPackage/brcm-wl/install
-       $(call install_template,$(1),)
-endef
-
-define KernelPackage/brcm-wl_mimo/install
-       $(call install_template,$(1),_mimo)
-endef
-
 MAKE_KMOD := $(MAKE) -C "$(LINUX_DIR)" \
                CROSS_COMPILE="$(TARGET_CROSS)" \
                ARCH="$(LINUX_KARCH)" \
@@ -149,7 +137,6 @@ MAKE_KMOD := $(MAKE) -C "$(LINUX_DIR)" \
 
 define Build/Prepare
        $(call Build/Prepare/Default)
-       mv $(PKG_BUILD_DIR)/kmod $(PKG_BUILD_DIR)/driver
        $(CP) src/* $(PKG_BUILD_DIR)/
 endef
 
@@ -164,10 +151,12 @@ define Build/Compile
                modules
        $(MAKE_KMOD) \
                SUBDIRS="$(PKG_BUILD_DIR)/wlcompat" \
+               $(if $(WL_WEXT),WL_WEXT=1) \
                modules
        $(MAKE_KMOD) \
                SUBDIRS="$(PKG_BUILD_DIR)/wlcompat" \
                DEBUG=1 \
+               $(if $(WL_WEXT),WL_WEXT=1) \
                modules
 
        # Compile wlc
@@ -175,10 +164,12 @@ define Build/Compile
                $(TARGET_CONFIGURE_OPTS) \
                CFLAGS="$(TARGET_CFLAGS)" \
                all
-       $(NO_TRACE_MAKE) -C compat-ldso -f build.mk PKG_INSTALL_DIR="$(PKG_BUILD_DIR)" BUILD_DIR="$(PKG_BUILD_DIR)"
-       $(SED) 's,ld-uClibc.so.0,ld-uClibc.brcm,' \
-               $(PKG_BUILD_DIR)/wl \
-               $(PKG_BUILD_DIR)/nas
+       $(TARGET_CC) -o $(PKG_BUILD_DIR)/nas $(PKG_BUILD_DIR)/nas_exe.o -L$(STAGING_DIR)/usr/lib -lnvram
+       $(TARGET_CC) -o $(PKG_BUILD_DIR)/wl $(PKG_BUILD_DIR)/wl_exe.o
+#      $(NO_TRACE_MAKE) -C compat-ldso -f build.mk PKG_INSTALL_DIR="$(PKG_BUILD_DIR)"
+#      $(SED) 's,ld-uClibc.so.0,ld-uClibc.brcm,' \
+#              $(PKG_BUILD_DIR)/wl \
+#              $(PKG_BUILD_DIR)/nas
 endef
 
 define Package/brcm-compat-ldso/install
@@ -198,8 +189,6 @@ define Package/wl/install
 endef
 
 define Package/nas/install
-       $(INSTALL_DIR) $(1)/usr/lib
-       $(INSTALL_BIN) $(PKG_BUILD_DIR)/libbcmcrypto.so $(1)/usr/lib/
        $(INSTALL_DIR) $(1)/usr/sbin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/nas $(1)/usr/sbin/
        ln -sf nas $(1)/usr/sbin/nas4not
@@ -208,7 +197,7 @@ endef
 
 $(eval $(call KernelPackage,brcm-wl))
 $(eval $(call KernelPackage,brcm-wl-mimo))
-$(eval $(call BuildPackage,brcm-compat-ldso))
+#$(eval $(call BuildPackage,brcm-compat-ldso))
 $(eval $(call KernelPackage,wlcompat))
 $(eval $(call KernelPackage,wlcompat-debug))
 $(eval $(call BuildPackage,wlc))
index d9b2220..2e6f2e8 100644 (file)
@@ -52,7 +52,7 @@ scan_broadcom() {
        case "$adhoc:$sta:$apmode" in
                1*)
                        ap=0
-                       mssid=0
+                       mssid=
                        infra=0
                ;;
                :1:1)
@@ -62,7 +62,7 @@ scan_broadcom() {
                :1:)
                        wet=1
                        ap=0
-                       mssid=0
+                       mssid=
                ;;
                ::)
                        radio=0
@@ -158,11 +158,11 @@ enable_broadcom() {
                                                        config_get k "$vif" key$knr
                                                        [ -n "$k" ] || continue
                                                        [ "$defkey" = "$knr" ] && def="=" || def=""
-                                                       append vif_pre_up "wepkey $def$knr,$k" "$N"
+                                                       append vif_do_up "wepkey $def$knr,$k" "$N"
                                                done
                                        ;;
                                        "");;
-                                       *) append vif_pre_up "wepkey =1,$key" "$N";;
+                                       *) append vif_do_up "wepkey =1,$key" "$N";;
                                esac
                        ;;
                        *psk*|*PSK*)
@@ -191,17 +191,15 @@ enable_broadcom() {
                                nasopts="-r \"\$${vif}_key\" -h $server -p $port"
                        ;;
                esac
-               append vif_post_up "wsec $wsec" "$N"
-               append vif_post_up "wpa_auth $auth" "$N"
-               append vif_post_up "wsec_restrict $wsec_r" "$N"
-               append vif_post_up "eap_restrict $eap_r" "$N"
+               append vif_do_up "wsec $wsec" "$N"
+               append vif_do_up "wpa_auth $auth" "$N"
+               append vif_do_up "wsec_restrict $wsec_r" "$N"
+               append vif_do_up "eap_restrict $eap_r" "$N"
                
                config_get ssid "$vif" ssid
                append vif_post_up "vlan_mode 0" "$N"
                append vif_post_up "ssid $ssid" "$N"
-               case "$mode" in
-                       sta|adhoc) append vif_do_up "ssid $ssid" "$N";;
-               esac
+               append vif_do_up "ssid $ssid" "$N"
                
                append vif_post_up "enabled 1" "$N"
                
@@ -221,8 +219,8 @@ enable_broadcom() {
                        [ "$mode" = "sta" ] && {
                                nas_mode="-S"
                                [ -z "$bridge" ] || {
-                                       append vif_pre_up "supplicant 1" "$N"
-                                       append vif_pre_up "passphrase $key" "$N"
+                                       append vif_post_up "supplicant 1" "$N"
+                                       append vif_post_up "passphrase $key" "$N"
                                        
                                        use_nas=0
                                }
@@ -236,7 +234,7 @@ enable_broadcom() {
 $ifdown
 
 ap $ap
-mssid $mssid
+${mssid:+mssid $mssid}
 apsta $apsta
 infra $infra
 ${wet:+wet 1}
index 0a16bdc..c75795a 100644 (file)
@@ -23,9 +23,6 @@ obj-m         := $(O_TARGET)
 wl_mod$(MOD_NAME).o: wl_apsta$(MOD_NAME).o
        perl -ne 's,eth%d,wl%d\x00,g,print' < $< > $@
 
-wl$(MOD_NAME).o.patch: wl$(MOD_NAME).o
-       $(OBJDUMP) -d $< | perl patchtable.pl > $@
-
-modules: wl$(MOD_NAME).o.patch
+modules: wl$(MOD_NAME).o
 
 include $(TOPDIR)/Rules.make
index 7592f23..88337d6 100644 (file)
 /*
- * Misc useful OS-independent routines.
+ * Driver O/S-independent utility routines
  *
- * Copyright 2006, Broadcom Corporation
+ * Copyright 2007, 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 $
+ * $Id$
  */
 
 #include <typedefs.h>
 #include <bcmdefs.h>
 #include <stdarg.h>
+#include "bcmutils.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;
-};
+#include "proto/ethernet.h"
+#include "proto/vlan.h"
+#include "proto/bcmip.h"
+#include "proto/bcmtcp.h"
+#include "proto/802.1d.h"
+
+#ifdef BCMPERFSTATS
+#include <bcmperf.h>
+#endif
+
+#if 0
+/* nvram vars cache */
+static char *nvram_vars = NULL;
+static int vars_len = -1;
+#endif
 
 /* copy a pkt buffer chain into a buffer */
 uint
-pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf)
+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;
+  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)
+pkttotlen (osl_t * osh, void *p)
 {
-       uint total;
+  uint total;
 
-       total = 0;
-       for (; p; p = PKTNEXT(osh, p))
-               total += PKTLEN(osh, p);
-       return (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)
+pktlast (osl_t * osh, void *p)
 {
-       for (; PKTNEXT(osh, p); p = PKTNEXT(osh, p))
-               ;
+  for (; PKTNEXT (osh, p); p = PKTNEXT (osh, p))
+    ;
 
-       return (p);
+  return (p);
 }
 
 
 /*
  * osl multiple-precedence packet queue
- * hi_prec is always >= the number of the highest non-empty queue
+ * hi_prec is always >= the number of the highest non-empty precedence
  */
 void *
-pktq_penq(struct pktq *pq, int prec, void *p)
+pktq_penq (struct pktq *pq, int prec, void *p)
 {
-       struct pktq_prec *q;
+  struct pktq_prec *q;
 
-       ASSERT(prec >= 0 && prec < pq->num_prec);
-       ASSERT(PKTLINK(p) == NULL);         /* queueing chains not allowed */
+  ASSERT (prec >= 0 && prec < pq->num_prec);
+  ASSERT (PKTLINK (p) == NULL);        /* queueing chains not allowed */
 
-       ASSERT(!pktq_full(pq));
-       ASSERT(!pktq_pfull(pq, prec));
+  ASSERT (!pktq_full (pq));
+  ASSERT (!pktq_pfull (pq, prec));
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if (q->head)
-               PKTSETLINK(q->tail, p);
-       else
-               q->head = p;
+  if (q->head)
+    PKTSETLINK (q->tail, p);
+  else
+    q->head = p;
 
-       q->tail = p;
-       q->len++;
+  q->tail = p;
+  q->len++;
 
-       pq->len++;
+  pq->len++;
 
-       if (pq->hi_prec < prec)
-               pq->hi_prec = (uint8)prec;
+  if (pq->hi_prec < prec)
+    pq->hi_prec = (uint8) prec;
 
-       return p;
+  return p;
 }
 
 void *
-pktq_penq_head(struct pktq *pq, int prec, void *p)
+pktq_penq_head (struct pktq *pq, int prec, void *p)
 {
-       struct pktq_prec *q;
+  struct pktq_prec *q;
 
-       ASSERT(prec >= 0 && prec < pq->num_prec);
-       ASSERT(PKTLINK(p) == NULL);         /* queueing chains not allowed */
+  ASSERT (prec >= 0 && prec < pq->num_prec);
+  ASSERT (PKTLINK (p) == NULL);        /* queueing chains not allowed */
 
-       ASSERT(!pktq_full(pq));
-       ASSERT(!pktq_pfull(pq, prec));
+  ASSERT (!pktq_full (pq));
+  ASSERT (!pktq_pfull (pq, prec));
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if (q->head == NULL)
-               q->tail = p;
+  if (q->head == NULL)
+    q->tail = p;
 
-       PKTSETLINK(p, q->head);
-       q->head = p;
-       q->len++;
+  PKTSETLINK (p, q->head);
+  q->head = p;
+  q->len++;
 
-       pq->len++;
+  pq->len++;
 
-       if (pq->hi_prec < prec)
-               pq->hi_prec = (uint8)prec;
+  if (pq->hi_prec < prec)
+    pq->hi_prec = (uint8) prec;
 
-       return p;
+  return p;
 }
 
 void *
-pktq_pdeq(struct pktq *pq, int prec)
+pktq_pdeq (struct pktq *pq, int prec)
 {
-       struct pktq_prec *q;
-       void *p;
+  struct pktq_prec *q;
+  void *p;
 
-       ASSERT(prec >= 0 && prec < pq->num_prec);
+  ASSERT (prec >= 0 && prec < pq->num_prec);
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if ((p = q->head) == NULL)
-               return NULL;
+  if ((p = q->head) == NULL)
+    return NULL;
 
-       if ((q->head = PKTLINK(p)) == NULL)
-               q->tail = NULL;
+  if ((q->head = PKTLINK (p)) == NULL)
+    q->tail = NULL;
 
-       q->len--;
+  q->len--;
 
-       pq->len--;
+  pq->len--;
 
-       PKTSETLINK(p, NULL);
+  PKTSETLINK (p, NULL);
 
-       return p;
+  return p;
 }
 
 void *
-pktq_pdeq_tail(struct pktq *pq, int prec)
+pktq_pdeq_tail (struct pktq *pq, int prec)
 {
-       struct pktq_prec *q;
-       void *p, *prev;
+  struct pktq_prec *q;
+  void *p, *prev;
 
-       ASSERT(prec >= 0 && prec < pq->num_prec);
+  ASSERT (prec >= 0 && prec < pq->num_prec);
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if ((p = q->head) == NULL)
-               return NULL;
+  if ((p = q->head) == NULL)
+    return NULL;
 
-       for (prev = NULL; p != q->tail; p = PKTLINK(p))
-               prev = p;
+  for (prev = NULL; p != q->tail; p = PKTLINK (p))
+    prev = p;
 
-       if (prev)
-               PKTSETLINK(prev, NULL);
-       else
-               q->head = NULL;
+  if (prev)
+    PKTSETLINK (prev, NULL);
+  else
+    q->head = NULL;
 
-       q->tail = prev;
-       q->len--;
+  q->tail = prev;
+  q->len--;
 
-       pq->len--;
+  pq->len--;
 
-       return p;
+  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;
+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;
 }
 
+#if 0
 bool
-pktq_pdel(struct pktq *pq, void *pktbuf, int prec)
+pktq_pdel (struct pktq *pq, void *pktbuf, int prec)
 {
-       struct pktq_prec *q;
-       void *p;
-
-       ASSERT(prec >= 0 && prec < pq->num_prec);
+  struct pktq_prec *q;
+  void *p;
 
-       if (!pktbuf)
-               return FALSE;
+  ASSERT (prec >= 0 && prec < pq->num_prec);
 
-       q = &pq->q[prec];
+  if (!pktbuf)
+    return FALSE;
 
-       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;
+  q = &pq->q[prec];
 
-               PKTSETLINK(p, PKTLINK(pktbuf));
-               if (q->tail == pktbuf)
-                       q->tail = p;
-       }
+  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;
+  q->len--;
+  pq->len--;
+  PKTSETLINK (pktbuf, NULL);
+  return TRUE;
 }
+#endif
 
 void
-pktq_init(struct pktq *pq, int num_prec, int max_len)
+pktq_init (struct pktq *pq, int num_prec, int max_len)
 {
-       int prec;
+  int prec;
 
-       ASSERT(num_prec > 0 && num_prec <= PKTQ_MAX_PREC);
+  ASSERT (num_prec > 0 && num_prec <= PKTQ_MAX_PREC);
 
-       bzero(pq, sizeof(*pq));
+  /* pq is variable size; only zero out what's requested */
+  bzero (pq,
+        OFFSETOF (struct pktq, q) + (sizeof (struct pktq_prec) * num_prec));
 
-       pq->num_prec = (uint16)num_prec;
+  pq->num_prec = (uint16) num_prec;
 
-       pq->max = (uint16)max_len;
+  pq->max = (uint16) max_len;
 
-       for (prec = 0; prec < num_prec; prec++)
-               pq->q[prec].max = pq->max;
+  for (prec = 0; prec < num_prec; prec++)
+    pq->q[prec].max = pq->max;
+}
+
+int
+pktq_setmax (struct pktq *pq, int max_len)
+{
+  int prec;
+
+  if (!max_len)
+    return pq->max;
+
+  pq->max = (uint16) max_len;
+  for (prec = 0; prec < pq->num_prec; prec++)
+    pq->q[prec].max = pq->max;
+
+  return pq->max;
 }
 
 void *
-pktq_deq(struct pktq *pq, int *prec_out)
+pktq_deq (struct pktq *pq, int *prec_out)
 {
-       struct pktq_prec *q;
-       void *p;
-       int prec;
+  struct pktq_prec *q;
+  void *p;
+  int prec;
 
-       if (pq->len == 0)
-               return NULL;
+  if (pq->len == 0)
+    return NULL;
 
-       while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-               pq->hi_prec--;
+  while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
+    pq->hi_prec--;
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if ((p = q->head) == NULL)
-               return NULL;
+  if ((p = q->head) == NULL)
+    return NULL;
 
-       if ((q->head = PKTLINK(p)) == NULL)
-               q->tail = NULL;
+  if ((q->head = PKTLINK (p)) == NULL)
+    q->tail = NULL;
 
-       q->len--;
+  q->len--;
 
-       pq->len--;
+  pq->len--;
 
-       if (prec_out)
-               *prec_out = prec;
+  if (prec_out)
+    *prec_out = prec;
 
-       PKTSETLINK(p, NULL);
+  PKTSETLINK (p, NULL);
 
-       return p;
+  return p;
 }
 
 void *
-pktq_deq_tail(struct pktq *pq, int *prec_out)
+pktq_deq_tail (struct pktq *pq, int *prec_out)
 {
-       struct pktq_prec *q;
-       void *p, *prev;
-       int prec;
+  struct pktq_prec *q;
+  void *p, *prev;
+  int prec;
 
-       if (pq->len == 0)
-               return NULL;
+  if (pq->len == 0)
+    return NULL;
 
-       for (prec = 0; prec < pq->hi_prec; prec++)
-               if (pq->q[prec].head)
-                       break;
+  for (prec = 0; prec < pq->hi_prec; prec++)
+    if (pq->q[prec].head)
+      break;
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if ((p = q->head) == NULL)
-               return NULL;
+  if ((p = q->head) == NULL)
+    return NULL;
 
-       for (prev = NULL; p != q->tail; p = PKTLINK(p))
-               prev = p;
+  for (prev = NULL; p != q->tail; p = PKTLINK (p))
+    prev = p;
 
-       if (prev)
-               PKTSETLINK(prev, NULL);
-       else
-               q->head = NULL;
+  if (prev)
+    PKTSETLINK (prev, NULL);
+  else
+    q->head = NULL;
 
-       q->tail = prev;
-       q->len--;
+  q->tail = prev;
+  q->len--;
 
-       pq->len--;
+  pq->len--;
 
-       if (prec_out)
-               *prec_out = prec;
+  if (prec_out)
+    *prec_out = prec;
 
-       PKTSETLINK(p, NULL);
+  PKTSETLINK (p, NULL);
 
-       return p;
+  return p;
 }
 
+#if 0
 void *
-pktq_peek(struct pktq *pq, int *prec_out)
+pktq_peek (struct pktq *pq, int *prec_out)
 {
-       int prec;
+  int prec;
 
-       if (pq->len == 0)
-               return NULL;
+  if (pq->len == 0)
+    return NULL;
 
-       while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-               pq->hi_prec--;
+  while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
+    pq->hi_prec--;
 
-       if (prec_out)
-               *prec_out = prec;
+  if (prec_out)
+    *prec_out = prec;
 
-       return (pq->q[prec].head);
+  return (pq->q[prec].head);
 }
+#endif
 
 void *
-pktq_peek_tail(struct pktq *pq, int *prec_out)
+pktq_peek_tail (struct pktq *pq, int *prec_out)
 {
-       int prec;
+  int prec;
 
-       if (pq->len == 0)
-               return NULL;
+  if (pq->len == 0)
+    return NULL;
 
-       for (prec = 0; prec < pq->hi_prec; prec++)
-               if (pq->q[prec].head)
-                       break;
+  for (prec = 0; prec < pq->hi_prec; prec++)
+    if (pq->q[prec].head)
+      break;
 
-       if (prec_out)
-               *prec_out = prec;
+  if (prec_out)
+    *prec_out = prec;
 
-       return (pq->q[prec].tail);
+  return (pq->q[prec].tail);
 }
 
 void
-pktq_flush(osl_t *osh, struct pktq *pq, bool dir)
+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);
+  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)
+pktq_mlen (struct pktq *pq, uint prec_bmp)
 {
-       int prec, len;
+  int prec, len;
 
-       len = 0;
+  len = 0;
 
-       for (prec = 0; prec <= pq->hi_prec; prec++)
-               if (prec_bmp & (1 << prec))
-                       len += pq->q[prec].len;
+  for (prec = 0; prec <= pq->hi_prec; prec++)
+    if (prec_bmp & (1 << prec))
+      len += pq->q[prec].len;
 
-       return len;
+  return len;
 }
 
 /* Priority dequeue from a specific set of precedences */
 void *
-pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out)
+pktq_mdeq (struct pktq *pq, uint prec_bmp, int *prec_out)
 {
-       struct pktq_prec *q;
-       void *p;
-       int prec;
+  struct pktq_prec *q;
+  void *p;
+  int prec;
 
-       if (pq->len == 0)
-               return NULL;
+  if (pq->len == 0)
+    return NULL;
 
-       while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-               pq->hi_prec--;
+  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;
+  while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL)
+    if (prec-- == 0)
+      return NULL;
 
-       q = &pq->q[prec];
+  q = &pq->q[prec];
 
-       if ((p = q->head) == NULL)
-               return NULL;
+  if ((p = q->head) == NULL)
+    return NULL;
 
-       if ((q->head = PKTLINK(p)) == NULL)
-               q->tail = NULL;
+  if ((q->head = PKTLINK (p)) == NULL)
+    q->tail = NULL;
 
-       q->len--;
+  q->len--;
 
-       if (prec_out)
-               *prec_out = prec;
+  if (prec_out)
+    *prec_out = prec;
 
-       pq->len--;
+  pq->len--;
 
-       PKTSETLINK(p, NULL);
+  PKTSETLINK (p, NULL);
 
-       return p;
+  return p;
 }
 
-char*
-bcmstrcat(char *dest, const char *src)
+const unsigned char bcm_ctype[] = {
+  _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C,      /* 0-7 */
+  _BCM_C, _BCM_C | _BCM_S, _BCM_C | _BCM_S, _BCM_C | _BCM_S, _BCM_C | _BCM_S,
+    _BCM_C | _BCM_S, _BCM_C,
+  _BCM_C,                      /* 8-15 */
+  _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C,      /* 16-23 */
+  _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C, _BCM_C,      /* 24-31 */
+  _BCM_S | _BCM_SP, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,    /* 32-39 */
+  _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,      /* 40-47 */
+  _BCM_D, _BCM_D, _BCM_D, _BCM_D, _BCM_D, _BCM_D, _BCM_D, _BCM_D,      /* 48-55 */
+  _BCM_D, _BCM_D, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,      /* 56-63 */
+  _BCM_P, _BCM_U | _BCM_X, _BCM_U | _BCM_X, _BCM_U | _BCM_X, _BCM_U | _BCM_X,
+    _BCM_U | _BCM_X,
+  _BCM_U | _BCM_X, _BCM_U,     /* 64-71 */
+  _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U,      /* 72-79 */
+  _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U,      /* 80-87 */
+  _BCM_U, _BCM_U, _BCM_U, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,      /* 88-95 */
+  _BCM_P, _BCM_L | _BCM_X, _BCM_L | _BCM_X, _BCM_L | _BCM_X, _BCM_L | _BCM_X,
+    _BCM_L | _BCM_X,
+  _BCM_L | _BCM_X, _BCM_L,     /* 96-103 */
+  _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L,      /* 104-111 */
+  _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L,      /* 112-119 */
+  _BCM_L, _BCM_L, _BCM_L, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_C,      /* 120-127 */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* 128-143 */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,      /* 144-159 */
+  _BCM_S | _BCM_SP, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,
+    _BCM_P, _BCM_P,
+  _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,      /* 160-175 */
+  _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,
+    _BCM_P, _BCM_P,
+  _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,      /* 176-191 */
+  _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U,
+    _BCM_U, _BCM_U,
+  _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U,      /* 192-207 */
+  _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_P, _BCM_U,
+    _BCM_U, _BCM_U,
+  _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_L,      /* 208-223 */
+  _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L,
+    _BCM_L, _BCM_L,
+  _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L,      /* 224-239 */
+  _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_P, _BCM_L,
+    _BCM_L, _BCM_L,
+  _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L       /* 240-255 */
+};
+
+ulong BCMROMFN (bcm_strtoul) (char *cp, char **endp, uint base)
 {
-       strcpy(&dest[strlen(dest)], src);
-       return (dest);
+  ulong result, value;
+  bool minus;
+
+  minus = FALSE;
+
+  while (bcm_isspace (*cp))
+    cp++;
+
+  if (cp[0] == '+')
+    cp++;
+  else if (cp[0] == '-')
+    {
+      minus = TRUE;
+      cp++;
+    }
+
+  if (base == 0)
+    {
+      if (cp[0] == '0')
+       {
+         if ((cp[1] == 'x') || (cp[1] == 'X'))
+           {
+             base = 16;
+             cp = &cp[2];
+           }
+         else
+           {
+             base = 8;
+             cp = &cp[1];
+           }
+       }
+      else
+       base = 10;
+    }
+  else if (base == 16 && (cp[0] == '0') && ((cp[1] == 'x') || (cp[1] == 'X')))
+    {
+      cp = &cp[2];
+    }
+
+  result = 0;
+
+  while (bcm_isxdigit (*cp) &&
+        (value =
+         bcm_isdigit (*cp) ? *cp - '0' : bcm_toupper (*cp) - 'A' + 10) <
+        base)
+    {
+      result = result * base + value;
+      cp++;
+    }
+
+  if (minus)
+    result = (ulong) (result * -1);
+
+  if (endp)
+    *endp = (char *) cp;
+
+  return (result);
 }
 
-char*
-bcm_ether_ntoa(struct ether_addr *ea, char *buf)
+#if 0
+int BCMROMFN (bcm_atoi) (char *s)
 {
-       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);
+  return (int) bcm_strtoul (s, NULL, 10);
 }
 
+/* return pointer to location of substring 'needle' in 'haystack' */
+char *BCMROMFN (bcmstrstr) (char *haystack, char *needle)
+{
+  int len, nlen;
+  int i;
+
+  if ((haystack == NULL) || (needle == NULL))
+    return (haystack);
+
+  nlen = strlen (needle);
+  len = strlen (haystack) - nlen + 1;
+
+  for (i = 0; i < len; i++)
+    if (memcmp (needle, &haystack[i], nlen) == 0)
+      return (&haystack[i]);
+  return (NULL);
+}
+
+char *BCMROMFN (bcmstrcat) (char *dest, const char *src)
+{
+  strcpy (&dest[strlen (dest)], src);
+  return (dest);
+}
+
+char *BCMROMFN (bcmstrncat) (char *dest, const char *src, uint size)
+{
+  char *endp;
+  char *p;
+
+  p = dest + strlen (dest);
+  endp = p + size;
+
+  while (p != endp && (*p++ = *src++) != '\0')
+    ;
+
+  return (dest);
+}
+#endif
+
 /* parse a xx:xx:xx:xx:xx:xx format ethernet address */
+int BCMROMFN (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);
+}
+
+#if defined(CONFIG_USBRNDIS_RETAIL) || defined(NDIS_MINIPORT_DRIVER)
+/* registry routine buffer preparation utility functions:
+ * parameter order is like strncpy, but returns count
+ * of bytes copied. Minimum bytes copied is null char(1)/wchar(2)
+ */
+ulong
+wchar2ascii (char *abuf, ushort * wbuf, ushort wbuflen, ulong abuflen)
+{
+  ulong copyct = 1;
+  ushort i;
+
+  if (abuflen == 0)
+    return 0;
+
+  /* wbuflen is in bytes */
+  wbuflen /= sizeof (ushort);
+
+  for (i = 0; i < wbuflen; ++i)
+    {
+      if (--abuflen == 0)
+       break;
+      *abuf++ = (char) *wbuf++;
+      ++copyct;
+    }
+  *abuf = '\0';
+
+  return copyct;
+}
+#endif /* CONFIG_USBRNDIS_RETAIL || NDIS_MINIPORT_DRIVER */
+
+#if 0
+char *
+bcm_ether_ntoa (struct ether_addr *ea, char *buf)
+{
+  snprintf (buf, 18, "%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);
+}
+
+char *
+bcm_ip_ntoa (struct ipv4_addr *ia, char *buf)
+{
+  snprintf (buf, 16, "%d.%d.%d.%d",
+           ia->addr[0], ia->addr[1], ia->addr[2], ia->addr[3]);
+  return (buf);
+}
+void
+bcm_mdelay (uint ms)
+{
+  uint i;
+
+  for (i = 0; i < ms; i++)
+    {
+      OSL_DELAY (1000);
+    }
+}
+#endif
+
+#if 0
+
+/*
+ * Search the name=value vars for a specific one and return its value.
+ * Returns NULL if not found.
+ */
+char *
+getvar (char *vars, const char *name)
+{
+#ifdef _MINOSL_
+  return NULL;
+#else
+  char *s;
+  int len;
+
+  if (!name)
+    return NULL;
+
+  len = strlen (name);
+  if (len == 0)
+    return NULL;
+
+  /* first look in vars[] */
+  for (s = vars; s && *s;)
+    {
+      /* CSTYLED */
+      if ((bcmp (s, name, len) == 0) && (s[len] == '='))
+       return (&s[len + 1]);
+
+      while (*s++)
+       ;
+    }
+
+  /* then query nvram */
+  return (nvram_get (name));
+#endif /* _MINOSL_ */
+}
+
+/*
+ * Search the vars for a specific one and return its value as
+ * an integer. Returns 0 if not found.
+ */
 int
-bcm_ether_atoe(char *p, struct ether_addr *ea)
+getintvar (char *vars, const char *name)
+{
+#ifdef _MINOSL_
+  return 0;
+#else
+  char *val;
+
+  if ((val = getvar (vars, name)) == NULL)
+    return (0);
+
+  return (bcm_strtoul (val, NULL, 0));
+#endif /* _MINOSL_ */
+}
+
+
+/* Search for token in comma separated token-string */
+static int
+findmatch (char *string, char *name)
 {
-       int i = 0;
+  uint len;
+  char *c;
+
+  len = strlen (name);
+  /* CSTYLED */
+  while ((c = strchr (string, ',')) != NULL)
+    {
+      if (len == (uint) (c - string) && !strncmp (string, name, len))
+       return 1;
+      string = c + 1;
+    }
+
+  return (!strcmp (string, name));
+}
 
-       for (;;) {
-               ea->octet[i++] = (char) bcm_strtoul(p, &p, 16);
-               if (!*p++ || i == 6)
-                       break;
+/* Return gpio pin number assigned to the named pin
+ *
+ * Variable should be in format:
+ *
+ *     gpio<N>=pin_name,pin_name
+ *
+ * This format allows multiple features to share the gpio with mutual
+ * understanding.
+ *
+ * 'def_pin' is returned if a specific gpio is not defined for the requested functionality
+ * and if def_pin is not used by others.
+ */
+uint
+getgpiopin (char *vars, char *pin_name, uint def_pin)
+{
+  char name[] = "gpioXXXX";
+  char *val;
+  uint pin;
+
+  /* Go thru all possibilities till a match in pin name */
+  for (pin = 0; pin < GPIO_NUMPINS; pin++)
+    {
+      snprintf (name, sizeof (name), "gpio%d", pin);
+      val = getvar (vars, name);
+      if (val && findmatch (val, pin_name))
+       return pin;
+    }
+
+  if (def_pin != GPIO_PIN_NOTDEFINED)
+    {
+      /* make sure the default pin is not used by someone else */
+      snprintf (name, sizeof (name), "gpio%d", def_pin);
+      if (getvar (vars, name))
+       {
+         def_pin = GPIO_PIN_NOTDEFINED;
        }
+    }
+
+  return def_pin;
+}
+#endif
+
+#ifdef BCMPERFSTATS
 
-       return (i == 6);
+#define        LOGSIZE 256             /* should be power of 2 to avoid div below */
+static struct
+{
+  uint cycles;
+  char *fmt;
+  uint a1;
+  uint a2;
+} logtab[LOGSIZE];
+
+/* last entry logged  */
+static uint logi = 0;
+/* next entry to read */
+static uint readi = 0;
+
+void
+bcm_perf_enable ()
+{
+  BCMPERF_ENABLE_INSTRCOUNT ();
+  BCMPERF_ENABLE_ICACHE_MISS ();
+  BCMPERF_ENABLE_ICACHE_HIT ();
 }
 
-/* Takes an Ethernet frame and sets out-of-bound PKTPRIO
- * Also updates the inplace vlan tag if requested
+void
+bcmlog (char *fmt, uint a1, uint a2)
+{
+  static uint last = 0;
+  uint cycles, i;
+  OSL_GETCYCLES (cycles);
+
+  i = logi;
+
+  logtab[i].cycles = cycles - last;
+  logtab[i].fmt = fmt;
+  logtab[i].a1 = a1;
+  logtab[i].a2 = a2;
+
+  logi = (i + 1) % LOGSIZE;
+  last = cycles;
+}
+
+
+void
+bcmstats (char *fmt)
+{
+  static uint last = 0;
+  static uint32 ic_miss = 0;
+  static uint32 instr_count = 0;
+  uint32 ic_miss_cur;
+  uint32 instr_count_cur;
+  uint cycles, i;
+
+  OSL_GETCYCLES (cycles);
+  BCMPERF_GETICACHE_MISS (ic_miss_cur);
+  BCMPERF_GETINSTRCOUNT (instr_count_cur);
+
+  i = logi;
+
+  logtab[i].cycles = cycles - last;
+  logtab[i].a1 = ic_miss_cur - ic_miss;
+  logtab[i].a2 = instr_count_cur - instr_count;
+  logtab[i].fmt = fmt;
+
+  logi = (i + 1) % LOGSIZE;
+
+  last = cycles;
+  instr_count = instr_count_cur;
+  ic_miss = ic_miss_cur;
+}
+
+
+void
+bcmdumplog (char *buf, int size)
+{
+  char *limit, *line;
+  int j = 0;
+  int num;
+
+  limit = buf + size - 80;
+  *buf = '\0';
+
+  num = logi - readi;
+
+  if (num < 0)
+    num += LOGSIZE;
+
+  /* print in chronological order */
+
+  for (j = 0; j < num && (buf < limit); readi = (readi + 1) % LOGSIZE, j++)
+    {
+      if (logtab[readi].fmt == NULL)
+       continue;
+      line = buf;
+      buf += sprintf (buf, "%d\t", logtab[readi].cycles);
+      buf +=
+       sprintf (buf, logtab[readi].fmt, logtab[readi].a1, logtab[readi].a2);
+      buf += sprintf (buf, "\n");
+    }
+
+}
+
+
+/*
+ * Dump one log entry at a time.
+ * Return index of next entry or -1 when no more .
  */
+int
+bcmdumplogent (char *buf, uint i)
+{
+  bool hit;
+
+  /*
+   * If buf is NULL, return the starting index,
+   * interpreting i as the indicator of last 'i' entries to dump.
+   */
+  if (buf == NULL)
+    {
+      i = ((i > 0) && (i < (LOGSIZE - 1))) ? i : (LOGSIZE - 1);
+      return ((logi - i) % LOGSIZE);
+    }
+
+  *buf = '\0';
+
+  ASSERT (i < LOGSIZE);
+
+  if (i == logi)
+    return (-1);
+
+  hit = FALSE;
+  for (; (i != logi) && !hit; i = (i + 1) % LOGSIZE)
+    {
+      if (logtab[i].fmt == NULL)
+       continue;
+      buf += sprintf (buf, "%d: %d\t", i, logtab[i].cycles);
+      buf += sprintf (buf, logtab[i].fmt, logtab[i].a1, logtab[i].a2);
+      buf += sprintf (buf, "\n");
+      hit = TRUE;
+    }
+
+  return (i);
+}
+
+#endif /* BCMPERFSTATS */
+
+#ifdef BCMDBG
+/* pretty hex print a pkt buffer chain */
 void
-pktsetprio(void *pkt, bool update_vtag)
+prpkt (const char *msg, osl_t * osh, void *p0)
 {
-       struct ether_header *eh;
-       struct ethervlan_header *evh;
-       uint8 *pktdata;
-       int priority = 0;
+  void *p;
 
-       pktdata = (uint8 *) PKTDATA(NULL, pkt);
-       ASSERT(ISALIGNED((uintptr)pktdata, sizeof(uint16)));
+  if (msg && (msg[0] != '\0'))
+    printf ("%s:\n", msg);
 
-       eh = (struct ether_header *) pktdata;
+  for (p = p0; p; p = PKTNEXT (osh, p))
+    prhex (NULL, PKTDATA (osh, p), PKTLEN (osh, p));
+}
+#endif /* BCMDBG */
 
-       if (ntoh16(eh->ether_type) == ETHER_TYPE_8021Q) {
-               uint16 vlan_tag;
-               int vlan_prio, dscp_prio = 0;
+/* Takes an Ethernet frame and sets out-of-bound PKTPRIO.
+ * Also updates the inplace vlan tag if requested.
+ * For debugging, it returns an indication of what it did.
+ */
+uint
+pktsetprio (void *pkt, bool update_vtag)
+{
+  struct ether_header *eh;
+  struct ethervlan_header *evh;
+  uint8 *pktdata;
+  int priority = 0;
+  int rc = 0;
 
-               evh = (struct ethervlan_header *)eh;
+  pktdata = (uint8 *) PKTDATA (NULL, pkt);
+  ASSERT (ISALIGNED ((uintptr) pktdata, sizeof (uint16)));
 
-               vlan_tag = ntoh16(evh->vlan_tag);
-               vlan_prio = (int) (vlan_tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK;
+  eh = (struct ether_header *) pktdata;
 
-               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);
-               }
+  if (ntoh16 (eh->ether_type) == ETHER_TYPE_8021Q)
+    {
+      uint16 vlan_tag;
+      int vlan_prio, dscp_prio = 0;
+
+      evh = (struct ethervlan_header *) eh;
 
-               /* 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);
+      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);
+         if ((IP_VER (ip_body) == IP_VER_4)
+             && (IPV4_PROT (ip_body) == IP_PROT_TCP))
+           {
+             int ip_len;
+             int src_port;
+             bool src_port_exc;
+             uint8 *tcp_hdr;
+
+             ip_len = IPV4_PAYLOAD_LEN (ip_body);
+             tcp_hdr = IPV4_NO_OPTIONS_PAYLOAD (ip_body);
+             src_port = TCP_SRC_PORT (tcp_hdr);
+             src_port_exc = (src_port == 10110) || (src_port == 10120) ||
+               (src_port == 10130) || (src_port == 10140);
+
+             if ((ip_len == 40) && src_port_exc && TCP_IS_ACK (tcp_hdr))
+               {
+                 dscp_prio = 7;
                }
-       } 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);
+      /* DSCP priority gets precedence over 802.1P (vlan tag) */
+      if (dscp_prio != 0)
+       {
+         priority = dscp_prio;
+         rc |= PKTPRIO_VDSCP;
+       }
+      else
+       {
+         priority = vlan_prio;
+         rc |= PKTPRIO_VLAN;
+       }
+      /* 
+       * 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);
+         rc |= PKTPRIO_UPD;
+       }
+    }
+  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);
+      rc |= PKTPRIO_DSCP;
+      if ((IP_VER (ip_body) == IP_VER_4)
+         && (IPV4_PROT (ip_body) == IP_PROT_TCP))
+       {
+         int ip_len;
+         int src_port;
+         bool src_port_exc;
+         uint8 *tcp_hdr;
+
+         ip_len = IPV4_PAYLOAD_LEN (ip_body);
+         tcp_hdr = IPV4_NO_OPTIONS_PAYLOAD (ip_body);
+         src_port = TCP_SRC_PORT (tcp_hdr);
+         src_port_exc = (src_port == 10110) || (src_port == 10120) ||
+           (src_port == 10130) || (src_port == 10140);
+
+         if ((ip_len == 40) && src_port_exc && TCP_IS_ACK (tcp_hdr))
+           {
+             priority = 7;
+           }
+       }
+    }
+
+  ASSERT (priority >= 0 && priority <= MAXPRIO);
+  PKTSETPRIO (pkt, priority);
+  return (rc | priority);
 }
 
 static char bcm_undeferrstr[BCME_STRLEN];
 
 static const char *bcmerrorstrtable[] = BCMERRSTRINGTABLE;
 
-/* Convert the Error codes into related Error strings  */
+/* Convert the error codes into related error strings  */
 const char *
-bcmerrorstr(int bcmerror)
+bcmerrorstr (int bcmerror)
+{
+  /* check if someone added a bcmerror code but forgot to add errorstring */
+  ASSERT (ABS (BCME_LAST) == (ARRAYSIZE (bcmerrorstrtable) - 1));
+
+  if (bcmerror > 0 || bcmerror < BCME_LAST)
+    {
+      snprintf (bcm_undeferrstr, BCME_STRLEN, "Undefined error %d", bcmerror);
+      return bcm_undeferrstr;
+    }
+
+  ASSERT (strlen (bcmerrorstrtable[-bcmerror]) < BCME_STRLEN);
+
+  return bcmerrorstrtable[-bcmerror];
+}
+
+#if 0
+static void BCMINITFN (bcm_nvram_refresh) (char *flash)
 {
-       int abs_bcmerror;
+  int i;
+  int ret = 0;
+
+  ASSERT (flash);
+
+  /* default "empty" vars cache */
+  bzero (flash, 2);
+
+  if ((ret = nvram_getall (flash, NVRAM_SPACE)))
+    return;
+
+  /* determine nvram length */
+  for (i = 0; i < NVRAM_SPACE; i++)
+    {
+      if (flash[i] == '\0' && flash[i + 1] == '\0')
+       break;
+    }
 
-       abs_bcmerror = ABS(bcmerror);
+  if (i > 1)
+    vars_len = i + 2;
+  else
+    vars_len = 0;
+}
+#endif
+
+#ifdef BCMDBG_PKT              /* pkt logging for debugging */
+/* Add a packet to the pktlist */
+void
+pktlist_add (pktlist_info_t * pktlist, void *pkt)
+{
+  uint i;
+  ASSERT (pktlist->count < PKTLIST_SIZE);
+
+  /* Verify the packet is not already part of the list */
+  for (i = 0; i < pktlist->count; i++)
+    {
+      if (pktlist->list[i] == pkt)
+       ASSERT (0);
+    }
+  pktlist->list[pktlist->count] = pkt;
+  pktlist->count++;
+  return;
+}
 
-       /* 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;
+/* Remove a packet from the pktlist */
+void
+pktlist_remove (pktlist_info_t * pktlist, void *pkt)
+{
+  uint i;
+  uint num = pktlist->count;
+
+  /* find the index where pkt exists */
+  for (i = 0; i < num; i++)
+    {
+      /* check for the existence of pkt in the list */
+      if (pktlist->list[i] == pkt)
+       {
+         /* replace with the last element */
+         pktlist->list[i] = pktlist->list[num - 1];
+         pktlist->count--;
+         return;
        }
+    }
+  ASSERT (0);
+}
+
+/* Dump the pktlist (and the contents of each packet if 'data'
+ * is set). 'buf' should be large enough
+ */
+
+char *
+pktlist_dump (pktlist_info_t * pktlist, char *buf)
+{
+  char *obuf;
+  uint i;
+
+  obuf = buf;
+
+  buf += sprintf (buf, "Packet list dump:\n");
 
-       ASSERT((strlen((char*)bcmerrorstrtable[abs_bcmerror])) < BCME_STRLEN);
+  for (i = 0; i < (pktlist->count); i++)
+    {
+      buf += sprintf (buf, "0x%p\t", pktlist->list[i]);
 
-       return bcmerrorstrtable[abs_bcmerror];
+#ifdef NOTDEF                  /* Remove this ifdef to print pkttag and pktdata */
+      if (PKTTAG (pktlist->list[i]))
+       {
+         /* Print pkttag */
+         buf += sprintf (buf, "Pkttag(in hex): ");
+         buf +=
+           bcm_format_hex (buf, PKTTAG (pktlist->list[i]), OSL_PKTTAG_SZ);
+       }
+      buf += sprintf (buf, "Pktdata(in hex): ");
+      buf += bcm_format_hex (buf, PKTDATA (NULL, pktlist->list[i]),
+                            PKTLEN (NULL, pktlist->list[i]));
+#endif /* NOTDEF */
+
+      buf += sprintf (buf, "\n");
+    }
+  return obuf;
 }
+#endif /* BCMDBG_PKT */
 
+#if 0
+/* iovar table lookup */
+const bcm_iovar_t *
+bcm_iovar_lookup (const bcm_iovar_t * table, const char *name)
+{
+  const bcm_iovar_t *vi;
+  const char *lookup_name;
+
+  /* skip any ':' delimited option prefixes */
+  lookup_name = strrchr (name, ':');
+  if (lookup_name != NULL)
+    lookup_name++;
+  else
+    lookup_name = name;
+
+  ASSERT (table);
+
+  for (vi = table; vi->name; vi++)
+    {
+      if (!strcmp (vi->name, lookup_name))
+       return vi;
+    }
+  /* ran to end of table */
+
+  return NULL;                 /* var name not found */
+}
+#endif
 
 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;
+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;
+    case IOVT_BUFFER:
+      /* buffer must meet minimum length requirement */
+      if (len < vi->minlen)
+       {
+         bcmerror = BCME_BUFTOOSHORT;
+       }
+      break;
 
-       default:
-               /* unknown type for length check in iovar info */
-               ASSERT(0);
-               bcmerror = BCME_UNSUPPORTED;
+    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;
+  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
+       (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
+
+#if 0
+/*******************************************************************************
+ * crc8
+ *
+ * Computes a crc8 over the input data using the polynomial:
+ *
+ *       x^8 + x^7 +x^6 + x^4 + x^2 + 1
+ *
+ * The caller provides the initial value (either CRC8_INIT_VALUE
+ * or the previous returned value) to allow for processing of
+ * discontiguous blocks of data.  When generating the CRC the
+ * caller is responsible for complementing the final return value
+ * and inserting it into the byte stream.  When checking, a final
+ * return value of CRC8_GOOD_VALUE indicates a valid CRC.
+ *
+ * Reference: Dallas Semiconductor Application Note 27
+ *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
+ *     ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd.,
+ *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
+ *
+ * ****************************************************************************
+ */
+
+static const uint8 crc8_table[256] = {
+  0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B,
+  0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21,
+  0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF,
+  0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5,
+  0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14,
+  0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E,
+  0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80,
+  0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA,
+  0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95,
+  0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF,
+  0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01,
+  0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B,
+  0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA,
+  0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0,
+  0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E,
+  0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34,
+  0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0,
+  0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A,
+  0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54,
+  0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E,
+  0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF,
+  0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5,
+  0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B,
+  0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61,
+  0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E,
+  0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74,
+  0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA,
+  0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0,
+  0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41,
+  0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B,
+  0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5,
+  0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F
 };
 
-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 BCMROMFN (hndcrc8) (uint8 * pdata,       /* pointer to array of data to process */
+                         uint nbytes,  /* number of input data bytes to process */
+                         uint8 crc     /* either CRC8_INIT_VALUE or previous return value */
+  )
 {
-       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]);
-       }
+  /* hard code the crc loop instead of using CRC_INNER_LOOP macro
+   * to avoid the undefined and unnecessary (uint8 >> 8) operation.
+   */
+  while (nbytes-- > 0)
+    crc = crc8_table[(crc ^ *pdata++) & 0xff];
+
+  return crc;
+}
 
-       /* 1-3 bytes at end of buffer */
-       pend = pdata + (nbytes & 0x03);
-       while (pdata < pend)
-               CRC_INNER_LOOP(32, crc, *pdata++);
+/*******************************************************************************
+ * crc16
+ *
+ * Computes a crc16 over the input data using the polynomial:
+ *
+ *       x^16 + x^12 +x^5 + 1
+ *
+ * The caller provides the initial value (either CRC16_INIT_VALUE
+ * or the previous returned value) to allow for processing of
+ * discontiguous blocks of data.  When generating the CRC the
+ * caller is responsible for complementing the final return value
+ * and inserting it into the byte stream.  When checking, a final
+ * return value of CRC16_GOOD_VALUE indicates a valid CRC.
+ *
+ * Reference: Dallas Semiconductor Application Note 27
+ *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
+ *     ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd.,
+ *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
+ *
+ * ****************************************************************************
+ */
+static const uint16 crc16_table[256] = {
+  0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
+  0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
+  0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
+  0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
+  0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
+  0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
+  0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
+  0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
+  0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
+  0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
+  0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
+  0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
+  0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
+  0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
+  0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
+  0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
+  0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
+  0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
+  0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
+  0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
+  0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
+  0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
+  0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
+  0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
+  0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
+  0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
+  0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
+  0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
+  0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
+  0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
+  0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
+  0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
+};
+
+uint16 BCMROMFN (hndcrc16) (uint8 * pdata,     /* pointer to array of data to process */
+                           uint nbytes,        /* number of input data bytes to process */
+                           uint16 crc  /* either CRC16_INIT_VALUE or previous return value */
+  )
+{
+  while (nbytes-- > 0)
+    CRC_INNER_LOOP (16, crc, *pdata++);
+  return crc;
+}
+#endif
+
+static const 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 BCMROMFN (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++);
+  pend = pdata + nbytes;
+  while (pdata < pend)
+    CRC_INNER_LOOP (32, crc, *pdata++);
 #endif /* __mips__ */
 
-       return crc;
+  return crc;
 }
 
+#ifdef notdef
+#define CLEN   1499            /*  CRC Length */
+#define CBUFSIZ        (CLEN+4)
+#define CNBUFS         5       /* # of bufs */
+
+void
+testcrc32 (void)
+{
+  uint j, k, l;
+  uint8 *buf;
+  uint len[CNBUFS];
+  uint32 crcr;
+  uint32 crc32tv[CNBUFS] =
+    { 0xd2cb1faa, 0xd385c8fa, 0xf5b4f3f3, 0x55789e20, 0x00343110 };
+
+  ASSERT ((buf = MALLOC (CBUFSIZ * CNBUFS)) != NULL);
+
+  /* step through all possible alignments */
+  for (l = 0; l <= 4; l++)
+    {
+      for (j = 0; j < CNBUFS; j++)
+       {
+         len[j] = CLEN;
+         for (k = 0; k < len[j]; k++)
+           *(buf + j * CBUFSIZ + (k + l)) = (j + k) & 0xff;
+       }
+
+      for (j = 0; j < CNBUFS; j++)
+       {
+         crcr = crc32 (buf + j * CBUFSIZ + l, len[j], CRC32_INIT_VALUE);
+         ASSERT (crcr == crc32tv[j]);
+       }
+    }
+
+  MFREE (buf, CBUFSIZ * CNBUFS);
+  return;
+}
+#endif /* notdef */
 
 /*
  * Advance from the current 1-byte tag/1-byte length/variable-length value
@@ -732,27 +1592,26 @@ hndcrc32(
  * 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.
+ * by the TLV parameter's length if it is valid.
  */
-bcm_tlv_t *
-bcm_next_tlv(bcm_tlv_t *elt, int *buflen)
+bcm_tlv_t *BCMROMFN (bcm_next_tlv) (bcm_tlv_t * elt, int *buflen)
 {
-       int len;
+  int len;
 
-       /* validate current elt */
-       if (!bcm_valid_tlv(elt, *buflen))
-               return NULL;
+  /* 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);
+  /* 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;
+  /* validate next elt */
+  if (!bcm_valid_tlv (elt, *buflen))
+    return NULL;
 
-       return elt;
+  return elt;
 }
 
 /*
@@ -760,114 +1619,417 @@ bcm_next_tlv(bcm_tlv_t *elt, int *buflen)
  * 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 *BCMROMFN (bcm_parse_tlvs) (void *buf, int buflen, uint key)
 {
-       bcm_tlv_t *elt;
-       int totlen;
+  bcm_tlv_t *elt;
+  int totlen;
 
-       elt = (bcm_tlv_t*)buf;
-       totlen = buflen;
+  elt = (bcm_tlv_t *) buf;
+  totlen = buflen;
 
-       /* find tagged parameter */
-       while (totlen >= 2) {
-               int len = elt->len;
+  /* find tagged parameter */
+  while (totlen >= 2)
+    {
+      int len = elt->len;
 
-               /* validate remaining totlen */
-               if ((elt->id == key) && (totlen >= (len + 2)))
-                       return (elt);
+      /* validate remaining totlen */
+      if ((elt->id == key) && (totlen >= (len + 2)))
+       return (elt);
 
-               elt = (bcm_tlv_t*)((uint8*)elt + (len + 2));
-               totlen -= (len + 2);
-       }
+      elt = (bcm_tlv_t *) ((uint8 *) elt + (len + 2));
+      totlen -= (len + 2);
+    }
 
-       return NULL;
+  return NULL;
 }
 
+#if 0
 /*
  * 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 *BCMROMFN (bcm_parse_ordered_tlvs) (void *buf, int buflen, uint key)
 {
-       bcm_tlv_t *elt;
-       int totlen;
+  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;
+}
 
-       elt = (bcm_tlv_t*)buf;
-       totlen = buflen;
+#ifdef BCMDBG
+int
+bcm_format_flags (const bcm_bit_desc_t * bd, uint32 flags, char *buf, int len)
+{
+  int i;
+  char *p = buf;
+  char hexstr[16];
+  int slen = 0;
+  uint32 bit;
+  const char *name;
+
+  if (len < 2 || !buf)
+    return 0;
+
+  buf[0] = '\0';
+  len -= 1;
+
+  for (i = 0; flags != 0; i++)
+    {
+      bit = bd[i].bit;
+      name = bd[i].name;
+      if (bit == 0 && flags)
+       {
+         /* print any unnamed bits */
+         sprintf (hexstr, "0x%X", flags);
+         name = hexstr;
+         flags = 0;            /* exit loop */
+       }
+      else if ((flags & bit) == 0)
+       continue;
+      slen += strlen (name);
+      if (len < slen)
+       break;
+      if (p != buf)
+       p += sprintf (p, " ");  /* btwn flag space */
+      strcat (p, name);
+      p += strlen (name);
+      flags &= ~bit;
+      len -= slen;
+      slen = 1;                        /* account for btwn flag space */
+    }
+
+  /* indicate the str was too short */
+  if (flags != 0)
+    {
+      if (len == 0)
+       p--;                    /* overwrite last char */
+      p += sprintf (p, ">");
+    }
+
+  return (int) (p - buf);
+}
 
-       /* find tagged parameter */
-       while (totlen >= 2) {
-               uint id = elt->id;
-               int len = elt->len;
+void
+deadbeef (void *p, uint len)
+{
+  static uint8 meat[] = { 0xde, 0xad, 0xbe, 0xef };
 
-               /* Punt if we start seeing IDs > than target key */
-               if (id > key)
-                       return (NULL);
+  while (len-- > 0)
+    {
+      *(uint8 *) p = meat[((uintptr) p) & 3];
+      p = (uint8 *) p + 1;
+    }
+}
 
-               /* validate remaining totlen */
-               if ((id == key) && (totlen >= (len + 2)))
-                       return (elt);
+/* pretty hex print a contiguous buffer */
+void
+prhex (const char *msg, uchar * buf, uint nbytes)
+{
+  char line[128], *p;
+  uint i;
 
-               elt = (bcm_tlv_t*)((uint8*)elt + (len + 2));
-               totlen -= (len + 2);
+  if (msg && (msg[0] != '\0'))
+    printf ("%s:\n", msg);
+
+  p = line;
+  for (i = 0; i < nbytes; i++)
+    {
+      if (i % 16 == 0)
+       {
+         p += sprintf (p, "  %04d: ", i);      /* line prefix */
        }
-       return NULL;
+      p += sprintf (p, "%02x ", buf[i]);
+      if (i % 16 == 15)
+       {
+         printf ("%s\n", line);        /* flush line */
+         p = line;
+       }
+    }
+
+  /* flush last partial line */
+  if (p != line)
+    printf ("%s\n", line);
+}
+
+/* print bytes formatted as hex to a string. return the resulting string length */
+int
+bcm_format_hex (char *str, const void *bytes, int len)
+{
+  int i;
+  char *p = str;
+  const uint8 *src = (const uint8 *) bytes;
+
+  for (i = 0; i < len; i++)
+    {
+      p += sprintf (p, "%02X", *src);
+      src++;
+    }
+  return (int) (p - str);
 }
 
+#endif /* BCMDBG */
 
-/* Initialization of bcmstrbuf structure */
+/* Produce a human-readable string for boardrev */
+char *
+bcm_brev_str (uint16 brev, char *buf)
+{
+  if (brev < 0x100)
+    snprintf (buf, 8, "%d.%d", (brev & 0xf0) >> 4, brev & 0xf);
+  else
+    snprintf (buf, 8, "%c%03x", ((brev & 0xf000) == 0x1000) ? 'P' : 'A',
+             brev & 0xfff);
+
+  return (buf);
+}
+
+#define BUFSIZE_TODUMP_ATONCE 512      /* Buffer size */
+
+/* dump large strings to console */
 void
-bcm_binit(struct bcmstrbuf *b, char *buf, uint size)
+printfbig (char *buf)
 {
-       b->origsize = b->size = size;
-       b->origbuf = b->buf = buf;
+  uint len, max_len;
+  char c;
+
+  len = strlen (buf);
+
+  max_len = BUFSIZE_TODUMP_ATONCE;
+
+  while (len > max_len)
+    {
+      c = buf[max_len];
+      buf[max_len] = '\0';
+      printf ("%s", buf);
+      buf[max_len] = c;
+
+      buf += max_len;
+      len -= max_len;
+    }
+  /* print the remaining string */
+  printf ("%s\n", buf);
+  return;
 }
 
-/* Buffer sprintf wrapper to guard against buffer overflow */
-int
-bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...)
+/* routine to dump fields in a fileddesc structure */
+uint
+bcmdumpfields (readreg_rtn read_rtn, void *arg0, void *arg1,
+              struct fielddesc * fielddesc_array, char *buf, uint32 bufsize)
+{
+  uint filled_len;
+  int len;
+  struct fielddesc *cur_ptr;
+
+  filled_len = 0;
+  cur_ptr = fielddesc_array;
+
+  while (bufsize > 1)
+    {
+      if (cur_ptr->nameandfmt == NULL)
+       break;
+      len = snprintf (buf, bufsize, cur_ptr->nameandfmt,
+                     read_rtn (arg0, arg1, cur_ptr->offset));
+      /* check for snprintf overflow or error */
+      if (len < 0 || (uint32) len >= bufsize)
+       len = bufsize - 1;
+      buf += len;
+      bufsize -= len;
+      filled_len += len;
+      cur_ptr++;
+    }
+  return filled_len;
+}
+#endif
+
+uint
+bcm_mkiovar (char *name, char *data, uint datalen, char *buf, uint buflen)
 {
-       va_list ap;
-       int r;
+  uint len;
 
-       va_start(ap, fmt);
-       r = vsnprintf(b->buf, b->size, fmt, ap);
+  len = strlen (name) + 1;
 
-       /* 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
+  if ((len + datalen) > buflen)
+    return 0;
+
+  strncpy (buf, name, buflen);
+
+  /* append data onto the end of the name string */
+  memcpy (&buf[len], data, datalen);
+  len += datalen;
+
+  return len;
+}
+
+/* Quarter dBm units to mW
+ * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153
+ * Table is offset so the last entry is largest mW value that fits in
+ * a uint16.
+ */
+
+#define QDBM_OFFSET 153                /* Offset for first entry */
+#define QDBM_TABLE_LEN 40      /* Table size */
+
+/* Smallest mW value that will round up to the first table entry, QDBM_OFFSET.
+ * Value is ( mW(QDBM_OFFSET - 1) + mW(QDBM_OFFSET) ) / 2
+ */
+#define QDBM_TABLE_LOW_BOUND 6493      /* Low bound */
+
+/* Largest mW value that will round down to the last table entry,
+ * QDBM_OFFSET + QDBM_TABLE_LEN-1.
+ * Value is ( mW(QDBM_OFFSET + QDBM_TABLE_LEN - 1) + mW(QDBM_OFFSET + QDBM_TABLE_LEN) ) / 2.
+ */
+#define QDBM_TABLE_HIGH_BOUND 64938    /* High bound */
+
+static const uint16 nqdBm_to_mW_map[QDBM_TABLE_LEN] = {
+/* qdBm:       +0      +1      +2      +3      +4      +5      +6      +7 */
+/* 153: */ 6683, 7079, 7499, 7943, 8414, 8913, 9441, 10000,
+/* 161: */ 10593, 11220, 11885, 12589, 13335, 14125, 14962, 15849,
+/* 169: */ 16788, 17783, 18836, 19953, 21135, 22387, 23714, 25119,
+/* 177: */ 26607, 28184, 29854, 31623, 33497, 35481, 37584, 39811,
+/* 185: */ 42170, 44668, 47315, 50119, 53088, 56234, 59566, 63096
+};
+
+uint16 BCMROMFN (bcm_qdbm_to_mw) (uint8 qdbm)
+{
+  uint factor = 1;
+  int idx = qdbm - QDBM_OFFSET;
+
+  if (idx > QDBM_TABLE_LEN)
+    {
+      /* clamp to max uint16 mW value */
+      return 0xFFFF;
+    }
+
+  /* scale the qdBm index up to the range of the table 0-40
+   * where an offset of 40 qdBm equals a factor of 10 mW.
+   */
+  while (idx < 0)
+    {
+      idx += 40;
+      factor *= 10;
+    }
+
+  /* return the mW value scaled down to the correct factor of 10,
+   * adding in factor/2 to get proper rounding.
+   */
+  return ((nqdBm_to_mW_map[idx] + factor / 2) / factor);
+}
+
+uint8 BCMROMFN (bcm_mw_to_qdbm) (uint16 mw)
+{
+  uint8 qdbm;
+  int offset;
+  uint mw_uint = mw;
+  uint boundary;
+
+  /* handle boundary case */
+  if (mw_uint <= 1)
+    return 0;
+
+  offset = QDBM_OFFSET;
+
+  /* move mw into the range of the table */
+  while (mw_uint < QDBM_TABLE_LOW_BOUND)
+    {
+      mw_uint *= 10;
+      offset -= 40;
+    }
+
+  for (qdbm = 0; qdbm < QDBM_TABLE_LEN - 1; qdbm++)
+    {
+      boundary = nqdBm_to_mW_map[qdbm] + (nqdBm_to_mW_map[qdbm + 1] -
+                                         nqdBm_to_mW_map[qdbm]) / 2;
+      if (mw_uint < boundary)
+       break;
+    }
+
+  qdbm += (uint8) offset;
+
+  return (qdbm);
+}
+
+
+uint BCMROMFN (bcm_bitcount) (uint8 * bitmap, uint length)
+{
+  uint bitcount = 0, i;
+  uint8 tmp;
+  for (i = 0; i < length; i++)
+    {
+      tmp = bitmap[i];
+      while (tmp)
        {
-               b->size -= r;
-               b->buf += r;
+         bitcount++;
+         tmp &= (tmp - 1);
        }
+    }
+  return bitcount;
+}
 
-       va_end(ap);
 
-       return r;
+/* Initialization of bcmstrbuf structure */
+void
+bcm_binit (struct bcmstrbuf *b, char *buf, uint size)
+{
+  b->origsize = b->size = size;
+  b->origbuf = b->buf = buf;
 }
 
-uint
-bcm_bitcount(uint8 *bitmap, uint length)
-{   
-       uint bitcount = 0, i;
-       uint8 tmp;
-       for (i = 0; i < length; i++) {
-               tmp = bitmap[i];
-               while (tmp) {
-                       bitcount++;
-                       tmp &= (tmp - 1);
-               }
-       }
-       return bitcount;
+/* 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;
+}
+
+char *
+bcm_ether_ntoa (struct ether_addr *ea, char *buf)
+{
+       snprintf (buf, 18, "%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);
 }
 
diff --git a/package/broadcom-wl/src/driver/bcmutils.h b/package/broadcom-wl/src/driver/bcmutils.h
new file mode 100644 (file)
index 0000000..9dcf08b
--- /dev/null
@@ -0,0 +1,582 @@
+/*
+ * Misc useful os-independent macros and functions.
+ *
+ * Copyright 2007, 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        _bcmutils_h_
+#define        _bcmutils_h_
+#include "linux_osl.h"
+
+/* ctype replacement */
+#define _BCM_U 0x01    /* upper */
+#define _BCM_L 0x02    /* lower */
+#define _BCM_D 0x04    /* digit */
+#define _BCM_C 0x08    /* cntrl */
+#define _BCM_P 0x10    /* punct */
+#define _BCM_S 0x20    /* white space (space/lf/tab) */
+#define _BCM_X 0x40    /* hex digit */
+#define _BCM_SP        0x80    /* hard space (0x20) */
+
+extern const unsigned char bcm_ctype[];
+#define bcm_ismask(x)  (bcm_ctype[(int)(unsigned char)(x)])
+
+#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
+#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
+#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)
+#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)
+#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
+#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)
+#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
+#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)
+#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)
+#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)
+#define bcm_isxdigit(c)        ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
+#define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
+#define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))
+
+/* Buffer structure for collecting string-formatted data 
+* using bcm_bprintf() API.
+* Use bcm_binit() to initialize before use
+*/
+
+struct bcmstrbuf {
+       char *buf;      /* pointer to current position in origbuf */
+       unsigned int size;      /* current (residual) size in bytes */
+       char *origbuf;  /* unmodified pointer to orignal buffer */
+       unsigned int origsize;  /* unmodified orignal buffer size in bytes */
+};
+
+/* ** driver-only section ** */
+#include <osl.h>
+
+#define GPIO_PIN_NOTDEFINED    0x20    /* Pin not defined */
+
+
+/* osl multi-precedence packet queue */
+#ifndef PKTQ_LEN_DEFAULT
+#define PKTQ_LEN_DEFAULT        128    /* Max 128 packets */
+#endif
+#ifndef PKTQ_MAX_PREC
+#define PKTQ_MAX_PREC           16     /* Maximum precedence levels */
+#endif
+
+typedef 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 */
+} pktq_prec_t;
+
+
+/* multi-priority pkt queue */
+struct pktq {
+       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 */
+       /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
+       struct pktq_prec q[PKTQ_MAX_PREC];
+};
+
+/* simple, non-priority pkt queue */
+struct spktq {
+       uint16 num_prec;        /* number of precedences in use (always 1) */
+       uint16 hi_prec;         /* rapid dequeue hint (>= highest non-empty prec) */
+       uint16 max;             /* total max packets */
+       uint16 len;             /* total number of packets */
+       /* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
+       struct pktq_prec q[1];
+};
+
+#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(((struct pktq *)pq), 0, (p))
+#define pktenq_head(pq, p)     pktq_penq_head(((struct pktq *)pq), 0, (p))
+#define pktdeq(pq)             pktq_pdeq(((struct pktq *)pq), 0)
+#define pktdeq_tail(pq)                pktq_pdeq_tail(((struct pktq *)pq), 0)
+#define pktqinit(pq, len) pktq_init(((struct pktq *)pq), 1, len)
+
+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 */
+extern int pktq_setmax(struct pktq *pq, int max_len);
+
+/* 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);
+
+/* Get priority from a packet and pass it back in scb (or equiv) */
+extern uint pktsetprio(void *pkt, bool update_vtag);
+#define        PKTPRIO_VDSCP   0x100           /* DSCP prio found after VLAN tag */
+#define        PKTPRIO_VLAN    0x200           /* VLAN prio found */
+#define        PKTPRIO_UPD     0x400           /* DSCP used to update VLAN prio */
+#define        PKTPRIO_DSCP    0x800           /* DSCP prio found */
+
+/* string */
+extern int BCMROMFN(bcm_atoi)(char *s);
+extern ulong BCMROMFN(bcm_strtoul)(char *cp, char **endp, uint base);
+extern char *BCMROMFN(bcmstrstr)(char *haystack, char *needle);
+extern char *BCMROMFN(bcmstrcat)(char *dest, const char *src);
+extern char *BCMROMFN(bcmstrncat)(char *dest, const char *src, uint size);
+extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
+/* ethernet address */
+extern char *bcm_ether_ntoa(struct ether_addr *ea, char *buf);
+extern int BCMROMFN(bcm_ether_atoe)(char *p, struct ether_addr *ea);
+
+/* ip address */
+struct ipv4_addr;
+extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
+
+/* delay */
+extern void bcm_mdelay(uint ms);
+/* variable access */
+extern char *getvar(char *vars, const char *name);
+extern int getintvar(char *vars, const char *name);
+extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
+#ifdef BCMDBG
+extern void prpkt(const char *msg, osl_t *osh, void *p0);
+#endif /* BCMDBG */
+#ifdef BCMPERFSTATS
+extern void bcm_perf_enable(void);
+extern void bcmstats(char *fmt);
+extern void bcmlog(char *fmt, uint a1, uint a2);
+extern void bcmdumplog(char *buf, int size);
+extern int bcmdumplogent(char *buf, uint idx);
+#else
+#define bcm_perf_enable()
+#define bcmstats(fmt)
+#define        bcmlog(fmt, a1, a2)
+#define        bcmdumplog(buf, size)   *buf = '\0'
+#define        bcmdumplogent(buf, idx) -1
+#endif /* BCMPERFSTATS */
+extern char *bcm_nvram_vars(uint *length);
+extern int bcm_nvram_cache(void *sbh);
+
+/* Support for sharing code across in-driver iovar implementations.
+ * The intent is that a driver use this structure to map iovar names
+ * to its (private) iovar identifiers, and the lookup function to
+ * find the entry.  Macros are provided to map ids and get/set actions
+ * into a single number space for a switch statement.
+ */
+
+/* iovar structure */
+typedef struct bcm_iovar {
+       const char *name;       /* name for lookup and display */
+       uint16 varid;           /* id for switch */
+       uint16 flags;           /* driver-specific flag bits */
+       uint16 type;            /* base type of argument */
+       uint16 minlen;          /* min length for buffer vars */
+} bcm_iovar_t;
+
+/* varid definitions are per-driver, may use these get/set bits */
+
+/* IOVar action bits for id mapping */
+#define IOV_GET 0 /* Get an iovar */
+#define IOV_SET 1 /* Set an iovar */
+
+/* Varid to actionid mapping */
+#define IOV_GVAL(id)           ((id)*2)
+#define IOV_SVAL(id)           (((id)*2)+IOV_SET)
+#define IOV_ISSET(actionid)    ((actionid & IOV_SET) == IOV_SET)
+
+/* flags are per-driver based on driver attributes */
+
+extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
+extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
+
+/* Base type definitions */
+#define IOVT_VOID      0       /* no value (implictly set only) */
+#define IOVT_BOOL      1       /* any value ok (zero/nonzero) */
+#define IOVT_INT8      2       /* integer values are range-checked */
+#define IOVT_UINT8     3       /* unsigned int 8 bits */
+#define IOVT_INT16     4       /* int 16 bits */
+#define IOVT_UINT16    5       /* unsigned int 16 bits */
+#define IOVT_INT32     6       /* int 32 bits */
+#define IOVT_UINT32    7       /* unsigned int 32 bits */
+#define IOVT_BUFFER    8       /* buffer is size-checked as per minlen */
+#define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)
+
+/* Initializer for IOV type strings */
+#define BCM_IOV_TYPE_INIT { \
+       "void", \
+       "bool", \
+       "int8", \
+       "uint8", \
+       "int16", \
+       "uint16", \
+       "int32", \
+       "uint32", \
+       "buffer", \
+       "" }
+
+#define BCM_IOVT_IS_INT(type) (\
+       (type == IOVT_BOOL) || \
+       (type == IOVT_INT8) || \
+       (type == IOVT_UINT8) || \
+       (type == IOVT_INT16) || \
+       (type == IOVT_UINT16) || \
+       (type == IOVT_INT32) || \
+       (type == IOVT_UINT32))
+
+/* ** driver/apps-shared section ** */
+
+#define BCME_STRLEN            64      /* Max string length for BCM errors */
+#define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
+
+
+/*
+ * error codes could be added but the defined ones shouldn't be changed/deleted
+ * these error codes are exposed to the user code
+ * when ever a new error code is added to this list
+ * please update errorstring table with the related error string and
+ * update osl files with os specific errorcode map
+*/
+
+#define BCME_OK                                0       /* Success */
+#define BCME_ERROR                     -1      /* Error generic */
+#define BCME_BADARG                    -2      /* Bad Argument */
+#define BCME_BADOPTION                 -3      /* Bad option */
+#define BCME_NOTUP                     -4      /* Not up */
+#define BCME_NOTDOWN                   -5      /* Not down */
+#define BCME_NOTAP                     -6      /* Not AP */
+#define BCME_NOTSTA                    -7      /* Not STA  */
+#define BCME_BADKEYIDX                 -8      /* BAD Key Index */
+#define BCME_RADIOOFF                  -9      /* Radio Off */
+#define BCME_NOTBANDLOCKED             -10     /* Not  band locked */
+#define BCME_NOCLK                     -11     /* No Clock */
+#define BCME_BADRATESET                        -12     /* BAD Rate valueset */
+#define BCME_BADBAND                   -13     /* BAD Band */
+#define BCME_BUFTOOSHORT               -14     /* Buffer too short */
+#define BCME_BUFTOOLONG                        -15     /* Buffer too long */
+#define BCME_BUSY                      -16     /* Busy */
+#define BCME_NOTASSOCIATED             -17     /* Not Associated */
+#define BCME_BADSSIDLEN                        -18     /* Bad SSID len */
+#define BCME_OUTOFRANGECHAN            -19     /* Out of Range Channel */
+#define BCME_BADCHAN                   -20     /* Bad Channel */
+#define BCME_BADADDR                   -21     /* Bad Address */
+#define BCME_NORESOURCE                        -22     /* Not Enough Resources */
+#define BCME_UNSUPPORTED               -23     /* Unsupported */
+#define BCME_BADLEN                    -24     /* Bad length */
+#define BCME_NOTREADY                  -25     /* Not Ready */
+#define BCME_EPERM                     -26     /* Not Permitted */
+#define BCME_NOMEM                     -27     /* No Memory */
+#define BCME_ASSOCIATED                        -28     /* Associated */
+#define BCME_RANGE                     -29     /* Not In Range */
+#define BCME_NOTFOUND                  -30     /* Not Found */
+#define BCME_WME_NOT_ENABLED           -31     /* WME Not Enabled */
+#define BCME_TSPEC_NOTFOUND            -32     /* TSPEC Not Found */
+#define BCME_ACM_NOTSUPPORTED          -33     /* ACM Not Supported */
+#define BCME_NOT_WME_ASSOCIATION       -34     /* Not WME Association */
+#define BCME_SDIO_ERROR                        -35     /* SDIO Bus Error */
+#define BCME_DONGLE_DOWN               -36     /* Dongle Not Accessible */
+#define BCME_VERSION                   -37 /* Incorrect version */
+#define BCME_LAST                      BCME_VERSION
+
+/* These are collection of BCME Error strings */
+#define BCMERRSTRINGTABLE {            \
+       "OK",                           \
+       "Undefined error",              \
+       "Bad Argument",                 \
+       "Bad Option",                   \
+       "Not up",                       \
+       "Not down",                     \
+       "Not AP",                       \
+       "Not STA",                      \
+       "Bad Key Index",                \
+       "Radio Off",                    \
+       "Not band locked",              \
+       "No clock",                     \
+       "Bad Rate valueset",            \
+       "Bad Band",                     \
+       "Buffer too short",             \
+       "Buffer too long",              \
+       "Busy",                         \
+       "Not Associated",               \
+       "Bad SSID len",                 \
+       "Out of Range Channel",         \
+       "Bad Channel",                  \
+       "Bad Address",                  \
+       "Not Enough Resources",         \
+       "Unsupported",                  \
+       "Bad length",                   \
+       "Not Ready",                    \
+       "Not Permitted",                \
+       "No Memory",                    \
+       "Associated",                   \
+       "Not In Range",                 \
+       "Not Found",                    \
+       "WME Not Enabled",              \
+       "TSPEC Not Found",              \
+       "ACM Not Supported",            \
+       "Not WME Association",          \
+       "SDIO Bus Error",               \
+       "Dongle Not Accessible",        \
+       "Incorrect version"     \
+}
+
+#ifndef ABS
+#define        ABS(a)                  (((a) < 0)?-(a):(a))
+#endif /* ABS */
+
+#ifndef MIN
+#define        MIN(a, b)               (((a) < (b))?(a):(b))
+#endif /* MIN */
+
+#ifndef MAX
+#define        MAX(a, b)               (((a) > (b))?(a):(b))
+#endif /* MAX */
+
+#define CEIL(x, y)             (((x) + ((y)-1)) / (y))
+#define        ROUNDUP(x, y)           ((((x)+((y)-1))/(y))*(y))
+#define        ISALIGNED(a, x)         (((a) & ((x)-1)) == 0)
+#define        ISPOWEROF2(x)           ((((x)-1)&(x)) == 0)
+#define VALID_MASK(mask)       !((mask) & ((mask) + 1))
+#ifndef OFFSETOF
+#define        OFFSETOF(type, member)  ((uint)(uintptr)&((type *)0)->member)
+#endif /* OFFSETOF */
+#ifndef ARRAYSIZE
+#define ARRAYSIZE(a)           (sizeof(a)/sizeof(a[0]))
+#endif
+
+/* bit map related macros */
+#ifndef setbit
+#ifndef NBBY               /* the BSD family defines NBBY */
+#define        NBBY    8       /* 8 bits per byte */
+#endif /* #ifndef NBBY */
+#define        setbit(a, i)    (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
+#define        clrbit(a, i)    (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+#define        isset(a, i)     (((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
+#define        isclr(a, i)     ((((const uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
+#endif /* setbit */
+
+#define        NBITS(type)     (sizeof(type) * 8)
+#define NBITVAL(nbits) (1 << (nbits))
+#define MAXBITVAL(nbits)       ((1 << (nbits)) - 1)
+#define        NBITMASK(nbits) MAXBITVAL(nbits)
+#define MAXNBVAL(nbyte)        MAXBITVAL((nbyte) * 8)
+
+/* basic mux operation - can be optimized on several architectures */
+#define MUX(pred, true, false) ((pred) ? (true) : (false))
+
+/* modulo inc/dec - assumes x E [0, bound - 1] */
+#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
+#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
+
+/* modulo inc/dec, bound = 2^k */
+#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
+#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
+
+/* modulo add/sub - assumes x, y E [0, bound - 1] */
+#define MODADD(x, y, bound) \
+    MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
+#define MODSUB(x, y, bound) \
+    MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
+
+/* module add/sub, bound = 2^k */
+#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
+#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
+
+/* crc defines */
+#define CRC8_INIT_VALUE  0xff          /* Initial CRC8 checksum value */
+#define CRC8_GOOD_VALUE  0x9f          /* Good final CRC8 checksum value */
+#define CRC16_INIT_VALUE 0xffff                /* Initial CRC16 checksum value */
+#define CRC16_GOOD_VALUE 0xf0b8                /* Good final CRC16 checksum value */
+#define CRC32_INIT_VALUE 0xffffffff    /* Initial CRC32 checksum value */
+#define CRC32_GOOD_VALUE 0xdebb20e3    /* Good final CRC32 checksum value */
+
+/* bcm_format_flags() bit description structure */
+typedef struct bcm_bit_desc {
+       uint32  bit;
+       const char* name;
+} bcm_bit_desc_t;
+
+/* tag_ID/length/value_buffer tuple */
+typedef struct bcm_tlv {
+       uint8   id;
+       uint8   len;
+       uint8   data[1];
+} bcm_tlv_t;
+
+/* Check that bcm_tlv_t fits into the given buflen */
+#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
+
+/* buffer length for ethernet address from bcm_ether_ntoa() */
+#define ETHER_ADDR_STR_LEN     18      /* 18-bytes of Ethernet address buffer length */
+
+/* unaligned load and store macros */
+#ifdef IL_BIGENDIAN
+static INLINE uint32
+load32_ua(uint8 *a)
+{
+       return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]);
+}
+
+static INLINE void
+store32_ua(uint8 *a, uint32 v)
+{
+       a[0] = (v >> 24) & 0xff;
+       a[1] = (v >> 16) & 0xff;
+       a[2] = (v >> 8) & 0xff;
+       a[3] = v & 0xff;
+}
+
+static INLINE uint16
+load16_ua(uint8 *a)
+{
+       return ((a[0] << 8) | a[1]);
+}
+
+static INLINE void
+store16_ua(uint8 *a, uint16 v)
+{
+       a[0] = (v >> 8) & 0xff;
+       a[1] = v & 0xff;
+}
+
+#else /* IL_BIGENDIAN */
+
+static INLINE uint32
+load32_ua(uint8 *a)
+{
+       return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]);
+}
+
+static INLINE void
+store32_ua(uint8 *a, uint32 v)
+{
+       a[3] = (v >> 24) & 0xff;
+       a[2] = (v >> 16) & 0xff;
+       a[1] = (v >> 8) & 0xff;
+       a[0] = v & 0xff;
+}
+
+static INLINE uint16
+load16_ua(uint8 *a)
+{
+       return ((a[1] << 8) | a[0]);
+}
+
+static INLINE void
+store16_ua(uint8 *a, uint16 v)
+{
+       a[1] = (v >> 8) & 0xff;
+       a[0] = v & 0xff;
+}
+
+#endif /* IL_BIGENDIAN */
+
+/* externs */
+/* crc */
+extern uint8 BCMROMFN(hndcrc8)(uint8 *p, uint nbytes, uint8 crc);
+extern uint16 BCMROMFN(hndcrc16)(uint8 *p, uint nbytes, uint16 crc);
+extern uint32 BCMROMFN(hndcrc32)(uint8 *p, uint nbytes, uint32 crc);
+/* format/print */
+#ifdef BCMDBG
+extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);
+extern int bcm_format_hex(char *str, const void *bytes, int len);
+extern void deadbeef(void *p, uint len);
+extern void prhex(const char *msg, uchar *buf, uint len);
+#endif /* BCMDBG */
+extern char *bcm_brev_str(uint16 brev, char *buf);
+extern void printfbig(char *buf);
+
+/* IE parsing */
+extern bcm_tlv_t *BCMROMFN(bcm_next_tlv)(bcm_tlv_t *elt, int *buflen);
+extern bcm_tlv_t *BCMROMFN(bcm_parse_tlvs)(void *buf, int buflen, uint key);
+extern bcm_tlv_t *BCMROMFN(bcm_parse_ordered_tlvs)(void *buf, int buflen, uint key);
+
+/* bcmerror */
+extern const char *bcmerrorstr(int bcmerror);
+
+/* multi-bool data type: set of bools, mbool is true if any is set */
+typedef uint32 mbool;
+#define mboolset(mb, bit)              ((mb) |= (bit))         /* set one bool */
+#define mboolclr(mb, bit)              ((mb) &= ~(bit))        /* clear one bool */
+#define mboolisset(mb, bit)            (((mb) & (bit)) != 0)   /* TRUE if one bool is set */
+#define        mboolmaskset(mb, mask, val)     ((mb) = (((mb) & ~(mask)) | (val)))
+
+/* power conversion */
+extern uint16 BCMROMFN(bcm_qdbm_to_mw)(uint8 qdbm);
+extern uint8 BCMROMFN(bcm_mw_to_qdbm)(uint16 mw);
+
+/* generic datastruct to help dump routines */
+struct fielddesc {
+       const char *nameandfmt;
+       uint32  offset;
+       uint32  len;
+};
+
+extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);
+extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
+
+typedef  uint32 (*readreg_rtn)(void *arg0, void *arg1, uint32 offset);
+extern uint bcmdumpfields(readreg_rtn func_ptr, void *arg0, void *arg1, struct fielddesc *str,
+                          char *buf, uint32 bufsize);
+
+extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
+extern uint BCMROMFN(bcm_bitcount)(uint8 *bitmap, uint bytelength);
+
+#ifdef BCMDBG_PKT      /* pkt logging for debugging */
+#define PKTLIST_SIZE 1000
+typedef struct {
+       void *list[PKTLIST_SIZE]; /* List of pointers to packets */
+       uint count; /* Total count of the packets */
+} pktlist_info_t;
+
+extern void pktlist_add(pktlist_info_t *pktlist, void *p);
+extern void pktlist_remove(pktlist_info_t *pktlist, void *p);
+extern char* pktlist_dump(pktlist_info_t *pktlist, char *buf);
+#endif  /* BCMDBG_PKT */
+
+#endif /* _bcmutils_h_ */
index 1b79dff..c6f6a13 100644 (file)
@@ -2,7 +2,7 @@
  * Generic Broadcom Home Networking Division (HND) DMA module.
  * This supports the following chips: BCM42xx, 44xx, 47xx .
  *
- * Copyright 2006, Broadcom Corporation
+ * Copyright 2007, Broadcom Corporation
  * All Rights Reserved.
  * 
  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
@@ -10,7 +10,7 @@
  * 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 $
+ * $Id$
  */
 
 #include <typedefs.h>
@@ -19,7 +19,7 @@
 #include "linux_osl.h"
 #include <bcmendian.h>
 #include <sbconfig.h>
-#include <bcmutils.h>
+#include "bcmutils.h"
 #include <bcmdevs.h>
 #include <sbutils.h>
 
 #include "hnddma.h"
 
 /* debug/trace */
+#ifdef BCMDBG
+#define        DMA_ERROR(args) if (!(*di->msg_level & 1)); else printf args
+#define        DMA_TRACE(args) if (!(*di->msg_level & 2)); else printf args
+#else
 #define        DMA_ERROR(args)
 #define        DMA_TRACE(args)
+#endif
 
 /* default dma message level (if input msg_level pointer is null in dma_attach()) */
-static uint dma_msg_level =
-       0;
+static uint dma_msg_level = 0;
 
-#define        MAXNAMEL        8               /* 8 char names */
+#define        MAXNAMEL        8       /* 8 char names */
 
 #define        DI_INFO(dmah)   (dma_info_t *)dmah
+typedef struct osl_dmainfo osldma_t;
 
 /* 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 */
+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;
 
 #ifdef BCMDMA64
@@ -117,1053 +123,1394 @@ typedef struct dma_info {
 #define        I2B(index, type)        ((index) * sizeof(type))
 
 #define        PCI32ADDR_HIGH          0xc0000000      /* address[31:30] */
-#define        PCI32ADDR_HIGH_SHIFT    30              /* address[31:30] */
+#define        PCI32ADDR_HIGH_SHIFT    30      /* address[31:30] */
 
 
 /* common prototypes */
-static bool _dma_isaddrext(dma_info_t *di);
-static bool _dma_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, const char *name);
-static void _dma_counterreset(dma_info_t *di);
-static void _dma_fifoloopbackenable(dma_info_t *di);
+static bool _dma_isaddrext (dma_info_t * di);
+static bool _dma_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, const 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 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);
 
 /* ** 64 bit DMA prototypes and stubs */
 #ifdef BCMDMA64
-static bool dma64_alloc(dma_info_t *di, uint direction);
-static bool dma64_txreset(dma_info_t *di);
-static bool dma64_rxreset(dma_info_t *di);
-static bool dma64_txsuspendedidle(dma_info_t *di);
-static int  dma64_txfast(dma_info_t *di, void *p0, bool commit);
-static void *dma64_getnexttxp(dma_info_t *di, bool forceall);
-static void *dma64_getnextrxp(dma_info_t *di, bool forceall);
-static void dma64_txrotate(dma_info_t *di);
-
-static bool dma64_rxidle(dma_info_t *di);
-static void dma64_txinit(dma_info_t *di);
-static bool dma64_txenabled(dma_info_t *di);
-static void dma64_txsuspend(dma_info_t *di);
-static void dma64_txresume(dma_info_t *di);
-static bool dma64_txsuspended(dma_info_t *di);
-static void dma64_txreclaim(dma_info_t *di, bool forceall);
-static bool dma64_txstopped(dma_info_t *di);
-static bool dma64_rxstopped(dma_info_t *di);
-static bool dma64_rxenabled(dma_info_t *di);
-static bool _dma64_addrext(osl_t *osh, dma64regs_t *dma64regs);
+static bool dma64_alloc (dma_info_t * di, uint direction);
+static bool dma64_txreset (dma_info_t * di);
+static bool dma64_rxreset (dma_info_t * di);
+static bool dma64_txsuspendedidle (dma_info_t * di);
+static int dma64_txfast (dma_info_t * di, void *p0, bool commit);
+static void *dma64_getnexttxp (dma_info_t * di, bool forceall);
+static void *dma64_getnextrxp (dma_info_t * di, bool forceall);
+static void dma64_txrotate (dma_info_t * di);
+
+static bool dma64_rxidle (dma_info_t * di);
+static void dma64_txinit (dma_info_t * di);
+static bool dma64_txenabled (dma_info_t * di);
+static void dma64_txsuspend (dma_info_t * di);
+static void dma64_txresume (dma_info_t * di);
+static bool dma64_txsuspended (dma_info_t * di);
+static void dma64_txreclaim (dma_info_t * di, bool forceall);
+static bool dma64_txstopped (dma_info_t * di);
+static bool dma64_rxstopped (dma_info_t * di);
+static bool dma64_rxenabled (dma_info_t * di);
+static bool _dma64_addrext (osl_t * osh, dma64regs_t * dma64regs);
 
 #else
-static bool dma64_alloc(dma_info_t *di, uint direction) { return FALSE; }
-static bool dma64_txreset(dma_info_t *di) { return FALSE; }
-static bool dma64_rxreset(dma_info_t *di) { return FALSE; }
-static bool dma64_txsuspendedidle(dma_info_t *di) { return FALSE;}
-static int  dma64_txfast(dma_info_t *di, void *p0, bool commit) { return 0; }
-static void *dma64_getnexttxp(dma_info_t *di, bool forceall) { return NULL; }
-static void *dma64_getnextrxp(dma_info_t *di, bool forceall) { return NULL; }
-static void dma64_txrotate(dma_info_t *di) { return; }
-
-static bool dma64_rxidle(dma_info_t *di) { return FALSE; }
-static void dma64_txinit(dma_info_t *di) { return; }
-static bool dma64_txenabled(dma_info_t *di) { return FALSE; }
-static void dma64_txsuspend(dma_info_t *di) { return; }
-static void dma64_txresume(dma_info_t *di) { return; }
-static bool dma64_txsuspended(dma_info_t *di) {return FALSE; }
-static void dma64_txreclaim(dma_info_t *di, bool forceall) { return; }
-static bool dma64_txstopped(dma_info_t *di) { return FALSE; }
-static bool dma64_rxstopped(dma_info_t *di) { return FALSE; }
-static bool dma64_rxenabled(dma_info_t *di) { return FALSE; }
-static bool _dma64_addrext(osl_t *osh, dma64regs_t *dma64regs) { return FALSE; }
-
-#endif /* BCMDMA64 */
+static bool
+dma64_alloc (dma_info_t * di, uint direction)
+{
+  return FALSE;
+}
+static bool
+dma64_txreset (dma_info_t * di)
+{
+  return FALSE;
+}
+static bool
+dma64_rxreset (dma_info_t * di)
+{
+  return FALSE;
+}
+static bool
+dma64_txsuspendedidle (dma_info_t * di)
+{
+  return FALSE;
+}
+static int
+dma64_txfast (dma_info_t * di, void *p0, bool commit)
+{
+  return 0;
+}
+static void *
+dma64_getnexttxp (dma_info_t * di, bool forceall)
+{
+  return NULL;
+}
+static void *
+dma64_getnextrxp (dma_info_t * di, bool forceall)
+{
+  return NULL;
+}
+static void
+dma64_txrotate (dma_info_t * di)
+{
+  return;
+}
 
+static bool
+dma64_rxidle (dma_info_t * di)
+{
+  return FALSE;
+}
+static void
+dma64_txinit (dma_info_t * di)
+{
+  return;
+}
+static bool
+dma64_txenabled (dma_info_t * di)
+{
+  return FALSE;
+}
+static void
+dma64_txsuspend (dma_info_t * di)
+{
+  return;
+}
+static void
+dma64_txresume (dma_info_t * di)
+{
+  return;
+}
+static bool
+dma64_txsuspended (dma_info_t * di)
+{
+  return FALSE;
+}
+static void
+dma64_txreclaim (dma_info_t * di, bool forceall)
+{
+  return;
+}
+static bool
+dma64_txstopped (dma_info_t * di)
+{
+  return FALSE;
+}
+static bool
+dma64_rxstopped (dma_info_t * di)
+{
+  return FALSE;
+}
+static bool
+dma64_rxenabled (dma_info_t * di)
+{
+  return FALSE;
+}
+static bool
+_dma64_addrext (osl_t * osh, dma64regs_t * dma64regs)
+{
+  return FALSE;
+}
+
+#endif /* BCMDMA64 */
+
+#ifdef BCMDBG
+static void dma32_dumpring (dma_info_t * di, struct bcmstrbuf *b,
+                           dma32dd_t * ring, uint start, uint end,
+                           uint max_num);
+static void dma32_dump (dma_info_t * di, struct bcmstrbuf *b, bool dumpring);
+static void dma32_dumptx (dma_info_t * di, struct bcmstrbuf *b,
+                         bool dumpring);
+static void dma32_dumprx (dma_info_t * di, struct bcmstrbuf *b,
+                         bool dumpring);
+
+static void dma64_dumpring (dma_info_t * di, struct bcmstrbuf *b,
+                           dma64dd_t * ring, uint start, uint end,
+                           uint max_num);
+static void dma64_dump (dma_info_t * di, struct bcmstrbuf *b, bool dumpring);
+static void dma64_dumptx (dma_info_t * di, struct bcmstrbuf *b,
+                         bool dumpring);
+static void dma64_dumprx (dma_info_t * di, struct bcmstrbuf *b,
+                         bool dumpring);
+#endif
 
 
 static di_fcn_t dma64proc = {
-       (di_detach_t)_dma_detach,
-       (di_txinit_t)dma64_txinit,
-       (di_txreset_t)dma64_txreset,
-       (di_txenabled_t)dma64_txenabled,
-       (di_txsuspend_t)dma64_txsuspend,
-       (di_txresume_t)dma64_txresume,
-       (di_txsuspended_t)dma64_txsuspended,
-       (di_txsuspendedidle_t)dma64_txsuspendedidle,
-       (di_txfast_t)dma64_txfast,
-       (di_txstopped_t)dma64_txstopped,
-       (di_txreclaim_t)dma64_txreclaim,
-       (di_getnexttxp_t)dma64_getnexttxp,
-       (di_peeknexttxp_t)_dma_peeknexttxp,
-       (di_txblock_t)_dma_txblock,
-       (di_txunblock_t)_dma_txunblock,
-       (di_txactive_t)_dma_txactive,
-       (di_txrotate_t)dma64_txrotate,
-
-       (di_rxinit_t)_dma_rxinit,
-       (di_rxreset_t)dma64_rxreset,
-       (di_rxidle_t)dma64_rxidle,
-       (di_rxstopped_t)dma64_rxstopped,
-       (di_rxenable_t)_dma_rxenable,
-       (di_rxenabled_t)dma64_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
+  (di_detach_t) _dma_detach,
+  (di_txinit_t) dma64_txinit,
+  (di_txreset_t) dma64_txreset,
+  (di_txenabled_t) dma64_txenabled,
+  (di_txsuspend_t) dma64_txsuspend,
+  (di_txresume_t) dma64_txresume,
+  (di_txsuspended_t) dma64_txsuspended,
+  (di_txsuspendedidle_t) dma64_txsuspendedidle,
+  (di_txfast_t) dma64_txfast,
+  (di_txstopped_t) dma64_txstopped,
+  (di_txreclaim_t) dma64_txreclaim,
+  (di_getnexttxp_t) dma64_getnexttxp,
+  (di_peeknexttxp_t) _dma_peeknexttxp,
+  (di_txblock_t) _dma_txblock,
+  (di_txunblock_t) _dma_txunblock,
+  (di_txactive_t) _dma_txactive,
+  (di_txrotate_t) dma64_txrotate,
+
+  (di_rxinit_t) _dma_rxinit,
+  (di_rxreset_t) dma64_rxreset,
+  (di_rxidle_t) dma64_rxidle,
+  (di_rxstopped_t) dma64_rxstopped,
+  (di_rxenable_t) _dma_rxenable,
+  (di_rxenabled_t) dma64_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,
+
+#ifdef BCMDBG
+  (di_dump_t) dma64_dump,
+  (di_dumptx_t) dma64_dumptx,
+  (di_dumprx_t) dma64_dumprx,
+#else
+  NULL,
+  NULL,
+  NULL,
+#endif
+  34
 };
 
 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
+  (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,
+
+#ifdef BCMDBG
+  (di_dump_t) dma32_dump,
+  (di_dumptx_t) dma32_dumptx,
+  (di_dumprx_t) dma32_dumprx,
+#else
+  NULL,
+  NULL,
+  NULL,
+#endif
+  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_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;
+  dma_info_t *di;
+  uint size;
+
+  /* allocate private info structure */
+  if ((di = MALLOC (osh, sizeof (dma_info_t))) == NULL)
+    {
+#ifdef BCMDBG
+      printf ("dma_attach: out of memory, malloced %d bytes\n",
+             MALLOCED (osh));
+#endif
+      return (NULL);
+    }
+  bzero ((char *) di, sizeof (dma_info_t));
 
-       /* 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;
 
-       di->msg_level = msg_level ? msg_level : &dma_msg_level;
+  /* old chips w/o sb is no longer supported */
+  ASSERT (sbh != NULL);
 
-       /* old chips w/o sb is no longer supported */
-       ASSERT(sbh != NULL);
-       
-       di->dma64 = ((sb_coreflagshi(sbh, 0, 0) & SBTMH_DMA64) == SBTMH_DMA64);
+  di->dma64 = ((sb_coreflagshi (sbh, 0, 0) & SBTMH_DMA64) == SBTMH_DMA64);
 
 #ifndef BCMDMA64
-       if (di->dma64) {
-               DMA_ERROR(("dma_attach: driver doesn't have the capability to support "
-                          "64 bits DMA\n"));
-               goto fail;
-       }
+  if (di->dma64)
+    {
+      DMA_ERROR (("dma_attach: driver doesn't have the capability to support "
+                 "64 bits DMA\n"));
+      goto fail;
+    }
 #endif
 
-       /* check arguments */
-       ASSERT(ISPOWEROF2(ntxd));
-       ASSERT(ISPOWEROF2(nrxd));
-       if (nrxd == 0)
-               ASSERT(dmaregsrx == NULL);
-       if (ntxd == 0)
-               ASSERT(dmaregstx == NULL);
-
-
-       /* init dma reg pointer */
-       if (di->dma64) {
-               ASSERT(ntxd <= D64MAXDD);
-               ASSERT(nrxd <= D64MAXDD);
-               di->d64txregs = (dma64regs_t *)dmaregstx;
-               di->d64rxregs = (dma64regs_t *)dmaregsrx;
-
-               di->dma64align = D64RINGALIGN;
-               if ((ntxd < D64MAXDD / 2) && (nrxd < D64MAXDD / 2)) {
-                       /* for smaller dd table, HW relax the alignment requirement */
-                       di->dma64align = D64RINGALIGN / 2;
-               }
-       } else {
-               ASSERT(ntxd <= D32MAXDD);
-               ASSERT(nrxd <= D32MAXDD);
-               di->d32txregs = (dma32regs_t *)dmaregstx;
-               di->d32rxregs = (dma32regs_t *)dmaregsrx;
+  /* check arguments */
+  ASSERT (ISPOWEROF2 (ntxd));
+  ASSERT (ISPOWEROF2 (nrxd));
+  if (nrxd == 0)
+    ASSERT (dmaregsrx == NULL);
+  if (ntxd == 0)
+    ASSERT (dmaregstx == NULL);
+
+
+  /* init dma reg pointer */
+  if (di->dma64)
+    {
+      ASSERT (ntxd <= D64MAXDD);
+      ASSERT (nrxd <= D64MAXDD);
+      di->d64txregs = (dma64regs_t *) dmaregstx;
+      di->d64rxregs = (dma64regs_t *) dmaregsrx;
+
+      di->dma64align = D64RINGALIGN;
+      if ((ntxd < D64MAXDD / 2) && (nrxd < D64MAXDD / 2))
+       {
+         /* for smaller dd table, HW relax the alignment requirement */
+         di->dma64align = D64RINGALIGN / 2;
        }
-
-       DMA_TRACE(("%s: dma_attach: %s osh %p ntxd %d nrxd %d rxbufsize %d nrxpost %d "
-                  "rxoffset %d dmaregstx %p dmaregsrx %p\n",
-                  name, (di->dma64 ? "DMA64" : "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) {
-               if ((sbh->buscoretype == SB_PCIE) && di->dma64) {
-                       /* pcie with DMA64 */
-                       di->ddoffsetlow = 0;
-                       di->ddoffsethigh = SB_PCIE_DMA_H32;
-               } else {
-                       /* pci(DMA32/DMA64) or pcie with DMA32 */
-                       di->ddoffsetlow = SB_PCI_DMA;
-                       di->ddoffsethigh = 0;
-               }
-               di->dataoffsetlow =  di->ddoffsetlow;
-               di->dataoffsethigh =  di->ddoffsethigh;
+    }
+  else
+    {
+      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, (di->dma64 ? "DMA64" : "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)
+    {
+      if ((sbh->buscoretype == SB_PCIE) && di->dma64)
+       {
+         /* pcie with DMA64 */
+         di->ddoffsetlow = 0;
+         di->ddoffsethigh = SB_PCIE_DMA_H32;
        }
+      else
+       {
+         /* pci(DMA32/DMA64) or pcie with DMA32 */
+         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;
+  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);
+  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;
        }
-
-       /* 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);
+      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;
        }
-
-       /* allocate transmit descriptor ring, only need ntxd descriptors but it must be aligned */
-       if (ntxd) {
-               if (!_dma_alloc(di, DMA_TX))
-                       goto fail;
-       }
-
-       /* allocate receive descriptor ring, only need nrxd descriptors but it must be aligned */
-       if (nrxd) {
-               if (!_dma_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 = DMA64_ENAB(di) ? dma64proc : dma32proc;
-
-       return ((hnddma_t *)di);
+      bzero ((char *) di->rxp, size);
+    }
+
+  /* allocate transmit descriptor ring, only need ntxd descriptors but it must be aligned */
+  if (ntxd)
+    {
+      if (!_dma_alloc (di, DMA_TX))
+       goto fail;
+    }
+
+  /* allocate receive descriptor ring, only need nrxd descriptors but it must be aligned */
+  if (nrxd)
+    {
+      if (!_dma_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 = DMA64_ENAB (di) ? dma64proc : dma32proc;
+
+  return ((hnddma_t *) di);
 
 fail:
-       _dma_detach(di);
-       return (NULL);
+  _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));
-       }
+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 INLINE void
-dma64_dd_upd(dma_info_t *di, dma64dd_t *ddring, ulong pa, uint outidx, uint32 *flags,
-             uint32 bufcount)
-{
-       uint32 ctrl2 = bufcount & D64_CTRL2_BC_MASK;
-
-       /* PCI bus with big(>1G) physical address, use address extension */
-       if ((di->dataoffsetlow != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) {
-               W_SM(&ddring[outidx].addrlow, BUS_SWAP32(pa + di->dataoffsetlow));
-               W_SM(&ddring[outidx].addrhigh, BUS_SWAP32(0 + di->dataoffsethigh));
-               W_SM(&ddring[outidx].ctrl1, BUS_SWAP32(*flags));
-               W_SM(&ddring[outidx].ctrl2, BUS_SWAP32(ctrl2));
-       } else {
-               /* address extension */
-               uint32 ae;
-               ASSERT(di->addrext);
-
-               ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT;
-               pa &= ~PCI32ADDR_HIGH;
-
-               ctrl2 |= (ae << D64_CTRL2_AE_SHIFT) & D64_CTRL2_AE;
-               W_SM(&ddring[outidx].addrlow, BUS_SWAP32(pa + di->dataoffsetlow));
-               W_SM(&ddring[outidx].addrhigh, BUS_SWAP32(0 + di->dataoffsethigh));
-               W_SM(&ddring[outidx].ctrl1, BUS_SWAP32(*flags));
-               W_SM(&ddring[outidx].ctrl2, BUS_SWAP32(ctrl2));
-       }
+dma64_dd_upd (dma_info_t * di, dma64dd_t * ddring, ulong pa, uint outidx,
+             uint32 * flags, uint32 bufcount)
+{
+  uint32 ctrl2 = bufcount & D64_CTRL2_BC_MASK;
+
+  /* PCI bus with big(>1G) physical address, use address extension */
+  if ((di->dataoffsetlow != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH))
+    {
+      W_SM (&ddring[outidx].addrlow, BUS_SWAP32 (pa + di->dataoffsetlow));
+      W_SM (&ddring[outidx].addrhigh, BUS_SWAP32 (0 + di->dataoffsethigh));
+      W_SM (&ddring[outidx].ctrl1, BUS_SWAP32 (*flags));
+      W_SM (&ddring[outidx].ctrl2, BUS_SWAP32 (ctrl2));
+    }
+  else
+    {
+      /* address extension */
+      uint32 ae;
+      ASSERT (di->addrext);
+
+      ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT;
+      pa &= ~PCI32ADDR_HIGH;
+
+      ctrl2 |= (ae << D64_CTRL2_AE_SHIFT) & D64_CTRL2_AE;
+      W_SM (&ddring[outidx].addrlow, BUS_SWAP32 (pa + di->dataoffsetlow));
+      W_SM (&ddring[outidx].addrhigh, BUS_SWAP32 (0 + di->dataoffsethigh));
+      W_SM (&ddring[outidx].ctrl1, BUS_SWAP32 (*flags));
+      W_SM (&ddring[outidx].ctrl2, BUS_SWAP32 (ctrl2));
+    }
 }
 
 static bool
-_dma32_addrext(osl_t *osh, dma32regs_t *dma32regs)
+_dma32_addrext (osl_t * osh, dma32regs_t * dma32regs)
 {
-       uint32 w;
+  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);
+  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);
 }
 
 static bool
-_dma_alloc(dma_info_t *di, uint direction)
+_dma_alloc (dma_info_t * di, uint direction)
 {
-       if (DMA64_ENAB(di)) {
-               return dma64_alloc(di, direction);
-       } else {
-               return dma32_alloc(di, direction);
-       }
+  if (DMA64_ENAB (di))
+    {
+      return dma64_alloc (di, direction);
+    }
+  else
+    {
+      return dma32_alloc (di, direction);
+    }
 }
 
 /* !! 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 (DMA64_ENAB(di)) {
-               if (di->txd64)
-                       DMA_FREE_CONSISTENT(di->osh, ((int8*)(uintptr)di->txd64 - di->txdalign),
-                                           di->txdalloc, (di->txdpa - di->txdalign), &di->tx_dmah);
-               if (di->rxd64)
-                       DMA_FREE_CONSISTENT(di->osh, ((int8*)(uintptr)di->rxd64 - di->rxdalign),
-                                           di->rxdalloc, (di->rxdpa - di->rxdalign), &di->rx_dmah);
-       } else {
-               if (di->txd32)
-                       DMA_FREE_CONSISTENT(di->osh, ((int8*)(uintptr)di->txd32 - di->txdalign),
-                                           di->txdalloc, (di->txdpa - di->txdalign), &di->tx_dmah);
-               if (di->rxd32)
-                       DMA_FREE_CONSISTENT(di->osh, ((int8*)(uintptr)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));
+_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 (DMA64_ENAB (di))
+    {
+      if (di->txd64)
+       DMA_FREE_CONSISTENT (di->osh,
+                            ((int8 *) (uintptr) di->txd64 - di->txdalign),
+                            di->txdalloc, (di->txdpa - di->txdalign),
+                            &di->tx_dmah);
+      if (di->rxd64)
+       DMA_FREE_CONSISTENT (di->osh,
+                            ((int8 *) (uintptr) di->rxd64 - di->rxdalign),
+                            di->rxdalloc, (di->rxdpa - di->rxdalign),
+                            &di->rx_dmah);
+    }
+  else
+    {
+      if (di->txd32)
+       DMA_FREE_CONSISTENT (di->osh,
+                            ((int8 *) (uintptr) di->txd32 - di->txdalign),
+                            di->txdalloc, (di->txdpa - di->txdalign),
+                            &di->tx_dmah);
+      if (di->rxd32)
+       DMA_FREE_CONSISTENT (di->osh,
+                            ((int8 *) (uintptr) 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 (DMA64_ENAB(di)) {
-               /* DMA64 supports full 32 bits or 64 bits. AE is always valid */
-
-               /* not all tx or rx channel are available */
-               if (di->d64txregs != NULL) {
-                       if (!_dma64_addrext(di->osh, di->d64txregs)) {
-                               DMA_ERROR(("%s: _dma_isaddrext: DMA64 tx doesn't have AE set\n",
-                                       di->name));
-                               ASSERT(0);
-                       }
-                       return TRUE;
-               } else if (di->d64rxregs != NULL) {
-                       if (!_dma64_addrext(di->osh, di->d64rxregs)) {
-                               DMA_ERROR(("%s: _dma_isaddrext: DMA64 rx doesn't have AE set\n",
-                                       di->name));
-                               ASSERT(0);
-                       }
-                       return TRUE;
-               }
-               return FALSE;
-       } else if (di->d32txregs)
-               return (_dma32_addrext(di->osh, di->d32txregs));
-       else if (di->d32rxregs)
-               return (_dma32_addrext(di->osh, di->d32rxregs));
-       return FALSE;
+_dma_isaddrext (dma_info_t * di)
+{
+  if (DMA64_ENAB (di))
+    {
+      /* DMA64 supports full 32 bits or 64 bits. AE is always valid */
+
+      /* not all tx or rx channel are available */
+      if (di->d64txregs != NULL)
+       {
+         if (!_dma64_addrext (di->osh, di->d64txregs))
+           {
+             DMA_ERROR (("%s: _dma_isaddrext: DMA64 tx doesn't have AE set\n", di->name));
+             ASSERT (0);
+           }
+         return TRUE;
+       }
+      else if (di->d64rxregs != NULL)
+       {
+         if (!_dma64_addrext (di->osh, di->d64rxregs))
+           {
+             DMA_ERROR (("%s: _dma_isaddrext: DMA64 rx doesn't have AE set\n", di->name));
+             ASSERT (0);
+           }
+         return TRUE;
+       }
+      return FALSE;
+    }
+  else 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 (DMA64_ENAB(di)) {
-
-               if ((di->ddoffsetlow != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) {
-                       if (direction == DMA_TX) {
-                               W_REG(di->osh, &di->d64txregs->addrlow, (pa + di->ddoffsetlow));
-                               W_REG(di->osh, &di->d64txregs->addrhigh, di->ddoffsethigh);
-                       } else {
-                               W_REG(di->osh, &di->d64rxregs->addrlow, (pa + di->ddoffsetlow));
-                               W_REG(di->osh, &di->d64rxregs->addrhigh, di->ddoffsethigh);
-                       }
-               } else {
-                       /* DMA64 32bits 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->d64txregs->addrlow, (pa + di->ddoffsetlow));
-                               W_REG(di->osh, &di->d64txregs->addrhigh, di->ddoffsethigh);
-                               SET_REG(di->osh, &di->d64txregs->control, D64_XC_AE,
-                                       (ae << D64_XC_AE_SHIFT));
-                       } else {
-                               W_REG(di->osh, &di->d64rxregs->addrlow, (pa + di->ddoffsetlow));
-                               W_REG(di->osh, &di->d64rxregs->addrhigh, di->ddoffsethigh);
-                               SET_REG(di->osh, &di->d64rxregs->control, D64_RC_AE,
-                                       (ae << D64_RC_AE_SHIFT));
-                       }
-               }
-
-       } else {
-               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);
-                       }
-               }
+_dma_ddtable_init (dma_info_t * di, uint direction, ulong pa)
+{
+  if (DMA64_ENAB (di))
+    {
+
+      if ((di->ddoffsetlow != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH))
+       {
+         if (direction == DMA_TX)
+           {
+             W_REG (di->osh, &di->d64txregs->addrlow,
+                    (pa + di->ddoffsetlow));
+             W_REG (di->osh, &di->d64txregs->addrhigh, di->ddoffsethigh);
+           }
+         else
+           {
+             W_REG (di->osh, &di->d64rxregs->addrlow,
+                    (pa + di->ddoffsetlow));
+             W_REG (di->osh, &di->d64rxregs->addrhigh, di->ddoffsethigh);
+           }
+       }
+      else
+       {
+         /* DMA64 32bits 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->d64txregs->addrlow,
+                    (pa + di->ddoffsetlow));
+             W_REG (di->osh, &di->d64txregs->addrhigh, di->ddoffsethigh);
+             SET_REG (di->osh, &di->d64txregs->control, D64_XC_AE,
+                      (ae << D64_XC_AE_SHIFT));
+           }
+         else
+           {
+             W_REG (di->osh, &di->d64rxregs->addrlow,
+                    (pa + di->ddoffsetlow));
+             W_REG (di->osh, &di->d64rxregs->addrhigh, di->ddoffsethigh);
+             SET_REG (di->osh, &di->d64rxregs->control, D64_RC_AE,
+                      (ae << D64_RC_AE_SHIFT));
+           }
+       }
+
+    }
+  else
+    {
+      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_fifoloopbackenable (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_fifoloopbackenable\n", di->name));
-       if (DMA64_ENAB(di))
-               OR_REG(di->osh, &di->d64txregs->control, D64_XC_LE);
-       else
-               OR_REG(di->osh, &di->d32txregs->control, XC_LE);
+  DMA_TRACE (("%s: dma_fifoloopbackenable\n", di->name));
+  if (DMA64_ENAB (di))
+    OR_REG (di->osh, &di->d64txregs->control, D64_XC_LE);
+  else
+    OR_REG (di->osh, &di->d32txregs->control, XC_LE);
 }
 
 static void
-_dma_rxinit(dma_info_t *di)
+_dma_rxinit (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_rxinit\n", di->name));
+  DMA_TRACE (("%s: dma_rxinit\n", di->name));
 
-       if (di->nrxd == 0)
-               return;
+  if (di->nrxd == 0)
+    return;
 
-       di->rxin = di->rxout = 0;
+  di->rxin = di->rxout = 0;
 
-       /* clear rx descriptor ring */
-       if (DMA64_ENAB(di)) {
-               BZERO_SM((void *)(uintptr)di->rxd64, (di->nrxd * sizeof(dma64dd_t)));
-               _dma_rxenable(di);
-               _dma_ddtable_init(di, DMA_RX, di->rxdpa);
-       } else {
-               BZERO_SM((void *)(uintptr)di->rxd32, (di->nrxd * sizeof(dma32dd_t)));
-               _dma_rxenable(di);
-               _dma_ddtable_init(di, DMA_RX, di->rxdpa);
-       }
+  /* clear rx descriptor ring */
+  if (DMA64_ENAB (di))
+    BZERO_SM ((void *) (uintptr) di->rxd64, (di->nrxd * sizeof (dma64dd_t)));
+  else
+    BZERO_SM ((void *) (uintptr) 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_rxenable (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_rxenable\n", di->name));
-
-       if (DMA64_ENAB(di))
-               W_REG(di->osh, &di->d64rxregs->control,
-                     ((di->rxoffset << D64_RC_RO_SHIFT) | D64_RC_RE));
-       else
-               W_REG(di->osh, &di->d32rxregs->control, ((di->rxoffset << RC_RO_SHIFT) | RC_RE));
+  DMA_TRACE (("%s: dma_rxenable\n", di->name));
+
+  if (DMA64_ENAB (di))
+    W_REG (di->osh, &di->d64rxregs->control,
+          ((di->rxoffset << D64_RC_RO_SHIFT) | D64_RC_RE));
+  else
+    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;
+_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;
        }
 
-       return (p);
+      /* 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 (DMA64_ENAB(di)) {
-                       if (rxout == (di->nrxd - 1))
-                               flags = D64_CTRL1_EOT;
-
-                       dma64_dd_upd(di, di->rxd64, pa, rxout, &flags, di->rxbufsize);
-               } else {
-                       if (rxout == (di->nrxd - 1))
-                               flags = CTRL_EOT;
-
-                       dma32_dd_upd(di, di->rxd32, pa, rxout, &flags, di->rxbufsize);
-               }
-               rxout = NEXTRXD(rxout);
+_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);
 
-       di->rxout = rxout;
+      /* Do a cached write instead of uncached write since DMA_MAP
+       * will flush the cache.
+       */
+      *(uint32 *) (PKTDATA (di->osh, p)) = 0;
 
-       /* update the chip lastdscr pointer */
-       if (DMA64_ENAB(di)) {
-               W_REG(di->osh, &di->d64rxregs->ptr, I2B(rxout, dma64dd_t));
-       } else {
-               W_REG(di->osh, &di->d32rxregs->ptr, I2B(rxout, dma32dd_t));
-       }
-}
+      pa = (uint32) DMA_MAP (di->osh, PKTDATA (di->osh, p),
+                            di->rxbufsize, DMA_RX, p, &di->rxp_dmah[rxout]);
 
-/* like getnexttxp but no reclaim */
-static void *
-_dma_peeknexttxp(dma_info_t *di)
-{
-       uint end, i;
+      ASSERT (ISALIGNED (pa, 4));
+
+      /* save the free packet pointer */
+      ASSERT (di->rxp[rxout] == NULL);
+      di->rxp[rxout] = p;
 
-       if (di->ntxd == 0)
-               return (NULL);
+      /* reset flags for each descriptor */
+      flags = 0;
+      if (DMA64_ENAB (di))
+       {
+         if (rxout == (di->nrxd - 1))
+           flags = D64_CTRL1_EOT;
 
-       if (DMA64_ENAB(di)) {
-               end = B2I(R_REG(di->osh, &di->d64txregs->status0) & D64_XS0_CD_MASK, dma64dd_t);
-       } else {
-               end = B2I(R_REG(di->osh, &di->d32txregs->status) & XS_CD_MASK, dma32dd_t);
+         dma64_dd_upd (di, di->rxd64, pa, rxout, &flags, di->rxbufsize);
        }
+      else
+       {
+         if (rxout == (di->nrxd - 1))
+           flags = CTRL_EOT;
 
-       for (i = di->txin; i != end; i = NEXTTXD(i))
-               if (di->txp[i])
-                       return (di->txp[i]);
+         dma32_dd_upd (di, di->rxd32, pa, rxout, &flags, di->rxbufsize);
+       }
+      rxout = NEXTRXD (rxout);
+    }
+
+  di->rxout = rxout;
+
+  /* update the chip lastdscr pointer */
+  if (DMA64_ENAB (di))
+    {
+      W_REG (di->osh, &di->d64rxregs->ptr, I2B (rxout, dma64dd_t));
+    }
+  else
+    {
+      W_REG (di->osh, &di->d32rxregs->ptr, I2B (rxout, dma32dd_t));
+    }
+}
 
-       return (NULL);
+/* like getnexttxp but no reclaim */
+static void *
+_dma_peeknexttxp (dma_info_t * di)
+{
+  uint end, i;
+
+  if (di->ntxd == 0)
+    return (NULL);
+
+  if (DMA64_ENAB (di))
+    {
+      end =
+       B2I (R_REG (di->osh, &di->d64txregs->status0) & D64_XS0_CD_MASK,
+            dma64dd_t);
+    }
+  else
+    {
+      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)
+_dma_rxreclaim (dma_info_t * di)
 {
-       void *p;
+  void *p;
 
-       /* "unused local" warning suppression for OSLs that
-        * define PKTFREE() without using the di->osh arg
-        */
-       di = di;
+  /* "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));
+  DMA_TRACE (("%s: dma_rxreclaim\n", di->name));
 
-       while ((p = _dma_getnextrxp(di, TRUE)))
-               PKTFREE(di->osh, p, FALSE);
+  while ((p = _dma_getnextrxp (di, TRUE)))
+    PKTFREE (di->osh, p, FALSE);
 }
 
 static void *
-_dma_getnextrxp(dma_info_t *di, bool forceall)
+_dma_getnextrxp (dma_info_t * di, bool forceall)
 {
-       if (di->nrxd == 0)
-               return (NULL);
-
-       if (DMA64_ENAB(di)) {
-               return dma64_getnextrxp(di, forceall);
-       } else {
-               return dma32_getnextrxp(di, forceall);
-       }
+  if (di->nrxd == 0)
+    return (NULL);
+
+  if (DMA64_ENAB (di))
+    {
+      return dma64_getnextrxp (di, forceall);
+    }
+  else
+    {
+      return dma32_getnextrxp (di, forceall);
+    }
 }
 
 static void
-_dma_txblock(dma_info_t *di)
+_dma_txblock (dma_info_t * di)
 {
-       di->hnddma.txavail = 0;
+  di->hnddma.txavail = 0;
 }
 
 static void
-_dma_txunblock(dma_info_t *di)
+_dma_txunblock (dma_info_t * di)
 {
-       di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
+  di->hnddma.txavail = di->ntxd - NTXDACTIVE (di->txin, di->txout) - 1;
 }
 
 static uint
-_dma_txactive(dma_info_t *di)
+_dma_txactive (dma_info_t * di)
 {
-       return (NTXDACTIVE(di->txin, di->txout));
+  return (NTXDACTIVE (di->txin, di->txout));
 }
 
 static void
-_dma_counterreset(dma_info_t *di)
+_dma_counterreset (dma_info_t * di)
 {
-       /* reset all software counter */
-       di->hnddma.rxgiants = 0;
-       di->hnddma.rxnobuf = 0;
-       di->hnddma.txnobuf = 0;
+  /* 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, const char *name)
+_dma_getvar (dma_info_t * di, const char *name)
 {
-       if (!strcmp(name, "&txavail"))
-               return ((uintptr) &(di->hnddma.txavail));
-       else {
-               ASSERT(0);
-       }
-       return (0);
+  if (!strcmp (name, "&txavail"))
+    return ((uintptr) & (di->hnddma.txavail));
+  else
+    {
+      ASSERT (0);
+    }
+  return (0);
 }
 
 void
-dma_txpioloopback(osl_t *osh, dma32regs_t *regs)
+dma_txpioloopback (osl_t * osh, dma32regs_t * regs)
 {
-       OR_REG(osh, &regs->control, XC_LE);
+  OR_REG (osh, &regs->control, XC_LE);
 }
 
+#ifdef BCMDBG
+static void
+dma32_dumpring (dma_info_t * di, struct bcmstrbuf *b, dma32dd_t * ring,
+               uint start, uint end, uint max_num)
+{
+  uint i;
+
+  for (i = start; i != end; i = XXD ((i + 1), max_num))
+    {
+      /* in the format of high->low 8 bytes */
+      bcm_bprintf (b, "ring index %d: 0x%x %x\n", i, ring[i].addr,
+                  ring[i].ctrl);
+    }
+}
+
+static void
+dma32_dumptx (dma_info_t * di, struct bcmstrbuf *b, bool dumpring)
+{
+  if (di->ntxd == 0)
+    return;
+
+  bcm_bprintf (b, "DMA32: txd32 %p txdpa 0x%lx txp %p txin %d txout %d "
+              "txavail %d\n", di->txd32, di->txdpa, di->txp, di->txin,
+              di->txout, di->hnddma.txavail);
+
+  bcm_bprintf (b, "xmtcontrol 0x%x xmtaddr 0x%x xmtptr 0x%x xmtstatus 0x%x\n",
+              R_REG (di->osh, &di->d32txregs->control),
+              R_REG (di->osh, &di->d32txregs->addr),
+              R_REG (di->osh, &di->d32txregs->ptr),
+              R_REG (di->osh, &di->d32txregs->status));
+
+  if (dumpring && di->txd32)
+    dma32_dumpring (di, b, di->txd32, di->txin, di->txout, di->ntxd);
+}
+
+static void
+dma32_dumprx (dma_info_t * di, struct bcmstrbuf *b, bool dumpring)
+{
+  if (di->nrxd == 0)
+    return;
+
+  bcm_bprintf (b, "DMA32: rxd32 %p rxdpa 0x%lx rxp %p rxin %d rxout %d\n",
+              di->rxd32, di->rxdpa, di->rxp, di->rxin, di->rxout);
+
+  bcm_bprintf (b, "rcvcontrol 0x%x rcvaddr 0x%x rcvptr 0x%x rcvstatus 0x%x\n",
+              R_REG (di->osh, &di->d32rxregs->control),
+              R_REG (di->osh, &di->d32rxregs->addr),
+              R_REG (di->osh, &di->d32rxregs->ptr),
+              R_REG (di->osh, &di->d32rxregs->status));
+  if (di->rxd32 && dumpring)
+    dma32_dumpring (di, b, di->rxd32, di->rxin, di->rxout, di->nrxd);
+}
+
+static void
+dma32_dump (dma_info_t * di, struct bcmstrbuf *b, bool dumpring)
+{
+  dma32_dumptx (di, b, dumpring);
+  dma32_dumprx (di, b, dumpring);
+}
+
+static void
+dma64_dumpring (dma_info_t * di, struct bcmstrbuf *b, dma64dd_t * ring,
+               uint start, uint end, uint max_num)
+{
+  uint i;
+
+  for (i = start; i != end; i = XXD ((i + 1), max_num))
+    {
+      /* in the format of high->low 16 bytes */
+      bcm_bprintf (b, "ring index %d: 0x%x %x %x %x\n",
+                  i, ring[i].addrhigh, ring[i].addrlow, ring[i].ctrl2,
+                  ring[i].ctrl1);
+    }
+}
+
+static void
+dma64_dumptx (dma_info_t * di, struct bcmstrbuf *b, bool dumpring)
+{
+  if (di->ntxd == 0)
+    return;
+
+  bcm_bprintf (b, "DMA64: txd64 %p txdpa 0x%lx txp %p txin %d txout %d "
+              "txavail %d\n", di->txd64, di->txdpa, di->txp, di->txin,
+              di->txout, di->hnddma.txavail);
+
+  bcm_bprintf (b, "xmtcontrol 0x%x xmtaddrlow 0x%x xmtaddrhigh 0x%x "
+              "xmtptr 0x%x xmtstatus0 0x%x xmtstatus1 0x%x\n",
+              R_REG (di->osh, &di->d64txregs->control),
+              R_REG (di->osh, &di->d64txregs->addrlow),
+              R_REG (di->osh, &di->d64txregs->addrhigh),
+              R_REG (di->osh, &di->d64txregs->ptr),
+              R_REG (di->osh, &di->d64txregs->status0),
+              R_REG (di->osh, &di->d64txregs->status1));
+
+  if (dumpring && di->txd64)
+    {
+      dma64_dumpring (di, b, di->txd64, di->txin, di->txout, di->ntxd);
+    }
+}
+
+static void
+dma64_dumprx (dma_info_t * di, struct bcmstrbuf *b, bool dumpring)
+{
+  if (di->nrxd == 0)
+    return;
+
+  bcm_bprintf (b, "DMA64: rxd64 %p rxdpa 0x%lx rxp %p rxin %d rxout %d\n",
+              di->rxd64, di->rxdpa, di->rxp, di->rxin, di->rxout);
+
+  bcm_bprintf (b, "rcvcontrol 0x%x rcvaddrlow 0x%x rcvaddrhigh 0x%x rcvptr "
+              "0x%x rcvstatus0 0x%x rcvstatus1 0x%x\n",
+              R_REG (di->osh, &di->d64rxregs->control),
+              R_REG (di->osh, &di->d64rxregs->addrlow),
+              R_REG (di->osh, &di->d64rxregs->addrhigh),
+              R_REG (di->osh, &di->d64rxregs->ptr),
+              R_REG (di->osh, &di->d64rxregs->status0),
+              R_REG (di->osh, &di->d64rxregs->status1));
+  if (di->rxd64 && dumpring)
+    {
+      dma64_dumpring (di, b, di->rxd64, di->rxin, di->rxout, di->nrxd);
+    }
+}
+
+static void
+dma64_dump (dma_info_t * di, struct bcmstrbuf *b, bool dumpring)
+{
+  dma64_dumptx (di, b, dumpring);
+  dma64_dumprx (di, b, dumpring);
+}
+
+#endif /* BCMDBG */
 
 
 /* 32 bits DMA functions */
 static void
-dma32_txinit(dma_info_t *di)
+dma32_txinit (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_txinit\n", di->name));
+  DMA_TRACE (("%s: dma_txinit\n", di->name));
 
-       if (di->ntxd == 0)
-               return;
+  if (di->ntxd == 0)
+    return;
 
-       di->txin = di->txout = 0;
-       di->hnddma.txavail = di->ntxd - 1;
+  di->txin = di->txout = 0;
+  di->hnddma.txavail = di->ntxd - 1;
 
-       /* clear tx descriptor ring */
-       BZERO_SM((void *)(uintptr)di->txd32, (di->ntxd * sizeof(dma32dd_t)));
-       W_REG(di->osh, &di->d32txregs->control, XC_XE);
-       _dma_ddtable_init(di, DMA_TX, di->txdpa);
+  /* clear tx descriptor ring */
+  BZERO_SM ((void *) (uintptr) 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)
+dma32_txenabled (dma_info_t * di)
 {
-       uint32 xc;
+  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));
+  /* 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)
+dma32_txsuspend (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_txsuspend\n", di->name));
+  DMA_TRACE (("%s: dma_txsuspend\n", di->name));
 
-       if (di->ntxd == 0)
-               return;
+  if (di->ntxd == 0)
+    return;
 
-       OR_REG(di->osh, &di->d32txregs->control, XC_SE);
+  OR_REG (di->osh, &di->d32txregs->control, XC_SE);
 }
 
 static void
-dma32_txresume(dma_info_t *di)
+dma32_txresume (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_txresume\n", di->name));
+  DMA_TRACE (("%s: dma_txresume\n", di->name));
 
-       if (di->ntxd == 0)
-               return;
+  if (di->ntxd == 0)
+    return;
 
-       AND_REG(di->osh, &di->d32txregs->control, ~XC_SE);
+  AND_REG (di->osh, &di->d32txregs->control, ~XC_SE);
 }
 
 static bool
-dma32_txsuspended(dma_info_t *di)
+dma32_txsuspended (dma_info_t * di)
 {
-       return (di->ntxd == 0) || ((R_REG(di->osh, &di->d32txregs->control) & XC_SE) == XC_SE);
+  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)
+dma32_txreclaim (dma_info_t * di, bool forceall)
 {
-       void *p;
+  void *p;
 
-       DMA_TRACE(("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : ""));
+  DMA_TRACE (("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : ""));
 
-       while ((p = dma32_getnexttxp(di, forceall)))
-               PKTFREE(di->osh, p, TRUE);
+  while ((p = dma32_getnexttxp (di, forceall)))
+    PKTFREE (di->osh, p, TRUE);
 }
 
 static bool
-dma32_txstopped(dma_info_t *di)
+dma32_txstopped (dma_info_t * di)
 {
-       return ((R_REG(di->osh, &di->d32txregs->status) & XS_XS_MASK) == XS_XS_STOPPED);
+  return ((R_REG (di->osh, &di->d32txregs->status) & XS_XS_MASK) ==
+         XS_XS_STOPPED);
 }
 
 static bool
-dma32_rxstopped(dma_info_t *di)
+dma32_rxstopped (dma_info_t * di)
 {
-       return ((R_REG(di->osh, &di->d32rxregs->status) & RS_RS_MASK) == RS_RS_STOPPED);
+  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*)(uintptr)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*)(uintptr)di->rxd32 - (int8*)va);
-               di->rxdpa += di->rxdalign;
-               di->rxdalloc = size;
-               ASSERT(ISALIGNED((uintptr)di->rxd32, D32RINGALIGN));
+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;
        }
 
-       return TRUE;
+      di->txd32 = (dma32dd_t *) ROUNDUP ((uintptr) va, D32RINGALIGN);
+      di->txdalign = (uint) ((int8 *) (uintptr) 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 *) (uintptr) 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)
+dma32_txreset (dma_info_t * di)
 {
-       uint32 status;
+  uint32 status;
 
-       if (di->ntxd == 0)
-               return TRUE;
+  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));
+  /* 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);
+  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);
+  /* wait for the last transaction to complete */
+  OSL_DELAY (300);
 
-       return (status == XS_XS_DISABLED);
+  return (status == XS_XS_DISABLED);
 }
 
 static bool
-dma32_rxidle(dma_info_t *di)
+dma32_rxidle (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_rxidle\n", di->name));
+  DMA_TRACE (("%s: dma_rxidle\n", di->name));
 
-       if (di->nrxd == 0)
-               return TRUE;
+  if (di->nrxd == 0)
+    return TRUE;
 
-       return ((R_REG(di->osh, &di->d32rxregs->status) & RS_CD_MASK) ==
-               R_REG(di->osh, &di->d32rxregs->ptr));
+  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)
+dma32_rxreset (dma_info_t * di)
 {
-       uint32 status;
+  uint32 status;
 
-       if (di->nrxd == 0)
-               return TRUE;
+  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);
+  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);
+  return (status == RS_RS_DISABLED);
 }
 
 static bool
-dma32_rxenabled(dma_info_t *di)
+dma32_rxenabled (dma_info_t * di)
 {
-       uint32 rc;
+  uint32 rc;
 
-       rc = R_REG(di->osh, &di->d32rxregs->control);
-       return ((rc != 0xffffffff) && (rc & RC_RE));
+  rc = R_REG (di->osh, &di->d32rxregs->control);
+  return ((rc != 0xffffffff) && (rc & RC_RE));
 }
 
 static bool
-dma32_txsuspendedidle(dma_info_t *di)
+dma32_txsuspendedidle (dma_info_t * di)
 {
-       if (di->ntxd == 0)
-               return TRUE;
+  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->control) & XC_SE))
+    return 0;
 
-       if ((R_REG(di->osh, &di->d32txregs->status) & XS_XS_MASK) != XS_XS_IDLE)
-               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);
+  OSL_DELAY (2);
+  return ((R_REG (di->osh, &di->d32txregs->status) & XS_XS_MASK) ==
+         XS_XS_IDLE);
 }
 
 /* !! tx entry routine
@@ -1171,77 +1518,81 @@ dma32_txsuspendedidle(dma_info_t *di)
  * 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);
-       }
+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,
+                         &di->txp_dmah[txout]);
+
+      flags = 0;
+      if (p == p0)
+       flags |= CTRL_SOF;
+      if (next == NULL)
+       flags |= (CTRL_IOC | CTRL_EOF);
+      if (txout == (di->ntxd - 1))
+       flags |= CTRL_EOT;
 
-       /* 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));
+      dma32_dd_upd (di, di->txd32, pa, txout, &flags, len);
+      ASSERT (di->txp[txout] == NULL);
 
-       /* save the packet */
-       di->txp[PREVTXD(txout)] = p0;
+      txout = NEXTTXD (txout);
+    }
 
-       /* bump the tx descriptor index */
-       di->txout = 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));
 
-       /* kick the chip */
-       if (commit)
-               W_REG(di->osh, &di->d32txregs->ptr, I2B(txout, dma32dd_t));
+  /* save the packet */
+  di->txp[PREVTXD (txout)] = p0;
 
-       /* tx flow control */
-       di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
+  /* bump the tx descriptor index */
+  di->txout = txout;
 
-       return (0);
+  /* 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);
+  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);
 }
 
 /*
@@ -1251,431 +1602,456 @@ outoftxd:
  * regardless of the value of the hardware "curr" pointer.
  */
 static void *
-dma32_getnexttxp(dma_info_t *di, bool forceall)
+dma32_getnexttxp (dma_info_t * di, bool forceall)
 {
-       uint start, end, i;
-       void *txp;
+  uint start, end, i;
+  void *txp;
 
-       DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : ""));
+  DMA_TRACE (("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : ""));
 
-       if (di->ntxd == 0)
-               return (NULL);
+  if (di->ntxd == 0)
+    return (NULL);
 
-       txp = 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);
+  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;
+  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]);
+  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], &di->txp_dmah[i]);
 
-               W_SM(&di->txd32[i].addr, 0xdeadbeef);
-               txp = di->txp[i];
-               di->txp[i] = NULL;
-       }
+      W_SM (&di->txd32[i].addr, 0xdeadbeef);
+      txp = di->txp[i];
+      di->txp[i] = NULL;
+    }
 
-       di->txin = i;
+  di->txin = i;
 
-       /* tx flow control */
-       di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
+  /* tx flow control */
+  di->hnddma.txavail = di->ntxd - NTXDACTIVE (di->txin, di->txout) - 1;
 
-       return (txp);
+  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);
+  return (NULL);
 }
 
 static void *
-dma32_getnextrxp(dma_info_t *di, bool forceall)
+dma32_getnextrxp (dma_info_t * di, bool forceall)
 {
-       uint i;
-       void *rxp;
+  uint i;
+  void *rxp;
 
-       /* if forcing, dma engine must be disabled */
-       ASSERT(!forceall || !dma32_rxenabled(di));
+  /* if forcing, dma engine must be disabled */
+  ASSERT (!forceall || !dma32_rxenabled (di));
 
-       i = di->rxin;
+  i = di->rxin;
 
-       /* return if no packets posted */
-       if (i == di->rxout)
-               return (NULL);
+  /* 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);
+  /* 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;
+  /* 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);
+  /* 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, &di->rxp_dmah[i]);
 
-       W_SM(&di->rxd32[i].addr, 0xdeadbeef);
+  W_SM (&di->rxd32[i].addr, 0xdeadbeef);
 
-       di->rxin = NEXTRXD(i);
+  di->rxin = NEXTRXD (i);
 
-       return (rxp);
+  return (rxp);
 }
 
 /*
  * Rotate all active tx dma ring entries "forward" by (ActiveDescriptor - txin).
  */
 static void
-dma32_txrotate(dma_info_t *di)
+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 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));
 }
 
 /* 64 bits DMA functions */
 
 #ifdef BCMDMA64
 static void
-dma64_txinit(dma_info_t *di)
+dma64_txinit (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_txinit\n", di->name));
+  DMA_TRACE (("%s: dma_txinit\n", di->name));
 
-       if (di->ntxd == 0)
-               return;
+  if (di->ntxd == 0)
+    return;
 
-       di->txin = di->txout = 0;
-       di->hnddma.txavail = di->ntxd - 1;
+  di->txin = di->txout = 0;
+  di->hnddma.txavail = di->ntxd - 1;
 
-       /* clear tx descriptor ring */
-       BZERO_SM((void *)(uintptr)di->txd64, (di->ntxd * sizeof(dma64dd_t)));
-       W_REG(di->osh, &di->d64txregs->control, D64_XC_XE);
-       _dma_ddtable_init(di, DMA_TX, di->txdpa);
+  /* clear tx descriptor ring */
+  BZERO_SM ((void *) (uintptr) di->txd64, (di->ntxd * sizeof (dma64dd_t)));
+  W_REG (di->osh, &di->d64txregs->control, D64_XC_XE);
+  _dma_ddtable_init (di, DMA_TX, di->txdpa);
 }
 
 static bool
-dma64_txenabled(dma_info_t *di)
+dma64_txenabled (dma_info_t * di)
 {
-       uint32 xc;
+  uint32 xc;
 
-       /* If the chip is dead, it is not enabled :-) */
-       xc = R_REG(di->osh, &di->d64txregs->control);
-       return ((xc != 0xffffffff) && (xc & D64_XC_XE));
+  /* If the chip is dead, it is not enabled :-) */
+  xc = R_REG (di->osh, &di->d64txregs->control);
+  return ((xc != 0xffffffff) && (xc & D64_XC_XE));
 }
 
 static void
-dma64_txsuspend(dma_info_t *di)
+dma64_txsuspend (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_txsuspend\n", di->name));
+  DMA_TRACE (("%s: dma_txsuspend\n", di->name));
 
-       if (di->ntxd == 0)
-               return;
+  if (di->ntxd == 0)
+    return;
 
-       OR_REG(di->osh, &di->d64txregs->control, D64_XC_SE);
+  OR_REG (di->osh, &di->d64txregs->control, D64_XC_SE);
 }
 
 static void
-dma64_txresume(dma_info_t *di)
+dma64_txresume (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_txresume\n", di->name));
+  DMA_TRACE (("%s: dma_txresume\n", di->name));
 
-       if (di->ntxd == 0)
-               return;
+  if (di->ntxd == 0)
+    return;
 
-       AND_REG(di->osh, &di->d64txregs->control, ~D64_XC_SE);
+  AND_REG (di->osh, &di->d64txregs->control, ~D64_XC_SE);
 }
 
 static bool
-dma64_txsuspended(dma_info_t *di)
+dma64_txsuspended (dma_info_t * di)
 {
-       return (di->ntxd == 0) || ((R_REG(di->osh, &di->d64txregs->control) & D64_XC_SE)
-               == D64_XC_SE);
+  return (di->ntxd == 0)
+    || ((R_REG (di->osh, &di->d64txregs->control) & D64_XC_SE) == D64_XC_SE);
 }
 
 static void
-dma64_txreclaim(dma_info_t *di, bool forceall)
+dma64_txreclaim (dma_info_t * di, bool forceall)
 {
-       void *p;
+  void *p;
 
-       DMA_TRACE(("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : ""));
+  DMA_TRACE (("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : ""));
 
-       while ((p = dma64_getnexttxp(di, forceall)))
-               PKTFREE(di->osh, p, TRUE);
+  while ((p = dma64_getnexttxp (di, forceall)))
+    PKTFREE (di->osh, p, TRUE);
 }
 
 static bool
-dma64_txstopped(dma_info_t *di)
+dma64_txstopped (dma_info_t * di)
 {
-       return ((R_REG(di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK) == D64_XS0_XS_STOPPED);
+  return ((R_REG (di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK) ==
+         D64_XS0_XS_STOPPED);
 }
 
 static bool
-dma64_rxstopped(dma_info_t *di)
+dma64_rxstopped (dma_info_t * di)
 {
-       return ((R_REG(di->osh, &di->d64rxregs->status0) & D64_RS0_RS_MASK) == D64_RS0_RS_STOPPED);
+  return ((R_REG (di->osh, &di->d64rxregs->status0) & D64_RS0_RS_MASK) ==
+         D64_RS0_RS_STOPPED);
 }
 
 static bool
-dma64_alloc(dma_info_t *di, uint direction)
-{
-       uint size;
-       uint ddlen;
-       uint32 alignbytes;
-       void *va;
-
-       ddlen = sizeof(dma64dd_t);
-
-       size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen);
-
-       alignbytes = di->dma64align;
-
-       if (!ISALIGNED(DMA_CONSISTENT_ALIGN, alignbytes))
-               size += alignbytes;
-
-       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->txd64 = (dma64dd_t *) ROUNDUP((uintptr)va, alignbytes);
-               di->txdalign = (uint)((int8*)(uintptr)di->txd64 - (int8*)va);
-               di->txdpa += di->txdalign;
-               di->txdalloc = size;
-               ASSERT(ISALIGNED((uintptr)di->txd64, alignbytes));
-       } 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->rxd64 = (dma64dd_t *) ROUNDUP((uintptr)va, alignbytes);
-               di->rxdalign = (uint)((int8*)(uintptr)di->rxd64 - (int8*)va);
-               di->rxdpa += di->rxdalign;
-               di->rxdalloc = size;
-               ASSERT(ISALIGNED((uintptr)di->rxd64, alignbytes));
+dma64_alloc (dma_info_t * di, uint direction)
+{
+  uint size;
+  uint ddlen;
+  uint32 alignbytes;
+  void *va;
+
+  ddlen = sizeof (dma64dd_t);
+
+  size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen);
+
+  alignbytes = di->dma64align;
+
+  if (!ISALIGNED (DMA_CONSISTENT_ALIGN, alignbytes))
+    size += alignbytes;
+
+  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;
        }
 
-       return TRUE;
+      di->txd64 = (dma64dd_t *) ROUNDUP ((uintptr) va, alignbytes);
+      di->txdalign = (uint) ((int8 *) (uintptr) di->txd64 - (int8 *) va);
+      di->txdpa += di->txdalign;
+      di->txdalloc = size;
+      ASSERT (ISALIGNED ((uintptr) di->txd64, alignbytes));
+    }
+  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->rxd64 = (dma64dd_t *) ROUNDUP ((uintptr) va, alignbytes);
+      di->rxdalign = (uint) ((int8 *) (uintptr) di->rxd64 - (int8 *) va);
+      di->rxdpa += di->rxdalign;
+      di->rxdalloc = size;
+      ASSERT (ISALIGNED ((uintptr) di->rxd64, alignbytes));
+    }
+
+  return TRUE;
 }
 
 static bool
-dma64_txreset(dma_info_t *di)
+dma64_txreset (dma_info_t * di)
 {
-       uint32 status;
+  uint32 status;
 
-       if (di->ntxd == 0)
-               return TRUE;
+  if (di->ntxd == 0)
+    return TRUE;
 
-       /* suspend tx DMA first */
-       W_REG(di->osh, &di->d64txregs->control, D64_XC_SE);
-       SPINWAIT(((status = (R_REG(di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK)) !=
-                 D64_XS0_XS_DISABLED) &&
-                (status != D64_XS0_XS_IDLE) &&
-                (status != D64_XS0_XS_STOPPED),
-                10000);
+  /* suspend tx DMA first */
+  W_REG (di->osh, &di->d64txregs->control, D64_XC_SE);
+  SPINWAIT (((status =
+             (R_REG (di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK)) !=
+            D64_XS0_XS_DISABLED) && (status != D64_XS0_XS_IDLE)
+           && (status != D64_XS0_XS_STOPPED), 10000);
 
-       W_REG(di->osh, &di->d64txregs->control, 0);
-       SPINWAIT(((status = (R_REG(di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK)) !=
-                 D64_XS0_XS_DISABLED),
-                10000);
+  W_REG (di->osh, &di->d64txregs->control, 0);
+  SPINWAIT (((status =
+             (R_REG (di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK)) !=
+            D64_XS0_XS_DISABLED), 10000);
 
-       /* wait for the last transaction to complete */
-       OSL_DELAY(300);
+  /* wait for the last transaction to complete */
+  OSL_DELAY (300);
 
-       return (status == D64_XS0_XS_DISABLED);
+  return (status == D64_XS0_XS_DISABLED);
 }
 
 static bool
-dma64_rxidle(dma_info_t *di)
+dma64_rxidle (dma_info_t * di)
 {
-       DMA_TRACE(("%s: dma_rxidle\n", di->name));
+  DMA_TRACE (("%s: dma_rxidle\n", di->name));
 
-       if (di->nrxd == 0)
-               return TRUE;
+  if (di->nrxd == 0)
+    return TRUE;
 
-       return ((R_REG(di->osh, &di->d64rxregs->status0) & D64_RS0_CD_MASK) ==
-               R_REG(di->osh, &di->d64rxregs->ptr));
+  return ((R_REG (di->osh, &di->d64rxregs->status0) & D64_RS0_CD_MASK) ==
+         R_REG (di->osh, &di->d64rxregs->ptr));
 }
 
 static bool
-dma64_rxreset(dma_info_t *di)
+dma64_rxreset (dma_info_t * di)
 {
-       uint32 status;
+  uint32 status;
 
-       if (di->nrxd == 0)
-               return TRUE;
+  if (di->nrxd == 0)
+    return TRUE;
 
-       W_REG(di->osh, &di->d64rxregs->control, 0);
-       SPINWAIT(((status = (R_REG(di->osh, &di->d64rxregs->status0) & D64_RS0_RS_MASK)) !=
-                 D64_RS0_RS_DISABLED),
-                10000);
+  W_REG (di->osh, &di->d64rxregs->control, 0);
+  SPINWAIT (((status =
+             (R_REG (di->osh, &di->d64rxregs->status0) & D64_RS0_RS_MASK)) !=
+            D64_RS0_RS_DISABLED), 10000);
 
-       return (status == D64_RS0_RS_DISABLED);
+  return (status == D64_RS0_RS_DISABLED);
 }
 
 static bool
-dma64_rxenabled(dma_info_t *di)
+dma64_rxenabled (dma_info_t * di)
 {
-       uint32 rc;
+  uint32 rc;
 
-       rc = R_REG(di->osh, &di->d64rxregs->control);
-       return ((rc != 0xffffffff) && (rc & D64_RC_RE));
+  rc = R_REG (di->osh, &di->d64rxregs->control);
+  return ((rc != 0xffffffff) && (rc & D64_RC_RE));
 }
 
 static bool
-dma64_txsuspendedidle(dma_info_t *di)
+dma64_txsuspendedidle (dma_info_t * di)
 {
 
-       if (di->ntxd == 0)
-               return TRUE;
+  if (di->ntxd == 0)
+    return TRUE;
 
-       if (!(R_REG(di->osh, &di->d64txregs->control) & D64_XC_SE))
-               return 0;
+  if (!(R_REG (di->osh, &di->d64txregs->control) & D64_XC_SE))
+    return 0;
 
-       if ((R_REG(di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK) == D64_XS0_XS_IDLE)
-               return 1;
+  if ((R_REG (di->osh, &di->d64txregs->status0) & D64_XS0_XS_MASK) ==
+      D64_XS0_XS_IDLE)
+    return 1;
 
-       return 0;
+  return 0;
 }
 
 
 /* !! tx entry routine */
 static int
-dma64_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 |= D64_CTRL1_SOF;
-               if (next == NULL)
-                       flags |= (D64_CTRL1_IOC | D64_CTRL1_EOF);
-               if (txout == (di->ntxd - 1))
-                       flags |= D64_CTRL1_EOT;
-
-               dma64_dd_upd(di, di->txd64, pa, txout, &flags, len);
-               ASSERT(di->txp[txout] == NULL);
-
-               txout = NEXTTXD(txout);
-       }
+dma64_txfast (dma_info_t * di, void *p0, bool commit)
+{
+  void *p, *next;
+  uchar *data;
+  uint len;
+  uint txout;
+  uint32 flags = 0;
+  uint32 pa;
 
-       /* if last txd eof not set, fix it */
-       if (!(flags & D64_CTRL1_EOF))
-               W_SM(&di->txd64[PREVTXD(txout)].ctrl1,
-                    BUS_SWAP32(flags | D64_CTRL1_IOC | D64_CTRL1_EOF));
+  DMA_TRACE (("%s: dma_txfast\n", di->name));
 
-       /* save the packet */
-       di->txp[PREVTXD(txout)] = p0;
+  txout = di->txout;
 
-       /* bump the tx descriptor index */
-       di->txout = 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);
 
-       /* kick the chip */
-       if (commit)
-               W_REG(di->osh, &di->d64txregs->ptr, I2B(txout, dma64dd_t));
+      /* return nonzero if out of tx descriptors */
+      if (NEXTTXD (txout) == di->txin)
+       goto outoftxd;
 
-       /* tx flow control */
-       di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
+      if (len == 0)
+       continue;
 
-       return (0);
+      /* get physical address of buffer start */
+      pa =
+       (uint32) DMA_MAP (di->osh, data, len, DMA_TX, p,
+                         &di->txp_dmah[txout]);
+
+      flags = 0;
+      if (p == p0)
+       flags |= D64_CTRL1_SOF;
+      if (next == NULL)
+       flags |= (D64_CTRL1_IOC | D64_CTRL1_EOF);
+      if (txout == (di->ntxd - 1))
+       flags |= D64_CTRL1_EOT;
+
+      dma64_dd_upd (di, di->txd64, pa, txout, &flags, len);
+      ASSERT (di->txp[txout] == NULL);
+
+      txout = NEXTTXD (txout);
+    }
+
+  /* if last txd eof not set, fix it */
+  if (!(flags & D64_CTRL1_EOF))
+    W_SM (&di->txd64[PREVTXD (txout)].ctrl1,
+         BUS_SWAP32 (flags | D64_CTRL1_IOC | D64_CTRL1_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->d64txregs->ptr, I2B (txout, dma64dd_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);
+  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);
 }
 
 /*
@@ -1685,209 +2061,221 @@ outoftxd:
  * regardless of the value of the hardware "curr" pointer.
  */
 static void *
-dma64_getnexttxp(dma_info_t *di, bool forceall)
+dma64_getnexttxp (dma_info_t * di, bool forceall)
 {
-       uint start, end, i;
-       void *txp;
+  uint start, end, i;
+  void *txp;
 
-       DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : ""));
+  DMA_TRACE (("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : ""));
 
-       if (di->ntxd == 0)
-               return (NULL);
+  if (di->ntxd == 0)
+    return (NULL);
 
-       txp = NULL;
+  txp = NULL;
 
-       start = di->txin;
-       if (forceall)
-               end = di->txout;
-       else
-               end = B2I(R_REG(di->osh, &di->d64txregs->status0) & D64_XS0_CD_MASK, dma64dd_t);
+  start = di->txin;
+  if (forceall)
+    end = di->txout;
+  else
+    end =
+      B2I (R_REG (di->osh, &di->d64txregs->status0) & D64_XS0_CD_MASK,
+          dma64dd_t);
 
-       if ((start == 0) && (end > di->txout))
-               goto bogus;
+  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->txd64[i].addrlow)) - di->dataoffsetlow),
-                         (BUS_SWAP32(R_SM(&di->txd64[i].ctrl2)) & D64_CTRL2_BC_MASK),
-                         DMA_TX, di->txp[i]);
+  for (i = start; i != end && !txp; i = NEXTTXD (i))
+    {
+      DMA_UNMAP (di->osh,
+                (BUS_SWAP32 (R_SM (&di->txd64[i].addrlow)) -
+                 di->dataoffsetlow),
+                (BUS_SWAP32 (R_SM (&di->txd64[i].ctrl2)) &
+                 D64_CTRL2_BC_MASK), DMA_TX, di->txp[i], &di->txp_dmah[i]);
 
-               W_SM(&di->txd64[i].addrlow, 0xdeadbeef);
-               W_SM(&di->txd64[i].addrhigh, 0xdeadbeef);
+      W_SM (&di->txd64[i].addrlow, 0xdeadbeef);
+      W_SM (&di->txd64[i].addrhigh, 0xdeadbeef);
 
-               txp = di->txp[i];
-               di->txp[i] = NULL;
-       }
+      txp = di->txp[i];
+      di->txp[i] = NULL;
+    }
 
-       di->txin = i;
+  di->txin = i;
 
-       /* tx flow control */
-       di->hnddma.txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1;
+  /* tx flow control */
+  di->hnddma.txavail = di->ntxd - NTXDACTIVE (di->txin, di->txout) - 1;
 
-       return (txp);
+  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);
+  return (NULL);
 }
 
 static void *
-dma64_getnextrxp(dma_info_t *di, bool forceall)
+dma64_getnextrxp (dma_info_t * di, bool forceall)
 {
-       uint i;
-       void *rxp;
+  uint i;
+  void *rxp;
 
-       /* if forcing, dma engine must be disabled */
-       ASSERT(!forceall || !dma64_rxenabled(di));
+  /* if forcing, dma engine must be disabled */
+  ASSERT (!forceall || !dma64_rxenabled (di));
 
-       i = di->rxin;
+  i = di->rxin;
 
-       /* return if no packets posted */
-       if (i == di->rxout)
-               return (NULL);
+  /* return if no packets posted */
+  if (i == di->rxout)
+    return (NULL);
 
-       /* ignore curr if forceall */
-       if (!forceall &&
-           (i == B2I(R_REG(di->osh, &di->d64rxregs->status0) & D64_RS0_CD_MASK, dma64dd_t)))
-               return (NULL);
+  /* ignore curr if forceall */
+  if (!forceall &&
+      (i ==
+       B2I (R_REG (di->osh, &di->d64rxregs->status0) & D64_RS0_CD_MASK,
+           dma64dd_t)))
+    return (NULL);
 
-       /* get the packet pointer that corresponds to the rx descriptor */
-       rxp = di->rxp[i];
-       ASSERT(rxp);
-       di->rxp[i] = 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->rxd64[i].addrlow)) - di->dataoffsetlow),
-                 di->rxbufsize, DMA_RX, rxp);
+  /* clear this packet from the descriptor ring */
+  DMA_UNMAP (di->osh,
+            (BUS_SWAP32 (R_SM (&di->rxd64[i].addrlow)) - di->dataoffsetlow),
+            di->rxbufsize, DMA_RX, rxp, &di->rxp_dmah[i]);
 
-       W_SM(&di->rxd64[i].addrlow, 0xdeadbeef);
-       W_SM(&di->rxd64[i].addrhigh, 0xdeadbeef);
+  W_SM (&di->rxd64[i].addrlow, 0xdeadbeef);
+  W_SM (&di->rxd64[i].addrhigh, 0xdeadbeef);
 
-       di->rxin = NEXTRXD(i);
+  di->rxin = NEXTRXD (i);
 
-       return (rxp);
+  return (rxp);
 }
 
 static bool
-_dma64_addrext(osl_t *osh, dma64regs_t *dma64regs)
+_dma64_addrext (osl_t * osh, dma64regs_t * dma64regs)
 {
-       uint32 w;
-       OR_REG(osh, &dma64regs->control, D64_XC_AE);
-       w = R_REG(osh, &dma64regs->control);
-       AND_REG(osh, &dma64regs->control, ~D64_XC_AE);
-       return ((w & D64_XC_AE) == D64_XC_AE);
+  uint32 w;
+  OR_REG (osh, &dma64regs->control, D64_XC_AE);
+  w = R_REG (osh, &dma64regs->control);
+  AND_REG (osh, &dma64regs->control, ~D64_XC_AE);
+  return ((w & D64_XC_AE) == D64_XC_AE);
 }
 
 /*
  * Rotate all active tx dma ring entries "forward" by (ActiveDescriptor - txin).
  */
 static void
-dma64_txrotate(dma_info_t *di)
+dma64_txrotate (dma_info_t * di)
 {
-       uint ad;
-       uint nactive;
-       uint rot;
-       uint old, new;
-       uint32 w;
-       uint first, last;
-
-       ASSERT(dma64_txsuspendedidle(di));
-
-       nactive = _dma_txactive(di);
-       ad = B2I((R_REG(di->osh, &di->d64txregs->status1) & D64_XS1_AD_MASK), dma64dd_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->txd64[old].ctrl1)) & ~D64_CTRL1_EOT;
-               if (new == (di->ntxd - 1))
-                       w |= D64_CTRL1_EOT;
-               W_SM(&di->txd64[new].ctrl1, BUS_SWAP32(w));
-
-               w = BUS_SWAP32(R_SM(&di->txd64[old].ctrl2));
-               W_SM(&di->txd64[new].ctrl2, BUS_SWAP32(w));
-
-               W_SM(&di->txd64[new].addrlow, R_SM(&di->txd64[old].addrlow));
-               W_SM(&di->txd64[new].addrhigh, R_SM(&di->txd64[old].addrhigh));
-
-               /* zap the old tx dma descriptor address field */
-               W_SM(&di->txd64[old].addrlow, BUS_SWAP32(0xdeadbeef));
-               W_SM(&di->txd64[old].addrhigh, 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->d64txregs->ptr, I2B(di->txout, dma64dd_t));
+  uint ad;
+  uint nactive;
+  uint rot;
+  uint old, new;
+  uint32 w;
+  uint first, last;
+
+  ASSERT (dma64_txsuspendedidle (di));
+
+  nactive = _dma_txactive (di);
+  ad =
+    B2I ((R_REG (di->osh, &di->d64txregs->status1) & D64_XS1_AD_MASK),
+        dma64dd_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->txd64[old].ctrl1)) & ~D64_CTRL1_EOT;
+      if (new == (di->ntxd - 1))
+       w |= D64_CTRL1_EOT;
+      W_SM (&di->txd64[new].ctrl1, BUS_SWAP32 (w));
+
+      w = BUS_SWAP32 (R_SM (&di->txd64[old].ctrl2));
+      W_SM (&di->txd64[new].ctrl2, BUS_SWAP32 (w));
+
+      W_SM (&di->txd64[new].addrlow, R_SM (&di->txd64[old].addrlow));
+      W_SM (&di->txd64[new].addrhigh, R_SM (&di->txd64[old].addrhigh));
+
+      /* zap the old tx dma descriptor address field */
+      W_SM (&di->txd64[old].addrlow, BUS_SWAP32 (0xdeadbeef));
+      W_SM (&di->txd64[old].addrhigh, 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->d64txregs->ptr, I2B (di->txout, dma64dd_t));
 }
 
-#endif /* BCMDMA64 */
+#endif /* BCMDMA64 */
 
 uint
-dma_addrwidth(sb_t *sbh, void *dmaregs)
-{
-       dma32regs_t *dma32regs;
-       osl_t *osh;
-
-       osh = sb_osh(sbh);
-
-       if (DMA64_CAP) {
-               /* DMA engine is 64-bit capable */
-               if (((sb_coreflagshi(sbh, 0, 0) & SBTMH_DMA64) == SBTMH_DMA64)) {
-                       /* backplane are 64 bits capable */
-#if 0
-                       if (sb_backplane64(sbh))
-                               /* If bus is System Backplane or PCIE then we can access 64-bits */
-                               if ((BUSTYPE(sbh->bustype) == SB_BUS) ||
-                                   ((BUSTYPE(sbh->bustype) == PCI_BUS) &&
-                                       sbh->buscoretype == SB_PCIE))
-                                       return (DMADDRWIDTH_64);
-#endif
-
-                       /* DMA64 is always 32 bits capable, AE is always TRUE */
+dma_addrwidth (sb_t * sbh, void *dmaregs)
+{
+  dma32regs_t *dma32regs;
+  osl_t *osh;
+
+  osh = sb_osh (sbh);
+
+  if (DMA64_CAP)
+    {
+      /* DMA engine is 64-bit capable */
+      if (((sb_coreflagshi (sbh, 0, 0) & SBTMH_DMA64) == SBTMH_DMA64))
+       {
+         /* backplane are 64 bits capable */
+         if (sb_backplane64 (sbh))
+           /* If bus is System Backplane or PCIE then we can access 64-bits */
+           if ((BUSTYPE (sbh->bustype) == SB_BUS) ||
+               ((BUSTYPE (sbh->bustype) == PCI_BUS) &&
+                sbh->buscoretype == SB_PCIE))
+             return (DMADDRWIDTH_64);
+
+         /* DMA64 is always 32 bits capable, AE is always TRUE */
 #ifdef BCMDMA64
-                       ASSERT(_dma64_addrext(osh, (dma64regs_t *)dmaregs));
+         ASSERT (_dma64_addrext (osh, (dma64regs_t *) dmaregs));
 #endif
-                       return (DMADDRWIDTH_32);
-               }
+         return (DMADDRWIDTH_32);
        }
+    }
 
-       /* Start checking for 32-bit / 30-bit addressing */
-       dma32regs = (dma32regs_t *)dmaregs;
+  /* 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);
+  /* 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);
+  /* Fallthru */
+  return (DMADDRWIDTH_30);
 }
index de74c06..8d1b5ac 100644 (file)
@@ -2,14 +2,14 @@
  * Generic Broadcom Home Networking Division (HND) DMA engine SW interface
  * This supports the following chips: BCM42xx, 44xx, 47xx .
  *
- * Copyright 2006, Broadcom Corporation
+ * Copyright 2007, 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 $
+ * $Id$
  */
 
 #ifndef        _hnddma_h_
@@ -39,7 +39,7 @@ 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        uintptr (*di_getvar_t)(hnddma_t *dmah, const 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);
@@ -141,8 +141,12 @@ extern hnddma_t * dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx,
 #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))
+#ifdef BCMDBG
+#define dma_dump(di, buf, dumpring)    ((di)->di_fn.dump(di, buf, dumpring))
+#define dma_dumptx(di, buf, dumpring)  ((di)->di_fn.dumptx(di, buf, dumpring))
+#define dma_dumprx(di, buf, dumpring)  ((di)->di_fn.dumprx(di, buf, dumpring))
+#endif
 
-#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
index 24fd77d..cc55eb6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Linux OS Independent Layer
  *
- * Copyright 2006, Broadcom Corporation
+ * Copyright 2007, Broadcom Corporation
  * All Rights Reserved.
  * 
  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
  * 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 $
+ * $Id$
  */
 
 #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 "bcmutils.h"
 #include <linux/delay.h>
 #ifdef mips
 #include <asm/paccess.h>
 #endif /* mips */
 #include <pcicfg.h>
 
-#define PCI_CFG_RETRY          10      
+#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];
+#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 */
+#if 0
+struct osl_info
+{
+  osl_pubinfo_t pub;
+  uint magic;
+  void *pdev;
+  uint malloced;
+  uint failed;
+  uint bustype;
+  bcm_mem_link_t *dbgmem_list;
+#ifdef BCMDBG_PKT              /* pkt logging for debugging */
+  pktlist_info_t pktlist;
+#endif                         /* BCMDBG_PKT */
+};
+#endif
+
+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 */
+  -EINVAL                      /* BCME_VERSION */
+/* When an new error code is added to bcmutils.h, add os 
+ * spcecific error translation here as well
+ */
+/* check if BCME_LAST changed since the last time this function was updated */
+#if BCME_LAST != -37
+#error "You need to add a OS error translation in the linuxbcmerrormap \
+       for new error code defined in bcmuitls.h"
+#endif /* BCME_LAST != -37 */
 };
 
 /* translate bcmerrors into linux errors */
 int
-osl_error(int bcmerror)
+osl_error (int bcmerror)
 {
-       int abs_bcmerror;
-       int array_size = ARRAYSIZE(linuxbcmerrormap);
+  if (bcmerror > 0)
+    bcmerror = 0;
+  else if (bcmerror < BCME_LAST)
+    bcmerror = BCME_ERROR;
 
-       abs_bcmerror = ABS(bcmerror);
+  /* Array bounds covered by ASSERT in osl_attach */
+  return linuxbcmerrormap[-bcmerror];
+}
 
-       if (bcmerror > 0)
-               abs_bcmerror = 0;
+osl_t *
+osl_attach (void *pdev, uint bustype, bool pkttag)
+{
+  osl_t *osh;
+
+  osh = kmalloc (sizeof (osl_t), GFP_ATOMIC);
+  ASSERT (osh);
+
+  bzero (osh, sizeof (osl_t));
+
+  /* Check that error map has the right number of entries in it */
+  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;
+  osh->bustype = bustype;
+
+  switch (bustype)
+    {
+    case PCI_BUS:
+    case SB_BUS:
+    case PCMCIA_BUS:
+      osh->pub.mmbus = TRUE;
+      break;
+    case JTAG_BUS:
+    case SDIO_BUS:
+      break;
+    default:
+      ASSERT (FALSE);
+      break;
+    }
+
+#ifdef BCMDBG
+  if (pkttag)
+    {
+      struct sk_buff *skb;
+      ASSERT (OSL_PKTTAG_SZ <= sizeof (skb->cb));
+    }
+#endif
+  return osh;
+}
 
-       else if (abs_bcmerror >= array_size)
-               abs_bcmerror = BCME_ERROR;
+void
+osl_detach (osl_t * osh)
+{
+  if (osh == NULL)
+    return;
 
-       return linuxbcmerrormap[abs_bcmerror];
+  ASSERT (osh->magic == OS_HANDLE_MAGIC);
+  kfree (osh);
 }
 
-osl_t *
-osl_attach(void *pdev, bool pkttag)
+/* Return a new packet. zero out pkttag */
+void *
+osl_pktget (osl_t * osh, uint len)
+{
+  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, bool send)
+{
+  struct sk_buff *skb, *nskb;
+
+  skb = (struct sk_buff *) p;
+
+  if (send && osh->pub.tx_fn)
+    osh->pub.tx_fn (osh->pub.tx_ctx, p, 0);
+
+  /* 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;
+    }
+}
+
+uint32
+osl_pci_read_config (osl_t * osh, uint offset, uint size)
 {
-       osl_t *osh;
+  uint val;
+  uint retry = PCI_CFG_RETRY;
 
-       osh = kmalloc(sizeof(osl_t), GFP_ATOMIC);
-       ASSERT(osh);
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-       bzero(osh, sizeof(osl_t));
+  /* only 4byte access supported */
+  ASSERT (size == 4);
 
-       /*
-        * 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));
+  do
+    {
+      pci_read_config_dword (osh->pdev, offset, &val);
+      if (val != 0xffffffff)
+       break;
+    }
+  while (retry--);
 
-       osh->magic = OS_HANDLE_MAGIC;
-       osh->malloced = 0;
-       osh->failed = 0;
-       osh->dbgmem_list = NULL;
-       osh->pdev = pdev;
-       osh->pub.pkttag = pkttag;
+#ifdef BCMDBG
+  if (retry < PCI_CFG_RETRY)
+    printk ("PCI CONFIG READ access to %d required %d retries\n", offset,
+           (PCI_CFG_RETRY - retry));
+#endif /* BCMDBG */
 
-       return osh;
+  return (val);
 }
 
 void
-osl_detach(osl_t *osh)
+osl_pci_write_config (osl_t * osh, uint offset, uint size, uint val)
 {
-       if (osh == NULL)
-               return;
+  uint retry = PCI_CFG_RETRY;
+
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+
+  /* only 4byte access supported */
+  ASSERT (size == 4);
+
+  do
+    {
+      pci_write_config_dword (osh->pdev, offset, val);
+      if (offset != PCI_BAR0_WIN)
+       break;
+      if (osl_pci_read_config (osh, offset, size) == val)
+       break;
+    }
+  while (retry--);
+
+#ifdef BCMDBG
+  if (retry < PCI_CFG_RETRY)
+    printk ("PCI CONFIG WRITE access to %d required %d retries\n", offset,
+           (PCI_CFG_RETRY - retry));
+#endif /* BCMDBG */
+}
 
-       ASSERT(osh->magic == OS_HANDLE_MAGIC);
-       kfree(osh);
+/* return bus # for the pci device pointed by osh->pdev */
+uint
+osl_pci_bus (osl_t * osh)
+{
+  ASSERT (osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev);
+
+  return ((struct pci_dev *) osh->pdev)->bus->number;
 }
 
-/* Return a new packet. zero out pkttag */
-void*
-osl_pktget(osl_t *osh, uint len, bool send)
+/* return slot # for the pci device pointed by osh->pdev */
+uint
+osl_pci_slot (osl_t * osh)
 {
-       struct sk_buff *skb;
+  ASSERT (osh && (osh->magic == OS_HANDLE_MAGIC) && osh->pdev);
 
-       if ((skb = dev_alloc_skb(len))) {
-               skb_put(skb, len);
-               skb->priority = 0;
+  return PCI_SLOT (((struct pci_dev *) osh->pdev)->devfn);
+}
 
-#ifdef BCMDBG_PKT
-       pktlist_add(&(osh->pktlist), (void *) skb);
-#endif  /* BCMDBG_PKT */
+static void
+osl_pcmcia_attr (osl_t * osh, uint offset, char *buf, int size, bool write)
+{
+}
 
-               osh->pub.pktalloced++;
-       }
+void
+osl_pcmcia_read_attr (osl_t * osh, uint offset, void *buf, int size)
+{
+  osl_pcmcia_attr (osh, offset, (char *) buf, size, FALSE);
+}
+
+void
+osl_pcmcia_write_attr (osl_t * osh, uint offset, void *buf, int size)
+{
+  osl_pcmcia_attr (osh, offset, (char *) buf, size, TRUE);
+}
+
+
+#ifdef BCMDBG_MEM
+
+void *
+osl_debug_malloc (osl_t * osh, uint size, int line, char *file)
+{
+  bcm_mem_link_t *p;
+  char *basename;
+
+  ASSERT (size);
 
-       return ((void*) skb);
+  if ((p =
+       (bcm_mem_link_t *) osl_malloc (osh,
+                                     sizeof (bcm_mem_link_t) + size)) ==
+      NULL)
+    return (NULL);
+
+  p->size = size;
+  p->line = line;
+
+  basename = strrchr (file, '/');
+  /* skip the '/' */
+  if (basename)
+    basename++;
+
+  if (!basename)
+    basename = file;
+
+  strncpy (p->file, basename, BCM_MEM_FILENAME_LEN);
+  p->file[BCM_MEM_FILENAME_LEN - 1] = '\0';
+
+  /* link this block */
+  p->prev = NULL;
+  p->next = osh->dbgmem_list;
+  if (p->next)
+    p->next->prev = p;
+  osh->dbgmem_list = p;
+
+  return p + 1;
 }
 
-typedef void (*pktfree_cb_fn_t)(void *ctx, void *pkt, uint16 status);
-/* Free the driver packet. Free the tag if present */
 void
-osl_pktfree(osl_t *osh, void *p, bool send)
+osl_debug_mfree (osl_t * osh, void *addr, uint size, int line, char *file)
 {
-       struct sk_buff *skb, *nskb;
-       pktfree_cb_fn_t tx_fn = osh->pub.tx_fn;
+  bcm_mem_link_t *p =
+    (bcm_mem_link_t *) ((int8 *) addr - sizeof (bcm_mem_link_t));
+
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+
+  if (p->size == 0)
+    {
+      printk
+       ("osl_debug_mfree: double free on addr %p size %d at line %d file %s\n",
+        addr, size, line, file);
+      ASSERT (p->size);
+      return;
+    }
+
+  if (p->size != size)
+    {
+      printk
+       ("osl_debug_mfree: dealloc size %d does not match alloc size %d on addr %p"
+        " at line %d file %s\n", size, p->size, addr, line, file);
+      ASSERT (p->size == size);
+      return;
+    }
+
+  /* unlink this block */
+  if (p->prev)
+    p->prev->next = p->next;
+  if (p->next)
+    p->next->prev = p->prev;
+  if (osh->dbgmem_list == p)
+    osh->dbgmem_list = p->next;
+  p->next = p->prev = NULL;
+
+  osl_mfree (osh, p, size + sizeof (bcm_mem_link_t));
+}
 
-       skb = (struct sk_buff*) p;
-       
-       if (send && tx_fn)
-               tx_fn(osh->pub.tx_ctx, p, 0);
+int
+osl_debug_memdump (osl_t * osh, struct bcmstrbuf *b)
+{
+  bcm_mem_link_t *p;
 
-       /* perversion: we use skb->next to chain multi-skb packets */
-       while (skb) {
-               nskb = skb->next;
-               skb->next = NULL;
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-#ifdef BCMDBG_PKT
-               pktlist_remove(&(osh->pktlist), (void *) skb);
-#endif  /* BCMDBG_PKT */
+  bcm_bprintf (b, "   Address\tSize\tFile:line\n");
+  for (p = osh->dbgmem_list; p; p = p->next)
+    bcm_bprintf (b, "0x%08x\t%5d\t%s:%d\n",
+                (uintptr) p + sizeof (bcm_mem_link_t), p->size, p->file,
+                p->line);
 
-               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);
-               }
+  return 0;
+}
 
-               osh->pub.pktalloced--;
+#endif /* BCMDBG_MEM */
 
-               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_malloc(osl_t *osh, uint size)
+void
+osl_mfree (osl_t * osh, void *addr, uint size)
 {
-       void *addr;
+  if (osh)
+    {
+      ASSERT (osh->magic == OS_HANDLE_MAGIC);
+      osh->malloced -= size;
+    }
+  kfree (addr);
+}
 
-       /* only ASSERT if osh is defined */
-       if (osh)
-               ASSERT(osh->magic == OS_HANDLE_MAGIC);
+uint
+osl_malloced (osl_t * osh)
+{
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+  return (osh->malloced);
+}
 
-       if ((addr = kmalloc(size, GFP_ATOMIC)) == NULL) {
-               if (osh)
-                       osh->failed++;
-               return (NULL);
-       }
-       if (osh)
-               osh->malloced += size;
+uint
+osl_malloc_failed (osl_t * osh)
+{
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+  return (osh->failed);
+}
+
+void *
+osl_dma_alloc_consistent (osl_t * osh, uint size, ulong * pap)
+{
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-       return (addr);
+  return (pci_alloc_consistent (osh->pdev, size, (dma_addr_t *) pap));
 }
 
 void
-osl_mfree(osl_t *osh, void *addr, uint size)
+osl_dma_free_consistent (osl_t * osh, void *va, uint size, ulong pa)
 {
-       if (osh) {
-               ASSERT(osh->magic == OS_HANDLE_MAGIC);
-               osh->malloced -= size;
-       }
-       kfree(addr);
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+
+  pci_free_consistent (osh->pdev, size, va, (dma_addr_t) pa);
 }
 
 uint
-osl_malloced(osl_t *osh)
+osl_dma_map (osl_t * osh, void *va, uint size, int direction)
 {
-       ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
-       return (osh->malloced);
+  int dir;
+
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+  dir = (direction == DMA_TX) ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE;
+  return (pci_map_single (osh->pdev, va, size, dir));
 }
 
-uint osl_malloc_failed(osl_t *osh)
+void
+osl_dma_unmap (osl_t * osh, uint pa, uint size, int direction)
 {
-       ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
-       return (osh->failed);
+  int dir;
+
+  ASSERT ((osh && (osh->magic == OS_HANDLE_MAGIC)));
+  dir = (direction == DMA_TX) ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE;
+  pci_unmap_single (osh->pdev, (uint32) pa, size, dir);
 }
 
-#undef osl_delay
+#if defined(BINOSL) || defined(BCMDBG_ASSERT)
 void
-osl_delay(uint usec)
+osl_assert (char *exp, char *file, int line)
 {
-       OSL_DELAY(usec);
+  char tempbuf[255];
+
+  sprintf (tempbuf, "assertion \"%s\" failed: file \"%s\", line %d\n", exp,
+          file, line);
+  panic (tempbuf);
+}
+#endif /* BCMDBG_ASSERT || BINOSL */
+
+void
+osl_delay (uint usec)
+{
+  uint d;
+
+  while (usec > 0)
+    {
+      d = MIN (usec, 1000);
+      udelay (d);
+      usec -= d;
+    }
 }
 
 /* Clone a packet.
  * The pkttag contents are NOT cloned.
  */
 void *
-osl_pktdup(osl_t *osh, void *skb)
+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++;
+#ifdef BCMDBG_PKT
+  pktlist_add (&(osh->pktlist), (void *) p);
+#endif /* BCMDBG_PKT */
+  return (p);
+}
+
+uint
+osl_pktalloced (osl_t * osh)
+{
+  return (osh->pub.pktalloced);
+}
+
+#ifdef BCMDBG_PKT
+char *
+osl_pktlist_dump (osl_t * osh, char *buf)
+{
+  pktlist_dump (&(osh->pktlist), buf);
+  return buf;
+}
+
+void
+osl_pktlist_add (osl_t * osh, void *p)
+{
+  pktlist_add (&(osh->pktlist), p);
+}
+
+void
+osl_pktlist_remove (osl_t * osh, void *p)
+{
+  pktlist_remove (&(osh->pktlist), p);
+}
+#endif /* BCMDBG_PKT */
+
+/*
+ * BINOSL selects the slightly slower function-call-based binary compatible osl.
+ */
+#ifdef BINOSL
+
+int
+osl_printf (const char *format, ...)
+{
+  va_list args;
+  char buf[1024];
+  int len;
+
+  /* sprintf into a local buffer because there *is* no "vprintk()".. */
+  va_start (args, format);
+  len = vsnprintf (buf, 1024, format, args);
+  va_end (args);
+
+  if (len > sizeof (buf))
+    {
+      printk ("osl_printf: buffer overrun\n");
+      return (0);
+    }
+
+  return (printk (buf));
+}
+
+int
+osl_sprintf (char *buf, const char *format, ...)
+{
+  va_list args;
+  int rc;
+
+  va_start (args, format);
+  rc = vsprintf (buf, format, args);
+  va_end (args);
+  return (rc);
+}
+
+int
+osl_strcmp (const char *s1, const char *s2)
+{
+  return (strcmp (s1, s2));
+}
+
+int
+osl_strncmp (const char *s1, const char *s2, uint n)
+{
+  return (strncmp (s1, s2, n));
+}
+
+int
+osl_strlen (const char *s)
+{
+  return (strlen (s));
+}
+
+char *
+osl_strcpy (char *d, const char *s)
+{
+  return (strcpy (d, s));
+}
+
+char *
+osl_strncpy (char *d, const char *s, uint n)
+{
+  return (strncpy (d, s, n));
+}
+
+void
+bcopy (const void *src, void *dst, int len)
+{
+  memcpy (dst, src, len);
+}
+
+int
+bcmp (const void *b1, const void *b2, int len)
+{
+  return (memcmp (b1, b2, len));
+}
+
+void
+bzero (void *b, int len)
+{
+  memset (b, '\0', len);
+}
+
+uint32
+osl_readl (volatile uint32 * r)
+{
+  return (readl (r));
+}
+
+uint16
+osl_readw (volatile uint16 * r)
+{
+  return (readw (r));
+}
+
+uint8
+osl_readb (volatile uint8 * r)
+{
+  return (readb (r));
+}
+
+void
+osl_writel (uint32 v, volatile uint32 * r)
+{
+  writel (v, r);
+}
+
+void
+osl_writew (uint16 v, volatile uint16 * r)
+{
+  writew (v, r);
+}
+
+void
+osl_writeb (uint8 v, volatile uint8 * r)
+{
+  writeb (v, r);
+}
+
+void *
+osl_uncached (void *va)
+{
+#ifdef mips
+  return ((void *) KSEG1ADDR (va));
+#else
+  return ((void *) va);
+#endif /* mips */
+}
+
+uint
+osl_getcycles (void)
 {
-       void * p;
+  uint cycles;
+
+#if defined(mips)
+  cycles = read_c0_count () * 2;
+#elif defined(__i386__)
+  rdtscl (cycles);
+#else
+  cycles = 0;
+#endif /* defined(mips) */
+  return cycles;
+}
 
-       if ((p = skb_clone((struct sk_buff*)skb, GFP_ATOMIC)) == NULL)
-               return NULL;
+void *
+osl_reg_map (uint32 pa, uint size)
+{
+  return (ioremap_nocache ((unsigned long) pa, (unsigned long) size));
+}
 
-       /* skb_clone copies skb->cb.. we don't want that */
-       if (osh->pub.pkttag)
-               bzero((void*)((struct sk_buff *)p)->cb, OSL_PKTTAG_SZ);
+void
+osl_reg_unmap (void *va)
+{
+  iounmap (va);
+}
 
-       /* Increment the packet counter */
-       osh->pub.pktalloced++;
-       return (p);
+int
+osl_busprobe (uint32 * val, uint32 addr)
+{
+#ifdef mips
+  return get_dbe (*val, (uint32 *) addr);
+#else
+  *val = readl ((uint32 *) (uintptr) addr);
+  return 0;
+#endif /* mips */
+}
+
+bool
+osl_pktshared (void *skb)
+{
+  return (((struct sk_buff *) skb)->cloned);
+}
+
+uchar *
+osl_pktdata (osl_t * osh, void *skb)
+{
+  return (((struct sk_buff *) skb)->data);
 }
 
 uint
-osl_pktalloced(osl_t *osh)
+osl_pktlen (osl_t * osh, void *skb)
+{
+  return (((struct sk_buff *) skb)->len);
+}
+
+uint
+osl_pktheadroom (osl_t * osh, void *skb)
+{
+  return (uint) skb_headroom ((struct sk_buff *) skb);
+}
+
+uint
+osl_pkttailroom (osl_t * osh, void *skb)
+{
+  return (uint) skb_tailroom ((struct sk_buff *) skb);
+}
+
+void *
+osl_pktnext (osl_t * osh, void *skb)
+{
+  return (((struct sk_buff *) skb)->next);
+}
+
+void
+osl_pktsetnext (void *skb, void *x)
+{
+  ((struct sk_buff *) skb)->next = (struct sk_buff *) x;
+}
+
+void
+osl_pktsetlen (osl_t * osh, void *skb, uint len)
+{
+  __skb_trim ((struct sk_buff *) skb, len);
+}
+
+uchar *
+osl_pktpush (osl_t * osh, void *skb, int bytes)
+{
+  return (skb_push ((struct sk_buff *) skb, bytes));
+}
+
+uchar *
+osl_pktpull (osl_t * osh, void *skb, int bytes)
+{
+  return (skb_pull ((struct sk_buff *) skb, bytes));
+}
+
+void *
+osl_pkttag (void *skb)
 {
-       return (osh->pub.pktalloced);
+  return ((void *) (((struct sk_buff *) skb)->cb));
+}
+
+void *
+osl_pktlink (void *skb)
+{
+  return (((struct sk_buff *) skb)->prev);
+}
+
+void
+osl_pktsetlink (void *skb, void *x)
+{
+  ((struct sk_buff *) skb)->prev = (struct sk_buff *) x;
+}
+
+uint
+osl_pktprio (void *skb)
+{
+  return (((struct sk_buff *) skb)->priority);
+}
+
+void
+osl_pktsetprio (void *skb, uint x)
+{
+  ((struct sk_buff *) skb)->priority = x;
+}
+
+/* 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
+ */
+struct sk_buff *
+osl_pkt_tonative (osl_t * osh, void *pkt)
+{
+  struct sk_buff *nskb;
+
+  if (osh->pub.pkttag)
+    bzero ((void *) ((struct sk_buff *) pkt)->cb, OSL_PKTTAG_SZ);
+
+  /* Decrement the packet counter */
+  for (nskb = (struct sk_buff *) pkt; nskb; nskb = nskb->next)
+    {
+#ifdef BCMDBG_PKT
+      pktlist_remove (&(osh->pktlist), (void *) nskb);
+#endif /* BCMDBG_PKT */
+      osh->pub.pktalloced--;
+    }
+
+  return (struct sk_buff *) pkt;
+}
+
+/* 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
+ */
+void *
+osl_pkt_frmnative (osl_t * osh, struct sk_buff *skb)
+{
+  struct sk_buff *nskb;
+
+  if (osh->pub.pkttag)
+    bzero ((void *) skb->cb, OSL_PKTTAG_SZ);
+
+  /* Increment the packet counter */
+  for (nskb = skb; nskb; nskb = nskb->next)
+    {
+#ifdef BCMDBG_PKT
+      pktlist_add (&(osh->pktlist), (void *) nskb);
+#endif /* BCMDBG_PKT */
+      osh->pub.pktalloced++;
+    }
+
+  return (void *) skb;
 }
 
+#endif /* BINOSL */
index d9c5533..f65c859 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Linux OS Independent Layer
  *
- * Copyright 2006, Broadcom Corporation
+ * Copyright 2007, Broadcom Corporation
  * All Rights Reserved.
  * 
  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
@@ -9,7 +9,7 @@
  * 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 $
+ * $Id$
  */
 
 #ifndef _linux_osl_h_
 #include <linuxver.h>
 #include <osl.h>
 
-#define OSL_PKTTAG_SZ     32 /* Size of PktTag */
+#define OSL_PKTTAG_SZ      32 /* Size of PktTag */
 
-/* osl handle type forward declaration */
-typedef struct osl_dmainfo osldma_t;
+/* microsecond delay */
+extern void osl_delay(uint usec);
 
 /* OSL initialization */
-extern osl_t *osl_attach(void *pdev, bool pkttag);
+extern osl_t *osl_attach(void *pdev, uint bustype, bool pkttag);
 extern void osl_detach(osl_t *osh);
 
+#define PKTFREESETCB(osh, _tx_fn, _tx_ctx) \
+       do { \
+          ((osl_pubinfo_t*)osh)->tx_fn = _tx_fn; \
+          ((osl_pubinfo_t*)osh)->tx_ctx = _tx_ctx; \
+       } while (0)
+
 /* 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);
@@ -37,61 +45,110 @@ 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)
+/* allocate/free shared (dma-able) consistent memory */
 #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));
-}
+extern void *osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap);
+extern void osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa);
 
-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);
-}
+/* map/unmap direction */
+#define        DMA_TX  1       /* TX direction for DMA */
+#define        DMA_RX  2       /* RX direction for DMA */
+
+/* map/unmap shared (dma-able) memory */
+#define        DMA_MAP(osh, va, size, direction, p, dmah) \
+       osl_dma_map((osh), (va), (size), (direction))
+#define        DMA_UNMAP(osh, pa, size, direction, p, dmah) \
+       osl_dma_unmap((osh), (pa), (size), (direction))
+extern uint osl_dma_map(osl_t *osh, void *va, uint size, int direction);
+extern void osl_dma_unmap(osl_t *osh, uint pa, uint size, int direction);
 
+/* API for DMA addressing capability */
+#define OSL_DMADDRWIDTH(osh, addrwidth) do {} while (0)
 
 /* 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) */
+#define OSL_WRITE_REG(osh, r, v) (bcmjtag_write(NULL, (uintptr)(r), (v), sizeof(*(r))))
+#define OSL_READ_REG(osh, r) (bcmjtag_read(NULL, (uintptr)(r), sizeof(*(r))))
+#endif
+
+#if defined(BCMJTAG)
+#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) if (((osl_pubinfo_t*)(osh))->mmbus) \
+       mmap_op else bus_op
+#define SELECT_BUS_READ(osh, mmap_op, bus_op) (((osl_pubinfo_t*)(osh))->mmbus) ? \
+       mmap_op : bus_op
+#else
+#define SELECT_BUS_WRITE(osh, mmap_op, bus_op) mmap_op
+#define SELECT_BUS_READ(osh, mmap_op, bus_op) mmap_op
+#endif 
+
+/*
+ * BINOSL selects the slightly slower function-call-based binary compatible osl.
+ * Macros expand to calls to functions defined in linux_osl.c .
+ */
+#ifndef BINOSL
+
+/* string library, kernel mode */
+#ifndef printf
+#define        printf(fmt, args...)    printk(fmt, ## args)
+#endif /* printf */
+#include <linux/kernel.h>
+#include <linux/string.h>
+
+/* register access macros */
+#define        AND_REG(osh, r, v)              W_REG(osh, (r), R_REG(osh, r) & (v))
+#define        OR_REG(osh, r, v)               W_REG(osh, (r), R_REG(osh, r) | (v))
+
+/* bcopy, bcmp, and bzero */
+#define        bcopy(src, dst, len)    memcpy((dst), (src), (len))
+#define        bcmp(b1, b2, len)       memcmp((b1), (b2), (len))
+#define        bzero(b, len)           memset((b), '\0', (len))
+
+/* uncached virtual address */
+#ifdef mips
+#define OSL_UNCACHED(va)       KSEG1ADDR((va))
+#include <asm/addrspace.h>
+#else
+#define OSL_UNCACHED(va)       (va)
+#endif /* mips */
+
+/* get processor cycle count */
+#if defined(mips)
+#define        OSL_GETCYCLES(x)        ((x) = read_c0_count() * 2)
+#elif defined(__i386__)
+#define        OSL_GETCYCLES(x)        rdtscl((x))
+#else
+#define OSL_GETCYCLES(x)       ((x) = 0)
+#endif /* defined(mips) */
+
+/* dereference an address that may cause a bus exception */
+#ifdef mips
+#if defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 17))
+#define BUSPROBE(val, addr)    panic("get_dbe() will not fixup a bus exception when compiled into"\
+                                       " a module")
+#else
+#define        BUSPROBE(val, addr)     get_dbe((val), (addr))
+#include <asm/paccess.h>
+#endif /* defined(MODULE) && (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 17)) */
+#else
+#define        BUSPROBE(val, addr)     ({ (val) = R_REG(NULL, (addr)); 0; })
+#endif /* mips */
+
+/* map/unmap physical to virtual I/O */
+#define        REG_MAP(pa, size)       ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
+#define        REG_UNMAP(va)           iounmap((void *)(va))
+
+/* shared (dma-able) memory access macros */
+#define        R_SM(r)                 *(r)
+#define        W_SM(r, v)              (*(r) = (v))
+#define        BZERO_SM(r, len)        memset((r), '\0', (len))
 
 /* packet primitives */
-#define        PKTGET(osh, len, send)          osl_pktget((osh), (len), (send))
+#define        PKTGET(osh, len, send)          osl_pktget((osh), (len))
 #define        PKTFREE(osh, skb, send)         osl_pktfree((osh), (skb), (send))
 #define        PKTDATA(osh, skb)               (((struct sk_buff*)(skb))->data)
 #define        PKTLEN(osh, skb)                (((struct sk_buff*)(skb))->len)
@@ -104,15 +161,25 @@ osl_dma_free_consistent(osl_t *osh, void *va, uint size, ulong pa)
 #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 PKTALLOCED(osh)                        ((osl_pubinfo_t *)(osh))->pktalloced
+#ifdef BCMDBG_PKT     /* pkt logging for debugging */
+#define PKTLIST_DUMP(osh, buf)                 osl_pktlist_dump(osh, buf)
+#else /* BCMDBG_PKT */
 #define PKTLIST_DUMP(osh, buf)
+#endif /* BCMDBG_PKT */
+
+#ifdef BCMDBG_PKT     /* pkt logging for debugging */
+extern void osl_pktlist_add(osl_t *osh, void *p);
+extern void osl_pktlist_remove(osl_t *osh, void *p);
+extern char *osl_pktlist_dump(osl_t *osh, char *buf);
+#endif /* BCMDBG_PKT */
 
 /* 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(osl_pubinfo_t*osh, struct sk_buff *skb)
+osl_pkt_frmnative(osl_pubinfo_t *osh, struct sk_buff *skb)
 {
        struct sk_buff *nskb;
 
@@ -121,13 +188,15 @@ osl_pkt_frmnative(osl_pubinfo_t*osh, struct sk_buff *skb)
 
        /* Increment the packet counter */
        for (nskb = skb; nskb; nskb = nskb->next) {
+#ifdef BCMDBG_PKT
+               osl_pktlist_add((osl_t *)osh, (void *) nskb);
+#endif  /* BCMDBG_PKT */
                osh->pktalloced++;
        }
 
        return (void *)skb;
 }
-#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_pubinfo_t*)osh), \
-                                                       (struct sk_buff*)(skb))
+#define PKTFRMNATIVE(osh, skb) osl_pkt_frmnative(((osl_pubinfo_t *)osh), (struct sk_buff*)(skb))
 
 /* Convert a driver packet to native(OS) packet
  * In the process, packettag is zeroed out before sending up
@@ -135,7 +204,7 @@ osl_pkt_frmnative(osl_pubinfo_t*osh, struct sk_buff *skb)
  * In our case, that means it should be 0
  */
 static INLINE struct sk_buff *
-osl_pkt_tonative(osl_pubinfo_t*osh, void *pkt)
+osl_pkt_tonative(osl_pubinfo_t *osh, void *pkt)
 {
        struct sk_buff *nskb;
 
@@ -144,24 +213,167 @@ osl_pkt_tonative(osl_pubinfo_t*osh, void *pkt)
 
        /* Decrement the packet counter */
        for (nskb = (struct sk_buff *)pkt; nskb; nskb = nskb->next) {
+#ifdef BCMDBG_PKT
+               osl_pktlist_remove((osl_t *)osh, (void *) nskb);
+#endif  /* BCMDBG_PKT */
                osh->pktalloced--;
        }
 
        return (struct sk_buff *)pkt;
 }
-#define PKTTONATIVE(osh, pkt)          osl_pkt_tonative((osl_pubinfo_t*)(osh), (pkt))
+#define PKTTONATIVE(osh, pkt)          osl_pkt_tonative((osl_pubinfo_t *)(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 PKTSUMNEEDED(skb)              (((struct sk_buff*)(skb))->ip_summed == CHECKSUM_HW)
+#define PKTSETSUMGOOD(skb, x)          (((struct sk_buff*)(skb))->ip_summed = \
+                                               ((x) ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE))
+/* PKTSETSUMNEEDED and PKTSUMGOOD are not possible because skb->ip_summed is overloaded */
 #define PKTSHARED(skb)                  (((struct sk_buff*)(skb))->cloned)
 
-extern void *osl_pktget(osl_t *osh, uint len, bool send);
+extern void *osl_pktget(osl_t *osh, uint len);
+extern void osl_pktfree(osl_t *osh, void *skb, bool send);
+extern void *osl_pktdup(osl_t *osh, void *skb);
+#else  /* BINOSL */
+
+/* string library */
+#ifndef LINUX_OSL
+#undef printf
+#define        printf(fmt, args...)            osl_printf((fmt), ## args)
+#undef sprintf
+#define sprintf(buf, fmt, args...)     osl_sprintf((buf), (fmt), ## args)
+#undef strcmp
+#define        strcmp(s1, s2)                  osl_strcmp((s1), (s2))
+#undef strncmp
+#define        strncmp(s1, s2, n)              osl_strncmp((s1), (s2), (n))
+#undef strlen
+#define strlen(s)         &nb