staging: brcm80211: renamed utility module related files
authorRoland Vossen <rvossen@broadcom.com>
Wed, 1 Jun 2011 11:45:52 +0000 (13:45 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 7 Jun 2011 19:43:27 +0000 (12:43 -0700)
Code cleanup.

Signed-off-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
42 files changed:
drivers/staging/brcm80211/Makefile
drivers/staging/brcm80211/brcmfmac/bcmsdh.c
drivers/staging/brcm80211/brcmfmac/bcmsdh_linux.c
drivers/staging/brcm80211/brcmfmac/bcmsdh_sdmmc.c
drivers/staging/brcm80211/brcmfmac/bcmsdh_sdmmc_linux.c
drivers/staging/brcm80211/brcmfmac/dhd_cdc.c
drivers/staging/brcm80211/brcmfmac/dhd_common.c
drivers/staging/brcm80211/brcmfmac/dhd_custom_gpio.c
drivers/staging/brcm80211/brcmfmac/dhd_linux.c
drivers/staging/brcm80211/brcmfmac/dhd_sdio.c
drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c
drivers/staging/brcm80211/brcmfmac/wl_iw.c
drivers/staging/brcm80211/brcmsmac/aiutils.c
drivers/staging/brcm80211/brcmsmac/bcmotp.c
drivers/staging/brcm80211/brcmsmac/bcmsrom.c
drivers/staging/brcm80211/brcmsmac/brcms_mac80211.c
drivers/staging/brcm80211/brcmsmac/dma.c
drivers/staging/brcm80211/brcmsmac/nicpci.c
drivers/staging/brcm80211/brcmsmac/nvram.c
drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_hal.h
drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_int.h
drivers/staging/brcm80211/brcmsmac/wlc_alloc.c
drivers/staging/brcm80211/brcmsmac/wlc_ampdu.c
drivers/staging/brcm80211/brcmsmac/wlc_antsel.c
drivers/staging/brcm80211/brcmsmac/wlc_bmac.c
drivers/staging/brcm80211/brcmsmac/wlc_channel.c
drivers/staging/brcm80211/brcmsmac/wlc_main.c
drivers/staging/brcm80211/brcmsmac/wlc_phy_shim.c
drivers/staging/brcm80211/brcmsmac/wlc_pmu.c
drivers/staging/brcm80211/brcmsmac/wlc_pub.h
drivers/staging/brcm80211/brcmsmac/wlc_rate.c
drivers/staging/brcm80211/brcmsmac/wlc_stf.c
drivers/staging/brcm80211/brcmutil/Makefile [new file with mode: 0644]
drivers/staging/brcm80211/brcmutil/utils.c [new file with mode: 0644]
drivers/staging/brcm80211/brcmutil/wifi.c [new file with mode: 0644]
drivers/staging/brcm80211/include/bcmutils.h [deleted file]
drivers/staging/brcm80211/include/bcmwifi.h [deleted file]
drivers/staging/brcm80211/include/brcmu_utils.h [new file with mode: 0644]
drivers/staging/brcm80211/include/brcmu_wifi.h [new file with mode: 0644]
drivers/staging/brcm80211/util/Makefile [deleted file]
drivers/staging/brcm80211/util/bcmutils.c [deleted file]
drivers/staging/brcm80211/util/bcmwifi.c [deleted file]

index e7b3f27847cf179d0601e5c7d483dce3a6d4ff51..db9a57e4607a7cfac61a6a45f2331516f55dc1e9 100644 (file)
@@ -19,6 +19,6 @@
 subdir-ccflags-y                                       := -DBCMDMA32
 subdir-ccflags-$(CONFIG_BRCMDBG)       += -DBCMDBG -DBCMDBG_ASSERT
 
-obj-$(CONFIG_BRCMUTIL) += util/
+obj-$(CONFIG_BRCMUTIL) += brcmutil/
 obj-$(CONFIG_BRCMFMAC) += brcmfmac/
 obj-$(CONFIG_BRCMSMAC) += brcmsmac/
index 14c07e602ee37c6c63f0d17319a08599e3cd07a8..352ba4bafda3bbfa39da394c164c60e56a14b7e4 100644 (file)
@@ -21,8 +21,8 @@
 #include <linux/sched.h>
 #include <bcmdefs.h>
 #include <bcmdevs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 #include <bcmsoc.h>
 
 #include <bcmsdh.h>            /* BRCM API for SDIO
index c0b9330aa4c424ac6a9dae0c3837383d5ec90e22..e7638f4eca37cf531e09f8917764f86e2a563e5a 100644 (file)
@@ -27,8 +27,8 @@
 
 #include <bcmdefs.h>
 #include <bcmdevs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 
 #if defined(OOB_INTR_ONLY)
 #include <linux/irq.h>
index 1b15704257a96428924c2c5b52469e3c2d2bfefa..8dadfb662bf431dfeb8c2cb3365d31322f5183b0 100644 (file)
@@ -18,8 +18,8 @@
 #include <linux/mmc/sdio.h>
 #include <bcmdefs.h>
 #include <bcmdevs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 #include <bcmsdbus.h>          /* bcmsdh to/from specific controller APIs */
 #include <sdiovar.h>           /* ioctl/iovars */
 
index fbc9abd73799c00845fb2be01b633fc4329a1b66..e1b2592023314a3064c27b5ebe02f12fd48b3973 100644 (file)
@@ -18,8 +18,8 @@
 #include <linux/netdevice.h>
 #include <net/cfg80211.h>
 #include <bcmdefs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 #include <bcmsdbus.h>          /* bcmsdh to/from specific controller APIs */
 #include <sdiovar.h>           /* to get msglevel bit values */
 
index 759e899ba3c566b77c5ae276cc3569df56210d32..dd872f4d1b0f7d17239f13bb7b3b44680e1611a9 100644 (file)
@@ -19,8 +19,8 @@
 #include <linux/sched.h>
 #include <bcmdefs.h>
 
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 
 #include <dngl_stats.h>
 #include <dhd.h>
index 5b0554d94206ab52adb4ad6339716c05f060f289..a8504bb2a5175d297ff4ddd1c647f56d154116ab 100644 (file)
 #include <linux/string.h>
 #include <linux/sched.h>
 #include <bcmdefs.h>
-#include <bcmwifi.h>
+#include <brcmu_wifi.h>
 #include <linux/netdevice.h>
 #include <asm/unaligned.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <dngl_stats.h>
 #include <dhd.h>
 #include <dhd_bus.h>
index a9423337654701ad1ca872cd969dd950b3c0b230..831f32447e390b6cf287b4220f240beee7c10a28 100644 (file)
@@ -16,9 +16,9 @@
 
 #include <linux/netdevice.h>
 #include <linux/sched.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmdefs.h>
-#include <bcmwifi.h>
+#include <brcmu_wifi.h>
 
 #include <dngl_stats.h>
 #include <dhd.h>
index 7f1cf8b421a03ec3aa4ab82272b83ca457986d20..adcf82daee9839e9a05197dc970e2c57f493ed7e 100644 (file)
@@ -33,8 +33,8 @@
 #include <linux/uaccess.h>
 #include <net/cfg80211.h>
 #include <bcmdefs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 
 #include <dngl_stats.h>
 #include <dhd.h>
index cc3e47da3ba04fa64ba259383d0b94f68bb0608f..75393e765fce0deb511ae8040e85f5b80662b13c 100644 (file)
@@ -26,8 +26,8 @@
 #include <bcmsdh.h>
 
 #include <bcmdefs.h>
-#include <bcmwifi.h>
-#include <bcmutils.h>
+#include <brcmu_wifi.h>
+#include <brcmu_utils.h>
 #include <bcmdevs.h>
 
 #include <bcmsoc.h>
index 13a643417560fdffdc6feac1862acad74335f52c..38453cfa42adf077cd1cf83f8d7e3e00f9a4fb3d 100644 (file)
@@ -18,9 +18,9 @@
 #include <linux/if_arp.h>
 #include <linux/sched.h>
 
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmdefs.h>
-#include <bcmwifi.h>
+#include <brcmu_wifi.h>
 
 #include <asm/uaccess.h>
 
index 99a49f97ced30b354b1dd18f07fa78ea58459935..f5725ec7842b1c917499693950f09e57b00304d1 100644 (file)
@@ -21,8 +21,8 @@
 #include <linux/etherdevice.h>
 #include <linux/wireless.h>
 
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 
 #include <linux/if_arp.h>
 #include <asm/uaccess.h>
index d57908b08acd98e1417272ff44bba83079addf45..b00cda9c583b01da64cb0488097c75570e207e11 100644 (file)
@@ -20,7 +20,7 @@
 #include <bcmdefs.h>
 #include <linux/module.h>
 #include <linux/pci.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
 #include <bcmsoc.h>
 #include <chipcommon.h>
index cca64e4f2a6290103347a79a54012126b327aee3..4a0deecbfaf67bc44f01f5dd765af5c77a72d503 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <bcmdefs.h>
 #include <bcmdevs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
 #include <bcmsoc.h>
 #include <chipcommon.h>
index 59098b0885194db9225aafd564b09381551b48b0..70b7ab7c3a23b7b5a4ce5d5ba467cc6ff32156eb 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/pci.h>
 #include <stdarg.h>
 #include "wlc_types.h"
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmsoc.h>
 #include <chipcommon.h>
 #include <bcmdevs.h>
index 71acc4ef77e060f3fd7cd3f702079208290feb64..509cf2b2003585c766b22237590b4fcdf5090dfc 100644 (file)
@@ -26,8 +26,8 @@
 #include <linux/firmware.h>
 #include <net/mac80211.h>
 #include <bcmdefs.h>
-#include <bcmwifi.h>
-#include <bcmutils.h>
+#include <brcmu_wifi.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include <nicpci.h>
 #include "bcmdma.h"
index ad389bca4e55c2c11a40a35328d746c0842402e6..183baf88b05d386bb5d4ec9c6aea8bbce9163554 100644 (file)
@@ -21,7 +21,7 @@
 #include <bcmdefs.h>
 #include <bcmdevs.h>
 #include <bcmsoc.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
 
 #include "wlc_types.h"
index 8a956f5f26eee1f3e48ad08896f537e224754ec9..868fba2656ae5939ff5e0160b655a4559060593b 100644 (file)
@@ -18,7 +18,7 @@
 #include <linux/string.h>
 #include <linux/pci.h>
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include <aiutils.h>
 #include <bcmsoc.h>
index 5cef837d69108f8e5601f0c258edf80290d30edc..3509469214db6175e8dbce00ae73e4eb9e76f612 100644 (file)
@@ -17,7 +17,7 @@
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include <chipcommon.h>
 #include <bcmdevs.h>
index 6d4473c5a56bf331d8f5eabb506864e25db738ac..6488cdfb65ae6d93df42dc25c1066e8cc62d8e55 100644 (file)
@@ -25,7 +25,7 @@
 #include <d11.h>
 #include <wlc_phy_shim.h>
 #include <net/mac80211.h>      /* struct wiphy */
-#include "bcmwifi.h"           /* chanspec_t */
+#include "brcmu_wifi.h"                /* chanspec_t */
 
 #define        IDCODE_VER_MASK         0x0000000f
 #define        IDCODE_VER_SHIFT        0
index 43d0fe14f243af5d77d5e18bd7ddede1511fb0b7..3ee29f0be4957bccd2c5c1f3b81785d468c81b1e 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <linux/kernel.h>
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 
 #include <wlc_phy_hal.h>
 
index 619247a862507d302903ef8b10f024096e69ff6b..77caf067df49d2efb69a5446bd26311b89284612 100644 (file)
@@ -17,7 +17,7 @@
 #include <linux/types.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
 #include "bcmdma.h"
 
index e1920ae3adbaff69bd84d534b19125f54aaad5fa..36684512fe90596ed0371e887d9028b568fd246e 100644 (file)
@@ -17,7 +17,7 @@
 #include <net/mac80211.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
 #include "bcmdma.h"
 #include <bcmdma.h>
index ea27b66c56e6b1bc3d998b65b304710377a17888..10b9b7985e255646eac8be554fe38b4caf40b053 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/pci.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include <aiutils.h>
 #include <bcmdevs.h>
index fdd10efbfe9ea7be8c9cb1eb27c3f18b0f4d77ea..d23dd11c904c085116fe3ce8add24e6ff2c12f60 100644 (file)
 
 #include <bcmdefs.h>
 #include <bcmdevs.h>
-#include <bcmwifi.h>
+#include <brcmu_wifi.h>
 #include <aiutils.h>
 #include <bcmsrom.h>
 #include <bcmotp.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include <chipcommon.h>
 #include <nicpci.h>
index ac84ddcd6aa3e3f4a4d0ab02b067523efed7b08b..c4fcb441eed464104be94a174aeaf36d31ef6a6a 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/pci.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include <aiutils.h>
 #include "bcmdma.h"
index 1e79031c1ea4f3cdb7c874c61bb8b2464534ce80..752f0d18aaab449cf4abae124311f4dbf2cc8449 100644 (file)
@@ -21,8 +21,8 @@
 
 #include <bcmdefs.h>
 #include <bcmdevs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 #include <bcmnvram.h>
 #include <aiutils.h>
 #include <bcmsrom.h>
index d33f7200a20e85c5a974f8802de3d00f581c5935..2745743b5e8caf4ca121572ae62e2588b6a7bc45 100644 (file)
@@ -25,8 +25,8 @@
 #include <linux/module.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
 #include <aiutils.h>
 #include <chipcommon.h>
 #include "bcmdma.h"
index 047cd1adc798c7adc74d5251267e7b1d0c8fd246..9a99186e7af8a10c54ed546397e874a510c014db 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <bcmdevs.h>
 #include <chipcommon.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <bcmnvram.h>
 #include "wlc_pmu.h"
 
index de324408ddb2a13781b1acf1d718c3c55c7d4fd6..8536efedf1b89271c82615a1123888e02bdc2cea 100644 (file)
@@ -18,7 +18,7 @@
 #define _wlc_pub_h_
 
 #include "wlc_types.h"         /* forward structure declarations */
-#include "bcmwifi.h"           /* for chanspec_t */
+#include "brcmu_wifi.h"                /* for chanspec_t */
 
 #define        WLC_NUMRATES    16      /* max # of rates in a rateset */
 #define        MAXMULTILIST    32      /* max # multicast addresses */
index 88aa134ad67aefde877acc1bd76a10a1c87390c8..3625c72b25dedd5e45a8529775c81efaf4efd34d 100644 (file)
@@ -17,7 +17,7 @@
 #include <linux/module.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
 #include "bcmdma.h"
 
index b7191af0669787bb5587b162b1b9ee345f28c9c4..41c1f96acb42bbc07025a895100a0114c3637ef7 100644 (file)
@@ -18,9 +18,9 @@
 #include <linux/module.h>
 
 #include <bcmdefs.h>
-#include <bcmutils.h>
+#include <brcmu_utils.h>
 #include <aiutils.h>
-#include <bcmwifi.h>
+#include <brcmu_wifi.h>
 #include <bcmnvram.h>
 #include "bcmdma.h"
 
diff --git a/drivers/staging/brcm80211/brcmutil/Makefile b/drivers/staging/brcm80211/brcmutil/Makefile
new file mode 100644 (file)
index 0000000..6403423
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# Makefile fragment for Broadcom 802.11n Networking Device Driver Utilities
+#
+# Copyright (c) 2011 Broadcom Corporation
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ccflags-y :=                           \
+       -Idrivers/staging/brcm80211/brcmutil \
+       -Idrivers/staging/brcm80211/include
+
+BRCMUTIL_OFILES := \
+       utils.o \
+       wifi.o
+
+MODULEPFX := brcmutil
+
+obj-$(CONFIG_BRCMUTIL) += $(MODULEPFX).o
+$(MODULEPFX)-objs      = $(BRCMUTIL_OFILES)
diff --git a/drivers/staging/brcm80211/brcmutil/utils.c b/drivers/staging/brcm80211/brcmutil/utils.c
new file mode 100644 (file)
index 0000000..d259e26
--- /dev/null
@@ -0,0 +1,797 @@
+/*
+ * Copyright (c) 2010 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <linux/ctype.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/netdevice.h>
+#include <linux/sched.h>
+#include <linux/printk.h>
+#include <bcmdefs.h>
+#include <stdarg.h>
+#include <brcmu_utils.h>
+#include <bcmdevs.h>
+
+MODULE_AUTHOR("Broadcom Corporation");
+MODULE_DESCRIPTION("Broadcom 802.11n wireless LAN driver utilities.");
+MODULE_SUPPORTED_DEVICE("Broadcom 802.11n WLAN cards");
+MODULE_LICENSE("Dual BSD/GPL");
+
+struct sk_buff *brcmu_pkt_buf_get_skb(uint len)
+{
+       struct sk_buff *skb;
+
+       skb = dev_alloc_skb(len);
+       if (skb) {
+               skb_put(skb, len);
+               skb->priority = 0;
+       }
+
+       return skb;
+}
+EXPORT_SYMBOL(brcmu_pkt_buf_get_skb);
+
+/* Free the driver packet. Free the tag if present */
+void brcmu_pkt_buf_free_skb(struct sk_buff *skb)
+{
+       struct sk_buff *nskb;
+       int nest = 0;
+
+       /* perversion: we use skb->next to chain multi-skb packets */
+       while (skb) {
+               nskb = skb->next;
+               skb->next = NULL;
+
+               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);
+
+               nest++;
+               skb = nskb;
+       }
+}
+EXPORT_SYMBOL(brcmu_pkt_buf_free_skb);
+
+
+/* copy a buffer into a pkt buffer chain */
+uint brcmu_pktfrombuf(struct sk_buff *p, uint offset, int len,
+               unsigned char *buf)
+{
+       uint n, ret = 0;
+
+       /* skip 'offset' bytes */
+       for (; p && offset; p = p->next) {
+               if (offset < (uint) (p->len))
+                       break;
+               offset -= p->len;
+       }
+
+       if (!p)
+               return 0;
+
+       /* copy the data */
+       for (; p && len; p = p->next) {
+               n = min((uint) (p->len) - offset, (uint) len);
+               memcpy(p->data + offset, buf, n);
+               buf += n;
+               len -= n;
+               ret += n;
+               offset = 0;
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(brcmu_pktfrombuf);
+
+/* return total length of buffer chain */
+uint brcmu_pkttotlen(struct sk_buff *p)
+{
+       uint total;
+
+       total = 0;
+       for (; p; p = p->next)
+               total += p->len;
+       return total;
+}
+EXPORT_SYMBOL(brcmu_pkttotlen);
+
+/*
+ * osl multiple-precedence packet queue
+ * hi_prec is always >= the number of the highest non-empty precedence
+ */
+struct sk_buff *brcmu_pktq_penq(struct pktq *pq, int prec,
+                                     struct sk_buff *p)
+{
+       struct pktq_prec *q;
+
+       if (pktq_full(pq) || pktq_pfull(pq, prec))
+               return NULL;
+
+       q = &pq->q[prec];
+
+       if (q->head)
+               q->tail->prev = p;
+       else
+               q->head = p;
+
+       q->tail = p;
+       q->len++;
+
+       pq->len++;
+
+       if (pq->hi_prec < prec)
+               pq->hi_prec = (u8) prec;
+
+       return p;
+}
+EXPORT_SYMBOL(brcmu_pktq_penq);
+
+struct sk_buff *brcmu_pktq_penq_head(struct pktq *pq, int prec,
+                                          struct sk_buff *p)
+{
+       struct pktq_prec *q;
+
+       if (pktq_full(pq) || pktq_pfull(pq, prec))
+               return NULL;
+
+       q = &pq->q[prec];
+
+       if (q->head == NULL)
+               q->tail = p;
+
+       p->prev = q->head;
+       q->head = p;
+       q->len++;
+
+       pq->len++;
+
+       if (pq->hi_prec < prec)
+               pq->hi_prec = (u8) prec;
+
+       return p;
+}
+EXPORT_SYMBOL(brcmu_pktq_penq_head);
+
+struct sk_buff *brcmu_pktq_pdeq(struct pktq *pq, int prec)
+{
+       struct pktq_prec *q;
+       struct sk_buff *p;
+
+       q = &pq->q[prec];
+
+       p = q->head;
+       if (p == NULL)
+               return NULL;
+
+       q->head = p->prev;
+       if (q->head == NULL)
+               q->tail = NULL;
+
+       q->len--;
+
+       pq->len--;
+
+       p->prev = NULL;
+
+       return p;
+}
+EXPORT_SYMBOL(brcmu_pktq_pdeq);
+
+struct sk_buff *brcmu_pktq_pdeq_tail(struct pktq *pq, int prec)
+{
+       struct pktq_prec *q;
+       struct sk_buff *p, *prev;
+
+       q = &pq->q[prec];
+
+       p = q->head;
+       if (p == NULL)
+               return NULL;
+
+       for (prev = NULL; p != q->tail; p = p->prev)
+               prev = p;
+
+       if (prev)
+               prev->prev = NULL;
+       else
+               q->head = NULL;
+
+       q->tail = prev;
+       q->len--;
+
+       pq->len--;
+
+       return p;
+}
+EXPORT_SYMBOL(brcmu_pktq_pdeq_tail);
+
+void
+brcmu_pktq_pflush(struct pktq *pq, int prec, bool dir,
+           ifpkt_cb_t fn, void *arg)
+{
+       struct pktq_prec *q;
+       struct sk_buff *p, *prev = NULL;
+
+       q = &pq->q[prec];
+       p = q->head;
+       while (p) {
+               if (fn == NULL || (*fn) (p, arg)) {
+                       bool head = (p == q->head);
+                       if (head)
+                               q->head = p->prev;
+                       else
+                               prev->prev = p->prev;
+                       p->prev = NULL;
+                       brcmu_pkt_buf_free_skb(p);
+                       q->len--;
+                       pq->len--;
+                       p = (head ? q->head : prev->prev);
+               } else {
+                       prev = p;
+                       p = p->prev;
+               }
+       }
+
+       if (q->head == NULL) {
+               q->tail = NULL;
+       }
+}
+EXPORT_SYMBOL(brcmu_pktq_pflush);
+
+void brcmu_pktq_flush(struct pktq *pq, bool dir,
+               ifpkt_cb_t fn, void *arg)
+{
+       int prec;
+       for (prec = 0; prec < pq->num_prec; prec++)
+               brcmu_pktq_pflush(pq, prec, dir, fn, arg);
+}
+EXPORT_SYMBOL(brcmu_pktq_flush);
+
+void brcmu_pktq_init(struct pktq *pq, int num_prec, int max_len)
+{
+       int prec;
+
+       /* pq is variable size; only zero out what's requested */
+       memset(pq, 0,
+             offsetof(struct pktq, q) + (sizeof(struct pktq_prec) * num_prec));
+
+       pq->num_prec = (u16) num_prec;
+
+       pq->max = (u16) max_len;
+
+       for (prec = 0; prec < num_prec; prec++)
+               pq->q[prec].max = pq->max;
+}
+EXPORT_SYMBOL(brcmu_pktq_init);
+
+struct sk_buff *brcmu_pktq_peek_tail(struct pktq *pq, int *prec_out)
+{
+       int prec;
+
+       if (pq->len == 0)
+               return NULL;
+
+       for (prec = 0; prec < pq->hi_prec; prec++)
+               if (pq->q[prec].head)
+                       break;
+
+       if (prec_out)
+               *prec_out = prec;
+
+       return pq->q[prec].tail;
+}
+EXPORT_SYMBOL(brcmu_pktq_peek_tail);
+
+/* Return sum of lengths of a specific set of precedences */
+int brcmu_pktq_mlen(struct pktq *pq, uint prec_bmp)
+{
+       int prec, len;
+
+       len = 0;
+
+       for (prec = 0; prec <= pq->hi_prec; prec++)
+               if (prec_bmp & (1 << prec))
+                       len += pq->q[prec].len;
+
+       return len;
+}
+EXPORT_SYMBOL(brcmu_pktq_mlen);
+
+/* Priority dequeue from a specific set of precedences */
+struct sk_buff *brcmu_pktq_mdeq(struct pktq *pq, uint prec_bmp,
+                                     int *prec_out)
+{
+       struct pktq_prec *q;
+       struct sk_buff *p;
+       int prec;
+
+       if (pq->len == 0)
+               return NULL;
+
+       while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
+               pq->hi_prec--;
+
+       while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL)
+               if (prec-- == 0)
+                       return NULL;
+
+       q = &pq->q[prec];
+
+       p = q->head;
+       if (p == NULL)
+               return NULL;
+
+       q->head = p->prev;
+       if (q->head == NULL)
+               q->tail = NULL;
+
+       q->len--;
+
+       if (prec_out)
+               *prec_out = prec;
+
+       pq->len--;
+
+       p->prev = NULL;
+
+       return p;
+}
+EXPORT_SYMBOL(brcmu_pktq_mdeq);
+
+/* parse a xx:xx:xx:xx:xx:xx format ethernet address */
+int brcmu_ether_atoe(char *p, u8 *ea)
+{
+       int i = 0;
+
+       for (;;) {
+               ea[i++] = (char)simple_strtoul(p, &p, 16);
+               if (!*p++ || i == 6)
+                       break;
+       }
+
+       return i == 6;
+}
+EXPORT_SYMBOL(brcmu_ether_atoe);
+
+#if defined(BCMDBG)
+/* pretty hex print a pkt buffer chain */
+void brcmu_prpkt(const char *msg, struct sk_buff *p0)
+{
+       struct sk_buff *p;
+
+       if (msg && (msg[0] != '\0'))
+               printk(KERN_DEBUG "%s:\n", msg);
+
+       for (p = p0; p; p = p->next)
+               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, p->data, p->len);
+}
+EXPORT_SYMBOL(brcmu_prpkt);
+#endif                         /* defined(BCMDBG) */
+
+/* iovar table lookup */
+const struct brcmu_iovar *brcmu_iovar_lookup(const struct brcmu_iovar *table,
+                                       const char *name)
+{
+       const struct brcmu_iovar *vi;
+       const char *lookup_name;
+
+       /* skip any ':' delimited option prefixes */
+       lookup_name = strrchr(name, ':');
+       if (lookup_name != NULL)
+               lookup_name++;
+       else
+               lookup_name = name;
+
+       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 */
+}
+EXPORT_SYMBOL(brcmu_iovar_lookup);
+
+int brcmu_iovar_lencheck(const struct brcmu_iovar *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 s32 sized args at the ioctl interface */
+               if (len < (int)sizeof(int)) {
+                       bcmerror = -EOVERFLOW;
+               }
+               break;
+
+       case IOVT_BUFFER:
+               /* buffer must meet minimum length requirement */
+               if (len < vi->minlen) {
+                       bcmerror = -EOVERFLOW;
+               }
+               break;
+
+       case IOVT_VOID:
+               if (!set) {
+                       /* Cannot return nil... */
+                       bcmerror = -ENOTSUPP;
+               } else if (len) {
+                       /* Set is an action w/o parameters */
+                       bcmerror = -ENOBUFS;
+               }
+               break;
+
+       default:
+               /* unknown type for length check in iovar info */
+               bcmerror = -ENOTSUPP;
+       }
+
+       return bcmerror;
+}
+EXPORT_SYMBOL(brcmu_iovar_lencheck);
+
+/*******************************************************************************
+ * 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 u8 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
+};
+
+u8 brcmu_crc8(u8 *pdata,       /* pointer to array of data to process */
+                        uint nbytes,   /* number of input data bytes to process */
+                        u8 crc /* either CRC8_INIT_VALUE or previous return value */
+    ) {
+       /* loop over the buffer data */
+       while (nbytes-- > 0)
+               crc = crc8_table[(crc ^ *pdata++) & 0xff];
+
+       return crc;
+}
+EXPORT_SYMBOL(brcmu_crc8);
+
+/*
+ * 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
+ */
+struct brcmu_tlv *brcmu_parse_tlvs(void *buf, int buflen, uint key)
+{
+       struct brcmu_tlv *elt;
+       int totlen;
+
+       elt = (struct brcmu_tlv *) buf;
+       totlen = buflen;
+
+       /* find tagged parameter */
+       while (totlen >= 2) {
+               int len = elt->len;
+
+               /* validate remaining totlen */
+               if ((elt->id == key) && (totlen >= (len + 2)))
+                       return elt;
+
+               elt = (struct brcmu_tlv *) ((u8 *) elt + (len + 2));
+               totlen -= (len + 2);
+       }
+
+       return NULL;
+}
+EXPORT_SYMBOL(brcmu_parse_tlvs);
+
+
+#if defined(BCMDBG)
+int
+brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags, char *buf,
+                  int len)
+{
+       int i;
+       char *p = buf;
+       char hexstr[16];
+       int slen = 0, nlen = 0;
+       u32 bit;
+       const char *name;
+
+       if (len < 2 || !buf)
+               return 0;
+
+       buf[0] = '\0';
+
+       for (i = 0; flags != 0; i++) {
+               bit = bd[i].bit;
+               name = bd[i].name;
+               if (bit == 0 && flags != 0) {
+                       /* print any unnamed bits */
+                       snprintf(hexstr, 16, "0x%X", flags);
+                       name = hexstr;
+                       flags = 0;      /* exit loop */
+               } else if ((flags & bit) == 0)
+                       continue;
+               flags &= ~bit;
+               nlen = strlen(name);
+               slen += nlen;
+               /* count btwn flag space */
+               if (flags != 0)
+                       slen += 1;
+               /* need NULL char as well */
+               if (len <= slen)
+                       break;
+               /* copy NULL char but don't count it */
+               strncpy(p, name, nlen + 1);
+               p += nlen;
+               /* copy btwn flag space and NULL char */
+               if (flags != 0)
+                       p += snprintf(p, 2, " ");
+               len -= slen;
+       }
+
+       /* indicate the str was too short */
+       if (flags != 0) {
+               if (len < 2)
+                       p -= 2 - len;   /* overwrite last char */
+               p += snprintf(p, 2, ">");
+       }
+
+       return (int)(p - buf);
+}
+EXPORT_SYMBOL(brcmu_format_flags);
+
+/* print bytes formatted as hex to a string. return the resulting string length */
+int brcmu_format_hex(char *str, const void *bytes, int len)
+{
+       int i;
+       char *p = str;
+       const u8 *src = (const u8 *)bytes;
+
+       for (i = 0; i < len; i++) {
+               p += snprintf(p, 3, "%02X", *src);
+               src++;
+       }
+       return (int)(p - str);
+}
+EXPORT_SYMBOL(brcmu_format_hex);
+#endif                         /* defined(BCMDBG) */
+
+char *brcmu_chipname(uint chipid, char *buf, uint len)
+{
+       const char *fmt;
+
+       fmt = ((chipid > 0xa000) || (chipid < 0x4000)) ? "%d" : "%x";
+       snprintf(buf, len, fmt, chipid);
+       return buf;
+}
+EXPORT_SYMBOL(brcmu_chipname);
+
+uint brcmu_mkiovar(char *name, char *data, uint datalen, char *buf, uint buflen)
+{
+       uint len;
+
+       len = strlen(name) + 1;
+
+       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;
+}
+EXPORT_SYMBOL(brcmu_mkiovar);
+
+/* 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 u16.
+ */
+
+#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 u16 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
+};
+
+u16 brcmu_qdbm_to_mw(u8 qdbm)
+{
+       uint factor = 1;
+       int idx = qdbm - QDBM_OFFSET;
+
+       if (idx >= QDBM_TABLE_LEN) {
+               /* clamp to max u16 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;
+}
+EXPORT_SYMBOL(brcmu_qdbm_to_mw);
+
+u8 brcmu_mw_to_qdbm(u16 mw)
+{
+       u8 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 += (u8) offset;
+
+       return qdbm;
+}
+EXPORT_SYMBOL(brcmu_mw_to_qdbm);
+
+uint brcmu_bitcount(u8 *bitmap, uint length)
+{
+       uint bitcount = 0, i;
+       u8 tmp;
+       for (i = 0; i < length; i++) {
+               tmp = bitmap[i];
+               while (tmp) {
+                       bitcount++;
+                       tmp &= (tmp - 1);
+               }
+       }
+       return bitcount;
+}
+EXPORT_SYMBOL(brcmu_bitcount);
+
+/* Initialization of brcmu_strbuf structure */
+void brcmu_binit(struct brcmu_strbuf *b, char *buf, uint size)
+{
+       b->origsize = b->size = size;
+       b->origbuf = b->buf = buf;
+}
+EXPORT_SYMBOL(brcmu_binit);
+
+/* Buffer sprintf wrapper to guard against buffer overflow */
+int brcmu_bprintf(struct brcmu_strbuf *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,
+        * stdlib 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;
+}
+EXPORT_SYMBOL(brcmu_bprintf);
diff --git a/drivers/staging/brcm80211/brcmutil/wifi.c b/drivers/staging/brcm80211/brcmutil/wifi.c
new file mode 100644 (file)
index 0000000..2a3db0a
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2010 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <linux/ctype.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <bcmdefs.h>
+#include <brcmu_utils.h>
+#include <brcmu_wifi.h>
+
+/*
+ * Verify the chanspec is using a legal set of parameters, i.e. that the
+ * chanspec specified a band, bw, ctl_sb and channel and that the
+ * combination could be legal given any set of circumstances.
+ * RETURNS: true is the chanspec is malformed, false if it looks good.
+ */
+bool brcmu_chspec_malformed(chanspec_t chanspec)
+{
+       /* must be 2G or 5G band */
+       if (!CHSPEC_IS5G(chanspec) && !CHSPEC_IS2G(chanspec))
+               return true;
+       /* must be 20 or 40 bandwidth */
+       if (!CHSPEC_IS40(chanspec) && !CHSPEC_IS20(chanspec))
+               return true;
+
+       /* 20MHZ b/w must have no ctl sb, 40 must have a ctl sb */
+       if (CHSPEC_IS20(chanspec)) {
+               if (!CHSPEC_SB_NONE(chanspec))
+                       return true;
+       } else {
+               if (!CHSPEC_SB_UPPER(chanspec) && !CHSPEC_SB_LOWER(chanspec))
+                       return true;
+       }
+
+       return false;
+}
+EXPORT_SYMBOL(brcmu_chspec_malformed);
+
+/*
+ * This function returns the channel number that control traffic is being sent on, for legacy
+ * channels this is just the channel number, for 40MHZ channels it is the upper or lowre 20MHZ
+ * sideband depending on the chanspec selected
+ */
+u8 brcmu_chspec_ctlchan(chanspec_t chspec)
+{
+       u8 ctl_chan;
+
+       /* Is there a sideband ? */
+       if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_NONE) {
+               return CHSPEC_CHANNEL(chspec);
+       } else {
+               /* we only support 40MHZ with sidebands */
+               /* chanspec channel holds the centre frequency, use that and the
+                * side band information to reconstruct the control channel number
+                */
+               if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_UPPER) {
+                       /* control chan is the upper 20 MHZ SB of the 40MHZ channel */
+                       ctl_chan = UPPER_20_SB(CHSPEC_CHANNEL(chspec));
+               } else {
+                       /* control chan is the lower 20 MHZ SB of the 40MHZ channel */
+                       ctl_chan = LOWER_20_SB(CHSPEC_CHANNEL(chspec));
+               }
+       }
+
+       return ctl_chan;
+}
+EXPORT_SYMBOL(brcmu_chspec_ctlchan);
+
+/*
+ * Return the channel number for a given frequency and base frequency.
+ * The returned channel number is relative to the given base frequency.
+ * If the given base frequency is zero, a base frequency of 5 GHz is assumed for
+ * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz.
+ *
+ * Frequency is specified in MHz.
+ * The base frequency is specified as (start_factor * 500 kHz).
+ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
+ * 2.4 GHz and 5 GHz bands.
+ *
+ * The returned channel will be in the range [1, 14] in the 2.4 GHz band
+ * and [0, 200] otherwise.
+ * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the
+ * frequency is not a 2.4 GHz channel, or if the frequency is not and even
+ * multiple of 5 MHz from the base frequency to the base plus 1 GHz.
+ *
+ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
+ */
+int brcmu_mhz2channel(uint freq, uint start_factor)
+{
+       int ch = -1;
+       uint base;
+       int offset;
+
+       /* take the default channel start frequency */
+       if (start_factor == 0) {
+               if (freq >= 2400 && freq <= 2500)
+                       start_factor = WF_CHAN_FACTOR_2_4_G;
+               else if (freq >= 5000 && freq <= 6000)
+                       start_factor = WF_CHAN_FACTOR_5_G;
+       }
+
+       if (freq == 2484 && start_factor == WF_CHAN_FACTOR_2_4_G)
+               return 14;
+
+       base = start_factor / 2;
+
+       /* check that the frequency is in 1GHz range of the base */
+       if ((freq < base) || (freq > base + 1000))
+               return -1;
+
+       offset = freq - base;
+       ch = offset / 5;
+
+       /* check that frequency is a 5MHz multiple from the base */
+       if (offset != (ch * 5))
+               return -1;
+
+       /* restricted channel range check for 2.4G */
+       if (start_factor == WF_CHAN_FACTOR_2_4_G && (ch < 1 || ch > 13))
+               return -1;
+
+       return ch;
+}
+EXPORT_SYMBOL(brcmu_mhz2channel);
+
diff --git a/drivers/staging/brcm80211/include/bcmutils.h b/drivers/staging/brcm80211/include/bcmutils.h
deleted file mode 100644 (file)
index 73854a4..0000000
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright (c) 2010 Broadcom Corporation
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef        _brcmutils_h_
-#define        _brcmutils_h_
-
-/* Buffer structure for collecting string-formatted data
-* using brcmu_bprintf() API.
-* Use brcmu_binit() to initialize before use
-*/
-
-       struct brcmu_strbuf {
-               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 ** */
-
-#define GPIO_PIN_NOTDEFINED    0x20    /* Pin not defined */
-
-/*
- * Spin at most 'us' microseconds while 'exp' is true.
- * Caller should explicitly test 'exp' when this completes
- * and take appropriate error action if 'exp' is still true.
- */
-#define SPINWAIT(exp, us) { \
-       uint countdown = (us) + 9; \
-       while ((exp) && (countdown >= 10)) {\
-               udelay(10); \
-               countdown -= 10; \
-       } \
-}
-
-/* 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
-
-       struct pktq_prec {
-               struct sk_buff *head;   /* first packet to dequeue */
-               struct sk_buff *tail;   /* last packet to dequeue */
-               u16 len;                /* number of queued packets */
-               u16 max;                /* maximum number of queued packets */
-       };
-
-/* multi-priority pkt queue */
-       struct pktq {
-               u16 num_prec;   /* number of precedences in use */
-               u16 hi_prec;    /* rapid dequeue hint (>= highest non-empty prec) */
-               u16 max;        /* total max packets */
-               u16 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];
-       };
-
-#define PKTQ_PREC_ITER(pq, prec)        for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
-
-/* fn(pkt, arg).  return true if pkt belongs to if */
-typedef bool(*ifpkt_cb_t) (struct sk_buff *, void *);
-
-/* 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 struct sk_buff *brcmu_pktq_penq(struct pktq *pq, int prec,
-                                struct sk_buff *p);
-extern struct sk_buff *brcmu_pktq_penq_head(struct pktq *pq, int prec,
-                                     struct sk_buff *p);
-extern struct sk_buff *brcmu_pktq_pdeq(struct pktq *pq, int prec);
-extern struct sk_buff *brcmu_pktq_pdeq_tail(struct pktq *pq, int prec);
-
-/* packet primitives */
-extern struct sk_buff *brcmu_pkt_buf_get_skb(uint len);
-extern void brcmu_pkt_buf_free_skb(struct sk_buff *skb);
-
-/* Empty the queue at particular precedence level */
-extern void brcmu_pktq_pflush(struct pktq *pq, int prec,
-       bool dir, ifpkt_cb_t fn, void *arg);
-
-/* operations on a set of precedences in packet queue */
-
-extern int brcmu_pktq_mlen(struct pktq *pq, uint prec_bmp);
-extern struct sk_buff *brcmu_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)          brcmu_pktq_penq(((struct pktq *)pq), 0, (p))
-#define pktenq_head(pq, p)\
-       brcmu_pktq_penq_head(((struct pktq *)pq), 0, (p))
-#define pktdeq(pq)             brcmu_pktq_pdeq(((struct pktq *)pq), 0)
-#define pktdeq_tail(pq)                brcmu_pktq_pdeq_tail(((struct pktq *)pq), 0)
-#define pktqinit(pq, len)      brcmu_pktq_init(((struct pktq *)pq), 1, len)
-
-extern void brcmu_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 struct sk_buff *brcmu_pktq_peek_tail(struct pktq *pq, int *prec_out);
-extern void brcmu_pktq_flush(struct pktq *pq, bool dir,
-       ifpkt_cb_t fn, void *arg);
-
-/* externs */
-/* packet */
-extern uint brcmu_pktfrombuf(struct sk_buff *p,
-       uint offset, int len, unsigned char *buf);
-extern uint brcmu_pkttotlen(struct sk_buff *p);
-
-/* ethernet address */
-extern int brcmu_ether_atoe(char *p, u8 *ea);
-
-/* ip address */
-       struct ipv4_addr;
-
-#ifdef BCMDBG
-extern void brcmu_prpkt(const char *msg, struct sk_buff *p0);
-#else
-#define brcmu_prpkt(a, b)
-#endif                         /* BCMDBG */
-
-/* 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 */
-struct brcmu_iovar {
-       const char *name;       /* name for lookup and display */
-       u16 varid;      /* id for switch */
-       u16 flags;      /* driver-specific flag bits */
-       u16 type;       /* base type of argument */
-       u16 minlen;     /* min length for buffer vars */
-};
-
-/* 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)
-#define IOV_ID(actionid)       (actionid >> 1)
-
-extern const struct
-brcmu_iovar *brcmu_iovar_lookup(const struct brcmu_iovar *table,
-                               const char *name);
-extern int brcmu_iovar_lencheck(const struct brcmu_iovar *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", \
-       "s8", \
-       "u8", \
-       "s16", \
-       "u16", \
-       "s32", \
-       "u32", \
-       "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 */
-
-#ifndef ABS
-#define        ABS(a)                  (((a) < 0) ? -(a) : (a))
-#endif                         /* ABS */
-
-#define CEIL(x, y)             (((x) + ((y)-1)) / (y))
-#define        ISPOWEROF2(x)           ((((x)-1)&(x)) == 0)
-
-/* map physical to virtual I/O */
-#if !defined(CONFIG_MMC_MSM7X00A)
-#define REG_MAP(pa, size)       ioremap_nocache((unsigned long)(pa), \
-                                       (unsigned long)(size))
-#else
-#define REG_MAP(pa, size)       (void *)(0)
-#endif
-
-/* register access macros */
-#if defined(BCMSDIO)
-#ifdef BRCM_FULLMAC
-#include <bcmsdh.h>
-#endif
-#define OSL_WRITE_REG(r, v) \
-               (bcmsdh_reg_write(NULL, (unsigned long)(r), sizeof(*(r)), (v)))
-#define OSL_READ_REG(r) \
-               (bcmsdh_reg_read(NULL, (unsigned long)(r), sizeof(*(r))))
-#endif
-
-#if defined(BCMSDIO)
-#define SELECT_BUS_WRITE(mmap_op, bus_op) bus_op
-#define SELECT_BUS_READ(mmap_op, bus_op) bus_op
-#else
-#define SELECT_BUS_WRITE(mmap_op, bus_op) mmap_op
-#define SELECT_BUS_READ(mmap_op, bus_op) mmap_op
-#endif
-
-/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
-#define        PKTBUFSZ        2048
-
-#define OSL_SYSUPTIME()                ((u32)jiffies * (1000 / HZ))
-#ifdef BRCM_FULLMAC
-#include <linux/kernel.h>      /* for vsn/printf's */
-#include <linux/string.h>      /* for mem*, str* */
-#endif
-
-/* register access macros */
-#ifndef __BIG_ENDIAN
-#ifndef __mips__
-#define R_REG(r) (\
-       SELECT_BUS_READ(sizeof(*(r)) == sizeof(u8) ? \
-       readb((volatile u8*)(r)) : \
-       sizeof(*(r)) == sizeof(u16) ? readw((volatile u16*)(r)) : \
-       readl((volatile u32*)(r)), OSL_READ_REG(r)) \
-)
-#else                          /* __mips__ */
-#define R_REG(r) (\
-       SELECT_BUS_READ( \
-               ({ \
-                       __typeof(*(r)) __osl_v; \
-                       __asm__ __volatile__("sync"); \
-                       switch (sizeof(*(r))) { \
-                       case sizeof(u8): \
-                               __osl_v = readb((volatile u8*)(r)); \
-                               break; \
-                       case sizeof(u16): \
-                               __osl_v = readw((volatile u16*)(r)); \
-                               break; \
-                       case sizeof(u32): \
-                               __osl_v = \
-                               readl((volatile u32*)(r)); \
-                               break; \
-                       } \
-                       __asm__ __volatile__("sync"); \
-                       __osl_v; \
-               }), \
-               ({ \
-                       __typeof(*(r)) __osl_v; \
-                       __asm__ __volatile__("sync"); \
-                       __osl_v = OSL_READ_REG(r); \
-                       __asm__ __volatile__("sync"); \
-                       __osl_v; \
-               })) \
-)
-#endif                         /* __mips__ */
-
-#define W_REG(r, v) do { \
-       SELECT_BUS_WRITE( \
-               switch (sizeof(*(r))) { \
-               case sizeof(u8): \
-                       writeb((u8)(v), (volatile u8*)(r)); break; \
-               case sizeof(u16): \
-                       writew((u16)(v), (volatile u16*)(r)); break; \
-               case sizeof(u32): \
-                       writel((u32)(v), (volatile u32*)(r)); break; \
-               }, \
-               (OSL_WRITE_REG(r, v))); \
-       } while (0)
-#else                          /* __BIG_ENDIAN */
-#define R_REG(r) (\
-       SELECT_BUS_READ( \
-               ({ \
-                       __typeof(*(r)) __osl_v; \
-                       switch (sizeof(*(r))) { \
-                       case sizeof(u8): \
-                               __osl_v = \
-                               readb((volatile u8*)((r)^3)); \
-                               break; \
-                       case sizeof(u16): \
-                               __osl_v = \
-                               readw((volatile u16*)((r)^2)); \
-                               break; \
-                       case sizeof(u32): \
-                               __osl_v = readl((volatile u32*)(r)); \
-                               break; \
-                       } \
-                       __osl_v; \
-               }), \
-               OSL_READ_REG(r)) \
-)
-#define W_REG(r, v) do { \
-       SELECT_BUS_WRITE( \
-               switch (sizeof(*(r))) { \
-               case sizeof(u8):        \
-                       writeb((u8)(v), \
-                       (volatile u8*)((r)^3)); break; \
-               case sizeof(u16):       \
-                       writew((u16)(v), \
-                       (volatile u16*)((r)^2)); break; \
-               case sizeof(u32):       \
-                       writel((u32)(v), \
-                       (volatile u32*)(r)); break; \
-               }, \
-               (OSL_WRITE_REG(r, v))); \
-       } while (0)
-#endif                         /* __BIG_ENDIAN */
-
-#ifdef __mips__
-/*
- * bcm4716 (which includes 4717 & 4718), plus 4706 on PCIe can reorder
- * transactions. As a fix, a read after write is performed on certain places
- * in the code. Older chips and the newer 5357 family don't require this fix.
- */
-#define W_REG_FLUSH(r, v)      ({ W_REG((r), (v)); (void)R_REG(r); })
-#else
-#define W_REG_FLUSH(r, v)      W_REG((r), (v))
-#endif                         /* __mips__ */
-
-#define AND_REG(r, v)  W_REG((r), R_REG(r) & (v))
-#define OR_REG(r, v)   W_REG((r), R_REG(r) | (v))
-
-#define SET_REG(r, mask, val) \
-               W_REG((r), ((R_REG(r) & ~(mask)) | (val)))
-
-#ifndef setbit
-#ifndef NBBY                   /* the BSD family defines NBBY */
-#define        NBBY    8               /* 8 bits per byte */
-#endif                         /* #ifndef NBBY */
-#define        setbit(a, i)    (((u8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
-#define        clrbit(a, i)    (((u8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
-#define        isset(a, i)     (((const u8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
-#define        isclr(a, i)     ((((const u8 *)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 */
-
-/* brcmu_format_flags() bit description structure */
-struct brcmu_bit_desc {
-       u32 bit;
-       const char *name;
-};
-
-/* tag_ID/length/value_buffer tuple */
-struct brcmu_tlv {
-       u8 id;
-       u8 len;
-       u8 data[1];
-};
-
-#define ETHER_ADDR_STR_LEN     18      /* 18-bytes of Ethernet address buffer length */
-
-/* crypto utility function */
-/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */
-       static inline void
-        xor_128bit_block(const u8 *src1, const u8 *src2, u8 *dst) {
-               if (
-#ifdef __i386__
-                          1 ||
-#endif
-                          (((unsigned long) src1 | (unsigned long) src2 | (unsigned long) dst) &
-                           3) == 0) {
-                       /* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */
-                       /* x86 supports unaligned.  This version runs 6x-9x faster on x86. */
-                       ((u32 *) dst)[0] =
-                           ((const u32 *)src1)[0] ^ ((const u32 *)
-                                                        src2)[0];
-                       ((u32 *) dst)[1] =
-                           ((const u32 *)src1)[1] ^ ((const u32 *)
-                                                        src2)[1];
-                       ((u32 *) dst)[2] =
-                           ((const u32 *)src1)[2] ^ ((const u32 *)
-                                                        src2)[2];
-                       ((u32 *) dst)[3] =
-                           ((const u32 *)src1)[3] ^ ((const u32 *)
-                                                        src2)[3];
-               } else {
-                       /* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */
-                       int k;
-                       for (k = 0; k < 16; k++)
-                               dst[k] = src1[k] ^ src2[k];
-               }
-       }
-
-/* externs */
-/* crc */
-extern u8 brcmu_crc8(u8 *p, uint nbytes, u8 crc);
-
-/* format/print */
-#if defined(BCMDBG)
-extern int brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags,
-                             char *buf, int len);
-extern int brcmu_format_hex(char *str, const void *bytes, int len);
-#endif
-
-extern char *brcmu_chipname(uint chipid, char *buf, uint len);
-
-extern struct brcmu_tlv *brcmu_parse_tlvs(void *buf, int buflen,
-                                         uint key);
-
-/* multi-bool data type: set of bools, mbool is true if any is set */
-       typedef u32 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 u16 brcmu_qdbm_to_mw(u8 qdbm);
-extern u8 brcmu_mw_to_qdbm(u16 mw);
-
-extern void brcmu_binit(struct brcmu_strbuf *b, char *buf, uint size);
-extern int brcmu_bprintf(struct brcmu_strbuf *b, const char *fmt, ...);
-
-extern uint brcmu_mkiovar(char *name, char *data, uint datalen,
-                         char *buf, uint len);
-extern uint brcmu_bitcount(u8 *bitmap, uint bytelength);
-
-#endif                         /* _brcmutils_h_ */
diff --git a/drivers/staging/brcm80211/include/bcmwifi.h b/drivers/staging/brcm80211/include/bcmwifi.h
deleted file mode 100644 (file)
index 6b12c13..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (c) 2010 Broadcom Corporation
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef        _brcmu_wifi_h_
-#define        _brcmu_wifi_h_
-
-#include <linux/if_ether.h>            /* for ETH_ALEN */
-#include <linux/ieee80211.h>           /* for WLAN_PMKID_LEN */
-
-/* A chanspec holds the channel number, band, bandwidth and control sideband */
-typedef u16 chanspec_t;
-
-/* channel defines */
-#define CH_UPPER_SB                    0x01
-#define CH_LOWER_SB                    0x02
-#define CH_EWA_VALID                   0x04
-#define CH_20MHZ_APART                 4
-#define CH_10MHZ_APART                 2
-#define CH_5MHZ_APART                  1       /* 2G band channels are 5 Mhz apart */
-#define CH_MAX_2G_CHANNEL              14      /* Max channel in 2G band */
-#define WLC_MAX_2G_CHANNEL             CH_MAX_2G_CHANNEL       /* legacy define */
-#define        MAXCHANNEL              224     /* max # supported channels. The max channel no is 216,
-                                        * this is that + 1 rounded up to a multiple of NBBY (8).
-                                        * DO NOT MAKE it > 255: channels are u8's all over
-                                        */
-
-#define WL_CHANSPEC_CHAN_MASK          0x00ff
-#define WL_CHANSPEC_CHAN_SHIFT         0
-
-#define WL_CHANSPEC_CTL_SB_MASK                0x0300
-#define WL_CHANSPEC_CTL_SB_SHIFT            8
-#define WL_CHANSPEC_CTL_SB_LOWER       0x0100
-#define WL_CHANSPEC_CTL_SB_UPPER       0x0200
-#define WL_CHANSPEC_CTL_SB_NONE                0x0300
-
-#define WL_CHANSPEC_BW_MASK            0x0C00
-#define WL_CHANSPEC_BW_SHIFT               10
-#define WL_CHANSPEC_BW_10              0x0400
-#define WL_CHANSPEC_BW_20              0x0800
-#define WL_CHANSPEC_BW_40              0x0C00
-
-#define WL_CHANSPEC_BAND_MASK          0xf000
-#define WL_CHANSPEC_BAND_SHIFT         12
-#define WL_CHANSPEC_BAND_5G            0x1000
-#define WL_CHANSPEC_BAND_2G            0x2000
-#define INVCHANSPEC                    255
-
-/* used to calculate the chan_freq = chan_factor * 500Mhz + 5 * chan_number */
-#define WF_CHAN_FACTOR_2_4_G           4814    /* 2.4 GHz band, 2407 MHz */
-#define WF_CHAN_FACTOR_5_G             10000   /* 5   GHz band, 5000 MHz */
-#define WF_CHAN_FACTOR_4_G             8000    /* 4.9 GHz band for Japan */
-
-/* channel defines */
-#define LOWER_20_SB(channel)   (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0)
-#define UPPER_20_SB(channel)   (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
-                               ((channel) + CH_10MHZ_APART) : 0)
-#define CHSPEC_WLCBANDUNIT(chspec)     (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
-#define CH20MHZ_CHSPEC(channel)        (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \
-                               WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \
-                               WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G))
-#define NEXT_20MHZ_CHAN(channel)       (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \
-                                       ((channel) + CH_20MHZ_APART) : 0)
-#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \
-                                       ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \
-                                       ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \
-                                       WL_CHANSPEC_BAND_5G))
-#define CHSPEC_CHANNEL(chspec) ((u8)((chspec) & WL_CHANSPEC_CHAN_MASK))
-#define CHSPEC_BAND(chspec)    ((chspec) & WL_CHANSPEC_BAND_MASK)
-
-#ifdef WL11N_20MHZONLY
-
-#define CHSPEC_CTL_SB(chspec)  WL_CHANSPEC_CTL_SB_NONE
-#define CHSPEC_BW(chspec)      WL_CHANSPEC_BW_20
-#define CHSPEC_IS10(chspec)    0
-#define CHSPEC_IS20(chspec)    1
-#ifndef CHSPEC_IS40
-#define CHSPEC_IS40(chspec)    0
-#endif
-
-#else                          /* !WL11N_20MHZONLY */
-
-#define CHSPEC_CTL_SB(chspec)  ((chspec) & WL_CHANSPEC_CTL_SB_MASK)
-#define CHSPEC_BW(chspec)      ((chspec) & WL_CHANSPEC_BW_MASK)
-#define CHSPEC_IS10(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
-#define CHSPEC_IS20(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
-#ifndef CHSPEC_IS40
-#define CHSPEC_IS40(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
-#endif
-
-#endif                         /* !WL11N_20MHZONLY */
-
-#define CHSPEC_IS5G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
-#define CHSPEC_IS2G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
-#define CHSPEC_SB_NONE(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE)
-#define CHSPEC_SB_UPPER(chspec)        (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER)
-#define CHSPEC_SB_LOWER(chspec)        (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER)
-#define CHSPEC_CTL_CHAN(chspec)  ((CHSPEC_SB_LOWER(chspec)) ? \
-                                 (LOWER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \
-                                 (UPPER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))))
-#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G)
-
-#define CHANSPEC_STR_LEN    8
-
-/* defined rate in 500kbps */
-#define WLC_MAXRATE    108     /* in 500kbps units */
-#define WLC_RATE_1M    2       /* in 500kbps units */
-#define WLC_RATE_2M    4       /* in 500kbps units */
-#define WLC_RATE_5M5   11      /* in 500kbps units */
-#define WLC_RATE_11M   22      /* in 500kbps units */
-#define WLC_RATE_6M    12      /* in 500kbps units */
-#define WLC_RATE_9M    18      /* in 500kbps units */
-#define WLC_RATE_12M   24      /* in 500kbps units */
-#define WLC_RATE_18M   36      /* in 500kbps units */
-#define WLC_RATE_24M   48      /* in 500kbps units */
-#define WLC_RATE_36M   72      /* in 500kbps units */
-#define WLC_RATE_48M   96      /* in 500kbps units */
-#define WLC_RATE_54M   108     /* in 500kbps units */
-
-#define WLC_2G_25MHZ_OFFSET            5       /* 2.4GHz band channel offset */
-
-#define MCSSET_LEN     16
-
-#define AC_BITMAP_TST(ab, ac)  (((ab) & (1 << (ac))) != 0)
-
-/*
- * Verify the chanspec is using a legal set of parameters, i.e. that the
- * chanspec specified a band, bw, ctl_sb and channel and that the
- * combination could be legal given any set of circumstances.
- * RETURNS: true is the chanspec is malformed, false if it looks good.
- */
-extern bool brcmu_chspec_malformed(chanspec_t chanspec);
-
-/*
- * This function returns the channel number that control traffic is being sent on, for legacy
- * channels this is just the channel number, for 40MHZ channels it is the upper or lowre 20MHZ
- * sideband depending on the chanspec selected
- */
-extern u8 brcmu_chspec_ctlchan(chanspec_t chspec);
-
-/*
- * Return the channel number for a given frequency and base frequency.
- * The returned channel number is relative to the given base frequency.
- * If the given base frequency is zero, a base frequency of 5 GHz is assumed for
- * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz.
- *
- * Frequency is specified in MHz.
- * The base frequency is specified as (start_factor * 500 kHz).
- * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
- * 2.4 GHz and 5 GHz bands.
- *
- * The returned channel will be in the range [1, 14] in the 2.4 GHz band
- * and [0, 200] otherwise.
- * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the
- * frequency is not a 2.4 GHz channel, or if the frequency is not and even
- * multiple of 5 MHz from the base frequency to the base plus 1 GHz.
- *
- * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
- */
-extern int brcmu_mhz2channel(uint freq, uint start_factor);
-
-/* Enumerate crypto algorithms */
-#define        CRYPTO_ALGO_OFF                 0
-#define        CRYPTO_ALGO_WEP1                1
-#define        CRYPTO_ALGO_TKIP                2
-#define        CRYPTO_ALGO_WEP128              3
-#define CRYPTO_ALGO_AES_CCM            4
-#define CRYPTO_ALGO_AES_RESERVED1      5
-#define CRYPTO_ALGO_AES_RESERVED2      6
-#define CRYPTO_ALGO_NALG               7
-
-/* wireless security bitvec */
-#define WEP_ENABLED            0x0001
-#define TKIP_ENABLED           0x0002
-#define AES_ENABLED            0x0004
-#define WSEC_SWFLAG            0x0008
-#define SES_OW_ENABLED         0x0040  /* to go into transition mode without setting wep */
-
-/* WPA authentication mode bitvec */
-#define WPA_AUTH_DISABLED      0x0000  /* Legacy (i.e., non-WPA) */
-#define WPA_AUTH_NONE          0x0001  /* none (IBSS) */
-#define WPA_AUTH_UNSPECIFIED   0x0002  /* over 802.1x */
-#define WPA_AUTH_PSK           0x0004  /* Pre-shared key */
-#define WPA_AUTH_RESERVED1     0x0008
-#define WPA_AUTH_RESERVED2     0x0010
-                                       /* #define WPA_AUTH_8021X 0x0020 *//* 802.1x, reserved */
-#define WPA2_AUTH_RESERVED1    0x0020
-#define WPA2_AUTH_UNSPECIFIED  0x0040  /* over 802.1x */
-#define WPA2_AUTH_PSK          0x0080  /* Pre-shared key */
-#define WPA2_AUTH_RESERVED3    0x0200
-#define WPA2_AUTH_RESERVED4    0x0400
-#define WPA2_AUTH_RESERVED5    0x0800
-
-/* pmkid */
-#define        MAXPMKID                16
-
-#define DOT11_DEFAULT_RTS_LEN          2347
-#define DOT11_DEFAULT_FRAG_LEN         2346
-
-#define DOT11_ICV_AES_LEN              8
-#define DOT11_QOS_LEN                  2
-#define DOT11_IV_MAX_LEN               8
-#define DOT11_A4_HDR_LEN               30
-
-#define HT_CAP_RX_STBC_NO              0x0
-#define HT_CAP_RX_STBC_ONE_STREAM      0x1
-
-typedef struct _pmkid {
-       u8 BSSID[ETH_ALEN];
-       u8 PMKID[WLAN_PMKID_LEN];
-} pmkid_t;
-
-typedef struct _pmkid_list {
-       u32 npmkid;
-       pmkid_t pmkid[1];
-} pmkid_list_t;
-
-typedef struct _pmkid_cand {
-       u8 BSSID[ETH_ALEN];
-       u8 preauth;
-} pmkid_cand_t;
-
-typedef struct _pmkid_cand_list {
-       u32 npmkid_cand;
-       pmkid_cand_t pmkid_cand[1];
-} pmkid_cand_list_t;
-
-typedef u8 ac_bitmap_t;
-
-#endif                         /* _brcmu_wifi_h_ */
diff --git a/drivers/staging/brcm80211/include/brcmu_utils.h b/drivers/staging/brcm80211/include/brcmu_utils.h
new file mode 100644 (file)
index 0000000..73854a4
--- /dev/null
@@ -0,0 +1,498 @@
+/*
+ * Copyright (c) 2010 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef        _brcmutils_h_
+#define        _brcmutils_h_
+
+/* Buffer structure for collecting string-formatted data
+* using brcmu_bprintf() API.
+* Use brcmu_binit() to initialize before use
+*/
+
+       struct brcmu_strbuf {
+               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 ** */
+
+#define GPIO_PIN_NOTDEFINED    0x20    /* Pin not defined */
+
+/*
+ * Spin at most 'us' microseconds while 'exp' is true.
+ * Caller should explicitly test 'exp' when this completes
+ * and take appropriate error action if 'exp' is still true.
+ */
+#define SPINWAIT(exp, us) { \
+       uint countdown = (us) + 9; \
+       while ((exp) && (countdown >= 10)) {\
+               udelay(10); \
+               countdown -= 10; \
+       } \
+}
+
+/* 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
+
+       struct pktq_prec {
+               struct sk_buff *head;   /* first packet to dequeue */
+               struct sk_buff *tail;   /* last packet to dequeue */
+               u16 len;                /* number of queued packets */
+               u16 max;                /* maximum number of queued packets */
+       };
+
+/* multi-priority pkt queue */
+       struct pktq {
+               u16 num_prec;   /* number of precedences in use */
+               u16 hi_prec;    /* rapid dequeue hint (>= highest non-empty prec) */
+               u16 max;        /* total max packets */
+               u16 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];
+       };
+
+#define PKTQ_PREC_ITER(pq, prec)        for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
+
+/* fn(pkt, arg).  return true if pkt belongs to if */
+typedef bool(*ifpkt_cb_t) (struct sk_buff *, void *);
+
+/* 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 struct sk_buff *brcmu_pktq_penq(struct pktq *pq, int prec,
+                                struct sk_buff *p);
+extern struct sk_buff *brcmu_pktq_penq_head(struct pktq *pq, int prec,
+                                     struct sk_buff *p);
+extern struct sk_buff *brcmu_pktq_pdeq(struct pktq *pq, int prec);
+extern struct sk_buff *brcmu_pktq_pdeq_tail(struct pktq *pq, int prec);
+
+/* packet primitives */
+extern struct sk_buff *brcmu_pkt_buf_get_skb(uint len);
+extern void brcmu_pkt_buf_free_skb(struct sk_buff *skb);
+
+/* Empty the queue at particular precedence level */
+extern void brcmu_pktq_pflush(struct pktq *pq, int prec,
+       bool dir, ifpkt_cb_t fn, void *arg);
+
+/* operations on a set of precedences in packet queue */
+
+extern int brcmu_pktq_mlen(struct pktq *pq, uint prec_bmp);
+extern struct sk_buff *brcmu_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)          brcmu_pktq_penq(((struct pktq *)pq), 0, (p))
+#define pktenq_head(pq, p)\
+       brcmu_pktq_penq_head(((struct pktq *)pq), 0, (p))
+#define pktdeq(pq)             brcmu_pktq_pdeq(((struct pktq *)pq), 0)
+#define pktdeq_tail(pq)                brcmu_pktq_pdeq_tail(((struct pktq *)pq), 0)
+#define pktqinit(pq, len)      brcmu_pktq_init(((struct pktq *)pq), 1, len)
+
+extern void brcmu_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 struct sk_buff *brcmu_pktq_peek_tail(struct pktq *pq, int *prec_out);
+extern void brcmu_pktq_flush(struct pktq *pq, bool dir,
+       ifpkt_cb_t fn, void *arg);
+
+/* externs */
+/* packet */
+extern uint brcmu_pktfrombuf(struct sk_buff *p,
+       uint offset, int len, unsigned char *buf);
+extern uint brcmu_pkttotlen(struct sk_buff *p);
+
+/* ethernet address */
+extern int brcmu_ether_atoe(char *p, u8 *ea);
+
+/* ip address */
+       struct ipv4_addr;
+
+#ifdef BCMDBG
+extern void brcmu_prpkt(const char *msg, struct sk_buff *p0);
+#else
+#define brcmu_prpkt(a, b)
+#endif                         /* BCMDBG */
+
+/* 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 */
+struct brcmu_iovar {
+       const char *name;       /* name for lookup and display */
+       u16 varid;      /* id for switch */
+       u16 flags;      /* driver-specific flag bits */
+       u16 type;       /* base type of argument */
+       u16 minlen;     /* min length for buffer vars */
+};
+
+/* 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)
+#define IOV_ID(actionid)       (actionid >> 1)
+
+extern const struct
+brcmu_iovar *brcmu_iovar_lookup(const struct brcmu_iovar *table,
+                               const char *name);
+extern int brcmu_iovar_lencheck(const struct brcmu_iovar *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", \
+       "s8", \
+       "u8", \
+       "s16", \
+       "u16", \
+       "s32", \
+       "u32", \
+       "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 */
+
+#ifndef ABS
+#define        ABS(a)                  (((a) < 0) ? -(a) : (a))
+#endif                         /* ABS */
+
+#define CEIL(x, y)             (((x) + ((y)-1)) / (y))
+#define        ISPOWEROF2(x)           ((((x)-1)&(x)) == 0)
+
+/* map physical to virtual I/O */
+#if !defined(CONFIG_MMC_MSM7X00A)
+#define REG_MAP(pa, size)       ioremap_nocache((unsigned long)(pa), \
+                                       (unsigned long)(size))
+#else
+#define REG_MAP(pa, size)       (void *)(0)
+#endif
+
+/* register access macros */
+#if defined(BCMSDIO)
+#ifdef BRCM_FULLMAC
+#include <bcmsdh.h>
+#endif
+#define OSL_WRITE_REG(r, v) \
+               (bcmsdh_reg_write(NULL, (unsigned long)(r), sizeof(*(r)), (v)))
+#define OSL_READ_REG(r) \
+               (bcmsdh_reg_read(NULL, (unsigned long)(r), sizeof(*(r))))
+#endif
+
+#if defined(BCMSDIO)
+#define SELECT_BUS_WRITE(mmap_op, bus_op) bus_op
+#define SELECT_BUS_READ(mmap_op, bus_op) bus_op
+#else
+#define SELECT_BUS_WRITE(mmap_op, bus_op) mmap_op
+#define SELECT_BUS_READ(mmap_op, bus_op) mmap_op
+#endif
+
+/* the largest reasonable packet buffer driver uses for ethernet MTU in bytes */
+#define        PKTBUFSZ        2048
+
+#define OSL_SYSUPTIME()                ((u32)jiffies * (1000 / HZ))
+#ifdef BRCM_FULLMAC
+#include <linux/kernel.h>      /* for vsn/printf's */
+#include <linux/string.h>      /* for mem*, str* */
+#endif
+
+/* register access macros */
+#ifndef __BIG_ENDIAN
+#ifndef __mips__
+#define R_REG(r) (\
+       SELECT_BUS_READ(sizeof(*(r)) == sizeof(u8) ? \
+       readb((volatile u8*)(r)) : \
+       sizeof(*(r)) == sizeof(u16) ? readw((volatile u16*)(r)) : \
+       readl((volatile u32*)(r)), OSL_READ_REG(r)) \
+)
+#else                          /* __mips__ */
+#define R_REG(r) (\
+       SELECT_BUS_READ( \
+               ({ \
+                       __typeof(*(r)) __osl_v; \
+                       __asm__ __volatile__("sync"); \
+                       switch (sizeof(*(r))) { \
+                       case sizeof(u8): \
+                               __osl_v = readb((volatile u8*)(r)); \
+                               break; \
+                       case sizeof(u16): \
+                               __osl_v = readw((volatile u16*)(r)); \
+                               break; \
+                       case sizeof(u32): \
+                               __osl_v = \
+                               readl((volatile u32*)(r)); \
+                               break; \
+                       } \
+                       __asm__ __volatile__("sync"); \
+                       __osl_v; \
+               }), \
+               ({ \
+                       __typeof(*(r)) __osl_v; \
+                       __asm__ __volatile__("sync"); \
+                       __osl_v = OSL_READ_REG(r); \
+                       __asm__ __volatile__("sync"); \
+                       __osl_v; \
+               })) \
+)
+#endif                         /* __mips__ */
+
+#define W_REG(r, v) do { \
+       SELECT_BUS_WRITE( \
+               switch (sizeof(*(r))) { \
+               case sizeof(u8): \
+                       writeb((u8)(v), (volatile u8*)(r)); break; \
+               case sizeof(u16): \
+                       writew((u16)(v), (volatile u16*)(r)); break; \
+               case sizeof(u32): \
+                       writel((u32)(v), (volatile u32*)(r)); break; \
+               }, \
+               (OSL_WRITE_REG(r, v))); \
+       } while (0)
+#else                          /* __BIG_ENDIAN */
+#define R_REG(r) (\
+       SELECT_BUS_READ( \
+               ({ \
+                       __typeof(*(r)) __osl_v; \
+                       switch (sizeof(*(r))) { \
+                       case sizeof(u8): \
+                               __osl_v = \
+                               readb((volatile u8*)((r)^3)); \
+                               break; \
+                       case sizeof(u16): \
+                               __osl_v = \
+                               readw((volatile u16*)((r)^2)); \
+                               break; \
+                       case sizeof(u32): \
+                               __osl_v = readl((volatile u32*)(r)); \
+                               break; \
+                       } \
+                       __osl_v; \
+               }), \
+               OSL_READ_REG(r)) \
+)
+#define W_REG(r, v) do { \
+       SELECT_BUS_WRITE( \
+               switch (sizeof(*(r))) { \
+               case sizeof(u8):        \
+                       writeb((u8)(v), \
+                       (volatile u8*)((r)^3)); break; \
+               case sizeof(u16):       \
+                       writew((u16)(v), \
+                       (volatile u16*)((r)^2)); break; \
+               case sizeof(u32):       \
+                       writel((u32)(v), \
+                       (volatile u32*)(r)); break; \
+               }, \
+               (OSL_WRITE_REG(r, v))); \
+       } while (0)
+#endif                         /* __BIG_ENDIAN */
+
+#ifdef __mips__
+/*
+ * bcm4716 (which includes 4717 & 4718), plus 4706 on PCIe can reorder
+ * transactions. As a fix, a read after write is performed on certain places
+ * in the code. Older chips and the newer 5357 family don't require this fix.
+ */
+#define W_REG_FLUSH(r, v)      ({ W_REG((r), (v)); (void)R_REG(r); })
+#else
+#define W_REG_FLUSH(r, v)      W_REG((r), (v))
+#endif                         /* __mips__ */
+
+#define AND_REG(r, v)  W_REG((r), R_REG(r) & (v))
+#define OR_REG(r, v)   W_REG((r), R_REG(r) | (v))
+
+#define SET_REG(r, mask, val) \
+               W_REG((r), ((R_REG(r) & ~(mask)) | (val)))
+
+#ifndef setbit
+#ifndef NBBY                   /* the BSD family defines NBBY */
+#define        NBBY    8               /* 8 bits per byte */
+#endif                         /* #ifndef NBBY */
+#define        setbit(a, i)    (((u8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
+#define        clrbit(a, i)    (((u8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+#define        isset(a, i)     (((const u8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
+#define        isclr(a, i)     ((((const u8 *)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 */
+
+/* brcmu_format_flags() bit description structure */
+struct brcmu_bit_desc {
+       u32 bit;
+       const char *name;
+};
+
+/* tag_ID/length/value_buffer tuple */
+struct brcmu_tlv {
+       u8 id;
+       u8 len;
+       u8 data[1];
+};
+
+#define ETHER_ADDR_STR_LEN     18      /* 18-bytes of Ethernet address buffer length */
+
+/* crypto utility function */
+/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */
+       static inline void
+        xor_128bit_block(const u8 *src1, const u8 *src2, u8 *dst) {
+               if (
+#ifdef __i386__
+                          1 ||
+#endif
+                          (((unsigned long) src1 | (unsigned long) src2 | (unsigned long) dst) &
+                           3) == 0) {
+                       /* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */
+                       /* x86 supports unaligned.  This version runs 6x-9x faster on x86. */
+                       ((u32 *) dst)[0] =
+                           ((const u32 *)src1)[0] ^ ((const u32 *)
+                                                        src2)[0];
+                       ((u32 *) dst)[1] =
+                           ((const u32 *)src1)[1] ^ ((const u32 *)
+                                                        src2)[1];
+                       ((u32 *) dst)[2] =
+                           ((const u32 *)src1)[2] ^ ((const u32 *)
+                                                        src2)[2];
+                       ((u32 *) dst)[3] =
+                           ((const u32 *)src1)[3] ^ ((const u32 *)
+                                                        src2)[3];
+               } else {
+                       /* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */
+                       int k;
+                       for (k = 0; k < 16; k++)
+                               dst[k] = src1[k] ^ src2[k];
+               }
+       }
+
+/* externs */
+/* crc */
+extern u8 brcmu_crc8(u8 *p, uint nbytes, u8 crc);
+
+/* format/print */
+#if defined(BCMDBG)
+extern int brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags,
+                             char *buf, int len);
+extern int brcmu_format_hex(char *str, const void *bytes, int len);
+#endif
+
+extern char *brcmu_chipname(uint chipid, char *buf, uint len);
+
+extern struct brcmu_tlv *brcmu_parse_tlvs(void *buf, int buflen,
+                                         uint key);
+
+/* multi-bool data type: set of bools, mbool is true if any is set */
+       typedef u32 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 u16 brcmu_qdbm_to_mw(u8 qdbm);
+extern u8 brcmu_mw_to_qdbm(u16 mw);
+
+extern void brcmu_binit(struct brcmu_strbuf *b, char *buf, uint size);
+extern int brcmu_bprintf(struct brcmu_strbuf *b, const char *fmt, ...);
+
+extern uint brcmu_mkiovar(char *name, char *data, uint datalen,
+                         char *buf, uint len);
+extern uint brcmu_bitcount(u8 *bitmap, uint bytelength);
+
+#endif                         /* _brcmutils_h_ */
diff --git a/drivers/staging/brcm80211/include/brcmu_wifi.h b/drivers/staging/brcm80211/include/brcmu_wifi.h
new file mode 100644 (file)
index 0000000..6b12c13
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 2010 Broadcom Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef        _brcmu_wifi_h_
+#define        _brcmu_wifi_h_
+
+#include <linux/if_ether.h>            /* for ETH_ALEN */
+#include <linux/ieee80211.h>           /* for WLAN_PMKID_LEN */
+
+/* A chanspec holds the channel number, band, bandwidth and control sideband */
+typedef u16 chanspec_t;
+
+/* channel defines */
+#define CH_UPPER_SB                    0x01
+#define CH_LOWER_SB                    0x02
+#define CH_EWA_VALID                   0x04
+#define CH_20MHZ_APART                 4
+#define CH_10MHZ_APART                 2
+#define CH_5MHZ_APART                  1       /* 2G band channels are 5 Mhz apart */
+#define CH_MAX_2G_CHANNEL              14      /* Max channel in 2G band */
+#define WLC_MAX_2G_CHANNEL             CH_MAX_2G_CHANNEL       /* legacy define */
+#define        MAXCHANNEL              224     /* max # supported channels. The max channel no is 216,
+                                        * this is that + 1 rounded up to a multiple of NBBY (8).
+                                        * DO NOT MAKE it > 255: channels are u8's all over
+                                        */
+
+#define WL_CHANSPEC_CHAN_MASK          0x00ff
+#define WL_CHANSPEC_CHAN_SHIFT         0
+
+#define WL_CHANSPEC_CTL_SB_MASK                0x0300
+#define WL_CHANSPEC_CTL_SB_SHIFT            8
+#define WL_CHANSPEC_CTL_SB_LOWER       0x0100
+#define WL_CHANSPEC_CTL_SB_UPPER       0x0200
+#define WL_CHANSPEC_CTL_SB_NONE                0x0300
+
+#define WL_CHANSPEC_BW_MASK            0x0C00
+#define WL_CHANSPEC_BW_SHIFT               10
+#define WL_CHANSPEC_BW_10              0x0400
+#define WL_CHANSPEC_BW_20              0x0800
+#define WL_CHANSPEC_BW_40              0x0C00
+
+#define WL_CHANSPEC_BAND_MASK          0xf000
+#define WL_CHANSPEC_BAND_SHIFT         12
+#define WL_CHANSPEC_BAND_5G            0x1000
+#define WL_CHANSPEC_BAND_2G            0x2000
+#define INVCHANSPEC                    255
+
+/* used to calculate the chan_freq = chan_factor * 500Mhz + 5 * chan_number */
+#define WF_CHAN_FACTOR_2_4_G           4814    /* 2.4 GHz band, 2407 MHz */
+#define WF_CHAN_FACTOR_5_G             10000   /* 5   GHz band, 5000 MHz */
+#define WF_CHAN_FACTOR_4_G             8000    /* 4.9 GHz band for Japan */
+
+/* channel defines */
+#define LOWER_20_SB(channel)   (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0)
+#define UPPER_20_SB(channel)   (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
+                               ((channel) + CH_10MHZ_APART) : 0)
+#define CHSPEC_WLCBANDUNIT(chspec)     (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
+#define CH20MHZ_CHSPEC(channel)        (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \
+                               WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \
+                               WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G))
+#define NEXT_20MHZ_CHAN(channel)       (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \
+                                       ((channel) + CH_20MHZ_APART) : 0)
+#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \
+                                       ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \
+                                       ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \
+                                       WL_CHANSPEC_BAND_5G))
+#define CHSPEC_CHANNEL(chspec) ((u8)((chspec) & WL_CHANSPEC_CHAN_MASK))
+#define CHSPEC_BAND(chspec)    ((chspec) & WL_CHANSPEC_BAND_MASK)
+
+#ifdef WL11N_20MHZONLY
+
+#define CHSPEC_CTL_SB(chspec)  WL_CHANSPEC_CTL_SB_NONE
+#define CHSPEC_BW(chspec)      WL_CHANSPEC_BW_20
+#define CHSPEC_IS10(chspec)    0
+#define CHSPEC_IS20(chspec)    1
+#ifndef CHSPEC_IS40
+#define CHSPEC_IS40(chspec)    0
+#endif
+
+#else                          /* !WL11N_20MHZONLY */
+
+#define CHSPEC_CTL_SB(chspec)  ((chspec) & WL_CHANSPEC_CTL_SB_MASK)
+#define CHSPEC_BW(chspec)      ((chspec) & WL_CHANSPEC_BW_MASK)
+#define CHSPEC_IS10(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
+#define CHSPEC_IS20(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
+#ifndef CHSPEC_IS40
+#define CHSPEC_IS40(chspec)    (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
+#endif
+
+#endif                         /* !WL11N_20MHZONLY */
+
+#define CHSPEC_IS5G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
+#define CHSPEC_IS2G(chspec)    (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
+#define CHSPEC_SB_NONE(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE)
+#define CHSPEC_SB_UPPER(chspec)        (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER)
+#define CHSPEC_SB_LOWER(chspec)        (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER)
+#define CHSPEC_CTL_CHAN(chspec)  ((CHSPEC_SB_LOWER(chspec)) ? \
+                                 (LOWER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \
+                                 (UPPER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))))
+#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G)
+
+#define CHANSPEC_STR_LEN    8
+
+/* defined rate in 500kbps */
+#define WLC_MAXRATE    108     /* in 500kbps units */
+#define WLC_RATE_1M    2       /* in 500kbps units */
+#define WLC_RATE_2M    4       /* in 500kbps units */
+#define WLC_RATE_5M5   11      /* in 500kbps units */
+#define WLC_RATE_11M   22      /* in 500kbps units */
+#define WLC_RATE_6M    12      /* in 500kbps units */
+#define WLC_RATE_9M    18      /* in 500kbps units */
+#define WLC_RATE_12M   24      /* in 500kbps units */
+#define WLC_RATE_18M   36      /* in 500kbps units */
+#define WLC_RATE_24M   48      /* in 500kbps units */
+#define WLC_RATE_36M   72      /* in 500kbps units */
+#define WLC_RATE_48M   96      /* in 500kbps units */
+#define WLC_RATE_54M   108     /* in 500kbps units */
+
+#define WLC_2G_25MHZ_OFFSET            5       /* 2.4GHz band channel offset */
+
+#define MCSSET_LEN     16
+
+#define AC_BITMAP_TST(ab, ac)  (((ab) & (1 << (ac))) != 0)
+
+/*
+ * Verify the chanspec is using a legal set of parameters, i.e. that the
+ * chanspec specified a band, bw, ctl_sb and channel and that the
+ * combination could be legal given any set of circumstances.
+ * RETURNS: true is the chanspec is malformed, false if it looks good.
+ */
+extern bool brcmu_chspec_malformed(chanspec_t chanspec);
+
+/*
+ * This function returns the channel number that control traffic is being sent on, for legacy
+ * channels this is just the channel number, for 40MHZ channels it is the upper or lowre 20MHZ
+ * sideband depending on the chanspec selected
+ */
+extern u8 brcmu_chspec_ctlchan(chanspec_t chspec);
+
+/*
+ * Return the channel number for a given frequency and base frequency.
+ * The returned channel number is relative to the given base frequency.
+ * If the given base frequency is zero, a base frequency of 5 GHz is assumed for
+ * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz.
+ *
+ * Frequency is specified in MHz.
+ * The base frequency is specified as (start_factor * 500 kHz).
+ * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
+ * 2.4 GHz and 5 GHz bands.
+ *
+ * The returned channel will be in the range [1, 14] in the 2.4 GHz band
+ * and [0, 200] otherwise.
+ * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the
+ * frequency is not a 2.4 GHz channel, or if the frequency is not and even
+ * multiple of 5 MHz from the base frequency to the base plus 1 GHz.
+ *
+ * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
+ */
+extern int brcmu_mhz2channel(uint freq, uint start_factor);
+
+/* Enumerate crypto algorithms */
+#define        CRYPTO_ALGO_OFF                 0
+#define        CRYPTO_ALGO_WEP1                1
+#define        CRYPTO_ALGO_TKIP                2
+#define        CRYPTO_ALGO_WEP128              3
+#define CRYPTO_ALGO_AES_CCM            4
+#define CRYPTO_ALGO_AES_RESERVED1      5
+#define CRYPTO_ALGO_AES_RESERVED2      6
+#define CRYPTO_ALGO_NALG               7
+
+/* wireless security bitvec */
+#define WEP_ENABLED            0x0001
+#define TKIP_ENABLED           0x0002
+#define AES_ENABLED            0x0004
+#define WSEC_SWFLAG            0x0008
+#define SES_OW_ENABLED         0x0040  /* to go into transition mode without setting wep */
+
+/* WPA authentication mode bitvec */
+#define WPA_AUTH_DISABLED      0x0000  /* Legacy (i.e., non-WPA) */
+#define WPA_AUTH_NONE          0x0001  /* none (IBSS) */
+#define WPA_AUTH_UNSPECIFIED   0x0002  /* over 802.1x */
+#define WPA_AUTH_PSK           0x0004  /* Pre-shared key */
+#define WPA_AUTH_RESERVED1     0x0008
+#define WPA_AUTH_RESERVED2     0x0010
+                                       /* #define WPA_AUTH_8021X 0x0020 *//* 802.1x, reserved */
+#define WPA2_AUTH_RESERVED1    0x0020
+#define WPA2_AUTH_UNSPECIFIED  0x0040  /* over 802.1x */
+#define WPA2_AUTH_PSK          0x0080  /* Pre-shared key */
+#define WPA2_AUTH_RESERVED3    0x0200
+#define WPA2_AUTH_RESERVED4    0x0400
+#define WPA2_AUTH_RESERVED5    0x0800
+
+/* pmkid */
+#define        MAXPMKID                16
+
+#define DOT11_DEFAULT_RTS_LEN          2347
+#define DOT11_DEFAULT_FRAG_LEN         2346
+
+#define DOT11_ICV_AES_LEN              8
+#define DOT11_QOS_LEN                  2
+#define DOT11_IV_MAX_LEN               8
+#define DOT11_A4_HDR_LEN               30
+
+#define HT_CAP_RX_STBC_NO              0x0
+#define HT_CAP_RX_STBC_ONE_STREAM      0x1
+
+typedef struct _pmkid {
+       u8 BSSID[ETH_ALEN];
+       u8 PMKID[WLAN_PMKID_LEN];
+} pmkid_t;
+
+typedef struct _pmkid_list {
+       u32 npmkid;
+       pmkid_t pmkid[1];
+} pmkid_list_t;
+
+typedef struct _pmkid_cand {
+       u8 BSSID[ETH_ALEN];
+       u8 preauth;
+} pmkid_cand_t;
+
+typedef struct _pmkid_cand_list {
+       u32 npmkid_cand;
+       pmkid_cand_t pmkid_cand[1];
+} pmkid_cand_list_t;
+
+typedef u8 ac_bitmap_t;
+
+#endif                         /* _brcmu_wifi_h_ */
diff --git a/drivers/staging/brcm80211/util/Makefile b/drivers/staging/brcm80211/util/Makefile
deleted file mode 100644 (file)
index f9b36ca..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# Makefile fragment for Broadcom 802.11n Networking Device Driver Utilities
-#
-# Copyright (c) 2011 Broadcom Corporation
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-ccflags-y :=                           \
-       -Idrivers/staging/brcm80211/util \
-       -Idrivers/staging/brcm80211/include
-
-BRCMUTIL_OFILES := \
-       bcmutils.o \
-       bcmwifi.o
-
-MODULEPFX := brcmutil
-
-obj-$(CONFIG_BRCMUTIL) += $(MODULEPFX).o
-$(MODULEPFX)-objs      = $(BRCMUTIL_OFILES)
diff --git a/drivers/staging/brcm80211/util/bcmutils.c b/drivers/staging/brcm80211/util/bcmutils.c
deleted file mode 100644 (file)
index eb55ce4..0000000
+++ /dev/null
@@ -1,797 +0,0 @@
-/*
- * Copyright (c) 2010 Broadcom Corporation
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <linux/ctype.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/netdevice.h>
-#include <linux/sched.h>
-#include <linux/printk.h>
-#include <bcmdefs.h>
-#include <stdarg.h>
-#include <bcmutils.h>
-#include <bcmdevs.h>
-
-MODULE_AUTHOR("Broadcom Corporation");
-MODULE_DESCRIPTION("Broadcom 802.11n wireless LAN driver utilities.");
-MODULE_SUPPORTED_DEVICE("Broadcom 802.11n WLAN cards");
-MODULE_LICENSE("Dual BSD/GPL");
-
-struct sk_buff *brcmu_pkt_buf_get_skb(uint len)
-{
-       struct sk_buff *skb;
-
-       skb = dev_alloc_skb(len);
-       if (skb) {
-               skb_put(skb, len);
-               skb->priority = 0;
-       }
-
-       return skb;
-}
-EXPORT_SYMBOL(brcmu_pkt_buf_get_skb);
-
-/* Free the driver packet. Free the tag if present */
-void brcmu_pkt_buf_free_skb(struct sk_buff *skb)
-{
-       struct sk_buff *nskb;
-       int nest = 0;
-
-       /* perversion: we use skb->next to chain multi-skb packets */
-       while (skb) {
-               nskb = skb->next;
-               skb->next = NULL;
-
-               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);
-
-               nest++;
-               skb = nskb;
-       }
-}
-EXPORT_SYMBOL(brcmu_pkt_buf_free_skb);
-
-
-/* copy a buffer into a pkt buffer chain */
-uint brcmu_pktfrombuf(struct sk_buff *p, uint offset, int len,
-               unsigned char *buf)
-{
-       uint n, ret = 0;
-
-       /* skip 'offset' bytes */
-       for (; p && offset; p = p->next) {
-               if (offset < (uint) (p->len))
-                       break;
-               offset -= p->len;
-       }
-
-       if (!p)
-               return 0;
-
-       /* copy the data */
-       for (; p && len; p = p->next) {
-               n = min((uint) (p->len) - offset, (uint) len);
-               memcpy(p->data + offset, buf, n);
-               buf += n;
-               len -= n;
-               ret += n;
-               offset = 0;
-       }
-
-       return ret;
-}
-EXPORT_SYMBOL(brcmu_pktfrombuf);
-
-/* return total length of buffer chain */
-uint brcmu_pkttotlen(struct sk_buff *p)
-{
-       uint total;
-
-       total = 0;
-       for (; p; p = p->next)
-               total += p->len;
-       return total;
-}
-EXPORT_SYMBOL(brcmu_pkttotlen);
-
-/*
- * osl multiple-precedence packet queue
- * hi_prec is always >= the number of the highest non-empty precedence
- */
-struct sk_buff *brcmu_pktq_penq(struct pktq *pq, int prec,
-                                     struct sk_buff *p)
-{
-       struct pktq_prec *q;
-
-       if (pktq_full(pq) || pktq_pfull(pq, prec))
-               return NULL;
-
-       q = &pq->q[prec];
-
-       if (q->head)
-               q->tail->prev = p;
-       else
-               q->head = p;
-
-       q->tail = p;
-       q->len++;
-
-       pq->len++;
-
-       if (pq->hi_prec < prec)
-               pq->hi_prec = (u8) prec;
-
-       return p;
-}
-EXPORT_SYMBOL(brcmu_pktq_penq);
-
-struct sk_buff *brcmu_pktq_penq_head(struct pktq *pq, int prec,
-                                          struct sk_buff *p)
-{
-       struct pktq_prec *q;
-
-       if (pktq_full(pq) || pktq_pfull(pq, prec))
-               return NULL;
-
-       q = &pq->q[prec];
-
-       if (q->head == NULL)
-               q->tail = p;
-
-       p->prev = q->head;
-       q->head = p;
-       q->len++;
-
-       pq->len++;
-
-       if (pq->hi_prec < prec)
-               pq->hi_prec = (u8) prec;
-
-       return p;
-}
-EXPORT_SYMBOL(brcmu_pktq_penq_head);
-
-struct sk_buff *brcmu_pktq_pdeq(struct pktq *pq, int prec)
-{
-       struct pktq_prec *q;
-       struct sk_buff *p;
-
-       q = &pq->q[prec];
-
-       p = q->head;
-       if (p == NULL)
-               return NULL;
-
-       q->head = p->prev;
-       if (q->head == NULL)
-               q->tail = NULL;
-
-       q->len--;
-
-       pq->len--;
-
-       p->prev = NULL;
-
-       return p;
-}
-EXPORT_SYMBOL(brcmu_pktq_pdeq);
-
-struct sk_buff *brcmu_pktq_pdeq_tail(struct pktq *pq, int prec)
-{
-       struct pktq_prec *q;
-       struct sk_buff *p, *prev;
-
-       q = &pq->q[prec];
-
-       p = q->head;
-       if (p == NULL)
-               return NULL;
-
-       for (prev = NULL; p != q->tail; p = p->prev)
-               prev = p;
-
-       if (prev)
-               prev->prev = NULL;
-       else
-               q->head = NULL;
-
-       q->tail = prev;
-       q->len--;
-
-       pq->len--;
-
-       return p;
-}
-EXPORT_SYMBOL(brcmu_pktq_pdeq_tail);
-
-void
-brcmu_pktq_pflush(struct pktq *pq, int prec, bool dir,
-           ifpkt_cb_t fn, void *arg)
-{
-       struct pktq_prec *q;
-       struct sk_buff *p, *prev = NULL;
-
-       q = &pq->q[prec];
-       p = q->head;
-       while (p) {
-               if (fn == NULL || (*fn) (p, arg)) {
-                       bool head = (p == q->head);
-                       if (head)
-                               q->head = p->prev;
-                       else
-                               prev->prev = p->prev;
-                       p->prev = NULL;
-                       brcmu_pkt_buf_free_skb(p);
-                       q->len--;
-                       pq->len--;
-                       p = (head ? q->head : prev->prev);
-               } else {
-                       prev = p;
-                       p = p->prev;
-               }
-       }
-
-       if (q->head == NULL) {
-               q->tail = NULL;
-       }
-}
-EXPORT_SYMBOL(brcmu_pktq_pflush);
-
-void brcmu_pktq_flush(struct pktq *pq, bool dir,
-               ifpkt_cb_t fn, void *arg)
-{
-       int prec;
-       for (prec = 0; prec < pq->num_prec; prec++)
-               brcmu_pktq_pflush(pq, prec, dir, fn, arg);
-}
-EXPORT_SYMBOL(brcmu_pktq_flush);
-
-void brcmu_pktq_init(struct pktq *pq, int num_prec, int max_len)
-{
-       int prec;
-
-       /* pq is variable size; only zero out what's requested */
-       memset(pq, 0,
-             offsetof(struct pktq, q) + (sizeof(struct pktq_prec) * num_prec));
-
-       pq->num_prec = (u16) num_prec;
-
-       pq->max = (u16) max_len;
-
-       for (prec = 0; prec < num_prec; prec++)
-               pq->q[prec].max = pq->max;
-}
-EXPORT_SYMBOL(brcmu_pktq_init);
-
-struct sk_buff *brcmu_pktq_peek_tail(struct pktq *pq, int *prec_out)
-{
-       int prec;
-
-       if (pq->len == 0)
-               return NULL;
-
-       for (prec = 0; prec < pq->hi_prec; prec++)
-               if (pq->q[prec].head)
-                       break;
-
-       if (prec_out)
-               *prec_out = prec;
-
-       return pq->q[prec].tail;
-}
-EXPORT_SYMBOL(brcmu_pktq_peek_tail);
-
-/* Return sum of lengths of a specific set of precedences */
-int brcmu_pktq_mlen(struct pktq *pq, uint prec_bmp)
-{
-       int prec, len;
-
-       len = 0;
-
-       for (prec = 0; prec <= pq->hi_prec; prec++)
-               if (prec_bmp & (1 << prec))
-                       len += pq->q[prec].len;
-
-       return len;
-}
-EXPORT_SYMBOL(brcmu_pktq_mlen);
-
-/* Priority dequeue from a specific set of precedences */
-struct sk_buff *brcmu_pktq_mdeq(struct pktq *pq, uint prec_bmp,
-                                     int *prec_out)
-{
-       struct pktq_prec *q;
-       struct sk_buff *p;
-       int prec;
-
-       if (pq->len == 0)
-               return NULL;
-
-       while ((prec = pq->hi_prec) > 0 && pq->q[prec].head == NULL)
-               pq->hi_prec--;
-
-       while ((prec_bmp & (1 << prec)) == 0 || pq->q[prec].head == NULL)
-               if (prec-- == 0)
-                       return NULL;
-
-       q = &pq->q[prec];
-
-       p = q->head;
-       if (p == NULL)
-               return NULL;
-
-       q->head = p->prev;
-       if (q->head == NULL)
-               q->tail = NULL;
-
-       q->len--;
-
-       if (prec_out)
-               *prec_out = prec;
-
-       pq->len--;
-
-       p->prev = NULL;
-
-       return p;
-}
-EXPORT_SYMBOL(brcmu_pktq_mdeq);
-
-/* parse a xx:xx:xx:xx:xx:xx format ethernet address */
-int brcmu_ether_atoe(char *p, u8 *ea)
-{
-       int i = 0;
-
-       for (;;) {
-               ea[i++] = (char)simple_strtoul(p, &p, 16);
-               if (!*p++ || i == 6)
-                       break;
-       }
-
-       return i == 6;
-}
-EXPORT_SYMBOL(brcmu_ether_atoe);
-
-#if defined(BCMDBG)
-/* pretty hex print a pkt buffer chain */
-void brcmu_prpkt(const char *msg, struct sk_buff *p0)
-{
-       struct sk_buff *p;
-
-       if (msg && (msg[0] != '\0'))
-               printk(KERN_DEBUG "%s:\n", msg);
-
-       for (p = p0; p; p = p->next)
-               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, p->data, p->len);
-}
-EXPORT_SYMBOL(brcmu_prpkt);
-#endif                         /* defined(BCMDBG) */
-
-/* iovar table lookup */
-const struct brcmu_iovar *brcmu_iovar_lookup(const struct brcmu_iovar *table,
-                                       const char *name)
-{
-       const struct brcmu_iovar *vi;
-       const char *lookup_name;
-
-       /* skip any ':' delimited option prefixes */
-       lookup_name = strrchr(name, ':');
-       if (lookup_name != NULL)
-               lookup_name++;
-       else
-               lookup_name = name;
-
-       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 */
-}
-EXPORT_SYMBOL(brcmu_iovar_lookup);
-
-int brcmu_iovar_lencheck(const struct brcmu_iovar *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 s32 sized args at the ioctl interface */
-               if (len < (int)sizeof(int)) {
-                       bcmerror = -EOVERFLOW;
-               }
-               break;
-
-       case IOVT_BUFFER:
-               /* buffer must meet minimum length requirement */
-               if (len < vi->minlen) {
-                       bcmerror = -EOVERFLOW;
-               }
-               break;
-
-       case IOVT_VOID:
-               if (!set) {
-                       /* Cannot return nil... */
-                       bcmerror = -ENOTSUPP;
-               } else if (len) {
-                       /* Set is an action w/o parameters */
-                       bcmerror = -ENOBUFS;
-               }
-               break;
-
-       default:
-               /* unknown type for length check in iovar info */
-               bcmerror = -ENOTSUPP;
-       }
-
-       return bcmerror;
-}
-EXPORT_SYMBOL(brcmu_iovar_lencheck);
-
-/*******************************************************************************
- * 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 u8 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
-};
-
-u8 brcmu_crc8(u8 *pdata,       /* pointer to array of data to process */
-                        uint nbytes,   /* number of input data bytes to process */
-                        u8 crc /* either CRC8_INIT_VALUE or previous return value */
-    ) {
-       /* loop over the buffer data */
-       while (nbytes-- > 0)
-               crc = crc8_table[(crc ^ *pdata++) & 0xff];
-
-       return crc;
-}
-EXPORT_SYMBOL(brcmu_crc8);
-
-/*
- * 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
- */
-struct brcmu_tlv *brcmu_parse_tlvs(void *buf, int buflen, uint key)
-{
-       struct brcmu_tlv *elt;
-       int totlen;
-
-       elt = (struct brcmu_tlv *) buf;
-       totlen = buflen;
-
-       /* find tagged parameter */
-       while (totlen >= 2) {
-               int len = elt->len;
-
-               /* validate remaining totlen */
-               if ((elt->id == key) && (totlen >= (len + 2)))
-                       return elt;
-
-               elt = (struct brcmu_tlv *) ((u8 *) elt + (len + 2));
-               totlen -= (len + 2);
-       }
-
-       return NULL;
-}
-EXPORT_SYMBOL(brcmu_parse_tlvs);
-
-
-#if defined(BCMDBG)
-int
-brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags, char *buf,
-                  int len)
-{
-       int i;
-       char *p = buf;
-       char hexstr[16];
-       int slen = 0, nlen = 0;
-       u32 bit;
-       const char *name;
-
-       if (len < 2 || !buf)
-               return 0;
-
-       buf[0] = '\0';
-
-       for (i = 0; flags != 0; i++) {
-               bit = bd[i].bit;
-               name = bd[i].name;
-               if (bit == 0 && flags != 0) {
-                       /* print any unnamed bits */
-                       snprintf(hexstr, 16, "0x%X", flags);
-                       name = hexstr;
-                       flags = 0;      /* exit loop */
-               } else if ((flags & bit) == 0)
-                       continue;
-               flags &= ~bit;
-               nlen = strlen(name);
-               slen += nlen;
-               /* count btwn flag space */
-               if (flags != 0)
-                       slen += 1;
-               /* need NULL char as well */
-               if (len <= slen)
-                       break;
-               /* copy NULL char but don't count it */
-               strncpy(p, name, nlen + 1);
-               p += nlen;
-               /* copy btwn flag space and NULL char */
-               if (flags != 0)
-                       p += snprintf(p, 2, " ");
-               len -= slen;
-       }
-
-       /* indicate the str was too short */
-       if (flags != 0) {
-               if (len < 2)
-                       p -= 2 - len;   /* overwrite last char */
-               p += snprintf(p, 2, ">");
-       }
-
-       return (int)(p - buf);
-}
-EXPORT_SYMBOL(brcmu_format_flags);
-
-/* print bytes formatted as hex to a string. return the resulting string length */
-int brcmu_format_hex(char *str, const void *bytes, int len)
-{
-       int i;
-       char *p = str;
-       const u8 *src = (const u8 *)bytes;
-
-       for (i = 0; i < len; i++) {
-               p += snprintf(p, 3, "%02X", *src);
-               src++;
-       }
-       return (int)(p - str);
-}
-EXPORT_SYMBOL(brcmu_format_hex);
-#endif                         /* defined(BCMDBG) */
-
-char *brcmu_chipname(uint chipid, char *buf, uint len)
-{
-       const char *fmt;
-
-       fmt = ((chipid > 0xa000) || (chipid < 0x4000)) ? "%d" : "%x";
-       snprintf(buf, len, fmt, chipid);
-       return buf;
-}
-EXPORT_SYMBOL(brcmu_chipname);
-
-uint brcmu_mkiovar(char *name, char *data, uint datalen, char *buf, uint buflen)
-{
-       uint len;
-
-       len = strlen(name) + 1;
-
-       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;
-}
-EXPORT_SYMBOL(brcmu_mkiovar);
-
-/* 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 u16.
- */
-
-#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 u16 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
-};
-
-u16 brcmu_qdbm_to_mw(u8 qdbm)
-{
-       uint factor = 1;
-       int idx = qdbm - QDBM_OFFSET;
-
-       if (idx >= QDBM_TABLE_LEN) {
-               /* clamp to max u16 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;
-}
-EXPORT_SYMBOL(brcmu_qdbm_to_mw);
-
-u8 brcmu_mw_to_qdbm(u16 mw)
-{
-       u8 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 += (u8) offset;
-
-       return qdbm;
-}
-EXPORT_SYMBOL(brcmu_mw_to_qdbm);
-
-uint brcmu_bitcount(u8 *bitmap, uint length)
-{
-       uint bitcount = 0, i;
-       u8 tmp;
-       for (i = 0; i < length; i++) {
-               tmp = bitmap[i];
-               while (tmp) {
-                       bitcount++;
-                       tmp &= (tmp - 1);
-               }
-       }
-       return bitcount;
-}
-EXPORT_SYMBOL(brcmu_bitcount);
-
-/* Initialization of brcmu_strbuf structure */
-void brcmu_binit(struct brcmu_strbuf *b, char *buf, uint size)
-{
-       b->origsize = b->size = size;
-       b->origbuf = b->buf = buf;
-}
-EXPORT_SYMBOL(brcmu_binit);
-
-/* Buffer sprintf wrapper to guard against buffer overflow */
-int brcmu_bprintf(struct brcmu_strbuf *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,
-        * stdlib 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;
-}
-EXPORT_SYMBOL(brcmu_bprintf);
diff --git a/drivers/staging/brcm80211/util/bcmwifi.c b/drivers/staging/brcm80211/util/bcmwifi.c
deleted file mode 100644 (file)
index 207cb8b..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2010 Broadcom Corporation
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#include <linux/ctype.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <bcmdefs.h>
-#include <bcmutils.h>
-#include <bcmwifi.h>
-
-/*
- * Verify the chanspec is using a legal set of parameters, i.e. that the
- * chanspec specified a band, bw, ctl_sb and channel and that the
- * combination could be legal given any set of circumstances.
- * RETURNS: true is the chanspec is malformed, false if it looks good.
- */
-bool brcmu_chspec_malformed(chanspec_t chanspec)
-{
-       /* must be 2G or 5G band */
-       if (!CHSPEC_IS5G(chanspec) && !CHSPEC_IS2G(chanspec))
-               return true;
-       /* must be 20 or 40 bandwidth */
-       if (!CHSPEC_IS40(chanspec) && !CHSPEC_IS20(chanspec))
-               return true;
-
-       /* 20MHZ b/w must have no ctl sb, 40 must have a ctl sb */
-       if (CHSPEC_IS20(chanspec)) {
-               if (!CHSPEC_SB_NONE(chanspec))
-                       return true;
-       } else {
-               if (!CHSPEC_SB_UPPER(chanspec) && !CHSPEC_SB_LOWER(chanspec))
-                       return true;
-       }
-
-       return false;
-}
-EXPORT_SYMBOL(brcmu_chspec_malformed);
-
-/*
- * This function returns the channel number that control traffic is being sent on, for legacy
- * channels this is just the channel number, for 40MHZ channels it is the upper or lowre 20MHZ
- * sideband depending on the chanspec selected
- */
-u8 brcmu_chspec_ctlchan(chanspec_t chspec)
-{
-       u8 ctl_chan;
-
-       /* Is there a sideband ? */
-       if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_NONE) {
-               return CHSPEC_CHANNEL(chspec);
-       } else {
-               /* we only support 40MHZ with sidebands */
-               /* chanspec channel holds the centre frequency, use that and the
-                * side band information to reconstruct the control channel number
-                */
-               if (CHSPEC_CTL_SB(chspec) == WL_CHANSPEC_CTL_SB_UPPER) {
-                       /* control chan is the upper 20 MHZ SB of the 40MHZ channel */
-                       ctl_chan = UPPER_20_SB(CHSPEC_CHANNEL(chspec));
-               } else {
-                       /* control chan is the lower 20 MHZ SB of the 40MHZ channel */
-                       ctl_chan = LOWER_20_SB(CHSPEC_CHANNEL(chspec));
-               }
-       }
-
-       return ctl_chan;
-}
-EXPORT_SYMBOL(brcmu_chspec_ctlchan);
-
-/*
- * Return the channel number for a given frequency and base frequency.
- * The returned channel number is relative to the given base frequency.
- * If the given base frequency is zero, a base frequency of 5 GHz is assumed for
- * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz.
- *
- * Frequency is specified in MHz.
- * The base frequency is specified as (start_factor * 500 kHz).
- * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
- * 2.4 GHz and 5 GHz bands.
- *
- * The returned channel will be in the range [1, 14] in the 2.4 GHz band
- * and [0, 200] otherwise.
- * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the
- * frequency is not a 2.4 GHz channel, or if the frequency is not and even
- * multiple of 5 MHz from the base frequency to the base plus 1 GHz.
- *
- * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
- */
-int brcmu_mhz2channel(uint freq, uint start_factor)
-{
-       int ch = -1;
-       uint base;
-       int offset;
-
-       /* take the default channel start frequency */
-       if (start_factor == 0) {
-               if (freq >= 2400 && freq <= 2500)
-                       start_factor = WF_CHAN_FACTOR_2_4_G;
-               else if (freq >= 5000 && freq <= 6000)
-                       start_factor = WF_CHAN_FACTOR_5_G;
-       }
-
-       if (freq == 2484 && start_factor == WF_CHAN_FACTOR_2_4_G)
-               return 14;
-
-       base = start_factor / 2;
-
-       /* check that the frequency is in 1GHz range of the base */
-       if ((freq < base) || (freq > base + 1000))
-               return -1;
-
-       offset = freq - base;
-       ch = offset / 5;
-
-       /* check that frequency is a 5MHz multiple from the base */
-       if (offset != (ch * 5))
-               return -1;
-
-       /* restricted channel range check for 2.4G */
-       if (start_factor == WF_CHAN_FACTOR_2_4_G && (ch < 1 || ch > 13))
-               return -1;
-
-       return ch;
-}
-EXPORT_SYMBOL(brcmu_mhz2channel);
-